Merge "gralloc: Add Raw10 support in allocator" into mnc-dev
diff --git a/msm8960/libgralloc/gpu.cpp b/msm8960/libgralloc/gpu.cpp
index 46aebc8..8d71e32 100644
--- a/msm8960/libgralloc/gpu.cpp
+++ b/msm8960/libgralloc/gpu.cpp
@@ -263,6 +263,12 @@
             grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21
         else if(usage & GRALLOC_USAGE_HW_CAMERA_WRITE)
             grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21
+        //If flexible yuv is used for sw read/write, need map to NV21
+        else if(format == HAL_PIXEL_FORMAT_YCbCr_420_888 &&
+            (usage & GRALLOC_USAGE_SW_WRITE_MASK ||
+            usage & GRALLOC_USAGE_SW_READ_MASK)) {
+            grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
+        }
     }
 
     getGrallocInformationFromFormat(grallocFormat, &bufferType);
diff --git a/msm8960/libgralloc/mapper.cpp b/msm8960/libgralloc/mapper.cpp
index 55a34a9..f2d6e23 100644
--- a/msm8960/libgralloc/mapper.cpp
+++ b/msm8960/libgralloc/mapper.cpp
@@ -250,7 +250,7 @@
 {
     private_handle_t* hnd = (private_handle_t*)handle;
     int err = gralloc_map_and_invalidate(module, handle, usage, l, t, w, h);
-    int ystride;
+    int ystride, cstride;
     if(!err) {
         //hnd->format holds our implementation defined format
         //HAL_PIXEL_FORMAT_YCrCb_420_SP is the only one set right now.
@@ -276,6 +276,19 @@
                 ycbcr->chroma_step = 2;
                 memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved));
                 break;
+            // YCrCb_420_P
+            case HAL_PIXEL_FORMAT_YV12:
+                ystride = ALIGN(hnd->width, 16);
+                cstride = ALIGN(ystride / 2, 16);
+                ycbcr->y  = (void*)hnd->base;
+                ycbcr->cr = (void*)(hnd->base + ystride * hnd->height);
+                ycbcr->cb = (void*)(hnd->base + ystride * hnd->height
+                                              + cstride * hnd->height / 2);
+                ycbcr->ystride = ystride;
+                ycbcr->cstride = cstride;
+                ycbcr->chroma_step = 1;
+                memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved));
+                break;
             default:
                 ALOGD("%s: Invalid format passed: 0x%x", __FUNCTION__,
                       hnd->format);