hardware: samsung_slsi: libcamera2: decrease the number of request entry
for faster response of cameraService, decrease the number of entry from 10 to 4
Change-Id: I8adb05ca4933e261786fae59767f41910e09052e
Signed-off-by: Sungjoong Kang <sj3.kang@samsung.com>
diff --git a/libcamera2/ExynosCameraHWInterface2.cpp b/libcamera2/ExynosCameraHWInterface2.cpp
index b61abd4..410d844 100644
--- a/libcamera2/ExynosCameraHWInterface2.cpp
+++ b/libcamera2/ExynosCameraHWInterface2.cpp
@@ -310,6 +310,7 @@
m_metadataConverter = NULL;
}
+ releaseSensorQ();
return;
}
@@ -429,14 +430,13 @@
int RequestManager::MarkProcessingRequest(ExynosBuffer* buf, int *afMode)
{
-
- Mutex::Autolock lock(m_requestMutex);
struct camera2_shot_ext * shot_ext;
struct camera2_shot_ext * request_shot;
int targetStreamIndex = 0;
request_manager_entry * newEntry = NULL;
static int count = 0;
+ Mutex::Autolock lock(m_requestMutex);
if (m_numOfEntries == 0) {
CAM_LOGD("DEBUG(%s): Request Manager Empty ", __FUNCTION__);
return -1;
@@ -552,7 +552,6 @@
void RequestManager::SetFrameIndex(int index)
{
- Mutex::Autolock lock(m_requestMutex);
m_frameIndex = index;
}
@@ -561,6 +560,43 @@
return m_frameIndex;
}
+void RequestManager::pushSensorQ(int index)
+{
+ Mutex::Autolock lock(m_requestMutex);
+ m_sensorQ.push_back(index);
+}
+
+int RequestManager::popSensorQ()
+{
+ List<int>::iterator sensor_token;
+ int index;
+
+ Mutex::Autolock lock(m_requestMutex);
+
+ if(m_sensorQ.size() == 0)
+ return -1;
+
+ sensor_token = m_sensorQ.begin()++;
+ index = *sensor_token;
+ m_sensorQ.erase(sensor_token);
+
+ return (index);
+}
+
+void RequestManager::releaseSensorQ()
+{
+ List<int>::iterator r;
+
+ Mutex::Autolock lock(m_requestMutex);
+ ALOGV("(%d)m_sensorQ.size : %d", __FUNCTION__, m_sensorQ.size());
+
+ while(m_sensorQ.size() > 0){
+ r = m_sensorQ.begin()++;
+ m_sensorQ.erase(r);
+ }
+ return;
+}
+
void RequestManager::ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext)
{
int index;
@@ -568,6 +604,7 @@
nsecs_t timeStamp;
int i;
+ Mutex::Autolock lock(m_requestMutex);
ALOGV("DEBUG(%s): frameCnt(%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
@@ -882,6 +919,7 @@
m_BayerManager = new BayerBufManager();
m_mainThread = new MainThread(this);
+ m_requestManager = new RequestManager((SignalDrivenThread*)(m_mainThread.get()));
*openInvalid = InitializeISPChain();
if (*openInvalid < 0) {
// clean process
@@ -910,7 +948,7 @@
m_sensorThread = new SensorThread(this);
m_mainThread->Start("MainThread", PRIORITY_DEFAULT, 0);
ALOGV("DEBUG(%s): created sensorthread ################", __FUNCTION__);
- m_requestManager = new RequestManager((SignalDrivenThread*)(m_mainThread.get()));
+
CSC_METHOD cscMethod = CSC_METHOD_HW;
m_exynosPictureCSC = csc_init(cscMethod);
if (m_exynosPictureCSC == NULL)
@@ -1221,12 +1259,18 @@
ALOGV("DEBUG(%s): sensor reqbuf done", __FUNCTION__);
for (i = 0; i < m_camera_info.sensor.buffers; i++) {
ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
- memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
- sizeof(struct camera2_shot_ext));
m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
- cam_int_qbuf(&(m_camera_info.sensor), i);
+ memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
+ sizeof(struct camera2_shot_ext));
}
+
+ for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
+ cam_int_qbuf(&(m_camera_info.sensor), i);
+
+ for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
+ m_requestManager->pushSensorQ(i);
+
ALOGV("== stream_on :: .sensor");
cam_int_streamon(&(m_camera_info.sensor));
@@ -1759,15 +1803,20 @@
cam_int_s_fmt(&(m_camera_info.sensor));
cam_int_reqbufs(&(m_camera_info.sensor));
- for (i = 0; i < 8; i++) {
+ for (i = 0; i < m_camera_info.sensor.buffers; i++) {
ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
- memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
- sizeof(struct camera2_shot_ext));
m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
- cam_int_qbuf(&(m_camera_info.sensor), i);
+ memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
+ sizeof(struct camera2_shot_ext));
}
+ for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
+ cam_int_qbuf(&(m_camera_info.sensor), i);
+
+ for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
+ m_requestManager->pushSensorQ(i);
+
/* capture */
cam_int_s_fmt(&(m_camera_info.capture));
cam_int_reqbufs(&(m_camera_info.capture));
@@ -2704,6 +2753,7 @@
exynos_v4l2_s_ctrl(m_camera_info.sensor.fd, V4L2_CID_IS_S_STREAM, IS_DISABLE_STREAM);
+ m_requestManager->releaseSensorQ();
ALOGV("(%s): EXIT processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
selfThread->SetSignal(SIGNAL_THREAD_TERMINATE);
return;
@@ -2720,8 +2770,10 @@
int afMode;
/* dqbuf from sensor */
- ALOGV("Sensor DQbuf start");
+
index = cam_int_dqbuf(&(m_camera_info.sensor));
+ m_requestManager->pushSensorQ(index);
+ ALOGV("Sensor DQbuf done(%d)", index);
shot_ext = (struct camera2_shot_ext *)(m_camera_info.sensor.buffer[index].virt.extP[1]);
m_recordOutput = shot_ext->shot.ctl.request.outputStreams[2];
@@ -3062,6 +3114,12 @@
OnAfNotification(shot_ext->shot.dm.aa.afState);
}
+ index = m_requestManager->popSensorQ();
+ if(index < 0){
+ ALOGE("sensorQ is empty");
+ return;
+ }
+
processingReqIndex = m_requestManager->MarkProcessingRequest(&(m_camera_info.sensor.buffer[index]), &afMode);
if (processingReqIndex != -1)
SetAfMode((enum aa_afmode)afMode);
@@ -3074,9 +3132,8 @@
shot_ext->request_scp = 0;
shot_ext->request_sensor = 0;
}
-
cam_int_qbuf(&(m_camera_info.sensor), index);
- ALOGV("### Sensor QBUF done");
+ ALOGV("Sensor Qbuf done(%d)", index);
if (!m_scp_closing
&& ((matchedFrameCnt == -1) || (processingReqIndex == -1))){
@@ -3531,7 +3588,7 @@
ALOGV("(%s):previewcb %d = %d", __FUNCTION__, previewCbW, ALIGN(previewCbW, 16));
memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0],
m_previewCbBuf.virt.extP[0], previewCbW * previewCbH);
- memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0] + previewCbW * previewCbH,
+ memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0] + previewCbW * previewCbH,
m_previewCbBuf.virt.extP[1], previewCbW * previewCbH / 2 );
}
else {
@@ -3550,7 +3607,7 @@
selfStreamParms->svcBuffers[index].virt.extP[0], stride * previewCbH);
memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0] + stride * previewCbH,
selfStreamParms->svcBuffers[index].virt.extP[1], c_stride * previewCbH / 2 );
- memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0] + (stride * previewCbH) + (c_stride * previewCbH / 2),
+ memcpy(selfPreviewCbParms->svcBuffers[selfPreviewCbParms->svcBufIndex].virt.extP[0] + (stride * previewCbH) + (c_stride * previewCbH / 2),
selfStreamParms->svcBuffers[index].virt.extP[2], c_stride * previewCbH / 2 );
}
diff --git a/libcamera2/ExynosCameraHWInterface2.h b/libcamera2/ExynosCameraHWInterface2.h
index 5d95600..e13c589 100644
--- a/libcamera2/ExynosCameraHWInterface2.h
+++ b/libcamera2/ExynosCameraHWInterface2.h
@@ -37,6 +37,7 @@
#include <hardware/camera2.h>
#include <camera/Camera.h>
#include <camera/CameraParameters.h>
+#include <utils/List.h>
#include "SignalDrivenThread.h"
#include "MetadataConverter.h"
#include "exynos_v4l2.h"
@@ -61,12 +62,10 @@
#define NODE_PREFIX "/dev/video"
#define NUM_MAX_STREAM_THREAD (5)
-#define NUM_MAX_REQUEST_MGR_ENTRY (10)
-#define NUM_MAX_DEQUEUED_REQUEST NUM_MAX_REQUEST_MGR_ENTRY
-#define MAX_CAMERA_MEMORY_PLANE_NUM (4)
+#define NUM_MAX_REQUEST_MGR_ENTRY (4)
#define NUM_MAX_CAMERA_BUFFERS (16)
#define NUM_BAYER_BUFFERS (8)
-#define NUM_SENSOR_QBUF (3)
+#define NUM_MIN_SENSOR_QBUF (3)
#define PICTURE_GSC_NODE_NUM (2)
#define VIDEO_GSC_NODE_NUM (1)
@@ -263,6 +262,9 @@
int GetSkipCnt();
void SetFrameIndex(int index);
int GetFrameIndex();
+ void pushSensorQ(int index);
+ int popSensorQ();
+ void releaseSensorQ();
private:
MetadataConverter *m_metadataConverter;
@@ -287,6 +289,7 @@
int m_lastAaMode;
int m_lastAwbMode;
int m_lastAeComp;
+ List<int> m_sensorQ;
};