aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas George <nicolas.george@normalesup.org>2012-12-26 16:53:02 +0100
committerNicolas George <nicolas.george@normalesup.org>2013-01-26 11:15:38 +0100
commit41f025dff0a3c8f91849cf46a6b52947e6264719 (patch)
treea224e61e5b7e9b55a7b7e5f889df1648e41f46e8
parent699b286a21456bc24d60383a313ac61eed44a919 (diff)
downloadffmpeg-41f025dff0a3c8f91849cf46a6b52947e6264719.tar.gz
ffmpeg: support filtering of unknown channel layouts.
-rw-r--r--ffmpeg.c2
-rw-r--r--ffmpeg_filter.c25
2 files changed, 18 insertions, 9 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 329b7e420f..54097f422b 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2240,7 +2240,7 @@ static int transcode_init(void)
codec->sample_fmt = ost->filter->filter->inputs[0]->format;
codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
- codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
+ codec->channels = avfilter_link_get_channels(ost->filter->filter->inputs[0]);
codec->time_base = (AVRational){ 1, codec->sample_rate };
break;
case AVMEDIA_TYPE_VIDEO:
diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c
index 60309307c5..e23e2ebaaf 100644
--- a/ffmpeg_filter.c
+++ b/ffmpeg_filter.c
@@ -367,12 +367,16 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
char *sample_fmts, *sample_rates, *channel_layouts;
char name[255];
int ret;
+ AVABufferSinkParams *params = av_abuffersink_params_alloc();
-
+ if (!params)
+ return AVERROR(ENOMEM);
+ params->all_channel_counts = 1;
snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
ret = avfilter_graph_create_filter(&ofilter->filter,
avfilter_get_by_name("ffabuffersink"),
- name, NULL, NULL, fg->graph);
+ name, NULL, params, fg->graph);
+ av_freep(&params);
if (ret < 0)
return ret;
@@ -620,20 +624,25 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
AVFilter *filter = avfilter_get_by_name("abuffer");
InputStream *ist = ifilter->ist;
int pad_idx = in->pad_idx;
- char args[255], name[255];
+ AVBPrint args;
+ char name[255];
int ret;
- snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
- ":channel_layout=0x%"PRIx64,
+ av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC);
+ av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
1, ist->st->codec->sample_rate,
ist->st->codec->sample_rate,
- av_get_sample_fmt_name(ist->st->codec->sample_fmt),
- ist->st->codec->channel_layout);
+ av_get_sample_fmt_name(ist->st->codec->sample_fmt));
+ if (ist->st->codec->channel_layout)
+ av_bprintf(&args, ":channel_layout=0x%"PRIx64,
+ ist->st->codec->channel_layout);
+ else
+ av_bprintf(&args, ":channels=%d", ist->st->codec->channels);
snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
ist->file_index, ist->st->index);
if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
- name, args, NULL,
+ name, args.str, NULL,
fg->graph)) < 0)
return ret;