Camera3: Start raw stream(s) after other type of streams

This works around a software constraint in camera daemon
where raw stream doesn't link pproc, which causes certain
session parameters not reaching pproc module.

Bug: 13891761
Change-Id: I25c4a48fb965f8351b8b5910633e553aff22a3bd
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 84d2a4a..5914c51 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -591,19 +591,7 @@
     }
     mInputStream = inputStream;
 
-    /*clean up invalid streams*/
-    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
-            it != mStreamInfo.end();) {
-        if(((*it)->status) == INVALID){
-            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
-            delete channel;
-            free(*it);
-            it = mStreamInfo.erase(it);
-        } else {
-            it++;
-        }
-    }
-
+    cleanAndSortStreamInfo();
     if (mMetadataChannel) {
         delete mMetadataChannel;
         mMetadataChannel = NULL;
@@ -1503,7 +1491,7 @@
                 return rc;
             }
         }
-        //Then start them
+        //Then start them.
         for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
             it != mStreamInfo.end(); it++) {
             QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
@@ -2591,6 +2579,53 @@
 }
 
 /*===========================================================================
+ * FUNCTION   : cleanAndSortStreamInfo
+ *
+ * DESCRIPTION: helper method to clean up invalid streams in stream_info,
+ *              and sort them such that raw stream is at the end of the list
+ *              This is a workaround for camera daemon constraint.
+ *
+ * PARAMETERS : None
+ *
+ *==========================================================================*/
+void QCamera3HardwareInterface::cleanAndSortStreamInfo()
+{
+    List<stream_info_t *> newStreamInfo;
+
+    /*clean up invalid streams*/
+    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
+            it != mStreamInfo.end();) {
+        if(((*it)->status) == INVALID){
+            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
+            delete channel;
+            free(*it);
+            it = mStreamInfo.erase(it);
+        } else {
+            it++;
+        }
+    }
+
+    // Move preview/video/callback/snapshot streams into newList
+    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
+            it != mStreamInfo.end();) {
+        if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_OPAQUE &&
+                (*it)->stream->format != HAL_PIXEL_FORMAT_RAW16) {
+            newStreamInfo.push_back(*it);
+            it = mStreamInfo.erase(it);
+        } else
+            it++;
+    }
+    // Move raw streams into newList
+    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
+            it != mStreamInfo.end();) {
+        newStreamInfo.push_back(*it);
+        it = mStreamInfo.erase(it);
+    }
+
+    mStreamInfo = newStreamInfo;
+}
+
+/*===========================================================================
  * FUNCTION   : convertToRegions
  *
  * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index c3f5bc6..31cea8e 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -198,7 +198,7 @@
                             const char *type,
                             uint32_t frameNumber);
 
-    int queueReprocMetadata(metadata_buffer_t *metadata);
+    void cleanAndSortStreamInfo();
 public:
 
     bool needOnlineRotation();