summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2015-05-10 21:32:59 +0200
committerLuca Barbato <lu_zero@gentoo.org>2015-05-13 17:39:37 +0200
commite7c5e17d4fbd7c83fb331bf327e25ebd8e6a8623 (patch)
tree25b9fa293c02f0e10827a3649ed92ff55f571b36
parent3b5e5e6a29d62462d0505287042fa4c2b99c4f2b (diff)
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>
-rw-r--r--doc/APIchanges3
-rw-r--r--libavcodec/vda.c11
-rw-r--r--libavcodec/vda.h17
-rw-r--r--libavcodec/vda_h264.c2
-rw-r--r--libavcodec/version.h4
5 files changed, 32 insertions, 5 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 5934f4517f..5d39ec64c2 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil: 2014-08-09
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
Add AV_LOG_TRACE for extremely verbose debugging.
diff --git a/libavcodec/vda.c b/libavcodec/vda.c
index f71fb16488..eb4b9982cb 100644
--- a/libavcodec/vda.c
+++ b/libavcodec/vda.c
@@ -28,15 +28,22 @@ AVVDAContext *av_vda_alloc_context(void)
{
AVVDAContext *ret = av_mallocz(sizeof(*ret));
- if (ret)
+ if (ret) {
ret->output_callback = ff_vda_output_callback;
+ ret->cv_pix_fmt_type = kCVPixelFormatType_422YpCbCr8;
+ }
return ret;
}
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)
return AVERROR(ENOMEM);
return ff_vda_default_init(avctx);
diff --git a/libavcodec/vda.h b/libavcodec/vda.h
index 9aa5d297fb..5e7228c94e 100644
--- a/libavcodec/vda.h
+++ b/libavcodec/vda.h
@@ -153,6 +153,12 @@ typedef struct AVVDAContext {
* Set by av_vda_alloc_context().
*/
VDADecoderOutputCallback output_callback;
+
+ /**
+ * CVPixelBuffer Format Type that VDA will use for decoded frames; set by
+ * the caller.
+ */
+ OSType cv_pix_fmt_type;
} AVVDAContext;
/**
@@ -181,6 +187,17 @@ AVVDAContext *av_vda_alloc_context(void);
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
* av_vda_default_init().
*
diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
index 3c0775b15a..0692f60809 100644
--- a/libavcodec/vda_h264.c
+++ b/libavcodec/vda_h264.c
@@ -380,7 +380,7 @@ int ff_vda_default_init(AVCodecContext *avctx)
CFMutableDictionaryRef buffer_attributes;
CFMutableDictionaryRef io_surface_properties;
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;
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 50c2b48258..c478ca38d8 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,8 +29,8 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56
-#define LIBAVCODEC_VERSION_MINOR 23
-#define LIBAVCODEC_VERSION_MICRO 2
+#define LIBAVCODEC_VERSION_MINOR 24
+#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \