liboverlay: Adjust values to align with MDP requirement

For YUV only:
Crop rectangle (src_rect) needs to be even for x/y and w/h
Destination dst_rect w/h need to be even (x/y can be odd).

Signed-off-by: Saurabh Shah <saurshah@codeaurora.org>

Change-Id: Ib0c1b7d31773e71d60f080b4beacaa68e32a990e
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index d161f4a..f4e0b51 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -23,6 +23,21 @@
 
 namespace ovutils = overlay::utils;
 namespace overlay {
+
+//Helper to even out x,w and y,h pairs
+//x,y are always evened to ceil and w,h are evened to floor
+static void normalizeCrop(uint32_t& xy, uint32_t& wh) {
+    if(xy & 1) {
+        utils::even_ceil(xy);
+        if(wh & 1)
+            utils::even_floor(wh);
+        else
+            wh -= 2;
+    } else {
+        utils::even_floor(wh);
+    }
+}
+
 bool MdpCtrl::init(uint32_t fbnum) {
     // FD init
     if(!utils::openDev(mFd, fbnum,
@@ -131,6 +146,14 @@
 bool MdpCtrl::set() {
     //deferred calcs, so APIs could be called in any order.
     doTransform();
+    utils::Whf whf = getSrcWhf();
+    if(utils::isYuv(whf.format)) {
+        normalizeCrop(mOVInfo.src_rect.x, mOVInfo.src_rect.w);
+        normalizeCrop(mOVInfo.src_rect.y, mOVInfo.src_rect.h);
+        utils::even_floor(mOVInfo.dst_rect.w);
+        utils::even_floor(mOVInfo.dst_rect.h);
+    }
+
     if(this->ovChanged()) {
         if(!mdp_wrapper::setOverlay(mFd.getFD(), mOVInfo)) {
             ALOGE("MdpCtrl failed to setOverlay, restoring last known "
@@ -142,6 +165,7 @@
         }
         this->save();
     }
+
     return true;
 }
 
diff --git a/liboverlay/overlayUtils.h b/liboverlay/overlayUtils.h
index 0648c85..eebf5ac 100644
--- a/liboverlay/overlayUtils.h
+++ b/liboverlay/overlayUtils.h
@@ -523,8 +523,11 @@
         case MDP_Y_CBCR_H2V1:
         case MDP_Y_CBCR_H2V2:
         case MDP_Y_CRCB_H2V2:
+        case MDP_Y_CRCB_H1V1:
+        case MDP_Y_CRCB_H2V1:
         case MDP_Y_CRCB_H2V2_TILE:
         case MDP_Y_CBCR_H2V2_TILE:
+        case MDP_Y_CR_CB_H2V2:
             return true;
         default:
             return false;
@@ -800,6 +803,18 @@
     return overlay::open(fd, fbnum, devpath, flags);
 }
 
+template <class T>
+inline void even_ceil(T& value) {
+    if(value & 1)
+        value++;
+}
+
+template <class T>
+inline void even_floor(T& value) {
+    if(value & 1)
+        value--;
+}
+
 } // namespace utils ends
 
 //--------------------Class Res stuff (namespace overlay only) -----------