| From aa07915439e730243726c7fca7d1f9f298cea8fb Mon Sep 17 00:00:00 2001 |
| From: XinfengZhang <carl.zhang@intel.com> |
| Date: Wed, 1 Apr 2020 09:43:13 -0700 |
| Subject: [PATCH] use gmmlib calculate the NV12 surface offset |
| |
| should apply similiar changes for other planar format in near future |
| it is quick fix for chromium encoding issue |
| |
| Signed-off-by: XinfengZhang <carl.zhang@intel.com> |
| --- |
| media_driver/linux/common/ddi/media_libva.cpp | 40 +++++++++++-------- |
| 1 file changed, 23 insertions(+), 17 deletions(-) |
| |
| diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp |
| index c80f0e70e50c..284908f575c2 100755 |
| --- a/media_driver/linux/common/ddi/media_libva.cpp |
| +++ b/media_driver/linux/common/ddi/media_libva.cpp |
| @@ -4177,12 +4177,24 @@ VAStatus DdiMedia_DeriveImage ( |
| vaimg->height = mediaSurface->iRealHeight; |
| vaimg->format.byte_order = VA_LSB_FIRST; |
| |
| + GMM_RESOURCE_INFO *gmmResourceInfo = mediaSurface->pGmmResourceInfo; |
| + GMM_REQ_OFFSET_INFO reqInfo = {0}; |
| + reqInfo.Plane = GMM_PLANE_U; |
| + reqInfo.ReqRender = 1; |
| + gmmResourceInfo->GetOffset(reqInfo); |
| + uint32_t offsetU = reqInfo.Render.Offset; |
| + MOS_ZeroMemory(&reqInfo, sizeof(GMM_REQ_OFFSET_INFO)); |
| + reqInfo.Plane = GMM_PLANE_V; |
| + reqInfo.ReqRender = 1; |
| + gmmResourceInfo->GetOffset(reqInfo); |
| + uint32_t offsetV = reqInfo.Render.Offset; |
| + vaimg->data_size = (uint32_t)gmmResourceInfo->GetSizeSurface(); |
| + |
| switch( mediaSurface->format ) |
| { |
| case Media_Format_YV12: |
| case Media_Format_I420: |
| vaimg->format.bits_per_pixel = 12; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->pitches[1] = |
| @@ -4196,7 +4208,6 @@ VAStatus DdiMedia_DeriveImage ( |
| case Media_Format_A8R8G8B8: |
| vaimg->format.bits_per_pixel = 32; |
| vaimg->format.alpha_mask = RGB_8BIT_ALPHAMASK; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| @@ -4204,7 +4215,6 @@ VAStatus DdiMedia_DeriveImage ( |
| case Media_Format_X8R8G8B8: |
| case Media_Format_X8B8G8R8: |
| vaimg->format.bits_per_pixel = 32; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| @@ -4213,13 +4223,11 @@ VAStatus DdiMedia_DeriveImage ( |
| case Media_Format_B10G10R10A2: |
| vaimg->format.bits_per_pixel = 32; |
| vaimg->format.alpha_mask = RGB_10BIT_ALPHAMASK; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| break; |
| case Media_Format_R5G6B5: |
| - vaimg->format.bits_per_pixel = 16; |
| vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| @@ -4227,7 +4235,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_R8G8B8: |
| vaimg->format.bits_per_pixel = 24; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| @@ -4242,7 +4249,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_400P: |
| vaimg->format.bits_per_pixel = 8; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| @@ -4251,7 +4257,6 @@ VAStatus DdiMedia_DeriveImage ( |
| case Media_Format_RGBP: |
| case Media_Format_BGRP: |
| vaimg->format.bits_per_pixel = 24; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = |
| vaimg->pitches[1] = |
| @@ -4262,7 +4267,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_IMC3: |
| vaimg->format.bits_per_pixel = 12; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 2; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = |
| vaimg->pitches[1] = |
| @@ -4273,7 +4277,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_411P: |
| vaimg->format.bits_per_pixel = 12; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = |
| vaimg->pitches[1] = |
| @@ -4284,7 +4287,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_422V: |
| vaimg->format.bits_per_pixel = 16; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 2; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = |
| vaimg->pitches[1] = |
| @@ -4295,7 +4297,6 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_422H: |
| vaimg->format.bits_per_pixel = 16; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3; |
| vaimg->num_planes = 3; |
| vaimg->pitches[0] = |
| vaimg->pitches[1] = |
| @@ -4307,7 +4308,6 @@ VAStatus DdiMedia_DeriveImage ( |
| case Media_Format_P010: |
| case Media_Format_P016: |
| vaimg->format.bits_per_pixel = 24; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2; |
| vaimg->num_planes = 2; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->pitches[1] = |
| @@ -4327,21 +4327,27 @@ VAStatus DdiMedia_DeriveImage ( |
| break; |
| case Media_Format_Y416: |
| vaimg->format.bits_per_pixel = 64; // packed format [alpha, Y, U, V], 16 bits per channel |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight; |
| vaimg->num_planes = 1; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| break; |
| default: |
| vaimg->format.bits_per_pixel = 12; |
| - vaimg->data_size = mediaSurface->iPitch * mediaSurface->iHeight * 3 / 2; |
| vaimg->num_planes = 2; |
| vaimg->pitches[0] = mediaSurface->iPitch; |
| vaimg->pitches[1] = |
| vaimg->pitches[2] = mediaSurface->iPitch; |
| vaimg->offsets[0] = 0; |
| - vaimg->offsets[1] = mediaSurface->iHeight * mediaSurface->iPitch; |
| - vaimg->offsets[2] = vaimg->offsets[1] + 1; |
| + if(MEDIA_IS_WA(&mediaCtx->WaTable, FtrE2ECompression)) |
| + { |
| + vaimg->offsets[1] = mediaSurface->iHeight * mediaSurface->iPitch; |
| + vaimg->offsets[2] = vaimg->offsets[1] + 1; |
| + } |
| + else |
| + { |
| + vaimg->offsets[1] = offsetU; |
| + vaimg->offsets[2] = offsetV; |
| + } |
| break; |
| } |
| |
| -- |
| 2.17.1 |
| |