|
|
@@ -71,6 +71,46 @@ AVVDPAUContext *av_alloc_vdpaucontext(void) |
|
|
|
|
|
|
|
MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2) |
|
|
|
|
|
|
|
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) |
|
|
|
{ |
|
|
@@ -83,9 +123,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; |
|
|
@@ -112,6 +152,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); |
|
|
@@ -120,7 +163,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); |
|
|
|