overlay: upgrade

p#1: Remove WAIT and CHANNEL enums and usage. Replace BypassPipe with
     GenericPipe. Client expected to set alignments and parameters.
     Add transform combination enums.
p#2: Allow APIs to be called in any order. Do transform calcs in commit.
     Move ext type setter and getter functions.
p#3: Add calculations for 180 transform.
p#4: Add secure session support in rotator
p#5: Implement all rotations in terms of H flip, V flip and 90 rotation.

Change-Id: I34a9a2a0f1255b3467a0abbaa254d0b584e901ce
diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp
index 8cf5b45..27384f1 100644
--- a/libgralloc/framebuffer.cpp
+++ b/libgralloc/framebuffer.cpp
@@ -277,7 +277,6 @@
             ovutils::PipeArgs parg(mdpFlags,
                                    ovutils::OVERLAY_TRANSFORM_0,
                                    whf,
-                                   ovutils::WAIT,
                                    ovutils::ZORDER_0,
                                    ovutils::IS_FG_OFF,
                                    ovutils::ROT_FLAG_ENABLED);
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 638d562..699e2ac 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -93,8 +93,6 @@
     hwc_context_t* ctx = (hwc_context_t*)(dev);
     if (LIKELY(list)) {
         VideoOverlay::draw(ctx, list);
-        //XXX: Handle vsync with FBIO_WAITFORVSYNC ioctl
-        //All other operations (including pan display) should be NOWAIT
         EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur);
     } else {
         ctx->mOverlay->setState(ovutils::OV_CLOSED);
diff --git a/libhwcomposer/hwc_video.cpp b/libhwcomposer/hwc_video.cpp
index 1edeaf3..bae35c8 100644
--- a/libhwcomposer/hwc_video.cpp
+++ b/libhwcomposer/hwc_video.cpp
@@ -107,8 +107,6 @@
                                  ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
         }
 
-        ovutils::eWait waitFlag = ovutils::NO_WAIT;
-
         ovutils::eIsFg isFgFlag = ovutils::IS_FG_OFF;
         if (ctx->numHwLayers == 1) {
             isFgFlag = ovutils::IS_FG_SET;
@@ -116,7 +114,6 @@
 
         ovutils::PipeArgs parg(mdpFlags,
                                info,
-                               waitFlag,
                                ovutils::ZORDER_0,
                                isFgFlag,
                                ovutils::ROT_FLAG_DISABLED);
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index e6bbb0a..a05a307 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -247,25 +247,15 @@
         case utils::OV_BYPASS_1_LAYER:
         case utils::OV_BYPASS_2_LAYER:
         case utils::OV_BYPASS_3_LAYER:
-            // no tweaking
             break;
         case utils::OV_3D_VIDEO_ON_3D_PANEL:
         case utils::OV_3D_VIDEO_ON_3D_TV:
-            margs[utils::CHANNEL_1].zorder = utils::ZORDER_1;
-            break;
+            //TODO set zorder for channel 1 as 1 in 3D pipe
         case utils::OV_2D_VIDEO_ON_PANEL_TV:
         case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV:
-            // If displaying on both, external VG pipe set to be no wait
-            margs[utils::CHANNEL_1].wait = utils::NO_WAIT;
             break;
         case utils::OV_2D_TRUE_UI_MIRROR:
-            // Set zorder, external VG pipe (video) gets 0, RGB pipe (UI) gets 1
-            margs[utils::CHANNEL_1].zorder = utils::ZORDER_0;
-            margs[utils::CHANNEL_2].zorder = utils::ZORDER_1;
-            // External VG (video) and RGB (UI) pipe set to be no wait
-            margs[utils::CHANNEL_0].wait = utils::WAIT;
-            margs[utils::CHANNEL_1].wait = utils::NO_WAIT;
-            margs[utils::CHANNEL_2].wait = utils::NO_WAIT;
+            // TODO Set zorder, external VG pipe (video) gets 0, RGB pipe (UI) gets 1
             break;
         default:
             OVASSERT(false, "%s Unknown state %d", __FUNCTION__, st);
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index dfcfcd5..2cdd003 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -38,6 +38,8 @@
     utils::memset0(mLkgo);
     mOVInfo.id = MSMFB_NEW_REQUEST;
     mLkgo.id = MSMFB_NEW_REQUEST;
+    mOrientation = utils::OVERLAY_TRANSFORM_0;
+    mRotUsed = false;
 }
 
 bool MdpCtrl::close() {
@@ -54,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)) {
@@ -98,123 +180,6 @@
     }
 }
 
