/*
- *
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
#include "channel_layout.h"
#include "buffer.h"
#include "common.h"
+#include "cpu.h"
#include "dict.h"
#include "frame.h"
#include "imgutils.h"
frame->sample_aspect_ratio = (AVRational){ 0, 1 };
frame->format = -1; /* unknown */
frame->extended_data = frame->data;
+ frame->color_primaries = AVCOL_PRI_UNSPECIFIED;
+ frame->color_trc = AVCOL_TRC_UNSPECIFIED;
+ frame->colorspace = AVCOL_SPC_UNSPECIFIED;
+ frame->color_range = AVCOL_RANGE_UNSPECIFIED;
+ frame->chroma_location = AVCHROMA_LOC_UNSPECIFIED;
+}
+
+static void free_side_data(AVFrameSideData **ptr_sd)
+{
+ AVFrameSideData *sd = *ptr_sd;
+
+ av_freep(&sd->data);
+ av_dict_free(&sd->metadata);
+ av_freep(ptr_sd);
+}
+
+static void wipe_side_data(AVFrame *frame)
+{
+ int i;
+
+ for (i = 0; i < frame->nb_side_data; i++) {
+ free_side_data(&frame->side_data[i]);
+ }
+ frame->nb_side_data = 0;
+
+ av_freep(&frame->side_data);
}
AVFrame *av_frame_alloc(void)
if (ret < 0)
return ret;
+ if (align <= 0)
+ align = av_cpu_max_align();
+
for (i = 0; i < 4 && frame->linesize[i]; i++)
frame->linesize[i] = FFALIGN(frame->linesize[i], align);
}
for (i = 0; i < 4 && frame->linesize[i]; i++) {
int h = frame->height;
if (i == 1 || i == 2)
- h = -((-h) >> desc->log2_chroma_h);
+ h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h);
if (!frame->buf[i])
}
}
+ if (src->hw_frames_ctx) {
+ dst->hw_frames_ctx = av_buffer_ref(src->hw_frames_ctx);
+ if (!dst->hw_frames_ctx) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ }
+
/* duplicate extended data */
if (src->extended_data != src->data) {
int ch = av_get_channel_layout_nb_channels(src->channel_layout);
{
int i;
- for (i = 0; i < frame->nb_side_data; i++) {
- av_freep(&frame->side_data[i]->data);
- av_dict_free(&frame->side_data[i]->metadata);
- av_freep(&frame->side_data[i]);
- }
- av_freep(&frame->side_data);
+ wipe_side_data(frame);
for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
av_buffer_unref(&frame->buf[i]);
for (i = 0; i < frame->nb_extended_buf; i++)
av_buffer_unref(&frame->extended_buf[i]);
av_freep(&frame->extended_buf);
+
+ av_buffer_unref(&frame->hw_frames_ctx);
+
get_frame_defaults(frame);
}
dst->key_frame = src->key_frame;
dst->pict_type = src->pict_type;
dst->sample_aspect_ratio = src->sample_aspect_ratio;
+ dst->crop_top = src->crop_top;
+ dst->crop_bottom = src->crop_bottom;
+ dst->crop_left = src->crop_left;
+ dst->crop_right = src->crop_right;
dst->pts = src->pts;
dst->repeat_pict = src->repeat_pict;
dst->interlaced_frame = src->interlaced_frame;
dst->palette_has_changed = src->palette_has_changed;
dst->sample_rate = src->sample_rate;
dst->opaque = src->opaque;
+#if FF_API_PKT_PTS
+FF_DISABLE_DEPRECATION_WARNINGS
dst->pkt_pts = src->pkt_pts;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
dst->pkt_dts = src->pkt_dts;
dst->reordered_opaque = src->reordered_opaque;
dst->quality = src->quality;
dst->coded_picture_number = src->coded_picture_number;
dst->display_picture_number = src->display_picture_number;
dst->flags = src->flags;
-
+ dst->color_primaries = src->color_primaries;
+ dst->color_trc = src->color_trc;
+ dst->colorspace = src->colorspace;
+ dst->color_range = src->color_range;
+ dst->chroma_location = src->chroma_location;
+
+#if FF_API_ERROR_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
memcpy(dst->error, src->error, sizeof(dst->error));
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
for (i = 0; i < src->nb_side_data; i++) {
const AVFrameSideData *sd_src = src->side_data[i];
AVFrameSideData *sd_dst = av_frame_new_side_data(dst, sd_src->type,
sd_src->size);
if (!sd_dst) {
- for (i = 0; i < dst->nb_side_data; i++) {
- av_freep(&dst->side_data[i]->data);
- av_dict_free(&dst->side_data[i]->metadata);
- av_freep(&dst->side_data[i]);
- }
- av_freep(&dst->side_data);
+ wipe_side_data(dst);
return AVERROR(ENOMEM);
}
memcpy(sd_dst->data, sd_src->data, sd_src->size);
for (i = 0; i < frame->nb_side_data; i++) {
AVFrameSideData *sd = frame->side_data[i];
if (sd->type == type) {
- av_freep(&sd->data);
- av_dict_free(&sd->metadata);
- av_freep(&frame->side_data[i]);
+ free_side_data(&frame->side_data[i]);
frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
frame->nb_side_data--;
}