[FFmpeg-devel] [PATCH] avformat/hls: fix seek accuracy problem
Aman Gupta
ffmpeg at tmm1.net
Wed Jan 3 07:00:52 EET 2018
On Tue, Jan 2, 2018 at 7:27 PM Wu Zhiqiang <mymoeyard at gmail.com> wrote:
> On Wed, Jan 3, 2018 at 2:03 AM, Aman Gupta <ffmpeg at tmm1.net> wrote:
>
> > On Tue, Jan 2, 2018 at 3:05 AM Steven Liu <lingjiujianke at gmail.com>
> wrote:
> >
> > > 2018-01-02 18:28 GMT+08:00 <mymoeyard at gmail.com>:
> > > > From: Wu Zhiqiang <mymoeyard at gmail.com>
> > > >
> > > > HLS demuxer seeking use dts instead of pts.
> > > > Demuxer skip some frame when dts is before pts in special case.
> > > > And it is impossible to re-seek back to start time after playing.
> > > > ---
> > > > libavformat/hls.c | 18 ++++++++++++++----
> > > > 1 file changed, 14 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/libavformat/hls.c b/libavformat/hls.c
> > > > index 950cc4c3bd..069e7b06e9 100644
> > > > --- a/libavformat/hls.c
> > > > +++ b/libavformat/hls.c
> > > > @@ -2086,6 +2086,7 @@ static int hls_read_packet(AVFormatContext *s,
> > > AVPacket *pkt)
> > > > * stream */
> > > > if (pls->needed && !pls->pkt.data) {
> > > > while (1) {
> > > > + int64_t pkt_ts;
> > > > int64_t ts_diff;
> > > > AVRational tb;
> > > > ret = av_read_frame(pls->ctx, &pls->pkt);
> > > > @@ -2101,9 +2102,17 @@ static int hls_read_packet(AVFormatContext *s,
> > > AVPacket *pkt)
> > > > fill_timing_for_id3_timestamped_stream(pls);
> > > > }
> > > >
> > > > + if (pls->pkt.pts != AV_NOPTS_VALUE)
> > > > + pkt_ts = pls->pkt.pts;
> > > > + else if (pls->pkt.dts != AV_NOPTS_VALUE)
> > > > + pkt_ts = pls->pkt.dts;
> > > > + else
> > > > + pkt_ts = AV_NOPTS_VALUE;
> > > > +
> > > > +
> > > > if (c->first_timestamp == AV_NOPTS_VALUE &&
> > > > - pls->pkt.dts != AV_NOPTS_VALUE)
> > > > - c->first_timestamp =
> > av_rescale_q(pls->pkt.dts,
> > > > + pkt_ts != AV_NOPTS_VALUE)
> > > > + c->first_timestamp = av_rescale_q(pkt_ts,
> > > > get_timebase(pls), AV_TIME_BASE_Q);
> > > > }
> > > >
> > > > @@ -2113,15 +2122,16 @@ static int hls_read_packet(AVFormatContext
> *s,
> > > AVPacket *pkt)
> > > > if (pls->seek_stream_index < 0 ||
> > > > pls->seek_stream_index ==
> pls->pkt.stream_index) {
> > > >
> > > > - if (pls->pkt.dts == AV_NOPTS_VALUE) {
> > > > + if (pkt_ts == AV_NOPTS_VALUE) {
> > > > pls->seek_timestamp = AV_NOPTS_VALUE;
> > > > break;
> > > > }
> > > >
> > > > tb = get_timebase(pls);
> > > > - ts_diff = av_rescale_rnd(pls->pkt.dts,
> > AV_TIME_BASE,
> > > > + ts_diff = av_rescale_rnd(pkt_ts, AV_TIME_BASE,
> > > > tb.den, AV_ROUND_DOWN) -
> > > > pls->seek_timestamp;
> > > > +
> > > > if (ts_diff >= 0 && (pls->seek_flags &
> > > AVSEEK_FLAG_ANY ||
> > > > pls->pkt.flags &
> > > AV_PKT_FLAG_KEY)) {
> > > > pls->seek_timestamp = AV_NOPTS_VALUE;
> > > > --
> > > > 2.15.0
> > > >
> > >
> > >
> > > LGTM , This patch can fix ticket : https://trac.ffmpeg.org/ticket/6850
> > >
> >
> > LGTM, I've experienced this bug also.
> >
> >
> > >
> > > Thanks
> > >
> > > Steven
> > > _______________________________________________
> > > ffmpeg-devel mailing list
> > > ffmpeg-devel at ffmpeg.org
> > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> > >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel at ffmpeg.org
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> I found another problem of seeking.
> Example:http://devimages.apple.com.edgekey.net/
> streaming/examples/bipbop_4x3/gear1/prog_index.m3u8,
> return EIO error when seek to beginning.
I experienced this problem a few months ago also, and decided to remove the
EIO error. What do you think?
@@ -2240,9 +2239,12 @@ static int hls_read_seek(AVFormatContext *s,
int stream_index,
}
/* check if the timestamp is valid for the playlist with the
* specified stream index */
- if (!seek_pls || !find_timestamp_in_playlist(c, seek_pls,
seek_timestamp, &seq_no))
+ if (!seek_pls)
return AVERROR(EIO);
+ /* find the closest timestamp */
+ find_timestamp_in_playlist(c, seek_pls, seek_timestamp, &seq_no);
+
/* set segment now so we do not need to search again below */
seek_pls->cur_seq_no = seq_no;
seek_pls->seek_stream_index = stream_subdemuxer_index;
> Calculating first_timestamp only using first packet timestamp may cause
> problem
> when streams have each different start time.
> It is possible that second stream has smaller start time.
> I try to fix it by using start_time of AVformatContext.
> I am not not sure why not directly use start time.
>
> Thanks
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list