-bool MdpCtrl::set() {
-    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::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);
-    setWait(args.wait);
-    setIsFg(args.isFg);
-    return true;
-}
-
-bool MdpCtrl::setCrop(const utils::Dim& d) {
-    setSrcRectDim(d);
-    return true;
-}
-
-bool MdpCtrl::setTransform(const utils::eTransform& orient,
-        const bool& rotUsed) {
-
-    int rot = utils::getMdpOrient(orient);
-    setUserData(rot);
-    adjustSrcWhf(rotUsed);
-    setRotationFlags();
-
-    switch(static_cast<int>(orient)) {
-        case utils::OVERLAY_TRANSFORM_0:
-        case utils::OVERLAY_TRANSFORM_FLIP_H:
-        case utils::OVERLAY_TRANSFORM_FLIP_V:
-        case utils::OVERLAY_TRANSFORM_ROT_180:
-            //No calculations required
-            break;
-        case utils::OVERLAY_TRANSFORM_ROT_90:
-        case (utils::OVERLAY_TRANSFORM_ROT_90|utils::OVERLAY_TRANSFORM_FLIP_H):
-        case (utils::OVERLAY_TRANSFORM_ROT_90|utils::OVERLAY_TRANSFORM_FLIP_V):
-            overlayTransFlipRot90();
-            break;
-        case utils::OVERLAY_TRANSFORM_ROT_270:
-            overlayTransFlipRot270();
-            break;
-        default:
-            ALOGE("%s: Error due to unknown rot value", __FUNCTION__);
-            return false;
-    }
-    return true;
-}
-
-void MdpCtrl::overlayTransFlipRot90()
-{
-    utils::Dim d   = getSrcRectDim();
-    utils::Whf whf = getSrcWhf();
-    int tmp = d.x;
-    d.x = compute(whf.h,
-            d.y,
-            d.h);
-    d.y = tmp;
-    setSrcRectDim(d);
-    swapSrcWH();
-    swapSrcRectWH();
-}
-
-void MdpCtrl::overlayTransFlipRot270()
-{
-    utils::Dim d   = getSrcRectDim();
-    utils::Whf whf = getSrcWhf();
-    int tmp = d.y;
-    d.y = compute(whf.w,
-            d.x,
-            d.w);
-    d.x = tmp;
-    setSrcRectDim(d);
-    swapSrcWH();
-    swapSrcRectWH();
-}
-
-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 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;
-}
-
 void MdpCtrl::dump() const {
     ALOGE("== Dump MdpCtrl start ==");
     mFd.dump();
diff --git a/liboverlay/overlayMdp.h b/liboverlay/overlayMdp.h
index b8c173f..30bda79 100644
--- a/liboverlay/overlayMdp.h
+++ b/liboverlay/overlayMdp.h
@@ -61,8 +61,7 @@
     /* overlay get */
     bool get();
 
-    /* returns flags from mdp structure.
-     * Flags are WAIT/NOWAIT/PIPE SHARED*/
+    /* returns flags from mdp structure */
     int getFlags() const;
 
     /* set flags to mdp structure */
@@ -71,9 +70,6 @@
     /* set z order */
     void setZ(utils::eZorder z);
 
-    /* set Wait/nowait */
-    void setWait(utils::eWait wait);
-
     /* set isFg flag */
     void setIsFg(utils::eIsFg isFg);
 
@@ -148,8 +144,14 @@
 private:
 
     /* helper functions for overlayTransform */
-    void overlayTransFlipRot90();
-    void overlayTransFlipRot270();
+    void doTransform();
+    void overlayTransFlipH();
+    void overlayTransFlipV();
+    void overlayTransRot90();
+
+    utils::eTransform mOrientation; //Holds requested orientation
+    bool mRotUsed; //whether rotator should be used even if requested
+                   //orientation is 0.
 
     /* last good known ov info */
     mdp_overlay   mLkgo;
@@ -282,10 +284,6 @@
     mOVInfo.z_order = z;
 }
 
-inline void MdpCtrl::setWait(overlay::utils::eWait wait) {
-    mOVInfo.flags = utils::setWait(wait, mOVInfo.flags);
-}
-
 inline void MdpCtrl::setIsFg(overlay::utils::eIsFg isFg) {
     mOVInfo.is_fg = isFg;
 }
@@ -376,6 +374,37 @@
             mOVInfo.src_rect.h);
 }
 
+inline void MdpCtrl::overlayTransFlipH()
+{
+    utils::Dim d   = getSrcRectDim();
+    utils::Whf whf = getSrcWhf();
+    d.x = compute(whf.w, d.x, d.w);
+    setSrcRectDim(d);
+}
+
+inline void MdpCtrl::overlayTransFlipV()
+{
+    utils::Dim d   = getSrcRectDim();
+    utils::Whf whf = getSrcWhf();
+    d.y = compute(whf.h, d.y, d.h);
+    setSrcRectDim(d);
+}
+
+inline void MdpCtrl::overlayTransRot90()
+{
+    utils::Dim d   = getSrcRectDim();
+    utils::Whf whf = getSrcWhf();
+    int tmp = d.x;
+    d.x = compute(whf.h,
+            d.y,
+            d.h);
+    d.y = tmp;
+    setSrcRectDim(d);
+    swapSrcWH();
+    swapSrcRectWH();
+}
+
+
 ///////    MdpCtrl3D //////
 
 inline MdpCtrl3D::MdpCtrl3D() { reset(); }
