Camera2: skip meta data stream as an input source of reprocess
- Postporp module cannot support reprocess on meta data stream, so will
skip adding meta data stream as an input source for online reprocess.
- Stop channel first if it's active in its destructor.
Change-Id: I390803fa03a9a17ee3132419959c5d43db08ac03
diff --git a/QCamera2/HAL/QCameraChannel.cpp b/QCamera2/HAL/QCameraChannel.cpp
index 78a460d..0f2a02c 100644
--- a/QCamera2/HAL/QCameraChannel.cpp
+++ b/QCamera2/HAL/QCameraChannel.cpp
@@ -54,6 +54,7 @@
{
m_camHandle = cam_handle;
m_camOps = cam_ops;
+ m_bIsActive = false;
m_handle = 0;
m_numStreams = 0;
@@ -73,6 +74,7 @@
{
m_camHandle = 0;
m_camOps = NULL;
+ m_bIsActive = false;
m_handle = 0;
m_numStreams = 0;
@@ -90,6 +92,10 @@
*==========================================================================*/
QCameraChannel::~QCameraChannel()
{
+ if (m_bIsActive) {
+ stop();
+ }
+
for (int i = 0; i < m_numStreams; i++) {
if (mStreams[i] != NULL) {
delete mStreams[i];
@@ -227,6 +233,8 @@
mStreams[i]->stop();
}
}
+ } else {
+ m_bIsActive = true;
}
return rc;
@@ -254,6 +262,7 @@
}
}
+ m_bIsActive = false;
return rc;
}
@@ -579,6 +588,12 @@
for (int i = 0; i < pSrcChannel->getNumOfStreams(); i++) {
pStream = pSrcChannel->getStreamByIndex(i);
if (pStream != NULL) {
+ if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
+ // Skip metadata for reprocess now because PP module cannot handle meta data
+ // May need furthur discussion if Imaginglib need meta data
+ continue;
+ }
+
pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
if (pStreamInfoBuf == NULL) {
ALOGE("%s: no mem for stream info buf", __func__);
diff --git a/QCamera2/HAL/QCameraChannel.h b/QCamera2/HAL/QCameraChannel.h
index 2fd64cd..51b14e4 100644
--- a/QCamera2/HAL/QCameraChannel.h
+++ b/QCamera2/HAL/QCameraChannel.h
@@ -69,6 +69,7 @@
protected:
uint32_t m_camHandle;
mm_camera_ops_t *m_camOps;
+ bool m_bIsActive;
uint32_t m_handle;
uint8_t m_numStreams;
diff --git a/QCamera2/HAL/QCameraPostProc.cpp b/QCamera2/HAL/QCameraPostProc.cpp
index 8e63e7f..b58782d 100644
--- a/QCamera2/HAL/QCameraPostProc.cpp
+++ b/QCamera2/HAL/QCameraPostProc.cpp
@@ -716,13 +716,8 @@
void QCameraPostProcessor::releasePPInputData(void *data, void *user_data)
{
QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data;
- qcamera_pp_request_t *request = (qcamera_pp_request_t *)data;
if (NULL != pme) {
- if (request->frame != NULL) {
- pme->releaseSuperBuf(request->frame);
- free(request->frame);
- request->frame = NULL;
- }
+ pme->releaseSuperBuf((mm_camera_super_buf_t *)data);
}
}
@@ -1379,17 +1374,17 @@
}
}
- qcamera_pp_request_t *request =
- (qcamera_pp_request_t *)pme->m_inputPPQ.dequeue();
- if (NULL != request) {
+ mm_camera_super_buf_t *pp_frame =
+ (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue();
+ if (NULL != pp_frame) {
qcamera_pp_data_t *pp_job =
(qcamera_pp_data_t *)malloc(sizeof(qcamera_pp_data_t));
if (pp_job != NULL) {
memset(pp_job, 0, sizeof(qcamera_pp_data_t));
if (pme->m_pReprocChannel != NULL) {
- ret = pme->m_pReprocChannel->doReprocess(request->frame);
+ ret = pme->m_pReprocChannel->doReprocess(pp_frame);
if (ret == 0) {
- pp_job->src_frame = request->frame;
+ pp_job->src_frame = pp_frame;
}
} else {
ALOGE("%s: Reprocess channel is NULL", __func__);
@@ -1402,12 +1397,10 @@
if (0 != ret) {
// free frame
- if (request->frame != NULL) {
- pme->releaseSuperBuf(request->frame);
- free(request->frame);
+ if (pp_frame != NULL) {
+ pme->releaseSuperBuf(pp_frame);
+ free(pp_frame);
}
- // free request buf
- free(request);
// send error notify
pme->sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE,
NULL,
@@ -1415,9 +1408,6 @@
NULL,
NULL);
} else {
- // free request buf
- free(request);
-
// add into ongoing jpeg job Q
pme->m_ongoingPPQ.enqueue((void *)pp_job);
}
@@ -1435,13 +1425,10 @@
pme->releaseSuperBuf(super_buf);
free(super_buf);
}
- qcamera_pp_request_t *request =
- (qcamera_pp_request_t *)pme->m_inputPPQ.dequeue();
- if (NULL != request) {
- if (request->frame != NULL) {
- pme->releaseSuperBuf(request->frame);
- }
- free(request);
+ super_buf = (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue();
+ if (NULL != super_buf) {
+ pme->releaseSuperBuf(super_buf);
+ free(super_buf);
}
}
}
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index 882f443..904130c 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -1579,9 +1579,10 @@
break;
case QCAMERA_SM_EVT_TAKE_PICTURE:
{
+ m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
rc = m_parent->takeLiveSnapshot();
- if (rc == 0) {
- m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
+ if (rc != NO_ERROR) {
+ m_state = QCAMERA_SM_STATE_RECORDING;
}
result.status = rc;
result.request_api = evt;