[FFmpeg-devel] [PATCH] img2dec: support seeking in infinitely looped stream

Paul B Mahol onemda at gmail.com
Wed Jan 9 11:43:30 CET 2013


On 1/8/13, Michael Niedermayer <michaelni at gmx.at> wrote:
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  libavformat/img2dec.c |   11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
> index c3f5bdb..23cdc4b 100644
> --- a/libavformat/img2dec.c
> +++ b/libavformat/img2dec.c
> @@ -46,6 +46,7 @@ typedef struct {
>      int img_first;
>      int img_last;
>      int img_number;
> +    int64_t pts;
>      int img_count;
>      int is_pipe;
>      int split_planes;       /**< use independent file for each Y, U, V
> plane */
> @@ -393,8 +394,8 @@ static int img_read_packet(AVFormatContext *s1, AVPacket
> *pkt)
>          return AVERROR(ENOMEM);
>      pkt->stream_index = 0;
>      pkt->flags       |= AV_PKT_FLAG_KEY;
> -    if (!s->is_pipe && !s->loop)
> -        pkt->pts      = s->img_number - s->img_first;
> +    if (!s->is_pipe)
> +        pkt->pts      = s->pts;
>
>      pkt->size = 0;
>      for (i = 0; i < 3; i++) {
> @@ -413,6 +414,7 @@ static int img_read_packet(AVFormatContext *s1, AVPacket
> *pkt)
>      } else {
>          s->img_count++;
>          s->img_number++;
> +        s->pts++;
>          return 0;
>      }
>  }
> @@ -432,9 +434,10 @@ static int img_read_seek(AVFormatContext *s, int
> stream_index, int64_t timestamp
>  {
>      VideoDemuxData *s1 = s->priv_data;
>
> -    if (timestamp < 0 || timestamp > s1->img_last - s1->img_first)
> +    if (timestamp < 0 || !s1->loop && timestamp > s1->img_last -
> s1->img_first)

Yes but loop do not need to be infinite, when I tried it with current code
and ffplay I did not found anything strange with seeking. And it is not
anything major to care about.

Yes ffplay loop option overwrites demuxer loop option - the last one is
infinite if enabled - somehow silly.

>          return -1;
> -    s1->img_number = timestamp + s1->img_first;
> +    s1->img_number = timestamp%(s1->img_last - s1->img_first + 1) +
> s1->img_first;
> +    s1->pts = timestamp;
>      return 0;
>  }

So patch looks to be correct for current design of demuxer.


More information about the ffmpeg-devel mailing list