mirror of https://git.ffmpeg.org/ffmpeg.git
avfilter: use AV_OPT_TYPE_CHLAYOUT
This commit is contained in:
parent
707e46dc54
commit
4af412be71
|
@ -58,7 +58,6 @@ enum MappingMode {
|
|||
typedef struct ChannelMapContext {
|
||||
const AVClass *class;
|
||||
char *mapping_str;
|
||||
char *channel_layout_str;
|
||||
AVChannelLayout output_layout;
|
||||
struct ChannelMap map[MAX_CH];
|
||||
int nch;
|
||||
|
@ -72,7 +71,7 @@ static const AVOption channelmap_options[] = {
|
|||
{ "map", "A comma-separated list of input channel numbers in output order.",
|
||||
OFFSET(mapping_str), AV_OPT_TYPE_STRING, .flags = A|F },
|
||||
{ "channel_layout", "Output channel layout.",
|
||||
OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, .flags = A|F },
|
||||
OFFSET(output_layout), AV_OPT_TYPE_CHLAYOUT, .flags = A|F },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
@ -122,7 +121,6 @@ static av_cold int channelmap_init(AVFilterContext *ctx)
|
|||
ChannelMapContext *s = ctx->priv;
|
||||
char *mapping, separator = '|';
|
||||
int map_entries = 0;
|
||||
char buf[256];
|
||||
enum MappingMode mode;
|
||||
uint64_t out_ch_mask = 0;
|
||||
int i;
|
||||
|
@ -232,50 +230,25 @@ static av_cold int channelmap_init(AVFilterContext *ctx)
|
|||
s->nch = map_entries;
|
||||
if (out_ch_mask)
|
||||
av_channel_layout_from_mask(&s->output_layout, out_ch_mask);
|
||||
else
|
||||
else if (map_entries)
|
||||
av_channel_layout_default(&s->output_layout, map_entries);
|
||||
|
||||
if (s->channel_layout_str) {
|
||||
AVChannelLayout fmt = { 0 };
|
||||
int ret;
|
||||
if ((ret = av_channel_layout_from_string(&fmt, s->channel_layout_str)) < 0) {
|
||||
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||
uint64_t mask;
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
if ((mask = av_get_channel_layout(s->channel_layout_str)) == 0) {
|
||||
#endif
|
||||
av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout: '%s'.\n",
|
||||
s->channel_layout_str);
|
||||
return AVERROR(EINVAL);
|
||||
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
av_log(ctx, AV_LOG_WARNING, "Channel layout '%s' uses a deprecated syntax.\n",
|
||||
s->channel_layout_str);
|
||||
av_channel_layout_from_mask(&fmt, mask);
|
||||
#endif
|
||||
if (mode == MAP_NONE) {
|
||||
int i;
|
||||
s->nch = s->output_layout.nb_channels;
|
||||
for (i = 0; i < s->nch; i++) {
|
||||
s->map[i].in_channel_idx = i;
|
||||
s->map[i].out_channel_idx = i;
|
||||
}
|
||||
if (mode == MAP_NONE) {
|
||||
int i;
|
||||
s->nch = fmt.nb_channels;
|
||||
for (i = 0; i < s->nch; i++) {
|
||||
s->map[i].in_channel_idx = i;
|
||||
s->map[i].out_channel_idx = i;
|
||||
}
|
||||
} else if (out_ch_mask && av_channel_layout_compare(&s->output_layout, &fmt)) {
|
||||
av_channel_layout_describe(&s->output_layout, buf, sizeof(buf));
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Output channel layout '%s' does not match the list of channel mapped: '%s'.\n",
|
||||
s->channel_layout_str, buf);
|
||||
return AVERROR(EINVAL);
|
||||
} else if (s->nch != fmt.nb_channels) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Output channel layout %s does not match the number of channels mapped %d.\n",
|
||||
s->channel_layout_str, s->nch);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
s->output_layout = fmt;
|
||||
} else if (s->nch != s->output_layout.nb_channels) {
|
||||
char buf[256];
|
||||
av_channel_layout_describe(&s->output_layout, buf, sizeof(buf));
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Output channel layout %s does not match the number of channels mapped %d.\n",
|
||||
buf, s->nch);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (!s->output_layout.nb_channels) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Output channel layout is not set and "
|
||||
"cannot be guessed from the maps.\n");
|
||||
|
|
|
@ -40,7 +40,6 @@ typedef struct ChannelSplitContext {
|
|||
const AVClass *class;
|
||||
|
||||
AVChannelLayout channel_layout;
|
||||
char *channel_layout_str;
|
||||
char *channels_str;
|
||||
|
||||
int map[64];
|
||||
|
@ -50,7 +49,7 @@ typedef struct ChannelSplitContext {
|
|||
#define A AV_OPT_FLAG_AUDIO_PARAM
|
||||
#define F AV_OPT_FLAG_FILTERING_PARAM
|
||||
static const AVOption channelsplit_options[] = {
|
||||
{ "channel_layout", "Input channel layout.", OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, { .str = "stereo" }, .flags = A|F },
|
||||
{ "channel_layout", "Input channel layout.", OFFSET(channel_layout), AV_OPT_TYPE_CHLAYOUT, { .str = "stereo" }, .flags = A|F },
|
||||
{ "channels", "Channels to extract.", OFFSET(channels_str), AV_OPT_TYPE_STRING, { .str = "all" }, .flags = A|F },
|
||||
{ NULL }
|
||||
};
|
||||
|
@ -63,13 +62,6 @@ static av_cold int init(AVFilterContext *ctx)
|
|||
AVChannelLayout channel_layout = { 0 };
|
||||
int all = 0, ret = 0, i;
|
||||
|
||||
if ((ret = av_channel_layout_from_string(&s->channel_layout, s->channel_layout_str)) < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout '%s'.\n",
|
||||
s->channel_layout_str);
|
||||
ret = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!strcmp(s->channels_str, "all")) {
|
||||
if ((ret = av_channel_layout_copy(&channel_layout, &s->channel_layout)) < 0)
|
||||
goto fail;
|
||||
|
@ -100,9 +92,11 @@ static av_cold int init(AVFilterContext *ctx)
|
|||
if (all) {
|
||||
s->map[i] = i;
|
||||
} else {
|
||||
char buf[128];
|
||||
av_channel_layout_describe(&s->channel_layout, buf, sizeof(buf));
|
||||
if ((ret = av_channel_layout_index_from_channel(&s->channel_layout, channel)) < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Channel name '%s' not present in channel layout '%s'.\n",
|
||||
pad.name, s->channel_layout_str);
|
||||
pad.name, buf);
|
||||
av_freep(&pad.name);
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,6 @@ typedef struct JoinContext {
|
|||
|
||||
int inputs;
|
||||
char *map;
|
||||
char *channel_layout_str;
|
||||
AVChannelLayout ch_layout;
|
||||
|
||||
int64_t eof_pts;
|
||||
|
@ -73,7 +72,7 @@ typedef struct JoinContext {
|
|||
static const AVOption join_options[] = {
|
||||
{ "inputs", "Number of input streams.", OFFSET(inputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, A|F },
|
||||
{ "channel_layout", "Channel layout of the "
|
||||
"output stream.", OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, {.str = "stereo"}, 0, 0, A|F },
|
||||
"output stream.", OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = "stereo"}, 0, 0, A|F },
|
||||
{ "map", "A comma-separated list of channels maps in the format "
|
||||
"'input_stream.input_channel-output_channel.",
|
||||
OFFSET(map), AV_OPT_TYPE_STRING, .flags = A|F },
|
||||
|
@ -157,26 +156,6 @@ static av_cold int join_init(AVFilterContext *ctx)
|
|||
JoinContext *s = ctx->priv;
|
||||
int ret, i;
|
||||
|
||||
ret = av_channel_layout_from_string(&s->ch_layout, s->channel_layout_str);
|
||||
if (ret < 0) {
|
||||
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||
uint64_t mask;
|
||||
FF_DISABLE_DEPRECATION_WARNINGS
|
||||
mask = av_get_channel_layout(s->channel_layout_str);
|
||||
if (!mask) {
|
||||
#endif
|
||||
av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout '%s'.\n",
|
||||
s->channel_layout_str);
|
||||
return AVERROR(EINVAL);
|
||||
#if FF_API_OLD_CHANNEL_LAYOUT
|
||||
}
|
||||
FF_ENABLE_DEPRECATION_WARNINGS
|
||||
av_log(ctx, AV_LOG_WARNING, "Channel layout '%s' uses a deprecated syntax.\n",
|
||||
s->channel_layout_str);
|
||||
av_channel_layout_from_mask(&s->ch_layout, mask);
|
||||
#endif
|
||||
}
|
||||
|
||||
s->channels = av_calloc(s->ch_layout.nb_channels, sizeof(*s->channels));
|
||||
s->buffers = av_calloc(s->ch_layout.nb_channels, sizeof(*s->buffers));
|
||||
s->input_frames = av_calloc(s->inputs, sizeof(*s->input_frames));
|
||||
|
|
|
@ -61,8 +61,8 @@ static const int sc_map[16] = {
|
|||
typedef struct AudioSurroundContext {
|
||||
const AVClass *class;
|
||||
|
||||
char *out_channel_layout_str;
|
||||
char *in_channel_layout_str;
|
||||
AVChannelLayout out_ch_layout;
|
||||
AVChannelLayout in_ch_layout;
|
||||
|
||||
float level_in;
|
||||
float level_out;
|
||||
|
@ -93,8 +93,6 @@ typedef struct AudioSurroundContext {
|
|||
float lowcut;
|
||||
float highcut;
|
||||
|
||||
AVChannelLayout out_ch_layout;
|
||||
AVChannelLayout in_ch_layout;
|
||||
int nb_in_channels;
|
||||
int nb_out_channels;
|
||||
|
||||
|
@ -1107,20 +1105,8 @@ static av_cold int init(AVFilterContext *ctx)
|
|||
{
|
||||
AudioSurroundContext *s = ctx->priv;
|
||||
int64_t in_channel_layout, out_channel_layout;
|
||||
char in_name[128], out_name[128];
|
||||
float overlap;
|
||||
int ret;
|
||||
|
||||
if ((ret = av_channel_layout_from_string(&s->out_ch_layout, s->out_channel_layout_str)) < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Error parsing output channel layout '%s'.\n",
|
||||
s->out_channel_layout_str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((ret = av_channel_layout_from_string(&s->in_ch_layout, s->in_channel_layout_str)) < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Error parsing input channel layout '%s'.\n",
|
||||
s->in_channel_layout_str);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (s->lowcutf >= s->highcutf) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Low cut-off '%d' should be less than high cut-off '%d'.\n",
|
||||
|
@ -1181,8 +1167,10 @@ static av_cold int init(AVFilterContext *ctx)
|
|||
break;
|
||||
default:
|
||||
fail:
|
||||
av_channel_layout_describe(&s->out_ch_layout, out_name, sizeof(out_name));
|
||||
av_channel_layout_describe(&s->in_ch_layout, in_name, sizeof(in_name));
|
||||
av_log(ctx, AV_LOG_ERROR, "Unsupported upmix: '%s' -> '%s'.\n",
|
||||
s->in_channel_layout_str, s->out_channel_layout_str);
|
||||
in_name, out_name);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -1417,8 +1405,8 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar
|
|||
#define TFLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
|
||||
|
||||
static const AVOption surround_options[] = {
|
||||
{ "chl_out", "set output channel layout", OFFSET(out_channel_layout_str), AV_OPT_TYPE_STRING, {.str="5.1"}, 0, 0, FLAGS },
|
||||
{ "chl_in", "set input channel layout", OFFSET(in_channel_layout_str), AV_OPT_TYPE_STRING, {.str="stereo"},0, 0, FLAGS },
|
||||
{ "chl_out", "set output channel layout", OFFSET(out_ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str="5.1"}, 0, 0, FLAGS },
|
||||
{ "chl_in", "set input channel layout", OFFSET(in_ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str="stereo"},0, 0, FLAGS },
|
||||
{ "level_in", "set input level", OFFSET(level_in), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
|
||||
{ "level_out", "set output level", OFFSET(level_out), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 10, TFLAGS },
|
||||
{ "lfe", "output LFE", OFFSET(output_lfe), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, TFLAGS },
|
||||
|
|
|
@ -36,23 +36,10 @@ typedef struct AFDelaySrcContext {
|
|||
int nb_samples;
|
||||
int nb_taps;
|
||||
AVChannelLayout chlayout;
|
||||
char *chlayout_str;
|
||||
|
||||
int64_t pts;
|
||||
} AFDelaySrcContext;
|
||||
|
||||
static av_cold int init(AVFilterContext *ctx)
|
||||
{
|
||||
AFDelaySrcContext *s = ctx->priv;
|
||||
int ret;
|
||||
|
||||
ret = ff_parse_channel_layout(&s->chlayout, NULL, s->chlayout_str, ctx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static float sincf(float x)
|
||||
{
|
||||
if (x == 0.f)
|
||||
|
@ -134,13 +121,6 @@ static const AVFilterPad afdelaysrc_outputs[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static av_cold void uninit(AVFilterContext *ctx)
|
||||
{
|
||||
AFDelaySrcContext *s = ctx->priv;
|
||||
|
||||
av_channel_layout_uninit(&s->chlayout);
|
||||
}
|
||||
|
||||
#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
|
||||
#define OFFSET(x) offsetof(AFDelaySrcContext, x)
|
||||
|
||||
|
@ -153,8 +133,8 @@ static const AVOption afdelaysrc_options[] = {
|
|||
{ "n", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64=1024}, 1, INT_MAX, AF },
|
||||
{ "taps", "set number of taps for delay filter", OFFSET(nb_taps), AV_OPT_TYPE_INT, {.i64=0}, 0, 32768, AF },
|
||||
{ "t", "set number of taps for delay filter", OFFSET(nb_taps), AV_OPT_TYPE_INT, {.i64=0}, 0, 32768, AF },
|
||||
{ "channel_layout", "set channel layout", OFFSET(chlayout_str),AV_OPT_TYPE_STRING,{.str="stereo"},0, 0, AF },
|
||||
{ "c", "set channel layout", OFFSET(chlayout_str),AV_OPT_TYPE_STRING,{.str="stereo"},0, 0, AF },
|
||||
{ "channel_layout", "set channel layout", OFFSET(chlayout), AV_OPT_TYPE_CHLAYOUT,{.str="stereo"},0, 0, AF },
|
||||
{ "c", "set channel layout", OFFSET(chlayout), AV_OPT_TYPE_CHLAYOUT,{.str="stereo"},0, 0, AF },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
@ -165,9 +145,7 @@ const AVFilter ff_asrc_afdelaysrc = {
|
|||
.description = NULL_IF_CONFIG_SMALL("Generate a Fractional delay FIR coefficients."),
|
||||
.priv_size = sizeof(AFDelaySrcContext),
|
||||
.priv_class = &afdelaysrc_class,
|
||||
.init = init,
|
||||
.activate = activate,
|
||||
.uninit = uninit,
|
||||
.inputs = NULL,
|
||||
FILTER_OUTPUTS(afdelaysrc_outputs),
|
||||
FILTER_QUERY_FUNC(query_formats),
|
||||
|
|
|
@ -38,9 +38,7 @@
|
|||
|
||||
typedef struct ANullContext {
|
||||
const AVClass *class;
|
||||
char *channel_layout_str;
|
||||
AVChannelLayout ch_layout;
|
||||
char *sample_rate_str;
|
||||
int sample_rate;
|
||||
int64_t duration;
|
||||
int nb_samples; ///< number of samples per requested frame
|
||||
|
@ -51,10 +49,10 @@ typedef struct ANullContext {
|
|||
#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
|
||||
|
||||
static const AVOption anullsrc_options[]= {
|
||||
{ "channel_layout", "set channel_layout", OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, {.str = "stereo"}, 0, 0, FLAGS },
|
||||
{ "cl", "set channel_layout", OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, {.str = "stereo"}, 0, 0, FLAGS },
|
||||
{ "sample_rate", "set sample rate", OFFSET(sample_rate_str) , AV_OPT_TYPE_STRING, {.str = "44100"}, 0, 0, FLAGS },
|
||||
{ "r", "set sample rate", OFFSET(sample_rate_str) , AV_OPT_TYPE_STRING, {.str = "44100"}, 0, 0, FLAGS },
|
||||
{ "channel_layout", "set channel_layout", OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = "stereo"}, 0, 0, FLAGS },
|
||||
{ "cl", "set channel_layout", OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = "stereo"}, 0, 0, FLAGS },
|
||||
{ "sample_rate", "set sample rate", OFFSET(sample_rate) , AV_OPT_TYPE_INT, {.i64 = 44100}, 0, 0, FLAGS },
|
||||
{ "r", "set sample rate", OFFSET(sample_rate) , AV_OPT_TYPE_INT, {.i64 = 44100}, 0, 0, FLAGS },
|
||||
{ "nb_samples", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 1, UINT16_MAX, FLAGS },
|
||||
{ "n", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 1, UINT16_MAX, FLAGS },
|
||||
{ "duration", "set the audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
|
||||
|
@ -64,22 +62,6 @@ static const AVOption anullsrc_options[]= {
|
|||
|
||||
AVFILTER_DEFINE_CLASS(anullsrc);
|
||||
|
||||
static av_cold int init(AVFilterContext *ctx)
|
||||
{
|
||||
ANullContext *null = ctx->priv;
|
||||
int ret;
|
||||
|
||||
if ((ret = ff_parse_sample_rate(&null->sample_rate,
|
||||
null->sample_rate_str, ctx)) < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = ff_parse_channel_layout(&null->ch_layout, NULL,
|
||||
null->channel_layout_str, ctx)) < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int query_formats(AVFilterContext *ctx)
|
||||
{
|
||||
ANullContext *null = ctx->priv;
|
||||
|
@ -129,12 +111,6 @@ static int activate(AVFilterContext *ctx)
|
|||
return FFERROR_NOT_READY;
|
||||
}
|
||||
|
||||
static av_cold void uninit(AVFilterContext *ctx)
|
||||
{
|
||||
ANullContext *s = ctx->priv;
|
||||
av_channel_layout_uninit(&s->ch_layout);
|
||||
}
|
||||
|
||||
static const AVFilterPad avfilter_asrc_anullsrc_outputs[] = {
|
||||
{
|
||||
.name = "default",
|
||||
|
@ -146,8 +122,6 @@ static const AVFilterPad avfilter_asrc_anullsrc_outputs[] = {
|
|||
const AVFilter ff_asrc_anullsrc = {
|
||||
.name = "anullsrc",
|
||||
.description = NULL_IF_CONFIG_SMALL("Null audio source, return empty audio frames."),
|
||||
.init = init,
|
||||
.uninit = uninit,
|
||||
.priv_size = sizeof(ANullContext),
|
||||
.inputs = NULL,
|
||||
FILTER_OUTPUTS(avfilter_asrc_anullsrc_outputs),
|
||||
|
|
Loading…
Reference in New Issue