Quoting Vittorio Giovara (2017-06-29 00:10:51) > Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com> > --- > libavfilter/audio.c | 17 +++++++++++++-- > libavfilter/avfilter.c | 9 ++++---- > libavfilter/avfilter.h | 13 ++++++++++- > libavfilter/avfiltergraph.c | 35 +++++++++++++++++++++++------- > libavfilter/buffersink.c | 2 +- > libavfilter/buffersrc.c | 53 > ++++++++++++++++++++++++++++----------------- > libavfilter/buffersrc.h | 12 +++++++++- > libavfilter/fifo.c | 7 +++--- > 8 files changed, 106 insertions(+), 42 deletions(-) > > diff --git a/libavfilter/audio.c b/libavfilter/audio.c > index 5fe9da95c3..afd8bdc169 100644 > --- a/libavfilter/audio.c > +++ b/libavfilter/audio.c > @@ -31,7 +31,7 @@ AVFrame *ff_null_get_audio_buffer(AVFilterLink *link, int > nb_samples) > AVFrame *ff_default_get_audio_buffer(AVFilterLink *link, int nb_samples) > { > AVFrame *frame = av_frame_alloc(); > - int channels = av_get_channel_layout_nb_channels(link->channel_layout); > + int channels = link->ch_layout.nb_channels; > int ret; > > if (!frame) > @@ -39,7 +39,20 @@ AVFrame *ff_default_get_audio_buffer(AVFilterLink *link, > int nb_samples) > > frame->nb_samples = nb_samples; > frame->format = link->format; > - frame->channel_layout = link->channel_layout; > + > + ret = av_channel_layout_copy(&frame->ch_layout, &link->ch_layout); > + if (ret < 0) { > + av_frame_free(&frame); > + return NULL; > + } > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > + if (link->ch_layout.order == AV_CHANNEL_ORDER_NATIVE || > + link->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) > + frame->channel_layout = link->channel_layout;
This is incomplete, the channel layout should always be set, at least to (1<<count) - 1. > +FF_ENABLE_DEPRECATION_WARNINGS > +#endif > + > frame->sample_rate = link->sample_rate; > ret = av_frame_get_buffer(frame, 0); > if (ret < 0) { > diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c > index 83c1a7c20d..f2adefff3d 100644 > --- a/libavfilter/avfilter.c > +++ b/libavfilter/avfilter.c > @@ -247,16 +247,15 @@ void ff_dlog_link(void *ctx, AVFilterLink *link, int > end) > link->dst ? link->dst->filter->name : "", > end ? "\n" : ""); > } else { > - char buf[128]; > - av_get_channel_layout_string(buf, sizeof(buf), -1, > link->channel_layout); > - > + char *chlstr = av_channel_layout_describe(&link->ch_layout); > av_log(ctx, AV_LOG_TRACE, > "link[%p r:%d cl:%s fmt:%-16s %-16s->%-16s]%s", > - link, link->sample_rate, buf, > + link, link->sample_rate, chlstr, > av_get_sample_fmt_name(link->format), > link->src ? link->src->filter->name : "", > link->dst ? link->dst->filter->name : "", > end ? "\n" : ""); > + av_free(chlstr); > } > } > > @@ -683,7 +682,7 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) > case AVMEDIA_TYPE_AUDIO: > av_samples_copy(out->extended_data, frame->extended_data, > 0, 0, frame->nb_samples, > - > av_get_channel_layout_nb_channels(frame->channel_layout), > + frame->ch_layout.nb_channels, > frame->format); > break; > default: > diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h > index 6df69dbbbf..5d5edf0ed3 100644 > --- a/libavfilter/avfilter.h > +++ b/libavfilter/avfilter.h > @@ -36,6 +36,7 @@ > #include "libavutil/attributes.h" > #include "libavutil/avutil.h" > #include "libavutil/buffer.h" > +#include "libavutil/channel_layout.h" > #include "libavutil/frame.h" > #include "libavutil/log.h" > #include "libavutil/samplefmt.h" > @@ -334,7 +335,12 @@ struct AVFilterLink { > int h; ///< agreed upon image height > AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio > /* These two parameters apply only to audio */ > - uint64_t channel_layout; ///< channel layout of current buffer (see > libavutil/channel_layout.h) > +#if FF_API_OLD_CHANNEL_LAYOUT > + /** > + * @deprecated use ch_layout instead > + */ > + attribute_deprecated uint64_t channel_layout; > +#endif > int sample_rate; ///< samples per second > > int format; ///< agreed upon media format > @@ -405,6 +411,11 @@ struct AVFilterLink { > * AVHWFramesContext describing the frames. > */ > AVBufferRef *hw_frames_ctx; > + > + /** > + * Channel layout of current buffer. What 'current buffer' is this talking about? > + */ > + AVChannelLayout ch_layout; > }; > > /** > diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c > index a0f797e283..c72016d2c8 100644 > --- a/libavfilter/avfiltergraph.c > +++ b/libavfilter/avfiltergraph.c > @@ -397,7 +397,13 @@ static int pick_format(AVFilterLink *link) > return AVERROR(EINVAL); > } > link->in_channel_layouts->nb_channel_layouts = 1; > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > link->channel_layout = link->in_channel_layouts->channel_layouts[0]; > +FF_ENABLE_DEPRECATION_WARNINGS > +#endif > + av_channel_layout_from_mask(&link->ch_layout, > + > link->in_channel_layouts->channel_layouts[0]); > } > > ff_formats_unref(&link->in_formats); > @@ -578,23 +584,33 @@ static void > swap_channel_layouts_on_filter(AVFilterContext *filter) > for (j = 0; j < outlink->in_channel_layouts->nb_channel_layouts; > j++) { > uint64_t in_chlayout = > link->out_channel_layouts->channel_layouts[0]; > uint64_t out_chlayout = > outlink->in_channel_layouts->channel_layouts[j]; > - int in_channels = > av_get_channel_layout_nb_channels(in_chlayout); > - int out_channels = > av_get_channel_layout_nb_channels(out_chlayout); > - int count_diff = out_channels - in_channels; > + int in_channels; > + int out_channels; > + int count_diff; > int matched_channels, extra_channels; > int score = 0; > + AVChannelLayout in_ch_layout = {0}; > + AVChannelLayout out_ch_layout = {0}; > + > + av_channel_layout_from_mask( &in_ch_layout, in_chlayout); > + av_channel_layout_from_mask(&out_ch_layout, out_chlayout); > + in_channels = in_ch_layout.nb_channels; > + out_channels = out_ch_layout.nb_channels; > + count_diff = out_channels - in_channels; > > /* channel substitution */ > for (k = 0; k < FF_ARRAY_ELEMS(ch_subst); k++) { > uint64_t cmp0 = ch_subst[k][0]; > uint64_t cmp1 = ch_subst[k][1]; > + AVChannelLayout tmp = {0}; > if (( in_chlayout & cmp0) && (!(out_chlayout & cmp0)) && > (out_chlayout & cmp1) && (!( in_chlayout & cmp1))) { > in_chlayout &= ~cmp0; > out_chlayout &= ~cmp1; > /* add score for channel match, minus a deduction for > having to do the substitution */ > - score += 10 * av_get_channel_layout_nb_channels(cmp1) - > 2; > + av_channel_layout_from_mask(&tmp, cmp1); > + score += 10 * tmp.nb_channels - 2; > } > } > > @@ -605,10 +621,13 @@ static void > swap_channel_layouts_on_filter(AVFilterContext *filter) > in_chlayout &= ~AV_CH_LOW_FREQUENCY; > out_chlayout &= ~AV_CH_LOW_FREQUENCY; > > - matched_channels = av_get_channel_layout_nb_channels(in_chlayout > & > - > out_chlayout); > - extra_channels = > av_get_channel_layout_nb_channels(out_chlayout & > - > (~in_chlayout)); > + av_channel_layout_uninit( &in_ch_layout); > + av_channel_layout_uninit(&out_ch_layout); > + av_channel_layout_from_mask( &in_ch_layout, in_chlayout & > out_chlayout); > + av_channel_layout_from_mask(&out_ch_layout, out_chlayout & > (~in_chlayout)); > + > + matched_channels = in_ch_layout.nb_channels; > + extra_channels = out_ch_layout.nb_channels; > score += 10 * matched_channels - 5 * extra_channels; > > if (score > best_score || > diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c > index 3b4d285ffd..1c2d912ad4 100644 > --- a/libavfilter/buffersink.c > +++ b/libavfilter/buffersink.c > @@ -107,7 +107,7 @@ int attribute_align_arg > av_buffersink_get_samples(AVFilterContext *ctx, > int ret = 0; > > if (!s->audio_fifo) { > - int nb_channels = > av_get_channel_layout_nb_channels(link->channel_layout); > + int nb_channels = link->ch_layout.nb_channels; > if (!(s->audio_fifo = av_audio_fifo_alloc(link->format, nb_channels, > nb_samples))) > return AVERROR(ENOMEM); > } > diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c > index df00971514..838e3ac08d 100644 > --- a/libavfilter/buffersrc.c > +++ b/libavfilter/buffersrc.c > @@ -58,8 +58,7 @@ typedef struct BufferSourceContext { > int sample_rate; > enum AVSampleFormat sample_fmt; > char *sample_fmt_str; > - uint64_t channel_layout; > - char *channel_layout_str; > + AVChannelLayout ch_layout; > > int got_format_from_params; > int eof; > @@ -71,9 +70,9 @@ typedef struct BufferSourceContext { > return AVERROR(EINVAL);\ > } > > -#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, format)\ > +#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, chlayout, format)\ > if (c->sample_fmt != format || c->sample_rate != srate ||\ > - c->channel_layout != ch_layout) {\ > + av_channel_layout_compare(&c->ch_layout, &chlayout)) {\ > av_log(s, AV_LOG_ERROR, "Changing frame properties on the fly is not > supported.\n");\ > return AVERROR(EINVAL);\ > } > @@ -92,6 +91,7 @@ AVBufferSrcParameters *av_buffersrc_parameters_alloc(void) > int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters > *param) > { > BufferSourceContext *s = ctx->priv; > + int ret; > > if (param->time_base.num > 0 && param->time_base.den > 0) > s->time_base = param->time_base; > @@ -124,8 +124,17 @@ int av_buffersrc_parameters_set(AVFilterContext *ctx, > AVBufferSrcParameters *par > } > if (param->sample_rate > 0) > s->sample_rate = param->sample_rate; > - if (param->channel_layout) > - s->channel_layout = param->channel_layout; > + > + ret = av_channel_layout_copy(&s->ch_layout, ¶m->ch_layout); > + if (ret < 0) > + return ret; > + > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > + if (!av_channel_layout_check(&s->ch_layout)) > + av_channel_layout_from_mask(&s->ch_layout, > param->channel_layout); > +FF_ENABLE_DEPRECATION_WARNINGS > +#endif I think it would be more consistent to always prefer the deprecated channel_layout if it is set. > break; > default: > return AVERROR_BUG; > @@ -170,7 +179,7 @@ int attribute_align_arg > av_buffersrc_add_frame(AVFilterContext *ctx, > frame->format); > break; > case AVMEDIA_TYPE_AUDIO: > - CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, > frame->channel_layout, > + CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, > frame->ch_layout, > frame->format); > break; > default: > @@ -261,7 +270,7 @@ static const AVOption audio_options[] = { > { "time_base", NULL, OFFSET(time_base), > AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, A }, > { "sample_rate", NULL, OFFSET(sample_rate), AV_OPT_TYPE_INT, > { .i64 = 0 }, 0, INT_MAX, A }, > { "sample_fmt", NULL, OFFSET(sample_fmt_str), > AV_OPT_TYPE_STRING, .flags = A }, > - { "channel_layout", NULL, OFFSET(channel_layout_str), > AV_OPT_TYPE_STRING, .flags = A }, > + { "channel_layout", NULL, OFFSET(ch_layout), > AV_OPT_TYPE_CHANNEL_LAYOUT, .flags = A }, > { NULL }, > }; > > @@ -275,6 +284,7 @@ static const AVClass abuffer_class = { > static av_cold int init_audio(AVFilterContext *ctx) > { > BufferSourceContext *s = ctx->priv; > + char *chlstr; > int ret = 0; > > if (!(s->sample_fmt_str || s->got_format_from_params)) { > @@ -290,24 +300,17 @@ static av_cold int init_audio(AVFilterContext *ctx) > return AVERROR(EINVAL); > } > > - if (s->channel_layout_str) > - s->channel_layout = av_get_channel_layout(s->channel_layout_str); > - > - if (!s->channel_layout) { > - av_log(ctx, AV_LOG_ERROR, "Invalid channel layout %s.\n", > - s->channel_layout_str); > - return AVERROR(EINVAL); > - } > - > if (!(s->fifo = av_fifo_alloc(sizeof(AVFrame*)))) > return AVERROR(ENOMEM); > > if (!s->time_base.num) > s->time_base = (AVRational){1, s->sample_rate}; > > + chlstr = av_channel_layout_describe(&s->ch_layout); > av_log(ctx, AV_LOG_VERBOSE, "tb:%d/%d samplefmt:%s samplerate: %d " > "ch layout:%s\n", s->time_base.num, s->time_base.den, > s->sample_fmt_str, > - s->sample_rate, s->channel_layout_str); > + s->sample_rate, chlstr); > + av_free(chlstr); > > return ret; > } > @@ -344,7 +347,7 @@ static int query_formats(AVFilterContext *ctx) > ff_add_format(&samplerates, c->sample_rate); > ff_set_common_samplerates(ctx, samplerates); > > - ff_add_channel_layout(&channel_layouts, c->channel_layout); > + ff_add_channel_layout(&channel_layouts, c->ch_layout.u.mask); > ff_set_common_channel_layouts(ctx, channel_layouts); > break; > default: > @@ -357,6 +360,7 @@ static int query_formats(AVFilterContext *ctx) > static int config_props(AVFilterLink *link) > { > BufferSourceContext *c = link->src->priv; > + int ret; > > switch (link->type) { > case AVMEDIA_TYPE_VIDEO: > @@ -371,7 +375,16 @@ static int config_props(AVFilterLink *link) > } > break; > case AVMEDIA_TYPE_AUDIO: > - link->channel_layout = c->channel_layout; > + ret = av_channel_layout_copy(&link->ch_layout, &c->ch_layout); > + if (ret < 0) > + return ret; > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > + if (c->ch_layout.order == AV_CHANNEL_ORDER_NATIVE || > + c->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) > + link->channel_layout = c->ch_layout.u.mask; Same as above. -- Anton Khirnov _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel