[vlc-devel] [PATCH] demux: avformat: handle AV_PKT_DATA_NEW_EXTRADATA
Steve Lhomme
robux4 at ycbcr.xyz
Mon Jan 4 08:29:07 UTC 2021
This seems supported in ffmpeg since 2011 so should not be an issue
depending on the ffmpeg version we support in 4.0.
For seeking we may have to keep the extradata with their timestamp
somewhere and use the proper value when seeking back (there's no way to
know in advance for seeks in the future). In Matroska in Cues there's a
way to tell such changes but it's not exposed by libavformat.
Comments below.
On 2020-12-30 15:15, Zhao Zhili wrote:
> This is a best-effort solution. Seek may not work as expected.
> ---
> modules/demux/avformat/demux.c | 27 ++++++++++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c
> index 4a765b7352..44cd778964 100644
> --- a/modules/demux/avformat/demux.c
> +++ b/modules/demux/avformat/demux.c
> @@ -55,6 +55,7 @@ struct avformat_track_s
> {
> es_out_id_t *p_es;
> vlc_tick_t i_pcr;
> + es_format_t es_format;
> };
>
> /*****************************************************************************
> @@ -711,6 +712,7 @@ int avformat_OpenDemux( vlc_object_t *p_this )
>
> es_fmt.i_id = i;
> p_track->p_es = es_out_Add( p_demux->out, &es_fmt );
> + es_format_Copy( &p_track->es_format, &es_fmt );
If the ES was not added (p_track->p_es) you probably don't want to keep
the format anyway.
> if( p_track->p_es && (s->disposition & AV_DISPOSITION_DEFAULT) )
> es_out_Control( p_demux->out, ES_OUT_SET_ES_DEFAULT, p_track->p_es );
>
> @@ -766,7 +768,12 @@ void avformat_CloseDemux( vlc_object_t *p_this )
> demux_t *p_demux = (demux_t*)p_this;
> demux_sys_t *p_sys = p_demux->p_sys;
>
> - free( p_sys->tracks );
> + if( p_sys->tracks != NULL )
> + {
> + for( unsigned i = 0; i < p_sys->i_tracks; i++ )
> + es_format_Clean( &p_sys->tracks[i].es_format );
> + free( p_sys->tracks );
> + }
>
> if( p_sys->ic )
> {
> @@ -821,6 +828,24 @@ static int Demux( demux_t *p_demux )
> av_packet_unref( &pkt );
> return 1;
> }
> +
> + // handle extra data change, this can happen for FLV
> + int side_data_size;
> + uint8_t *side_data = av_packet_get_side_data( &pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_data_size );
> + if( side_data != NULL && side_data_size > 0 ) {
> + msg_Warn( p_demux, "New extra data found, seek may not work as expected" );
> + void *p_extra = realloc( p_track->es_format.p_extra, side_data_size );
> + if( p_extra == NULL )
> + {
> + av_packet_unref( &pkt );
> + return 0;
> + }
> + p_track->es_format.p_extra = p_extra;
Missing free of the previous version.
> + memcpy( p_track->es_format.p_extra, side_data, side_data_size );
> + p_track->es_format.i_extra = side_data_size;
> + es_out_Control( p_demux->out, ES_OUT_SET_ES_FMT, p_track->p_es, &p_track->es_format );
This may fail. The same error handling as above should be done.
> + }
> +
> if( p_stream->codecpar->codec_id == AV_CODEC_ID_SSA )
> {
> p_frame = BuildSsaFrame( &pkt, p_sys->i_ssa_order++ );
> --
> 2.25.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list