[FFmpeg-devel] [PATCH 10/10] ffmpeg: support filtering of unknown channel layouts.

Stefano Sabatini stefasab at gmail.com
Sun Jan 6 10:45:59 CET 2013


On date Saturday 2013-01-05 14:50:45 +0100, Nicolas George encoded:
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  ffmpeg.c        |    2 +-
>  ffmpeg_filter.c |   24 +++++++++++++++++-------
>  2 files changed, 18 insertions(+), 8 deletions(-)
> 
> diff --git a/ffmpeg.c b/ffmpeg.c
> index de6e66c..c26e2e4 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -2193,7 +2193,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 6030930..6a39a5f 100644
> --- a/ffmpeg_filter.c
> +++ b/ffmpeg_filter.c
> @@ -367,12 +367,17 @@ 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();
>  
>  

nit++++: remove the empty line while at it.

> +    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 +625,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;

LGTM, thanks.
-- 
FFmpeg = Friendly and Fabulous Magnificient Political Enhanced Ghost


More information about the ffmpeg-devel mailing list