yading@11
|
1 /*
|
yading@11
|
2 *
|
yading@11
|
3 * This file is part of FFmpeg.
|
yading@11
|
4 *
|
yading@11
|
5 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
6 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
7 * License as published by the Free Software Foundation; either
|
yading@11
|
8 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
9 *
|
yading@11
|
10 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
13 * Lesser General Public License for more details.
|
yading@11
|
14 *
|
yading@11
|
15 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
16 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
18 */
|
yading@11
|
19
|
yading@11
|
20 #include "channel_layout.h"
|
yading@11
|
21 #include "avassert.h"
|
yading@11
|
22 #include "buffer.h"
|
yading@11
|
23 #include "common.h"
|
yading@11
|
24 #include "dict.h"
|
yading@11
|
25 #include "frame.h"
|
yading@11
|
26 #include "imgutils.h"
|
yading@11
|
27 #include "mem.h"
|
yading@11
|
28 #include "samplefmt.h"
|
yading@11
|
29
|
yading@11
|
30 #define MAKE_ACCESSORS(str, name, type, field) \
|
yading@11
|
31 type av_##name##_get_##field(const str *s) { return s->field; } \
|
yading@11
|
32 void av_##name##_set_##field(str *s, type v) { s->field = v; }
|
yading@11
|
33
|
yading@11
|
34 MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp)
|
yading@11
|
35 MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_duration)
|
yading@11
|
36 MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_pos)
|
yading@11
|
37 MAKE_ACCESSORS(AVFrame, frame, int64_t, channel_layout)
|
yading@11
|
38 MAKE_ACCESSORS(AVFrame, frame, int, channels)
|
yading@11
|
39 MAKE_ACCESSORS(AVFrame, frame, int, sample_rate)
|
yading@11
|
40 MAKE_ACCESSORS(AVFrame, frame, AVDictionary *, metadata)
|
yading@11
|
41 MAKE_ACCESSORS(AVFrame, frame, int, decode_error_flags)
|
yading@11
|
42 MAKE_ACCESSORS(AVFrame, frame, int, pkt_size)
|
yading@11
|
43
|
yading@11
|
44 #define CHECK_CHANNELS_CONSISTENCY(frame) \
|
yading@11
|
45 av_assert2(!(frame)->channel_layout || \
|
yading@11
|
46 (frame)->channels == \
|
yading@11
|
47 av_get_channel_layout_nb_channels((frame)->channel_layout))
|
yading@11
|
48
|
yading@11
|
49 AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame) {return &frame->metadata;};
|
yading@11
|
50
|
yading@11
|
51 int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int qp_type)
|
yading@11
|
52 {
|
yading@11
|
53 av_buffer_unref(&f->qp_table_buf);
|
yading@11
|
54
|
yading@11
|
55 f->qp_table_buf = buf;
|
yading@11
|
56
|
yading@11
|
57 f->qscale_table = buf->data;
|
yading@11
|
58 f->qstride = stride;
|
yading@11
|
59 f->qscale_type = qp_type;
|
yading@11
|
60
|
yading@11
|
61 return 0;
|
yading@11
|
62 }
|
yading@11
|
63
|
yading@11
|
64 int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type)
|
yading@11
|
65 {
|
yading@11
|
66 *stride = f->qstride;
|
yading@11
|
67 *type = f->qscale_type;
|
yading@11
|
68
|
yading@11
|
69 if (!f->qp_table_buf)
|
yading@11
|
70 return NULL;
|
yading@11
|
71
|
yading@11
|
72 return f->qp_table_buf->data;
|
yading@11
|
73 }
|
yading@11
|
74
|
yading@11
|
75 static void get_frame_defaults(AVFrame *frame)
|
yading@11
|
76 {
|
yading@11
|
77 if (frame->extended_data != frame->data)
|
yading@11
|
78 av_freep(&frame->extended_data);
|
yading@11
|
79
|
yading@11
|
80 memset(frame, 0, sizeof(*frame));
|
yading@11
|
81
|
yading@11
|
82 frame->pts =
|
yading@11
|
83 frame->pkt_dts =
|
yading@11
|
84 frame->pkt_pts = AV_NOPTS_VALUE;
|
yading@11
|
85 av_frame_set_best_effort_timestamp(frame, AV_NOPTS_VALUE);
|
yading@11
|
86 av_frame_set_pkt_duration (frame, 0);
|
yading@11
|
87 av_frame_set_pkt_pos (frame, -1);
|
yading@11
|
88 av_frame_set_pkt_size (frame, -1);
|
yading@11
|
89 frame->key_frame = 1;
|
yading@11
|
90 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
|
yading@11
|
91 frame->format = -1; /* unknown */
|
yading@11
|
92 frame->extended_data = frame->data;
|
yading@11
|
93 }
|
yading@11
|
94
|
yading@11
|
95 AVFrame *av_frame_alloc(void)
|
yading@11
|
96 {
|
yading@11
|
97 AVFrame *frame = av_mallocz(sizeof(*frame));
|
yading@11
|
98
|
yading@11
|
99 if (!frame)
|
yading@11
|
100 return NULL;
|
yading@11
|
101
|
yading@11
|
102 frame->extended_data = NULL;
|
yading@11
|
103 get_frame_defaults(frame);
|
yading@11
|
104
|
yading@11
|
105 return frame;
|
yading@11
|
106 }
|
yading@11
|
107
|
yading@11
|
108 void av_frame_free(AVFrame **frame)
|
yading@11
|
109 {
|
yading@11
|
110 if (!frame || !*frame)
|
yading@11
|
111 return;
|
yading@11
|
112
|
yading@11
|
113 av_frame_unref(*frame);
|
yading@11
|
114 av_freep(frame);
|
yading@11
|
115 }
|
yading@11
|
116
|
yading@11
|
117 static int get_video_buffer(AVFrame *frame, int align)
|
yading@11
|
118 {
|
yading@11
|
119 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
|
yading@11
|
120 int ret, i;
|
yading@11
|
121
|
yading@11
|
122 if (!desc)
|
yading@11
|
123 return AVERROR(EINVAL);
|
yading@11
|
124
|
yading@11
|
125 if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0)
|
yading@11
|
126 return ret;
|
yading@11
|
127
|
yading@11
|
128 if (!frame->linesize[0]) {
|
yading@11
|
129 ret = av_image_fill_linesizes(frame->linesize, frame->format,
|
yading@11
|
130 frame->width);
|
yading@11
|
131 if (ret < 0)
|
yading@11
|
132 return ret;
|
yading@11
|
133
|
yading@11
|
134 for (i = 0; i < 4 && frame->linesize[i]; i++)
|
yading@11
|
135 frame->linesize[i] = FFALIGN(frame->linesize[i], align);
|
yading@11
|
136 }
|
yading@11
|
137
|
yading@11
|
138 for (i = 0; i < 4 && frame->linesize[i]; i++) {
|
yading@11
|
139 int h = FFALIGN(frame->height, 32);
|
yading@11
|
140 if (i == 1 || i == 2)
|
yading@11
|
141 h = -((-h) >> desc->log2_chroma_h);
|
yading@11
|
142
|
yading@11
|
143 frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h + 16);
|
yading@11
|
144 if (!frame->buf[i])
|
yading@11
|
145 goto fail;
|
yading@11
|
146
|
yading@11
|
147 frame->data[i] = frame->buf[i]->data;
|
yading@11
|
148 }
|
yading@11
|
149 if (desc->flags & PIX_FMT_PAL || desc->flags & PIX_FMT_PSEUDOPAL) {
|
yading@11
|
150 av_buffer_unref(&frame->buf[1]);
|
yading@11
|
151 frame->buf[1] = av_buffer_alloc(1024);
|
yading@11
|
152 if (!frame->buf[1])
|
yading@11
|
153 goto fail;
|
yading@11
|
154 frame->data[1] = frame->buf[1]->data;
|
yading@11
|
155 }
|
yading@11
|
156
|
yading@11
|
157 frame->extended_data = frame->data;
|
yading@11
|
158
|
yading@11
|
159 return 0;
|
yading@11
|
160 fail:
|
yading@11
|
161 av_frame_unref(frame);
|
yading@11
|
162 return AVERROR(ENOMEM);
|
yading@11
|
163 }
|
yading@11
|
164
|
yading@11
|
165 static int get_audio_buffer(AVFrame *frame, int align)
|
yading@11
|
166 {
|
yading@11
|
167 int channels = frame->channels;
|
yading@11
|
168 int planar = av_sample_fmt_is_planar(frame->format);
|
yading@11
|
169 int planes = planar ? channels : 1;
|
yading@11
|
170 int ret, i;
|
yading@11
|
171
|
yading@11
|
172 CHECK_CHANNELS_CONSISTENCY(frame);
|
yading@11
|
173 if (!frame->linesize[0]) {
|
yading@11
|
174 ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
|
yading@11
|
175 frame->nb_samples, frame->format,
|
yading@11
|
176 align);
|
yading@11
|
177 if (ret < 0)
|
yading@11
|
178 return ret;
|
yading@11
|
179 }
|
yading@11
|
180
|
yading@11
|
181 if (planes > AV_NUM_DATA_POINTERS) {
|
yading@11
|
182 frame->extended_data = av_mallocz(planes *
|
yading@11
|
183 sizeof(*frame->extended_data));
|
yading@11
|
184 frame->extended_buf = av_mallocz((planes - AV_NUM_DATA_POINTERS) *
|
yading@11
|
185 sizeof(*frame->extended_buf));
|
yading@11
|
186 if (!frame->extended_data || !frame->extended_buf) {
|
yading@11
|
187 av_freep(&frame->extended_data);
|
yading@11
|
188 av_freep(&frame->extended_buf);
|
yading@11
|
189 return AVERROR(ENOMEM);
|
yading@11
|
190 }
|
yading@11
|
191 frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
|
yading@11
|
192 } else
|
yading@11
|
193 frame->extended_data = frame->data;
|
yading@11
|
194
|
yading@11
|
195 for (i = 0; i < FFMIN(planes, AV_NUM_DATA_POINTERS); i++) {
|
yading@11
|
196 frame->buf[i] = av_buffer_alloc(frame->linesize[0]);
|
yading@11
|
197 if (!frame->buf[i]) {
|
yading@11
|
198 av_frame_unref(frame);
|
yading@11
|
199 return AVERROR(ENOMEM);
|
yading@11
|
200 }
|
yading@11
|
201 frame->extended_data[i] = frame->data[i] = frame->buf[i]->data;
|
yading@11
|
202 }
|
yading@11
|
203 for (i = 0; i < planes - AV_NUM_DATA_POINTERS; i++) {
|
yading@11
|
204 frame->extended_buf[i] = av_buffer_alloc(frame->linesize[0]);
|
yading@11
|
205 if (!frame->extended_buf[i]) {
|
yading@11
|
206 av_frame_unref(frame);
|
yading@11
|
207 return AVERROR(ENOMEM);
|
yading@11
|
208 }
|
yading@11
|
209 frame->extended_data[i + AV_NUM_DATA_POINTERS] = frame->extended_buf[i]->data;
|
yading@11
|
210 }
|
yading@11
|
211 return 0;
|
yading@11
|
212
|
yading@11
|
213 }
|
yading@11
|
214
|
yading@11
|
215 int av_frame_get_buffer(AVFrame *frame, int align)
|
yading@11
|
216 {
|
yading@11
|
217 if (frame->format < 0)
|
yading@11
|
218 return AVERROR(EINVAL);
|
yading@11
|
219
|
yading@11
|
220 if (frame->width > 0 && frame->height > 0)
|
yading@11
|
221 return get_video_buffer(frame, align);
|
yading@11
|
222 else if (frame->nb_samples > 0 && frame->channel_layout)
|
yading@11
|
223 return get_audio_buffer(frame, align);
|
yading@11
|
224
|
yading@11
|
225 return AVERROR(EINVAL);
|
yading@11
|
226 }
|
yading@11
|
227
|
yading@11
|
228 int av_frame_ref(AVFrame *dst, AVFrame *src)
|
yading@11
|
229 {
|
yading@11
|
230 int i, ret = 0;
|
yading@11
|
231
|
yading@11
|
232 dst->format = src->format;
|
yading@11
|
233 dst->width = src->width;
|
yading@11
|
234 dst->height = src->height;
|
yading@11
|
235 dst->channels = src->channels;
|
yading@11
|
236 dst->channel_layout = src->channel_layout;
|
yading@11
|
237 dst->nb_samples = src->nb_samples;
|
yading@11
|
238
|
yading@11
|
239 ret = av_frame_copy_props(dst, src);
|
yading@11
|
240 if (ret < 0)
|
yading@11
|
241 return ret;
|
yading@11
|
242
|
yading@11
|
243 /* duplicate the frame data if it's not refcounted */
|
yading@11
|
244 if (!src->buf[0]) {
|
yading@11
|
245 ret = av_frame_get_buffer(dst, 32);
|
yading@11
|
246 if (ret < 0)
|
yading@11
|
247 return ret;
|
yading@11
|
248
|
yading@11
|
249 if (src->nb_samples) {
|
yading@11
|
250 int ch = src->channels;
|
yading@11
|
251 CHECK_CHANNELS_CONSISTENCY(src);
|
yading@11
|
252 av_samples_copy(dst->extended_data, src->extended_data, 0, 0,
|
yading@11
|
253 dst->nb_samples, ch, dst->format);
|
yading@11
|
254 } else {
|
yading@11
|
255 av_image_copy(dst->data, dst->linesize, src->data, src->linesize,
|
yading@11
|
256 dst->format, dst->width, dst->height);
|
yading@11
|
257 }
|
yading@11
|
258 return 0;
|
yading@11
|
259 }
|
yading@11
|
260
|
yading@11
|
261 /* ref the buffers */
|
yading@11
|
262 for (i = 0; i < FF_ARRAY_ELEMS(src->buf) && src->buf[i]; i++) {
|
yading@11
|
263 dst->buf[i] = av_buffer_ref(src->buf[i]);
|
yading@11
|
264 if (!dst->buf[i]) {
|
yading@11
|
265 ret = AVERROR(ENOMEM);
|
yading@11
|
266 goto fail;
|
yading@11
|
267 }
|
yading@11
|
268 }
|
yading@11
|
269
|
yading@11
|
270 if (src->extended_buf) {
|
yading@11
|
271 dst->extended_buf = av_mallocz(sizeof(*dst->extended_buf) *
|
yading@11
|
272 src->nb_extended_buf);
|
yading@11
|
273 if (!dst->extended_buf) {
|
yading@11
|
274 ret = AVERROR(ENOMEM);
|
yading@11
|
275 goto fail;
|
yading@11
|
276 }
|
yading@11
|
277 dst->nb_extended_buf = src->nb_extended_buf;
|
yading@11
|
278
|
yading@11
|
279 for (i = 0; i < src->nb_extended_buf; i++) {
|
yading@11
|
280 dst->extended_buf[i] = av_buffer_ref(src->extended_buf[i]);
|
yading@11
|
281 if (!dst->extended_buf[i]) {
|
yading@11
|
282 ret = AVERROR(ENOMEM);
|
yading@11
|
283 goto fail;
|
yading@11
|
284 }
|
yading@11
|
285 }
|
yading@11
|
286 }
|
yading@11
|
287
|
yading@11
|
288 /* duplicate extended data */
|
yading@11
|
289 if (src->extended_data != src->data) {
|
yading@11
|
290 int ch = src->channels;
|
yading@11
|
291
|
yading@11
|
292 if (!ch) {
|
yading@11
|
293 ret = AVERROR(EINVAL);
|
yading@11
|
294 goto fail;
|
yading@11
|
295 }
|
yading@11
|
296 CHECK_CHANNELS_CONSISTENCY(src);
|
yading@11
|
297
|
yading@11
|
298 dst->extended_data = av_malloc(sizeof(*dst->extended_data) * ch);
|
yading@11
|
299 if (!dst->extended_data) {
|
yading@11
|
300 ret = AVERROR(ENOMEM);
|
yading@11
|
301 goto fail;
|
yading@11
|
302 }
|
yading@11
|
303 memcpy(dst->extended_data, src->extended_data, sizeof(*src->extended_data) * ch);
|
yading@11
|
304 } else
|
yading@11
|
305 dst->extended_data = dst->data;
|
yading@11
|
306
|
yading@11
|
307 memcpy(dst->data, src->data, sizeof(src->data));
|
yading@11
|
308 memcpy(dst->linesize, src->linesize, sizeof(src->linesize));
|
yading@11
|
309
|
yading@11
|
310 return 0;
|
yading@11
|
311
|
yading@11
|
312 fail:
|
yading@11
|
313 av_frame_unref(dst);
|
yading@11
|
314 return ret;
|
yading@11
|
315 }
|
yading@11
|
316
|
yading@11
|
317 AVFrame *av_frame_clone(AVFrame *src)
|
yading@11
|
318 {
|
yading@11
|
319 AVFrame *ret = av_frame_alloc();
|
yading@11
|
320
|
yading@11
|
321 if (!ret)
|
yading@11
|
322 return NULL;
|
yading@11
|
323
|
yading@11
|
324 if (av_frame_ref(ret, src) < 0)
|
yading@11
|
325 av_frame_free(&ret);
|
yading@11
|
326
|
yading@11
|
327 return ret;
|
yading@11
|
328 }
|
yading@11
|
329
|
yading@11
|
330 void av_frame_unref(AVFrame *frame)
|
yading@11
|
331 {
|
yading@11
|
332 int i;
|
yading@11
|
333
|
yading@11
|
334 for (i = 0; i < frame->nb_side_data; i++) {
|
yading@11
|
335 av_freep(&frame->side_data[i]->data);
|
yading@11
|
336 av_dict_free(&frame->side_data[i]->metadata);
|
yading@11
|
337 av_freep(&frame->side_data[i]);
|
yading@11
|
338 }
|
yading@11
|
339 av_freep(&frame->side_data);
|
yading@11
|
340
|
yading@11
|
341 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
|
yading@11
|
342 av_buffer_unref(&frame->buf[i]);
|
yading@11
|
343 for (i = 0; i < frame->nb_extended_buf; i++)
|
yading@11
|
344 av_buffer_unref(&frame->extended_buf[i]);
|
yading@11
|
345 av_freep(&frame->extended_buf);
|
yading@11
|
346 av_dict_free(&frame->metadata);
|
yading@11
|
347 av_buffer_unref(&frame->qp_table_buf);
|
yading@11
|
348
|
yading@11
|
349 get_frame_defaults(frame);
|
yading@11
|
350 }
|
yading@11
|
351
|
yading@11
|
352 void av_frame_move_ref(AVFrame *dst, AVFrame *src)
|
yading@11
|
353 {
|
yading@11
|
354 *dst = *src;
|
yading@11
|
355 if (src->extended_data == src->data)
|
yading@11
|
356 dst->extended_data = dst->data;
|
yading@11
|
357 memset(src, 0, sizeof(*src));
|
yading@11
|
358 get_frame_defaults(src);
|
yading@11
|
359 }
|
yading@11
|
360
|
yading@11
|
361 int av_frame_is_writable(AVFrame *frame)
|
yading@11
|
362 {
|
yading@11
|
363 int i, ret = 1;
|
yading@11
|
364
|
yading@11
|
365 /* assume non-refcounted frames are not writable */
|
yading@11
|
366 if (!frame->buf[0])
|
yading@11
|
367 return 0;
|
yading@11
|
368
|
yading@11
|
369 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++)
|
yading@11
|
370 ret &= !!av_buffer_is_writable(frame->buf[i]);
|
yading@11
|
371 for (i = 0; i < frame->nb_extended_buf; i++)
|
yading@11
|
372 ret &= !!av_buffer_is_writable(frame->extended_buf[i]);
|
yading@11
|
373
|
yading@11
|
374 return ret;
|
yading@11
|
375 }
|
yading@11
|
376
|
yading@11
|
377 int av_frame_make_writable(AVFrame *frame)
|
yading@11
|
378 {
|
yading@11
|
379 AVFrame tmp;
|
yading@11
|
380 int ret;
|
yading@11
|
381
|
yading@11
|
382 if (!frame->buf[0])
|
yading@11
|
383 return AVERROR(EINVAL);
|
yading@11
|
384
|
yading@11
|
385 if (av_frame_is_writable(frame))
|
yading@11
|
386 return 0;
|
yading@11
|
387
|
yading@11
|
388 memset(&tmp, 0, sizeof(tmp));
|
yading@11
|
389 tmp.format = frame->format;
|
yading@11
|
390 tmp.width = frame->width;
|
yading@11
|
391 tmp.height = frame->height;
|
yading@11
|
392 tmp.channels = frame->channels;
|
yading@11
|
393 tmp.channel_layout = frame->channel_layout;
|
yading@11
|
394 tmp.nb_samples = frame->nb_samples;
|
yading@11
|
395 ret = av_frame_get_buffer(&tmp, 32);
|
yading@11
|
396 if (ret < 0)
|
yading@11
|
397 return ret;
|
yading@11
|
398
|
yading@11
|
399 if (tmp.nb_samples) {
|
yading@11
|
400 int ch = tmp.channels;
|
yading@11
|
401 CHECK_CHANNELS_CONSISTENCY(&tmp);
|
yading@11
|
402 av_samples_copy(tmp.extended_data, frame->extended_data, 0, 0,
|
yading@11
|
403 frame->nb_samples, ch, frame->format);
|
yading@11
|
404 } else {
|
yading@11
|
405 av_image_copy(tmp.data, tmp.linesize, frame->data, frame->linesize,
|
yading@11
|
406 frame->format, frame->width, frame->height);
|
yading@11
|
407 }
|
yading@11
|
408
|
yading@11
|
409 ret = av_frame_copy_props(&tmp, frame);
|
yading@11
|
410 if (ret < 0) {
|
yading@11
|
411 av_frame_unref(&tmp);
|
yading@11
|
412 return ret;
|
yading@11
|
413 }
|
yading@11
|
414
|
yading@11
|
415 av_frame_unref(frame);
|
yading@11
|
416
|
yading@11
|
417 *frame = tmp;
|
yading@11
|
418 if (tmp.data == tmp.extended_data)
|
yading@11
|
419 frame->extended_data = frame->data;
|
yading@11
|
420
|
yading@11
|
421 return 0;
|
yading@11
|
422 }
|
yading@11
|
423
|
yading@11
|
424 int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
|
yading@11
|
425 {
|
yading@11
|
426 int i;
|
yading@11
|
427
|
yading@11
|
428 dst->key_frame = src->key_frame;
|
yading@11
|
429 dst->pict_type = src->pict_type;
|
yading@11
|
430 dst->sample_aspect_ratio = src->sample_aspect_ratio;
|
yading@11
|
431 dst->pts = src->pts;
|
yading@11
|
432 dst->repeat_pict = src->repeat_pict;
|
yading@11
|
433 dst->interlaced_frame = src->interlaced_frame;
|
yading@11
|
434 dst->top_field_first = src->top_field_first;
|
yading@11
|
435 dst->palette_has_changed = src->palette_has_changed;
|
yading@11
|
436 dst->sample_rate = src->sample_rate;
|
yading@11
|
437 dst->opaque = src->opaque;
|
yading@11
|
438 #if FF_API_AVFRAME_LAVC
|
yading@11
|
439 dst->type = src->type;
|
yading@11
|
440 #endif
|
yading@11
|
441 dst->pkt_pts = src->pkt_pts;
|
yading@11
|
442 dst->pkt_dts = src->pkt_dts;
|
yading@11
|
443 dst->pkt_pos = src->pkt_pos;
|
yading@11
|
444 dst->pkt_size = src->pkt_size;
|
yading@11
|
445 dst->pkt_duration = src->pkt_duration;
|
yading@11
|
446 dst->reordered_opaque = src->reordered_opaque;
|
yading@11
|
447 dst->quality = src->quality;
|
yading@11
|
448 dst->best_effort_timestamp = src->best_effort_timestamp;
|
yading@11
|
449 dst->coded_picture_number = src->coded_picture_number;
|
yading@11
|
450 dst->display_picture_number = src->display_picture_number;
|
yading@11
|
451 dst->decode_error_flags = src->decode_error_flags;
|
yading@11
|
452
|
yading@11
|
453 av_dict_copy(&dst->metadata, src->metadata, 0);
|
yading@11
|
454
|
yading@11
|
455 memcpy(dst->error, src->error, sizeof(dst->error));
|
yading@11
|
456
|
yading@11
|
457 for (i = 0; i < src->nb_side_data; i++) {
|
yading@11
|
458 const AVFrameSideData *sd_src = src->side_data[i];
|
yading@11
|
459 AVFrameSideData *sd_dst = av_frame_new_side_data(dst, sd_src->type,
|
yading@11
|
460 sd_src->size);
|
yading@11
|
461 if (!sd_dst) {
|
yading@11
|
462 for (i = 0; i < dst->nb_side_data; i++) {
|
yading@11
|
463 av_freep(&dst->side_data[i]->data);
|
yading@11
|
464 av_freep(&dst->side_data[i]);
|
yading@11
|
465 av_dict_free(&dst->side_data[i]->metadata);
|
yading@11
|
466 }
|
yading@11
|
467 av_freep(&dst->side_data);
|
yading@11
|
468 return AVERROR(ENOMEM);
|
yading@11
|
469 }
|
yading@11
|
470 memcpy(sd_dst->data, sd_src->data, sd_src->size);
|
yading@11
|
471 av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
|
yading@11
|
472 }
|
yading@11
|
473
|
yading@11
|
474 dst->qscale_table = NULL;
|
yading@11
|
475 dst->qstride = 0;
|
yading@11
|
476 dst->qscale_type = 0;
|
yading@11
|
477 if (src->qp_table_buf) {
|
yading@11
|
478 dst->qp_table_buf = av_buffer_ref(src->qp_table_buf);
|
yading@11
|
479 if (dst->qp_table_buf) {
|
yading@11
|
480 dst->qscale_table = dst->qp_table_buf->data;
|
yading@11
|
481 dst->qstride = src->qstride;
|
yading@11
|
482 dst->qscale_type = src->qscale_type;
|
yading@11
|
483 }
|
yading@11
|
484 }
|
yading@11
|
485
|
yading@11
|
486 return 0;
|
yading@11
|
487 }
|
yading@11
|
488
|
yading@11
|
489 AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
|
yading@11
|
490 {
|
yading@11
|
491 uint8_t *data;
|
yading@11
|
492 int planes, i;
|
yading@11
|
493
|
yading@11
|
494 if (frame->nb_samples) {
|
yading@11
|
495 int channels = frame->channels;
|
yading@11
|
496 if (!channels)
|
yading@11
|
497 return NULL;
|
yading@11
|
498 CHECK_CHANNELS_CONSISTENCY(frame);
|
yading@11
|
499 planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
|
yading@11
|
500 } else
|
yading@11
|
501 planes = 4;
|
yading@11
|
502
|
yading@11
|
503 if (plane < 0 || plane >= planes || !frame->extended_data[plane])
|
yading@11
|
504 return NULL;
|
yading@11
|
505 data = frame->extended_data[plane];
|
yading@11
|
506
|
yading@11
|
507 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++) {
|
yading@11
|
508 AVBufferRef *buf = frame->buf[i];
|
yading@11
|
509 if (data >= buf->data && data < buf->data + buf->size)
|
yading@11
|
510 return buf;
|
yading@11
|
511 }
|
yading@11
|
512 for (i = 0; i < frame->nb_extended_buf; i++) {
|
yading@11
|
513 AVBufferRef *buf = frame->extended_buf[i];
|
yading@11
|
514 if (data >= buf->data && data < buf->data + buf->size)
|
yading@11
|
515 return buf;
|
yading@11
|
516 }
|
yading@11
|
517 return NULL;
|
yading@11
|
518 }
|
yading@11
|
519
|
yading@11
|
520 AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
|
yading@11
|
521 enum AVFrameSideDataType type,
|
yading@11
|
522 int size)
|
yading@11
|
523 {
|
yading@11
|
524 AVFrameSideData *ret, **tmp;
|
yading@11
|
525
|
yading@11
|
526 if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
|
yading@11
|
527 return NULL;
|
yading@11
|
528
|
yading@11
|
529 tmp = av_realloc(frame->side_data,
|
yading@11
|
530 (frame->nb_side_data + 1) * sizeof(*frame->side_data));
|
yading@11
|
531 if (!tmp)
|
yading@11
|
532 return NULL;
|
yading@11
|
533 frame->side_data = tmp;
|
yading@11
|
534
|
yading@11
|
535 ret = av_mallocz(sizeof(*ret));
|
yading@11
|
536 if (!ret)
|
yading@11
|
537 return NULL;
|
yading@11
|
538
|
yading@11
|
539 ret->data = av_malloc(size);
|
yading@11
|
540 if (!ret->data) {
|
yading@11
|
541 av_freep(&ret);
|
yading@11
|
542 return NULL;
|
yading@11
|
543 }
|
yading@11
|
544
|
yading@11
|
545 ret->size = size;
|
yading@11
|
546 ret->type = type;
|
yading@11
|
547
|
yading@11
|
548 frame->side_data[frame->nb_side_data++] = ret;
|
yading@11
|
549
|
yading@11
|
550 return ret;
|
yading@11
|
551 }
|
yading@11
|
552
|
yading@11
|
553 AVFrameSideData *av_frame_get_side_data(AVFrame *frame,
|
yading@11
|
554 enum AVFrameSideDataType type)
|
yading@11
|
555 {
|
yading@11
|
556 int i;
|
yading@11
|
557
|
yading@11
|
558 for (i = 0; i < frame->nb_side_data; i++) {
|
yading@11
|
559 if (frame->side_data[i]->type == type)
|
yading@11
|
560 return frame->side_data[i];
|
yading@11
|
561 }
|
yading@11
|
562 return NULL;
|
yading@11
|
563 }
|