From 41f025dff0a3c8f91849cf46a6b52947e6264719 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Wed, 26 Dec 2012 16:53:02 +0100 Subject: [PATCH] ffmpeg: support filtering of unknown channel layouts. --- ffmpeg.c | 2 +- ffmpeg_filter.c | 25 +++++++++++++++++-------- 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(¶ms); 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;