CameraHal: Add support for YUY2 preview callbacks

- The currently used Gralloc buffers for preview
  are limited to only NV12 pixelformat. In order
  to support this type of preview callbacks,
  CameraHal will internally convert from NV12 to
  YUY2.

Bug: 6419136

Change-Id: I879e32d4b2142bdd0a1f89fe7c5496d250039b73
Signed-off-by: Emilian Peev <epeev@mm-sol.com>
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp
index 63ed000..678b719 100644
--- a/camera/AppCallbackNotifier.cpp
+++ b/camera/AppCallbackNotifier.cpp
@@ -473,6 +473,49 @@
     if (pixelFormat!=NULL) {
         if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV422I) == 0) {
             bytesPerPixel = 2;
+            bufferSrc = ( unsigned char * ) y_uv[0] + offset;
+            uint32_t xOff = offset % stride;
+            uint32_t yOff = offset / stride;
+            uint8_t *bufferSrcUV = ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff);
+            uint8_t *bufferSrcUVEven = bufferSrcUV;
+
+            uint8_t *bufferDstY = ( uint8_t * ) dst;
+            uint8_t *bufferDstU = bufferDstY + 1;
+            uint8_t *bufferDstV = bufferDstY + 3;
+
+            // going to convert from NV12 here and return
+            for ( int i = 0 ; i < height; i ++ ) {
+                for ( int j = 0 ; j < width / 2 ; j++ ) {
+
+                    // Y
+                    *bufferDstY = *bufferSrc;
+                    bufferSrc++;
+                    bufferDstY += 2;
+
+                    *bufferDstY = *bufferSrc;
+                    bufferSrc++;
+                    bufferDstY += 2;
+
+                    // V
+                    *bufferDstV = *(bufferSrcUV + 1);
+                    bufferDstV += 4;
+
+                    // U
+                    *bufferDstU = *bufferSrcUV;
+                    bufferDstU += 4;
+
+                    bufferSrcUV += 2;
+                }
+                if ( i % 2 ) {
+                    bufferSrcUV += ( stride - width);
+                    bufferSrcUVEven = bufferSrcUV;
+                } else {
+                    bufferSrcUV = bufferSrcUVEven;
+                }
+                bufferSrc += ( stride - width);
+            }
+
+            return;
         } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 ||
                    strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) {
             bytesPerPixel = 1;
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index b3fcf67..180b441 100755
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -429,13 +429,9 @@
     ///@todo Include more camera parameters
     if ( (valstr = params.getPreviewFormat()) != NULL )
         {
-        if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0)
-            {
-            CAMHAL_LOGDA("CbYCrY format selected");
-            pixFormat = OMX_COLOR_FormatCbYCrY;
-            }
-        else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 ||
-                strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0)
+        if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 ||
+           strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0 ||
+           strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0)
             {
             CAMHAL_LOGDA("YUV420SP format selected");
             pixFormat = OMX_COLOR_FormatYUV420SemiPlanar;