[FFmpeg-devel] [PATCH] libavformat/subfile: Improve AVSEEK_SIZE/SEEK_END seeking
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Mon Jul 1 08:35:00 EEST 2019
Andreas Rheinhardt:
> The subfile protocol treats an end of 0 as meaning "until EOF"; this got
> implemented by simply setting the end to INT64_MAX. But seeking relative
> to EOF or AVSEEK_SIZE seeking hasn't been adapted; the result is that
> e.g. the duration of transport streams isn't correctly determined when
> this option is used. This is fixed in this patch.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> libavformat/subfile.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/subfile.c b/libavformat/subfile.c
> index b527f2bee1..2f162e0a34 100644
> --- a/libavformat/subfile.c
> +++ b/libavformat/subfile.c
> @@ -116,11 +116,17 @@ static int subfile_read(URLContext *h, unsigned char *buf, int size)
> static int64_t subfile_seek(URLContext *h, int64_t pos, int whence)
> {
> SubfileContext *c = h->priv_data;
> - int64_t new_pos = -1;
> + int64_t new_pos = -1, end;
> int ret;
>
> + if (whence == AVSEEK_SIZE || whence == SEEK_END) {
> + end = c->end;
> + if (end == INT64_MAX && (end = ffurl_seek(c->h, 0, AVSEEK_SIZE)) < 0)
> + return end;
> + }
> +
> if (whence == AVSEEK_SIZE)
> - return c->end - c->start;
> + return end - c->start;
> switch (whence) {
> case SEEK_SET:
> new_pos = c->start + pos;
> @@ -129,7 +135,7 @@ static int64_t subfile_seek(URLContext *h, int64_t pos, int whence)
> new_pos += pos;
> break;
> case SEEK_END:
> - new_pos = c->end + c->pos;
> + new_pos = end + c->pos;
> break;
> }
> if (new_pos < c->start)
>
Ping.
- Andreas
More information about the ffmpeg-devel
mailing list