[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