On Wed, 16 Nov 2011 10:55:44 +0200, Martin Storsjö <[email protected]> wrote: > From: Panagiotis H.M. Issaris <[email protected]> > > The Apple HTTP Live Streaming demuxer's implementation of > seeking searches for the MPEG TS segment which contains the > requested timestamp. In its current implementation it assumes > that the first segment will start from 0. > > But, MPEG TS streams do not necessarily start with timestamp > (near) 0, causing seeking to fail for those streams. > > This also occurs when using live streaming of HTTP Live Streams. > In this case sliding playlists may be used, which means that in > that case only the last x encoded segments are stored, the earlier > segments get deleted from disk and removed from the playlist. > Because of this, when starting playback of a stream in the middle > of such a broadcast, the initial segment fetched after parsing > the m3u8 playlist will not start from timestamp (near) 0, causing > (the admittedly limited live) seeking to fail. > > This patch changes this demuxers seeking implementation to use > the initial DTS as an offset for searching the segments containing > the requested timestamp. > --- > libavformat/applehttp.c | 11 ++++++++++- > 1 files changed, 10 insertions(+), 1 deletions(-) > > diff --git a/libavformat/applehttp.c b/libavformat/applehttp.c > index e0773ae..6570370 100644 > --- a/libavformat/applehttp.c > +++ b/libavformat/applehttp.c > @@ -99,6 +99,7 @@ typedef struct AppleHTTPContext { > int cur_seq_no; > int end_of_segment; > int first_packet; > + int64_t first_timestamp; > AVIOInterruptCB *interrupt_callback; > } AppleHTTPContext; > > @@ -527,6 +528,7 @@ static int applehttp_read_header(AVFormatContext *s, > AVFormatParameters *ap) > } > > c->first_packet = 1; > + c->first_timestamp = AV_NOPTS_VALUE; > > return 0; > fail: > @@ -591,6 +593,9 @@ start: > if (!var->pb.eof_reached) > return ret; > reset_packet(&var->pkt); > + } else { > + if (c->first_timestamp == AV_NOPTS_VALUE) > + c->first_timestamp = var->pkt.dts; > } > } > /* Check if this stream has the packet with the lowest dts */ > @@ -639,7 +644,11 @@ static int applehttp_read_seek(AVFormatContext *s, int > stream_index, > for (i = 0; i < c->n_variants; i++) { > /* Reset reading */ > struct variant *var = c->variants[i]; > - int64_t pos = 0; > + int64_t pos = c->first_timestamp == AV_NOPTS_VALUE ? 0 : > + av_rescale_rnd(c->first_timestamp, 1, stream_index >= > 0 ? > + s->streams[stream_index]->time_base.den : > + AV_TIME_BASE, flags & AVSEEK_FLAG_BACKWARD ? > + AV_ROUND_DOWN : AV_ROUND_UP);
The code looks sane and if you think it's ok, then feel free to push. Just a nitpick for this last block -- it looks a bit unreadable. Could you restructure it a little? -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
