#include "mem.h"
#include "samplefmt.h"
-
-static AVFrameSideData *frame_new_side_data(AVFrame *frame,
- enum AVFrameSideDataType type,
- AVBufferRef *buf);
-
#if FF_API_FRAME_GET_SET
MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp)
MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_duration)
av_get_channel_layout_nb_channels((frame)->channel_layout))
#if FF_API_FRAME_QP
+struct qp_properties {
+ int stride;
+ int type;
+};
+
int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int qp_type)
{
+ struct qp_properties *p;
+ AVFrameSideData *sd;
+ AVBufferRef *ref;
+
+FF_DISABLE_DEPRECATION_WARNINGS
av_buffer_unref(&f->qp_table_buf);
f->qp_table_buf = buf;
-
-FF_DISABLE_DEPRECATION_WARNINGS
f->qscale_table = buf->data;
f->qstride = stride;
f->qscale_type = qp_type;
FF_ENABLE_DEPRECATION_WARNINGS
+ av_frame_remove_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES);
+ av_frame_remove_side_data(f, AV_FRAME_DATA_QP_TABLE_DATA);
+
+ ref = av_buffer_ref(buf);
+ if (!av_frame_new_side_data_from_buf(f, AV_FRAME_DATA_QP_TABLE_DATA, ref)) {
+ av_buffer_unref(&ref);
+ return AVERROR(ENOMEM);
+ }
+
+ sd = av_frame_new_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES,
+ sizeof(struct qp_properties));
+ if (!sd)
+ return AVERROR(ENOMEM);
+
+ p = (struct qp_properties *)sd->data;
+ p->stride = stride;
+ p->type = qp_type;
+
return 0;
}
int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type)
{
+ AVBufferRef *buf = NULL;
+
+ *stride = 0;
+ *type = 0;
+
FF_DISABLE_DEPRECATION_WARNINGS
- *stride = f->qstride;
- *type = f->qscale_type;
+ if (f->qp_table_buf) {
+ *stride = f->qstride;
+ *type = f->qscale_type;
+ buf = f->qp_table_buf;
FF_ENABLE_DEPRECATION_WARNINGS
+ } else {
+ AVFrameSideData *sd;
+ struct qp_properties *p;
+ sd = av_frame_get_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES);
+ if (!sd)
+ return NULL;
+ p = (struct qp_properties *)sd->data;
+ sd = av_frame_get_side_data(f, AV_FRAME_DATA_QP_TABLE_DATA);
+ if (!sd)
+ return NULL;
+ *stride = p->stride;
+ *type = p->type;
+ buf = sd->buf;
+ }
- if (!f->qp_table_buf)
- return NULL;
-
- return f->qp_table_buf->data;
+ return buf ? buf->data : NULL;
}
#endif
static int get_video_buffer(AVFrame *frame, int align)
{
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
- int ret, i;
+ int ret, i, padded_height;
+ int plane_padding = FFMAX(16 + 16/*STRIDE_ALIGN*/, align);
if (!desc)
return AVERROR(EINVAL);
frame->linesize[i] = FFALIGN(frame->linesize[i], align);
}
- for (i = 0; i < 4 && frame->linesize[i]; i++) {
- int h = FFALIGN(frame->height, 32);
- if (i == 1 || i == 2)
- h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
-
- frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h + 16 + 16/*STRIDE_ALIGN*/ - 1);
- if (!frame->buf[i])
- goto fail;
+ padded_height = FFALIGN(frame->height, 32);
+ if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
+ NULL, frame->linesize)) < 0)
+ return ret;
- frame->data[i] = frame->buf[i]->data;
+ frame->buf[0] = av_buffer_alloc(ret + 4*plane_padding);
+ if (!frame->buf[0]) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
}
- if (desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) {
- av_buffer_unref(&frame->buf[1]);
- frame->buf[1] = av_buffer_alloc(AVPALETTE_SIZE);
- if (!frame->buf[1])
- goto fail;
- frame->data[1] = frame->buf[1]->data;
+
+ if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
+ frame->buf[0]->data, frame->linesize)) < 0)
+ goto fail;
+
+ for (i = 1; i < 4; i++) {
+ if (frame->data[i])
+ frame->data[i] += i * plane_padding;
}
frame->extended_data = frame->data;
return 0;
fail:
av_frame_unref(frame);
- return AVERROR(ENOMEM);
+ return ret;
}
static int get_audio_buffer(AVFrame *frame, int align)
}
memcpy(sd_dst->data, sd_src->data, sd_src->size);
} else {
- sd_dst = frame_new_side_data(dst, sd_src->type, av_buffer_ref(sd_src->buf));
+ AVBufferRef *ref = av_buffer_ref(sd_src->buf);
+ sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
if (!sd_dst) {
+ av_buffer_unref(&ref);
wipe_side_data(dst);
return AVERROR(ENOMEM);
}
av_freep(&frame->extended_buf);
av_dict_free(&frame->metadata);
#if FF_API_FRAME_QP
+FF_DISABLE_DEPRECATION_WARNINGS
av_buffer_unref(&frame->qp_table_buf);
+FF_ENABLE_DEPRECATION_WARNINGS
#endif
av_buffer_unref(&frame->hw_frames_ctx);
return NULL;
}
-static AVFrameSideData *frame_new_side_data(AVFrame *frame,
- enum AVFrameSideDataType type,
- AVBufferRef *buf)
+AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
+ enum AVFrameSideDataType type,
+ AVBufferRef *buf)
{
AVFrameSideData *ret, **tmp;
return NULL;
if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
- goto fail;
+ return NULL;
tmp = av_realloc(frame->side_data,
(frame->nb_side_data + 1) * sizeof(*frame->side_data));
if (!tmp)
- goto fail;
+ return NULL;
frame->side_data = tmp;
ret = av_mallocz(sizeof(*ret));
if (!ret)
- goto fail;
+ return NULL;
ret->buf = buf;
ret->data = ret->buf->data;
frame->side_data[frame->nb_side_data++] = ret;
return ret;
-fail:
- av_buffer_unref(&buf);
- return NULL;
}
AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
enum AVFrameSideDataType type,
int size)
{
-
- return frame_new_side_data(frame, type, av_buffer_alloc(size));
+ AVFrameSideData *ret;
+ AVBufferRef *buf = av_buffer_alloc(size);
+ ret = av_frame_new_side_data_from_buf(frame, type, buf);
+ if (!ret)
+ av_buffer_unref(&buf);
+ return ret;
}
AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
switch(type) {
case AV_FRAME_DATA_PANSCAN: return "AVPanScan";
case AV_FRAME_DATA_A53_CC: return "ATSC A53 Part 4 Closed Captions";
- case AV_FRAME_DATA_STEREO3D: return "Stereoscopic 3d metadata";
+ case AV_FRAME_DATA_STEREO3D: return "Stereo 3D";
case AV_FRAME_DATA_MATRIXENCODING: return "AVMatrixEncoding";
case AV_FRAME_DATA_DOWNMIX_INFO: return "Metadata relevant to a downmix procedure";
case AV_FRAME_DATA_REPLAYGAIN: return "AVReplayGain";
case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata";
case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light level metadata";
case AV_FRAME_DATA_GOP_TIMECODE: return "GOP timecode";
+ case AV_FRAME_DATA_S12M_TIMECODE: return "SMPTE 12-1 timecode";
+ case AV_FRAME_DATA_SPHERICAL: return "Spherical Mapping";
case AV_FRAME_DATA_ICC_PROFILE: return "ICC profile";
+#if FF_API_FRAME_QP
+ case AV_FRAME_DATA_QP_TABLE_PROPERTIES: return "QP table properties";
+ case AV_FRAME_DATA_QP_TABLE_DATA: return "QP table data";
+#endif
+ case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: return "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)";
}
return NULL;
}
int shift_x = (i == 1 || i == 2) ? desc->log2_chroma_w : 0;
int shift_y = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
- if (desc->flags & (AV_PIX_FMT_FLAG_PAL | AV_PIX_FMT_FLAG_PSEUDOPAL) && i == 1) {
+ if (desc->flags & (AV_PIX_FMT_FLAG_PAL | FF_PSEUDOPAL) && i == 1) {
offsets[i] = 0;
break;
}