diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
| commit | f7813a5324be39d13ab536c245d15dfc602a7849 (patch) | |
| tree | fad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavfilter/split.c | |
| parent | b7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff) | |
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavfilter/split.c')
| -rw-r--r-- | ffmpeg/libavfilter/split.c | 87 |
1 files changed, 50 insertions, 37 deletions
diff --git a/ffmpeg/libavfilter/split.c b/ffmpeg/libavfilter/split.c index b57d8cd..6abd5ee 100644 --- a/ffmpeg/libavfilter/split.c +++ b/ffmpeg/libavfilter/split.c @@ -25,27 +25,27 @@ #include <stdio.h> +#include "libavutil/attributes.h" #include "libavutil/internal.h" #include "libavutil/mem.h" +#include "libavutil/opt.h" + #include "avfilter.h" #include "audio.h" #include "internal.h" #include "video.h" -static int split_init(AVFilterContext *ctx, const char *args) +typedef struct SplitContext { + const AVClass *class; + int nb_outputs; +} SplitContext; + +static av_cold int split_init(AVFilterContext *ctx) { - int i, nb_outputs = 2; - - if (args) { - nb_outputs = strtol(args, NULL, 0); - if (nb_outputs <= 0) { - av_log(ctx, AV_LOG_ERROR, "Invalid number of outputs specified: %d.\n", - nb_outputs); - return AVERROR(EINVAL); - } - } + SplitContext *s = ctx->priv; + int i; - for (i = 0; i < nb_outputs; i++) { + for (i = 0; i < s->nb_outputs; i++) { char name[32]; AVFilterPad pad = { 0 }; @@ -59,7 +59,7 @@ static int split_init(AVFilterContext *ctx, const char *args) return 0; } -static void split_uninit(AVFilterContext *ctx) +static av_cold void split_uninit(AVFilterContext *ctx) { int i; @@ -91,44 +91,57 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) return ret; } +#define OFFSET(x) offsetof(SplitContext, x) +#define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_VIDEO_PARAM +static const AVOption options[] = { + { "outputs", "set number of outputs", OFFSET(nb_outputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, FLAGS }, + { NULL } +}; + +#define split_options options +AVFILTER_DEFINE_CLASS(split); + +#define asplit_options options +AVFILTER_DEFINE_CLASS(asplit); + static const AVFilterPad avfilter_vf_split_inputs[] = { { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .get_video_buffer = ff_null_get_video_buffer, - .filter_frame = filter_frame, + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .filter_frame = filter_frame, }, { NULL } }; -AVFilter avfilter_vf_split = { - .name = "split", - .description = NULL_IF_CONFIG_SMALL("Pass on the input video to N outputs."), - - .init = split_init, - .uninit = split_uninit, - - .inputs = avfilter_vf_split_inputs, - .outputs = NULL, +AVFilter ff_vf_split = { + .name = "split", + .description = NULL_IF_CONFIG_SMALL("Pass on the input to N video outputs."), + .priv_size = sizeof(SplitContext), + .priv_class = &split_class, + .init = split_init, + .uninit = split_uninit, + .inputs = avfilter_vf_split_inputs, + .outputs = NULL, + .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, }; static const AVFilterPad avfilter_af_asplit_inputs[] = { { - .name = "default", - .type = AVMEDIA_TYPE_AUDIO, - .get_audio_buffer = ff_null_get_audio_buffer, - .filter_frame = filter_frame, + .name = "default", + .type = AVMEDIA_TYPE_AUDIO, + .filter_frame = filter_frame, }, { NULL } }; -AVFilter avfilter_af_asplit = { +AVFilter ff_af_asplit = { .name = "asplit", .description = NULL_IF_CONFIG_SMALL("Pass on the audio input to N audio outputs."), - - .init = split_init, - .uninit = split_uninit, - - .inputs = avfilter_af_asplit_inputs, - .outputs = NULL, + .priv_size = sizeof(SplitContext), + .priv_class = &asplit_class, + .init = split_init, + .uninit = split_uninit, + .inputs = avfilter_af_asplit_inputs, + .outputs = NULL, + .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, }; |
