Signed-off-by: Vittorio Giovara <[email protected]>
---
libavfilter/buffersrc.c | 53 ++++++++++++++++++++++++++++++-------------------
libavfilter/buffersrc.h | 12 ++++++++++-
2 files changed, 44 insertions(+), 21 deletions(-)
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
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;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
link->sample_rate = c->sample_rate;
break;
default:
diff --git a/libavfilter/buffersrc.h b/libavfilter/buffersrc.h
index dcea3da79b..ac1631cdff 100644
--- a/libavfilter/buffersrc.h
+++ b/libavfilter/buffersrc.h
@@ -25,6 +25,8 @@
* Memory buffer source API.
*/
+#include "libavutil/channel_layout.h"
+
#include "avfilter.h"
/**
@@ -80,10 +82,18 @@ typedef struct AVBufferSrcParameters {
*/
int sample_rate;
+#if FF_API_OLD_CHANNEL_LAYOUT
/**
- * Audio only, the audio channel layout
+ * @deprecated use ch_layout instead
*/
+ attribute_deprecated
uint64_t channel_layout;
+#endif
+
+ /**
+ * Audio only, the audio channel layout
+ */
+ AVChannelLayout ch_layout;
} AVBufferSrcParameters;
/**
--
2.12.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel