1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Copyright (C) 2008 The Android Open Source Project
3fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*
5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Licensed under the Apache License, Version 2.0 (the "License");
6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* you may not use this file except in compliance with the License.
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* You may obtain a copy of the License at
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*      http://www.apache.org/licenses/LICENSE-2.0
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* Unless required by applicable law or agreed to in writing, software
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* distributed under the License is distributed on an "AS IS" BASIS,
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* See the License for the specific language governing permissions and
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed* limitations under the License.
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed*/
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
188fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah#include <math.h>
1947c130ffbafe12d6ddf6e8df4ffdd9916318c379Raj kamal#include <mdp_version.h>
20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayUtils.h"
21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "overlayMdp.h"
225d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#include "mdp_version.h"
23072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah#include <overlay.h>
24072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
255d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#define HSIC_SETTINGS_DEBUG 0
265d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
278fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils;
288fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah
295d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahstatic inline bool isEqual(float f1, float f2) {
305d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        return ((int)(f1*100) == (int)(f2*100)) ? true : false;
315d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah}
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace ovutils = overlay::utils;
34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace overlay {
3597f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah
36b4144169bc4681fe47647bc127be3da2e59e9623Saurabh Shahbool MdpCtrl::init(const int& dpy) {
37072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    int fbnum = Overlay::getFbForDpy(dpy);
38072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    if( fbnum < 0 ) {
39072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy);
40072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        return false;
41072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    }
42072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
43ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    // FD init
44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!utils::openDev(mFd, fbnum,
45ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed                Res::fbPath, O_RDWR)){
46ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed        return false;
48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
49072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    mDpy = dpy;
50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return true;
51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl::reset() {
54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    utils::memset0(mOVInfo);
55ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    mOVInfo.id = MSMFB_NEW_REQUEST;
56ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    mOrientation = utils::OVERLAY_TRANSFORM_0;
57327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    mDownscale = 0;
58072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    mDpy = 0;
595d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING
605d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    memset(&mParams, 0, sizeof(struct compute_params));
615d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mParams.params.conv_params.order = hsic_order_hsc_i;
625d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mParams.params.conv_params.interface = interface_rec601;
635d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mParams.params.conv_params.cc_matrix[0][0] = 1;
645d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mParams.params.conv_params.cc_matrix[1][1] = 1;
655d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    mParams.params.conv_params.cc_matrix[2][2] = 1;
665d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif
67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedbool MdpCtrl::close() {
70095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah    bool result = true;
71095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah    if(MSMFB_NEW_REQUEST != static_cast<int>(mOVInfo.id)) {
72095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah        if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) {
73095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah            ALOGE("MdpCtrl close error in unset");
74095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah            result = false;
75095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah        }
76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
775d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING
785d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    /* free allocated memory in PP */
795d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data)
805d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            free(mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data);
815d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif
82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    reset();
83327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah
84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    if(!mFd.close()) {
85095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah        result = false;
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    }
87095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah
88095858108ae7959f7ab29edc342988cb47adf558Saurabh Shah    return result;
89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
91327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setSource(const utils::PipeArgs& args) {
92ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setSrcWhf(args.whf);
93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
94ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    //TODO These are hardcoded. Can be moved out of setSource.
95ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    mOVInfo.transp_mask = 0xffffffff;
96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
97ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    //TODO These calls should ideally be a part of setPipeParams API
98ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setFlags(args.mdpFlags);
99ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setZ(args.zorder);
100ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setIsFg(args.isFg);
10112a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed    setPlaneAlpha(args.planeAlpha);
10212a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed    setBlending(args.blending);
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
105327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setCrop(const utils::Dim& d) {
106ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setSrcRectDim(d);
107befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
108befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
10908cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanvoid MdpCtrl::setColor(const uint32_t color) {
11008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan    mOVInfo.bg_color = color;
11108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan}
11208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan
113327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setPosition(const overlay::utils::Dim& d) {
114327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    setDstRectDim(d);
115befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
116befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
117327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::setTransform(const utils::eTransform& orient) {
118ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    int rot = utils::getMdpOrient(orient);
119ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setUserData(rot);
120835713dc4f444860a7718205ab95d9fe24adc469Saurabh Shah    mOrientation = static_cast<utils::eTransform>(rot);
1218b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan}
1228b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan
123ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid MdpCtrl::doTransform() {
124ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    setRotationFlags();
125327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    utils::Whf whf = getSrcWhf();
126327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    utils::Dim dim = getSrcRectDim();
127327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    utils::preRotateSource(mOrientation, whf, dim);
128327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    setSrcWhf(whf);
129327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    setSrcRectDim(dim);
1308b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan}
1318b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan
132327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::doDownscale() {
1338fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    int mdpVersion = MDPVersion::getInstance().getMDPVersion();
1348fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    if(mdpVersion < MDSS_V5) {
1358fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.src_rect.x >>= mDownscale;
1368fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.src_rect.y >>= mDownscale;
1378fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.src_rect.w >>= mDownscale;
1388fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.src_rect.h >>= mDownscale;
1398fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    } else if(MDPVersion::getInstance().supportsDecimation()) {
1408fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        //Decimation + MDP Downscale
1418fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.horz_deci = 0;
1428fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        mOVInfo.vert_deci = 0;
1438fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        int minHorDeci = 0;
1448fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if(mOVInfo.src_rect.w > 2048) {
1458fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            //If the client sends us something > what a layer mixer supports
1468fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            //then it means it doesn't want to use split-pipe but wants us to
1478fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            //decimate. A minimum decimation of 2 will ensure that the width is
1488fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            //always within layer mixer limits.
1498fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            minHorDeci = 2;
1508fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        }
1518fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah
152f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah        float horDscale = 0.0f;
153f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah        float verDscale = 0.0f;
154f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah
155f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah        utils::getDecimationFactor(mOVInfo.src_rect.w, mOVInfo.src_rect.h,
156f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah                mOVInfo.dst_rect.w, mOVInfo.dst_rect.h, horDscale, verDscale);
1578fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah
1588fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if(horDscale < minHorDeci)
1598fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            horDscale = minHorDeci;
1608fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah
1618fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if((int)horDscale)
1628fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            mOVInfo.horz_deci = (int)log2f(horDscale);
1638fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah
1648fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if((int)verDscale)
1658fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah            mOVInfo.vert_deci = (int)log2f(verDscale);
1668fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    }
1678b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan}
1688b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan
169ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedbool MdpCtrl::set() {
1708fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah    int mdpVersion = MDPVersion::getInstance().getMDPVersion();
171ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed    //deferred calcs, so APIs could be called in any order.
172327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    doTransform();
17397f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah    utils::Whf whf = getSrcWhf();
17497f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah    if(utils::isYuv(whf.format)) {
175e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan        utils::normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w);
176e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan        utils::normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h);
1778fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah        if(mdpVersion < MDSS_V5) {
178c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah            utils::even_floor(mOVInfo.dst_rect.w);
179c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah            utils::even_floor(mOVInfo.dst_rect.h);
180d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan        } else if (mOVInfo.flags & MDP_DEINTERLACE) {
181d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan            // For interlaced, crop.h should be 4-aligned
182d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan            if (!(mOVInfo.flags & MDP_SOURCE_ROTATED_90) &&
183d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan                (mOVInfo.src_rect.h % 4))
184d49176f4cbdb03d1ef3225bddf225293241b16a0Sushil Chauhan                mOVInfo.src_rect.h = utils::aligndown(mOVInfo.src_rect.h, 4);
18591bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N            // For interlaced, width must be multiple of 4 when rotated 90deg.
18691bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N            else if ((mOVInfo.flags & MDP_SOURCE_ROTATED_90) &&
18791bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N                (mOVInfo.src_rect.w % 4))
18891bab6c4186b0dde65ba178f41cf55d691019e4eSravan Kumar D.V.N                mOVInfo.src_rect.w = utils::aligndown(mOVInfo.src_rect.w, 4);
189c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah        }
190113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan    } else {
191113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan        if (mdpVersion >= MDSS_V5) {
192113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan            // Check for 1-pixel down-scaling
193113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan            if (mOVInfo.src_rect.w - mOVInfo.dst_rect.w == 1)
194113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan                mOVInfo.src_rect.w -= 1;
195113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan            if (mOVInfo.src_rect.h - mOVInfo.dst_rect.h == 1)
196113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan                mOVInfo.src_rect.h -= 1;
197113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan        }
19897f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah    }
19997f90b097454424374c34f4e79aaf1025eef1cd0Saurabh Shah
200113e05ecbfafafc57351734dffd22d21ca7c4ee5Sushil Chauhan    doDownscale();
201befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return true;
202befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
203befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
204327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Update src format based on rotator's destination format.
205327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid MdpCtrl::updateSrcFormat(const uint32_t& rotDestFmt) {
206e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    utils::Whf whf = getSrcWhf();
207327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah    whf.format =  rotDestFmt;
208e4dbe91c2c45ef7ad1f5106b75bd49062cf80c48Saurabh Shah    setSrcWhf(whf);
209ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}
210ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed
211befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl::dump() const {
212befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpCtrl start ==");
213befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    mFd.dump();
214befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    mdp_wrapper::dump("mOVInfo", mOVInfo);
215befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpCtrl end ==");
216befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
217befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
218a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid MdpCtrl::getDump(char *buf, size_t len) {
2194762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ovutils::getDump(buf, len, "Ctrl", mOVInfo);
220a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah}
221a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah
222befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpData::dump() const {
223befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpData start ==");
224befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    mFd.dump();
225befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    mdp_wrapper::dump("mOvData", mOvData);
226befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpData end ==");
227befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
228befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
229a22f5873a9974b00f352370e077db9788ad67699Saurabh Shahvoid MdpData::getDump(char *buf, size_t len) {
2304762db4eb027284225be9d10f08d87252612064cSaurabh Shah    ovutils::getDump(buf, len, "Data", mOvData);
231a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah}
232a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah
233befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid MdpCtrl3D::dump() const {
234befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpCtrl start ==");
235befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    mFd.dump();
236befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    ALOGE("== Dump MdpCtrl end ==");
237befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
238befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
2395d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shahbool MdpCtrl::setVisualParams(const MetaData_t& data) {
240fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R    ALOGD_IF(0, "In %s: data.operation = %d", __FUNCTION__, data.operation);
2415d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#ifdef USES_POST_PROCESSING
242fbda988d2909e2b8527098b5ffc93fa38fb0219eArun Kumar K.R    bool needUpdate = false;
2435d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    /* calculate the data */
2445d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (data.operation & PP_PARAM_HSIC) {
2455d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.pa_params.hue != data.hsicData.hue) {
2465d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            ALOGD_IF(HSIC_SETTINGS_DEBUG,
2475d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                "Hue has changed from %d to %d",
2485d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                mParams.params.pa_params.hue,data.hsicData.hue);
2495d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2505d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2515d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
2525d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (!isEqual(mParams.params.pa_params.sat,
2535d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            data.hsicData.saturation)) {
2545d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            ALOGD_IF(HSIC_SETTINGS_DEBUG,
2555d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                "Saturation has changed from %f to %f",
2565d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                mParams.params.pa_params.sat,
2575d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.hsicData.saturation);
2585d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2595d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2605d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
2615d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.pa_params.intensity != data.hsicData.intensity) {
2625d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            ALOGD_IF(HSIC_SETTINGS_DEBUG,
2635d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                "Intensity has changed from %d to %d",
2645d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                mParams.params.pa_params.intensity,
2655d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.hsicData.intensity);
2665d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2675d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2685d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
2695d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (!isEqual(mParams.params.pa_params.contrast,
2705d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            data.hsicData.contrast)) {
2715d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            ALOGD_IF(HSIC_SETTINGS_DEBUG,
2725d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                "Contrast has changed from %f to %f",
2735d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                mParams.params.pa_params.contrast,
2745d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.hsicData.contrast);
2755d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2765d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2775d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
2785d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (needUpdate) {
2795d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.pa_params.hue = data.hsicData.hue;
2805d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.pa_params.sat = data.hsicData.saturation;
2815d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.pa_params.intensity = data.hsicData.intensity;
2825d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.pa_params.contrast = data.hsicData.contrast;
2835d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.pa_params.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
2845d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.operation |= PP_OP_PA;
2855d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2865d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    }
2875d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
2885d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (data.operation & PP_PARAM_SHARP2) {
2895d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.sharp_params.strength != data.Sharp2Data.strength) {
2905d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2915d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2925d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.sharp_params.edge_thr != data.Sharp2Data.edge_thr) {
2935d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2945d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2955d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.sharp_params.smooth_thr !=
2965d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.Sharp2Data.smooth_thr) {
2975d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
2985d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
2995d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mParams.params.sharp_params.noise_thr !=
3005d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.Sharp2Data.noise_thr) {
3015d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            needUpdate = true;
3025d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
3035d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3045d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (needUpdate) {
3055d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.sharp_params.strength = data.Sharp2Data.strength;
3065d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.sharp_params.edge_thr = data.Sharp2Data.edge_thr;
3075d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.sharp_params.smooth_thr =
3085d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                data.Sharp2Data.smooth_thr;
3095d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.sharp_params.noise_thr = data.Sharp2Data.noise_thr;
3105d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.params.sharp_params.ops =
3115d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
3125d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mParams.operation |= PP_OP_SHARP;
3135d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
3145d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    }
3155d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3165d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (data.operation & PP_PARAM_IGC) {
3175d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        if (mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data == NULL){
3185d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            uint32_t *igcData
3195d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                = (uint32_t *)malloc(2 * MAX_IGC_LUT_ENTRIES * sizeof(uint32_t));
3205d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            if (!igcData) {
3215d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                ALOGE("IGC storage allocated failed");
3225d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                return false;
3235d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            }
3245d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mOVInfo.overlay_pp_cfg.igc_cfg.c0_c1_data = igcData;
3255d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            mOVInfo.overlay_pp_cfg.igc_cfg.c2_data
3265d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah                = igcData + MAX_IGC_LUT_ENTRIES;
3275d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        }
3285d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3295d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        memcpy(mParams.params.igc_lut_params.c0,
3305d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            data.igcData.c0, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
3315d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        memcpy(mParams.params.igc_lut_params.c1,
3325d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            data.igcData.c1, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
3335d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        memcpy(mParams.params.igc_lut_params.c2,
3345d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            data.igcData.c2, sizeof(uint16_t) * MAX_IGC_LUT_ENTRIES);
3355d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3365d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        mParams.params.igc_lut_params.ops
3375d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE;
3385d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        mParams.operation |= PP_OP_IGC;
3395d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        needUpdate = true;
3405d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    }
3415d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3425d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (data.operation & PP_PARAM_VID_INTFC) {
3435d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        mParams.params.conv_params.interface =
3445d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah            (interface_type) data.video_interface;
3455d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        needUpdate = true;
3465d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    }
3475d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3485d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    if (needUpdate) {
3495d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah        display_pp_compute_params(&mParams, &mOVInfo.overlay_pp_cfg);
3505d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    }
3515d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah#endif
3525d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah    return true;
3535d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah}
3545d50448ce691782fde0c26ec8247b3d5d6b2de82Saurabh Shah
3551029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool MdpCtrl::validateAndSet(MdpCtrl* mdpCtrlArray[], const int& count,
3561029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        const int& fbFd) {
3571029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    mdp_overlay* ovArray[count];
3581029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    memset(&ovArray, 0, sizeof(ovArray));
3591029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
3601029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    for(int i = 0; i < count; i++) {
3611029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        ovArray[i] = &mdpCtrlArray[i]->mOVInfo;
3621029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    }
3631029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
3641029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    struct mdp_overlay_list list;
3651029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    memset(&list, 0, sizeof(struct mdp_overlay_list));
3661029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    list.num_overlays = count;
3671029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    list.overlay_list = ovArray;
3681029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
369bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah   int (*fnProgramScale)(struct mdp_overlay_list *) =
370bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah        Overlay::getFnProgramScale();
371bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah    if(fnProgramScale) {
372bce12990928d1c2d1e250271b43f5fb10174ecfcSaurabh Shah        fnProgramScale(&list);
3731029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    }
3741029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
3751029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    if(!mdp_wrapper::validateAndSet(fbFd, list)) {
3761e4d70d866537955876c11a279498579842b8a41Jeykumar Sankaran        /* No dump for failure due to insufficient resource */
3771e4d70d866537955876c11a279498579842b8a41Jeykumar Sankaran        if(errno != E2BIG) {
3781029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah            mdp_wrapper::dump("Bad ov dump: ",
3791029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah                *list.overlay_list[list.processed_overlays]);
3801029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        }
3811029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah        return false;
3821029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    }
3831029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
3841029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah    return true;
3851029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah}
3861029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah
387072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
388072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah//// MdpData ////////////
389b4144169bc4681fe47647bc127be3da2e59e9623Saurabh Shahbool MdpData::init(const int& dpy) {
390072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    int fbnum = Overlay::getFbForDpy(dpy);
391072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    if( fbnum < 0 ) {
392072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        ALOGE("%s: Invalid FB for the display: %d",__FUNCTION__, dpy);
393072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        return false;
394072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    }
395072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
396072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    // FD init
397072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){
398072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
399072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah        return false;
400072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    }
401072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah    return true;
402072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah}
403072cc46edd38e61fd21757c4725dbcef431bef08Saurabh Shah
404befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} // overlay
405