hwc/overlay: Video on 4k2k external, 4k2k rotation.

-Add support for Video via overlay on 4k2k external panel.
-Add support for rotating videos on 4k2k panels. We use
pre-rotation in hwc to rotate a video into a single buffer,
irrespective of panel size. Then this buffer is fed to MDP.
Rotator objects are managed by the new RotMgr.
-Cleaup mdpcomp and overlay.

Change-Id: Ifb08534747e8e18b6c58dd8a3e1a9947409100f1
diff --git a/liboverlay/pipes/overlayGenPipe.cpp b/liboverlay/pipes/overlayGenPipe.cpp
index 486cfda..9108acd 100644
--- a/liboverlay/pipes/overlayGenPipe.cpp
+++ b/liboverlay/pipes/overlayGenPipe.cpp
@@ -34,7 +34,7 @@
 namespace overlay {
 
 GenericPipe::GenericPipe(int dpy) : mFbNum(dpy), mRot(0), mRotUsed(false),
-        mRotDownscaleOpt(false), pipeState(CLOSED) {
+        mRotDownscaleOpt(false), mPreRotated(false), pipeState(CLOSED) {
     init();
 }
 
@@ -47,6 +47,7 @@
     ALOGE_IF(DEBUG_OVERLAY, "GenericPipe init");
     mRotUsed = false;
     mRotDownscaleOpt = false;
+    mPreRotated = false;
     if(mFbNum)
         mFbNum = Overlay::getInstance()->getExtFbNum();
 
@@ -87,54 +88,31 @@
     return ret;
 }
 
-bool GenericPipe::setSource(
-        const utils::PipeArgs& args)
-{
-    utils::PipeArgs newargs(args);
-    //Interlace video handling.
-    if(newargs.whf.format & INTERLACE_MASK) {
-        setMdpFlags(newargs.mdpFlags, utils::OV_MDP_DEINTERLACE);
-    }
-    utils::Whf whf(newargs.whf);
-    //Extract HAL format from lower bytes. Deinterlace if interlaced.
-    whf.format = utils::getColorFormat(whf.format);
-    //Get MDP equivalent of HAL format.
-    whf.format = utils::getMdpFormat(whf.format);
-    newargs.whf = whf;
-
+void GenericPipe::setSource(const utils::PipeArgs& args) {
     //Cache if user wants 0-rotation
-    mRotUsed = newargs.rotFlags & utils::ROT_0_ENABLED;
-    mRotDownscaleOpt = newargs.rotFlags & utils::ROT_DOWNSCALE_ENABLED;
-
-    mRot->setSource(newargs.whf);
-    mRot->setFlags(newargs.mdpFlags);
-    return mCtrlData.ctrl.setSource(newargs);
+    mRotUsed = args.rotFlags & utils::ROT_0_ENABLED;
+    mRotDownscaleOpt = args.rotFlags & utils::ROT_DOWNSCALE_ENABLED;
+    mPreRotated = args.rotFlags & utils::ROT_PREROTATED;
+    if(mPreRotated) mRotUsed = false;
+    mRot->setSource(args.whf);
+    mRot->setFlags(args.mdpFlags);
+    mCtrlData.ctrl.setSource(args);
 }
 
-bool GenericPipe::setCrop(
-        const overlay::utils::Dim& d) {
-    return mCtrlData.ctrl.setCrop(d);
+void GenericPipe::setCrop(const overlay::utils::Dim& d) {
+    mCtrlData.ctrl.setCrop(d);
 }
 
-bool GenericPipe::setTransform(
-        const utils::eTransform& orient)
-{
+void GenericPipe::setTransform(const utils::eTransform& orient) {
     //Rotation could be enabled by user for zero-rot or the layer could have
     //some transform. Mark rotation enabled in either case.
-    mRotUsed |= (orient != utils::OVERLAY_TRANSFORM_0);
+    mRotUsed |= ((orient & utils::OVERLAY_TRANSFORM_ROT_90) && !mPreRotated);
     mRot->setTransform(orient);
-
-    return mCtrlData.ctrl.setTransform(orient);
+    mCtrlData.ctrl.setTransform(orient);
 }
 
-bool GenericPipe::setPosition(const utils::Dim& d)
-{
-    return mCtrlData.ctrl.setPosition(d);
-}
-
-void GenericPipe::setRotatorUsed(const bool& rotUsed) {
-    mRot->setRotatorUsed(rotUsed);
-    mCtrlData.ctrl.setRotatorUsed(rotUsed);
+void GenericPipe::setPosition(const utils::Dim& d) {
+    mCtrlData.ctrl.setPosition(d);
 }
 
 bool GenericPipe::commit() {
@@ -142,20 +120,16 @@
     int downscale_factor = utils::ROT_DS_NONE;
 
     if(mRotDownscaleOpt) {
-        /* Can go ahead with calculation of downscale_factor since
-         * we consider area when calculating it */
-        downscale_factor = mCtrlData.ctrl.getDownscalefactor();
-        if(downscale_factor)
-            mRotUsed = true;
+        ovutils::Dim src(mCtrlData.ctrl.getCrop());
+        ovutils::Dim dst(mCtrlData.ctrl.getPosition());
+        downscale_factor = ovutils::getDownscaleFactor(
+                src.w, src.h, dst.w, dst.h);
+        mRotUsed |= (downscale_factor && !mPreRotated);
     }
 
-    setRotatorUsed(mRotUsed);
-    mCtrlData.ctrl.doTransform();
-
-    mCtrlData.ctrl.doDownscale(downscale_factor);
-    mRot->setDownscale(downscale_factor);
 
     if(mRotUsed) {
+        mRot->setDownscale(downscale_factor);
         //If wanting to use rotator, start it.
         if(!mRot->commit()) {
             ALOGE("GenPipe Rotator commit failed");
@@ -170,9 +144,10 @@
          * The output format of the rotator might be different depending on
          * whether fastyuv mode is enabled in the rotator.
          */
-        mCtrlData.ctrl.updateSrcformat(mRot->getDstFormat());
+        mCtrlData.ctrl.updateSrcFormat(mRot->getDstFormat());
     }
 
+    mCtrlData.ctrl.setDownscale(downscale_factor);
     ret = mCtrlData.ctrl.commit();
 
     //If mdp commit fails, flush rotator session, memory, fd and create a hollow
@@ -220,11 +195,6 @@
     return mCtrlData.ctrl.getFd();
 }
 
-utils::ScreenInfo GenericPipe::getScreenInfo() const
-{
-    return mCtrlData.ctrl.getScreenInfo();
-}
-
 utils::Dim GenericPipe::getCrop() const
 {
     return mCtrlData.ctrl.getCrop();