Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavfilter
buffer.c
Go to the documentation of this file.
1
/*
2
* This file is part of Libav.
3
*
4
* Libav is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* Libav is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with Libav; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
19
#include "
libavutil/channel_layout.h
"
20
#include "
libavutil/common.h
"
21
#include "
libavcodec/avcodec.h
"
22
23
#include "
avfilter.h
"
24
#include "
internal.h
"
25
26
/* TODO: buffer pool. see comment for avfilter_default_get_video_buffer() */
27
void
ff_avfilter_default_free_buffer
(
AVFilterBuffer
*ptr)
28
{
29
if
(ptr->
extended_data
!= ptr->
data
)
30
av_freep
(&ptr->
extended_data
);
31
av_free
(ptr->
data
[0]);
32
av_free
(ptr);
33
}
34
35
AVFilterBufferRef
*
avfilter_ref_buffer
(
AVFilterBufferRef
*ref,
int
pmask)
36
{
37
AVFilterBufferRef
*ret =
av_malloc
(
sizeof
(
AVFilterBufferRef
));
38
if
(!ret)
39
return
NULL
;
40
*ret = *ref;
41
if
(ref->
type
==
AVMEDIA_TYPE_VIDEO
) {
42
ret->
video
=
av_malloc
(
sizeof
(
AVFilterBufferRefVideoProps
));
43
if
(!ret->
video
) {
44
av_free
(ret);
45
return
NULL
;
46
}
47
*ret->
video
= *ref->
video
;
48
ret->
extended_data
= ret->
data
;
49
}
else
if
(ref->
type
==
AVMEDIA_TYPE_AUDIO
) {
50
ret->
audio
=
av_malloc
(
sizeof
(
AVFilterBufferRefAudioProps
));
51
if
(!ret->
audio
) {
52
av_free
(ret);
53
return
NULL
;
54
}
55
*ret->
audio
= *ref->
audio
;
56
57
if
(ref->
extended_data
!= ref->
data
) {
58
int
nb_channels
=
av_get_channel_layout_nb_channels
(ref->
audio
->
channel_layout
);
59
if
(!(ret->
extended_data
=
av_malloc
(
sizeof
(*ret->
extended_data
) *
60
nb_channels))) {
61
av_freep
(&ret->
audio
);
62
av_freep
(&ret);
63
return
NULL
;
64
}
65
memcpy(ret->
extended_data
, ref->
extended_data
,
66
sizeof
(*ret->
extended_data
) * nb_channels);
67
}
else
68
ret->
extended_data
= ret->
data
;
69
}
70
ret->
perms
&= pmask;
71
ret->
buf
->
refcount
++;
72
return
ret;
73
}
74
75
void
avfilter_unref_buffer
(
AVFilterBufferRef
*ref)
76
{
77
if
(!ref)
78
return
;
79
if
(!(--ref->
buf
->
refcount
))
80
ref->
buf
->
free
(ref->
buf
);
81
if
(ref->
extended_data
!= ref->
data
)
82
av_freep
(&ref->
extended_data
);
83
av_free
(ref->
video
);
84
av_free
(ref->
audio
);
85
av_free
(ref);
86
}
87
88
void
avfilter_unref_bufferp
(
AVFilterBufferRef
**ref)
89
{
90
avfilter_unref_buffer
(*ref);
91
*ref =
NULL
;
92
}
93
94
int
avfilter_copy_frame_props
(
AVFilterBufferRef
*dst,
const
AVFrame
*src)
95
{
96
dst->
pts
= src->
pts
;
97
dst->
format
= src->
format
;
98
99
switch
(dst->
type
) {
100
case
AVMEDIA_TYPE_VIDEO
:
101
dst->
video
->
w
= src->
width
;
102
dst->
video
->
h
= src->
height
;
103
dst->
video
->
pixel_aspect
= src->
sample_aspect_ratio
;
104
dst->
video
->
interlaced
= src->
interlaced_frame
;
105
dst->
video
->
top_field_first
= src->
top_field_first
;
106
dst->
video
->
key_frame
= src->
key_frame
;
107
dst->
video
->
pict_type
= src->
pict_type
;
108
break
;
109
case
AVMEDIA_TYPE_AUDIO
:
110
dst->
audio
->
sample_rate
= src->
sample_rate
;
111
dst->
audio
->
channel_layout
= src->
channel_layout
;
112
break
;
113
default
:
114
return
AVERROR
(EINVAL);
115
}
116
117
return
0;
118
}
119
120
int
avfilter_copy_buf_props
(
AVFrame
*dst,
const
AVFilterBufferRef
*src)
121
{
122
int
planes,
nb_channels
;
123
124
memcpy(dst->
data
, src->
data
,
sizeof
(dst->
data
));
125
memcpy(dst->
linesize
, src->
linesize
,
sizeof
(dst->
linesize
));
126
127
dst->
pts
= src->
pts
;
128
dst->
format
= src->
format
;
129
130
switch
(src->
type
) {
131
case
AVMEDIA_TYPE_VIDEO
:
132
dst->
width
= src->
video
->
w
;
133
dst->
height
= src->
video
->
h
;
134
dst->
sample_aspect_ratio
= src->
video
->
pixel_aspect
;
135
dst->
interlaced_frame
= src->
video
->
interlaced
;
136
dst->
top_field_first
= src->
video
->
top_field_first
;
137
dst->
key_frame
= src->
video
->
key_frame
;
138
dst->
pict_type
= src->
video
->
pict_type
;
139
break
;
140
case
AVMEDIA_TYPE_AUDIO
:
141
nb_channels =
av_get_channel_layout_nb_channels
(src->
audio
->
channel_layout
);
142
planes =
av_sample_fmt_is_planar
(src->
format
) ? nb_channels : 1;
143
144
if
(planes >
FF_ARRAY_ELEMS
(dst->
data
)) {
145
dst->
extended_data
=
av_mallocz
(planes *
sizeof
(*dst->
extended_data
));
146
if
(!dst->
extended_data
)
147
return
AVERROR
(ENOMEM);
148
memcpy(dst->
extended_data
, src->
extended_data
,
149
planes *
sizeof
(*dst->
extended_data
));
150
}
else
151
dst->
extended_data
= dst->
data
;
152
153
dst->
sample_rate
= src->
audio
->
sample_rate
;
154
dst->
channel_layout
= src->
audio
->
channel_layout
;
155
dst->
nb_samples
= src->
audio
->
nb_samples
;
156
break
;
157
default
:
158
return
AVERROR
(EINVAL);
159
}
160
161
return
0;
162
}
163
164
void
avfilter_copy_buffer_ref_props
(
AVFilterBufferRef
*dst,
AVFilterBufferRef
*src)
165
{
166
// copy common properties
167
dst->
pts
= src->
pts
;
168
dst->
pos
= src->
pos
;
169
170
switch
(src->
type
) {
171
case
AVMEDIA_TYPE_VIDEO
: *dst->
video
= *src->
video
;
break
;
172
case
AVMEDIA_TYPE_AUDIO
: *dst->
audio
= *src->
audio
;
break
;
173
default
:
break
;
174
}
175
}