hardware: samsung_slsi: libcamera2: change flash sequence
This patch is to change flash sequence
- seperate ae/awb lock and flashMode checking routine
- apply flash status to EXIF
Change-Id: I02796340ad317327f22b2e833058a3665ef1334e
Signed-off-by: Younghwan Joo <yhwan.joo@samsung.com>
diff --git a/libcamera2/ExynosCameraHWInterface2.cpp b/libcamera2/ExynosCameraHWInterface2.cpp
index 491f9f1..11d9de6 100644
--- a/libcamera2/ExynosCameraHWInterface2.cpp
+++ b/libcamera2/ExynosCameraHWInterface2.cpp
@@ -2457,7 +2457,7 @@
if (m_ctlInfo.flash.m_afFlashEnableFlg) {
switch (m_ctlInfo.flash.m_afFlashCnt) {
case IS_FLASH_AF_ON:
- ALOGD("(%s): [AF Flash] IS_FLASH_ON", __FUNCTION__);
+ ALOGV("(%s): [AF Flash] IS_FLASH_ON", __FUNCTION__);
if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
m_ctlInfo.flash.m_flashWaitCnt = 0;
@@ -2466,16 +2466,17 @@
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_START;
break;
case IS_FLASH_AF_AUTO_AE_AWB_LOCK:
- ALOGD("(%s): [AF Flash] IS_FLASH_AF_AUTO_AE_AWB_LOCK", __FUNCTION__);
+ ALOGV("(%s): [AF Flash] IS_FLASH_AF_AUTO_AE_AWB_LOCK", __FUNCTION__);
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_AUTO;
shot_ext->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
//shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT;
break;
case IF_FLASH_AF_OFF:
- ALOGD("(%s): [AF Flash] IS_FLASH_OFF and status clear", __FUNCTION__);
+ ALOGV("(%s): [AF Flash] IS_FLASH_OFF and status clear", __FUNCTION__);
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
m_ctlInfo.flash.m_afFlashEnableFlg = false;
+ m_ctlInfo.flash.m_afFlashDoneFlg = true;
m_ctlInfo.flash.m_afFlashCnt = 0;
break;
}
@@ -2485,7 +2486,7 @@
if (m_ctlInfo.flash.m_flashEnableFlg) {
switch (m_ctlInfo.flash.m_flashCnt) {
case IS_FLASH_ON:
- ALOGD("(%s): [Flash] Flash ON for Capture", __FUNCTION__);
+ ALOGV("(%s): [Flash] Flash ON for Capture", __FUNCTION__);
if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
m_ctlInfo.flash.m_flashWaitCnt = 0;
@@ -2498,11 +2499,11 @@
//shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
shot_ext->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_AUTO;
- m_ctlInfo.flash.m_flashCnt = IS_FLASH_AUTO_AE_AWB_LOCK; // auto transition
+ m_ctlInfo.flash.m_flashCnt = IS_FLASH_AE_AWB_LOCK_WAIT; // auto transition
shot_ext->request_scc = 0;
shot_ext->request_scp = 0;
break;
- case IS_FLASH_AUTO_AE_AWB_LOCK:
+ case IS_FLASH_AE_AWB_LOCK_WAIT:
shot_ext->request_scc = 0;
shot_ext->request_scp = 0;
break;
@@ -2511,115 +2512,67 @@
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_CAPTURE;
shot_ext->request_scc = 0;
shot_ext->request_scp = 0;
- ALOGE("(%s): [Flash] AA_FLASHMODE_CAPTURE", __FUNCTION__);
+ ALOGV("(%s): [Flash] IS_FLASH_CAPTURE - %d", __FUNCTION__, shot_ext->shot.ctl.aa.aeflashMode);
break;
case IS_FLASH_CAPTURE_WAIT:
shot_ext->request_scc = 0;
shot_ext->request_scp = 0;
break;
case IS_FLASH_CAPTURE_JPEG:
+ ALOGV("(%s): [Flash] Flash Capture !!!!!", __FUNCTION__);
shot_ext->request_scc = 1;
shot_ext->request_scp = 1;
m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_END;
- ALOGE("(%s): [Flash] Flash Capture !!!!!", __FUNCTION__);
break;
case IS_FLASH_CAPTURE_END:
+ ALOGV("(%s): [Flash] Flash Capture END", __FUNCTION__);
shot_ext->request_scc = 0;
shot_ext->request_scp = 0;
shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
m_ctlInfo.flash.m_flashEnableFlg = false;
m_ctlInfo.flash.m_flashCnt = 0;
m_ctlInfo.flash.m_afFlashDoneFlg= false;
- ALOGE("(%s): [Flash] Flash Capture END", __FUNCTION__);
break;
}
}
}
-void ExynosCameraHWInterface2::flashListener(struct camera2_shot_ext * shot_ext)
+void ExynosCameraHWInterface2::flashListenerSensor(struct camera2_shot_ext * shot_ext)
{
// 1. AF Flash
if (m_ctlInfo.flash.m_afFlashEnableFlg) {
- ALOGV("(%s), [AF Flash] aa.aeflashMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.aa.aeflashMode, shot_ext->shot.dm.aa.aeflashMode);
- ALOGV("(%s), [AF Flash] flash.flashMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.flash.flashMode, shot_ext->shot.dm.flash.flashMode);
- ALOGV("(%s), [AF Flash] aa.awbMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.aa.awbMode, shot_ext->shot.dm.aa.awbMode);
-
switch (m_ctlInfo.flash.m_afFlashCnt) {
- case IS_FLASH_AF_ON_START:
- if (shot_ext->shot.dm.flash.decision) {
- // store decision result to skip capture sequenece
- if (shot_ext->shot.dm.flash.decision == 2)
- m_ctlInfo.flash.m_flashDecisionResult = false;
- else
- m_ctlInfo.flash.m_flashDecisionResult = true;
- if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
- if (m_ctlInfo.flash.m_flashWaitCnt > 0) {
- m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
- ALOGV("(%s): [AF Flash] Lis : hot_ext->shot.dm.flash.decision = true", __FUNCTION__);
- m_IsAfTriggerRequired = true;
- } else {
- ALOGV("(%s): [AF Flash] Lis : Waiting in case of ALWAYS ON", __FUNCTION__);
- m_ctlInfo.flash.m_flashWaitCnt++;
- }
+ case IS_FLASH_AF_AUTO_OFF_WAIT:
+ if (m_ctlInfo.flash.m_flashDecisionResult) {
+ if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
+ m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_END;
+ ALOGV("(%s): [AF Flash] Lis : AUTO -> OFF (%d)", __FUNCTION__, shot_ext->shot.dm.flash.flashMode);
} else {
- m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
- ALOGV("(%s): [AF Flash] Lis : hot_ext->shot.dm.flash.decision = true", __FUNCTION__);
- m_IsAfTriggerRequired = true;
+ ALOGV("(%s): [AF Flash] Waiting : AUTO -> OFF", __FUNCTION__);
}
} else {
- if (m_ctlInfo.flash.m_flashTimeOut == 0)
- m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
- else
- m_ctlInfo.flash.m_flashTimeOut--;
- }
- break;
- case IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT:
- // TODO: Monitoring awb lock mode
- if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_END;
- ALOGD("(%s): [AF Flash] Lis : AA_AWBMODE_LOCKED && CAM2_FLASH_MODE_OFF", __FUNCTION__);
- } else {
- ALOGV("(%s): [AF Flash] Waiting : AA_AWBMODE_LOCKED && CAM2_FLASH_MODE_OFF", __FUNCTION__);
}
break;
- case IF_FLASH_AF_OFF:
- ALOGD("(%s): [AF Flash] Lis : IS_FLASH_OFF : status clear", __FUNCTION__);
- break;
}
}
// 2. Flash
if (m_ctlInfo.flash.m_flashEnableFlg) {
- ALOGV("(%s), [AF Flash] aa.aeflashMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.aa.aeflashMode, shot_ext->shot.dm.aa.aeflashMode);
- ALOGV("(%s), [AF Flash] flash.flashMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.flash.flashMode, shot_ext->shot.dm.flash.flashMode);
- ALOGV("(%s), [AF Flash] aa.awbMode : (ctl,dm) - (%d , %d)", __FUNCTION__, shot_ext->shot.ctl.aa.awbMode, shot_ext->shot.dm.aa.awbMode);
- ALOGV("(%s), [AF Flash] flash.decision :%d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
-
switch (m_ctlInfo.flash.m_flashCnt) {
- case IS_FLASH_ON:
- if (shot_ext->shot.dm.flash.decision) {
- ALOGV("(%s): [AF Flash] Lis : hot_ext->shot.dm.flash.decision = true", __FUNCTION__);
- // store decision result to skip capture sequenece
- if (shot_ext->shot.dm.flash.decision == 2)
- m_ctlInfo.flash.m_flashDecisionResult = false;
- else
- m_ctlInfo.flash.m_flashDecisionResult = true;
- m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
+ case IS_FLASH_AUTO_WAIT:
+ if (m_ctlInfo.flash.m_flashDecisionResult) {
+ if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
+ m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
+ m_ctlInfo.flash.m_flashTimeOut = 10;
+ ALOGV("(%s): [Flash] Lis : AUTO -> OFF (%d)", __FUNCTION__, shot_ext->shot.dm.flash.flashMode);
+ } else {
+ ALOGV("(%s): [Flash] Waiting : AUTO -> OFF", __FUNCTION__);
+ }
} else {
- ALOGV("(%s): [Flash] Waiting : dm.flash.flashMode == ANDROID_FLASH_TORCH", __FUNCTION__);
- m_ctlInfo.flash.m_flashTimeOut--;
- if (m_ctlInfo.flash.m_flashTimeOut == 0)
- m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
- }
- break;
- case IS_FLASH_AUTO_AE_AWB_LOCK:
- if ((shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED)
- && (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF)) {
m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
- m_ctlInfo.flash.m_flashTimeOut = 4;
- ALOGV("(%s): [AF Flash] Lis : AA_AWBMODE_LOCKED && CAM2_FLASH_MODE_OFF", __FUNCTION__);
- } else {
- ALOGV("(%s): [Flash] Waiting : dm.flash.flashMode== AA_FLASHMODE_AUTO", __FUNCTION__);
+ m_ctlInfo.flash.m_flashTimeOut = 10;
+ ALOGV("(%s): [Flash] Skip : FLASH_AUTO -> FLASH_MODE_OFF", __FUNCTION__);
}
break;
}
@@ -2627,11 +2580,74 @@
}
-void ExynosCameraHWInterface2::flashListenerCapture(struct camera2_shot_ext * shot_ext)
+void ExynosCameraHWInterface2::flashListenerISP(struct camera2_shot_ext * shot_ext)
{
+ // 1. AF Flash
+ if (m_ctlInfo.flash.m_afFlashEnableFlg) {
+ switch (m_ctlInfo.flash.m_afFlashCnt) {
+ case IS_FLASH_AF_ON_START:
+ if (shot_ext->shot.dm.flash.decision > 0) {
+ // store decision result to skip capture sequenece
+ if (shot_ext->shot.dm.flash.decision == 2)
+ m_ctlInfo.flash.m_flashDecisionResult = false;
+ else
+ m_ctlInfo.flash.m_flashDecisionResult = true;
+ m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
+ ALOGV("(%s): [AF Flash] IS_FLASH_ON, decision - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
+ m_IsAfTriggerRequired = true;
+ } else {
+ if (m_ctlInfo.flash.m_flashTimeOut == 0) {
+ m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
+ ALOGE("(%s): [AF Flash] Timeout IS_FLASH_ON, decision is false setting", __FUNCTION__);
+ m_ctlInfo.flash.m_flashDecisionResult = false;
+ m_IsAfTriggerRequired = true;
+ } else {
+ m_ctlInfo.flash.m_flashTimeOut--;
+ }
+ }
+ break;
+ case IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT:
+ if (shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED) {
+ ALOGV("(%s): [AF Flash] AUTO_AE_AWB_LOCK_WAIT - %d", __FUNCTION__, shot_ext->shot.dm.aa.awbMode);
+ m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_OFF_WAIT;
+ } else {
+ ALOGV("(%s): [Flash] Waiting : AA_AWBMODE_LOCKED", __FUNCTION__);
+ }
+ break;
+ }
+ }
+
+ // 2. Flash
// firing stable field is valid at ISP meta output only.
if (m_ctlInfo.flash.m_flashEnableFlg) {
switch (m_ctlInfo.flash.m_flashCnt) {
+ case IS_FLASH_ON:
+ if (shot_ext->shot.dm.flash.decision > 0) {
+ // store decision result to skip capture sequenece
+ if (shot_ext->shot.dm.flash.decision == 2)
+ m_ctlInfo.flash.m_flashDecisionResult = false;
+ else
+ m_ctlInfo.flash.m_flashDecisionResult = true;
+ m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
+ ALOGV("(%s): [Flash] IS_FLASH_ON, decision - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
+ } else {
+ if (m_ctlInfo.flash.m_flashTimeOut == 0) {
+ m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
+ m_ctlInfo.flash.m_flashDecisionResult = false;
+ ALOGE("(%s): [Flash] Timeout IS_FLASH_ON, decision is false setting", __FUNCTION__);
+ } else {
+ m_ctlInfo.flash.m_flashTimeOut--;
+ }
+ }
+ break;
+ case IS_FLASH_AE_AWB_LOCK_WAIT:
+ if (shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED) {
+ ALOGV("(%s): [Flash] FLASH_AUTO_AE_AWB_LOCK_WAIT - %d", __FUNCTION__, shot_ext->shot.dm.aa.awbMode);
+ m_ctlInfo.flash.m_flashCnt = IS_FLASH_AUTO_WAIT;
+ } else {
+ ALOGV("(%s): [Flash] Waiting : AA_AWBMODE_LOCKED", __FUNCTION__);
+ }
+ break;
case IS_FLASH_CAPTURE_WAIT:
if (m_ctlInfo.flash.m_flashDecisionResult) {
if (shot_ext->shot.dm.flash.firingStable) {
@@ -2919,7 +2935,6 @@
m_ctlInfo.flash.m_flashFrameCount = matchedFrameCnt;
m_ctlInfo.flash.m_flashEnableFlg = true;
m_ctlInfo.flash.m_flashCaptured = false;
- m_ctlInfo.flash.m_flashDecisionResult = false;
if(m_ctlInfo.flash.m_afFlashDoneFlg) {
ALOGD("(%s): [Flash] Flash capture start", __FUNCTION__);
m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
@@ -2951,7 +2966,7 @@
}
}
- flashListener(shot_ext);
+ flashListenerSensor(shot_ext);
flashSetter(shot_ext);
ALOGV("(%s): queued aa(%d) aemode(%d) awb(%d) afmode(%d) trigger(%d)", __FUNCTION__,
@@ -2974,7 +2989,7 @@
shot_ext = (struct camera2_shot_ext *)(m_camera_info.isp.buffer[index_isp].virt.extP[1]);
- flashListenerCapture(shot_ext);
+ flashListenerISP(shot_ext);
ALOGV("### Isp DQbuf done(%d) count (%d), SCP(%d) SCC(%d) shot_size(%d)",
index,
@@ -4171,7 +4186,6 @@
m_ctlInfo.flash.m_afFlashEnableFlg = true;
m_ctlInfo.flash.m_flashTimeOut = 3;
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
- m_ctlInfo.flash.m_afFlashDoneFlg = true;
m_ctlInfo.flash.m_flashDecisionResult = false;
}
OnAfTriggerAutoMacro(id);
@@ -4247,7 +4261,6 @@
m_ctlInfo.flash.m_afFlashEnableFlg = true;
m_ctlInfo.flash.m_flashTimeOut = 3;
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
- m_ctlInfo.flash.m_afFlashDoneFlg = true;
m_ctlInfo.flash.m_flashDecisionResult = false;
}
break;
@@ -4262,7 +4275,6 @@
m_ctlInfo.flash.m_afFlashEnableFlg = true;
m_ctlInfo.flash.m_flashTimeOut = 3;
m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
- m_ctlInfo.flash.m_afFlashDoneFlg = true;
m_ctlInfo.flash.m_flashDecisionResult = false;
}
break;
@@ -5135,11 +5147,17 @@
exifInfo->metering_mode = EXIF_METERING_CENTER;
//3 Flash
+ /*
int flash = dm->flash.flashMode;
if (dm->flash.flashMode == FLASH_MODE_OFF || flash < 0)
exifInfo->flash = EXIF_DEF_FLASH;
else
exifInfo->flash = flash;
+ */
+ if (m_ctlInfo.flash.m_flashDecisionResult)
+ exifInfo->flash = 1;
+ else
+ exifInfo->flash = EXIF_DEF_FLASH;
//3 White Balance
if (dm->aa.awbMode == AA_AWBMODE_WB_AUTO)
diff --git a/libcamera2/ExynosCameraHWInterface2.h b/libcamera2/ExynosCameraHWInterface2.h
index a5929b8..1afd72c 100644
--- a/libcamera2/ExynosCameraHWInterface2.h
+++ b/libcamera2/ExynosCameraHWInterface2.h
@@ -131,7 +131,8 @@
enum is_flash_scenario_state {
IS_FLASH_ON = 1,
IS_FLASH_ON_DONE = 2,
- IS_FLASH_AUTO_AE_AWB_LOCK = 10,
+ IS_FLASH_AE_AWB_LOCK_WAIT = 10,
+ IS_FLASH_AUTO_WAIT = 10,
IS_FLASH_CAPTURE,
IS_FLASH_CAPTURE_WAIT,
IS_FLASH_CAPTURE_JPEG,
@@ -145,6 +146,7 @@
IS_FLASH_AF_ON_DONE,
IS_FLASH_AF_AUTO_AE_AWB_LOCK,
IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT,
+ IS_FLASH_AF_AUTO_OFF_WAIT,
IS_FLASH_AF_AUTO_END,
IF_FLASH_AF_OFF,
IS_FLASH_AF_MAX
@@ -586,8 +588,8 @@
void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
camera2_shot *currentEntry);
void flashSetter(struct camera2_shot_ext * shot_ext);
- void flashListener(struct camera2_shot_ext * shot_ext);
- void flashListenerCapture(struct camera2_shot_ext * shot_ext);
+ void flashListenerSensor(struct camera2_shot_ext * shot_ext);
+ void flashListenerISP(struct camera2_shot_ext * shot_ext);
void *m_exynosPictureCSC;
void *m_exynosVideoCSC;