[FFmpeg-devel] [PATCH v2] avformat/hls Implement support for using AVSEEK_FLAG_BACKWARD when seeking

Lingjiang Fang vacingfang at foxmail.com
Fri Jun 11 19:28:54 EEST 2021


On Sat,  5 Jun 2021 22:42:26 +0200
Gustav Grusell <gustav.grusell at gmail.com> wrote:

> Before, seeking in hls streams would always seek to the next keyframe
> after the given timestamp. With this fix, if AVSEEK_FLAG_BACKWARD is
> set, seeking will be to the first keyframe of the segment containing
> the given timestamp. This fixes #7485.
> 
> Signed-off-by: Gustav Grusell <gustav.grusell at gmail.com>
> ---
>  libavformat/hls.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/libavformat/hls.c b/libavformat/hls.c
> index 8fc6924c90..fb8c9b071a 100644
> --- a/libavformat/hls.c
> +++ b/libavformat/hls.c
> @@ -2197,6 +2197,15 @@ static int hls_read_packet(AVFormatContext *s,
> AVPacket *pkt) break;
>                      }
>  
> +                    /* If AVSEEK_FLAG_BACKWARD set and not
> AVSEEK_FLAG_ANY,
> +                     * we return the first keyframe encountered */
> +                    if (pls->seek_flags & AVSEEK_FLAG_BACKWARD &&
> +                        !(pls->seek_flags & AVSEEK_FLAG_ANY) &&
> +                        pls->pkt->flags & AV_PKT_FLAG_KEY) {
taking account of the case of using flag backward and flag any together,
a logic like this is better:

if ( pls->seek_flags & AVSEEK_FLAG_BACKWARD &&
    (pls->seek_flags & AVSEEK_FLAG_ANY || 
     pls->pkt->flags & AV_PKT_FLAG_KEY)) {
   ....
}

> +                        pls->seek_timestamp = AV_NOPTS_VALUE;
> +                        break;
> +                    }
> +
>                      tb = get_timebase(pls);
>                      ts_diff = av_rescale_rnd(pls->pkt->dts,
> AV_TIME_BASE, tb.den, AV_ROUND_DOWN) -

BTW, when I used seek backward before, what I want is to get exactly
packets of the specified seek time, not only the specified stream
but also all streams I need. To achieve this, I will put this patch
lines before this if block, like this:

if (pls->seek_timestamp == AV_NOPTS_VALUE)
    break;

if ( pls->seek_flags & AVSEEK_FLAG_BACKWARD &&
    (pls->seek_flags & AVSEEK_FLAG_ANY || 
     pls->pkt->flags & AV_PKT_FLAG_KEY)) {
   ....
}

if (pls->seek_stream_index < 0 ||
...


Regards,
Lingjiang Fang


More information about the ffmpeg-devel mailing list