|
|
|
@ -83,6 +83,9 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, |
|
|
|
|
uint32_t width = (avctx->coded_width + 1) & ~1; |
|
|
|
|
uint32_t height = (avctx->coded_height + 3) & ~3; |
|
|
|
|
|
|
|
|
|
vdctx->width = UINT32_MAX; |
|
|
|
|
vdctx->height = UINT32_MAX; |
|
|
|
|
|
|
|
|
|
if (!hwctx) { |
|
|
|
|
vdctx->device = VDP_INVALID_HANDLE; |
|
|
|
|
av_log(avctx, AV_LOG_WARNING, "hwaccel_context has not been setup by the user application, cannot initialize\n"); |
|
|
|
@ -115,6 +118,11 @@ int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile, |
|
|
|
|
|
|
|
|
|
status = create(vdctx->device, profile, width, height, avctx->refs, |
|
|
|
|
&vdctx->decoder); |
|
|
|
|
if (status == VDP_STATUS_OK) { |
|
|
|
|
vdctx->width = avctx->coded_width; |
|
|
|
|
vdctx->height = avctx->coded_height; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return vdpau_error(status); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -127,6 +135,8 @@ int ff_vdpau_common_uninit(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
if (vdctx->device == VDP_INVALID_HANDLE) |
|
|
|
|
return 0; /* Decoder created and destroyed by user */ |
|
|
|
|
if (vdctx->width == UINT32_MAX && vdctx->height == UINT32_MAX) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
status = vdctx->get_proc_address(vdctx->device, |
|
|
|
|
VDP_FUNC_ID_DECODER_DESTROY, &func); |
|
|
|
@ -139,6 +149,20 @@ int ff_vdpau_common_uninit(AVCodecContext *avctx) |
|
|
|
|
return vdpau_error(status); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int ff_vdpau_common_reinit(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data; |
|
|
|
|
|
|
|
|
|
if (vdctx->device == VDP_INVALID_HANDLE) |
|
|
|
|
return 0; /* Decoder created by user */ |
|
|
|
|
if (avctx->coded_width == vdctx->width && |
|
|
|
|
avctx->coded_height == vdctx->height) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
avctx->hwaccel->uninit(avctx); |
|
|
|
|
return avctx->hwaccel->init(avctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx, |
|
|
|
|
av_unused const uint8_t *buffer, |
|
|
|
|
av_unused uint32_t size) |
|
|
|
@ -156,6 +180,11 @@ int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame, |
|
|
|
|
AVVDPAUContext *hwctx = avctx->hwaccel_context; |
|
|
|
|
VdpVideoSurface surf = ff_vdpau_get_surface_id(frame); |
|
|
|
|
VdpStatus status; |
|
|
|
|
int val; |
|
|
|
|
|
|
|
|
|
val = ff_vdpau_common_reinit(avctx); |
|
|
|
|
if (val < 0) |
|
|
|
|
return val; |
|
|
|
|
|
|
|
|
|
#if FF_API_BUFS_VDPAU |
|
|
|
|
FF_DISABLE_DEPRECATION_WARNINGS |
|
|
|
|