blob: dfa4b58a076d65cdb215a52185220f5a1dfe09c1 [file] [log] [blame]
/*
**
** Copyright 2015, 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 "ExynosCamera3Parameters"
#include <cutils/log.h>
#include "ExynosCamera3Parameters.h"
namespace android {
ExynosCamera3Parameters::ExynosCamera3Parameters(int cameraId, 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 = createExynosCamera3SensorInfo(cameraId);
m_useSizeTable = (m_staticInfo->sizeTableSupport) ? USE_CAMERA_SIZE_TABLE : false;
m_useAdaptiveCSCRecording = (cameraId == CAMERA_ID_BACK) ? USE_ADAPTIVE_CSC_RECORDING : USE_ADAPTIVE_CSC_RECORDING_FRONT;
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();
m_exynosconfig = new ExynosConfigInfo();
mDebugInfo.num_of_appmarker = 1; /* Default : APP4 */
mDebugInfo.idx[0][0] = APP_MARKER_4; /* matching the app marker 4 */
#ifdef SAMSUNG_OIS
if (cameraId == CAMERA_ID_BACK) {
mDebugInfo.debugSize[APP_MARKER_4] = sizeof(struct camera2_udm) + sizeof(struct ois_exif_data);
} else {
mDebugInfo.debugSize[APP_MARKER_4] = sizeof(struct camera2_udm);
}
#else
mDebugInfo.debugSize[APP_MARKER_4] = sizeof(struct camera2_udm);
#endif
mDebugInfo.debugData[APP_MARKER_4] = new char[mDebugInfo.debugSize[APP_MARKER_4]];
memset((void *)mDebugInfo.debugData[APP_MARKER_4], 0, mDebugInfo.debugSize[APP_MARKER_4]);
memset((void *)m_exynosconfig, 0x00, sizeof(struct ExynosConfigInfo));
// 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_previewSizeChanged = false;
m_flagRestartPreviewChecked = false;
m_flagRestartPreview = false;
m_reallocBuffer = false;
m_flagCheckDualMode = false;
m_flagVideoStabilization = false;
m_flag3dnrMode = false;
#ifdef LLS_CAPTURE
m_flagLLSOn = false;
m_LLSCaptureOn = false;
#endif
#ifdef SR_CAPTURE
m_flagSRSOn = false;
#endif
#ifdef OIS_CAPTURE
m_flagOISCaptureOn = false;
#endif
#ifdef USE_BINNING_MODE
m_binningProperty = checkBinningProperty();
#endif
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
m_fpsProperty = checkFpsProperty();
#endif
m_flagCheckRecordingHint = false;
m_zoomWithScaler = false;
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_useDynamicBayer120FpsVideoSnapShot =
(cameraId == CAMERA_ID_BACK) ? USE_DYNAMIC_BAYER_120FPS_VIDEO_SNAP_SHOT : USE_DYNAMIC_BAYER_120FPS_VIDEO_SNAP_SHOT_FRONT;
m_useDynamicBayer240FpsVideoSnapShot =
(cameraId == CAMERA_ID_BACK) ? USE_DYNAMIC_BAYER_240FPS_VIDEO_SNAP_SHOT : USE_DYNAMIC_BAYER_240FPS_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 = 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
m_enabledMsgType = 0;
m_dvfsLock = false;
#ifdef SAMSUNG_DOF
m_curLensStep = 0;
m_curLensCount = 0;
#endif
#ifdef SAMSUNG_OIS
m_oisNode = NULL;
m_setOISmodeSetting = false;
#ifdef OIS_CAPTURE
m_llsValue = 0;
#endif
#endif
#ifdef SUPPORT_DEPTH_MAP
m_flaguseDepthMap = false;
#endif
for (int i = 0; i < this->getYuvStreamMaxNum(); i++) {
m_yuvBufferCount[i] = 1; //YUV
m_yuvBufferCount[i + YUV_MAX] = 1; //YUV_STALL
#ifdef USE_BDS_2_0_480P_YUV
m_yuvSizeSetup[i] = false; //YUV
m_yuvSizeSetup[i + YUV_MAX] = false; //YUV_STALL
#endif
}
resetMinYuvSize();
// Initial Values : END
setDefaultCameraInfo();
}
ExynosCamera3Parameters::~ExynosCamera3Parameters()
{
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;
}
}
int ExynosCamera3Parameters::getCameraId(void)
{
return m_cameraId;
}
void ExynosCamera3Parameters::setDefaultCameraInfo(void)
{
CLOGI("");
m_setHwSensorSize(m_staticInfo->maxSensorW, m_staticInfo->maxSensorH);
for (int i = 0; i < this->getYuvStreamMaxNum(); i++) {
/* YUV */
m_setYuvSize(m_staticInfo->maxPreviewW, m_staticInfo->maxPreviewH, i);
m_setYuvFormat(V4L2_PIX_FMT_NV21, i);
/* YUV_STALL */
m_setYuvSize(m_staticInfo->maxPreviewW, m_staticInfo->maxPreviewH, i + YUV_MAX);
m_setYuvFormat(V4L2_PIX_FMT_NV21, i + YUV_MAX);
}
m_setHwPictureSize(m_staticInfo->maxPictureW, m_staticInfo->maxPictureH);
m_setHwPictureFormat(SCC_OUTPUT_COLOR_FMT);
m_setThumbnailSize(m_staticInfo->maxThumbnailW, m_staticInfo->maxThumbnailH);
/* Initalize BNS scale ratio, step:500, ex)1500->x1.5 scale down */
m_setBnsScaleRatio(1000);
/* Initalize Binning scale ratio */
m_setBinningScaleRatio(1000);
m_setRecordingHint(false);
setDualMode(false);
}
status_t ExynosCamera3Parameters::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("[setParameters]tried to set vision mode(not supported)");
ret = BAD_VALUE;
}
} else if (getVisionMode()) {
CLOGE("vision mode can not change before stoppreview");
visionMode = true;
}
m_setVisionMode(visionMode);
return ret;
}
int ExynosCamera3Parameters::getIntelligentMode(void)
{
return m_cameraInfo.intelligentMode;
}
void ExynosCamera3Parameters::m_setVisionMode(bool vision)
{
m_cameraInfo.visionMode = vision;
}
bool ExynosCamera3Parameters::getVisionMode(void)
{
return m_cameraInfo.visionMode;
}
void ExynosCamera3Parameters::m_setVisionModeFps(int fps)
{
m_cameraInfo.visionModeFps = fps;
}
int ExynosCamera3Parameters::getVisionModeFps(void)
{
return m_cameraInfo.visionModeFps;
}
void ExynosCamera3Parameters::m_setVisionModeAeTarget(int ae)
{
m_cameraInfo.visionModeAeTarget = ae;
}
int ExynosCamera3Parameters::getVisionModeAeTarget(void)
{
return m_cameraInfo.visionModeAeTarget;
}
void ExynosCamera3Parameters::m_setRecordingHint(bool hint)
{
m_cameraInfo.recordingHint = hint;
/* RecordingHint is confirmed */
m_flagCheckRecordingHint = true;
}
bool ExynosCamera3Parameters::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;
}
void ExynosCamera3Parameters::setDualMode(bool dual)
{
m_cameraInfo.dualMode = dual;
/* dualMode is confirmed */
m_flagCheckDualMode = true;
}
bool ExynosCamera3Parameters::getDualMode(void)
{
/*
* Before setParameters, we cannot know dualMode is valid or not
* So, check and make assert for fast debugging
*/
if (m_flagCheckDualMode == false)
return 0;
return m_cameraInfo.dualMode;
}
bool ExynosCamera3Parameters::getDualRecordingHint(void)
{
return m_cameraInfo.dualRecordingHint;
}
bool ExynosCamera3Parameters::getEffectRecordingHint(void)
{
return m_cameraInfo.effectRecordingHint;
}
status_t ExynosCamera3Parameters::checkPreviewFpsRange(uint32_t minFps, uint32_t maxFps)
{
status_t ret = NO_ERROR;
uint32_t curMinFps = 0, curMaxFps = 0;
getPreviewFpsRange(&curMinFps, &curMaxFps);
if (m_adjustPreviewFpsRange(minFps, maxFps) != NO_ERROR) {
CLOGE("Fails to adjust preview fps range");
return INVALID_OPERATION;
}
if (curMinFps != minFps || curMaxFps != maxFps) {
m_setPreviewFpsRange(minFps, maxFps);
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
if (m_fpsProperty != 0) {
CLOGI("INFO(%s): set to %d fps depends on fps property", __FUNCTION__, m_fpsProperty/1000);
}
#endif
}
return ret;
}
status_t ExynosCamera3Parameters::m_adjustPreviewFpsRange(uint32_t &newMinFps, uint32_t &newMaxFps)
{
bool flagSpecialMode = false;
if (getDualMode() == true) {
flagSpecialMode = true;
CLOGV("DEBUG(%s[%d]):dualMode(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
}
if (getDualRecordingHint() == true) {
flagSpecialMode = true;
CLOGV("DEBUG(%s[%d]):dualRecordingHint(true), newMaxFps=%d", __FUNCTION__, __LINE__, newMaxFps);
}
if (getRecordingHint() == true) {
flagSpecialMode = true;
CLOGV("DEBUG(%s[%d]):RecordingHint(true),newMinFps=%d,newMaxFps=%d", __FUNCTION__, __LINE__, newMinFps, newMaxFps);
}
#ifdef USE_LIMITATION_FOR_THIRD_PARTY
if (getSamsungCamera() == false && !flagSpecialMode) {
switch(m_fpsProperty) {
case 30000:
case 15000:
newMinFps = m_fpsProperty / 1000;
newMaxFps = m_fpsProperty / 1000;
break;
default:
/* Don't use to set fixed fps in the hal side. */
break;
}
}
#endif
return NO_ERROR;
}
void ExynosCamera3Parameters::m_setPreviewFpsRange(uint32_t min, uint32_t max)
{
setMetaCtlAeTargetFpsRange(&m_metadata, min, max);
setMetaCtlSensorFrameDuration(&m_metadata, (uint64_t)((1000 * 1000 * 1000) / (uint64_t)max));
CLOGI("fps min(%d) max(%d)", min, max);
}
void ExynosCamera3Parameters::getPreviewFpsRange(uint32_t *min, uint32_t *max)
{
/* ex) min = 15 , max = 30 */
getMetaCtlAeTargetFpsRange(&m_metadata, min, max);
}
status_t ExynosCamera3Parameters::checkVideoSize(int newVideoW, int newVideoH)
{
if (0 < newVideoW && 0 < newVideoH &&
m_isSupportedVideoSize(newVideoW, newVideoH) == false) {
return BAD_VALUE;
}
CLOGI("[setParameters]newVideo Size (%dx%d), ratioId(%d)",
newVideoW, newVideoH, m_cameraInfo.videoSizeRatioId);
m_setVideoSize(newVideoW, newVideoH);
return NO_ERROR;
}
bool ExynosCamera3Parameters::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("invalid video Size(maxSize(%d/%d) size(%d/%d)",
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;
}
}
}
CLOGE("Invalid video size(%dx%d)", width, height);
return false;
}
bool ExynosCamera3Parameters::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;
return isUHDRecording;
}
void ExynosCamera3Parameters::m_setVideoSize(int w, int h)
{
m_cameraInfo.videoW = w;
m_cameraInfo.videoH = h;
}
bool ExynosCamera3Parameters::getUHDRecordingMode(void)
{
return m_isUHDRecordingMode();
}
void ExynosCamera3Parameters::getVideoSize(int *w, int *h)
{
*w = m_cameraInfo.videoW;
*h = m_cameraInfo.videoH;
}
void ExynosCamera3Parameters::getMaxVideoSize(int *w, int *h)
{
*w = m_staticInfo->maxVideoW;
*h = m_staticInfo->maxVideoH;
}
int ExynosCamera3Parameters::getVideoFormat(void)
{
if (getAdaptiveCSCRecording() == true) {
return V4L2_PIX_FMT_NV21M;
} else {
return V4L2_PIX_FMT_NV12M;
}
}
status_t ExynosCamera3Parameters::checkCallbackSize(int callbackW, int callbackH)
{
status_t ret = NO_ERROR;
int curCallbackW = -1, curCallbackH = -1;
if (callbackW < 0 || callbackH < 0) {
CLOGE("Invalid callback size. %dx%d",
callbackW, callbackH);
return INVALID_OPERATION;
}
getCallbackSize(&curCallbackW, &curCallbackH);
if (callbackW != curCallbackW || callbackH != curCallbackH) {
CLOGI("curCallbackSize %dx%d newCallbackSize %dx%d",
curCallbackW, curCallbackH, callbackW, callbackH);
m_setCallbackSize(callbackW, callbackH);
}
return ret;
}
void ExynosCamera3Parameters::m_setCallbackSize(int w, int h)
{
m_cameraInfo.callbackW = w;
m_cameraInfo.callbackH = h;
}
void ExynosCamera3Parameters::getCallbackSize(int *w, int *h)
{
*w = m_cameraInfo.callbackW;
*h = m_cameraInfo.callbackH;
}
status_t ExynosCamera3Parameters::checkCallbackFormat(int callbackFormat)
{
status_t ret = NO_ERROR;
int curCallbackFormat = -1;
int newCallbackFormat = -1;
if (callbackFormat < 0) {
CLOGE("Inavlid callback format. %x",
callbackFormat);
return INVALID_OPERATION;
}
newCallbackFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(callbackFormat);
curCallbackFormat = getCallbackFormat();
if (curCallbackFormat != newCallbackFormat) {
char curFormatName[V4L2_FOURCC_LENGTH] = {};
char newFormatName[V4L2_FOURCC_LENGTH] = {};
m_getV4l2Name(curFormatName, V4L2_FOURCC_LENGTH, curCallbackFormat);
m_getV4l2Name(newFormatName, V4L2_FOURCC_LENGTH, newCallbackFormat);
CLOGI("curCallbackFormat %s newCallbackFormat %s",
curFormatName, newFormatName);
m_setCallbackFormat(newCallbackFormat);
}
return ret;
}
void ExynosCamera3Parameters::m_setCallbackFormat(int colorFormat)
{
m_cameraInfo.callbackFormat = colorFormat;
}
int ExynosCamera3Parameters::getCallbackFormat(void)
{
return m_cameraInfo.callbackFormat;
}
bool ExynosCamera3Parameters::getReallocBuffer() {
Mutex::Autolock lock(m_reallocLock);
return m_reallocBuffer;
}
bool ExynosCamera3Parameters::setReallocBuffer(bool enable) {
Mutex::Autolock lock(m_reallocLock);
m_reallocBuffer = enable;
return m_reallocBuffer;
}
void ExynosCamera3Parameters::m_setHighSpeedRecording(bool highSpeed)
{
m_cameraInfo.highSpeedRecording = highSpeed;
}
bool ExynosCamera3Parameters::getHighSpeedRecording(void)
{
return m_cameraInfo.highSpeedRecording;
}
void ExynosCamera3Parameters::m_setRestartPreviewChecked(bool restart)
{
Mutex::Autolock lock(m_parameterLock);
m_flagRestartPreviewChecked = restart;
}
bool ExynosCamera3Parameters::m_getRestartPreviewChecked(void)
{
Mutex::Autolock lock(m_parameterLock);
return m_flagRestartPreviewChecked;
}
void ExynosCamera3Parameters::m_setRestartPreview(bool restart)
{
Mutex::Autolock lock(m_parameterLock);
m_flagRestartPreview = restart;
}
bool ExynosCamera3Parameters::m_getRestartPreview()
{
Mutex::Autolock lock(m_parameterLock);
return m_flagRestartPreview;
}
void ExynosCamera3Parameters::m_setVideoStabilization(bool stabilization)
{
m_cameraInfo.videoStabilization = stabilization;
}
bool ExynosCamera3Parameters::getVideoStabilization(void)
{
return m_cameraInfo.videoStabilization;
}
bool ExynosCamera3Parameters::updateTpuParameters(void)
{
status_t ret = NO_ERROR;
/* 1. update data video stabilization state to actual*/
CLOGD("video stabilization old(%d) new(%d)", m_cameraInfo.videoStabilization, m_flagVideoStabilization);
m_setVideoStabilization(m_flagVideoStabilization);
bool hwVdisMode = this->getHWVdisMode();
if (setDisEnable(hwVdisMode) != NO_ERROR) {
CLOGE("setDisEnable(%d) fail", hwVdisMode);
}
/* 2. update data 3DNR state to actual*/
CLOGD("3DNR old(%d) new(%d)", m_cameraInfo.is3dnrMode, m_flag3dnrMode);
m_set3dnrMode(m_flag3dnrMode);
if (setDnrEnable(m_flag3dnrMode) != NO_ERROR) {
CLOGE("setDnrEnable(%d) fail", m_flag3dnrMode);
}
return true;
}
bool ExynosCamera3Parameters::isSWVdisMode(void)
{
bool swVDIS_mode = false;
bool use3DNR_dmaout = false;
int nPreviewW, nPreviewH;
getPreviewSize(&nPreviewW, &nPreviewH);
if ((getRecordingHint() == true) &&
(getCameraId() == CAMERA_ID_BACK) &&
(getHighSpeedRecording() == false) &&
(use3DNR_dmaout == false) &&
(getSWVdisUIMode() == true) &&
((nPreviewW == 1920 && nPreviewH == 1080) || (nPreviewW == 1280 && nPreviewH == 720)))
{
swVDIS_mode = true;
}
return swVDIS_mode;
}
bool ExynosCamera3Parameters::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
return ret;
}
int ExynosCamera3Parameters::getHWVdisFormat(void)
{
return V4L2_PIX_FMT_YUYV;
}
bool ExynosCamera3Parameters::getSWVdisMode(void)
{
return m_cameraInfo.swVdisMode;
}
bool ExynosCamera3Parameters::getSWVdisUIMode(void)
{
return m_cameraInfo.swVdisUIMode;
}
status_t ExynosCamera3Parameters::checkYuvSize(const int width, const int height, const int outputPortId)
{
status_t ret = NO_ERROR;
int curYuvWidth = 0;
int curYuvHeight = 0;
getYuvSize(&curYuvWidth, &curYuvHeight, outputPortId);
if (m_isSupportedPreviewSize(width, height) == false) {
CLOGE("Invalid YUV size. %dx%d",
width, height);
return BAD_VALUE;
}
CLOGI("curYuvSize %dx%d newYuvSize %dx%d outputPortId %d",
curYuvWidth, curYuvHeight, width, height, outputPortId);
if (curYuvWidth != width || curYuvHeight != height) {
m_setYuvSize(width, height, outputPortId);
#ifdef USE_BDS_2_0_480P_YUV
m_yuvSizeSetup[outputPortId] = true;
#endif
m_previewSizeChanged = true;
} else {
m_previewSizeChanged = false;
}
if (outputPortId < ExynosCamera3Parameters::YUV_MAX) {
/* Update minimum YUV size */
if(m_minYuvW == 0) {
m_minYuvW = width;
} else if (width < m_minYuvW) {
m_minYuvW = width;
}
if(m_minYuvH == 0) {
m_minYuvH = height;
} else if (height < m_minYuvH) {
m_minYuvH = height;
}
/* Update maximum YUV size */
if(m_maxYuvW == 0) {
m_maxYuvW = width;
} else if (width > m_maxYuvW) {
m_maxYuvW = width;
}
if(m_maxYuvH == 0) {
m_maxYuvH = height;
} else if (height > m_maxYuvH) {
m_maxYuvH = height;
}
CLOGV("m_minYuvW(%d) m_minYuvH(%d) m_maxYuvW(%d) m_maxYuvH(%d)",
m_minYuvW, m_minYuvH, m_maxYuvW, m_maxYuvH);
}
#ifdef SUPPORT_DEPTH_MAP
checkUseDepthMap();
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::m_adjustPreviewSize(int *newPreviewW, int *newPreviewH,
int *newCalHwPreviewW, int *newCalHwPreviewH)
{
/* hack : when app give 1446, we calibrate to 1440 */
if (*newPreviewW == 1446 && *newPreviewH == 1080) {
CLOGW("Invalid previewSize(%d/%d). so, calibrate to (1440/%d)", *newPreviewW, *newPreviewH, *newPreviewH);
*newPreviewW = 1440;
}
*newCalHwPreviewW = *newPreviewW;
*newCalHwPreviewH = *newPreviewH;
return NO_ERROR;
}
#ifdef HAL3_YUVSIZE_BASED_BDS
/*
Make the all YUV output size as smallest preview size.
Format will be set to NV21
*/
status_t ExynosCamera3Parameters::initYuvSizes() {
int maxWidth, maxHeight = 0;
int (*sizeList)[SIZE_OF_RESOLUTION];
size_t lastIdx = 0;
if (getCameraId() == CAMERA_ID_BACK) {
lastIdx = m_staticInfo->rearPreviewListMax - 1;
sizeList = m_staticInfo->rearPreviewList;
} else {
lastIdx = m_staticInfo->frontPreviewListMax - 1;
sizeList = m_staticInfo->frontPreviewList;
}
for(int outputPort = 0; outputPort < getYuvStreamMaxNum(); outputPort++) {
CLOGV("Port[%d] Idx[%d], Size(%d x %d) / true"
, outputPort, lastIdx, sizeList[lastIdx][0], sizeList[lastIdx][1]);
/* YUV */
m_setYuvSize(sizeList[lastIdx][0], sizeList[lastIdx][1], outputPort);
m_setYuvFormat(V4L2_PIX_FMT_NV21, outputPort);
/* YUV_STALL*/
m_setYuvSize(sizeList[lastIdx][0], sizeList[lastIdx][1], outputPort + YUV_MAX);
m_setYuvFormat(V4L2_PIX_FMT_NV21, outputPort + YUV_MAX);
}
return NO_ERROR;
}
#endif
status_t ExynosCamera3Parameters::resetMinYuvSize() {
m_minYuvW = 0;
m_minYuvH = 0;
return OK;
}
status_t ExynosCamera3Parameters::getMinYuvSize(int* w, int* h) const {
if(m_minYuvH == 0 || m_minYuvW == 0) {
CLOGE(" Min YUV size is not initialized (w=%d, h=%d)"
, m_minYuvW, m_minYuvH);
return INVALID_OPERATION;
}
*w = m_minYuvW;
*h = m_minYuvH;
return OK;
}
bool ExynosCamera3Parameters::m_isSupportedPreviewSize(const int width,
const int height)
{
int maxWidth, maxHeight = 0;
int (*sizeList)[SIZE_OF_RESOLUTION];
if (getHighResolutionCallbackMode() == true) {
CLOGD(" Burst panorama mode start");
m_cameraInfo.previewSizeRatioId = SIZE_RATIO_16_9;
return true;
}
getMaxPreviewSize(&maxWidth, &maxHeight);
if (maxWidth*maxHeight < width*height) {
CLOGE("invalid PreviewSize(maxSize(%d/%d) size(%d/%d)",
maxWidth, maxHeight, width, height);
return false;
}
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;
}
}
}
CLOGE("Invalid preview size(%dx%d)", width, height);
return false;
}
#ifdef USE_BINNING_MODE
int *ExynosCamera3Parameters::getBinningSizeTable(void) {
int *sizeList = NULL;
int index = 0;
if (m_staticInfo->vtcallSizeLut == NULL
|| m_staticInfo->vtcallSizeLutMax == 0) {
CLOGE("vtcallSizeLut is NULL");
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;
}
#endif
status_t ExynosCamera3Parameters::m_getPreviewSizeList(int *sizeList)
{
int *tempSizeList = NULL;
int configMode = -1;
int videoRatioEnum = SIZE_RATIO_16_9;
int index = 0;
#ifdef USE_BINNING_MODE
if (getBinningMode() == true) {
tempSizeList = getBinningSizeTable();
} else
#endif
{
if (m_staticInfo->previewSizeLut == NULL) {
CLOGE("previewSizeLut is NULL");
return INVALID_OPERATION;
} else if (m_staticInfo->previewSizeLutMax <= m_cameraInfo.previewSizeRatioId) {
CLOGE("unsupported preview ratioId(%d)",
m_cameraInfo.previewSizeRatioId);
return BAD_VALUE;
}
#if defined(ENABLE_FULL_FRAME)
tempSizeList = m_staticInfo->videoSizeLut[m_cameraInfo.previewSizeRatioId];
#else
configMode = this->getConfigMode();
switch (configMode) {
case CONFIG_MODE::NORMAL:
tempSizeList = m_staticInfo->previewSizeLut[m_cameraInfo.previewSizeRatioId];
break;
case CONFIG_MODE::HIGHSPEED_120:
case CONFIG_MODE::HIGHSPEED_240:
if (m_staticInfo->videoSizeLutHighSpeed240Max == 0
|| m_staticInfo->videoSizeLutHighSpeed240 == NULL) {
CLOGE("videoSizeLutHighSpeed240 is NULL");
} else {
for (index = 0; index < m_staticInfo->videoSizeLutHighSpeed240Max; index++) {
if (m_staticInfo->videoSizeLutHighSpeed240[index][RATIO_ID] == videoRatioEnum) {
break;
}
}
if (index >= m_staticInfo->videoSizeLutHighSpeed240Max)
index = 0;
tempSizeList = m_staticInfo->videoSizeLutHighSpeed240[index];
}
break;
}
#endif
}
if (tempSizeList == NULL) {
CLOGE("fail to get LUT");
return INVALID_OPERATION;
}
for (int i = 0; i < SIZE_LUT_INDEX_END; i++)
sizeList[i] = tempSizeList[i];
return NO_ERROR;
}
void ExynosCamera3Parameters::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_16PX_ALIGN);
*newH = ALIGN_UP((h * 6) / 5, CAMERA_16PX_ALIGN);
}
}
bool ExynosCamera3Parameters::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("[setParameters]highResolutionCallSize:%s",
highResolutionCallbackMode == true? "on":"off");
m_setHighResolutionCallbackMode(highResolutionCallbackMode);
return highResolutionCallbackMode;
}
void ExynosCamera3Parameters::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;
CLOGD("[setParameters]highResolutionMode:%s",
highResolutionCallbackMode == true? "on":"off");
m_setHighResolutionCallbackMode(highResolutionCallbackMode);
}
void ExynosCamera3Parameters::m_setHighResolutionCallbackMode(bool enable)
{
m_cameraInfo.highResolutionCallbackMode = enable;
}
bool ExynosCamera3Parameters::getHighResolutionCallbackMode(void)
{
return m_cameraInfo.highResolutionCallbackMode;
}
status_t ExynosCamera3Parameters::checkPreviewFormat(const int streamPreviewFormat)
{
status_t ret = NO_ERROR;
int curPreviewFormat = -1;
int newPreviewFormat = -1;
newPreviewFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(streamPreviewFormat);
curPreviewFormat = getPreviewFormat();
if (curPreviewFormat != newPreviewFormat) {
char curFormatName[V4L2_FOURCC_LENGTH] = {};
char newFormatName[V4L2_FOURCC_LENGTH] = {};
m_getV4l2Name(curFormatName, V4L2_FOURCC_LENGTH, curPreviewFormat);
m_getV4l2Name(newFormatName, V4L2_FOURCC_LENGTH, newPreviewFormat);
CLOGI("curPreviewFormat %s newPreviewFormat %s",
curFormatName, newFormatName);
m_setPreviewFormat(newPreviewFormat);
}
return ret;
}
status_t ExynosCamera3Parameters::checkYuvFormat(const int format, const int outputPortId)
{
status_t ret = NO_ERROR;
int curYuvFormat = -1;
int newYuvFormat = -1;
newYuvFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(format);
curYuvFormat = getYuvFormat(outputPortId);
if (newYuvFormat != curYuvFormat) {
char curFormatName[V4L2_FOURCC_LENGTH] = {};
char newFormatName[V4L2_FOURCC_LENGTH] = {};
m_getV4l2Name(curFormatName, V4L2_FOURCC_LENGTH, curYuvFormat);
m_getV4l2Name(newFormatName, V4L2_FOURCC_LENGTH, newYuvFormat);
CLOGI("curYuvFormat %s newYuvFormat %s outputPortId %d",
curFormatName, newFormatName, outputPortId);
m_setYuvFormat(newYuvFormat, outputPortId);
}
return ret;
}
void ExynosCamera3Parameters::setPreviewSize(int w, int h)
{
m_cameraInfo.previewW = w;
m_cameraInfo.previewH = h;
}
void ExynosCamera3Parameters::getPreviewSize(int *w, int *h)
{
*w = m_cameraInfo.previewW;
*h = m_cameraInfo.previewH;
}
void ExynosCamera3Parameters::m_setYuvSize(const int width, const int height, const int index)
{
int yuvWidthLength = sizeof(m_cameraInfo.yuvWidth) / sizeof(m_cameraInfo.yuvWidth[0]);
int yuvHeightLength = sizeof(m_cameraInfo.yuvHeight) / sizeof(m_cameraInfo.yuvHeight[0]);
if (yuvWidthLength != YUV_OUTPUT_PORT_ID_MAX
|| yuvHeightLength != YUV_OUTPUT_PORT_ID_MAX) {
android_printAssert(NULL, LOG_TAG, "ASSERT:Invalid yuvSize array length %dx%d."\
" YUV_OUTPUT_PORT_ID_MAX %d",
yuvWidthLength, yuvHeightLength,
YUV_OUTPUT_PORT_ID_MAX);
return;
}
m_cameraInfo.yuvWidth[index] = width;
m_cameraInfo.yuvHeight[index] = height;
}
void ExynosCamera3Parameters::getYuvSize(int *width, int *height, int index)
{
int yuvWidthLength = sizeof(m_cameraInfo.yuvWidth)/sizeof(m_cameraInfo.yuvWidth[0]);
int yuvHeightLength = sizeof(m_cameraInfo.yuvHeight)/sizeof(m_cameraInfo.yuvHeight[0]);
if (yuvWidthLength != YUV_OUTPUT_PORT_ID_MAX
|| yuvHeightLength != YUV_OUTPUT_PORT_ID_MAX) {
android_printAssert(NULL, LOG_TAG, "ASSERT:Invalid yuvSize array length %dx%d."\
" YUV_OUTPUT_PORT_ID_MAX %d",
yuvWidthLength, yuvHeightLength,
YUV_OUTPUT_PORT_ID_MAX);
return;
}
*width = m_cameraInfo.yuvWidth[index];
*height = m_cameraInfo.yuvHeight[index];
}
void ExynosCamera3Parameters::getMaxSensorSize(int *w, int *h)
{
*w = m_staticInfo->maxSensorW;
*h = m_staticInfo->maxSensorH;
}
void ExynosCamera3Parameters::getSensorMargin(int *w, int *h)
{
*w = m_staticInfo->sensorMarginW;
*h = m_staticInfo->sensorMarginH;
}
void ExynosCamera3Parameters::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) {
CLOGW("Invalid sensor margin ratio(%f), bnsRatio(%f), binningRatio(%f)",
sensorMarginRatio, bnsRatio, binningRatio);
sensorMarginRatio = 1.00f;
}
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 ExynosCamera3Parameters::getMaxPreviewSize(int *w, int *h)
{
*w = m_staticInfo->maxPreviewW;
*h = m_staticInfo->maxPreviewH;
}
int ExynosCamera3Parameters::getBayerFormat(int pipeId)
{
int bayerFormat = V4L2_PIX_FMT_SBGGR16;
#ifdef CAMERA_PACKED_BAYER_ENABLE
switch (pipeId) {
case PIPE_FLITE:
case PIPE_VC0:
case PIPE_3AA_REPROCESSING:
bayerFormat = V4L2_PIX_FMT_SBGGR16;
break;
case PIPE_3AA:
case PIPE_FLITE_REPROCESSING:
bayerFormat = CAMERA_FLITE_BAYER_FORMAT;
break;
case PIPE_3AC:
case PIPE_3AP:
case PIPE_ISP:
case PIPE_3AC_REPROCESSING:
case PIPE_3AP_REPROCESSING:
case PIPE_ISP_REPROCESSING:
bayerFormat = CAMERA_3APC_BAYER_FORMAT;
break;
default:
CLOGW("Invalid pipeId(%d)", pipeId);
break;
}
#endif
return bayerFormat;
}
void ExynosCamera3Parameters::m_setPreviewFormat(int fmt)
{
m_cameraInfo.previewFormat = fmt;
}
void ExynosCamera3Parameters::m_setYuvFormat(const int format, const int index)
{
m_cameraInfo.yuvFormat[index] = format;
}
int ExynosCamera3Parameters::getPreviewFormat(void)
{
return m_cameraInfo.previewFormat;
}
int ExynosCamera3Parameters::getYuvFormat(const int index)
{
return m_cameraInfo.yuvFormat[index];
}
void ExynosCamera3Parameters::m_setHwPreviewSize(int w, int h)
{
m_cameraInfo.hwPreviewW = w;
m_cameraInfo.hwPreviewH = h;
}
void ExynosCamera3Parameters::getHwPreviewSize(int *w, int *h)
{
getYuvSize(w, h, 0);
if (*w <= 0 || *h <= 0)
getMaxPreviewSize(w, h);
}
void ExynosCamera3Parameters::setHwPreviewStride(int stride)
{
m_cameraInfo.previewStride = stride;
}
int ExynosCamera3Parameters::getHwPreviewStride(void)
{
return m_cameraInfo.previewStride;
}
int ExynosCamera3Parameters::getHwPreviewFormat(void)
{
CLOGV("m_cameraInfo.hwPreviewFormat(%d)", m_cameraInfo.hwPreviewFormat);
return m_cameraInfo.hwPreviewFormat;
}
void ExynosCamera3Parameters::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("Invalid sensor size (maxSize(%d/%d) size(%d/%d)",
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 {
getBnsSize(&newHwSensorW, &newHwSensorH);
}
getHwSensorSize(&curHwSensorW, &curHwSensorH);
CLOGI("curHwSensor size(%dx%d) newHwSensor size(%dx%d)", curHwSensorW, curHwSensorH, newHwSensorW, newHwSensorH);
if (curHwSensorW != newHwSensorW || curHwSensorH != newHwSensorH) {
m_setHwSensorSize(newHwSensorW, newHwSensorH);
CLOGI("newHwSensor size(%dx%d)", newHwSensorW, newHwSensorH);
}
}
void ExynosCamera3Parameters::m_setHwSensorSize(int w, int h)
{
m_cameraInfo.hwSensorW = w;
m_cameraInfo.hwSensorH = h;
}
void ExynosCamera3Parameters::getHwSensorSize(int *w, int *h)
{
int width = 0;
int height = 0;
int sizeList[SIZE_LUT_INDEX_END];
/* 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;
}
*w = width;
*h = height;
}
void ExynosCamera3Parameters::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) {
#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;
CLOGI("bnsRatio(%d), videoSize (%d, %d)",
bnsRatio, videoW, videoH);
} else
#endif
{
bnsRatio = 1000;
}
if (bnsRatio != getBnsScaleRatio()) {
CLOGI(" restart set due to changing bnsRatio(%d/%d)",
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(" Cannot update BNS scale ratio(%d)", bnsRatio);
}
status_t ExynosCamera3Parameters::m_setBnsScaleRatio(int ratio)
{
#define MIN_BNS_RATIO 1000
#define MAX_BNS_RATIO 8000
if (m_staticInfo->bnsSupport == false) {
CLOGD(" This camera does not support BNS");
ratio = MIN_BNS_RATIO;
}
if (ratio < MIN_BNS_RATIO || ratio > MAX_BNS_RATIO) {
CLOGE(" Out of bound, ratio(%d), min:max(%d:%d)", ratio, MAX_BNS_RATIO, MAX_BNS_RATIO);
return BAD_VALUE;
}
CLOGD(" update BNS ratio(%d -> %d)", 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;
}
uint32_t ExynosCamera3Parameters::getBnsScaleRatio(void)
{
return m_cameraInfo.bnsScaleRatio;
}
void ExynosCamera3Parameters::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("m_setParamCropRegion() fail");
#else
ExynosRect srcRect, dstRect;
getPreviewBayerCropSize(&srcRect, &dstRect);
#endif
}
void ExynosCamera3Parameters::getBnsSize(int *w, int *h)
{
*w = m_cameraInfo.bnsW;
*h = m_cameraInfo.bnsH;
}
void ExynosCamera3Parameters::updateBinningScaleRatio(void)
{
int ret = 0;
uint32_t binningRatio = DEFAULT_BINNING_RATIO * 1000;
if ((getRecordingHint() == true)
&& (getHighSpeedRecording() == true)) {
int configMode = getConfigMode();
switch (configMode) {
case CONFIG_MODE::HIGHSPEED_60:
binningRatio = 2000;
break;
case CONFIG_MODE::HIGHSPEED_120:
case CONFIG_MODE::HIGHSPEED_240:
binningRatio = 4000;
break;
default:
CLOGE("Invalide configMode(%d)", configMode);
}
}
#ifdef USE_BINNING_MODE
else if (getBinningMode() == true) {
binningRatio = 2000;
}
#endif
if (binningRatio != getBinningScaleRatio()) {
CLOGI("New sensor binning ratio(%d)", binningRatio);
ret = m_setBinningScaleRatio(binningRatio);
}
if (ret < 0)
CLOGE(" Cannot update BNS scale ratio(%d)", binningRatio);
}
status_t ExynosCamera3Parameters::m_setBinningScaleRatio(int ratio)
{
#define MIN_BINNING_RATIO 1000
#define MAX_BINNING_RATIO 6000
if (ratio < MIN_BINNING_RATIO || ratio > MAX_BINNING_RATIO) {
CLOGE(" Out of bound, ratio(%d), min:max(%d:%d)",
ratio, MAX_BINNING_RATIO, MAX_BINNING_RATIO);
return BAD_VALUE;
}
m_cameraInfo.binningScaleRatio = ratio;
return NO_ERROR;
}
uint32_t ExynosCamera3Parameters::getBinningScaleRatio(void)
{
return m_cameraInfo.binningScaleRatio;
}
status_t ExynosCamera3Parameters::checkPictureSize(int pictureW, int pictureH)
{
int curPictureW = 0;
int curPictureH = 0;
int curHwPictureW = 0;
int curHwPictureH = 0;
int newHwPictureW = 0;
int newHwPictureH = 0;
if (pictureW < 0 || pictureH < 0) {
return BAD_VALUE;
}
if (m_adjustPictureSize(&pictureW, &pictureH, &newHwPictureW, &newHwPictureH) != NO_ERROR) {
return BAD_VALUE;
}
if (m_isSupportedPictureSize(pictureW, pictureH) == false) {
int maxHwPictureW =0;
int maxHwPictureH = 0;
CLOGE("Invalid picture size(%dx%d)", pictureW, pictureH);
/* prevent wrong size setting */
getMaxPictureSize(&maxHwPictureW, &maxHwPictureH);
m_setPictureSize(maxHwPictureW, maxHwPictureH);
m_setHwPictureSize(maxHwPictureW, maxHwPictureH);
// m_params.setPictureSize(maxHwPictureW, maxHwPictureH);
CLOGE("changed picture size to MAX(%dx%d)", maxHwPictureW, maxHwPictureH);
#ifdef FIXED_SENSOR_SIZE
updateHwSensorSize();
#endif
return INVALID_OPERATION;
}
CLOGI("[setParameters]newPicture Size (%dx%d), ratioId(%d)",
pictureW, pictureH, m_cameraInfo.pictureSizeRatioId);
getPictureSize(&curPictureW, &curPictureH);
getHwPictureSize(&curHwPictureW, &curHwPictureH);
if (curPictureW != pictureW || curPictureH != pictureH ||
curHwPictureW != newHwPictureW || curHwPictureH != newHwPictureH) {
CLOGI("[setParameters]Picture size changed: cur(%dx%d) -> new(%dx%d)",
curPictureW, curPictureH, pictureW, pictureH);
CLOGI("[setParameters]HwPicture size changed: cur(%dx%d) -> new(%dx%d)",
curHwPictureW, curHwPictureH, newHwPictureW, newHwPictureH);
m_setPictureSize(pictureW, pictureH);
m_setHwPictureSize(newHwPictureW, newHwPictureH);
#ifdef FIXED_SENSOR_SIZE
updateHwSensorSize();
#endif
}
return NO_ERROR;
}
status_t ExynosCamera3Parameters::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 {
CLOGE("m_getPreviewSizeList() fail");
return BAD_VALUE;
}
}
getMaxPictureSize(newHwPictureW, newHwPictureH);
if (getCameraId() == CAMERA_ID_BACK) {
ret = getCropRectAlign(*newHwPictureW, *newHwPictureH,
*newPictureW, *newPictureH,
&newX, &newY, &newW, &newH,
CAMERA_BCROP_ALIGN, 2, 0, zoomRatio);
if (ret < 0) {
CLOGE("getCropRectAlign(%d, %d, %d, %d) fail",
*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)",
((float)*newPictureW / (float)*newPictureH));
m_setHwSensorSize(newW, newH);
}
}
#endif
}
return NO_ERROR;
}
bool ExynosCamera3Parameters::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("invalid picture Size(maxSize(%d/%d) size(%d/%d)",
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;
}
}
}
CLOGE("Invalid picture size(%dx%d)", width, height);
return false;
}
void ExynosCamera3Parameters::m_setPictureSize(int w, int h)
{
m_cameraInfo.pictureW = w;
m_cameraInfo.pictureH = h;
}
void ExynosCamera3Parameters::getPictureSize(int *w, int *h)
{
*w = m_cameraInfo.pictureW;
*h = m_cameraInfo.pictureH;
}
void ExynosCamera3Parameters::getMaxPictureSize(int *w, int *h)
{
*w = m_staticInfo->maxPictureW;
*h = m_staticInfo->maxPictureH;
}
void ExynosCamera3Parameters::m_setHwPictureSize(int w, int h)
{
m_cameraInfo.hwPictureW = w;
m_cameraInfo.hwPictureH = h;
}
void ExynosCamera3Parameters::getHwPictureSize(int *w, int *h)
{
*w = m_cameraInfo.hwPictureW;
*h = m_cameraInfo.hwPictureH;
}
void ExynosCamera3Parameters::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 ExynosCamera3Parameters::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;
}
void ExynosCamera3Parameters::m_setHwPictureFormat(int fmt)
{
m_cameraInfo.hwPictureFormat = fmt;
}
int ExynosCamera3Parameters::getHwPictureFormat(void)
{
return m_cameraInfo.hwPictureFormat;
}
status_t ExynosCamera3Parameters::checkJpegQuality(int quality)
{
int curJpegQuality = -1;
if (quality < 0 || quality > 100) {
CLOGE("Invalid JPEG quality %d.",
quality);
return BAD_VALUE;
}
curJpegQuality = getJpegQuality();
if (curJpegQuality != quality) {
CLOGI("curJpegQuality %d newJpegQuality %d",
curJpegQuality, quality);
m_setJpegQuality(quality);
}
return NO_ERROR;
}
void ExynosCamera3Parameters::m_setJpegQuality(int quality)
{
m_cameraInfo.jpegQuality = quality;
}
int ExynosCamera3Parameters::getJpegQuality(void)
{
return m_cameraInfo.jpegQuality;
}
status_t ExynosCamera3Parameters::checkThumbnailSize(int thumbnailW, int thumbnailH)
{
int curThumbnailW = -1, curThumbnailH = -1;
if (thumbnailW < 0 || thumbnailH < 0
|| thumbnailW > m_staticInfo->maxThumbnailW
|| thumbnailH > m_staticInfo->maxThumbnailH) {
CLOGE("Invalide thumbnail size %dx%d",
thumbnailW, thumbnailH);
return BAD_VALUE;
}
getThumbnailSize(&curThumbnailW, &curThumbnailH);
if (curThumbnailW != thumbnailW || curThumbnailH != thumbnailH) {
CLOGI("curThumbnailSize %dx%d newThumbnailSize %dx%d",
curThumbnailW, curThumbnailH, thumbnailW, thumbnailH);
m_setThumbnailSize(thumbnailW, thumbnailH);
}
return NO_ERROR;
}
void ExynosCamera3Parameters::m_setThumbnailSize(int w, int h)
{
m_cameraInfo.thumbnailW = w;
m_cameraInfo.thumbnailH = h;
}
void ExynosCamera3Parameters::getThumbnailSize(int *w, int *h)
{
*w = m_cameraInfo.thumbnailW;
*h = m_cameraInfo.thumbnailH;
}
void ExynosCamera3Parameters::getMaxThumbnailSize(int *w, int *h)
{
*w = m_staticInfo->maxThumbnailW;
*h = m_staticInfo->maxThumbnailH;
}
status_t ExynosCamera3Parameters::checkThumbnailQuality(int quality)
{
int curThumbnailQuality = -1;
if (quality < 0 || quality > 100) {
CLOGE("Invalid thumbnail quality %d",
quality);
return BAD_VALUE;
}
curThumbnailQuality = getThumbnailQuality();
if (curThumbnailQuality != quality) {
CLOGI("curThumbnailQuality %d newThumbnailQuality %d",
curThumbnailQuality, quality);
m_setThumbnailQuality(quality);
}
return NO_ERROR;
}
void ExynosCamera3Parameters::m_setThumbnailQuality(int quality)
{
m_cameraInfo.thumbnailQuality = quality;
}
int ExynosCamera3Parameters::getThumbnailQuality(void)
{
return m_cameraInfo.thumbnailQuality;
}
void ExynosCamera3Parameters::m_set3dnrMode(bool toggle)
{
m_cameraInfo.is3dnrMode = toggle;
}
bool ExynosCamera3Parameters::get3dnrMode(void)
{
return m_cameraInfo.is3dnrMode;
}
void ExynosCamera3Parameters::m_setDrcMode(bool toggle)
{
m_cameraInfo.isDrcMode = toggle;
if (setDrcEnable(toggle) < 0) {
CLOGE(" set DRC fail, toggle(%d)", toggle);
}
}
bool ExynosCamera3Parameters::getDrcMode(void)
{
return m_cameraInfo.isDrcMode;
}
void ExynosCamera3Parameters::m_setOdcMode(bool toggle)
{
m_cameraInfo.isOdcMode = toggle;
}
bool ExynosCamera3Parameters::getOdcMode(void)
{
return m_cameraInfo.isOdcMode;
}
bool ExynosCamera3Parameters::getTpuEnabledMode(void)
{
if (getHWVdisMode() == true)
return true;
if (get3dnrMode() == true)
return true;
if (getOdcMode() == true)
return true;
return false;
}
#ifdef USE_VRA_GROUP
void ExynosCamera3Parameters::getHwVraInputSize(int *w, int *h)
{
#if defined(MAX_VRA_INPUT_SIZE_WIDTH) && defined(MAX_VRA_INPUT_SIZE_HEIGHT)
int vraWidth = MAX_VRA_INPUT_WIDTH;
int vraHeight = MAX_VRA_INPUT_HEIGHT;
#else
int vraWidth = 640;
int vraHeight = 480;
#endif
float vraRatio = ROUND_OFF(((float)vraWidth / (float)vraHeight), 2);
switch (m_cameraInfo.previewSizeRatioId) {
case SIZE_RATIO_16_9:
*w = vraWidth;
*h = ALIGN_UP((vraWidth / 16) * 9, 2);
break;
case SIZE_RATIO_4_3:
*w = ALIGN_UP((vraHeight / 3) * 4, CAMERA_16PX_ALIGN);
*h = vraHeight;
break;
case SIZE_RATIO_1_1:
*w = vraHeight;
*h = vraHeight;
break;
case SIZE_RATIO_3_2:
if (vraRatio == 1.33f) { /* 4:3 */
*w = vraWidth;
*h = ALIGN_UP((vraWidth / 3) * 2, 2);
} else if (vraRatio == 1.77f) { /* 16:9 */
*w = ALIGN_UP((vraHeight / 2) * 3, CAMERA_16PX_ALIGN);
*h = vraHeight;
} else {
*w = vraWidth;
*h = vraHeight;
}
break;
case SIZE_RATIO_5_4:
*w = ALIGN_UP((vraHeight / 4) * 5, CAMERA_16PX_ALIGN);
*h = vraHeight;
break;
case SIZE_RATIO_5_3:
if (vraRatio == 1.33f) { /* 4:3 */
*w = vraWidth;
*h = ALIGN_UP((vraWidth / 5) * 3, 2);
} else if (vraRatio == 1.77f) { /* 16:9 */
*w = ALIGN_UP((vraHeight / 3) * 5, CAMERA_16PX_ALIGN);
*h = vraHeight;
} else {
*w = vraWidth;
*h = vraHeight;
}
break;
case SIZE_RATIO_11_9:
*w = ALIGN_UP((vraHeight / 9) * 11, CAMERA_16PX_ALIGN);
*h = vraHeight;
break;
default:
CLOGW("WARN(%s[%d]):Invalid size ratio(%d)",
__FUNCTION__, __LINE__, m_cameraInfo.previewSizeRatioId);
*w = vraWidth;
*h = vraHeight;
break;
}
}
int ExynosCamera3Parameters::getHwVraInputFormat(void)
{
#if defined(CAMERA_VRA_INPUT_FORMAT)
return CAMERA_VRA_INPUT_FORMAT;
#else
return V4L2_PIX_FMT_NV16;
#endif
}
void ExynosCamera3Parameters::setDsInputPortId(int dsInputPortId)
{
m_dsInputPortId = dsInputPortId;
}
int ExynosCamera3Parameters::getDsInputPortId(void)
{
return m_dsInputPortId;
}
#endif
status_t ExynosCamera3Parameters::setZoomLevel(int zoom)
{
int srcW = 0;
int srcH = 0;
int dstW = 0;
int dstH = 0;
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
return NO_ERROR;
}
status_t ExynosCamera3Parameters::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("Failed to setMetaCtlCropRegion(%d, %d, %d, %d)",
x, y, w, h);
}
return ret;
}
void ExynosCamera3Parameters::m_getCropRegion(int *x, int *y, int *w, int *h)
{
getMetaCtlCropRegion(&m_metadata, x, y, w, h);
}
status_t ExynosCamera3Parameters::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_BCROP_ALIGN, 2,
zoom, zoomRatio) != NO_ERROR) {
CLOGE("getCropRectAlign(%d, %d, %d, %d) fail",
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("size0(%d, %d, %d, %d)",
srcW, srcH, dstW, dstH);
CLOGI("size(%d, %d, %d, %d), level(%d)",
newX, newY, newW, newH, zoom);
m_setHwBayerCropRegion(newW, newH, newX, newY);
return NO_ERROR;
}
int ExynosCamera3Parameters::getZoomLevel(void)
{
return m_cameraInfo.zoom;
}
int ExynosCamera3Parameters::getFocusMode(void)
{
return m_cameraInfo.focusMode;
}
void ExynosCamera3Parameters::m_setExifFixedAttribute(void)
{
char property[PROPERTY_VALUE_MAX];
memset(&m_exifInfo, 0, sizeof(m_exifInfo));
/* 2 0th IFD TIFF Tags */
/* 3 Maker */
property_get("ro.product.manufacturer", property, EXIF_DEF_MAKER);
strncpy((char *)m_exifInfo.maker, property,
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 Exposure Program */
m_exifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
/* 3 Exif Version */
memcpy(m_exifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(m_exifInfo.exif_version));
/* 3 Aperture */
m_exifInfo.aperture.num = (uint32_t)(round(m_staticInfo->aperture * COMMON_DENOMINATOR));
m_exifInfo.aperture.den = COMMON_DENOMINATOR;
/* 3 F Number */
m_exifInfo.fnumber.num = (uint32_t)(round(m_staticInfo->fNumber * COMMON_DENOMINATOR));
m_exifInfo.fnumber.den = COMMON_DENOMINATOR;
/* 3 Maximum lens aperture */
m_exifInfo.max_aperture.num = (uint32_t)(round(m_staticInfo->aperture * COMMON_DENOMINATOR));
m_exifInfo.max_aperture.den = COMMON_DENOMINATOR;
/* 3 Lens Focal Length */
m_exifInfo.focal_length.num = (uint32_t)(round(m_staticInfo->focalLength * COMMON_DENOMINATOR));
m_exifInfo.focal_length.den = COMMON_DENOMINATOR;
/* 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 ExynosCamera3Parameters::setExifChangedAttribute(exif_attribute_t *exifInfo,
ExynosRect *pictureRect,
ExynosRect *thumbnailRect,
camera2_shot_t *shot,
bool useDebugInfo2)
{
m_setExifChangedAttribute(exifInfo, pictureRect, thumbnailRect, shot);
}
void ExynosCamera3Parameters::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[APP_MARKER_4], (void *)&shot->udm, sizeof(struct camera2_udm));
getOisEXIFFromFile(m_staticInfo, (int)m_cameraInfo.oisMode);
/* Copy ois data to debugData*/
memcpy((void *)(mDebugInfo.debugData[APP_MARKER_4] + sizeof(struct camera2_udm)),
(void *)&m_staticInfo->ois_exif_info, sizeof(m_staticInfo->ois_exif_info));
} else {
memcpy((void *)mDebugInfo.debugData[APP_MARKER_4], (void *)&shot->udm, mDebugInfo.debugSize[APP_MARKER_4]);
}
#else
memcpy((void *)mDebugInfo.debugData[APP_MARKER_4], (void *)&shot->udm, mDebugInfo.debugSize[APP_MARKER_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[0] : info
* vendorSpecific2[100] : 0:sirc 1:cml
* vendorSpecific2[101] : cml exposure
* vendorSpecific2[102] : cml iso(gain)
* vendorSpecific2[103] : cml Bv
*/
/* 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
if (shot->dm.sensor.sensitivity < m_staticInfo->sensitivityRange[MIN]) {
exifInfo->iso_speed_rating = m_staticInfo->sensitivityRange[MIN];
} else {
exifInfo->iso_speed_rating = shot->dm.sensor.sensitivity;
}
#endif
/* Exposure Program */
if (m_exposureTimeCapture == 0) {
exifInfo->exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
} else {
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)round((double)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;
CLOGD("udm->internal.vendorSpecific2[100](%d)", shot->udm.internal.vendorSpecific2[100]);
CLOGD("udm->internal.vendorSpecific2[101](%d)", shot->udm.internal.vendorSpecific2[101]);
CLOGD("udm->internal.vendorSpecific2[102](%d)", shot->udm.internal.vendorSpecific2[102]);
CLOGD("udm->internal.vendorSpecific2[103](%d)", shot->udm.internal.vendorSpecific2[103]);
CLOGD("iso_speed_rating(%d)", exifInfo->iso_speed_rating);
CLOGD("exposure_time(%d/%d)", exifInfo->exposure_time.num, exifInfo->exposure_time.den);
CLOGD("shutter_speed(%d/%d)", exifInfo->shutter_speed.num, exifInfo->shutter_speed.den);
CLOGD("aperture (%d/%d)", exifInfo->aperture.num, exifInfo->aperture.den);
CLOGD("brightness (%d/%d)", 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(shot->ctl.aa.sceneMode == AA_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 *ExynosCamera3Parameters::getDebugAttribute(void)
{
return &mDebugInfo;
}
status_t ExynosCamera3Parameters::getFixedExifInfo(exif_attribute_t *exifInfo)
{
if (exifInfo == NULL) {
CLOGE(" buffer is NULL");
return BAD_VALUE;
}
memcpy(exifInfo, &m_exifInfo, sizeof(exif_attribute_t));
return NO_ERROR;
}
#ifdef SAMSUNG_COMPANION
enum companion_drc_mode ExynosCamera3Parameters::getRTDrc(void)
{
enum companion_drc_mode mode = COMPANION_DRC_OFF;
#ifdef CAMERA_GED_FEATURE
CLOGV("empty operation");
#else
getMetaCtlRTDrc(&m_metadata, &mode);
#endif
return mode;
}
enum companion_paf_mode ExynosCamera3Parameters::getPaf(void)
{
enum companion_paf_mode mode = COMPANION_PAF_OFF;
#ifdef CAMERA_GED_FEATURE
CLOGV("empty operation");
#else
getMetaCtlPaf(&m_metadata, &mode);
#endif
return mode;
}
enum companion_wdr_mode ExynosCamera3Parameters::getRTHdr(void)
{
enum companion_wdr_mode mode = COMPANION_WDR_OFF;
#ifdef CAMERA_GED_FEATURE
CLOGV("empty operation");
#else
if (m_use_companion == true)
getMetaCtlRTHdr(&m_metadata, &mode);
#endif
return mode;
}
void ExynosCamera3Parameters::setRTHdr(enum companion_wdr_mode rtHdrMode)
{
setMetaCtlRTHdr(&m_metadata, rtHdrMode);
}
#endif
void ExynosCamera3Parameters::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 ExynosCamera3Parameters::getHdrMode(void)
{
return m_cameraInfo.hdrMode;
}
void ExynosCamera3Parameters::m_setWdrMode(bool wdr)
{
m_cameraInfo.wdrMode = wdr;
}
#ifdef USE_BINNING_MODE
int ExynosCamera3Parameters::getBinningMode(void)
{
int ret = 0;
if (m_staticInfo->vtcallSizeLutMax == 0 || m_staticInfo->vtcallSizeLut == NULL) {
CLOGV("vtCallSizeLut is NULL, can't support the binnig mode");
return ret;
}
#ifdef SAMSUNG_COMPANION
if ((getCameraId() == CAMERA_ID_FRONT) && getUseCompanion()) {
CLOGV("Companion mode in front can't support the binning mode.(%d,%d)",
getCameraId(), getUseCompanion());
return ret;
}
#endif
/* For VT Call with DualCamera Scenario */
if (getDualMode()) {
CLOGV("DualMode can't support the binnig mode.(%d,%d)", getCameraId(), getDualMode());
return ret;
}
if (getVtMode() != 3 && getVtMode() > 0 && getVtMode() < 5) {
ret = 1;
} else {
if (m_binningProperty == true) {
ret = 1;
}
}
return ret;
}
#endif
void ExynosCamera3Parameters::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:
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:
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_ANTI_FOG:
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 ExynosCamera3Parameters::getShotMode(void)
{
return m_cameraInfo.shotMode;
}
void ExynosCamera3Parameters::m_setVtMode(int vtMode)
{
m_cameraInfo.vtMode = vtMode;
setMetaVtMode(&m_metadata, (enum camera_vt_mode)vtMode);
}
int ExynosCamera3Parameters::getVtMode(void)
{
return m_cameraInfo.vtMode;
}
status_t ExynosCamera3Parameters::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 *ExynosCamera3Parameters::getImageUniqueId(void)
{
#if defined(SAMSUNG_TN_FEATURE) && defined(SENSOR_FW_GET_FROM_FILE)
char *sensorfw = NULL;
char *uniqueid = NULL;
#ifdef FORCE_CAL_RELOAD
char checkcal[50];
memset(checkcal, 0, sizeof(checkcal));
#endif
sensorfw = (char *)getSensorFWFromFile(m_staticInfo, m_cameraId);
#ifdef FORCE_CAL_RELOAD
snprintf(checkcal, sizeof(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(sensorfw, " ");
}
}
setImageUniqueId(uniqueid);
return (const char *)m_cameraInfo.imageUniqueId;
#else
return m_cameraInfo.imageUniqueId;
#endif
}
#ifdef SAMSUNG_TN_FEATURE
void ExynosCamera3Parameters::setImageUniqueId(char *uniqueId)
{
memcpy(m_cameraInfo.imageUniqueId, uniqueId, sizeof(m_cameraInfo.imageUniqueId));
}
#endif
#ifdef SAMSUNG_DOF
int ExynosCamera3Parameters::getMoveLensTotal(void)
{
return m_cameraInfo.lensPosTbl[0];
}
void ExynosCamera3Parameters::setMoveLensTotal(int count)
{
m_cameraInfo.lensPosTbl[0] = count;
}
void ExynosCamera3Parameters::setMoveLensCount(int count)
{
m_curLensCount = count;
CLOGD("[setMoveLensCount][DOF]m_curLensCount : %d",
m_curLensCount);
}
void ExynosCamera3Parameters::m_setLensPosition(int step)
{
CLOGD("[m_setLensPosition][DOF]step : %d",
step);
setMetaCtlLensPos(&m_metadata, m_cameraInfo.lensPosTbl[step]);
m_curLensStep = m_cameraInfo.lensPosTbl[step];
}
#endif
#ifdef BURST_CAPTURE
int ExynosCamera3Parameters::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;
} else {
if (m_seriesShotSaveLocation == 0)
seriesShotSaveLocation = BURST_SAVE_PHONE;
else
seriesShotSaveLocation = BURST_SAVE_SDCARD;
}
#endif
return seriesShotSaveLocation;
}
void ExynosCamera3Parameters::setSeriesShotSaveLocation(int ssaveLocation)
{
m_seriesShotSaveLocation = ssaveLocation;
}
char *ExynosCamera3Parameters::getSeriesShotFilePath(void)
{
return m_cameraInfo.seriesShotFilePath;
}
#endif
int ExynosCamera3Parameters::getSeriesShotMode(void)
{
return m_cameraInfo.seriesShotMode;
}
int ExynosCamera3Parameters::getSeriesShotCount(void)
{
return m_cameraInfo.seriesShotCount;
}
void ExynosCamera3Parameters::setSamsungCamera(bool value)
{
String8 tempStr;
ExynosCameraActivityAutofocus *autoFocusMgr = m_activityControl->getAutoFocusMgr();
m_cameraInfo.samsungCamera = value;
}
bool ExynosCamera3Parameters::getSamsungCamera(void)
{
return m_cameraInfo.samsungCamera;
}
bool ExynosCamera3Parameters::getZoomSupported(void)
{
return m_staticInfo->zoomSupport;
}
int ExynosCamera3Parameters::getFocalLengthIn35mmFilm(void)
{
return m_staticInfo->focalLengthIn35mmLength;
}
int ExynosCamera3Parameters::getMaxZoomLevel(void)
{
return m_staticInfo->maxZoomLevel;
}
float ExynosCamera3Parameters::getMaxZoomRatio(void)
{
return (float)m_staticInfo->maxZoomRatio;
}
float ExynosCamera3Parameters::getZoomRatio(int zoomLevel)
{
float zoomRatio = 1.00f;
if (getZoomSupported() == true)
zoomRatio = (float)m_staticInfo->zoomRatioList[zoomLevel];
else
zoomRatio = 1000.00f;
return zoomRatio;
}
float ExynosCamera3Parameters::getZoomRatio(void)
{
android_printAssert(NULL, LOG_TAG, "Not yet supported, assert!!!!");
}
bool ExynosCamera3Parameters::getVideoSnapshotSupported(void)
{
return m_staticInfo->videoSnapshotSupport;
}
bool ExynosCamera3Parameters::getVideoStabilizationSupported(void)
{
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;
}
void ExynosCamera3Parameters::enableMsgType(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
m_enabledMsgType |= msgType;
}
void ExynosCamera3Parameters::disableMsgType(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
m_enabledMsgType &= ~msgType;
}
bool ExynosCamera3Parameters::msgTypeEnabled(int32_t msgType)
{
Mutex::Autolock lock(m_msgLock);
return (m_enabledMsgType & msgType);
}
void ExynosCamera3Parameters::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;
shot->ctl.lens.aperture = m_staticInfo->aperture;
shot->ctl.lens.focalLength = m_staticInfo->focalLength;
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(" Invalid min fps value(%d)", 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(" Invalid max fps value(%d)", 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 */
shot->ctl.noise.mode = ::PROCESSING_MODE_OFF;
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
};
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;
}
/* 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 += 4) {
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 */
shot->ctl.edge.mode = ::PROCESSING_MODE_OFF;
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) {
CLOGE("m_setZoom() fail");
}
/* 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;
memset(&shot->ctl.jpeg.gpsProcessingMethod, 0x0,
sizeof(shot->ctl.jpeg.gpsProcessingMethod));
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. uctl */
/* shot->uctl.companionUd.caf_mode = COMPANION_CAF_ON; */
/* shot->uctl.companionUd.disparity_mode = COMPANION_DISPARITY_CENSUS_CENTER; */
#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
/* 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 ExynosCamera3Parameters::initMetadata(void)
{
status_t ret;
#ifdef USE_BDS_2_0_480P_YUV
clearYuvSizeSetupFlag();
#endif
#ifdef HAL3_YUVSIZE_BASED_BDS
/* Reset all the YUV output sizes to smallest one
To make sure the prior output setting do not affect current session.
*/
ret = initYuvSizes();
if (ret < 0) {
CLOGE("clearYuvSizes() failed!! status(%d)", ret);
}
#endif
/* To find the minimum sized YUV stream in stream configuration, reset the old data */
resetMinYuvSize();
setPreviewSize(0,0);
m_initMetadata();
return OK;
}
status_t ExynosCamera3Parameters::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
memcpy(&meta_shot_ext->shot.uctl.companionUd,
&m_metadata.shot.uctl.companionUd,
sizeof(struct camera2_companion_uctl));
#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
return NO_ERROR;
}
ExynosCameraActivityControl *ExynosCamera3Parameters::getActivityControl(void)
{
return m_activityControl;
}
status_t ExynosCamera3Parameters::setDisEnable(bool enable)
{
setMetaBypassDis(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCamera3Parameters::getDisEnable(void)
{
return m_metadata.dis_bypass;
}
status_t ExynosCamera3Parameters::setDrcEnable(bool enable)
{
setMetaBypassDrc(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCamera3Parameters::getDrcEnable(void)
{
return m_metadata.drc_bypass;
}
status_t ExynosCamera3Parameters::setDnrEnable(bool enable)
{
setMetaBypassDnr(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCamera3Parameters::getDnrEnable(void)
{
return m_metadata.dnr_bypass;
}
status_t ExynosCamera3Parameters::setFdEnable(bool enable)
{
setMetaBypassFd(&m_metadata, enable == true ? 0 : 1);
return NO_ERROR;
}
bool ExynosCamera3Parameters::getFdEnable(void)
{
return m_metadata.fd_bypass;
}
status_t ExynosCamera3Parameters::setFdMode(enum facedetect_mode mode)
{
setMetaCtlFdMode(&m_metadata, mode);
return NO_ERROR;
}
status_t ExynosCamera3Parameters::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 ExynosCamera3Parameters::setFlipHorizontal(int val)
{
if (val < 0) {
CLOGE(" setFlipHorizontal ignored, invalid value(%d)",
val);
return;
}
m_cameraInfo.flipHorizontal = val;
}
int ExynosCamera3Parameters::getFlipHorizontal(void)
{
if (m_cameraInfo.shotMode == SHOT_MODE_FRONT_PANORAMA) {
return 0;
} else {
return m_cameraInfo.flipHorizontal;
}
}
void ExynosCamera3Parameters::setFlipVertical(int val)
{
if (val < 0) {
CLOGE(" setFlipVertical ignored, invalid value(%d)",
val);
return;
}
m_cameraInfo.flipVertical = val;
}
int ExynosCamera3Parameters::getFlipVertical(void)
{
return m_cameraInfo.flipVertical;
}
bool ExynosCamera3Parameters::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 /* TN Code */
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 ExynosCamera3Parameters::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 /* TN Code */
int previewW = 0, previewH = 0;
getPreviewSize(&previewW, &previewH);
if (previewW * previewH <= 1920*1080)
ret = true;
#endif
return ret;
}
#ifdef LLS_CAPTURE
int ExynosCamera3Parameters::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 defined(LLS_VALUE_VERSION_3_0)
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;
}
}
CLOGV("m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d)",
m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode);
return ret;
#elif defined(LLS_VALUE_VERSION_2_0)
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;
}
}
CLOGV("m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d)",
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
CLOGV("m_flagLLSOn(%d) getFlashMode(%d), LowLightMode(%d), shotmode(%d)",
m_flagLLSOn, getFlashMode(), shot->shot.dm.stats.vendor_LowLightMode,getShotMode());
return ret;
#endif
}
void ExynosCamera3Parameters::setLLSOn(uint32_t enable)
{
m_flagLLSOn = enable;
}
bool ExynosCamera3Parameters::getLLSOn(void)
{
return m_flagLLSOn;
}
void ExynosCamera3Parameters::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 ExynosCamera3Parameters::setLLSCaptureOn(bool enable)
{
m_LLSCaptureOn = enable;
}
int ExynosCamera3Parameters::getLLSCaptureOn()
{
return m_LLSCaptureOn;
}
#endif
#endif
#ifdef SR_CAPTURE
void ExynosCamera3Parameters::setSROn(uint32_t enable)
{
m_flagSRSOn = (enable > 0) ? true : false;
}
bool ExynosCamera3Parameters::getSROn(void)
{
return m_flagSRSOn;
}
#endif
#ifdef OIS_CAPTURE
void ExynosCamera3Parameters::setOISCaptureModeOn(bool enable)
{
m_flagOISCaptureOn = enable;
}
bool ExynosCamera3Parameters::getOISCaptureModeOn(void)
{
return m_flagOISCaptureOn;
}
#endif
bool ExynosCamera3Parameters::setDeviceOrientation(int orientation)
{
if (orientation < 0 || orientation % 90 != 0) {
CLOGE("Invalid orientation (%d)",
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("orientation(%d), hwRotation(%d), fdOrientation(%d)",
orientation, hwRotation, fdOrientation);
return true;
}
int ExynosCamera3Parameters::getDeviceOrientation(void)
{
return m_cameraInfo.deviceOrientation;
}
int ExynosCamera3Parameters::getFdOrientation(void)
{
return (m_cameraInfo.deviceOrientation + BACK_ROTATION) % 360;;
}
void ExynosCamera3Parameters::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 ExynosCamera3Parameters::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("m_cameraId(%d) : general[setfile(%d) YUV range(%d)] : reprocesing[setfile(%d) YUV range(%d)]",
m_cameraId,
m_setfile, m_yuvRange,
m_setfileReprocessing, m_yuvRangeReprocessing);
return NO_ERROR;
}
void ExynosCamera3Parameters::setSetfileYuvRange(void)
{
/* reprocessing */
m_getSetfileYuvRange(true, &m_setfileReprocessing, &m_yuvRangeReprocessing);
CLOGD("m_cameraId(%d) : general[setfile(%d) YUV range(%d)] : reprocesing[setfile(%d) YUV range(%d)]",
m_cameraId,
m_setfile, m_yuvRange,
m_setfileReprocessing, m_yuvRangeReprocessing);
}
void ExynosCamera3Parameters::setSetfileYuvRange(bool flagReprocessing, int setfile, int yuvRange)
{
if (flagReprocessing) {
m_setfileReprocessing = setfile;
m_yuvRangeReprocessing = yuvRange;
} else {
m_setfile = setfile;
m_yuvRange = yuvRange;
}
CLOGD("m_cameraId(%d) : general[setfile(%d) YUV range(%d)] : reprocesing[setfile(%d) YUV range(%d)]",
m_cameraId,
m_setfile, m_yuvRange,
m_setfileReprocessing, m_yuvRangeReprocessing);
}
void ExynosCamera3Parameters::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 (getLLSCaptureOn())
stateReg |= STATE_REG_NEED_LLS;
#endif
#ifdef SR_CAPTURE
if (getRecordingHint() == false
#ifdef SET_LLS_CAPTURE_SETFILE
&& !getLLSCaptureOn()
#endif
) {
int zoomLevel = getZoomLevel();
float zoomRatio = getZoomRatio(zoomLevel) / 1000;
if (zoomRatio >= 3.0f && zoomRatio < 4.0f) {
stateReg |= STATE_REG_ZOOM;
CLOGV("currentSetfile zoom");
} else if (zoomRatio >= 4.0f) {
if (getSROn()) {
stateReg |= STATE_REG_ZOOM_OUTDOOR;
CLOGV("currentSetfile zoomoutdoor");
} else {
stateReg |= STATE_REG_ZOOM_INDOOR;
CLOGV("currentSetfile zoomindoor");
}
}
}
#endif
} else {
if ((stateReg & STATE_REG_RECORDINGHINT)
|| (stateReg & STATE_REG_UHD_RECORDING)
|| (stateReg & STATE_REG_DUAL_RECORDINGHINT)) {
flagYUVRange = YUV_LIMITED_RANGE;
}
#ifdef USE_BINNING_MODE
if (getBinningMode() == true) {
stateReg |= STATE_REG_BINNING_MODE;
}
#endif
}
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 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 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 FRONT_CAMERA_USE_SAMSUNG_COMPANION
if (!getUseCompanion())
currentSetfile = ISS_SUB_SCENARIO_FRONT_C2_OFF_STILL_CAPTURE;
else
#endif
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;
case STATE_STILL_BINNING_PREVIEW:
case STATE_VIDEO_BINNING:
case STATE_DUAL_VIDEO_BINNING:
case STATE_DUAL_STILL_BINING_PREVIEW:
#if defined(USE_BINNING_MODE) && defined(SET_PREVIEW_BINNING_SETFILE)
currentSetfile = ISS_SUB_SCENARIO_FRONT_STILL_PREVIEW_BINNING;
#else
currentSetfile = ISS_SUB_SCENARIO_FRONT_STILL_PREVIEW_BINNING;
#endif
break;
default:
CLOGD("can't define senario of setfile.(0x%4x)", 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:
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_STILL_BINNING_PREVIEW:
case STATE_VIDEO_BINNING:
case STATE_DUAL_VIDEO_BINNING:
case STATE_DUAL_STILL_BINING_PREVIEW:
#if defined(USE_BINNING_MODE) && defined(SET_PREVIEW_BINNING_SETFILE)
currentSetfile = ISS_SUB_SCENARIO_STILL_PREVIEW_BINNING;
#else
currentSetfile = BINNING_SETFILE_INDEX;
#endif
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
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
default:
CLOGD("can't define senario of setfile.(0x%4x)", stateReg);
break;
}
}
#if 0
CLOGD("===============================================================================");
CLOGD("CurrentState(0x%4x)", stateReg);
CLOGD("getRTHdr()(%d)", getRTHdr());
CLOGD("getRecordingHint()(%d)", getRecordingHint());
CLOGD("m_isUHDRecordingMode()(%d)", m_isUHDRecordingMode());
CLOGD("getDualMode()(%d)", getDualMode());
CLOGD("getDualRecordingHint()(%d)", getDualRecordingHint());
#ifdef USE_BINNING_MODE
CLOGD("getBinningMode(%d)", getBinningMode());
#endif
CLOGD("flagReprocessing(%d)", flagReprocessing);
CLOGD("===============================================================================");
CLOGD("currentSetfile(%d)", currentSetfile);
CLOGD("flagYUVRange(%d)", flagYUVRange);
CLOGD("===============================================================================");
#else
CLOGD("CurrentState (0x%4x), currentSetfile(%d)", stateReg, currentSetfile);
#endif
done:
*setfile = currentSetfile;
*yuvRange = flagYUVRange;
}
#ifdef SAMSUNG_COMPANION
void ExynosCamera3Parameters::setUseCompanion(bool use)
{
m_use_companion = use;
}
bool ExynosCamera3Parameters::getUseCompanion()
{
if (m_cameraId == CAMERA_ID_FRONT && getDualMode() == true)
m_use_companion = false;
return m_use_companion;
}
#endif
void ExynosCamera3Parameters::setUseDynamicBayer(bool enable)
{
m_useDynamicBayer = enable;
}
bool ExynosCamera3Parameters::getUseDynamicBayer(void)
{
return m_useDynamicBayer;
}
void ExynosCamera3Parameters::setUseDynamicBayerVideoSnapShot(bool enable)
{
m_useDynamicBayerVideoSnapShot = enable;
}
bool ExynosCamera3Parameters::getUseDynamicBayerVideoSnapShot(void)
{
return m_useDynamicBayerVideoSnapShot;
}
void ExynosCamera3Parameters::setUseDynamicBayer120FpsVideoSnapShot(bool enable)
{
m_useDynamicBayer120FpsVideoSnapShot = enable;
}
bool ExynosCamera3Parameters::getUseDynamicBayer120FpsVideoSnapShot(void)
{
return m_useDynamicBayer120FpsVideoSnapShot;
}
void ExynosCamera3Parameters::setUseDynamicBayer240FpsVideoSnapShot(bool enable)
{
m_useDynamicBayer240FpsVideoSnapShot = enable;
}
bool ExynosCamera3Parameters::getUseDynamicBayer240FpsVideoSnapShot(void)
{
return m_useDynamicBayer240FpsVideoSnapShot;
}
void ExynosCamera3Parameters::setUseDynamicScc(bool enable)
{
m_useDynamicScc = enable;
}
bool ExynosCamera3Parameters::getUseDynamicScc(void)
{
bool dynamicScc = m_useDynamicScc;
bool reprocessing = isReprocessing();
if (getRecordingHint() == true && reprocessing == false)
dynamicScc = false;
return dynamicScc;
}
void ExynosCamera3Parameters::setUseFastenAeStable(bool enable)
{
m_useFastenAeStable = enable;
}
bool ExynosCamera3Parameters::getUseFastenAeStable(void)
{
return m_useFastenAeStable;
}
void ExynosCamera3Parameters::setFastenAeStableOn(bool enable)
{
/* dummy function */
}
bool ExynosCamera3Parameters::getFastenAeStableOn(void)
{
/* dummy function */
return false;
}
#ifdef SAMSUNG_LLV
void ExynosCamera3Parameters::setLLV(bool enable)
{
m_isLLVOn = enable;
}
bool ExynosCamera3Parameters::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 ExynosCamera3Parameters::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 = getHwPictureFormat();
getPictureSize(&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 ExynosCamera3Parameters::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 ExynosCamera3Parameters::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;
float zoomRatio = 1.0f;
/* TODO: check state ready for start */
pictureFormat = getHwPictureFormat();
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_BCROP_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
CLOGD("hwSensorSize (%dx%d), previewSize (%dx%d)",
hwSensorW, hwSensorH, previewW, previewH);
CLOGD("hwPictureSize (%dx%d), pictureSize (%dx%d)",
hwPictureW, hwPictureH, pictureW, pictureH);
CLOGD("size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
cropX, cropY, cropW, cropH, zoomLevel);
CLOGD("size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
CLOGD("size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
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 ExynosCamera3Parameters::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;
/* TODO: check state ready for start */
pictureFormat = getHwPictureFormat();
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("originSize (%dx%d) pictureSize (%dx%d)",
originW, originH, pictureW, pictureH);
CLOGD("size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoom);
CLOGD("size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
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 ExynosCamera3Parameters::getPreviewBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect, bool applyZoom)
{
int hwBnsW = 0;
int hwBnsH = 0;
int hwBcropW = 0;
int hwBcropH = 0;
int sizeList[SIZE_LUT_INDEX_END];
int hwSensorMarginW = 0;
int hwSensorMarginH = 0;
/* 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)
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) {
CLOGV("preview ratioId(%d) != videoRatioId(%d), use previewRatioId",
m_cameraInfo.previewSizeRatioId, m_cameraInfo.videoSizeRatioId);
}
}
int curBnsW = 0, curBnsH = 0;
getBnsSize(&curBnsW, &curBnsH);
if (SIZE_RATIO(curBnsW, curBnsH) != SIZE_RATIO(hwBnsW, hwBnsH))
CLOGW("current BNS size(%dx%d) is NOT same with Hw BNS size(%dx%d)",
curBnsW, curBnsH, hwBnsW, hwBnsH);
/* 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;
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;
if (applyZoom == true && isUse3aaInputCrop() == true)
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 = ALIGN_DOWN((int) (cropRegionX * scaleRatioX), 2);
cropRegionY = ALIGN_DOWN((int) (cropRegionY * scaleRatioY),2);
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_BCROP_ALIGN, 2,
0, 0.0f);
dstRect->x = ALIGN_DOWN((cropRegionX + dstRect->x), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + dstRect->y), 2);
}
/* 3. Compensate the crop size to satisfy Max Scale Up Ratio */
if (dstRect->w * SCALER_MAX_SCALE_UP_RATIO < hwBnsW
|| dstRect->h * SCALER_MAX_SCALE_UP_RATIO < hwBnsH) {
int newW = ALIGN_UP((int)ceil((float)hwBnsW / SCALER_MAX_SCALE_UP_RATIO), CAMERA_BCROP_ALIGN);
int newH = ALIGN_UP((int)ceil((float)hwBnsH / SCALER_MAX_SCALE_UP_RATIO), CAMERA_BCROP_ALIGN);
CLOGW("dstRect->w(%d) * SCALER_MAX_SCALE_UP_RATIO(%d) = %d < hwBnsW(%d). it cannot handle by mcsc. so, calibrate to %d",
dstRect->w, SCALER_MAX_SCALE_UP_RATIO, dstRect->w * SCALER_MAX_SCALE_UP_RATIO, hwBnsW, newW);
CLOGW("dstRect->h(%d) * SCALER_MAX_SCALE_UP_RATIO(%d) = %d < hwBnsH(%d). it cannot handle by mcsc. so, calibrate to %d",
dstRect->h, SCALER_MAX_SCALE_UP_RATIO, dstRect->h * SCALER_MAX_SCALE_UP_RATIO, hwBnsH, newH);
dstRect->w = newW;
dstRect->h = newH;
}
/* 4. Compensate the crop size to satisfy Max Scale Up Ratio on reprocessing path */
if (getUsePureBayerReprocessing() == false
&& m_cameraInfo.pictureSizeRatioId != m_cameraInfo.previewSizeRatioId) {
status_t ret = NO_ERROR;
int pictureW = 0;
int pictureH = 0;
ExynosRect pictureCrop;
getPictureSize(&pictureW, &pictureH);
if (pictureW < 1 || pictureH < 1)
getMaxPictureSize(&pictureW, &pictureH);
ret = getCropRectAlign(dstRect->w, dstRect->h,
pictureW, pictureH,
&pictureCrop.x, &pictureCrop.y,
&pictureCrop.w, &pictureCrop.h,
CAMERA_MCSC_ALIGN, 2,
0, 0.0f);
if (ret != NO_ERROR) {
CLOGE("Failed to getCropRectAlign. previewBcrop %dx%d picture %dx%d",
dstRect->w, dstRect->h, pictureW, pictureH);
}
if (pictureCrop.w * SCALER_MAX_SCALE_UP_RATIO < pictureW
|| pictureCrop.h * SCALER_MAX_SCALE_UP_RATIO < pictureH) {
CLOGW("Zoom ratio is upto x%d pictureCrop %dx%d pictureTarget %dx%d",
SCALER_MAX_SCALE_UP_RATIO,
pictureCrop.w, pictureCrop.h,
pictureW, pictureH);
dstRect->x = cropRegionX;
dstRect->y = cropRegionY;
dstRect->w = cropRegionW;
dstRect->h = cropRegionH;
}
}
m_setHwBayerCropRegion(dstRect->w, dstRect->h, dstRect->x, dstRect->y);
#ifdef DEBUG_PERFRAME
CLOGD("hwBnsSize %dx%d, hwBcropSize %d,%d %dx%d",
srcRect->w, srcRect->h,
dstRect->x, dstRect->y, dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::calcPreviewBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
status_t ret = 0;
int maxZoomRatio = 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;
int bayerFormat = getBayerFormat(PIPE_3AA);
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
maxZoomRatio = getMaxZoomRatio() / 1000;
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
m_adjustSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
hwSensorW -= hwSensorMarginW;
hwSensorH -= hwSensorMarginH;
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
int maxSensorW = 0, maxSensorH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
if (isUse3aaInputCrop() == true)
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_BCROP_ALIGN, 2,
0, 0.0f);
cropX = ALIGN_DOWN((cropRegionX + cropX), 2);
cropY = ALIGN_DOWN((cropRegionY + cropY), 2);
if (getUsePureBayerReprocessing() == false) {
int pictureCropX = 0, pictureCropY = 0;
int pictureCropW = 0, pictureCropH = 0;
ret = getCropRectAlign(cropW, cropH,
pictureW, pictureH,
&pictureCropX, &pictureCropY,
&pictureCropW, &pictureCropH,
CAMERA_BCROP_ALIGN, 2,
0, 0.0);
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) {
CLOGW(" zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", 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
CLOGD("hwSensorSize (%dx%d), previewSize (%dx%d)",
hwSensorW, hwSensorH, previewW, previewH);
CLOGD("hwPictureSize (%dx%d), pictureSize (%dx%d)",
hwPictureW, hwPictureH, pictureW, pictureH);
CLOGD("size cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
cropX, cropY, cropW, cropH, zoomLevel);
CLOGD("size2 cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d",
crop_crop_x, crop_crop_y, crop_crop_w, crop_crop_h, zoomLevel);
CLOGD("size pictureFormat = 0x%x, JPEG_INPUT_COLOR_FMT = 0x%x",
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 ExynosCamera3Parameters::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;
CLOGV("SRC cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d ratio = %f", srcRect->x, srcRect->y, srcRect->w, srcRect->h, zoomLevel, zoomRatio);
CLOGV("DST cropX = %d, cropY = %d, cropW = %d, cropH = %d, zoom = %d ratio = %f", dstRect->x, dstRect->y, dstRect->w, dstRect->h, zoomLevel, zoomRatio);
return NO_ERROR;
}
void ExynosCamera3Parameters::setCheckRestartStream(__unused bool checkRestartFlag)
{
m_setRestartPreviewChecked(checkRestartFlag);
}
bool ExynosCamera3Parameters::getCheckRestartStream(void)
{
return m_getRestartPreviewChecked();
}
void ExynosCamera3Parameters::setRestartStream(bool restart)
{
m_setRestartPreview(restart);
}
bool ExynosCamera3Parameters::getRestartStream(void)
{
return m_getRestartPreview();
}
status_t ExynosCamera3Parameters::getPictureBayerCropSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
int hwBnsW = 0;
int hwBnsH = 0;
int hwBcropW = 0;
int hwBcropH = 0;
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];
/* 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;
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;
if (isUseReprocessing3aaInputCrop() == true)
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_BCROP_ALIGN, 2,
0, 0.0f);
dstRect->x = ALIGN_DOWN((cropRegionX + dstRect->x), 2);
dstRect->y = ALIGN_DOWN((cropRegionY + dstRect->y), 2);
}
/* 3. Compensate the crop size to satisfy Max Scale Up Ratio */
if (dstRect->w * SCALER_MAX_SCALE_UP_RATIO < hwBnsW
|| dstRect->h * SCALER_MAX_SCALE_UP_RATIO < hwBnsH) {
dstRect->w = ALIGN_UP((int)ceil((float)hwBnsW / SCALER_MAX_SCALE_UP_RATIO), CAMERA_BCROP_ALIGN);
dstRect->h = ALIGN_UP((int)ceil((float)hwBnsH / SCALER_MAX_SCALE_UP_RATIO), CAMERA_BCROP_ALIGN);
}
#if DEBUG_PERFRAME
CLOGD("hwBnsSize %dx%d, hwBcropSize %d,%d %dx%d",
srcRect->w, srcRect->h,
dstRect->x, dstRect->y, dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::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 maxZoomRatio = 0;
int bayerFormat = getBayerFormat(PIPE_3AA_REPROCESSING);
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
/* TODO: check state ready for start */
pictureFormat = getHwPictureFormat();
maxZoomRatio = getMaxZoomRatio() / 1000;
getHwPictureSize(&hwPictureW, &hwPictureH);
getPictureSize(&pictureW, &pictureH);
getMaxSensorSize(&maxSensorW, &maxSensorH);
getHwSensorSize(&hwSensorW, &hwSensorH);
getPreviewSize(&previewW, &previewH);
getSensorMargin(&hwSensorMarginW, &hwSensorMarginH);
hwSensorW -= hwSensorMarginW;
hwSensorH -= hwSensorMarginH;
if (getUsePureBayerReprocessing() == true) {
int cropRegionX = 0, cropRegionY = 0, cropRegionW = 0, cropRegionH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
if (isUseReprocessing3aaInputCrop() == true)
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_BCROP_ALIGN, 2,
0, 0.0f);
cropX = ALIGN_DOWN((cropRegionX + cropX), 2);
cropY = ALIGN_DOWN((cropRegionY + cropY), 2);
if (cropW < pictureW / maxZoomRatio || cropH < pictureH / maxZoomRatio) {
CLOGW(" zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", 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 {
getHwBayerCropRegion(&hwSensorCropW, &hwSensorCropH, &hwSensorCropX, &hwSensorCropY);
ret = getCropRectAlign(hwSensorCropW, hwSensorCropH,
pictureW, pictureH,
&cropX, &cropY,
&cropW, &cropH,
CAMERA_BCROP_ALIGN, 2,
0, 0.0f);
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) {
CLOGW(" zoom ratio is upto x%d, crop(%dx%d), picture(%dx%d)", 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
CLOGD("maxSensorSize %dx%d, hwSensorSize %dx%d, previewSize %dx%d",
maxSensorW, maxSensorH, hwSensorW, hwSensorH, previewW, previewH);
CLOGD("hwPictureSize %dx%d, pictureSize %dx%d",
hwPictureW, hwPictureH, pictureW, pictureH);
CLOGD("pictureBayerCropSize %d,%d %dx%d",
cropX, cropY, cropW, cropH);
CLOGD("pictureFormat 0x%x, JPEG_INPUT_COLOR_FMT 0x%x",
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 ExynosCamera3Parameters::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)
CLOGV("preview ratioId(%d) != videoRatioId(%d), use previewRatioId",
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
#ifdef USE_BDS_2_0_480P_YUV
/* For the Exynos8890 MC-scaler :
The image quality from MC-scaler is guaranteed only under 1/8 down scale ratio.
(Poly : ~1/4, Bilinear : ~1/2)
To make pass the ITS sensor fusion test,
YUV stream with the size under 480p must be scaled down firstly at BDS with 1/2 ratio.
*/
if (this->getCameraId() == CAMERA_ID_BACK) {
int bdsRatio = 1;
for (int i = 0; i < this->getYuvStreamMaxNum(); i++) {
if (m_yuvSizeSetup[i] == true
&& m_cameraInfo.yuvHeight[i] > 480 ) {
bdsRatio = 1;
break;
} else if (m_yuvSizeSetup[i] == true) {
bdsRatio = 2;
}
}
hwBdsW = ALIGN_DOWN((hwBdsW / bdsRatio), 2);
hwBdsH = ALIGN_DOWN((hwBdsH / bdsRatio), 2);
}
#endif
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = hwBdsW;
dstRect->h = hwBdsH;
#ifdef DEBUG_PERFRAME
CLOGD("hwBdsSize (%dx%d)",
dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getPreviewBdsSize(ExynosRect *dstRect, bool applyZoom)
{
status_t ret = NO_ERROR;
ExynosRect bnsSize;
ExynosRect bayerCropSize;
ExynosRect bdsSize;
ret = m_getPreviewBdsSize(&bdsSize);
if (ret != NO_ERROR) {
CLOGE("Failed to m_getPreviewBdsSize()");
return ret;
}
if (this->getHWVdisMode() == true) {
int disW = ALIGN_UP((int)(bdsSize.w * HW_VDIS_W_RATIO), 2);
int disH = ALIGN_UP((int)(bdsSize.h * HW_VDIS_H_RATIO), 2);
CLOGV("HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)",
dstRect->w, dstRect->h, disW, disH);
bdsSize.w = disW;
bdsSize.h = disH;
}
/* Check the invalid BDS size compared to Bcrop size */
ret = getPreviewBayerCropSize(&bnsSize, &bayerCropSize, applyZoom);
if (ret != NO_ERROR)
CLOGE("Failed to getPreviewBayerCropSize()");
if (bayerCropSize.w < bdsSize.w || bayerCropSize.h < bdsSize.h) {
CLOGV("bayerCropSize %dx%d is smaller than BDSSize %dx%d. Force bayerCropSize",
bayerCropSize.w, bayerCropSize.h, bdsSize.w, bdsSize.h);
bdsSize.w = bayerCropSize.w;
bdsSize.h = bayerCropSize.h;
}
#ifdef HAL3_YUVSIZE_BASED_BDS
/*
Do not use BDS downscaling if one or more YUV ouput size
is larger than BDS output size
*/
for (int i = 0; i < getYuvStreamMaxNum(); i++) {
int yuvWidth, yuvHeight;
getYuvSize(&yuvWidth, &yuvHeight, i);
if(yuvWidth > bdsSize.w || yuvHeight > bdsSize.h) {
CLOGV("Expanding BDS(%d x %d) size to BCrop(%d x %d) to handle YUV stream [%d, (%d x %d)]",
bdsSize.w, bdsSize.h, bayerCropSize.w, bayerCropSize.h, i, yuvWidth, yuvHeight);
bdsSize.w = bayerCropSize.w;
bdsSize.h = bayerCropSize.h;
break;
}
}
#endif
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = bdsSize.w;
dstRect->h = bdsSize.h;
#ifdef DEBUG_PERFRAME
CLOGD("hwBdsSize %dx%d",
dstRect->w, dstRect->h);
#endif
return ret;
}
status_t ExynosCamera3Parameters::calcPreviewBDSSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
status_t ret = NO_ERROR;
int previewW = 0, previewH = 0;
int bayerFormat = getBayerFormat(PIPE_3AA);
ExynosRect bnsSize;
ExynosRect bayerCropSize;
/* Get preview size info */
getPreviewSize(&previewW, &previewH);
ret = getPreviewBayerCropSize(&bnsSize, &bayerCropSize);
if (ret != NO_ERROR)
CLOGE("getPreviewBayerCropSize() failed");
srcRect->x = bayerCropSize.x;
srcRect->y = bayerCropSize.y;
srcRect->w = bayerCropSize.w;
srcRect->h = bayerCropSize.h;
srcRect->fullW = bnsSize.w;
srcRect->fullH = bnsSize.h;
srcRect->colorFormat = bayerFormat;
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = previewW;
dstRect->h = previewH;
dstRect->fullW = previewW;
dstRect->fullH = previewH;
dstRect->colorFormat = JPEG_INPUT_COLOR_FMT;
/* Check the invalid BDS size compared to Bcrop size */
if (dstRect->w > srcRect->w)
dstRect->w = srcRect->w;
if (dstRect->h > srcRect->h)
dstRect->h = srcRect->h;
#ifdef DEBUG_PERFRAME
CLOGE("BDS %dx%d Preview %dx%d",
dstRect->w, dstRect->h, previewW, previewH);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getPictureBdsSize(ExynosRect *dstRect)
{
status_t ret = NO_ERROR;
ExynosRect bnsSize;
ExynosRect bayerCropSize;
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];
/* Check the invalid BDS size compared to Bcrop size */
ret = getPictureBayerCropSize(&bnsSize, &bayerCropSize);
if (ret != NO_ERROR)
CLOGE("Failed to getPictureBayerCropSize()");
if (bayerCropSize.w < hwBdsW || bayerCropSize.h < hwBdsH) {
CLOGD("bayerCropSize %dx%d is smaller than BDSSize %dx%d. Force bayerCropSize",
bayerCropSize.w, bayerCropSize.h, hwBdsW, hwBdsH);
hwBdsW = bayerCropSize.w;
hwBdsH = bayerCropSize.h;
}
dstRect->x = 0;
dstRect->y = 0;
dstRect->w = hwBdsW;
dstRect->h = hwBdsH;
#ifdef DEBUG_PERFRAME
CLOGD("hwBdsSize %dx%d",
dstRect->w, dstRect->h);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getPreviewYuvCropSize(ExynosRect *yuvCropSize)
{
status_t ret = NO_ERROR;
ExynosRect previewBdsSize;
ExynosRect previewYuvCropSize;
ExynosRect cropRegion;
int maxSensorW = 0, maxSensorH = 0;
float scaleRatioX = 0.0f, scaleRatioY = 0.0f;
/* 1. Check the invalid parameter */
if (yuvCropSize == NULL) {
CLOGE("yuvCropSize is NULL");
return BAD_VALUE;
}
/* 2. Get the BDS info & Zoom info */
ret = this->getPreviewBdsSize(&previewBdsSize);
if (ret != NO_ERROR) {
CLOGE("getPreviewBdsSize failed");
return ret;
}
if (isUseIspInputCrop() == true
|| isUseMcscInputCrop() == true)
m_getCropRegion(&cropRegion.x, &cropRegion.y, &cropRegion.w, &cropRegion.h);
getMaxSensorSize(&maxSensorW, &maxSensorH);
/* 3. Scale down the crop region to adjust with the original yuv size */
scaleRatioX = (float) previewBdsSize.w / (float) maxSensorW;
scaleRatioY = (float) previewBdsSize.h / (float) maxSensorH;
cropRegion.x = (int) (cropRegion.x * scaleRatioX);
cropRegion.y = (int) (cropRegion.y * scaleRatioY);
cropRegion.w = (int) (cropRegion.w * scaleRatioX);
cropRegion.h = (int) (cropRegion.h * scaleRatioY);
if (cropRegion.w < 1 || cropRegion.h < 1) {
cropRegion.w = previewBdsSize.w;
cropRegion.h = previewBdsSize.h;
}
/* 4. Calculate the YuvCropSize with ZoomRatio */
#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(cropRegion.w, CAMERA_BCROP_ALIGN) * SCALER_MAX_SCALE_UP_RATIO < previewBdsSize.w
|| ALIGN_UP(cropRegion.h, 2) * SCALER_MAX_SCALE_UP_RATIO < previewBdsSize.h) {
previewYuvCropSize.w = ALIGN_UP((int)ceil((float)previewBdsSize.w / SCALER_MAX_SCALE_UP_RATIO), CAMERA_BCROP_ALIGN);
previewYuvCropSize.h = ALIGN_UP((int)ceil((float)previewBdsSize.h / SCALER_MAX_SCALE_UP_RATIO), 2);
} else
#endif
{
previewYuvCropSize.w = ALIGN_UP(cropRegion.w, CAMERA_BCROP_ALIGN);
previewYuvCropSize.h = ALIGN_UP(cropRegion.h, 2);
}
/* 4. Calculate the YuvCrop X-Y Offset Coordination & Set Result */
if (previewBdsSize.w > previewYuvCropSize.w) {
yuvCropSize->x = ALIGN_UP(((previewBdsSize.w - previewYuvCropSize.w) >> 1), 2);
yuvCropSize->w = previewYuvCropSize.w;
} else {
yuvCropSize->x = 0;
yuvCropSize->w = previewBdsSize.w;
}
if (previewBdsSize.h > previewYuvCropSize.h) {
yuvCropSize->y = ALIGN_UP(((previewBdsSize.h - previewYuvCropSize.h) >> 1), 2);
yuvCropSize->h = previewYuvCropSize.h;
} else {
yuvCropSize->y = 0;
yuvCropSize->h = previewBdsSize.h;
}
#ifdef DEBUG_PERFRAME
CLOGD("BDS %dx%d cropRegion %d,%d %dx%d",
previewBdsSize.w, previewBdsSize.h,
yuvCropSize->x, yuvCropSize->y, yuvCropSize->w, yuvCropSize->h);
#endif
return ret;
}
status_t ExynosCamera3Parameters::getPictureYuvCropSize(ExynosRect *yuvCropSize)
{
status_t ret = NO_ERROR;
int zoomLevel = 0;
float zoomRatio = 1.00f;
ExynosRect bnsSize;
ExynosRect pictureBayerCropSize;
ExynosRect pictureBdsSize;
ExynosRect ispInputSize;
ExynosRect pictureYuvCropSize;
/* 1. Check the invalid parameter */
if (yuvCropSize == NULL) {
CLOGE("yuvCropSize is NULL");
return BAD_VALUE;
}
/* 2. Get the ISP input info & Zoom info */
if (this->getUsePureBayerReprocessing() == true) {
ret = this->getPictureBdsSize(&pictureBdsSize);
if (ret != NO_ERROR) {
CLOGE("getPictureBdsSize failed");
return ret;
}
ispInputSize.x = 0;
ispInputSize.y = 0;
ispInputSize.w = pictureBdsSize.w;
ispInputSize.h = pictureBdsSize.h;
} else {
ret = this->getPictureBayerCropSize(&bnsSize, &pictureBayerCropSize);
if (ret != NO_ERROR) {
CLOGE("getPictureBdsSize failed");
return ret;
}
ispInputSize.x = 0;
ispInputSize.y = 0;
ispInputSize.w = pictureBayerCropSize.w;
ispInputSize.h = pictureBayerCropSize.h;
}
if (isUseReprocessingIspInputCrop() == true
|| isUseReprocessingMcscInputCrop() == true)
/* TODO: Implement YUV crop for reprocessing */
CLOGE("Picture YUV crop is NOT supported");
/* 3. Calculate the YuvCropSize with ZoomRatio */
#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)ispInputSize.w / zoomRatio), CAMERA_BCROP_ALIGN) * SCALER_MAX_SCALE_UP_RATIO < ispInputSize.w
|| ALIGN_UP((int)((float)ispInputSize.h/ zoomRatio), 2) * SCALER_MAX_SCALE_UP_RATIO < ispInputSize.h) {
pictureYuvCropSize.w = ALIGN_UP((int)ceil((float)ispInputSize.w / zoomRatio), CAMERA_BCROP_ALIGN);
pictureYuvCropSize.h = ALIGN_UP((int)ceil((float)ispInputSize.h / zoomRatio), 2);
} else
#endif
{
pictureYuvCropSize.w = ALIGN_UP((int)((float)ispInputSize.w / zoomRatio), CAMERA_BCROP_ALIGN);
pictureYuvCropSize.h = ALIGN_UP((int)((float)ispInputSize.h / zoomRatio), 2);
}
/* 4. Calculate the YuvCrop X-Y Offset Coordination & Set Result */
if (ispInputSize.w > pictureYuvCropSize.w) {
yuvCropSize->x = ALIGN_UP(((ispInputSize.w - pictureYuvCropSize.w) >> 1), 2);
yuvCropSize->w = pictureYuvCropSize.w;
} else {
yuvCropSize->x = 0;
yuvCropSize->w = ispInputSize.w;
}
if (ispInputSize.h > pictureYuvCropSize.h) {
yuvCropSize->y = ALIGN_UP(((ispInputSize.h - pictureYuvCropSize.h) >> 1), 2);
yuvCropSize->h = pictureYuvCropSize.h;
} else {
yuvCropSize->y = 0;
yuvCropSize->h = ispInputSize.h;
}
#ifdef DEBUG_PERFRAME
CLOGD("ISPS %dx%d YuvCrop %d,%d %dx%d zoomLevel %d zoomRatio %f",
ispInputSize.w, ispInputSize.h,
yuvCropSize->x, yuvCropSize->y, yuvCropSize->w, yuvCropSize->h,
zoomLevel, zoomRatio);
#endif
return ret;
}
status_t ExynosCamera3Parameters::getFastenAeStableSensorSize(int *hwSensorW, int *hwSensorH, int index)
{
*hwSensorW = m_staticInfo->fastAeStableLut[index][SENSOR_W];
*hwSensorH = m_staticInfo->fastAeStableLut[index][SENSOR_H];
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getFastenAeStableBcropSize(int *hwBcropW, int *hwBcropH, int index)
{
*hwBcropW = m_staticInfo->fastAeStableLut[index][BCROP_W];
*hwBcropH = m_staticInfo->fastAeStableLut[index][BCROP_H];
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getFastenAeStableBdsSize(int *hwBdsW, int *hwBdsH, int index)
{
*hwBdsW = m_staticInfo->fastAeStableLut[index][BDS_W];
*hwBdsH = m_staticInfo->fastAeStableLut[index][BDS_H];
return NO_ERROR;
}
status_t ExynosCamera3Parameters::getDepthMapSize(int *depthMapW, int *depthMapH)
{
if (m_staticInfo->depthMapSizeLut!= NULL) {
*depthMapW = m_staticInfo->depthMapSizeLut[m_cameraInfo.previewSizeRatioId][SENSOR_W];
*depthMapH = m_staticInfo->depthMapSizeLut[m_cameraInfo.previewSizeRatioId][SENSOR_H];
} else {
*depthMapW = 0;
*depthMapH = 0;
}
return NO_ERROR;
}
#ifdef SUPPORT_DEPTH_MAP
bool ExynosCamera3Parameters::getUseDepthMap(void)
{
CLOGV(" m_flaguseDepthMap(%d)", m_flaguseDepthMap);
return m_flaguseDepthMap;
}
void ExynosCamera3Parameters::m_setUseDepthMap(bool useDepthMap)
{
m_flaguseDepthMap = useDepthMap;
}
status_t ExynosCamera3Parameters::checkUseDepthMap(void)
{
int depthMapW = 0, depthMapH = 0;
getDepthMapSize(&depthMapW, &depthMapH);
if (depthMapW != 0 && depthMapH != 0) {
m_setUseDepthMap(true);
} else {
m_setUseDepthMap(false);
}
CLOGD(" depthMapW(%d), depthMapH (%d) getUseDepthMap(%d)",
depthMapW, depthMapH, getUseDepthMap());
return NO_ERROR;
}
#endif
#ifdef USE_VRA_GROUP
bool ExynosCamera3Parameters::checkFaceDetectMeta(struct camera2_shot_ext *shot_ext)
{
Mutex::Autolock lock(m_faceDetectMetaLock);
bool ret = false;
if (shot_ext->shot.ctl.stats.faceDetectMode > FACEDETECT_MODE_OFF) {
if (shot_ext->shot.dm.stats.faceDetectMode > FACEDETECT_MODE_OFF
&& m_metadata.shot.dm.request.frameCount < shot_ext->shot.dm.request.frameCount) {
m_metadata.shot.dm.request.frameCount = shot_ext->shot.dm.request.frameCount;
m_metadata.shot.dm.stats.faceDetectMode = shot_ext->shot.dm.stats.faceDetectMode;
for (int i = 0; i < CAMERA2_MAX_FACES; i++) {
m_metadata.shot.dm.stats.faceIds[i] = shot_ext->shot.dm.stats.faceIds[i];
m_metadata.shot.dm.stats.faceScores[i] = shot_ext->shot.dm.stats.faceScores[i];
for (int j = 0; j < 6; j++) {
m_metadata.shot.dm.stats.faceLandmarks[i][j] = shot_ext->shot.dm.stats.faceLandmarks[i][j];
}
for (int j = 0; j < 4; j++) {
m_metadata.shot.dm.stats.faceRectangles[i][j] = shot_ext->shot.dm.stats.faceRectangles[i][j];
}
}
for (int i = 0; i < CAMERA2_MAX_FACES-2; i++) {
m_metadata.shot.dm.stats.faces[i] = shot_ext->shot.dm.stats.faces[i];
}
} else if (shot_ext->shot.dm.stats.faceDetectMode <= FACEDETECT_MODE_OFF) {
shot_ext->shot.dm.stats.faceDetectMode = m_metadata.shot.dm.stats.faceDetectMode;
for (int i = 0; i < CAMERA2_MAX_FACES; i++) {
shot_ext->shot.dm.stats.faceIds[i] = m_metadata.shot.dm.stats.faceIds[i];
shot_ext->shot.dm.stats.faceScores[i] = m_metadata.shot.dm.stats.faceScores[i];
for (int j = 0; j < 6; j++) {
shot_ext->shot.dm.stats.faceLandmarks[i][j] = m_metadata.shot.dm.stats.faceLandmarks[i][j];
}
for (int j = 0; j < 4; j++) {
shot_ext->shot.dm.stats.faceRectangles[i][j] = m_metadata.shot.dm.stats.faceRectangles[i][j];
}
}
for (int i = 0; i < CAMERA2_MAX_FACES-2; i++) {
m_metadata.shot.dm.stats.faces[i] = shot_ext->shot.dm.stats.faces[i];
}
ret = true;
}
}
return ret;
}
#endif
status_t ExynosCamera3Parameters::calcPictureBDSSize(ExynosRect *srcRect, ExynosRect *dstRect)
{
status_t ret = NO_ERROR;
ExynosRect bnsSize;
ExynosRect bayerCropSize;
int pictureW = 0, pictureH = 0;
int bayerFormat = getBayerFormat(PIPE_3AA_REPROCESSING);
#ifdef DEBUG_RAWDUMP
if (checkBayerDumpEnable()) {
bayerFormat = CAMERA_DUMP_BAYER_FORMAT;
}
#endif
getPictureSize(&pictureW, &pictureH);
ret = getPictureBayerCropSize(&bnsSize, &bayerCropSize);
if (ret != NO_ERROR)
CLOGE("Failed to getPictureBayerCropSize()");
srcRect->x = bayerCropSize.x;
srcRect->y = bayerCropSize.y;
srcRect->w = bayerCropSize.w;
srcRect->h = bayerCropSize.h;
srcRect->fullW = bnsSize.w;
srcRect->fullH = bnsSize.h;
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;
/* Check the invalid BDS size compared to Bcrop size */
if (dstRect->w > srcRect->w)
dstRect->w = srcRect->w;
if (dstRect->h > srcRect->h)
dstRect->h = srcRect->h;
#ifdef DEBUG_PERFRAME
CLOGE("hwBdsSize %dx%d Picture %dx%d",
dstRect->w, dstRect->h, pictureW, pictureH);
#endif
return NO_ERROR;
}
status_t ExynosCamera3Parameters::calcNormalToTpuSize(int srcW, int srcH, int *dstW, int *dstH)
{
status_t ret = NO_ERROR;
if (srcW < 0 || srcH < 0) {
CLOGE("src size is invalid(%d x %d)", 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("HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)",
srcW, srcH, disW, disH);
return NO_ERROR;
}
status_t ExynosCamera3Parameters::calcTpuToNormalSize(int srcW, int srcH, int *dstW, int *dstH)
{
status_t ret = NO_ERROR;
if (srcW < 0 || srcH < 0) {
CLOGE("src size is invalid(%d x %d)", 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("HWVdis adjusted BDS Size (%d x %d) -> (%d x %d)",
srcW, srcH, disW, disH);
return ret;
}
void ExynosCamera3Parameters::setUsePureBayerReprocessing(bool enable)
{
m_usePureBayerReprocessing = enable;
}
bool ExynosCamera3Parameters::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("bayer usage is changed (%d -> %d)", oldMode, m_usePureBayerReprocessing);
}
return m_usePureBayerReprocessing;
}
int32_t ExynosCamera3Parameters::getReprocessingBayerMode(void)
{
int32_t mode = REPROCESSING_BAYER_MODE_NONE;
bool useDynamicBayer = false;
int configMode = getConfigMode();
switch (configMode) {
case CONFIG_MODE::NORMAL:
useDynamicBayer = (getRecordingHint() == true || getDualRecordingHint() == true) ?
getUseDynamicBayerVideoSnapShot() : getUseDynamicBayer();
break;
case CONFIG_MODE::HIGHSPEED_120:
useDynamicBayer = getUseDynamicBayer120FpsVideoSnapShot();
break;
case CONFIG_MODE::HIGHSPEED_240:
useDynamicBayer = getUseDynamicBayer240FpsVideoSnapShot();
break;
default:
CLOGE("configMode is abnormal(%d)",
configMode);
break;
}
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 ExynosCamera3Parameters::setAdaptiveCSCRecording(bool enable)
{
m_useAdaptiveCSCRecording = enable;
}
bool ExynosCamera3Parameters::getAdaptiveCSCRecording(void)
{
return m_useAdaptiveCSCRecording;
}
bool ExynosCamera3Parameters::doCscRecording(void)
{
bool ret = true;
int hwPreviewW = 0, hwPreviewH = 0;
int videoW = 0, videoH = 0;
getHwPreviewSize(&hwPreviewW, &hwPreviewH);
getVideoSize(&videoW, &videoH);
CLOGV("hwPreviewSize = %d x %d", hwPreviewW, hwPreviewH);
CLOGV("videoSize = %d x %d", videoW, videoH);
if (((videoW == 3840 && videoH == 2160) || (videoW == 1920 && videoH == 1080) || (videoW == 2560 && videoH == 1440))
&& m_useAdaptiveCSCRecording == true
&& videoW == hwPreviewW
&& videoH == hwPreviewH) {
ret = false;
}
return ret;
}
int ExynosCamera3Parameters::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 ExynosCamera3Parameters::convertingHalPreviewFormat(int previewFormat, int yuvRange)
{
int halFormat = 0;
switch (previewFormat) {
case V4L2_PIX_FMT_NV21:
CLOGD(" preview format NV21");
halFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
break;
case V4L2_PIX_FMT_NV21M:
CLOGD(" preview format NV21M");
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(" invalid yuvRange, force set to full range");
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL;
}
break;
case V4L2_PIX_FMT_YVU420:
CLOGD(" preview format YVU420");
halFormat = HAL_PIXEL_FORMAT_YV12;
break;
case V4L2_PIX_FMT_YVU420M:
CLOGD(" preview format YVU420M");
halFormat = HAL_PIXEL_FORMAT_EXYNOS_YV12_M;
break;
default:
CLOGE(" unknown preview format(%d)", previewFormat);
break;
}
return halFormat;
}
#else
int ExynosCamera3Parameters::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(" invalid yuvRange, force set to full range");
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(" unknown preview format(%d)", previewFormat);
break;
}
return halFormat;
}
#endif
void ExynosCamera3Parameters::setDvfsLock(bool lock) {
m_dvfsLock = lock;
}
bool ExynosCamera3Parameters::getDvfsLock(void) {
return m_dvfsLock;
}
#ifdef DEBUG_RAWDUMP
bool ExynosCamera3Parameters::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 ExynosCamera3Parameters::setConfig(struct ExynosConfigInfo* config)
{
memcpy(m_exynosconfig, config, sizeof(struct ExynosConfigInfo));
setConfigMode(m_exynosconfig->mode);
return true;
}
struct ExynosConfigInfo* ExynosCamera3Parameters::getConfig()
{
return m_exynosconfig;
}
bool ExynosCamera3Parameters::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(" unknown config mode (%d)", mode);
}
return ret;
}
int ExynosCamera3Parameters::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(" unknown config mode (%d)", m_exynosconfig->mode);
}
return ret;
}
status_t ExynosCamera3Parameters::setMarkingOfExifFlash(int flag)
{
m_firing_flash_marking = flag;
return NO_ERROR;
}
int ExynosCamera3Parameters::getMarkingOfExifFlash(void)
{
return m_firing_flash_marking;
}
bool ExynosCamera3Parameters::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 ExynosCamera3Parameters::getSensorOTFSupported(void)
{
return m_staticInfo->flite3aaOtfSupport;
}
bool ExynosCamera3Parameters::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
CLOGW(" MAIN_CAMERA_DUAL_REPROCESSING/MAIN_CAMERA_SINGLE_REPROCESSING is not defined");
#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
CLOGW(" FRONT_CAMERA_DUAL_REPROCESSING/FRONT_CAMERA_SINGLE_REPROCESSING is not defined");
#endif
}
return reprocessing;
}
bool ExynosCamera3Parameters::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
CLOGW(" MAIN_CAMERA_DUAL_SCC_CAPTURE/MAIN_CAMERA_SINGLE_SCC_CAPTUREis not defined");
#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
CLOGW(" FRONT_CAMERA_DUAL_SCC_CAPTURE/FRONT_CAMERA_SINGLE_SCC_CAPTURE is not defined");
#endif
}
return sccCapture;
}
/* True if private reprocessing or YUV reprocessing is supported */
bool ExynosCamera3Parameters::isSupportZSLInput(void) {
if(m_staticInfo->capabilities != NULL && m_staticInfo->capabilitiesLength > 0) {
for(size_t i = 0; i < m_staticInfo->capabilitiesLength; i++) {
if( (m_staticInfo->capabilities[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING)
|| (m_staticInfo->capabilities[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING) ) {
return true;
}
}
}
return false;
}
bool ExynosCamera3Parameters::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
CLOGW(" MAIN_CAMERA_DUAL_FLITE_3AA_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_FLITE_3AA_OTF
flagOtfInput = MAIN_CAMERA_SINGLE_FLITE_3AA_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_FLITE_3AA_OTF is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_FLITE_3AA_OTF
flagOtfInput = FRONT_CAMERA_DUAL_FLITE_3AA_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_FLITE_3AA_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_FLITE_3AA_OTF
flagOtfInput = FRONT_CAMERA_SINGLE_FLITE_3AA_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_FLITE_3AA_OTF is not defined");
#endif
}
}
return flagOtfInput;
}
bool ExynosCamera3Parameters::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
CLOGW(" MAIN_CAMERA_DUAL_3AA_ISP_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_3AA_ISP_OTF
ret = MAIN_CAMERA_SINGLE_3AA_ISP_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_3AA_ISP_OTF is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_3AA_ISP_OTF
ret = FRONT_CAMERA_DUAL_3AA_ISP_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_3AA_ISP_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_3AA_ISP_OTF
ret = FRONT_CAMERA_SINGLE_3AA_ISP_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_3AA_ISP_OTF is not defined");
#endif
}
}
return ret;
}
bool ExynosCamera3Parameters::isIspTpuOtf(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
bool flagTpu = getTpuEnabledMode();
if (flagTpu == true) {
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_ISP_TPU_OTF
ret = MAIN_CAMERA_DUAL_ISP_TPU_OTF;
#else
CLOGW(" MAIN_CAMERA_DUAL_ISP_TPU_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_ISP_TPU_OTF
ret = MAIN_CAMERA_SINGLE_ISP_TPU_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_ISP_TPU_OTF is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_ISP_TPU_OTF
ret = FRONT_CAMERA_DUAL_ISP_TPU_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_ISP_TPU_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_ISP_TPU_OTF
ret = FRONT_CAMERA_SINGLE_ISP_TPU_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_ISP_TPU_OTF is not defined");
#endif
}
}
}
return ret;
}
bool ExynosCamera3Parameters::isIspMcscOtf(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
bool flagTpu = getTpuEnabledMode();
if (flagTpu == false) {
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_ISP_MCSC_OTF
ret = MAIN_CAMERA_DUAL_ISP_MCSC_OTF;
#else
CLOGW(" MAIN_CAMERA_DUAL_ISP_MCSC_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_ISP_MCSC_OTF
ret = MAIN_CAMERA_SINGLE_ISP_MCSC_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_ISP_MCSC_OTF is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_ISP_MCSC_OTF
ret = FRONT_CAMERA_DUAL_ISP_MCSC_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_ISP_MCSC_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_ISP_MCSC_OTF
ret = FRONT_CAMERA_SINGLE_ISP_MCSC_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_ISP_MCSC_OTF is not defined");
#endif
}
}
}
return ret;
}
bool ExynosCamera3Parameters::isTpuMcscOtf(void)
{
bool ret = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
bool flagTpu = getTpuEnabledMode();
if (flagTpu == true) {
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_TPU_MCSC_OTF
ret = MAIN_CAMERA_DUAL_TPU_MCSC_OTF;
#else
CLOGW(" MAIN_CAMERA_DUAL_TPU_MCSC_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_TPU_MCSC_OTF
ret = MAIN_CAMERA_SINGLE_TPU_MCSC_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_TPU_MCSC_OTF is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_TPU_MCSC_OTF
ret = FRONT_CAMERA_DUAL_TPU_MCSC_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_TPU_MCSC_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_TPU_MCSC_OTF
ret = FRONT_CAMERA_SINGLE_TPU_MCSC_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_TPU_MCSC_OTF is not defined");
#endif
}
}
}
return ret;
}
bool ExynosCamera3Parameters::isMcscVraOtf(void)
{
bool ret = true;
#ifdef USE_VRA_GROUP
int cameraId = getCameraId();
bool flagPIP = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagPIP == true) {
#ifdef MAIN_CAMERA_DUAL_MCSC_VRA_OTF
ret = MAIN_CAMERA_DUAL_MCSC_VRA_OTF;
#else
CLOGW(" MAIN_CAMERA_DUAL_MCSC_VRA_OTF is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_MCSC_VRA_OTF
ret = MAIN_CAMERA_SINGLE_MCSC_VRA_OTF;
#else
CLOGW(" MAIN_CAMERA_SINGLE_TPU_MCSC_OTF is not defined");
#endif
}
} else {
if (flagPIP == true) {
#ifdef FRONT_CAMERA_DUAL_MCSC_VRA_OTF
ret = FRONT_CAMERA_DUAL_MCSC_VRA_OTF;
#else
CLOGW(" FRONT_CAMERA_DUAL_TPU_MCSC_OTF is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_MCSC_VRA_OTF
ret = FRONT_CAMERA_SINGLE_MCSC_VRA_OTF;
#else
CLOGW(" FRONT_CAMERA_SINGLE_TPU_MCSC_OTF is not defined");
#endif
}
}
#endif
return ret;
}
bool ExynosCamera3Parameters::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
CLOGW(" MAIN_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING
otf = MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING
otf = FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_DUAL_3AA_ISP_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING
otf = FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_SINGLE_3AA_ISP_OTF_REPROCESSING is not defined");
#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) {
CLOGW(" otf == true. but, flagDirtyBayer == true. so force false on 3aa_isp otf");
otf = false;
}
}
return otf;
}
bool ExynosCamera3Parameters::isReprocessingIspTpuOtf(void)
{
bool otf = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING
otf = MAIN_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING
otf = MAIN_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING
otf = FRONT_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_DUAL_ISP_TPU_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING
otf = FRONT_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_SINGLE_ISP_TPU_OTF_REPROCESSING is not defined");
#endif
}
}
return otf;
}
bool ExynosCamera3Parameters::isReprocessingIspMcscOtf(void)
{
bool otf = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING
otf = MAIN_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING
otf = MAIN_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING
otf = FRONT_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_DUAL_ISP_MCSC_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING
otf = FRONT_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_SINGLE_ISP_MCSC_OTF_REPROCESSING is not defined");
#endif
}
}
return otf;
}
bool ExynosCamera3Parameters::isReprocessingTpuMcscOtf(void)
{
bool otf = false;
int cameraId = getCameraId();
bool flagDual = getDualMode();
if (cameraId == CAMERA_ID_BACK) {
if (flagDual == true) {
#ifdef MAIN_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING
otf = MAIN_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef MAIN_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING
otf = MAIN_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING;
#else
CLOGW(" MAIN_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING is not defined");
#endif
}
} else {
if (flagDual == true) {
#ifdef FRONT_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING
otf = FRONT_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_DUAL_TPU_MCSC_OTF_REPROCESSING is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING
otf = FRONT_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING;
#else
CLOGW(" FRONT_CAMERA_SINGLE_TPU_MCSC_OTF_REPROCESSING is not defined");
#endif
}
}
return otf;
}
bool ExynosCamera3Parameters::isSingleChain(void)
{
#ifdef USE_SINGLE_CHAIN
return true;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::isUse3aaInputCrop(void)
{
return true;
}
bool ExynosCamera3Parameters::isUseIspInputCrop(void)
{
if (isUse3aaInputCrop() == true
|| is3aaIspOtf() == true)
return false;
else
return true;
}
bool ExynosCamera3Parameters::isUseMcscInputCrop(void)
{
if (isUse3aaInputCrop() == true
|| isUseIspInputCrop() == true
|| isIspMcscOtf() == true
|| isTpuMcscOtf() == true)
return false;
else
return true;
}
bool ExynosCamera3Parameters::isUseReprocessing3aaInputCrop(void)
{
return true;
}
bool ExynosCamera3Parameters::isUseReprocessingIspInputCrop(void)
{
if (isUseReprocessing3aaInputCrop() == true
|| isReprocessing3aaIspOTF() == true)
return false;
else
return true;
}
bool ExynosCamera3Parameters::isUseReprocessingMcscInputCrop(void)
{
if (isUseReprocessing3aaInputCrop() == true
|| isUseReprocessingIspInputCrop() == true
|| isReprocessingIspMcscOtf() == true
|| isReprocessingTpuMcscOtf() == true)
return false;
else
return true;
}
bool ExynosCamera3Parameters::isUseEarlyFrameReturn(void)
{
#if defined(USE_EARLY_FRAME_RETURN)
return true;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::isUseHWFC(void)
{
#if defined(USE_JPEG_HWFC)
return USE_JPEG_HWFC;
#else
return false;
#endif
}
void ExynosCamera3Parameters::setZoomPreviewWIthScaler(bool enable)
{
m_zoomWithScaler = enable;
}
bool ExynosCamera3Parameters::getZoomPreviewWIthScaler(void)
{
return m_zoomWithScaler;
}
bool ExynosCamera3Parameters::isOwnScc(int cameraId)
{
bool ret = false;
if (cameraId == CAMERA_ID_BACK) {
#ifdef MAIN_CAMERA_HAS_OWN_SCC
ret = MAIN_CAMERA_HAS_OWN_SCC;
#else
CLOGW(" MAIN_CAMERA_HAS_OWN_SCC is not defined");
#endif
} else {
#ifdef FRONT_CAMERA_HAS_OWN_SCC
ret = FRONT_CAMERA_HAS_OWN_SCC;
#else
CLOGW(" FRONT_CAMERA_HAS_OWN_SCC is not defined");
#endif
}
return ret;
}
int ExynosCamera3Parameters::getHalVersion(void)
{
return m_halVersion;
}
void ExynosCamera3Parameters::setHalVersion(int halVersion)
{
m_halVersion = halVersion;
m_activityControl->setHalVersion(m_halVersion);
CLOGI(" m_halVersion(%d)", m_halVersion);
return;
}
struct ExynosSensorInfoBase *ExynosCamera3Parameters::getSensorStaticInfo()
{
return m_staticInfo;
}
bool ExynosCamera3Parameters::getSetFileCtlMode(void)
{
#ifdef SET_SETFILE_BY_SET_CTRL
return true;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::getSetFileCtl3AA_ISP(void)
{
#ifdef SET_SETFILE_BY_SET_CTRL_3AA_ISP
return SET_SETFILE_BY_SET_CTRL_3AA_ISP;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::getSetFileCtl3AA(void)
{
#ifdef SET_SETFILE_BY_SET_CTRL_3AA
return SET_SETFILE_BY_SET_CTRL_3AA;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::getSetFileCtlISP(void)
{
#ifdef SET_SETFILE_BY_SET_CTRL_ISP
return SET_SETFILE_BY_SET_CTRL_ISP;
#else
return false;
#endif
}
bool ExynosCamera3Parameters::getSetFileCtlSCP(void)
{
#ifdef SET_SETFILE_BY_SET_CTRL_SCP
return SET_SETFILE_BY_SET_CTRL_SCP;
#else
return false;
#endif
}
void ExynosCamera3Parameters::m_getV4l2Name(char* colorName, size_t length, int colorFormat)
{
size_t index = 0;
if (colorName == NULL) {
CLOGE("colorName is NULL");
return;
}
for (index = 0; index < length-1; index++) {
colorName[index] = colorFormat & 0xff;
colorFormat = colorFormat >> 8;
}
colorName[index] = '\0';
}
int32_t ExynosCamera3Parameters::getYuvStreamMaxNum(void)
{
int32_t yuvStreamMaxNum = -1;
if (m_staticInfo == NULL) {
CLOGE("m_staticInfo is NULL");
return INVALID_OPERATION;
}
yuvStreamMaxNum = m_staticInfo->maxNumOutputStreams[PROCESSED];
if (yuvStreamMaxNum < 0) {
CLOGE("Invalid MaxNumOutputStreamsProcessed %d",
yuvStreamMaxNum);
return BAD_VALUE;
}
return yuvStreamMaxNum;
}
status_t ExynosCamera3Parameters::setYuvBufferCount(const int count, const int outputPortId)
{
if (count < 0 || count > VIDEO_MAX_FRAME
|| outputPortId < 0 || outputPortId >= YUV_OUTPUT_PORT_ID_MAX) {
CLOGE("Invalid argument. count %d outputPortId %d",
count, outputPortId);
return BAD_VALUE;
}
m_yuvBufferCount[outputPortId] = count;
return NO_ERROR;
}
int ExynosCamera3Parameters::getYuvBufferCount(const int outputPortId)
{
if (outputPortId < 0 || outputPortId >= YUV_OUTPUT_PORT_ID_MAX) {
CLOGE("Invalid index %d",
outputPortId);
return 0;
}
return m_yuvBufferCount[outputPortId];
}
bool ExynosCamera3Parameters::getDualCameraMode(void)
{
/* not supported */
return false;
}
#ifdef USE_DUAL_CAMERA
void ExynosCamera3Parameters::setDualCameraMode(bool toggle)
{
/* not supported */
}
bool ExynosCamera3Parameters::isFusionEnabled(void)
{
/* not supported */
return false;
}
status_t ExynosCamera3Parameters::getFusionSize(int w, int h, ExynosRect *srcRect, ExynosRect *dstRect)
{
/* not supported */
return NO_ERROR;
}
status_t ExynosCamera3Parameters::setFusionInfo(camera2_shot_ext *shot_ext)
{
/* not supported */
return NO_ERROR;
}
DOF *ExynosCamera3Parameters::getDOF(void)
{
/* not supported */
return NULL;
}
ExynosCameraParameters::dual_standby_mode_t ExynosCamera3Parameters::getDualStandbyMode(void)
{
return DUAL_STANDBY_MODE_INACTIVE;
}
void ExynosCamera3Parameters::setDualStandbyMode(ExynosCameraParameters::dual_standby_mode_t dualStandbyMode)
{
/* not supported */
return;
}
#ifdef USE_CP_FUSION_LIB
char * ExynosCamera3Parameters::readFusionCalData(int *readSize)
{
/* not supported */
return NULL;
}
void ExynosCamera3Parameters::setFusionCalData(char *addr, int size)
{
/* not supported */
}
char *ExynosCamera3Parameters::getFusionCalData(int *size)
{
/* not supported */
return NULL;
}
#endif // USE_CP_FUSION_LIB
#endif // USE_DUAL_CAMERA
void ExynosCamera3Parameters::setHighSpeedMode(uint32_t mode)
{
switch(mode){
case CONFIG_MODE::HIGHSPEED_120:
setConfigMode(CONFIG_MODE::HIGHSPEED_120);
m_setHighSpeedRecording(true);
break;
case CONFIG_MODE::HIGHSPEED_240:
setConfigMode(CONFIG_MODE::HIGHSPEED_240);
m_setHighSpeedRecording(true);
break;
case CONFIG_MODE::NORMAL:
default:
setConfigMode(CONFIG_MODE::NORMAL);
m_setHighSpeedRecording(false);
break;
}
}
#ifdef USE_BDS_2_0_480P_YUV
void ExynosCamera3Parameters::clearYuvSizeSetupFlag(void)
{
memset(&m_yuvSizeSetup, 0x00, sizeof(m_yuvSizeSetup));
}
#endif
#ifdef USE_CSC_FEATURE
bool ExynosCamera3Parameters::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 true;
else
return false;
}
int ExynosCamera3Parameters::m_getAntiBandingFromLatinMCC()
{
char value[PROPERTY_VALUE_MAX];
char country_value[10];
int antibanding = 60;
memset(value, 0x00, sizeof(value));
memset(country_value, 0x00, sizeof(country_value));
if (!property_get("gsm.operator.numeric", value,"")) {
return antibanding;
}
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"))
antibanding = 50;
else
antibanding = 60;
return antibanding;
}
int ExynosCamera3Parameters::getAntibanding()
{
enum aa_ae_antibanding_mode newAntibanding = AA_AE_ANTIBANDING_AUTO_50HZ;
if (m_isLatinOpenCSC()) {
if (m_getAntiBandingFromLatinMCC() == 60) {
newAntibanding = AA_AE_ANTIBANDING_AUTO_60HZ;
} else {
newAntibanding = AA_AE_ANTIBANDING_AUTO_50HZ;
}
} else {
char *CSCstr = NULL;
CSCstr = (char *)SecNativeFeature::getInstance()->getString("CscFeature_Camera_CameraFlicker");
if (CSCstr == NULL|| strlen(CSCstr) == 0) {
newAntibanding = AA_AE_ANTIBANDING_AUTO_50HZ;
} else {
if (!strcmp(CSCstr, "50hz"))
newAntibanding = AA_AE_ANTIBANDING_AUTO_50HZ;
else if (!strcmp(CSCstr, "60hz"))
newAntibanding = AA_AE_ANTIBANDING_AUTO_60HZ;
else if (!strcmp(CSCstr, "auto"))
newAntibanding = AA_AE_ANTIBANDING_AUTO;
else if (!strcmp(CSCstr, "off"))
newAntibanding = AA_AE_ANTIBANDING_OFF;
}
}
return newAntibanding;
}
#else
int ExynosCamera3Parameters::getAntibanding()
{
return AA_AE_ANTIBANDING_AUTO;
}
#endif
}; /* namespace android */