vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Sep 26 17:15:12 2019 +0200| [d65bc86381f0c9be715d3c35c9246f7ffd2d630b] | committer: Francois Cartegnie
demux: avformat: refactor options handling > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d65bc86381f0c9be715d3c35c9246f7ffd2d630b --- modules/demux/avformat/demux.c | 58 +++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c index ce59cc7ccc..2ec841d9b4 100644 --- a/modules/demux/avformat/demux.c +++ b/modules/demux/avformat/demux.c @@ -167,33 +167,49 @@ static void get_rotation(es_format_t *fmt, AVStream *s) } } -static void FindStreamInfo( demux_t *p_demux ) +static AVDictionary * BuildAVOptions( demux_t *p_demux ) +{ + char *psz_opts = var_InheritString( p_demux, "avformat-options" ); + AVDictionary *options = NULL; + if( psz_opts ) + { + vlc_av_get_options( psz_opts, &options ); + free( psz_opts ); + } + return options; +} + +static void FreeUnclaimedOptions( demux_t *p_demux, AVDictionary **pp_dict ) +{ + AVDictionaryEntry *t = NULL; + while ((t = av_dict_get(*pp_dict, "", t, AV_DICT_IGNORE_SUFFIX))) { + msg_Err( p_demux, "Unknown option \"%s\"", t->key ); + } + av_dict_free(pp_dict); +} + +static void FindStreamInfo( demux_t *p_demux, AVDictionary *options ) { demux_sys_t *p_sys = p_demux->p_sys; unsigned nb_streams = p_sys->ic->nb_streams; - char *psz_opts = var_InheritString( p_demux, "avformat-options" ); - AVDictionary *options[nb_streams ? nb_streams : 1]; - options[0] = NULL; - for (unsigned i = 1; i < nb_streams; i++) - options[i] = NULL; - if (psz_opts) { - vlc_av_get_options(psz_opts, &options[0]); - for (unsigned i = 1; i < nb_streams; i++) { - av_dict_copy(&options[i], options[0], 0); - } - free(psz_opts); + AVDictionary *streamsoptions[nb_streams ? nb_streams : 1]; + + streamsoptions[0] = options; + for ( unsigned i = 1; i < nb_streams; i++ ) + { + streamsoptions[i] = NULL; + if( streamsoptions[0] ) + av_dict_copy( &streamsoptions[i], streamsoptions[0], 0 ); } + vlc_avcodec_lock(); /* avformat calls avcodec behind our back!!! */ - int error = avformat_find_stream_info( p_sys->ic, options ); + int error = avformat_find_stream_info( p_sys->ic, streamsoptions ); vlc_avcodec_unlock(); - AVDictionaryEntry *t = NULL; - while ((t = av_dict_get(options[0], "", t, AV_DICT_IGNORE_SUFFIX))) { - msg_Err( p_demux, "Unknown option \"%s\"", t->key ); - } - av_dict_free(&options[0]); - for (unsigned i = 1; i < nb_streams; i++) { - av_dict_free(&options[i]); + + FreeUnclaimedOptions( p_demux, &streamsoptions[0] ); + for ( unsigned i = 1; i < nb_streams; i++ ) { + av_dict_free( &streamsoptions[i] ); } if( error < 0 ) @@ -373,7 +389,7 @@ int avformat_OpenDemux( vlc_object_t *p_this ) return VLC_EGENERIC; } - FindStreamInfo( p_demux ); + FindStreamInfo( p_demux, BuildAVOptions( p_demux ) ); unsigned nb_streams = p_sys->ic->nb_streams; /* it may have changed */ if( !nb_streams ) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
