summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stream/rar.c3
-rw-r--r--stream/stream.c18
-rw-r--r--stream/stream.h3
-rw-r--r--stream/stream_bluray.c4
-rw-r--r--stream/stream_cdda.c6
-rw-r--r--stream/stream_dvd.c5
-rw-r--r--stream/stream_rar.c12
7 files changed, 25 insertions, 26 deletions
diff --git a/stream/rar.c b/stream/rar.c
index 7fae5e35ac..9d8b64717a 100644
--- a/stream/rar.c
+++ b/stream/rar.c
@@ -257,8 +257,7 @@ exit:
/* We stop on the first non empty file if we cannot seek */
if (current) {
- bool can_seek = s->end_pos > 0;
- if (!can_seek && current->size > 0)
+ if (!s->seekable && current->size > 0)
return -1;
}
diff --git a/stream/stream.c b/stream/stream.c
index d4f0fbc320..fd545da7e7 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -676,7 +676,7 @@ bool stream_seek(stream_t *s, int64_t pos)
}
if (s->mode == STREAM_WRITE)
- return s->seekable && s->seek(s, pos));
+ return s->seekable && s->seek(s, pos);
int64_t newpos = pos;
if (s->sector_size)
@@ -717,21 +717,7 @@ bool stream_skip(stream_t *s, int64_t len)
int stream_control(stream_t *s, int cmd, void *arg)
{
- if (!s->control)
- return STREAM_UNSUPPORTED;
- int r = s->control(s, cmd, arg);
- if (r == STREAM_UNSUPPORTED) {
- // Fallbacks
- switch (cmd) {
- case STREAM_CTRL_GET_SIZE:
- if (s->end_pos > 0) {
- *(int64_t *)arg = s->end_pos;
- return STREAM_OK;
- }
- break;
- }
- }
- return r;
+ return s->control ? s->control(s, cmd, arg) : STREAM_UNSUPPORTED;
}
void free_stream(stream_t *s)
diff --git a/stream/stream.h b/stream/stream.h
index 1dd00edb91..b824aaf356 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -185,16 +185,15 @@ typedef struct stream {
int read_chunk; // maximum amount of data to read at once to limit latency
unsigned int buf_pos, buf_len;
int64_t pos;
- uint64_t end_pos; // static size; use STREAM_CTRL_GET_SIZE instead
int eof;
int mode; //STREAM_READ or STREAM_WRITE
- bool streaming; // known to be a network stream if true
void *priv; // used for DVD, TV, RTSP etc
char *url; // filename/url (possibly including protocol prefix)
char *path; // filename (url without protocol prefix)
char *mime_type; // when HTTP streaming is used
char *demuxer; // request demuxer to be used
char *lavf_type; // name of expected demuxer type for lavf
+ bool streaming : 1; // known to be a network stream if true
bool seekable : 1; // presence of general byte seeking support
bool fast_skip : 1; // consider stream fast enough to fw-seek by skipping
bool safe_origin : 1; // used for playlists that can be opened safely
diff --git a/stream/stream_bluray.c b/stream/stream_bluray.c
index ebbdf63a3e..04efed6e51 100644
--- a/stream/stream_bluray.c
+++ b/stream/stream_bluray.c
@@ -600,6 +600,9 @@ static int bluray_stream_control(stream_t *s, int cmd, void *arg)
fill_next_event(s, ev);
return STREAM_OK;
}
+ case STREAM_CTRL_GET_SIZE:
+ *(int64_t *)arg = bd_get_title_size(b->bd);
+ return STREAM_OK;
default:
break;
}
@@ -794,7 +797,6 @@ static int bluray_stream_open(stream_t *s)
s->close = bluray_stream_close;
s->control = bluray_stream_control;
s->type = STREAMTYPE_BLURAY;
- s->end_pos = bd_get_title_size(bd);
s->sector_size = BLURAY_SECTOR_SIZE;
s->priv = b;
s->demuxer = "+disc";
diff --git a/stream/stream_cdda.c b/stream/stream_cdda.c
index a75ee3ae40..13ec14644b 100644
--- a/stream/stream_cdda.c
+++ b/stream/stream_cdda.c
@@ -266,6 +266,10 @@ static int control(stream_t *stream, int cmd, void *arg)
*(double *)arg = pos / (44100.0 * 2 * 2);
return STREAM_OK;
}
+ case STREAM_CTRL_GET_SIZE:
+ *(int64_t *)arg =
+ (p->end_sector + 1 - p->start_sector) * CDIO_CD_FRAMESIZE_RAW;
+ return STREAM_OK;
}
return STREAM_UNSUPPORTED;
}
@@ -373,8 +377,6 @@ static int open_cdda(stream_t *st)
priv->sector = priv->start_sector;
st->priv = priv;
- st->end_pos =
- (priv->end_sector + 1 - priv->start_sector) * CDIO_CD_FRAMESIZE_RAW;
st->sector_size = CDIO_CD_FRAMESIZE_RAW;
st->fill_buffer = fill_buffer;
diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c
index 5be70b2d1d..0906796986 100644
--- a/stream/stream_dvd.c
+++ b/stream/stream_dvd.c
@@ -649,6 +649,10 @@ static int control(stream_t *stream,int cmd,void* arg)
*(char**)arg = talloc_strdup(NULL, buffer);
return STREAM_OK;
}
+ case STREAM_CTRL_GET_SIZE:
+ *(int64_t *)arg =
+ (d->cur_pgc->cell_playback[d->last_cell-1].last_sector)*2048LL;
+ return STREAM_OK;
}
return STREAM_UNSUPPORTED;
}
@@ -917,7 +921,6 @@ static int open_s(stream_t *stream)
stream->fill_buffer = fill_buffer;
stream->control = control;
stream->close = stream_dvd_close;
- stream->end_pos = (int64_t)(d->cur_pgc->cell_playback[d->last_cell-1].last_sector)*2048;
MP_VERBOSE(stream, "DVD start=%d end=%d \n",d->cur_pack,d->cur_pgc->cell_playback[d->last_cell-1].last_sector);
stream->priv = (void*)d;
return STREAM_OK;
diff --git a/stream/stream_rar.c b/stream/stream_rar.c
index 733ea3f36c..58e6232092 100644
--- a/stream/stream_rar.c
+++ b/stream/stream_rar.c
@@ -82,6 +82,9 @@ static int rar_entry_control(stream_t *s, int cmd, void *arg)
case STREAM_CTRL_GET_BASE_FILENAME:
*(char **)arg = talloc_strdup(NULL, rar_file->s->url);
return STREAM_OK;
+ case STREAM_CTRL_GET_SIZE:
+ *(int64_t *)arg = rar_file->size;
+ return STREAM_OK;
}
return STREAM_UNSUPPORTED;
}
@@ -131,7 +134,6 @@ static int rar_entry_open(stream_t *stream)
RarSeek(file, 0);
stream->priv = file;
- stream->end_pos = file->size;
stream->fill_buffer = rar_entry_fill_buffer;
stream->seek = rar_entry_seek;
stream->seekable = true;
@@ -159,6 +161,12 @@ static void rar_filter_close(stream_t *s)
free_stream(m);
}
+static int rar_filter_control(stream_t *s, int cmd, void *arg)
+{
+ struct stream *m = s->priv;
+ return stream_control(m, cmd, arg);
+}
+
static int rar_filter_open(stream_t *stream)
{
struct stream *rar = stream->source;
@@ -186,11 +194,11 @@ static int rar_filter_open(stream_t *stream)
struct stream *m = open_memory_stream(pl, strlen(pl));
stream->priv = m;
- stream->end_pos = m->end_pos;
stream->fill_buffer = rar_filter_fill_buffer;
stream->seek = rar_filter_seek;
stream->seekable = true;
stream->close = rar_filter_close;
+ stream->control = rar_filter_control;
stream->safe_origin = true;
talloc_free(tmp);