h264_metadata: Add option to delete filler data
[libav.git] / libavfilter / split.c
CommitLineData
615baa13
BB
1/*
2 * Copyright (c) 2007 Bobby Bingham
3 *
4 * This file is part of Libav.
5 *
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21/**
22 * @file
afeb3590 23 * audio and video splitter
615baa13
BB
24 */
25
1d9c2dc8
MS
26#include <stdio.h>
27
093804a9 28#include "libavutil/attributes.h"
1d9c2dc8
MS
29#include "libavutil/internal.h"
30#include "libavutil/mem.h"
73d5d405
AK
31#include "libavutil/opt.h"
32
615baa13 33#include "avfilter.h"
afeb3590 34#include "audio.h"
fa417fcd 35#include "internal.h"
c04c533f 36#include "video.h"
615baa13 37
73d5d405
AK
38typedef struct SplitContext {
39 const AVClass *class;
40 int nb_outputs;
41} SplitContext;
42
093804a9 43static av_cold int split_init(AVFilterContext *ctx)
fd18ee0f 44{
73d5d405
AK
45 SplitContext *s = ctx->priv;
46 int i;
fd18ee0f 47
73d5d405 48 for (i = 0; i < s->nb_outputs; i++) {
fd18ee0f
AK
49 char name[32];
50 AVFilterPad pad = { 0 };
51
52 snprintf(name, sizeof(name), "output%d", i);
afeb3590 53 pad.type = ctx->filter->inputs[0].type;
fd18ee0f
AK
54 pad.name = av_strdup(name);
55
fa417fcd 56 ff_insert_outpad(ctx, i, &pad);
fd18ee0f
AK
57 }
58
59 return 0;
60}
61
093804a9 62static av_cold void split_uninit(AVFilterContext *ctx)
fd18ee0f
AK
63{
64 int i;
65
9baeff95 66 for (i = 0; i < ctx->nb_outputs; i++)
fd18ee0f
AK
67 av_freep(&ctx->output_pads[i].name);
68}
69
7e350379 70static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
615baa13 71{
fd18ee0f 72 AVFilterContext *ctx = inlink->dst;
ebc8d974 73 int i, ret = 0;
fd18ee0f 74
ebc8d974 75 for (i = 0; i < ctx->nb_outputs; i++) {
7e350379 76 AVFrame *buf_out = av_frame_clone(frame);
565e4993
AK
77 if (!buf_out) {
78 ret = AVERROR(ENOMEM);
e9b992d0 79 break;
565e4993 80 }
fd18ee0f 81
565e4993 82 ret = ff_filter_frame(ctx->outputs[i], buf_out);
d4f89906
AK
83 if (ret < 0)
84 break;
85 }
7e350379 86 av_frame_free(&frame);
d4f89906 87 return ret;
615baa13
BB
88}
89
73d5d405
AK
90#define OFFSET(x) offsetof(SplitContext, x)
91#define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_VIDEO_PARAM
92static const AVOption options[] = {
93 { "outputs", "Number of outputs", OFFSET(nb_outputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, FLAGS },
94 { NULL },
95};
96
97static const AVClass split_class = {
98 .class_name = "split",
99 .item_name = av_default_item_name,
100 .option = options,
101 .version = LIBAVUTIL_VERSION_INT,
102};
103
104static const AVClass asplit_class = {
105 .class_name = "asplit",
106 .item_name = av_default_item_name,
107 .option = options,
108 .version = LIBAVUTIL_VERSION_INT,
109};
110
568c70e7
MR
111static const AVFilterPad avfilter_vf_split_inputs[] = {
112 {
113 .name = "default",
114 .type = AVMEDIA_TYPE_VIDEO,
115 .get_video_buffer = ff_null_get_video_buffer,
565e4993 116 .filter_frame = filter_frame,
568c70e7
MR
117 },
118 { NULL }
119};
120
cd43ca04 121AVFilter ff_vf_split = {
615baa13 122 .name = "split",
10121557 123 .description = NULL_IF_CONFIG_SMALL("Pass on the input to N video outputs."),
615baa13 124
73d5d405
AK
125 .priv_size = sizeof(SplitContext),
126 .priv_class = &split_class,
127
fd18ee0f
AK
128 .init = split_init,
129 .uninit = split_uninit,
130
568c70e7 131 .inputs = avfilter_vf_split_inputs,
1fce361d 132 .outputs = NULL,
7cdd737b
AK
133
134 .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
615baa13 135};
afeb3590 136
568c70e7
MR
137static const AVFilterPad avfilter_af_asplit_inputs[] = {
138 {
139 .name = "default",
140 .type = AVMEDIA_TYPE_AUDIO,
141 .get_audio_buffer = ff_null_get_audio_buffer,
565e4993 142 .filter_frame = filter_frame,
568c70e7
MR
143 },
144 { NULL }
145};
146
cd43ca04 147AVFilter ff_af_asplit = {
afeb3590
JR
148 .name = "asplit",
149 .description = NULL_IF_CONFIG_SMALL("Pass on the audio input to N audio outputs."),
150
73d5d405
AK
151 .priv_size = sizeof(SplitContext),
152 .priv_class = &asplit_class,
153
afeb3590
JR
154 .init = split_init,
155 .uninit = split_uninit,
156
568c70e7 157 .inputs = avfilter_af_asplit_inputs,
1fce361d 158 .outputs = NULL,
7cdd737b
AK
159
160 .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
afeb3590 161};