codec->init_static_data(codec);
}
+#if FF_API_EMU_EDGE
unsigned avcodec_get_edge_width(void)
{
return EDGE_WIDTH;
}
+#endif
#if FF_API_SET_DIMENSIONS
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
return ret;
}
+int ff_side_data_update_matrix_encoding(AVFrame *frame,
+ enum AVMatrixEncoding matrix_encoding)
+{
+ AVFrameSideData *side_data;
+ enum AVMatrixEncoding *data;
+
+ side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_MATRIXENCODING);
+ if (!side_data)
+ side_data = av_frame_new_side_data(frame, AV_FRAME_DATA_MATRIXENCODING,
+ sizeof(enum AVMatrixEncoding));
+
+ if (!side_data)
+ return AVERROR(ENOMEM);
+
+ data = (enum AVMatrixEncoding*)side_data->data;
+ *data = matrix_encoding;
+
+ return 0;
+}
+
#if HAVE_NEON || ARCH_PPC || HAVE_MMX
# define STRIDE_ALIGN 16
#else
case AV_PIX_FMT_YUV422P9BE:
case AV_PIX_FMT_YUV422P10LE:
case AV_PIX_FMT_YUV422P10BE:
+ case AV_PIX_FMT_YUVA422P10LE:
+ case AV_PIX_FMT_YUVA422P10BE:
case AV_PIX_FMT_YUV444P9LE:
case AV_PIX_FMT_YUV444P9BE:
case AV_PIX_FMT_YUV444P10LE:
case AV_PIX_FMT_YUV444P10BE:
+ case AV_PIX_FMT_YUVA444P10LE:
+ case AV_PIX_FMT_YUVA444P10BE:
case AV_PIX_FMT_GBRP9LE:
case AV_PIX_FMT_GBRP9BE:
case AV_PIX_FMT_GBRP10LE:
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{
+ int override_dimensions = 1;
int ret;
switch (avctx->codec_type) {
case AVMEDIA_TYPE_VIDEO:
- frame->width = FFMAX(avctx->width, avctx->coded_width);
- frame->height = FFMAX(avctx->height, avctx->coded_height);
+ if (frame->width <= 0 || frame->height <= 0) {
+ frame->width = FFMAX(avctx->width, avctx->coded_width);
+ frame->height = FFMAX(avctx->height, avctx->coded_height);
+ override_dimensions = 0;
+ }
if (frame->format < 0)
frame->format = avctx->pix_fmt;
if (!frame->sample_aspect_ratio.num)
ret = avctx->get_buffer2(avctx, frame, flags);
- if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) {
frame->width = avctx->width;
frame->height = avctx->height;
}
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
{
- AVFrame tmp;
+ AVFrame *tmp;
int ret;
av_assert0(avctx->codec_type == AVMEDIA_TYPE_VIDEO);
if (!frame->data[0])
return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
- if (av_frame_is_writable(frame))
+ if (av_frame_is_writable(frame)) {
+ frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE;
+ frame->reordered_opaque = avctx->reordered_opaque;
return 0;
+ }
+
+ tmp = av_frame_alloc();
+ if (!tmp)
+ return AVERROR(ENOMEM);
- av_frame_move_ref(&tmp, frame);
+ av_frame_move_ref(tmp, frame);
ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
if (ret < 0) {
- av_frame_unref(&tmp);
+ av_frame_free(&tmp);
return ret;
}
- av_image_copy(frame->data, frame->linesize, tmp.data, tmp.linesize,
- frame->format, frame->width, frame->height);
-
- av_frame_unref(&tmp);
+ av_frame_copy(frame, tmp);
+ av_frame_free(&tmp);
return 0;
}
if (frame == NULL)
return NULL;
+FF_DISABLE_DEPRECATION_WARNINGS
avcodec_get_frame_defaults(frame);
+FF_ENABLE_DEPRECATION_WARNINGS
return frame;
}
free_and_end:
av_dict_free(&tmp);
av_freep(&avctx->priv_data);
- if (avctx->internal)
+ if (avctx->internal) {
+ av_frame_free(&avctx->internal->to_free);
av_freep(&avctx->internal->pool);
+ }
av_freep(&avctx->internal);
avctx->codec = NULL;
goto end;