1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (C) 2008 The Android Open Source Project
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Licensed under the Apache License, Version 2.0 (the "License");
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* you may not use this file except in compliance with the License.
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* You may obtain a copy of the License at
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      http://www.apache.org/licenses/LICENSE-2.0
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Unless required by applicable law or agreed to in writing, software
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* distributed under the License is distributed on an "AS IS" BASIS,
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* See the License for the specific language governing permissions and
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* limitations under the License.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <math.h>
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <mdp_version.h>
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayUtils.h"
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlayMdp.h"
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "mdp_version.h"
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <overlay.h>
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <dlfcn.h>
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HSIC_SETTINGS_DEBUG 0
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace qdutils;
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic inline bool isEqual(float f1, float f2) {
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace ovutils = overlay::utils;
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay {
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::init(const int& dpy) {
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int fbnum = Overlay::getFbForDpy(dpy);
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if( fbnum < 0 ) {
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy);
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // FD init
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!utils::openDev(mFd, fbnum,
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                Res::fbPath, O_RDWR)){
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mDpy = dpy;
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return true;
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::reset() {
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::memset0(mOVInfo);
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOVInfo.id = MSMFB_NEW_REQUEST;
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOrientation = utils::OVERLAY_TRANSFORM_0;
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mDpy = 0;
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    memset(&mParams, 0, sizeof(struct compute_params));
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mParams.params.conv_params.order = hsic_order_hsc_i;
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mParams.params.conv_params.interface = interface_rec601;
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mParams.params.conv_params.cc_matrix[0][0] = 1;
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mParams.params.conv_params.cc_matrix[1][1] = 1;
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mParams.params.conv_params.cc_matrix[2][2] = 1;
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::close() {
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool result = true;
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(MSMFB_NEW_REQUEST != static_cast<int>(mOVInfo.id)) {
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) {
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGE("MdpCtrl close error in unset");
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            result = false;
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* free allocated memory in PP */
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data)
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            free(mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data);
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    reset();
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!mFd.close()) {
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        result = false;
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return result;
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setSource(const utils::PipeArgs& args) {
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setSrcWhf(args.whf);
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //TODO These are hardcoded. Can be moved out of setSource.
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOVInfo.transp_mask = 0xffffffff;
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //TODO These calls should ideally be a part of setPipeParams API
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setFlags(args.mdpFlags);
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setZ(args.zorder);
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setPlaneAlpha(args.planeAlpha);
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setBlending(args.blending);
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setCrop(const utils::Dim& d) {
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setSrcRectDim(d);
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setColor(const uint32_t color) {
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOVInfo.bg_color = color;
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setPosition(const overlay::utils::Dim& d) {
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setDstRectDim(d);
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setTransform(const utils::eTransform& orient) {
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int rot = utils::getMdpOrient(orient);
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setUserData(rot);
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOrientation = static_cast<utils::eTransform>(rot);
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::setPipeType(const utils::eMdpPipeType& pType){
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    switch((int) pType){
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case utils::OV_MDP_PIPE_RGB:
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.pipe_type = PIPE_TYPE_RGB;
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case utils::OV_MDP_PIPE_VG:
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.pipe_type = PIPE_TYPE_VIG;
129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case utils::OV_MDP_PIPE_DMA:
131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.pipe_type = PIPE_TYPE_DMA;
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        default:
134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.pipe_type = PIPE_TYPE_AUTO;
135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::doTransform() {
140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setRotationFlags();
141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::Whf whf = getSrcWhf();
142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::Dim dim = getSrcRectDim();
143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::preRotateSource(mOrientation, whf, dim);
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setSrcWhf(whf);
145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setSrcRectDim(dim);
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::doDownscale() {
149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(MDPVersion::getInstance().supportsDecimation()) {
150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        utils::getDecimationFactor(mOVInfo.src_rect.w, mOVInfo.src_rect.h,
151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.dst_rect.w, mOVInfo.dst_rect.h, mOVInfo.horz_deci,
152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.vert_deci);
153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::set() {
157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mdpVersion = MDPVersion::getInstance().getMDPVersion();
158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //deferred calcs, so APIs could be called in any order.
159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    doTransform();
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::Whf whf = getSrcWhf();
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(utils::isYuv(whf.format)) {
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        utils::normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w);
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        utils::normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h);
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(mdpVersion < MDSS_V5) {
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            utils::even_floor(mOVInfo.dst_rect.w);
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            utils::even_floor(mOVInfo.dst_rect.h);
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        } else if (mOVInfo.flags & MDP_DEINTERLACE) {
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            // For interlaced, crop.h should be 4-aligned
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (!(mOVInfo.flags & MDP_SOURCE_ROTATED_90) &&
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                (mOVInfo.src_rect.h % 4))
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.src_rect.h = utils::aligndown(mOVInfo.src_rect.h, 4);
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            // For interlaced, width must be multiple of 4 when rotated 90deg.
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            else if ((mOVInfo.flags & MDP_SOURCE_ROTATED_90) &&
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                (mOVInfo.src_rect.w % 4))
175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.src_rect.w = utils::aligndown(mOVInfo.src_rect.w, 4);
176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    } else {
178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mdpVersion >= MDSS_V5) {
179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            // Check for 1-pixel down-scaling
180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (mOVInfo.src_rect.w - mOVInfo.dst_rect.w == 1)
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.src_rect.w -= 1;
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (mOVInfo.src_rect.h - mOVInfo.dst_rect.h == 1)
183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mOVInfo.src_rect.h -= 1;
184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    doDownscale();
188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return true;
189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Update src format based on rotator's destination format.
192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::updateSrcFormat(const uint32_t& rotDestFmt) {
193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    utils::Whf whf = getSrcWhf();
194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    whf.format =  rotDestFmt;
195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    setSrcWhf(whf);
196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::dump() const {
199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGE("== Dump MdpCtrl start ==");
200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mFd.dump();
201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mdp_wrapper::dump("mOVInfo", mOVInfo);
202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGE("== Dump MdpCtrl end ==");
203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpCtrl::getDump(char *buf, size_t len) {
206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ovutils::getDump(buf, len, "Ctrl", mOVInfo);
207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpData::dump() const {
210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGE("== Dump MdpData start ==");
211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mFd.dump();
212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mdp_wrapper::dump("mOvData", mOvData);
213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGE("== Dump MdpData end ==");
214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinvoid MdpData::getDump(char *buf, size_t len) {
217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ovutils::getDump(buf, len, "Data", mOvData);
218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::setVisualParams(const MetaData_t& data) {
221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ALOGD_IF(0, "In %s: data.operation = %d", __FUNCTION__, data.operation);
222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Set Color Space for MDP to configure CSC matrix
224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mOVInfo.color_space = ITU_R_601;
225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (data.operation & UPDATE_COLOR_SPACE) {
226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mOVInfo.color_space = data.colorSpace;
227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef USES_POST_PROCESSING
230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool needUpdate = false;
231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* calculate the data */
232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (data.operation & PP_PARAM_HSIC) {
233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.pa_params.hue != data.hsicData.hue) {
234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(HSIC_SETTINGS_DEBUG,
235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "Hue has changed from %d to %d",
236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mParams.params.pa_params.hue,data.hsicData.hue);
237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (!isEqual(mParams.params.pa_params.sat,
241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.hsicData.saturation)) {
242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(HSIC_SETTINGS_DEBUG,
243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "Saturation has changed from %f to %f",
244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mParams.params.pa_params.sat,
245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.hsicData.saturation);
246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.pa_params.intensity != data.hsicData.intensity) {
250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(HSIC_SETTINGS_DEBUG,
251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "Intensity has changed from %d to %d",
252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mParams.params.pa_params.intensity,
253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.hsicData.intensity);
254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (!isEqual(mParams.params.pa_params.contrast,
258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.hsicData.contrast)) {
259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGD_IF(HSIC_SETTINGS_DEBUG,
260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                "Contrast has changed from %f to %f",
261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                mParams.params.pa_params.contrast,
262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.hsicData.contrast);
263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (needUpdate) {
267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.pa_params.hue = (float)data.hsicData.hue;
268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.pa_params.sat = data.hsicData.saturation;
269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.pa_params.intensity = data.hsicData.intensity;
270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.pa_params.contrast = data.hsicData.contrast;
271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.pa_params.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.operation |= PP_OP_PA;
273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (data.operation & PP_PARAM_SHARP2) {
277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.sharp_params.strength != data.Sharp2Data.strength) {
278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.sharp_params.edge_thr != data.Sharp2Data.edge_thr) {
281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.sharp_params.smooth_thr !=
284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.Sharp2Data.smooth_thr) {
285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mParams.params.sharp_params.noise_thr !=
288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.Sharp2Data.noise_thr) {
289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            needUpdate = true;
290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (needUpdate) {
293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.sharp_params.strength = data.Sharp2Data.strength;
294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.sharp_params.edge_thr = data.Sharp2Data.edge_thr;
295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.sharp_params.smooth_thr =
296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                data.Sharp2Data.smooth_thr;
297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.sharp_params.noise_thr = data.Sharp2Data.noise_thr;
298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.params.sharp_params.ops =
299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mParams.operation |= PP_OP_SHARP;
301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (data.operation & PP_PARAM_IGC) {
305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data == NULL){
306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            uint32_t *igcData
307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                = (uint32_t *)malloc(2 * MAX_IGC_LUT_ENTRIES * sizeof(uint32_t));
308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (!igcData) {
309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                ALOGE("IGC storage allocated failed");
310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                return false;
311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data = igcData;
313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mOVInfo.overlay_pp_cfg.igc_cfg.c2_data
314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                = igcData + MAX_IGC_LUT_ENTRIES;
315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        memcpy(mParams.params.igc_lut_params.c0,
318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.igcData.c0, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        memcpy(mParams.params.igc_lut_params.c1,
320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.igcData.c1, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        memcpy(mParams.params.igc_lut_params.c2,
322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            data.igcData.c2, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mParams.params.igc_lut_params.ops
325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mParams.operation |= PP_OP_IGC;
327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        needUpdate = true;
328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (data.operation & PP_PARAM_VID_INTFC) {
331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        mParams.params.conv_params.interface =
332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            (interface_type) data.video_interface;
333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        needUpdate = true;
334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (needUpdate) {
337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        int (*sFnppParams)(const struct compute_params *,
338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                           struct mdp_overlay_pp_params *) =
339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                           Overlay::getFnPpParams();
340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(sFnppParams) {
341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin           int ret = sFnppParams(&mParams, &mOVInfo.overlay_pp_cfg);
342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin           if (ret) {
343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin             ALOGE("%s: Unable to set PP params", __FUNCTION__);
344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin           }
345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
346054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
347054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
348054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return true;
349054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpCtrl::validateAndSet(MdpCtrl* mdpCtrlArray[], const int& count,
352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        const int& fbFd) {
353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    mdp_overlay* ovArray[count];
354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    memset(&ovArray, 0, sizeof(ovArray));
355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
3568e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    uint8_t max_horz_deci = 0, max_vert_deci = 0;
3578e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R
3588e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    // Decimation factor for the left and right pipe differs, when there is a
3598e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    // one pixel difference in the dst width of right pipe and the left pipe.
3608e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    // libscalar returns a failure as it expects decimation on both the pipe
3618e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    // to be same. So compare the decimation factor on both the pipes and assign
3628e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R    // the maximum of it.
363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    for(int i = 0; i < count; i++) {
3648e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R        mdp_overlay *ov_current = &mdpCtrlArray[i]->mOVInfo;
3658e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R        for(int j = i + 1; j < count; j++) {
3668e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R            mdp_overlay *ov_next = &mdpCtrlArray[j]->mOVInfo;
3678e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R            if(ov_current->z_order == ov_next->z_order) {
3688e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                max_horz_deci = utils::max(ov_current->horz_deci,
3698e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                                           ov_next->horz_deci);
3708e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                max_vert_deci = utils::max(ov_current->vert_deci,
3718e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                                           ov_next->vert_deci);
3728e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R
3738e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                ov_current->horz_deci = max_horz_deci;
3748e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                ov_next->horz_deci = max_horz_deci;
3758e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                ov_current->vert_deci = max_vert_deci;
3768e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                ov_next->vert_deci = max_vert_deci;
3778e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R                break;
3788e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R            }
3798e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R        }
3808e7950bb8a2f06f0eaddb1e1ef3b08cb36815af0Arun Kumar K.R        ovArray[i] = ov_current;
381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    struct mdp_overlay_list list;
384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    memset(&list, 0, sizeof(struct mdp_overlay_list));
385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    list.num_overlays = count;
386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    list.overlay_list = ovArray;
387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   int (*fnProgramScale)(struct mdp_overlay_list *) =
389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        Overlay::getFnProgramScale();
390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(fnProgramScale) {
391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        fnProgramScale(&list);
392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Error value is based on file errno-base.h
395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // 0 - indicates no error.
396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int errVal = mdp_wrapper::validateAndSet(fbFd, list);
397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(errVal) {
398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        /* No dump for failure due to insufficient resource */
399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(errVal != E2BIG) {
400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            mdp_wrapper::dump("Bad ov dump: ",
401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                *list.overlay_list[list.processed_overlays]);
402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return true;
407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//// MdpData ////////////
411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinbool MdpData::init(const int& dpy) {
412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int fbnum = Overlay::getFbForDpy(dpy);
413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if( fbnum < 0 ) {
414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy);
415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // FD init
419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){
420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return false;
422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return true;
424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} // overlay
427