blob: ffa3c646ada81846dc4c99737dfeb7d3700c5003 [file] [log] [blame]
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