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