aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2012-07-30 19:46:36 +0200
committerStefano Sabatini <stefasab@gmail.com>2012-07-31 13:25:14 +0200
commit52bd9cb4d29bc086f45f239c56a6a3c63406a073 (patch)
treecd10777ed7eb4d1d200c603fb8d98ae8f6f5fb19
parentc809b89a1272226916890e6bff7d406772c846e1 (diff)
downloadffmpeg-52bd9cb4d29bc086f45f239c56a6a3c63406a073.tar.gz
lavfi/movie: force channel layout if not set by the decoder
This ensures that the output buffers will have the channel layout set, which is required by filters. Also consistent with ffmpeg.c behavior.
-rw-r--r--libavfilter/src_movie.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index a4a12939e2..56e7083869 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -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;
@@ -282,6 +305,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 +366,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;