diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-12-26 16:53:02 +0100 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2013-01-26 11:15:38 +0100 |
commit | 41f025dff0a3c8f91849cf46a6b52947e6264719 (patch) | |
tree | a224e61e5b7e9b55a7b7e5f889df1648e41f46e8 | |
parent | 699b286a21456bc24d60383a313ac61eed44a919 (diff) | |
download | ffmpeg-41f025dff0a3c8f91849cf46a6b52947e6264719.tar.gz |
ffmpeg: support filtering of unknown channel layouts.
-rw-r--r-- | ffmpeg.c | 2 | ||||
-rw-r--r-- | ffmpeg_filter.c | 25 |
2 files changed, 18 insertions, 9 deletions
@@ -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; |