Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com> --- libavfilter/af_channelsplit.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/libavfilter/af_channelsplit.c b/libavfilter/af_channelsplit.c index 5b410fd87c..41b3051c8c 100644 --- a/libavfilter/af_channelsplit.c +++ b/libavfilter/af_channelsplit.c @@ -36,14 +36,14 @@ typedef struct ChannelSplitContext { const AVClass *class; - uint64_t channel_layout; - char *channel_layout_str; + AVChannelLayout ch_layout; } ChannelSplitContext; #define OFFSET(x) offsetof(ChannelSplitContext, x) #define A AV_OPT_FLAG_AUDIO_PARAM static const AVOption options[] = { - { "channel_layout", "Input channel layout.", OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, { .str = "stereo" }, .flags = A }, + { "channel_layout", "Input channel layout.", OFFSET(ch_layout), + AV_OPT_TYPE_CHANNEL_LAYOUT, { .str = "stereo" }, .flags = A }, { NULL }, }; @@ -57,23 +57,17 @@ static const AVClass channelsplit_class = { static av_cold int init(AVFilterContext *ctx) { ChannelSplitContext *s = ctx->priv; - int nb_channels; + int nb_channels = s->ch_layout.nb_channels; int ret = 0, i; - if (!(s->channel_layout = av_get_channel_layout(s->channel_layout_str))) { - av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout '%s'.\n", - s->channel_layout_str); - ret = AVERROR(EINVAL); - goto fail; - } - - nb_channels = av_get_channel_layout_nb_channels(s->channel_layout); for (i = 0; i < nb_channels; i++) { - uint64_t channel = av_channel_layout_extract_channel(s->channel_layout, i); AVFilterPad pad = { 0 }; + ret = av_channel_layout_get_channel(&s->ch_layout, i); + if (ret < 0) + goto fail; pad.type = AVMEDIA_TYPE_AUDIO; - pad.name = av_get_channel_name(channel); + pad.name = av_channel_name(ret); ff_insert_outpad(ctx, i, &pad); } @@ -91,14 +85,16 @@ static int query_formats(AVFilterContext *ctx) ff_set_common_formats (ctx, ff_planar_sample_fmts()); ff_set_common_samplerates(ctx, ff_all_samplerates()); - ff_add_channel_layout(&in_layouts, s->channel_layout); + ff_add_channel_layout(&in_layouts, s->ch_layout.u.mask); ff_channel_layouts_ref(in_layouts, &ctx->inputs[0]->out_channel_layouts); for (i = 0; i < ctx->nb_outputs; i++) { AVFilterChannelLayouts *out_layouts = NULL; - uint64_t channel = av_channel_layout_extract_channel(s->channel_layout, i); + int ret = av_channel_layout_get_channel(&s->ch_layout, i); + if (ret < 0) + return ret; - ff_add_channel_layout(&out_layouts, channel); + ff_add_channel_layout(&out_layouts, 1ULL << ret); ff_channel_layouts_ref(out_layouts, &ctx->outputs[i]->in_channel_layouts); } @@ -112,15 +108,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) for (i = 0; i < ctx->nb_outputs; i++) { AVFrame *buf_out = av_frame_clone(buf); + enum AVChannel channel; if (!buf_out) { ret = AVERROR(ENOMEM); break; } - buf_out->data[0] = buf_out->extended_data[0] = buf_out->extended_data[i]; - buf_out->channel_layout = - av_channel_layout_extract_channel(buf->channel_layout, i); + channel = av_channel_layout_get_channel(&buf->ch_layout, i); + + av_channel_layout_uninit(&buf_out->ch_layout); + av_channel_layout_from_mask(&buf_out->ch_layout, 1 << channel); ret = ff_filter_frame(ctx->outputs[i], buf_out); if (ret < 0) -- 2.12.0 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel