OverlayPlaneBase.cpp revision b61d150a9f3124bb8ad6937ab64e29eef5a0d1e4
1d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 16d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 17d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <math.h> 180594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h> 20d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Hwcomposer.h> 2165efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <PhysicalDevice.h> 220594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/OverlayPlaneBase.h> 230594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/TTMBufferMapper.h> 240594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/GrallocSubBuffer.h> 2523921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx#include <DisplayQuery.h> 26fceeb45070ca7323f692f5ee25d62e079ce8c5c3Thierry Strudel#include <khronos/openmax/OMX_IntelVideoExt.h> 27fa7a36cfa74219be29ffcbbedfdb757bf8e7df41Thierry Strudel#include <hal_public.h> 28d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 29d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android { 30d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel { 31d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 32d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp) 33d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu : DisplayPlane(index, PLANE_OVERLAY, disp), 34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mTTMBuffers(), 35c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers(), 36c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mCurrent(0), 37d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm(0), 3847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mPipeConfig(0), 3947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mBobDeinterlace(0) 40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 42c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 43c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = 0; 44c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase() 48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 49d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 52d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount) 53d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 54d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 55d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 57e2ad4c047651d4442f6a0e002290016d45e9201afu jin // NOTE: use overlay's data buffer count for the overlay plane 58e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (bufferCount < OVERLAY_DATA_BUFFER_COUNT) { 594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ILOGTRACE("override overlay buffer count from %d to %d", 60e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount, OVERLAY_DATA_BUFFER_COUNT); 61e2ad4c047651d4442f6a0e002290016d45e9201afu jin bufferCount = OVERLAY_DATA_BUFFER_COUNT; 62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 63e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (!DisplayPlane::initialize(bufferCount)) { 64e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DEINIT_AND_RETURN_FALSE("failed to initialize display plane"); 65e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 66e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 67e2ad4c047651d4442f6a0e002290016d45e9201afu jin mTTMBuffers.setCapacity(bufferCount); 68c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.setCapacity(MIN_DATA_BUFFER_COUNT); 69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 70d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init wsbm 71d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mWsbm = new Wsbm(drm->getDrmFd()); 72d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mWsbm || !mWsbm->initialize()) { 73d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create wsbm"); 74d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 76d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create overlay back buffer 77c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 78c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = createBackBuffer(); 79c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[i]) { 80c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer"); 81c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 82c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // reset back buffer 83c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu resetBackBuffer(i); 84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 86e2ad4c047651d4442f6a0e002290016d45e9201afu jin // disable overlay when created 87e2ad4c047651d4442f6a0e002290016d45e9201afu jin flush(PLANE_DISABLE); 886a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 9268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhangbool OverlayPlaneBase::isDisabled() 9368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang{ 9468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang RETURN_FALSE_IF_NOT_INIT(); 9568dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 9668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang struct drm_psb_register_rw_arg arg; 9768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg)); 9868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 9968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.get_plane_state_mask = 1; 10068dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.plane.type = DC_OVERLAY_PLANE; 10168dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang arg.plane.index = mIndex; 10268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // pass the pipe index to check its enabled status 10368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // now we can pass the device id directly since 10468dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang // their values are just equal 105c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu arg.plane.ctx = mDevice; // not used in kernel 10668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 10768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang Drm *drm = Hwcomposer::getInstance().getDrm(); 10868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg)); 10968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang if (ret == false) { 1104157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("overlay plane query failed with error code %d", ret); 11168dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang return false; 11268dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang } 11368dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 1144157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev DLOGTRACE("overlay %d status %s on device %d, current device %d", 115c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mIndex, arg.plane.ctx ? "DISABLED" : "ENABLED", mDevice, mDevice); 11668dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 11768dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang return arg.plane.ctx == PSB_DC_PLANE_DISABLED; 11868dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang} 11968dbca089b413041774b80ef5bf95a4f4a858489Lei Zhang 120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize() 121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 122e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu if (mTTMBuffers.size()) { 123e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu invalidateBufferCache(); 124e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 126c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 127c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 128c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 129c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 130c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // delete back buffer 131c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 132c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mBackBuffer[i]) { 133c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu deleteBackBuffer(i); 134c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[i] = NULL; 135c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 136e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu } 137eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DEINIT_AND_DELETE_OBJ(mWsbm); 138e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu 139e7abb8ca06e07c3af44e8b4d9e2905859d327de0Andy Qiu DisplayPlane::deinitialize(); 140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache() 143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear plane buffer cache 145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu DisplayPlane::invalidateBufferCache(); 146c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp) 150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t pipeConfig = 0; 152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1544157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("overlay %d assigned to disp %d", mIndex, disp); 155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (disp) { 157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_EXTERNAL: 158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = (0x2 << 6); 159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case IDisplayDevice::DEVICE_PRIMARY: 161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pipeConfig = 0; 163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // if pipe switching happened, then disable overlay first 1676a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu if (mPipeConfig != pipeConfig) { 1684157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev DLOGTRACE("overlay %d switched from %d to %d", mIndex, mDevice, disp); 169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu disable(); 1706a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mPipeConfig = pipeConfig; 173ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley DisplayPlane::assignToDevice(disp); 174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 175c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu enable(); 1766a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 180d191dc7a785f312ede10d711720d8ca32a71b44cJackie Livoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& zorderConfig, 1810594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel void * /*nativeConfig*/) 182d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 183d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 184d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 185d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li // setup overlay z order 186d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovaZOrder = -1; 187d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li int ovcZOrder = -1; 188d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li for (size_t i = 0; i < zorderConfig.size(); i++) { 1899d1d3833469f52dbd2a017702bf0116fddc703bcAndy Qiu DisplayPlane *plane = zorderConfig[i]->plane; 190d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getType() == DisplayPlane::PLANE_OVERLAY) { 191d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li if (plane->getIndex() == 0) { 192d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovaZOrder = i; 193d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } else if (plane->getIndex() == 1) { 194d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li ovcZOrder = i; 195d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 196d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 197d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 198d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li 199c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 200c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 201c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 202c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return; 203c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 204c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // force overlay c above overlay a 205c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if ((ovaZOrder >= 0) && (ovaZOrder < ovcZOrder)) { 206c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCONFIG |= (1 << 15); 207c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } else { 208c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCONFIG &= ~(1 << 15); 209c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 210d9045abeda7b707f3c55779989fc77b2197bc38eJackie Li } 211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 212d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset() 214d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 217c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li DisplayPlane::reset(); 218c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 219c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // invalidate active TTM buffers 220c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (mActiveTTMBuffers.size() > 0) { 221c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li invalidateActiveTTMBuffers(); 222c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 223c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 224c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // reset back buffers 225c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 226c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu resetBackBuffer(i); 227c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 229d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 230d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 231d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable() 232d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 233d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 234c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 235c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 236c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 237c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 238d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 239c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (backBuffer->OCMD & 0x1) 240c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return true; 241d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 242c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCMD |= 0x1; 243c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu } 244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2464a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_ENABLE); 247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable() 251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 253c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu for (int i = 0; i < OVERLAY_BACK_BUFFER_COUNT; i++) { 254c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[i]->buf; 255c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!backBuffer) 256c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 258c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!(backBuffer->OCMD & 0x1)) 259c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return true; 260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 261c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu backBuffer->OCMD &= ~0x1; 2626a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu } 2636a56bd739af22a3c34067426edbb3082504d8e03Andy Qiu 264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // flush 2654a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li flush(PLANE_DISABLE); 266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer() 270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 273eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // create back buffer 274eb726af21649d79ed720bdf329e0849270995c45Andy Qiu OverlayBackBuffer *backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer)); 275eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!backBuffer) { 2764157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate back buffer"); 277d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 278d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 279d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 280d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int size = sizeof(OverlayBackBufferBlk); 282eb726af21649d79ed720bdf329e0849270995c45Andy Qiu int alignment = 64 * 1024; 283eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *wsbmBufferObject = 0; 284eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject); 285eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (ret == false) { 2864157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate TTM buffer"); 287eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 288d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 289d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu void *virtAddr = mWsbm->getCPUAddress(wsbmBufferObject); 291eb726af21649d79ed720bdf329e0849270995c45Andy Qiu uint32_t gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject); 292eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->buf = (OverlayBackBufferBlk *)virtAddr; 294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->gttOffsetInPage = gttOffsetInPage; 295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->bufObject = (uint32_t)wsbmBufferObject; 296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 2974157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage); 298d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 299d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return backBuffer; 300d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 302c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer(int buf) 303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 304c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[buf]) 305d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 306d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 307c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu void *wsbmBufferObject = (void *)mBackBuffer[buf]->bufObject; 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool ret = mWsbm->destroyTTMBuffer(wsbmBufferObject); 309d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 3104157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("failed to destroy TTM buffer"); 311d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // free back buffer 313c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu free(mBackBuffer[buf]); 314c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu mBackBuffer[buf] = 0; 315d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 316d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 317c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiuvoid OverlayPlaneBase::resetBackBuffer(int buf) 318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 321c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (!mBackBuffer[buf] || !mBackBuffer[buf]->buf) 322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 324c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[buf]->buf; 325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu memset(backBuffer, 0, sizeof(OverlayBackBufferBlk)); 327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 32865efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset overlay 329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (OVERLAY_INIT_BRIGHTNESS & 0xff); 331d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 332d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY; 333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK; 334d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG = 0; 335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 3); 336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCONFIG |= (0x1 << 27); 337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN &= ~(0x7 << 24); 338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SCHRKEN |= 0xff; 339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 341ffaa9065cde35b7e8394788565db987f4d2705f2Li ZengBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper, struct VideoPayloadBuffer *payload) 342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t khandle; 344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t w, h; 345d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride, uvStride; 346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride_t stride; 347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int srcX, srcY, srcW, srcH; 348d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ssize_t index; 350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu TTMBufferMapper *mapper; 351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 352d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 3544157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid payload buffer"); 355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return 0; 356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 35811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcX = grallocMapper.getCrop().x; 35911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcY = grallocMapper.getCrop().y; 36011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcW = grallocMapper.getCrop().w; 36111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcH = grallocMapper.getCrop().h; 36211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 363d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // init ttm buffer 364d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu khandle = payload->rotated_buffer_handle; 365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu index = mTTMBuffers.indexOfKey(khandle); 366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (index < 0) { 3674157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("unmapped TTM buffer, will map it"); 368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = payload->rotated_width; 370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = payload->rotated_height; 3716b19a2416bbb375b9620025533d85b60582ed013mahongpe checkCrop(srcX, srcY, srcW, srcH, payload->coded_width, payload->coded_height); 372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 373148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi uint32_t format = grallocMapper.getFormat(); 374148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi // this is for sw decode with tiled buffer in landscape mode 375148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi if (payload->tiling) 376148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi format = OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled; 377148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi 378d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // calculate stride 379148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi switch (format) { 380b61d150a9f3124bb8ad6937ab64e29eef5a0d1e4Alistair Strachan case HAL_PIXEL_FORMAT_INTEL_YV12: 381d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: 38223921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx uint32_t yStride_align; 3834a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat()); 3844a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (yStride_align > 0) 38523921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 38623921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), yStride_align); 38723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 38823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx else 38923921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 39023921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), 64); 39123921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 392d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = align_to(yStride >> 1, 64); 393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 396eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: 397eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu yStride = align_to(align_to(w, 32), 64); 398eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu uvStride = yStride; 399eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.yStride = yStride; 400eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.uvStride = uvStride; 401eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 402d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: 4033b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: 404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = yStride; 406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: 410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: 411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to((align_to(w, 32) << 1), 64); 412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = 0; 413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 418eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer buf(khandle); 419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // update buffer 420eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setStride(stride); 421eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setWidth(w); 422eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setHeight(h); 423eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setCrop(srcX, srcY, srcW, srcH); 424148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi buf.setFormat(format); 425d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create buffer mapper 427eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool res = false; 428eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 429eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = new TTMBufferMapper(*mWsbm, buf); 430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 4314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate mapper"); 432eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 433eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 434eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // map ttm buffer 435eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ret = mapper->map(); 436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!ret) { 4374157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map"); 438c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 43924d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ret = mapper->map(); 44024d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (!ret) { 4414157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to remap"); 44224d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu break; 44324d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44424d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44524d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu 44624d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (mTTMBuffers.size() >= OVERLAY_DATA_BUFFER_COUNT) { 447c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 448eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 449d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 450eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // add mapper 451eb726af21649d79ed720bdf329e0849270995c45Andy Qiu index = mTTMBuffers.add(khandle, mapper); 452eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (index < 0) { 4534157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to add TTMMapper"); 454eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 455eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 456c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 457eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper refCount since it is added to mTTMBuffers 458eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 459eb726af21649d79ed720bdf329e0849270995c45Andy Qiu res = true; 460eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 461eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 462eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!res) { 463eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 464eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 466eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 467eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = NULL; 468eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 469eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 470d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 471d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 4724157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("got mapper in saved ttm buffers"); 473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index)); 47411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe if (mapper->getCrop().x != srcX || mapper->getCrop().y != srcY || 47511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->getCrop().w != srcW || mapper->getCrop().h != srcH) { 4766b19a2416bbb375b9620025533d85b60582ed013mahongpe checkCrop(srcX, srcY, srcW, srcH, payload->coded_width, payload->coded_height); 47711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->setCrop(srcX, srcY, srcW, srcH); 47811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 479d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 480d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 4814157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 482d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return mapper; 483d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 484d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 485d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper) 486d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 487d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) 488d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 489d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 490c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!mapper->decRef()) { 491c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 492c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->unmap(); 493c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 494c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // destroy this mapper 495c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li delete mapper; 496c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 497c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 498d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 499c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool OverlayPlaneBase::isActiveTTMBuffer(BufferMapper *mapper) 500c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 501c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 502c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *activeMapper = mActiveTTMBuffers.itemAt(i); 503c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!activeMapper) 504c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li continue; 505c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (activeMapper->getKey() == mapper->getKey()) 506c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return true; 507c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 508d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 509c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return false; 510c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 511c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 512c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::updateActiveTTMBuffers(BufferMapper *mapper) 513c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 514c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap the first entry (oldest buffer) 515c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mActiveTTMBuffers.size() >= MAX_ACTIVE_TTM_BUFFERS) { 516c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *oldest = mActiveTTMBuffers.itemAt(0); 517c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(oldest); 518c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.removeAt(0); 519c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 520c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 521c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // queue it to cached buffers 522c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!isActiveTTMBuffer(mapper)) { 523c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->incRef(); 524c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.push_back(mapper); 525c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 526c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 527c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 528c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::invalidateActiveTTMBuffers() 529c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 530c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper* mapper; 531c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 532c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 533c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 534c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 535c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper = mActiveTTMBuffers.itemAt(i); 536c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 537c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(mapper); 538c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 539c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 540c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // clear recorded data buffers 541c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.clear(); 542d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 543d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 544c90f6a1247780413b7396e72d8b095227438f51eAndy Qiuvoid OverlayPlaneBase::invalidateTTMBuffers() 545c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu{ 546c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu BufferMapper* mapper; 547c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu for (size_t i = 0; i < mTTMBuffers.size(); i++) { 548c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mapper = mTTMBuffers.valueAt(i); 549c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu // putTTMMapper removes mapper from cache 550c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu putTTMMapper(mapper); 551c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu } 552c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mTTMBuffers.clear(); 553c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu} 554c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu 555ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng 556ffaa9065cde35b7e8394788565db987f4d2705f2Li Zengbool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper) 557d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 558d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 559d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format; 560d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 561d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // only NV12_VED has rotated buffer 562d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu format = mapper.getFormat(); 5633b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 5643b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) 565d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 566d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 567d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 568d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check payload 569d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 5704157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("no payload found"); 571d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 572d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 573d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 574d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->force_output_method == FORCE_OUTPUT_GPU) 575d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 576d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 577d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->client_transform != mTransform) { 57851e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang if (payload->surface_protected) { 57951e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->hwc_timestamp = systemTime(); 58051e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->layer_transform = mTransform; 58151e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang } 5824157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("client is not ready"); 583d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 586ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng rotatedMapper = getTTMMapper(mapper, payload); 587d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 588d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 589d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 590c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 5910594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool OverlayPlaneBase::useOverlayRotation(BufferMapper& /* mapper */) 592c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{ 593c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // by default overlay plane does not support rotation. 594c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 595c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu} 596c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 597d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h) 598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 599ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley drmModeModeInfoPtr mode = &mModeInfo; 600ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 601ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley if (mode->hdisplay == 0 || mode->vdisplay == 0) 602d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 604d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (x < 0) 605d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = 0; 606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (y < 0) 607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = 0; 608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((x + w) > mode->hdisplay) 609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mode->hdisplay - x; 610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((y + h) > mode->vdisplay) 611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mode->vdisplay - y; 612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 6146b19a2416bbb375b9620025533d85b60582ed013mahongpevoid OverlayPlaneBase::checkCrop(int& srcX, int& srcY, int& srcW, int& srcH, 6156b19a2416bbb375b9620025533d85b60582ed013mahongpe int coded_width, int coded_height) 61611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe{ 61711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe int tmp; 61847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 61947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mTransform) 62047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcH >>= mBobDeinterlace; 62147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 622c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform == HWC_TRANSFORM_ROT_90 || mTransform == HWC_TRANSFORM_ROT_270) { 62311e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcH; 62411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcH = srcW; 62511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcW = tmp; 62611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 62711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcX; 62811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcX = srcY; 62911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcY = tmp; 6306b19a2416bbb375b9620025533d85b60582ed013mahongpe 6316b19a2416bbb375b9620025533d85b60582ed013mahongpe tmp = coded_width; 6326b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_width = coded_height; 6336b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_height = tmp; 63411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 63511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 63611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe // skip pading bytes in rotate buffer 63711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe switch(mTransform) { 638c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_90: 63947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcX = (coded_width >> mBobDeinterlace) - srcW - srcX; 64011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 641c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_180: 6426b19a2416bbb375b9620025533d85b60582ed013mahongpe srcX = coded_width - srcW - srcX; 64347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcY = (coded_height >> mBobDeinterlace) - srcH - srcY; 64411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 645c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_270: 6466b19a2416bbb375b9620025533d85b60582ed013mahongpe srcY = coded_height - srcH - srcY; 64711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 64811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe default: 64911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 65011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 65111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe} 65211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 65311e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 654d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 658c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 6604157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12); 666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t h = mapper.getHeight(); 669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcX= mapper.getCrop().x; 670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcY= mapper.getCrop().y; 671d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear original format setting 673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~(0xf << 10); 6743b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED; 675d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 676d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Y/U/V plane must be 4k bytes aligned. 677d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0Y = gttOffsetInBytes; 678927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu if (mIsProtectedBuffer) { 679927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // temporary workaround until vsync event logic is corrected. 680927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // it seems that overlay buffer update and renderring can be overlapped, 681927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // as such encryption bit may be cleared during HW rendering 682927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu backBuffer->OSTART_0Y |= 0x01; 683927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu } 684927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu 685d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0U = gttOffsetInBytes; 686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0V = gttOffsetInBytes; 687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1Y = backBuffer->OSTART_0Y; 689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1U = backBuffer->OSTART_0U; 690d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1V = backBuffer->OSTART_0V; 691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(format) { 693b61d150a9f3124bb8ad6937ab64e29eef5a0d1e4Alistair Strachan case HAL_PIXEL_FORMAT_INTEL_YV12: // YV12 694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = yStride * h; 696d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2)); 697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 69965efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * h; 702d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2)); 703d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 704d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 705eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 706eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0Y = 0; 7075985dd13bd4e64380aafd33ac11becbeed19e686fu jin backBuffer->OBUF_0U = yStride * h; 708eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0V = 0; 709eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 710eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 71165efc253a628175c7afa95c431b746ea20052794Andy Qiu // NOTE: this is the decoded video format, align the height to 32B 71265efc253a628175c7afa95c431b746ea20052794Andy Qiu //as it's defined by video driver 7135985dd13bd4e64380aafd33ac11becbeed19e686fu jin case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // Intel codec NV12 714d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 715d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 716d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 717d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 718d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 7193b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: //NV12_tiled 7203b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0Y = 0; 7213b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0U = yStride * align_to(h, 32); 7223b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0V = 0; 7233b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0U += yStride * align_to(h, 32); 7243b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0V += yStride * align_to(h, 32); 7253b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1U = backBuffer->OSTART_0U; 7263b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1V = backBuffer->OSTART_0V; 7273b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0Y = srcX + (srcY << 16); 7283b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1Y = backBuffer->OTILEOFF_0Y; 7293b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0U = srcX + ((srcY / 2) << 16); 7303b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1U = backBuffer->OTILEOFF_0U; 7313b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0V = backBuffer->OTILEOFF_0U; 7323b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1V = backBuffer->OTILEOFF_0U; 7333b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 7343b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED; 7353b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi break; 73665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 737d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 738d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 739d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 740d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2; 742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 74365efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 746d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY; 749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 7514157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("unsupported format %d", format); 752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y += srcY * yStride + srcX; 756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX; 757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX; 758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1Y = backBuffer->OBUF_0Y; 759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1U = backBuffer->OBUF_0U; 760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1V = backBuffer->OBUF_0V; 761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 7624157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("done. offset (%d, %d, %d)", 763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y, 764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U, 765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V); 766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width) 770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 7714157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("offset = %d, width = %d", offset, width); 772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6); 774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth <<= 1; 776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth -= 1; 777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return swidth; 779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 785c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 7874157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthy = 0; 792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthuv = 0; 793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t width = mapper.getCrop().w; 795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t height = mapper.getCrop().h; 796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsety = backBuffer->OBUF_0Y; 799d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsetu = backBuffer->OBUF_0U; 800d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 801d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (format) { 802b61d150a9f3124bb8ad6937ab64e29eef5a0d1e4Alistair Strachan case HAL_PIXEL_FORMAT_INTEL_YV12: // YV12 80365efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 804eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 80565efc253a628175c7afa95c431b746ea20052794Andy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // NV12 8063b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: // NV12_tiled 807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 80865efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 80965efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu width <<= 1; 811d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 812d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 8134157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("unsupported format %d", format); 814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (width <= 0 || height <= 0) { 8184157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid src dim"); 819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (yStride <=0 && uvStride <= 0) { 8234157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid source stride"); 824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTH = width | ((width / 2) << 16); 828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthy = calculateSWidthSW(offsety, width); 829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthuv = calculateSWidthSW(offsetu, width / 2); 830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18); 831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SHEIGHT = height | ((height / 2) << 16); 832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16); 833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8344157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8395ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize, 8405ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffPtr pCoeff, int pos) 841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 8425ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int maxVal, icoeff, res; 8435ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int sign; 8445ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double c; 8455ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8465ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sign = 0; 8475ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu maxVal = 1 << mantSize; 8485ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu c = *coeff; 8495ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (c < 0.0) { 8505ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sign = 1; 8515ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu c = -c; 8525ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 8535ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8545ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu res = 12 - mantSize; 8555ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 8565ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 3; 8575ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8585ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(4 * maxVal); 8595ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 8605ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 2; 8615ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8625ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(2 * maxVal); 8635ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 8645ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 1; 8655ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8665ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(maxVal); 8675ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 8685ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 0; 8695ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8705ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(maxVal / 2); 8715ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else { 8725ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Coeff out of range 8735ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu return false; 8745ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 8755ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8765ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].sign = sign; 8775ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sign) 8785ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = -(*coeff); 879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8825ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff, 8835ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu bool isHoriz, bool isY, 8845ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffPtr pCoeff) 885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 8865ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int i, j, j1, num, pos, mantSize; 8875ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double pi = 3.1415926535, val, sinc, window, sum; 8885ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 8895ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double diff; 8905ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int tapAdjust[MAX_TAPS], tap2Fix; 8915ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu bool isVertAndUV; 8925ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8935ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (isHoriz) 8945ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu mantSize = 7; 8955ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 8965ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu mantSize = 6; 8975ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8985ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu isVertAndUV = !isHoriz && !isY; 8995ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu num = taps * 16; 9005ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (i = 0; i < num * 2; i++) { 9015ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 9025ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (val == 0.0) 9035ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sinc = 1.0; 9045ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9055ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sinc = sin(val) / val; 9065ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9075ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Hamming window 9085ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1))); 9095ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu rawCoeff[i] = sinc * window; 9105ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9115ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9125ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (i = 0; i < N_PHASES; i++) { 9135ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Normalise the coefficients 9145ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9155ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9165ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = i + j * 32; 9175ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += rawCoeff[pos]; 9185ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9195ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9205ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = i + j * 32; 9215ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffs[i][j] = rawCoeff[pos] / sum; 9225ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9235ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9245ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Set the register values 9255ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9265ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = j + i * taps; 9275ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((j == (taps - 1) / 2) && !isVertAndUV) 9285ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 9295ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9305ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 9315ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9325ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9335ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[0] = (taps - 1) / 2; 9345ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 9355ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[j1] = tapAdjust[0] - j; 9365ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[++j1] = tapAdjust[0] + j; 9375ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9385ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9395ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Adjust the coefficients 9405ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9415ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) 9425ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += coeffs[i][j]; 9435ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sum != 1.0) { 9445ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j1 = 0; j1 < taps; j1++) { 9455ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tap2Fix = tapAdjust[j1]; 9465ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu diff = 1.0 - sum; 9475ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffs[i][tap2Fix] += diff; 9485ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = tap2Fix + i * taps; 9495ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 9505ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 9515ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9525ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 9535ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9545ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9555ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) 9565ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += coeffs[i][j]; 9575ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sum == 1.0) 9585ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu break; 9595ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9605ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9615ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper) 965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 966d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 967d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleIntUV, xscaleFractUV; 968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int yscaleIntUV, yscaleFractUV; 969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int deinterlace_factor = 1; 97065efc253a628175c7afa95c431b746ea20052794Andy Qiu // UV is half the size of Y -- YUV420 971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int uvratio = 2; 972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t newval; 973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, pos; 976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool scaleChanged = false; 977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int x, y, w, h; 978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 979c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 9814157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = mPosition.x; 986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = mPosition.y; 987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mPosition.w; 988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mPosition.h; 989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check position 991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu checkPosition(x, y, w, h); 9924157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("final position (%d, %d, %d, %d)", x, y, w, h); 993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((w <= 0) || (h <= 0)) { 9954157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid dst width/height"); 996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // setup dst position 1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINPOS = (y << 16) | x; 1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINSZ = (h << 16) | w; 1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcWidth = mapper.getCrop().w; 1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcHeight = mapper.getCrop().h; 1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstWidth = w; 1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstHeight = h; 1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 10084157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("src (%dx%d), dst (%dx%d)", 1009d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcWidth, srcHeight, 1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu dstWidth, dstHeight); 101165efc253a628175c7afa95c431b746ea20052794Andy Qiu 101265efc253a628175c7afa95c431b746ea20052794Andy Qiu // Y down-scale factor as a multiple of 4096 1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (srcWidth == dstWidth && srcHeight == dstHeight) { 1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = (1 << 12); 1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = (1 << 12)/deinterlace_factor; 1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = ((srcWidth - 1) << 12) / dstWidth; 1018d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor); 1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 102165efc253a628175c7afa95c431b746ea20052794Andy Qiu // Calculate the UV scaling factor 1022d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFractUV = xscaleFract / uvratio; 1023d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFractUV = yscaleFract / uvratio; 1024d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 102565efc253a628175c7afa95c431b746ea20052794Andy Qiu // To keep the relative Y and UV ratios exact, round the Y scales 102665efc253a628175c7afa95c431b746ea20052794Andy Qiu // to a multiple of the Y/UV ratio. 1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = xscaleFractUV * uvratio; 1028d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = yscaleFractUV * uvratio; 1029d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 103065efc253a628175c7afa95c431b746ea20052794Andy Qiu // Integer (un-multiplied) values 1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleInt = xscaleFract >> 12; 1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleInt = yscaleFract >> 12; 1033d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1034d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleIntUV = xscaleFractUV >> 12; 1035d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleIntUV = yscaleFractUV >> 12; 1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 103765efc253a628175c7afa95c431b746ea20052794Andy Qiu // Check scaling ratio 1038d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) { 10394157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1041d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 104365efc253a628175c7afa95c431b746ea20052794Andy Qiu // shouldn't get here 1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) { 10454157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleInt << 15) | 1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->YRGBSCALE) { 1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->YRGBSCALE = newval; 1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((yscaleFractUV & 0xFFF) << 20); 1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALE) { 1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALE = newval; 1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = yscaleInt << 16 | yscaleIntUV; 1064d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALEV) { 1065d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1066d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALEV = newval; 1067d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1068d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 106965efc253a628175c7afa95c431b746ea20052794Andy Qiu // Recalculate coefficients if the scaling changed 107065efc253a628175c7afa95c431b746ea20052794Andy Qiu // Only Horizontal coefficients so far. 1071d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (scaleChanged) { 1072d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffY; 1073d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffUV; 1074d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1075d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = xscaleFract / 4096.0; 1076d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = xscaleFractUV / 4096.0; 1077d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 107865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Limit to between 1.0 and 3.0 1079d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY < MIN_CUTOFF_FREQ) 1080d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MIN_CUTOFF_FREQ; 1081d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY > MAX_CUTOFF_FREQ) 1082d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MAX_CUTOFF_FREQ; 1083d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV < MIN_CUTOFF_FREQ) 1084d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MIN_CUTOFF_FREQ; 1085d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV > MAX_CUTOFF_FREQ) 1086d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MAX_CUTOFF_FREQ; 1087d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1088d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY); 1089d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV); 1090d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1091d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1092d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 1093d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_Y_TAPS + j; 1094d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->Y_HCOEFS[pos] = 1095d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffY[pos].sign << 15 | 1096d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].exponent << 12 | 1097d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].mantissa); 1098d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1099d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 1102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_UV_TAPS + j; 1103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UV_HCOEFS[pos] = 1104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffUV[pos].sign << 15 | 1105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].exponent << 12 | 1106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].mantissa); 1107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 11114157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 1112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1115965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guobool OverlayPlaneBase::colorSetup(BufferMapper& mapper) 1116965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo{ 1117965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo CTRACE(); 1118965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1119965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 1120965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (!backBuffer) { 1121965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("invalid back buffer"); 1122965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1123965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1124965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1125f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe if (mPipeConfig == (0x2 << 6)) 1126f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe return true; 1127f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe 1128965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo uint32_t format = mapper.getFormat(); 1129965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 1130965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) { 1131965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1132965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo VLOGTRACE("Not video layer, use default color setting"); 1133965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 1134965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo (OVERLAY_INIT_BRIGHTNESS & 0xff); 1135965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 1136965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG &= ~(1 << 5); 1137965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1138965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return true; 1139965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1140965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1141965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo struct VideoPayloadBuffer *payload; 1142965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 1143965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // check payload 1144965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (!payload) { 1145965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("no payload found"); 1146965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1147965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1148965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1149965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // BT.601 or BT.709 1150965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG &= ~(1 << 5); 1151965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG |= (payload->csc_mode << 5); 1152965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1153f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe if (payload->video_range) { 1154965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // full range, no need to do level expansion 1155965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = 0x1000000; 1156965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = 0x80; 1157965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } else { 1158965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // level expansion for limited range 1159965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 1160965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo (OVERLAY_INIT_BRIGHTNESS & 0xff); 1161965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 1162965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1163965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1164965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return true; 1165965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo} 1166965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1167d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper) 1168d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 1169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper *mapper; 1170c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *rotatedMapper = 0; 1171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 117247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi uint32_t format; 1173d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get gralloc mapper 1177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = &grallocMapper; 117847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format = grallocMapper.getFormat(); 117947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar || 118047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) { 118147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi struct VideoPayloadBuffer *payload; 118247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1); 118347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (!payload) { 11844157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid payload buffer"); 118547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi return 0; 118647a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 118747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 118847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mBobDeinterlace = payload->bob_deinterlace; 118947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 119047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1191c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform && !useOverlayRotation(grallocMapper)) { 1192ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedBufferReady(grallocMapper, rotatedMapper)) { 11934157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev DLOGTRACE("rotated buffer is not ready"); 1194d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1195d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1196d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1197ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedMapper) { 11984157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get rotated buffer"); 1199d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1200d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1201ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng mapper = rotatedMapper; 1202d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1203d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1204c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 1205d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 12064157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 1207d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1208d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1209d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1210d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = bufferOffsetSetup(*mapper); 1211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12124157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up buffer offsets"); 1213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1214d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = coordinateSetup(*mapper); 1217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12184157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up overlay coordinates"); 1219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1220d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1222d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = scalingSetup(*mapper); 1223d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12244157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up scaling parameters"); 1225d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1226d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1227d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 12294a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 123047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mBobDeinterlace && !mTransform) { 123147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUF_TYPE_FIELD; 123247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~FIELD_SELECT; 123347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= FIELD0; 123447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~(BUFFER_SELECT); 123547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUFFER0; 1236244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen } else { 1237244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~BUF_TYPE; 1238244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~FIELD_SELECT; 1239244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~(BUFFER_SELECT); 124047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 124147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1242965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ret = colorSetup(*mapper); 1243965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (ret == false) { 1244965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("failed to set up color parameters"); 1245965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1246965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1247965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1248c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // add to active ttm buffers if it's a rotated buffer 1249c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (rotatedMapper) { 1250c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li updateActiveTTMBuffers(mapper); 1251c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1252c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1253d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1254d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1255d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1256d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel 1257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android 1258d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1259