diff --git a/liboverlay/overlayMem.h b/liboverlay/overlayMem.h
index c1cd165..d206136 100644
--- a/liboverlay/overlayMem.h
+++ b/liboverlay/overlayMem.h
@@ -54,7 +54,7 @@
 
     /* Use libgralloc to retrieve fd, base addr, alloc type */
     bool open(uint32_t numbufs,
-            uint32_t bufSz, int flags = O_RDWR);
+            uint32_t bufSz, bool isSecure);
 
     /* close fd. assign base address to invalid*/
     bool close();
@@ -115,12 +115,16 @@
 inline OvMem::~OvMem() { }
 
 inline bool OvMem::open(uint32_t numbufs,
-        uint32_t bufSz, int flags)
+        uint32_t bufSz, bool isSecure)
 {
     alloc_data data;
     int allocFlags = GRALLOC_USAGE_PRIVATE_IOMMU_HEAP;
-    int err = 0;
+    if(isSecure) {
+        allocFlags |= GRALLOC_USAGE_PRIVATE_MM_HEAP;
+        allocFlags |= GRALLOC_USAGE_PRIVATE_DO_NOT_MAP;
+    }
 
+    int err = 0;
     OVASSERT(numbufs && bufSz, "numbufs=%d bufSz=%d", numbufs, bufSz);
 
     mBufSz = bufSz;
diff --git a/liboverlay/overlayRotator.cpp b/liboverlay/overlayRotator.cpp
index 38f5807..306e28f 100644
--- a/liboverlay/overlayRotator.cpp
+++ b/liboverlay/overlayRotator.cpp
@@ -17,7 +17,6 @@
 
 #include "overlayRotator.h"
 #include "overlayUtils.h"
-#include "overlayMdp.h"
 
 namespace ovutils = overlay::utils;
 
@@ -73,19 +72,29 @@
     mBufSize = awhf.size;
 }
 
