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