[vlc-commits] demux: avformat: refactor stream info/options
Francois Cartegnie
git at videolan.org
Thu Sep 26 18:02:27 CEST 2019
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Dec 7 16:52:19 2017 +0100| [9eba78d641f70ce405f6be4f192f16f0343128c3] | committer: Francois Cartegnie
demux: avformat: refactor stream info/options
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9eba78d641f70ce405f6be4f192f16f0343128c3
---
modules/demux/avformat/demux.c | 64 +++++++++++++++++++++++++-----------------
1 file changed, 38 insertions(+), 26 deletions(-)
diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c
index f7e2531254..ce59cc7ccc 100644
--- a/modules/demux/avformat/demux.c
+++ b/modules/demux/avformat/demux.c
@@ -167,6 +167,42 @@ static void get_rotation(es_format_t *fmt, AVStream *s)
}
}
+static void FindStreamInfo( demux_t *p_demux )
+{
+ 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);
+ }
+ vlc_avcodec_lock(); /* avformat calls avcodec behind our back!!! */
+ int error = avformat_find_stream_info( p_sys->ic, options );
+ 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]);
+ }
+
+ if( error < 0 )
+ {
+ msg_Warn( p_demux, "Could not find stream info: %s",
+ vlc_strerror_c(AVUNERROR(error)) );
+ }
+}
+
static int avformat_ProbeDemux( vlc_object_t *p_this,
AVInputFormat **pp_fmt, const char *psz_url )
{
@@ -337,33 +373,9 @@ int avformat_OpenDemux( vlc_object_t *p_this )
return VLC_EGENERIC;
}
- char *psz_opts = var_InheritString( p_demux, "avformat-options" );
- unsigned nb_streams = p_sys->ic->nb_streams;
-
- 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);
- }
- vlc_avcodec_lock(); /* avformat calls avcodec behind our back!!! */
- error = avformat_find_stream_info( p_sys->ic, options );
- 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]);
- }
+ FindStreamInfo( p_demux );
- nb_streams = p_sys->ic->nb_streams; /* it may have changed */
+ unsigned nb_streams = p_sys->ic->nb_streams; /* it may have changed */
if( !nb_streams )
{
msg_Err( p_demux, "No streams found");
More information about the vlc-commits
mailing list