18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/* 28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License"); 58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License. 68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at 78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// http://www.apache.org/licenses/LICENSE-2.0 98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software 118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS, 128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and 148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License. 158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/ 168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h> 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <common/RotationBufferProvider.h> 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define CHECK_VA_STATUS_RETURN(FUNC) \ 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolif (vaStatus != VA_STATUS_SUCCESS) {\ 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE(FUNC" failed. vaStatus = %#x", vaStatus);\ 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false;\ 278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define CHECK_VA_STATUS_BREAK(FUNC) \ 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolif (vaStatus != VA_STATUS_SUCCESS) {\ 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE(FUNC" failed. vaStatus = %#x", vaStatus);\ 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break;\ 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// With this display value, VA will hook VED driver insead of VSP driver for buffer rotation 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define DISPLAYVALUE 0x56454450 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolRotationBufferProvider::RotationBufferProvider(Wsbm* wsbm) 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol : mWsbm(wsbm), 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaInitialized(false), 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaDpy(0), 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCfg(0), 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCtx(0), 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaBufFilter(0), 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mSourceSurface(0), 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDisplay(DISPLAYVALUE), 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mWidth(0), 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mHeight(0), 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTransform(0), 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedWidth(0), 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedHeight(0), 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedStride(0), 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTargetIndex(0), 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTTMWrappers(), 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBobDeinterlace(0) 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (int i = 0; i < MAX_SURFACE_NUM; i++) { 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mKhandles[i] = 0; 598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedSurfaces[i] = 0; 608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDrmBuf[i] = NULL; 618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolRotationBufferProvider::~RotationBufferProvider() 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujoluint32_t RotationBufferProvider::getMilliseconds() 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct timeval ptimeval; 718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol gettimeofday(&ptimeval, NULL); 728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return (uint32_t)((ptimeval.tv_sec * 1000) + (ptimeval.tv_usec / 1000)); 738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::initialize() 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (NULL == mWsbm) 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTTMWrappers.setCapacity(TTM_WRAPPER_COUNT); 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::deinitialize() 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stopVA(); 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol reset(); 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::reset() 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mTTMWrappers.size()) { 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol invalidateCaches(); 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::invalidateCaches() 978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void *buf; 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (size_t i = 0; i < mTTMWrappers.size(); i++) { 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buf = mTTMWrappers.valueAt(i); 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mWsbm->destroyTTMBuffer(buf)) 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("failed to free TTMBuffer"); 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTTMWrappers.clear(); 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolint RotationBufferProvider::transFromHalToVa(int transform) 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (transform == HAL_TRANSFORM_ROT_90) 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return VA_ROTATION_90; 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (transform == HAL_TRANSFORM_ROT_180) 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return VA_ROTATION_180; 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (transform == HAL_TRANSFORM_ROT_270) 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return VA_ROTATION_270; 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolint RotationBufferProvider::getStride(bool isTarget, int width) 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int stride = 0; 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (width <= 512) 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 512; 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else if (width <= 1024) 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 1024; 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else if (width <= 1280) { 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 1280; 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (isTarget) 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 2048; 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else if (width <= 2048) 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 2048; 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else if (width <= 4096) 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = 4096; 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol else 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = (width + 0x3f) & ~0x3f; 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return stride; 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbuffer_handle_t RotationBufferProvider::createWsbmBuffer(int width, int height, void **buf) 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int size = width * height * 3 / 2; // YUV420 NV12 format 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int allignment = 16 * 2048; // tiling row stride aligned 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = mWsbm->allocateTTMBuffer(size, allignment, buf); 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to allocate TTM buffer"); 1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return 0; 1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return (buffer_handle_t) mWsbm->getKBufHandle(*buf); 1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::createVaSurface(VideoPayloadBuffer *payload, int transform, bool isTarget) 1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAStatus vaStatus; 1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VASurfaceAttributeTPI attribTpi; 1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VASurfaceAttributeTPI *vaSurfaceAttrib = &attribTpi; 1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int stride; 1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol unsigned long buffers; 1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VASurfaceID *surface; 1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int width = 0, height = 0, bufferHeight = 0; 1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (isTarget) { 1648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (transFromHalToVa(transform) == VA_ROTATION_180) { 1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width = payload->width; 1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height = payload->height; 1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width = payload->height; 1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height = payload->width; 1708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedWidth = width; 1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedHeight = height; 1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bufferHeight = (height + 0x1f) & ~0x1f; 1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = getStride(isTarget, width); 1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 1768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width = payload->width; 1778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height = payload->height; 1788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bufferHeight = (payload->height + 0x1f) & ~0x1f; 1798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride = payload->luma_stride; /* NV12 srouce buffer */ 1808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!stride) { 1838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("invalid stride value"); 1848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 1858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBobDeinterlace = payload->bob_deinterlace; 1888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // adjust source target for Bob deinterlace 1898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!isTarget && mBobDeinterlace) { 1908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height >>= 1; 1918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bufferHeight >>= 1; 1928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stride <<= 1; 1938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 1948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->count = 1; 1968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->width = width; 1978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->height = height; 1988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->pixel_format = payload->format; 1998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->type = VAExternalMemoryKernelDRMBufffer; 2008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->tiling = payload->tiling; 2018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->size = (stride * bufferHeight * 3) / 2; 2028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->luma_offset = 0; 2038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->chroma_v_offset = stride * bufferHeight; 2048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->luma_stride = vaSurfaceAttrib->chroma_u_stride 2058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol = vaSurfaceAttrib->chroma_v_stride 2068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol = stride; 2078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->chroma_u_offset = vaSurfaceAttrib->chroma_v_offset; 2088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->buffers = &buffers; 2098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (isTarget) { 2118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buffer_handle_t khandle = createWsbmBuffer(stride, bufferHeight, &mDrmBuf[mTargetIndex]); 2128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (khandle == 0) { 2138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create buffer by wsbm"); 2148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mKhandles[mTargetIndex] = khandle; 2188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->buffers[0] = (uintptr_t) khandle; 2198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedStride = stride; 2208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol surface = &mRotatedSurfaces[mTargetIndex]; 2218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 2228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib->buffers[0] = (uintptr_t) payload->khandle; 2238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol surface = &mSourceSurface; 2248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol /* set src surface width/height to video crop size */ 2258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload->crop_width && payload->crop_height) { 2268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width = payload->crop_width; 2278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height = (payload->crop_height >> mBobDeinterlace); 2288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 2298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("Invalid cropping width or height"); 2308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->crop_width = width; 2318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->crop_height = height; 2328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaCreateSurfacesWithAttribute(mVaDpy, 2368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width, 2378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol height, 2388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VA_RT_FORMAT_YUV420, 2398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1, 2408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol surface, 2418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaSurfaceAttrib); 2428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (vaStatus != VA_STATUS_SUCCESS) { 2438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("vaCreateSurfacesWithAttribute returns %d", vaStatus); 2448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("Attributes: target: %d, width: %d, height %d, bufferHeight %d, tiling %d", 2458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol isTarget, width, height, bufferHeight, payload->tiling); 2468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol *surface = 0; 2478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 2518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 2528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::startVA(VideoPayloadBuffer *payload, int transform) 2548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 2558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = true; 2568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAStatus vaStatus; 2578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAEntrypoint *entryPoint; 2588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAConfigAttrib attribDummy; 2598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int numEntryPoints; 2608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool supportVideoProcessing = false; 2618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int majorVer = 0, minorVer = 0; 2628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // VA will hold a copy of the param pointer, so local varialbe doesn't work 2648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaDpy = vaGetDisplay(&mDisplay); 2658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (NULL == mVaDpy) { 2668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to get VADisplay"); 2678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaInitialize(mVaDpy, &majorVer, &minorVer); 2718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaInitialize"); 2728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol numEntryPoints = vaMaxNumEntrypoints(mVaDpy); 2748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (numEntryPoints <= 0) { 2768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("numEntryPoints value is invalid"); 2778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol entryPoint = (VAEntrypoint*)malloc(sizeof(VAEntrypoint) * numEntryPoints); 2818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (NULL == entryPoint) { 2828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to malloc memory for entryPoint"); 2838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 2848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 2858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaQueryConfigEntrypoints(mVaDpy, 2878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProfileNone, 2888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol entryPoint, 2898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &numEntryPoints); 2908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaQueryConfigEntrypoints"); 2918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (int i = 0; i < numEntryPoints; i++) 2938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (entryPoint[i] == VAEntrypointVideoProc) 2948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol supportVideoProcessing = true; 2958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol free(entryPoint); 2978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol entryPoint = NULL; 2988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 2998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!supportVideoProcessing) { 3008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("VAEntrypointVideoProc is not supported"); 3018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 3028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaCreateConfig(mVaDpy, 3058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProfileNone, 3068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAEntrypointVideoProc, 3078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &attribDummy, 3088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 0, 3098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &mVaCfg); 3108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaCreateConfig"); 3118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // create first target surface 3138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = createVaSurface(payload, transform, true); 3148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 3158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create target surface with attribute"); 3168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 3178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaCreateContext(mVaDpy, 3208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCfg, 3218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->width, 3228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->height, 3238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 0, 3248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &mRotatedSurfaces[0], 3258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1, 3268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &mVaCtx); 3278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaCreateContext"); 3288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcFilterType filters[VAProcFilterCount]; 3308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol unsigned int numFilters = VAProcFilterCount; 3318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaQueryVideoProcFilters(mVaDpy, mVaCtx, filters, &numFilters); 3328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaQueryVideoProcFilters"); 3338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool supportVideoProcFilter = false; 3358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (unsigned int j = 0; j < numFilters; j++) 3368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (filters[j] == VAProcFilterNone) 3378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol supportVideoProcFilter = true; 3388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!supportVideoProcFilter) { 3408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("VAProcFilterNone is not supported"); 3418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 3428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcFilterParameterBuffer filter; 3458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol filter.type = VAProcFilterNone; 3468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol filter.value = 0; 3478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaCreateBuffer(mVaDpy, 3498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCtx, 3508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcFilterParameterBufferType, 3518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol sizeof(filter), 3528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1, 3538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &filter, 3548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &mVaBufFilter); 3558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 3568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcPipelineCaps pipelineCaps; 3588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol unsigned int numCaps = 1; 3598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaQueryVideoProcPipelineCaps(mVaDpy, 3608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCtx, 3618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &mVaBufFilter, 3628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol numCaps, 3638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &pipelineCaps); 3648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_RETURN("vaQueryVideoProcPipelineCaps"); 3658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!(pipelineCaps.rotation_flags & (1 << transFromHalToVa(transform)))) { 3678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("VA_ROTATION_xxx: 0x%08x is not supported by the filter", 3688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol transFromHalToVa(transform)); 3698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 3708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaInitialized = true; 3738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 3758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 3768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::setupRotationBuffer(VideoPayloadBuffer *payload, int transform) 3788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 3798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE 3808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t setup_Begin = getMilliseconds(); 3818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif 3828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAStatus vaStatus; 3838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int stride; 3848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = false; 3858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload->format != VA_FOURCC_NV12 || payload->width == 0 || payload->height == 0) { 3878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("payload data is not correct: format %#x, width %d, height %d", 3888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->format, payload->width, payload->height); 3898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return ret; 3908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (payload->width > 1280 && payload->width <= 2048) { 3938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->tiling = 1; 3948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 3958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 3968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol do { 3978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (isContextChanged(payload->width, payload->height, transform)) { 3988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DTRACE("VA is restarted as rotation context changes"); 3998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mVaInitialized) { 4018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stopVA(); // need to re-initialize VA for new rotation config 4028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTransform = transform; 4048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mWidth = payload->width; 4058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mHeight = payload->height; 4068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mVaInitialized) { 4098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = startVA(payload, transform); 4108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 4118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 4128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 4138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // start to create next target surface 4178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!mRotatedSurfaces[mTargetIndex]) { 4188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = createVaSurface(payload, transform, true); 4198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 4208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create target surface with attribute"); 4218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 4228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 4238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // create source surface 4278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = createVaSurface(payload, transform, false); 4288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 4298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to create source surface with attribute"); 4308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = VA_STATUS_ERROR_OPERATION_FAILED; 4318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol break; 4328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 4338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE 4358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol uint32_t beginPicture = getMilliseconds(); 4368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif 4378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaBeginPicture(mVaDpy, mVaCtx, mRotatedSurfaces[mTargetIndex]); 4388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaBeginPicture"); 4398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VABufferID pipelineBuf; 4418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void *p; 4428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcPipelineParameterBuffer *pipelineParam; 4438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaCreateBuffer(mVaDpy, 4448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCtx, 4458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAProcPipelineParameterBufferType, 4468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol sizeof(*pipelineParam), 4478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1, 4488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol NULL, 4498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol &pipelineBuf); 4508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaCreateBuffer"); 4518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaMapBuffer(mVaDpy, pipelineBuf, &p); 4538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaMapBuffer"); 4548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam = (VAProcPipelineParameterBuffer*)p; 4568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->surface = mSourceSurface; 4578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->rotation_state = transFromHalToVa(transform); 4588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->filters = &mVaBufFilter; 4598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->num_filters = 1; 4608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->surface_region = NULL; 4618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->output_region = NULL; 4628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->num_forward_references = 0; 4638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol pipelineParam->num_backward_references = 0; 4648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaUnmapBuffer(mVaDpy, pipelineBuf); 4658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaUnmapBuffer"); 4668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaRenderPicture(mVaDpy, mVaCtx, &pipelineBuf, 1); 4688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaRenderPicture"); 4698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaEndPicture(mVaDpy, mVaCtx); 4718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaEndPicture"); 4728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaSyncSurface(mVaDpy, mRotatedSurfaces[mTargetIndex]); 4748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol CHECK_VA_STATUS_BREAK("vaSyncSurface"); 4758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE 4778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ITRACE("time spent %dms from vaBeginPicture to vaSyncSurface", 4788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol getMilliseconds() - beginPicture); 4798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif 4808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // Populate payload fields so that overlayPlane can flip the buffer 4828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->rotated_width = mRotatedStride; 4838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->rotated_height = mRotatedHeight; 4848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->rotated_buffer_handle = mKhandles[mTargetIndex]; 4858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // setting client transform to 0 to force re-generating rotated buffer whenever needed. 4868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->client_transform = 0; 4878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTargetIndex++; 4888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mTargetIndex >= MAX_SURFACE_NUM) 4898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTargetIndex = 0; 4908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } while (0); 4928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE 4948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ITRACE("time spent %dms for setupRotationBuffer", 4958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol getMilliseconds() - setup_Begin); 4968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif 4978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 4988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mSourceSurface > 0) { 4998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaDestroySurfaces(mVaDpy, &mSourceSurface, 1); 5008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (vaStatus != VA_STATUS_SUCCESS) 5018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("vaDestroySurfaces failed, vaStatus = %d", vaStatus); 5028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mSourceSurface = 0; 5038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (vaStatus != VA_STATUS_SUCCESS) { 5068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol stopVA(); 5078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; // To not block HWC, just abort instead of retry 5088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!payload->khandle) { 5118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("khandle is reset by decoder, surface is invalid!"); 5128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 5138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 5168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 5178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::prepareBufferInfo(int w, int h, int stride, VideoPayloadBuffer *payload, void *user_pt) 5198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 5208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int chroma_offset, size; 5218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void *buf = NULL; 5228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->width = payload->crop_width = w; 5248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->height = payload->crop_height = h; 5258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->coded_width = ((w + 0xf) & ~0xf); 5268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->coded_height = ((h + 0xf) & ~0xf); 5278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->format = VA_FOURCC_NV12; 5288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->tiling = 1; 5298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->luma_stride = stride; 5308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->chroma_u_stride = stride; 5318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->chroma_v_stride = stride; 5328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->client_transform = 0; 5338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->bob_deinterlace = 0; 5348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol chroma_offset = stride * h; 5368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol size = stride * h + stride * h / 2; 5378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ssize_t index; 5398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol index = mTTMWrappers.indexOfKey((uint64_t)user_pt); 5408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (index < 0) { 5418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("wrapped userPt as wsbm buffer"); 5428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret = mWsbm->allocateTTMBufferUB(size, 0, &buf, user_pt); 5438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (ret == false) { 5448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ETRACE("failed to allocate TTM buffer"); 5458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return ret; 5468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (mTTMWrappers.size() >= TTM_WRAPPER_COUNT) { 5498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("mTTMWrappers is unexpectedly full. Invalidate caches"); 5508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol invalidateCaches(); 5518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol index = mTTMWrappers.add((uint64_t)user_pt, buf); 5548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } else { 5558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VTRACE("got wsbmBuffer in saved caches"); 5568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol buf = mTTMWrappers.valueAt(index); 5578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol payload->khandle = (buffer_handle_t) mWsbm->getKBufHandle(buf); 5608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 5618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 5628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::freeVaSurfaces() 5648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 5658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ret; 5668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VAStatus vaStatus; 5678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (int i = 0; i < MAX_SURFACE_NUM; i++) { 5698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (NULL != mDrmBuf[i]) { 5708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol ret = mWsbm->destroyTTMBuffer(mDrmBuf[i]); 5718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (!ret) 5728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("failed to free TTMBuffer"); 5738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDrmBuf[i] = NULL; 5748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // remove wsbm buffer ref from VA 5788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (int j = 0; j < MAX_SURFACE_NUM; j++) { 5798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 != mRotatedSurfaces[j]) { 5808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaStatus = vaDestroySurfaces(mVaDpy, &mRotatedSurfaces[j], 1); 5818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (vaStatus != VA_STATUS_SUCCESS) 5828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol WTRACE("vaDestroySurfaces failed, vaStatus = %d", vaStatus); 5838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedSurfaces[j] = 0; 5858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 5868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 5878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::stopVA() 5898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 5908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol freeVaSurfaces(); 5918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 5928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 != mVaBufFilter) 5938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaDestroyBuffer(mVaDpy, mVaBufFilter); 5948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 != mVaCfg) 5958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaDestroyConfig(mVaDpy,mVaCfg); 5968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 != mVaCtx) 5978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaDestroyContext(mVaDpy, mVaCtx); 5988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (0 != mVaDpy) 5998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol vaTerminate(mVaDpy); 6008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaInitialized = false; 6028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol for (int i = 0; i < MAX_SURFACE_NUM; i++) { 6048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mKhandles[i] = 0; 6058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedSurfaces[i] = 0; 6068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mDrmBuf[i] = NULL; 6078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 6088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // reset VA variable 6098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaDpy = 0; 6108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCfg = 0; 6118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaCtx = 0; 6128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mVaBufFilter = 0; 6138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mSourceSurface = 0; 6148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mWidth = 0; 6168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mHeight = 0; 6178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedWidth = 0; 6188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedHeight = 0; 6198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mRotatedStride = 0; 6208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mTargetIndex = 0; 6218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol mBobDeinterlace = 0; 6228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 6238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::isContextChanged(int width, int height, int transform) 6258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{ 6268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // check rotation config 6278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol if (height == mHeight && 6288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol width == mWidth && 6298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol transform == mTransform) { 6308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return false; 6318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol } 6328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol return true; 6348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} 6358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 6368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // name space intel 6378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // name space android 638