Commit 89310335 authored by Stefan Westerfeld's avatar Stefan Westerfeld

avfilter/asubprocess: allow setting command as filter parameter

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 1e4460c6
...@@ -200,7 +200,7 @@ enum { ...@@ -200,7 +200,7 @@ enum {
typedef struct AndioWMarkContext { typedef struct AndioWMarkContext {
const AVClass *class; const AVClass *class;
double strength; const char *command;
int fd; int fd;
int state; int state;
...@@ -208,21 +208,31 @@ typedef struct AndioWMarkContext { ...@@ -208,21 +208,31 @@ typedef struct AndioWMarkContext {
SP *sp; SP *sp;
int nb_samples; int nb_samples;
int eof; int eof;
} AudioWMarkContext; } ASubProcessContext;
#define OFFSET(x) offsetof(AudioWMarkContext, x) #define OFFSET(x) offsetof(ASubProcessContext, x)
#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
static const AVOption asubprocess_options[] = { static const AVOption asubprocess_options[] = {
{ "strength", "set watermarking strength", OFFSET(strength), AV_OPT_TYPE_DOUBLE, {.dbl=10}, 1, 100, A }, { "command", "set command to run as subprocess", OFFSET(command), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A},
{ NULL }, { NULL },
}; };
AVFILTER_DEFINE_CLASS(asubprocess); AVFILTER_DEFINE_CLASS(asubprocess);
static av_cold int init(AVFilterContext *ctx)
{
ASubProcessContext *s = ctx->priv;
if (!s->command) {
av_log(ctx, AV_LOG_ERROR, "No command provided\n");
return AVERROR(EINVAL);
}
return 0;
}
static av_cold void uninit(AVFilterContext *ctx) static av_cold void uninit(AVFilterContext *ctx)
{ {
AudioWMarkContext *s = ctx->priv; ASubProcessContext *s = ctx->priv;
printf ("TODO: uninit\n"); printf ("TODO: uninit\n");
#if 0 #if 0
...@@ -234,9 +244,8 @@ static av_cold void uninit(AVFilterContext *ctx) ...@@ -234,9 +244,8 @@ static av_cold void uninit(AVFilterContext *ctx)
static int config_input(AVFilterLink *inlink) static int config_input(AVFilterLink *inlink)
{ {
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
AudioWMarkContext *s = ctx->priv; ASubProcessContext *s = ctx->priv;
// TODO: use inlink->sample_rate, inlink->ch_layout.nb_channels s->sp = sp_new (s->command);
s->sp = sp_new ("audiowmark -q add - - f0");
int bit_depth = 16; int bit_depth = 16;
int sample_rate = inlink->sample_rate; int sample_rate = inlink->sample_rate;
int nb_channels = inlink->ch_layout.nb_channels; int nb_channels = inlink->ch_layout.nb_channels;
...@@ -285,7 +294,7 @@ static int config_input(AVFilterLink *inlink) ...@@ -285,7 +294,7 @@ static int config_input(AVFilterLink *inlink)
static int filter_frame(AVFilterLink *inlink, AVFrame *in) static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{ {
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
AudioWMarkContext *s = ctx->priv; ASubProcessContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out; AVFrame *out;
int ret = 0, nb_samples; int ret = 0, nb_samples;
...@@ -394,7 +403,7 @@ static int activate(AVFilterContext *ctx) ...@@ -394,7 +403,7 @@ static int activate(AVFilterContext *ctx)
{ {
AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *inlink = ctx->inputs[0];
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
AudioWMarkContext *s = ctx->priv; ASubProcessContext *s = ctx->priv;
AVFrame *in = NULL; AVFrame *in = NULL;
int64_t pts; int64_t pts;
int status, ret; int status, ret;
...@@ -454,8 +463,9 @@ static const AVFilterPad asubprocess_inputs[] = { ...@@ -454,8 +463,9 @@ static const AVFilterPad asubprocess_inputs[] = {
const AVFilter ff_af_asubprocess = { const AVFilter ff_af_asubprocess = {
.name = "asubprocess", .name = "asubprocess",
.description = NULL_IF_CONFIG_SMALL("Filter audio stream with subprocess."), .description = NULL_IF_CONFIG_SMALL("Filter audio stream with subprocess."),
.priv_size = sizeof(AudioWMarkContext), .priv_size = sizeof(ASubProcessContext),
.priv_class = &asubprocess_class, .priv_class = &asubprocess_class,
.init = init,
.uninit = uninit, .uninit = uninit,
.activate = activate, .activate = activate,
FILTER_INPUTS(asubprocess_inputs), FILTER_INPUTS(asubprocess_inputs),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment