129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Copyright (C) 2008 The Android Open Source Project
3e33e6a894950f7d258d79bc48441575e2b0981dbRaj kamal* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Licensed under the Apache License, Version 2.0 (the "License");
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* you may not use this file except in compliance with the License.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* You may obtain a copy of the License at
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      http://www.apache.org/licenses/LICENSE-2.0
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Unless required by applicable law or agreed to in writing, software
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* distributed under the License is distributed on an "AS IS" BASIS,
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* See the License for the specific language governing permissions and
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* limitations under the License.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifndef OVERLAY_MDP_H
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define OVERLAY_MDP_H
2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <linux/msm_mdp.h>
2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h"
2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "mdpWrapper.h"
25e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#include "qdMetaData.h"
26e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING
27e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#include "lib-postproc.h"
28e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif
2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay{
3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Mdp Ctrl holds corresponding fd and MDP related struct.
3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* It is simple wrapper to MDP services
3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* */
3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpCtrl {
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic:
3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* ctor reset */
3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    explicit MdpCtrl();
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* dtor close */
4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ~MdpCtrl();
42f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* init underlying device using fbnum */
43f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool init(uint32_t fbnum);
4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* unset overlay, reset and close fd */
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool close();
46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* reset and set ov id to -1 / MSMFB_NEW_REQUEST */
4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void reset();
4836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* calls overlay set
4936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * Set would always consult last good known ov instance.
5036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * Only if it is different, set would actually exectue ioctl.
5136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * On a sucess ioctl. last good known ov instance is updated */
5236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    bool set();
5336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Sets the source total width, height, format */
5436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setSource(const utils::PipeArgs& pargs);
5536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /*
5636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * Sets ROI, the unpadded region, for source buffer.
5736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     * Dim - ROI dimensions.
5836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah     */
5936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setCrop(const utils::Dim& d);
6036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setTransform(const utils::eTransform& orient);
6136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* given a dim and w/h, set overlay dim */
6236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setPosition(const utils::Dim& dim);
6336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* using user_data, sets/unsets roationvalue in mdp flags */
6436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setRotationFlags();
6536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Performs downscale calculations */
6636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void setDownscale(int dscale_factor);
6736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Update the src format with rotator's dest*/
6836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void updateSrcFormat(const uint32_t& rotDstFormat);
6936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* dump state of the object */
7036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void dump() const;
7136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Return the dump in the specified buffer */
7236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void getDump(char *buf, size_t len);
7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* returns session id */
75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int getPipeId() const;
7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* returns the fd associated to ctrl*/
7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int getFd() const;
7836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* returns a copy ro dst rect dim */
7936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    utils::Dim getDstRectDim() const;
8036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* returns a copy to src rect dim */
8136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    utils::Dim getSrcRectDim() const;
82e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    /* setVisualParam */
83e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    bool setVisualParams(const MetaData_t& data);
84817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah    void forceSet();
8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
8636963690317abceae79621f14ba41ff62b3ff489Saurabh Shahprivate:
8736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* Perform transformation calculations */
8836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void doTransform();
8936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    void doDownscale();
9036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    /* get orient / user_data[0] */
9136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int getOrient() const;
9229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* overlay get */
9329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool get();
94f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* returns flags from mdp structure */
9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int getFlags() const;
9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set flags to mdp structure */
9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setFlags(int f);
9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set z order */
9929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setZ(utils::eZorder z);
10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set isFg flag */
10129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setIsFg(utils::eIsFg isFg);
10218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    /* return a copy of src whf*/
10329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    utils::Whf getSrcWhf() const;
10418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    /* set plane alpha */
10518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    void setPlaneAlpha(int planeAlpha);
10618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    /* set blending method */
10718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    void setBlending(overlay::utils::eBlending blending);
10818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set src whf */
11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setSrcWhf(const utils::Whf& whf);
11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set src/dst rect dim */
11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setSrcRectDim(const utils::Dim d);
11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setDstRectDim(const utils::Dim d);
11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* returns user_data[0]*/
11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int getUserData() const;
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* sets user_data[0] */
11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setUserData(int v);
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* return true if current overlay is different
119f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed     * than last known good overlay */
12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool ovChanged() const;
12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* save mOVInfo to be last known good ov*/
12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void save();
12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* restore last known good ov to be the current */
12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void restore();
12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
126f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    utils::eTransform mOrientation; //Holds requested orientation
12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* last good known ov info */
12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mdp_overlay   mLkgo;
12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* Actual overlay mdp structure */
13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mdp_overlay   mOVInfo;
13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* FD for the mdp fbnum */
13229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OvFD          mFd;
13336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    int mDownscale;
134817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah    bool mForceSet;
135817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah
136e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING
137e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    /* PP Compute Params */
138e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    struct compute_params mParams;
139e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    /* indicate if PP params have been changed */
140e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    bool mPPChanged;
141e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif
14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
14329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
14429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
14529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* MDP 3D related ctrl */
14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpCtrl3D {
14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic:
14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* ctor reset data */
14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    MdpCtrl3D();
15029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* calls MSMFB_OVERLAY_3D */
15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool close();
15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set w/h. format is ignored*/
15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setWh(const utils::Whf& whf);
15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set is_3d calls MSMFB_OVERLAY_3D */
15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool useVirtualFB();
15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set fd to be used in ioctl */
15729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void setFd(int fd);
15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* dump */
15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void dump() const;
16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedprivate:
16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* reset */
16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void reset();
16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* actual MSM 3D info */
16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    msmfb_overlay_3d m3DOVInfo;
16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* FD for the mdp 3D */
16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OvFD mFd;
16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* MDP data */
17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass MdpData {
17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic:
17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* ctor reset data */
17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    explicit MdpData();
17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* dtor close*/
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ~MdpData();
176f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    /* init FD */
177f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool init(uint32_t fbnum);
17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* memset0 the underlying mdp object */
17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void reset();
18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* close fd, and reset */
18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool close();
18229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* set id of mdp data */
183f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    void setPipeId(int id);
18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* return ses id of data */
185f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int getPipeId() const;
18629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* get underlying fd*/
18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int getFd() const;
18829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* get memory_id */
189f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int getSrcMemoryId() const;
19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* calls wrapper play */
191f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool play(int fd, uint32_t offset);
19229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* dump state of the object */
19329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    void dump() const;
194f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    /* Return the dump in the specified buffer */
195f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah    void getDump(char *buf, size_t len);
196f48c59032a351cda58b2057423b2646423acd7c7Saurabh Shah
19729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedprivate:
19829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* actual overlay mdp data */
20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    msmfb_overlay_data mOvData;
20129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* fd to mdp fbnum */
20229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OvFD mFd;
20329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
20429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
20529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//--------------Inlines---------------------------------
20629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
20729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/////   MdpCtrl  //////
20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
209f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline MdpCtrl::MdpCtrl() {
21029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    reset();
21129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
21229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpCtrl::~MdpCtrl() {
21429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    close();
21529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
21629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getOrient() const {
21829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return getUserData();
21929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
221f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpCtrl::getPipeId() const {
22229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return mOVInfo.id;
22329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getFd() const {
22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return mFd.getFD();
22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
22829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
22929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getFlags() const {
23029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return mOVInfo.flags;
23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setFlags(int f) {
23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.flags = f;
23529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
23629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setZ(overlay::utils::eZorder z) {
23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.z_order = z;
23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
24129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
24229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.is_fg = isFg;
24329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
24429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
24536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahinline void MdpCtrl::setDownscale(int dscale) {
24636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    mDownscale = dscale;
24736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}
24836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
24918bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedinline void MdpCtrl::setPlaneAlpha(int planeAlpha) {
25018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    mOVInfo.alpha = planeAlpha;
25118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed}
25218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
25318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedinline void MdpCtrl::setBlending(overlay::utils::eBlending blending) {
25418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    switch((int) blending) {
25518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case utils::OVERLAY_BLENDING_OPAQUE:
25618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        mOVInfo.blend_op = BLEND_OP_OPAQUE;
25718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        break;
25818bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case utils::OVERLAY_BLENDING_PREMULT:
25918bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        mOVInfo.blend_op = BLEND_OP_PREMULTIPLIED;
26018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        break;
26118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    case utils::OVERLAY_BLENDING_COVERAGE:
26218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    default:
26318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        mOVInfo.blend_op = BLEND_OP_COVERAGE;
26418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed    }
26518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed}
26618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed
26729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl::ovChanged() const {
268e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#ifdef USES_POST_PROCESSING
269e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    // Some pp params are stored as pointer address,
270e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    // so can't compare their content directly.
271e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    if (mPPChanged) {
272e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah        return true;
273e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah    }
274e2b94da0a7de2a5cad9ecb90ed3eee5dca219863Saurabh Shah#endif
27529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // 0 means same
27629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(0 == ::memcmp(&mOVInfo, &mLkgo, sizeof (mdp_overlay))) {
27729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
27829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
27929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
28029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
28129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
28229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::save() {
283f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(static_cast<ssize_t>(mOVInfo.id) == MSMFB_NEW_REQUEST) {
28429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("MdpCtrl current ov has id -1, will not save");
28529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return;
28629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
28729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mLkgo = mOVInfo;
28829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
28929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
29029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::restore() {
291f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(static_cast<ssize_t>(mLkgo.id) == MSMFB_NEW_REQUEST) {
29229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("MdpCtrl Lkgo ov has id -1, will not restore");
29329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return;
29429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
29529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo = mLkgo;
29629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
29729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
29829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Whf MdpCtrl::getSrcWhf() const {
299f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return utils::Whf(  mOVInfo.src.width,
300f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.src.height,
301f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.src.format);
30229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
30329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
30429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setSrcWhf(const overlay::utils::Whf& whf) {
30529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src.width  = whf.w;
30629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src.height = whf.h;
30729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src.format = whf.format;
30829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
30929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
31029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Dim MdpCtrl::getSrcRectDim() const {
311f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return utils::Dim(  mOVInfo.src_rect.x,
312f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.src_rect.y,
313f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.src_rect.w,
314f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.src_rect.h);
31529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
31629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
31729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setSrcRectDim(const overlay::utils::Dim d) {
31829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src_rect.x = d.x;
31929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src_rect.y = d.y;
32029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src_rect.w = d.w;
32129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.src_rect.h = d.h;
32229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
32329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
32429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline overlay::utils::Dim MdpCtrl::getDstRectDim() const {
325f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return utils::Dim(  mOVInfo.dst_rect.x,
326f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.dst_rect.y,
327f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.dst_rect.w,
328f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                        mOVInfo.dst_rect.h);
32929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
33029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
33129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setDstRectDim(const overlay::utils::Dim d) {
33229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.dst_rect.x = d.x;
33329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.dst_rect.y = d.y;
33429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.dst_rect.w = d.w;
33529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOVInfo.dst_rect.h = d.h;
33629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
33729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
33829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpCtrl::getUserData() const { return mOVInfo.user_data[0]; }
33929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
34029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setUserData(int v) { mOVInfo.user_data[0] = v; }
34129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
34229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl::setRotationFlags() {
34329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    const int u = getUserData();
3440dab964bf13bdd788234fc4eddd8690e6ba1ebebSaurabh Shah    if (u & MDP_ROT_90)
34529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        mOVInfo.flags |= MDP_SOURCE_ROTATED_90;
34629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
34729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
348817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shahinline void MdpCtrl::forceSet() {
349817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah    mForceSet = true;
350817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah}
351817dac3acfc9887b58a3aff61805f4c31f8c7939Saurabh Shah
35229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed///////    MdpCtrl3D //////
35329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
35429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpCtrl3D::MdpCtrl3D() { reset(); }
35529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl3D::close() {
35629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (m3DOVInfo.is_3d) {
35729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        m3DOVInfo.is_3d = 0;
35829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
35929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            ALOGE("MdpCtrl3D close failed set3D with 0");
36029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            return false;
36129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
36229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
36329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    reset();
36429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
36529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
36629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::reset() {
36729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    utils::memset0(m3DOVInfo);
36829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
36929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
37029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::setFd(int fd) {
37129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mFd.copy(fd);
37229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OVASSERT(mFd.valid(), "MdpCtrl3D setFd, FD should be valid");
37329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
37429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
37529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpCtrl3D::setWh(const utils::Whf& whf) {
37629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // ignore fmt. Needed for useVirtualFB callflow
37729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    m3DOVInfo.width = whf.w;
37829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    m3DOVInfo.height = whf.h;
37929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
38029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
38129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpCtrl3D::useVirtualFB() {
38229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!m3DOVInfo.is_3d) {
38329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        m3DOVInfo.is_3d = 1;
38429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        if(!mdp_wrapper::set3D(mFd.getFD(), m3DOVInfo)) {
38529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            ALOGE("MdpCtrl3D close failed set3D with 0");
38629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            return false;
38729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
38829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
38929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
39029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
39129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
39229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed///////    MdpData   //////
39329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
39429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpData::MdpData() { reset(); }
39529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
39629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline MdpData::~MdpData() { close(); }
39729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
398f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline bool MdpData::init(uint32_t fbnum) {
399f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    // FD init
400f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(!utils::openDev(mFd, fbnum, Res::fbPath, O_RDWR)){
401f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
40229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
40329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
40429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
40529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
40629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
40729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline void MdpData::reset() {
40829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    overlay::utils::memset0(mOvData);
40929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mOvData.data.memory_id = -1;
41029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
41129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
41229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline bool MdpData::close() {
41329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    reset();
4148e1ae95d9dd49199bba1d7343ac7ffb842ddd10bSaurabh Shah    return mFd.close();
41529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
41629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
417f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpData::getSrcMemoryId() const { return mOvData.data.memory_id; }
41829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
419f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline void MdpData::setPipeId(int id) { mOvData.id = id; }
42029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
421f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline int MdpData::getPipeId() const { return mOvData.id; }
42229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
42329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedinline int MdpData::getFd() const { return mFd.getFD(); }
42429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
425f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedinline bool MdpData::play(int fd, uint32_t offset) {
426f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mOvData.data.memory_id = fd;
427f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mOvData.data.offset = offset;
42829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(!mdp_wrapper::play(mFd.getFD(), mOvData)){
42929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("MdpData failed to play");
430f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        dump();
43129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
43229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
43329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
43429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
43529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
43629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} // overlay
43729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
43829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif // OVERLAY_MDP_H
439