FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavfilter
split.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2007 Bobby Bingham
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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
23
* audio and video splitter
24
*/
25
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
pad.
rej_perms
=
AV_PERM_WRITE
;
56
57
ff_insert_outpad
(ctx, i, &pad);
58
}
59
60
return
0;
61
}
62
63
static
void
split_uninit
(
AVFilterContext
*ctx)
64
{
65
int
i;
66
67
for
(i = 0; i < ctx->
nb_outputs
; i++)
68
av_freep
(&ctx->
output_pads
[i].
name
);
69
}
70
71
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFilterBufferRef
*
frame
)
72
{
73
AVFilterContext
*ctx = inlink->
dst
;
74
int
i, ret =
AVERROR_EOF
;
75
76
for
(i = 0; i < ctx->
nb_outputs
; i++) {
77
AVFilterBufferRef
*buf_out;
78
79
if
(ctx->
outputs
[i]->
closed
)
80
continue
;
81
buf_out =
avfilter_ref_buffer
(frame, ~
AV_PERM_WRITE
);
82
if
(!buf_out) {
83
ret =
AVERROR
(ENOMEM);
84
break
;
85
}
86
87
ret =
ff_filter_frame
(ctx->
outputs
[i], buf_out);
88
if
(ret < 0)
89
break
;
90
}
91
avfilter_unref_bufferp
(&frame);
92
return
ret;
93
}
94
95
static
const
AVFilterPad
avfilter_vf_split_inputs
[] = {
96
{
97
.
name
=
"default"
,
98
.type =
AVMEDIA_TYPE_VIDEO
,
99
.get_video_buffer =
ff_null_get_video_buffer
,
100
.filter_frame =
filter_frame
,
101
},
102
{
NULL
}
103
};
104
105
AVFilter
avfilter_vf_split
= {
106
.
name
=
"split"
,
107
.description =
NULL_IF_CONFIG_SMALL
(
"Pass on the input video to N outputs."
),
108
109
.init =
split_init
,
110
.uninit =
split_uninit
,
111
112
.inputs =
avfilter_vf_split_inputs
,
113
.outputs =
NULL
,
114
};
115
116
static
const
AVFilterPad
avfilter_af_asplit_inputs
[] = {
117
{
118
.
name
=
"default"
,
119
.type =
AVMEDIA_TYPE_AUDIO
,
120
.get_audio_buffer =
ff_null_get_audio_buffer
,
121
.filter_frame =
filter_frame
,
122
},
123
{
NULL
}
124
};
125
126
AVFilter
avfilter_af_asplit
= {
127
.
name
=
"asplit"
,
128
.description =
NULL_IF_CONFIG_SMALL
(
"Pass on the audio input to N audio outputs."
),
129
130
.init =
split_init
,
131
.uninit =
split_uninit
,
132
133
.inputs =
avfilter_af_asplit_inputs
,
134
.outputs =
NULL
,
135
};
Generated on Sat May 25 2013 03:58:45 for FFmpeg by
1.8.2