vulkan_decode: use coded_width/height instead of the non-coded width and height

Partially fixes https://streams.videolan.org/issues/19938/20000_20180305-15.04.59.ts
The is coded as 1920x1080, meant to be rendered at 1440x1080 with cropping,
or 1680x1080 before cropping. Currently, the created DPB is 1440x1080, which results
in the image being decoded incorrectly, as the decoder overwrites output memory.
This commit fixes this.
pull/390/head
Lynne 1 year ago
parent 3c5bceb751
commit 9ee4f47c94
No known key found for this signature in database
GPG Key ID: A2FEA5F03F034464
  1. 16
      libavcodec/vulkan_decode.c

@ -872,10 +872,10 @@ static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_
" separate_references" : ""); " separate_references" : "");
/* Check if decoding is possible with the given parameters */ /* Check if decoding is possible with the given parameters */
if (avctx->width < caps->minCodedExtent.width || if (avctx->coded_width < caps->minCodedExtent.width ||
avctx->height < caps->minCodedExtent.height || avctx->coded_height < caps->minCodedExtent.height ||
avctx->width > caps->maxCodedExtent.width || avctx->coded_width > caps->maxCodedExtent.width ||
avctx->height > caps->maxCodedExtent.height) avctx->coded_height > caps->maxCodedExtent.height)
return AVERROR(EINVAL); return AVERROR(EINVAL);
if (!(avctx->hwaccel_flags & AV_HWACCEL_FLAG_IGNORE_LEVEL) && if (!(avctx->hwaccel_flags & AV_HWACCEL_FLAG_IGNORE_LEVEL) &&
@ -1027,8 +1027,8 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
frames_ctx->user_opaque = prof; frames_ctx->user_opaque = prof;
frames_ctx->free = free_profile_data; frames_ctx->free = free_profile_data;
frames_ctx->width = avctx->width; frames_ctx->width = avctx->coded_width;
frames_ctx->height = avctx->height; frames_ctx->height = avctx->coded_height;
frames_ctx->format = AV_PIX_FMT_VULKAN; frames_ctx->format = AV_PIX_FMT_VULKAN;
hwfc->format[0] = vkfmt; hwfc->format[0] = vkfmt;
@ -1224,8 +1224,8 @@ int ff_vk_decode_init(AVCodecContext *avctx)
dpb_frames = (AVHWFramesContext *)ctx->dpb_hwfc_ref->data; dpb_frames = (AVHWFramesContext *)ctx->dpb_hwfc_ref->data;
dpb_frames->format = s->frames->format; dpb_frames->format = s->frames->format;
dpb_frames->sw_format = s->frames->sw_format; dpb_frames->sw_format = s->frames->sw_format;
dpb_frames->width = s->frames->width; dpb_frames->width = avctx->coded_width;
dpb_frames->height = s->frames->height; dpb_frames->height = avctx->coded_height;
dpb_hwfc = dpb_frames->hwctx; dpb_hwfc = dpb_frames->hwctx;
dpb_hwfc->create_pnext = (void *)ff_vk_find_struct(ctx->s.hwfc->create_pnext, dpb_hwfc->create_pnext = (void *)ff_vk_find_struct(ctx->s.hwfc->create_pnext,

Loading…
Cancel
Save