Merge "origen/gralloc_ump: gcc 4.7 compile fixes" into linaro_android_4.0.3
diff --git a/Android.mk b/Android.mk
index 2aebbe4..5bb780e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -39,6 +39,10 @@
 LOCAL_MODULE := gralloc.origen
 LOCAL_MODULE_TAGS := eng
 LOCAL_CFLAGS:= -DLOG_TAG=\"gralloc_ump\" -DGRALLOC_32_BITS -DSTANDARD_LINUX_SCREEN -fpermissive
+ifeq ($(BOARD_HAVE_CODEC_SUPPORT),SAMSUNG_CODEC_SUPPORT)
+LOCAL_CFLAGS     += -DSAMSUNG_CODEC_SUPPORT
+LOCAL_C_INCLUDES += frameworks/base/media/libstagefright/include
+endif
 #LOCAL_CFLAGS+= -DMALI_VSYNC_EVENT_REPORT_ENABLE
 include $(BUILD_SHARED_LIBRARY)
-endif
\ No newline at end of file
+endif
diff --git a/alloc_device.cpp b/alloc_device.cpp
index 30320a1..ce9d483 100644
--- a/alloc_device.cpp
+++ b/alloc_device.cpp
@@ -32,8 +32,7 @@
 
 #include <ump/ump.h>
 #include <ump/ump_ref_drv.h>
-
-
+#include <ColorFormat.h>
 
 static int gralloc_alloc_buffer(alloc_device_t* dev, size_t size, int usage, buffer_handle_t* pHandle)
 {
@@ -90,7 +89,7 @@
 	}
 	else
 	{
-		LOGE("gralloc_alloc_buffer() failed to allcoate UMP memory");
+		LOGE("gralloc_alloc_buffer() failed to allcoate UMP memory, Requested Size: %d", size);
 	}
 
 	return -1;
@@ -166,47 +165,71 @@
 		return -EINVAL;
 	}
 
-	size_t size;
-	size_t stride;
-	if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP || format == HAL_PIXEL_FORMAT_YV12 ) 
-	{
-		switch (format)
-		{
-			case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-			case HAL_PIXEL_FORMAT_YV12:
-				stride = (w + 15) & ~15;
-				size = h * (stride + stride/2);
-				break;
-			default:
-				return -EINVAL;
-		}
-	}
-	else
-	{
-		int align = 8;
-		int bpp = 0;
-		switch (format)
-		{
-		case HAL_PIXEL_FORMAT_RGBA_8888:
-		case HAL_PIXEL_FORMAT_RGBX_8888:
-		case HAL_PIXEL_FORMAT_BGRA_8888:
-			bpp = 4;
-			break;
-		case HAL_PIXEL_FORMAT_RGB_888:
-			bpp = 3;
-			break;
-		case HAL_PIXEL_FORMAT_RGB_565:
-		case HAL_PIXEL_FORMAT_RGBA_5551:
-		case HAL_PIXEL_FORMAT_RGBA_4444:
-			bpp = 2;
-			break;
-		default:
-			return -EINVAL;
-		}
-		size_t bpr = (w*bpp + (align-1)) & ~(align-1);
-		size = bpr * h;
-		stride = bpr / bpp;
-	}
+    size_t size = 0;
+    size_t stride = 0;
+    size_t stride_raw = 0;
+
+    if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP ||
+        format == HAL_PIXEL_FORMAT_YCrCb_420_SP ||
+        format == HAL_PIXEL_FORMAT_YCbCr_422_SP ||
+        format == HAL_PIXEL_FORMAT_YCbCr_420_P  ||
+        format == HAL_PIXEL_FORMAT_YV12 ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR ||
+        format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL) {
+        /* FIXME: there is no way to return the vstride */
+        int vstride;
+        stride = (w + 15) & ~15;
+        vstride = (h + 15) & ~15;
+        switch (format) {
+        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+        case HAL_PIXEL_FORMAT_YCbCr_420_P:
+        case HAL_PIXEL_FORMAT_YV12:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
+        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
+            size = stride * vstride * 2;
+            if(usage & GRALLOC_USAGE_HW_FIMC1)
+                size += PAGE_SIZE * 2;
+            break;
+        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+            size = (stride * vstride) + (w/2 * h/2) * 2;
+            break;
+        default:
+            return -EINVAL;
+        }
+    } else {
+        int align = 8;
+        int bpp = 0;
+        switch (format) {
+        case HAL_PIXEL_FORMAT_RGBA_8888:
+        case HAL_PIXEL_FORMAT_RGBX_8888:
+        case HAL_PIXEL_FORMAT_BGRA_8888:
+            bpp = 4;
+            break;
+        case HAL_PIXEL_FORMAT_RGB_888:
+            bpp = 3;
+            break;
+        case HAL_PIXEL_FORMAT_RGB_565:
+        case HAL_PIXEL_FORMAT_RGBA_5551:
+        case HAL_PIXEL_FORMAT_RGBA_4444:
+            bpp = 2;
+            break;
+        default:
+            return -EINVAL;
+        }
+        size_t bpr = (w*bpp + (align-1)) & ~(align-1);
+        size = bpr * h;
+        stride = bpr / bpp;
+        stride_raw = bpr;
+    }
 
 	int err;
 	if (usage & GRALLOC_USAGE_HW_FB)
diff --git a/gralloc_priv.h b/gralloc_priv.h
index bf3e05e..9f3346a 100644
--- a/gralloc_priv.h
+++ b/gralloc_priv.h
@@ -31,11 +31,6 @@
 
 #define GRALLOC_ARM_UMP_MODULE 1
 
-enum {
-  /* OEM specific HAL formats - this number should be greater than 0x100 */
-  HAL_PIXEL_FORMAT_YCbCr_420_SP  = 0x100,
-};
-
 struct private_handle_t;
 
 struct private_module_t