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) { 380530fd5114ebd3862520fa64d491730a845392320Austin Hu case HAL_PIXEL_FORMAT_YV12: 381b61d150a9f3124bb8ad6937ab64e29eef5a0d1e4Alistair Strachan case HAL_PIXEL_FORMAT_INTEL_YV12: 382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_I420: 38323921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx uint32_t yStride_align; 3844a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat()); 3854a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li if (yStride_align > 0) 38623921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 38723921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), yStride_align); 38823921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 38923921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx else 39023921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx { 39123921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx yStride = align_to(align_to(w, 32), 64); 39223921d7a334e7f84a0453dcbbf60154dc7f9c0d3lychenx } 393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = align_to(yStride >> 1, 64); 394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 397eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: 398eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu yStride = align_to(align_to(w, 32), 64); 399eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu uvStride = yStride; 400eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.yStride = yStride; 401eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu stride.yuv.uvStride = uvStride; 402eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 403d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: 4043b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: 405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to(align_to(w, 32), 64); 406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = yStride; 407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_YUY2: 411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu case HAL_PIXEL_FORMAT_UYVY: 412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yStride = align_to((align_to(w, 32) << 1), 64); 413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uvStride = 0; 414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.yStride = yStride; 415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu stride.yuv.uvStride = uvStride; 416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 419eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer buf(khandle); 420d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // update buffer 421eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setStride(stride); 422eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setWidth(w); 423eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setHeight(h); 424eb726af21649d79ed720bdf329e0849270995c45Andy Qiu buf.setCrop(srcX, srcY, srcW, srcH); 425148f6bf8c862a93abb86fdbc212ea18777284659Gu, Wangyi buf.setFormat(format); 426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // create buffer mapper 428eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bool res = false; 429eb726af21649d79ed720bdf329e0849270995c45Andy Qiu do { 430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = new TTMBufferMapper(*mWsbm, buf); 431eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!mapper) { 4324157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to allocate mapper"); 433eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 434eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 435eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // map ttm buffer 436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu ret = mapper->map(); 437eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!ret) { 4384157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map"); 439c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 44024d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu ret = mapper->map(); 44124d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (!ret) { 4424157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to remap"); 44324d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu break; 44424d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44524d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu } 44624d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu 44724d459140ef10d5d7a64e117b21f087ad7078719Andy Qiu if (mTTMBuffers.size() >= OVERLAY_DATA_BUFFER_COUNT) { 448c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu invalidateTTMBuffers(); 449eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 450d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 451eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // add mapper 452eb726af21649d79ed720bdf329e0849270995c45Andy Qiu index = mTTMBuffers.add(khandle, mapper); 453eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (index < 0) { 4544157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to add TTMMapper"); 455eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 456eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 457c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 458eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // increase mapper refCount since it is added to mTTMBuffers 459eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->incRef(); 460eb726af21649d79ed720bdf329e0849270995c45Andy Qiu res = true; 461eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } while (0); 462eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 463eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!res) { 464eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mapper) { 466eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper->unmap(); 467eb726af21649d79ed720bdf329e0849270995c45Andy Qiu delete mapper; 468eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mapper = NULL; 469eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 470eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return 0; 471d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 4734157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("got mapper in saved ttm buffers"); 474d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index)); 47511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe if (mapper->getCrop().x != srcX || mapper->getCrop().y != srcY || 47611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->getCrop().w != srcW || mapper->getCrop().h != srcH) { 4776b19a2416bbb375b9620025533d85b60582ed013mahongpe checkCrop(srcX, srcY, srcW, srcH, payload->coded_width, payload->coded_height); 47811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe mapper->setCrop(srcX, srcY, srcW, srcH); 47911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 480d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 481d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 4824157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 483d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return mapper; 484d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 485d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 486d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper) 487d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 488d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!mapper) 489d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 490d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 491c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!mapper->decRef()) { 492c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 493c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->unmap(); 494c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 495c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // destroy this mapper 496c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li delete mapper; 497c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 498c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 499d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 500c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Libool OverlayPlaneBase::isActiveTTMBuffer(BufferMapper *mapper) 501c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 502c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 503c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *activeMapper = mActiveTTMBuffers.itemAt(i); 504c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!activeMapper) 505c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li continue; 506c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (activeMapper->getKey() == mapper->getKey()) 507c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return true; 508c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 509d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 510c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li return false; 511c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 512c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 513c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::updateActiveTTMBuffers(BufferMapper *mapper) 514c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 515c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap the first entry (oldest buffer) 516c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mActiveTTMBuffers.size() >= MAX_ACTIVE_TTM_BUFFERS) { 517c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *oldest = mActiveTTMBuffers.itemAt(0); 518c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(oldest); 519c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.removeAt(0); 520c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 521c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 522c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // queue it to cached buffers 523c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (!isActiveTTMBuffer(mapper)) { 524c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper->incRef(); 525c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.push_back(mapper); 526c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 527c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li} 528c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 529c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Livoid OverlayPlaneBase::invalidateActiveTTMBuffers() 530c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li{ 531c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper* mapper; 532c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 533c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li RETURN_VOID_IF_NOT_INIT(); 534c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 535c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li for (size_t i = 0; i < mActiveTTMBuffers.size(); i++) { 536c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mapper = mActiveTTMBuffers.itemAt(i); 537c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // unmap it 538c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li putTTMMapper(mapper); 539c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 540c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 541c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // clear recorded data buffers 542c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li mActiveTTMBuffers.clear(); 543d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 544d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 545c90f6a1247780413b7396e72d8b095227438f51eAndy Qiuvoid OverlayPlaneBase::invalidateTTMBuffers() 546c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu{ 547c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu BufferMapper* mapper; 548c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu for (size_t i = 0; i < mTTMBuffers.size(); i++) { 549c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mapper = mTTMBuffers.valueAt(i); 550c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu // putTTMMapper removes mapper from cache 551c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu putTTMMapper(mapper); 552c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu } 553c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu mTTMBuffers.clear(); 554c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu} 555c90f6a1247780413b7396e72d8b095227438f51eAndy Qiu 556ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng 557ffaa9065cde35b7e8394788565db987f4d2705f2Li Zengbool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper) 558d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 559d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu struct VideoPayloadBuffer *payload; 560d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format; 561d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 562d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // only NV12_VED has rotated buffer 563d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu format = mapper.getFormat(); 5643b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 5653b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) 566d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 567d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 568d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 569d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check payload 570d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!payload) { 5714157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("no payload found"); 572d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 573d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 574d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 575d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->force_output_method == FORCE_OUTPUT_GPU) 576d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 577d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 578d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (payload->client_transform != mTransform) { 57951e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang if (payload->surface_protected) { 58051e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->hwc_timestamp = systemTime(); 58151e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang payload->layer_transform = mTransform; 58251e60f4b4281bb3de182641f9cfe63a7f99bef3bDan Liang } 5834157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("client is not ready"); 584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 586d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 587ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng rotatedMapper = getTTMMapper(mapper, payload); 588d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 589d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 590d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 591c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 5920594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudelbool OverlayPlaneBase::useOverlayRotation(BufferMapper& /* mapper */) 593c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu{ 594c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // by default overlay plane does not support rotation. 595c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu return false; 596c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu} 597c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu 598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h) 599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 600ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley drmModeModeInfoPtr mode = &mModeInfo; 601ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley 602ab302a7c5992e3668443dc9bdac481c108c20a34Lee, Stanley if (mode->hdisplay == 0 || mode->vdisplay == 0) 603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return; 604d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 605d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (x < 0) 606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = 0; 607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (y < 0) 608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = 0; 609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((x + w) > mode->hdisplay) 610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mode->hdisplay - x; 611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((y + h) > mode->vdisplay) 612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mode->vdisplay - y; 613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 6156b19a2416bbb375b9620025533d85b60582ed013mahongpevoid OverlayPlaneBase::checkCrop(int& srcX, int& srcY, int& srcW, int& srcH, 6166b19a2416bbb375b9620025533d85b60582ed013mahongpe int coded_width, int coded_height) 61711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe{ 61811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe int tmp; 61947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 62047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mTransform) 62147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcH >>= mBobDeinterlace; 62247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 623c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform == HWC_TRANSFORM_ROT_90 || mTransform == HWC_TRANSFORM_ROT_270) { 62411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcH; 62511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcH = srcW; 62611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcW = tmp; 62711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 62811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe tmp = srcX; 62911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcX = srcY; 63011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe srcY = tmp; 6316b19a2416bbb375b9620025533d85b60582ed013mahongpe 6326b19a2416bbb375b9620025533d85b60582ed013mahongpe tmp = coded_width; 6336b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_width = coded_height; 6346b19a2416bbb375b9620025533d85b60582ed013mahongpe coded_height = tmp; 63511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 63611e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 63711e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe // skip pading bytes in rotate buffer 63811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe switch(mTransform) { 639c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_90: 64047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcX = (coded_width >> mBobDeinterlace) - srcW - srcX; 64111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 642c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_180: 6436b19a2416bbb375b9620025533d85b60582ed013mahongpe srcX = coded_width - srcW - srcX; 64447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi srcY = (coded_height >> mBobDeinterlace) - srcH - srcY; 64511e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 646c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu case HWC_TRANSFORM_ROT_270: 6476b19a2416bbb375b9620025533d85b60582ed013mahongpe srcY = coded_height - srcH - srcY; 64811e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 64911e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe default: 65011e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe break; 65111e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe } 65211e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe} 65311e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 65411e7e27ecdaa5d493ff49bd1a7eab40bf4869e39mahongpe 655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 659c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 660d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 6614157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12); 667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t h = mapper.getHeight(); 670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcX= mapper.getCrop().x; 671d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcY= mapper.getCrop().y; 672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // clear original format setting 674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD &= ~(0xf << 10); 6753b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED; 676d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 677d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // Y/U/V plane must be 4k bytes aligned. 678d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0Y = gttOffsetInBytes; 679927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu if (mIsProtectedBuffer) { 680927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // temporary workaround until vsync event logic is corrected. 681927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // it seems that overlay buffer update and renderring can be overlapped, 682927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu // as such encryption bit may be cleared during HW rendering 683927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu backBuffer->OSTART_0Y |= 0x01; 684927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu } 685927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu 686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0U = gttOffsetInBytes; 687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_0V = gttOffsetInBytes; 688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1Y = backBuffer->OSTART_0Y; 690d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1U = backBuffer->OSTART_0U; 691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTART_1V = backBuffer->OSTART_0V; 692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch(format) { 694530fd5114ebd3862520fa64d491730a845392320Austin Hu case HAL_PIXEL_FORMAT_YV12: // YV12 695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 696d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = yStride * h; 697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2)); 698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 700530fd5114ebd3862520fa64d491730a845392320Austin Hu case HAL_PIXEL_FORMAT_INTEL_YV12: // INTEL_YV12 701530fd5114ebd3862520fa64d491730a845392320Austin Hu backBuffer->OBUF_0Y = 0; 702530fd5114ebd3862520fa64d491730a845392320Austin Hu backBuffer->OBUF_0V = yStride * align_to(h, 32); 703530fd5114ebd3862520fa64d491730a845392320Austin Hu backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (align_to(h, 32) / 2)); 704530fd5114ebd3862520fa64d491730a845392320Austin Hu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 705530fd5114ebd3862520fa64d491730a845392320Austin Hu break; 70665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 707d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 708d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * h; 709d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2)); 710d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420; 711d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 712eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 713eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0Y = 0; 7145985dd13bd4e64380aafd33ac11becbeed19e686fu jin backBuffer->OBUF_0U = yStride * h; 715eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OBUF_0V = 0; 716eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 717eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu break; 71865efc253a628175c7afa95c431b746ea20052794Andy Qiu // NOTE: this is the decoded video format, align the height to 32B 71965efc253a628175c7afa95c431b746ea20052794Andy Qiu //as it's defined by video driver 7205985dd13bd4e64380aafd33ac11becbeed19e686fu jin case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // Intel codec NV12 721d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 722d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = yStride * align_to(h, 32); 723d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 724d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 725d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 7263b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: //NV12_tiled 7273b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0Y = 0; 7283b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0U = yStride * align_to(h, 32); 7293b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OBUF_0V = 0; 7303b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0U += yStride * align_to(h, 32); 7313b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_0V += yStride * align_to(h, 32); 7323b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1U = backBuffer->OSTART_0U; 7333b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OSTART_1V = backBuffer->OSTART_0V; 7343b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0Y = srcX + (srcY << 16); 7353b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1Y = backBuffer->OTILEOFF_0Y; 7363b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0U = srcX + ((srcY / 2) << 16); 7373b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1U = backBuffer->OTILEOFF_0U; 7383b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_0V = backBuffer->OTILEOFF_0U; 7393b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OTILEOFF_1V = backBuffer->OTILEOFF_0U; 7403b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2; 7413b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi backBuffer->OCMD |= OVERLAY_MEMORY_LAYOUT_TILED; 7423b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi break; 74365efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 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_YUY2; 749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 75065efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y = 0; 752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U = 0; 753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V = 0; 754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422; 755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY; 756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 7584157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("unsupported format %d", format); 759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y += srcY * yStride + srcX; 763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX; 764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX; 765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1Y = backBuffer->OBUF_0Y; 766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1U = backBuffer->OBUF_0U; 767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_1V = backBuffer->OBUF_0V; 768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 7694157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("done. offset (%d, %d, %d)", 770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0Y, 771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0U, 772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OBUF_0V); 773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width) 777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 7784157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("offset = %d, width = %d", offset, width); 779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6); 781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth <<= 1; 783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidth -= 1; 784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return swidth; 786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu CTRACE(); 791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 792c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 7944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthy = 0; 799d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t swidthuv = 0; 800d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t format = mapper.getFormat(); 801d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t width = mapper.getCrop().w; 802d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t height = mapper.getCrop().h; 803d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t yStride = mapper.getStride().yuv.yStride; 804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t uvStride = mapper.getStride().yuv.uvStride; 805d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsety = backBuffer->OBUF_0Y; 806d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t offsetu = backBuffer->OBUF_0U; 807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 808d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu switch (format) { 809530fd5114ebd3862520fa64d491730a845392320Austin Hu case HAL_PIXEL_FORMAT_YV12: // YV12 810530fd5114ebd3862520fa64d491730a845392320Austin Hu case HAL_PIXEL_FORMAT_INTEL_YV12: // INTEL_YV12 81165efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_I420: // I420 812eaded89a58db5526b0fc32a4c8b267755512c216Andy Qiu case HAL_PIXEL_FORMAT_NV12: // NV12 81365efc253a628175c7afa95c431b746ea20052794Andy Qiu case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar: // NV12 8143b504f17c549162791a884dc974d0ffc2c69fa3cGu, Wangyi case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled: // NV12_tiled 815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 81665efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_YUY2: // YUY2 81765efc253a628175c7afa95c431b746ea20052794Andy Qiu case HAL_PIXEL_FORMAT_UYVY: // UYVY 818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu width <<= 1; 819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu break; 820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu default: 8214157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("unsupported format %d", format); 822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (width <= 0 || height <= 0) { 8264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid src dim"); 827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (yStride <=0 && uvStride <= 0) { 8314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid source stride"); 832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTH = width | ((width / 2) << 16); 836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthy = calculateSWidthSW(offsety, width); 837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu swidthuv = calculateSWidthSW(offsetu, width / 2); 838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18); 839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->SHEIGHT = height | ((height / 2) << 16); 840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16); 841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8424157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 843d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 844d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 845d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8475ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize, 8485ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffPtr pCoeff, int pos) 849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 8505ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int maxVal, icoeff, res; 8515ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int sign; 8525ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double c; 8535ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8545ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sign = 0; 8555ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu maxVal = 1 << mantSize; 8565ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu c = *coeff; 8575ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (c < 0.0) { 8585ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sign = 1; 8595ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu c = -c; 8605ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 8615ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8625ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu res = 12 - mantSize; 8635ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) { 8645ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 3; 8655ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8665ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(4 * maxVal); 8675ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) { 8685ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 2; 8695ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8705ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(2 * maxVal); 8715ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) { 8725ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 1; 8735ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8745ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(maxVal); 8755ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) { 8765ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].exponent = 0; 8775ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].mantissa = icoeff << res; 8785ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = (double)icoeff / (double)(maxVal / 2); 8795ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } else { 8805ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Coeff out of range 8815ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu return false; 8825ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 8835ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 8845ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pCoeff[pos].sign = sign; 8855ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sign) 8865ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu *coeff = -(*coeff); 887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 8905ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff, 8915ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu bool isHoriz, bool isY, 8925ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffPtr pCoeff) 893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 8945ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int i, j, j1, num, pos, mantSize; 8955ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double pi = 3.1415926535, val, sinc, window, sum; 8965ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS]; 8975ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu double diff; 8985ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu int tapAdjust[MAX_TAPS], tap2Fix; 8995ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu bool isVertAndUV; 9005ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9015ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (isHoriz) 9025ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu mantSize = 7; 9035ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9045ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu mantSize = 6; 9055ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9065ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu isVertAndUV = !isHoriz && !isY; 9075ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu num = taps * 16; 9085ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (i = 0; i < num * 2; i++) { 9095ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num); 9105ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (val == 0.0) 9115ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sinc = 1.0; 9125ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9135ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sinc = sin(val) / val; 9145ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9155ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Hamming window 9165ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1))); 9175ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu rawCoeff[i] = sinc * window; 9185ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9195ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9205ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (i = 0; i < N_PHASES; i++) { 9215ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Normalise the coefficients 9225ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9235ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9245ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = i + j * 32; 9255ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += rawCoeff[pos]; 9265ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9275ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9285ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = i + j * 32; 9295ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffs[i][j] = rawCoeff[pos] / sum; 9305ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9315ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9325ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Set the register values 9335ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) { 9345ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = j + i * taps; 9355ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((j == (taps - 1) / 2) && !isVertAndUV) 9365ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos); 9375ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9385ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos); 9395ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9405ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9415ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[0] = (taps - 1) / 2; 9425ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) { 9435ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[j1] = tapAdjust[0] - j; 9445ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tapAdjust[++j1] = tapAdjust[0] + j; 9455ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9465ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9475ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu // Adjust the coefficients 9485ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9495ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) 9505ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += coeffs[i][j]; 9515ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sum != 1.0) { 9525ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j1 = 0; j1 < taps; j1++) { 9535ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu tap2Fix = tapAdjust[j1]; 9545ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu diff = 1.0 - sum; 9555ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu coeffs[i][tap2Fix] += diff; 9565ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu pos = tap2Fix + i * taps; 9575ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV) 9585ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos); 9595ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu else 9605ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos); 9615ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu 9625ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum = 0.0; 9635ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu for (j = 0; j < taps; j++) 9645ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu sum += coeffs[i][j]; 9655ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu if (sum == 1.0) 9665ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu break; 9675ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9685ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 9695ac5057f9cdbbf4e14d1b0d9b3ab1a6bba44bd54Andy Qiu } 970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper) 973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleInt, xscaleFract, yscaleInt, yscaleFract; 975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int xscaleIntUV, xscaleFractUV; 976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int yscaleIntUV, yscaleFractUV; 977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int deinterlace_factor = 1; 97865efc253a628175c7afa95c431b746ea20052794Andy Qiu // UV is half the size of Y -- YUV420 979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int uvratio = 2; 980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t newval; 981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES]; 982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES]; 983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int i, j, pos; 984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool scaleChanged = false; 985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu int x, y, w, h; 986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 987c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 9894157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu x = mPosition.x; 994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu y = mPosition.y; 995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu w = mPosition.w; 996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu h = mPosition.h; 997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // check position 999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu checkPosition(x, y, w, h); 10004157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("final position (%d, %d, %d, %d)", x, y, w, h); 1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if ((w <= 0) || (h <= 0)) { 10034157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid dst width/height"); 1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // setup dst position 1008d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINPOS = (y << 16) | x; 1009d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->DWINSZ = (h << 16) | w; 1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcWidth = mapper.getCrop().w; 1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t srcHeight = mapper.getCrop().h; 1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstWidth = w; 1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu uint32_t dstHeight = h; 1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 10164157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("src (%dx%d), dst (%dx%d)", 1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu srcWidth, srcHeight, 1018d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu dstWidth, dstHeight); 101965efc253a628175c7afa95c431b746ea20052794Andy Qiu 102065efc253a628175c7afa95c431b746ea20052794Andy Qiu // Y down-scale factor as a multiple of 4096 1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (srcWidth == dstWidth && srcHeight == dstHeight) { 1022d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = (1 << 12); 1023d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = (1 << 12)/deinterlace_factor; 1024d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } else { 1025d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = ((srcWidth - 1) << 12) / dstWidth; 1026d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor); 1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1028d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 102965efc253a628175c7afa95c431b746ea20052794Andy Qiu // Calculate the UV scaling factor 1030d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFractUV = xscaleFract / uvratio; 1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFractUV = yscaleFract / uvratio; 1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 103365efc253a628175c7afa95c431b746ea20052794Andy Qiu // To keep the relative Y and UV ratios exact, round the Y scales 103465efc253a628175c7afa95c431b746ea20052794Andy Qiu // to a multiple of the Y/UV ratio. 1035d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleFract = xscaleFractUV * uvratio; 1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleFract = yscaleFractUV * uvratio; 1037d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 103865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Integer (un-multiplied) values 1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleInt = xscaleFract >> 12; 1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleInt = yscaleFract >> 12; 1041d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xscaleIntUV = xscaleFractUV >> 12; 1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu yscaleIntUV = yscaleFractUV >> 12; 1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 104565efc253a628175c7afa95c431b746ea20052794Andy Qiu // Check scaling ratio 1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) { 10474157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 105165efc253a628175c7afa95c431b746ea20052794Andy Qiu // shouldn't get here 1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) { 10534157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO); 1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleInt << 15) | 1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); 1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->YRGBSCALE) { 1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->YRGBSCALE = newval; 1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1064d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) | 1065d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ((yscaleFractUV & 0xFFF) << 20); 1066d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALE) { 1067d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1068d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALE = newval; 1069d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1070d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1071d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu newval = yscaleInt << 16 | yscaleIntUV; 1072d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (newval != backBuffer->UVSCALEV) { 1073d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu scaleChanged = true; 1074d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UVSCALEV = newval; 1075d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1076d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 107765efc253a628175c7afa95c431b746ea20052794Andy Qiu // Recalculate coefficients if the scaling changed 107865efc253a628175c7afa95c431b746ea20052794Andy Qiu // Only Horizontal coefficients so far. 1079d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (scaleChanged) { 1080d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffY; 1081d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu double fCutoffUV; 1082d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1083d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = xscaleFract / 4096.0; 1084d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = xscaleFractUV / 4096.0; 1085d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 108665efc253a628175c7afa95c431b746ea20052794Andy Qiu // Limit to between 1.0 and 3.0 1087d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY < MIN_CUTOFF_FREQ) 1088d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MIN_CUTOFF_FREQ; 1089d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffY > MAX_CUTOFF_FREQ) 1090d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffY = MAX_CUTOFF_FREQ; 1091d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV < MIN_CUTOFF_FREQ) 1092d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MIN_CUTOFF_FREQ; 1093d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (fCutoffUV > MAX_CUTOFF_FREQ) 1094d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu fCutoffUV = MAX_CUTOFF_FREQ; 1095d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1096d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY); 1097d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV); 1098d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1099d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_Y_TAPS; j++) { 1101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_Y_TAPS + j; 1102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->Y_HCOEFS[pos] = 1103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffY[pos].sign << 15 | 1104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].exponent << 12 | 1105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffY[pos].mantissa); 1106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (i = 0; i < N_PHASES; i++) { 1109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu for (j = 0; j < N_HORIZ_UV_TAPS; j++) { 1110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu pos = i * N_HORIZ_UV_TAPS + j; 1111d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->UV_HCOEFS[pos] = 1112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu (xcoeffUV[pos].sign << 15 | 1113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].exponent << 12 | 1114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu xcoeffUV[pos].mantissa); 1115d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1116d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1117d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1118d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 11194157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev XLOGTRACE(); 1120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1122d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1123965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guobool OverlayPlaneBase::colorSetup(BufferMapper& mapper) 1124965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo{ 1125965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo CTRACE(); 1126965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1127965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 1128965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (!backBuffer) { 1129965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("invalid back buffer"); 1130965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1131965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1132965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1133f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe if (mPipeConfig == (0x2 << 6)) 1134f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe return true; 1135f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe 1136965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo uint32_t format = mapper.getFormat(); 1137965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar && 1138965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) { 1139965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1140965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo VLOGTRACE("Not video layer, use default color setting"); 1141965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 1142965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo (OVERLAY_INIT_BRIGHTNESS & 0xff); 1143965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 1144965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG &= ~(1 << 5); 1145965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1146965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return true; 1147965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1148965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1149965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo struct VideoPayloadBuffer *payload; 1150965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1); 1151965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // check payload 1152965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (!payload) { 1153965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("no payload found"); 1154965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1155965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1156965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1157965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // BT.601 or BT.709 1158965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG &= ~(1 << 5); 1159965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCONFIG |= (payload->csc_mode << 5); 1160965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1161f65be044aecd54f462dd0f42b07c238fd3c4aab5mahongpe if (payload->video_range) { 1162965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // full range, no need to do level expansion 1163965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = 0x1000000; 1164965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = 0x80; 1165965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } else { 1166965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo // level expansion for limited range 1167965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) | 1168965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo (OVERLAY_INIT_BRIGHTNESS & 0xff); 1169965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION; 1170965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1171965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1172965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return true; 1173965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo} 1174965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper) 1176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{ 1177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu BufferMapper *mapper; 1178c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li BufferMapper *rotatedMapper = 0; 1179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu bool ret; 118047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi uint32_t format; 1181d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1182d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu RETURN_FALSE_IF_NOT_INIT(); 1183d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1184d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu // get gralloc mapper 1185d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu mapper = &grallocMapper; 118647a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format = grallocMapper.getFormat(); 118747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar || 118847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi format == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) { 118947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi struct VideoPayloadBuffer *payload; 119047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1); 119147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (!payload) { 11924157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid payload buffer"); 119347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi return 0; 119447a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 119547a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 119647a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi mBobDeinterlace = payload->bob_deinterlace; 119747a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 119847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1199c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu if (mTransform && !useOverlayRotation(grallocMapper)) { 1200ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedBufferReady(grallocMapper, rotatedMapper)) { 12014157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev DLOGTRACE("rotated buffer is not ready"); 1202d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1203d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1204d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1205ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng if (!rotatedMapper) { 12064157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to get rotated buffer"); 1207d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1208d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1209ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng mapper = rotatedMapper; 1210d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1212c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu OverlayBackBufferBlk *backBuffer = mBackBuffer[mCurrent]->buf; 1213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (!backBuffer) { 12144157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid back buffer"); 1215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1218d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = bufferOffsetSetup(*mapper); 1219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12204157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up buffer offsets"); 1221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1222d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1223d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1224d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = coordinateSetup(*mapper); 1225d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12264157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up overlay coordinates"); 1227d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1229d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1230d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu ret = scalingSetup(*mapper); 1231d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu if (ret == false) { 12324157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to set up scaling parameters"); 1233d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return false; 1234d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu } 1235d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1236d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu backBuffer->OCMD |= 0x1; 12374a17bd5f8632806430043ab67e10c54a1406a7a2Jackie Li 123847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi if (mBobDeinterlace && !mTransform) { 123947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUF_TYPE_FIELD; 124047a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~FIELD_SELECT; 124147a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= FIELD0; 124247a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD &= ~(BUFFER_SELECT); 124347a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi backBuffer->OCMD |= BUFFER0; 1244244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen } else { 1245244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~BUF_TYPE; 1246244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~FIELD_SELECT; 1247244c2f4bfa28df1be490dafc3a21fabd8d2c302fTianmi Chen backBuffer->OCMD &= ~(BUFFER_SELECT); 124847a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi } 124947a5b9f1fa94dd1c1f4d820658d6bfaa3dd02252Gu, Wangyi 1250965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ret = colorSetup(*mapper); 1251965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo if (ret == false) { 1252965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo ELOGTRACE("failed to set up color parameters"); 1253965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo return false; 1254965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo } 1255965bfbcf0f02fe47296ef9b2e6681d1289c73d57Nana Guo 1256c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li // add to active ttm buffers if it's a rotated buffer 1257c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li if (rotatedMapper) { 1258c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li updateActiveTTMBuffers(mapper); 1259c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li } 1260c5bd3cd6c8e854c6581105a5867e4d251b5281feJackie Li 1261d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu return true; 1262d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} 1263d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel 1265d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android 1266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu 1267