blob: 72a0fc739fd4d5f99d9a1d5b98d7d7cb8d035229 [file] [log] [blame]
/*
**
** Copyright 2013, Samsung Electronics Co. LTD
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/* #define LOG_NDEBUG 0 */
#define LOG_TAG "ExynosCameraParameters"
#include <cutils/log.h>
#include "ExynosCameraParameters.h"
namespace android {
ExynosCameraParameters::ExynosCameraParameters(int cameraId, __unused bool flagCompanion, int halVersion)
{
m_cameraId = cameraId;
m_halVersion = halVersion;
const char *myName = (m_cameraId == CAMERA_ID_BACK) ? "ParametersBack" : "ParametersFront";
strncpy(m_name, myName, EXYNOS_CAMERA_NAME_STR_SIZE - 1);
m_staticInfo = createSensorInfo(cameraId);
m_useSizeTable = (m_staticInfo->sizeTableSupport) ? USE_CAMERA_SIZE_TABLE : false;
m_useAdaptiveCSCRecording = (cameraId == CAMERA_ID_BACK) ? USE_ADAPTIVE_CSC_RECORDING : false;
m_exynosconfig = NULL;
m_activityControl = new ExynosCameraActivityControl(m_cameraId);
memset(&m_cameraInfo, 0, sizeof(struct exynos_camera_info));
memset(&m_exifInfo, 0, sizeof(m_exifInfo));
m_initMetadata();
m_setExifFixedAttribute();
#ifdef SAMSUNG_DNG
m_setDngFixedAttribute();
#endif
m_exynosconfig = new ExynosConfigInfo();
mDebugInfo.num_of_appmarker = 1; /* Default : APP4 */
mDebugInfo.idx[0][0] = 4; /* matching the app marker 4 */
#ifdef SAMSUNG_OIS
if (cameraId == CAMERA_ID_BACK) {
mDebugInfo.debugSize[4] = sizeof(struct camera2_udm) + sizeof(struct ois_exif_data);
} else {
mDebugInfo.debugSize[4] = sizeof(struct camera2_udm);
}
#else
mDebugInfo.debugSize[4] = sizeof(struct camera2_udm);
#endif
#ifdef SAMSUNG_BD
mDebugInfo.debugSize[4] += sizeof(struct bd_exif_data);
#endif
#ifdef SAMSUNG_LLS_DEBLUR
mDebugInfo.debugSize[4] += sizeof(struct lls_exif_data);
#endif
mDebugInfo.debugData[4] = new char[mDebugInfo.debugSize[4]];
memset((void *)mDebugInfo.debugData[4], 0, mDebugInfo.debugSize[4]);
memset((void *)m_exynosconfig, 0x00, sizeof(struct ExynosConfigInfo));
#ifdef SAMSUNG_UTC_TS
mDebugInfo.num_of_appmarker++;
mDebugInfo.idx[1][0] = 5; /* mathcing the app marker 5 */
mDebugInfo.debugSize[5] = sizeof(struct utc_ts);
mDebugInfo.debugData[5] = new char[mDebugInfo.debugSize[5]];
memset((void *)mDebugInfo.debugData[5], 0, mDebugInfo.debugSize[5]);
#endif
// CAUTION!! : Initial values must be prior to setDefaultParameter() function.
// Initial Values : START
#if defined(SAMSUNG_COMPANION) || defined(SAMSUNG_EEPROM)
m_romReadThreadDone = false;
m_use_companion = flagCompanion;
#endif
m_IsThumbnailCallbackOn = false;
m_fastFpsMode = 0;
m_previewRunning = false;
m_previewSizeChanged = false;
m_pictureRunning = false;
m_recordingRunning = false;
m_flagRestartPreviewChecked = false;
m_flagRestartPreview = false;
m_reallocBuffer = false;
m_setFocusmodeSetting = false;
m_flagMeteringRegionChanged = false;
m_flagCheckDualMode = false;
m_flagHWVDisMode = false;
m_flagVideoStabilization = false;
m_flag3dnrMode = false;
m_flagCheck3aaIspOtf = false;
m_flag3aaIspOtf = false;
m_flagCheckIspTpuOtf = false;
m_flagIspTpuOtf = false;
#ifdef LLS_CAPTURE
m_flagLLSOn = false;
m_LLSCaptureOn = false;
m_LLSValue = 0;
#endif
#ifdef SR_CAPTURE
m_flagSRSOn = false;
#endif
#ifdef OIS_CAPTURE
m_flagOISCaptureOn = false;
#endif
#ifdef SAMSUNG_DNG
m_flagDNGCaptureOn = false;
m_use_DNGCapture = false;
m_flagMultiFrame = false;
m_isUsefulDngInfo = false;
#endif
m_flagCheckRecordingHint = false;
m_zoomWithScaler = false;
#ifdef SAMSUNG_HRM
m_flagSensorHRM_Hint = false;
#endif
#ifdef SAMSUNG_LIGHT_IR
m_flagSensorLight_IR_Hint = false;
#endif
#ifdef SAMSUNG_GYRO
m_flagSensorGyroHint = false;
/* Initialize gyro value for inital-calibration */
m_metadata.shot.uctl.aaUd.gyroInfo.x = 1234;
m_metadata.shot.uctl.aaUd.gyroInfo.y = 1234;
m_metadata.shot.uctl.aaUd.gyroInfo.z = 1234;
#endif
m_useDynamicBayer = (cameraId == CAMERA_ID_BACK) ? USE_DYNAMIC_BAYER : USE_DYNAMIC_BAYER_FRONT;
m_useDynamicBayerVideoSnapShot =
(cameraId == CAMERA_ID_BACK) ? USE_DYNAMIC_BAYER_VIDEO_SNAP_SHOT : USE_DYNAMIC_BAYER_VIDEO_SNAP_SHOT_FRONT;
m_useDynamicScc = (cameraId == CAMERA_ID_BACK) ? USE_DYNAMIC_SCC_REAR : USE_DYNAMIC_SCC_FRONT;
#if defined(SAMSUNG_COMPANION) || defined(SAMSUNG_EEPROM)
m_useFastenAeStable = isFastenAeStable(cameraId, m_use_companion);
#else
m_useFastenAeStable = isFastenAeStable(cameraId, false);
#endif
/* we cannot know now, whether recording mode or not */
/*
if (getRecordingHint() == true || getDualRecordingHint() == true)
m_usePureBayerReprocessing = (cameraId == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING_ON_RECORDING : USE_PURE_BAYER_REPROCESSING_FRONT_ON_RECORDING;
else
*/
m_usePureBayerReprocessing = (cameraId == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING : USE_PURE_BAYER_REPROCESSING_FRONT;
#ifdef SAMSUNG_LLV
m_isLLVOn = true;
#endif
#ifdef SAMSUNG_OT
m_startObjectTracking = false;
m_objectTrackingAreaChanged = false;
m_objectTrackingGet = false;
int maxNumFocusAreas = getMaxNumFocusAreas();
m_objectTrackingArea = new ExynosRect2[maxNumFocusAreas];
m_objectTrackingWeight = new int[maxNumFocusAreas];
#endif
#ifdef SAMSUNG_LBP
m_useBestPic = USE_LIVE_BEST_PIC;
#endif
#ifdef SAMSUNG_JQ
m_isJpegQtableOn = false;
m_jpegQtableStatus = JPEG_QTABLE_DEINIT;
#endif
m_enabledMsgType = 0;
m_previewBufferCount = NUM_PREVIEW_BUFFERS;
m_dvfsLock = false;
#ifdef SAMSUNG_DOF
m_curLensStep = 0;
m_curLensCount = 0;
#endif
#ifdef USE_BINNING_MODE
m_binningProperty = checkProperty(false);
#endif
#ifdef SAMSUNG_OIS
m_oisNode = NULL;
m_setOISmodeSetting = false;
#ifdef OIS_CAPTURE
m_llsValue = 0;
#endif
#endif
m_zoom_activated = false;
#ifdef FORCE_CAL_RELOAD
m_calValid = true;
#endif
#ifdef USE_FADE_IN_ENTRANCE
m_flagFirstEntrance = false;
#endif
m_exposureTimeCapture = 0;
#ifdef SAMSUNG_LLS_DEBLUR
m_flagLDCaptureMode = 0;
m_LDCaptureCount = 0;
#endif
// Initial Values : END
setDefaultCameraInfo();
setDefaultParameter();
}
ExynosCameraParameters::~ExynosCameraParameters()
{
if (m_staticInfo != NULL) {
delete m_staticInfo;
m_staticInfo = NULL;
}
if (m_activityControl != NULL) {
delete m_activityControl;
m_activityControl = NULL;
}
for(int i = 0; i < mDebugInfo.num_of_appmarker; i++) {
if(mDebugInfo.debugData[mDebugInfo.idx[i][0]])
delete mDebugInfo.debugData[mDebugInfo.idx[i][0]];
mDebugInfo.debugData[mDebugInfo.idx[i][0]] = NULL;
mDebugInfo.debugSize[mDebugInfo.idx[i][0]] = 0;
}
if (m_exynosconfig != NULL) {
memset((void *)m_exynosconfig, 0x00, sizeof(struct ExynosConfigInfo));
delete m_exynosconfig;
m_exynosconfig = NULL;
}
if (m_exifInfo.maker_note) {
delete m_exifInfo.maker_note;
m_exifInfo.maker_note = NULL;
}
if (m_exifInfo.user_comment) {
delete m_exifInfo.user_comment;
m_exifInfo.user_comment = NULL;
}
#ifdef SAMSUNG_OT
if (m_objectTrackingArea != NULL)
delete[] m_objectTrackingArea;
if (m_objectTrackingWeight != NULL)
delete[] m_objectTrackingWeight;
#endif
}
int ExynosCameraParameters::getCameraId(void)
{
return m_cameraId;
}
status_t ExynosCameraParameters::setParameters(const CameraParameters& params)
{
status_t ret = NO_ERROR;
#ifdef TEST_GED_HIGH_SPEED_RECORDING
int minFpsRange = 0, maxFpsRange = 0;
int frameRate = 0;
params.getPreviewFpsRange(&minFpsRange, &maxFpsRange);
frameRate = params.getPreviewFrameRate();
CLOGD("DEBUG(%s[%d]):getFastFpsMode=%d, maxFpsRange=%d, frameRate=%d",
__FUNCTION__, __LINE__, getFastFpsMode(), maxFpsRange, frameRate);
if (frameRate == 60) {
setFastFpsMode(1);
} else if (frameRate == 120) {
setFastFpsMode(2);
} else if (frameRate == 240) {
setFastFpsMode(3);
} else {
setFastFpsMode(0);
}
CLOGD("DEBUG(%s[%d]):getFastFpsMode=%d", __FUNCTION__, __LINE__, getFastFpsMode());
#endif
#ifdef USE_FADE_IN_ENTRANCE
if (checkFirstEntrance(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkFirstEntrance faild", __FUNCTION__, __LINE__);
}
#endif
/* Return OK means that the vision mode is enabled */
if (checkVisionMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkVisionMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (getVisionMode() == true) {
CLOGD("DEBUG(%s[%d]): Vision mode enabled", __FUNCTION__, __LINE__);
return NO_ERROR;
}
if (checkRecordingHint(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkRecordingHint fail", __FUNCTION__, __LINE__);
if (checkDualMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkDualMode fail", __FUNCTION__, __LINE__);
if (checkDualRecordingHint(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkDualRecordingHint fail", __FUNCTION__, __LINE__);
if (checkEffectHint(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkEffectHint fail", __FUNCTION__, __LINE__);
if (checkEffectRecordingHint(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkEffectRecordingHint fail", __FUNCTION__, __LINE__);
if (checkPreviewFps(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkPreviewFps fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (getRecordingRunning() == false) {
if (checkVideoSize(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkVideoSize fail", __FUNCTION__, __LINE__);
}
if (getCameraId() == CAMERA_ID_BACK) {
if (checkFastFpsMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkFastFpsMode fail", __FUNCTION__, __LINE__);
}
if (checkVideoStabilization(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkVideoStabilization fail", __FUNCTION__, __LINE__);
if (checkSWVdisMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSWVdisMode fail", __FUNCTION__, __LINE__);
bool swVdisUIMode = false;
#ifdef SUPPORT_SW_VDIS
swVdisUIMode = getVideoStabilization();
#endif /*SUPPORT_SW_VDIS*/
m_setSWVdisUIMode(swVdisUIMode);
if (checkVtMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkVtMode fail", __FUNCTION__, __LINE__);
if (checkHWVdisMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkHWVdisMode fail", __FUNCTION__, __LINE__);
if (check3dnrMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): check3dnrMode fail", __FUNCTION__, __LINE__);
if (checkDrcMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkDrcMode fail", __FUNCTION__, __LINE__);
if (checkOdcMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkOdcMode fail", __FUNCTION__, __LINE__);
if (checkPreviewSize(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkPreviewSize fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkPreviewFormat(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkPreviewFormat fail", __FUNCTION__, __LINE__);
if (checkPictureSize(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkPictureSize fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkPictureFormat(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkPictureFormat fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkJpegQuality(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkJpegQuality fail", __FUNCTION__, __LINE__);
if (checkThumbnailSize(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkThumbnailSize fail", __FUNCTION__, __LINE__);
if (checkThumbnailQuality(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkThumbnailQuality fail", __FUNCTION__, __LINE__);
if (checkZoomLevel(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkZoomLevel fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkRotation(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkRotation fail", __FUNCTION__, __LINE__);
if (checkAutoExposureLock(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkAutoExposureLock fail", __FUNCTION__, __LINE__);
ret = checkExposureCompensation(params);
if (ret != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkExposureCompensation fail", __FUNCTION__, __LINE__);
return ret;
}
if (checkExposureTime(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkExposureTime fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkMeteringMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkMeteringMode fail", __FUNCTION__, __LINE__);
if (checkMeteringAreas(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkMeteringAreas fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkAntibanding(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkAntibanding fail", __FUNCTION__, __LINE__);
if (checkSceneMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkSceneMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkFocusMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkFocusMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkFlashMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkFlashMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkWhiteBalanceMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkWhiteBalanceMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkAutoWhiteBalanceLock(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkAutoWhiteBalanceLock fail", __FUNCTION__, __LINE__);
#ifdef SAMSUNG_FOOD_MODE
if (checkWbLevel(params) != NO_ERROR) {
ALOGE("ERR(%s[%d]): checkWbLevel fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
#endif
if (checkWbKelvin(params) != NO_ERROR) {
ALOGE("ERR(%s[%d]): checkWbKelvin fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkFocusAreas(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkFocusAreas fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
#ifdef SAMSUNG_MANUAL_FOCUS
if (checkFocusDistance(params) != NO_ERROR) {
ALOGE("ERR(%s[%d]): checkFocusDistance fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
#endif
if (checkColorEffectMode(params) != NO_ERROR) {
CLOGE("ERR(%s[%d]): checkColorEffectMode fail", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
if (checkGpsAltitude(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGpsAltitude fail", __FUNCTION__, __LINE__);
if (checkGpsLatitude(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGpsLatitude fail", __FUNCTION__, __LINE__);
if (checkGpsLongitude(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGpsLongitude fail", __FUNCTION__, __LINE__);
if (checkGpsProcessingMethod(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGpsProcessingMethod fail", __FUNCTION__, __LINE__);
if (checkGpsTimeStamp(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGpsTimeStamp fail", __FUNCTION__, __LINE__);
#if 0
if (checkCityId(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkCityId fail", __FUNCTION__, __LINE__);
if (checkWeatherId(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkWeatherId fail", __FUNCTION__, __LINE__);
#endif
if (checkBrightness(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkBrightness fail", __FUNCTION__, __LINE__);
if (checkSaturation(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSaturation fail", __FUNCTION__, __LINE__);
if (checkSharpness(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSharpness fail", __FUNCTION__, __LINE__);
if (checkHue(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkHue fail", __FUNCTION__, __LINE__);
#ifdef SAMSUNG_COMPANION
if (getSceneMode() != SCENE_MODE_HDR) {
if (checkRTDrc(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkRTDrc fail", __FUNCTION__, __LINE__);
}
if (checkPaf(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkPaf fail", __FUNCTION__, __LINE__);
if (getSceneMode() != SCENE_MODE_HDR) {
if (checkRTHdr(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkRTHdr fail", __FUNCTION__, __LINE__);
}
#endif
if (checkIso(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkIso fail", __FUNCTION__, __LINE__);
if (checkContrast(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkContrast fail", __FUNCTION__, __LINE__);
if (checkHdrMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkHdrMode fail", __FUNCTION__, __LINE__);
if (checkWdrMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkWdrMode fail", __FUNCTION__, __LINE__);
if (checkShotMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkShotMode fail", __FUNCTION__, __LINE__);
if (checkAntiShake(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkAntiShake fail", __FUNCTION__, __LINE__);
if (checkVRMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkVRMode fail", __FUNCTION__, __LINE__);
if (checkGamma(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkGamma fail", __FUNCTION__, __LINE__);
if (checkSlowAe(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSlowAe fail", __FUNCTION__, __LINE__);
if (checkScalableSensorMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkScalableSensorMode fail", __FUNCTION__, __LINE__);
if (checkImageUniqueId(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkImageUniqueId fail", __FUNCTION__, __LINE__);
if (checkSeriesShotMode(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSeriesShotMode fail", __FUNCTION__, __LINE__);
#ifdef BURST_CAPTURE
if (checkSeriesShotFilePath(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSeriesShotFilePath fail", __FUNCTION__, __LINE__);
#endif
#ifdef SAMSUNG_DNG
if (checkDngFilePath(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkDngFilePath fail", __FUNCTION__, __LINE__);
#endif
#ifdef SAMSUNG_LLV
if (checkLLV(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkLLV fail", __FUNCTION__, __LINE__);
#endif
#ifdef SAMSUNG_DOF
if (checkMoveLens(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkMoveLens fail", __FUNCTION__, __LINE__);
#endif
#ifdef SAMSUNG_OIS
if (checkOIS(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkOIS fail", __FUNCTION__, __LINE__);
#endif
if (m_getRestartPreviewChecked() == true) {
CLOGD("DEBUG(%s[%d]):Need restart preview", __FUNCTION__, __LINE__);
m_setRestartPreview(m_flagRestartPreviewChecked);
}
if (checkSetfileYuvRange() != NO_ERROR)
CLOGE("ERR(%s[%d]): checkSetfileYuvRange fail", __FUNCTION__, __LINE__);
#ifdef SAMSUNG_QUICKSHOT
if (checkQuickShot(params) != NO_ERROR)
CLOGE("ERR(%s[%d]): checkQuichShot fail", __FUNCTION__, __LINE__);
#endif
checkHorizontalViewAngle();
return ret;
}
CameraParameters ExynosCameraParameters::getParameters() const
{
CLOGI("INFO(%s[%d])", __FUNCTION__, __LINE__);
return m_params;
}
void ExynosCameraParameters::setDefaultCameraInfo(void)
{
CLOGI("INFO(%s[%d])", __FUNCTION__, __LINE__);
m_setHwSensorSize(m_staticInfo->maxSensorW, m_staticInfo->maxSensorH);
m_setHwPreviewSize(m_staticInfo->maxPreviewW, m_staticInfo->maxPreviewH);
m_setHwPictureSize(m_staticInfo->maxPictureW, m_staticInfo->maxPictureH);
/* Initalize BNS scale ratio, step:500, ex)1500->x1.5 scale down */
m_setBnsScaleRatio(1000);
/* Initalize Binning scale ratio */
m_setBinningScaleRatio(1000);
/* Set Default VideoSize to FHD */
m_setVideoSize(1920,1080);
}
void ExynosCameraParameters::setDefaultParameter(void)
{
CLOGI("INFO(%s[%d])", __FUNCTION__, __LINE__);
status_t ret = NO_ERROR;
CameraParameters p;
String8 tempStr;
char strBuf[256];
m_cameraInfo.autoFocusMacroPosition = ExynosCameraActivityAutofocus::AUTOFOCUS_MACRO_POSITION_BASE;
/* Preview Size */
getMaxPreviewSize(&m_cameraInfo.previewW, &m_cameraInfo.previewH);
m_setHwPreviewSize(m_cameraInfo.previewW, m_cameraInfo.previewH);
tempStr.setTo("");
if (getResolutionList(tempStr, m_staticInfo, &m_cameraInfo.previewW, &m_cameraInfo.previewH, MODE_PREVIEW, m_cameraId) != NO_ERROR) {
CLOGE("ERR(%s):getResolutionList(MODE_PREVIEW) fail", __FUNCTION__);
m_cameraInfo.previewW = 640;
m_cameraInfo.previewH = 480;
tempStr = String8::format("%dx%d", m_cameraInfo.previewW, m_cameraInfo.previewH);
}
p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, tempStr.string());
CLOGD("DEBUG(%s): Default preview size is %dx%d", __FUNCTION__, m_cameraInfo.previewW, m_cameraInfo.previewH);
p.setPreviewSize(m_cameraInfo.previewW, m_cameraInfo.previewH);
/* Preview Format */
tempStr.setTo("");
tempStr = String8::format("%s,%s", CameraParameters::PIXEL_FORMAT_YUV420SP, CameraParameters::PIXEL_FORMAT_YUV420P);
p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, tempStr);
p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);
/* Video Size */
getMaxVideoSize(&m_cameraInfo.maxVideoW, &m_cameraInfo.maxVideoH);
tempStr.setTo("");
if (getResolutionList(tempStr, m_staticInfo, &m_cameraInfo.maxVideoW, &m_cameraInfo.maxVideoH, MODE_VIDEO, m_cameraId) != NO_ERROR) {
CLOGE("ERR(%s):getResolutionList(MODE_VIDEO) fail", __FUNCTION__);
m_cameraInfo.videoW = 640;
m_cameraInfo.videoH = 480;
tempStr = String8::format("%dx%d", m_cameraInfo.maxVideoW, m_cameraInfo.maxVideoH);
}
#ifdef CAMERA_GED_FEATURE
else {
#ifdef USE_WQHD_RECORDING
if (m_addHiddenResolutionList(tempStr, m_staticInfo, 2560, 1440, MODE_VIDEO, m_cameraId) != NO_ERROR) {
CLOGW("WARN(%s):getResolutionList(MODE_VIDEO) fail", __FUNCTION__);
}
#endif
#ifdef USE_UHD_RECORDING
if (m_addHiddenResolutionList(tempStr, m_staticInfo, 3840, 2160, MODE_VIDEO, m_cameraId) != NO_ERROR) {
CLOGW("WARN(%s):getResolutionList(MODE_VIDEO) fail", __FUNCTION__);
}
#endif
}
#endif
CLOGD("DEBUG(%s): KEY_SUPPORTED_VIDEO_SIZES %s", __FUNCTION__, tempStr.string());
p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, tempStr.string());
CLOGD("DEBUG(%s): Max video size is %dx%d", __FUNCTION__, m_cameraInfo.maxVideoW, m_cameraInfo.maxVideoH);
CLOGD("DEBUG(%s): Default video size is %dx%d", __FUNCTION__, m_cameraInfo.videoW, m_cameraInfo.videoH);
p.setVideoSize(m_cameraInfo.videoW, m_cameraInfo.videoH);
/* Video Format */
if (getAdaptiveCSCRecording() == true) {
CLOGI("INFO(%s[%d]):video_frame_foramt == YUV420SP_NV21", __FUNCTION__, __LINE__);
p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, CameraParameters::PIXEL_FORMAT_YUV420SP_NV21);
} else {
CLOGI("INFO(%s[%d]):video_frame_foramt == YUV420SP", __FUNCTION__, __LINE__);
p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, CameraParameters::PIXEL_FORMAT_YUV420SP);
}
/* Preferred preview size for Video */
tempStr.setTo("");
tempStr = String8::format("%dx%d", m_cameraInfo.previewW, m_cameraInfo.previewH);
p.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, tempStr.string());
/* Picture Size */
getMaxPictureSize(&m_cameraInfo.pictureW, &m_cameraInfo.pictureH);
tempStr.setTo("");
if (getResolutionList(tempStr, m_staticInfo, &m_cameraInfo.pictureW, &m_cameraInfo.pictureH, MODE_PICTURE, m_cameraId) != NO_ERROR) {
CLOGE("ERR(%s):m_getResolutionList(MODE_PICTURE) fail", __FUNCTION__);
m_cameraInfo.pictureW = 640;
m_cameraInfo.pictureW = 480;
tempStr = String8::format("%dx%d", m_cameraInfo.pictureW, m_cameraInfo.pictureH);
}
p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, tempStr.string());
CLOGD("DEBUG(%s): Default picture size is %dx%d", __FUNCTION__, m_cameraInfo.pictureW, m_cameraInfo.pictureH);
p.setPictureSize(m_cameraInfo.pictureW, m_cameraInfo.pictureH);
/* Picture Format */
p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, CameraParameters::PIXEL_FORMAT_JPEG);
p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
/* Jpeg Quality */
p.set(CameraParameters::KEY_JPEG_QUALITY, "96"); /* maximum quality */
/* Thumbnail Size */
getMaxThumbnailSize(&m_cameraInfo.thumbnailW, &m_cameraInfo.thumbnailH);
tempStr.setTo("");
if (getResolutionList(tempStr, m_staticInfo, &m_cameraInfo.thumbnailW, &m_cameraInfo.thumbnailH, MODE_THUMBNAIL, m_cameraId) != NO_ERROR) {
tempStr = String8::format("%dx%d", m_cameraInfo.thumbnailW, m_cameraInfo.thumbnailH);
}
/* 0x0 is no thumbnail mode */
tempStr.append(",0x0");
p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, tempStr.string());
p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, m_cameraInfo.thumbnailW);
p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, m_cameraInfo.thumbnailH);
/* Thumbnail Quality */
p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "100");
/* Exposure */
p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, getMinExposureCompensation());
p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, getMaxExposureCompensation());
p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
p.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, getExposureCompensationStep());
/* Auto Exposure Lock supported */
if (getAutoExposureLockSupported() == true)
p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
else
p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "false");
/* Face Detection */
p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, getMaxNumDetectedFaces());
p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 0);
/* Video Sanptshot Supported */
if (getVideoSnapshotSupported() == true)
p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, "true");
else
p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, "false");
/* Video Stabilization Supported */
if (getVideoStabilizationSupported() == true)
p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, "true");
else
p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, "false");
/* Focus Mode */
int focusMode = getSupportedFocusModes();
tempStr.setTo("");
if (focusMode & FOCUS_MODE_AUTO) {
tempStr.append(CameraParameters::FOCUS_MODE_AUTO);
} else if (focusMode & FOCUS_MODE_FIXED){
tempStr.append(CameraParameters::FOCUS_MODE_FIXED);
}
if (focusMode & FOCUS_MODE_INFINITY) {
tempStr.append(",");
tempStr.append(CameraParameters::FOCUS_MODE_INFINITY);
}
if (focusMode & FOCUS_MODE_MACRO) {
tempStr.append(",");
tempStr.append(CameraParameters::FOCUS_MODE_MACRO);
}
if (focusMode & FOCUS_MODE_EDOF) {
tempStr.append(",");
tempStr.append(CameraParameters::FOCUS_MODE_EDOF);
}
if (focusMode & FOCUS_MODE_CONTINUOUS_VIDEO) {
tempStr.append(",");
tempStr.append(CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO);
}
if (focusMode & FOCUS_MODE_CONTINUOUS_PICTURE) {
tempStr.append(",");
tempStr.append(CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE);
}
if (focusMode & FOCUS_MODE_CONTINUOUS_PICTURE_MACRO) {
tempStr.append(",");
tempStr.append("continuous-picture-macro");
}
p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
tempStr.string());
if (focusMode & FOCUS_MODE_AUTO)
p.set(CameraParameters::KEY_FOCUS_MODE,
CameraParameters::FOCUS_MODE_AUTO);
else if (focusMode & FOCUS_MODE_CONTINUOUS_PICTURE)
p.set(CameraParameters::KEY_FOCUS_MODE,
CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE);
else if (focusMode & FOCUS_MODE_CONTINUOUS_VIDEO)
p.set(CameraParameters::KEY_FOCUS_MODE,
CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO);
else if (focusMode & FOCUS_MODE_FIXED)
p.set(CameraParameters::KEY_FOCUS_MODE,
CameraParameters::FOCUS_MODE_FIXED);
else
p.set(CameraParameters::KEY_FOCUS_MODE,
CameraParameters::FOCUS_MODE_INFINITY);
/*TODO: This values will be changed */
#define BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR "0.10,1.20,Infinity"
#define FRONT_CAMERA_FOCUS_DISTANCES_STR "0.20,0.25,Infinity"
#define BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR "0.10,0.20,Infinity"
#define BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR "0.10,1.20,Infinity"
/* Focus Distances */
if (getCameraId() == CAMERA_ID_BACK)
p.set(CameraParameters::KEY_FOCUS_DISTANCES,
BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR);
else
p.set(CameraParameters::KEY_FOCUS_DISTANCES,
FRONT_CAMERA_FOCUS_DISTANCES_STR);
p.set(CameraParameters::FOCUS_DISTANCE_INFINITY, "Infinity");
/* Max number of Focus Areas */
p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 0);
if (focusMode & FOCUS_MODE_TOUCH) {
p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 1);
p.set(CameraParameters::KEY_FOCUS_AREAS, "(0,0,0,0,0)");
}
/* Flash */
int flashMode = getSupportedFlashModes();
tempStr.setTo("");
if (flashMode & FLASH_MODE_OFF) {
tempStr.append(CameraParameters::FLASH_MODE_OFF);
}
if (flashMode & FLASH_MODE_AUTO) {
tempStr.append(",");
tempStr.append(CameraParameters::FLASH_MODE_AUTO);
}
if (flashMode & FLASH_MODE_ON) {
tempStr.append(",");
tempStr.append(CameraParameters::FLASH_MODE_ON);
}
if (flashMode & FLASH_MODE_RED_EYE) {
tempStr.append(",");
tempStr.append(CameraParameters::FLASH_MODE_RED_EYE);
}
if (flashMode & FLASH_MODE_TORCH) {
tempStr.append(",");
tempStr.append(CameraParameters::FLASH_MODE_TORCH);
}
p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, tempStr.string());
p.set(CameraParameters::KEY_FLASH_MODE, CameraParameters::FLASH_MODE_OFF);
/* scene mode */
int sceneMode = getSupportedSceneModes();
tempStr.setTo("");
if (sceneMode & SCENE_MODE_AUTO) {
tempStr.append(CameraParameters::SCENE_MODE_AUTO);
}
if (sceneMode & SCENE_MODE_ACTION) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_ACTION);
}
if (sceneMode & SCENE_MODE_PORTRAIT) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_PORTRAIT);
}
if (sceneMode & SCENE_MODE_LANDSCAPE) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_LANDSCAPE);
}
if (sceneMode & SCENE_MODE_NIGHT) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_NIGHT);
}
if (sceneMode & SCENE_MODE_NIGHT_PORTRAIT) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_NIGHT_PORTRAIT);
}
if (sceneMode & SCENE_MODE_THEATRE) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_THEATRE);
}
if (sceneMode & SCENE_MODE_BEACH) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_BEACH);
}
if (sceneMode & SCENE_MODE_SNOW) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_SNOW);
}
if (sceneMode & SCENE_MODE_SUNSET) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_SUNSET);
}
if (sceneMode & SCENE_MODE_STEADYPHOTO) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_STEADYPHOTO);
}
if (sceneMode & SCENE_MODE_FIREWORKS) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_FIREWORKS);
}
if (sceneMode & SCENE_MODE_SPORTS) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_SPORTS);
}
if (sceneMode & SCENE_MODE_PARTY) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_PARTY);
}
if (sceneMode & SCENE_MODE_CANDLELIGHT) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_CANDLELIGHT);
}
#ifdef SAMSUNG_COMPANION
if (sceneMode & SCENE_MODE_HDR) {
tempStr.append(",");
tempStr.append(CameraParameters::SCENE_MODE_HDR);
}
#endif
p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
tempStr.string());
p.set(CameraParameters::KEY_SCENE_MODE,
CameraParameters::SCENE_MODE_AUTO);
if (getHalVersion() != IS_HAL_VER_3_2) {
/* effect */
int effect = getSupportedColorEffects();
tempStr.setTo("");
if (effect & EFFECT_NONE) {
tempStr.append(CameraParameters::EFFECT_NONE);
}
if (effect & EFFECT_MONO) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_MONO);
}
if (effect & EFFECT_NEGATIVE) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_NEGATIVE);
}
if (effect & EFFECT_SOLARIZE) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_SOLARIZE);
}
if (effect & EFFECT_SEPIA) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_SEPIA);
}
if (effect & EFFECT_POSTERIZE) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_POSTERIZE);
}
if (effect & EFFECT_WHITEBOARD) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_WHITEBOARD);
}
if (effect & EFFECT_BLACKBOARD) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_BLACKBOARD);
}
if (effect & EFFECT_AQUA) {
tempStr.append(",");
tempStr.append(CameraParameters::EFFECT_AQUA);
}
p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, tempStr.string());
p.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_NONE);
}
/* white balance */
int whiteBalance = getSupportedWhiteBalance();
tempStr.setTo("");
if (whiteBalance & WHITE_BALANCE_AUTO) {
tempStr.append(CameraParameters::WHITE_BALANCE_AUTO);
}
if (whiteBalance & WHITE_BALANCE_INCANDESCENT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_INCANDESCENT);
}
if (whiteBalance & WHITE_BALANCE_FLUORESCENT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_FLUORESCENT);
}
if (whiteBalance & WHITE_BALANCE_WARM_FLUORESCENT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT);
}
if (whiteBalance & WHITE_BALANCE_DAYLIGHT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_DAYLIGHT);
}
if (whiteBalance & WHITE_BALANCE_CLOUDY_DAYLIGHT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT);
}
if (whiteBalance & WHITE_BALANCE_TWILIGHT) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_TWILIGHT);
}
if (whiteBalance & WHITE_BALANCE_SHADE) {
tempStr.append(",");
tempStr.append(CameraParameters::WHITE_BALANCE_SHADE);
}
p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
tempStr.string());
p.set(CameraParameters::KEY_WHITE_BALANCE, CameraParameters::WHITE_BALANCE_AUTO);
/* Auto Whitebalance Lock supported */
if (getAutoWhiteBalanceLockSupported() == true)
p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
else
p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "false");
/* anti banding */
tempStr.setTo("");
int antiBanding = getSupportedAntibanding();
#ifdef USE_CSC_FEATURE
/* The Supported List always includes the AUTO Mode - Google */
if (antiBanding & ANTIBANDING_AUTO) {
tempStr.append(CameraParameters::ANTIBANDING_AUTO);
}
m_chooseAntiBandingFrequency();
/* 50Hz or 60Hz */
tempStr.append(",");
tempStr.append(m_antiBanding);
#else
if (antiBanding & ANTIBANDING_AUTO) {
tempStr.append(CameraParameters::ANTIBANDING_AUTO);
}
if (antiBanding & ANTIBANDING_50HZ) {
tempStr.append(",");
tempStr.append(CameraParameters::ANTIBANDING_50HZ);
}
if (antiBanding & ANTIBANDING_60HZ) {
tempStr.append(",");
tempStr.append(CameraParameters::ANTIBANDING_60HZ);
}
if (antiBanding & ANTIBANDING_OFF) {
tempStr.append(",");
tempStr.append(CameraParameters::ANTIBANDING_OFF);
}
#endif
p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
tempStr.string());
#ifdef USE_CSC_FEATURE
p.set(CameraParameters::KEY_ANTIBANDING, m_antiBanding);
#else
p.set(CameraParameters::KEY_ANTIBANDING, CameraParameters::ANTIBANDING_AUTO);
#endif
/* rotation */
p.set(CameraParameters::KEY_ROTATION, 0);
/* view angle */
setHorizontalViewAngle(640, 480);
p.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, getHorizontalViewAngle());
p.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, getVerticalViewAngle());
/* metering */
p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, getMaxNumMeteringAreas());
p.set(CameraParameters::KEY_METERING_AREAS, "");
/* zoom */
if (getZoomSupported() == true) {
int maxZoom = getMaxZoomLevel();
ALOGI("INFO(%s):getMaxZoomLevel(%d)", __FUNCTION__, maxZoom);
if (0 < maxZoom) {
p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
if (getSmoothZoomSupported() == true)
p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
else
p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
p.set(CameraParameters::KEY_MAX_ZOOM, maxZoom - 1);
p.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
int max_zoom_ratio = (int)getMaxZoomRatio();
tempStr.setTo("");
if (getZoomRatioList(tempStr, maxZoom, max_zoom_ratio, m_staticInfo->zoomRatioList) == NO_ERROR)
p.set(CameraParameters::KEY_ZOOM_RATIOS, tempStr.string());
else
p.set(CameraParameters::KEY_ZOOM_RATIOS, "100");
p.set("constant-growth-rate-zoom-supported", "true");
ALOGI("INFO(%s):maxZoom=%d, max_zoom_ratio= %d, zoomRatioList=%s", "setDefaultParameter", maxZoom, max_zoom_ratio, tempStr.string());
} else {
p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false");
p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
p.set(CameraParameters::KEY_MAX_ZOOM, ZOOM_LEVEL_0);
p.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
}
} else {
p.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false");
p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
p.set(CameraParameters::KEY_MAX_ZOOM, ZOOM_LEVEL_0);
p.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
}
/* fps */
uint32_t minFpsRange = 15;
uint32_t maxFpsRange = 30;
getPreviewFpsRange(&minFpsRange, &maxFpsRange);
#ifdef TEST_GED_HIGH_SPEED_RECORDING
maxFpsRange = 120;
#endif
CLOGI("INFO(%s[%d]):minFpsRange=%d, maxFpsRange=%d", "getPreviewFpsRange", __LINE__, (int)minFpsRange, (int)maxFpsRange);
int minFps = (minFpsRange == 0) ? 0 : (int)minFpsRange;
int maxFps = (maxFpsRange == 0) ? 0 : (int)maxFpsRange;
tempStr.setTo("");
snprintf(strBuf, 256, "%d", minFps);
tempStr.append(strBuf);
for (int i = minFps + 1; i <= maxFps; i++) {
snprintf(strBuf, 256, ",%d", i);
tempStr.append(strBuf);
}
p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, tempStr.string());
minFpsRange = minFpsRange * 1000;
maxFpsRange = maxFpsRange * 1000;
tempStr.setTo("");
getSupportedFpsList(tempStr, minFpsRange, maxFpsRange, m_cameraId, m_staticInfo);
CLOGI("INFO(%s):supportedFpsList=%s", "setDefaultParameter", tempStr.string());
p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, tempStr.string());
/* p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000),(30000,30000)"); */
/* limit 30 fps on default setting. */
if (30 < maxFps)
maxFps = 30;
p.setPreviewFrameRate(maxFps);
if (30000 < maxFpsRange)
maxFpsRange = 30000;
snprintf(strBuf, 256, "%d,%d", maxFpsRange/2, maxFpsRange);
p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, strBuf);
/* focal length */
int num = 0;
int den = 0;
int precision = 0;
getFocalLength(&num, &den);
switch (den) {
default:
case 1000:
precision = 3;
break;
case 100:
precision = 2;
break;
case 10:
precision = 1;
break;
case 1:
precision = 0;
break;
}
snprintf(strBuf, 256, "%.*f", precision, ((float)num / (float)den));
p.set(CameraParameters::KEY_FOCAL_LENGTH, strBuf);
/* Additional params. */
p.set("contrast", "auto");
p.set("iso", "auto");
// Set supported ISO values
int isoValues = getSupportedISO();
tempStr.setTo("");
if (isoValues & ISO_AUTO) {
tempStr.append(CameraParameters::ISO_AUTO);
}
if (isoValues & ISO_100) {
tempStr.append(",");
tempStr.append(CameraParameters::ISO_100);
}
if (isoValues & ISO_200) {
tempStr.append(",");
tempStr.append(CameraParameters::ISO_200);
}
if (isoValues & ISO_400) {
tempStr.append(",");
tempStr.append(CameraParameters::ISO_400);
}
if (isoValues & ISO_800) {
tempStr.append(",");
tempStr.append(CameraParameters::ISO_800);
}
p.set("iso-values",
tempStr.string());
p.set("wdr", 0);
p.set("hdr-mode", 0);
p.set("metering", "center"); /* For Samsung SDK */
// Set Supported Metering Mode
int meteringModes = getSupportedMeteringMode();
tempStr.setTo("");
if (meteringModes & METERING_MODE_MATRIX) {
tempStr.append(CameraParameters::METERING_MATRIX);
}
if (meteringModes & METERING_MODE_CENTER) {
tempStr.append(",");
tempStr.append(CameraParameters::METERING_CENTER);
}
if (meteringModes & METERING_MODE_SPOT) {
tempStr.append(",");
tempStr.append(CameraParameters::METERING_SPOT);
}
#ifdef SAMSUNG_TN_FEATURE
/* For Samsung SDK */
p.set(CameraParameters::KEY_SUPPORTED_METERING_MODE,
tempStr.string());
#endif
p.set("brightness", 0);
p.set("brightness-max", 2);
p.set("brightness-min", -2);
p.set("saturation", 0);
p.set("saturation-max", 2);
p.set("saturation-min", -2);
p.set("sharpness", 0);
p.set("sharpness-max", 2);
p.set("sharpness-min", -2);
p.set("hue", 0);
p.set("hue-max", 2);
p.set("hue-min", -2);
/* For Series shot */
p.set("burst-capture", 0);
p.set("best-capture", 0);
/* fnumber */
getFnumber(&num, &den);
p.set("fnumber-value-numerator", num);
p.set("fnumber-value-denominator", den);
/* max aperture value */
getApertureValue(&num, &den);
p.set("maxaperture-value-numerator", num);
p.set("maxaperture-value-denominator", den);
/* focal length */
getFocalLength(&num, &den);
p.set("focallength-value-numerator", num);
p.set("focallength-value-denominator", den);
/* focal length in 35mm film */
int focalLengthIn35mmFilm = 0;
focalLengthIn35mmFilm = getFocalLengthIn35mmFilm();
p.set("focallength-35mm-value", focalLengthIn35mmFilm);
#if defined(USE_3RD_BLACKBOX) /* KOR ONLY */
/* scale mode */
bool supportedScalableMode = getSupportedScalableSensor();
if (supportedScalableMode == true)
p.set("scale_mode", -1);
#endif
#if defined(TEST_APP_HIGH_SPEED_RECORDING)
p.set("fast-fps-mode", 0);
#endif
#ifdef SAMSUNG_LLV
/* LLV */
p.set("llv_mode", 0);
#endif
#ifdef SAMSUNG_COMPANION
p.set(CameraParameters::KEY_DYNAMIC_RANGE_CONTROL, "off");
#ifdef SAMSUNG_TN_FEATURE
/* PHASE_AF */
p.set(CameraParameters::KEY_SUPPORTED_PHASE_AF, "off,on"); /* For Samsung SDK */
p.set(CameraParameters::KEY_PHASE_AF, "off");
/* RT_HDR */
p.set(CameraParameters::KEY_SUPPORTED_RT_HDR, "off,on,auto"); /* For Samsung SDK */
p.set(CameraParameters::KEY_RT_HDR, "off");
#endif
#else
p.set(CameraParameters::KEY_DYNAMIC_RANGE_CONTROL, "off");
#ifdef SAMSUNG_TN_FEATURE
/* PHASE_AF */
p.set(CameraParameters::KEY_SUPPORTED_PHASE_AF, "off"); /* For Samsung SDK */
p.set(CameraParameters::KEY_PHASE_AF, "off");
/* RT_HDR */
p.set(CameraParameters::KEY_SUPPORTED_RT_HDR, "off"); /* For Samsung SDK */
p.set(CameraParameters::KEY_RT_HDR, "off");
#endif
#endif
p.set("imageuniqueid-value", 0);
#if defined(SAMSUNG_OIS)
p.set("ois-supported", "true");
p.set("ois", "still");
#else
//p.set("ois-supported", "false");
#endif
#ifdef SAMSUNG_VRMODE
p.set("vrmode-supported", "true");
#endif
p.set("drc", "false");
p.set("3dnr", "false");
p.set("odc", "false");
#ifdef USE_FADE_IN_ENTRANCE
p.set("entrance", "false");
#endif
#ifdef SAMSUNG_MANUAL_FOCUS
p.set("focus-distance", -1);
#endif
#ifdef SAMSUNG_QUICKSHOT
p.set("quick-shot", 0);
#endif
p.set("effectrecording-hint", 0);
/* Exposure Time */
if (getMinExposureTime() != 0 && getMaxExposureTime() != 0) {
p.set("min-exposure-time", getMinExposureTime());
p.set("max-exposure-time", getMaxExposureTime());
p.set("exposure-time", 0);
}
/* WB Kelvin */
if (getMinWBK() != 0 && getMaxWBK() != 0) {
p.set("min-wb-k", getMinWBK());
p.set("max-wb-k", getMaxWBK());
p.set("wb-k", 0);
}
m_params = p;
/* make sure m_secCamera has all the settings we do. applications
* aren't required to call setParameters themselves (only if they
* want to change something.
*/
ret = setParameters(p);
if (ret < 0)
CLOGE("ERR(%s[%d]):setParameters is fail", __FUNCTION__, __LINE__);
}
status_t ExynosCameraParameters::checkVisionMode(const CameraParameters& params)
{
status_t ret;
/* Check vision mode */
int intelligent_mode = params.getInt("intelligent-mode");
CLOGD("DEBUG(%s):intelligent_mode : %d", "setParameters", intelligent_mode);
ret = m_setIntelligentMode(intelligent_mode);
if (ret != NO_ERROR) {
CLOGE("ERR(%s): Inavalid Intelligent mode", "setParameters");
return ret;
}
m_params.set("intelligent-mode", intelligent_mode);
CLOGD("DEBUG(%s):intelligent_mode(%d) getVisionMode(%d)", "setParameters", intelligent_mode, getVisionMode());
/* Smart stay need to skip more frames */
int skipCompensation = m_frameSkipCounter.getCompensation();
if (intelligent_mode == 1) {
m_frameSkipCounter.setCompensation(skipCompensation + SMART_STAY_SKIP_COMPENSATION);
} else {
m_frameSkipCounter.setCompensation(skipCompensation);
}
if (getVisionMode() == true) {
/* preset for each vision mode */
switch (intelligent_mode) {
case 2:
m_setVisionModeFps(10);
break;
case 3:
m_setVisionModeFps(5);
break;
default:
m_setVisionModeFps(10);
break;
}
/* Vision mode custom frame rate will be enabled when application ready */
#if 0
/* If user wants to set custom fps, vision mode set max fps to frame rate */
int minFps = -1;
int maxFps = -1;
params.getPreviewFpsRange(&minFps, &maxFps);
if (minFps > 0 && maxFps > 0) {
CLOGD("DEBUG(%s): set user frame rate (%d)", __FUNCTION__, maxFps / 1000);
m_setVisionModeFps(maxFps / 1000);
}
#endif
/* smart-screen-exposure */
int newVisionAeTarget = params.getInt("smart-screen-exposure");
if (0 < newVisionAeTarget) {
CLOGD("DEBUG(%s):newVisionAeTarget : %d", "setParameters", newVisionAeTarget);
m_setVisionModeAeTarget(newVisionAeTarget);
m_params.set("smart-screen-exposure", newVisionAeTarget);
}
return OK;
} else {
return NO_ERROR;
}
}
status_t ExynosCameraParameters::m_setIntelligentMode(int intelligentMode)
{
status_t ret = NO_ERROR;
bool visionMode = false;
m_cameraInfo.intelligentMode = intelligentMode;
if (intelligentMode > 1) {
if (m_staticInfo->visionModeSupport == true) {
visionMode = true;
} else {
CLOGE("ERR(%s): tried to set vision mode(not supported)", "setParameters");
ret = BAD_VALUE;
}
} else if (getVisionMode()) {
CLOGE("ERR(%s[%d]):vision mode can not change before stoppreview", __FUNCTION__, __LINE__);
visionMode = true;
}
m_setVisionMode(visionMode);
return ret;
}
int ExynosCameraParameters::getIntelligentMode(void)
{
return m_cameraInfo.intelligentMode;
}
void ExynosCameraParameters::m_setVisionMode(bool vision)
{
m_cameraInfo.visionMode = vision;
}
bool ExynosCameraParameters::getVisionMode(void)
{
return m_cameraInfo.visionMode;
}
void ExynosCameraParameters::m_setVisionModeFps(int fps)
{
m_cameraInfo.visionModeFps = fps;
}
int ExynosCameraParameters::getVisionModeFps(void)
{
return m_cameraInfo.visionModeFps;
}
void ExynosCameraParameters::m_setVisionModeAeTarget(int ae)
{
m_cameraInfo.visionModeAeTarget = ae;
}
int ExynosCameraParameters::getVisionModeAeTarget(void)
{
return m_cameraInfo.visionModeAeTarget;
}
status_t ExynosCameraParameters::checkRecordingHint(const CameraParameters& params)
{
/* recording hint */
bool recordingHint = false;
const char *newRecordingHint = params.get(CameraParameters::KEY_RECORDING_HINT);
if (newRecordingHint != NULL) {
CLOGD("DEBUG(%s):newRecordingHint : %s", "setParameters", newRecordingHint);
recordingHint = (strcmp(newRecordingHint, "true") == 0) ? true : false;
m_setRecordingHint(recordingHint);
m_params.set(CameraParameters::KEY_RECORDING_HINT, newRecordingHint);
} else {
/* to confirm that recordingHint value is checked up (whatever value is) */
m_setRecordingHint(m_cameraInfo.recordingHint);
recordingHint = getRecordingHint();
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setRecordingHint(bool hint)
{
m_cameraInfo.recordingHint = hint;
if (hint) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_ON);
} else if (!hint && !getDualRecordingHint() && !getEffectRecordingHint()) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_OFF);
}
/* RecordingHint is confirmed */
m_flagCheckRecordingHint = true;
}
bool ExynosCameraParameters::getRecordingHint(void)
{
/*
* Before setParameters, we cannot know recordingHint is valid or not
* So, check and make assert for fast debugging
*/
if (m_flagCheckRecordingHint == false)
android_printAssert(NULL, LOG_TAG, "Cannot call getRecordingHint befor setRecordingHint, assert!!!!");
return m_cameraInfo.recordingHint;
}
status_t ExynosCameraParameters::checkDualMode(const CameraParameters& params)
{
/* dual_mode */
bool flagDualMode = false;
int newDualMode = params.getInt("dual_mode");
if (newDualMode == 1) {
CLOGD("DEBUG(%s):newDualMode : %d", "setParameters", newDualMode);
flagDualMode = true;
}
m_setDualMode(flagDualMode);
m_params.set("dual_mode", newDualMode);
return NO_ERROR;
}
void ExynosCameraParameters::m_setDualMode(bool dual)
{
m_cameraInfo.dualMode = dual;
/* dualMode is confirmed */
m_flagCheckDualMode = true;
}
bool ExynosCameraParameters::getDualMode(void)
{
/*
* Before setParameters, we cannot know dualMode is valid or not
* So, check and make assert for fast debugging
*/
if (m_flagCheckDualMode == false)
android_printAssert(NULL, LOG_TAG, "Cannot call getDualMode befor checkDualMode, assert!!!!");
return m_cameraInfo.dualMode;
}
status_t ExynosCameraParameters::checkDualRecordingHint(const CameraParameters& params)
{
/* dual recording hint */
bool flagDualRecordingHint = false;
int newDualRecordingHint = params.getInt("dualrecording-hint");
if (newDualRecordingHint == 1) {
CLOGD("DEBUG(%s):newDualRecordingHint : %d", "setParameters", newDualRecordingHint);
flagDualRecordingHint = true;
}
m_setDualRecordingHint(flagDualRecordingHint);
m_params.set("dualrecording-hint", newDualRecordingHint);
return NO_ERROR;
}
void ExynosCameraParameters::m_setDualRecordingHint(bool hint)
{
m_cameraInfo.dualRecordingHint = hint;
if (hint) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_ON);
} else if (!hint && !getRecordingHint() && !getEffectRecordingHint()) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_OFF);
}
}
bool ExynosCameraParameters::getDualRecordingHint(void)
{
return m_cameraInfo.dualRecordingHint;
}
status_t ExynosCameraParameters::checkEffectHint(const CameraParameters& params)
{
/* effect hint */
bool flagEffectHint = false;
int newEffectHint = params.getInt("effect_hint");
if (newEffectHint < 0)
return NO_ERROR;
if (newEffectHint == 1) {
CLOGD("DEBUG(%s[%d]):newEffectHint : %d", "setParameters", __LINE__, newEffectHint);
flagEffectHint = true;
}
m_setEffectHint(newEffectHint);
m_params.set("effect_hint", newEffectHint);
return NO_ERROR;
}
void ExynosCameraParameters::m_setEffectHint(bool hint)
{
m_cameraInfo.effectHint = hint;
}
bool ExynosCameraParameters::getEffectHint(void)
{
return m_cameraInfo.effectHint;
}
status_t ExynosCameraParameters::checkEffectRecordingHint(const CameraParameters& params)
{
/* Effect recording hint */
bool flagEffectRecordingHint = false;
int newEffectRecordingHint = params.getInt("effectrecording-hint");
int curEffectRecordingHint = m_params.getInt("effectrecording-hint");
if (newEffectRecordingHint < 0) {
CLOGV("DEBUG(%s):Invalid newEffectRecordingHint", "setParameters");
return NO_ERROR;
}
if (newEffectRecordingHint != curEffectRecordingHint) {
CLOGD("DEBUG(%s):newEffectRecordingHint : %d", "setParameters", newEffectRecordingHint);
if (newEffectRecordingHint == 1)
flagEffectRecordingHint = true;
m_setEffectRecordingHint(flagEffectRecordingHint);
m_params.set("effectrecording-hint", newEffectRecordingHint);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setEffectRecordingHint(bool hint)
{
ExynosCameraActivityAutofocus *autoFocusMgr = m_activityControl->getAutoFocusMgr();
ExynosCameraActivityFlash *flashMgr = m_activityControl->getFlashMgr();
m_cameraInfo.effectRecordingHint = hint;
if (hint) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_ON);
} else if (!hint && !getRecordingHint() && !getDualRecordingHint()) {
setMetaVideoMode(&m_metadata, AA_VIDEOMODE_OFF);
}
autoFocusMgr->setRecordingHint(hint);
flashMgr->setRecordingHint(hint);
}
bool ExynosCameraParameters::getEffectRecordingHint(void)
{
return m_cameraInfo.effectRecordingHint;
}
status_t ExynosCameraParameters::checkPreviewFps(const CameraParameters& params)
{
int ret = 0;
ret = checkPreviewFpsRange(params);
if (ret == BAD_VALUE) {
CLOGE("ERR(%s): Inavalid value", "setParameters");
return ret;
} else if (ret != NO_ERROR) {
ret = checkPreviewFrameRate(params);
}
return ret;
}
status_t ExynosCameraParameters::checkPreviewFpsRange(const CameraParameters& params)
{
int newMinFps = 0;
int newMaxFps = 0;
int newFrameRate = params.getPreviewFrameRate();
uint32_t curMinFps = 0;
uint32_t curMaxFps = 0;
params.getPreviewFpsRange(&newMinFps, &newMaxFps);
if (newMinFps <= 0 || newMaxFps <= 0 || newMinFps > newMaxFps) {
CLOGE("PreviewFpsRange is invalid, newMin(%d), newMax(%d)", newMinFps, newMaxFps);
return BAD_VALUE;
}
ALOGI("INFO(%s):Original FpsRange[Min=%d, Max=%d]", __FUNCTION__, newMinFps, newMaxFps);
if (m_adjustPreviewFpsRange(newMinFps, newMaxFps) != NO_ERROR) {
CLOGE("Fail to adjust preview fps range");
return INVALID_OPERATION;
}
newMinFps = newMinFps / 1000;
newMaxFps = newMaxFps / 1000;
if (FRAME_RATE_MAX < newMaxFps || newMaxFps < newMinFps) {
CLOGE("PreviewFpsRange is out of bound");
return INVALID_OPERATION;
}
getPreviewFpsRange(&curMinFps, &curMaxFps);
CLOGI("INFO(%s):curFpsRange[Min=%d, Max=%d], newFpsRange[Min=%d, Max=%d], [curFrameRate=%d]",
"checkPreviewFpsRange", curMinFps, curMaxFps, newMinFps, newMaxFps, m_params.getPreviewFrameRate());
if (curMinFps != (uint32_t)newMinFps || curMaxFps != (uint32_t)newMaxFps) {
m_setPreviewFpsRange((uint32_t)newMinFps, (uint32_t)newMaxFps);
char newFpsRange[256];
memset (newFpsRange, 0, 256);
snprintf(newFpsRange, 256, "%d,%d", newMinFps * 1000, newMaxFps * 1000);
CLOGI("DEBUG(%s):set PreviewFpsRange(%s)", __FUNCTION__, newFpsRange);
CLOGI("DEBUG(%s):set PreviewFrameRate(curFps=%d->newFps=%d)", __FUNCTION__, m_params.getPreviewFrameRate(), newMaxFps);
m_params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, newFpsRange);
m_params.setPreviewFrameRate(newMaxFps);
}
getPreviewFpsRange(&curMinFps, &curMaxFps);
m_activityControl->setFpsValue(curMinFps);
/* For backword competivity */
m_params.setPreviewFrameRate(newFrameRate);
return NO_ERROR;
}
status_t ExynosCameraParameters::m_adjustPreviewFpsRange(int &newMinFps, int &newMaxFps)
{
bool flagSpecialMode = false;
int curSceneMode = 0;
int curShotMode = 0;
if (getDualMode() == true) {
flagSpecialMode = true;
/* when dual mode, fps is limited by 24fps */
if (24000 < newMaxFps)
newMaxFps = 24000;
/* set fixed fps. */
newMinFps = newMaxFps;
ALOGD("DEBUG(%s[%d]):dualMode(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
}
if (getDualRecordingHint() == true) {
flagSpecialMode = true;
/* when dual recording mode, fps is limited by 24fps */
if (24000 < newMaxFps)
newMaxFps = 24000;
/* set fixed fps. */
newMinFps = newMaxFps;
ALOGD("DEBUG(%s[%d]):dualRecordingHint(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
}
if (getEffectHint() == true) {
flagSpecialMode = true;
#if 0 /* Don't use to set fixed fps in the hal side. */
/* when effect mode, fps is limited by 24fps */
if (24000 < newMaxFps)
newMaxFps = 24000;
/* set fixed fps due to GPU preformance. */
newMinFps = newMaxFps;
#endif
ALOGD("DEBUG(%s[%d]):effectHint(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
}
if (getRecordingHint() == true) {
flagSpecialMode = true;
#if 0 /* Don't use to set fixed fps in the hal side. */
#ifdef USE_VARIABLE_FPS_OF_FRONT_RECORDING
if (getCameraId() == CAMERA_ID_FRONT && getSamsungCamera() == true) {
/* Supported the variable frame rate for Image Quality Performacne */
ALOGD("DEBUG(%s[%d]):RecordingHint(true),newMinFps=%d,newMaxFps=%d", __FUNCTION__, __LINE__, newMinFps, newMaxFps);
} else
#endif
{
/* set fixed fps. */
newMinFps = newMaxFps;
}
ALOGD("DEBUG(%s[%d]):RecordingHint(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
#endif
ALOGD("DEBUG(%s[%d]):RecordingHint(true),newMinFps=%d,newMaxFps=%d", __FUNCTION__, __LINE__, newMinFps, newMaxFps);
}
if (flagSpecialMode == true) {
CLOGD("DEBUG(%s[%d]):special mode enabled, newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
goto done;
}
curSceneMode = getSceneMode();
switch (curSceneMode) {
case SCENE_MODE_ACTION:
if (getHighSpeedRecording() == true){
newMinFps = newMaxFps;
} else {
newMinFps = 30000;
newMaxFps = 30000;
}
break;
case SCENE_MODE_PORTRAIT:
case SCENE_MODE_LANDSCAPE:
if (getHighSpeedRecording() == true){
newMinFps = newMaxFps / 2;
} else {
newMinFps = 15000;
newMaxFps = 30000;
}
break;
case SCENE_MODE_NIGHT:
/* for Front MMS mode FPS */
if (getCameraId() == CAMERA_ID_FRONT && getRecordingHint() == true)
break;
if (getHighSpeedRecording() == true){
newMinFps = newMaxFps / 4;
} else {
newMinFps = 8000;
newMaxFps = 30000;
}
break;
case SCENE_MODE_NIGHT_PORTRAIT:
case SCENE_MODE_THEATRE:
case SCENE_MODE_BEACH:
case SCENE_MODE_SNOW:
case SCENE_MODE_SUNSET:
case SCENE_MODE_STEADYPHOTO:
case SCENE_MODE_FIREWORKS:
case SCENE_MODE_SPORTS:
case SCENE_MODE_PARTY:
case SCENE_MODE_CANDLELIGHT:
if (getHighSpeedRecording() == true){
newMinFps = newMaxFps / 2;
} else {
newMinFps = 15000;
newMaxFps = 30000;
}
break;
default:
break;
}
curShotMode = getShotMode();
switch (curShotMode) {
case SHOT_MODE_DRAMA:
case SHOT_MODE_3DTOUR:
case SHOT_MODE_3D_PANORAMA:
case SHOT_MODE_LIGHT_TRACE:
newMinFps = 30000;
newMaxFps = 30000;
break;
case SHOT_MODE_ANIMATED_SCENE:
newMinFps = 15000;
newMaxFps = 15000;
break;
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
case THIRD_PARTY_BLACKBOX_MODE:
ALOGI("INFO(%s): limit the maximum 30 fps range in THIRD_PARTY_BLACKBOX_MODE(%d,%d)", __FUNCTION__, newMinFps, newMaxFps);
if (newMinFps > 30000) {
newMinFps = 30000;
}
if (newMaxFps > 30000) {
newMaxFps = 30000;
}
break;
case THIRD_PARTY_VTCALL_MODE:
ALOGI("INFO(%s): limit the maximum 15 fps range in THIRD_PARTY_VTCALL_MODE(%d,%d)", __FUNCTION__, newMinFps, newMaxFps);
if (newMinFps > 15000) {
newMinFps = 15000;
}
if (newMaxFps > 15000) {
newMaxFps = 15000;
}
break;
case THIRD_PARTY_HANGOUT_MODE:
ALOGI("INFO(%s): change fps range 15000,15000 in THIRD_PARTY_HANGOUT_MODE", __FUNCTION__);
newMinFps = 15000;
newMaxFps = 15000;
break;
#endif
default:
break;
}
done:
if (newMinFps != newMaxFps) {
if (m_getSupportedVariableFpsList(newMinFps, newMaxFps, &newMinFps, &newMaxFps) == false)
newMinFps = newMaxFps / 2;
}
return NO_ERROR;
}
void ExynosCameraParameters::updatePreviewFpsRange(void)
{
uint32_t curMinFps = 0;
uint32_t curMaxFps = 0;
int newMinFps = 0;
int newMaxFps = 0;
getPreviewFpsRange(&curMinFps, &curMaxFps);
newMinFps = curMinFps * 1000;
newMaxFps = curMaxFps * 1000;
if (m_adjustPreviewFpsRange(newMinFps, newMaxFps) != NO_ERROR) {
CLOGE("Fils to adjust preview fps range");
return;
}
newMinFps = newMinFps / 1000;
newMaxFps = newMaxFps / 1000;
if (curMinFps != (uint32_t)newMinFps || curMaxFps != (uint32_t)newMaxFps) {
m_setPreviewFpsRange((uint32_t)newMinFps, (uint32_t)newMaxFps);
}
}
status_t ExynosCameraParameters::checkPreviewFrameRate(const CameraParameters& params)
{
int newFrameRate = params.getPreviewFrameRate();
int curFrameRate = m_params.getPreviewFrameRate();
int newMinFps = 0;
int newMaxFps = 0;
int tempFps = 0;
if (newFrameRate < 0) {
return BAD_VALUE;
}
CLOGD("DEBUG(%s):curFrameRate=%d, newFrameRate=%d", __FUNCTION__, curFrameRate, newFrameRate);
if (newFrameRate != curFrameRate) {
tempFps = newFrameRate * 1000;
if (m_getSupportedVariableFpsList(tempFps / 2, tempFps, &newMinFps, &newMaxFps) == false) {
newMinFps = tempFps / 2;
newMaxFps = tempFps;
}
char newFpsRange[256];
memset (newFpsRange, 0, 256);
snprintf(newFpsRange, 256, "%d,%d", newMinFps, newMaxFps);
m_params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, newFpsRange);
if (checkPreviewFpsRange(m_params) == true) {
m_params.setPreviewFrameRate(newFrameRate);
CLOGD("DEBUG(%s):setPreviewFrameRate(newFrameRate=%d)", __FUNCTION__, newFrameRate);
}
}
return NO_ERROR;
}
status_t ExynosCameraParameters::checkPreviewFpsRange(uint32_t minFps, uint32_t maxFps)
{
status_t ret = NO_ERROR;
uint32_t curMinFps = 0, curMaxFps = 0;
getPreviewFpsRange(&curMinFps, &curMaxFps);
if (curMinFps != minFps || curMaxFps != maxFps)
m_setPreviewFpsRange(minFps, maxFps);
return ret;
}
void ExynosCameraParameters::m_setPreviewFpsRange(uint32_t min, uint32_t max)
{
setMetaCtlAeTargetFpsRange(&m_metadata, min, max);
setMetaCtlSensorFrameDuration(&m_metadata, (uint64_t)((1000 * 1000 * 1000) / (uint64_t)max));
ALOGI("INFO(%s):fps min(%d) max(%d)", __FUNCTION__, min, max);
}
void ExynosCameraParameters::getPreviewFpsRange(uint32_t *min, uint32_t *max)
{
/* ex) min = 15 , max = 30 */
getMetaCtlAeTargetFpsRange(&m_metadata, min, max);
}
bool ExynosCameraParameters::m_getSupportedVariableFpsList(int min, int max, int *newMin, int *newMax)
{
int (*sizeList)[2];
if (getCameraId() == CAMERA_ID_BACK) {
/* Try to find exactly same in REAR LIST*/
sizeList = m_staticInfo->rearFPSList;
for (int i = 0; i < m_staticInfo->rearFPSListMax; i++) {
if (sizeList[i][1] == max && sizeList[i][0] == min) {
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
return true;
}
}
/* Try to find exactly same in HIDDEN REAR LIST*/
sizeList = m_staticInfo->hiddenRearFPSList;
for (int i = 0; i < m_staticInfo->hiddenRearFPSListMax; i++) {
if (sizeList[i][1] == max && sizeList[i][0] == min) {
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
return true;
}
}
/* Try to find similar fps in REAR LIST*/
sizeList = m_staticInfo->rearFPSList;
for (int i = 0; i < m_staticInfo->rearFPSListMax; i++) {
if (max <= sizeList[i][1] && sizeList[i][0] <= min) {
if(sizeList[i][1] == sizeList[i][0])
continue;
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
CLOGW("WARN(%s):calibrate new fps(%d/%d -> %d/%d)", __FUNCTION__, min, max, *newMin, *newMax);
return true;
}
}
/* Try to find similar fps in HIDDEN REAR LIST*/
sizeList = m_staticInfo->hiddenRearFPSList;
for (int i = 0; i < m_staticInfo->hiddenRearFPSListMax; i++) {
if (max <= sizeList[i][1] && sizeList[i][0] <= min) {
if(sizeList[i][1] == sizeList[i][0])
continue;
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
CLOGW("WARN(%s):calibrate new fps(%d/%d -> %d/%d)", __FUNCTION__, min, max, *newMin, *newMax);
return true;
}
}
} else {
/* Try to find exactly same in FRONT LIST*/
sizeList = m_staticInfo->frontFPSList;
for (int i = 0; i < m_staticInfo->frontFPSListMax; i++) {
if (sizeList[i][1] == max && sizeList[i][0] == min) {
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
return true;
}
}
/* Try to find exactly same in HIDDEN FRONT LIST*/
sizeList = m_staticInfo->hiddenFrontFPSList;
for (int i = 0; i < m_staticInfo->hiddenFrontFPSListMax; i++) {
if (sizeList[i][1] == max && sizeList[i][0] == min) {
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
return true;
}
}
/* Try to find similar fps in FRONT LIST*/
sizeList = m_staticInfo->frontFPSList;
for (int i = 0; i < m_staticInfo->frontFPSListMax; i++) {
if (max <= sizeList[i][1] && sizeList[i][0] <= min) {
if(sizeList[i][1] == sizeList[i][0])
continue;
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
CLOGW("WARN(%s):calibrate new fps(%d/%d -> %d/%d)", __FUNCTION__, min, max, *newMin, *newMax);
return true;
}
}
/* Try to find similar fps in HIDDEN FRONT LIST*/
sizeList = m_staticInfo->hiddenFrontFPSList;
for (int i = 0; i < m_staticInfo->hiddenFrontFPSListMax; i++) {
if (max <= sizeList[i][1] && sizeList[i][0] <= min) {
if(sizeList[i][1] == sizeList[i][0])
continue;
*newMin = sizeList[i][0];
*newMax = sizeList[i][1];
CLOGW("WARN(%s):calibrate new fps(%d/%d -> %d/%d)", __FUNCTION__, min, max, *newMin, *newMax);
return true;
}
}
}
return false;
}
status_t ExynosCameraParameters::checkVideoSize(const CameraParameters& params)
{
/* Video size */
int newVideoW = 0;
int newVideoH = 0;
params.getVideoSize(&newVideoW, &newVideoH);
if (0 < newVideoW && 0 < newVideoH &&
m_isSupportedVideoSize(newVideoW, newVideoH) == false) {
return BAD_VALUE;
}
CLOGI("INFO(%s):newVideo Size (%dx%d), ratioId(%d)",
"setParameters", newVideoW, newVideoH, m_cameraInfo.videoSizeRatioId);
m_setVideoSize(newVideoW, newVideoH);
m_params.setVideoSize(newVideoW, newVideoH);
return NO_ERROR;
}
bool ExynosCameraParameters::m_isSupportedVideoSize(const int width,
const int height)
{
int maxWidth = 0;
int maxHeight = 0;
int (*sizeList)[SIZE_OF_RESOLUTION];
getMaxVideoSize(&maxWidth, &maxHeight);
if (maxWidth < width || maxHeight < height) {
CLOGE("ERR(%s):invalid video Size(maxSize(%d/%d) size(%d/%d)",
__FUNCTION__, maxWidth, maxHeight, width, height);
return false;
}
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->rearVideoList;
for (int i = 0; i < m_staticInfo->rearVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.videoSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->frontVideoList;
for (int i = 0; i < m_staticInfo->frontVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.videoSizeRatioId = sizeList[i][2];
return true;
}
}
}
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearVideoList;
for (int i = 0; i < m_staticInfo->hiddenRearVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.videoSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->hiddenFrontVideoList;
for (int i = 0; i < m_staticInfo->hiddenFrontVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.videoSizeRatioId = sizeList[i][2];
return true;
}
}
}
CLOGE("ERR(%s):Invalid video size(%dx%d)", __FUNCTION__, width, height);
return false;
}
bool ExynosCameraParameters::m_isUHDRecordingMode(void)
{
bool isUHDRecording = false;
int videoW = 0, videoH = 0;
getVideoSize(&videoW, &videoH);
if (((videoW == 3840 && videoH == 2160) || (videoW == 2560 && videoH == 1440)) && getRecordingHint() == true)
isUHDRecording = true;
#if 0
/* we need to make WQHD SCP(LCD size), when FHD recording for clear rendering */
int hwPreviewW = 0, hwPreviewH = 0;
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
#ifdef SUPPORT_SW_VDIS
if(m_swVDIS_Mode) {
m_swVDIS_AdjustPreviewSize(&hwPreviewW, &hwPreviewH);
}
#endif /*SUPPORT_SW_VDIS*/
/* regard align margin(ex:1920x1088), check size more than 1920x1088 */
/* if (1920 < hwPreviewW && 1080 < hwPreviewH) */
if ((ALIGN_UP(1920, CAMERA_MAGIC_ALIGN) < hwPreviewW) &&
(ALIGN_UP(1080, CAMERA_MAGIC_ALIGN) < hwPreviewH) &&
(getRecordingHint() == true)) {
isUHDRecording = true;
}
#endif
return isUHDRecording;
}
void ExynosCameraParameters::m_set3aaIspOtf(bool enable)
{
m_flagCheck3aaIspOtf = true;
m_flag3aaIspOtf = enable;
}
bool ExynosCameraParameters::m_get3aaIspOtf(bool query)
{
bool ret = query;
if (m_flagCheck3aaIspOtf == true)
ret = m_flag3aaIspOtf;
return ret;
}
void ExynosCameraParameters::m_setIspTpuOtf(bool enable)
{
m_flagCheckIspTpuOtf = true;
m_flagIspTpuOtf = enable;
}
bool ExynosCameraParameters::m_getIspTpuOtf(bool query)
{
bool ret = query;
if (m_flagCheckIspTpuOtf == true)
ret = m_flagIspTpuOtf;
return ret;
}
void ExynosCameraParameters::m_setVideoSize(int w, int h)
{
m_cameraInfo.videoW = w;
m_cameraInfo.videoH = h;
}
bool ExynosCameraParameters::getUHDRecordingMode(void)
{
return m_isUHDRecordingMode();
}
bool ExynosCameraParameters::getFaceDetectionMode(bool flagCheckingRecording)
{
bool ret = true;
/* turn off when dual mode back camera */
if (getDualMode() == true &&
getCameraId() == CAMERA_ID_BACK) {
ret = false;
}
/* turn off when vt mode */
if (getVtMode() != 0)
ret = false;
/* when stopRecording, ignore recording hint */
if (flagCheckingRecording == true) {
/* when recording mode, turn off back camera */
if (getRecordingHint() == true) {
if (getCameraId() == CAMERA_ID_BACK)
ret = false;
}
}
return ret;
}
void ExynosCameraParameters::getVideoSize(int *w, int *h)
{
*w = m_cameraInfo.videoW;
*h = m_cameraInfo.videoH;
}
void ExynosCameraParameters::getMaxVideoSize(int *w, int *h)
{
*w = m_staticInfo->maxVideoW;
*h = m_staticInfo->maxVideoH;
}
int ExynosCameraParameters::getVideoFormat(void)
{
if (getAdaptiveCSCRecording() == true) {
return V4L2_PIX_FMT_NV21M;
} else {
return V4L2_PIX_FMT_NV12M;
}
}
bool ExynosCameraParameters::getReallocBuffer() {
Mutex::Autolock lock(m_reallocLock);
return m_reallocBuffer;
}
bool ExynosCameraParameters::setReallocBuffer(bool enable) {
Mutex::Autolock lock(m_reallocLock);
m_reallocBuffer = enable;
return m_reallocBuffer;
}
status_t ExynosCameraParameters::checkFastFpsMode(const CameraParameters& params)
{
#ifdef TEST_GED_HIGH_SPEED_RECORDING
int fastFpsMode = getFastFpsMode();
#else
int fastFpsMode = params.getInt("fast-fps-mode");
#endif
int tempShotMode = params.getInt("shot-mode");
int prevFpsMode = getFastFpsMode();
uint32_t curMinFps = 0;
uint32_t curMaxFps = 0;
uint32_t newMinFps = curMinFps;
uint32_t newMaxFps = curMaxFps;
bool recordingHint = getRecordingHint();
bool isShotModeAnimated = false;
bool flagHighSpeed = false;
int newVideoW = 0;
int newVideoH = 0;
params.getVideoSize(&newVideoW, &newVideoH);
getPreviewFpsRange(&curMinFps, &curMaxFps);
// Workaround : Should be removed later once application fixes this.
if( (curMinFps == 60 && curMaxFps == 60) && (newVideoW == 1920 && newVideoH == 1080) ) {
fastFpsMode = 1;
}
CLOGD("DEBUG(%s):fast-fps-mode : %d", "setParameters", fastFpsMode);
#if (!USE_HIGHSPEED_RECORDING)
fastFpsMode = -1;
CLOGD("DEBUG(%s):fast-fps-mode not supported. set to (%d).", "setParameters", fastFpsMode);
#endif
CLOGI("INFO(%s):curFpsRange[Min=%d, Max=%d], [curFrameRate=%d]",
"checkPreviewFpsRange", curMinFps, curMaxFps, m_params.getPreviewFrameRate());
if (fastFpsMode <= 0 || fastFpsMode > 3) {
m_setHighSpeedRecording(false);
setConfigMode(CONFIG_MODE::NORMAL);
if( fastFpsMode != prevFpsMode) {
setFastFpsMode(fastFpsMode);
m_params.set("fast-fps-mode", fastFpsMode);
setReallocBuffer(true);
m_setRestartPreviewChecked(true);
}
return NO_ERROR;
} else {
if( fastFpsMode == prevFpsMode ) {
CLOGE("INFO(%s):mode is not changed fastFpsMode(%d) prevFpsMode(%d)", "checkFastFpsMode", fastFpsMode, prevFpsMode);
return NO_ERROR;
}
}
if (tempShotMode == SHOT_MODE_ANIMATED_SCENE) {
if (curMinFps == 15 && curMaxFps == 15)
isShotModeAnimated = true;
}
if ((recordingHint == true) && !(isShotModeAnimated)) {
CLOGD("DEBUG(%s):Set High Speed Recording", "setParameters");
switch(fastFpsMode) {
case 1:
newMinFps = 60;
newMaxFps = 60;
setConfigMode(CONFIG_MODE::HIGHSPEED_60);
break;
case 2:
newMinFps = 120;
newMaxFps = 120;
setConfigMode(CONFIG_MODE::HIGHSPEED_120);
break;
case 3:
newMinFps = 240;
newMaxFps = 240;
setConfigMode(CONFIG_MODE::HIGHSPEED_240);
break;
}
if( fastFpsMode != prevFpsMode ) {
setFastFpsMode(fastFpsMode);
m_params.set("fast-fps-mode", fastFpsMode);
} else {
CLOGI("INFO(%s):mode is not changed fastFpsMode(%d) prevFpsMode(%d)", "checkFastFpsMode", fastFpsMode, prevFpsMode);
return NO_ERROR;
}
CLOGI("INFO(%s):fastFpsMode(%d) prevFpsMode(%d)", "checkFastFpsMode", fastFpsMode, prevFpsMode);
setReallocBuffer(true);
m_setRestartPreviewChecked(true);
flagHighSpeed = m_adjustHighSpeedRecording(curMinFps, curMaxFps, newMinFps, newMaxFps);
m_setHighSpeedRecording(flagHighSpeed);
m_setPreviewFpsRange(newMinFps, newMaxFps);
CLOGI("INFO(%s):m_setPreviewFpsRange(newFpsRange[Min=%d, Max=%d])", "checkFastFpsMode", newMinFps, newMaxFps);
#ifdef TEST_GED_HIGH_SPEED_RECORDING
m_params.setPreviewFrameRate(newMaxFps);
CLOGD("DEBUG(%s):setPreviewFrameRate (newMaxFps=%d)", "checkFastFpsMode", newMaxFps);
#endif
updateHwSensorSize();
}
return NO_ERROR;
};
void ExynosCameraParameters::setFastFpsMode(int fpsMode)
{
m_fastFpsMode = fpsMode;
}
int ExynosCameraParameters::getFastFpsMode(void)
{
return m_fastFpsMode;
}
void ExynosCameraParameters::m_setHighSpeedRecording(bool highSpeed)
{
m_cameraInfo.highSpeedRecording = highSpeed;
}
bool ExynosCameraParameters::getHighSpeedRecording(void)
{
return m_cameraInfo.highSpeedRecording;
}
bool ExynosCameraParameters::m_adjustHighSpeedRecording(int curMinFps, int curMaxFps, __unused int newMinFps, int newMaxFps)
{
bool flagHighSpeedRecording = false;
bool restartPreview = false;
/* setting high speed */
if (30 < newMaxFps) {
flagHighSpeedRecording = true;
/* 30 -> 60/120 */
if (curMaxFps <= 30)
restartPreview = true;
/* 60 -> 120 */
else if (curMaxFps <= 60 && 120 <= newMaxFps)
restartPreview = true;
/* 120 -> 60 */
else if (curMaxFps <= 120 && newMaxFps <= 60)
restartPreview = true;
/* variable 60 -> fixed 60 */
else if (curMinFps < 60 && newMaxFps <= 60)
restartPreview = true;
/* variable 120 -> fixed 120 */
else if (curMinFps < 120 && newMaxFps <= 120)
restartPreview = true;
} else if (newMaxFps <= 30) {
flagHighSpeedRecording = false;
if (30 < curMaxFps)
restartPreview = true;
}
if (restartPreview == true &&
getPreviewRunning() == true) {
CLOGD("DEBUG(%s[%d]):setRestartPreviewChecked true", __FUNCTION__, __LINE__);
m_setRestartPreviewChecked(true);
}
return flagHighSpeedRecording;
}
void ExynosCameraParameters::m_setRestartPreviewChecked(bool restart)
{
CLOGD("DEBUG(%s):setRestartPreviewChecked(during SetParameters) %s", __FUNCTION__, restart ? "true" : "false");
Mutex::Autolock lock(m_parameterLock);
m_flagRestartPreviewChecked = restart;
}
bool ExynosCameraParameters::m_getRestartPreviewChecked(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_flagRestartPreviewChecked;
}
void ExynosCameraParameters::m_setRestartPreview(bool restart)
{
CLOGD("DEBUG(%s):setRestartPreview %s", __FUNCTION__, restart ? "true" : "false");
Mutex::Autolock lock(m_parameterLock);
m_flagRestartPreview = restart;
}
void ExynosCameraParameters::setPreviewRunning(bool enable)
{
Mutex::Autolock lock(m_parameterLock);
m_previewRunning = enable;
m_flagRestartPreviewChecked = false;
m_flagRestartPreview = false;
}
void ExynosCameraParameters::setPictureRunning(bool enable)
{
Mutex::Autolock lock(m_parameterLock);
m_pictureRunning = enable;
}
#if defined(SAMSUNG_COMPANION) || defined(SAMSUNG_EEPROM)
void ExynosCameraParameters::setRomReadThreadDone(bool enable)
{
Mutex::Autolock lock(m_parameterLock);
m_romReadThreadDone = enable;
}
#endif
void ExynosCameraParameters::setRecordingRunning(bool enable)
{
Mutex::Autolock lock(m_parameterLock);
m_recordingRunning = enable;
}
bool ExynosCameraParameters::getPreviewRunning(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_previewRunning;
}
bool ExynosCameraParameters::getPictureRunning(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_pictureRunning;
}
bool ExynosCameraParameters::getRecordingRunning(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_recordingRunning;
}
bool ExynosCameraParameters::getRestartPreview(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_flagRestartPreview;
}
status_t ExynosCameraParameters::checkVideoStabilization(const CameraParameters& params)
{
/* video stablization */
const char *newVideoStabilization = params.get(CameraParameters::KEY_VIDEO_STABILIZATION);
bool currVideoStabilization = m_flagVideoStabilization;
bool isVideoStabilization = false;
if (newVideoStabilization != NULL) {
CLOGD("DEBUG(%s):newVideoStabilization %s", "setParameters", newVideoStabilization);
if (!strcmp(newVideoStabilization, "true"))
isVideoStabilization = true;
if (currVideoStabilization != isVideoStabilization) {
m_flagVideoStabilization = isVideoStabilization;
m_setVideoStabilization(m_flagVideoStabilization);
m_params.set(CameraParameters::KEY_VIDEO_STABILIZATION, newVideoStabilization);
}
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setVideoStabilization(bool stabilization)
{
m_cameraInfo.videoStabilization = stabilization;
}
bool ExynosCameraParameters::getVideoStabilization(void)
{
return m_cameraInfo.videoStabilization;
}
bool ExynosCameraParameters::updateTpuParameters(void)
{
status_t ret = NO_ERROR;
bool flagTpuOn = false;
#if defined(USE_3DNR_ALWAYS)
if (USE_3DNR_ALWAYS == true) {
int hwPreviewW = 0, hwPreviewH = 0;
uint32_t minFpsRange = 0;
uint32_t maxFpsRange = 0;
getPreviewFpsRange(&minFpsRange, &maxFpsRange);
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
if (3840 <= hwPreviewW && 2160 <= hwPreviewH) {
/* 1. TDNR : UHD Recording Featuring */
#if defined(USE_3DNR_UHDRECORDING)
if (USE_3DNR_UHDRECORDING == true){
flagTpuOn = true;
} else {
flagTpuOn = false;
}
#else
flagTpuOn = false;
#endif /* USE_3DNR_UHDRECORDING */
} else {
flagTpuOn = true;
}
if (60 < minFpsRange || 60 < maxFpsRange) {
/* 2. TDNR : HighSpeed Recording Featuring */
#if defined(USE_3DNR_HIGHSPEED_RECORDING)
flagTpuOn = USE_3DNR_HIGHSPEED_RECORDING;
#else
flagTpuOn = false;
#endif /* USE_3DNR_HIGHSPEED_RECORDING */
}
/* 3. TDNR : Vt call Featuring */
#if defined(USE_3DNR_VTCALL)
if (getVtMode() > 0)
flagTpuOn = USE_3DNR_VTCALL;
#endif /* USE_3DNR_VTCALL */
/* 4. TDNR : dual always disabled. */
if (getDualMode() == true) {
flagTpuOn = false;
CLOGD("DEBUG(%s):Turn off 3dnrMode by dualMode", "setParameters");
}
/* 5. TDNR : smart stay */
if (getIntelligentMode() == 1) {
#if defined(USE_3DNR_SMARTSTAY)
flagTpuOn = USE_3DNR_SMARTSTAY;
#else
flagTpuOn = false;
#endif /* USE_3DNR_SMARTSTAY */
}
/* 6. TDNR : captrue preview */
if (getRecordingHint() == false) {
#if defined(USE_3DNR_PREVIEW)
flagTpuOn = USE_3DNR_PREVIEW;
#else
flagTpuOn = false;
#endif
}
#ifdef USE_LIVE_BROADCAST
if (getPLBMode() == true) {
flagTpuOn = false;
}
#endif
} else {
flagTpuOn = false;
}
#else
flagTpuOn = false;
#endif /* USE_3DNR_ALWAYS */
m_setIspTpuOtf((flagTpuOn)? false : true);
/* 1. update data video stabilization state to actual*/
bool oldVideoStabilization = m_cameraInfo.videoStabilization;
m_setVideoStabilization(m_flagVideoStabilization);
bool flagHWVdisOn = this->getHWVdisMode();
if (isIspTpuOtf() == true) {
if (flagHWVdisOn == true)
CLOGD("DEBUG(%s[%d]):set flagHWVdisOn = false (by isIspTpuOtf() == true)", __FUNCTION__, __LINE__);
flagHWVdisOn = false;
}
if (setDisEnable(flagHWVdisOn) != NO_ERROR) {
CLOGE("ERR(%s[%d]):setDisEnable(%d) fail", __FUNCTION__, __LINE__, flagHWVdisOn);
}
CLOGD("%s(%d) video stabilization old(%d) new(%d) flagHWVdisOn(%d)",
__FUNCTION__, __LINE__, oldVideoStabilization, getVideoStabilization(), flagHWVdisOn);
/* 2. update data 3DNR state to actual*/
bool old3dnrMode = m_cameraInfo.is3dnrMode;
bool flag3dnrOn = m_flag3dnrMode;
if (isIspTpuOtf() == true) {
if (flag3dnrOn == true)
CLOGD("DEBUG(%s[%d]):set flag3dnrOn = false (by isIspTpuOtf() == true)", __FUNCTION__, __LINE__);
flag3dnrOn = false;
}
if (flag3dnrOn == true)
flag3dnrOn = m_getFlag3dnrOffCase();
m_set3dnrMode(flag3dnrOn);
if (setDnrEnable(flag3dnrOn) != NO_ERROR) {
CLOGE("ERR(%s[%d]):setDnrEnable(%d) fail", __FUNCTION__, __LINE__, flag3dnrOn);
}
CLOGD("%s(%d) 3DNR old(%d) new(%d)", __FUNCTION__, __LINE__, old3dnrMode, flag3dnrOn);
return true;
}
status_t ExynosCameraParameters::checkSWVdisMode(const CameraParameters& params)
{
const char *newSwVdis = params.get("sw-vdis");
bool currSwVdis = getSWVdisMode();
if (newSwVdis != NULL) {
CLOGD("DEBUG(%s):newSwVdis %s", "setParameters", newSwVdis);
bool swVdisMode = true;
if (!strcmp(newSwVdis, "off"))
swVdisMode = false;
m_setSWVdisMode(swVdisMode);
m_params.set("sw-vdis", newSwVdis);
}
return NO_ERROR;
}
status_t ExynosCameraParameters::checkHWVdisMode(__unused const CameraParameters& params)
{
status_t ret = NO_ERROR;
bool hwVdisMode = this->getHWVdisMode();
CLOGD("DEBUG(%s):newHwVdis %d", "setParameters", hwVdisMode);
ret = setDisEnable(hwVdisMode);
if (ret != NO_ERROR) {
CLOGE("ERR(%s[%d]):setDisEnable(%d) fail", __FUNCTION__, __LINE__, hwVdisMode);
} else {
if (m_flagHWVDisMode != hwVdisMode) {
m_flagHWVDisMode = hwVdisMode;
}
}
return ret;
}
bool ExynosCameraParameters::isSWVdisMode(void)
{
bool swVDIS_mode = false;
bool use3DNR_dmaout = false;
int nPreviewW, nPreviewH;
getPreviewSize(&nPreviewW, &nPreviewH);
if ((getRecordingHint() == true) &&
#ifndef SUPPORT_SW_VDIS_FRONTCAM
(getCameraId() == CAMERA_ID_BACK) &&
#endif /*SUPPORT_SW_VDIS_FRONTCAM*/
(getHighSpeedRecording() == false) &&
(use3DNR_dmaout == false) &&
(getSWVdisUIMode() == true) &&
((nPreviewW == 1920 && nPreviewH == 1080) || (nPreviewW == 1280 && nPreviewH == 720)))
{
swVDIS_mode = true;
}
return swVDIS_mode;
}
bool ExynosCameraParameters::isSWVdisModeWithParam(int nPreviewW, int nPreviewH)
{
bool swVDIS_mode = false;
bool use3DNR_dmaout = false;
if ((getRecordingHint() == true) &&
#ifndef SUPPORT_SW_VDIS_FRONTCAM
(getCameraId() == CAMERA_ID_BACK) &&
#endif /*SUPPORT_SW_VDIS_FRONTCAM*/
(getHighSpeedRecording() == false) &&
(use3DNR_dmaout == false) &&
(getSWVdisUIMode() == true) &&
((nPreviewW == 1920 && nPreviewH == 1080) || (nPreviewW == 1280 && nPreviewH == 720)))
{
swVDIS_mode = true;
}
return swVDIS_mode;
}
bool ExynosCameraParameters::getHWVdisMode(void)
{
bool ret = this->getVideoStabilization();
/*
* Only true case,
* we will test whether support or not.
*/
if (ret == true) {
switch (getCameraId()) {
case CAMERA_ID_BACK:
#ifdef SUPPORT_BACK_HW_VDIS
ret = SUPPORT_BACK_HW_VDIS;
#else
ret = false;
#endif
break;
case CAMERA_ID_FRONT:
#ifdef SUPPORT_FRONT_HW_VDIS
ret = SUPPORT_FRONT_HW_VDIS;
#else
ret = false;
#endif
break;
default:
ret = false;
break;
}
}
#ifdef SUPPORT_SW_VDIS
if (ret == true &&
this->isSWVdisMode() == true) {
ret = false;
}
#endif /*SUPPORT_SW_VDIS*/
return ret;
}
int ExynosCameraParameters::getHWVdisFormat(void)
{
return V4L2_PIX_FMT_YUYV;
}
void ExynosCameraParameters::m_setSWVdisMode(bool swVdis)
{
m_cameraInfo.swVdisMode = swVdis;
}
bool ExynosCameraParameters::getSWVdisMode(void)
{
return m_cameraInfo.swVdisMode;
}
void ExynosCameraParameters::m_setSWVdisUIMode(bool swVdisUI)
{
m_cameraInfo.swVdisUIMode = swVdisUI;
}
bool ExynosCameraParameters::getSWVdisUIMode(void)
{
return m_cameraInfo.swVdisUIMode;
}
status_t ExynosCameraParameters::checkPreviewSize(const CameraParameters& params)
{
/* preview size */
int previewW = 0;
int previewH = 0;
int newPreviewW = 0;
int newPreviewH = 0;
int newCalHwPreviewW = 0;
int newCalHwPreviewH = 0;
int curPreviewW = 0;
int curPreviewH = 0;
int curHwPreviewW = 0;
int curHwPreviewH = 0;
params.getPreviewSize(&previewW, &previewH);
getPreviewSize(&curPreviewW, &curPreviewH);
getHwPreviewSize(&curHwPreviewW, &curHwPreviewH);
m_isHighResolutionMode(params);
newPreviewW = previewW;
newPreviewH = previewH;
if (m_adjustPreviewSize(previewW, previewH, &newPreviewW, &newPreviewH, &newCalHwPreviewW, &newCalHwPreviewH) != OK) {
ALOGE("ERR(%s): adjustPreviewSize fail, newPreviewSize(%dx%d)", "Parameters", newPreviewW, newPreviewH);
return BAD_VALUE;
}
if (m_isSupportedPreviewSize(newPreviewW, newPreviewH) == false) {
ALOGE("ERR(%s): new preview size is invalid(%dx%d)", "Parameters", newPreviewW, newPreviewH);
return BAD_VALUE;
}
ALOGI("INFO(%s):Cur Preview size(%dx%d)", "setParameters", curPreviewW, curPreviewH);
ALOGI("INFO(%s):Cur HwPreview size(%dx%d)", "setParameters", curHwPreviewW, curHwPreviewH);
ALOGI("INFO(%s):param.preview size(%dx%d)", "setParameters", previewW, previewH);
ALOGI("INFO(%s):Adjust Preview size(%dx%d), ratioId(%d)", "setParameters", newPreviewW, newPreviewH, m_cameraInfo.previewSizeRatioId);
ALOGI("INFO(%s):Calibrated HwPreview size(%dx%d)", "setParameters", newCalHwPreviewW, newCalHwPreviewH);
if (curPreviewW != newPreviewW || curPreviewH != newPreviewH ||
curHwPreviewW != newCalHwPreviewW || curHwPreviewH != newCalHwPreviewH ||
getHighResolutionCallbackMode() == true) {
m_setPreviewSize(newPreviewW, newPreviewH);
m_setHwPreviewSize(newCalHwPreviewW, newCalHwPreviewH);
if (getHighResolutionCallbackMode() == true) {
m_previewSizeChanged = false;
} else {
ALOGD("DEBUG(%s):setRestartPreviewChecked true", __FUNCTION__);
#ifdef USE_ISP_BUFFER_SIZE_TO_BDS
setReallocBuffer(true);
#endif
m_setRestartPreviewChecked(true);
m_previewSizeChanged = true;
}
} else {
m_previewSizeChanged = false;
}
updateBinningScaleRatio();
updateBnsScaleRatio();
m_params.setPreviewSize(newPreviewW, newPreviewH);
return NO_ERROR;
}
status_t ExynosCameraParameters::m_adjustPreviewSize(__unused int previewW, __unused int previewH,
int *newPreviewW, int *newPreviewH,
int *newCalHwPreviewW, int *newCalHwPreviewH)
{
/* hack : when app give 1446, we calibrate to 1440 */
if (*newPreviewW == 1446 && *newPreviewH == 1080) {
CLOGW("WARN(%s):Invalid previewSize(%d/%d). so, calibrate to (1440/%d)", __FUNCTION__, *newPreviewW, *newPreviewH, *newPreviewH);
*newPreviewW = 1440;
}
/* calibrate H/W aligned size*/
if (getRecordingHint() == true) {
int videoW = 0, videoH = 0;
ExynosRect bdsRect;
getVideoSize(&videoW, &videoH);
if ((videoW <= *newPreviewW) && (videoH <= *newPreviewH)) {
#ifdef SUPPORT_SW_VDIS
if (isSWVdisModeWithParam(*newPreviewW, *newPreviewH) == true) {
m_getSWVdisPreviewSize(*newPreviewW, *newPreviewH, newCalHwPreviewW, newCalHwPreviewH);
} else
#endif /*SUPPORT_SW_VDIS*/
{
#if defined(LIMIT_SCP_SIZE_UNTIL_FHD_ON_RECORDING)
if ((videoW <= 1920 || videoH <= 1080) &&
(1920 < *newPreviewW || 1080 < *newPreviewH)) {
float videoRatio = ROUND_OFF(((float)videoW / (float)videoH), 2);
if (videoRatio == 1.33f) { /* 4:3 */
*newCalHwPreviewW = 1440;
*newCalHwPreviewH = 1080;
} else if (videoRatio == 1.77f) { /* 16:9 */
*newCalHwPreviewW = 1920;
*newCalHwPreviewH = 1080;
} else if (videoRatio == 1.00f) { /* 1:1 */
*newCalHwPreviewW = 1088;
*newCalHwPreviewH = 1088;
} else {
*newCalHwPreviewW = *newPreviewW;
*newCalHwPreviewH = *newPreviewH;
}
if (*newCalHwPreviewW != *newPreviewW ||
*newCalHwPreviewH != *newPreviewH) {
CLOGW("WARN(%s[%d]):Limit hw preview size until %d x %d when videoSize(%d x %d)",
__FUNCTION__, __LINE__, *newCalHwPreviewW, *newCalHwPreviewH, videoW, videoH);
}
} else
#endif
{
*newCalHwPreviewW = *newPreviewW;
*newCalHwPreviewH = *newPreviewH;
}
}
if (getHighSpeedRecording() == true) {
int sizeList[SIZE_LUT_INDEX_END];
if (m_getPreviewSizeList(sizeList) == NO_ERROR) {
/* On high-speed recording, scaling-up by SCC/SCP occurs the IS-ISP performance degradation.
The scaling-up might be done by GSC for recording */
if ((sizeList[BDS_W] < *newPreviewW) && (sizeList[BDS_H] < *newPreviewH)) {
*newCalHwPreviewW = sizeList[BDS_W];
*newCalHwPreviewH = sizeList[BDS_H];
}
} else {
ALOGE("ERR(%s):m_getPreviewSizeList() fail", __FUNCTION__);
}
}
} else {
#ifdef SUPPORT_SW_VDIS
if (isSWVdisModeWithParam(videoW, videoH) == true) {
m_getSWVdisPreviewSize(videoW, videoH, newCalHwPreviewW, newCalHwPreviewH);
} else
#endif /*SUPPORT_SW_VDIS*/
/* video size > preview size : Use BDS size for SCP output size */
{
ALOGV("DEBUG(%s[%d]):preview(%dx%d) is smaller than video(%dx%d)",
__FUNCTION__, __LINE__, *newPreviewW, *newPreviewH, videoW, videoH);
/* If the video ratio is differ with preview ratio,
the default ratio is set into preview ratio */
if (SIZE_RATIO(*newPreviewW, *newPreviewH) != SIZE_RATIO(videoW, videoH))
ALOGW("WARN(%s): preview ratio(%dx%d) is not matched with video ratio(%dx%d)", __FUNCTION__,
*newPreviewW, *newPreviewH, videoW, videoH);
if (m_isSupportedPreviewSize(*newPreviewW, *newPreviewH) == false) {
ALOGE("ERR(%s): new preview size is invalid(%dx%d)",
__FUNCTION__, *newPreviewW, *newPreviewH);
return BAD_VALUE;
}
/*
* This call is to get real preview size.
* so, HW dis size must not be added.
*/
m_getPreviewBdsSize(&bdsRect);
*newCalHwPreviewW = bdsRect.w;
*newCalHwPreviewH = bdsRect.h;
}
}
} else if (getHighResolutionCallbackMode() == true) {
if(CAMERA_LCD_SIZE == LCD_SIZE_1280_720) {
*newCalHwPreviewW = 1280;
*newCalHwPreviewH = 720;
} else {
*newCalHwPreviewW = 1920;
*newCalHwPreviewH = 1080;
}
} else {
*newCalHwPreviewW = *newPreviewW;
*newCalHwPreviewH = *newPreviewH;
}
if (getHalVersion() == IS_HAL_VER_3_2) {
#if defined(ENABLE_8MP_FULL_FRAME)
ExynosRect bdsRect;
getPreviewBdsSize(&bdsRect);
*newCalHwPreviewW = bdsRect.w;
*newCalHwPreviewH = bdsRect.h;
#else
/* 1. try to get exact ratio */
if (m_isSupportedPreviewSize(*newPreviewW, *newPreviewH) == false) {
ALOGE("ERR(%s): new preview size is invalid(%dx%d)", "Parameters", *newPreviewW, *newPreviewH);
}
/* 2. get bds size to set size to scp node due to internal scp buffer */
int sizeList[SIZE_LUT_INDEX_END];
if (m_getPreviewSizeList(sizeList) == NO_ERROR) {
*newCalHwPreviewW = sizeList[BDS_W];
*newCalHwPreviewH = sizeList[BDS_H];
} else {
ExynosRect bdsRect;
getPreviewBdsSize(&bdsRect);
*newCalHwPreviewW = bdsRect.w;
*newCalHwPreviewH = bdsRect.h;
}
#endif
}
return NO_ERROR;
}
bool ExynosCameraParameters::m_isSupportedPreviewSize(const int width,
const int height)
{
int maxWidth, maxHeight = 0;
int (*sizeList)[SIZE_OF_RESOLUTION];
if (getHighResolutionCallbackMode() == true) {
CLOGD("DEBUG(%s): Burst panorama mode start", __FUNCTION__);
m_cameraInfo.previewSizeRatioId = SIZE_RATIO_16_9;
return true;
}
getMaxPreviewSize(&maxWidth, &maxHeight);
if (maxWidth*maxHeight < width*height) {
CLOGE("ERR(%s):invalid PreviewSize(maxSize(%d/%d) size(%d/%d)",
__FUNCTION__, maxWidth, maxHeight, width, height);
return false;
}
if (getHalVersion() == IS_HAL_VER_3_2) {
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->rearVideoList;
for (int i = 0; i < m_staticInfo->rearVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->frontVideoList;
for (int i = 0; i < m_staticInfo->frontVideoListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
}
} else {
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->rearPreviewList;
for (int i = 0; i < m_staticInfo->rearPreviewListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->frontPreviewList;
for (int i = 0; i < m_staticInfo->frontPreviewListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
}
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearPreviewList;
for (int i = 0; i < m_staticInfo->hiddenRearPreviewListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->hiddenFrontPreviewList;
for (int i = 0; i < m_staticInfo->hiddenFrontPreviewListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.previewSizeRatioId = sizeList[i][2];
return true;
}
}
}
}
CLOGE("ERR(%s):Invalid preview size(%dx%d)", __FUNCTION__, width, height);
return false;
}
int *ExynosCameraParameters::getDualModeSizeTable(void) {
int *sizeList = NULL;
#ifdef USE_LIVE_BROADCAST_DUAL
bool plb_mode = getPLBMode();
CLOGV("(%s[%d]): plb_mode(%d), BinningMode(%d)",
__FUNCTION__, __LINE__, plb_mode, getBinningMode());
if (plb_mode == true && getBinningMode()) {
int index = 0;
if (m_staticInfo->liveBroadcastSizeLut == NULL
|| m_staticInfo->liveBroadcastSizeLutMax == 0) {
ALOGE("ERR(%s[%d]):liveBroadcastSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
}
for (index = 0; index < m_staticInfo->liveBroadcastSizeLutMax; index++) {
if (m_staticInfo->liveBroadcastSizeLut[index][0] == m_cameraInfo.previewSizeRatioId)
break;
}
if (m_staticInfo->liveBroadcastSizeLutMax <= index) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
sizeList = NULL;
} else {
sizeList = m_staticInfo->liveBroadcastSizeLut[index];
}
} else
#endif
{
if (getDualRecordingHint() == true
&& m_staticInfo->dualVideoSizeLut != NULL
&& m_cameraInfo.previewSizeRatioId < m_staticInfo->videoSizeLutMax) {
sizeList = m_staticInfo->dualVideoSizeLut[m_cameraInfo.previewSizeRatioId];
} else if (m_staticInfo->dualPreviewSizeLut != NULL
&& m_cameraInfo.previewSizeRatioId < m_staticInfo->previewSizeLutMax) {
sizeList = m_staticInfo->dualPreviewSizeLut[m_cameraInfo.previewSizeRatioId];
} else { /* Use Preview LUT as a default */
if (m_staticInfo->previewSizeLut == NULL) {
ALOGE("ERR(%s[%d]):previewSizeLut is NULL", __FUNCTION__, __LINE__);
sizeList = NULL;
return sizeList;
} else if (m_staticInfo->previewSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
ALOGE("ERR(%s[%d]):unsupported preview ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
sizeList = NULL;
return sizeList;
}
sizeList = m_staticInfo->previewSizeLut[m_cameraInfo.previewSizeRatioId];
}
}
return sizeList;
}
int *ExynosCameraParameters::getBnsRecordingSizeTable(void) {
int *sizeList = NULL;
#ifdef USE_LIVE_BROADCAST
bool plb_mode = getPLBMode();
CLOGV("(%s[%d]): plb_mode(%d), BinningMode(%d)",
__FUNCTION__, __LINE__, plb_mode, getBinningMode());
if (plb_mode == true && getBinningMode()) {
int index = 0;
if (m_staticInfo->liveBroadcastSizeLut == NULL
|| m_staticInfo->liveBroadcastSizeLutMax == 0) {
ALOGE("ERR(%s[%d]):liveBroadcastSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
}
for (index = 0; index < m_staticInfo->liveBroadcastSizeLutMax; index++) {
if (m_staticInfo->liveBroadcastSizeLut[index][0] == m_cameraInfo.previewSizeRatioId)
break;
}
if (m_staticInfo->liveBroadcastSizeLutMax <= index) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
sizeList = NULL;
} else {
sizeList = m_staticInfo->liveBroadcastSizeLut[index];
}
} else
#endif
{
if (m_staticInfo->videoSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
return sizeList;
}
sizeList = m_staticInfo->videoSizeBnsLut[m_cameraInfo.previewSizeRatioId];
}
return sizeList;
}
int *ExynosCameraParameters::getNormalRecordingSizeTable(void) {
int *sizeList = NULL;
#ifdef USE_LIVE_BROADCAST
bool plb_mode = getPLBMode();
CLOGV("(%s[%d]): plb_mode(%d), BinningMode(%d)",
__FUNCTION__, __LINE__, plb_mode, getBinningMode());
if (plb_mode == true && getBinningMode()) {
int index = 0;
if (m_staticInfo->liveBroadcastSizeLut == NULL
|| m_staticInfo->liveBroadcastSizeLutMax == 0) {
ALOGE("ERR(%s[%d]):liveBroadcastSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
}
for (index = 0; index < m_staticInfo->liveBroadcastSizeLutMax; index++) {
if (m_staticInfo->liveBroadcastSizeLut[index][0] == m_cameraInfo.previewSizeRatioId)
break;
}
if (m_staticInfo->liveBroadcastSizeLutMax <= index) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
sizeList = NULL;
} else {
sizeList = m_staticInfo->liveBroadcastSizeLut[index];
}
} else
#endif
{
if (m_staticInfo->videoSizeLut == NULL) {
ALOGE("ERR(%s[%d]):videoSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
} else if (m_staticInfo->videoSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
return sizeList;
}
sizeList = m_staticInfo->videoSizeLut[m_cameraInfo.previewSizeRatioId];
}
return sizeList;
}
int *ExynosCameraParameters::getBinningSizeTable(void) {
int *sizeList = NULL;
#ifdef USE_LIVE_BROADCAST
bool plb_mode = getPLBMode();
CLOGV("(%s[%d]): plb_mode(%d), BinningMode(%d)",
__FUNCTION__, __LINE__, plb_mode, getBinningMode());
if (plb_mode == true) {
int index = 0;
if (m_staticInfo->liveBroadcastSizeLut == NULL
|| m_staticInfo->liveBroadcastSizeLutMax == 0) {
ALOGE("ERR(%s[%d]):liveBroadcastSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
}
for (index = 0; index < m_staticInfo->liveBroadcastSizeLutMax; index++) {
if (m_staticInfo->liveBroadcastSizeLut[index][0] == m_cameraInfo.previewSizeRatioId)
break;
}
if (m_staticInfo->liveBroadcastSizeLutMax <= index) {
ALOGE("ERR(%s[%d]):unsupported binningSize ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
sizeList = NULL;
} else {
sizeList = m_staticInfo->liveBroadcastSizeLut[index];
}
} else
#endif
{
/* */
/* VT mode */
/* 1: 3G vtmode (176x144, Fixed 7fps) */
/* 2: LTE or WIFI vtmode (640x480, Fixed 15fps) */
/* 3: LSI chip not used this mode */
/* 4: CHN vtmode (1920X1080, Fixed 30fps) */
/* */
int index = 0;
if (m_staticInfo->vtcallSizeLut == NULL
|| m_staticInfo->vtcallSizeLutMax == 0) {
ALOGE("ERR(%s[%d]):vtcallSizeLut is NULL", __FUNCTION__, __LINE__);
return sizeList;
}
for (index = 0; index < m_staticInfo->vtcallSizeLutMax; index++) {
if (m_staticInfo->vtcallSizeLut[index][0] == m_cameraInfo.previewSizeRatioId)
break;
}
if (m_staticInfo->vtcallSizeLutMax <= index)
index = 0;
sizeList = m_staticInfo->vtcallSizeLut[index];
}
return sizeList;
}
int *ExynosCameraParameters::getHighSpeedSizeTable(int fpsMode) {
int index = 0;
int *sizeList = NULL;
int videoW = 0, videoH = 0;
int videoRatioEnum = SIZE_RATIO_16_9;
float videoRatio = 0.00f;
/*
SIZE_RATIO_16_9 = 0,
SIZE_RATIO_4_3,
SIZE_RATIO_1_1,
SIZE_RATIO_3_2,
SIZE_RATIO_5_4,
SIZE_RATIO_5_3,
SIZE_RATIO_11_9,
*/
getVideoSize(&videoW, &videoH);
videoRatio = ROUND_OFF(((float)videoW / (float)videoH), 2);
if (videoRatio == 1.33f) { /* 4:3 */
videoRatioEnum = SIZE_RATIO_4_3;
} else if (videoRatio == 1.77f) { /* 16:9 */
videoRatioEnum = SIZE_RATIO_16_9;
} else if (videoRatio == 1.00f) { /* 1:1 */
videoRatioEnum = SIZE_RATIO_1_1;
} else if (videoRatio == 1.50f) { /* 3:2 */
videoRatioEnum = SIZE_RATIO_3_2;
} else if (videoRatio == 1.25f) { /* 5:4 */
videoRatioEnum = SIZE_RATIO_5_4;
} else if (videoRatio == 1.66f) { /* 5:3*/
videoRatioEnum = SIZE_RATIO_5_3;
} else if (videoRatio == 1.22f) { /* 11:9 */
videoRatioEnum = SIZE_RATIO_11_9;
} else {
videoRatioEnum = SIZE_RATIO_16_9;
}
switch(fpsMode) {
case CONFIG_MODE::HIGHSPEED_60:
if (m_staticInfo->videoSizeLutHighSpeed60Max == 0
|| m_staticInfo->videoSizeLutHighSpeed60 == NULL) {
ALOGE("ERR(%s[%d]):videoSizeLutHighSpeed is NULL.fpsMode(%d)", __FUNCTION__, __LINE__, fpsMode);
sizeList = NULL;
} else {
for (index = 0; index < m_staticInfo->videoSizeLutHighSpeed60Max; index++) {
if (m_staticInfo->videoSizeLutHighSpeed60[index][RATIO_ID] == videoRatioEnum) {
break;
}
}
if (index >= m_staticInfo->videoSizeLutHighSpeed60Max)
index = 0;
sizeList = m_staticInfo->videoSizeLutHighSpeed60[index];
}
break;
case CONFIG_MODE::HIGHSPEED_120:
if (m_staticInfo->videoSizeLutHighSpeed120Max == 0
|| m_staticInfo->videoSizeLutHighSpeed120 == NULL) {
ALOGE("ERR(%s[%d]):videoSizeLutHighSpeed is NULL.fpsMode(%d)", __FUNCTION__, __LINE__, fpsMode);
sizeList = NULL;
} else {
for (index = 0; index < m_staticInfo->videoSizeLutHighSpeed120Max; index++) {
if (m_staticInfo->videoSizeLutHighSpeed120[index][RATIO_ID] == videoRatioEnum) {
break;
}
}
if (index >= m_staticInfo->videoSizeLutHighSpeed120Max)
index = 0;
sizeList = m_staticInfo->videoSizeLutHighSpeed120[index];
}
break;
default :
ALOGE("ERR(%s[%d]):getConfigMode : fpsmode(%d) fail", __FUNCTION__, __LINE__, fpsMode);
break;
}
return sizeList;
}
status_t ExynosCameraParameters::m_getPreviewSizeList(int *sizeList)
{
int *tempSizeList = NULL;
int configMode = -1;
int index = 0;
int videoRatioEnum = SIZE_RATIO_16_9;
if (getHalVersion() == IS_HAL_VER_3_2) {
/* CAMERA2_API use Video Scenario LUT as a default */
if (m_staticInfo->videoSizeLut == NULL) {
ALOGE("ERR(%s[%d]):videoSizeLut is NULL", __FUNCTION__, __LINE__);
return INVALID_OPERATION;
} else if (m_staticInfo->videoSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
ALOGE("ERR(%s[%d]):unsupported video ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
return BAD_VALUE;
}
#if defined(ENABLE_8MP_FULL_FRAME)
//tempSizeList = m_staticInfo->videoSizeLut[m_cameraInfo.previewSizeRatioId];
configMode = this->getConfigMode();
switch (configMode) {
case CONFIG_MODE::NORMAL:
tempSizeList = m_staticInfo->videoSizeLut[m_cameraInfo.previewSizeRatioId];
break;
case CONFIG_MODE::HIGHSPEED_120:
if (m_staticInfo->videoSizeLutHighSpeed120Max == 0
|| m_staticInfo->videoSizeLutHighSpeed120 == NULL) {
ALOGE("ERR(%s[%d]):videoSizeLutHighSpeed is NULL ", __FUNCTION__, __LINE__);
tempSizeList = NULL;
} else {
for (index = 0; index < m_staticInfo->videoSizeLutHighSpeed120Max; index++) {
if (m_staticInfo->videoSizeLutHighSpeed120[index][RATIO_ID] == videoRatioEnum) {
break;
}
}
if (index >= m_staticInfo->videoSizeLutHighSpeed120Max)
index = 0;
tempSizeList = m_staticInfo->videoSizeLutHighSpeed120[index];
}
break;
}
#else
tempSizeList = m_staticInfo->previewSizeLut[m_cameraInfo.previewSizeRatioId];
#endif
} else {
if (getDualMode() == true) {
tempSizeList = getDualModeSizeTable();
} else { /* getDualMode() == false */
if (getRecordingHint() == true) {
int videoW = 0, videoH = 0;
getVideoSize(&videoW, &videoH);
if (getHighSpeedRecording() == true) {
int fpsmode = 0;
fpsmode = getConfigMode();
tempSizeList = getHighSpeedSizeTable(fpsmode);
}
#ifdef USE_BNS_RECORDING
else if (m_staticInfo->videoSizeBnsLut != NULL
&& videoW == 1920 && videoH == 1080) { /* Use BNS Recording only for FHD(16:9) */
tempSizeList = getBnsRecordingSizeTable();
}
#endif
else { /* Normal Recording Mode */
tempSizeList = getNormalRecordingSizeTable();
}
}
#ifdef USE_BINNING_MODE
else if (getBinningMode() == true) {
tempSizeList = getBinningSizeTable();
}
#endif
else { /* Use Preview LUT */
if (m_staticInfo->previewSizeLut == NULL) {
ALOGE("ERR(%s[%d]):previewSizeLut is NULL", __FUNCTION__, __LINE__);
return INVALID_OPERATION;
} else if (m_staticInfo->previewSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
ALOGE("ERR(%s[%d]):unsupported preview ratioId(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
return BAD_VALUE;
}
tempSizeList = m_staticInfo->previewSizeLut[m_cameraInfo.previewSizeRatioId];
}
}
}
if (tempSizeList == NULL) {
ALOGE("ERR(%s[%d]):fail to get LUT", __FUNCTION__, __LINE__);
return INVALID_OPERATION;
}
for (int i = 0; i < SIZE_LUT_INDEX_END; i++)
sizeList[i] = tempSizeList[i];
return NO_ERROR;
}
void ExynosCameraParameters::m_getSWVdisPreviewSize(int w, int h, int *newW, int *newH)
{
if (w < 0 || h < 0) {
return;
}
if (w == 1920 && h == 1080) {
*newW = 2304;
*newH = 1296;
}
else if (w == 1280 && h == 720) {
*newW = 1536;
*newH = 864;
}
else {
*newW = ALIGN_UP((w * 6) / 5, CAMERA_ISP_ALIGN);
*newH = ALIGN_UP((h * 6) / 5, CAMERA_ISP_ALIGN);
}
}
bool ExynosCameraParameters::m_isHighResolutionCallbackSize(const int width, const int height)
{
bool highResolutionCallbackMode;
if (width == m_staticInfo->highResolutionCallbackW && height == m_staticInfo->highResolutionCallbackH)
highResolutionCallbackMode = true;
else
highResolutionCallbackMode = false;
CLOGD("DEBUG(%s):highResolutionCallSize:%s", "setParameters",
highResolutionCallbackMode == true? "on":"off");
m_setHighResolutionCallbackMode(highResolutionCallbackMode);
return highResolutionCallbackMode;
}
void ExynosCameraParameters::m_isHighResolutionMode(const CameraParameters& params)
{
bool highResolutionCallbackMode;
int shotmode = params.getInt("shot-mode");
if ((getRecordingHint() == false) && (shotmode == SHOT_MODE_PANORAMA))
highResolutionCallbackMode = true;
else
highResolutionCallbackMode = false;
ALOGD("DEBUG(%s):highResolutionMode:%s", "setParameters",
highResolutionCallbackMode == true? "on":"off");
m_setHighResolutionCallbackMode(highResolutionCallbackMode);
}
void ExynosCameraParameters::m_setHighResolutionCallbackMode(bool enable)
{
m_cameraInfo.highResolutionCallbackMode = enable;
}
bool ExynosCameraParameters::getHighResolutionCallbackMode(void)
{
return m_cameraInfo.highResolutionCallbackMode;
}
status_t ExynosCameraParameters::checkPreviewFormat(const CameraParameters& params)
{
const char *strNewPreviewFormat = params.getPreviewFormat();
const char *strCurPreviewFormat = m_params.getPreviewFormat();
int curHwPreviewFormat = getHwPreviewFormat();
int newPreviewFormat = 0;
int hwPreviewFormat = 0;
CLOGD("DEBUG(%s):newPreviewFormat: %s", "setParameters", strNewPreviewFormat);
if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_RGB565))
newPreviewFormat = V4L2_PIX_FMT_RGB565;
else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_RGBA8888))
newPreviewFormat = V4L2_PIX_FMT_RGB32;
else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_YUV420SP))
newPreviewFormat = V4L2_PIX_FMT_NV21;
else if (!strcmp(strNewPreviewFormat, CameraParameters::PIXEL_FORMAT_YUV420P))
newPreviewFormat = V4L2_PIX_FMT_YVU420;
else if (!strcmp(strNewPreviewFormat, "yuv420sp_custom"))
newPreviewFormat = V4L2_PIX_FMT_NV12T;
else if (!strcmp(strNewPreviewFormat, "yuv422i"))
newPreviewFormat = V4L2_PIX_FMT_YUYV;
else if (!strcmp(strNewPreviewFormat, "yuv422p"))
newPreviewFormat = V4L2_PIX_FMT_YUV422P;
else
newPreviewFormat = V4L2_PIX_FMT_NV21; /* for 3rd party */
if (m_adjustPreviewFormat(newPreviewFormat, hwPreviewFormat) != NO_ERROR) {
return BAD_VALUE;
}
m_setPreviewFormat(newPreviewFormat);
m_params.setPreviewFormat(strNewPreviewFormat);
if (curHwPreviewFormat != hwPreviewFormat) {
m_setHwPreviewFormat(hwPreviewFormat);
CLOGI("INFO(%s[%d]): preview format changed cur(%s) -> new(%s)", "Parameters", __LINE__, strCurPreviewFormat, strNewPreviewFormat);
if (getPreviewRunning() == true) {
CLOGD("DEBUG(%s[%d]):setRestartPreviewChecked true", __FUNCTION__, __LINE__);
m_setRestartPreviewChecked(true);
}
}
return NO_ERROR;
}
status_t ExynosCameraParameters::m_adjustPreviewFormat(__unused int &previewFormat, __unused int &hwPreviewFormat)
{
#if 1
/* HACK : V4L2_PIX_FMT_NV21M is set to FIMC-IS *
* and Gralloc. V4L2_PIX_FMT_YVU420 is just *
* color format for callback frame. */
hwPreviewFormat = V4L2_PIX_FMT_NV21M;
#else
if (previewFormat == V4L2_PIX_FMT_NV21)
hwPreviewFormat = V4L2_PIX_FMT_NV21M;
else if (previewFormat == V4L2_PIX_FMT_YVU420)
hwPreviewFormat = V4L2_PIX_FMT_YVU420M;
#endif
return NO_ERROR;
}
void ExynosCameraParameters::m_setPreviewSize(int w, int h)
{
m_cameraInfo.previewW = w;
m_cameraInfo.previewH = h;
}
void ExynosCameraParameters::getPreviewSize(int *w, int *h)
{
*w = m_cameraInfo.previewW;
*h = m_cameraInfo.previewH;
}
void ExynosCameraParameters::getMaxSensorSize(int *w, int *h)
{
*w = m_staticInfo->maxSensorW;
*h = m_staticInfo->maxSensorH;
}
void ExynosCameraParameters::getSensorMargin(int *w, int *h)
{
*w = m_staticInfo->sensorMarginW;
*h = m_staticInfo->sensorMarginH;
}
void ExynosCameraParameters::m_adjustSensorMargin(int *sensorMarginW, int *sensorMarginH)
{
float bnsRatio = 1.00f;
float binningRatio = 1.00f;
float sensorMarginRatio = 1.00f;
bnsRatio = (float)getBnsScaleRatio() / 1000.00f;
binningRatio = (float)getBinningScaleRatio() / 1000.00f;
sensorMarginRatio = bnsRatio * binningRatio;
if ((int)sensorMarginRatio < 1) {
ALOGW("WARN(%s[%d]):Invalid sensor margin ratio(%f), bnsRatio(%f), binningRatio(%f)",
__FUNCTION__, __LINE__, sensorMarginRatio, bnsRatio, binningRatio);
sensorMarginRatio = 1.00f;
}
if (getHalVersion() != IS_HAL_VER_3_2) {
*sensorMarginW = ALIGN_DOWN((int)(*sensorMarginW / sensorMarginRatio), 2);
*sensorMarginH = ALIGN_DOWN((int)(*sensorMarginH / sensorMarginRatio), 2);
} else {
int leftMargin = 0, rightMargin = 0, topMargin = 0, bottomMargin = 0;
rightMargin = ALIGN_DOWN((int)(m_staticInfo->sensorMarginBase[WIDTH_BASE] / sensorMarginRatio), 2);
leftMargin = m_staticInfo->sensorMarginBase[LEFT_BASE] + rightMargin;
bottomMargin = ALIGN_DOWN((int)(m_staticInfo->sensorMarginBase[HEIGHT_BASE] / sensorMarginRatio), 2);
topMargin = m_staticInfo->sensorMarginBase[TOP_BASE] + bottomMargin;
*sensorMarginW = leftMargin + rightMargin;
*sensorMarginH = topMargin + bottomMargin;
}
}
void ExynosCameraParameters::getMaxPreviewSize(int *w, int *h)
{
*w = m_staticInfo->maxPreviewW;
*h = m_staticInfo->maxPreviewH;
}
void ExynosCameraParameters::m_setPreviewFormat(int fmt)
{
m_cameraInfo.previewFormat = fmt;
}
int ExynosCameraParameters::getPreviewFormat(void)
{
return m_cameraInfo.previewFormat;
}
void ExynosCameraParameters::m_setHwPreviewSize(int w, int h)
{
m_cameraInfo.hwPreviewW = w;
m_cameraInfo.hwPreviewH = h;
}
void ExynosCameraParameters::getHwPreviewSize(int *w, int *h)
{
if (m_cameraInfo.scalableSensorMode != true) {
*w = m_cameraInfo.hwPreviewW;
*h = m_cameraInfo.hwPreviewH;
} else {
int newSensorW = 0;
int newSensorH = 0;
m_getScalableSensorSize(&newSensorW, &newSensorH);
*w = newSensorW;
*h = newSensorH;
/*
* Should not use those value
* *w = 1024;
* *h = 768;
* *w = 1440;
* *h = 1080;
*/
*w = m_cameraInfo.hwPreviewW;
*h = m_cameraInfo.hwPreviewH;
}
}
void ExynosCameraParameters::setHwPreviewStride(int stride)
{
m_cameraInfo.previewStride = stride;
}
int ExynosCameraParameters::getHwPreviewStride(void)
{
return m_cameraInfo.previewStride;
}
void ExynosCameraParameters::m_setHwPreviewFormat(int fmt)
{
m_cameraInfo.hwPreviewFormat = fmt;
}
int ExynosCameraParameters::getHwPreviewFormat(void)
{
return m_cameraInfo.hwPreviewFormat;
}
void ExynosCameraParameters::updateHwSensorSize(void)
{
int curHwSensorW = 0;
int curHwSensorH = 0;
int newHwSensorW = 0;
int newHwSensorH = 0;
int maxHwSensorW = 0;
int maxHwSensorH = 0;
getHwSensorSize(&newHwSensorW, &newHwSensorH);
getMaxSensorSize(&maxHwSensorW, &maxHwSensorH);
if (newHwSensorW > maxHwSensorW || newHwSensorH > maxHwSensorH) {
CLOGE("ERR(%s):Invalid sensor size (maxSize(%d/%d) size(%d/%d)",
__FUNCTION__, maxHwSensorW, maxHwSensorH, newHwSensorW, newHwSensorH);
}
if (getHighSpeedRecording() == true) {
#if 0
int sizeList[SIZE_LUT_INDEX_END];
m_getHighSpeedRecordingSize(sizeList);
newHwSensorW = sizeList[SENSOR_W];
newHwSensorH = sizeList[SENSOR_H];
#endif
} else if (getScalableSensorMode() == true) {
m_getScalableSensorSize(&newHwSensorW, &newHwSensorH);
} else {
getBnsSize(&newHwSensorW, &newHwSensorH);
}
getHwSensorSize(&curHwSensorW, &curHwSensorH);
CLOGI("INFO(%s):curHwSensor size(%dx%d) newHwSensor size(%dx%d)", __FUNCTION__, curHwSensorW, curHwSensorH, newHwSensorW, newHwSensorH);
if (curHwSensorW != newHwSensorW || curHwSensorH != newHwSensorH) {
m_setHwSensorSize(newHwSensorW, newHwSensorH);
CLOGI("INFO(%s):newHwSensor size(%dx%d)", __FUNCTION__, newHwSensorW, newHwSensorH);
}
}
void ExynosCameraParameters::m_setHwSensorSize(int w, int h)
{
m_cameraInfo.hwSensorW = w;
m_cameraInfo.hwSensorH = h;
}
void ExynosCameraParameters::getHwSensorSize(int *w, int *h)
{
ALOGV("INFO(%s[%d]) getScalableSensorMode()(%d)", __FUNCTION__, __LINE__, getScalableSensorMode());
int width = 0;
int height = 0;
int sizeList[SIZE_LUT_INDEX_END];
if (m_cameraInfo.scalableSensorMode != true) {
/* matched ratio LUT is not existed, use equation */
if (m_useSizeTable == true
&& m_staticInfo->previewSizeLut != NULL
&& m_cameraInfo.previewSizeRatioId < m_staticInfo->previewSizeLutMax
&& m_getPreviewSizeList(sizeList) == NO_ERROR) {
width = sizeList[SENSOR_W];
height = sizeList[SENSOR_H];
} else {
width = m_cameraInfo.hwSensorW;
height = m_cameraInfo.hwSensorH;
}
} else {
m_getScalableSensorSize(&width, &height);
}
*w = width;
*h = height;
}
void ExynosCameraParameters::updateBnsScaleRatio(void)
{
int ret = 0;
uint32_t bnsRatio = DEFAULT_BNS_RATIO * 1000;
int curPreviewW = 0, curPreviewH = 0;
if (m_staticInfo->bnsSupport == false)
return;
getPreviewSize(&curPreviewW, &curPreviewH);
if (getDualMode() == true
#ifdef USE_LIVE_BROADCAST_DUAL
&& !getPLBMode()
#endif
) {
#if defined(USE_BNS_DUAL_PREVIEW) || defined(USE_BNS_DUAL_RECORDING)
bnsRatio = 2000;
#endif
} else if ((getRecordingHint() == true)
/* || (curPreviewW == curPreviewH)*/) {
#ifdef USE_BNS_RECORDING
int videoW = 0, videoH = 0;
getVideoSize(&videoW, &videoH);
if ((getHighSpeedRecording() == true)) {
bnsRatio = 1000;
} else if (videoW == 1920 && videoH == 1080) {
bnsRatio = 1500;
ALOGI("INFO(%s[%d]):bnsRatio(%d), videoSize (%d, %d)",
__FUNCTION__, __LINE__, bnsRatio, videoW, videoH);
} else
#endif
{
bnsRatio = 1000;
}
if (bnsRatio != getBnsScaleRatio()) {
CLOGI("INFO(%s[%d]): restart set due to changing bnsRatio(%d/%d)",
__FUNCTION__, __LINE__, bnsRatio, getBnsScaleRatio());
m_setRestartPreview(true);
}
}
#ifdef USE_BINNING_MODE
else if (getBinningMode() == true) {
bnsRatio = 1000;
}
#endif
if (bnsRatio != getBnsScaleRatio())
ret = m_setBnsScaleRatio(bnsRatio);
if (ret < 0)
CLOGE("ERR(%s[%d]): Cannot update BNS scale ratio(%d)", __FUNCTION__, __LINE__, bnsRatio);
}
status_t ExynosCameraParameters::m_setBnsScaleRatio(int ratio)
{
#define MIN_BNS_RATIO 1000
#define MAX_BNS_RATIO 8000
if (m_staticInfo->bnsSupport == false) {
CLOGD("DEBUG(%s[%d]): This camera does not support BNS", __FUNCTION__, __LINE__);
ratio = MIN_BNS_RATIO;
}
if (ratio < MIN_BNS_RATIO || ratio > MAX_BNS_RATIO) {
CLOGE("ERR(%s[%d]): Out of bound, ratio(%d), min:max(%d:%d)", __FUNCTION__, __LINE__, ratio, MAX_BNS_RATIO, MAX_BNS_RATIO);
return BAD_VALUE;
}
CLOGD("DEBUG(%s[%d]): update BNS ratio(%d -> %d)", __FUNCTION__, __LINE__, m_cameraInfo.bnsScaleRatio, ratio);
m_cameraInfo.bnsScaleRatio = ratio;
/* When BNS scale ratio is changed, reset BNS size to MAX sensor size */
getMaxSensorSize(&m_cameraInfo.bnsW, &m_cameraInfo.bnsH);
return NO_ERROR;
}
status_t ExynosCameraParameters::m_addHiddenResolutionList(String8 &string8Buf, __unused struct ExynosSensorInfoBase *sensorInfo,
int w, int h, enum MODE mode, int cameraId)
{
status_t ret = NO_ERROR;
bool found = false;
int (*sizeList)[SIZE_OF_RESOLUTION];
int listSize = 0;
switch (mode) {
case MODE_PREVIEW:
if (cameraId == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearPreviewList;
listSize = m_staticInfo->hiddenRearPreviewListMax;
} else {
sizeList = m_staticInfo->hiddenFrontPreviewList;
listSize = m_staticInfo->hiddenFrontPreviewListMax;
}
break;
case MODE_PICTURE:
if (cameraId == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearPictureList;
listSize = m_staticInfo->hiddenRearPictureListMax;
} else {
sizeList = m_staticInfo->hiddenFrontPictureList;
listSize = m_staticInfo->hiddenFrontPictureListMax;
}
break;
case MODE_VIDEO:
if (cameraId == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearVideoList;
listSize = m_staticInfo->hiddenRearVideoListMax;
} else {
sizeList = m_staticInfo->hiddenFrontVideoList;
listSize = m_staticInfo->hiddenFrontVideoListMax;
}
break;
default:
CLOGE("ERR(%s[%d]): invalid mode(%d)", __FUNCTION__, __LINE__, mode);
return BAD_VALUE;
break;
}
for (int i = 0; i < listSize; i++) {
if (w == sizeList[i][0] && h == sizeList[i][1]) {
found = true;
break;
}
}
if (found == true) {
String8 uhdTempStr;
char strBuf[32];
snprintf(strBuf, sizeof(strBuf), "%dx%d,", w, h);
/* append on head of string8Buf */
uhdTempStr.setTo(strBuf);
uhdTempStr.append(string8Buf);
string8Buf.setTo(uhdTempStr);
} else {
ret = INVALID_OPERATION;
}
return ret;
}
uint32_t ExynosCameraParameters::getBnsScaleRatio(void)
{
return m_cameraInfo.bnsScaleRatio;
}
void ExynosCameraParameters::setBnsSize(int w, int h)
{
m_cameraInfo.bnsW = w;
m_cameraInfo.bnsH = h;
updateHwSensorSize();
#if 0
int zoom = getZoomLevel();
int previewW = 0, previewH = 0;
getPreviewSize(&previewW, &previewH);
if (m_setParamCropRegion(zoom, w, h, previewW, previewH) != NO_ERROR)
CLOGE("ERR(%s):m_setParamCropRegion() fail", __FUNCTION__);
#else
ExynosRect srcRect, dstRect;
getPreviewBayerCropSize(&srcRect, &dstRect);
#endif
}
void ExynosCameraParameters::getBnsSize(int *w, int *h)
{
*w = m_cameraInfo.bnsW;
*h = m_cameraInfo.bnsH;
}
void ExynosCameraParameters::updateBinningScaleRatio(void)
{
int ret = 0;
uint32_t binningRatio = DEFAULT_BINNING_RATIO * 1000;
if ((getRecordingHint() == true)
&& (getHighSpeedRecording() == true)) {
int fpsmode = 0;
fpsmode = getFastFpsMode();
switch (fpsmode) {
case 1: /* 60 fps */
binningRatio = 2000;
break;
case 2: /* 120 fps */
case 3: /* 240 fps */
binningRatio = 4000;
break;
default:
ALOGE("ERR(%s[%d]): Invalide FastFpsMode(%d)", __FUNCTION__, __LINE__, fpsmode);
}
}
#ifdef USE_BINNING_MODE
else if (getBinningMode() == true) {
binningRatio = 2000;
}
#endif
if (binningRatio != getBinningScaleRatio()) {
ALOGI("INFO(%s[%d]):New sensor binning ratio(%d)", __FUNCTION__, __LINE__, binningRatio);
ret = m_setBinningScaleRatio(binningRatio);
}
if (ret < 0)
ALOGE("ERR(%s[%d]): Cannot update BNS scale ratio(%d)", __FUNCTION__, __LINE__, binningRatio);
}
status_t ExynosCameraParameters::m_setBinningScaleRatio(int ratio)
{
#define MIN_BINNING_RATIO 1000
#define MAX_BINNING_RATIO 6000
if (ratio < MIN_BINNING_RATIO || ratio > MAX_BINNING_RATIO) {
ALOGE("ERR(%s[%d]): Out of bound, ratio(%d), min:max(%d:%d)",
__FUNCTION__, __LINE__, ratio, MAX_BINNING_RATIO, MAX_BINNING_RATIO);
return BAD_VALUE;
}
m_cameraInfo.binningScaleRatio = ratio;
return NO_ERROR;
}
uint32_t ExynosCameraParameters::getBinningScaleRatio(void)
{
return m_cameraInfo.binningScaleRatio;
}
status_t ExynosCameraParameters::checkPictureSize(const CameraParameters& params)
{
int curPictureW = 0;
int curPictureH = 0;
int newPictureW = 0;
int newPictureH = 0;
int curHwPictureW = 0;
int curHwPictureH = 0;
int newHwPictureW = 0;
int newHwPictureH = 0;
int right_ratio = 177;
params.getPictureSize(&newPictureW, &newPictureH);
if (newPictureW < 0 || newPictureH < 0) {
return BAD_VALUE;
}
if (m_adjustPictureSize(&newPictureW, &newPictureH, &newHwPictureW, &newHwPictureH) != NO_ERROR) {
return BAD_VALUE;
}
if (m_isSupportedPictureSize(newPictureW, newPictureH) == false) {
int maxHwPictureW =0;
int maxHwPictureH = 0;
CLOGE("ERR(%s):Invalid picture size(%dx%d)", __FUNCTION__, newPictureW, newPictureH);
/* prevent wrong size setting */
getMaxPictureSize(&maxHwPictureW, &maxHwPictureH);
m_setPictureSize(maxHwPictureW, maxHwPictureH);
m_setHwPictureSize(maxHwPictureW, maxHwPictureH);
m_params.setPictureSize(maxHwPictureW, maxHwPictureH);
CLOGE("ERR(%s):changed picture size to MAX(%dx%d)", __FUNCTION__, maxHwPictureW, maxHwPictureH);
#ifdef FIXED_SENSOR_SIZE
updateHwSensorSize();
#endif
return INVALID_OPERATION;
}
CLOGI("INFO(%s):newPicture Size (%dx%d), ratioId(%d)",
"setParameters", newPictureW, newPictureH, m_cameraInfo.pictureSizeRatioId);
if ((int)(m_staticInfo->maxSensorW * 100 / m_staticInfo->maxSensorH) == right_ratio) {
setHorizontalViewAngle(newPictureW, newPictureH);
}
m_params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, getHorizontalViewAngle());
getPictureSize(&curPictureW, &curPictureH);
getHwPictureSize(&curHwPictureW, &curHwPictureH);
if (curPictureW != newPictureW || curPictureH != newPictureH ||
curHwPictureW != newHwPictureW || curHwPictureH != newHwPictureH) {
CLOGI("INFO(%s[%d]): Picture size changed: cur(%dx%d) -> new(%dx%d)",
"setParameters", __LINE__, curPictureW, curPictureH, newPictureW, newPictureH);
CLOGI("INFO(%s[%d]): HwPicture size changed: cur(%dx%d) -> new(%dx%d)",
"setParameters", __LINE__, curHwPictureW, curHwPictureH, newHwPictureW, newHwPictureH);
m_setPictureSize(newPictureW, newPictureH);
m_setHwPictureSize(newHwPictureW, newHwPictureH);
m_params.setPictureSize(newPictureW, newPictureH);
#ifdef FIXED_SENSOR_SIZE
updateHwSensorSize();
#endif
}
return NO_ERROR;
}
status_t ExynosCameraParameters::m_adjustPictureSize(int *newPictureW, int *newPictureH,
int *newHwPictureW, int *newHwPictureH)
{
int ret = 0;
int newX = 0, newY = 0, newW = 0, newH = 0;
float zoomRatio = getZoomRatio(0) / 1000;
if ((getRecordingHint() == true && getHighSpeedRecording() == true)
#ifdef USE_BINNING_MODE
|| getBinningMode()
#endif
)
{
int sizeList[SIZE_LUT_INDEX_END];
if (m_getPreviewSizeList(sizeList) == NO_ERROR) {
*newPictureW = sizeList[TARGET_W];
*newPictureH = sizeList[TARGET_H];
*newHwPictureW = *newPictureW;
*newHwPictureH = *newPictureH;
return NO_ERROR;
} else {
ALOGE("ERR(%s):m_getPreviewSizeList() fail", __FUNCTION__);
return BAD_VALUE;
}
}
getMaxPictureSize(newHwPictureW, newHwPictureH);
if (getCameraId() == CAMERA_ID_BACK) {
ret = getCropRectAlign(*newHwPictureW, *newHwPictureH,
*newPictureW, *newPictureH,
&newX, &newY, &newW, &newH,
CAMERA_ISP_ALIGN, 2, 0, zoomRatio);
if (ret < 0) {
CLOGE("ERR(%s):getCropRectAlign(%d, %d, %d, %d) fail",
__FUNCTION__, *newHwPictureW, *newHwPictureH, *newPictureW, *newPictureH);
return BAD_VALUE;
}
*newHwPictureW = newW;
*newHwPictureH = newH;
#ifdef FIXED_SENSOR_SIZE
/*
* sensor crop size:
* sensor crop is only used at 16:9 aspect ratio in picture size.
*/
if (getSamsungCamera() == true) {
if (((float)*newPictureW / (float)*newPictureH) == ((float)16 / (float)9)) {
CLOGD("(%s): Use sensor crop (ratio: %f)",
__FUNCTION__, ((float)*newPictureW / (float)*newPictureH));
m_setHwSensorSize(newW, newH);
}
}
#endif
}
return NO_ERROR;
}
bool ExynosCameraParameters::m_isSupportedPictureSize(const int width,
const int height)
{
int maxWidth, maxHeight = 0;
int (*sizeList)[SIZE_OF_RESOLUTION];
getMaxPictureSize(&maxWidth, &maxHeight);
if (maxWidth < width || maxHeight < height) {
CLOGE("ERR(%s):invalid picture Size(maxSize(%d/%d) size(%d/%d)",
__FUNCTION__, maxWidth, maxHeight, width, height);
return false;
}
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->rearPictureList;
for (int i = 0; i < m_staticInfo->rearPictureListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.pictureSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->frontPictureList;
for (int i = 0; i < m_staticInfo->frontPictureListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.pictureSizeRatioId = sizeList[i][2];
return true;
}
}
}
if (getCameraId() == CAMERA_ID_BACK) {
sizeList = m_staticInfo->hiddenRearPictureList;
for (int i = 0; i < m_staticInfo->hiddenRearPictureListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.pictureSizeRatioId = sizeList[i][2];
return true;
}
}
} else {
sizeList = m_staticInfo->hiddenFrontPictureList;
for (int i = 0; i < m_staticInfo->hiddenFrontPictureListMax; i++) {
if (sizeList[i][0] > maxWidth || sizeList[i][1] > maxHeight)
continue;
if (sizeList[i][0] == width && sizeList[i][1] == height) {
m_cameraInfo.pictureSizeRatioId = sizeList[i][2];
return true;
}
}
}
CLOGE("ERR(%s):Invalid picture size(%dx%d)", __FUNCTION__, width, height);
return false;
}
void ExynosCameraParameters::m_setPictureSize(int w, int h)
{
m_cameraInfo.pictureW = w;
m_cameraInfo.pictureH = h;
}
void ExynosCameraParameters::getPictureSize(int *w, int *h)
{
*w = m_cameraInfo.pictureW;
*h = m_cameraInfo.pictureH;
}
void ExynosCameraParameters::getMaxPictureSize(int *w, int *h)
{
*w = m_staticInfo->maxPictureW;
*h = m_staticInfo->maxPictureH;
}
void ExynosCameraParameters::m_setHwPictureSize(int w, int h)
{
m_cameraInfo.hwPictureW = w;
m_cameraInfo.hwPictureH = h;
}
void ExynosCameraParameters::getHwPictureSize(int *w, int *h)
{
*w = m_cameraInfo.hwPictureW;
*h = m_cameraInfo.hwPictureH;
}
void ExynosCameraParameters::m_setHwBayerCropRegion(int w, int h, int x, int y)
{
Mutex::Autolock lock(m_parameterLock);
m_cameraInfo.hwBayerCropW = w;
m_cameraInfo.hwBayerCropH = h;
m_cameraInfo.hwBayerCropX = x;
m_cameraInfo.hwBayerCropY = y;
}
void ExynosCameraParameters::getHwBayerCropRegion(int *w, int *h, int *x, int *y)
{
Mutex::Autolock lock(m_parameterLock);
*w = m_cameraInfo.hwBayerCropW;
*h = m_cameraInfo.hwBayerCropH;
*x = m_cameraInfo.hwBayerCropX;
*y = m_cameraInfo.hwBayerCropY;
}
status_t ExynosCameraParameters::checkPictureFormat(const CameraParameters& params)
{
int curPictureFormat = 0;
int newPictureFormat = 0;
const char *strNewPictureFormat = params.getPictureFormat();
const char *strCurPictureFormat = m_params.getPictureFormat();
#ifdef SAMSUNG_DNG
int shotMode = params.getInt("shot-mode");
setDNGCaptureModeOn(false);
#endif
if (strNewPictureFormat == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newPictureFormat %s", "setParameters", strNewPictureFormat);
if (!strcmp(strNewPictureFormat, CameraParameters::PIXEL_FORMAT_JPEG)) {
newPictureFormat = SCC_OUTPUT_COLOR_FMT;
}
#ifdef SAMSUNG_DNG
else if (!strcmp(strNewPictureFormat, "raw+jpeg")) {
newPictureFormat = SCC_OUTPUT_COLOR_FMT;
if (shotMode == SHOT_MODE_PRO_MODE) {
setDNGCaptureModeOn(true);
} else {
CLOGW("WARN(%s[%d]): Picture format(%s) is not supported!, shot mode(%d)",
__FUNCTION__, __LINE__, strNewPictureFormat, shotMode);
}
}
#endif
else {
CLOGE("ERR(%s[%d]): Picture format(%s) is not supported!", __FUNCTION__, __LINE__, strNewPictureFormat);
return BAD_VALUE;
}
curPictureFormat = getPictureFormat();
if (newPictureFormat != curPictureFormat) {
CLOGI("INFO(%s[%d]): Picture format changed, cur(%s) -> new(%s)", "Parameters", __LINE__, strCurPictureFormat, strNewPictureFormat);
m_setPictureFormat(newPictureFormat);
m_params.setPictureFormat(strNewPictureFormat);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setPictureFormat(int fmt)
{
m_cameraInfo.pictureFormat = fmt;
}
int ExynosCameraParameters::getPictureFormat(void)
{
return m_cameraInfo.pictureFormat;
}
status_t ExynosCameraParameters::checkJpegQuality(const CameraParameters& params)
{
int newJpegQuality = params.getInt(CameraParameters::KEY_JPEG_QUALITY);
int curJpegQuality = getJpegQuality();
CLOGD("DEBUG(%s):newJpegQuality %d", "setParameters", newJpegQuality);
if (newJpegQuality < 1 || newJpegQuality > 100) {
CLOGE("ERR(%s): Invalid Jpeg Quality (Min: %d, Max: %d, Value: %d)", __FUNCTION__, 1, 100, newJpegQuality);
return BAD_VALUE;
}
if (curJpegQuality != newJpegQuality) {
m_setJpegQuality(newJpegQuality);
m_params.set(CameraParameters::KEY_JPEG_QUALITY, newJpegQuality);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setJpegQuality(int quality)
{
m_cameraInfo.jpegQuality = quality;
}
int ExynosCameraParameters::getJpegQuality(void)
{
return m_cameraInfo.jpegQuality;
}
status_t ExynosCameraParameters::checkThumbnailSize(const CameraParameters& params)
{
int curThumbnailW = 0;
int curThumbnailH = 0;
int maxThumbnailW = 0;
int maxThumbnailH = 0;
int newJpegThumbnailW = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
int newJpegThumbnailH = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
CLOGD("DEBUG(%s):newJpegThumbnailW X newJpegThumbnailH: %d X %d", "setParameters", newJpegThumbnailW, newJpegThumbnailH);
getMaxThumbnailSize(&maxThumbnailW, &maxThumbnailH);
if (newJpegThumbnailW < 0 || newJpegThumbnailH < 0 ||
newJpegThumbnailW > maxThumbnailW || newJpegThumbnailH > maxThumbnailH) {
CLOGE("ERR(%s): Invalid Thumbnail Size (maxSize(%d/%d) size(%d/%d)", __FUNCTION__, maxThumbnailW, maxThumbnailH, newJpegThumbnailW, newJpegThumbnailH);
return BAD_VALUE;
}
getThumbnailSize(&curThumbnailW, &curThumbnailH);
if (curThumbnailW != newJpegThumbnailW || curThumbnailH != newJpegThumbnailH) {
m_setThumbnailSize(newJpegThumbnailW, newJpegThumbnailH);
m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, newJpegThumbnailW);
m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, newJpegThumbnailH);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setThumbnailSize(int w, int h)
{
m_cameraInfo.thumbnailW = w;
m_cameraInfo.thumbnailH = h;
}
void ExynosCameraParameters::getThumbnailSize(int *w, int *h)
{
*w = m_cameraInfo.thumbnailW;
*h = m_cameraInfo.thumbnailH;
}
void ExynosCameraParameters::getMaxThumbnailSize(int *w, int *h)
{
*w = m_staticInfo->maxThumbnailW;
*h = m_staticInfo->maxThumbnailH;
}
status_t ExynosCameraParameters::checkThumbnailQuality(const CameraParameters& params)
{
int newJpegThumbnailQuality = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
int curThumbnailQuality = getThumbnailQuality();
CLOGD("DEBUG(%s):newJpegThumbnailQuality %d", "setParameters", newJpegThumbnailQuality);
if (newJpegThumbnailQuality < 0 || newJpegThumbnailQuality > 100) {
CLOGE("ERR(%s): Invalid Thumbnail Quality (Min: %d, Max: %d, Value: %d)", __FUNCTION__, 0, 100, newJpegThumbnailQuality);
return BAD_VALUE;
}
if (curThumbnailQuality != newJpegThumbnailQuality) {
m_setThumbnailQuality(newJpegThumbnailQuality);
m_params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, newJpegThumbnailQuality);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setThumbnailQuality(int quality)
{
m_cameraInfo.thumbnailQuality = quality;
}
int ExynosCameraParameters::getThumbnailQuality(void)
{
return m_cameraInfo.thumbnailQuality;
}
status_t ExynosCameraParameters::check3dnrMode(const CameraParameters& params)
{
bool new3dnrMode = false;
bool cur3dnrMode = false;
#if defined(USE_3DNR_ALWAYS)
const char *str3dnrMode = (USE_3DNR_ALWAYS == true) ? "true" : params.get("3dnr");
#else
const char *str3dnrMode = params.get("3dnr");
#endif
if (str3dnrMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):new3dnrMode %s", "setParameters", str3dnrMode);
if (!strcmp(str3dnrMode, "true"))
new3dnrMode = true;
if (m_flag3dnrMode != new3dnrMode) {
m_flag3dnrMode = new3dnrMode;
m_params.set("3dnr", str3dnrMode);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_set3dnrMode(bool toggle)
{
m_cameraInfo.is3dnrMode = toggle;
}
bool ExynosCameraParameters::get3dnrMode(void)
{
return m_cameraInfo.is3dnrMode;
}
bool ExynosCameraParameters::m_getFlag3dnrOffCase(void)
{
/*
* return true : nevermind
* return false : 3dnr off
*/
bool flagOn = true;
/* 120 fps recording, turn off 3DNR */
uint32_t minFpsRange = 0;
uint32_t maxFpsRange = 0;
getPreviewFpsRange(&minFpsRange, &maxFpsRange);
#if defined(USE_3DNR_ALWAYS)
if (USE_3DNR_ALWAYS == true) {
if (60 < minFpsRange || 60 < maxFpsRange) {
#if defined(USE_3DNR_HIGHSPEED_RECORDING)
flagOn = USE_3DNR_HIGHSPEED_RECORDING;
#else
flagOn = false;
#endif /* USE_3DNR_HIGHSPEED_RECORDING */
CLOGD("DEBUG(%s):Turn (%s) 3dnrMode by FpsRange(%d, %d)",
"setParameters",
(flagOn) ? "on":"off",
minFpsRange,
maxFpsRange);
}
}
#endif /* USE_3DNR_ALWAYS */
/* dual case, turn off 3DNR */
if (this->getDualMode() == true) {
flagOn = false;
CLOGD("DEBUG(%s):Turn (%s) 3dnrMode by dualMode",
"setParameters",
(flagOn) ? "on":"off");
}
/* UHD recording case, turn off 3DNR */
#if defined(USE_3DNR_ALWAYS)
if (USE_3DNR_ALWAYS == true) {
int hwPreviewW = 0, hwPreviewH = 0;
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
if (3840 <= hwPreviewW && 2160 <= hwPreviewH) {
#if defined(USE_3DNR_UHDRECORDING)
flagOn = USE_3DNR_UHDRECORDING;
#else
flagOn = false;
#endif /* USE_3DNR_UHDRECORDING */
CLOGD("DEBUG(%s):Turn (%s) 3dnrMode by UHD",
"setParameters",
(flagOn) ? "on":"off");
}
}
#endif /* USE_3DNR_ALWAYS */
#if defined(USE_3DNR_ALWAYS)
if (USE_3DNR_ALWAYS == true) {
if(getRecordingHint() == false) {
#if defined(USE_3DNR_PREVIEW)
flagOn = USE_3DNR_PREVIEW;
#else
flagOn = false;
#endif
CLOGD("DEBUG(%s):Turn (%s) 3dnrMode by preview",
"setParameters",
(flagOn) ? "on":"off");
}
}
#endif /* USE_3DNR_ALWAYS */
#if defined(USE_3DNR_ALWAYS) && defined(USE_LIVE_BROADCAST)
if (USE_3DNR_ALWAYS == true && getPLBMode() == true) {
flagOn = false;
}
#endif
return flagOn;
}
status_t ExynosCameraParameters::checkDrcMode(const CameraParameters& params)
{
bool newDrcMode = false;
bool curDrcMode = false;
const char *strDrcMode = params.get("drc");
if (strDrcMode == NULL) {
#ifdef USE_FRONT_PREVIEW_DRC
if (getCameraId() == CAMERA_ID_FRONT && m_staticInfo->drcSupport == true) {
newDrcMode = !getRecordingHint();
m_setDrcMode(newDrcMode);
ALOGD("DEBUG(%s):Force DRC %s for front", "setParameters",
(newDrcMode == true)? "ON" : "OFF");
}
#endif
return NO_ERROR;
}
CLOGD("DEBUG(%s):newDrcMode %s", "setParameters", strDrcMode);
if (!strcmp(strDrcMode, "true"))
newDrcMode = true;
curDrcMode = getDrcMode();
if (curDrcMode != newDrcMode) {
m_setDrcMode(newDrcMode);
m_params.set("drc", strDrcMode);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setDrcMode(bool toggle)
{
m_cameraInfo.isDrcMode = toggle;
if (setDrcEnable(toggle) < 0) {
CLOGE("ERR(%s[%d]): set DRC fail, toggle(%d)", __FUNCTION__, __LINE__, toggle);
}
}
bool ExynosCameraParameters::getDrcMode(void)
{
return m_cameraInfo.isDrcMode;
}
status_t ExynosCameraParameters::checkOdcMode(const CameraParameters& params)
{
bool newOdcMode = false;
bool curOdcMode = false;
const char *strOdcMode = params.get("odc");
if (strOdcMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newOdcMode %s", "setParameters", strOdcMode);
if (!strcmp(strOdcMode, "true"))
newOdcMode = true;
curOdcMode = getOdcMode();
if (curOdcMode != newOdcMode) {
m_setOdcMode(newOdcMode);
m_params.set("odc", strOdcMode);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setOdcMode(bool toggle)
{
m_cameraInfo.isOdcMode = toggle;
}
bool ExynosCameraParameters::getOdcMode(void)
{
return m_cameraInfo.isOdcMode;
}
bool ExynosCameraParameters::getTpuEnabledMode(void)
{
/*
* This getTpuEnabledMode() func will remove.
* but, current code use getTpuEnabledMode() many place.
* so, just use until code stabilization.
* and we will replace getTpuEnabledMode() to isIspTpuOtf()
*/
bool ret = true;
if (isIspTpuOtf() == true)
ret = false;
return ret;
}
status_t ExynosCameraParameters::checkZoomLevel(const CameraParameters& params)
{
int newZoom = params.getInt(CameraParameters::KEY_ZOOM);
int curZoom = 0;
CLOGD("DEBUG(%s):newZoom %d", "setParameters", newZoom);
/* cannot support DZoom -> set Zoom Level 0 */
if (getZoomSupported() == false) {
if (newZoom != ZOOM_LEVEL_0) {
CLOGE("ERR(%s):Invalid value (Zoom Should be %d, Value: %d)", __FUNCTION__, ZOOM_LEVEL_0, newZoom);
return BAD_VALUE;
}
if (setZoomLevel(ZOOM_LEVEL_0) != NO_ERROR)
return BAD_VALUE;
return NO_ERROR;
} else {
if (newZoom < ZOOM_LEVEL_0 || getMaxZoomLevel() <= newZoom) {
CLOGE("ERR(%s):Invalid value (Min: %d, Max: %d, Value: %d)", __FUNCTION__, ZOOM_LEVEL_0, getMaxZoomLevel(), newZoom);
return BAD_VALUE;
}
if (setZoomLevel(newZoom) != NO_ERROR) {
return BAD_VALUE;
}
m_params.set(CameraParameters::KEY_ZOOM, newZoom);
m_flagMeteringRegionChanged = true;
return NO_ERROR;
}
return NO_ERROR;
}
status_t ExynosCameraParameters::setZoomLevel(int zoom)
{
int srcW = 0;
int srcH = 0;
int dstW = 0;
int dstH = 0;
#ifdef USE_FW_ZOOMRATIO
float zoomRatio = 1.00f;
#endif
m_cameraInfo.zoom = zoom;
getHwSensorSize(&srcW, &srcH);
getHwPreviewSize(&dstW, &dstH);
#if 0
if (m_setParamCropRegion(zoom, srcW, srcH, dstW, dstH) != NO_ERROR) {
return BAD_VALUE;
}
#else
ExynosRect srcRect, dstRect;
getPreviewBayerCropSize(&srcRect, &dstRect);
#endif
#ifdef USE_FW_ZOOMRATIO
zoomRatio = getZoomRatio(zoom) / 1000;
setMetaCtlZoom(&m_metadata, zoomRatio);
#endif
return NO_ERROR;
}
status_t ExynosCameraParameters::setCropRegion(int x, int y, int w, int h)
{
status_t ret = NO_ERROR;
ret = setMetaCtlCropRegion(&m_metadata, x, y, w, h);
if (ret != NO_ERROR) {
CLOGE("ERR(%s[%d]):Failed to setMetaCtlCropRegion(%d, %d, %d, %d)",
__FUNCTION__, __LINE__, x, y, w, h);
}
return ret;
}
void ExynosCameraParameters::m_getCropRegion(int *x, int *y, int *w, int *h)
{
getMetaCtlCropRegion(&m_metadata, x, y, w, h);
}
status_t ExynosCameraParameters::m_setParamCropRegion(
int zoom,
int srcW, int srcH,
int dstW, int dstH)
{
int newX = 0, newY = 0, newW = 0, newH = 0;
float zoomRatio = getZoomRatio(zoom) / 1000;
if (getCropRectAlign(srcW, srcH,
dstW, dstH,
&newX, &newY,
&newW, &newH,
CAMERA_MAGIC_ALIGN, 2,
zoom, zoomRatio) != NO_ERROR) {
CLOGE("ERR(%s):getCropRectAlign(%d, %d, %d, %d) fail",
__func__, srcW, srcH, dstW, dstH);
return BAD_VALUE;
}
newX = ALIGN_UP(newX, 2);
newY = ALIGN_UP(newY, 2);
newW = srcW - (newX * 2);
newH = srcH - (newY * 2);
CLOGI("DEBUG(%s):size0(%d, %d, %d, %d)",
__FUNCTION__, srcW, srcH, dstW, dstH);
CLOGI("DEBUG(%s):size(%d, %d, %d, %d), level(%d)",
__FUNCTION__, newX, newY, newW, newH, zoom);
m_setHwBayerCropRegion(newW, newH, newX, newY);
return NO_ERROR;
}
int ExynosCameraParameters::getZoomLevel(void)
{
return m_cameraInfo.zoom;
}
status_t ExynosCameraParameters::checkRotation(const CameraParameters& params)
{
int newRotation = params.getInt(CameraParameters::KEY_ROTATION);
int curRotation = 0;
if (newRotation < 0) {
CLOGE("ERR(%s): Invalide Rotation value(%d)", __FUNCTION__, newRotation);
return NO_ERROR;
}
CLOGD("DEBUG(%s):set orientation:%d", "setParameters", newRotation);
curRotation = getRotation();
if (curRotation != newRotation) {
m_setRotation(newRotation);
m_params.set(CameraParameters::KEY_ROTATION, newRotation);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setRotation(int rotation)
{
m_cameraInfo.rotation = rotation;
}
int ExynosCameraParameters::getRotation(void)
{
return m_cameraInfo.rotation;
}
status_t ExynosCameraParameters::checkAutoExposureLock(const CameraParameters& params)
{
bool newAutoExposureLock = false;
bool curAutoExposureLock = false;
const char *strAutoExposureLock = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK);
if (strAutoExposureLock == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newAutoExposureLock %s", "setParameters", strAutoExposureLock);
if (!strcmp(strAutoExposureLock, "true"))
newAutoExposureLock = true;
curAutoExposureLock = getAutoExposureLock();
if (curAutoExposureLock != newAutoExposureLock) {
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_flashMgr->setAeLock(newAutoExposureLock);
m_setAutoExposureLock(newAutoExposureLock);
m_params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, strAutoExposureLock);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setAutoExposureLock(bool lock)
{
if (getHalVersion() != IS_HAL_VER_3_2) {
m_cameraInfo.autoExposureLock = lock;
setMetaCtlAeLock(&m_metadata, lock);
}
}
bool ExynosCameraParameters::getAutoExposureLock(void)
{
return m_cameraInfo.autoExposureLock;
}
void ExynosCameraParameters::m_adjustAeMode(enum aa_aemode curAeMode, enum aa_aemode *newAeMode)
{
if (getHalVersion() != IS_HAL_VER_3_2) {
int curMeteringMode = getMeteringMode();
if (curAeMode == AA_AEMODE_OFF) {
switch(curMeteringMode) {
case METERING_MODE_AVERAGE:
*newAeMode = AA_AEMODE_AVERAGE;
break;
case METERING_MODE_CENTER:
*newAeMode = AA_AEMODE_CENTER;
break;
case METERING_MODE_MATRIX:
*newAeMode = AA_AEMODE_MATRIX;
break;
case METERING_MODE_SPOT:
*newAeMode = AA_AEMODE_SPOT;
break;
default:
*newAeMode = curAeMode;
break;
}
}
}
}
status_t ExynosCameraParameters::checkExposureCompensation(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
}
int minExposureCompensation = params.getInt(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION);
int maxExposureCompensation = params.getInt(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION);
int newExposureCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
int curExposureCompensation = getExposureCompensation();
CLOGD("DEBUG(%s):newExposureCompensation %d", "setParameters", newExposureCompensation);
if ((newExposureCompensation < minExposureCompensation) ||
(newExposureCompensation > maxExposureCompensation)) {
CLOGE("ERR(%s): Invalide Exposurecompensation (Min: %d, Max: %d, Value: %d)", __FUNCTION__,
minExposureCompensation, maxExposureCompensation, newExposureCompensation);
return BAD_VALUE;
}
if (curExposureCompensation != newExposureCompensation) {
m_setExposureCompensation(newExposureCompensation);
m_params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, newExposureCompensation);
}
return NO_ERROR;
}
/* TODO: Who explane this offset value? */
#define FW_CUSTOM_OFFSET (1)
/* F/W's middle value is 5, and step is -4, -3, -2, -1, 0, 1, 2, 3, 4 */
void ExynosCameraParameters::m_setExposureCompensation(int32_t value)
{
#if defined(USE_SUBDIVIDED_EV)
setMetaCtlExposureCompensation(&m_metadata, value);
setMetaCtlExposureCompensationStep(&m_metadata, m_staticInfo->exposureCompensationStep);
#else
setMetaCtlExposureCompensation(&m_metadata, value + IS_EXPOSURE_DEFAULT + FW_CUSTOM_OFFSET);
#endif
}
int32_t ExynosCameraParameters::getExposureCompensation(void)
{
int32_t expCompensation;
getMetaCtlExposureCompensation(&m_metadata, &expCompensation);
#if defined(USE_SUBDIVIDED_EV)
return expCompensation;
#else
return expCompensation - IS_EXPOSURE_DEFAULT - FW_CUSTOM_OFFSET;
#endif
}
status_t ExynosCameraParameters::checkExposureTime(const CameraParameters& params)
{
int ret = NO_ERROR;
int newExposureTime = params.getInt("exposure-time");
int curExposureTime = m_params.getInt("exposure-time");
const char *strNewSceneMode = params.get(CameraParameters::KEY_SCENE_MODE);
if (strNewSceneMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newExposureTime : %d", "setParameters", newExposureTime);
if (newExposureTime == curExposureTime)
return NO_ERROR;
if (newExposureTime < 0)
return NO_ERROR;
if (newExposureTime != 0 &&
(newExposureTime > getMaxExposureTime() || newExposureTime < getMinExposureTime())) {
CLOGE("ERR(%s): Invalid Exposure Time(%d). minExposureTime(%d), maxExposureTime(%d)",
"setParameters", newExposureTime, getMaxExposureTime(), getMinExposureTime());
return BAD_VALUE;
}
if (strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_AUTO) && newExposureTime > 0) {
CLOGD("DEBUG(%s):ExposureTime can set only auto scene mode", "setParameters");
return NO_ERROR;
}
m_setExposureTime((uint64_t) newExposureTime);
m_params.set("exposure-time", newExposureTime);
return NO_ERROR;
}
void ExynosCameraParameters::m_setExposureTime(uint64_t exposureTime)
{
m_exposureTimeCapture = exposureTime;
/* make capture exposuretime micro second */
setMetaCtlCaptureExposureTime(&m_metadata, (uint32_t)exposureTime);
/* For showing faster Preview */
if (exposureTime > CAMERA_PREVIEW_EXPOSURE_TIME_LIMIT)
exposureTime = CAMERA_PREVIEW_EXPOSURE_TIME_LIMIT;
/* make exposuretime nano second */
setMetaCtlExposureTime(&m_metadata, exposureTime * 1000);
}
void ExynosCameraParameters::setExposureTime(void)
{
/* make exposuretime nano second */
setMetaCtlExposureTime(&m_metadata, getLongExposureTime() * 1000);
}
void ExynosCameraParameters::setPreviewExposureTime(void)
{
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_setExposureTime(m_exposureTimeCapture);
m_flashMgr->setManualExposureTime(0);
}
uint64_t ExynosCameraParameters::getPreviewExposureTime(void)
{
uint64_t exposureTime = 0;
getMetaCtlExposureTime(&m_metadata, &exposureTime);
/* make exposuretime milli second */
exposureTime = exposureTime / 1000;
return exposureTime;
}
uint64_t ExynosCameraParameters::getCaptureExposureTime(void)
{
return m_exposureTimeCapture;
}
uint64_t ExynosCameraParameters::getLongExposureTime(void)
{
#ifndef CAMERA_ADD_BAYER_ENABLE
if (m_exposureTimeCapture >= CAMERA_EXPOSURE_TIME_MAX) {
return CAMERA_EXPOSURE_TIME_MAX;
} else
#endif
{
return m_exposureTimeCapture / (getLongExposureShotCount() + 1);
}
}
int32_t ExynosCameraParameters::getLongExposureShotCount(void)
{
bool getResult;
int32_t count = 0;
#ifdef CAMERA_ADD_BAYER_ENABLE
if (m_exposureTimeCapture <= CAMERA_EXPOSURE_TIME_MAX)
#endif
return 0;
if (m_exposureTimeCapture % CAMERA_EXPOSURE_TIME_MAX) {
count = 2;
getResult = false;
while (!getResult) {
if (m_exposureTimeCapture % count) {
count++;
continue;
}
if (CAMERA_EXPOSURE_TIME_MAX < (m_exposureTimeCapture / count)) {
count++;
continue;
}
getResult = true;
}
return count - 1;
} else {
return m_exposureTimeCapture / CAMERA_EXPOSURE_TIME_MAX - 1;
}
}
status_t ExynosCameraParameters::checkMeteringAreas(const CameraParameters& params)
{
int ret = NO_ERROR;
const char *newMeteringAreas = params.get(CameraParameters::KEY_METERING_AREAS);
const char *curMeteringAreas = m_params.get(CameraParameters::KEY_METERING_AREAS);
const char meteringAreas[20] = "(0,0,0,0,0)";
bool nullCheckflag = false;
int newMeteringAreasSize = 0;
bool isMeteringAreasSame = false;
uint32_t maxNumMeteringAreas = getMaxNumMeteringAreas();
if (m_exposureTimeCapture > 0) {
ALOGD("DEBUG(%s): manual exposure mode. MeteringAreas will not set.", "setParameters");
return NO_ERROR;
}
if (newMeteringAreas == NULL || (newMeteringAreas != NULL && !strcmp(newMeteringAreas, "(0,0,0,0,0)"))) {
if(getMeteringMode() == METERING_MODE_SPOT) {
newMeteringAreas = meteringAreas;
nullCheckflag = true;
} else {
setMetaCtlAeRegion(&m_metadata, 0, 0, 0, 0, 0);
return NO_ERROR;
}
}
if(getSamsungCamera()) {
maxNumMeteringAreas = 1;
}
if (maxNumMeteringAreas <= 0) {
CLOGD("DEBUG(%s): meterin area is not supported", "Parameters");
return NO_ERROR;
}
ALOGD("DEBUG(%s):newMeteringAreas: %s ,maxNumMeteringAreas(%d)", "setParameters", newMeteringAreas, maxNumMeteringAreas);
newMeteringAreasSize = strlen(newMeteringAreas);
if (curMeteringAreas != NULL) {
isMeteringAreasSame = !strncmp(newMeteringAreas, curMeteringAreas, newMeteringAreasSize);
}
if (curMeteringAreas == NULL || isMeteringAreasSame == false || m_flagMeteringRegionChanged == true) {
/* ex : (-10,-10,0,0,300),(0,0,10,10,700) */
ExynosRect2 *rect2s = new ExynosRect2[maxNumMeteringAreas];
int *weights = new int[maxNumMeteringAreas];
uint32_t validMeteringAreas = bracketsStr2Ints((char *)newMeteringAreas, maxNumMeteringAreas, rect2s, weights, 1);
if (0 < validMeteringAreas && validMeteringAreas <= maxNumMeteringAreas) {
m_setMeteringAreas((uint32_t)validMeteringAreas, rect2s, weights);
if(!nullCheckflag) {
m_params.set(CameraParameters::KEY_METERING_AREAS, newMeteringAreas);
}
} else {
CLOGE("ERR(%s):MeteringAreas value is invalid", __FUNCTION__);
ret = UNKNOWN_ERROR;
}
m_flagMeteringRegionChanged = false;
delete [] rect2s;
delete [] weights;
}
return ret;
}
void ExynosCameraParameters::m_setMeteringAreas(uint32_t num, ExynosRect *rects, int *weights)
{
ExynosRect2 *rect2s = new ExynosRect2[num];
for (uint32_t i = 0; i < num; i++)
convertingRectToRect2(&rects[i], &rect2s[i]);
m_setMeteringAreas(num, rect2s, weights);
delete [] rect2s;
}
void ExynosCameraParameters::m_setMeteringAreas(uint32_t num, ExynosRect2 *rect2s, int *weights)
{
uint32_t maxNumMeteringAreas = getMaxNumMeteringAreas();
if(getSamsungCamera()) {
maxNumMeteringAreas = 1;
}
if (maxNumMeteringAreas == 0) {
CLOGV("DEBUG(%s):maxNumMeteringAreas is 0. so, ignored", __FUNCTION__);
return;
}
if (maxNumMeteringAreas < num)
num = maxNumMeteringAreas;
if (getAutoExposureLock() == true) {
CLOGD("DEBUG(%s):autoExposure is Locked", __FUNCTION__);
return;
}
if (num == 1) {
#ifdef CAMERA_GED_FEATURE
int meteringMode = getMeteringMode();
if (isRectNull(&rect2s[0]) == true) {
switch (meteringMode) {
case METERING_MODE_SPOT:
/*
* Even if SPOT metering mode, area must set valid values,
* but areas was invalid values, we change mode to CENTER.
*/
m_setMeteringMode(METERING_MODE_CENTER);
m_cameraInfo.isTouchMetering = false;
break;
case METERING_MODE_AVERAGE:
case METERING_MODE_CENTER:
case METERING_MODE_MATRIX:
default:
/* adjust metering setting */
break;
}
} else {
switch (meteringMode) {
case METERING_MODE_CENTER:
/*
* SPOT metering mode in GED camera App was not set METERING_MODE_SPOT,
* but set metering areas only.
*/
m_setMeteringMode(METERING_MODE_SPOT);
m_cameraInfo.isTouchMetering = true;
break;
case METERING_MODE_AVERAGE:
case METERING_MODE_MATRIX:
case METERING_MODE_SPOT:
default:
/* adjust metering setting */
break;
}
}
#endif
} else {
if (num > 1 && isRectEqual(&rect2s[0], &rect2s[1]) == false) {
/* if MATRIX mode support, mode set METERING_MODE_MATRIX */
m_setMeteringMode(METERING_MODE_AVERAGE);
m_cameraInfo.isTouchMetering = false;
} else {
m_setMeteringMode(METERING_MODE_AVERAGE);
m_cameraInfo.isTouchMetering = false;
}
}
ExynosRect cropRegionRect;
ExynosRect2 newRect2;
getHwBayerCropRegion(&cropRegionRect.w, &cropRegionRect.h, &cropRegionRect.x, &cropRegionRect.y);
for (uint32_t i = 0; i < num; i++) {
bool isChangeMeteringArea = false;
#ifdef CAMERA_GED_FEATURE
if (isRectNull(&rect2s[i]) == false)
isChangeMeteringArea = true;
else
isChangeMeteringArea = false;
#else
if ((isRectNull(&rect2s[i]) == false) ||((isRectNull(&rect2s[i]) == true) && (getMeteringMode() == METERING_MODE_SPOT)))
isChangeMeteringArea = true;
#ifdef TOUCH_AE
else if((getMeteringMode() == METERING_MODE_SPOT_TOUCH) || (getMeteringMode() == METERING_MODE_MATRIX_TOUCH)
|| (getMeteringMode() == METERING_MODE_CENTER_TOUCH) || (getMeteringMode() == METERING_MODE_AVERAGE_TOUCH))
isChangeMeteringArea = true;
#endif
else
isChangeMeteringArea = false;
#endif
if (isChangeMeteringArea == true) {
CLOGD("DEBUG(%s) (%d %d %d %d) %d", __FUNCTION__, rect2s->x1, rect2s->y1, rect2s->x2, rect2s->y2, getMeteringMode());
newRect2 = convertingAndroidArea2HWAreaBcropOut(&rect2s[i], &cropRegionRect);
setMetaCtlAeRegion(&m_metadata, newRect2.x1, newRect2.y1,
newRect2.x2, newRect2.y2, weights[i]);
}
}
}
void ExynosCameraParameters::getMeteringAreas(__unused ExynosRect *rects)
{
/* TODO */
}
void ExynosCameraParameters::getMeteringAreas(__unused ExynosRect2 *rect2s)
{
/* TODO */
}
status_t ExynosCameraParameters::checkMeteringMode(const CameraParameters& params)
{
const char *strNewMeteringMode = params.get("metering");
int newMeteringMode = -1;
int curMeteringMode = -1;
#ifdef SAMSUNG_COMPANION
const char *strNewRTHdr = params.get("rt-hdr");
#endif
if (strNewMeteringMode == NULL) {
return NO_ERROR;
}
ALOGD("DEBUG(%s):strNewMeteringMode %s", "setParameters", strNewMeteringMode);
#ifdef SAMSUNG_COMPANION
if ((strNewRTHdr != NULL && !strcmp(strNewRTHdr, "on"))
#ifdef TOUCH_AE
&& strcmp(strNewMeteringMode, "weighted-matrix")
#endif
) {
newMeteringMode = METERING_MODE_MATRIX;
ALOGD("DEBUG(%s):newMeteringMode %d in RT-HDR", "setParameters", newMeteringMode);
} else
#endif
{
if (!strcmp(strNewMeteringMode, "average"))
newMeteringMode = METERING_MODE_AVERAGE;
else if (!strcmp(strNewMeteringMode, "center"))
newMeteringMode = METERING_MODE_CENTER;
else if (!strcmp(strNewMeteringMode, "matrix"))
newMeteringMode = METERING_MODE_MATRIX;
else if (!strcmp(strNewMeteringMode, "spot"))
newMeteringMode = METERING_MODE_SPOT;
#ifdef TOUCH_AE
else if (!strcmp(strNewMeteringMode, "weighted-center"))
newMeteringMode = METERING_MODE_CENTER_TOUCH;
else if (!strcmp(strNewMeteringMode, "weighted-matrix"))
newMeteringMode = METERING_MODE_MATRIX_TOUCH;
else if (!strcmp(strNewMeteringMode, "weighted-spot"))
newMeteringMode = METERING_MODE_SPOT_TOUCH;
else if (!strcmp(strNewMeteringMode, "weighted-average"))
newMeteringMode = METERING_MODE_AVERAGE_TOUCH;
#endif
else {
ALOGE("ERR(%s):Invalid metering newMetering(%s)", __FUNCTION__, strNewMeteringMode);
return UNKNOWN_ERROR;
}
}
curMeteringMode = getMeteringMode();
m_setMeteringMode(newMeteringMode);
#ifdef SAMSUNG_COMPANION
if ((strNewRTHdr != NULL && strcmp(strNewRTHdr, "on"))
#ifdef TOUCH_AE
|| !strcmp(strNewMeteringMode, "weighted-matrix")
#endif
) {
m_params.set("metering", strNewMeteringMode);
}
#else
m_params.set("metering", strNewMeteringMode);
#endif
if (curMeteringMode != newMeteringMode) {
ALOGI("INFO(%s): Metering Area is changed (%d -> %d)", __FUNCTION__, curMeteringMode, newMeteringMode);
m_flagMeteringRegionChanged = true;
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setMeteringMode(int meteringMode)
{
uint32_t x = 0;
uint32_t y = 0;
uint32_t w = 0;
uint32_t h = 0;
uint32_t weight = 0;
int hwSensorW = 0;
int hwSensorH = 0;
enum aa_aemode aeMode;
if (getAutoExposureLock() == true) {
CLOGD("DEBUG(%s):autoExposure is Locked", __FUNCTION__);
return;
}
m_cameraInfo.meteringMode = meteringMode;
getHwSensorSize(&hwSensorW, &hwSensorH);
switch (meteringMode) {
case METERING_MODE_AVERAGE:
aeMode = AA_AEMODE_AVERAGE;
x = 0;
y = 0;
w = hwSensorW;
h = hwSensorH;
weight = 1000;
break;
case METERING_MODE_MATRIX:
aeMode = AA_AEMODE_MATRIX;
x = 0;
y = 0;
w = hwSensorW;
h = hwSensorH;
weight = 1000;
break;
case METERING_MODE_SPOT:
/* In spot mode, default region setting is 100x100 rectangle on center */
aeMode = AA_AEMODE_SPOT;
x = hwSensorW / 2 - 50;
y = hwSensorH / 2 - 50;
w = hwSensorW / 2 + 50;
h = hwSensorH / 2 + 50;
weight = 50;
break;
#ifdef TOUCH_AE
case METERING_MODE_MATRIX_TOUCH:
aeMode = AA_AEMODE_MATRIX_TOUCH;
break;
case METERING_MODE_SPOT_TOUCH:
aeMode = AA_AEMODE_SPOT_TOUCH;
break;
case METERING_MODE_CENTER_TOUCH:
aeMode = AA_AEMODE_CENTER_TOUCH;
break;
case METERING_MODE_AVERAGE_TOUCH:
aeMode = AA_AEMODE_AVERAGE_TOUCH;
break;
#endif
case METERING_MODE_CENTER:
default:
aeMode = AA_AEMODE_CENTER;
x = 0;
y = 0;
w = 0;
h = 0;
weight = 1000;
break;
}
setMetaCtlAeMode(&m_metadata, aeMode);
if (getCaptureExposureTime() > 0) {
aeMode = AA_AEMODE_OFF;
}
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_flashMgr->setFlashExposure(aeMode);
}
int ExynosCameraParameters::getMeteringMode(void)
{
return m_cameraInfo.meteringMode;
}
int ExynosCameraParameters::getSupportedMeteringMode(void)
{
return m_staticInfo->meteringList;
}
status_t ExynosCameraParameters::checkAntibanding(const CameraParameters& params)
{
int newAntibanding = -1;
int curAntibanding = -1;
const char *strKeyAntibanding = params.get(CameraParameters::KEY_ANTIBANDING);
#ifdef USE_CSC_FEATURE
CLOGD("DEBUG(%s):m_antiBanding %s", "setParameters", m_antiBanding);
const char *strNewAntibanding = m_adjustAntibanding(m_antiBanding);
#else
const char *strNewAntibanding = m_adjustAntibanding(strKeyAntibanding);
#endif
if (strNewAntibanding == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewAntibanding %s", "setParameters", strNewAntibanding);
if (!strcmp(strNewAntibanding, CameraParameters::ANTIBANDING_AUTO))
newAntibanding = AA_AE_ANTIBANDING_AUTO;
else if (!strcmp(strNewAntibanding, CameraParameters::ANTIBANDING_50HZ))
newAntibanding = AA_AE_ANTIBANDING_AUTO_50HZ;
else if (!strcmp(strNewAntibanding, CameraParameters::ANTIBANDING_60HZ))
newAntibanding = AA_AE_ANTIBANDING_AUTO_60HZ;
else if (!strcmp(strNewAntibanding, CameraParameters::ANTIBANDING_OFF))
newAntibanding = AA_AE_ANTIBANDING_OFF;
else {
CLOGE("ERR(%s):Invalid antibanding value(%s)", __FUNCTION__, strNewAntibanding);
return BAD_VALUE;
}
curAntibanding = getAntibanding();
if (curAntibanding != newAntibanding) {
m_setAntibanding(newAntibanding);
}
if (strKeyAntibanding != NULL) {
m_params.set(CameraParameters::KEY_ANTIBANDING, strKeyAntibanding); // HAL test (Ext_SecCameraParametersTest_testSetAntibanding_P01)
}
return NO_ERROR;
}
const char *ExynosCameraParameters::m_adjustAntibanding(const char *strAntibanding)
{
const char *strAdjustedAntibanding = NULL;
strAdjustedAntibanding = strAntibanding;
#if 0 /* fixed the flicker issue when highspeed recording(60fps or 120fps) */
/* when high speed recording mode, off thre antibanding */
if (getHighSpeedRecording())
strAdjustedAntibanding = CameraParameters::ANTIBANDING_OFF;
#endif
return strAdjustedAntibanding;
}
void ExynosCameraParameters::m_setAntibanding(int value)
{
setMetaCtlAntibandingMode(&m_metadata, (enum aa_ae_antibanding_mode)value);
}
int ExynosCameraParameters::getAntibanding(void)
{
enum aa_ae_antibanding_mode antibanding;
getMetaCtlAntibandingMode(&m_metadata, &antibanding);
return (int)antibanding;
}
int ExynosCameraParameters::getSupportedAntibanding(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->antiBandingList;
}
}
#ifdef USE_CSC_FEATURE
void ExynosCameraParameters::m_getAntiBandingFromLatinMCC(char *temp_str)
{
char value[PROPERTY_VALUE_MAX];
char country_value[10];
memset(value, 0x00, sizeof(value));
memset(country_value, 0x00, sizeof(country_value));
if (!property_get("gsm.operator.numeric", value,"")) {
strcpy(temp_str, CameraParameters::ANTIBANDING_60HZ);
return ;
}
memcpy(country_value, value, 3);
/** MCC Info. Jamaica : 338 / Argentina : 722 / Chile : 730 / Paraguay : 744 / Uruguay : 748 **/
if (strstr(country_value,"338") || strstr(country_value,"722") || strstr(country_value,"730") || strstr(country_value,"744") || strstr(country_value,"748"))
strcpy(temp_str, CameraParameters::ANTIBANDING_50HZ);
else
strcpy(temp_str, CameraParameters::ANTIBANDING_60HZ);
}
int ExynosCameraParameters::m_IsLatinOpenCSC()
{
char sales_code[PROPERTY_VALUE_MAX] = {0};
property_get("ro.csc.sales_code", sales_code, "");
if (strstr(sales_code,"TFG") || strstr(sales_code,"TPA") || strstr(sales_code,"TTT") || strstr(sales_code,"JDI") || strstr(sales_code,"PCI") )
return 1;
else
return 0;
}
void ExynosCameraParameters::m_chooseAntiBandingFrequency()
{
status_t ret = NO_ERROR;
int LatinOpenCSClength = 5;
char *LatinOpenCSCstr = NULL;
char *CSCstr = NULL;
const char *defaultStr = "50hz";
if (m_IsLatinOpenCSC()) {
LatinOpenCSCstr = (char *)malloc(LatinOpenCSClength);
if (LatinOpenCSCstr == NULL) {
CLOGE("LatinOpenCSCstr is NULL");
CSCstr = (char *)defaultStr;
memset(m_antiBanding, 0, sizeof(m_antiBanding));
strcpy(m_antiBanding, CSCstr);
return;
}
memset(LatinOpenCSCstr, 0, LatinOpenCSClength);
m_getAntiBandingFromLatinMCC(LatinOpenCSCstr);
CSCstr = LatinOpenCSCstr;
} else {
CSCstr = (char *)SecNativeFeature::getInstance()->getString("CscFeature_Camera_CameraFlicker");
}
if (CSCstr == NULL || strlen(CSCstr) == 0) {
CSCstr = (char *)defaultStr;
}
memset(m_antiBanding, 0, sizeof(m_antiBanding));
strcpy(m_antiBanding, CSCstr);
CLOGD("m_antiBanding = %s",m_antiBanding);
if (LatinOpenCSCstr != NULL) {
free(LatinOpenCSCstr);
LatinOpenCSCstr = NULL;
}
}
#endif
status_t ExynosCameraParameters::checkSceneMode(const CameraParameters& params)
{
int newSceneMode = -1;
int curSceneMode = -1;
const char *strNewSceneMode = params.get(CameraParameters::KEY_SCENE_MODE);
if (strNewSceneMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewSceneMode %s", "setParameters", strNewSceneMode);
if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_AUTO)) {
newSceneMode = SCENE_MODE_AUTO;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_ACTION)) {
newSceneMode = SCENE_MODE_ACTION;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_PORTRAIT)) {
newSceneMode = SCENE_MODE_PORTRAIT;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_LANDSCAPE)) {
newSceneMode = SCENE_MODE_LANDSCAPE;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_NIGHT)) {
newSceneMode = SCENE_MODE_NIGHT;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT)) {
newSceneMode = SCENE_MODE_NIGHT_PORTRAIT;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_THEATRE)) {
newSceneMode = SCENE_MODE_THEATRE;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_BEACH)) {
newSceneMode = SCENE_MODE_BEACH;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SNOW)) {
newSceneMode = SCENE_MODE_SNOW;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SUNSET)) {
newSceneMode = SCENE_MODE_SUNSET;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO)) {
newSceneMode = SCENE_MODE_STEADYPHOTO;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_FIREWORKS)) {
newSceneMode = SCENE_MODE_FIREWORKS;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_SPORTS)) {
newSceneMode = SCENE_MODE_SPORTS;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_PARTY)) {
newSceneMode = SCENE_MODE_PARTY;
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT)) {
newSceneMode = SCENE_MODE_CANDLELIGHT;
#ifdef SAMSUNG_COMPANION
} else if (!strcmp(strNewSceneMode, CameraParameters::SCENE_MODE_HDR)) {
newSceneMode = SCENE_MODE_HDR;
#endif
#ifdef SAMSUNG_FOOD_MODE
} else if (!strcmp(strNewSceneMode, "food")) {
enum aa_aemode aeMode = AA_AEMODE_MATRIX;
newSceneMode = SCENE_MODE_FOOD;
#if defined(USE_SUBDIVIDED_EV)
m_setExposureCompensation(5);
#else
m_setExposureCompensation(2);
#endif
setMetaCtlAeMode(&m_metadata, aeMode);
#endif
} else if (!strcmp(strNewSceneMode, "aqua_scn")) {
newSceneMode = SCENE_MODE_AQUA;
} else {
CLOGE("ERR(%s):unmatched scene_mode(%s)", "Parameters", strNewSceneMode);
return BAD_VALUE;
}
curSceneMode = getSceneMode();
if (curSceneMode != newSceneMode) {
m_setSceneMode(newSceneMode);
m_params.set(CameraParameters::KEY_SCENE_MODE, strNewSceneMode);
#ifdef SAMSUNG_COMPANION
if(getUseCompanion() == true) {
if (newSceneMode == SCENE_MODE_HDR)
checkSceneRTHdr(true);
}
if ((newSceneMode == SCENE_MODE_HDR) || (curSceneMode == SCENE_MODE_HDR))
m_setRestartPreview(true);
#endif
updatePreviewFpsRange();
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setSceneMode(int value)
{
enum aa_mode mode = AA_CONTROL_AUTO;
enum aa_scene_mode sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
switch (value) {
case SCENE_MODE_PORTRAIT:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_PORTRAIT;
break;
case SCENE_MODE_LANDSCAPE:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_LANDSCAPE;
break;
case SCENE_MODE_NIGHT:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_NIGHT;
break;
case SCENE_MODE_BEACH:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_BEACH;
break;
case SCENE_MODE_SNOW:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_SNOW;
break;
case SCENE_MODE_SUNSET:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_SUNSET;
break;
case SCENE_MODE_FIREWORKS:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_FIREWORKS;
break;
case SCENE_MODE_SPORTS:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_SPORTS;
break;
case SCENE_MODE_PARTY:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_PARTY;
break;
case SCENE_MODE_CANDLELIGHT:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_CANDLELIGHT;
break;
case SCENE_MODE_STEADYPHOTO:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_STEADYPHOTO;
break;
case SCENE_MODE_ACTION:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_ACTION;
break;
case SCENE_MODE_NIGHT_PORTRAIT:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_NIGHT_PORTRAIT;
break;
case SCENE_MODE_THEATRE:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_THEATRE;
break;
#ifdef SAMSUNG_FOOD_MODE
case SCENE_MODE_FOOD:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_FOOD;
break;
#endif
case SCENE_MODE_AQUA:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_AQUA;
break;
case SCENE_MODE_AUTO:
default:
mode = AA_CONTROL_AUTO;
sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
break;
}
m_cameraInfo.sceneMode = value;
setMetaCtlSceneMode(&m_metadata, mode, sceneMode);
m_cameraInfo.whiteBalanceMode = m_convertMetaCtlAwbMode(&m_metadata);
}
int ExynosCameraParameters::getSceneMode(void)
{
return m_cameraInfo.sceneMode;
}
int ExynosCameraParameters::getSupportedSceneModes(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->sceneModeList;
}
}
status_t ExynosCameraParameters::checkFocusMode(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
} else {
int newFocusMode = -1;
int curFocusMode = -1;
const char *strFocusMode = params.get(CameraParameters::KEY_FOCUS_MODE);
const char *strNewFocusMode = m_adjustFocusMode(strFocusMode);
if (strNewFocusMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewFocusMode %s", "setParameters", strNewFocusMode);
if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_AUTO)) {
newFocusMode = FOCUS_MODE_AUTO;
m_params.set(CameraParameters::KEY_FOCUS_DISTANCES,
BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR);
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_INFINITY)) {
newFocusMode = FOCUS_MODE_INFINITY;
m_params.set(CameraParameters::KEY_FOCUS_DISTANCES,
BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR);
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_MACRO)) {
newFocusMode = FOCUS_MODE_MACRO;
m_params.set(CameraParameters::KEY_FOCUS_DISTANCES,
BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR);
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_FIXED)) {
newFocusMode = FOCUS_MODE_FIXED;
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_EDOF)) {
newFocusMode = FOCUS_MODE_EDOF;
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO)) {
newFocusMode = FOCUS_MODE_CONTINUOUS_VIDEO;
} else if (!strcmp(strNewFocusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)) {
newFocusMode = FOCUS_MODE_CONTINUOUS_PICTURE;
} else if (!strcmp(strNewFocusMode, "face-priority")) {
newFocusMode = FOCUS_MODE_CONTINUOUS_PICTURE;
} else if (!strcmp(strNewFocusMode, "continuous-picture-macro")) {
newFocusMode = FOCUS_MODE_CONTINUOUS_PICTURE_MACRO;
#ifdef SAMSUNG_OT
} else if (!strcmp(strNewFocusMode, "object-tracking-picture")) {
newFocusMode = FOCUS_MODE_OBJECT_TRACKING_PICTURE;
} else if (!strcmp(strNewFocusMode, "object-tracking-video")) {
newFocusMode = FOCUS_MODE_OBJECT_TRACKING_VIDEO;
#endif
#ifdef SAMSUNG_MANUAL_FOCUS
} else if (!strcmp(strNewFocusMode, "manual")) {
newFocusMode = FOCUS_MODE_MANUAL;
#endif
} else {
CLOGE("ERR(%s):unmatched focus_mode(%s)", __FUNCTION__, strNewFocusMode);
return BAD_VALUE;
}
if (!(newFocusMode & getSupportedFocusModes())){
CLOGE("ERR(%s[%d]): Focus mode(%s) is not supported!", __FUNCTION__, __LINE__, strNewFocusMode);
return BAD_VALUE;
}
#ifdef SAMSUNG_MANUAL_FOCUS
/* Set focus distance to -1 if focus mode is changed from MANUAL to others */
if ((FOCUS_MODE_MANUAL == getFocusMode()) && (FOCUS_MODE_MANUAL != newFocusMode)) {
m_setFocusDistance(-1);
}
#endif
m_setFocusMode(newFocusMode);
m_params.set(CameraParameters::KEY_FOCUS_MODE, strNewFocusMode);
return NO_ERROR;
}
}
const char *ExynosCameraParameters::m_adjustFocusMode(const char *focusMode)
{
int sceneMode = getSceneMode();
const char *newFocusMode = NULL;
/* TODO: vendor specific adjust */
newFocusMode = focusMode;
return newFocusMode;
}
void ExynosCameraParameters::m_setFocusMode(int focusMode)
{
m_cameraInfo.focusMode = focusMode;
if(getZoomActiveOn()) {
ALOGD("DEBUG(%s):zoom moving..", "setParameters");
return;
}
/* TODO: Notify auto focus activity */
if(getPreviewRunning() == true) {
ALOGD("set Focus Mode(%s[%d]) !!!!", __FUNCTION__, __LINE__);
m_activityControl->setAutoFocusMode(focusMode);
} else {
m_setFocusmodeSetting = true;
}
#ifdef SAMSUNG_OT
if(m_cameraInfo.focusMode == FOCUS_MODE_OBJECT_TRACKING_VIDEO
|| m_cameraInfo.focusMode == FOCUS_MODE_OBJECT_TRACKING_PICTURE) {
m_startObjectTracking = true;
}
else
m_startObjectTracking = false;
#endif
}
void ExynosCameraParameters::setFocusModeLock(bool enable) {
int curFocusMode = getFocusMode();
ALOGD("DEBUG(%s):FocusModeLock (%s)", __FUNCTION__, enable? "true" : "false");
if(enable) {
m_activityControl->stopAutoFocus();
} else {
m_setFocusMode(curFocusMode);
}
}
void ExynosCameraParameters::setFocusModeSetting(bool enable)
{
m_setFocusmodeSetting = enable;
}
int ExynosCameraParameters::getFocusModeSetting(void)
{
return m_setFocusmodeSetting;
}
int ExynosCameraParameters::getFocusMode(void)
{
return m_cameraInfo.focusMode;
}
int ExynosCameraParameters::getSupportedFocusModes(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->focusModeList;
}
}
#ifdef SAMSUNG_MANUAL_FOCUS
status_t ExynosCameraParameters::checkFocusDistance(const CameraParameters& params)
{
int newFocusDistance = params.getInt("focus-distance");
int curFocusDistance = -1;
if (newFocusDistance < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newFocusDistance %d", "setParameters", newFocusDistance);
curFocusDistance = getFocusDistance();
if (curFocusDistance != newFocusDistance) {
if (FOCUS_MODE_MANUAL != getFocusMode()) {
newFocusDistance = -1;
}
m_setFocusDistance(newFocusDistance);
m_params.set("focus-distance", newFocusDistance);
}
return NO_ERROR;
}
/**
* m_setFocusDistance: set focus distance.
*
* distance should be -1, 0 or value greater than 0.
*/
void ExynosCameraParameters::m_setFocusDistance(int32_t distance)
{
float metaDistance;
if (distance < -1) {
CLOGE("ERR(%s):Invalid new focus distance (%d)", __FUNCTION__, distance);
return;
}
if (!distance) {
metaDistance = 0;
} else if (-1 == distance) {
metaDistance = -1;
} else {
/* distance variable is in milimeters.
* And if distance variable is converted into meter unit(called as A),
* meta distance value is as followings:
* metaDistance = 1 / A */
metaDistance = 1000 / (float)distance;
}
setMetaCtlFocusDistance(&m_metadata, metaDistance);
}
int32_t ExynosCameraParameters::getFocusDistance(void)
{
float metaDistance = 0.0f;
getMetaCtlFocusDistance(&m_metadata, &metaDistance);
/* Focus distance 0 means infinite */
if (0.0f == metaDistance) {
return -2;
} else if (-1.0f == metaDistance) {
return -1;
}
return (int32_t)(1000 / metaDistance);
}
#endif /* SAMSUNG_MANUAL_FOCUS */
status_t ExynosCameraParameters::checkFlashMode(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
} else {
int newFlashMode = -1;
int curFlashMode = -1;
const char *strFlashMode = params.get(CameraParameters::KEY_FLASH_MODE);
const char *strNewFlashMode = m_adjustFlashMode(strFlashMode);
if (strNewFlashMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewFlashMode %s", "setParameters", strNewFlashMode);
if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_OFF))
newFlashMode = FLASH_MODE_OFF;
else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_AUTO))
newFlashMode = FLASH_MODE_AUTO;
else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_ON))
newFlashMode = FLASH_MODE_ON;
else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_RED_EYE))
newFlashMode = FLASH_MODE_RED_EYE;
else if (!strcmp(strNewFlashMode, CameraParameters::FLASH_MODE_TORCH))
newFlashMode = FLASH_MODE_TORCH;
else {
CLOGE("ERR(%s):unmatched flash_mode(%s), turn off flash", __FUNCTION__, strNewFlashMode);
newFlashMode = FLASH_MODE_OFF;
strNewFlashMode = CameraParameters::FLASH_MODE_OFF;
return BAD_VALUE;
}
#ifndef UNSUPPORT_FLASH
if (!(newFlashMode & getSupportedFlashModes())) {
CLOGE("ERR(%s[%d]): Flash mode(%s) is not supported!", __FUNCTION__, __LINE__, strNewFlashMode);
return BAD_VALUE;
}
#endif
curFlashMode = getFlashMode();
if (curFlashMode != newFlashMode) {
m_setFlashMode(newFlashMode);
m_params.set(CameraParameters::KEY_FLASH_MODE, strNewFlashMode);
}
return NO_ERROR;
}
}
const char *ExynosCameraParameters::m_adjustFlashMode(const char *flashMode)
{
int sceneMode = getSceneMode();
const char *newFlashMode = NULL;
/* TODO: vendor specific adjust */
newFlashMode = flashMode;
return newFlashMode;
}
void ExynosCameraParameters::m_setFlashMode(int flashMode)
{
m_cameraInfo.flashMode = flashMode;
/* TODO: Notity flash activity */
m_activityControl->setFlashMode(flashMode);
}
int ExynosCameraParameters::getFlashMode(void)
{
return m_cameraInfo.flashMode;
}
int ExynosCameraParameters::getSupportedFlashModes(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->flashModeList;
}
}
status_t ExynosCameraParameters::checkWhiteBalanceMode(const CameraParameters& params)
{
if (getHalVersion() != IS_HAL_VER_3_2) {
int newWhiteBalance = -1;
int curWhiteBalance = -1;
const char *strWhiteBalance = params.get(CameraParameters::KEY_WHITE_BALANCE);
const char *strNewWhiteBalance = m_adjustWhiteBalanceMode(strWhiteBalance);
if (strNewWhiteBalance == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newWhiteBalance %s", "setParameters", strNewWhiteBalance);
if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_AUTO))
newWhiteBalance = WHITE_BALANCE_AUTO;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_INCANDESCENT))
newWhiteBalance = WHITE_BALANCE_INCANDESCENT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_FLUORESCENT))
newWhiteBalance = WHITE_BALANCE_FLUORESCENT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT))
newWhiteBalance = WHITE_BALANCE_WARM_FLUORESCENT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_DAYLIGHT))
newWhiteBalance = WHITE_BALANCE_DAYLIGHT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT))
newWhiteBalance = WHITE_BALANCE_CLOUDY_DAYLIGHT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_TWILIGHT))
newWhiteBalance = WHITE_BALANCE_TWILIGHT;
else if (!strcmp(strNewWhiteBalance, CameraParameters::WHITE_BALANCE_SHADE))
newWhiteBalance = WHITE_BALANCE_SHADE;
else if (!strcmp(strNewWhiteBalance, "temperature"))
newWhiteBalance = WHITE_BALANCE_CUSTOM_K;
else {
CLOGE("ERR(%s):Invalid white balance(%s)", __FUNCTION__, strNewWhiteBalance);
return BAD_VALUE;
}
if (!(newWhiteBalance & getSupportedWhiteBalance())) {
CLOGE("ERR(%s[%d]): white balance mode(%s) is not supported", __FUNCTION__, __LINE__, strNewWhiteBalance);
return BAD_VALUE;
}
curWhiteBalance = getWhiteBalanceMode();
if (getSceneMode() == SCENE_MODE_AUTO) {
enum aa_awbmode cur_awbMode;
getMetaCtlAwbMode(&m_metadata, &cur_awbMode);
if (m_setWhiteBalanceMode(newWhiteBalance) != NO_ERROR)
return BAD_VALUE;
m_params.set(CameraParameters::KEY_WHITE_BALANCE, strNewWhiteBalance);
}
}
return NO_ERROR;
}
const char *ExynosCameraParameters::m_adjustWhiteBalanceMode(const char *whiteBalance)
{
int sceneMode = getSceneMode();
const char *newWhiteBalance = NULL;
/* TODO: vendor specific adjust */
/* TN' feautre can change whiteBalance even if Non SCENE_MODE_AUTO */
newWhiteBalance = whiteBalance;
return newWhiteBalance;
}
status_t ExynosCameraParameters::m_setWhiteBalanceMode(int whiteBalance)
{
enum aa_awbmode awbMode;
switch (whiteBalance) {
case WHITE_BALANCE_AUTO:
awbMode = AA_AWBMODE_WB_AUTO;
break;
case WHITE_BALANCE_INCANDESCENT:
awbMode = AA_AWBMODE_WB_INCANDESCENT;
break;
case WHITE_BALANCE_FLUORESCENT:
awbMode = AA_AWBMODE_WB_FLUORESCENT;
break;
case WHITE_BALANCE_DAYLIGHT:
awbMode = AA_AWBMODE_WB_DAYLIGHT;
break;
case WHITE_BALANCE_CLOUDY_DAYLIGHT:
awbMode = AA_AWBMODE_WB_CLOUDY_DAYLIGHT;
break;
case WHITE_BALANCE_WARM_FLUORESCENT:
awbMode = AA_AWBMODE_WB_WARM_FLUORESCENT;
break;
case WHITE_BALANCE_TWILIGHT:
awbMode = AA_AWBMODE_WB_TWILIGHT;
break;
case WHITE_BALANCE_SHADE:
awbMode = AA_AWBMODE_WB_SHADE;
break;
case WHITE_BALANCE_CUSTOM_K:
awbMode = AA_AWBMODE_WB_CUSTOM_K;
break;
default:
CLOGE("ERR(%s):Unsupported value(%d)", __FUNCTION__, whiteBalance);
return BAD_VALUE;
}
m_cameraInfo.whiteBalanceMode = whiteBalance;
setMetaCtlAwbMode(&m_metadata, awbMode);
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_flashMgr->setFlashWhiteBalance(awbMode);
return NO_ERROR;
}
int ExynosCameraParameters::m_convertMetaCtlAwbMode(struct camera2_shot_ext *shot_ext)
{
int awbMode = WHITE_BALANCE_AUTO;
switch (shot_ext->shot.ctl.aa.awbMode) {
case AA_AWBMODE_WB_AUTO:
awbMode = WHITE_BALANCE_AUTO;
break;
case AA_AWBMODE_WB_INCANDESCENT:
awbMode = WHITE_BALANCE_INCANDESCENT;
break;
case AA_AWBMODE_WB_FLUORESCENT:
awbMode = WHITE_BALANCE_FLUORESCENT;
break;
case AA_AWBMODE_WB_DAYLIGHT:
awbMode = WHITE_BALANCE_DAYLIGHT;
break;
case AA_AWBMODE_WB_CLOUDY_DAYLIGHT:
awbMode = WHITE_BALANCE_CLOUDY_DAYLIGHT;
break;
case AA_AWBMODE_WB_WARM_FLUORESCENT:
awbMode = WHITE_BALANCE_WARM_FLUORESCENT;
break;
case AA_AWBMODE_WB_TWILIGHT:
awbMode = WHITE_BALANCE_TWILIGHT;
break;
case AA_AWBMODE_WB_SHADE:
awbMode = WHITE_BALANCE_SHADE;
break;
default:
ALOGE("ERR(%s):Unsupported awbMode(%d)", __FUNCTION__, shot_ext->shot.ctl.aa.awbMode);
return BAD_VALUE;
}
return awbMode;
}
int ExynosCameraParameters::getWhiteBalanceMode(void)
{
return m_cameraInfo.whiteBalanceMode;
}
int ExynosCameraParameters::getSupportedWhiteBalance(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->whiteBalanceList;
}
}
int ExynosCameraParameters::getSupportedISO(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return 0;
} else {
return m_staticInfo->isoValues;
}
}
status_t ExynosCameraParameters::checkAutoWhiteBalanceLock(const CameraParameters& params)
{
if (getHalVersion() != IS_HAL_VER_3_2) {
bool newAutoWhiteBalanceLock = false;
bool curAutoWhiteBalanceLock = false;
const char *strNewAutoWhiteBalanceLock = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
if (strNewAutoWhiteBalanceLock == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewAutoWhiteBalanceLock %s", "setParameters", strNewAutoWhiteBalanceLock);
if (!strcmp(strNewAutoWhiteBalanceLock, "true"))
newAutoWhiteBalanceLock = true;
curAutoWhiteBalanceLock = getAutoWhiteBalanceLock();
if (curAutoWhiteBalanceLock != newAutoWhiteBalanceLock) {
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_flashMgr->setAwbLock(newAutoWhiteBalanceLock);
m_setAutoWhiteBalanceLock(newAutoWhiteBalanceLock);
m_params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, strNewAutoWhiteBalanceLock);
}
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setAutoWhiteBalanceLock(bool value)
{
if (getHalVersion() != IS_HAL_VER_3_2) {
m_cameraInfo.autoWhiteBalanceLock = value;
setMetaCtlAwbLock(&m_metadata, value);
}
}
bool ExynosCameraParameters::getAutoWhiteBalanceLock(void)
{
return m_cameraInfo.autoWhiteBalanceLock;
}
#ifdef SAMSUNG_FOOD_MODE
status_t ExynosCameraParameters::checkWbLevel(const CameraParameters& params)
{
int32_t newWbLevel = params.getInt("wb-level");
int32_t curWbLevel = getWbLevel();
const char *strNewSceneMode = params.get(CameraParameters::KEY_SCENE_MODE);
int minWbLevel = -4, maxWbLevel = 4;
if (strNewSceneMode == NULL) {
CLOGE("ERR(%s):strNewSceneMode is NULL.", __FUNCTION__);
return NO_ERROR;
}
if (!strcmp(strNewSceneMode, "food")) {
if ((newWbLevel < minWbLevel) || (newWbLevel > maxWbLevel)) {
ALOGE("ERR(%s): Invalid WbLevel (Min: %d, Max: %d, Value: %d)", __FUNCTION__,
minWbLevel, maxWbLevel, newWbLevel);
return BAD_VALUE;
}
ALOGD("DEBUG(%s):newWbLevel %d", "setParameters", newWbLevel);
if (curWbLevel != newWbLevel) {
m_setWbLevel(newWbLevel);
m_params.set("wb-level", newWbLevel);
}
}
return NO_ERROR;
}
#define IS_WBLEVEL_DEFAULT (4)
void ExynosCameraParameters::m_setWbLevel(int32_t value)
{
setMetaCtlWbLevel(&m_metadata, value + IS_WBLEVEL_DEFAULT + FW_CUSTOM_OFFSET);
}
int32_t ExynosCameraParameters::getWbLevel(void)
{
int32_t wbLevel;
getMetaCtlWbLevel(&m_metadata, &wbLevel);
return wbLevel - IS_WBLEVEL_DEFAULT - FW_CUSTOM_OFFSET;
}
#endif
status_t ExynosCameraParameters::checkWbKelvin(const CameraParameters& params)
{
int32_t newWbKelvin = params.getInt("wb-k");
int32_t curWbKelvin = getWbKelvin();
const char *strNewSceneMode = params.get(CameraParameters::KEY_SCENE_MODE);
const char *strWhiteBalance = params.get(CameraParameters::KEY_WHITE_BALANCE);
const char *strNewWhiteBalance = m_adjustWhiteBalanceMode(strWhiteBalance);
if (strNewSceneMode == NULL || strNewWhiteBalance == NULL) {
CLOGE("ERR(%s):strNewSceneMode or strNewWhiteBalance is NULL.", __FUNCTION__);
return NO_ERROR;
}
if (strcmp(strNewSceneMode, "food") && !strcmp(strNewWhiteBalance, "temperature")) {
if ((newWbKelvin < getMinWBK()) || (newWbKelvin > getMaxWBK())) {
ALOGE("ERR(%s): Invalid WbKelvin (Min: %d, Max: %d, Value: %d)", __FUNCTION__,
getMinWBK(), getMaxWBK(), newWbKelvin);
return BAD_VALUE;
}
ALOGD("DEBUG(%s):newWbKelvin %d", "setParameters", newWbKelvin);
if (curWbKelvin != newWbKelvin) {
m_setWbKelvin(newWbKelvin);
m_params.set("wb-k", newWbKelvin);
}
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setWbKelvin(int32_t value)
{
setMetaCtlWbLevel(&m_metadata, value);
}
int32_t ExynosCameraParameters::getWbKelvin(void)
{
int32_t wbKelvin = 0;
getMetaCtlWbLevel(&m_metadata, &wbKelvin);
return wbKelvin;
}
status_t ExynosCameraParameters::checkFocusAreas(const CameraParameters& params)
{
int ret = NO_ERROR;
const char *newFocusAreas = params.get(CameraParameters::KEY_FOCUS_AREAS);
int newNumFocusAreas = params.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
int curFocusMode = getFocusMode();
uint32_t maxNumFocusAreas = getMaxNumFocusAreas();
int FocusAreasCount = 0;
if (newFocusAreas == NULL) {
ExynosRect2 nullRect2[1];
nullRect2[0].x1 = 0;
nullRect2[0].y1 = 0;
nullRect2[0].x2 = 0;
nullRect2[0].y2 = 0;
if (m_cameraInfo.numValidFocusArea != 0)
m_setFocusAreas(0, nullRect2, NULL);
return NO_ERROR;
}
if (newNumFocusAreas <= 0) {
FocusAreasCount = maxNumFocusAreas;
} else {
FocusAreasCount = newNumFocusAreas;
}
CLOGD("DEBUG(%s):newFocusAreas %s, numFocusAreas(%d)", "setParameters", newFocusAreas, FocusAreasCount);
/* In CameraParameters.h */
/*
* Focus area only has effect if the cur focus mode is FOCUS_MODE_AUTO,
* FOCUS_MODE_MACRO, FOCUS_MODE_CONTINUOUS_VIDEO, or
* FOCUS_MODE_CONTINUOUS_PICTURE.
*/
if (curFocusMode & FOCUS_MODE_AUTO
|| curFocusMode & FOCUS_MODE_MACRO
|| curFocusMode & FOCUS_MODE_CONTINUOUS_VIDEO
|| curFocusMode & FOCUS_MODE_CONTINUOUS_PICTURE
|| curFocusMode & FOCUS_MODE_CONTINUOUS_PICTURE_MACRO
#ifdef SAMSUNG_OT
|| curFocusMode & FOCUS_MODE_OBJECT_TRACKING_VIDEO
|| curFocusMode & FOCUS_MODE_OBJECT_TRACKING_PICTURE
#endif
) {
/* ex : (-10,-10,0,0,300),(0,0,10,10,700) */
ExynosRect2 *rect2s = new ExynosRect2[FocusAreasCount];
int *weights = new int[FocusAreasCount];
uint32_t validFocusedAreas = bracketsStr2Ints((char *)newFocusAreas, FocusAreasCount, rect2s, weights, 1);
/* Check duplicate area */
if (validFocusedAreas > 1) {
for (uint32_t k = 0; k < validFocusedAreas; k++) {
if (rect2s[k].x1 == rect2s[k+1].x1 &&
rect2s[k].y1 == rect2s[k+1].y1 &&
rect2s[k].x2 == rect2s[k+1].x2 &&
rect2s[k].y2 == rect2s[k+1].y2)
validFocusedAreas = 0;
}
}
if (0 < validFocusedAreas) {
/* CameraParameters.h */
/*
* A special case of single focus area (0,0,0,0,0) means driver to decide
* the focus area. For example, the driver may use more signals to decide
* focus areas and change them dynamically. Apps can set (0,0,0,0,0) if they
* want the driver to decide focus areas.
*/
m_setFocusAreas(validFocusedAreas, rect2s, weights);
m_params.set(CameraParameters::KEY_FOCUS_AREAS, newFocusAreas);
} else {
CLOGE("ERR(%s):FocusAreas value is invalid", __FUNCTION__);
ret = UNKNOWN_ERROR;
}
delete [] rect2s;
delete [] weights;
}
return ret;
}
void ExynosCameraParameters::m_setFocusAreas(uint32_t numValid, ExynosRect *rects, int *weights)
{
ExynosRect2 *rect2s = new ExynosRect2[numValid];
for (uint32_t i = 0; i < numValid; i++)
convertingRectToRect2(&rects[i], &rect2s[i]);
m_setFocusAreas(numValid, rect2s, weights);
delete [] rect2s;
}
void ExynosCameraParameters::m_setFocusAreas(uint32_t numValid, ExynosRect2 *rect2s, int *weights)
{
#ifdef SAMSUNG_OT
int curFocusMode = getFocusMode();
#endif
uint32_t maxNumFocusAreas = getMaxNumFocusAreas();
if (maxNumFocusAreas < numValid)
numValid = maxNumFocusAreas;
if ((numValid == 1 || numValid == 0) && (isRectNull(&rect2s[0]) == true)) {
/* m_setFocusMode(FOCUS_MODE_AUTO); */
ExynosRect2 newRect2(0,0,0,0);
m_activityControl->setAutoFcousArea(newRect2, 1000);
m_activityControl->touchAFMode = false;
m_activityControl->touchAFModeForFlash = false;
} else {
#ifdef SAMSUNG_OT
if(curFocusMode & FOCUS_MODE_OBJECT_TRACKING_VIDEO
|| curFocusMode & FOCUS_MODE_OBJECT_TRACKING_PICTURE
|| m_objectTrackingGet == true) {
for (uint32_t i = 0; i < numValid; i++) {
m_objectTrackingArea[i] = rect2s[i];
m_objectTrackingWeight[i] = weights[i];
m_objectTrackingAreaChanged = true;
m_activityControl->touchAFMode = false;
m_activityControl->touchAFModeForFlash = false;
}
m_cameraInfo.numValidFocusArea = numValid;
return;
}
#endif
ExynosRect cropRegionRect;
ExynosRect2 newRect2;
getHwBayerCropRegion(&cropRegionRect.w, &cropRegionRect.h, &cropRegionRect.x, &cropRegionRect.y);
for (uint32_t i = 0; i < numValid; i++) {
newRect2 = convertingAndroidArea2HWAreaBcropOut(&rect2s[i], &cropRegionRect);
/*setMetaCtlAfRegion(&m_metadata, rect2s[i].x1, rect2s[i].y1,
rect2s[i].x2, rect2s[i].y2, weights[i]);*/
m_activityControl->setAutoFcousArea(newRect2, weights[i]);
}
m_activityControl->touchAFMode = true;
m_activityControl->touchAFModeForFlash = true;
}
m_cameraInfo.numValidFocusArea = numValid;
}
void ExynosCameraParameters::getFocusAreas(int *validFocusArea, ExynosRect2 *rect2s, int *weights)
{
*validFocusArea = m_cameraInfo.numValidFocusArea;
if (*validFocusArea != 0) {
/* Currently only supported 1 region */
getMetaCtlAfRegion(&m_metadata, &rect2s->x1, &rect2s->y1,
&rect2s->x2, &rect2s->y2, weights);
}
}
status_t ExynosCameraParameters::checkColorEffectMode(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
} else {
int newEffectMode = EFFECT_NONE;
int curEffectMode = EFFECT_NONE;
const char *strNewEffectMode = params.get(CameraParameters::KEY_EFFECT);
#ifdef FORCE_CAL_RELOAD
if (m_calValid == false) {
CLOGE("ERR(%s):Cal data has error. We set aqua effect", "checkColorEffectmode");
newEffectMode = EFFECT_AQUA;
m_setColorEffectMode(newEffectMode);
m_params.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_AQUA);
m_frameSkipCounter.setCount(EFFECT_SKIP_FRAME);
return NO_ERROR;
}
#endif
if (strNewEffectMode == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewEffectMode %s", "setParameters", strNewEffectMode);
if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_NONE)) {
newEffectMode = EFFECT_NONE;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_MONO)) {
newEffectMode = EFFECT_MONO;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_NEGATIVE)) {
newEffectMode = EFFECT_NEGATIVE;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_SOLARIZE)) {
newEffectMode = EFFECT_SOLARIZE;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_SEPIA)) {
newEffectMode = EFFECT_SEPIA;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_POSTERIZE)) {
newEffectMode = EFFECT_POSTERIZE;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_WHITEBOARD)) {
newEffectMode = EFFECT_WHITEBOARD;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_BLACKBOARD)) {
newEffectMode = EFFECT_BLACKBOARD;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_AQUA)) {
newEffectMode = EFFECT_AQUA;
} else if (!strcmp(strNewEffectMode, CameraParameters::EFFECT_POINT_BLUE)) {
newEffectMode = EFFECT_BLUE;
} else if (!strcmp(strNewEffectMode, "point-red-yellow")) {
newEffectMode = EFFECT_RED_YELLOW;
} else if (!strcmp(strNewEffectMode, "vintage-cold")) {
newEffectMode = EFFECT_COLD_VINTAGE;
} else if (!strcmp(strNewEffectMode, "beauty" )) {
newEffectMode = EFFECT_BEAUTY_FACE;
} else {
CLOGE("ERR(%s):Invalid effect(%s)", __FUNCTION__, strNewEffectMode);
return BAD_VALUE;
}
if (!isSupportedColorEffects(newEffectMode)) {
CLOGE("ERR(%s[%d]): Effect mode(%s) is not supported!", __FUNCTION__, __LINE__, strNewEffectMode);
return BAD_VALUE;
}
curEffectMode = getColorEffectMode();
if (curEffectMode != newEffectMode) {
m_setColorEffectMode(newEffectMode);
m_params.set(CameraParameters::KEY_EFFECT, strNewEffectMode);
m_frameSkipCounter.setCount(EFFECT_SKIP_FRAME);
}
return NO_ERROR;
}
}
void ExynosCameraParameters::m_setColorEffectMode(int effect)
{
aa_effect_mode_t newEffect;
switch(effect) {
case EFFECT_NONE:
newEffect = AA_EFFECT_OFF;
break;
case EFFECT_MONO:
newEffect = AA_EFFECT_MONO;
break;
case EFFECT_NEGATIVE:
newEffect = AA_EFFECT_NEGATIVE;
break;
case EFFECT_SOLARIZE:
newEffect = AA_EFFECT_SOLARIZE;
break;
case EFFECT_SEPIA:
newEffect = AA_EFFECT_SEPIA;
break;
case EFFECT_POSTERIZE:
newEffect = AA_EFFECT_POSTERIZE;
break;
case EFFECT_WHITEBOARD:
newEffect = AA_EFFECT_WHITEBOARD;
break;
case EFFECT_BLACKBOARD:
newEffect = AA_EFFECT_BLACKBOARD;
break;
case EFFECT_AQUA:
newEffect = AA_EFFECT_AQUA;
break;
case EFFECT_RED_YELLOW:
newEffect = AA_EFFECT_RED_YELLOW_POINT;
break;
case EFFECT_BLUE:
newEffect = AA_EFFECT_BLUE_POINT;
break;
case EFFECT_WARM_VINTAGE:
newEffect = AA_EFFECT_WARM_VINTAGE;
break;
case EFFECT_COLD_VINTAGE:
newEffect = AA_EFFECT_COLD_VINTAGE;
break;
case EFFECT_BEAUTY_FACE:
newEffect = AA_EFFECT_BEAUTY_FACE;
break;
default:
newEffect = AA_EFFECT_OFF;
CLOGE("ERR(%s[%d]):Color Effect mode(%d) is not supported", __FUNCTION__, __LINE__, effect);
break;
}
setMetaCtlAaEffect(&m_metadata, newEffect);
}
int ExynosCameraParameters::getColorEffectMode(void)
{
aa_effect_mode_t curEffect;
int effect;
getMetaCtlAaEffect(&m_metadata, &curEffect);
switch(curEffect) {
case AA_EFFECT_OFF:
effect = EFFECT_NONE;
break;
case AA_EFFECT_MONO:
effect = EFFECT_MONO;
break;
case AA_EFFECT_NEGATIVE:
effect = EFFECT_NEGATIVE;
break;
case AA_EFFECT_SOLARIZE:
effect = EFFECT_SOLARIZE;
break;
case AA_EFFECT_SEPIA:
effect = EFFECT_SEPIA;
break;
case AA_EFFECT_POSTERIZE:
effect = EFFECT_POSTERIZE;
break;
case AA_EFFECT_WHITEBOARD:
effect = EFFECT_WHITEBOARD;
break;
case AA_EFFECT_BLACKBOARD:
effect = EFFECT_BLACKBOARD;
break;
case AA_EFFECT_AQUA:
effect = EFFECT_AQUA;
break;
case AA_EFFECT_RED_YELLOW_POINT:
effect = EFFECT_RED_YELLOW;
break;
case AA_EFFECT_BLUE_POINT:
effect = EFFECT_BLUE;
break;
case AA_EFFECT_WARM_VINTAGE:
effect = EFFECT_WARM_VINTAGE;
break;
case AA_EFFECT_COLD_VINTAGE:
effect = EFFECT_COLD_VINTAGE;
break;
case AA_EFFECT_BEAUTY_FACE:
effect = EFFECT_BEAUTY_FACE;
break;
default:
effect = 0;
CLOGE("ERR(%s[%d]):Color Effect mode(%d) is invalid value", __FUNCTION__, __LINE__, curEffect);
break;
}
return effect;
}
int ExynosCameraParameters::getSupportedColorEffects(void)
{
return m_staticInfo->effectList;
}
bool ExynosCameraParameters::isSupportedColorEffects(int effectMode)
{
int ret = false;
if (effectMode & getSupportedColorEffects()) {
return true;
}
if (effectMode & m_staticInfo->hiddenEffectList) {
return true;
}
return ret;
}
status_t ExynosCameraParameters::checkGpsAltitude(const CameraParameters& params)
{
double newAltitude = 0;
double curAltitude = 0;
const char *strNewGpsAltitude = params.get(CameraParameters::KEY_GPS_ALTITUDE);
if (strNewGpsAltitude == NULL) {
m_params.remove(CameraParameters::KEY_GPS_ALTITUDE);
m_setGpsAltitude(0);
return NO_ERROR;
}
CLOGV("DEBUG(%s):strNewGpsAltitude %s", "setParameters", strNewGpsAltitude);
newAltitude = atof(strNewGpsAltitude);
curAltitude = getGpsAltitude();
if (curAltitude != newAltitude) {
m_setGpsAltitude(newAltitude);
m_params.set(CameraParameters::KEY_GPS_ALTITUDE, strNewGpsAltitude);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGpsAltitude(double altitude)
{
m_cameraInfo.gpsAltitude = altitude;
}
double ExynosCameraParameters::getGpsAltitude(void)
{
return m_cameraInfo.gpsAltitude;
}
status_t ExynosCameraParameters::checkGpsLatitude(const CameraParameters& params)
{
double newLatitude = 0;
double curLatitude = 0;
const char *strNewGpsLatitude = params.get(CameraParameters::KEY_GPS_LATITUDE);
if (strNewGpsLatitude == NULL) {
m_params.remove(CameraParameters::KEY_GPS_LATITUDE);
m_setGpsLatitude(0);
return NO_ERROR;
}
CLOGV("DEBUG(%s):strNewGpsLatitude %s", "setParameters", strNewGpsLatitude);
newLatitude = atof(strNewGpsLatitude);
curLatitude = getGpsLatitude();
if (curLatitude != newLatitude) {
m_setGpsLatitude(newLatitude);
m_params.set(CameraParameters::KEY_GPS_LATITUDE, strNewGpsLatitude);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGpsLatitude(double latitude)
{
m_cameraInfo.gpsLatitude = latitude;
}
double ExynosCameraParameters::getGpsLatitude(void)
{
return m_cameraInfo.gpsLatitude;
}
status_t ExynosCameraParameters::checkGpsLongitude(const CameraParameters& params)
{
double newLongitude = 0;
double curLongitude = 0;
const char *strNewGpsLongitude = params.get(CameraParameters::KEY_GPS_LONGITUDE);
if (strNewGpsLongitude == NULL) {
m_params.remove(CameraParameters::KEY_GPS_LONGITUDE);
m_setGpsLongitude(0);
return NO_ERROR;
}
CLOGV("DEBUG(%s):strNewGpsLongitude %s", "setParameters", strNewGpsLongitude);
newLongitude = atof(strNewGpsLongitude);
curLongitude = getGpsLongitude();
if (curLongitude != newLongitude) {
m_setGpsLongitude(newLongitude);
m_params.set(CameraParameters::KEY_GPS_LONGITUDE, strNewGpsLongitude);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGpsLongitude(double longitude)
{
m_cameraInfo.gpsLongitude = longitude;
}
double ExynosCameraParameters::getGpsLongitude(void)
{
return m_cameraInfo.gpsLongitude;
}
status_t ExynosCameraParameters::checkGpsProcessingMethod(const CameraParameters& params)
{
// gps processing method
const char *strNewGpsProcessingMethod = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
const char *strCurGpsProcessingMethod = NULL;
bool changeMethod = false;
if (strNewGpsProcessingMethod == NULL) {
m_params.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
m_setGpsProcessingMethod(NULL);
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewGpsProcessingMethod %s", "setParameters", strNewGpsProcessingMethod);
strCurGpsProcessingMethod = getGpsProcessingMethod();
if (strCurGpsProcessingMethod != NULL) {
int newLen = strlen(strNewGpsProcessingMethod);
int curLen = strlen(strCurGpsProcessingMethod);
if (newLen != curLen)
changeMethod = true;
else
changeMethod = strncmp(strNewGpsProcessingMethod, strCurGpsProcessingMethod, newLen);
}
if (changeMethod == true) {
m_setGpsProcessingMethod(strNewGpsProcessingMethod);
m_params.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, strNewGpsProcessingMethod);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGpsProcessingMethod(const char *gpsProcessingMethod)
{
memset(m_exifInfo.gps_processing_method, 0, sizeof(m_exifInfo.gps_processing_method));
if (gpsProcessingMethod == NULL)
return;
size_t len = strlen(gpsProcessingMethod);
if (len > sizeof(m_exifInfo.gps_processing_method)) {
len = sizeof(m_exifInfo.gps_processing_method);
}
memcpy(m_exifInfo.gps_processing_method, gpsProcessingMethod, len);
}
const char *ExynosCameraParameters::getGpsProcessingMethod(void)
{
return (const char *)m_exifInfo.gps_processing_method;
}
void ExynosCameraParameters::m_setExifFixedAttribute(void)
{
char property[PROPERTY_VALUE_MAX];
memset(&m_exifInfo, 0, sizeof(m_exifInfo));
/* 2 0th IFD TIFF Tags */
/* 3 Maker */
strncpy((char *)m_exifInfo.maker, EXIF_DEF_MAKER,
sizeof(m_exifInfo.maker) - 1);
m_exifInfo.maker[sizeof(EXIF_DEF_MAKER) - 1] = '\0';
/* 3 Model */
property_get("ro.product.model", property, EXIF_DEF_MODEL);
strncpy((char *)m_exifInfo.model, property,
sizeof(m_exifInfo.model) - 1);
m_exifInfo.model[sizeof(m_exifInfo.model) - 1] = '\0';
/* 3 Software */
property_get("ro.build.PDA", property, EXIF_DEF_SOFTWARE);
strncpy((char *)m_exifInfo.software, property,
sizeof(m_exifInfo.software) - 1);
m_exifInfo.software[sizeof(m_exifInfo.software) - 1] = '\0';
/* 3 YCbCr Positioning */
m_exifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
/*2 0th IFD Exif Private Tags */
/* 3 Exif Version */
memcpy(m_exifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(m_exifInfo.exif_version));
if (getHalVersion() == IS_HAL_VER_3_2) {
/* 3 Aperture */
m_exifInfo.aperture.num = (int) m_staticInfo->aperture * COMMON_DENOMINATOR;
m_exifInfo.aperture.den = COMMON_DENOMINATOR;
/* 3 F Number */
m_exifInfo.fnumber.num = m_staticInfo->fNumber * COMMON_DENOMINATOR;
m_exifInfo.fnumber.den = COMMON_DENOMINATOR;
/* 3 Maximum lens aperture */
m_exifInfo.max_aperture.num = m_staticInfo->aperture * COMMON_DENOMINATOR;
m_exifInfo.max_aperture.den = COMMON_DENOMINATOR;
/* 3 Lens Focal Length */
m_exifInfo.focal_length.num = m_staticInfo->focalLength * COMMON_DENOMINATOR;
m_exifInfo.focal_length.den = COMMON_DENOMINATOR;
} else {
m_exifInfo.aperture.num = m_staticInfo->apertureNum;
m_exifInfo.aperture.den = m_staticInfo->apertureDen;
/* 3 F Number */
m_exifInfo.fnumber.num = m_staticInfo->fNumberNum;
m_exifInfo.fnumber.den = m_staticInfo->fNumberDen;
/* 3 Maximum lens aperture */
m_exifInfo.max_aperture.num = m_staticInfo->apertureNum;
m_exifInfo.max_aperture.den = m_staticInfo->apertureDen;
/* 3 Lens Focal Length */
m_exifInfo.focal_length.num = m_staticInfo->focalLengthNum;
m_exifInfo.focal_length.den = m_staticInfo->focalLengthDen;
}
/* 3 Maker note */
if (m_exifInfo.maker_note)
delete m_exifInfo.maker_note;
m_exifInfo.maker_note_size = 98;
m_exifInfo.maker_note = new unsigned char[m_exifInfo.maker_note_size];
memset((void *)m_exifInfo.maker_note, 0, m_exifInfo.maker_note_size);
/* 3 User Comments */
if (m_exifInfo.user_comment)
delete m_exifInfo.user_comment;
m_exifInfo.user_comment_size = sizeof("user comment");
m_exifInfo.user_comment = new unsigned char[m_exifInfo.user_comment_size + 8];
memset((void *)m_exifInfo.user_comment, 0, m_exifInfo.user_comment_size + 8);
/* 3 Color Space information */
m_exifInfo.color_space = EXIF_DEF_COLOR_SPACE;
/* 3 interoperability */
m_exifInfo.interoperability_index = EXIF_DEF_INTEROPERABILITY;
/* 3 Exposure Mode */
m_exifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
/* 2 0th IFD GPS Info Tags */
unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
memcpy(m_exifInfo.gps_version_id, gps_version, sizeof(gps_version));
/* 2 1th IFD TIFF Tags */
m_exifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
m_exifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
m_exifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
m_exifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
m_exifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
m_exifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
}
void ExynosCameraParameters::setExifChangedAttribute(exif_attribute_t *exifInfo,
ExynosRect *pictureRect,
ExynosRect *thumbnailRect,
camera2_shot_t *shot)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
m_setExifChangedAttribute(exifInfo, pictureRect, thumbnailRect, shot);
} else {
m_setExifChangedAttribute(exifInfo, pictureRect, thumbnailRect, &(shot->dm), &(shot->udm));
}
}
void ExynosCameraParameters::m_setExifChangedAttribute(exif_attribute_t *exifInfo,
ExynosRect *pictureRect,
ExynosRect *thumbnailRect,
__unused camera2_dm *dm,
camera2_udm *udm)
{
/* 2 0th IFD TIFF Tags */
/* 3 Width */
exifInfo->width = pictureRect->w;
/* 3 Height */
exifInfo->height = pictureRect->h;
/* 3 Orientation */
switch (m_cameraInfo.rotation) {
case 90:
exifInfo->orientation = EXIF_ORIENTATION_90;
break;
case 180:
exifInfo->orientation = EXIF_ORIENTATION_180;
break;
case 270:
exifInfo->orientation = EXIF_ORIENTATION_270;
break;
case 0:
default:
exifInfo->orientation = EXIF_ORIENTATION_UP;
break;
}
/* 3 Maker note */
/* back-up udm info for exif's maker note */
memcpy((void *)mDebugInfo.debugData[4], (void *)udm, sizeof(struct camera2_udm));
unsigned int offset = sizeof(struct camera2_udm);
#ifdef SAMSUNG_OIS
if (getCameraId() == CAMERA_ID_BACK) {
getOisEXIFFromFile(m_staticInfo, (int)m_cameraInfo.oisMode);
/* Copy ois data to debugData*/
memcpy((void *)(mDebugInfo.debugData[4] + offset),
(void *)&m_staticInfo->ois_exif_info, sizeof(m_staticInfo->ois_exif_info));
offset += sizeof(m_staticInfo->ois_exif_info);
}
#endif
#ifdef SAMSUNG_BD
/* Copy bd data to debugData */
if(getSeriesShotMode() == SERIES_SHOT_MODE_BURST) {
memcpy((void *)(mDebugInfo.debugData[4] + offset),
(void *)&m_staticInfo->bd_exif_info, sizeof(m_staticInfo->bd_exif_info));
offset += sizeof(m_staticInfo->bd_exif_info);
}
#endif
#ifdef SAMSUNG_LLS_DEBLUR
int llsMode = getLDCaptureMode();
if(llsMode == MULTI_SHOT_MODE_MULTI1 || llsMode == MULTI_SHOT_MODE_MULTI2
|| llsMode == MULTI_SHOT_MODE_MULTI3) {
memcpy((void *)(mDebugInfo.debugData[4] + offset),
(void *)&m_staticInfo->lls_exif_info, sizeof(m_staticInfo->lls_exif_info));
}
#endif
/* TODO */
#if 0
if (getSeriesShotCount() && getShotMode() != SHOT_MODE_BEST_PHOTO) {
unsigned char l_makernote[98] = { 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,
0x30, 0x31, 0x30, 0x30, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x40, 0x00, 0x04, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00,
0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5A, 0x00,
0x00, 0x00, 0x50, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
long long int mCityId = getCityId();
l_makernote[46] = getWeatherId();
memcpy(l_makernote + 90, &mCityId, 8);
exifInfo->maker_note_size = 98;
memcpy(exifInfo->maker_note, l_makernote, sizeof(l_makernote));
} else {
exifInfo->maker_note_size = 0;
}
#else
exifInfo->maker_note_size = 0;
#endif
/* 3 Date time */
struct timeval rawtime;
struct tm timeinfo;
gettimeofday(&rawtime, NULL);
localtime_r((time_t *)&rawtime.tv_sec, &timeinfo);
strftime((char *)exifInfo->date_time, 20, "%Y:%m:%d %H:%M:%S", &timeinfo);
snprintf((char *)exifInfo->sec_time, 5, "%04d", (int)(rawtime.tv_usec/1000));
#ifdef SAMSUNG_UTC_TS
gmtime_r((time_t *)&rawtime.tv_sec, &timeinfo);
struct utc_ts m_utc;
strftime((char *)&m_utc.utc_ts_data[4], 20, "%Y:%m:%d %H:%M:%S", &timeinfo);
/* UTC Time Info Tag : 0x1001 */
m_utc.utc_ts_data[0] = 0x10;
m_utc.utc_ts_data[1] = 0x01;
m_utc.utc_ts_data[2] = 0x00;
m_utc.utc_ts_data[3] = 0x16;
memcpy(mDebugInfo.debugData[5], m_utc.utc_ts_data, sizeof(struct utc_ts));
#endif
/* 2 0th IFD Exif Private Tags */
bool flagSLSIAlgorithm = true;
/*
* vendorSpecific2[100] : exposure
* vendorSpecific2[101] : iso(gain)
* vendorSpecific2[102] /256 : Bv
* vendorSpecific2[103] : Tv
*/
/* 3 ISO Speed Rating */
exifInfo->iso_speed_rating = udm->internal.vendorSpecific2[101];
/* 3 Exposure Program */
if (m_exposureTimeCapture == 0) {
m_exifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
} else {
m_exifInfo.exposure_program = EXIF_DEF_EXPOSURE_MANUAL;
}
/* 3 Exposure Time */
if (m_exposureTimeCapture == 0) {
exifInfo->exposure_time.num = 1;
if (udm->ae.vendorSpecific[0] == 0xAEAEAEAE)
exifInfo->exposure_time.den = (uint32_t)udm->ae.vendorSpecific[64];
else
exifInfo->exposure_time.den = (uint32_t)udm->internal.vendorSpecific2[100];
} else if (m_exposureTimeCapture > 0 && m_exposureTimeCapture <= CAMERA_PREVIEW_EXPOSURE_TIME_LIMIT) {
exifInfo->exposure_time.num = 1;
if ((1000000 % m_exposureTimeCapture) != 0) {
uint32_t dig;
if (m_exposureTimeCapture < 100) {
dig = 1000;
} else if (m_exposureTimeCapture < 1000) {
dig = 100;
} else if (m_exposureTimeCapture < 10000) {
dig = 10;
} else {
dig = 5;
}
exifInfo->exposure_time.den = ROUND_OFF_DIGIT((int)(1000000 / m_exposureTimeCapture), dig);
} else {
exifInfo->exposure_time.den = (int)(1000000 / m_exposureTimeCapture);
}
} else {
exifInfo->exposure_time.num = m_exposureTimeCapture / 1000;
exifInfo->exposure_time.den = 1000;
}
/* 3 Shutter Speed */
if (m_exposureTimeCapture <= CAMERA_PREVIEW_EXPOSURE_TIME_LIMIT) {
if (udm->ae.vendorSpecific[0] == 0xAEAEAEAE)
exifInfo->shutter_speed.num = (uint32_t)(ROUND_OFF_HALF(((double)(udm->ae.vendorSpecific[69] / 256.f) * EXIF_DEF_APEX_DEN), 0));
else
exifInfo->shutter_speed.num = (uint32_t)(ROUND_OFF_HALF(((double)(udm->internal.vendorSpecific2[103] / 256.f) * EXIF_DEF_APEX_DEN), 0));
exifInfo->shutter_speed.den = EXIF_DEF_APEX_DEN;
} else {
exifInfo->shutter_speed.num = (int32_t)(log2((double)m_exposureTimeCapture / 1000000) * -100);
exifInfo->shutter_speed.den = 100;
}
if (getHalVersion() == IS_HAL_VER_3_2) {
/* 3 Aperture */
exifInfo->aperture.num = APEX_FNUM_TO_APERTURE((double)(exifInfo->fnumber.num) / (double)(exifInfo->fnumber.den)) * COMMON_DENOMINATOR;
exifInfo->aperture.den = COMMON_DENOMINATOR;
/* 3 Max Aperture */
exifInfo->max_aperture.num = APEX_FNUM_TO_APERTURE((double)(exifInfo->fnumber.num) / (double)(exifInfo->fnumber.den)) * COMMON_DENOMINATOR;
exifInfo->max_aperture.den = COMMON_DENOMINATOR;
} else {
/* 3 Aperture */
exifInfo->aperture.num = APEX_FNUM_TO_APERTURE((double)(exifInfo->fnumber.num) / (double)(exifInfo->fnumber.den)) * m_staticInfo->apertureDen;
exifInfo->aperture.den = m_staticInfo->apertureDen;
/* 3 Max Aperture */
exifInfo->max_aperture.num = APEX_FNUM_TO_APERTURE((double)(exifInfo->fnumber.num) / (double)(exifInfo->fnumber.den)) * m_staticInfo->apertureDen;
exifInfo->max_aperture.den = m_staticInfo->apertureDen;
}
/* 3 Brightness */
int temp = udm->internal.vendorSpecific2[102];
if ((int)udm->ae.vendorSpecific[102] < 0)
temp = -temp;
exifInfo->brightness.num = (int32_t)(ROUND_OFF_HALF((double)((temp * EXIF_DEF_APEX_DEN) / 256.f), 0));
if ((int)udm->ae.vendorSpecific[102] < 0)
exifInfo->brightness.num = -exifInfo->brightness.num;
exifInfo->brightness.den = EXIF_DEF_APEX_DEN;
CLOGD("DEBUG(%s):udm->internal.vendorSpecific2[100](%d)", __FUNCTION__, udm->internal.vendorSpecific2[100]);
CLOGD("DEBUG(%s):udm->internal.vendorSpecific2[101](%d)", __FUNCTION__, udm->internal.vendorSpecific2[101]);
CLOGD("DEBUG(%s):udm->internal.vendorSpecific2[102](%d)", __FUNCTION__, udm->internal.vendorSpecific2[102]);
CLOGD("DEBUG(%s):udm->internal.vendorSpecific2[103](%d)", __FUNCTION__, udm->internal.vendorSpecific2[103]);
CLOGD("DEBUG(%s):iso_speed_rating(%d)", __FUNCTION__, exifInfo->iso_speed_rating);
CLOGD("DEBUG(%s):exposure_time(%d/%d)", __FUNCTION__, exifInfo->exposure_time.num, exifInfo->exposure_time.den);
CLOGD("DEBUG(%s):shutter_speed(%d/%d)", __FUNCTION__, exifInfo->shutter_speed.num, exifInfo->shutter_speed.den);
CLOGD("DEBUG(%s):aperture (%d/%d)", __FUNCTION__, exifInfo->aperture.num, exifInfo->aperture.den);
CLOGD("DEBUG(%s):brightness (%d/%d)", __FUNCTION__, exifInfo->brightness.num, exifInfo->brightness.den);
/* 3 Exposure Bias */
if (m_exposureTimeCapture == 0) {
exifInfo->exposure_bias.num = (int32_t)getExposureCompensation() * (m_staticInfo->exposureCompensationStep * 10);
exifInfo->exposure_bias.den = 10;
} else {
exifInfo->exposure_bias.num = 0;
exifInfo->exposure_bias.den = 1;
}
/* 3 Metering Mode */
#ifdef SAMSUNG_COMPANION
enum companion_wdr_mode wdr_mode;
wdr_mode = getRTHdr();
if (wdr_mode == COMPANION_WDR_ON) {
exifInfo->metering_mode = EXIF_METERING_PATTERN;
} else
#endif
{
switch (m_cameraInfo.meteringMode) {
case METERING_MODE_CENTER:
exifInfo->metering_mode = EXIF_METERING_CENTER;
break;
case METERING_MODE_MATRIX:
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
break;
case METERING_MODE_SPOT:
#ifdef TOUCH_AE
case METERING_MODE_CENTER_TOUCH:
case METERING_MODE_SPOT_TOUCH:
case METERING_MODE_AVERAGE_TOUCH:
case METERING_MODE_MATRIX_TOUCH:
#endif
exifInfo->metering_mode = EXIF_METERING_SPOT;
break;
case METERING_MODE_AVERAGE:
default:
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
break;
}
#ifdef SAMSUNG_FOOD_MODE
if(getSceneMode() == SCENE_MODE_FOOD) {
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
}
#endif
}
/* 3 Flash */
if (m_cameraInfo.flashMode == FLASH_MODE_OFF) {
exifInfo->flash = 0;
} else if (m_cameraInfo.flashMode == FLASH_MODE_TORCH) {
exifInfo->flash = 1;
} else {
exifInfo->flash = getMarkingOfExifFlash();
}
/* 3 White Balance */
if (m_cameraInfo.whiteBalanceMode == WHITE_BALANCE_AUTO)
exifInfo->white_balance = EXIF_WB_AUTO;
else
exifInfo->white_balance = EXIF_WB_MANUAL;
/* 3 Focal Length in 35mm length */
exifInfo->focal_length_in_35mm_length = m_staticInfo->focalLengthIn35mmLength;
/* 3 Scene Capture Type */
switch (m_cameraInfo.sceneMode) {
case SCENE_MODE_PORTRAIT:
exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
break;
case SCENE_MODE_LANDSCAPE:
exifInfo->scene_capture_type = EXIF_SCENE_LANDSCAPE;
break;
case SCENE_MODE_NIGHT:
exifInfo->scene_capture_type = EXIF_SCENE_NIGHT;
break;
default:
exifInfo->scene_capture_type = EXIF_SCENE_STANDARD;
break;
}
switch (this->getShotMode()) {
case SHOT_MODE_BEAUTY_FACE:
case SHOT_MODE_BEST_FACE:
exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
break;
default:
break;
}
/* 3 Image Unique ID */
#if defined(SAMSUNG_TN_FEATURE) && defined(SENSOR_FW_GET_FROM_FILE)
char *front_fw = NULL;
char *savePtr;
if (getCameraId() == CAMERA_ID_BACK){
memset(exifInfo->unique_id, 0, sizeof(exifInfo->unique_id));
strncpy((char *)exifInfo->unique_id,
getSensorFWFromFile(m_staticInfo, m_cameraId), sizeof(exifInfo->unique_id) - 1);
} else if (getCameraId() == CAMERA_ID_FRONT) {
front_fw = strtok_r((char *)getSensorFWFromFile(m_staticInfo, m_cameraId), " ", &savePtr);
strcpy((char *)exifInfo->unique_id, front_fw);
}
#endif
/* 2 0th IFD GPS Info Tags */
if (m_cameraInfo.gpsLatitude != 0 && m_cameraInfo.gpsLongitude != 0) {
if (m_cameraInfo.gpsLatitude > 0)
strncpy((char *)exifInfo->gps_latitude_ref, "N", 2);
else
strncpy((char *)exifInfo->gps_latitude_ref, "S", 2);
if (m_cameraInfo.gpsLongitude > 0)
strncpy((char *)exifInfo->gps_longitude_ref, "E", 2);
else
strncpy((char *)exifInfo->gps_longitude_ref, "W", 2);
if (m_cameraInfo.gpsAltitude > 0)
exifInfo->gps_altitude_ref = 0;
else
exifInfo->gps_altitude_ref = 1;
double latitude = fabs(m_cameraInfo.gpsLatitude);
double longitude = fabs(m_cameraInfo.gpsLongitude);
double altitude = fabs(m_cameraInfo.gpsAltitude);
exifInfo->gps_latitude[0].num = (uint32_t)latitude;
exifInfo->gps_latitude[0].den = 1;
exifInfo->gps_latitude[1].num = (uint32_t)((latitude - exifInfo->gps_latitude[0].num) * 60);
exifInfo->gps_latitude[1].den = 1;
exifInfo->gps_latitude[2].num = (uint32_t)(round((((latitude - exifInfo->gps_latitude[0].num) * 60)
- exifInfo->gps_latitude[1].num) * 60));
exifInfo->gps_latitude[2].den = 1;
exifInfo->gps_longitude[0].num = (uint32_t)longitude;
exifInfo->gps_longitude[0].den = 1;
exifInfo->gps_longitude[1].num = (uint32_t)((longitude - exifInfo->gps_longitude[0].num) * 60);
exifInfo->gps_longitude[1].den = 1;
exifInfo->gps_longitude[2].num = (uint32_t)(round((((longitude - exifInfo->gps_longitude[0].num) * 60)
- exifInfo->gps_longitude[1].num) * 60));
exifInfo->gps_longitude[2].den = 1;
exifInfo->gps_altitude.num = (uint32_t)altitude;
exifInfo->gps_altitude.den = 1;
struct tm tm_data;
gmtime_r(&m_cameraInfo.gpsTimeStamp, &tm_data);
exifInfo->gps_timestamp[0].num = tm_data.tm_hour;
exifInfo->gps_timestamp[0].den = 1;
exifInfo->gps_timestamp[1].num = tm_data.tm_min;
exifInfo->gps_timestamp[1].den = 1;
exifInfo->gps_timestamp[2].num = tm_data.tm_sec;
exifInfo->gps_timestamp[2].den = 1;
snprintf((char*)exifInfo->gps_datestamp, sizeof(exifInfo->gps_datestamp),
"%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
exifInfo->enableGps = true;
} else {
exifInfo->enableGps = false;
}
/* 2 1th IFD TIFF Tags */
exifInfo->widthThumb = thumbnailRect->w;
exifInfo->heightThumb = thumbnailRect->h;
setMarkingOfExifFlash(0);
}
/* for CAMERA2_API_SUPPORT */
void ExynosCameraParameters::m_setExifChangedAttribute(exif_attribute_t *exifInfo,
ExynosRect *pictureRect,
ExynosRect *thumbnailRect,
camera2_shot_t *shot)
{
/* JPEG Picture Size */
exifInfo->width = pictureRect->w;
exifInfo->height = pictureRect->h;
/* Orientation */
switch (shot->ctl.jpeg.orientation) {
case 90:
exifInfo->orientation = EXIF_ORIENTATION_90;
break;
case 180:
exifInfo->orientation = EXIF_ORIENTATION_180;
break;
case 270:
exifInfo->orientation = EXIF_ORIENTATION_270;
break;
case 0:
default:
exifInfo->orientation = EXIF_ORIENTATION_UP;
break;
}
/* Maker Note Size */
/* back-up udm info for exif's maker note */
#ifdef SAMSUNG_OIS
if (getCameraId() == CAMERA_ID_BACK) {
memcpy((void *)mDebugInfo.debugData[4], (void *)&shot->udm, sizeof(struct camera2_udm));
getOisEXIFFromFile(m_staticInfo, (int)m_cameraInfo.oisMode);
/* Copy ois data to debugData*/
memcpy((void *)(mDebugInfo.debugData[4] + sizeof(struct camera2_udm)),
(void *)&m_staticInfo->ois_exif_info, sizeof(m_staticInfo->ois_exif_info));
} else {
memcpy((void *)mDebugInfo.debugData[4], (void *)&shot->udm, mDebugInfo.debugSize[4]);
}
#else
memcpy((void *)mDebugInfo.debugData[4], (void *)&shot->udm, mDebugInfo.debugSize[4]);
#endif
/* TODO */
#if 0
if (getSeriesShotCount() && getShotMode() != SHOT_MODE_BEST_PHOTO) {
unsigned char l_makernote[98] = { 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,
0x30, 0x31, 0x30, 0x30, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x40, 0x00, 0x04, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00,
0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5A, 0x00,
0x00, 0x00, 0x50, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
long long int mCityId = getCityId();
l_makernote[46] = getWeatherId();
memcpy(l_makernote + 90, &mCityId, 8);
exifInfo->maker_note_size = 98;
memcpy(exifInfo->maker_note, l_makernote, sizeof(l_makernote));
} else {
exifInfo->maker_note_size = 0;
}
#else
exifInfo->maker_note_size = 0;
#endif
/* Date Time */
struct timeval rawtime;
struct tm timeinfo;
gettimeofday(&rawtime, NULL);
localtime_r((time_t *)&rawtime.tv_sec, &timeinfo);
strftime((char *)exifInfo->date_time, 20, "%Y:%m:%d %H:%M:%S", &timeinfo);
snprintf((char *)exifInfo->sec_time, 5, "%04d", (int)(rawtime.tv_usec/1000));
/* Exif Private Tags */
bool flagSLSIAlgorithm = true;
/*
* vendorSpecific2[100] : exposure
* vendorSpecific2[101] : iso(gain)
* vendorSpecific2[102] /256 : Bv
* vendorSpecific2[103] : Tv
*/
/* ISO Speed Rating */
#if 0 /* TODO: Must be same with the sensitivity in Result Metadata */
exifInfo->iso_speed_rating = shot->udm.internal.vendorSpecific2[101];
#else
exifInfo->iso_speed_rating = shot->dm.sensor.sensitivity;
#endif
/* Exposure Program */
if (m_exposureTimeCapture == 0) {
m_exifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
} else {
m_exifInfo.exposure_program = EXIF_DEF_EXPOSURE_MANUAL;
}
/* Exposure Time */
exifInfo->exposure_time.num = 1;
#if 0 /* TODO: Must be same with the exposure time in Result Metadata */
if (shot->udm.ae.vendorSpecific[0] == 0xAEAEAEAE) {
exifInfo->exposure_time.den = (uint32_t) shot->udm.ae.vendorSpecific[64];
} else
#endif
{
/* HACK : Sometimes, F/W does NOT send the exposureTime */
if (shot->dm.sensor.exposureTime != 0)
exifInfo->exposure_time.den = (uint32_t) 1e9 / shot->dm.sensor.exposureTime;
else
exifInfo->exposure_time.num = 0;
}
/* Shutter Speed */
exifInfo->shutter_speed.num = (uint32_t) (ROUND_OFF_HALF(((double) (shot->udm.internal.vendorSpecific2[103] / 256.f) * EXIF_DEF_APEX_DEN), 0));
exifInfo->shutter_speed.den = EXIF_DEF_APEX_DEN;
/* Aperture */
exifInfo->aperture.num = APEX_FNUM_TO_APERTURE((double) (exifInfo->fnumber.num) / (double) (exifInfo->fnumber.den)) * COMMON_DENOMINATOR;
exifInfo->aperture.den = COMMON_DENOMINATOR;
/* Max Aperture */
exifInfo->max_aperture.num = APEX_FNUM_TO_APERTURE((double) (exifInfo->fnumber.num) / (double) (exifInfo->fnumber.den)) * COMMON_DENOMINATOR;
exifInfo->max_aperture.den = COMMON_DENOMINATOR;
/* Brightness */
int temp = shot->udm.internal.vendorSpecific2[102];
if ((int) shot->udm.ae.vendorSpecific[102] < 0)
temp = -temp;
exifInfo->brightness.num = (int32_t) (ROUND_OFF_HALF((double)((temp * EXIF_DEF_APEX_DEN)/256.f), 0));
if ((int) shot->udm.ae.vendorSpecific[102] < 0)
exifInfo->brightness.num = -exifInfo->brightness.num;
exifInfo->brightness.den = EXIF_DEF_APEX_DEN;
ALOGD("DEBUG(%s):udm->internal.vendorSpecific2[100](%d)", __FUNCTION__, shot->udm.internal.vendorSpecific2[100]);
ALOGD("DEBUG(%s):udm->internal.vendorSpecific2[101](%d)", __FUNCTION__, shot->udm.internal.vendorSpecific2[101]);
ALOGD("DEBUG(%s):udm->internal.vendorSpecific2[102](%d)", __FUNCTION__, shot->udm.internal.vendorSpecific2[102]);
ALOGD("DEBUG(%s):udm->internal.vendorSpecific2[103](%d)", __FUNCTION__, shot->udm.internal.vendorSpecific2[103]);
ALOGD("DEBUG(%s):iso_speed_rating(%d)", __FUNCTION__, exifInfo->iso_speed_rating);
ALOGD("DEBUG(%s):exposure_time(%d/%d)", __FUNCTION__, exifInfo->exposure_time.num, exifInfo->exposure_time.den);
ALOGD("DEBUG(%s):shutter_speed(%d/%d)", __FUNCTION__, exifInfo->shutter_speed.num, exifInfo->shutter_speed.den);
ALOGD("DEBUG(%s):aperture (%d/%d)", __FUNCTION__, exifInfo->aperture.num, exifInfo->aperture.den);
ALOGD("DEBUG(%s):brightness (%d/%d)", __FUNCTION__, exifInfo->brightness.num, exifInfo->brightness.den);
/* Exposure Bias */
#if defined(USE_SUBDIVIDED_EV)
exifInfo->exposure_bias.num = shot->ctl.aa.aeExpCompensation * (m_staticInfo->exposureCompensationStep * 10);
#else
exifInfo->exposure_bias.num =
(shot->ctl.aa.aeExpCompensation) * (m_staticInfo->exposureCompensationStep * 10);
#endif
exifInfo->exposure_bias.den = 10;
/* Metering Mode */
#ifdef SAMSUNG_COMPANION
enum companion_wdr_mode wdr_mode;
wdr_mode = shot->uctl.companionUd.wdr_mode;
if (wdr_mode == COMPANION_WDR_ON) {
exifInfo->metering_mode = EXIF_METERING_PATTERN;
} else
#endif
{
switch (shot->ctl.aa.aeMode) {
case AA_AEMODE_CENTER:
exifInfo->metering_mode = EXIF_METERING_CENTER;
break;
case AA_AEMODE_MATRIX:
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
break;
case AA_AEMODE_SPOT:
exifInfo->metering_mode = EXIF_METERING_SPOT;
break;
default:
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
break;
}
#ifdef SAMSUNG_FOOD_MODE
if(getSceneMode() == SCENE_MODE_FOOD) {
exifInfo->metering_mode = EXIF_METERING_AVERAGE;
}
#endif
}
/* Flash Mode */
if (shot->ctl.flash.flashMode == CAM2_FLASH_MODE_TORCH) {
exifInfo->flash = 1;
} else {
exifInfo->flash = getMarkingOfExifFlash();
}
/* White Balance */
if (shot->ctl.aa.awbMode == AA_AWBMODE_WB_AUTO)
exifInfo->white_balance = EXIF_WB_AUTO;
else
exifInfo->white_balance = EXIF_WB_MANUAL;
/* Focal Length in 35mm length */
exifInfo->focal_length_in_35mm_length = getFocalLengthIn35mmFilm();
/* Scene Capture Type */
switch (shot->ctl.aa.sceneMode) {
case AA_SCENE_MODE_PORTRAIT:
case AA_SCENE_MODE_FACE_PRIORITY:
exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
break;
case AA_SCENE_MODE_LANDSCAPE:
exifInfo->scene_capture_type = EXIF_SCENE_LANDSCAPE;
break;
case AA_SCENE_MODE_NIGHT:
exifInfo->scene_capture_type = EXIF_SCENE_NIGHT;
break;
default:
exifInfo->scene_capture_type = EXIF_SCENE_STANDARD;
break;
}
switch (this->getShotMode()) {
case SHOT_MODE_BEAUTY_FACE:
case SHOT_MODE_BEST_FACE:
exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
break;
default:
break;
}
/* Image Unique ID */
#if defined(SAMSUNG_TN_FEATURE) && defined(SENSOR_FW_GET_FROM_FILE)
char *front_fw = NULL;
char *savePtr;
if (getCameraId() == CAMERA_ID_BACK){
memset(exifInfo->unique_id, 0, sizeof(exifInfo->unique_id));
strncpy((char *)exifInfo->unique_id,
getSensorFWFromFile(m_staticInfo, m_cameraId), sizeof(exifInfo->unique_id) - 1);
} else if (getCameraId() == CAMERA_ID_FRONT) {
front_fw = strtok_r((char *)getSensorFWFromFile(m_staticInfo, m_cameraId), " ", &savePtr);
strcpy((char *)exifInfo->unique_id, front_fw);
}
#endif
/* GPS Coordinates */
double gpsLatitude = shot->ctl.jpeg.gpsCoordinates[0];
double gpsLongitude = shot->ctl.jpeg.gpsCoordinates[1];
double gpsAltitude = shot->ctl.jpeg.gpsCoordinates[2];
if (gpsLatitude != 0 && gpsLongitude != 0) {
if (gpsLatitude > 0)
strncpy((char *) exifInfo->gps_latitude_ref, "N", 2);
else
strncpy((char *) exifInfo->gps_latitude_ref, "S", 2);
if (gpsLongitude > 0)
strncpy((char *) exifInfo->gps_longitude_ref, "E", 2);
else
strncpy((char *) exifInfo->gps_longitude_ref, "W", 2);
if (gpsAltitude > 0)
exifInfo->gps_altitude_ref = 0;
else
exifInfo->gps_altitude_ref = 1;
gpsLatitude = fabs(gpsLatitude);
gpsLongitude = fabs(gpsLongitude);
gpsAltitude = fabs(gpsAltitude);
exifInfo->gps_latitude[0].num = (uint32_t) gpsLatitude;
exifInfo->gps_latitude[0].den = 1;
exifInfo->gps_latitude[1].num = (uint32_t)((gpsLatitude - exifInfo->gps_latitude[0].num) * 60);
exifInfo->gps_latitude[1].den = 1;
exifInfo->gps_latitude[2].num = (uint32_t)(round((((gpsLatitude - exifInfo->gps_latitude[0].num) * 60)
- exifInfo->gps_latitude[1].num) * 60));
exifInfo->gps_latitude[2].den = 1;
exifInfo->gps_longitude[0].num = (uint32_t)gpsLongitude;
exifInfo->gps_longitude[0].den = 1;
exifInfo->gps_longitude[1].num = (uint32_t)((gpsLongitude - exifInfo->gps_longitude[0].num) * 60);
exifInfo->gps_longitude[1].den = 1;
exifInfo->gps_longitude[2].num = (uint32_t)(round((((gpsLongitude - exifInfo->gps_longitude[0].num) * 60)
- exifInfo->gps_longitude[1].num) * 60));
exifInfo->gps_longitude[2].den = 1;
exifInfo->gps_altitude.num = (uint32_t)gpsAltitude;
exifInfo->gps_altitude.den = 1;
struct tm tm_data;
long gpsTimestamp = (long) shot->ctl.jpeg.gpsTimestamp;
gmtime_r(&gpsTimestamp, &tm_data);
exifInfo->gps_timestamp[0].num = tm_data.tm_hour;
exifInfo->gps_timestamp[0].den = 1;
exifInfo->gps_timestamp[1].num = tm_data.tm_min;
exifInfo->gps_timestamp[1].den = 1;
exifInfo->gps_timestamp[2].num = tm_data.tm_sec;
exifInfo->gps_timestamp[2].den = 1;
snprintf((char*)exifInfo->gps_datestamp, sizeof(exifInfo->gps_datestamp),
"%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
exifInfo->enableGps = true;
} else {
exifInfo->enableGps = false;
}
/* Thumbnail Size */
exifInfo->widthThumb = thumbnailRect->w;
exifInfo->heightThumb = thumbnailRect->h;
setMarkingOfExifFlash(0);
}
debug_attribute_t *ExynosCameraParameters::getDebugAttribute(void)
{
return &mDebugInfo;
}
status_t ExynosCameraParameters::getFixedExifInfo(exif_attribute_t *exifInfo)
{
if (exifInfo == NULL) {
CLOGE("ERR(%s[%d]): buffer is NULL", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
memcpy(exifInfo, &m_exifInfo, sizeof(exif_attribute_t));
return NO_ERROR;
}
#ifdef SAMSUNG_DNG
status_t ExynosCameraParameters::checkDngFilePath(const CameraParameters& params)
{
const char *dngFilePath = params.get("capture-raw-filepath");
if (dngFilePath != NULL) {
snprintf(m_dngFilePath, sizeof(m_dngFilePath), "%s", dngFilePath);
CLOGD("DEBUG(%s): dngFilePath %s", "setParameters", dngFilePath);
} else {
CLOGD("DEBUG(%s): dngFilePath NULL", "setParameters");
memset(m_dngFilePath, 0, CAMERA_FILE_PATH_SIZE);
}
return NO_ERROR;
}
char *ExynosCameraParameters::getDngFilePath(void)
{
return m_dngFilePath;
}
int ExynosCameraParameters::getDngSaveLocation(void)
{
int dngShotSaveLocation = m_dngSaveLocation;
/* GED's series shot work as callback */
#ifdef CAMERA_GED_FEATURE
dngShotSaveLocation = BURST_SAVE_CALLBACK;
#else
if (m_dngSaveLocation == 0)
dngShotSaveLocation = BURST_SAVE_PHONE;
else
dngShotSaveLocation = BURST_SAVE_SDCARD;
#endif
return dngShotSaveLocation;
}
void ExynosCameraParameters::setDngSaveLocation(int saveLocation)
{
m_dngSaveLocation = saveLocation;
}
void ExynosCameraParameters::m_setDngFixedAttribute(void)
{
char property[PROPERTY_VALUE_MAX];
memset(&m_dngInfo, 0, sizeof(m_dngInfo));
/* IFD TIFF Tags */
/* string Tags */
strncpy((char *)m_dngInfo.make, TIFF_DEF_MAKE, sizeof(m_dngInfo.make) - 1);
m_dngInfo.make[sizeof(TIFF_DEF_MAKE) - 1] = '\0';
property_get("ro.product.model", property, TIFF_DEF_MODEL);
strncpy((char *)m_dngInfo.model, property, sizeof(m_dngInfo.model) - 1);
m_dngInfo.model[sizeof(m_dngInfo.model) - 1] = '\0';
strncpy((char *)m_dngInfo.unique_camera_model, property, sizeof(m_dngInfo.unique_camera_model) - 1);
m_dngInfo.unique_camera_model[sizeof(m_dngInfo.unique_camera_model) - 1] = '\0';
property_get("ro.build.PDA", property, TIFF_DEF_SOFTWARE);
strncpy((char *)m_dngInfo.software, property, sizeof(m_dngInfo.software) - 1);
m_dngInfo.software[sizeof(m_dngInfo.software) - 1] = '\0';
/* pre-defined Tasgs at the header */
m_dngInfo.new_subfile_type = 0;
m_dngInfo.bits_per_sample = TIFF_DEF_BITS_PER_SAMPLE;
m_dngInfo.rows_per_strip = TIFF_DEF_ROWS_PER_STRIP;
m_dngInfo.photometric_interpretation = TIFF_DEF_PHOTOMETRIC_INTERPRETATION;
m_dngInfo.image_description[0] = '\0';
m_dngInfo.planar_configuration = TIFF_DEF_PLANAR_CONFIGURATION;
m_dngInfo.copyright = '\0';
m_dngInfo.samples_per_pixel = TIFF_DEF_SAMPLES_PER_PIXEL;
m_dngInfo.compression = TIFF_DEF_COMPRESSION;
m_dngInfo.x_resolution.num = TIFF_DEF_RESOLUTION_NUM;
m_dngInfo.x_resolution.den = TIFF_DEF_RESOLUTION_DEN;
m_dngInfo.y_resolution.num = TIFF_DEF_RESOLUTION_NUM;
m_dngInfo.y_resolution.den = TIFF_DEF_RESOLUTION_DEN;
m_dngInfo.resolution_unit = TIFF_DEF_RESOLUTION_UNIT;
m_dngInfo.cfa_layout = TIFF_DEF_CFA_LAYOUT;
memcpy(m_dngInfo.tiff_ep_standard_id, TIFF_DEF_TIFF_EP_STANDARD_ID, sizeof(m_dngInfo.tiff_ep_standard_id));
memcpy(m_dngInfo.cfa_repeat_pattern_dm, TIFF_DEF_CFA_REPEAT_PATTERN_DM, sizeof(m_dngInfo.cfa_repeat_pattern_dm));
memcpy(m_dngInfo.cfa_pattern, TIFF_DEF_CFA_PATTERN, sizeof(m_dngInfo.cfa_pattern));
memcpy(m_dngInfo.dng_version, TIFF_DEF_DNG_VERSION, sizeof(m_dngInfo.dng_version));
memcpy(m_dngInfo.dng_backward_version, TIFF_DEF_DNG_BACKWARD_VERSION, sizeof(m_dngInfo.dng_backward_version));
memcpy(m_dngInfo.cfa_plane_color, TIFF_DEF_CFA_PLANE_COLOR, sizeof(m_dngInfo.cfa_plane_color));
memcpy(m_dngInfo.black_level_repeat_dim, TIFF_DEF_BLACK_LEVEL_REPEAT_DIM, sizeof(m_dngInfo.black_level_repeat_dim));
memcpy(m_dngInfo.default_scale, TIFF_DEF_DEFAULT_SCALE, sizeof(m_dngInfo.default_scale));
memcpy(m_dngInfo.default_crop_origin, TIFF_DEF_DEFAULT_CROP_ORIGIN, sizeof(m_dngInfo.default_crop_origin));
memcpy(m_dngInfo.opcode_list2, &TIFF_DEF_OPCODE_LIST2, sizeof(m_dngInfo.opcode_list2));
memcpy(m_dngInfo.exif_version, &TIFF_DEF_EXIF_VERSION, sizeof(m_dngInfo.exif_version));
/* static Metadata */
m_dngInfo.f_number.num = m_staticInfo->fNumberNum;
m_dngInfo.f_number.den = m_staticInfo->fNumberDen;
m_dngInfo.focal_length.num = m_staticInfo->focalLengthNum;
m_dngInfo.focal_length.den = m_staticInfo->focalLengthDen;
m_dngInfo.white_level = m_staticInfo->whiteLevel;
m_dngInfo.calibration_illuminant1 = m_staticInfo->referenceIlluminant1;
m_dngInfo.calibration_illuminant2 = m_staticInfo->referenceIlluminant2;
memcpy(m_dngInfo.black_level_repeat, m_staticInfo->blackLevelPattern, sizeof(m_dngInfo.black_level_repeat));
memcpy(m_dngInfo.color_matrix1, m_staticInfo->colorTransformMatrix1, sizeof(m_dngInfo.color_matrix1));
memcpy(m_dngInfo.color_matrix2, m_staticInfo->colorTransformMatrix2, sizeof(m_dngInfo.color_matrix2));
memcpy(m_dngInfo.forward_matrix1, m_staticInfo->forwardMatrix1, sizeof(m_dngInfo.forward_matrix1));
memcpy(m_dngInfo.forward_matrix2, m_staticInfo->forwardMatrix2, sizeof(m_dngInfo.forward_matrix2));
memcpy(m_dngInfo.camera_calibration1, m_staticInfo->calibration1, sizeof(m_dngInfo.camera_calibration1));
memcpy(m_dngInfo.camera_calibration2, m_staticInfo->calibration2, sizeof(m_dngInfo.camera_calibration2));
}
void ExynosCameraParameters::setDngChangedAttribute(struct camera2_dm *dm, struct camera2_udm *udm)
{
CLOGD("DEBUG(%s[%d]): set Dynamic Dng Info", __FUNCTION__, __LINE__);
/* IFD TIFF Tags */
getHwSensorSize((int *)&m_dngInfo.image_width, (int *)&m_dngInfo.image_length);
m_dngInfo.default_crop_size[0] = m_dngInfo.image_width - m_dngInfo.default_crop_origin[0];
m_dngInfo.default_crop_size[1] = m_dngInfo.image_length - m_dngInfo.default_crop_origin[1];
/* Orientation */
switch (m_cameraInfo.rotation) {
case 90:
m_dngInfo.orientation = EXIF_ORIENTATION_90;
break;
case 180:
m_dngInfo.orientation = EXIF_ORIENTATION_180;
break;
case 270:
m_dngInfo.orientation = EXIF_ORIENTATION_270;
break;
case 0:
default:
m_dngInfo.orientation = EXIF_ORIENTATION_UP;
break;
}
/* Date time */
struct timeval rawtime;
struct tm timeinfo;
gettimeofday(&rawtime, NULL);
localtime_r((time_t *)&rawtime.tv_sec, &timeinfo);
strftime((char *)m_dngInfo.date_time, 20, "%Y:%m:%d %H:%M:%S", &timeinfo);
strftime((char *)m_dngInfo.date_time_original, 20, "%Y:%m:%d %H:%M:%S", &timeinfo);
/* ISO Speed Rating */
m_dngInfo.iso_speed_ratings = udm->internal.vendorSpecific2[101];
/* Exposure Time */
if (m_exposureTimeCapture == 0) {
m_dngInfo.exposure_time.num = 1;
if (udm->ae.vendorSpecific[0] == 0xAEAEAEAE)
m_dngInfo.exposure_time.den = (uint32_t)udm->ae.vendorSpecific[64];
else
m_dngInfo.exposure_time.den = (uint32_t)udm->internal.vendorSpecific2[100];
} else if (m_exposureTimeCapture > 0 && m_exposureTimeCapture <= CAMERA_PREVIEW_EXPOSURE_TIME_LIMIT) {
m_dngInfo.exposure_time.num = 1;
if ((1000000 % m_exposureTimeCapture) != 0) {
uint32_t dig;
if (m_exposureTimeCapture < 100) {
dig = 1000;
} else if (m_exposureTimeCapture < 1000) {
dig = 100;
} else if (m_exposureTimeCapture < 10000) {
dig = 10;
} else {
dig = 5;
}
m_dngInfo.exposure_time.den = ROUND_OFF_DIGIT((int)(1000000 / m_exposureTimeCapture), dig);
} else {
m_dngInfo.exposure_time.den = (int)(1000000 / m_exposureTimeCapture);
}
} else {
m_dngInfo.exposure_time.num = m_exposureTimeCapture / 1000;
m_dngInfo.exposure_time.den = 1000;
}
/* AsShotNeutral & NoiseProfile */
memcpy(m_dngInfo.as_shot_neutral, dm->sensor.neutralColorPoint, sizeof(m_dngInfo.as_shot_neutral));
memcpy(m_dngInfo.noise_profile, dm->sensor.noiseProfile, sizeof(m_dngInfo.noise_profile));
/* 3 Image Unique ID */
#if defined(SAMSUNG_TN_FEATURE) && defined(SENSOR_FW_GET_FROM_FILE)
char *front_fw = NULL;
char *savePtr;
if (getCameraId() == CAMERA_ID_BACK){
memset(m_dngInfo.unique_camera_model, 0, sizeof(m_dngInfo.unique_camera_model));
strncpy((char *)m_dngInfo.unique_camera_model, getSensorFWFromFile(m_staticInfo, m_cameraId),
sizeof(m_dngInfo.unique_camera_model) - 1);
} else if (getCameraId() == CAMERA_ID_FRONT) {
front_fw = strtok_r((char *)getSensorFWFromFile(m_staticInfo, m_cameraId), " ", &savePtr);
strcpy((char *)m_dngInfo.unique_camera_model, front_fw);
}
#endif
}
dng_attribute_t* ExynosCameraParameters::getDngInfo()
{
int retryCount = 12; /* 30ms * 12 */
while(retryCount > 0) {
if(getIsUsefulDngInfo() == false) {
CLOGD("DEBUG(%s[%d]): Waiting for update DNG metadata failed, retryCount(%d)", __FUNCTION__, __LINE__, retryCount);
} else {
CLOGD("DEBUG(%s[%d]): Success DNG meta, retryCount(%d)", __FUNCTION__, __LINE__, retryCount);
break;
}
retryCount--;
usleep(DM_WAITING_TIME);
}
return &m_dngInfo;
}
void ExynosCameraParameters::setIsUsefulDngInfo(bool enable)
{
m_isUsefulDngInfo = enable;
}
bool ExynosCameraParameters::getIsUsefulDngInfo()
{
return m_isUsefulDngInfo;
}
#endif
status_t ExynosCameraParameters::checkGpsTimeStamp(const CameraParameters& params)
{
long newGpsTimeStamp = -1;
long curGpsTimeStamp = -1;
const char *strNewGpsTimeStamp = params.get(CameraParameters::KEY_GPS_TIMESTAMP);
if (strNewGpsTimeStamp == NULL) {
m_params.remove(CameraParameters::KEY_GPS_TIMESTAMP);
m_setGpsTimeStamp(0);
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewGpsTimeStamp %s", "setParameters", strNewGpsTimeStamp);
newGpsTimeStamp = atol(strNewGpsTimeStamp);
curGpsTimeStamp = getGpsTimeStamp();
if (curGpsTimeStamp != newGpsTimeStamp) {
m_setGpsTimeStamp(newGpsTimeStamp);
m_params.set(CameraParameters::KEY_GPS_TIMESTAMP, strNewGpsTimeStamp);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGpsTimeStamp(long timeStamp)
{
m_cameraInfo.gpsTimeStamp = timeStamp;
}
long ExynosCameraParameters::getGpsTimeStamp(void)
{
return m_cameraInfo.gpsTimeStamp;
}
/* TODO: Do not used yet */
#if 0
status_t ExynosCameraParameters::checkCityId(const CameraParameters& params)
{
long long int newCityId = params.getInt64(CameraParameters::KEY_CITYID);
long long int curCityId = -1;
if (newCityId < 0)
newCityId = 0;
curCityId = getCityId();
if (curCityId != newCityId) {
m_setCityId(newCityId);
m_params.set(CameraParameters::KEY_CITYID, newCityId);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setCityId(long long int cityId)
{
m_cameraInfo.cityId = cityId;
}
long long int ExynosCameraParameters::getCityId(void)
{
return m_cameraInfo.cityId;
}
status_t ExynosCameraParameters::checkWeatherId(const CameraParameters& params)
{
int newWeatherId = params.getInt(CameraParameters::KEY_WEATHER);
int curWeatherId = -1;
if (newWeatherId < 0 || newWeatherId > 5) {
return BAD_VALUE;
}
curWeatherId = (int)getWeatherId();
if (curWeatherId != newWeatherId) {
m_setWeatherId((unsigned char)newWeatherId);
m_params.set(CameraParameters::KEY_WEATHER, newWeatherId);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setWeatherId(unsigned char weatherId)
{
m_cameraInfo.weatherId = weatherId;
}
unsigned char ExynosCameraParameters::getWeatherId(void)
{
return m_cameraInfo.weatherId;
}
#endif
/*
* Additional API.
*/
status_t ExynosCameraParameters::checkBrightness(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
} else {
int maxBrightness = params.getInt("brightness-max");
int minBrightness = params.getInt("brightness-min");
int newBrightness = params.getInt("brightness");
int curBrightness = -1;
int curEffectMode = EFFECT_NONE;
CLOGD("DEBUG(%s):newBrightness %d", "setParameters", newBrightness);
if (newBrightness < minBrightness || newBrightness > maxBrightness) {
CLOGE("ERR(%s): Invalid Brightness (Min: %d, Max: %d, Value: %d)", __FUNCTION__, minBrightness, maxBrightness, newBrightness);
return BAD_VALUE;
}
curEffectMode = getColorEffectMode();
if(curEffectMode == EFFECT_BEAUTY_FACE) {
return NO_ERROR;
}
curBrightness = getBrightness();
if (curBrightness != newBrightness) {
m_setBrightness(newBrightness);
m_params.set("brightness", newBrightness);
}
return NO_ERROR;
}
}
/* F/W's middle value is 3, and step is -2, -1, 0, 1, 2 */
void ExynosCameraParameters::m_setBrightness(int brightness)
{
setMetaCtlBrightness(&m_metadata, brightness + IS_BRIGHTNESS_DEFAULT + FW_CUSTOM_OFFSET);
}
int ExynosCameraParameters::getBrightness(void)
{
int32_t brightness = 0;
getMetaCtlBrightness(&m_metadata, &brightness);
return brightness - IS_BRIGHTNESS_DEFAULT - FW_CUSTOM_OFFSET;
}
status_t ExynosCameraParameters::checkSaturation(const CameraParameters& params)
{
int maxSaturation = params.getInt("saturation-max");
int minSaturation = params.getInt("saturation-min");
int newSaturation = params.getInt("saturation");
int curSaturation = -1;
CLOGD("DEBUG(%s):newSaturation %d", "setParameters", newSaturation);
if (newSaturation < minSaturation || newSaturation > maxSaturation) {
CLOGE("ERR(%s): Invalid Saturation (Min: %d, Max: %d, Value: %d)", __FUNCTION__, minSaturation, maxSaturation, newSaturation);
return BAD_VALUE;
}
curSaturation = getSaturation();
if (curSaturation != newSaturation) {
m_setSaturation(newSaturation);
m_params.set("saturation", newSaturation);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setSaturation(int saturation)
{
setMetaCtlSaturation(&m_metadata, saturation + IS_SATURATION_DEFAULT + FW_CUSTOM_OFFSET);
}
int ExynosCameraParameters::getSaturation(void)
{
int32_t saturation = 0;
getMetaCtlSaturation(&m_metadata, &saturation);
return saturation - IS_SATURATION_DEFAULT - FW_CUSTOM_OFFSET;
}
status_t ExynosCameraParameters::checkSharpness(const CameraParameters& params)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return NO_ERROR;
} else {
int maxSharpness = params.getInt("sharpness-max");
int minSharpness = params.getInt("sharpness-min");
int newSharpness = params.getInt("sharpness");
int curSharpness = -1;
int curEffectMode = EFFECT_NONE;
CLOGD("DEBUG(%s):newSharpness %d", "setParameters", newSharpness);
if (newSharpness < minSharpness || newSharpness > maxSharpness) {
CLOGE("ERR(%s): Invalid Sharpness (Min: %d, Max: %d, Value: %d)", __FUNCTION__, minSharpness, maxSharpness, newSharpness);
return BAD_VALUE;
}
curEffectMode = getColorEffectMode();
if(curEffectMode == EFFECT_BEAUTY_FACE
#if 0
//#ifdef SAMSUNG_FOOD_MODE
|| (getSceneMode() == SCENE_MODE_FOOD)
#endif
) {
return NO_ERROR;
}
curSharpness = getSharpness();
if (curSharpness != newSharpness) {
m_setSharpness(newSharpness);
m_params.set("sharpness", newSharpness);
}
return NO_ERROR;
}
}
void ExynosCameraParameters::m_setSharpness(int sharpness)
{
#ifdef USE_NEW_NOISE_REDUCTION_ALGORITHM
enum processing_mode default_edge_mode = PROCESSING_MODE_FAST;
enum processing_mode default_noise_mode = PROCESSING_MODE_FAST;
int default_edge_strength = 5;
int default_noise_strength = 5;
#else
enum processing_mode default_edge_mode = PROCESSING_MODE_OFF;
enum processing_mode default_noise_mode = PROCESSING_MODE_OFF;
int default_edge_strength = 0;
int default_noise_strength = 0;
#endif
int newSharpness = sharpness + IS_SHARPNESS_DEFAULT;
enum processing_mode edge_mode = default_edge_mode;
enum processing_mode noise_mode = default_noise_mode;
int edge_strength = default_edge_strength;
int noise_strength = default_noise_strength;
switch (newSharpness) {
case IS_SHARPNESS_MINUS_2:
edge_mode = default_edge_mode;
noise_mode = default_noise_mode;
edge_strength = default_edge_strength;
noise_strength = 10;
break;
case IS_SHARPNESS_MINUS_1:
edge_mode = default_edge_mode;
noise_mode = default_noise_mode;
edge_strength = default_edge_strength;
noise_strength = (10 + default_noise_strength + 1) / 2;
break;
case IS_SHARPNESS_DEFAULT:
edge_mode = default_edge_mode;
noise_mode = default_noise_mode;
edge_strength = default_edge_strength;
noise_strength = default_noise_strength;
break;
case IS_SHARPNESS_PLUS_1:
edge_mode = default_edge_mode;
noise_mode = default_noise_mode;
edge_strength = (10 + default_edge_strength + 1) / 2;
noise_strength = default_noise_strength;
break;
case IS_SHARPNESS_PLUS_2:
edge_mode = default_edge_mode;
noise_mode = default_noise_mode;
edge_strength = 10;
noise_strength = default_noise_strength;
break;
default:
break;
}
CLOGD("DEBUG(%s):newSharpness %d edge_mode(%d),st(%d), noise(%d),st(%d)",
__FUNCTION__, newSharpness, edge_mode, edge_strength, noise_mode, noise_strength);
setMetaCtlSharpness(&m_metadata, edge_mode, edge_strength, noise_mode, noise_strength);
}
int ExynosCameraParameters::getSharpness(void)
{
#ifdef USE_NEW_NOISE_REDUCTION_ALGORITHM
enum processing_mode default_edge_mode = PROCESSING_MODE_FAST;
enum processing_mode default_noise_mode = PROCESSING_MODE_FAST;
int default_edge_sharpness = 5;
int default_noise_sharpness = 5;
#else
enum processing_mode default_edge_mode = PROCESSING_MODE_OFF;
enum processing_mode default_noise_mode = PROCESSING_MODE_OFF;
int default_edge_sharpness = 0;
int default_noise_sharpness = 0;
#endif
int32_t edge_sharpness = default_edge_sharpness;
int32_t noise_sharpness = default_noise_sharpness;
int32_t sharpness = 0;
enum processing_mode edge_mode = default_edge_mode;
enum processing_mode noise_mode = default_noise_mode;
getMetaCtlSharpness(&m_metadata, &edge_mode, &edge_sharpness, &noise_mode, &noise_sharpness);
if(noise_sharpness == 10 && edge_sharpness == default_edge_sharpness) {
sharpness = IS_SHARPNESS_MINUS_2;
} else if(noise_sharpness == (10 + default_noise_sharpness + 1) / 2
&& edge_sharpness == default_edge_sharpness) {
sharpness = IS_SHARPNESS_MINUS_1;
} else if(noise_sharpness == default_noise_sharpness
&& edge_sharpness == default_edge_sharpness) {
sharpness = IS_SHARPNESS_DEFAULT;
} else if(noise_sharpness == default_noise_sharpness
&& edge_sharpness == (10 + default_edge_sharpness + 1) / 2) {
sharpness = IS_SHARPNESS_PLUS_1;
} else if(noise_sharpness == default_noise_sharpness
&& edge_sharpness == 10) {
sharpness = IS_SHARPNESS_PLUS_2;
} else {
sharpness = IS_SHARPNESS_DEFAULT;
}
return sharpness - IS_SHARPNESS_DEFAULT;
}
status_t ExynosCameraParameters::checkHue(const CameraParameters& params)
{
int maxHue = params.getInt("hue-max");
int minHue = params.getInt("hue-min");
int newHue = params.getInt("hue");
int curHue = -1;
CLOGD("DEBUG(%s):newHue %d", "setParameters", newHue);
if (newHue < minHue || newHue > maxHue) {
CLOGE("ERR(%s): Invalid Hue (Min: %d, Max: %d, Value: %d)", __FUNCTION__, minHue, maxHue, newHue);
return BAD_VALUE;
}
curHue = getHue();
if (curHue != newHue) {
m_setHue(newHue);
m_params.set("hue", newHue);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setHue(int hue)
{
setMetaCtlHue(&m_metadata, hue + IS_HUE_DEFAULT + FW_CUSTOM_OFFSET);
}
int ExynosCameraParameters::getHue(void)
{
int32_t hue = 0;
getMetaCtlHue(&m_metadata, &hue);
return hue - IS_HUE_DEFAULT - FW_CUSTOM_OFFSET;
}
#ifdef SAMSUNG_QUICKSHOT
status_t ExynosCameraParameters::checkQuickShot(const CameraParameters& params)
{
int newQshot = params.getInt("quick-shot");
int curQshot= -1;
CLOGD("DEBUG(%s):newQshot %d", "setParameters", newQshot);
if (newQshot < 0) {
CLOGE("ERR(%s): Invalid quick shot mode", __FUNCTION__, newQshot);
return BAD_VALUE;
}
curQshot = getQuickShot();
if (curQshot != newQshot) {
m_params.set("quick-shot", newQshot);
}
return NO_ERROR;
}
int ExynosCameraParameters::getQuickShot(void)
{
int32_t qshot = 0;
qshot = m_params.getInt("quick-shot");
return qshot;
}
#endif
#ifdef SAMSUNG_OIS
status_t ExynosCameraParameters::checkOIS(const CameraParameters& params)
{
enum optical_stabilization_mode newOIS = OPTICAL_STABILIZATION_MODE_OFF;
enum optical_stabilization_mode curOIS = OPTICAL_STABILIZATION_MODE_OFF;
const char *strNewOIS = params.get("ois");
int zoomLevel = getZoomLevel();
int zoomRatio = (int)getZoomRatio(zoomLevel);
if (strNewOIS == NULL) {
return NO_ERROR;
}
ALOGD("DEBUG(%s):strNewOIS %s", "setParameters", strNewOIS);
if (!strcmp(strNewOIS, "off")) {
newOIS = OPTICAL_STABILIZATION_MODE_OFF;
} else if (!strcmp(strNewOIS, "still")) {
if (getRecordingHint() == true) {
newOIS = OPTICAL_STABILIZATION_MODE_VIDEO;
} else {
if(zoomRatio >= 4000) {
newOIS = OPTICAL_STABILIZATION_MODE_STILL_ZOOM;
} else {
newOIS = OPTICAL_STABILIZATION_MODE_STILL;
}
}
} else if (!strcmp(strNewOIS, "still_zoom")) {
newOIS = OPTICAL_STABILIZATION_MODE_STILL_ZOOM;
} else if (!strcmp(strNewOIS, "video")) {
newOIS = OPTICAL_STABILIZATION_MODE_VIDEO;
} else if (!strcmp(strNewOIS, "sine_x")) {
newOIS = OPTICAL_STABILIZATION_MODE_SINE_X;
} else if (!strcmp(strNewOIS, "sine_y")) {
newOIS = OPTICAL_STABILIZATION_MODE_SINE_Y;
} else if (!strcmp(strNewOIS, "center")) {
newOIS = OPTICAL_STABILIZATION_MODE_CENTERING;
}
#ifdef SAMSUNG_OIS_VDIS
else if (!strcmp(strNewOIS, "vdis")) {
newOIS = OPTICAL_STABILIZATION_MODE_VDIS;
}
#endif
else {
ALOGE("ERR(%s):Invalid ois command(%s)", __FUNCTION__, strNewOIS);
return BAD_VALUE;
}
curOIS = getOIS();
if (curOIS != newOIS) {
ALOGD("%s set OIS, new OIS Mode = %d", __FUNCTION__, newOIS);
m_setOIS(newOIS);
m_params.set("ois", strNewOIS);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setOIS(enum optical_stabilization_mode ois)
{
m_cameraInfo.oisMode = ois;
if(getZoomActiveOn()) {
ALOGD("DEBUG(%s):zoom moving..", "setParameters");
return;
}
#if 0 // Host controlled OIS Factory Mode
if(m_oisNode) {
setOISMode();
} else {
ALOGD("Ois node is not prepared yet(%s[%d]) !!!!", __FUNCTION__, __LINE__);
m_setOISmodeSetting = true;
}
#else
setOISMode();
#ifdef SAMSUNG_OIS_VDIS
setOISCoef(0x00);
#endif
#endif
}
enum optical_stabilization_mode ExynosCameraParameters::getOIS(void)
{
return m_cameraInfo.oisMode;
}
void ExynosCameraParameters::setOISNode(ExynosCameraNode *node)
{
m_oisNode = node;
}
void ExynosCameraParameters::setOISModeSetting(bool enable)
{
m_setOISmodeSetting = enable;
}
int ExynosCameraParameters::getOISModeSetting(void)
{
return m_setOISmodeSetting;
}
void ExynosCameraParameters::setOISMode(void)
{
int ret = 0;
ALOGD("(%s[%d])set OIS Mode = %d", __FUNCTION__, __LINE__, m_cameraInfo.oisMode);
setMetaCtlOIS(&m_metadata, m_cameraInfo.oisMode);
#if 0 // Host controlled OIS Factory Mode
if (m_cameraInfo.oisMode == OPTICAL_STABILIZATION_MODE_SINE_X && m_oisNode != NULL) {
ret = m_oisNode->setControl(V4L2_CID_CAMERA_OIS_SINE_MODE, OPTICAL_STABILIZATION_MODE_SINE_X);
if (ret < 0) {
ALOGE("ERR(%s[%d]):FLITE setControl fail, ret(%d)", __FUNCTION__, __LINE__, ret);
}
} else if (m_cameraInfo.oisMode == OPTICAL_STABILIZATION_MODE_SINE_Y && m_oisNode != NULL) {
ret = m_oisNode->setControl(V4L2_CID_CAMERA_OIS_SINE_MODE, OPTICAL_STABILIZATION_MODE_SINE_Y);
if (ret < 0) {
ALOGE("ERR(%s[%d]):FLITE setControl fail, ret(%d)", __FUNCTION__, __LINE__, ret);
}
}
#endif
}
#endif
#ifdef SAMSUNG_COMPANION
status_t ExynosCameraParameters::checkRTDrc(const CameraParameters& params)
{
enum companion_drc_mode newRTDrc = COMPANION_DRC_OFF;
enum companion_drc_mode curRTDrc = COMPANION_DRC_OFF;
const char *strNewRTDrc = params.get("dynamic-range-control");
if (strNewRTDrc == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewRTDrc %s", "setParameters", strNewRTDrc);
if (!strcmp(strNewRTDrc, "off")) {
newRTDrc = COMPANION_DRC_OFF;
} else if (!strcmp(strNewRTDrc, "on")) {
newRTDrc = COMPANION_DRC_ON;
} else {
CLOGE("ERR(%s):Invalid rt drc(%s)", __FUNCTION__, strNewRTDrc);
return BAD_VALUE;
}
curRTDrc = getRTDrc();
if (curRTDrc != newRTDrc) {
m_setRTDrc(newRTDrc);
m_params.set("dynamic-range-control", strNewRTDrc);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setRTDrc(enum companion_drc_mode rtdrc)
{
setMetaCtlRTDrc(&m_metadata, rtdrc);
}
enum companion_drc_mode ExynosCameraParameters::getRTDrc(void)
{
enum companion_drc_mode mode;
getMetaCtlRTDrc(&m_metadata, &mode);
return mode;
}
status_t ExynosCameraParameters::checkPaf(const CameraParameters& params)
{
enum companion_paf_mode newPaf = COMPANION_PAF_OFF;
enum companion_paf_mode curPaf = COMPANION_PAF_OFF;
const char *strNewPaf = params.get("phase-af");
if (strNewPaf == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewPaf %s", "setParameters", strNewPaf);
#ifdef RAWDUMP_CAPTURE
newPaf = COMPANION_PAF_OFF;
#else
if (!strcmp(strNewPaf, "off")) {
newPaf = COMPANION_PAF_OFF;
} else if (!strcmp(strNewPaf, "on")) {
newPaf = COMPANION_PAF_ON;
} else {
CLOGE("ERR(%s):Invalid paf(%s)", __FUNCTION__, strNewPaf);
return BAD_VALUE;
}
#endif
curPaf = getPaf();
if (curPaf != newPaf) {
m_setPaf(newPaf);
m_params.set("phase-af", strNewPaf);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setPaf(enum companion_paf_mode paf)
{
setMetaCtlPaf(&m_metadata, paf);
}
enum companion_paf_mode ExynosCameraParameters::getPaf(void)
{
enum companion_paf_mode mode = COMPANION_PAF_OFF;
getMetaCtlPaf(&m_metadata, &mode);
return mode;
}
status_t ExynosCameraParameters::checkRTHdr(const CameraParameters& params)
{
enum companion_wdr_mode newRTHdr = COMPANION_WDR_OFF;
enum companion_wdr_mode curRTHdr = COMPANION_WDR_OFF;
const char *strNewRTHdr = params.get("rt-hdr");
if (strNewRTHdr == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewRTWdr %s", "setParameters", strNewRTHdr);
if (!strcmp(strNewRTHdr, "off")) {
newRTHdr = COMPANION_WDR_OFF;
} else if (!strcmp(strNewRTHdr, "on")) {
newRTHdr = COMPANION_WDR_ON;
} else if (!strcmp(strNewRTHdr, "auto")) {
newRTHdr = COMPANION_WDR_AUTO;
} else {
CLOGE("ERR(%s):Invalid rt wdr(%s)", __FUNCTION__, strNewRTHdr);
return BAD_VALUE;
}
curRTHdr = getRTHdr();
if (curRTHdr != newRTHdr) {
m_setRTHdr(newRTHdr);
m_params.set("rt-hdr", strNewRTHdr);
/* For Samsung SDK */
if (getPreviewRunning() == true) {
ALOGD("DEBUG(%s[%d]):setRestartPreviewChecked true", __FUNCTION__, __LINE__);
m_setRestartPreviewChecked(true);
}
}
return NO_ERROR;
}
status_t ExynosCameraParameters::checkSceneRTHdr(bool onoff)
{
if (onoff) {
m_setRTHdr(COMPANION_WDR_ON);
m_setRTDrc(COMPANION_DRC_ON);
} else {
m_setRTHdr(COMPANION_WDR_OFF);
m_setRTDrc(COMPANION_DRC_OFF);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setRTHdr(enum companion_wdr_mode rthdr)
{
setMetaCtlRTHdr(&m_metadata, rthdr);
}
enum companion_wdr_mode ExynosCameraParameters::getRTHdr(void)
{
enum companion_wdr_mode mode = COMPANION_WDR_OFF;
if (getUseCompanion() == true)
getMetaCtlRTHdr(&m_metadata, &mode);
return mode;
}
#endif
status_t ExynosCameraParameters::checkIso(const CameraParameters& params)
{
uint32_t newISO = 0;
uint32_t curISO = 0;
const char *strNewISO = params.get("iso");
if (strNewISO == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewISO %s", "setParameters", strNewISO);
if (!strcmp(strNewISO, "auto")) {
newISO = 0;
} else {
newISO = (uint32_t)atoi(strNewISO);
if (newISO == 0) {
CLOGE("ERR(%s):Invalid iso value(%s)", __FUNCTION__, strNewISO);
return BAD_VALUE;
}
}
curISO = getIso();
if (curISO != newISO) {
m_setIso(newISO);
m_params.set("iso", strNewISO);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setIso(uint32_t iso)
{
enum aa_isomode mode = AA_ISOMODE_AUTO;
if (iso == 0)
mode = AA_ISOMODE_AUTO;
else
mode = AA_ISOMODE_MANUAL;
setMetaCtlIso(&m_metadata, mode, iso);
}
uint32_t ExynosCameraParameters::getIso(void)
{
enum aa_isomode mode = AA_ISOMODE_AUTO;
uint32_t iso = 0;
getMetaCtlIso(&m_metadata, &mode, &iso);
return iso;
}
#ifdef SAMSUNG_TN_FEATURE
void ExynosCameraParameters::setParamIso(camera2_udm *udm)
{
uint32_t iso = udm->internal.vendorSpecific2[101];
ALOGI("DEBUG(%s):set exif_iso %u", __FUNCTION__, iso);
m_params.set("exif_iso", iso);
}
#endif
status_t ExynosCameraParameters::checkContrast(const CameraParameters& params)
{
uint32_t newContrast = 0;
uint32_t curContrast = 0;
const char *strNewContrast = params.get("contrast");
if (strNewContrast == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewContrast %s", "setParameters", strNewContrast);
if (!strcmp(strNewContrast, "auto"))
newContrast = IS_CONTRAST_DEFAULT;
else if (!strcmp(strNewContrast, "-2"))
newContrast = IS_CONTRAST_MINUS_2;
else if (!strcmp(strNewContrast, "-1"))
newContrast = IS_CONTRAST_MINUS_1;
else if (!strcmp(strNewContrast, "0"))
newContrast = IS_CONTRAST_DEFAULT;
else if (!strcmp(strNewContrast, "1"))
newContrast = IS_CONTRAST_PLUS_1;
else if (!strcmp(strNewContrast, "2"))
newContrast = IS_CONTRAST_PLUS_2;
else {
CLOGE("ERR(%s):Invalid contrast value(%s)", __FUNCTION__, strNewContrast);
return BAD_VALUE;
}
curContrast = getContrast();
if (curContrast != newContrast) {
m_setContrast(newContrast);
m_params.set("contrast", strNewContrast);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setContrast(uint32_t contrast)
{
setMetaCtlContrast(&m_metadata, contrast);
}
uint32_t ExynosCameraParameters::getContrast(void)
{
uint32_t contrast = 0;
getMetaCtlContrast(&m_metadata, &contrast);
return contrast;
}
status_t ExynosCameraParameters::checkHdrMode(const CameraParameters& params)
{
int newHDR = params.getInt("hdr-mode");
bool curHDR = -1;
if (newHDR < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newHDR %d", "setParameters", newHDR);
curHDR = getHdrMode();
if (curHDR != (bool)newHDR) {
m_setHdrMode((bool)newHDR);
m_params.set("hdr-mode", newHDR);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setHdrMode(bool hdr)
{
m_cameraInfo.hdrMode = hdr;
#ifdef CAMERA_GED_FEATURE
if (hdr == true)
m_setShotMode(SHOT_MODE_RICH_TONE);
else
m_setShotMode(SHOT_MODE_NORMAL);
#endif
m_activityControl->setHdrMode(hdr);
}
bool ExynosCameraParameters::getHdrMode(void)
{
return m_cameraInfo.hdrMode;
}
status_t ExynosCameraParameters::checkWdrMode(const CameraParameters& params)
{
int newWDR = params.getInt("wdr");
bool curWDR = -1;
bool toggle = false;
if (newWDR < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newWDR %d", "setParameters", newWDR);
curWDR = getWdrMode();
if (curWDR != (bool)newWDR) {
m_setWdrMode((bool)newWDR);
m_params.set("wdr", newWDR);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setWdrMode(bool wdr)
{
m_cameraInfo.wdrMode = wdr;
}
bool ExynosCameraParameters::getWdrMode(void)
{
return m_cameraInfo.wdrMode;
}
#ifdef SAMSUNG_LBP
int32_t ExynosCameraParameters::getHoldFrameCount(void)
{
if(getCameraId() == CAMERA_ID_BACK)
return MAX_LIVE_REAR_BEST_PICS;
else
return MAX_LIVE_FRONT_BEST_PICS;
}
#endif
#ifdef USE_BINNING_MODE
int ExynosCameraParameters::getBinningMode(void)
{
int ret = 0;
int vt_mode = getVtMode();
#ifdef USE_LIVE_BROADCAST
int camera_id = getCameraId();
bool plb_mode = getPLBMode();
#endif
if (m_staticInfo->vtcallSizeLutMax == 0 || m_staticInfo->vtcallSizeLut == NULL) {
ALOGV("(%s):vtCallSizeLut is NULL, can't support the binnig mode", __FUNCTION__);
return ret;
}
#ifdef SAMSUNG_COMPANION
if ((getCameraId() == CAMERA_ID_FRONT) && getUseCompanion()) {
ALOGV("(%s): Companion mode in front can't support the binning mode.(%d,%d)",
__FUNCTION__, getCameraId(), getUseCompanion());
return ret;
}
#endif
/* For VT Call with DualCamera Scenario */
if (getDualMode()
#ifdef USE_LIVE_BROADCAST_DUAL
&& (plb_mode != true || (plb_mode == true && camera_id == CAMERA_ID_FRONT))
#endif
) {
ALOGV("(%s):DualMode can't support the binnig mode.(%d,%d)", __FUNCTION__, getCameraId(), getDualMode());
return ret;
}
if (vt_mode != 3 && vt_mode > 0 && vt_mode < 5) {
ret = 1;
}
#ifdef USE_LIVE_BROADCAST
else if (plb_mode == true) {
if (camera_id == CAMERA_ID_BACK) {
ret = 1;
}
}
#endif
else {
if (m_binningProperty == true && getSamsungCamera() == false) {
ret = 1;
}
}
return ret;
}
#endif
status_t ExynosCameraParameters::checkShotMode(const CameraParameters& params)
{
int newShotMode = params.getInt("shot-mode");
int curShotMode = -1;
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
if(getSamsungCamera() == false) {
int vtMode = params.getInt("vtmode");
newShotMode = checkPropertyForShotMode(newShotMode, vtMode);
}
#endif
if (newShotMode < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newShotMode %d", "setParameters", newShotMode);
curShotMode = getShotMode();
if ((getRecordingHint() == true)
#ifdef SAMSUNG_TN_FEATURE
&& (newShotMode != SHOT_MODE_SEQUENCE) && (newShotMode != SHOT_MODE_AQUA)
#endif
#ifdef USE_FASTMOTION_CROP
&& (newShotMode != SHOT_MODE_FASTMOTION)
#endif
) {
m_setShotMode(SHOT_MODE_NORMAL);
m_params.set("shot-mode", SHOT_MODE_NORMAL);
} else if (curShotMode != newShotMode) {
m_setShotMode(newShotMode);
m_params.set("shot-mode", newShotMode);
updatePreviewFpsRange();
}
#ifdef LLS_CAPTURE
else if (m_flagLLSOn && getSceneMode() == SCENE_MODE_AUTO) {
m_setLLSShotMode();
}
#endif
return NO_ERROR;
}
void ExynosCameraParameters::m_setShotMode(int shotMode)
{
enum aa_mode mode = AA_CONTROL_AUTO;
enum aa_scene_mode sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
bool changeSceneMode = true;
switch (shotMode) {
case SHOT_MODE_DRAMA:
#ifdef SAMSUNG_DOF
case SHOT_MODE_LIGHT_TRACE:
#endif
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_DRAMA;
break;
#ifdef SAMSUNG_MAGICSHOT
case SHOT_MODE_MAGIC:
if (getCameraId() == CAMERA_ID_BACK) {
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_DRAMA;
} else {
mode = AA_CONTROL_AUTO;
sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
}
break;
#endif
case SHOT_MODE_3D_PANORAMA:
case SHOT_MODE_PANORAMA:
case SHOT_MODE_FRONT_PANORAMA:
case SHOT_MODE_INTERACTIVE:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_PANORAMA;
break;
case SHOT_MODE_NIGHT:
case SHOT_MODE_NIGHT_SCENE:
#ifdef SAMSUNG_FOOD_MODE
if (getSceneMode() == SCENE_MODE_FOOD) {
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_FOOD;
} else
#endif
{
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_LLS;
}
break;
case SHOT_MODE_ANIMATED_SCENE:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_ANIMATED;
break;
case SHOT_MODE_SPORTS:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_SPORTS;
break;
case SHOT_MODE_GOLF:
#ifdef SAMSUNG_TN_FEATURE
case SHOT_MODE_SEQUENCE:
#endif
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_GOLF;
break;
case SHOT_MODE_NORMAL:
if (getDualMode() == true) {
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_DUAL;
} else {
mode = AA_CONTROL_AUTO;
sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
}
break;
case SHOT_MODE_AUTO:
case SHOT_MODE_BEAUTY_FACE:
case SHOT_MODE_BEST_PHOTO:
case SHOT_MODE_BEST_FACE:
case SHOT_MODE_ERASER:
case SHOT_MODE_RICH_TONE:
case SHOT_MODE_STORY:
case SHOT_MODE_SELFIE_ALARM:
#ifdef SAMSUNG_DOF
case SHOT_MODE_3DTOUR:
case SHOT_MODE_OUTFOCUS:
#endif
case SHOT_MODE_FASTMOTION:
case SHOT_MODE_PRO_MODE:
mode = AA_CONTROL_AUTO;
sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
break;
case SHOT_MODE_DUAL:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_DUAL;
break;
case SHOT_MODE_AQUA:
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_AQUA;
break;
case SHOT_MODE_AUTO_PORTRAIT:
case SHOT_MODE_PET:
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
case THIRD_PARTY_BLACKBOX_MODE:
case THIRD_PARTY_VTCALL_MODE:
#endif
default:
changeSceneMode = false;
break;
}
#ifdef LLS_CAPTURE
if(m_flagLLSOn) {
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_LLS;
}
#endif
m_cameraInfo.shotMode = shotMode;
if (changeSceneMode == true)
setMetaCtlSceneMode(&m_metadata, mode, sceneMode);
}
int ExynosCameraParameters::getPreviewBufferCount(void)
{
CLOGV("DEBUG(%s):getPreviewBufferCount %d", "setParameters", m_previewBufferCount);
return m_previewBufferCount;
}
void ExynosCameraParameters::setPreviewBufferCount(int previewBufferCount)
{
m_previewBufferCount = previewBufferCount;
CLOGV("DEBUG(%s):setPreviewBufferCount %d", "setParameters", m_previewBufferCount);
return;
}
int ExynosCameraParameters::getShotMode(void)
{
return m_cameraInfo.shotMode;
}
status_t ExynosCameraParameters::checkAntiShake(const CameraParameters& params)
{
int newAntiShake = params.getInt("anti-shake");
bool curAntiShake = false;
bool toggle = false;
int curShotMode = getShotMode();
if (curShotMode != SHOT_MODE_AUTO)
return NO_ERROR;
if (newAntiShake < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newAntiShake %d", "setParameters", newAntiShake);
if (newAntiShake == 1)
toggle = true;
curAntiShake = getAntiShake();
if (curAntiShake != toggle) {
m_setAntiShake(toggle);
m_params.set("anti-shake", newAntiShake);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setAntiShake(bool toggle)
{
enum aa_mode mode = AA_CONTROL_AUTO;
enum aa_scene_mode sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
if (toggle == true) {
mode = AA_CONTROL_USE_SCENE_MODE;
sceneMode = AA_SCENE_MODE_ANTISHAKE;
}
setMetaCtlSceneMode(&m_metadata, mode, sceneMode);
m_cameraInfo.antiShake = toggle;
}
bool ExynosCameraParameters::getAntiShake(void)
{
return m_cameraInfo.antiShake;
}
status_t ExynosCameraParameters::checkVtMode(const CameraParameters& params)
{
int newVTMode = params.getInt("vtmode");
int curVTMode = -1;
CLOGD("DEBUG(%s):newVTMode %d", "setParameters", newVTMode);
/*
* VT mode
* 1: 3G vtmode (176x144, Fixed 7fps)
* 2: LTE or WIFI vtmode (640x480, Fixed 15fps)
* 3: Reserved : Smart Stay
* 4: CHINA vtmode (1280x720, Fixed 30fps)
*/
if (newVTMode == 3 || (newVTMode < 0 || newVTMode > 4)) {
newVTMode = 0;
}
curVTMode = getVtMode();
if (curVTMode != newVTMode) {
m_setVtMode(newVTMode);
m_params.set("vtmode", newVTMode);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setVtMode(int vtMode)
{
m_cameraInfo.vtMode = vtMode;
setMetaVtMode(&m_metadata, (enum camera_vt_mode)vtMode);
}
int ExynosCameraParameters::getVtMode(void)
{
return m_cameraInfo.vtMode;
}
status_t ExynosCameraParameters::checkVRMode(const CameraParameters& params)
{
int newVRMode = params.getInt("vrmode");
int curVRMode = getVRMode();
CLOGD("DEBUG(%s):newVRMode %d", "setParameters", newVRMode);
if (curVRMode != newVRMode) {
m_setVRMode(newVRMode);
m_params.set("vrmode", newVRMode);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setVRMode(int vrMode)
{
m_cameraInfo.vrMode = vrMode;
}
int ExynosCameraParameters::getVRMode(void)
{
return m_cameraInfo.vrMode;
}
#ifdef USE_LIVE_BROADCAST
void ExynosCameraParameters::setPLBMode(bool plbMode)
{
m_cameraInfo.plbMode = plbMode;
}
bool ExynosCameraParameters::getPLBMode(void)
{
return m_cameraInfo.plbMode;
}
#endif
status_t ExynosCameraParameters::checkGamma(const CameraParameters& params)
{
bool newGamma = false;
bool curGamma = false;
const char *strNewGamma = params.get("video_recording_gamma");
if (strNewGamma == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewGamma %s", "setParameters", strNewGamma);
if (!strcmp(strNewGamma, "off")) {
newGamma = false;
} else if (!strcmp(strNewGamma, "on")) {
newGamma = true;
} else {
CLOGE("ERR(%s):unmatched gamma(%s)", __FUNCTION__, strNewGamma);
return BAD_VALUE;
}
curGamma = getGamma();
if (curGamma != newGamma) {
m_setGamma(newGamma);
m_params.set("video_recording_gamma", strNewGamma);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setGamma(bool gamma)
{
m_cameraInfo.gamma = gamma;
}
bool ExynosCameraParameters::getGamma(void)
{
return m_cameraInfo.gamma;
}
status_t ExynosCameraParameters::checkSlowAe(const CameraParameters& params)
{
bool newSlowAe = false;
bool curSlowAe = false;
const char *strNewSlowAe = params.get("slow_ae");
if (strNewSlowAe == NULL) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):strNewSlowAe %s", "setParameters", strNewSlowAe);
if (!strcmp(strNewSlowAe, "off"))
newSlowAe = false;
else if (!strcmp(strNewSlowAe, "on"))
newSlowAe = true;
else {
CLOGE("ERR(%s):unmatched slow_ae(%s)", __FUNCTION__, strNewSlowAe);
return BAD_VALUE;
}
curSlowAe = getSlowAe();
if (curSlowAe != newSlowAe) {
m_setSlowAe(newSlowAe);
m_params.set("slow_ae", strNewSlowAe);
}
return NO_ERROR;
}
void ExynosCameraParameters::m_setSlowAe(bool slowAe)
{
m_cameraInfo.slowAe = slowAe;
}
bool ExynosCameraParameters::getSlowAe(void)
{
return m_cameraInfo.slowAe;
}
status_t ExynosCameraParameters::checkScalableSensorMode(const CameraParameters& params)
{
bool needScaleMode = false;
bool curScaleMode = false;
int newScaleMode = params.getInt("scale_mode");
if (newScaleMode < 0) {
return NO_ERROR;
}
CLOGD("DEBUG(%s):newScaleMode %d", "setParameters", newScaleMode);
if (isScalableSensorSupported() == true) {
needScaleMode = m_adjustScalableSensorMode(newScaleMode);
curScaleMode = getScalableSensorMode();
if (curScaleMode != needScaleMode) {
setScalableSensorMode(needScaleMode);
m_params.set("scale_mode", newScaleMode);
}
// updateHwSensorSize();
}
return NO_ERROR;
}
bool ExynosCameraParameters::isScalableSensorSupported(void)
{
return m_staticInfo->scalableSensorSupport;
}
bool ExynosCameraParameters::m_adjustScalableSensorMode(const int scaleMode)
{
bool adjustedScaleMode = false;
int pictureW = 0;
int pictureH = 0;
float pictureRatio = 0;
uint32_t minFps = 0;
uint32_t maxFps = 0;
/* If scale_mode is 1 or dual camera, scalable sensor turn on */
if (scaleMode == 1)
adjustedScaleMode = true;
if (getDualMode() == true
#ifdef USE_LIVE_BROADCAST_DUAL
&& (plb_mode != true || (plb_mode == true && camera_id == CAMERA_ID_FRONT))
#endif
) {
adjustedScaleMode = true;
}
/*
* scalable sensor only support 24 fps for 4:3 - picture size
* scalable sensor only support 15, 24, 30 fps for 16:9 - picture size
*/
getPreviewFpsRange(&minFps, &maxFps);
getPictureSize(&pictureW, &pictureH);
pictureRatio = ROUND_OFF(((float)pictureW / (float)pictureH), 2);
if (pictureRatio == 1.33f) { /* 4:3 */
if (maxFps != 24)
adjustedScaleMode = false;
} else if (pictureRatio == 1.77f) { /* 16:9 */
if ((maxFps != 15) && (maxFps != 24) && (maxFps != 30))
adjustedScaleMode = false;
} else {
adjustedScaleMode = false;
}
if (scaleMode == 1 && adjustedScaleMode == false) {
CLOGW("WARN(%s):pictureRatio(%f, %d, %d) fps(%d, %d) is not proper for scalable",
__FUNCTION__, pictureRatio, pictureW, pictureH, minFps, maxFps);
}
return adjustedScaleMode;
}
void ExynosCameraParameters::setScalableSensorMode(bool scaleMode)
{
m_cameraInfo.scalableSensorMode = scaleMode;
}
bool ExynosCameraParameters::getScalableSensorMode(void)
{
return m_cameraInfo.scalableSensorMode;
}
void ExynosCameraParameters::m_getScalableSensorSize(int *newSensorW, int *newSensorH)
{
int previewW = 0;
int previewH = 0;
*newSensorW = 1920;
*newSensorH = 1080;
/* default scalable sensor size is 1920x1080(16:9) */
getPreviewSize(&previewW, &previewH);
/* when preview size is 1440x1080(4:3), return sensor size(1920x1440) */
/* if (previewW == 1440 && previewH == 1080) { */
if ((previewW * 3 / 4) == previewH) {
*newSensorW = 1920;
*newSensorH = 1440;
}
}
status_t ExynosCameraParameters::checkImageUniqueId(__unused const CameraParameters& params)
{
const char *strCurImageUniqueId = m_params.get("imageuniqueid-value");
const char *strNewImageUniqueId = NULL;
#if defined(SAMSUNG_COMPANION) || defined(SAMSUNG_EEPROM)
if (m_romReadThreadDone != true) {
ALOGD("DEBUG(%s): checkImageUniqueId : romReadThreadDone(%d)", "setParameters", m_romReadThreadDone);
return NO_ERROR;
}
#endif
if(strCurImageUniqueId == NULL || strcmp(strCurImageUniqueId, "") == 0 || strcmp(strCurImageUniqueId, "0") == 0) {
strNewImageUniqueId = getImageUniqueId();
if (strNewImageUniqueId != NULL && strcmp(strNewImageUniqueId, "") != 0) {
ALOGD("DEBUG(%s):newImageUniqueId %s ", "setParameters", strNewImageUniqueId );
m_params.set("imageuniqueid-value", strNewImageUniqueId);
}
}
return NO_ERROR;
}
status_t ExynosCameraParameters::m_setImageUniqueId(const char *uniqueId)
{
int uniqueIdLength;
if (uniqueId == NULL) {
return BAD_VALUE;
}
memset(m_cameraInfo.imageUniqueId, 0, sizeof(m_cameraInfo.imageUniqueId));
uniqueIdLength = strlen(uniqueId);
memcpy(m_cameraInfo.imageUniqueId, uniqueId, uniqueIdLength);
return NO_ERROR;
}
const char *ExynosCameraParameters::getImageUniqueId(void)
{
#if defined(SAMSUNG_TN_FEATURE) && defined(SENSOR_FW_GET_FROM_FILE)
char *sensorfw = NULL;
char *uniqueid = NULL;
char *savePtr;
#ifdef FORCE_CAL_RELOAD
char checkcal[50];
memset(checkcal, 0, sizeof(checkcal));
#endif
sensorfw = (char *)getSensorFWFromFile(m_staticInfo, m_cameraId);
#ifdef FORCE_CAL_RELOAD
sprintf(checkcal, "%s", sensorfw);
m_calValid = m_checkCalibrationDataValid(checkcal);
#endif
if (getCameraId() == CAMERA_ID_BACK) {
uniqueid = sensorfw;
} else {
#ifdef SAMSUNG_EEPROM_FRONT
if (SAMSUNG_EEPROM_FRONT) {
uniqueid = sensorfw;
} else
#endif
{
uniqueid = strtok_r(sensorfw, " ", &savePtr);
}
}
setImageUniqueId(uniqueid);
return (const char *)m_cameraInfo.imageUniqueId;
#else
return m_cameraInfo.imageUniqueId;
#endif
}
#ifdef SAMSUNG_TN_FEATURE
void ExynosCameraParameters::setImageUniqueId(char *uniqueId)
{
memcpy(m_cameraInfo.imageUniqueId, uniqueId, sizeof(m_cameraInfo.imageUniqueId));
}
#endif
#ifdef BURST_CAPTURE
status_t ExynosCameraParameters::checkSeriesShotFilePath(const CameraParameters& params)
{
const char *seriesShotFilePath = params.get("capture-burst-filepath");
if (seriesShotFilePath != NULL) {
snprintf(m_seriesShotFilePath, sizeof(m_seriesShotFilePath), "%s", seriesShotFilePath);
CLOGD("DEBUG(%s): seriesShotFilePath %s", "setParameters", seriesShotFilePath);
m_params.set("capture-burst-filepath", seriesShotFilePath);
} else {
CLOGD("DEBUG(%s): seriesShotFilePath NULL", "setParameters");
memset(m_seriesShotFilePath, 0, CAMERA_FILE_PATH_SIZE);
}
return NO_ERROR;
}
#endif
status_t ExynosCameraParameters::checkSeriesShotMode(const CameraParameters& params)
{
#ifndef SAMSUNG_TN_FEATURE
int burstCount = params.getInt("burst-capture");
int bestCount = params.getInt("best-capture");
CLOGD("DEBUG(%s): burstCount(%d), bestCount(%d)", "setParameters", burstCount, bestCount);
if (burstCount < 0 || bestCount < 0) {
CLOGE("ERR(%s[%d]): Invalid burst-capture count(%d), best-capture count(%d)", __FUNCTION__, __LINE__, burstCount, bestCount);
return BAD_VALUE;
}
/* TODO: select shot count */
if (bestCount > burstCount) {
m_setSeriesShotCount(bestCount);
m_params.set("burst-capture", 0);
m_params.set("best-capture", bestCount);
} else {
m_setSeriesShotCount(burstCount);
m_params.set("burst-capture", burstCount);
m_params.set("best-capture", 0);
}
#endif
return NO_ERROR;
}
#ifdef SAMSUNG_LLV
status_t ExynosCameraParameters::checkLLV(const CameraParameters& params)
{
int mode = params.getInt("llv_mode");
int prev_mode = m_params.getInt("llv_mode");
if (mode != prev_mode) {
CLOGW("[PARM_DBG] new LLV mode : %d ", mode);
setLLV(mode);
m_params.set("llv_mode", mode);
} else {
CLOGD("%s: No value change in LLV mode : %d", __FUNCTION__, mode);
}
return NO_ERROR;
}
#endif
#ifdef SAMSUNG_DOF
status_t ExynosCameraParameters::checkMoveLens(const CameraParameters& params)
{
const char *newStrMoveLens = params.get("focus-bracketing-values");
const char *curStrMoveLens = m_params.get("focus-bracketing-values");
if(newStrMoveLens != NULL) {
CLOGD("[DOF][%s][%d] string : %s", "checkMoveLens", __LINE__, newStrMoveLens);
}
else {
memset(m_cameraInfo.lensPosTbl, 0, sizeof(m_cameraInfo.lensPosTbl));
return NO_ERROR;
}
if(SHOT_MODE_OUTFOCUS != getShotMode())
return NO_ERROR;
CLOGD("[DOF][PARM_DBG] new Lens position : %s ", newStrMoveLens);
char *start;
char *end;
char delim = ',';
int N = 6; // max count is 5 (+ number of value)
if (newStrMoveLens != NULL) {
start = (char *)newStrMoveLens;
for(int i = 1; i < N; i++) {
m_cameraInfo.lensPosTbl[i] = (int) strtol(start, &end, 10);
CLOGD("[DOF][%s][%d] lensPosTbl[%d] : %d",
"checkMoveLens", __LINE__, i, m_cameraInfo.lensPosTbl[i]);
if(*end != delim) {
m_cameraInfo.lensPosTbl[0] = i; // Total Count
CLOGD("[DOF][%s][%d] lensPosTbl[0] : %d", "checkMoveLens", __LINE__, i);
break;
}
start = end+1;
}
}
m_params.set("focus-bracketing-values", newStrMoveLens);
return NO_ERROR;
}
int ExynosCameraParameters::getMoveLensTotal(void)
{
return m_cameraInfo.lensPosTbl[0];
}
void ExynosCameraParameters::setMoveLensTotal(int count)
{
m_cameraInfo.lensPosTbl[0] = count;
}
void ExynosCameraParameters::setMoveLensCount(int count)
{
m_curLensCount = count;
CLOGD("[DOF][%s][%d] m_curLensCount : %d",
"setMoveLensCount", __LINE__, m_curLensCount);
}
void ExynosCameraParameters::m_setLensPosition(int step)
{
CLOGD("[DOF][%s][%d] step : %d",
"m_setLensPosition", __LINE__, step);
setMetaCtlLensPos(&m_metadata, m_cameraInfo.lensPosTbl[step]);
m_curLensStep = m_cameraInfo.lensPosTbl[step];
}
#endif
#ifdef SAMSUNG_OIS_VDIS
void ExynosCameraParameters::setOISCoef(uint32_t coef)
{
setMetaCtlOISCoef(&m_metadata, coef);
}
#endif
#ifdef BURST_CAPTURE
int ExynosCameraParameters::getSeriesShotSaveLocation(void)
{
int seriesShotSaveLocation = m_seriesShotSaveLocation;
int shotMode = getShotMode();
/* GED's series shot work as callback */
#ifdef CAMERA_GED_FEATURE
seriesShotSaveLocation = BURST_SAVE_CALLBACK;
#else
if (shotMode == SHOT_MODE_BEST_PHOTO) {
seriesShotSaveLocation = BURST_SAVE_CALLBACK;
#ifdef ONE_SECOND_BURST_CAPTURE
} else if (m_cameraInfo.seriesShotMode == SERIES_SHOT_MODE_ONE_SECOND_BURST) {
seriesShotSaveLocation = BURST_SAVE_CALLBACK;
#endif
} else {
if (m_seriesShotSaveLocation == 0)
seriesShotSaveLocation = BURST_SAVE_PHONE;
else
seriesShotSaveLocation = BURST_SAVE_SDCARD;
}
#endif
return seriesShotSaveLocation;
}
void ExynosCameraParameters::setSeriesShotSaveLocation(int ssaveLocation)
{
m_seriesShotSaveLocation = ssaveLocation;
}
char *ExynosCameraParameters::getSeriesShotFilePath(void)
{
return m_seriesShotFilePath;
}
#endif
int ExynosCameraParameters::getSeriesShotDuration(void)
{
switch (m_cameraInfo.seriesShotMode) {
case SERIES_SHOT_MODE_BURST:
return NORMAL_BURST_DURATION;
case SERIES_SHOT_MODE_BEST_FACE:
return BEST_FACE_DURATION;
case SERIES_SHOT_MODE_BEST_PHOTO:
return BEST_PHOTO_DURATION;
case SERIES_SHOT_MODE_ERASER:
return ERASER_DURATION;
#ifdef SAMSUNG_MAGICSHOT
case SERIES_SHOT_MODE_MAGIC:
return MAGIC_SHOT_DURATION;
#endif
case SERIES_SHOT_MODE_SELFIE_ALARM:
return SELFIE_ALARM_DURATION;
#ifdef ONE_SECOND_BURST_CAPTURE
case SERIES_SHOT_MODE_ONE_SECOND_BURST:
return ONE_SECOND_BURST_CAPTURE_DURATION;
#endif
default:
return 0;
}
return 0;
}
int ExynosCameraParameters::getSeriesShotMode(void)
{
return m_cameraInfo.seriesShotMode;
}
void ExynosCameraParameters::setSeriesShotMode(int sshotMode, int count)
{
int sshotCount = 0;
int shotMode = getShotMode();
if (sshotMode == SERIES_SHOT_MODE_BURST) {
if (shotMode == SHOT_MODE_BEST_PHOTO) {
sshotMode = SERIES_SHOT_MODE_BEST_PHOTO;
sshotCount = 8;
} else if (shotMode == SHOT_MODE_BEST_FACE) {
sshotMode = SERIES_SHOT_MODE_BEST_FACE;
sshotCount = 5;
} else if (shotMode == SHOT_MODE_ERASER) {
sshotMode = SERIES_SHOT_MODE_ERASER;
sshotCount = 5;
}
#ifdef SAMSUNG_MAGICSHOT
else if (shotMode == SHOT_MODE_MAGIC) {
sshotMode = SERIES_SHOT_MODE_MAGIC;
if ( m_cameraId == CAMERA_ID_FRONT)
sshotCount = 16;
else
sshotCount = 32;
}
#endif
else if (shotMode == SHOT_MODE_SELFIE_ALARM) {
sshotMode = SERIES_SHOT_MODE_SELFIE_ALARM;
sshotCount = 3;
} else {
sshotMode = SERIES_SHOT_MODE_BURST;
sshotCount = MAX_SERIES_SHOT_COUNT;
}
} else if (sshotMode == SERIES_SHOT_MODE_LLS ||
sshotMode == SERIES_SHOT_MODE_SIS) {
if(count > 0) {
sshotCount = count;
} else {
sshotCount = 5;
}
#ifdef ONE_SECOND_BURST_CAPTURE
} else if (sshotMode == SERIES_SHOT_MODE_ONE_SECOND_BURST) {
sshotCount = ONE_SECOND_BURST_CAPTURE_COUNT;
#endif
}
CLOGD("DEBUG(%s[%d]: set shotmode(%d), shotCount(%d)", __FUNCTION__, __LINE__, sshotMode, sshotCount);
m_cameraInfo.seriesShotMode = sshotMode;
m_setSeriesShotCount(sshotCount);
}
void ExynosCameraParameters::m_setSeriesShotCount(int seriesShotCount)
{
m_cameraInfo.seriesShotCount = seriesShotCount;
}
int ExynosCameraParameters::getSeriesShotCount(void)
{
return m_cameraInfo.seriesShotCount;
}
void ExynosCameraParameters::setSamsungCamera(bool value)
{
String8 tempStr;
ExynosCameraActivityAutofocus *autoFocusMgr = m_activityControl->getAutoFocusMgr();
m_cameraInfo.samsungCamera = value;
autoFocusMgr->setSamsungCamera(value);
/* zoom */
if (getZoomSupported() == true) {
int maxZoom = getMaxZoomLevel();
ALOGI("INFO(%s):change MaxZoomLevel and ZoomRatio List.(%d)", __FUNCTION__, maxZoom);
if (0 < maxZoom) {
m_params.set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
if (getSmoothZoomSupported() == true)
m_params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
else
m_params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
m_params.set(CameraParameters::KEY_MAX_ZOOM, maxZoom - 1);
m_params.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
int max_zoom_ratio = (int)getMaxZoomRatio();
tempStr.setTo("");
if (getZoomRatioList(tempStr, maxZoom, max_zoom_ratio, m_staticInfo->zoomRatioList) == NO_ERROR)
m_params.set(CameraParameters::KEY_ZOOM_RATIOS, tempStr.string());
else
m_params.set(CameraParameters::KEY_ZOOM_RATIOS, "100");
m_params.set("constant-growth-rate-zoom-supported", "true");
ALOGV("INFO(%s):zoomRatioList=%s", "setDefaultParameter", tempStr.string());
} else {
m_params.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false");
m_params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
m_params.set(CameraParameters::KEY_MAX_ZOOM, ZOOM_LEVEL_0);
m_params.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
}
} else {
m_params.set(CameraParameters::KEY_ZOOM_SUPPORTED, "false");
m_params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "false");
m_params.set(CameraParameters::KEY_MAX_ZOOM, ZOOM_LEVEL_0);
m_params.set(CameraParameters::KEY_ZOOM, ZOOM_LEVEL_0);
}
}
bool ExynosCameraParameters::getSamsungCamera(void)
{
return m_cameraInfo.samsungCamera;
}
bool ExynosCameraParameters::getZoomSupported(void)
{
return m_staticInfo->zoomSupport;
}
bool ExynosCameraParameters::getSmoothZoomSupported(void)
{
return m_staticInfo->smoothZoomSupport;
}
void ExynosCameraParameters::checkHorizontalViewAngle(void)
{
m_params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, getHorizontalViewAngle());
}
void ExynosCameraParameters::setHorizontalViewAngle(int pictureW, int pictureH)
{
double pi_camera = 3.1415926f;
double distance;
double ratio;
double hViewAngle_half_rad = pi_camera / 180 * (double)m_staticInfo->horizontalViewAngle[SIZE_RATIO_16_9] / 2;
distance = ((double)m_staticInfo->maxSensorW / (double)m_staticInfo->maxSensorH * 9 / 2)
/ tan(hViewAngle_half_rad);
ratio = (double)pictureW / (double)pictureH;
m_calculatedHorizontalViewAngle = (float)(atan(ratio * 9 / 2 / distance) * 2 * 180 / pi_camera);
}
float ExynosCameraParameters::getHorizontalViewAngle(void)
{
int right_ratio = 177;
if ((int)(m_staticInfo->maxSensorW * 100 / m_staticInfo->maxSensorH) == right_ratio) {
return m_calculatedHorizontalViewAngle;
} else {
return m_staticInfo->horizontalViewAngle[m_cameraInfo.pictureSizeRatioId];
}
}
float ExynosCameraParameters::getVerticalViewAngle(void)
{
return m_staticInfo->verticalViewAngle;
}
void ExynosCameraParameters::getFnumber(int *num, int *den)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
*num = m_staticInfo->fNumber * COMMON_DENOMINATOR;
*den = COMMON_DENOMINATOR;
} else {
*num = m_staticInfo->fNumberNum;
*den = m_staticInfo->fNumberDen;
}
}
void ExynosCameraParameters::getApertureValue(int *num, int *den)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
*num = m_staticInfo->aperture * COMMON_DENOMINATOR;
*den = COMMON_DENOMINATOR;
} else {
*num = m_staticInfo->apertureNum;
*den = m_staticInfo->apertureDen;
}
}
int ExynosCameraParameters::getFocalLengthIn35mmFilm(void)
{
return m_staticInfo->focalLengthIn35mmLength;
}
void ExynosCameraParameters::getFocalLength(int *num, int *den)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
*num = m_staticInfo->focalLength * COMMON_DENOMINATOR;
*den = COMMON_DENOMINATOR;
} else {
*num = m_staticInfo->focalLengthNum;
*den = m_staticInfo->focalLengthDen;
}
}
void ExynosCameraParameters::getFocusDistances(int *num, int *den)
{
*num = m_staticInfo->focusDistanceNum;
*den = m_staticInfo->focusDistanceDen;
}
int ExynosCameraParameters::getMinExposureCompensation(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return m_staticInfo->exposureCompensationRange[MIN];
} else {
return m_staticInfo->minExposureCompensation;
}
}
int ExynosCameraParameters::getMaxExposureCompensation(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return m_staticInfo->exposureCompensationRange[MAX];
} else {
return m_staticInfo->maxExposureCompensation;
}
}
int ExynosCameraParameters::getMinExposureTime(void)
{
return m_staticInfo->minExposureTime;
}
int ExynosCameraParameters::getMaxExposureTime(void)
{
return m_staticInfo->maxExposureTime;
}
int64_t ExynosCameraParameters::getSensorMinExposureTime(void)
{
return m_staticInfo->exposureTimeRange[MIN];
}
int64_t ExynosCameraParameters::getSensorMaxExposureTime(void)
{
return m_staticInfo->exposureTimeRange[MAX];
}
int ExynosCameraParameters::getMinWBK(void)
{
return m_staticInfo->minWBK;
}
int ExynosCameraParameters::getMaxWBK(void)
{
return m_staticInfo->maxWBK;
}
float ExynosCameraParameters::getExposureCompensationStep(void)
{
return m_staticInfo->exposureCompensationStep;
}
int ExynosCameraParameters::getMaxNumDetectedFaces(void)
{
return m_staticInfo->maxNumDetectedFaces;
}
uint32_t ExynosCameraParameters::getMaxNumFocusAreas(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return m_staticInfo->max3aRegions[AF];
} else {
return m_staticInfo->maxNumFocusAreas;
}
}
uint32_t ExynosCameraParameters::getMaxNumMeteringAreas(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return m_staticInfo->max3aRegions[AE];
} else {
return m_staticInfo->maxNumMeteringAreas;
}
}
int ExynosCameraParameters::getMaxZoomLevel(void)
{
int zoomLevel = 0;
int samsungCamera = getSamsungCamera();
if (samsungCamera || m_cameraId == CAMERA_ID_FRONT) {
zoomLevel = m_staticInfo->maxZoomLevel;
} else {
zoomLevel = m_staticInfo->maxBasicZoomLevel;
}
return zoomLevel;
}
float ExynosCameraParameters::getMaxZoomRatio(void)
{
return (float)m_staticInfo->maxZoomRatio;
}
float ExynosCameraParameters::getZoomRatio(int zoomLevel)
{
float zoomRatio = 1.00f;
if (getZoomSupported() == true)
zoomRatio = (float)m_staticInfo->zoomRatioList[zoomLevel];
else
zoomRatio = 1000.00f;
return zoomRatio;
}
bool ExynosCameraParameters::getVideoSnapshotSupported(void)
{
return m_staticInfo->videoSnapshotSupport;
}
bool ExynosCameraParameters::getVideoStabilizationSupported(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
bool supported = false;
for (size_t i = 0; i < m_staticInfo->videoStabilizationModesLength; i++) {
if (m_staticInfo->videoStabilizationModes[i]
== ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON) {
supported = true;
break;
}
}
return supported;
} else {
return m_staticInfo->videoStabilizationSupport;
}
}
bool ExynosCameraParameters::getAutoWhiteBalanceLockSupported(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return true;
} else {
return m_staticInfo->autoWhiteBalanceLockSupport;
}
}
bool ExynosCameraParameters::getAutoExposureLockSupported(void)
{
if (getHalVersion() == IS_HAL_VER_3_2) {
return true;
} else {
return m_staticInfo->autoExposureLockSupport;
}
}
void ExynosCameraParameters::enableMsgType(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
m_enabledMsgType |= msgType;
}
void ExynosCameraParameters::disableMsgType(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
m_enabledMsgType &= ~msgType;
}
bool ExynosCameraParameters::msgTypeEnabled(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
return (m_enabledMsgType & msgType);
}
void ExynosCameraParameters::m_initMetadata(void)
{
memset(&m_metadata, 0x00, sizeof(struct camera2_shot_ext));
struct camera2_shot *shot = &m_metadata.shot;
// 1. ctl
// request
shot->ctl.request.id = 0;
shot->ctl.request.metadataMode = METADATA_MODE_FULL;
shot->ctl.request.frameCount = 0;
// lens
shot->ctl.lens.focusDistance = -1.0f;
if (getHalVersion() == IS_HAL_VER_3_2) {
shot->ctl.lens.aperture = m_staticInfo->aperture;
shot->ctl.lens.focalLength = m_staticInfo->focalLength;
} else {
shot->ctl.lens.aperture = (float)m_staticInfo->apertureNum / (float)m_staticInfo->apertureDen;
shot->ctl.lens.focalLength = (float)m_staticInfo->focalLengthNum / (float)m_staticInfo->focalLengthDen;
}
shot->ctl.lens.filterDensity = 0.0f;
shot->ctl.lens.opticalStabilizationMode = ::OPTICAL_STABILIZATION_MODE_OFF;
int minFps = (m_staticInfo->minFps == 0) ? 0 : (m_staticInfo->maxFps / 2);
int maxFps = (m_staticInfo->maxFps == 0) ? 0 : m_staticInfo->maxFps;
/* The min fps can not be '0'. Therefore it is set up default value '15'. */
if (minFps == 0) {
CLOGW("WRN(%s): Invalid min fps value(%d)", __FUNCTION__, minFps);
minFps = 15;
}
/* The initial fps can not be '0' and bigger than '30'. Therefore it is set up default value '30'. */
if (maxFps == 0 || 30 < maxFps) {
CLOGW("WRN(%s): Invalid max fps value(%d)", __FUNCTION__, maxFps);
maxFps = 30;
}
/* sensor */
shot->ctl.sensor.exposureTime = 0;
shot->ctl.sensor.frameDuration = (1000 * 1000 * 1000) / maxFps;
shot->ctl.sensor.sensitivity = 0;
/* flash */
shot->ctl.flash.flashMode = ::CAM2_FLASH_MODE_OFF;
shot->ctl.flash.firingPower = 0;
shot->ctl.flash.firingTime = 0;
/* hotpixel */
shot->ctl.hotpixel.mode = (enum processing_mode)0;
/* demosaic */
shot->ctl.demosaic.mode = (enum demosaic_processing_mode)0;
/* noise */
#ifdef USE_NEW_NOISE_REDUCTION_ALGORITHM
shot->ctl.noise.mode = ::PROCESSING_MODE_FAST;
#else
shot->ctl.noise.mode = ::PROCESSING_MODE_OFF;
#endif
shot->ctl.noise.strength = 5;
/* shading */
shot->ctl.shading.mode = (enum processing_mode)0;
/* color */
shot->ctl.color.mode = ::COLORCORRECTION_MODE_FAST;
static const float colorTransform[9] = {
1.0f, 0.f, 0.f,
0.f, 1.f, 0.f,
0.f, 0.f, 1.f
};
if (getHalVersion() == IS_HAL_VER_3_2) {
for (size_t i = 0; i < sizeof(colorTransform)/sizeof(colorTransform[0]); i++) {
shot->ctl.color.transform[i].num = colorTransform[i] * COMMON_DENOMINATOR;
shot->ctl.color.transform[i].den = COMMON_DENOMINATOR;
}
} else {
memcpy(shot->ctl.color.transform, colorTransform, sizeof(colorTransform));
}
/* tonemap */
shot->ctl.tonemap.mode = ::TONEMAP_MODE_FAST;
static const float tonemapCurve[4] = {
0.f, 0.f,
1.f, 1.f
};
int tonemapCurveSize = sizeof(tonemapCurve);
int sizeOfCurve = sizeof(shot->ctl.tonemap.curveRed) / sizeof(shot->ctl.tonemap.curveRed[0]);
for (int i = 0; i < sizeOfCurve; i ++) {
memcpy(&(shot->ctl.tonemap.curveRed[i]), tonemapCurve, tonemapCurveSize);
memcpy(&(shot->ctl.tonemap.curveGreen[i]), tonemapCurve, tonemapCurveSize);
memcpy(&(shot->ctl.tonemap.curveBlue[i]), tonemapCurve, tonemapCurveSize);
}
/* edge */
#ifdef USE_NEW_NOISE_REDUCTION_ALGORITHM
shot->ctl.edge.mode = ::PROCESSING_MODE_FAST;
#else
shot->ctl.edge.mode = ::PROCESSING_MODE_OFF;
#endif
shot->ctl.edge.strength = 5;
/* scaler
* Max Picture Size == Max Sensor Size - Sensor Margin
*/
if (m_setParamCropRegion(0,
m_staticInfo->maxPictureW, m_staticInfo->maxPictureH,
m_staticInfo->maxPreviewW, m_staticInfo->maxPreviewH
) != NO_ERROR) {
ALOGE("ERR(%s):m_setZoom() fail", __FUNCTION__);
}
/* jpeg */
shot->ctl.jpeg.quality = 96;
shot->ctl.jpeg.thumbnailSize[0] = m_staticInfo->maxThumbnailW;
shot->ctl.jpeg.thumbnailSize[1] = m_staticInfo->maxThumbnailH;
shot->ctl.jpeg.thumbnailQuality = 100;
shot->ctl.jpeg.gpsCoordinates[0] = 0;
shot->ctl.jpeg.gpsCoordinates[1] = 0;
shot->ctl.jpeg.gpsCoordinates[2] = 0;
shot->ctl.jpeg.gpsProcessingMethod = 0;
shot->ctl.jpeg.gpsTimestamp = 0L;
shot->ctl.jpeg.orientation = 0L;
/* stats */
shot->ctl.stats.faceDetectMode = ::FACEDETECT_MODE_OFF;
shot->ctl.stats.histogramMode = ::STATS_MODE_OFF;
shot->ctl.stats.sharpnessMapMode = ::STATS_MODE_OFF;
/* aa */
shot->ctl.aa.captureIntent = ::AA_CAPTURE_INTENT_CUSTOM;
shot->ctl.aa.mode = ::AA_CONTROL_AUTO;
shot->ctl.aa.effectMode = ::AA_EFFECT_OFF;
shot->ctl.aa.sceneMode = ::AA_SCENE_MODE_FACE_PRIORITY;
shot->ctl.aa.videoStabilizationMode = (enum aa_videostabilization_mode)0;
/* default metering is center */
shot->ctl.aa.aeMode = ::AA_AEMODE_CENTER;
shot->ctl.aa.aeRegions[0] = 0;
shot->ctl.aa.aeRegions[1] = 0;
shot->ctl.aa.aeRegions[2] = 0;
shot->ctl.aa.aeRegions[3] = 0;
shot->ctl.aa.aeRegions[4] = 1000;
shot->ctl.aa.aeLock = ::AA_AE_LOCK_OFF;
#if defined(USE_SUBDIVIDED_EV)
shot->ctl.aa.aeExpCompensation = 0; /* 21 is middle */
#else
shot->ctl.aa.aeExpCompensation = 5; /* 5 is middle */
#endif
shot->ctl.aa.aeTargetFpsRange[0] = minFps;
shot->ctl.aa.aeTargetFpsRange[1] = maxFps;
shot->ctl.aa.aeAntibandingMode = ::AA_AE_ANTIBANDING_AUTO;
shot->ctl.aa.vendor_aeflashMode = ::AA_FLASHMODE_OFF;
shot->ctl.aa.awbMode = ::AA_AWBMODE_WB_AUTO;
shot->ctl.aa.awbLock = ::AA_AWB_LOCK_OFF;
shot->ctl.aa.afMode = ::AA_AFMODE_OFF;
shot->ctl.aa.afRegions[0] = 0;
shot->ctl.aa.afRegions[1] = 0;
shot->ctl.aa.afRegions[2] = 0;
shot->ctl.aa.afRegions[3] = 0;
shot->ctl.aa.afRegions[4] = 1000;
shot->ctl.aa.afTrigger = (enum aa_af_trigger)0;
shot->ctl.aa.vendor_isoMode = AA_ISOMODE_AUTO;
shot->ctl.aa.vendor_isoValue = 0;
/* 2. dm */
/* 3. utrl */
#ifdef SAMSUNG_COMPANION
m_metadata.shot.uctl.companionUd.drc_mode = COMPANION_DRC_OFF;
m_metadata.shot.uctl.companionUd.paf_mode = COMPANION_PAF_OFF;
m_metadata.shot.uctl.companionUd.wdr_mode = COMPANION_WDR_OFF;
#endif
#ifdef USE_FW_ZOOMRATIO
m_metadata.shot.uctl.zoomRatio = 1.00f;
#else
m_metadata.shot.uctl.zoomRatio = 0;
#endif
/* 4. udm */
/* 5. magicNumber */
shot->magicNumber = SHOT_MAGIC_NUMBER;
setMetaSetfile(&m_metadata, 0x0);
/* user request */
m_metadata.drc_bypass = 1;
m_metadata.dis_bypass = 1;
m_metadata.dnr_bypass = 1;
m_metadata.fd_bypass = 1;
}
status_t ExynosCameraParameters::duplicateCtrlMetadata(void *buf)
{
if (buf == NULL) {
CLOGE("ERR: buf is NULL");
return BAD_VALUE;
}
struct camera2_shot_ext *meta_shot_ext = (struct camera2_shot_ext *)buf;
memcpy(&meta_shot_ext->shot.ctl, &m_metadata.shot.ctl, sizeof(struct camera2_ctl));
#ifdef SAMSUNG_COMPANION
meta_shot_ext->shot.uctl.companionUd.wdr_mode = getRTHdr();
meta_shot_ext->shot.uctl.companionUd.paf_mode = getPaf();
#endif
#ifdef SAMSUNG_DOF
if(getShotMode() == SHOT_MODE_OUTFOCUS && m_curLensCount > 0) {
meta_shot_ext->shot.uctl.lensUd.pos = m_metadata.shot.uctl.lensUd.pos;
meta_shot_ext->shot.uctl.lensUd.posSize = m_metadata.shot.uctl.lensUd.posSize;
meta_shot_ext->shot.uctl.lensUd.direction = m_metadata.shot.uctl.lensUd.direction;
meta_shot_ext->shot.uctl.lensUd.slewRate = m_metadata.shot.uctl.lensUd.slewRate;
}
#endif
#ifdef SAMSUNG_HRM
if((getCameraId() == CAMERA_ID_BACK) && (m_metadata.shot.uctl.aaUd.hrmInfo.ir_data != 0)
&& m_flagSensorHRM_Hint) {
meta_shot_ext->shot.uctl.aaUd.hrmInfo = m_metadata.shot.uctl.aaUd.hrmInfo;
}
#endif
#ifdef SAMSUNG_LIGHT_IR
if((getCameraId() == CAMERA_ID_FRONT) && (m_metadata.shot.uctl.aaUd.illuminationInfo.visible_exptime != 0)
&& m_flagSensorLight_IR_Hint) {
meta_shot_ext->shot.uctl.aaUd.illuminationInfo = m_metadata.shot.uctl.aaUd.illuminationInfo;
}
#endif
#ifdef SAMSUNG_GYRO
if((getCameraId() == CAMERA_ID_BACK) && m_flagSensorGyroHint) {
meta_shot_ext->shot.uctl.aaUd.gyroInfo = m_metadata.shot.uctl.aaUd.gyroInfo;
}
#endif
#ifdef USE_FW_ZOOMRATIO
if(getCameraId() == CAMERA_ID_BACK) {
meta_shot_ext->shot.uctl.zoomRatio = m_metadata.shot.uctl.zoomRatio;
}
#endif
#ifdef SAMSUNG_OIS_VDIS
if(getCameraId() == CAMERA_ID_BACK) {
meta_shot_ext->shot.uctl.lensUd.oisCoefVal = m_metadata.shot.uctl.lensUd.oisCoefVal;
}
#endif
meta_shot_ext->shot.uctl.vtMode = m_metadata.shot.uctl.vtMode;
return NO_ERROR;
}
status_t ExynosCameraParameters::setFrameSkipCount(int count)
{
m_frameSkipCounter.setCount(count);
return NO_ERROR;
}
status_t ExynosCameraParameters::getFrameSkipCount(int *count)
{
*count = m_frameSkipCounter.getCount();
m_frameSkipCounter.decCount();
return NO_ERROR;
}
int ExynosCameraParameters::getFrameSkipCount(void)
{
return m_frameSkipCounter.getCount();
}
void ExynosCameraParameters::setIsFirstStartFlag(bool flag)
{
m_flagFirstStart = flag;
}
int ExynosCameraParameters::getIsFirstStartFlag(void)
{
return m_flagFirstStart;
}
ExynosCameraActivityControl *ExynosCameraParameters::getActivityControl(void)
{
return m_activityControl;
}
status_t ExynosCameraParameters::setAutoFocusMacroPosition(int autoFocusMacroPosition)
{
int oldAutoFocusMacroPosition = m_cameraInfo.autoFocusMacroPosition;
m_cameraInfo.autoFocusMacroPosition = autoFocusMacroPosition;
m_activityControl->setAutoFocusMacroPosition(oldAutoFocusMacroPosition, autoFocusMacroPosition);
return NO_ERROR;
}
status_t ExynosCameraParameters::setDisEnable(bool enable)
{
setMetaBypassDis(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCameraParameters::getDisEnable(void)
{
return m_metadata.dis_bypass;
}
status_t ExynosCameraParameters::setDrcEnable(bool enable)
{
setMetaBypassDrc(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCameraParameters::getDrcEnable(void)
{
return m_metadata.drc_bypass;
}
status_t ExynosCameraParameters::setDnrEnable(bool enable)
{
setMetaBypassDnr(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCameraParameters::getDnrEnable(void)
{
return m_metadata.dnr_bypass;
}
status_t ExynosCameraParameters::setFdEnable(bool enable)
{
setMetaBypassFd(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCameraParameters::getFdEnable(void)
{
return m_metadata.fd_bypass;
}
status_t ExynosCameraParameters::setFdMode(enum facedetect_mode mode)
{
setMetaCtlFdMode(&m_metadata, mode);
return NO_ERROR;
}
status_t ExynosCameraParameters::getFdMeta(bool reprocessing, void *buf)
{
if (buf == NULL) {
CLOGE("ERR: buf is NULL");
return BAD_VALUE;
}
struct camera2_shot_ext *meta_shot_ext = (struct camera2_shot_ext *)buf;
/* disable face detection for reprocessing frame */
if (reprocessing) {
meta_shot_ext->fd_bypass = 1;
meta_shot_ext->shot.ctl.stats.faceDetectMode = ::FACEDETECT_MODE_OFF;
}
return NO_ERROR;
}
void ExynosCameraParameters::setFlipHorizontal(int val)
{
if (val < 0) {
CLOGE("ERR(%s[%d]): setFlipHorizontal ignored, invalid value(%d)",
__FUNCTION__, __LINE__, val);
return;
}
m_cameraInfo.flipHorizontal = val;
}
int ExynosCameraParameters::getFlipHorizontal(void)
{
if (m_cameraInfo.shotMode == SHOT_MODE_FRONT_PANORAMA) {
return 0;
} else {
return m_cameraInfo.flipHorizontal;
}
}
void ExynosCameraParameters::setFlipVertical(int val)
{
if (val < 0) {
CLOGE("ERR(%s[%d]): setFlipVertical ignored, invalid value(%d)",
__FUNCTION__, __LINE__, val);
return;
}
m_cameraInfo.flipVertical = val;
}
int ExynosCameraParameters::getFlipVertical(void)
{
return m_cameraInfo.flipVertical;
}
bool ExynosCameraParameters::getCallbackNeedCSC(void)
{
bool ret = true;
#if 0 /* LSI Code */
int curShotMode = getShotMode();
switch (curShotMode) {
case SHOT_MODE_BEAUTY_FACE:
ret = false;
break;
default:
break;
}
#else
int previewW = 0, previewH = 0;
int hwPreviewW = 0, hwPreviewH = 0;
int previewFormat = getPreviewFormat();
getPreviewSize(&previewW, &previewH);
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
if ((previewW == hwPreviewW)&&
(previewH == hwPreviewH)&&
(previewFormat == V4L2_PIX_FMT_NV21)) {
ret = false;
}
#endif
return ret;
}
bool ExynosCameraParameters::getCallbackNeedCopy2Rendering(void)
{
bool ret = false;
#if 0 /* LSI Code */
int curShotMode = getShotMode();
switch (curShotMode) {
case SHOT_MODE_BEAUTY_FACE:
ret = true;
break;
default:
break;
}
#else
int previewW = 0, previewH = 0;
getPreviewSize(&previewW, &previewH);
if (previewW * previewH <= 1920*1080)
ret = true;
#endif
return ret;
}
#ifdef LLS_CAPTURE
int ExynosCameraParameters::getLLS(struct camera2_shot_ext *shot)
{
#ifdef OIS_CAPTURE
m_llsValue = shot->shot.dm.stats.vendor_LowLightMode;
#endif
#ifdef RAWDUMP_CAPTURE
return LLS_LEVEL_ZSL;
#endif
#if (LLS_VALUE_VERSION == 4)
int ret = shot->shot.dm.stats.vendor_LowLightMode;
if (m_cameraId == CAMERA_ID_FRONT) {
if (isLDCapture(m_cameraId)) {
if (m_flagLLSOn) {
ret = shot->shot.dm.stats.vendor_LowLightMode;
} else {
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_ZSL_LIKE1) {
ret = LLS_LEVEL_ZSL;
} else {
ret = shot->shot.dm.stats.vendor_LowLightMode;
}
}
}
return ret;
}
if (m_flagLLSOn) {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_FLASH_2) {
ret = LLS_LEVEL_MULTI_MERGE_INDICATOR_2;
} else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_FLASH_3) {
ret = LLS_LEVEL_MULTI_MERGE_INDICATOR_3;
} else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_FLASH_4) {
ret = LLS_LEVEL_MULTI_MERGE_INDICATOR_4;
} else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH) {
ret = LLS_LEVEL_ZSL_LIKE1;
} else {
ret = shot->shot.dm.stats.vendor_LowLightMode;
}
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_MANUAL_ISO
|| shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_SHARPEN_SINGLE) {
ret = shot->shot.dm.stats.vendor_LowLightMode;
} else {
ret = LLS_LEVEL_HIGH;
}
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
} else {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_ZSL_LIKE1;
else
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_MANUAL_ISO
|| shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_SHARPEN_SINGLE) {
ret = shot->shot.dm.stats.vendor_LowLightMode;
} else {
ret = LLS_LEVEL_HIGH;
}
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
}
ALOGV("DEBUG(%s[%d]):v4 m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d)",
__FUNCTION__, __LINE__, m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode);
return ret;
#elif (LLS_VALUE_VERSION == 3)
int ret = shot->shot.dm.stats.vendor_LowLightMode;
if (m_cameraId == CAMERA_ID_FRONT) {
return shot->shot.dm.stats.vendor_LowLightMode;
}
if (m_flagLLSOn) {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_LOW;
else
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
ret = LLS_LEVEL_HIGH;
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
} else {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_ZSL_LIKE;
else
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
ret = LLS_LEVEL_HIGH;
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
}
ALOGV("DEBUG(%s[%d]):m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d)",
__FUNCTION__, __LINE__, m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode);
return ret;
#elif (LLS_VALUE_VERSION == 2)
int ret = shot->shot.dm.stats.vendor_LowLightMode;
if (m_cameraId == CAMERA_ID_FRONT) {
return shot->shot.dm.stats.vendor_LowLightMode;
}
if (m_flagLLSOn) {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_FLASH)
ret = LLS_LEVEL_LOW;
else
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
ret = LLS_LEVEL_HIGH;
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
} else {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_ZSL_LIKE;
else
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
ret = LLS_LEVEL_HIGH;
break;
default:
ret = shot->shot.dm.stats.vendor_LowLightMode;
break;
}
}
ALOGV("DEBUG(%s[%d]):m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d)",
__FUNCTION__, __LINE__, m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode);
return ret;
#else /* not defined FLASHED_LLS_CAPTURE */
int ret = LLS_LEVEL_ZSL;
switch (getFlashMode()) {
case FLASH_MODE_OFF:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_LOW
|| shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_LOW;
else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_SIS)
ret = LLS_LEVEL_SIS;
break;
case FLASH_MODE_AUTO:
if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_LOW)
ret = LLS_LEVEL_LOW;
else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_HIGH)
ret = LLS_LEVEL_ZSL;
else if (shot->shot.dm.stats.vendor_LowLightMode == STATE_LLS_LEVEL_SIS)
ret = LLS_LEVEL_SIS;
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
default:
ret = LLS_LEVEL_ZSL;
break;
}
#if defined(LLS_NOT_USE_SIS_FRONT)
if ((getCameraId() == CAMERA_ID_FRONT) && (ret == LLS_LEVEL_SIS)) {
ret = LLS_LEVEL_ZSL;
}
#endif
ALOGV("DEBUG(%s[%d]):m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d), shotmode(%d)",
__FUNCTION__, __LINE__, m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode,getShotMode());
return ret;
#endif
}
void ExynosCameraParameters::setLLSOn(uint32_t enable)
{
m_flagLLSOn = enable;
}
bool ExynosCameraParameters::getLLSOn(void)
{
return m_flagLLSOn;
}
void ExynosCameraParameters::setLLSValue(int value)
{
m_LLSValue = value;
}
int ExynosCameraParameters::getLLSValue(void)
{
return m_LLSValue;
}
void ExynosCameraParameters::m_setLLSShotMode()
{
enum aa_mode mode = AA_CONTROL_USE_SCENE_MODE;
enum aa_scene_mode sceneMode = AA_SCENE_MODE_LLS;
setMetaCtlSceneMode(&m_metadata, mode, sceneMode);
}
#ifdef SET_LLS_CAPTURE_SETFILE
void ExynosCameraParameters::setLLSCaptureOn(bool enable)
{
m_LLSCaptureOn = enable;
}
int ExynosCameraParameters::getLLSCaptureOn()
{
return m_LLSCaptureOn;
}
#endif
#ifdef LLS_REPROCESSING
void ExynosCameraParameters::setLLSCaptureCount(int count)
{
m_LLSCaptureCount = count;
}
int ExynosCameraParameters::getLLSCaptureCount()
{
return m_LLSCaptureCount;
}
#endif
#endif
#ifdef SR_CAPTURE
void ExynosCameraParameters::setSROn(uint32_t enable)
{
m_flagSRSOn = (enable > 0) ? true : false;
}
bool ExynosCameraParameters::getSROn(void)
{
return m_flagSRSOn;
}
#endif
#ifdef OIS_CAPTURE
void ExynosCameraParameters::checkOISCaptureMode()
{
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
uint32_t lls = getLLSValue();
if (getCaptureExposureTime() > 0) {
ALOGD("DEBUG(%s[%d]: zsl-like capture mode off for manual shutter speed", __FUNCTION__, __LINE__);
setOISCaptureModeOn(false);
return;
}
if ((getRecordingHint() == true) || (getShotMode() > SHOT_MODE_AUTO && getShotMode() != SHOT_MODE_NIGHT)) {
if((getRecordingHint() == true)
|| (getShotMode() != SHOT_MODE_BEAUTY_FACE && getShotMode() != SHOT_MODE_OUTFOCUS
&& getShotMode() != SHOT_MODE_SELFIE_ALARM && getShotMode() != SHOT_MODE_PRO_MODE)) {
setOISCaptureModeOn(false);
ALOGD("DEBUG(%s[%d]: zsl-like capture mode off for special shot", __FUNCTION__, __LINE__);
return;
}
}
#ifdef SR_CAPTURE
if (getSROn() == true) {
ALOGD("DEBUG(%s[%d]: zsl-like multi capture mode off (SR mode)", __FUNCTION__, __LINE__);
setOISCaptureModeOn(false);
return;
}
#endif
if (getSeriesShotMode() == SERIES_SHOT_MODE_NONE && m_flashMgr->getNeedCaptureFlash()) {
setOISCaptureModeOn(false);
ALOGD("DEBUG(%s[%d]: zsl-like capture mode off for flash single capture", __FUNCTION__, __LINE__);
return;
}
#ifdef FLASHED_LLS_CAPTURE
if (m_flashMgr->getNeedCaptureFlash() == true && getSeriesShotMode()== SERIES_SHOT_MODE_LLS) {
ALOGD("DEBUG(%s[%d]: zsl-like flash lls capture mode on, lls(%d)", __FUNCTION__, __LINE__, m_llsValue);
setOISCaptureModeOn(true);
return;
}
#endif
if (getSeriesShotCount() > 0 && m_llsValue > 0) {
ALOGD("DEBUG(%s[%d]: zsl-like multi capture mode on, lls(%d)", __FUNCTION__, __LINE__, m_llsValue);
setOISCaptureModeOn(true);
return;
}
ALOGD("DEBUG(%s[%d]: Low Light value(%d), m_flagLLSOn(%d),getFlashMode(%d)",
__FUNCTION__, __LINE__, lls, m_flagLLSOn, getFlashMode());
if (m_flagLLSOn) {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
case FLASH_MODE_OFF:
if (lls == LLS_LEVEL_ZSL_LIKE || lls == LLS_LEVEL_LOW || lls == LLS_LEVEL_FLASH
#ifdef SAMSUNG_LLS_DEBLUR
|| lls == LLS_LEVEL_ZSL_LIKE1
|| (lls >= LLS_LEVEL_MULTI_MERGE_2 && lls <= LLS_LEVEL_MULTI_MERGE_INDICATOR_4)
|| lls == LLS_LEVEL_DUMMY
#endif
) {
setOISCaptureModeOn(true);
}
break;
case FLASH_MODE_ON:
case FLASH_MODE_TORCH:
case FLASH_MODE_RED_EYE:
if (lls == LLS_LEVEL_FLASH) {
setOISCaptureModeOn(true);
}
break;
default:
setOISCaptureModeOn(false);
break;
}
}else {
switch (getFlashMode()) {
case FLASH_MODE_AUTO:
if ((lls == LLS_LEVEL_ZSL_LIKE || lls == LLS_LEVEL_ZSL_LIKE1)
&& m_flashMgr->getNeedFlash() == false) {
setOISCaptureModeOn(true);
}
break;
case FLASH_MODE_OFF:
if (lls == LLS_LEVEL_ZSL_LIKE || lls == LLS_LEVEL_ZSL_LIKE1) {
setOISCaptureModeOn(true);
}
break;
default:
setOISCaptureModeOn(false);
break;
}
}
}
void ExynosCameraParameters::setOISCaptureModeOn(bool enable)
{
m_flagOISCaptureOn = enable;
}
bool ExynosCameraParameters::getOISCaptureModeOn(void)
{
return m_flagOISCaptureOn;
}
#endif
#ifdef RAWDUMP_CAPTURE
void ExynosCameraParameters::setRawCaptureModeOn(bool enable)
{
m_flagRawCaptureOn = enable;
}
bool ExynosCameraParameters::getRawCaptureModeOn(void)
{
return m_flagRawCaptureOn;
}
#endif
#ifdef SAMSUNG_DNG
void ExynosCameraParameters::setDNGCaptureModeOn(bool enable)
{
m_flagDNGCaptureOn = enable;
}
bool ExynosCameraParameters::getDNGCaptureModeOn(void)
{
return m_flagDNGCaptureOn;
}
void ExynosCameraParameters::setUseDNGCapture(bool enable)
{
m_use_DNGCapture = enable;
}
bool ExynosCameraParameters::getUseDNGCapture(void)
{
return m_use_DNGCapture;
}
void ExynosCameraParameters::setCheckMultiFrame(bool enable)
{
m_flagMultiFrame = enable;
}
bool ExynosCameraParameters::getCheckMultiFrame(void)
{
return m_flagMultiFrame;
}
#endif
#ifdef SAMSUNG_LLS_DEBLUR
void ExynosCameraParameters::checkLDCaptureMode()
{
ExynosCameraActivityFlash *m_flashMgr = m_activityControl->getFlashMgr();
m_flagLDCaptureMode = MULTI_SHOT_MODE_NONE;
m_LDCaptureCount = 0;
uint32_t lls = getLLSValue();
int zoomLevel = getZoomLevel();
float zoomRatio = getZoomRatio(zoomLevel) / 1000;
if (m_cameraId == CAMERA_ID_FRONT &&
((getRecordingHint() == true)
|| (getDualMode() == true)
|| (getShotMode() > SHOT_MODE_AUTO && getShotMode() != SHOT_MODE_NIGHT))) {
ALOGD("DEBUG(%s[%d]: LLS Deblur capture mode off for special shot", __FUNCTION__, __LINE__);
m_flagLDCaptureMode = MULTI_SHOT_MODE_NONE;
setLDCaptureCount(0);
setLDCaptureLLSValue(LLS_LEVEL_ZSL);
return;
}
if (m_cameraId == CAMERA_ID_BACK && zoomRatio >= 3.0f) {
ALOGD("DEBUG(%s[%d]: LLS Deblur capture mode off. zoomRatio(%f) LLS Value(%d)",
__FUNCTION__, __LINE__, zoomRatio, getLLSValue());
m_flagLDCaptureMode = MULTI_SHOT_MODE_NONE;
setLDCaptureCount(0);
setLDCaptureLLSValue(LLS_LEVEL_ZSL);
return;
}
if ((getOISCaptureModeOn() && m_cameraId == CAMERA_ID_BACK)
|| m_cameraId == CAMERA_ID_FRONT) {
if (lls == LLS_LEVEL_MULTI_MERGE_2 || lls == LLS_LEVEL_MULTI_PICK_2
|| lls == LLS_LEVEL_MULTI_MERGE_INDICATOR_2) {
m_flagLDCaptureMode = MULTI_SHOT_MODE_MULTI1;
setLDCaptureCount(LD_CAPTURE_COUNT_MULTI1);
} else if (lls == LLS_LEVEL_MULTI_MERGE_3 || lls == LLS_LEVEL_MULTI_PICK_3
|| lls == LLS_LEVEL_MULTI_MERGE_INDICATOR_3) {
m_flagLDCaptureMode = MULTI_SHOT_MODE_MULTI2;
setLDCaptureCount(LD_CAPTURE_COUNT_MULTI2);
} else if (lls == LLS_LEVEL_MULTI_MERGE_4 || lls == LLS_LEVEL_MULTI_PICK_4
|| lls == LLS_LEVEL_MULTI_MERGE_INDICATOR_4) {
m_flagLDCaptureMode = MULTI_SHOT_MODE_MULTI3;
setLDCaptureCount(LD_CAPTURE_COUNT_MULTI3);
}
#ifdef SAMSUNG_DEBLUR
else if (lls == LLS_LEVEL_DUMMY) {
m_flagLDCaptureMode = MULTI_SHOT_MODE_DEBLUR;
setLDCaptureCount(DEBLUR_CAPTURE_COUNT);
}
#endif
else {
m_flagLDCaptureMode = MULTI_SHOT_MODE_NONE;
setLDCaptureCount(0);
}
}
setLDCaptureLLSValue(lls);
#ifdef SET_LLS_CAPTURE_SETFILE
if (m_cameraId == CAMERA_ID_BACK
&& (m_flagLDCaptureMode > MULTI_SHOT_MODE_NONE) && (m_flagLDCaptureMode <= MULTI_SHOT_MODE_MULTI3)) {
CLOGD("DEBUG(%s[%d]): set LLS Capture mode on. lls value(%d)", __FUNCTION__, __LINE__, getLLSValue());
setLLSCaptureOn(true);
}
#endif
}
void ExynosCameraParameters::setLDCaptureMode(int LDMode)
{
m_flagLDCaptureMode = LDMode;
}
int ExynosCameraParameters::getLDCaptureMode(void)
{
return m_flagLDCaptureMode;
}
void ExynosCameraParameters::setLDCaptureLLSValue(uint32_t lls)
{
m_flagLDCaptureLLSValue = lls;
}
int ExynosCameraParameters::getLDCaptureLLSValue(void)
{
return m_flagLDCaptureLLSValue;
}
void ExynosCameraParameters::setLDCaptureCount(int count)
{
m_LDCaptureCount = count;
}
int ExynosCameraParameters::getLDCaptureCount(void)
{
return m_LDCaptureCount;
}
#endif
bool ExynosCameraParameters::setDeviceOrientation(int orientation)
{
if (orientation < 0 || orientation % 90 != 0) {
CLOGE("ERR(%s[%d]):Invalid orientation (%d)",
__FUNCTION__, __LINE__, orientation);
return false;
}
m_cameraInfo.deviceOrientation = orientation;
/* fd orientation need to be calibrated, according to f/w spec */
int hwRotation = BACK_ROTATION;
#if 0
if (this->getCameraId() == CAMERA_ID_FRONT)
hwRotation = FRONT_ROTATION;
#endif
int fdOrientation = (orientation + hwRotation) % 360;
CLOGD("DEBUG(%s[%d]):orientation(%d), hwRotation(%d), fdOrientation(%d)",
__FUNCTION__, __LINE__, orientation, hwRotation, fdOrientation);
return true;
}
int ExynosCameraParameters::getDeviceOrientation(void)
{
return m_cameraInfo.deviceOrientation;
}
int ExynosCameraParameters::getFdOrientation(void)
{
return (m_cameraInfo.deviceOrientation + BACK_ROTATION) % 360;;
}
void ExynosCameraParameters::getSetfileYuvRange(bool flagReprocessing, int *setfile, int *yuvRange)
{
if (flagReprocessing == true) {
*setfile = m_setfileReprocessing;
*yuvRange = m_yuvRangeReprocessing;
} else {
*setfile = m_setfile;
*yuvRange = m_yuvRange;
}
}
status_t ExynosCameraParameters::checkSetfileYuvRange(void)
{
int oldSetFile = m_setfile;
int oldYUVRange = m_yuvRange;
/* general */
m_getSetfileYuvRange(false, &m_setfile, &m_yuvRange);
/* reprocessing */
m_getSetfileYuvRange(true, &m_setfileReprocessing, &m_yuvRangeReprocessing);
CLOGD("DEBUG(%s[%d]):m_cameraId(%d) : general[setfile(%d) YUV range(%d)] : reprocesing[setfile(%d) YUV range(%d)]",
__FUNCTION__, __LINE__,
m_cameraId,
m_setfile, m_yuvRange,
m_setfileReprocessing, m_yuvRangeReprocessing);
return NO_ERROR;
}
void ExynosCameraParameters::setSetfileYuvRange(void)
{
/* reprocessing */
m_getSetfileYuvRange(true, &m_setfileReprocessing, &m_yuvRangeReprocessing);
ALOGD("DEBUG(%s[%d]):m_cameraId(%d) : general[setfile(%d) YUV range(%d)] : reprocesing[setfile(%d) YUV range(%d)]",
__FUNCTION__, __LINE__,
m_cameraId,
m_setfile, m_yuvRange,
m_setfileReprocessing, m_yuvRangeReprocessing);
}
void ExynosCameraParameters::m_getSetfileYuvRange(bool flagReprocessing, int *setfile, int *yuvRange)
{
uint32_t currentSetfile = 0;
uint32_t stateReg = 0;
int flagYUVRange = YUV_FULL_RANGE;
unsigned int minFps = 0;
unsigned int maxFps = 0;
getPreviewFpsRange(&minFps, &maxFps);
#ifdef SAMSUNG_COMPANION
if (getRTHdr() == COMPANION_WDR_ON) {
stateReg |= STATE_REG_RTHDR_ON;
} else if (getRTHdr() == COMPANION_WDR_AUTO) {
stateReg |= STATE_REG_RTHDR_AUTO;
}
#endif
if (m_isUHDRecordingMode() == true)
stateReg |= STATE_REG_UHD_RECORDING;
if (getDualMode() == true) {
stateReg |= STATE_REG_DUAL_MODE;
if (getDualRecordingHint() == true)
stateReg |= STATE_REG_DUAL_RECORDINGHINT;
} else {
if (getRecordingHint() == true)
stateReg |= STATE_REG_RECORDINGHINT;
}
if (flagReprocessing == true) {
stateReg |= STATE_REG_FLAG_REPROCESSING;
}
#ifdef SET_LLS_CAPTURE_SETFILE
if (flagReprocessing == true && getLLSCaptureOn())
stateReg |= STATE_REG_NEED_LLS;
#endif
#ifdef LLS_CAPTURE
if (getRTHdr() == COMPANION_WDR_AUTO && flagReprocessing == true
&& getLLSValue() == LLS_LEVEL_SHARPEN_SINGLE) {
stateReg |= STATE_REG_SHARPEN_SINGLE;
}
if (flagReprocessing == true && (getLongExposureShotCount() == 0)
&& getLLSValue() == LLS_LEVEL_MANUAL_ISO) {
stateReg |= STATE_REG_MANUAL_ISO;
}
#endif
if (getLongExposureShotCount() > 0 && flagReprocessing == true) {
stateReg |= STATE_STILL_CAPTURE_LONG;
}
#ifdef SR_CAPTURE
int zoomLevel = getZoomLevel();
float zoomRatio = getZoomRatio(zoomLevel) / 1000;
if (getRecordingHint() == false && flagReprocessing == true
#ifdef SET_LLS_CAPTURE_SETFILE
&& !getLLSCaptureOn()
#endif
&& (getLLSValue() != LLS_LEVEL_SHARPEN_SINGLE && getLLSValue() != LLS_LEVEL_MANUAL_ISO)
&& (getLongExposureShotCount() == 0)
) {
if (zoomRatio >= 3.0f && zoomRatio < 4.0f) {
stateReg |= STATE_REG_ZOOM;
ALOGV("(%s)[%d] : currentSetfile zoom",__func__, __LINE__);
} else if (zoomRatio >= 4.0f) {
if (getSROn()) {
stateReg |= STATE_REG_ZOOM_OUTDOOR;
ALOGV("(%s)[%d] : currentSetfile zoomoutdoor",__func__, __LINE__);
} else {
stateReg |= STATE_REG_ZOOM_INDOOR;
ALOGV("(%s)[%d] : currentSetfile zoomindoor",__func__, __LINE__);
}
}
}
#endif
if ((stateReg & STATE_REG_RECORDINGHINT)||
(stateReg & STATE_REG_UHD_RECORDING)||
(stateReg & STATE_REG_DUAL_RECORDINGHINT)) {
if (flagReprocessing == false) {
flagYUVRange = YUV_LIMITED_RANGE;
}
}
if (m_cameraId == CAMERA_ID_FRONT) {
int vtMode = getVtMode();
if (0 < vtMode) {
switch (vtMode) {
case 1:
currentSetfile = ISS_SUB_SCENARIO_FRONT_VT1;
if(stateReg == STATE_STILL_CAPTURE)
currentSetfile = ISS_SUB_SCENARIO_FRONT_VT1_STILL_CAPTURE;
break;
case 2:
currentSetfile = ISS_SUB_SCENARIO_FRONT_VT2;
break;
case 4:
currentSetfile = ISS_SUB_SCENARIO_FRONT_VT4;
break;
default:
currentSetfile = ISS_SUB_SCENARIO_FRONT_VT2;
break;
}
} else if (getIntelligentMode() == 1) {
currentSetfile = ISS_SUB_SCENARIO_FRONT_SMART_STAY;
} else if (getShotMode() == SHOT_MODE_FRONT_PANORAMA) {
currentSetfile = ISS_SUB_SCENARIO_FRONT_PANORAMA;
} else {
switch(stateReg) {
case STATE_STILL_PREVIEW:
#if defined(FRONT_CAMERA_USE_SAMSUNG_COMPANION)
if (!getUseCompanion())
currentSetfile = ISS_SUB_SCENARIO_FRONT_C2_OFF_STILL_PREVIEW;
else
#endif
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW;
break;
case STATE_STILL_PREVIEW_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW_WDR_ON;
break;
case STATE_STILL_PREVIEW_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW_WDR_AUTO;
break;
case STATE_VIDEO:
#if defined(FRONT_CAMERA_USE_SAMSUNG_COMPANION)
if (!getUseCompanion())
currentSetfile = ISS_SUB_SCENARIO_FRONT_C2_OFF_VIDEO;
else
#endif
currentSetfile = ISS_SUB_SCENARIO_VIDEO;
break;
case STATE_VIDEO_WDR_ON:
case STATE_UHD_VIDEO_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_VIDEO_WDR_ON;
break;
case STATE_VIDEO_WDR_AUTO:
case STATE_UHD_VIDEO_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_VIDEO_WDR_AUTO;
break;
case STATE_STILL_CAPTURE:
case STATE_VIDEO_CAPTURE:
case STATE_UHD_PREVIEW_CAPTURE:
case STATE_UHD_VIDEO_CAPTURE:
#if defined(FRONT_CAMERA_USE_SAMSUNG_COMPANION)
if (!getUseCompanion())
currentSetfile = ISS_SUB_SCENARIO_FRONT_C2_OFF_STILL_CAPTURE;
else
#endif
{
if(getHalVersion() == IS_HAL_VER_3_2) {
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW;
} else {
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE;
}
}
break;
case STATE_STILL_CAPTURE_WDR_ON:
case STATE_VIDEO_CAPTURE_WDR_ON:
case STATE_UHD_PREVIEW_CAPTURE_WDR_ON:
case STATE_UHD_VIDEO_CAPTURE_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON;
break;
case STATE_STILL_CAPTURE_WDR_AUTO:
case STATE_VIDEO_CAPTURE_WDR_AUTO:
case STATE_UHD_PREVIEW_CAPTURE_WDR_AUTO:
case STATE_UHD_VIDEO_CAPTURE_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO;
break;
case STATE_DUAL_STILL_PREVIEW:
case STATE_DUAL_STILL_CAPTURE:
case STATE_DUAL_VIDEO_CAPTURE:
currentSetfile = ISS_SUB_SCENARIO_DUAL_STILL;
break;
case STATE_DUAL_VIDEO:
currentSetfile = ISS_SUB_SCENARIO_DUAL_VIDEO;
break;
case STATE_UHD_PREVIEW:
case STATE_UHD_VIDEO:
currentSetfile = ISS_SUB_SCENARIO_UHD_30FPS;
break;
default:
ALOGD("(%s)can't define senario of setfile.(0x%4x)",__func__, stateReg);
break;
}
}
} else {
switch(stateReg) {
case STATE_STILL_PREVIEW:
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW;
break;
case STATE_STILL_PREVIEW_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW_WDR_ON;
break;
case STATE_STILL_PREVIEW_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW_WDR_AUTO;
break;
case STATE_STILL_CAPTURE:
case STATE_VIDEO_CAPTURE:
case STATE_DUAL_STILL_CAPTURE:
case STATE_DUAL_VIDEO_CAPTURE:
case STATE_UHD_PREVIEW_CAPTURE:
case STATE_UHD_VIDEO_CAPTURE:
if(getHalVersion() == IS_HAL_VER_3_2) {
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW;
} else {
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE;
}
break;
case STATE_STILL_CAPTURE_WDR_ON:
case STATE_VIDEO_CAPTURE_WDR_ON:
case STATE_UHD_PREVIEW_CAPTURE_WDR_ON:
case STATE_UHD_VIDEO_CAPTURE_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON;
break;
case STATE_STILL_CAPTURE_WDR_AUTO:
case STATE_VIDEO_CAPTURE_WDR_AUTO:
case STATE_UHD_PREVIEW_CAPTURE_WDR_AUTO:
case STATE_UHD_VIDEO_CAPTURE_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO;
break;
case STATE_VIDEO:
if (30 < minFps && 30 < maxFps) {
if (300 == minFps && 300 == maxFps) {
currentSetfile = ISS_SUB_SCENARIO_WVGA_300FPS;
} else if (60 == minFps && 60 == maxFps) {
currentSetfile = ISS_SUB_SCENARIO_FHD_60FPS;
} else if (240 == minFps && 240 == maxFps) {
currentSetfile = ISS_SUB_SCENARIO_FHD_240FPS;
} else {
currentSetfile = ISS_SUB_SCENARIO_VIDEO_HIGH_SPEED;
}
} else {
currentSetfile = ISS_SUB_SCENARIO_VIDEO;
}
break;
case STATE_VIDEO_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_VIDEO_WDR_ON;
break;
case STATE_VIDEO_WDR_AUTO:
currentSetfile = ISS_SUB_SCENARIO_VIDEO_WDR_AUTO;
break;
case STATE_DUAL_VIDEO:
currentSetfile = ISS_SUB_SCENARIO_DUAL_VIDEO;
break;
case STATE_DUAL_STILL_PREVIEW:
currentSetfile = ISS_SUB_SCENARIO_DUAL_STILL;
break;
case STATE_UHD_PREVIEW:
case STATE_UHD_VIDEO:
currentSetfile = ISS_SUB_SCENARIO_UHD_30FPS;
break;
case STATE_UHD_PREVIEW_WDR_ON:
case STATE_UHD_VIDEO_WDR_ON:
currentSetfile = ISS_SUB_SCENARIO_UHD_30FPS_WDR_ON;
break;
#ifdef SR_CAPTURE
case STATE_STILL_CAPTURE_ZOOM:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_ZOOM;
break;
case STATE_STILL_CAPTURE_ZOOM_OUTDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_ZOOM_OUTDOOR;
break;
case STATE_STILL_CAPTURE_ZOOM_INDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_ZOOM_INDOOR;
break;
case STATE_STILL_CAPTURE_WDR_ON_ZOOM:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON_ZOOM;
break;
case STATE_STILL_CAPTURE_WDR_ON_ZOOM_OUTDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON_ZOOM_OUTDOOR;
break;
case STATE_STILL_CAPTURE_WDR_ON_ZOOM_INDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON_ZOOM_INDOOR;
break;
case STATE_STILL_CAPTURE_WDR_AUTO_ZOOM:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO_ZOOM;
break;
case STATE_STILL_CAPTURE_WDR_AUTO_ZOOM_OUTDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO_ZOOM_OUTDOOR;
break;
case STATE_STILL_CAPTURE_WDR_AUTO_ZOOM_INDOOR:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO_ZOOM_INDOOR;
break;
#endif
#ifdef SET_LLS_CAPTURE_SETFILE
#if (LLS_SETFILE_VERSION == 2)
case STATE_STILL_CAPTURE_LLS:
currentSetfile = ISS_SUB_SCENARIO_MERGED_STILL_CAPTURE;
break;
case STATE_VIDEO_CAPTURE_WDR_ON_LLS:
currentSetfile = ISS_SUB_SCENARIO_MERGED_STILL_CAPTURE_WDR_ON;
break;
case STATE_STILL_CAPTURE_WDR_AUTO_LLS:
currentSetfile = ISS_SUB_SCENARIO_MERGED_STILL_CAPTURE_WDR_AUTO;
break;
#else
case STATE_STILL_CAPTURE_LLS:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_LLS;
#ifdef LLS_REPROCESSING
switch(getLLSCaptureCount()) {
case 1:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE;
break;
default:
break;
}
#endif
break;
case STATE_VIDEO_CAPTURE_WDR_ON_LLS:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON_LLS;
#ifdef LLS_REPROCESSING
switch(getLLSCaptureCount()) {
case 1:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_ON;
break;
default:
break;
}
#endif
break;
case STATE_STILL_CAPTURE_WDR_AUTO_LLS:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_LLS;
#ifdef LLS_REPROCESSING
switch(getLLSCaptureCount()) {
case 1:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_WDR_AUTO;
break;
default:
break;
}
#endif
break;
#endif
#endif
case STATE_STILL_CAPTURE_WDR_AUTO_SHARPEN:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_SHARPEN;
break;
case STATE_STILL_CAPTURE_LONG:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_LONG;
break;
case STATE_STILL_CAPTURE_MANUAL_ISO:
currentSetfile = ISS_SUB_SCENARIO_STILL_CAPTURE_MANUAL_ISO;
break;
default:
ALOGD("(%s)can't define senario of setfile.(0x%4x)",__func__, stateReg);
break;
}
}
#if 0
ALOGD("(%s)[%d] : ===============================================================================",__func__, __LINE__);
ALOGD("(%s)[%d] : CurrentState(0x%4x)",__func__, __LINE__, stateReg);
ALOGD("(%s)[%d] : getRTHdr()(%d)",__func__, __LINE__, getRTHdr());
ALOGD("(%s)[%d] : getRecordingHint()(%d)",__func__, __LINE__, getRecordingHint());
ALOGD("(%s)[%d] : m_isUHDRecordingMode()(%d)",__func__, __LINE__, m_isUHDRecordingMode());
ALOGD("(%s)[%d] : getDualMode()(%d)",__func__, __LINE__, getDualMode());
ALOGD("(%s)[%d] : getDualRecordingHint()(%d)",__func__, __LINE__, getDualRecordingHint());
ALOGD("(%s)[%d] : flagReprocessing(%d)",__func__, __LINE__, flagReprocessing);
ALOGD("(%s)[%d] : ===============================================================================",__func__, __LINE__);
ALOGD("(%s)[%d] : currentSetfile(%d)",__func__, __LINE__, currentSetfile);
ALOGD("(%s)[%d] : flagYUVRange(%d)",__func__, __LINE__, flagYUVRange);
ALOGD("(%s)[%d] : ===============================================================================",__func__, __LINE__);
#else
ALOGD("(%s)[%d] : CurrentState (0x%4x), currentSetfile(%d)",__func__, __LINE__, stateReg, currentSetfile);
#endif
done:
*setfile = currentSetfile;
*yuvRange = flagYUVRange;
}
void ExynosCameraParameters::setUseDynamicBayer(bool enable)
{
m_useDynamicBayer = enable;
}
bool ExynosCameraParameters::getUseDynamicBayer(void)
{
return m_useDynamicBayer;
}
void ExynosCameraParameters::setUseDynamicBayerVideoSnapShot(bool enable)
{
m_useDynamicBayerVideoSnapShot = enable;
}
bool ExynosCameraParameters::getUseDynamicBayerVideoSnapShot(void)
{
return m_useDynamicBayerVideoSnapShot;
}
void ExynosCameraParameters::setUseDynamicScc(bool enable)
{
m_useDynamicScc = enable;
}
bool ExynosCameraParameters::getUseDynamicScc(void)
{
bool dynamicScc = m_useDynamicScc;
bool reprocessing = isReprocessing();
if (getRecordingHint() == true && reprocessing == false)
dynamicScc = false;
return dynamicScc;
}
void ExynosCameraParameters::setUseFastenAeStable(bool enable)
{
m_useFastenAeStable = enable;
}
bool ExynosCameraParameters::getUseFastenAeStable(void)
{
return m_useFastenAeStable;
}
#ifdef SAMSUNG_LLV
void ExynosCameraParameters::setLLV(bool enable)
{
m_isLLVOn = enable;
}
bool ExynosCameraParameters::getLLV(void)
{
bool isSizeSupported = true;
int videoW, videoH;
getVideoSize(&videoW, &videoH);
if(videoW > 1920 || videoH > 1080)
isSizeSupported = false;
else {
uint32_t minFPS = 0;
uint32_t maxFPS = 0;
getPreviewFpsRange(&minFPS, &maxFPS);
if(minFPS > 30 || maxFPS > 30)
isSizeSupported = false;
}
return (m_isLLVOn && isSizeSupported);
}
#endif
status_t ExynosCameraParameters::calcPreviewGSCRect(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int previewW = 0, previewH = 0, previewFormat = 0;
int hwPreviewW = 0, hwPreviewH = 0, hwPreviewFormat = 0;
previewFormat = getPreviewFormat();
hwPreviewFormat = getHwPreviewFormat();
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
#ifdef SUPPORT_SW_VDIS
if(isSWVdisMode())
m_swVDIS_AdjustPreviewSize(&hwPreviewW, &hwPreviewH);
#endif /*SUPPORT_SW_VDIS*/
getPreviewSize(&previewW, &previewH);
ret = getCropRectAlign(hwPreviewW, hwPreviewH,
previewW, previewH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
0, 1);
srcRect->x = cropX;
srcRect->y = cropY;
srcRect->w = cropW;
srcRect->h = cropH;
if (getHalVersion() == IS_HAL_VER_3_2) {
srcRect->fullW = hwPreviewW;
srcRect->fullH = hwPreviewH;
} else {
srcRect->fullW = cropW;
srcRect->fullH = cropH;
}
srcRect->colorFormat = hwPreviewFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = previewW;
dstRect->h = previewH;
dstRect->fullW = previewW;
dstRect->fullH = previewH;
dstRect->colorFormat = previewFormat;
return NO_ERROR;
}
status_t ExynosCameraParameters::calcHighResolutionPreviewGSCRect(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int previewW = 0, previewH = 0, previewFormat = 0;
int pictureW = 0, pictureH = 0, pictureFormat = 0;
previewFormat = getPreviewFormat();
pictureFormat = getPictureFormat();
if (isOwnScc(m_cameraId) == true)
getPictureSize(&pictureW, &pictureH);
else
getHwPictureSize(&pictureW, &pictureH);
getPreviewSize(&previewW, &previewH);
srcRect->x = 0;
srcRect->y = 0;
srcRect->w = pictureW;
srcRect->h = pictureH;
srcRect->fullW = pictureW;
srcRect->fullH = pictureH;
srcRect->colorFormat = pictureFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = previewW;
dstRect->h = previewH;
dstRect->fullW = previewW;
dstRect->fullH = previewH;
dstRect->colorFormat = previewFormat;
return NO_ERROR;
}
status_t ExynosCameraParameters::calcRecordingGSCRect(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int hwPreviewW = 0, hwPreviewH = 0, hwPreviewFormat = 0;
int videoW = 0, videoH = 0, videoFormat = 0;
float zoomRatio = getZoomRatio(0) / 1000;
hwPreviewFormat = getHwPreviewFormat();
videoFormat = getVideoFormat();
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
#ifdef SUPPORT_SW_VDIS
if(isSWVdisMode())
m_swVDIS_AdjustPreviewSize(&hwPreviewW, &hwPreviewH);
#endif /*SUPPORT_SW_VDIS*/
getVideoSize(&videoW, &videoH);
if (hwPreviewW < videoW || hwPreviewH < videoH) {
cropW = hwPreviewW;
cropH = hwPreviewH;
} else {
ret = getCropRectAlign(hwPreviewW, hwPreviewH,
videoW, videoH,
&cropX, &cropY,
&cropW, &cropH,
2, 2,
0, zoomRatio);
}
srcRect->x = cropX;
srcRect->y = cropY;
srcRect->w = cropW;
srcRect->h = cropH;
srcRect->fullW = hwPreviewW;
srcRect->fullH = hwPreviewH;
srcRect->colorFormat = hwPreviewFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = videoW;
dstRect->h = videoH;
dstRect->fullW = videoW;
dstRect->fullH = videoH;
dstRect->colorFormat = videoFormat;
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPictureRect(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int hwSensorW = 0, hwSensorH = 0;
int hwPictureW = 0, hwPictureH = 0, hwPictureFormat = 0;
int pictureW = 0, pictureH = 0, pictureFormat = 0;
int previewW = 0, previewH = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int zoomLevel = 0;
int bayerFormat = getBayerFormat();
float zoomRatio = 1.0f;
/* TODO: check state ready for start */
pictureFormat = getPictureFormat();
zoomLevel = getZoomLevel();
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
/* TODO: get crop size from ctlMetadata */
ret = getCropRectAlign(hwSensorW, hwSensorH,
previewW, previewH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
zoomRatio = getZoomRatio(0) / 1000;
ret = getCropRectAlign(cropW, cropH,
pictureW, pictureH,
&crop_crop_x, &crop_crop_y,
&crop_crop_w, &crop_crop_h,
2, 2,
0, zoomRatio);
ALIGN_UP(crop_crop_x, 2);
ALIGN_UP(crop_crop_y, 2);
#if 0
ALOGD("DEBUG(%s):hwSensorSize (%dx%d), previewSize (%dx%d)",
__FUNCTION__, hwSensorW, hwSensorH, previewW, previewH);
ALOGD("DEBUG(%s):hwPictureSize (%dx%d), pictureSize (%dx%d)",
__FUNCTION__, hwPictureW, hwPictureH, pictureW, pictureH);
ALOGD("DEBUG(%s):size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, cropX, cropY, cropW, cropH, zoomLevel);
ALOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
ALOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = crop_crop_x;
srcRect->y = crop_crop_y;
srcRect->w = crop_crop_w;
srcRect->h = crop_crop_h;
srcRect->fullW = cropW;
srcRect->fullH = cropH;
srcRect->colorFormat = pictureFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = pictureW;
dstRect->h = pictureH;
dstRect->fullW = pictureW;
dstRect->fullH = pictureH;
dstRect->colorFormat = JPEG_INPUT_COLOR_FMT;
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPictureRect(int originW, int originH, ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int pictureW = 0, pictureH = 0, pictureFormat = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
float zoomRatio = getZoomRatio(0) / 1000;
#if 0
int zoom = 0;
int bayerFormat = CAMERA_BAYER_FORMAT;
#endif
/* TODO: check state ready for start */
pictureFormat = getPictureFormat();
getPictureSize(&pictureW, &pictureH);
/* TODO: get crop size from ctlMetadata */
ret = getCropRectAlign(originW, originH,
pictureW, pictureH,
&crop_crop_x, &crop_crop_y,
&crop_crop_w, &crop_crop_h,
2, 2,
0, zoomRatio);
ALIGN_UP(crop_crop_x, 2);
ALIGN_UP(crop_crop_y, 2);
#if 0
CLOGD("DEBUG(%s):originSize (%dx%d) pictureSize (%dx%d)",
__FUNCTION__, originW, originH, pictureW, pictureH);
CLOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoom);
CLOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = crop_crop_x;
srcRect->y = crop_crop_y;
srcRect->w = crop_crop_w;
srcRect->h = crop_crop_h;
srcRect->fullW = originW;
srcRect->fullH = originH;
srcRect->colorFormat = pictureFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = pictureW;
dstRect->h = pictureH;
dstRect->fullW = pictureW;
dstRect->fullH = pictureH;
dstRect->colorFormat = JPEG_INPUT_COLOR_FMT;
return NO_ERROR;
}
status_t ExynosCameraParameters::getPreviewBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int hwBnsW = 0;
int hwBnsH = 0;
int hwBcropW = 0;
int hwBcropH = 0;
int zoomLevel = 0;
float zoomRatio = 1.00f;
int sizeList[SIZE_LUT_INDEX_END];
int hwSensorMarginW = 0;
int hwSensorMarginH = 0;
float bnsRatio = 0;
/* matched ratio LUT is not existed, use equation */
if (m_useSizeTable == false
|| m_staticInfo->previewSizeLut == NULL
|| m_staticInfo->previewSizeLutMax <= m_cameraInfo.previewSizeRatioId
|| (getUsePureBayerReprocessing() == false &&
m_cameraInfo.pictureSizeRatioId != m_cameraInfo.previewSizeRatioId)
|| m_getPreviewSizeList(sizeList) != NO_ERROR)
return calcPreviewBayerCropSize(srcRect, dstRect);
/* use LUT */
hwBnsW = sizeList[BNS_W];
hwBnsH = sizeList[BNS_H];
hwBcropW = sizeList[BCROP_W];
hwBcropH = sizeList[BCROP_H];
if (getRecordingHint() == true) {
if (m_cameraInfo.previewSizeRatioId != m_cameraInfo.videoSizeRatioId) {
ALOGV("WARN(%s):preview ratioId(%d) != videoRatioId(%d), use previewRatioId",
__FUNCTION__, m_cameraInfo.previewSizeRatioId, m_cameraInfo.videoSizeRatioId);
}
}
int curBnsW = 0, curBnsH = 0;
getBnsSize(&curBnsW, &curBnsH);
if (SIZE_RATIO(curBnsW, curBnsH) != SIZE_RATIO(hwBnsW, hwBnsH))
ALOGW("ERROR(%s[%d]): current BNS size(%dx%d) is NOT same with Hw BNS size(%dx%d)",
__FUNCTION__, __LINE__, curBnsW, curBnsH, hwBnsW, hwBnsH);
zoomLevel = getZoomLevel();
zoomRatio = getZoomRatio(zoomLevel) / 1000;
/* Skip to calculate the crop size with zoom level
* Condition 1 : High-speed camcording D-zoom with External Scaler
* Condition 2 : HAL3 (Service calculates the crop size by itself
*/
int fastFpsMode = getFastFpsMode();
if ((fastFpsMode > CONFIG_MODE::HIGHSPEED_60 &&
fastFpsMode < CONFIG_MODE::MAX &&
getZoomPreviewWIthScaler() == true) ||
getHalVersion() == IS_HAL_VER_3_2) {
ALOGV("DEBUG(%s[%d]):hwBnsSize (%dx%d), hwBcropSize(%dx%d), fastFpsMode(%d)",
__FUNCTION__, __LINE__,
hwBnsW, hwBnsH,
hwBcropW, hwBcropH,
fastFpsMode);
} else {
#if defined(SCALER_MAX_SCALE_UP_RATIO)
/*
* After dividing float & casting int,
* zoomed size can be smaller too much.
* so, when zoom until max, ceil up about floating point.
*/
if (ALIGN_UP((int)((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN) * SCALER_MAX_SCALE_UP_RATIO < hwBcropW ||
ALIGN_UP((int)((float)hwBcropH / zoomRatio), 2) * SCALER_MAX_SCALE_UP_RATIO < hwBcropH) {
hwBcropW = ALIGN_UP((int)ceil((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN);
hwBcropH = ALIGN_UP((int)ceil((float)hwBcropH / zoomRatio), 2);
} else
#endif
{
hwBcropW = ALIGN_UP((int)((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN);
hwBcropH = ALIGN_UP((int)((float)hwBcropH / zoomRatio), 2);
}
}
/* Re-calculate the BNS size for removing Sensor Margin */
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
m_adjustSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
hwBnsW = hwBnsW - hwSensorMarginW;
hwBnsH = hwBnsH - hwSensorMarginH;
/* src */
srcRect->x = 0;
srcRect->y = 0;
srcRect->w = hwBnsW;
srcRect->h = hwBnsH;
if (getHalVersion() == IS_HAL_VER_3_2) {
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
int maxSensorW = 0, maxSensorH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
status_t ret = NO_ERROR;
m_getCropRegion(&cropRegionX, &cropRegionY, &cropRegionW, &cropRegionH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
/* 1. Scale down the crop region to adjust with the bcrop input size */
scaleRatioX = (float) hwBnsW / (float) maxSensorW;
scaleRatioY = (float) hwBnsH / (float) maxSensorH;
cropRegionX = (int) (cropRegionX * scaleRatioX);
cropRegionY = (int) (cropRegionY * scaleRatioY);
cropRegionW = (int) (cropRegionW * scaleRatioX);
cropRegionH = (int) (cropRegionH * scaleRatioY);
if (cropRegionW < 1 || cropRegionH < 1) {
cropRegionW = hwBnsW;
cropRegionH = hwBnsH;
}
/* 2. Calculate the real crop region with considering the target ratio */
if ((cropRegionW > hwBcropW) && (cropRegionH > hwBcropH)) {
dstRect->x = ALIGN_DOWN((cropRegionX + ((cropRegionW - hwBcropW) >> 1)), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + ((cropRegionH - hwBcropH) >> 1)), 2);
dstRect->w = hwBcropW;
dstRect->h = hwBcropH;
} else {
ret = getCropRectAlign(cropRegionW, cropRegionH,
hwBcropW, hwBcropH,
&(dstRect->x), &(dstRect->y),
&(dstRect->w), &(dstRect->h),
CAMERA_MAGIC_ALIGN, 2,
0, 0.0f);
dstRect->x = ALIGN_DOWN((cropRegionX + dstRect->x), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + dstRect->y), 2);
}
} else {
if (hwBnsW > hwBcropW) {
dstRect->x = ALIGN_UP(((hwBnsW - hwBcropW) >> 1), 2);
dstRect->w = hwBcropW;
} else {
dstRect->x = 0;
dstRect->w = hwBnsW;
}
if (hwBnsH > hwBcropH) {
dstRect->y = ALIGN_UP(((hwBnsH - hwBcropH) >> 1), 2);
dstRect->h = hwBcropH;
} else {
dstRect->y = 0;
dstRect->h = hwBnsH;
}
}
m_setHwBayerCropRegion(dstRect->w, dstRect->h, dstRect->x, dstRect->y);
#ifdef DEBUG_PERFRAME
ALOGD("DEBUG(%s):zoomLevel=%d", __FUNCTION__, zoomLevel);
ALOGD("DEBUG(%s):hwBnsSize (%dx%d), hwBcropSize (%d, %d)(%dx%d)",
__FUNCTION__, srcRect->w, srcRect->h, dstRect->x, dstRect->y, dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPreviewBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int hwSensorW = 0, hwSensorH = 0;
int hwPictureW = 0, hwPictureH = 0;
int pictureW = 0, pictureH = 0;
int previewW = 0, previewH = 0;
int hwSensorMarginW = 0, hwSensorMarginH = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
#if 0
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int pictureFormat = 0, hwPictureFormat = 0;
#endif
int zoomLevel = 0;
int maxZoomRatio = 0;
int bayerFormat = getBayerFormat();
float zoomRatio = getZoomRatio(0) / 1000;
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
#if 0
pictureFormat = getPictureFormat();
#endif
zoomLevel = getZoomLevel();
maxZoomRatio = getMaxZoomRatio() / 1000;
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
m_adjustSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
hwSensorW -= hwSensorMarginW;
hwSensorH -= hwSensorMarginH;
if (getHalVersion() == IS_HAL_VER_3_2) {
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
int maxSensorW = 0, maxSensorH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
m_getCropRegion(&cropRegionX, &cropRegionY, &cropRegionW, &cropRegionH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
/* 1. Scale down the crop region to adjust with the bcrop input size */
scaleRatioX = (float) hwSensorW / (float) maxSensorW;
scaleRatioY = (float) hwSensorH / (float) maxSensorH;
cropRegionX = (int) (cropRegionX * scaleRatioX);
cropRegionY = (int) (cropRegionY * scaleRatioY);
cropRegionW = (int) (cropRegionW * scaleRatioX);
cropRegionH = (int) (cropRegionH * scaleRatioY);
if (cropRegionW < 1 || cropRegionH < 1) {
cropRegionW = hwSensorW;
cropRegionH = hwSensorH;
}
/* 2. Calculate the real crop region with considering the target ratio */
ret = getCropRectAlign(cropRegionW, cropRegionH,
previewW, previewH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
0, 0.0f);
cropX = ALIGN_DOWN((cropRegionX + cropX), 2);
cropY = ALIGN_DOWN((cropRegionY + cropY), 2);
} else {
ret = getCropRectAlign(hwSensorW, hwSensorH,
previewW, previewH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
cropX = ALIGN_DOWN(cropX, 2);
cropY = ALIGN_DOWN(cropY, 2);
cropW = hwSensorW - (cropX * 2);
cropH = hwSensorH - (cropY * 2);
}
if (getUsePureBayerReprocessing() == false) {
int pictureCropX = 0, pictureCropY = 0;
int pictureCropW = 0, pictureCropH = 0;
zoomLevel = 0;
zoomRatio = getZoomRatio(zoomLevel) / 1000;
ret = getCropRectAlign(cropW, cropH,
pictureW, pictureH,
&pictureCropX, &pictureCropY,
&pictureCropW, &pictureCropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
pictureCropX = ALIGN_DOWN(pictureCropX, 2);
pictureCropY = ALIGN_DOWN(pictureCropY, 2);
pictureCropW = cropW - (pictureCropX * 2);
pictureCropH = cropH - (pictureCropY * 2);
if (pictureCropW < pictureW / maxZoomRatio || pictureCropH < pictureH / maxZoomRatio) {
ALOGW("WRN(%s[%d]): zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", __FUNCTION__, __LINE__, maxZoomRatio, cropW, cropH, pictureW, pictureH);
float src_ratio = 1.0f;
float dst_ratio = 1.0f;
/* ex : 1024 / 768 */
src_ratio = ROUND_OFF_HALF(((float)cropW / (float)cropH), 2);
/* ex : 352 / 288 */
dst_ratio = ROUND_OFF_HALF(((float)pictureW / (float)pictureH), 2);
if (dst_ratio <= src_ratio) {
/* shrink w */
cropX = ALIGN_DOWN(((int)(hwSensorW - ((pictureH / maxZoomRatio) * src_ratio)) >> 1), 2);
cropY = ALIGN_DOWN(((hwSensorH - (pictureH / maxZoomRatio)) >> 1), 2);
} else {
/* shrink h */
cropX = ALIGN_DOWN(((hwSensorW - (pictureW / maxZoomRatio)) >> 1), 2);
cropY = ALIGN_DOWN(((int)(hwSensorH - ((pictureW / maxZoomRatio) / src_ratio)) >> 1), 2);
}
cropW = hwSensorW - (cropX * 2);
cropH = hwSensorH - (cropY * 2);
}
}
#if 0
ALOGD("DEBUG(%s):hwSensorSize (%dx%d), previewSize (%dx%d)",
__FUNCTION__, hwSensorW, hwSensorH, previewW, previewH);
ALOGD("DEBUG(%s):hwPictureSize (%dx%d), pictureSize (%dx%d)",
__FUNCTION__, hwPictureW, hwPictureH, pictureW, pictureH);
ALOGD("DEBUG(%s):size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, cropX, cropY, cropW, cropH, zoomLevel);
ALOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
ALOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = 0;
srcRect->y = 0;
srcRect->w = hwSensorW;
srcRect->h = hwSensorH;
srcRect->fullW = hwSensorW;
srcRect->fullH = hwSensorH;
srcRect->colorFormat = bayerFormat;
dstRect->x = cropX;
dstRect->y = cropY;
dstRect->w = cropW;
dstRect->h = cropH;
dstRect->fullW = cropW;
dstRect->fullH = cropH;
dstRect->colorFormat = bayerFormat;
m_setHwBayerCropRegion(dstRect->w, dstRect->h, dstRect->x, dstRect->y);
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPreviewDzoomCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int previewW = 0, previewH = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int zoomLevel = 0;
int maxZoomRatio = 0;
float zoomRatio = getZoomRatio(0) / 1000;
/* TODO: check state ready for start */
zoomLevel = getZoomLevel();
maxZoomRatio = getMaxZoomRatio() / 1000;
getHwPreviewSize(&previewW, &previewH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
ret = getCropRectAlign(srcRect->w, srcRect->h,
previewW, previewH,
&srcRect->x, &srcRect->y,
&srcRect->w, &srcRect->h,
2, 2,
zoomLevel, zoomRatio);
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = previewW;
dstRect->h = previewH;
ALOGV("INFO(%s[%d]):SRC cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d ratio = %f", __FUNCTION__, __LINE__, srcRect->x, srcRect->y, srcRect->w, srcRect->h, zoomLevel, zoomRatio);
ALOGV("INFO(%s[%d]):DST cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d ratio = %f", __FUNCTION__, __LINE__, dstRect->x, dstRect->y, dstRect->w, dstRect->h, zoomLevel, zoomRatio);
return NO_ERROR;
}
status_t ExynosCameraParameters::getPictureBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int hwBnsW = 0;
int hwBnsH = 0;
int hwBcropW = 0;
int hwBcropH = 0;
int zoomLevel = 0;
float zoomRatio = 1.00f;
int hwSensorMarginW = 0;
int hwSensorMarginH = 0;
/* matched ratio LUT is not existed, use equation */
if (m_useSizeTable == false
|| m_staticInfo->pictureSizeLut == NULL
|| m_staticInfo->pictureSizeLutMax <= m_cameraInfo.pictureSizeRatioId
|| m_cameraInfo.pictureSizeRatioId != m_cameraInfo.previewSizeRatioId)
return calcPictureBayerCropSize(srcRect, dstRect);
/* use LUT */
hwBnsW = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BNS_W];
hwBnsH = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BNS_H];
hwBcropW = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BCROP_W];
hwBcropH = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BCROP_H];
if (getHalVersion() != IS_HAL_VER_3_2) {
#ifdef SR_CAPTURE
if(getSROn()) {
zoomLevel = ZOOM_LEVEL_0;
} else {
zoomLevel = getZoomLevel();
}
#else
zoomLevel = getZoomLevel();
#endif
zoomRatio = getZoomRatio(zoomLevel) / 1000;
#if defined(SCALER_MAX_SCALE_UP_RATIO)
/*
* After dividing float & casting int,
* zoomed size can be smaller too much.
* so, when zoom until max, ceil up about floating point.
*/
if (ALIGN_UP((int)((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN) * SCALER_MAX_SCALE_UP_RATIO < hwBcropW ||
ALIGN_UP((int)((float)hwBcropH / zoomRatio), 2) * SCALER_MAX_SCALE_UP_RATIO < hwBcropH) {
hwBcropW = ALIGN_UP((int)ceil((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN);
hwBcropH = ALIGN_UP((int)ceil((float)hwBcropH / zoomRatio), 2);
} else
#endif
{
hwBcropW = ALIGN_UP((int)((float)hwBcropW / zoomRatio), CAMERA_BCROP_ALIGN);
hwBcropH = ALIGN_UP((int)((float)hwBcropH / zoomRatio), 2);
}
}
/* Re-calculate the BNS size for removing Sensor Margin.
On Capture Stream(3AA_M2M_Input), the BNS is not used.
So, the BNS ratio is not needed to be considered for sensor margin */
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
hwBnsW = hwBnsW - hwSensorMarginW;
hwBnsH = hwBnsH - hwSensorMarginH;
/* src */
srcRect->x = 0;
srcRect->y = 0;
srcRect->w = hwBnsW;
srcRect->h = hwBnsH;
if (getHalVersion() == IS_HAL_VER_3_2) {
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
int maxSensorW = 0, maxSensorH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
status_t ret = NO_ERROR;
m_getCropRegion(&cropRegionX, &cropRegionY, &cropRegionW, &cropRegionH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
/* 1. Scale down the crop region to adjust with the bcrop input size */
scaleRatioX = (float) hwBnsW / (float) maxSensorW;
scaleRatioY = (float) hwBnsH / (float) maxSensorH;
cropRegionX = (int) (cropRegionX * scaleRatioX);
cropRegionY = (int) (cropRegionY * scaleRatioY);
cropRegionW = (int) (cropRegionW * scaleRatioX);
cropRegionH = (int) (cropRegionH * scaleRatioY);
if (cropRegionW < 1 || cropRegionH < 1) {
cropRegionW = hwBnsW;
cropRegionH = hwBnsH;
}
/* 2. Calculate the real crop region with considering the target ratio */
if ((cropRegionW > hwBcropW) && (cropRegionH > hwBcropH)) {
dstRect->x = ALIGN_DOWN((cropRegionX + ((cropRegionW - hwBcropW) >> 1)), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + ((cropRegionH - hwBcropH) >> 1)), 2);
dstRect->w = hwBcropW;
dstRect->h = hwBcropH;
} else {
ret = getCropRectAlign(cropRegionW, cropRegionH,
hwBcropW, hwBcropH,
&(dstRect->x), &(dstRect->y),
&(dstRect->w), &(dstRect->h),
CAMERA_MAGIC_ALIGN, 2,
0, 0.0f);
dstRect->x = ALIGN_DOWN((cropRegionX + dstRect->x), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + dstRect->y), 2);
}
} else {
/* dst */
if (hwBnsW > hwBcropW) {
dstRect->x = ALIGN_UP(((hwBnsW - hwBcropW) >> 1), 2);
dstRect->w = hwBcropW;
} else {
dstRect->x = 0;
dstRect->w = hwBnsW;
}
if (hwBnsH > hwBcropH) {
dstRect->y = ALIGN_UP(((hwBnsH - hwBcropH) >> 1), 2);
dstRect->h = hwBcropH;
} else {
dstRect->y = 0;
dstRect->h = hwBnsH;
}
}
#if DEBUG
ALOGD("DEBUG(%s):zoomRatio=%f", __FUNCTION__, zoomRatio);
ALOGD("DEBUG(%s):hwBnsSize (%dx%d), hwBcropSize (%d, %d)(%dx%d)",
__FUNCTION__, srcRect->w, srcRect->h, dstRect->x, dstRect->y, dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPictureBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int maxSensorW = 0, maxSensorH = 0;
int hwSensorW = 0, hwSensorH = 0;
int hwPictureW = 0, hwPictureH = 0, hwPictureFormat = 0;
int hwSensorCropX = 0, hwSensorCropY = 0;
int hwSensorCropW = 0, hwSensorCropH = 0;
int pictureW = 0, pictureH = 0, pictureFormat = 0;
int previewW = 0, previewH = 0;
int hwSensorMarginW = 0, hwSensorMarginH = 0;
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int zoomLevel = 0;
float zoomRatio = 1.0f;
int maxZoomRatio = 0;
int bayerFormat = getBayerFormat();
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
pictureFormat = getPictureFormat();
zoomLevel = getZoomLevel();
maxZoomRatio = getMaxZoomRatio() / 1000;
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
hwSensorW -= hwSensorMarginW;
hwSensorH -= hwSensorMarginH;
if (getUsePureBayerReprocessing() == true) {
if (getHalVersion() == IS_HAL_VER_3_2) {
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
m_getCropRegion(&cropRegionX, &cropRegionY, &cropRegionW, &cropRegionH);
/* 1. Scale down the crop region to adjust with the bcrop input size */
scaleRatioX = (float) hwSensorW / (float) maxSensorW;
scaleRatioY = (float) hwSensorH / (float) maxSensorH;
cropRegionX = (int) (cropRegionX * scaleRatioX);
cropRegionY = (int) (cropRegionY * scaleRatioY);
cropRegionW = (int) (cropRegionW * scaleRatioX);
cropRegionH = (int) (cropRegionH * scaleRatioY);
if (cropRegionW < 1 || cropRegionH < 1) {
cropRegionW = hwSensorW;
cropRegionH = hwSensorH;
}
ret = getCropRectAlign(cropRegionW, cropRegionH,
pictureW, pictureH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
0, 0.0f);
cropX = ALIGN_DOWN((cropRegionX + cropX), 2);
cropY = ALIGN_DOWN((cropRegionY + cropY), 2);
} else {
ret = getCropRectAlign(hwSensorW, hwSensorH,
pictureW, pictureH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
cropX = ALIGN_DOWN(cropX, 2);
cropY = ALIGN_DOWN(cropY, 2);
cropW = hwSensorW - (cropX * 2);
cropH = hwSensorH - (cropY * 2);
}
if (cropW < pictureW / maxZoomRatio || cropH < pictureH / maxZoomRatio) {
ALOGW("WRN(%s[%d]): zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", __FUNCTION__, __LINE__, maxZoomRatio, cropW, cropH, pictureW, pictureH);
cropX = ALIGN_DOWN(((hwSensorW - (pictureW / maxZoomRatio)) >> 1), 2);
cropY = ALIGN_DOWN(((hwSensorH - (pictureH / maxZoomRatio)) >> 1), 2);
cropW = hwSensorW - (cropX * 2);
cropH = hwSensorH - (cropY * 2);
}
} else {
zoomLevel = 0;
if (getHalVersion() == IS_HAL_VER_3_2)
zoomRatio = 0.0f;
else
zoomRatio = getZoomRatio(zoomLevel) / 1000;
getHwBayerCropRegion(&hwSensorCropW, &hwSensorCropH, &hwSensorCropX, &hwSensorCropY);
ret = getCropRectAlign(hwSensorCropW, hwSensorCropH,
pictureW, pictureH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
cropX = ALIGN_DOWN(cropX, 2);
cropY = ALIGN_DOWN(cropY, 2);
cropW = hwSensorCropW - (cropX * 2);
cropH = hwSensorCropH - (cropY * 2);
if (cropW < pictureW / maxZoomRatio || cropH < pictureH / maxZoomRatio) {
ALOGW("WRN(%s[%d]): zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", __FUNCTION__, __LINE__, maxZoomRatio, cropW, cropH, pictureW, pictureH);
cropX = ALIGN_DOWN(((hwSensorCropW - (pictureW / maxZoomRatio)) >> 1), 2);
cropY = ALIGN_DOWN(((hwSensorCropH - (pictureH / maxZoomRatio)) >> 1), 2);
cropW = hwSensorCropW - (cropX * 2);
cropH = hwSensorCropH - (cropY * 2);
}
}
#if 1
ALOGD("DEBUG(%s):maxSensorSize (%dx%d), hwSensorSize (%dx%d), previewSize (%dx%d)",
__FUNCTION__, maxSensorW, maxSensorH, hwSensorW, hwSensorH, previewW, previewH);
ALOGD("DEBUG(%s):hwPictureSize (%dx%d), pictureSize (%dx%d)",
__FUNCTION__, hwPictureW, hwPictureH, pictureW, pictureH);
ALOGD("DEBUG(%s):size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, cropX, cropY, cropW, cropH, zoomLevel);
ALOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
ALOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = 0;
srcRect->y = 0;
srcRect->w = maxSensorW;
srcRect->h = maxSensorH;
srcRect->fullW = maxSensorW;
srcRect->fullH = maxSensorH;
srcRect->colorFormat = bayerFormat;
dstRect->x = cropX;
dstRect->y = cropY;
dstRect->w = cropW;
dstRect->h = cropH;
dstRect->fullW = cropW;
dstRect->fullH = cropH;
dstRect->colorFormat = bayerFormat;
return NO_ERROR;
}
status_t ExynosCameraParameters::m_getPreviewBdsSize(ExynosRect *dstRect)
{
int hwBdsW = 0;
int hwBdsH = 0;
int sizeList[SIZE_LUT_INDEX_END];
/* matched ratio LUT is not existed, use equation */
if (m_useSizeTable == false
|| m_staticInfo->previewSizeLut == NULL
|| m_staticInfo->previewSizeLutMax <= m_cameraInfo.previewSizeRatioId
|| m_getPreviewSizeList(sizeList) != NO_ERROR) {
ExynosRect rect;
return calcPreviewBDSSize(&rect, dstRect);
}
/* use LUT */
hwBdsW = sizeList[BDS_W];
hwBdsH = sizeList[BDS_H];
if (getRecordingHint() == true) {
int videoW = 0, videoH = 0;
getVideoSize(&videoW, &videoH);
if (m_cameraInfo.previewSizeRatioId != m_cameraInfo.videoSizeRatioId)
ALOGV("WARN(%s[%d]):preview ratioId(%d) != videoRatioId(%d), use previewRatioId",
__FUNCTION__, __LINE__,
m_cameraInfo.previewSizeRatioId, m_cameraInfo.videoSizeRatioId);
if ((videoW == 3840 && videoH == 2160) || (videoW == 2560 && videoH == 1440)) {
hwBdsW = videoW;
hwBdsH = videoH;
}
}
#ifdef USE_BDS_WIDE_SELFIE
else if (getShotMode() == SHOT_MODE_FRONT_PANORAMA && !getRecordingHint()) {
hwBdsW = WIDE_SELFIE_WIDTH;
hwBdsH = WIDE_SELFIE_HEIGHT;
}
#endif
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = hwBdsW;
dstRect->h = hwBdsH;
#ifdef DEBUG_PERFRAME
ALOGD("DEBUG(%s):hwBdsSize (%dx%d)", __FUNCTION__, dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCameraParameters::getPreviewBdsSize(ExynosRect *dstRect)
{
status_t ret = NO_ERROR;
ret = m_getPreviewBdsSize(dstRect);
if (ret != NO_ERROR) {
CLOGE("ERR(%s[%d]):calcPreviewBDSSize() fail", __FUNCTION__, __LINE__);
return ret;
}
if (this->getHWVdisMode() == true) {
int disW = ALIGN_UP((int)(dstRect->w * HW_VDIS_W_RATIO), 2);
int disH = ALIGN_UP((int)(dstRect->h * HW_VDIS_H_RATIO), 2);
CLOGV("DEBUG(%s[%d]):HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)",
__FUNCTION__, __LINE__, dstRect->w, dstRect->h, disW, disH);
/*
* check H/W VDIS size(BDS dst size) is too big than bayerCropSize(BDS out size).
*/
ExynosRect bnsSize, bayerCropSize;
if (getPreviewBayerCropSize(&bnsSize, &bayerCropSize) != NO_ERROR) {
CLOGE("ERR(%s[%d]):getPreviewBayerCropSize() fail", __FUNCTION__, __LINE__);
} else {
if (bayerCropSize.w < disW || bayerCropSize.h < disH) {
CLOGV("DEBUG(%s[%d]):bayerCropSize (%d x %d) is smaller than (%d x %d). so force bayerCropSize",
__FUNCTION__, __LINE__, bayerCropSize.w, bayerCropSize.h, disW, disH);
disW = bayerCropSize.w;
disH = bayerCropSize.h;
}
}
dstRect->w = disW;
dstRect->h = disH;
}
#ifdef DEBUG_PERFRAME
CLOGD("DEBUG(%s):hwBdsSize (%dx%d)", __FUNCTION__, dstRect->w, dstRect->h);
#endif
return ret;
}
status_t ExynosCameraParameters::calcPreviewBDSSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int hwSensorW = 0, hwSensorH = 0;
int hwPictureW = 0, hwPictureH = 0;
int pictureW = 0, pictureH = 0;
int previewW = 0, previewH = 0;
ExynosRect bnsSize;
ExynosRect bayerCropSize;
#if 0
int pictureFormat = 0, hwPictureFormat = 0;
#endif
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int zoomLevel = 0;
int bayerFormat = getBayerFormat();
float zoomRatio = 1.0f;
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
#if 0
pictureFormat = getPictureFormat();
#endif
zoomLevel = getZoomLevel();
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
/* TODO: get crop size from ctlMetadata */
ret = getCropRectAlign(hwSensorW, hwSensorH,
previewW, previewH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
zoomRatio = getZoomRatio(0) / 1000;
ret = getCropRectAlign(cropW, cropH,
previewW, previewH,
&crop_crop_x, &crop_crop_y,
&crop_crop_w, &crop_crop_h,
2, 2,
0, zoomRatio);
cropX = ALIGN_UP(cropX, 2);
cropY = ALIGN_UP(cropY, 2);
cropW = hwSensorW - (cropX * 2);
cropH = hwSensorH - (cropY * 2);
// ALIGN_UP(crop_crop_x, 2);
// ALIGN_UP(crop_crop_y, 2);
#if 0
ALOGD("DEBUG(%s):hwSensorSize (%dx%d), previewSize (%dx%d)",
__FUNCTION__, hwSensorW, hwSensorH, previewW, previewH);
ALOGD("DEBUG(%s):hwPictureSize (%dx%d), pictureSize (%dx%d)",
__FUNCTION__, hwPictureW, hwPictureH, pictureW, pictureH);
ALOGD("DEBUG(%s):size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, cropX, cropY, cropW, cropH, zoomLevel);
ALOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
ALOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = cropX;
srcRect->y = cropY;
srcRect->w = cropW;
srcRect->h = cropH;
srcRect->fullW = cropW;
srcRect->fullH = cropH;
srcRect->colorFormat = bayerFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->colorFormat = JPEG_INPUT_COLOR_FMT;
/* For Front Single Scenario, BDS should not be used */
if (m_cameraId == CAMERA_ID_FRONT && getDualMode() == false) {
getPreviewBayerCropSize(&bnsSize, &bayerCropSize);
dstRect->w = bayerCropSize.w;
dstRect->h = bayerCropSize.h;
dstRect->fullW = bayerCropSize.w;
dstRect->fullH = bayerCropSize.h;
} else {
dstRect->w = previewW;
dstRect->h = previewH;
dstRect->fullW = previewW;
dstRect->fullH = previewH;
}
if (dstRect->w > srcRect->w)
dstRect->w = srcRect->w;
if (dstRect->h > srcRect->h)
dstRect->h = srcRect->h;
return NO_ERROR;
}
status_t ExynosCameraParameters::getPictureBdsSize(ExynosRect *dstRect)
{
int hwBdsW = 0;
int hwBdsH = 0;
/* matched ratio LUT is not existed, use equation */
if (m_useSizeTable == false
|| m_staticInfo->pictureSizeLut == NULL
|| m_staticInfo->pictureSizeLutMax <= m_cameraInfo.pictureSizeRatioId) {
ExynosRect rect;
return calcPictureBDSSize(&rect, dstRect);
}
/* use LUT */
hwBdsW = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BDS_W];
hwBdsH = m_staticInfo->pictureSizeLut[m_cameraInfo.pictureSizeRatioId][BDS_H];
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = hwBdsW;
dstRect->h = hwBdsH;
return NO_ERROR;
}
status_t ExynosCameraParameters::getFastenAeStableSensorSize(int *hwSensorW, int *hwSensorH)
{
*hwSensorW = m_staticInfo->videoSizeLutHighSpeed120[0][SENSOR_W];
*hwSensorH = m_staticInfo->videoSizeLutHighSpeed120[0][SENSOR_H];
return NO_ERROR;
}
status_t ExynosCameraParameters::getFastenAeStableBcropSize(int *hwBcropW, int *hwBcropH)
{
*hwBcropW = m_staticInfo->videoSizeLutHighSpeed120[0][BCROP_W];
*hwBcropH = m_staticInfo->videoSizeLutHighSpeed120[0][BCROP_H];
return NO_ERROR;
}
status_t ExynosCameraParameters::getFastenAeStableBdsSize(int *hwBdsW, int *hwBdsH)
{
*hwBdsW = m_staticInfo->videoSizeLutHighSpeed120[0][BDS_W];
*hwBdsH = m_staticInfo->videoSizeLutHighSpeed120[0][BDS_H];
return NO_ERROR;
}
status_t ExynosCameraParameters::calcPictureBDSSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int ret = 0;
int maxSensorW = 0, maxSensorH = 0;
int hwPictureW = 0, hwPictureH = 0;
int pictureW = 0, pictureH = 0;
int previewW = 0, previewH = 0;
#if 0
int pictureFormat = 0, hwPictureFormat = 0;
#endif
int cropX = 0, cropY = 0;
int cropW = 0, cropH = 0;
int crop_crop_x = 0, crop_crop_y = 0;
int crop_crop_w = 0, crop_crop_h = 0;
int zoomLevel = 0;
int bayerFormat = getBayerFormat();
float zoomRatio = 1.0f;
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
#if 0
pictureFormat = getPictureFormat();
#endif
zoomLevel = getZoomLevel();
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
getPreviewSize(&previewW, &previewH);
zoomRatio = getZoomRatio(zoomLevel) / 1000;
/* TODO: get crop size from ctlMetadata */
ret = getCropRectAlign(maxSensorW, maxSensorH,
pictureW, pictureH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_MAGIC_ALIGN, 2,
zoomLevel, zoomRatio);
zoomRatio = getZoomRatio(0) / 1000;
ret = getCropRectAlign(cropW, cropH,
pictureW, pictureH,
&crop_crop_x, &crop_crop_y,
&crop_crop_w, &crop_crop_h,
2, 2,
0, zoomRatio);
cropX = ALIGN_UP(cropX, 2);
cropY = ALIGN_UP(cropY, 2);
cropW = maxSensorW - (cropX * 2);
cropH = maxSensorH - (cropY * 2);
// ALIGN_UP(crop_crop_x, 2);
// ALIGN_UP(crop_crop_y, 2);
#if 0
ALOGD("DEBUG(%s):SensorSize (%dx%d), previewSize (%dx%d)",
__FUNCTION__, maxSensorW, maxSensorH, previewW, previewH);
ALOGD("DEBUG(%s):hwPictureSize (%dx%d), pictureSize (%dx%d)",
__FUNCTION__, hwPictureW, hwPictureH, pictureW, pictureH);
ALOGD("DEBUG(%s):size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, cropX, cropY, cropW, cropH, zoomLevel);
ALOGD("DEBUG(%s):size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
__FUNCTION__, crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
ALOGD("DEBUG(%s):size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
__FUNCTION__, pictureFormat, JPEG_INPUT_COLOR_FMT);
#endif
srcRect->x = cropX;
srcRect->y = cropY;
srcRect->w = cropW;
srcRect->h = cropH;
srcRect->fullW = cropW;
srcRect->fullH = cropH;
srcRect->colorFormat = bayerFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = pictureW;
dstRect->h = pictureH;
dstRect->fullW = pictureW;
dstRect->fullH = pictureH;
dstRect->colorFormat = JPEG_INPUT_COLOR_FMT;
if (dstRect->w > srcRect->w)
dstRect->w = srcRect->w;
if (dstRect->h > srcRect->h)
dstRect->h = srcRect->h;
return NO_ERROR;
}
status_t ExynosCameraParameters::calcNormalToTpuSize(int srcW, int srcH, int *dstW, int *dstH)
{
status_t ret = NO_ERROR;
if (srcW < 0 || srcH < 0) {
CLOGE("ERR(%s[%d]):src size is invalid(%d x %d)", __FUNCTION__, __LINE__, srcW, srcH);
return INVALID_OPERATION;
}
int disW = ALIGN_UP((int)(srcW * HW_VDIS_W_RATIO), 2);
int disH = ALIGN_UP((int)(srcH * HW_VDIS_H_RATIO), 2);
*dstW = disW;
*dstH = disH;
CLOGD("DEBUG(%s[%d]):HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)", __FUNCTION__, __LINE__, srcW, srcH, disW, disH);
return NO_ERROR;
}
status_t ExynosCameraParameters::calcTpuToNormalSize(int srcW, int srcH, int *dstW, int *dstH)
{
status_t ret = NO_ERROR;
if (srcW < 0 || srcH < 0) {
CLOGE("ERR(%s[%d]):src size is invalid(%d x %d)", __FUNCTION__, __LINE__, srcW, srcH);
return INVALID_OPERATION;
}
int disW = ALIGN_DOWN((int)(srcW / HW_VDIS_W_RATIO), 2);
int disH = ALIGN_DOWN((int)(srcH / HW_VDIS_H_RATIO), 2);
*dstW = disW;
*dstH = disH;
CLOGD("DEBUG(%s[%d]):HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)", __FUNCTION__, __LINE__, srcW, srcH, disW, disH);
return ret;
}
void ExynosCameraParameters::setUsePureBayerReprocessing(bool enable)
{
m_usePureBayerReprocessing = enable;
}
bool ExynosCameraParameters::getUsePureBayerReprocessing(void)
{
int oldMode = m_usePureBayerReprocessing;
if (getRecordingHint() == true) {
if (getDualMode() == true)
m_usePureBayerReprocessing = (getCameraId() == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING_ON_DUAL_RECORDING : USE_PURE_BAYER_REPROCESSING_FRONT_ON_DUAL_RECORDING;
else
m_usePureBayerReprocessing = (getCameraId() == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING_ON_RECORDING : USE_PURE_BAYER_REPROCESSING_FRONT_ON_RECORDING;
} else {
if (getDualMode() == true)
m_usePureBayerReprocessing = (getCameraId() == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING_ON_DUAL : USE_PURE_BAYER_REPROCESSING_FRONT_ON_DUAL;
else
m_usePureBayerReprocessing = (getCameraId() == CAMERA_ID_BACK) ? USE_PURE_BAYER_REPROCESSING : USE_PURE_BAYER_REPROCESSING_FRONT;
}
if (oldMode != m_usePureBayerReprocessing) {
CLOGD("DEBUG(%s[%d]):bayer usage is changed (%d -> %d)", __FUNCTION__, __LINE__, oldMode, m_usePureBayerReprocessing);
}
return m_usePureBayerReprocessing;
}
#ifdef SAMSUNG_LBP
bool ExynosCameraParameters::getUseBestPic(void)
{
return m_useBestPic;
}
#endif
int32_t ExynosCameraParameters::getReprocessingBayerMode(void)
{
int32_t mode = REPROCESSING_BAYER_MODE_NONE;
bool useDynamicBayer = (getRecordingHint() == true || getDualRecordingHint() == true) ?
getUseDynamicBayerVideoSnapShot() : getUseDynamicBayer();
if (isReprocessing() == false)
return mode;
if (useDynamicBayer == true) {
if (getUsePureBayerReprocessing() == true)
mode = REPROCESSING_BAYER_MODE_PURE_DYNAMIC;
else
mode = REPROCESSING_BAYER_MODE_DIRTY_DYNAMIC;
} else {
if (getUsePureBayerReprocessing() == true)
mode = REPROCESSING_BAYER_MODE_PURE_ALWAYS_ON;
else
mode = REPROCESSING_BAYER_MODE_DIRTY_ALWAYS_ON;
}
return mode;
}
void ExynosCameraParameters::setAdaptiveCSCRecording(bool enable)
{
m_useAdaptiveCSCRecording = enable;
}
bool ExynosCameraParameters::getAdaptiveCSCRecording(void)
{
return m_useAdaptiveCSCRecording;
}
bool ExynosCameraParameters::doCscRecording(void)
{
bool ret = true;
int hwPreviewW = 0, hwPreviewH = 0;
int videoW = 0, videoH = 0;
#ifdef USE_LIVE_BROADCAST
bool plbmode = getPLBMode();
#endif
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
#ifdef SUPPORT_SW_VDIS
if(isSWVdisMode())
m_swVDIS_AdjustPreviewSize(&hwPreviewW, &hwPreviewH);
#endif /*SUPPORT_SW_VDIS*/
getVideoSize(&videoW, &videoH);
CLOGV("DEBUG(%s[%d]):hwPreviewSize = %d x %d", __FUNCTION__, __LINE__, hwPreviewW, hwPreviewH);
CLOGV("DEBUG(%s[%d]):videoSize = %d x %d", __FUNCTION__, __LINE__, videoW, videoH);
if (((videoW == 3840 && videoH == 2160) || (videoW == 1920 && videoH == 1080) || (videoW == 2560 && videoH == 1440))
&& m_useAdaptiveCSCRecording == true
&& videoW == hwPreviewW
&& videoH == hwPreviewH
#ifdef USE_LIVE_BROADCAST
&& plbmode == false
#endif
) {
ret = false;
}
#if 0 /* temporary */
#ifdef USE_3DNR_ALWAYS
if (USE_3DNR_ALWAYS == false)
ret = true;
#else
ret = true;
#endif
#endif
return ret;
}
int ExynosCameraParameters::getHalPixelFormat(void)
{
int setfile = 0;
int yuvRange = 0;
int previewFormat = getHwPreviewFormat();
int halFormat = 0;
m_getSetfileYuvRange(false, &setfile, &yuvRange);
halFormat = convertingHalPreviewFormat(previewFormat, yuvRange);
return halFormat;
}
#if (TARGET_ANDROID_VER_MAJ >= 4 && TARGET_ANDROID_VER_MIN >= 4)
int ExynosCameraParameters::convertingHalPreviewFormat(int previewFormat, int yuvRange)
{
int halFormat = 0;
switch (previewFormat) {
case V4L2_PIX_FMT_NV21:
CLOGD("DEBUG(%s[%d]): preview format NV21", __FUNCTION__, __LINE__);
halFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
break;
case V4L2_PIX_FMT_NV21M:
CLOGD("DEBUG(%s[%d]): preview format NV21M", __FUNCTION__, __LINE__);
if (yuvRange == YUV_FULL_RANGE) {
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL;
} else if (yuvRange == YUV_LIMITED_RANGE) {
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M;
} else {
CLOGW("WRN(%s[%d]): invalid yuvRange, force set to full range", __FUNCTION__, __LINE__);
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL;
}
break;
case V4L2_PIX_FMT_YVU420:
CLOGD("DEBUG(%s[%d]): preview format YVU420", __FUNCTION__, __LINE__);
halFormat = HAL_PIXEL_FORMAT_YV12;
break;
case V4L2_PIX_FMT_YVU420M:
CLOGD("DEBUG(%s[%d]): preview format YVU420M", __FUNCTION__, __LINE__);
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YV12_M;
break;
default:
CLOGE("ERR(%s[%d]): unknown preview format(%d)", __FUNCTION__, __LINE__, previewFormat);
break;
}
return halFormat;
}
#else
int ExynosCameraParameters::convertingHalPreviewFormat(int previewFormat, int yuvRange)
{
int halFormat = 0;
switch (previewFormat) {
case V4L2_PIX_FMT_NV21:
halFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
break;
case V4L2_PIX_FMT_NV21M:
if (yuvRange == YUV_FULL_RANGE) {
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_FULL;
} else if (yuvRange == YUV_LIMITED_RANGE) {
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP;
} else {
CLOGW("WRN(%s[%d]): invalid yuvRange, force set to full range", __FUNCTION__, __LINE__);
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_FULL;
}
break;
case V4L2_PIX_FMT_YVU420:
halFormat = HAL_PIXEL_FORMAT_YV12;
break;
case V4L2_PIX_FMT_YVU420M:
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YV12;
break;
default:
CLOGE("ERR(%s[%d]): unknown preview format(%d)", __FUNCTION__, __LINE__, previewFormat);
break;
}
return halFormat;
}
#endif
void ExynosCameraParameters::setDvfsLock(bool lock) {
m_dvfsLock = lock;
}
bool ExynosCameraParameters::getDvfsLock(void) {
return m_dvfsLock;
}
int ExynosCameraParameters::getBayerFormat(void)
{
int bayerFormat = CAMERA_BAYER_FORMAT;
#ifdef CAMERA_PACKED_BAYER_ENABLE
bayerFormat = CAMERA_BAYER_FORMAT;
#else
/* hack : always set unpack bayer. HAL can't know pro mode */
if (getDualMode()) {
bayerFormat = CAMERA_BAYER_FORMAT;
} else {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
return bayerFormat;
}
bool ExynosCameraParameters::m_getBayerPackModeEnable(void)
{
bool ret = false;
#ifdef CAMERA_PACKED_BAYER_ENABLE
ret = true;
#endif
#ifdef DEBUG_RAWDUMP
if (ret == true) {
if (checkBayerDumpEnable() == true) {
ret = false;
}
}
#endif
#if 0 // we should add shot mode for pro mode.
if (ret == true) {
if (getShotMode() == SHOT_MODE_LONG_EXPOSURE) {
ret = false;
}
}
#endif
return ret;
}
#ifdef DEBUG_RAWDUMP
bool ExynosCameraParameters::checkBayerDumpEnable(void)
{
#ifndef RAWDUMP_CAPTURE
char enableRawDump[PROPERTY_VALUE_MAX];
property_get("ro.debug.rawdump", enableRawDump, "0");
if (strcmp(enableRawDump, "1") == 0) {
/*CLOGD("checkBayerDumpEnable : 1");*/
return true;
} else {
/*CLOGD("checkBayerDumpEnable : 0");*/
return false;
}
#endif
return true;
}
#endif /* DEBUG_RAWDUMP */
bool ExynosCameraParameters::setConfig(struct ExynosConfigInfo* config)
{
memcpy(m_exynosconfig, config, sizeof(struct ExynosConfigInfo));
setConfigMode(m_exynosconfig->mode);
return true;
}
struct ExynosConfigInfo* ExynosCameraParameters::getConfig()
{
return m_exynosconfig;
}
bool ExynosCameraParameters::setConfigMode(uint32_t mode)
{
bool ret = false;
switch(mode){
case CONFIG_MODE::NORMAL:
case CONFIG_MODE::HIGHSPEED_60:
case CONFIG_MODE::HIGHSPEED_120:
case CONFIG_MODE::HIGHSPEED_240:
m_exynosconfig->current = &m_exynosconfig->info[mode];
m_exynosconfig->mode = mode;
ret = true;
break;
default:
CLOGE("ERR(%s[%d]): unknown config mode (%d)", __FUNCTION__, __LINE__, mode);
}
return ret;
}
int ExynosCameraParameters::getConfigMode()
{
int ret = -1;
switch(m_exynosconfig->mode){
case CONFIG_MODE::NORMAL:
case CONFIG_MODE::HIGHSPEED_60:
case CONFIG_MODE::HIGHSPEED_120:
case CONFIG_MODE::HIGHSPEED_240:
ret = m_exynosconfig->mode;
break;
default:
CLOGE("ERR(%s[%d]): unknown config mode (%d)", __FUNCTION__, __LINE__, m_exynosconfig->mode);
}
return ret;
}
void ExynosCameraParameters::setZoomActiveOn(bool enable)
{
m_zoom_activated = enable;
}
bool ExynosCameraParameters::getZoomActiveOn(void)
{
return m_zoom_activated;
}
status_t ExynosCameraParameters::setMarkingOfExifFlash(int flag)
{
m_firing_flash_marking = flag;
return NO_ERROR;
}
int ExynosCameraParameters::getMarkingOfExifFlash(void)
{
return m_firing_flash_marking;
}
bool ExynosCameraParameters::increaseMaxBufferOfPreview(void)
{
if((getShotMode() == SHOT_MODE_BEAUTY_FACE)||(getShotMode() == SHOT_MODE_FRONT_PANORAMA)
#ifdef LLS_CAPTURE
|| (getLLSOn() == true && getCameraId() == CAMERA_ID_FRONT)
#endif
) {
return true;
} else {
return false;
}
}
bool ExynosCameraParameters::getSensorOTFSupported(void)
{
return m_staticInfo->flite3aaOtfSupport;
}
bool ExynosCameraParameters::isReprocessing(void)
{
bool reprocessing = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
#if defined(MAIN_CAMERA_DUAL_REPROCESSING) && defined(MAIN_CAMERA_SINGLE_REPROCESSING)
reprocessing = (flagDual == true) ? MAIN_CAMERA_DUAL_REPROCESSING : MAIN_CAMERA_SINGLE_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_REPROCESSING/MAIN_CAMERA_SINGLE_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#if defined(FRONT_CAMERA_DUAL_REPROCESSING) && defined(FRONT_CAMERA_SINGLE_REPROCESSING)
reprocessing = (flagDual == true) ? FRONT_CAMERA_DUAL_REPROCESSING : FRONT_CAMERA_SINGLE_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_REPROCESSING/FRONT_CAMERA_SINGLE_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
}
return reprocessing;
}
bool ExynosCameraParameters::isSccCapture(void)
{
bool sccCapture = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
#if defined(MAIN_CAMERA_DUAL_SCC_CAPTURE) && defined(MAIN_CAMERA_SINGLE_SCC_CAPTURE)
sccCapture = (flagDual == true) ? MAIN_CAMERA_DUAL_SCC_CAPTURE : MAIN_CAMERA_SINGLE_SCC_CAPTURE;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_SCC_CAPTURE/MAIN_CAMERA_SINGLE_SCC_CAPTUREis not defined", __FUNCTION__, __LINE__);
#endif
} else {
#if defined(FRONT_CAMERA_DUAL_SCC_CAPTURE) && defined(FRONT_CAMERA_SINGLE_SCC_CAPTURE)
sccCapture = (flagDual == true) ? FRONT_CAMERA_DUAL_SCC_CAPTURE : FRONT_CAMERA_SINGLE_SCC_CAPTURE;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_SCC_CAPTURE/FRONT_CAMERA_SINGLE_SCC_CAPTURE is not defined", __FUNCTION__, __LINE__);
#endif
}
return sccCapture;
}
bool ExynosCameraParameters::isFlite3aaOtf(void)
{
bool flagOtfInput = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
bool flagSensorOtf = getSensorOTFSupported();
if (flagSensorOtf == false)
return flagOtfInput;
if (cameraId == CAMERA_ID_BACK) {
/* for 52xx scenario */
flagOtfInput = true;
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_FLITE_3AA_OTF
flagOtfInput = MAIN_CAMERA_DUAL_FLITE_3AA_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_FLITE_3AA_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_FLITE_3AA_OTF
flagOtfInput = MAIN_CAMERA_SINGLE_FLITE_3AA_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_SINGLE_FLITE_3AA_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_FLITE_3AA_OTF
flagOtfInput = FRONT_CAMERA_DUAL_FLITE_3AA_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_FLITE_3AA_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_FLITE_3AA_OTF
flagOtfInput = FRONT_CAMERA_SINGLE_FLITE_3AA_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_SINGLE_FLITE_3AA_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
}
return flagOtfInput;
}
bool ExynosCameraParameters::is3aaIspOtf(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_3AA_ISP_OTF
ret = MAIN_CAMERA_DUAL_3AA_ISP_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_3AA_ISP_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_3AA_ISP_OTF
ret = MAIN_CAMERA_SINGLE_3AA_ISP_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_SINGLE_3AA_ISP_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_3AA_ISP_OTF
ret = FRONT_CAMERA_DUAL_3AA_ISP_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_3AA_ISP_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_3AA_ISP_OTF
ret = FRONT_CAMERA_SINGLE_3AA_ISP_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_SINGLE_3AA_ISP_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
}
return ret;
}
bool ExynosCameraParameters::isIspTpuOtf(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_ISP_TPU_OTF
ret = MAIN_CAMERA_DUAL_ISP_TPU_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_ISP_TPU_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_ISP_TPU_OTF
ret = MAIN_CAMERA_SINGLE_ISP_TPU_OTF;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_SINGLE_ISP_TPU_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_ISP_TPU_OTF
ret = FRONT_CAMERA_DUAL_ISP_TPU_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_ISP_TPU_OTF is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_ISP_TPU_OTF
ret = FRONT_CAMERA_SINGLE_ISP_TPU_OTF;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_SINGLE_ISP_TPU_OTF is not defined", __FUNCTION__, __LINE__);
#endif
}
}
if (flagDual == false) {
ret = m_getIspTpuOtf(ret);
#ifdef USE_3DNR_ALWAYS
if (USE_3DNR_ALWAYS == false) {
ret = true;
}
#ifdef USE_LIVE_BROADCAST
if (getPLBMode() == true) {
ret = true;
}
#endif /* USE_LIVE_BROADCAST */
#endif /* USE_3DNR_ALWAYS */
}
return ret;
}
bool ExynosCameraParameters::isReprocessing3aaIspOTF(void)
{
bool otf = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING
otf = MAIN_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING
otf = MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING
otf = FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING
otf = FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING;
#else
ALOGW("WRN(%s[%d]): FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING is not defined", __FUNCTION__, __LINE__);
#endif
}
}
if (otf == true) {
bool flagDirtyBayer = false;
int reprocessingBayerMode = this->getReprocessingBayerMode();
switch(reprocessingBayerMode) {
case REPROCESSING_BAYER_MODE_NONE:
case REPROCESSING_BAYER_MODE_PURE_ALWAYS_ON:
case REPROCESSING_BAYER_MODE_PURE_DYNAMIC:
flagDirtyBayer = false;
break;
case REPROCESSING_BAYER_MODE_DIRTY_ALWAYS_ON:
case REPROCESSING_BAYER_MODE_DIRTY_DYNAMIC:
default:
flagDirtyBayer = true;
break;
}
if (flagDirtyBayer == true) {
ALOGW("WRN(%s[%d]): otf == true. but, flagDirtyBayer == true. so force false on 3aa_isp otf",
__FUNCTION__, __LINE__);
otf = false;
}
}
return otf;
}
bool ExynosCameraParameters::getSupportedZoomPreviewWIthScaler(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
int fastFpsMode = getFastFpsMode();
int vrMode = getVRMode();
if (cameraId == CAMERA_ID_BACK) {
if (fastFpsMode > CONFIG_MODE::HIGHSPEED_60
&& fastFpsMode < CONFIG_MODE::MAX
&& vrMode != 1) {
ret = true;
}
} else {
if (flagDual == true) {
ret = true;
}
}
return ret;
}
void ExynosCameraParameters::setZoomPreviewWIthScaler(bool enable)
{
m_zoomWithScaler = enable;
}
bool ExynosCameraParameters::getZoomPreviewWIthScaler(void)
{
return m_zoomWithScaler;
}
int ExynosCameraParameters::getHalVersion(void)
{
return m_halVersion;
}
void ExynosCameraParameters::setHalVersion(int halVersion)
{
m_halVersion = halVersion;
m_activityControl->setHalVersion(m_halVersion);
ALOGI("INFO(%s[%d]): m_halVersion(%d)", __FUNCTION__, __LINE__, m_halVersion);
return;
}
#ifdef USE_FADE_IN_ENTRANCE
status_t ExynosCameraParameters::checkFirstEntrance(const CameraParameters& params)
{
const char *strNewFirstEntrance = params.get("entrance");
bool curFirstEntrance = getFirstEntrance();
bool firstEntrance = false;
CLOGD("DEBUG(%s):newFirstEntrance %s", "setParameters", strNewFirstEntrance);
if (strNewFirstEntrance != NULL && !strcmp(strNewFirstEntrance, "true")) {
firstEntrance = true;
} else {
firstEntrance = false;
}
if (curFirstEntrance != firstEntrance) {
setFirstEntrance(firstEntrance);
m_params.set("entrance", strNewFirstEntrance);
}
return NO_ERROR;
}
void ExynosCameraParameters::setFirstEntrance(bool value)
{
m_flagFirstEntrance = value;
}
bool ExynosCameraParameters::getFirstEntrance(void)
{
return m_flagFirstEntrance;
}
#endif
#ifdef SAMSUNG_OT
bool ExynosCameraParameters::getObjectTrackingEnable(void)
{
return m_startObjectTracking;
}
bool ExynosCameraParameters::getObjectTrackingChanged(void)
{
return m_objectTrackingAreaChanged;
}
void ExynosCameraParameters::setObjectTrackingChanged(bool newValue)
{
m_objectTrackingAreaChanged = newValue;
return;
}
int ExynosCameraParameters::getObjectTrackingAreas(int* validFocusArea, ExynosRect2* areas, int* weights)
{
if(m_objectTrackingArea == NULL || m_objectTrackingWeight == NULL) {
ALOGE("ERR(%s[%d]): NULL pointer!", __FUNCTION__, __LINE__);
return BAD_VALUE;
}
*validFocusArea = m_cameraInfo.numValidFocusArea;
for (int i = 0; i < *validFocusArea; i++) {
areas[i] = m_objectTrackingArea[i];
weights[i] = m_objectTrackingWeight[i];
}
return NO_ERROR;
}
void ExynosCameraParameters::setObjectTrackingGet(bool newValue)
{
m_objectTrackingGet = newValue;
return;
}
bool ExynosCameraParameters::getObjectTrackingGet(void)
{
return m_objectTrackingGet;
}
#endif
#ifdef SAMSUNG_LBP
void ExynosCameraParameters::setNormalBestFrameCount(uint32_t count)
{
m_normal_best_frame_count = count;
}
uint32_t ExynosCameraParameters::getNormalBestFrameCount(void)
{
return m_normal_best_frame_count;
}
void ExynosCameraParameters::resetNormalBestFrameCount(void)
{
m_normal_best_frame_count = 0;
}
void ExynosCameraParameters::setSCPFrameCount(uint32_t count)
{
m_scp_frame_count = count;
}
uint32_t ExynosCameraParameters::getSCPFrameCount(void)
{
return m_scp_frame_count;
}
void ExynosCameraParameters::resetSCPFrameCount(void)
{
m_scp_frame_count = 0;
}
void ExynosCameraParameters::setBayerFrameCount(uint32_t count)
{
m_bayer_frame_count = count;
}
uint32_t ExynosCameraParameters::getBayerFrameCount(void)
{
return m_bayer_frame_count;
}
void ExynosCameraParameters::resetBayerFrameCount(void)
{
m_bayer_frame_count = 0;
}
#endif
#ifdef SAMSUNG_JQ
void ExynosCameraParameters::setJpegQtableStatus(int state)
{
Mutex::Autolock lock(m_JpegQtableLock);
m_jpegQtableStatus = state;
}
int ExynosCameraParameters::getJpegQtableStatus(void)
{
Mutex::Autolock lock(m_JpegQtableLock);
return m_jpegQtableStatus;
}
void ExynosCameraParameters::setJpegQtableOn(bool isOn)
{
Mutex::Autolock lock(m_JpegQtableLock);
m_isJpegQtableOn = isOn;
}
bool ExynosCameraParameters::getJpegQtableOn(void)
{
Mutex::Autolock lock(m_JpegQtableLock);
return m_isJpegQtableOn;
}
void ExynosCameraParameters::setJpegQtable(unsigned char* qtable)
{
Mutex::Autolock lock(m_JpegQtableLock);
memcpy(m_jpegQtable, qtable, sizeof(m_jpegQtable));
}
void ExynosCameraParameters::getJpegQtable(unsigned char* qtable)
{
Mutex::Autolock lock(m_JpegQtableLock);
memcpy(qtable, m_jpegQtable, sizeof(m_jpegQtable));
}
#endif
#ifdef SAMSUNG_BD
void ExynosCameraParameters::setBlurInfo(unsigned char *data, unsigned int size)
{
char sizeInfo[2] = {(unsigned char)((size >> 8) & 0xFF), (unsigned char)(size & 0xFF)};
memset(m_staticInfo->bd_exif_info.bd_exif, 0, BD_EXIF_SIZE);
memcpy(m_staticInfo->bd_exif_info.bd_exif, BD_EXIF_TAG, sizeof(BD_EXIF_TAG));
memcpy(m_staticInfo->bd_exif_info.bd_exif + sizeof(BD_EXIF_TAG) - 1, sizeInfo, sizeof(sizeInfo));
memcpy(m_staticInfo->bd_exif_info.bd_exif + sizeof(BD_EXIF_TAG) + sizeof(sizeInfo) -1, data, size);
}
#endif
#ifdef SAMSUNG_LLS_DEBLUR
void ExynosCameraParameters::setLLSdebugInfo(unsigned char *data, unsigned int size)
{
char sizeInfo[2] = {(unsigned char)((size >> 8) & 0xFF), (unsigned char)(size & 0xFF)};
memset(m_staticInfo->lls_exif_info.lls_exif, 0, LLS_EXIF_SIZE);
memcpy(m_staticInfo->lls_exif_info.lls_exif, LLS_EXIF_TAG, sizeof(LLS_EXIF_TAG));
memcpy(m_staticInfo->lls_exif_info.lls_exif + sizeof(LLS_EXIF_TAG) - 1, sizeInfo, sizeof(sizeInfo));
memcpy(m_staticInfo->lls_exif_info.lls_exif + sizeof(LLS_EXIF_TAG) + sizeof(sizeInfo)- 1, data, size);
}
#endif
#ifdef SAMSUNG_HRM
void ExynosCameraParameters::m_setHRM(int ir_data, int status)
{
setMetaCtlHRM(&m_metadata, ir_data, status);
}
void ExynosCameraParameters::m_setHRM_Hint(bool flag)
{
m_flagSensorHRM_Hint = flag;
}
#endif
#ifdef SAMSUNG_LIGHT_IR
void ExynosCameraParameters::m_setLight_IR(SensorListenerEvent_t data)
{
setMetaCtlLight_IR(&m_metadata, data);
}
void ExynosCameraParameters::m_setLight_IR_Hint(bool flag)
{
m_flagSensorLight_IR_Hint = flag;
}
#endif
#ifdef SAMSUNG_GYRO
void ExynosCameraParameters::m_setGyro(SensorListenerEvent_t data)
{
setMetaCtlGyro(&m_metadata, data);
}
void ExynosCameraParameters::m_setGyroHint(bool flag)
{
m_flagSensorGyroHint = flag;
}
#endif
#ifdef FORCE_CAL_RELOAD
bool ExynosCameraParameters::m_checkCalibrationDataValid(char *sensor_fw)
{
bool ret = true;
char *tok = NULL;
char *calcheck = NULL;
char *last;
char readdata[50];
FILE *fp = NULL;
fp = fopen("/sys/class/camera/rear/rear_force_cal_load", "r");
if (fp == NULL) {
return ret;
} else {
if (fgets(readdata, sizeof(readdata), fp) == NULL) {
CLOGE("ERR(%s[%d]):failed to read sysfs entry", __FUNCTION__, __LINE__);
}
CLOGD("DEBUG(%s[%d]):%s", __FUNCTION__, __LINE__, readdata);
fclose(fp);
}
tok = strtok_r(sensor_fw, " ", &last);
if (tok != NULL) {
calcheck = strtok_r(NULL, " ", &last);
}
if (calcheck != NULL && strlen(calcheck) >= 2 && !strncmp(calcheck, "NG", 2)) {
CLOGE("ERR(%s):Cal data has error", __FUNCTION__);
ret = false;
}
return ret;
}
#endif
#ifdef SAMSUNG_COMPANION
void ExynosCameraParameters::setUseCompanion(bool use)
{
m_use_companion = use;
}
bool ExynosCameraParameters::getUseCompanion()
{
return m_use_companion;
}
#endif
void ExynosCameraParameters::setIsThumbnailCallbackOn(bool enable)
{
m_IsThumbnailCallbackOn = enable;
}
bool ExynosCameraParameters::getIsThumbnailCallbackOn()
{
return m_IsThumbnailCallbackOn;
}
}; /* namespace android */