+void MdpRot::setFlags(const utils::eMdpFlags& flags) {
+    mRotImgInfo.secure = 0;
+    if(flags & utils::OV_MDP_SECURE_OVERLAY_SESSION)
+        mRotImgInfo.secure = 1;
+}
+
 void MdpRot::setTransform(const utils::eTransform& rot, const bool& rotUsed)
 {
+    mOrientation = rot;
     int r = utils::getMdpOrient(rot);
     ALOGE_IF(DEBUG_OVERLAY, "%s: r=%d", __FUNCTION__, r);
-    this->setRotations(r);
-    this->setDisable();
+    setRotations(r);
+    setDisable();
     if(rotUsed) {
-        this->setEnable();
+        setEnable();
     }
-    switch(static_cast<int>(rot)) {
+}
+
+void MdpRot::doTransform() {
+    switch(mOrientation) {
         case utils::OVERLAY_TRANSFORM_ROT_90:
-        case (utils::OVERLAY_TRANSFORM_ROT_90|utils::OVERLAY_TRANSFORM_FLIP_H):
-        case (utils::OVERLAY_TRANSFORM_ROT_90|utils::OVERLAY_TRANSFORM_FLIP_V):
+        case utils::OVERLAY_TRANSFORM_ROT_90_FLIP_H:
+        case utils::OVERLAY_TRANSFORM_ROT_90_FLIP_V:
         case utils::OVERLAY_TRANSFORM_ROT_270:
             utils::swap(mRotImgInfo.dst.width, mRotImgInfo.dst.height);
             break;
@@ -95,6 +104,7 @@
 }
 
 bool MdpRot::commit() {
+    doTransform();
     if(!overlay::mdp_wrapper::startRotator(mFd.getFD(), mRotImgInfo)) {
         ALOGE("MdpRot commit failed");
         dump();
@@ -110,7 +120,7 @@
 
     OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i");
 
-    if(!mem.open(numbufs, bufsz)){
+    if(!mem.open(numbufs, bufsz, mRotImgInfo.secure)){
         ALOGE("%s: Failed to open", __func__);
         mem.close();
         return false;
@@ -176,6 +186,7 @@
     mMem.curr().mCurrOffset = 0;
     mMem.prev().mCurrOffset = 0;
     mBufSize = 0;
+    mOrientation = utils::OVERLAY_TRANSFORM_0;
 }
 
 bool MdpRot::queueBuffer(int fd, uint32_t offset) {
diff --git a/liboverlay/overlayRotator.h b/liboverlay/overlayRotator.h
index b952902..153fb2c 100644
--- a/liboverlay/overlayRotator.h
+++ b/liboverlay/overlayRotator.h
@@ -50,6 +50,7 @@
     virtual bool init() = 0;
     virtual bool close() = 0;
     virtual void setSource(const utils::Whf& wfh) = 0;
+    virtual void setFlags(const utils::eMdpFlags& flags) = 0;
     virtual void setTransform(const utils::eTransform& rot,
             const bool& rotUsed) = 0;
     virtual bool commit() = 0;
@@ -58,7 +59,7 @@
     virtual void setEnable() = 0;
     virtual void setDisable() = 0;
     virtual void setRotations(uint32_t r) = 0;
-    virtual void setSrcFB(bool) = 0;
+    virtual void setSrcFB() = 0;
 
     virtual bool enabled() const = 0;
     virtual int getSessId() const = 0;
@@ -85,6 +86,8 @@
     virtual bool close() = 0;
     /* set src */
     virtual void setSource(const utils::Whf& wfh) = 0;
+    /* set mdp flags, will use only stuff necessary for rotator */
+    virtual void setFlags(const utils::eMdpFlags& flags) = 0;
     /* Set rotation and calculate */
     virtual void setTransform(const utils::eTransform& rot,
             const bool& rotUsed) = 0;
@@ -98,7 +101,7 @@
     /* set rotator flag*/
     virtual void setRotations(uint32_t r) = 0;
     /* Mark src as FB (non-ION) */
-    virtual void setSrcFB(bool) = 0;
+    virtual void setSrcFB() = 0;
     /* Retusn true if rotator enabled */
     virtual bool enabled() const = 0;
     /* returns rotator session id */
@@ -125,11 +128,12 @@
     virtual bool init();
     virtual bool close();
     virtual void setSource(const utils::Whf& wfh);
+    virtual void setFlags(const utils::eMdpFlags& flags);
     virtual void setTransform(const utils::eTransform& rot,
             const bool& rotUsed);
     virtual bool commit();
     virtual void setRotations(uint32_t r);
-    virtual void setSrcFB(bool);
+    virtual void setSrcFB();
     virtual int getDstMemId() const;
     virtual uint32_t getDstOffset() const;
     virtual void setEnable();
@@ -150,6 +154,7 @@
     virtual bool init();
     virtual bool close();
     virtual void setSource(const utils::Whf& wfh);
+    virtual void setFlags(const utils::eMdpFlags& flags);
     virtual void setTransform(const utils::eTransform& rot,
             const bool& rotUsed);
     virtual bool commit();
@@ -158,7 +163,7 @@
     virtual void setEnable();
     virtual void setDisable();
     virtual bool enabled () const;
-    virtual void setSrcFB(bool);
+    virtual void setSrcFB();
     virtual int getSessId() const;
     virtual int getDstMemId() const;
     virtual uint32_t getDstOffset() const;
@@ -211,6 +216,7 @@
     bool init();
     bool close();
     void setSource(const utils::Whf& whf);
+    virtual void setFlags(const utils::eMdpFlags& flags);
     void setTransform(const utils::eTransform& rot,
             const bool& rotUsed);
     bool commit();
@@ -218,7 +224,7 @@
     void setEnable();
     void setDisable();
     void setRotations(uint32_t r);
-    void setSrcFB(bool);
+    void setSrcFB();
     bool enabled() const;
     int getSessId() const;
     int getDstMemId() const;
@@ -229,6 +235,8 @@
     /* remap rot buffers */
     bool remap(uint32_t numbufs);
     bool open_i(uint32_t numbufs, uint32_t bufsz);
+    /* Deferred transform calculations */
+    void doTransform();
     /* reset underlying data, basically memset 0 */
     void reset();
 
@@ -236,6 +244,8 @@
     msm_rotator_img_info mRotImgInfo;
     /* rot data */
     msm_rotator_data_info mRotDataInfo;
+    /* Orientation */
+    utils::eTransform mOrientation;
     /* rotator fd */
     OvFD mFd;
     /* Rotator memory manager */
@@ -274,6 +284,9 @@
 inline void Rotator::setSource(const utils::Whf& whf) {
     mRot->setSource(whf);
 }
+inline void Rotator::setFlags(const utils::eMdpFlags& flags) {
+    mRot->setFlags(flags);
+}
 inline void Rotator::setTransform(const utils::eTransform& rot,
         const bool& rotUsed)
 {
@@ -285,7 +298,7 @@
 inline void Rotator::setEnable(){ mRot->setEnable(); }
 inline void Rotator::setDisable(){ mRot->setDisable(); }
 inline bool Rotator::enabled() const { return mRot->enabled(); }
-inline void Rotator::setSrcFB(bool mark) { mRot->setSrcFB(mark); }
+inline void Rotator::setSrcFB() { mRot->setSrcFB(); }
 inline int Rotator::getDstMemId() const {
     return mRot->getDstMemId();
 }
@@ -314,6 +327,7 @@
 inline bool NullRotator::close() { return true; }
 inline bool NullRotator::commit() { return true; }
 inline void NullRotator::setSource(const utils::Whf& wfh) {}
+inline void NullRotator::setFlags(const utils::eMdpFlags& flags) {}
 inline void NullRotator::setTransform(const utils::eTransform& rot, const bool&)
 {}
 inline void NullRotator::setRotations(uint32_t) {}
@@ -322,7 +336,7 @@
 inline bool NullRotator::enabled() const { return false; }
 inline int NullRotator::getSessId() const { return -1; }
 inline bool NullRotator::queueBuffer(int fd, uint32_t offset) { return true; }
-inline void NullRotator::setSrcFB(bool) {}
+inline void NullRotator::setSrcFB() {}
 inline int NullRotator::getDstMemId() const { return -1; }
 inline uint32_t NullRotator::getDstOffset() const { return 0;}
 inline void NullRotator::dump() const {
@@ -344,12 +358,10 @@
     return mRotDataInfo.dst.offset;
 }
 inline int MdpRot::getSessId() const { return mRotImgInfo.session_id; }
-inline void MdpRot::setSrcFB(bool set) {
-    if(set)
-        mRotDataInfo.src.flags |= MDP_MEMORY_ID_TYPE_FB;
+inline void MdpRot::setSrcFB() {
+    mRotDataInfo.src.flags |= MDP_MEMORY_ID_TYPE_FB;
 }
 
-
 } // overlay
 
 #endif // OVERlAY_ROTATOR_H
diff --git a/liboverlay/overlayState.h b/liboverlay/overlayState.h
index afa59b5..ea6860f 100644
--- a/liboverlay/overlayState.h
+++ b/liboverlay/overlayState.h
@@ -34,7 +34,6 @@
 #include "overlayImpl.h"
 #include "overlayRotator.h"
 #include "pipes/overlayGenPipe.h"
-#include "pipes/overlayBypassPipe.h"
 #include "pipes/overlayVideoExtPipe.h"
 #include "pipes/overlayUIMirrorPipe.h"
 #include "pipes/overlay3DPipe.h"
@@ -238,7 +237,7 @@
 
 template <> struct StateTraits<utils::OV_BYPASS_1_LAYER>
 {
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_VG, utils::IS_FG_SET, utils::WAIT, utils::ZORDER_0> pipe0;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
     typedef overlay::NullPipe pipe1;   // place holder
     typedef overlay::NullPipe pipe2;   // place holder
 
@@ -251,8 +250,8 @@
 
 template <> struct StateTraits<utils::OV_BYPASS_2_LAYER>
 {
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_VG, utils::IS_FG_SET, utils::NO_WAIT, utils::ZORDER_0> pipe0;
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_VG, utils::IS_FG_OFF, utils::WAIT, utils::ZORDER_1> pipe1;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe1;
     typedef overlay::NullPipe pipe2;   // place holder
 
     typedef NullRotator rot0;
@@ -264,9 +263,9 @@
 
 template <> struct StateTraits<utils::OV_BYPASS_3_LAYER>
 {
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_VG, utils::IS_FG_SET, utils::NO_WAIT, utils::ZORDER_0> pipe0;
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_VG, utils::IS_FG_OFF, utils::NO_WAIT, utils::ZORDER_1> pipe1;
-    typedef overlay::BypassPipe<utils::OV_MDP_PIPE_RGB, utils::IS_FG_OFF, utils::WAIT, utils::ZORDER_2> pipe2;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe1;
+    typedef overlay::GenericPipe<utils::PRIMARY> pipe2;
 
     typedef NullRotator rot0;
     typedef NullRotator rot1;
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index d22d887..8c9ca99 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -177,11 +177,18 @@
     return -1;
 }
 
-bool isHDMIConnected () {
-    char value[PROPERTY_VALUE_MAX] = {0};
-    property_get("hw.hdmiON", value, "0");
-    int isHDMI = atoi(value);
-    return isHDMI ? true : false;
+//Set by client as HDMI/WFD
+void setExtType(const int& type) {
+    if(type != HDMI && type != WFD) {
+        ALOGE("%s: Unrecognized type %d", __func__, type);
+        return;
+    }
+    sExtType = type;
+}
+
+//Return External panel type set by client.
+int getExtType() {
+    return sExtType;
 }
 
 bool is3DTV() {
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index 10b0160..f82fb88 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -35,7 +35,7 @@
 #include <fcntl.h> // open, O_RDWR, etc
 #include <hardware/hardware.h>
 #include <hardware/gralloc.h> // buffer_handle_t
-#include <linux/msm_mdp.h> // MDP_OV_PLAY_NOWAIT etc ...
+#include <linux/msm_mdp.h> // flags
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -250,15 +250,6 @@
     ROT_FLAG_ENABLED = 1 // needed in rot
 };
 
-/* Wait/No wait for waiting for vsync
- * WAIT - wait for vsync, ignore fb (no need to compose w/ fb)
- * NO_WAIT - do not wait for vsync and return immediatly since
- * we need to run composition code */
-enum eWait {
-    WAIT,
-    NO_WAIT
-};
-
 /* The values for is_fg flag for control alpha and transp
  * IS_FG_OFF means is_fg = 0
  * IS_FG_SET means is_fg = 1
@@ -277,7 +268,7 @@
     OV_MDP_FLAGS_NONE = 0,
     OV_MDP_PIPE_SHARE =  MDP_OV_PIPE_SHARE,
     OV_MDP_DEINTERLACE = MDP_DEINTERLACE,
-    OV_MDP_PLAY_NOWAIT = MDP_OV_PLAY_NOWAIT,
+    OV_MDP_PLAY_NOWAIT = MDP_OV_PLAY_NOWAIT, //deprecated
     OV_MDP_SECURE_OVERLAY_SESSION = MDP_SECURE_OVERLAY_SESSION,
     OV_MDP_SOURCE_ROTATED_90 = MDP_SOURCE_ROTATED_90,
     OV_MDP_MEMORY_ID_TYPE_FB = MDP_MEMORY_ID_TYPE_FB,
@@ -308,24 +299,12 @@
     OV_MDP_PIPE_VG
 };
 
-/* Corresponds to pipes in eDest */
-enum eChannel {
-    CHANNEL_0,
-    CHANNEL_1,
-    CHANNEL_2
-};
-
 // Max pipes via overlay (VG0, VG1, RGB1)
 enum { MAX_PIPES = 3 };
 
 /* Used to identify destination channels and
  * also 3D channels e.g. when in 3D mode with 2
  * pipes opened and it is used in get crop/pos 3D
- *
- * PLEASE NOTE : DO NOT USE eDest FOR ARRAYS
- * i.e. args[OV_PIPE1] since it is a BIT MASK
- * use CHANNELS enum instead. Each OV_PIPEX is
- * not specific to a display (primary/external).
  * */
 enum eDest {
     OV_PIPE0 = 1 << 0,
@@ -337,61 +316,51 @@
 /* values for copybit_set_parameter(OVERLAY_TRANSFORM) */
 enum eTransform {
     /* No rot */
-    OVERLAY_TRANSFORM_0         = 0x0,
-    /* flip source image horizontally */
-    OVERLAY_TRANSFORM_FLIP_H    = HAL_TRANSFORM_FLIP_H,
-    /* flip source image vertically */
-    OVERLAY_TRANSFORM_FLIP_V    = HAL_TRANSFORM_FLIP_V,
-    /* rotate source image 90 degrees */
-    OVERLAY_TRANSFORM_ROT_90    = HAL_TRANSFORM_ROT_90,
+    OVERLAY_TRANSFORM_0 = 0x0,
+    /* flip source image horizontally 0x1 */
+    OVERLAY_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H,
+    /* flip source image vertically 0x2 */
+    OVERLAY_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V,
     /* rotate source image 180 degrees
      * It is basically bit-or-ed  H | V == 0x3 */
-    OVERLAY_TRANSFORM_ROT_180   = HAL_TRANSFORM_ROT_180,
+    OVERLAY_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180,
+    /* rotate source image 90 degrees 0x4 */
+    OVERLAY_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90,
+    /* rotate source image 90 degrees and flip horizontally 0x5 */
+    OVERLAY_TRANSFORM_ROT_90_FLIP_H = HAL_TRANSFORM_ROT_90 |
+                                      HAL_TRANSFORM_FLIP_H,
+    /* rotate source image 90 degrees and flip vertically 0x6 */
+    OVERLAY_TRANSFORM_ROT_90_FLIP_V = HAL_TRANSFORM_ROT_90 |
+                                      HAL_TRANSFORM_FLIP_V,
     /* rotate source image 270 degrees
      * Basically 180 | 90 == 0x7 */
-    OVERLAY_TRANSFORM_ROT_270   = HAL_TRANSFORM_ROT_270,
+    OVERLAY_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270,
     /* rotate invalid like in Transform.h */
-    OVERLAY_TRANSFORM_INV       = 0x80
-};
-
-/* offset and fd are play info */
-struct PlayInfo {
-    PlayInfo() : fd(-1), offset(0) {}
-    PlayInfo(int _fd, uint32_t _offset) :
-        fd(_fd), offset(_offset) {}
-    bool operator==(const PlayInfo& p) {
-        return (fd == p.fd && offset == p.offset);
-    }
-    int fd;
-    uint32_t offset;
+    OVERLAY_TRANSFORM_INV = 0x80
 };
 
 // Used to consolidate pipe params
 struct PipeArgs {
     PipeArgs() : mdpFlags(OV_MDP_FLAGS_NONE),
-        wait(NO_WAIT),
         zorder(Z_SYSTEM_ALLOC),
         isFg(IS_FG_OFF),
         rotFlags(ROT_FLAG_DISABLED){
     }
 
-    PipeArgs(eMdpFlags f, Whf _whf, eWait w,
+    PipeArgs(eMdpFlags f, Whf _whf,
             eZorder z, eIsFg fg, eRotFlags r) :
         mdpFlags(f),
         whf(_whf),
-        wait(w),
         zorder(z),
         isFg(fg),
         rotFlags(r) {
     }
 
-    eMdpFlags mdpFlags; // for mdp_overlay flags PIPE_SHARE, NO_WAIT, etc
+    eMdpFlags mdpFlags; // for mdp_overlay flags
     Whf whf;
-    eWait wait; // flags WAIT/NO_WAIT
     eZorder zorder; // stage number
     eIsFg isFg; // control alpha & transp
     eRotFlags rotFlags;
-    PlayInfo play;
 };
 
 enum eOverlayState{
@@ -441,21 +410,13 @@
     WFD = 2
 };
 
+//TODO Make this a part of some appropriate class
 static int sExtType = HDMI; //HDMI or WFD
-
 //Set by client as HDMI/WFD
-static inline void setExtType(const int& type) {
-    if(type != HDMI || type != WFD) {
-        ALOGE("%s: Unrecognized type %d", __func__, type);
-        return;
-    }
-    sExtType = type;
-}
-
+void setExtType(const int& type);
 //Return External panel type set by client.
-static inline int getExtType() {
-    return sExtType;
-}
+int getExtType();
+
 
 //Gets the FB number for the external type.
 //As of now, HDMI always has fb1, WFD could use fb1 or fb2
@@ -480,6 +441,7 @@
 }
 
 // number of rgb pipes bufs (max)
+
 // 2 for rgb0/1 double bufs
 enum { RGB_PIPE_NUM_BUFS = 2 };
 
@@ -504,12 +466,6 @@
 const char* getFormatString(uint32_t format);
 const char* getStateString(eOverlayState state);
 
-inline int setWait(eWait wait, int flags) {
-    return (wait == WAIT) ?
-            flags &= ~MDP_OV_PLAY_NOWAIT :
-            flags |= MDP_OV_PLAY_NOWAIT;
-}
-
 // Cannot use HW_OVERLAY_MAGNIFICATION_LIMIT, since at the time
 // of integration, HW_OVERLAY_MAGNIFICATION_LIMIT was a define
 enum { HW_OV_MAGNIFICATION_LIMIT = 20,
@@ -685,18 +641,18 @@
 
 inline int getMdpOrient(eTransform rotation) {
     ALOGE_IF(DEBUG_OVERLAY, "%s: rot=%d", __FUNCTION__, rotation);
-    switch(static_cast<int>(rotation))
+    switch(rotation)
     {
         case OVERLAY_TRANSFORM_0 : return 0;
-        case HAL_TRANSFORM_FLIP_V:  return MDP_FLIP_UD;
-        case HAL_TRANSFORM_FLIP_H:  return MDP_FLIP_LR;
-        case HAL_TRANSFORM_ROT_90:  return MDP_ROT_90;
-        case HAL_TRANSFORM_ROT_90|HAL_TRANSFORM_FLIP_V:
-                                    return MDP_ROT_90|MDP_FLIP_LR;
-        case HAL_TRANSFORM_ROT_90|HAL_TRANSFORM_FLIP_H:
-                                    return MDP_ROT_90|MDP_FLIP_UD;
-        case HAL_TRANSFORM_ROT_180: return MDP_ROT_180;
-        case HAL_TRANSFORM_ROT_270: return MDP_ROT_270;
+        case OVERLAY_TRANSFORM_FLIP_V:  return MDP_FLIP_UD;
+        case OVERLAY_TRANSFORM_FLIP_H:  return MDP_FLIP_LR;
+        case OVERLAY_TRANSFORM_ROT_90:  return MDP_ROT_90;
+        case OVERLAY_TRANSFORM_ROT_90_FLIP_V:
+                return MDP_ROT_90 | MDP_FLIP_UD;
+        case OVERLAY_TRANSFORM_ROT_90_FLIP_H:
+                return MDP_ROT_90 | MDP_FLIP_LR;
+        case OVERLAY_TRANSFORM_ROT_180: return MDP_ROT_180;
+        case OVERLAY_TRANSFORM_ROT_270: return MDP_ROT_270;
         default:
             ALOGE("%s: invalid rotation value (value = 0x%x",
                     __FUNCTION__, rotation);
diff --git a/liboverlay/pipes/overlayBypassPipe.h b/liboverlay/pipes/overlayBypassPipe.h
deleted file mode 100644
index bc2232d..0000000
--- a/liboverlay/pipes/overlayBypassPipe.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
-* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are
-* met:
-*    * Redistributions of source code must retain the above copyright
-*      notice, this list of conditions and the following disclaimer.
-*    * Redistributions in binary form must reproduce the above
-*      copyright notice, this list of conditions and the following
-*      disclaimer in the documentation and/or other materials provided
-*      with the distribution.
-*    * Neither the name of Code Aurora Forum, Inc. nor the names of its
-*      contributors may be used to endorse or promote products derived
-*      from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef OVERLAY_BYPASS_PIPE_H
-#define OVERLAY_BYPASS_PIPE_H
-
-#include "overlayGenPipe.h"
-#include "overlayUtils.h"
-#include "overlayCtrlData.h"
-#include "overlayMdp.h"
-#include "overlayRotator.h"
-
-namespace overlay {
-
-/* A specific impl of GenericPipe
-* Whenever needed to have a pass through - we do it.
-* If there is a special need for a different behavior - do it here
-* PipeType = 0 (RGB), 1 (VG) */
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-class BypassPipe : utils::NoCopy {
-public:
-    /* Please look at overlayGenPipe.h for info */
-    explicit BypassPipe();
-    ~BypassPipe();
-    bool init(RotatorBase* rot);
-    bool close();
-    bool commit();
-    bool queueBuffer(int fd, uint32_t offset);
-    bool waitForVsync();
-    bool setCrop(const utils::Dim& dim);
-    bool setPosition(const utils::Dim& dim);
-    bool setTransform(const utils::eTransform& param);
-    bool setSource(const utils::PipeArgs& args);
-    utils::eOverlayPipeType getOvPipeType() const;
-    void dump() const;
-private:
-    overlay::GenericPipe<ovutils::PRIMARY> mBypass;
-};
-
-//------------------Inlines and Templates---------------------
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline BypassPipe<PipeType, IsFg, Wait, Zorder>::BypassPipe() {}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline BypassPipe<PipeType, IsFg, Wait, Zorder>::~BypassPipe() {
-    close();
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::init(RotatorBase* rot) {
-    ALOGE_IF(DEBUG_OVERLAY, "BypassPipe init");
-    return mBypass.init(rot);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::close() {
-    return mBypass.close();
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::commit() {
-    return mBypass.commit();
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::queueBuffer(int fd,
-        uint32_t offset) {
-    return mBypass.queueBuffer(fd, offset);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::waitForVsync() {
-    return mBypass.waitForVsync();
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::setCrop(
-        const utils::Dim& dim) {
-    return mBypass.setCrop(dim);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::setPosition(
-        const utils::Dim& dim) {
-    return mBypass.setPosition(dim);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::setTransform(
-        const utils::eTransform& param) {
-    return mBypass.setTransform(param);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline bool BypassPipe<PipeType, IsFg, Wait, Zorder>::setSource(
-        const utils::PipeArgs& args) {
-    utils::PipeArgs arg(args);
-
-    // Stride aligned to 32
-    arg.whf.w = utils::align(arg.whf.w, 32);
-    arg.whf.h = utils::align(arg.whf.h, 32);
-
-    // VG or RG pipe
-    if (PipeType == utils::OV_MDP_PIPE_VG) {
-        setMdpFlags(arg.mdpFlags, utils::OV_MDP_PIPE_SHARE);
-    }
-
-    // Set is_fg flag
-    arg.isFg = IsFg;
-
-    // Wait or no wait
-    arg.wait = Wait;
-
-    // Z-order
-    arg.zorder = Zorder;
-
-    return mBypass.setSource(arg);
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline utils::eOverlayPipeType BypassPipe<PipeType, IsFg, Wait,
-        Zorder>::getOvPipeType() const {
-    return utils::OV_PIPE_TYPE_BYPASS;
-}
-
-template <utils::eMdpPipeType PipeType, utils::eIsFg IsFg, utils::eWait Wait,
-    utils::eZorder Zorder>
-inline void BypassPipe<PipeType, IsFg, Wait, Zorder>::dump() const {
-    ALOGE("Bypass VG Pipe");
-    mBypass.dump();
-}
-
-} // overlay
-
-#endif // OVERLAY_BYPASS_PIPE_H
diff --git a/liboverlay/pipes/overlayGenPipe.h b/liboverlay/pipes/overlayGenPipe.h
index 3f68733..c2d774b 100644
--- a/liboverlay/pipes/overlayGenPipe.h
+++ b/liboverlay/pipes/overlayGenPipe.h
@@ -102,12 +102,6 @@
     /* Ctrl/Data aggregator */
     CtrlData mCtrlData;
 
-    /* caching startup params. useful when need
-     * to have the exact copy of that pipe.
-     * For example when HDMI is connected, and we would
-     * like to open/start the pipe with the args */
-    utils::PipeArgs mArgs;
-
     /* rotator mdp base
      * Can point to NullRotator or to Rotator*/
     RotatorBase* mRot;
@@ -207,6 +201,7 @@
     //Cache if user wants 0-rotation
     mRotUsed = newargs.rotFlags & utils::ROT_FLAG_ENABLED;
     mRot->setSource(newargs.whf);
+    mRot->setFlags(newargs.mdpFlags);
     return mCtrlData.ctrl.setSource(newargs);
 }
 
diff --git a/liboverlay/pipes/overlayUIMirrorPipe.h b/liboverlay/pipes/overlayUIMirrorPipe.h
index 733bf84..1c22020 100644
--- a/liboverlay/pipes/overlayUIMirrorPipe.h
+++ b/liboverlay/pipes/overlayUIMirrorPipe.h
@@ -71,7 +71,7 @@
     bool ret = mUI.init(rot);
     //If source to rotator is FB, which is the case with UI Mirror pipe,
     //we need to inform driver during playback, since FB does not use ION.
-    rot->setSrcFB(true);
+    rot->setSrcFB();
     return ret;
 }
 inline bool UIMirrorPipe::close() { return mUI.close(); }