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