On 06.11.2016 22:44, Anssi Hannula wrote: > Commit 04964ac311abe670f ("avformat/hls: Fix missing streams in some > cases with MPEG TS") caused a regression where subdemuxer streams that > use probing (e.g. dts/eac3/mp2 in mpegts) no longer get probed properly. > > This is because the codec parameters from the subdemuxer stream, once > probed, are not passed on to the main stream. > > Fix that by updating the codec parameters if the codec id changes. > > Signed-off-by: Anssi Hannula <anssi.hann...@iki.fi> > --- > > v2: Added need_context_update = 1 and shortened the av_rescale_q() call to use > the new ist pointer. > > libavformat/hls.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/libavformat/hls.c b/libavformat/hls.c > index 6fb652c..ce52bf5 100644 > --- a/libavformat/hls.c > +++ b/libavformat/hls.c > @@ -1536,6 +1536,8 @@ static void set_stream_info_from_input_stream(AVStream > *st, struct playlist *pls > avpriv_set_pts_info(st, 33, 1, MPEG_TIME_BASE); > else > avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, > ist->time_base.den); > + > + st->internal->need_context_update = 1; > } > > /* add new subdemuxer streams to our context, if any */ > @@ -1950,6 +1952,8 @@ static int hls_read_packet(AVFormatContext *s, AVPacket > *pkt) > /* If we got a packet, return it */ > if (minplaylist >= 0) { > struct playlist *pls = c->playlists[minplaylist]; > + AVStream *ist; > + AVStream *st; > > ret = update_streams_from_subdemuxer(s, pls); > if (ret < 0) { > @@ -1972,15 +1976,23 @@ static int hls_read_packet(AVFormatContext *s, > AVPacket *pkt) > return AVERROR_BUG; > } > > + ist = pls->ctx->streams[pls->pkt.stream_index]; > + st = pls->main_streams[pls->pkt.stream_index]; > + > *pkt = pls->pkt; > - pkt->stream_index = pls->main_streams[pls->pkt.stream_index]->index; > + pkt->stream_index = st->index; > reset_packet(&c->playlists[minplaylist]->pkt); > > if (pkt->dts != AV_NOPTS_VALUE) > c->cur_timestamp = av_rescale_q(pkt->dts, > - > pls->ctx->streams[pls->pkt.stream_index]->time_base, > + ist->time_base, > AV_TIME_BASE_Q); > > + /* There may be more situations where this would be useful, but this > at least > + * handles newly probed codecs properly (i.e. request_probe by > mpegts). */ > + if (ist->codecpar->codec_id != st->codecpar->codec_id) > + set_stream_info_from_input_stream(st, pls, ist); > + > return 0; > } > return AVERROR_EOF; >
Works fine, thanks! Best regards, Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel