Camera3: Implement the preview callback.

Support flexible format for Preview callback from
camera HAL side

Change-Id: I3fb50ca7c63cb9cc48c9471b3a27783b6d61e38e
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index ef47328..b949e56 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -517,9 +517,12 @@
                     __func__, priv_handle->flags);
             return -EINVAL;
         }
+    } else if(mCamera3Stream->format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
+         streamType = CAM_STREAM_TYPE_PREVIEW;
+         streamFormat = CAM_FORMAT_YUV_420_NV21;
     } else {
         //TODO: Fail for other types of streams for now
-        ALOGE("%s: format is not IMPLEMENTATION_DEFINED", __func__);
+        ALOGE("%s: format is not IMPLEMENTATION_DEFINED or flexible", __func__);
         return -EINVAL;
     }
 
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 2907061..936fc0e 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -482,6 +482,7 @@
                 QCamera3Channel *channel;
                 switch (newStream->format) {
                 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+                case HAL_PIXEL_FORMAT_YCbCr_420_888:
                     newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
                     channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
                             mCameraHandle->ops, captureResultCb,
@@ -518,7 +519,7 @@
             // Do nothing for now
         }
     }
-    /*For the streams to be reconfigured we need to register the buffers 
+    /*For the streams to be reconfigured we need to register the buffers
       since the framework wont*/
     for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
             it != mStreamInfo.end(); it++) {
@@ -1105,7 +1106,7 @@
     /*cam_auto_focus_data_t  *afData =(cam_auto_focus_data_t *)
       POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/
 
-    uint8_t  *color_correct_mode = 
+    uint8_t  *color_correct_mode =
         (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
     camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
 
@@ -1603,12 +1604,15 @@
                        1);
 
     static int32_t scalar_formats[CAM_FORMAT_MAX];
-    for (int i = 0; i < gCamCapability[cameraId]->supported_scalar_format_cnt; i++) {
+    int scalar_formats_count = gCamCapability[cameraId]->supported_scalar_format_cnt;
+    for (int i = 0; i < scalar_formats_count; i++) {
         scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]);
     }
+    scalar_formats[scalar_formats_count] = HAL_PIXEL_FORMAT_YCbCr_420_888;
+    scalar_formats_count++;
     staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
                       scalar_formats,
-                      gCamCapability[cameraId]->supported_scalar_format_cnt);
+                      scalar_formats_count);
 
     static int32_t available_processed_sizes[CAM_FORMAT_MAX];
     makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
@@ -1776,15 +1780,16 @@
                       (int64_t*)&availableRawMinDurations,
                        1);
 
-    const uint32_t availableFormats[4] = {
+    const uint32_t availableFormats[5] = {
         HAL_PIXEL_FORMAT_RAW_SENSOR,
         HAL_PIXEL_FORMAT_BLOB,
         HAL_PIXEL_FORMAT_RGBA_8888,
-        HAL_PIXEL_FORMAT_YCrCb_420_SP
+        HAL_PIXEL_FORMAT_YCrCb_420_SP,
+        HAL_PIXEL_FORMAT_YCbCr_420_888
     };
     staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
                       (int32_t*)availableFormats,
-                      4);
+                      5);
 
     const uint32_t availableProcessedSizes[4] = {1280, 720, 640, 480};
     staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
@@ -2567,7 +2572,7 @@
     }
 
     if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
-        uint8_t geometricStrength = 
+        uint8_t geometricStrength =
             frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
         rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_GEOMETRIC_STRENGTH,
@@ -2606,7 +2611,7 @@
     if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
         float focalDistance =
             frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
-        rc = AddSetParmEntryToBatch(mParameters, 
+        rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_LENS_FOCUS_DISTANCE,
                 sizeof(focalDistance), &focalDistance);
     }
@@ -2614,7 +2619,7 @@
     if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
         uint8_t optStabMode =
             frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
-        rc = AddSetParmEntryToBatch(mParameters, 
+        rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_LENS_OPT_STAB_MODE,
                 sizeof(optStabMode), &optStabMode);
     }
@@ -2622,7 +2627,7 @@
     if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
         uint8_t noiseRedMode =
             frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
-        rc = AddSetParmEntryToBatch(mParameters, 
+        rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_NOISE_REDUCTION_MODE,
                 sizeof(noiseRedMode), &noiseRedMode);
     }
@@ -2630,7 +2635,7 @@
     if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
         uint8_t noiseRedStrength =
             frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
-        rc = AddSetParmEntryToBatch(mParameters, 
+        rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
                 sizeof(noiseRedStrength), &noiseRedStrength);
     }