ffmpeg: support filtering of unknown channel layouts.
This commit is contained in:
2
ffmpeg.c
2
ffmpeg.c
@@ -2240,7 +2240,7 @@ static int transcode_init(void)
|
|||||||
codec->sample_fmt = ost->filter->filter->inputs[0]->format;
|
codec->sample_fmt = ost->filter->filter->inputs[0]->format;
|
||||||
codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
|
codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
|
||||||
codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
|
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 };
|
codec->time_base = (AVRational){ 1, codec->sample_rate };
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
|
@@ -367,12 +367,16 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
|
|||||||
char *sample_fmts, *sample_rates, *channel_layouts;
|
char *sample_fmts, *sample_rates, *channel_layouts;
|
||||||
char name[255];
|
char name[255];
|
||||||
int ret;
|
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);
|
snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
|
||||||
ret = avfilter_graph_create_filter(&ofilter->filter,
|
ret = avfilter_graph_create_filter(&ofilter->filter,
|
||||||
avfilter_get_by_name("ffabuffersink"),
|
avfilter_get_by_name("ffabuffersink"),
|
||||||
name, NULL, NULL, fg->graph);
|
name, NULL, params, fg->graph);
|
||||||
|
av_freep(¶ms);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -620,20 +624,25 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
|||||||
AVFilter *filter = avfilter_get_by_name("abuffer");
|
AVFilter *filter = avfilter_get_by_name("abuffer");
|
||||||
InputStream *ist = ifilter->ist;
|
InputStream *ist = ifilter->ist;
|
||||||
int pad_idx = in->pad_idx;
|
int pad_idx = in->pad_idx;
|
||||||
char args[255], name[255];
|
AVBPrint args;
|
||||||
|
char name[255];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
|
av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC);
|
||||||
":channel_layout=0x%"PRIx64,
|
av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
|
||||||
1, ist->st->codec->sample_rate,
|
1, ist->st->codec->sample_rate,
|
||||||
ist->st->codec->sample_rate,
|
ist->st->codec->sample_rate,
|
||||||
av_get_sample_fmt_name(ist->st->codec->sample_fmt),
|
av_get_sample_fmt_name(ist->st->codec->sample_fmt));
|
||||||
ist->st->codec->channel_layout);
|
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,
|
snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
|
||||||
ist->file_index, ist->st->index);
|
ist->file_index, ist->st->index);
|
||||||
|
|
||||||
if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
|
if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
|
||||||
name, args, NULL,
|
name, args.str, NULL,
|
||||||
fg->graph)) < 0)
|
fg->graph)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user