avutils/vulkan: hwmap, respect src frame resolution
fixes http://trac.ffmpeg.org/ticket/9055 The hw decoder may allocate a large frame from AVHWFramesContext, and adjust width and height based on bitstream. We need to use resolution from src frame instead of AVHWFramesContext. test command: ffmpeg -loglevel debug -hide_banner -hwaccel vaapi -init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel_device va -hwaccel_output_format vaapi -init_hw_device vulkan=vulk -filter_hw_device vulk -i 1920x1080.264 -c:v libx264 -r:v 30 -profile:v high -preset veryfast -vf "hwmap,chromaber_vulkan=0:0,hwdownload,format=nv12" -map 0 -y vaapiouts.mkv expected: No green bar at bottom.
This commit is contained in:
parent
c6a3ca2db4
commit
ae97f69ce1
@ -2009,7 +2009,7 @@ static inline VkFormat drm_to_vulkan_fmt(uint32_t drm_fourcc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **frame,
|
static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **frame,
|
||||||
AVDRMFrameDescriptor *desc)
|
const AVFrame *src)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
VkResult ret;
|
VkResult ret;
|
||||||
@ -2020,6 +2020,7 @@ static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f
|
|||||||
VulkanDevicePriv *p = ctx->internal->priv;
|
VulkanDevicePriv *p = ctx->internal->priv;
|
||||||
VulkanFramesPriv *fp = hwfc->internal->priv;
|
VulkanFramesPriv *fp = hwfc->internal->priv;
|
||||||
AVVulkanFramesContext *frames_hwctx = hwfc->hwctx;
|
AVVulkanFramesContext *frames_hwctx = hwfc->hwctx;
|
||||||
|
const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)src->data[0];
|
||||||
const int has_modifiers = !!(p->extensions & EXT_DRM_MODIFIER_FLAGS);
|
const int has_modifiers = !!(p->extensions & EXT_DRM_MODIFIER_FLAGS);
|
||||||
VkSubresourceLayout plane_data[AV_NUM_DATA_POINTERS] = { 0 };
|
VkSubresourceLayout plane_data[AV_NUM_DATA_POINTERS] = { 0 };
|
||||||
VkBindImageMemoryInfo bind_info[AV_NUM_DATA_POINTERS] = { 0 };
|
VkBindImageMemoryInfo bind_info[AV_NUM_DATA_POINTERS] = { 0 };
|
||||||
@ -2085,7 +2086,7 @@ static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f
|
|||||||
};
|
};
|
||||||
|
|
||||||
get_plane_wh(&create_info.extent.width, &create_info.extent.height,
|
get_plane_wh(&create_info.extent.width, &create_info.extent.height,
|
||||||
hwfc->sw_format, hwfc->width, hwfc->height, i);
|
hwfc->sw_format, src->width, src->height, i);
|
||||||
|
|
||||||
for (int j = 0; j < planes; j++) {
|
for (int j = 0; j < planes; j++) {
|
||||||
plane_data[j].offset = desc->layers[i].planes[j].offset;
|
plane_data[j].offset = desc->layers[i].planes[j].offset;
|
||||||
@ -2246,9 +2247,7 @@ static int vulkan_map_from_drm(AVHWFramesContext *hwfc, AVFrame *dst,
|
|||||||
AVVkFrame *f;
|
AVVkFrame *f;
|
||||||
VulkanMapping *map = NULL;
|
VulkanMapping *map = NULL;
|
||||||
|
|
||||||
err = vulkan_map_from_drm_frame_desc(hwfc, &f,
|
if ((err = vulkan_map_from_drm_frame_desc(hwfc, &f, src)))
|
||||||
(AVDRMFrameDescriptor *)src->data[0]);
|
|
||||||
if (err)
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* The unmapping function will free this */
|
/* The unmapping function will free this */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user