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
avcodec.c
Go to the documentation of this file.
1
/*
2
* Copyright 2011 Stefano Sabatini | stefasab at gmail.com
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
* libavcodec/libavfilter gluing utilities
24
*/
25
26
#include "
avcodec.h
"
27
#include "
libavutil/avassert.h
"
28
#include "
libavutil/opt.h
"
29
30
int
avfilter_copy_frame_props
(
AVFilterBufferRef
*
dst
,
const
AVFrame
*src)
31
{
32
dst->
pts
= src->
pts
;
33
dst->
pos
=
av_frame_get_pkt_pos
(src);
34
dst->
format
= src->
format
;
35
36
av_dict_free
(&dst->
metadata
);
37
av_dict_copy
(&dst->
metadata
,
av_frame_get_metadata
(src), 0);
38
39
switch
(dst->
type
) {
40
case
AVMEDIA_TYPE_VIDEO
:
41
dst->
video
->
w
= src->
width
;
42
dst->
video
->
h
= src->
height
;
43
dst->
video
->
sample_aspect_ratio
= src->
sample_aspect_ratio
;
44
dst->
video
->
interlaced
= src->
interlaced_frame
;
45
dst->
video
->
top_field_first
= src->
top_field_first
;
46
dst->
video
->
key_frame
= src->
key_frame
;
47
dst->
video
->
pict_type
= src->
pict_type
;
48
av_freep
(&dst->
video
->
qp_table
);
49
dst->
video
->
qp_table_linesize
= 0;
50
if
(src->
qscale_table
) {
51
int
qsize = src->
qstride
? src->
qstride
* ((src->
height
+15)/16) : (src->
width
+15)/16;
52
dst->
video
->
qp_table
=
av_malloc
(qsize);
53
if
(!dst->
video
->
qp_table
)
54
return
AVERROR
(ENOMEM);
55
dst->
video
->
qp_table_linesize
= src->
qstride
;
56
dst->
video
->
qp_table_size
= qsize;
57
memcpy(dst->
video
->
qp_table
, src->
qscale_table
, qsize);
58
}
59
break
;
60
case
AVMEDIA_TYPE_AUDIO
:
61
dst->
audio
->
sample_rate
= src->
sample_rate
;
62
dst->
audio
->
channel_layout
= src->
channel_layout
;
63
dst->
audio
->
channels
= src->
channels
;
64
if
(src->
channels
<
av_get_channel_layout_nb_channels
(src->
channel_layout
)) {
65
av_log
(
NULL
,
AV_LOG_ERROR
,
"libavfilter does not support this channel layout\n"
);
66
return
AVERROR
(EINVAL);
67
}
68
break
;
69
default
:
70
return
AVERROR
(EINVAL);
71
}
72
73
return
0;
74
}
75
76
AVFilterBufferRef
*
avfilter_get_video_buffer_ref_from_frame
(
const
AVFrame
*
frame
,
77
int
perms)
78
{
79
AVFilterBufferRef
*picref =
80
avfilter_get_video_buffer_ref_from_arrays
(frame->
data
, frame->
linesize
, perms,
81
frame->
width
, frame->
height
,
82
frame->
format
);
83
if
(!picref)
84
return
NULL
;
85
if
(
avfilter_copy_frame_props
(picref, frame) < 0) {
86
picref->
buf
->
data
[0] =
NULL
;
87
avfilter_unref_bufferp
(&picref);
88
}
89
return
picref;
90
}
91
92
AVFilterBufferRef
*
avfilter_get_audio_buffer_ref_from_frame
(
const
AVFrame
*
frame
,
93
int
perms)
94
{
95
AVFilterBufferRef
*samplesref;
96
int
channels =
av_frame_get_channels
(frame);
97
int64_t
layout
=
av_frame_get_channel_layout
(frame);
98
99
if
(layout &&
av_get_channel_layout_nb_channels
(layout) !=
av_frame_get_channels
(frame)) {
100
av_log
(0,
AV_LOG_ERROR
,
"Layout indicates a different number of channels than actually present\n"
);
101
return
NULL
;
102
}
103
104
samplesref =
avfilter_get_audio_buffer_ref_from_arrays_channels
(
105
(
uint8_t
**)frame->
extended_data
, frame->
linesize
[0], perms,
106
frame->
nb_samples
, frame->
format
, channels, layout);
107
if
(!samplesref)
108
return
NULL
;
109
if
(
avfilter_copy_frame_props
(samplesref, frame) < 0) {
110
samplesref->
buf
->
data
[0] =
NULL
;
111
avfilter_unref_bufferp
(&samplesref);
112
}
113
return
samplesref;
114
}
115
116
AVFilterBufferRef
*
avfilter_get_buffer_ref_from_frame
(
enum
AVMediaType
type,
117
const
AVFrame
*
frame
,
118
int
perms)
119
{
120
switch
(type) {
121
case
AVMEDIA_TYPE_VIDEO
:
122
return
avfilter_get_video_buffer_ref_from_frame
(frame, perms);
123
case
AVMEDIA_TYPE_AUDIO
:
124
return
avfilter_get_audio_buffer_ref_from_frame
(frame, perms);
125
default
:
126
return
NULL
;
127
}
128
}
129
130
int
avfilter_copy_buf_props
(
AVFrame
*
dst
,
const
AVFilterBufferRef
*src)
131
{
132
int
planes,
nb_channels
;
133
134
if
(!dst)
135
return
AVERROR
(EINVAL);
136
/* abort in case the src is NULL and dst is not, avoid inconsistent state in dst */
137
av_assert0
(src);
138
139
memcpy(dst->
data
, src->
data
,
sizeof
(dst->
data
));
140
memcpy(dst->
linesize
, src->
linesize
,
sizeof
(dst->
linesize
));
141
142
dst->
pts
= src->
pts
;
143
dst->
format
= src->
format
;
144
av_frame_set_pkt_pos
(dst, src->
pos
);
145
146
switch
(src->
type
) {
147
case
AVMEDIA_TYPE_VIDEO
:
148
av_assert0
(src->
video
);
149
dst->
width
= src->
video
->
w
;
150
dst->
height
= src->
video
->
h
;
151
dst->
sample_aspect_ratio
= src->
video
->
sample_aspect_ratio
;
152
dst->
interlaced_frame
= src->
video
->
interlaced
;
153
dst->
top_field_first
= src->
video
->
top_field_first
;
154
dst->
key_frame
= src->
video
->
key_frame
;
155
dst->
pict_type
= src->
video
->
pict_type
;
156
break
;
157
case
AVMEDIA_TYPE_AUDIO
:
158
av_assert0
(src->
audio
);
159
nb_channels =
av_get_channel_layout_nb_channels
(src->
audio
->
channel_layout
);
160
planes =
av_sample_fmt_is_planar
(src->
format
) ? nb_channels : 1;
161
162
if
(planes >
FF_ARRAY_ELEMS
(dst->
data
)) {
163
dst->
extended_data
=
av_mallocz
(planes *
sizeof
(*dst->
extended_data
));
164
if
(!dst->
extended_data
)
165
return
AVERROR
(ENOMEM);
166
memcpy(dst->
extended_data
, src->
extended_data
,
167
planes *
sizeof
(*dst->
extended_data
));
168
}
else
169
dst->
extended_data
= dst->
data
;
170
dst->
nb_samples
= src->
audio
->
nb_samples
;
171
av_frame_set_sample_rate
(dst, src->
audio
->
sample_rate
);
172
av_frame_set_channel_layout
(dst, src->
audio
->
channel_layout
);
173
av_frame_set_channels
(dst, src->
audio
->
channels
);
174
break
;
175
default
:
176
return
AVERROR
(EINVAL);
177
}
178
179
return
0;
180
}
181
182
#ifdef FF_API_FILL_FRAME
183
int
avfilter_fill_frame_from_audio_buffer_ref(
AVFrame
*
frame
,
184
const
AVFilterBufferRef
*samplesref)
185
{
186
return
avfilter_copy_buf_props
(frame, samplesref);
187
}
188
189
int
avfilter_fill_frame_from_video_buffer_ref(
AVFrame
*
frame
,
190
const
AVFilterBufferRef
*picref)
191
{
192
return
avfilter_copy_buf_props
(frame, picref);
193
}
194
195
int
avfilter_fill_frame_from_buffer_ref(
AVFrame
*
frame
,
196
const
AVFilterBufferRef
*ref)
197
{
198
return
avfilter_copy_buf_props
(frame, ref);
199
}
200
#endif
Generated on Sat May 25 2013 04:01:14 for FFmpeg by
1.8.2