| From bfd0e7d8334b414683de33ab1d0520562cf4329f Mon Sep 17 00:00:00 2001 |
| From: Daniele Castagna <dcastagna@chromium.org> |
| Date: Mon, 29 Jul 2019 21:31:09 -0400 |
| Subject: [PATCH] Make vaExportSurfaceHandle work for IMC3 |
| |
| vaExportSurfaceHandle currently doesn't support IMC3 format. |
| This patch adds support for IMC3 in seprate layers mode and |
| fixes ExportSurfaceHandle to work with formats that might have |
| alignment requirements for U/V plane start addresses. |
| |
| This can be used to export VAAPI decoded JPEGs without |
| incurring in additional copies. |
| --- |
| src/i965_drv_video.c | 14 +++++++++++--- |
| 1 file changed, 11 insertions(+), 3 deletions(-) |
| |
| diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c |
| index 4aa8da7..55b066f 100644 |
| --- a/src/i965_drv_video.c |
| +++ b/src/i965_drv_video.c |
| @@ -6700,6 +6700,7 @@ static uint32_t drm_format_of_separate_plane(uint32_t fourcc, int plane) |
| switch (fourcc) { |
| case VA_FOURCC_NV12: |
| case VA_FOURCC_I420: |
| + case VA_FOURCC_IMC3: |
| case VA_FOURCC_YV12: |
| case VA_FOURCC_YV16: |
| case VA_FOURCC_Y800: |
| @@ -6731,6 +6732,7 @@ static uint32_t drm_format_of_separate_plane(uint32_t fourcc, int plane) |
| case VA_FOURCC_NV12: |
| return DRM_FORMAT_GR88; |
| case VA_FOURCC_I420: |
| + case VA_FOURCC_IMC3: |
| case VA_FOURCC_YV12: |
| case VA_FOURCC_YV16: |
| return DRM_FORMAT_R8; |
| @@ -6793,7 +6795,7 @@ i965_ExportSurfaceHandle(VADriverContextP ctx, VASurfaceID surface_id, |
| const i965_fourcc_info *info; |
| VADRMPRIMESurfaceDescriptor *desc; |
| unsigned int tiling, swizzle; |
| - uint32_t formats[4], pitch, height, offset; |
| + uint32_t formats[4], pitch, height, offset, y_offset; |
| int fd, p; |
| int composite_object = |
| flags & VA_EXPORT_SURFACE_COMPOSED_LAYERS; |
| @@ -6895,15 +6897,21 @@ i965_ExportSurfaceHandle(VADriverContextP ctx, VASurfaceID surface_id, |
| if (p == 0) { |
| pitch = obj_surface->width; |
| height = obj_surface->height; |
| + if (obj_surface->y_cb_offset < obj_surface->y_cr_offset) |
| + y_offset = obj_surface->y_cb_offset; |
| + else |
| + y_offset = obj_surface->y_cr_offset; |
| } else { |
| + y_offset = obj_surface->y_cr_offset - obj_surface->y_cb_offset; |
| + if (y_offset < 0) |
| + y_offset = -y_offset; |
| pitch = obj_surface->cb_cr_pitch; |
| height = obj_surface->cb_cr_height; |
| } |
| |
| desc->layers[p].offset[0] = offset; |
| desc->layers[p].pitch[0] = pitch; |
| - |
| - offset += pitch * height; |
| + offset += pitch * y_offset; |
| } |
| } |
| |
| -- |
| 2.22.0.709.g102302147b-goog |
| |