Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavfilter
split.c
Go to the documentation of this file.
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
26
#include <stdio.h>
27
28
#include "
libavutil/internal.h
"
29
#include "
libavutil/mem.h
"
30
#include "
avfilter.h
"
31
#include "
audio.h
"
32
#include "
internal.h
"
33
#include "
video.h
"
34
35
static
int
split_init
(
AVFilterContext
*ctx,
const
char
*args)
36
{
37
int
i, nb_outputs = 2;
38
39
if
(args) {
40
nb_outputs = strtol(args,
NULL
, 0);
41
if
(nb_outputs <= 0) {
42
av_log
(ctx,
AV_LOG_ERROR
,
"Invalid number of outputs specified: %d.\n"
,
43
nb_outputs);
44
return
AVERROR
(EINVAL);
45
}
46
}
47
48
for
(i = 0; i < nb_outputs; i++) {
49
char
name
[32];
50
AVFilterPad
pad = { 0 };
51
52
snprintf(name,
sizeof
(name),
"output%d"
, i);
53
pad.
type
= ctx->
filter
->
inputs
[0].
type
;
54
pad.
name
=
av_strdup
(name);
55
56
ff_insert_outpad
(ctx, i, &pad);
57
}
58
59
return
0;
60
}
61
62
static
void
split_uninit
(
AVFilterContext
*ctx)
63
{
64
int
i;
65
66
for
(i = 0; i < ctx->
nb_outputs
; i++)
67
av_freep
(&ctx->
output_pads
[i].
name
);
68
}
69
70
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFilterBufferRef
*frame)
71
{
72
AVFilterContext
*ctx = inlink->
dst
;
73
int
i, ret = 0;
74
75
for
(i = 0; i < ctx->
nb_outputs
; i++) {
76
AVFilterBufferRef
*buf_out =
avfilter_ref_buffer
(frame, ~
AV_PERM_WRITE
);
77
if
(!buf_out) {
78
ret =
AVERROR
(ENOMEM);
79
break
;
80
}
81
82
ret =
ff_filter_frame
(ctx->
outputs
[i], buf_out);
83
if
(ret < 0)
84
break
;
85
}
86
avfilter_unref_bufferp
(&frame);
87
return
ret;
88
}
89
90
static
const
AVFilterPad
avfilter_vf_split_inputs
[] = {
91
{
92
.
name
=
"default"
,
93
.type =
AVMEDIA_TYPE_VIDEO
,
94
.get_video_buffer =
ff_null_get_video_buffer
,
95
.filter_frame =
filter_frame
,
96
},
97
{
NULL
}
98
};
99
100
AVFilter
avfilter_vf_split
= {
101
.
name
=
"split"
,
102
.description =
NULL_IF_CONFIG_SMALL
(
"Pass on the input to two outputs."
),
103
104
.init =
split_init
,
105
.uninit =
split_uninit
,
106
107
.inputs =
avfilter_vf_split_inputs
,
108
.outputs =
NULL
,
109
};
110
111
static
const
AVFilterPad
avfilter_af_asplit_inputs
[] = {
112
{
113
.
name
=
"default"
,
114
.type =
AVMEDIA_TYPE_AUDIO
,
115
.get_audio_buffer =
ff_null_get_audio_buffer
,
116
.filter_frame =
filter_frame
,
117
},
118
{
NULL
}
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 =
avfilter_af_asplit_inputs
,
129
.outputs =
NULL
,
130
};