liboverlay: Refactor, bug-fixes, upgrade.

* Fix memory leak during copying pipe objects.
* Remove unused / unnecessary code.
* setMemoryId API is merged with queueBuffer.
* setParameter API is setTransform now.
* Rotator upgraded to:
  --Allow different rotator hardware types.
  --Remove dependency on MDP code.
  --Allocate memory only during first playback,
  close when the associated pipe is closed.
* Have single commit implementation.
* Include new format types.
* Remove WAIT and CHANNEL enums and usage. Replace BypassPipe with
  GenericPipe. Client expected to set alignments and parameters.
  Add transform combination enums.
* Allow APIs to be called in any order. Do transform calcs in commit.
  Move ext type setter and getter functions.
* Add calculations for 180 transform.
* Add secure session support in rotator
* Implement all rotations in terms of H flip, V flip and 90 rotation.

Change-Id: I34a9a2a0f1255b3467a0abbaa254d0b584e901ce
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index 09499c0..2cdd003 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -23,11 +23,11 @@
 
 namespace ovutils = overlay::utils;
 namespace overlay {
-bool MdpCtrl::open(uint32_t fbnum) {
-    // FD open
+bool MdpCtrl::init(uint32_t fbnum) {
+    // FD init
     if(!utils::openDev(mFd, fbnum,
-                Res::devTemplate, O_RDWR)){
-        ALOGE("Ctrl failed to open fbnum=%d", fbnum);
+                Res::fbPath, O_RDWR)){
+        ALOGE("Ctrl failed to init fbnum=%d", fbnum);
         return false;
     }
     return true;
@@ -36,12 +36,15 @@
 void MdpCtrl::reset() {
     utils::memset0(mOVInfo);
     utils::memset0(mLkgo);
-    mOVInfo.id = -1;
-    mLkgo.id = -1;
+    mOVInfo.id = MSMFB_NEW_REQUEST;
+    mLkgo.id = MSMFB_NEW_REQUEST;
+    mOrientation = utils::OVERLAY_TRANSFORM_0;
+    mRotUsed = false;
 }
 
 bool MdpCtrl::close() {
-    if(-1 == static_cast<int>(mOVInfo.id)) return true;
+    if(MSMFB_NEW_REQUEST == static_cast<int>(mOVInfo.id))
+        return true;
     if(!mdp_wrapper::unsetOverlay(mFd.getFD(), mOVInfo.id)) {
         ALOGE("MdpCtrl close error in unset");
         return false;
@@ -53,6 +56,86 @@
     return true;
 }
 
+bool MdpCtrl::setSource(const utils::PipeArgs& args) {
+
+    setSrcWhf(args.whf);
+
+    //TODO These are hardcoded. Can be moved out of setSource.
+    mOVInfo.alpha = 0xff;
+    mOVInfo.transp_mask = 0xffffffff;
+
+    //TODO These calls should ideally be a part of setPipeParams API
+    setFlags(args.mdpFlags);
+    setZ(args.zorder);
+    setIsFg(args.isFg);
+    return true;
+}
+
+bool MdpCtrl::setCrop(const utils::Dim& d) {
+    setSrcRectDim(d);
+    return true;
+}
+
+bool MdpCtrl::setPosition(const overlay::utils::Dim& d,
+        int fbw, int fbh)
+{
+    ovutils::Dim dim(d);
+    ovutils::Dim ovsrcdim = getSrcRectDim();
+    // Scaling of upto a max of 20 times supported
+    if(dim.w >(ovsrcdim.w * ovutils::HW_OV_MAGNIFICATION_LIMIT)){
+        dim.w = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.w;
+        dim.x = (fbw - dim.w) / 2;
+    }
+    if(dim.h >(ovsrcdim.h * ovutils::HW_OV_MAGNIFICATION_LIMIT)) {
+        dim.h = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.h;
+        dim.y = (fbh - dim.h) / 2;
+    }
+
+    setDstRectDim(dim);
+    return true;
+}
+
+bool MdpCtrl::setTransform(const utils::eTransform& orient,
+        const bool& rotUsed) {
+    mOrientation = orient;
+    int rot = utils::getMdpOrient(orient);
+    setUserData(rot);
+    //Rotator can be requested by client even if layer has 0 orientation.
+    mRotUsed = rotUsed;
+    return true;
+}
+
+void MdpCtrl::doTransform() {
+    adjustSrcWhf(mRotUsed);
+    setRotationFlags();
+    //180 will be H + V
+    //270 will be H + V + 90
+    if(mOrientation & utils::OVERLAY_TRANSFORM_FLIP_H) {
+            overlayTransFlipH();
+    }
+    if(mOrientation & utils::OVERLAY_TRANSFORM_FLIP_V) {
+            overlayTransFlipV();
+    }
+    if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90) {
+            overlayTransRot90();
+    }
+}
+
+bool MdpCtrl::set() {
+    //deferred calcs, so APIs could be called in any order.
+    doTransform();
+    if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
+        ALOGE("MdpCtrl failed to setOverlay, restoring last known "
+                "good ov info");
+        mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
+        mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
+        this->restore();
+        return false;
+    }
+    this->save();
+    return true;
+}
+
 bool MdpCtrl::getScreenInfo(overlay::utils::ScreenInfo& info) {
     fb_fix_screeninfo finfo;
     if (!mdp_wrapper::getFScreenInfo(mFd.getFD(), finfo)) {
@@ -81,193 +164,24 @@
     return true;
 }
 
-// that is the second part of original setParameter function
-void MdpCtrl::setSrcFormat(const utils::Whf& whf) {
-
-    //By default mdp src format is the same as buffer's
-    mOVInfo.src.format = whf.format;
-
-    //If rotation is used and input formats are tiled then output of rotator is
-    //non-tiled.
-    // FIXME mRotInfo.enable = 1; for enable
-    if (getUserData()) { // if rotations enabled in MdpCtrl
-        if (whf.format == MDP_Y_CRCB_H2V2_TILE)
-            mOVInfo.src.format = MDP_Y_CRCB_H2V2;
-        else if (whf.format == MDP_Y_CBCR_H2V2_TILE)
-            mOVInfo.src.format = MDP_Y_CBCR_H2V2;
-        return;
+//Adjust width, height, format if rotator is used.
+void MdpCtrl::adjustSrcWhf(const bool& rotUsed) {
+    if(rotUsed) {
+        utils::Whf whf = getSrcWhf();
+        if(whf.format == MDP_Y_CRCB_H2V2_TILE ||
+                whf.format == MDP_Y_CBCR_H2V2_TILE) {
+            whf.w = utils::alignup(whf.w, 64);
+            whf.h = utils::alignup(whf.h, 32);
+        }
+        //For example: If original format is tiled, rotator outputs non-tiled,
+        //so update mdp's src fmt to that.
+        whf.format = utils::getRotOutFmt(whf.format);
+        setSrcWhf(whf);
     }
-
-}
-
-bool MdpCtrl::set() {
-    if(!this->ovChanged()) {
-        return true; // nothing todo here.
-    }
-
-    if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
-        ALOGE("MdpCtrl failed to setOverlay, restoring last known "
-                "good ov info");
-        mdp_wrapper::dump("== Bad OVInfo is: ", mOVInfo);
-        mdp_wrapper::dump("== Last good known OVInfo is: ", mLkgo);
-        this->restore();
-        // FIXME, do we need to set the old one?
-        return false;
-    }
-    this->save();
-    return true;
-}
-
-bool MdpCtrl::setPosition(const overlay::utils::Dim& d,
-        int fbw, int fbh)
-{
-    // Validatee against FB size
-    if(!d.check(fbw, fbh)) {
-        ALOGE("MdpCtrl setPosition failed dest dim violate screen limits");
-        return false;
-    }
-
-    ovutils::Dim dim(d);
-    ovutils::Dim ovsrcdim = getSrcRectDim();
-    // Scaling of upto a max of 8 times supported
-    if(dim.w >(ovsrcdim.w * ovutils::HW_OV_MAGNIFICATION_LIMIT)){
-        dim.w = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.w;
-        dim.x = (fbw - dim.w) / 2;
-    }
-    if(dim.h >(ovsrcdim.h * ovutils::HW_OV_MAGNIFICATION_LIMIT)) {
-        dim.h = ovutils::HW_OV_MAGNIFICATION_LIMIT * ovsrcdim.h;
-        dim.y = (fbh - dim.h) / 2;
-    }
-
-    //dim.even_out();
-    setDstRectDim(dim);
-    return true;
-}
-
-void MdpCtrl::updateSource(RotatorBase* r,
-        const utils::PipeArgs& args,
-        const utils::ScreenInfo& info) {
-    utils::Whf whf(args.whf);
-    mOVInfo.src.width  = whf.w;
-    mOVInfo.src.height = whf.h;
-    mOVInfo.src_rect.x = 0;
-    mOVInfo.src_rect.y = 0;
-    mOVInfo.dst_rect.x = 0;
-    mOVInfo.dst_rect.y = 0;
-    mOVInfo.dst_rect.w = whf.w;
-    mOVInfo.dst_rect.h = whf.h;
-    mOVInfo.src.format = whf.format;
-
-    if(whf.format == MDP_Y_CRCB_H2V2_TILE ||
-        (whf.format == MDP_Y_CBCR_H2V2_TILE)) {
-        // passing by value, setInfo fills it and return by val
-        mOVInfo = r->setInfo(args, mOVInfo);
-    } else {
-        mOVInfo.src_rect.w = whf.w;
-        mOVInfo.src_rect.h = whf.h;
-    }
-
-    if (whf.w > info.mFBWidth)
-        mOVInfo.dst_rect.w = info.mFBWidth;
-    if (whf.h > info.mFBHeight)
-        mOVInfo.dst_rect.h = info.mFBHeight;
-    mSize = whf.size;
-}
-
-
-bool MdpCtrl::setInfo(RotatorBase* r,
-        const utils::PipeArgs& args,
-        const utils::ScreenInfo& info)
-{
-    // new request
-    utils::Whf whf(args.whf);
-    mOVInfo.id = MSMFB_NEW_REQUEST;
-
-    updateSource(r, args, info);
-
-    setUserData(0);
-    mOVInfo.alpha = 0xff;
-    mOVInfo.transp_mask = 0xffffffff;
-    setZ(args.zorder);
-    setFlags(args.mdpFlags);
-    setWait(args.wait);
-    setIsFg(args.isFg);
-    mSize = whf.size;
-    return true;
-}
-
-bool MdpCtrl::setCrop(const utils::Dim& cdim) {
-    utils::Dim d(cdim);
-    const utils::Whf ovwhf = getSrcWhf();
-    int udata = getUserData();
-    switch(udata) {
-        case MDP_ROT_NOP:
-            break; // nothing to do here
-        case MDP_ROT_90:
-        case MDP_ROT_90 | MDP_FLIP_UD:
-        case MDP_ROT_90 | MDP_FLIP_LR:
-            {
-                if (ovwhf.w < (d.y + d.h)) {
-                    ALOGE("MdpCtrl setCrop failed ROT 90 udata=%d",
-                            udata);
-                    d.dump();
-                    this->dump();
-                    return false;
-                }
-                uint32_t tmp = d.x;
-                d.x = ovwhf.w - (d.y + d.h);
-                d.y = tmp;
-                utils::swap(d.w, d.h);
-            }break;
-        case MDP_ROT_270:
-            {
-                if (ovwhf.h < (d.x + d.w)) {
-                    ALOGE("MdpCtrl setCrop failed ROT 270 udata=%d",
-                            udata);
-                    d.dump();
-                    this->dump();
-                    return false;
-                }
-                uint32_t tmp = d.y;
-                d.y = ovwhf.h - (d.x + d.w);
-                d.x = tmp;
-                utils::swap(d.w, d.h);
-            }break;
-        case MDP_ROT_180:
-            {
-                if ((ovwhf.h < (d.y + d.h)) ||
-                        (ovwhf.w < ( d.x + d.w))) {
-                    ALOGE("MdpCtrl setCrop failed ROT 180 udata=%d",
-                            udata);
-                    d.dump();
-                    this->dump();
-                    return false;
-                }
-                d.x = ovwhf.w - (d.x + d.w);
-                d.y = ovwhf.h - (d.y + d.h);
-            }break;
-        default:
-            if(!(udata & (MDP_FLIP_UD | MDP_FLIP_LR))) {
-                ALOGE("MdpCtrl setCrop unknown rot %d", udata);
-                return false;
-            }
-    }
-
-    if(getSrcRectDim() == d) {
-        return true; // Nothing to do here
-    }
-
-    utils::normalizeCrop(d.x, d.w);
-    utils::normalizeCrop(d.y, d.h);
-
-    setSrcRectDim(d);
-
-    return true;
 }
 
 void MdpCtrl::dump() const {
     ALOGE("== Dump MdpCtrl start ==");
-    ALOGE("size=%d", mSize);
     mFd.dump();
     mdp_wrapper::dump("mOVInfo", mOVInfo);
     ALOGE("== Dump MdpCtrl end ==");