1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Copyright (C) 2008 The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Licensed under the Apache License, Version 2.0 (the "License");
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* you may not use this file except in compliance with the License.
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* You may obtain a copy of the License at
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*      http://www.apache.org/licenses/LICENSE-2.0
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* Unless required by applicable law or agreed to in writing, software
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* distributed under the License is distributed on an "AS IS" BASIS,
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* See the License for the specific language governing permissions and
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby* limitations under the License.
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*/
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <mdp_version.h>
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayUtils.h"
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayMdp.h"
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "mdp_version.h"
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define HSIC_SETTINGS_DEBUG 0
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
25b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystatic inline bool isEqual(float f1, float f2) {
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
29b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace ovutils = overlay::utils;
30b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay {
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//Helper to even out x,w and y,h pairs
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//x,y are always evened to ceil and w,h are evened to floor
34b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystatic void normalizeCrop(uint32_t& xy, uint32_t& wh) {
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(xy & 1) {
36b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        utils::even_ceil(xy);
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(wh & 1)
38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            utils::even_floor(wh);
39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        else
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            wh -= 2;
41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    } else {
42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        utils::even_floor(wh);
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
46b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpCtrl::init(uint32_t fbnum) {
47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // FD init
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!utils::openDev(mFd, fbnum,
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                Res::fbPath, O_RDWR)){
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
56b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::reset() {
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::memset0(mOVInfo);
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::memset0(mLkgo);
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.id = MSMFB_NEW_REQUEST;
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mLkgo.id = MSMFB_NEW_REQUEST;
61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOrientation = utils::OVERLAY_TRANSFORM_0;
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mDownscale = 0;
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifdef USES_POST_PROCESSING
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mPPChanged = false;
65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    memset(&mParams, 0, sizeof(struct compute_params));
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mParams.params.conv_params.order = hsic_order_hsc_i;
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mParams.params.conv_params.interface = interface_rec601;
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mParams.params.conv_params.cc_matrix[0][0] = 1;
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mParams.params.conv_params.cc_matrix[1][1] = 1;
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mParams.params.conv_params.cc_matrix[2][2] = 1;
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
74b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpCtrl::close() {
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool result = true;
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(MSMFB_NEW_REQUEST != static_cast<int>(mOVInfo.id)) {
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) {
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("MdpCtrl close error in unset");
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            result = false;
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifdef USES_POST_PROCESSING
83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* free allocated memory in PP */
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data)
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            free(mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data);
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    reset();
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!mFd.close()) {
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        result = false;
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return result;
94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
96b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::setSource(const utils::PipeArgs& args) {
97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setSrcWhf(args.whf);
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //TODO These are hardcoded. Can be moved out of setSource.
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.transp_mask = 0xffffffff;
101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //TODO These calls should ideally be a part of setPipeParams API
103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setFlags(args.mdpFlags);
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setZ(args.zorder);
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setIsFg(args.isFg);
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setPlaneAlpha(args.planeAlpha);
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setBlending(args.blending);
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
110b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::setCrop(const utils::Dim& d) {
111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setSrcRectDim(d);
112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
114b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::setPosition(const overlay::utils::Dim& d) {
115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setDstRectDim(d);
116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
118b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::setTransform(const utils::eTransform& orient) {
119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int rot = utils::getMdpOrient(orient);
120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setUserData(rot);
121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //getMdpOrient will switch the flips if the source is 90 rotated.
122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Clients in Android dont factor in 90 rotation while deciding the flip.
123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOrientation = static_cast<utils::eTransform>(rot);
124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
126b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::doTransform() {
127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setRotationFlags();
128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::Whf whf = getSrcWhf();
129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::Dim dim = getSrcRectDim();
130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::preRotateSource(mOrientation, whf, dim);
131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setSrcWhf(whf);
132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setSrcRectDim(dim);
133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
134b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
135b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::doDownscale() {
136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.src_rect.x >>= mDownscale;
137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.src_rect.y >>= mDownscale;
138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.src_rect.w >>= mDownscale;
139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo.src_rect.h >>= mDownscale;
140b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
142b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpCtrl::set() {
143b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //deferred calcs, so APIs could be called in any order.
144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    doTransform();
145b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    doDownscale();
146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::Whf whf = getSrcWhf();
147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(utils::isYuv(whf.format)) {
148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w);
149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h);
150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        utils::even_floor(mOVInfo.dst_rect.w);
151b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        utils::even_floor(mOVInfo.dst_rect.h);
152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(this->ovChanged()) {
155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("MdpCtrl failed to setOverlay, restoring last known "
157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                  "good ov info");
158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            this->restore();
161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        this->save();
164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
169b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpCtrl::get() {
170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mdp_overlay ov;
171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ov.id = mOVInfo.id;
172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!mdp_wrapper::getOverlay(mFd.getFD(), ov)) {
173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("MdpCtrl get failed");
174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOVInfo = ov;
177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//Update src format based on rotator's destination format.
181b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::updateSrcFormat(const uint32_t& rotDestFmt) {
182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::Whf whf = getSrcWhf();
183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    whf.format =  rotDestFmt;
184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setSrcWhf(whf);
185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
187b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::dump() const {
188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpCtrl start ==");
189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFd.dump();
190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mdp_wrapper::dump("mOVInfo", mOVInfo);
191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpCtrl end ==");
192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
194b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl::getDump(char *buf, size_t len) {
195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::getDump(buf, len, "Ctrl(mdp_overlay)", mOVInfo);
196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
198b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpData::dump() const {
199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpData start ==");
200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFd.dump();
201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mdp_wrapper::dump("mOvData", mOvData);
202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpData end ==");
203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
205b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpData::getDump(char *buf, size_t len) {
206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::getDump(buf, len, "Data(msmfb_overlay_data)", mOvData);
207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
209b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpCtrl3D::dump() const {
210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpCtrl start ==");
211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFd.dump();
212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpCtrl end ==");
213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
215b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpCtrl::setVisualParams(const MetaData_t& data) {
216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool needUpdate = false;
217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifdef USES_POST_PROCESSING
218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    /* calculate the data */
219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (data.operation & PP_PARAM_HSIC) {
220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.pa_params.hue != data.hsicData.hue) {
221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGD_IF(HSIC_SETTINGS_DEBUG,
222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                "Hue has changed from %d to %d",
223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                mParams.params.pa_params.hue,data.hsicData.hue);
224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (!isEqual(mParams.params.pa_params.sat,
228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            data.hsicData.saturation)) {
229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGD_IF(HSIC_SETTINGS_DEBUG,
230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                "Saturation has changed from %f to %f",
231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                mParams.params.pa_params.sat,
232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.hsicData.saturation);
233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.pa_params.intensity != data.hsicData.intensity) {
237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGD_IF(HSIC_SETTINGS_DEBUG,
238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                "Intensity has changed from %d to %d",
239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                mParams.params.pa_params.intensity,
240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.hsicData.intensity);
241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (!isEqual(mParams.params.pa_params.contrast,
245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            data.hsicData.contrast)) {
246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGD_IF(HSIC_SETTINGS_DEBUG,
247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                "Contrast has changed from %f to %f",
248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                mParams.params.pa_params.contrast,
249b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.hsicData.contrast);
250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (needUpdate) {
254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.pa_params.hue = data.hsicData.hue;
255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.pa_params.sat = data.hsicData.saturation;
256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.pa_params.intensity = data.hsicData.intensity;
257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.pa_params.contrast = data.hsicData.contrast;
258b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.pa_params.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.operation |= PP_OP_PA;
260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (data.operation & PP_PARAM_SHARP2) {
264b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.sharp_params.strength != data.Sharp2Data.strength) {
265b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
266b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
267b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.sharp_params.edge_thr != data.Sharp2Data.edge_thr) {
268b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
269b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
270b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.sharp_params.smooth_thr !=
271b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.Sharp2Data.smooth_thr) {
272b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
273b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
274b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mParams.params.sharp_params.noise_thr !=
275b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.Sharp2Data.noise_thr) {
276b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            needUpdate = true;
277b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
278b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
279b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (needUpdate) {
280b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.sharp_params.strength = data.Sharp2Data.strength;
281b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.sharp_params.edge_thr = data.Sharp2Data.edge_thr;
282b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.sharp_params.smooth_thr =
283b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                data.Sharp2Data.smooth_thr;
284b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.sharp_params.noise_thr = data.Sharp2Data.noise_thr;
285b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.params.sharp_params.ops =
286b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
287b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mParams.operation |= PP_OP_SHARP;
288b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
289b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
290b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
291b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (data.operation & PP_PARAM_IGC) {
292b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data == NULL){
293b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            uint32_t *igcData
294b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                = (uint32_t *)malloc(2 * MAX_IGC_LUT_ENTRIES * sizeof(uint32_t));
295b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            if (!igcData) {
296b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ALOGE("IGC storage allocated failed");
297b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                return false;
298b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            }
299b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data = igcData;
300b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mOVInfo.overlay_pp_cfg.igc_cfg.c2_data
301b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                = igcData + MAX_IGC_LUT_ENTRIES;
302b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
303b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
304b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        memcpy(mParams.params.igc_lut_params.c0,
305b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            data.igcData.c0, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
306b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        memcpy(mParams.params.igc_lut_params.c1,
307b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            data.igcData.c1, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
308b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        memcpy(mParams.params.igc_lut_params.c2,
309b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            data.igcData.c2, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
310b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
311b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mParams.params.igc_lut_params.ops
312b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
313b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mParams.operation |= PP_OP_IGC;
314b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        needUpdate = true;
315b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
316b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
317b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (data.operation & PP_PARAM_VID_INTFC) {
318b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mParams.params.conv_params.interface =
319b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            (interface_type) data.video_interface;
320b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        needUpdate = true;
321b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
322b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
323b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (needUpdate) {
324b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        display_pp_compute_params(&mParams, &mOVInfo.overlay_pp_cfg);
325b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mPPChanged = true;
326b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
327b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif
328b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
329b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
330b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
331b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} // overlay
332