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();