[FFmpeg-devel] [PATCH 2/3 v2] avformat/hls: Fix probing mpegts audio streams that use probing
Andreas Cadhalpun
andreas.cadhalpun at googlemail.com
Mon Nov 7 00:33:16 EET 2016
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.hannula at 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
More information about the ffmpeg-devel
mailing list