Browse Source

Merge commit 'ebc29519d1634bfeb386c20a5d8a52837aae2436'

* commit 'ebc29519d1634bfeb386c20a5d8a52837aae2436':
  hwaccel: Support specific frame allocators

Conflicts:
	libavcodec/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.3
Michael Niedermayer 11 years ago
parent
commit
c4fe50b954
2 changed files with 14 additions and 2 deletions
  1. +5
    -0
      libavcodec/avcodec.h
  2. +9
    -2
      libavcodec/utils.c

+ 5
- 0
libavcodec/avcodec.h View File

@@ -3242,6 +3242,11 @@ typedef struct AVHWAccel {
*/ */
struct AVHWAccel *next; struct AVHWAccel *next;


/**
* Allocate a custom buffer
*/
int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame);

/** /**
* Called at the beginning of each frame or field picture. * Called at the beginning of each frame or field picture.
* *


+ 9
- 2
libavcodec/utils.c View File

@@ -850,6 +850,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)


static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags) static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
{ {
const AVHWAccel *hwaccel = avctx->hwaccel;
int override_dimensions = 1; int override_dimensions = 1;
int ret; int ret;


@@ -872,6 +873,11 @@ static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
if ((ret = ff_init_buffer_info(avctx, frame)) < 0) if ((ret = ff_init_buffer_info(avctx, frame)) < 0)
return ret; return ret;


if (hwaccel && hwaccel->alloc_frame) {
ret = hwaccel->alloc_frame(avctx, frame);
goto end;
}

#if FF_API_GET_BUFFER #if FF_API_GET_BUFFER
FF_DISABLE_DEPRECATION_WARNINGS FF_DISABLE_DEPRECATION_WARNINGS
/* /*
@@ -898,7 +904,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
* avcodec_default_get_buffer * avcodec_default_get_buffer
*/ */
if (frame->buf[0]) if (frame->buf[0])
goto end;
goto end0;


priv = av_mallocz(sizeof(*priv)); priv = av_mallocz(sizeof(*priv));
if (!priv) { if (!priv) {
@@ -974,7 +980,7 @@ do { \


av_buffer_unref(&dummy_buf); av_buffer_unref(&dummy_buf);


end:
end0:
frame->width = avctx->width; frame->width = avctx->width;
frame->height = avctx->height; frame->height = avctx->height;


@@ -991,6 +997,7 @@ FF_ENABLE_DEPRECATION_WARNINGS


ret = avctx->get_buffer2(avctx, frame, flags); ret = avctx->get_buffer2(avctx, frame, flags);


end:
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) { if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) {
frame->width = avctx->width; frame->width = avctx->width;
frame->height = avctx->height; frame->height = avctx->height;


Loading…
Cancel
Save