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
(
av_frame_get_channels
(frame) > 8)
// libavfilter does not suport more than 8 channels FIXME, remove once libavfilter is fixed
100
return
NULL
;
101
102
if
(layout &&
av_get_channel_layout_nb_channels
(layout) !=
av_frame_get_channels
(frame)) {
103
av_log
(0,
AV_LOG_ERROR
,
"Layout indicates a different number of channels than actually present\n"
);
104
return
NULL
;
105
}
106
107
samplesref =
avfilter_get_audio_buffer_ref_from_arrays_channels
(
108
(
uint8_t
**)frame->
data
, frame->
linesize
[0], perms,
109
frame->
nb_samples
, frame->
format
, channels, layout);
110
if
(!samplesref)
111
return
NULL
;
112
if
(
avfilter_copy_frame_props
(samplesref, frame) < 0) {
113
samplesref->
buf
->
data
[0] =
NULL
;
114
avfilter_unref_bufferp
(&samplesref);
115
}
116
return
samplesref;
117
}
118
119
AVFilterBufferRef
*
avfilter_get_buffer_ref_from_frame
(
enum
AVMediaType
type,
120
const
AVFrame
*
frame
,
121
int
perms)
122
{
123
switch
(type) {
124
case
AVMEDIA_TYPE_VIDEO
:
125
return
avfilter_get_video_buffer_ref_from_frame
(frame, perms);
126
case
AVMEDIA_TYPE_AUDIO
:
127
return
avfilter_get_audio_buffer_ref_from_frame
(frame, perms);
128
default
:
129
return
NULL
;
130
}
131
}
132
133
int
avfilter_copy_buf_props
(
AVFrame
*
dst
,
const
AVFilterBufferRef
*src)
134
{
135
int
planes,
nb_channels
;
136
137
if
(!dst)
138
return
AVERROR
(EINVAL);
139
/* abort in case the src is NULL and dst is not, avoid inconsistent state in dst */
140
av_assert0
(src);
141
142
memcpy(dst->
data
, src->
data
,
sizeof
(dst->
data
));
143
memcpy(dst->
linesize
, src->
linesize
,
sizeof
(dst->
linesize
));
144
145
dst->
pts
= src->
pts
;
146
dst->
format
= src->
format
;
147
av_frame_set_pkt_pos
(dst, src->
pos
);
148
149
switch
(src->
type
) {
150
case
AVMEDIA_TYPE_VIDEO
:
151
av_assert0
(src->
video
);
152
dst->
width
= src->
video
->
w
;
153
dst->
height
= src->
video
->
h
;
154
dst->
sample_aspect_ratio
= src->
video
->
sample_aspect_ratio
;
155
dst->
interlaced_frame
= src->
video
->
interlaced
;
156
dst->
top_field_first
= src->
video
->
top_field_first
;
157
dst->
key_frame
= src->
video
->
key_frame
;
158
dst->
pict_type
= src->
video
->
pict_type
;
159
break
;
160
case
AVMEDIA_TYPE_AUDIO
:
161
av_assert0
(src->
audio
);
162
nb_channels =
av_get_channel_layout_nb_channels
(src->
audio
->
channel_layout
);
163
planes =
av_sample_fmt_is_planar
(src->
format
) ? nb_channels : 1;
164
165
if
(planes >
FF_ARRAY_ELEMS
(dst->
data
)) {
166
dst->
extended_data
=
av_mallocz
(planes *
sizeof
(*dst->
extended_data
));
167
if
(!dst->
extended_data
)
168
return
AVERROR
(ENOMEM);
169
memcpy(dst->
extended_data
, src->
extended_data
,
170
planes *
sizeof
(*dst->
extended_data
));
171
}
else
172
dst->
extended_data
= dst->
data
;
173
dst->
nb_samples
= src->
audio
->
nb_samples
;
174
av_frame_set_sample_rate
(dst, src->
audio
->
sample_rate
);
175
av_frame_set_channel_layout
(dst, src->
audio
->
channel_layout
);
176
av_frame_set_channels
(dst, src->
audio
->
channels
);
177
break
;
178
default
:
179
return
AVERROR
(EINVAL);
180
}
181
182
return
0;
183
}
184
185
#ifdef FF_API_FILL_FRAME
186
int
avfilter_fill_frame_from_audio_buffer_ref(
AVFrame
*
frame
,
187
const
AVFilterBufferRef
*samplesref)
188
{
189
return
avfilter_copy_buf_props
(frame, samplesref);
190
}
191
192
int
avfilter_fill_frame_from_video_buffer_ref(
AVFrame
*
frame
,
193
const
AVFilterBufferRef
*picref)
194
{
195
return
avfilter_copy_buf_props
(frame, picref);
196
}
197
198
int
avfilter_fill_frame_from_buffer_ref(
AVFrame
*
frame
,
199
const
AVFilterBufferRef
*ref)
200
{
201
return
avfilter_copy_buf_props
(frame, ref);
202
}
203
#endif
Generated on Sat May 25 2013 03:58:44 for FFmpeg by
1.8.2