Lines Matching defs:frame
25 #include "frame.h"
32 #define CHECK_CHANNELS_CONSISTENCY(frame) \
33 av_assert2(!(frame)->channel_layout || \
34 (frame)->channels == \
35 av_get_channel_layout_nb_channels((frame)->channel_layout))
55 static void get_frame_defaults(AVFrame *frame)
57 memset(frame, 0, sizeof(*frame));
59 frame->pts =
60 frame->pkt_dts = AV_NOPTS_VALUE;
61 frame->best_effort_timestamp = AV_NOPTS_VALUE;
62 frame->pkt_duration = 0;
63 frame->pkt_pos = -1;
64 frame->pkt_size = -1;
65 frame->time_base = (AVRational){ 0, 1 };
66 frame->key_frame = 1;
67 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
68 frame->format = -1; /* unknown */
69 frame->extended_data = frame->data;
70 frame->color_primaries = AVCOL_PRI_UNSPECIFIED;
71 frame->color_trc = AVCOL_TRC_UNSPECIFIED;
72 frame->colorspace = AVCOL_SPC_UNSPECIFIED;
73 frame->color_range = AVCOL_RANGE_UNSPECIFIED;
74 frame->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
75 frame->flags = 0;
87 static void wipe_side_data(AVFrame *frame)
91 for (i = 0; i < frame->nb_side_data; i++) {
92 free_side_data(&frame->side_data[i]);
94 frame->nb_side_data = 0;
96 av_freep(&frame->side_data);
101 AVFrame *frame = av_malloc(sizeof(*frame));
103 if (!frame)
106 get_frame_defaults(frame);
108 return frame;
111 void av_frame_free(AVFrame **frame)
113 if (!frame || !*frame)
116 av_frame_unref(*frame);
117 av_freep(frame);
120 static int get_video_buffer(AVFrame *frame, int align)
122 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
131 if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0)
134 if (!frame->linesize[0]) {
139 ret = av_image_fill_linesizes(frame->linesize, frame->format,
140 FFALIGN(frame->width, i));
143 if (!(frame->linesize[0] & (align-1)))
147 for (i = 0; i < 4 && frame->linesize[i]; i++)
148 frame->linesize[i] = FFALIGN(frame->linesize[i], align);
152 linesizes[i] = frame->linesize[i];
154 padded_height = FFALIGN(frame->height, 32);
155 if ((ret = av_image_fill_plane_sizes(sizes, frame->format,
166 frame->buf[0] = av_buffer_alloc(total_size);
167 if (!frame->buf[0]) {
172 if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
173 frame->buf[0]->data, frame->linesize)) < 0)
177 if (frame->data[i])
178 frame->data[i] += i * plane_padding;
181 frame->extended_data = frame->data;
185 av_frame_unref(frame);
189 static int get_audio_buffer(AVFrame *frame, int align)
191 int planar = av_sample_fmt_is_planar(frame->format);
197 if (!frame->ch_layout.nb_channels) {
198 if (frame->channel_layout) {
199 av_channel_layout_from_mask(&frame->ch_layout, frame->channel_layout);
201 frame->ch_layout.nb_channels = frame->channels;
202 frame->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
205 frame->channels = frame->ch_layout.nb_channels;
206 frame->channel_layout = frame->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
207 frame->ch_layout.u.mask : 0;
210 channels = frame->ch_layout.nb_channels;
212 if (!frame->linesize[0]) {
213 ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
214 frame->nb_samples, frame->format,
221 frame->extended_data = av_calloc(planes,
222 sizeof(*frame->extended_data));
223 frame->extended_buf = av_calloc(planes - AV_NUM_DATA_POINTERS,
224 sizeof(*frame->extended_buf));
225 if (!frame->extended_data || !frame->extended_buf) {
226 av_freep(&frame->extended_data);
227 av_freep(&frame->extended_buf);
230 frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
232 frame->extended_data = frame->data;
235 frame->buf[i] = av_buffer_alloc(frame->linesize[0]);
236 if (!frame->buf[i]) {
237 av_frame_unref(frame);
240 frame->extended_data[i] = frame->data[i] = frame->buf[i]->data;
243 frame->extended_buf[i] = av_buffer_alloc(frame->linesize[0]);
244 if (!frame->extended_buf[i]) {
245 av_frame_unref(frame);
248 frame->extended_data[i + AV_NUM_DATA_POINTERS] = frame->extended_buf[i]->data;
254 int av_frame_get_buffer(AVFrame *frame, int align)
256 if (frame->format < 0)
260 if (frame->width > 0 && frame->height > 0)
261 return get_video_buffer(frame, align);
262 else if (frame->nb_samples > 0 &&
263 (av_channel_layout_check(&frame->ch_layout)
265 || frame->channel_layout || frame->channels > 0
268 return get_audio_buffer(frame, align);
386 /* duplicate the frame data if it's not refcounted */
477 void av_frame_unref(AVFrame *frame)
481 if (!frame)
484 wipe_side_data(frame);
486 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
487 av_buffer_unref(&frame->buf[i]);
488 for (i = 0; i < frame->nb_extended_buf; i++)
489 av_buffer_unref(&frame->extended_buf[i]);
490 av_freep(&frame->extended_buf);
491 av_dict_free(&frame->metadata);
493 av_buffer_unref(&frame->hw_frames_ctx);
495 av_buffer_unref(&frame->opaque_ref);
496 av_buffer_unref(&frame->private_ref);
498 if (frame->extended_data != frame->data)
499 av_freep(&frame->extended_data);
501 av_channel_layout_uninit(&frame->ch_layout);
503 get_frame_defaults(frame);
523 int av_frame_is_writable(AVFrame *frame)
528 if (!frame->buf[0])
531 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
532 if (frame->buf[i])
533 ret &= !!av_buffer_is_writable(frame->buf[i]);
534 for (i = 0; i < frame->nb_extended_buf; i++)
535 ret &= !!av_buffer_is_writable(frame->extended_buf[i]);
540 int av_frame_make_writable(AVFrame *frame)
545 if (!frame->buf[0])
548 if (av_frame_is_writable(frame))
552 tmp.format = frame->format;
553 tmp.width = frame->width;
554 tmp.height = frame->height;
557 tmp.channels = frame->channels;
558 tmp.channel_layout = frame->channel_layout;
561 tmp.nb_samples = frame->nb_samples;
562 ret = av_channel_layout_copy(&tmp.ch_layout, &frame->ch_layout);
568 if (frame->hw_frames_ctx)
569 ret = av_hwframe_get_buffer(frame->hw_frames_ctx, &tmp, 0);
575 ret = av_frame_copy(&tmp, frame);
581 ret = av_frame_copy_props(&tmp, frame);
587 av_frame_unref(frame);
589 *frame = tmp;
591 frame->extended_data = frame->data;
601 AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
606 if (frame->nb_samples) {
607 int channels = frame->ch_layout.nb_channels;
612 channels = frame->channels;
613 CHECK_CHANNELS_CONSISTENCY(frame);
619 planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
623 if (plane < 0 || plane >= planes || !frame->extended_data[plane])
625 data = frame->extended_data[plane];
627 for (i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++) {
628 AVBufferRef *buf = frame->buf[i];
632 for (i = 0; i < frame->nb_extended_buf; i++) {
633 AVBufferRef *buf = frame->extended_buf[i];
640 AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
649 if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
652 tmp = av_realloc(frame->side_data,
653 (frame->nb_side_data + 1) * sizeof(*frame->side_data));
656 frame->side_data = tmp;
667 frame->side_data[frame->nb_side_data++] = ret;
672 AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
678 ret = av_frame_new_side_data_from_buf(frame, type, buf);
684 AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
689 for (i = 0; i < frame->nb_side_data; i++) {
690 if (frame->side_data[i]->type == type)
691 return frame->side_data[i];
784 void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
788 for (i = frame->nb_side_data - 1; i >= 0; i--) {
789 AVFrameSideData *sd = frame->side_data[i];
791 free_side_data(&frame->side_data[i]);
792 frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
793 frame->nb_side_data--;
831 static int calc_cropping_offsets(size_t offsets[4], const AVFrame *frame,
836 for (i = 0; frame->data[i]; i++) {
856 offsets[i] = (frame->crop_top >> shift_y) * frame->linesize[i] +
857 (frame->crop_left >> shift_x) * comp->step;
863 int av_frame_apply_cropping(AVFrame *frame, int flags)
869 if (!(frame->width > 0 && frame->height > 0))
872 if (frame->crop_left >= INT_MAX - frame->crop_right ||
873 frame->crop_top >= INT_MAX - frame->crop_bottom ||
874 (frame->crop_left + frame->crop_right) >= frame->width ||
875 (frame->crop_top + frame->crop_bottom) >= frame->height)
878 desc = av_pix_fmt_desc_get(frame->format);
887 frame->width -= frame->crop_right;
888 frame->height -= frame->crop_bottom;
889 frame->crop_right = 0;
890 frame->crop_bottom = 0;
895 calc_cropping_offsets(offsets, frame, desc);
899 int log2_crop_align = frame->crop_left ? ff_ctz(frame->crop_left) : INT_MAX;
902 for (i = 0; frame->data[i]; i++) {
913 frame->crop_left &= ~((1 << (5 + log2_crop_align - min_log2_align)) - 1);
914 calc_cropping_offsets(offsets, frame, desc);
918 for (i = 0; frame->data[i]; i++)
919 frame->data[i] += offsets[i];
921 frame->width -= (frame->crop_left + frame->crop_right);
922 frame->height -= (frame->crop_top + frame->crop_bottom);
923 frame->crop_left = 0;
924 frame->crop_right = 0;
925 frame->crop_top = 0;
926 frame->crop_bottom = 0;