]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/src_movie.c
lavfi/hue: apply misc fixes to default values setting
[ffmpeg] / libavfilter / src_movie.c
index a4a12939e2a727538d10acaad98cb339f7f6ec61..09dfe5d214675d29474dd672f009329697be459f 100644 (file)
@@ -162,6 +162,29 @@ static int open_stream(void *log, MovieStream *st)
     return 0;
 }
 
+static int guess_channel_layout(MovieStream *st, int st_index, void *log_ctx)
+{
+    AVCodecContext *dec_ctx = st->st->codec;
+    char buf[256];
+    int64_t chl = av_get_default_channel_layout(dec_ctx->channels);
+
+    if (!chl) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "Channel layout is not set in stream %d, and could not "
+               "be guessed from the number of channels (%d)\n",
+               st_index, dec_ctx->channels);
+        return AVERROR(EINVAL);
+    }
+
+    av_get_channel_layout_string(buf, sizeof(buf), dec_ctx->channels, chl);
+    av_log(log_ctx, AV_LOG_WARNING,
+           "Channel layout is not set in output stream %d, "
+           "guessed channel layout is '%s'\n",
+           st_index, buf);
+    dec_ctx->channel_layout = chl;
+    return 0;
+}
+
 static av_cold int movie_init(AVFilterContext *ctx, const char *args)
 {
     MovieContext *movie = ctx->priv;
@@ -182,10 +205,8 @@ static av_cold int movie_init(AVFilterContext *ctx, const char *args)
         return AVERROR(EINVAL);
     }
 
-    if (*args++ == ':' && (ret = av_set_options_string(movie, args, "=", ":")) < 0) {
-        av_log(ctx, AV_LOG_ERROR, "Error parsing options string: '%s'\n", args);
+    if (*args++ == ':' && (ret = av_set_options_string(movie, args, "=", ":")) < 0)
         return ret;
-    }
 
     movie->seek_point = movie->seek_point_d * 1000000 + 0.5;
 
@@ -282,6 +303,12 @@ static av_cold int movie_init(AVFilterContext *ctx, const char *args)
         ret = open_stream(ctx, &movie->st[i]);
         if (ret < 0)
             return ret;
+        if ( movie->st[i].st->codec->codec->type == AVMEDIA_TYPE_AUDIO &&
+            !movie->st[i].st->codec->channel_layout) {
+            ret = guess_channel_layout(&movie->st[i], i, ctx);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     if (!(movie->frame = avcodec_alloc_frame()) ) {
@@ -337,8 +364,7 @@ static int movie_query_formats(AVFilterContext *ctx)
             ff_formats_ref(ff_make_format_list(list), &outlink->in_formats);
             list[0] = c->sample_rate;
             ff_formats_ref(ff_make_format_list(list), &outlink->in_samplerates);
-            list64[0] = c->channel_layout ? c->channel_layout :
-                        av_get_default_channel_layout(c->channels);
+            list64[0] = c->channel_layout;
             ff_channel_layouts_ref(avfilter_make_format64_list(list64),
                                    &outlink->in_channel_layouts);
             break;