summaryrefslogtreecommitdiffstats
path: root/camera/OMXCameraAdapter/OMXCapture.cpp
diff options
context:
space:
mode:
authorTyler Luu <tluu@ti.com>2012-03-23 20:03:25 -0500
committerDaniel Levin <dendy@ti.com>2012-07-25 08:55:44 -0500
commit3654e43f4d849d253fd5162a8a00c5ccdd03acad (patch)
tree21710225d9296cdaf11402bcc1a7167e5f2a10a1 /camera/OMXCameraAdapter/OMXCapture.cpp
parent182343994eaebfe386df643aa2777afbb1d5e873 (diff)
downloadhardware_ti_omap4-3654e43f4d849d253fd5162a8a00c5ccdd03acad.zip
hardware_ti_omap4-3654e43f4d849d253fd5162a8a00c5ccdd03acad.tar.gz
hardware_ti_omap4-3654e43f4d849d253fd5162a8a00c5ccdd03acad.tar.bz2
CameraHal: Implement absolute exp/gain bracketing
User sets KEY_EXP_GAIN_BRACKETING_RANGE with string of (exp, gain) pairs and KEY_BURST with the number of pairs Example: Absolute Gain: "(100,300),(200,300),(400,300),(800,300),(1600,300)" Change-Id: Id875e475051466eeb92c3e528762fc4ac37db502 Signed-off-by: Tyler Luu <tluu@ti.com> Signed-off-by: Vladimir Petrov <vppetrov@mm-sol.com>
Diffstat (limited to 'camera/OMXCameraAdapter/OMXCapture.cpp')
-rw-r--r--camera/OMXCameraAdapter/OMXCapture.cpp91
1 files changed, 48 insertions, 43 deletions
diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp
index 31c78e4..7e2ac8b 100644
--- a/camera/OMXCameraAdapter/OMXCapture.cpp
+++ b/camera/OMXCameraAdapter/OMXCapture.cpp
@@ -156,9 +156,15 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters &params,
mBracketingSet = false;
}
- str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
- if ( NULL != str ) {
- parseExpRange(str, mExposureBracketingValues, EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
+ if ( (str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) {
+ parseExpRange(str, mExposureBracketingValues, NULL,
+ EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
+ mExposureBracketMode = OMX_BracketExposureRelativeInEV;
+ mPendingCaptureSettings |= SetExpBracket;
+ } else if ( (str = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) {
+ parseExpRange(str, mExposureBracketingValues, mExposureGainBracketingValues,
+ EXP_BRACKET_RANGE, mExposureBracketingValidEntries);
+ mExposureBracketMode = OMX_BracketExposureGainAbsolute;
mPendingCaptureSettings |= SetExpBracket;
} else {
// if bracketing was previously set...we set again before capturing to clear
@@ -349,59 +355,49 @@ status_t OMXCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCou
}
status_t OMXCameraAdapter::parseExpRange(const char *rangeStr,
- int * expRange,
+ int *expRange,
+ int *gainRange,
size_t count,
size_t &validEntries)
{
status_t ret = NO_ERROR;
- char *ctx, *expVal;
- char *tmp = NULL;
+ char *end = NULL;
+ const char *startPtr = NULL;
size_t i = 0;
LOG_FUNCTION_NAME;
- if ( NULL == rangeStr )
- {
+ if ( NULL == rangeStr ){
return -EINVAL;
- }
+ }
- if ( NULL == expRange )
- {
+ if ( NULL == expRange ){
return -EINVAL;
- }
-
- if ( NO_ERROR == ret )
- {
- tmp = ( char * ) malloc( strlen(rangeStr) + 1 );
+ }
- if ( NULL == tmp )
- {
- CAMHAL_LOGEA("No resources for temporary buffer");
- return -1;
+ if ( NO_ERROR == ret ) {
+ startPtr = rangeStr;
+ do {
+ // Relative Exposure example: "-30,-10, 0, 10, 30"
+ // Absolute Gain ex. (exposure,gain) pairs: "(-30,0),(-10, 0),(0,0),(10,0),(30,0)"
+
+ // skip '(' and ','
+ while ((*startPtr == '(') || (*startPtr == ',')) startPtr++;
+
+ expRange[i] = (int)strtol(startPtr, &end, 10);
+ // if gainRange is given rangeStr should be (exposure, gain) pair
+ if (gainRange) {
+ startPtr = end + 1; // for the ','
+ gainRange[i] = (int)strtol(startPtr, &end, 10);
}
- memset(tmp, '\0', strlen(rangeStr) + 1);
-
- }
-
- if ( NO_ERROR == ret )
- {
- strncpy(tmp, rangeStr, strlen(rangeStr) );
- expVal = strtok_r( (char *) tmp, CameraHal::PARAMS_DELIMITER, &ctx);
-
- i = 0;
- while ( ( NULL != expVal ) && ( i < count ) )
- {
- expRange[i] = atoi(expVal);
- expVal = strtok_r(NULL, CameraHal::PARAMS_DELIMITER, &ctx);
+ startPtr = end;
i++;
- }
- validEntries = i;
- }
- if ( NULL != tmp )
- {
- free(tmp);
- }
+ // skip ')'
+ while (*startPtr == ')') startPtr++;
+ } while ((startPtr[0] != '\0') && (i < count));
+ validEntries = i;
+ }
LOG_FUNCTION_NAME_EXIT;
@@ -409,6 +405,7 @@ status_t OMXCameraAdapter::parseExpRange(const char *rangeStr,
}
status_t OMXCameraAdapter::setExposureBracketing(int *evValues,
+ int *evValues2,
size_t evCount,
size_t frameCount)
{
@@ -474,13 +471,19 @@ status_t OMXCameraAdapter::setExposureBracketing(int *evValues,
else
{
extExpCapMode.bEnableBracketing = OMX_TRUE;
- extExpCapMode.tBracketConfigType.eBracketMode = OMX_BracketExposureRelativeInEV;
+ extExpCapMode.tBracketConfigType.eBracketMode = mExposureBracketMode;
extExpCapMode.tBracketConfigType.nNbrBracketingValues = evCount - 1;
}
for ( unsigned int i = 0 ; i < evCount ; i++ )
{
- extExpCapMode.tBracketConfigType.nBracketValues[i] = ( evValues[i] * ( 1 << Q16_OFFSET ) ) / 10;
+ if (mExposureBracketMode == OMX_BracketExposureGainAbsolute) {
+ extExpCapMode.tBracketConfigType.nBracketValues[i] = evValues[i];
+ extExpCapMode.tBracketConfigType.nBracketValues2[i] = evValues2[i];
+ } else {
+ // assuming OMX_BracketExposureRelativeInEV
+ extExpCapMode.tBracketConfigType.nBracketValues[i] = ( evValues[i] * ( 1 << Q16_OFFSET ) ) / 10;
+ }
}
eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
@@ -1215,10 +1218,12 @@ status_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num)
mPendingCaptureSettings &= ~SetExpBracket;
if ( mBracketingSet ) {
ret = setExposureBracketing(mExposureBracketingValues,
+ mExposureGainBracketingValues,
0,
0);
} else {
ret = setExposureBracketing(mExposureBracketingValues,
+ mExposureGainBracketingValues,
mExposureBracketingValidEntries,
mBurstFrames);
}