summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/APIchanges3
-rw-r--r--libavcodec/vdpau.c51
-rw-r--r--libavcodec/vdpau.h20
-rw-r--r--libavcodec/version.h2
4 files changed, 71 insertions, 5 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 705501eda8..fce42e3b9d 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil: 2014-08-09
API changes, most recent first:
+201x-xx-xx - xxxxxxx - lavc 56.10.0 - vdpau.h
+ Add av_vdpau_get_surface_parameters().
+
201x-xx-xx - xxxxxxx - lavc 56.9.0 - avcodec.h
Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context().
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index ccb3352028..ea67314f93 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -64,6 +64,46 @@ static int vdpau_error(VdpStatus status)
}
}
+int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
+ VdpChromaType *type,
+ uint32_t *width, uint32_t *height)
+{
+ VdpChromaType t;
+ uint32_t w = avctx->coded_width;
+ uint32_t h = avctx->coded_height;
+
+ /* See <vdpau/vdpau.h> for per-type alignment constraints. */
+ switch (avctx->sw_pix_fmt) {
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUVJ420P:
+ t = VDP_CHROMA_TYPE_420;
+ w = (w + 1) & ~1;
+ h = (h + 3) & ~3;
+ break;
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUVJ422P:
+ t = VDP_CHROMA_TYPE_422;
+ w = (w + 1) & ~1;
+ h = (h + 1) & ~1;
+ break;
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUVJ444P:
+ t = VDP_CHROMA_TYPE_444;
+ h = (h + 1) & ~1;
+ break;
+ default:
+ return AVERROR(ENOSYS);
+ }
+
+ if (type)
+ *type = t;
+ if (width)
+ *width = w;
+ if (height)
+ *height = h;
+ return 0;
+}
+
int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
int level)
{
@@ -76,9 +116,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
VdpStatus status;
VdpBool supported;
uint32_t max_level, max_mb, max_width, max_height;
- /* See vdpau/vdpau.h for alignment constraints. */
- uint32_t width = (avctx->coded_width + 1) & ~1;
- uint32_t height = (avctx->coded_height + 3) & ~3;
+ VdpChromaType type;
+ uint32_t width;
+ uint32_t height;
vdctx->width = UINT32_MAX;
vdctx->height = UINT32_MAX;
@@ -99,6 +139,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
else if (level < 0)
return AVERROR(ENOTSUP);
+ if (av_vdpau_get_surface_parameters(avctx, &type, &width, &height))
+ return AVERROR(ENOSYS);
+
status = vdctx->get_proc_address(vdctx->device,
VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES,
&func);
@@ -107,7 +150,7 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
else
surface_query_caps = func;
- status = surface_query_caps(vdctx->device, VDP_CHROMA_TYPE_420, &supported,
+ status = surface_query_caps(vdctx->device, type, &supported,
&max_width, &max_height);
if (status != VDP_STATUS_OK)
return vdpau_error(status);
diff --git a/libavcodec/vdpau.h b/libavcodec/vdpau.h
index 24c3b02c02..4e5c3518e3 100644
--- a/libavcodec/vdpau.h
+++ b/libavcodec/vdpau.h
@@ -151,6 +151,26 @@ int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
VdpGetProcAddress *get_proc_address, unsigned flags);
/**
+ * Gets the parameters to create an adequate VDPAU video surface for the codec
+ * context using VDPAU hardware decoding acceleration.
+ *
+ * @note Behavior is undefined if the context was not successfully bound to a
+ * VDPAU device using av_vdpau_bind_context().
+ *
+ * @param avctx the codec context being used for decoding the stream
+ * @param type storage space for the VDPAU video surface chroma type
+ * (or NULL to ignore)
+ * @param width storage space for the VDPAU video surface pixel width
+ * (or NULL to ignore)
+ * @param height storage space for the VDPAU video surface pixel height
+ * (or NULL to ignore)
+ *
+ * @return 0 on success, a negative AVERROR code on failure.
+ */
+int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type,
+ uint32_t *width, uint32_t *height);
+
+/**
* Allocate an AVVDPAUContext.
*
* @return Newly-allocated AVVDPAUContext or NULL on failure.
diff --git a/libavcodec/version.h b/libavcodec/version.h
index b5d3ce0891..d5393fa530 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56
-#define LIBAVCODEC_VERSION_MINOR 9
+#define LIBAVCODEC_VERSION_MINOR 10
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \