vda: Make output CVPixelBuffer format configurable

This is useful for client programs to ask for nv12 surfaces instead of the
current default (uyvy), since those are more efficient to decode to.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
pull/135/merge
Stefano Pigozzi 10 years ago committed by Luca Barbato
parent 3b5e5e6a29
commit e7c5e17d4f
  1. 3
      doc/APIchanges
  2. 11
      libavcodec/vda.c
  3. 17
      libavcodec/vda.h
  4. 2
      libavcodec/vda_h264.c
  5. 4
      libavcodec/version.h

@ -13,6 +13,9 @@ libavutil: 2014-08-09
API changes, most recent first: API changes, most recent first:
2015-xx-xx - xxxxxxx - lavc 56.23.0
Add av_vda_default_init2.
2015-xx-xx - xxxxxxx - lavu 54.12.0 2015-xx-xx - xxxxxxx - lavu 54.12.0
Add AV_LOG_TRACE for extremely verbose debugging. Add AV_LOG_TRACE for extremely verbose debugging.

@ -28,15 +28,22 @@ AVVDAContext *av_vda_alloc_context(void)
{ {
AVVDAContext *ret = av_mallocz(sizeof(*ret)); AVVDAContext *ret = av_mallocz(sizeof(*ret));
if (ret) if (ret) {
ret->output_callback = ff_vda_output_callback; ret->output_callback = ff_vda_output_callback;
ret->cv_pix_fmt_type = kCVPixelFormatType_422YpCbCr8;
}
return ret; return ret;
} }
int av_vda_default_init(AVCodecContext *avctx) int av_vda_default_init(AVCodecContext *avctx)
{ {
avctx->hwaccel_context = av_vda_alloc_context(); return av_vda_default_init2(avctx, NULL);
}
int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx)
{
avctx->hwaccel_context = vdactx ?: av_vda_alloc_context();
if (!avctx->hwaccel_context) if (!avctx->hwaccel_context)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
return ff_vda_default_init(avctx); return ff_vda_default_init(avctx);

@ -153,6 +153,12 @@ typedef struct AVVDAContext {
* Set by av_vda_alloc_context(). * Set by av_vda_alloc_context().
*/ */
VDADecoderOutputCallback output_callback; VDADecoderOutputCallback output_callback;
/**
* CVPixelBuffer Format Type that VDA will use for decoded frames; set by
* the caller.
*/
OSType cv_pix_fmt_type;
} AVVDAContext; } AVVDAContext;
/** /**
@ -180,6 +186,17 @@ AVVDAContext *av_vda_alloc_context(void);
*/ */
int av_vda_default_init(AVCodecContext *avctx); int av_vda_default_init(AVCodecContext *avctx);
/**
* This is a convenience function that creates and sets up the VDA context using
* an internal implementation.
*
* @param avctx the corresponding codec context
* @param vdactx the VDA context to use
*
* @return >= 0 on success, a negative AVERROR code on failure
*/
int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx);
/** /**
* This function must be called to free the VDA context initialized with * This function must be called to free the VDA context initialized with
* av_vda_default_init(). * av_vda_default_init().

@ -380,7 +380,7 @@ int ff_vda_default_init(AVCodecContext *avctx)
CFMutableDictionaryRef buffer_attributes; CFMutableDictionaryRef buffer_attributes;
CFMutableDictionaryRef io_surface_properties; CFMutableDictionaryRef io_surface_properties;
CFNumberRef cv_pix_fmt; CFNumberRef cv_pix_fmt;
int32_t fmt = 'avc1', pix_fmt = kCVPixelFormatType_422YpCbCr8; int32_t fmt = 'avc1', pix_fmt = vda_ctx->cv_pix_fmt_type;
// kCVPixelFormatType_420YpCbCr8Planar; // kCVPixelFormatType_420YpCbCr8Planar;

@ -29,8 +29,8 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56 #define LIBAVCODEC_VERSION_MAJOR 56
#define LIBAVCODEC_VERSION_MINOR 23 #define LIBAVCODEC_VERSION_MINOR 24
#define LIBAVCODEC_VERSION_MICRO 2 #define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ LIBAVCODEC_VERSION_MINOR, \

Loading…
Cancel
Save