| @@ -20,10 +20,11 @@ · 19 unmodified lines |
| 20 | 20 | |
| 21 | 21 | /** |
| 22 | 22 | * @file |
| 23 | | − * Video splitter |
| 23 | + * audio and video splitter |
| 24 | 24 | */ |
| 25 | 25 | |
| 26 | 26 | #include "avfilter.h" |
| 27 | +#include "audio.h" |
| 27 | 28 | |
| 28 | 29 | static int split_init(AVFilterContext *ctx, const char *args, void *opaque) |
| 29 | 30 | { |
| @@ -43,7 +44,7 @@ static int split_init(AVFilterContext *ctx, const char *args, void *opaque) · 13 unmodified lines |
| 43 | 44 | AVFilterPad pad = { 0 }; |
| 44 | 45 | |
| 45 | 46 | snprintf(name, sizeof(name), "output%d", i); |
| 46 | | − pad.type = AVMEDIA_TYPE_VIDEO; |
| 47 | + pad.type = ctx->filter->inputs[0].type; |
| 47 | 48 | pad.name = av_strdup(name); |
| 48 | 49 | |
| 49 | 50 | avfilter_insert_outpad(ctx, i, &pad); |
| @@ -106,3 +107,28 @@ AVFilter avfilter_vf_split = { · 56 unmodified lines |
| 106 | 107 | { .name = NULL}}, |
| 107 | 108 | .outputs = (AVFilterPad[]) {{ .name = NULL}}, |
| 108 | 109 | }; |
| 110 | + |
| 111 | +static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *samplesref) |
| 112 | +{ |
| 113 | + AVFilterContext *ctx = inlink->dst; |
| 114 | + int i; |
| 115 | + |
| 116 | + for (i = 0; i < ctx->output_count; i++) |
| 117 | + ff_filter_samples(inlink->dst->outputs[i], |
| 118 | + avfilter_ref_buffer(samplesref, ~AV_PERM_WRITE)); |
| 119 | +} |
| 120 | + |
| 121 | +AVFilter avfilter_af_asplit = { |
| 122 | + .name = "asplit", |
| 123 | + .description = NULL_IF_CONFIG_SMALL("Pass on the audio input to N audio outputs."), |
| 124 | + |
| 125 | + .init = split_init, |
| 126 | + .uninit = split_uninit, |
| 127 | + |
| 128 | + .inputs = (const AVFilterPad[]) {{ .name = "default", |
| 129 | + .type = AVMEDIA_TYPE_AUDIO, |
| 130 | + .get_audio_buffer = ff_null_get_audio_buffer, |
| 131 | + .filter_samples = filter_samples }, |
| 132 | + { .name = NULL }}, |
| 133 | + .outputs = (const AVFilterPad[]) {{ .name = NULL }}, |
| 134 | +}; |