Based on current version of the asplit filter in FFmpeg written by Stefano Sabatini and others.
Showing the changes to libavfilter/split.c (1 of 6 files). Show all
Unified · Split
| @@ -20,10 +20,11 @@ · 19 unmodified lines | |||
| 20 | 20 | ||
| 21 | /** | 21 | /** |
| 22 | * @file | 22 | * @file |
| 23 | * Video splitter | 23 | * audio and video splitter |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include "avfilter.h" | 26 | #include "avfilter.h" |
| 27 | #include "audio.h" | ||
| 27 | 28 | ||
| 28 | static int split_init(AVFilterContext *ctx, const char *args, void *opaque) | 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 | AVFilterPad pad = { 0 }; | 44 | AVFilterPad pad = { 0 }; |
| 44 | 45 | ||
| 45 | snprintf(name, sizeof(name), "output%d", i); | 46 | snprintf(name, sizeof(name), "output%d", i); |
| 46 | pad.type = AVMEDIA_TYPE_VIDEO; | 47 | pad.type = ctx->filter->inputs[0].type; |
| 47 | pad.name = av_strdup(name); | 48 | pad.name = av_strdup(name); |
| 48 | 49 | ||
| 49 | avfilter_insert_outpad(ctx, i, &pad); | 50 | avfilter_insert_outpad(ctx, i, &pad); |
| @@ -106,3 +107,28 @@ AVFilter avfilter_vf_split = { · 56 unmodified lines | |||
| 106 | { .name = NULL}}, | 107 | { .name = NULL}}, |
| 107 | .outputs = (AVFilterPad[]) {{ .name = NULL}}, | 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 | }; | ||