| /* |
| * Copyright (C) 2014, 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 "ExynosCameraMetadataConverter" |
| |
| #include "ExynosCameraMetadataConverter.h" |
| #include "ExynosCameraRequestManager.h" |
| |
| namespace android { |
| #define SET_BIT(x) (1 << x) |
| |
| ExynosCamera3MetadataConverter::ExynosCamera3MetadataConverter(int cameraId, ExynosCameraParameters *parameters) |
| { |
| ExynosCameraActivityControl *activityControl = NULL; |
| |
| m_cameraId = cameraId; |
| m_parameters = parameters; |
| activityControl = m_parameters->getActivityControl(); |
| m_flashMgr = activityControl->getFlashMgr(); |
| m_sensorStaticInfo = m_parameters->getSensorStaticInfo(); |
| m_preCaptureTriggerOn = false; |
| m_isManualAeControl = false; |
| |
| m_blackLevelLockOn = false; |
| m_faceDetectModeOn = false; |
| |
| m_lockVendorIsoValue = 0; |
| m_lockExposureTime = 0; |
| |
| m_afMode = AA_AFMODE_CONTINUOUS_PICTURE; |
| m_preAfMode = AA_AFMODE_CONTINUOUS_PICTURE; |
| |
| m_focusDistance = -1; |
| |
| m_maxFps = 30; |
| m_overrideFlashControl= false; |
| m_preExposureTime = 0; |
| m_defaultAntibanding = m_parameters->getAntibanding(); |
| memset(m_gpsProcessingMethod, 0x00, sizeof(m_gpsProcessingMethod)); |
| |
| m_frameCountMapIndex = 0; |
| memset(m_frameCountMap, 0x00, sizeof(m_frameCountMap)); |
| } |
| |
| ExynosCamera3MetadataConverter::~ExynosCamera3MetadataConverter() |
| { |
| m_defaultRequestSetting.release(); |
| } |
| |
| status_t ExynosCamera3MetadataConverter::constructDefaultRequestSettings(int type, camera_metadata_t **request) |
| { |
| Mutex::Autolock l(m_requestLock); |
| |
| ALOGD("DEBUG(%s[%d]):Type(%d), cameraId(%d)", __FUNCTION__, __LINE__, type, m_cameraId); |
| |
| CameraMetadata settings; |
| m_preExposureTime = 0; |
| const int64_t USEC = 1000LL; |
| const int64_t MSEC = USEC * 1000LL; |
| const int64_t SEC = MSEC * 1000LL; |
| /** android.request */ |
| /* request type */ |
| const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; |
| settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); |
| |
| /* meta data mode */ |
| const uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; |
| settings.update(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); |
| |
| /* id */ |
| const int32_t id = 0; |
| settings.update(ANDROID_REQUEST_ID, &id, 1); |
| |
| /* frame count */ |
| const int32_t frameCount = 0; |
| settings.update(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1); |
| |
| /** android.control */ |
| /* control intent */ |
| uint8_t controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; |
| switch (type) { |
| case CAMERA3_TEMPLATE_PREVIEW: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; |
| ALOGD("DEBUG(%s[%d]):type is ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW", __FUNCTION__, __LINE__); |
| break; |
| case CAMERA3_TEMPLATE_STILL_CAPTURE: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; |
| ALOGD("DEBUG(%s[%d]):type is CAMERA3_TEMPLATE_STILL_CAPTURE", __FUNCTION__, __LINE__); |
| break; |
| case CAMERA3_TEMPLATE_VIDEO_RECORD: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; |
| ALOGD("DEBUG(%s[%d]):type is CAMERA3_TEMPLATE_VIDEO_RECORD", __FUNCTION__, __LINE__); |
| break; |
| case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; |
| ALOGD("DEBUG(%s[%d]):type is CAMERA3_TEMPLATE_VIDEO_SNAPSHOT", __FUNCTION__, __LINE__); |
| break; |
| case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; |
| ALOGD("DEBUG(%s[%d]):type is CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG", __FUNCTION__, __LINE__); |
| break; |
| case CAMERA3_TEMPLATE_MANUAL: |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL; |
| ALOGD("DEBUG(%s[%d]):type is CAMERA3_TEMPLATE_MANUAL", __FUNCTION__, __LINE__); |
| break; |
| default: |
| ALOGD("ERR(%s[%d]):Custom intent type is selected for setting control intent(%d)", __FUNCTION__, __LINE__, type); |
| controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; |
| break; |
| } |
| settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); |
| |
| /* 3AA control */ |
| uint8_t controlMode = ANDROID_CONTROL_MODE_OFF; |
| uint8_t afMode = ANDROID_CONTROL_AF_MODE_OFF; |
| uint8_t aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_OFF; |
| int32_t aeTargetFpsRange[2] = {15, 30}; |
| switch (type) { |
| case CAMERA3_TEMPLATE_PREVIEW: |
| controlMode = ANDROID_CONTROL_MODE_AUTO; |
| afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; |
| break; |
| case CAMERA3_TEMPLATE_STILL_CAPTURE: |
| controlMode = ANDROID_CONTROL_MODE_AUTO; |
| afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; |
| break; |
| case CAMERA3_TEMPLATE_VIDEO_RECORD: |
| controlMode = ANDROID_CONTROL_MODE_AUTO; |
| afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; |
| /* Fix FPS for Recording */ |
| aeTargetFpsRange[0] = 30; |
| aeTargetFpsRange[1] = 30; |
| break; |
| case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: |
| controlMode = ANDROID_CONTROL_MODE_AUTO; |
| afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; |
| break; |
| case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: |
| controlMode = ANDROID_CONTROL_MODE_AUTO; |
| afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; |
| break; |
| case CAMERA3_TEMPLATE_MANUAL: |
| controlMode = ANDROID_CONTROL_MODE_OFF; |
| afMode = ANDROID_CONTROL_AF_MODE_OFF; |
| aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| awbMode = ANDROID_CONTROL_AWB_MODE_OFF; |
| break; |
| default: |
| ALOGD("ERR(%s[%d]):Custom intent type is selected for setting 3AA control(%d)", __FUNCTION__, __LINE__, type); |
| break; |
| } |
| settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); |
| if (m_sensorStaticInfo->minimumFocusDistance == 0.0f) { |
| afMode = ANDROID_CONTROL_AF_MODE_OFF; |
| } |
| settings.update(ANDROID_CONTROL_AF_MODE, &afMode, 1); |
| settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); |
| settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); |
| settings.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); |
| |
| const uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE; |
| settings.update(ANDROID_CONTROL_AF_TRIGGER, &afTrigger, 1); |
| |
| const uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; |
| settings.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &aePrecaptureTrigger, 1); |
| |
| /* effect mode */ |
| const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; |
| settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); |
| |
| /* scene mode */ |
| const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; |
| settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); |
| |
| /* ae lock mode */ |
| const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; |
| settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); |
| |
| /* ae region */ |
| int w,h; |
| m_parameters->getMaxSensorSize(&w, &h); |
| const int32_t controlRegions[5] = { |
| 0, 0, w, h, 0 |
| }; |
| if (m_sensorStaticInfo->max3aRegions[AE] > 0) { |
| settings.update(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); |
| } |
| if (m_sensorStaticInfo->max3aRegions[AWB] > 0) { |
| settings.update(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); |
| } |
| if (m_sensorStaticInfo->max3aRegions[AF] > 0) { |
| settings.update(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); |
| } |
| |
| /* exposure compensation */ |
| const int32_t aeExpCompensation = 0; |
| settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExpCompensation, 1); |
| |
| /* anti-banding mode */ |
| const uint8_t aeAntibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; |
| settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); |
| |
| /* awb lock */ |
| const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; |
| settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); |
| |
| /* video stabilization mode */ |
| const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; |
| settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); |
| |
| const int32_t rawsensitivity = 100; |
| settings.update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &rawsensitivity, 1); |
| |
| /** android.lens */ |
| const float focusDistance = -1.0f; |
| settings.update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); |
| settings.update(ANDROID_LENS_FOCAL_LENGTH, &(m_sensorStaticInfo->focalLength), 1); |
| settings.update(ANDROID_LENS_APERTURE, &(m_sensorStaticInfo->fNumber), 1); // ExifInterface : TAG_APERTURE = "FNumber"; |
| const float filterDensity = 0.0f; |
| settings.update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); |
| const uint8_t opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; |
| settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &opticalStabilizationMode, 1); |
| |
| /** android.sensor */ |
| const int64_t exposureTime = 0 * MSEC; |
| settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); |
| const int64_t frameDuration = 33333333L; /* 1/30 s */ |
| settings.update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); |
| const int32_t sensitivity = 400; |
| settings.update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); |
| |
| /** android.flash */ |
| const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; |
| settings.update(ANDROID_FLASH_MODE, &flashMode, 1); |
| const uint8_t firingPower = 0; |
| settings.update(ANDROID_FLASH_FIRING_POWER, &firingPower, 1); |
| const int64_t firingTime = 0; |
| settings.update(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); |
| |
| /** android.noise_reduction */ |
| const uint8_t noiseStrength = 5; |
| settings.update(ANDROID_NOISE_REDUCTION_STRENGTH, &noiseStrength, 1); |
| |
| /** android.color_correction */ |
| const camera_metadata_rational_t colorTransform[9] = { |
| {1,1}, {0,1}, {0,1}, |
| {0,1}, {1,1}, {0,1}, |
| {0,1}, {0,1}, {1,1} |
| }; |
| settings.update(ANDROID_COLOR_CORRECTION_TRANSFORM, colorTransform, 9); |
| |
| /** android.tonemap */ |
| const float tonemapCurve[4] = { |
| 0.0f, 0.0f, |
| 1.0f, 1.0f |
| }; |
| settings.update(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); |
| settings.update(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); |
| settings.update(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); |
| |
| /** android.edge */ |
| const uint8_t edgeStrength = 5; |
| settings.update(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); |
| |
| /** android.scaler */ |
| const int32_t cropRegion[4] = { |
| 0, 0, w, h |
| }; |
| settings.update(ANDROID_SCALER_CROP_REGION, cropRegion, 4); |
| |
| /** android.jpeg */ |
| const uint8_t jpegQuality = 96; |
| settings.update(ANDROID_JPEG_QUALITY, &jpegQuality, 1); |
| const int32_t thumbnailSize[2] = { |
| m_sensorStaticInfo->maxThumbnailW, m_sensorStaticInfo->maxThumbnailH |
| }; |
| settings.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); |
| const uint8_t thumbnailQuality = 100; |
| settings.update(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); |
| const double gpsCoordinates[3] = { |
| 0, 0 |
| }; |
| settings.update(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3); |
| const uint8_t gpsProcessingMethod[32] = "None"; |
| settings.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); |
| const int64_t gpsTimestamp = 0; |
| settings.update(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); |
| const int32_t jpegOrientation = 0; |
| settings.update(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); |
| |
| /** android.stats */ |
| const uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; |
| settings.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); |
| const uint8_t histogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF; |
| settings.update(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1); |
| const uint8_t sharpnessMapMode = ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF; |
| settings.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); |
| const uint8_t hotPixelMapMode = 0; |
| settings.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hotPixelMapMode, 1); |
| |
| /** android.blacklevel */ |
| const uint8_t blackLevelLock = ANDROID_BLACK_LEVEL_LOCK_OFF; |
| settings.update(ANDROID_BLACK_LEVEL_LOCK, &blackLevelLock, 1); |
| |
| /** Processing block modes */ |
| uint8_t hotPixelMode = ANDROID_HOT_PIXEL_MODE_OFF; |
| uint8_t demosaicMode = ANDROID_DEMOSAIC_MODE_FAST; |
| uint8_t noiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_OFF; |
| uint8_t shadingMode = ANDROID_SHADING_MODE_OFF; |
| uint8_t colorCorrectionMode = ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX; |
| uint8_t tonemapMode = ANDROID_TONEMAP_MODE_CONTRAST_CURVE; |
| uint8_t edgeMode = ANDROID_EDGE_MODE_OFF; |
| uint8_t lensShadingMapMode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF; |
| uint8_t colorCorrectionAberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; |
| |
| switch (type) { |
| case CAMERA3_TEMPLATE_STILL_CAPTURE: |
| if (m_cameraId == CAMERA_ID_BACK) |
| lensShadingMapMode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON; |
| hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY; |
| noiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; |
| shadingMode = ANDROID_SHADING_MODE_FAST; |
| colorCorrectionMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; |
| tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; |
| edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY; |
| break; |
| case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: |
| hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY; |
| noiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_FAST; |
| shadingMode = ANDROID_SHADING_MODE_FAST; |
| colorCorrectionMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; |
| tonemapMode = ANDROID_TONEMAP_MODE_FAST; |
| edgeMode = ANDROID_EDGE_MODE_FAST; |
| break; |
| case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: |
| hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY; |
| noiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG; |
| shadingMode = ANDROID_SHADING_MODE_FAST; |
| colorCorrectionMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; |
| tonemapMode = ANDROID_TONEMAP_MODE_FAST; |
| edgeMode = ANDROID_EDGE_MODE_ZERO_SHUTTER_LAG; |
| break; |
| case CAMERA3_TEMPLATE_PREVIEW: |
| case CAMERA3_TEMPLATE_VIDEO_RECORD: |
| default: |
| hotPixelMode = ANDROID_HOT_PIXEL_MODE_FAST; |
| noiseReductionMode = ANDROID_NOISE_REDUCTION_MODE_FAST; |
| shadingMode = ANDROID_SHADING_MODE_FAST; |
| colorCorrectionMode = ANDROID_COLOR_CORRECTION_MODE_FAST; |
| tonemapMode = ANDROID_TONEMAP_MODE_FAST; |
| edgeMode = ANDROID_EDGE_MODE_FAST; |
| break; |
| } |
| settings.update(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); |
| settings.update(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); |
| settings.update(ANDROID_NOISE_REDUCTION_MODE, &noiseReductionMode, 1); |
| settings.update(ANDROID_SHADING_MODE, &shadingMode, 1); |
| settings.update(ANDROID_COLOR_CORRECTION_MODE, &colorCorrectionMode, 1); |
| settings.update(ANDROID_TONEMAP_MODE, &tonemapMode, 1); |
| settings.update(ANDROID_EDGE_MODE, &edgeMode, 1); |
| settings.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lensShadingMapMode, 1); |
| settings.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &colorCorrectionAberrationMode, 1); |
| |
| /* Vendor RequestSettings */ |
| m_constructVendorDefaultRequestSettings(type, &settings); |
| |
| *request = settings.release(); |
| m_defaultRequestSetting = *request; |
| |
| ALOGD("DEBUG(%s[%d]):Registered default request template(%d)", __FUNCTION__, __LINE__, type); |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::constructStaticInfo(int cameraId, camera_metadata_t **cameraInfo) |
| { |
| status_t ret = NO_ERROR; |
| |
| ALOGD("DEBUG(%s[%d]):ID(%d)", __FUNCTION__, __LINE__, cameraId); |
| struct ExynosSensorInfoBase *sensorStaticInfo = NULL; |
| CameraMetadata info; |
| Vector<int64_t> i64Vector; |
| Vector<int32_t> i32Vector; |
| Vector<uint8_t> i8Vector; |
| |
| sensorStaticInfo = createExynosCamera3SensorInfo(cameraId); |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]): sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* android.colorCorrection static attributes */ |
| if (sensorStaticInfo->colorAberrationModes != NULL) { |
| ret = info.update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, |
| sensorStaticInfo->colorAberrationModes, |
| sensorStaticInfo->colorAberrationModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_COLOR_CORRECTION_ABERRATION_MODE update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):colorAberrationModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* andorid.control static attributes */ |
| if (sensorStaticInfo->antiBandingModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, |
| sensorStaticInfo->antiBandingModes, |
| sensorStaticInfo->antiBandingModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):antiBandingModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->aeModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, |
| sensorStaticInfo->aeModes, |
| sensorStaticInfo->aeModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_AVAILABLE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):aeModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| i32Vector.clear(); |
| m_createAeAvailableFpsRanges(sensorStaticInfo, &i32Vector, cameraId); |
| ret = info.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, |
| i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, |
| sensorStaticInfo->exposureCompensationRange, |
| ARRAY_LENGTH(sensorStaticInfo->exposureCompensationRange)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_COMPENSATION_RANGE update failed(%d)", __FUNCTION__, ret); |
| |
| const camera_metadata_rational exposureCompensationStep = |
| {(int32_t)((sensorStaticInfo->exposureCompensationStep) * 100.0), 100}; |
| ret = info.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, |
| &exposureCompensationStep, 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_COMPENSATION_STEP update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->afModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, |
| sensorStaticInfo->afModes, |
| sensorStaticInfo->afModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AF_AVAILABLE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):afModes is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->effectModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, |
| sensorStaticInfo->effectModes, |
| sensorStaticInfo->effectModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AVAILABLE_EFFECTS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):effectModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->sceneModes != NULL) { |
| i8Vector.clear(); |
| i8Vector.appendArray(sensorStaticInfo->sceneModes, sensorStaticInfo->sceneModesLength); |
| if (sensorStaticInfo->sceneHDRSupport) { |
| i8Vector.add(ANDROID_CONTROL_SCENE_MODE_HDR); |
| } |
| ret = info.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, |
| i8Vector.array(), i8Vector.size()); |
| if (ret < 0) |
| ALOGE("DEBUG(%s):ANDROID_CONTROL_AVAILABLE_SCENE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):sceneModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->sceneModeOverrides != NULL) { |
| i8Vector.clear(); |
| i8Vector.appendArray(sensorStaticInfo->sceneModeOverrides, sensorStaticInfo->sceneModeOverridesLength); |
| if (sensorStaticInfo->sceneHDRSupport) { |
| i8Vector.add(ANDROID_CONTROL_AE_MODE_ON); |
| i8Vector.add(ANDROID_CONTROL_AWB_MODE_AUTO); |
| i8Vector.add(ANDROID_CONTROL_AF_MODE_AUTO); |
| } |
| ret = info.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, |
| i8Vector.array(), i8Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_SCENE_MODE_OVERRIDES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):sceneModeOverrides at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->videoStabilizationModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, |
| sensorStaticInfo->videoStabilizationModes, |
| sensorStaticInfo->videoStabilizationModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):videoStabilizationModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->awbModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, |
| sensorStaticInfo->awbModes, |
| sensorStaticInfo->awbModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AWB_AVAILABLE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):awbModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_CONTROL_MAX_REGIONS, |
| sensorStaticInfo->max3aRegions, |
| ARRAY_LENGTH(sensorStaticInfo->max3aRegions)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_MAX_REGIONS update failed(%d)", __FUNCTION__, ret); |
| |
| i32Vector.clear(); |
| if ( m_createControlAvailableHighSpeedVideoConfigurations(sensorStaticInfo, &i32Vector, cameraId) == NO_ERROR ) { |
| ret = info.update(ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS, |
| i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_CONTROL_AE_LOCK_AVAILABLE, |
| &(sensorStaticInfo->aeLockAvailable), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AE_LOCK_AVAILABLE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, |
| &(sensorStaticInfo->awbLockAvailable), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AWB_LOCK_AVAILABLE update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->controlModes != NULL) { |
| ret = info.update(ANDROID_CONTROL_AVAILABLE_MODES, |
| sensorStaticInfo->controlModes, |
| sensorStaticInfo->controlModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_AVAILABLE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):controlModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE, |
| sensorStaticInfo->postRawSensitivityBoost, |
| ARRAY_LENGTH(sensorStaticInfo->postRawSensitivityBoost)); |
| if (ret < 0) { |
| ALOGD("DEBUG(%s):ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE update failed(%d)", __FUNCTION__, ret); |
| } |
| |
| /* android.edge static attributes */ |
| if (sensorStaticInfo->edgeModes != NULL) { |
| ret = info.update(ANDROID_EDGE_AVAILABLE_EDGE_MODES, |
| sensorStaticInfo->edgeModes, |
| sensorStaticInfo->edgeModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_EDGE_AVAILABLE_EDGE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):edgeModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* andorid.flash static attributes */ |
| ret = info.update(ANDROID_FLASH_INFO_AVAILABLE, |
| &(sensorStaticInfo->flashAvailable), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_FLASH_INFO_AVAILABLE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_FLASH_INFO_CHARGE_DURATION, |
| &(sensorStaticInfo->chargeDuration), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_FLASH_INFO_CHARGE_DURATION update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_FLASH_COLOR_TEMPERATURE, |
| &(sensorStaticInfo->colorTemperature), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_FLASH_COLOR_TEMPERATURE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_FLASH_MAX_ENERGY, |
| &(sensorStaticInfo->maxEnergy), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_FLASH_MAX_ENERGY update failed(%d)", __FUNCTION__, ret); |
| |
| /* android.hotPixel static attributes */ |
| if (sensorStaticInfo->hotPixelModes != NULL) { |
| ret = info.update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, |
| sensorStaticInfo->hotPixelModes, |
| sensorStaticInfo->hotPixelModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):hotPixelModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* andorid.jpeg static attributes */ |
| i32Vector.clear(); |
| m_createJpegAvailableThumbnailSizes(sensorStaticInfo, &i32Vector); |
| ret = info.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES update failed(%d)", __FUNCTION__, ret); |
| |
| const int32_t jpegMaxSize = sensorStaticInfo->maxPictureW * sensorStaticInfo->maxPictureH * 2; |
| ret = info.update(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_JPEG_MAX_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| |
| /* android.lens static attributes */ |
| ret = info.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, |
| &(sensorStaticInfo->fNumber), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_AVAILABLE_APERTURES update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, |
| &(sensorStaticInfo->filterDensity), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, |
| &(sensorStaticInfo->focalLength), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->opticalStabilization != NULL |
| && m_hasTagInList(sensorStaticInfo->requestKeys, |
| sensorStaticInfo->requestKeysLength, |
| ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) |
| { |
| ret = info.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, |
| sensorStaticInfo->opticalStabilization, |
| sensorStaticInfo->opticalStabilizationLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):opticalStabilization at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, |
| &(sensorStaticInfo->hyperFocalDistance), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, |
| &(sensorStaticInfo->minimumFocusDistance), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, |
| sensorStaticInfo->shadingMapSize, |
| ARRAY_LENGTH(sensorStaticInfo->shadingMapSize)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_SHADING_MAP_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, |
| &(sensorStaticInfo->focusDistanceCalibration), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_LENS_FACING, |
| &(sensorStaticInfo->lensFacing), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LENS_FACING update failed(%d)", __FUNCTION__, ret); |
| |
| /* android.noiseReduction static attributes */ |
| if (sensorStaticInfo->noiseReductionModes != NULL |
| && m_hasTagInList(sensorStaticInfo->requestKeys, |
| sensorStaticInfo->requestKeysLength, |
| ANDROID_NOISE_REDUCTION_MODE)) |
| { |
| ret = info.update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, |
| sensorStaticInfo->noiseReductionModes, |
| sensorStaticInfo->noiseReductionModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):noiseReductionModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* android.request static attributes */ |
| ret = info.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, |
| sensorStaticInfo->maxNumOutputStreams, |
| ARRAY_LENGTH(sensorStaticInfo->maxNumOutputStreams)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, |
| &(sensorStaticInfo->maxNumInputStreams), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, |
| &(sensorStaticInfo->maxPipelineDepth), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_PIPELINE_MAX_DEPTH update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, |
| &(sensorStaticInfo->partialResultCount), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_PARTIAL_RESULT_COUNT update failed(%d)", __FUNCTION__, ret); |
| |
| /* android.scaler static attributes */ |
| const float maxZoom = (sensorStaticInfo->maxZoomRatio / 1000); |
| ret = info.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, &maxZoom, 1); |
| if (ret < 0) { |
| ALOGD("DEBUG(%s):ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM update failed(%d)", __FUNCTION__, ret); |
| } |
| |
| /* TODO:implement input/output format map */ |
| #if 0 |
| ret = info.update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, |
| , |
| ); |
| if (ret < 0) |
| ALOGE("DEBUG(%s):ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP update failed(%d)", __FUNCTION__, ret); |
| #endif |
| |
| i32Vector.clear(); |
| if(m_createScalerAvailableInputOutputFormatsMap(sensorStaticInfo, &i32Vector, cameraId) == NO_ERROR) { |
| /* Update AvailableInputOutputFormatsMap only if private reprocessing is supported */ |
| ret = info.update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP update failed(%d)", __FUNCTION__, ret); |
| } |
| |
| i32Vector.clear(); |
| m_createScalerAvailableStreamConfigurationsOutput(sensorStaticInfo, &i32Vector, cameraId); |
| ret = info.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS update failed(%d)", __FUNCTION__, ret); |
| |
| i64Vector.clear(); |
| m_createScalerAvailableMinFrameDurations(sensorStaticInfo, &i64Vector, cameraId); |
| ret = info.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, i64Vector.array(), i64Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->stallDurations != NULL) { |
| ret = info.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, |
| sensorStaticInfo->stallDurations, |
| sensorStaticInfo->stallDurationsLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SCALER_AVAILABLE_STALL_DURATIONS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):stallDurations at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_SCALER_CROPPING_TYPE, |
| &(sensorStaticInfo->croppingType), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SCALER_CROPPING_TYPE update failed(%d)", __FUNCTION__, ret); |
| |
| /* android.sensor static attributes */ |
| const int32_t kResolution[4] = |
| {0, 0, sensorStaticInfo->maxSensorW, sensorStaticInfo->maxSensorH}; |
| ret = info.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, kResolution, 4); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, |
| sensorStaticInfo->sensitivityRange, |
| ARRAY_LENGTH(sensorStaticInfo->sensitivityRange)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_SENSITIVITY_RANGE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, |
| &(sensorStaticInfo->colorFilterArrangement), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, |
| sensorStaticInfo->exposureTimeRange, |
| ARRAY_LENGTH(sensorStaticInfo->exposureTimeRange)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, |
| &(sensorStaticInfo->maxFrameDuration), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_MAX_FRAME_DURATION update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, |
| sensorStaticInfo->sensorPhysicalSize, |
| ARRAY_LENGTH(sensorStaticInfo->sensorPhysicalSize)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_PHYSICAL_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, &(kResolution[2]), 2); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, |
| &(sensorStaticInfo->whiteLevel), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_WHITE_LEVEL update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, |
| &(sensorStaticInfo->timestampSource), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_REFERENCE_ILLUMINANT1, |
| &(sensorStaticInfo->referenceIlluminant1), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_REFERENCE_ILLUMINANT1 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_REFERENCE_ILLUMINANT2, |
| &(sensorStaticInfo->referenceIlluminant2), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_REFERENCE_ILLUMINANT2 update failed(%d)", __FUNCTION__, ret); |
| |
| int32_t calibrationRG = 1024, calibrationBG = 1024; |
| getAWBCalibrationGain(&calibrationRG, &calibrationBG, |
| sensorStaticInfo->masterRGain, sensorStaticInfo->masterBGain); |
| camera_metadata_rational_t calibrationMatrix[9] = { |
| {calibrationRG, 1024}, {0, 1024}, {0, 1024}, |
| {0, 1024}, {1024, 1024}, {0, 1024}, |
| {0, 1024}, {0, 1024}, {calibrationBG, 1024}, |
| }; |
| |
| ret = info.update(ANDROID_SENSOR_CALIBRATION_TRANSFORM1, calibrationMatrix, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_CALIBRATION_TRANSFORM2 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_CALIBRATION_TRANSFORM2, calibrationMatrix, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_CALIBRATION_TRANSFORM2 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_COLOR_TRANSFORM1, sensorStaticInfo->colorTransformMatrix1, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_COLOR_TRANSFORM1 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_COLOR_TRANSFORM2, sensorStaticInfo->colorTransformMatrix2, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_COLOR_TRANSFORM2 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_FORWARD_MATRIX1, sensorStaticInfo->forwardMatrix1, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_FORWARD_MATRIX1 update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_FORWARD_MATRIX2, sensorStaticInfo->forwardMatrix2, 9); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_FORWARD_MATRIX2 update failed(%d)", __FUNCTION__, ret); |
| |
| #if 0 |
| ret = info.update(ANDROID_SENSOR_BASE_GAIN_FACTOR, |
| , |
| ); |
| if (ret < 0) |
| ALOGE("DEBUG(%s):ANDROID_SENSOR_BASE_GAIN_FACTOR update failed(%d)", __FUNCTION__, ret); |
| #endif |
| |
| ret = info.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, |
| sensorStaticInfo->blackLevelPattern, |
| ARRAY_LENGTH(sensorStaticInfo->blackLevelPattern)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_BLACK_LEVEL_PATTERN update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, |
| &(sensorStaticInfo->maxAnalogSensitivity), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_ORIENTATION, |
| &(sensorStaticInfo->orientation), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_ORIENTATION update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS, |
| sensorStaticInfo->profileHueSatMapDimensions, |
| ARRAY_LENGTH(sensorStaticInfo->profileHueSatMapDimensions)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_PROFILE_HUE_SAT_MAP_DIMENSIONS update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->testPatternModes != NULL) { |
| ret = info.update(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, |
| sensorStaticInfo->testPatternModes, |
| sensorStaticInfo->testPatternModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):testPatternModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* android.statistics static attributes */ |
| if (sensorStaticInfo->faceDetectModes != NULL) { |
| ret = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, |
| sensorStaticInfo->faceDetectModes, |
| sensorStaticInfo->faceDetectModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):faceDetectModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| ret = info.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, |
| &(sensorStaticInfo->histogramBucketCount), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, |
| &sensorStaticInfo->maxNumDetectedFaces, 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_MAX_FACE_COUNT update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, |
| &sensorStaticInfo->maxHistogramCount, 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, |
| &(sensorStaticInfo->maxSharpnessMapValue), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE update failed(%d)", __FUNCTION__, ret); |
| |
| ret = info.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, |
| sensorStaticInfo->sharpnessMapSize, |
| ARRAY_LENGTH(sensorStaticInfo->sharpnessMapSize)); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->hotPixelMapModes != NULL) { |
| ret = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, |
| sensorStaticInfo->hotPixelMapModes, |
| sensorStaticInfo->hotPixelMapModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):hotPixelMapModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->lensShadingMapModes != NULL) { |
| ret = info.update(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, |
| sensorStaticInfo->lensShadingMapModes, |
| sensorStaticInfo->lensShadingMapModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES update failed(%d)", |
| __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):lensShadingMapModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->shadingAvailableModes != NULL) { |
| ret = info.update(ANDROID_SHADING_AVAILABLE_MODES, |
| sensorStaticInfo->shadingAvailableModes, |
| sensorStaticInfo->shadingAvailableModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SHADING_AVAILABLE_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):shadingAvailableModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* andorid.tonemap static attributes */ |
| ret = info.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, |
| &(sensorStaticInfo->tonemapCurvePoints), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_TONEMAP_MAX_CURVE_POINTS update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->toneMapModes != NULL) { |
| ret = info.update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, |
| sensorStaticInfo->toneMapModes, |
| sensorStaticInfo->toneMapModesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):toneMapModes at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* android.led static attributes */ |
| if (sensorStaticInfo->leds != NULL) { |
| ret = info.update(ANDROID_LED_AVAILABLE_LEDS, |
| sensorStaticInfo->leds, |
| sensorStaticInfo->ledsLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_LED_AVAILABLE_LEDS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):leds at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| /* andorid.info static attributes */ |
| ret = info.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, |
| &(sensorStaticInfo->supportedHwLevel), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL update failed(%d)", __FUNCTION__, ret); |
| |
| /* android.sync static attributes */ |
| ret = info.update(ANDROID_SYNC_MAX_LATENCY, |
| &(sensorStaticInfo->maxLatency), 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_SYNC_MAX_LATENCY update failed(%d)", __FUNCTION__, ret); |
| |
| if (sensorStaticInfo->capabilities != NULL) { |
| ret = info.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, |
| sensorStaticInfo->capabilities, |
| sensorStaticInfo->capabilitiesLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_AVAILABLE_CAPABILITIES update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):capabilities at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->requestKeys != NULL) { |
| i32Vector.clear(); |
| i32Vector.appendArray(sensorStaticInfo->requestKeys, sensorStaticInfo->requestKeysLength); |
| |
| if (sensorStaticInfo->supportedHwLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) { |
| if (sensorStaticInfo->max3aRegions[AE] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AE_REGIONS); |
| } |
| if (sensorStaticInfo->max3aRegions[AWB] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AWB_REGIONS); |
| } |
| if (sensorStaticInfo->max3aRegions[AF] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AF_REGIONS); |
| } |
| } |
| |
| ret = info.update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, |
| i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):requestKeys at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->resultKeys != NULL) { |
| i32Vector.clear(); |
| i32Vector.appendArray(sensorStaticInfo->resultKeys, sensorStaticInfo->resultKeysLength); |
| |
| if (sensorStaticInfo->supportedHwLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) { |
| if (sensorStaticInfo->max3aRegions[AE] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AE_REGIONS); |
| } |
| if (sensorStaticInfo->max3aRegions[AWB] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AWB_REGIONS); |
| } |
| if (sensorStaticInfo->max3aRegions[AF] > 0) { |
| i32Vector.add(ANDROID_CONTROL_AF_REGIONS); |
| } |
| } |
| |
| ret = info.update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, |
| i32Vector.array(), i32Vector.size()); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_AVAILABLE_RESULT_KEYS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):resultKeys at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (sensorStaticInfo->characteristicsKeys != NULL) { |
| ret = info.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, |
| sensorStaticInfo->characteristicsKeys, |
| sensorStaticInfo->characteristicsKeysLength); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS update failed(%d)", __FUNCTION__, ret); |
| } else { |
| ALOGD("DEBUG(%s[%d]):characteristicsKeys at sensorStaticInfo is NULL", __FUNCTION__, __LINE__); |
| } |
| |
| if (m_hasTagInList(sensorStaticInfo->capabilities, sensorStaticInfo->capabilitiesLength, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING) == true) { |
| /* Set Stall duration for reprocessing */ |
| #ifdef HAL3_REPROCESSING_MAX_CAPTURE_STALL |
| int32_t maxCaptureStall = HAL3_REPROCESSING_MAX_CAPTURE_STALL; |
| ret = info.update(ANDROID_REPROCESS_MAX_CAPTURE_STALL, &maxCaptureStall, 1); |
| if (ret < 0) |
| ALOGD("DEBUG(%s):ANDROID_REPROCESS_MAX_CAPTURE_STALL update failed(%d)", __FUNCTION__, ret); |
| #else |
| ALOGE("ERR(%s):Private reprocessing is supported but ANDROID_REPROCESS_MAX_CAPTURE_STALL has not specified.", __FUNCTION__); |
| #endif |
| } |
| |
| /* Vendor staticInfo*/ |
| m_constructVendorStaticInfo(sensorStaticInfo, &info); |
| |
| *cameraInfo = info.release(); |
| |
| return OK; |
| } |
| |
| void ExynosCamera3MetadataConverter::setStaticInfo(int camId, camera_metadata_t *info) |
| { |
| if (info == NULL) { |
| camera_metadata_t *meta; |
| ALOGW("WARN(%s[%d]):info is null", __FUNCTION__, __LINE__); |
| ExynosCamera3MetadataConverter::constructStaticInfo(camId, &meta); |
| m_staticInfo = meta; |
| } else { |
| m_staticInfo = info; |
| } |
| } |
| |
| status_t ExynosCamera3MetadataConverter::initShotData(struct camera2_shot_ext *shot_ext) |
| { |
| ALOGV("DEBUG(%s[%d])", __FUNCTION__, __LINE__); |
| |
| memset(shot_ext, 0x00, sizeof(struct camera2_shot_ext)); |
| |
| struct camera2_shot *shot = &shot_ext->shot; |
| |
| // TODO: make this from default request settings |
| /* 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_sensorStaticInfo->fNumber; // ExifInterface : TAG_APERTURE = "FNumber"; |
| shot->ctl.lens.focalLength = m_sensorStaticInfo->focalLength; |
| shot->ctl.lens.filterDensity = 0.0f; |
| shot->ctl.lens.opticalStabilizationMode = OPTICAL_STABILIZATION_MODE_OFF; |
| |
| shot->uctl.lensUd.pos = 0; |
| shot->uctl.lensUd.posSize = 0; |
| shot->ctl.aa.vendor_afState = AA_AFSTATE_INACTIVE; |
| |
| int minFps = (m_sensorStaticInfo->minFps == 0) ? 0 : (m_sensorStaticInfo->maxFps / 2); |
| int maxFps = (m_sensorStaticInfo->maxFps == 0) ? 0 : m_sensorStaticInfo->maxFps; |
| |
| /* The min fps can not be '0'. Therefore it is set up default value '15'. */ |
| if (minFps == 0) { |
| ALOGW("WRN(%s): Invalid min fps value(%d)", __FUNCTION__, minFps); |
| minFps = 15; |
| } |
| /* The initial fps can not be '0' and bigger than '30'. Therefore it is set up default value '30'. */ |
| if (maxFps == 0 || 30 < maxFps) { |
| ALOGW("WRN(%s): Invalid max fps value(%d)", __FUNCTION__, maxFps); |
| maxFps = 30; |
| } |
| |
| m_maxFps = maxFps; |
| |
| /* 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; |
| #ifdef USE_FW_FLASHMODE |
| shot->uctl.flashMode = CAMERA_FLASH_MODE_OFF; |
| #endif |
| m_overrideFlashControl = false; |
| |
| /* 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 camera_metadata_rational_t colorTransform[9] = { |
| {1, 1}, {0, 1}, {0, 1}, |
| {0, 1}, {1, 1}, {0, 1}, |
| {0, 1}, {0, 1}, {1, 1}, |
| }; |
| memcpy(shot->ctl.color.transform, colorTransform, sizeof(shot->ctl.color.transform)); |
| |
| /* 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 */ |
| float zoomRatio = m_parameters->getZoomRatio(0) / 1000; |
| if (setMetaCtlCropRegion(shot_ext, 0, |
| m_sensorStaticInfo->maxSensorW, |
| m_sensorStaticInfo->maxSensorH, |
| m_sensorStaticInfo->maxPreviewW, |
| m_sensorStaticInfo->maxPreviewH, |
| zoomRatio) != NO_ERROR) { |
| ALOGE("ERR(%s):m_setZoom() fail", __FUNCTION__); |
| } |
| |
| /* jpeg */ |
| shot->ctl.jpeg.quality = 96; |
| shot->ctl.jpeg.thumbnailSize[0] = m_sensorStaticInfo->maxThumbnailW; |
| shot->ctl.jpeg.thumbnailSize[1] = m_sensorStaticInfo->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 = VIDEO_STABILIZATION_MODE_OFF; |
| |
| /* 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.aeExpCompensation = 0; /* 0 is middle */ |
| shot->ctl.aa.vendor_aeExpCompensationStep = m_sensorStaticInfo->exposureCompensationStep; |
| shot->ctl.aa.aeLock = ::AA_AE_LOCK_OFF; |
| |
| 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 = AA_AF_TRIGGER_IDLE; |
| |
| shot->ctl.aa.vendor_isoMode = AA_ISOMODE_AUTO; |
| shot->ctl.aa.vendor_isoValue = 0; |
| shot->ctl.aa.vendor_videoMode = AA_VIDEOMODE_OFF; |
| |
| /* 2. dm */ |
| |
| /* 3. utrl */ |
| #ifdef SAMSUNG_COMPANION |
| shot->uctl.companionUd.caf_mode = COMPANION_CAF_ON; |
| shot->uctl.companionUd.disparity_mode = COMPANION_DISPARITY_OFF; |
| |
| shot->uctl.companionUd.drc_mode = COMPANION_DRC_OFF; |
| shot->uctl.companionUd.paf_mode = COMPANION_PAF_ON; |
| shot->uctl.companionUd.wdr_mode = COMPANION_WDR_OFF; |
| shot->uctl.companionUd.lsc_mode = COMPANION_LSC_OFF; |
| shot->uctl.companionUd.bpc_mode = COMPANION_BPC_OFF; |
| shot->uctl.companionUd.bypass_mode= COMPANION_FULL_BYPASS_OFF; |
| #endif |
| |
| #ifdef USE_FW_OPMODE |
| shot->uctl.opMode = CAMERA_OP_MODE_HAL3_GED; |
| #endif |
| |
| /* 4. udm */ |
| |
| /* 5. magicNumber */ |
| shot->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| /* 6. default setfile index */ |
| setMetaSetfile(shot_ext, ISS_SUB_SCENARIO_STILL_PREVIEW); |
| |
| /* user request */ |
| shot_ext->drc_bypass = 1; |
| shot_ext->dis_bypass = 1; |
| shot_ext->dnr_bypass = 1; |
| shot_ext->fd_bypass = 1; |
| /* |
| m_dummyShot.request_taap = 1; |
| m_dummyShot.request_taac = 0; |
| m_dummyShot.request_isp = 1; |
| m_dummyShot.request_scc = 0; |
| m_dummyShot.request_scp = 1; |
| m_dummyShot.request_dis = 0; |
| */ |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateColorControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { |
| entry = settings.find(ANDROID_COLOR_CORRECTION_MODE); |
| dst->ctl.color.mode = (enum colorcorrection_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_COLOR_CORRECTION_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { |
| entry = settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM); |
| for (size_t i = 0; i < entry.count && i < 9; i++) { |
| /* Convert rational to float */ |
| dst->ctl.color.transform[i].num = entry.data.r[i].numerator; |
| dst->ctl.color.transform[i].den = entry.data.r[i].denominator; |
| } |
| ALOGV("DEBUG(%s):ANDROID_COLOR_CORRECTION_TRANSFORM(%zu)", __FUNCTION__, entry.count); |
| } |
| |
| if (settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { |
| entry = settings.find(ANDROID_COLOR_CORRECTION_GAINS); |
| for (size_t i = 0; i < entry.count && i < 4; i++) { |
| dst->ctl.color.gains[i] = entry.data.f[i]; |
| } |
| ALOGV("DEBUG(%s):ANDROID_COLOR_CORRECTION_GAINS(%f,%f,%f,%f)", __FUNCTION__, |
| entry.data.f[0], entry.data.f[1], entry.data.f[2], entry.data.f[3]); |
| } |
| |
| if (settings.exists(ANDROID_COLOR_CORRECTION_ABERRATION_MODE)) { |
| entry = settings.find(ANDROID_COLOR_CORRECTION_ABERRATION_MODE); |
| dst->ctl.color.aberrationCorrectionMode = (enum processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_COLOR_CORRECTION_ABERRATION_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateControlControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| uint32_t bnsRatio = DEFAULT_BNS_RATIO; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (m_flashMgr == NULL) { |
| ALOGE("ERR(%s[%d]):FlashMgr is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| #ifdef USE_BNS_PREVIEW |
| bnsRatio = m_parameters->getBnsScaleRatio()/1000; |
| #endif |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE); |
| dst->ctl.aa.aeAntibandingMode = (enum aa_ae_antibanding_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| if (dst->ctl.aa.aeAntibandingMode != AA_AE_ANTIBANDING_OFF) { |
| dst->ctl.aa.aeAntibandingMode = (enum aa_ae_antibanding_mode) m_defaultAntibanding; |
| } |
| ALOGV("DEBUG(%s):ANDROID_COLOR_AE_ANTIBANDING_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { |
| entry = settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION); |
| dst->ctl.aa.aeExpCompensation = (int32_t) (entry.data.i32[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION(%d)", __FUNCTION__, entry.data.i32[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AE_MODE)) { |
| enum aa_aemode aeMode = AA_AEMODE_OFF; |
| entry = settings.find(ANDROID_CONTROL_AE_MODE); |
| aeMode = (enum aa_aemode) FIMC_IS_METADATA(entry.data.u8[0]); |
| m_flashMgr->setFlashExposure(aeMode); |
| dst->ctl.aa.aeMode = aeMode; |
| #ifdef USE_FW_FLASHMODE |
| dst->uctl.flashMode = CAMERA_FLASH_MODE_OFF; |
| #endif |
| |
| enum ExynosCameraActivityFlash::FLASH_REQ flashReq = ExynosCameraActivityFlash::FLASH_REQ_OFF; |
| switch (aeMode) { |
| case AA_AEMODE_ON_AUTO_FLASH: |
| case AA_AEMODE_ON_AUTO_FLASH_REDEYE: |
| flashReq = ExynosCameraActivityFlash::FLASH_REQ_AUTO; |
| dst->ctl.aa.aeMode = AA_AEMODE_CENTER; |
| #ifdef USE_FW_FLASHMODE |
| dst->uctl.flashMode = CAMERA_FLASH_MODE_AUTO; |
| #endif |
| m_overrideFlashControl = true; |
| break; |
| case AA_AEMODE_ON_ALWAYS_FLASH: |
| flashReq = ExynosCameraActivityFlash::FLASH_REQ_ON; |
| dst->ctl.aa.aeMode = AA_AEMODE_CENTER; |
| #ifdef USE_FW_FLASHMODE |
| dst->uctl.flashMode = CAMERA_FLASH_MODE_ON; |
| #endif |
| m_overrideFlashControl = true; |
| break; |
| case AA_AEMODE_ON: |
| dst->ctl.aa.aeMode = AA_AEMODE_CENTER; |
| case AA_AEMODE_OFF: |
| default: |
| m_overrideFlashControl = false; |
| break; |
| } |
| if (m_flashMgr != NULL) { |
| ALOGV("DEBUG(%s):m_flashMgr(%d)", __FUNCTION__,flashReq); |
| m_flashMgr->setFlashReq(flashReq, m_overrideFlashControl); |
| } |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AE_LOCK)) { |
| entry = settings.find(ANDROID_CONTROL_AE_LOCK); |
| dst->ctl.aa.aeLock = (enum aa_ae_lock) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_LOCK(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| #ifndef SAMSUNG_CONTROL_METERING // Will be processed in vendor control |
| if (settings.exists(ANDROID_CONTROL_AE_REGIONS)) { |
| ExynosRect2 aeRegion; |
| |
| entry = settings.find(ANDROID_CONTROL_AE_REGIONS); |
| aeRegion.x1 = entry.data.i32[0]; |
| aeRegion.y1 = entry.data.i32[1]; |
| aeRegion.x2 = entry.data.i32[2]; |
| aeRegion.y2 = entry.data.i32[3]; |
| dst->ctl.aa.aeRegions[4] = entry.data.i32[4]; |
| m_convert3AARegion(&aeRegion); |
| |
| dst->ctl.aa.aeRegions[0] = aeRegion.x1; |
| dst->ctl.aa.aeRegions[1] = aeRegion.y1; |
| dst->ctl.aa.aeRegions[2] = aeRegion.x2; |
| dst->ctl.aa.aeRegions[3] = aeRegion.y2; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_REGIONS(%d,%d,%d,%d,%d)", __FUNCTION__, |
| entry.data.i32[0], |
| entry.data.i32[1], |
| entry.data.i32[2], |
| entry.data.i32[3], |
| entry.data.i32[4]); |
| |
| // If AE region has meaningful value, AE region can be applied to the output image |
| if (entry.data.i32[0] && entry.data.i32[1] && entry.data.i32[2] && entry.data.i32[3]) { |
| dst->ctl.aa.aeMode = (enum aa_aemode)AA_AEMODE_SPOT; |
| ALOGV("DEBUG(%s):update AA_AEMODE(%d)", __FUNCTION__, dst->ctl.aa.aeMode); |
| } |
| } |
| #endif |
| |
| if (settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { |
| ExynosRect2 awbRegion; |
| |
| /* AWB region value would not be used at the f/w, |
| because AWB is not related with a specific region */ |
| entry = settings.find(ANDROID_CONTROL_AWB_REGIONS); |
| awbRegion.x1 = entry.data.i32[0]; |
| awbRegion.y1 = entry.data.i32[1]; |
| awbRegion.x2 = entry.data.i32[2]; |
| awbRegion.y2 = entry.data.i32[3]; |
| dst->ctl.aa.awbRegions[4] = entry.data.i32[4]; |
| m_convert3AARegion(&awbRegion); |
| |
| dst->ctl.aa.awbRegions[0] = awbRegion.x1; |
| dst->ctl.aa.awbRegions[1] = awbRegion.y1; |
| dst->ctl.aa.awbRegions[2] = awbRegion.x2; |
| dst->ctl.aa.awbRegions[3] = awbRegion.y2; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AWB_REGIONS(%d,%d,%d,%d,%d)", __FUNCTION__, |
| entry.data.i32[0], |
| entry.data.i32[1], |
| entry.data.i32[2], |
| entry.data.i32[3], |
| entry.data.i32[4]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AF_REGIONS)) { |
| ExynosRect2 afRegion; |
| |
| entry = settings.find(ANDROID_CONTROL_AF_REGIONS); |
| afRegion.x1 = entry.data.i32[0]; |
| afRegion.y1 = entry.data.i32[1]; |
| afRegion.x2 = entry.data.i32[2]; |
| afRegion.y2 = entry.data.i32[3]; |
| dst->ctl.aa.afRegions[4] = entry.data.i32[4]; |
| m_convert3AARegion(&afRegion); |
| |
| dst->ctl.aa.afRegions[0] = afRegion.x1; |
| dst->ctl.aa.afRegions[1] = afRegion.y1; |
| dst->ctl.aa.afRegions[2] = afRegion.x2; |
| dst->ctl.aa.afRegions[3] = afRegion.y2; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AF_REGIONS(%d,%d,%d,%d,%d)", __FUNCTION__, |
| entry.data.i32[0], |
| entry.data.i32[1], |
| entry.data.i32[2], |
| entry.data.i32[3], |
| entry.data.i32[4]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { |
| uint32_t max_fps, min_fps; |
| ExynosCamera3Parameters *parameters = (ExynosCamera3Parameters *)m_parameters; |
| |
| entry = settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE); |
| parameters->checkPreviewFpsRange(entry.data.i32[0], entry.data.i32[1]); |
| parameters->getPreviewFpsRange(&min_fps, &max_fps); |
| dst->ctl.aa.aeTargetFpsRange[0] = min_fps; |
| dst->ctl.aa.aeTargetFpsRange[1] = max_fps; |
| m_maxFps = dst->ctl.aa.aeTargetFpsRange[1]; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_TARGET_FPS_RANGE(%d-%d)", __FUNCTION__, |
| entry.data.i32[0], entry.data.i32[1]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)) { |
| entry = settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); |
| dst->ctl.aa.aePrecaptureTrigger = (enum aa_ae_precapture_trigger) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AF_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_AF_MODE); |
| dst->ctl.aa.afMode = (enum aa_afmode) FIMC_IS_METADATA(entry.data.u8[0]); |
| m_preAfMode = m_afMode; |
| m_afMode = dst->ctl.aa.afMode; |
| |
| switch (dst->ctl.aa.afMode) { |
| case AA_AFMODE_AUTO: |
| dst->ctl.aa.vendor_afmode_option = 0x00; |
| break; |
| case AA_AFMODE_MACRO: |
| dst->ctl.aa.vendor_afmode_option = 0x00 | SET_BIT(AA_AFMODE_OPTION_BIT_MACRO); |
| break; |
| case AA_AFMODE_CONTINUOUS_VIDEO: |
| dst->ctl.aa.vendor_afmode_option = 0x00 | SET_BIT(AA_AFMODE_OPTION_BIT_VIDEO); |
| /* The afRegion value should be (0,0,0,0) at the Continuous Video mode */ |
| dst->ctl.aa.afRegions[0] = 0; |
| dst->ctl.aa.afRegions[1] = 0; |
| dst->ctl.aa.afRegions[2] = 0; |
| dst->ctl.aa.afRegions[3] = 0; |
| break; |
| case AA_AFMODE_CONTINUOUS_PICTURE: |
| dst->ctl.aa.vendor_afmode_option = 0x00; |
| /* The afRegion value should be (0,0,0,0) at the Continuous Picture mode */ |
| dst->ctl.aa.afRegions[0] = 0; |
| dst->ctl.aa.afRegions[1] = 0; |
| dst->ctl.aa.afRegions[2] = 0; |
| dst->ctl.aa.afRegions[3] = 0; |
| break; |
| case AA_AFMODE_OFF: |
| default: |
| dst->ctl.aa.vendor_afmode_option = 0x00; |
| break; |
| } |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AF_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AF_TRIGGER)) { |
| entry = settings.find(ANDROID_CONTROL_AF_TRIGGER); |
| dst->ctl.aa.afTrigger = (enum aa_af_trigger)entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AF_TRIGGER(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AWB_LOCK)) { |
| entry = settings.find(ANDROID_CONTROL_AWB_LOCK); |
| dst->ctl.aa.awbLock = (enum aa_awb_lock) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AWB_LOCK(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_AWB_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_AWB_MODE); |
| dst->ctl.aa.awbMode = (enum aa_awbmode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_AWB_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { |
| entry = settings.find(ANDROID_CONTROL_CAPTURE_INTENT); |
| dst->ctl.aa.captureIntent = (enum aa_capture_intent) entry.data.u8[0]; |
| if (dst->ctl.aa.captureIntent == AA_CAPTURE_INTENT_VIDEO_RECORD) { |
| dst->ctl.aa.vendor_videoMode = AA_VIDEOMODE_ON; |
| setMetaSetfile(dst_ext, ISS_SUB_SCENARIO_VIDEO); |
| } else { |
| setMetaSetfile(dst_ext, ISS_SUB_SCENARIO_STILL_PREVIEW); |
| } |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_CAPTURE_INTENT(%d) setfile(%d)", __FUNCTION__, dst->ctl.aa.captureIntent, dst_ext->setfile); |
| } |
| if (settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_EFFECT_MODE); |
| dst->ctl.aa.effectMode = (enum aa_effect_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_EFFECT_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| ALOGV("DEBUG(%s):dst->ctl.aa.effectMode(%d)", __FUNCTION__, dst->ctl.aa.effectMode); |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_MODE); |
| dst->ctl.aa.mode = (enum aa_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| uint8_t curValue = 0; |
| uint8_t prevValue = 0; |
| bool flagChanged = false; |
| if (settings.exists(ANDROID_CONTROL_SCENE_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_SCENE_MODE); |
| /* HACK : Temporary save the Mode info for adjusting value for CTS Test */ |
| curValue = entry.data.u8[0]; |
| if (curValue == ANDROID_CONTROL_SCENE_MODE_HDR) { |
| dst->ctl.aa.sceneMode = AA_SCENE_MODE_HDR; |
| } else { |
| dst->ctl.aa.sceneMode = (enum aa_scene_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| } |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_SCENE_MODE(%d)", __FUNCTION__, dst->ctl.aa.sceneMode); |
| } |
| |
| camera_metadata_entry_t prevEntry; |
| if (m_parameters->getCheckRestartStream() == false) { |
| if (m_prevMeta->exists(ANDROID_CONTROL_SCENE_MODE) && settings.exists(ANDROID_CONTROL_SCENE_MODE)) { |
| prevEntry = m_prevMeta->find(ANDROID_CONTROL_SCENE_MODE); |
| prevValue = prevEntry.data.u8[0]; |
| flagChanged = true; |
| } |
| |
| if (flagChanged && prevValue != curValue) { |
| if(prevValue == ANDROID_CONTROL_SCENE_MODE_HDR |
| || curValue == ANDROID_CONTROL_SCENE_MODE_HDR) { |
| m_parameters->setCheckRestartStream(true); |
| ALOGD("ANDROID_CONTROL_SCENE_MODE changed (%d) (%d)", (int)prevValue, (int)curValue); |
| } |
| } |
| } |
| |
| if (settings.exists(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE)) { |
| entry = settings.find(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE); |
| dst->ctl.aa.videoStabilizationMode = (enum aa_videostabilization_mode) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_CONTROL_VIDEO_STABILIZATION_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| enum ExynosCameraActivityFlash::FLASH_STEP flashStep = ExynosCameraActivityFlash::FLASH_STEP_OFF; |
| bool isFlashStepChanged = false; |
| |
| /* Check AF Trigger to turn on the pre-flash */ |
| switch (dst->ctl.aa.afTrigger) { |
| case AA_AF_TRIGGER_START: |
| if (m_flashMgr->getNeedCaptureFlash() == true |
| && m_flashMgr->getFlashStatus() == AA_FLASHMODE_OFF) { |
| flashStep = ExynosCameraActivityFlash::FLASH_STEP_PRE_START; |
| m_flashMgr->setCaptureStatus(true); |
| isFlashStepChanged = true; |
| } |
| break; |
| case AA_AF_TRIGGER_CANCEL: |
| if (m_flashMgr->getNeedCaptureFlash() == true) { |
| m_flashMgr->setFlashStep(ExynosCameraActivityFlash::FLASH_STEP_CANCEL); |
| isFlashStepChanged = true; |
| } |
| break; |
| case AA_AF_TRIGGER_IDLE: |
| default: |
| break; |
| } |
| /* Check Precapture Trigger to turn on the pre-flash */ |
| switch (dst->ctl.aa.aePrecaptureTrigger) { |
| case AA_AE_PRECAPTURE_TRIGGER_START: |
| if (m_flashMgr->getNeedCaptureFlash() == true |
| && m_flashMgr->getFlashStatus() == AA_FLASHMODE_OFF) { |
| flashStep = ExynosCameraActivityFlash::FLASH_STEP_PRE_START; |
| m_flashMgr->setCaptureStatus(true); |
| isFlashStepChanged = true; |
| } |
| break; |
| case AA_AE_PRECAPTURE_TRIGGER_CANCEL: |
| if (m_flashMgr->getNeedCaptureFlash() == true |
| && m_flashMgr->getFlashStatus() != AA_FLASHMODE_OFF |
| && m_flashMgr->getFlashStatus() != AA_FLASHMODE_CANCEL) { |
| flashStep = ExynosCameraActivityFlash::FLASH_STEP_CANCEL; |
| m_flashMgr->setCaptureStatus(false); |
| isFlashStepChanged = true; |
| } |
| break; |
| case AA_AE_PRECAPTURE_TRIGGER_IDLE: |
| default: |
| break; |
| } |
| /* Check Capture Intent to turn on the main-flash */ |
| switch (dst->ctl.aa.captureIntent) { |
| case AA_CAPTURE_INTENT_STILL_CAPTURE: |
| if (m_flashMgr->getNeedCaptureFlash() == true) { |
| flashStep = ExynosCameraActivityFlash::FLASH_STEP_MAIN_START; |
| isFlashStepChanged = true; |
| m_parameters->setMarkingOfExifFlash(1); |
| } else { |
| m_parameters->setMarkingOfExifFlash(0); |
| } |
| break; |
| case AA_CAPTURE_INTENT_CUSTOM: |
| case AA_CAPTURE_INTENT_PREVIEW: |
| case AA_CAPTURE_INTENT_VIDEO_RECORD: |
| case AA_CAPTURE_INTENT_VIDEO_SNAPSHOT: |
| case AA_CAPTURE_INTENT_ZERO_SHUTTER_LAG: |
| case AA_CAPTURE_INTENT_MANUAL: |
| default: |
| break; |
| } |
| |
| if (isFlashStepChanged == true && m_flashMgr != NULL) |
| m_flashMgr->setFlashStep(flashStep); |
| |
| /* If aeMode or Mode is NOT Off, Manual AE control can NOT be operated */ |
| if (dst->ctl.aa.aeMode == AA_AEMODE_OFF |
| || dst->ctl.aa.mode == AA_CONTROL_OFF) { |
| m_isManualAeControl = true; |
| ALOGV("DEBUG(%s):Operate Manual AE Control, aeMode(%d), Mode(%d)", __FUNCTION__, |
| dst->ctl.aa.aeMode, dst->ctl.aa.mode); |
| } else { |
| m_isManualAeControl = false; |
| } |
| |
| translateVendorControlControlData(&settings, dst_ext); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateDemosaicControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_DEMOSAIC_MODE)) { |
| entry = settings.find(ANDROID_DEMOSAIC_MODE); |
| dst->ctl.demosaic.mode = (enum demosaic_processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_DEMOSAIC_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateEdgeControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_EDGE_STRENGTH)) { |
| entry = settings.find(ANDROID_EDGE_STRENGTH); |
| dst->ctl.edge.strength = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_EDGE_STRENGTH(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_EDGE_MODE)) { |
| entry = settings.find(ANDROID_EDGE_MODE); |
| dst->ctl.edge.mode = (enum processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_EDGE_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateFlashControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (m_overrideFlashControl == true) { |
| return OK; |
| } |
| |
| if (settings.exists(ANDROID_FLASH_FIRING_POWER)) { |
| entry = settings.find(ANDROID_FLASH_FIRING_POWER); |
| dst->ctl.flash.firingPower = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_FLASH_FIRING_POWER(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_FLASH_FIRING_TIME)) { |
| entry = settings.find(ANDROID_FLASH_FIRING_TIME); |
| dst->ctl.flash.firingTime = (uint64_t) entry.data.i64[0]; |
| ALOGV("DEBUG(%s):ANDROID_FLASH_FIRING_TIME(%lld)", __FUNCTION__, entry.data.i64[0]); |
| } |
| |
| if (settings.exists(ANDROID_FLASH_MODE)) { |
| entry = settings.find(ANDROID_FLASH_MODE); |
| dst->ctl.flash.flashMode = (enum flash_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| if (settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { |
| entry = settings.find(ANDROID_CONTROL_CAPTURE_INTENT); |
| if ((enum aa_capture_intent) entry.data.u8[0] == AA_CAPTURE_INTENT_STILL_CAPTURE |
| && dst->ctl.flash.flashMode >= CAM2_FLASH_MODE_SINGLE) { |
| m_parameters->setMarkingOfExifFlash(1); |
| } |
| } |
| ALOGV("DEBUG(%s):ANDROID_FLASH_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateHotPixelControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_HOT_PIXEL_MODE)) { |
| entry = settings.find(ANDROID_HOT_PIXEL_MODE); |
| dst->ctl.hotpixel.mode = (enum processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_HOT_PIXEL_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateJpegControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { |
| entry = settings.find(ANDROID_JPEG_GPS_COORDINATES); |
| for (size_t i = 0; i < entry.count && i < 3; i++) |
| dst->ctl.jpeg.gpsCoordinates[i] = entry.data.d[i]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_GPS_COORDINATES(%f,%f,%f)", __FUNCTION__, |
| entry.data.d[0], entry.data.d[1], entry.data.d[2]); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { |
| entry = settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD); |
| |
| /* HAKC for Exif CTS Test */ |
| #if 0 |
| dst->ctl.jpeg.gpsProcessingMethod = entry.data.u8; |
| #else |
| if (strcmp((char *)entry.data.u8, "None") != 0) { |
| strncpy((char *)m_gpsProcessingMethod, (char *)entry.data.u8, entry.count); |
| strncpy((char *)dst->ctl.jpeg.gpsProcessingMethod, (char *)entry.data.u8, entry.count); |
| } |
| #endif |
| |
| ALOGV("DEBUG(%s):ANDROID_JPEG_GPS_PROCESSING_METHOD(%s)", __FUNCTION__, |
| dst->ctl.jpeg.gpsProcessingMethod); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { |
| entry = settings.find(ANDROID_JPEG_GPS_TIMESTAMP); |
| dst->ctl.jpeg.gpsTimestamp = (uint64_t) entry.data.i64[0]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_GPS_TIMESTAMP(%lld)", __FUNCTION__, entry.data.i64[0]); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_ORIENTATION)) { |
| entry = settings.find(ANDROID_JPEG_ORIENTATION); |
| dst->ctl.jpeg.orientation = (uint32_t) entry.data.i32[0]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_ORIENTATION(%d)", __FUNCTION__, entry.data.i32[0]); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_QUALITY)) { |
| entry = settings.find(ANDROID_JPEG_QUALITY); |
| dst->ctl.jpeg.quality = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_QUALITY(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_THUMBNAIL_QUALITY)) { |
| entry = settings.find(ANDROID_JPEG_THUMBNAIL_QUALITY); |
| dst->ctl.jpeg.thumbnailQuality = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_THUMBNAIL_QUALITY(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { |
| entry = settings.find(ANDROID_JPEG_THUMBNAIL_SIZE); |
| for (size_t i = 0; i < entry.count && i < 2; i++) |
| dst->ctl.jpeg.thumbnailSize[i] = (uint32_t) entry.data.i32[i]; |
| ALOGV("DEBUG(%s):ANDROID_JPEG_THUMBNAIL_SIZE(%d,%d)", __FUNCTION__, |
| entry.data.i32[0], entry.data.i32[1]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateLensControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_LENS_APERTURE)) { |
| entry = settings.find(ANDROID_LENS_APERTURE); |
| dst->ctl.lens.aperture = entry.data.f[0]; |
| ALOGV("DEBUG(%s):ANDROID_LENS_APERTURE(%f)", __FUNCTION__, entry.data.f[0]); |
| } |
| |
| if (settings.exists(ANDROID_LENS_FILTER_DENSITY)) { |
| entry = settings.find(ANDROID_LENS_FILTER_DENSITY); |
| dst->ctl.lens.filterDensity = entry.data.f[0]; |
| ALOGV("DEBUG(%s):ANDROID_LENS_FILTER_DENSITY(%f)", __FUNCTION__, entry.data.f[0]); |
| } |
| |
| if (settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { |
| entry = settings.find(ANDROID_LENS_FOCAL_LENGTH); |
| dst->ctl.lens.focalLength = entry.data.f[0]; |
| ALOGV("DEBUG(%s):ANDROID_LENS_FOCAL_LENGTH(%f)", __FUNCTION__, entry.data.f[0]); |
| } |
| |
| if (settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { |
| entry = settings.find(ANDROID_LENS_FOCUS_DISTANCE); |
| /* should not control afMode and focusDistance at the same time |
| should not set the same focusDistance continuously |
| set the -1 to focusDistance if you do not need to change focusDistance |
| */ |
| if (m_afMode != AA_AFMODE_OFF || m_afMode != m_preAfMode || m_focusDistance == entry.data.f[0]) { |
| dst->ctl.lens.focusDistance = -1; |
| } else { |
| dst->ctl.lens.focusDistance = entry.data.f[0]; |
| } |
| m_focusDistance = dst->ctl.lens.focusDistance; |
| ALOGV("DEBUG(%s):ANDROID_LENS_FOCUS_DISTANCE(%f)", __FUNCTION__, entry.data.f[0]); |
| } |
| |
| if (settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { |
| entry = settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE); |
| switch (entry.data.u8[0]) { |
| case ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON: |
| dst->ctl.lens.opticalStabilizationMode = OPTICAL_STABILIZATION_MODE_STILL; |
| break; |
| case ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF: |
| default: |
| dst->ctl.lens.opticalStabilizationMode = OPTICAL_STABILIZATION_MODE_CENTERING; |
| break; |
| } |
| ALOGV("DEBUG(%s):ANDROID_LENS_OPTICAL_STABILIZATION_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| translateVendorLensControlData(&settings, dst_ext); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateNoiseControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { |
| entry = settings.find(ANDROID_NOISE_REDUCTION_STRENGTH); |
| dst->ctl.noise.strength = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_NOISE_REDUCTION_STRENGTH(%d)", __FUNCTION__, |
| dst->ctl.noise.strength); |
| } |
| |
| if (settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { |
| entry = settings.find(ANDROID_NOISE_REDUCTION_MODE); |
| dst->ctl.noise.mode = (enum processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_NOISE_REDUCTION_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateRequestControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext, int *reqId) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_REQUEST_ID)) { |
| entry = settings.find(ANDROID_REQUEST_ID); |
| dst->ctl.request.id = (uint32_t) entry.data.i32[0]; |
| ALOGV("DEBUG(%s):ANDROID_REQUEST_ID(%d)", __FUNCTION__, entry.data.i32[0]); |
| |
| if (reqId != NULL) |
| *reqId = dst->ctl.request.id; |
| } |
| |
| if (settings.exists(ANDROID_REQUEST_METADATA_MODE)) { |
| entry = settings.find(ANDROID_REQUEST_METADATA_MODE); |
| dst->ctl.request.metadataMode = (enum metadata_mode) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_REQUEST_METADATA_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateScalerControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_SCALER_CROP_REGION)) { |
| entry = settings.find(ANDROID_SCALER_CROP_REGION); |
| /* HACK: Temporary save the cropRegion for CTS */ |
| m_cropRegion.x = entry.data.i32[0]; |
| m_cropRegion.y = entry.data.i32[1]; |
| m_cropRegion.w = entry.data.i32[2]; |
| m_cropRegion.h = entry.data.i32[3]; |
| for (size_t i = 0; i < entry.count && i < 4; i++) |
| dst->ctl.scaler.cropRegion[i] = (uint32_t) entry.data.i32[i]; |
| ALOGV("DEBUG(%s):ANDROID_SCALER_CROP_REGION(%d,%d,%d,%d)", __FUNCTION__, |
| entry.data.i32[0], entry.data.i32[1], |
| entry.data.i32[2], entry.data.i32[3]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateSensorControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (m_isManualAeControl == true |
| && settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { |
| entry = settings.find(ANDROID_SENSOR_EXPOSURE_TIME); |
| dst->ctl.sensor.exposureTime = (uint64_t) entry.data.i64[0]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_EXPOSURE_TIME(%lld)", __FUNCTION__, entry.data.i64[0]); |
| } |
| |
| if (m_isManualAeControl == true |
| && settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { |
| entry = settings.find(ANDROID_SENSOR_FRAME_DURATION); |
| dst->ctl.sensor.frameDuration = (uint64_t) entry.data.i64[0]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_FRAME_DURATION(%lld)", __FUNCTION__, entry.data.i64[0]); |
| } else { |
| /* default value */ |
| dst->ctl.sensor.frameDuration = (1000 * 1000 * 1000) / m_maxFps; |
| } |
| |
| if (m_isManualAeControl == true |
| && settings.exists(ANDROID_SENSOR_SENSITIVITY)) { |
| entry = settings.find(ANDROID_SENSOR_SENSITIVITY); |
| dst->ctl.aa.vendor_isoMode = AA_ISOMODE_MANUAL; |
| dst->ctl.sensor.sensitivity = (uint32_t) entry.data.i32[0]; |
| dst->ctl.aa.vendor_isoValue = (uint32_t) entry.data.i32[0]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_SENSITIVITY(%d)", __FUNCTION__, entry.data.i32[0]); |
| } else { |
| dst->ctl.aa.vendor_isoMode = AA_ISOMODE_AUTO; |
| dst->ctl.sensor.sensitivity = 0; |
| dst->ctl.aa.vendor_isoValue = 0; |
| } |
| |
| if (settings.exists(ANDROID_SENSOR_TEST_PATTERN_DATA)) { |
| entry = settings.find(ANDROID_SENSOR_TEST_PATTERN_DATA); |
| for (size_t i = 0; i < entry.count && i < 4; i++) |
| dst->ctl.sensor.testPatternData[i] = entry.data.i32[i]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_TEST_PATTERN_DATA(%d,%d,%d,%d)", __FUNCTION__, |
| entry.data.i32[0], entry.data.i32[1], entry.data.i32[2], entry.data.i32[3]); |
| } |
| |
| if (settings.exists(ANDROID_SENSOR_TEST_PATTERN_MODE)) { |
| entry = settings.find(ANDROID_SENSOR_TEST_PATTERN_MODE); |
| /* TODO : change SENSOR_TEST_PATTERN_MODE_CUSTOM1 from 256 to 267 */ |
| if (entry.data.i32[0] == ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1) |
| dst->ctl.sensor.testPatternMode = SENSOR_TEST_PATTERN_MODE_CUSTOM1; |
| else |
| dst->ctl.sensor.testPatternMode = (enum sensor_test_pattern_mode) FIMC_IS_METADATA(entry.data.i32[0]); |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_TEST_PATTERN_MODE(%d)", __FUNCTION__, entry.data.i32[0]); |
| } |
| |
| /* Get sensor result meta for ZSL_INPUT */ |
| if (settings.exists(ANDROID_SENSOR_TIMESTAMP)) { |
| entry = settings.find(ANDROID_SENSOR_TIMESTAMP); |
| dst->udm.sensor.timeStampBoot = (uint64_t)entry.data.i64[0]; |
| dst->dm.request.frameCount = m_getFrameCountForTimeStamp(dst->udm.sensor.timeStampBoot); |
| ALOGD("DEBUG(%s):ANDROID_SENSOR_TIMESTAMP(%llu)", |
| __FUNCTION__, dst->udm.sensor.timeStampBoot); |
| } |
| |
| if (settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { |
| entry = settings.find(ANDROID_SENSOR_EXPOSURE_TIME); |
| dst->dm.sensor.exposureTime = (uint64_t)entry.data.i64[0]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_EXPOSURE_TIME(%llu)", |
| __FUNCTION__, dst->dm.sensor.exposureTime); |
| } |
| |
| if (settings.exists(ANDROID_SENSOR_SENSITIVITY)) { |
| entry = settings.find(ANDROID_SENSOR_SENSITIVITY); |
| dst->dm.sensor.sensitivity = entry.data.i32[0]; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_SENSITIVITY(%d)", |
| __FUNCTION__, dst->dm.sensor.sensitivity); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateShadingControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_SHADING_MODE)) { |
| entry = settings.find(ANDROID_SHADING_MODE); |
| dst->ctl.shading.mode = (enum processing_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_SHADING_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_SHADING_STRENGTH)) { |
| entry = settings.find(ANDROID_SHADING_STRENGTH); |
| dst->ctl.shading.strength = (uint32_t) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_SHADING_STRENGTH(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateStatisticsControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { |
| entry = settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE); |
| /* HACK : F/W does NOT support FD Off */ |
| if (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) { |
| m_faceDetectModeOn = false; |
| dst_ext->fd_bypass = 1; |
| } else { |
| m_faceDetectModeOn = true; |
| dst_ext->fd_bypass = 0; |
| } |
| dst->ctl.stats.faceDetectMode = (enum facedetect_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_STATISTICS_FACE_DETECT_MODE(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { |
| entry = settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE); |
| dst->ctl.stats.histogramMode = (enum stats_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_STATISTICS_HISTOGRAM_MODE(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { |
| entry = settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE); |
| dst->ctl.stats.sharpnessMapMode = (enum stats_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_STATISTICS_SHARPNESS_MAP_MODE(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE)) { |
| entry = settings.find(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE); |
| dst->ctl.stats.hotPixelMapMode = (enum stats_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| if (settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { |
| entry = settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE); |
| dst->ctl.stats.lensShadingMapMode = (enum stats_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_STATISTICS_LENS_SHADING_MAP_MODE(%d)", __FUNCTION__, |
| entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateTonemapControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_TONEMAP_MODE)) { |
| entry = settings.find(ANDROID_TONEMAP_MODE); |
| dst->ctl.tonemap.mode = (enum tonemap_mode) FIMC_IS_METADATA(entry.data.u8[0]); |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_MODE(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| if(dst->ctl.tonemap.mode == TONEMAP_MODE_CONTRAST_CURVE) { |
| if (settings.exists(ANDROID_TONEMAP_CURVE_BLUE)) { |
| float tonemapCurveBlue[64] = {0, }; |
| |
| entry = settings.find(ANDROID_TONEMAP_CURVE_BLUE); |
| if (entry.count < 64) { |
| if (entry.count == 4) { |
| float deltaIn, deltaOut; |
| |
| deltaIn = entry.data.f[2] - entry.data.f[0]; |
| deltaOut = entry.data.f[3] - entry.data.f[1]; |
| for (size_t i = 0; i < 61; i += 2) { |
| tonemapCurveBlue[i] = deltaIn * i / 64.0 + entry.data.f[0]; |
| tonemapCurveBlue[i+1] = deltaOut * i / 64.0 + entry.data.f[1]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_BLUE([%d]:%f)", __FUNCTION__, i, tonemapCurveBlue[i]); |
| } |
| tonemapCurveBlue[62] = entry.data.f[2]; |
| tonemapCurveBlue[63] = entry.data.f[3]; |
| } else if (entry.count == 32) { |
| size_t i; |
| for (i = 0; i < 30; i += 2) { |
| tonemapCurveBlue[2*i] = entry.data.f[i]; |
| tonemapCurveBlue[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveBlue[2*i+2] = (entry.data.f[i] + entry.data.f[i+2])/2; |
| tonemapCurveBlue[2*i+3] = (entry.data.f[i+1] + entry.data.f[i+3])/2; |
| } |
| i = 30; |
| tonemapCurveBlue[2*i] = entry.data.f[i]; |
| tonemapCurveBlue[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveBlue[2*i+2] = entry.data.f[i]; |
| tonemapCurveBlue[2*i+3] = entry.data.f[i+1]; |
| } else { |
| ALOGE("ERROR(%s):ANDROID_TONEMAP_CURVE_BLUE( entry count : %d)", __FUNCTION__, entry.count); |
| } |
| } else { |
| for (size_t i = 0; i < entry.count && i < 64; i++) { |
| tonemapCurveBlue[i] = entry.data.f[i]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_BLUE([%d]:%f)", __FUNCTION__, i, entry.data.f[i]); |
| } |
| } |
| memcpy(&(dst->ctl.tonemap.curveBlue[0]), tonemapCurveBlue, sizeof(float)*64); |
| } |
| |
| if (settings.exists(ANDROID_TONEMAP_CURVE_GREEN)) { |
| float tonemapCurveGreen[64] = {0, }; |
| |
| entry = settings.find(ANDROID_TONEMAP_CURVE_GREEN); |
| if (entry.count < 64) { |
| if (entry.count == 4) { |
| float deltaIn, deltaOut; |
| |
| deltaIn = entry.data.f[2] - entry.data.f[0]; |
| deltaOut = entry.data.f[3] - entry.data.f[1]; |
| for (size_t i = 0; i < 61; i += 2) { |
| tonemapCurveGreen[i] = deltaIn * i / 64.0 + entry.data.f[0]; |
| tonemapCurveGreen[i+1] = deltaOut * i / 64.0 + entry.data.f[1]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_GREEN([%d]:%f)", __FUNCTION__, i, tonemapCurveGreen[i]); |
| } |
| tonemapCurveGreen[62] = entry.data.f[2]; |
| tonemapCurveGreen[63] = entry.data.f[3]; |
| } else if (entry.count == 32) { |
| size_t i; |
| for (i = 0; i < 30; i += 2) { |
| tonemapCurveGreen[2*i] = entry.data.f[i]; |
| tonemapCurveGreen[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveGreen[2*i+2] = (entry.data.f[i] + entry.data.f[i+2])/2; |
| tonemapCurveGreen[2*i+3] = (entry.data.f[i+1] + entry.data.f[i+3])/2; |
| } |
| i = 30; |
| tonemapCurveGreen[2*i] = entry.data.f[i]; |
| tonemapCurveGreen[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveGreen[2*i+2] = entry.data.f[i]; |
| tonemapCurveGreen[2*i+3] = entry.data.f[i+1]; |
| } else { |
| ALOGE("ERROR(%s):ANDROID_TONEMAP_CURVE_GREEN( entry count : %d)", __FUNCTION__, entry.count); |
| } |
| } else { |
| for (size_t i = 0; i < entry.count && i < 64; i++) { |
| tonemapCurveGreen[i] = entry.data.f[i]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_GREEN([%d]:%f)", __FUNCTION__, i, entry.data.f[i]); |
| } |
| } |
| memcpy(&(dst->ctl.tonemap.curveGreen[0]), tonemapCurveGreen, sizeof(float)*64); |
| } |
| |
| if (settings.exists(ANDROID_TONEMAP_CURVE_RED)) { |
| float tonemapCurveRed[64] = {0, }; |
| |
| entry = settings.find(ANDROID_TONEMAP_CURVE_RED); |
| if (entry.count < 64) { |
| if (entry.count == 4) { |
| float deltaIn, deltaOut; |
| |
| deltaIn = entry.data.f[2] - entry.data.f[0]; |
| deltaOut = entry.data.f[3] - entry.data.f[1]; |
| for (size_t i = 0; i < 61; i += 2) { |
| tonemapCurveRed[i] = deltaIn * i / 64.0 + entry.data.f[0]; |
| tonemapCurveRed[i+1] = deltaOut * i / 64.0 + entry.data.f[1]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_RED([%d]:%f)", __FUNCTION__, i, tonemapCurveRed[i]); |
| } |
| tonemapCurveRed[62] = entry.data.f[2]; |
| tonemapCurveRed[63] = entry.data.f[3]; |
| } else if (entry.count == 32) { |
| size_t i; |
| for (i = 0; i < 30; i += 2) { |
| tonemapCurveRed[2*i] = entry.data.f[i]; |
| tonemapCurveRed[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveRed[2*i+2] = (entry.data.f[i] + entry.data.f[i+2])/2; |
| tonemapCurveRed[2*i+3] = (entry.data.f[i+1] + entry.data.f[i+3])/2; |
| } |
| i = 30; |
| tonemapCurveRed[2*i] = entry.data.f[i]; |
| tonemapCurveRed[2*i+1] = entry.data.f[i+1]; |
| tonemapCurveRed[2*i+2] = entry.data.f[i]; |
| tonemapCurveRed[2*i+3] = entry.data.f[i+1]; |
| } else { |
| ALOGE("ERROR(%s):ANDROID_TONEMAP_CURVE_RED( entry count : %d)", __FUNCTION__, entry.count); |
| } |
| } else { |
| for (size_t i = 0; i < entry.count && i < 64; i++) { |
| tonemapCurveRed[i] = entry.data.f[i]; |
| ALOGV("DEBUG(%s):ANDROID_TONEMAP_CURVE_RED([%d]:%f)", __FUNCTION__, i, entry.data.f[i]); |
| } |
| } |
| memcpy(&(dst->ctl.tonemap.curveRed[0]), tonemapCurveRed, sizeof(float)*64); |
| } |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateLedControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_LED_TRANSMIT)) { |
| entry = settings.find(ANDROID_LED_TRANSMIT); |
| dst->ctl.led.transmit = (enum led_transmit) entry.data.u8[0]; |
| ALOGV("DEBUG(%s):ANDROID_LED_TRANSMIT(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateBlackLevelControlData(CameraMetadata &settings, struct camera2_shot_ext *dst_ext) |
| { |
| struct camera2_shot *dst = NULL; |
| camera_metadata_entry_t entry; |
| |
| if (settings.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| dst = &dst_ext->shot; |
| dst->magicNumber = SHOT_MAGIC_NUMBER; |
| |
| if (settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { |
| entry = settings.find(ANDROID_BLACK_LEVEL_LOCK); |
| dst->ctl.blacklevel.lock = (enum blacklevel_lock) entry.data.u8[0]; |
| /* HACK : F/W does NOT support thie field */ |
| if (entry.data.u8[0] == ANDROID_BLACK_LEVEL_LOCK_ON) |
| m_blackLevelLockOn = true; |
| else |
| m_blackLevelLockOn = false; |
| ALOGV("DEBUG(%s):ANDROID_BLACK_LEVEL_LOCK(%d)", __FUNCTION__, entry.data.u8[0]); |
| } |
| |
| return OK; |
| } |
| |
| void ExynosCamera3MetadataConverter::setPreviousMeta(CameraMetadata *meta) |
| { |
| m_prevMeta = meta; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::convertRequestToShot(CameraMetadata &request, struct camera2_shot_ext *dst_ext, int *reqId) |
| { |
| Mutex::Autolock l(m_requestLock); |
| status_t ret = OK; |
| uint32_t errorFlag = 0; |
| |
| if (request.isEmpty()) { |
| ALOGE("ERR(%s[%d]):Settings is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (dst_ext == NULL) { |
| ALOGE("ERR(%s[%d]):dst_ext is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| ret = translateColorControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 0); |
| ret = translateControlControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 1); |
| ret = translateDemosaicControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 2); |
| ret = translateEdgeControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 3); |
| ret = translateFlashControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 4); |
| ret = translateHotPixelControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 5); |
| ret = translateJpegControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 6); |
| ret = translateLensControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 7); |
| ret = translateNoiseControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 8); |
| ret = translateRequestControlData(request, dst_ext, reqId); |
| if (ret != OK) |
| errorFlag |= (1 << 9); |
| ret = translateScalerControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 10); |
| ret = translateSensorControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 11); |
| ret = translateShadingControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 12); |
| ret = translateStatisticsControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 13); |
| ret = translateTonemapControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 14); |
| ret = translateLedControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 15); |
| ret = translateBlackLevelControlData(request, dst_ext); |
| if (ret != OK) |
| errorFlag |= (1 << 16); |
| |
| m_parameters->setRestartStream(m_parameters->getCheckRestartStream()); |
| m_parameters->setCheckRestartStream(false); |
| |
| if (errorFlag != 0) { |
| ALOGE("ERR(%s[%d]):failed to translate Control Data(%d)", __FUNCTION__, __LINE__, errorFlag); |
| return INVALID_OPERATION; |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateColorMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const uint8_t colorMode = (uint8_t) CAMERA_METADATA(src->dm.color.mode); |
| settings.update(ANDROID_COLOR_CORRECTION_MODE, &colorMode, 1); |
| ALOGV("DEBUG(%s):dm.color.mode(%d)", __FUNCTION__, src->dm.color.mode); |
| |
| camera_metadata_rational_t colorTransform[9]; |
| for (int i = 0; i < 9; i++) { |
| colorTransform[i].numerator = (int32_t) src->dm.color.transform[i].num; |
| colorTransform[i].denominator = (int32_t) src->dm.color.transform[i].den; |
| } |
| settings.update(ANDROID_COLOR_CORRECTION_TRANSFORM, colorTransform, 9); |
| ALOGV("DEBUG(%s):dm.color.transform", __FUNCTION__); |
| |
| float colorGains[4]; |
| for (int i = 0; i < 4; i++) { |
| colorGains[i] = src->dm.color.gains[i]; |
| } |
| settings.update(ANDROID_COLOR_CORRECTION_GAINS, colorGains, 4); |
| ALOGV("DEBUG(%s):dm.color.gains(%f,%f,%f,%f)", __FUNCTION__, |
| colorGains[0], colorGains[1], colorGains[2], colorGains[3]); |
| |
| const uint8_t aberrationMode = (uint8_t) CAMERA_METADATA(src->dm.color.aberrationCorrectionMode); |
| settings.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &aberrationMode, 1); |
| ALOGV("DEBUG(%s):dm.color.aberrationCorrectionMode(%d)", __FUNCTION__, |
| src->dm.color.aberrationCorrectionMode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateControlMetaData(ExynosCameraRequestSP_sprt_t requestInfo, bool partialMeta) |
| { |
| CameraMetadata settings; |
| CameraMetadata service_settings; |
| camera_metadata_entry_t entry; |
| camera_metadata_entry_t cropRegionEntry; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| uint8_t controlState = 0; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* HACK : F/W does NOT support some fields */ |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| service_settings = requestInfo->getServiceMeta(); |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| uint8_t antibandingMode = (uint8_t) CAMERA_METADATA(src->dm.aa.aeAntibandingMode); |
| if (src->dm.aa.aeAntibandingMode == AA_AE_ANTIBANDING_AUTO_50HZ |
| || src->dm.aa.aeAntibandingMode == AA_AE_ANTIBANDING_AUTO_60HZ) { |
| antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; |
| } |
| settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &antibandingMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeAntibandingMode(%d)", __FUNCTION__, src->dm.aa.aeAntibandingMode); |
| |
| const int32_t aeExposureCompensation = src->dm.aa.aeExpCompensation; |
| settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExposureCompensation, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeExpCompensation(%d)", __FUNCTION__, src->dm.aa.aeExpCompensation); |
| uint8_t aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| |
| if (partialMeta == true) { |
| if (src->dm.aa.aeMode == AA_AEMODE_OFF) { |
| aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| } else { |
| if (m_flashMgr != NULL) { |
| switch (m_flashMgr->getFlashReq()) { |
| case ExynosCameraActivityFlash::FLASH_REQ_AUTO: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_ON: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_RED_EYE: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_TORCH: |
| case ExynosCameraActivityFlash::FLASH_REQ_OFF: |
| default: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| break; |
| } |
| } |
| } |
| settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeMode(%d), AE_MODE(%d)", __FUNCTION__, src->dm.aa.aeMode, aeMode); |
| |
| const uint8_t aeLock = (uint8_t) CAMERA_METADATA(src->dm.aa.aeLock); |
| settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeLock(%d)", __FUNCTION__, aeLock); |
| } |
| |
| if (m_sensorStaticInfo->max3aRegions[AE] > 0) { |
| /* HACK: Result AE_REGION must be updated based of the value from F/W */ |
| int32_t aeRegion[5]; |
| if (service_settings.exists(ANDROID_SCALER_CROP_REGION) && |
| service_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { |
| cropRegionEntry = service_settings.find(ANDROID_SCALER_CROP_REGION); |
| entry = service_settings.find(ANDROID_CONTROL_AE_REGIONS); |
| /* ae region is bigger than crop region */ |
| if (cropRegionEntry.data.i32[2] < entry.data.i32[2] - entry.data.i32[0] |
| || cropRegionEntry.data.i32[3] < entry.data.i32[3] - entry.data.i32[1]) { |
| aeRegion[0] = cropRegionEntry.data.i32[0]; |
| aeRegion[1] = cropRegionEntry.data.i32[1]; |
| aeRegion[2] = cropRegionEntry.data.i32[2] + aeRegion[0]; |
| aeRegion[3] = cropRegionEntry.data.i32[3] + aeRegion[1]; |
| aeRegion[4] = entry.data.i32[4]; |
| } else { |
| aeRegion[0] = entry.data.i32[0]; |
| aeRegion[1] = entry.data.i32[1]; |
| aeRegion[2] = entry.data.i32[2]; |
| aeRegion[3] = entry.data.i32[3]; |
| aeRegion[4] = entry.data.i32[4]; |
| } |
| } else { |
| aeRegion[0] = service_shot->ctl.aa.aeRegions[0]; |
| aeRegion[1] = service_shot->ctl.aa.aeRegions[1]; |
| aeRegion[2] = service_shot->ctl.aa.aeRegions[2]; |
| aeRegion[3] = service_shot->ctl.aa.aeRegions[3]; |
| aeRegion[4] = service_shot->ctl.aa.aeRegions[4]; |
| } |
| |
| settings.update(ANDROID_CONTROL_AE_REGIONS, aeRegion, 5); |
| ALOGV("DEBUG(%s):dm.aa.aeRegions(%d,%d,%d,%d,%d)", __FUNCTION__, |
| src->dm.aa.aeRegions[0], |
| src->dm.aa.aeRegions[1], |
| src->dm.aa.aeRegions[2], |
| src->dm.aa.aeRegions[3], |
| src->dm.aa.aeRegions[4]); |
| } |
| |
| if (m_sensorStaticInfo->max3aRegions[AWB] > 0) { |
| /* HACK: Result AWB_REGION must be updated based of the value from F/W */ |
| int32_t awbRegion[5]; |
| if (service_settings.exists(ANDROID_SCALER_CROP_REGION) && |
| service_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { |
| cropRegionEntry = service_settings.find(ANDROID_SCALER_CROP_REGION); |
| entry = service_settings.find(ANDROID_CONTROL_AWB_REGIONS); |
| /* awb region is bigger than crop region */ |
| if (cropRegionEntry.data.i32[2] < entry.data.i32[2] - entry.data.i32[0] |
| || cropRegionEntry.data.i32[3] < entry.data.i32[3] - entry.data.i32[1]) { |
| awbRegion[0] = cropRegionEntry.data.i32[0]; |
| awbRegion[1] = cropRegionEntry.data.i32[1]; |
| awbRegion[2] = cropRegionEntry.data.i32[2] + awbRegion[0]; |
| awbRegion[3] = cropRegionEntry.data.i32[3] + awbRegion[1]; |
| awbRegion[4] = entry.data.i32[4]; |
| } else { |
| awbRegion[0] = entry.data.i32[0]; |
| awbRegion[1] = entry.data.i32[1]; |
| awbRegion[2] = entry.data.i32[2]; |
| awbRegion[3] = entry.data.i32[3]; |
| awbRegion[4] = entry.data.i32[4]; |
| } |
| } else { |
| awbRegion[0] = service_shot->ctl.aa.awbRegions[0]; |
| awbRegion[1] = service_shot->ctl.aa.awbRegions[1]; |
| awbRegion[2] = service_shot->ctl.aa.awbRegions[2]; |
| awbRegion[3] = service_shot->ctl.aa.awbRegions[3]; |
| awbRegion[4] = service_shot->ctl.aa.awbRegions[4]; |
| } |
| |
| settings.update(ANDROID_CONTROL_AWB_REGIONS, awbRegion, 5); |
| ALOGV("DEBUG(%s):dm.aa.awbRegions(%d,%d,%d,%d,%d)", __FUNCTION__, |
| src->dm.aa.awbRegions[0], |
| src->dm.aa.awbRegions[1], |
| src->dm.aa.awbRegions[2], |
| src->dm.aa.awbRegions[3], |
| src->dm.aa.awbRegions[4]); |
| } |
| |
| if (m_sensorStaticInfo->max3aRegions[AF] > 0) { |
| /* HACK: Result AF_REGION must be updated based of the value from F/W */ |
| int32_t afRegion[5]; |
| if (service_settings.exists(ANDROID_SCALER_CROP_REGION) && |
| service_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { |
| cropRegionEntry = service_settings.find(ANDROID_SCALER_CROP_REGION); |
| entry = service_settings.find(ANDROID_CONTROL_AF_REGIONS); |
| /* af region is bigger than crop region */ |
| if (cropRegionEntry.data.i32[2] < entry.data.i32[2] - entry.data.i32[0] |
| || cropRegionEntry.data.i32[3] < entry.data.i32[3] - entry.data.i32[1]) { |
| afRegion[0] = cropRegionEntry.data.i32[0]; |
| afRegion[1] = cropRegionEntry.data.i32[1]; |
| afRegion[2] = cropRegionEntry.data.i32[2] + afRegion[0]; |
| afRegion[3] = cropRegionEntry.data.i32[3] + afRegion[1]; |
| afRegion[4] = entry.data.i32[4]; |
| } else { |
| afRegion[0] = entry.data.i32[0]; |
| afRegion[1] = entry.data.i32[1]; |
| afRegion[2] = entry.data.i32[2]; |
| afRegion[3] = entry.data.i32[3]; |
| afRegion[4] = entry.data.i32[4]; |
| } |
| } else { |
| afRegion[0] = service_shot->ctl.aa.afRegions[0]; |
| afRegion[1] = service_shot->ctl.aa.afRegions[1]; |
| afRegion[2] = service_shot->ctl.aa.afRegions[2]; |
| afRegion[3] = service_shot->ctl.aa.afRegions[3]; |
| afRegion[4] = service_shot->ctl.aa.afRegions[4]; |
| } |
| settings.update(ANDROID_CONTROL_AF_REGIONS, afRegion, 5); |
| ALOGV("DEBUG(%s):dm.aa.afRegions(%d,%d,%d,%d,%d)", __FUNCTION__, |
| src->dm.aa.afRegions[0], |
| src->dm.aa.afRegions[1], |
| src->dm.aa.afRegions[2], |
| src->dm.aa.afRegions[3], |
| src->dm.aa.afRegions[4]); |
| } |
| |
| const int32_t aeTargetFps[2] = |
| { (int32_t) src->dm.aa.aeTargetFpsRange[0], (int32_t) src->dm.aa.aeTargetFpsRange[1] }; |
| settings.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFps, 2); |
| ALOGV("DEBUG(%s):dm.aa.aeTargetFpsRange(%d,%d)", __FUNCTION__, |
| src->dm.aa.aeTargetFpsRange[0], src->dm.aa.aeTargetFpsRange[1]); |
| |
| const uint8_t aePrecaptureTrigger = (uint8_t) src->dm.aa.aePrecaptureTrigger; |
| settings.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &aePrecaptureTrigger ,1); |
| ALOGV("DEBUG(%s):dm.aa.aePrecaptureTrigger(%d)", __FUNCTION__, |
| src->dm.aa.aePrecaptureTrigger); |
| |
| if (partialMeta == true) { |
| uint8_t afMode = (uint8_t) CAMERA_METADATA(src->dm.aa.afMode); |
| settings.update(ANDROID_CONTROL_AF_MODE, &afMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.afMode(%d)", __FUNCTION__, src->dm.aa.afMode); |
| } |
| |
| const uint8_t afTrigger = (uint8_t )src->dm.aa.afTrigger; |
| settings.update(ANDROID_CONTROL_AF_TRIGGER, &afTrigger, 1); |
| ALOGV("DEBUG(%s):dm.aa.afTrigger(%d)", __FUNCTION__, src->dm.aa.afTrigger); |
| |
| const uint8_t awbLock = (uint8_t) CAMERA_METADATA(src->dm.aa.awbLock); |
| settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); |
| ALOGV("DEBUG(%s):dm.aa.awbLock(%d)", __FUNCTION__, src->dm.aa.awbLock); |
| |
| if (partialMeta == true) { |
| const uint8_t awbMode = (uint8_t) CAMERA_METADATA(src->dm.aa.awbMode); |
| settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.awbMode(%d)", __FUNCTION__, src->dm.aa.awbMode); |
| } |
| |
| //const uint8_t captureIntent = (uint8_t) src->dm.aa.captureIntent; |
| const uint8_t captureIntent = (uint8_t)service_shot->ctl.aa.captureIntent; |
| settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); |
| ALOGV("DEBUG(%s):dm.aa.captureIntent(%d)", __FUNCTION__, src->dm.aa.captureIntent); |
| |
| const uint8_t effectMode = (uint8_t) CAMERA_METADATA(src->dm.aa.effectMode); |
| settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.effectMode(%d)", __FUNCTION__, src->dm.aa.effectMode); |
| |
| const uint8_t mode = (uint8_t) CAMERA_METADATA(src->dm.aa.mode); |
| settings.update(ANDROID_CONTROL_MODE, &mode, 1); |
| ALOGV("DEBUG(%s):dm.aa.mode(%d)", __FUNCTION__, src->dm.aa.mode); |
| |
| uint8_t sceneMode = (uint8_t) CAMERA_METADATA(src->dm.aa.sceneMode); |
| /* HACK : Adjust the Scene mode for unsupported scene mode by F/W */ |
| if (src->dm.aa.sceneMode == AA_SCENE_MODE_HDR) |
| sceneMode = ANDROID_CONTROL_SCENE_MODE_HDR; |
| else if (service_shot->ctl.aa.sceneMode == AA_SCENE_MODE_FACE_PRIORITY) |
| sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; |
| settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.sceneMode(%d)", __FUNCTION__, src->dm.aa.sceneMode); |
| |
| const uint8_t videoStabilizationMode = (enum aa_videostabilization_mode) src->dm.aa.videoStabilizationMode; |
| settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &videoStabilizationMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.videoStabilizationMode(%d)", __FUNCTION__, src->dm.aa.videoStabilizationMode); |
| |
| if (partialMeta == true) { |
| uint8_t tmpAeState = (uint8_t) CAMERA_METADATA(src->dm.aa.aeState); |
| |
| /* HACK: forcely set AE state during init skip count (FW not supported) */ |
| if (src->dm.request.frameCount < INITIAL_SKIP_FRAME) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_SEARCHING); |
| } |
| |
| #ifdef USE_AE_CONVERGED_UDM |
| if (m_cameraId == CAMERA_ID_BACK && |
| tmpAeState == (uint8_t) CAMERA_METADATA(AE_STATE_CONVERGED)) { |
| uint32_t aeUdmState = (uint32_t)src->udm.ae.vendorSpecific[397]; |
| /* 1: converged, 0: searching */ |
| if (aeUdmState == 0) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_SEARCHING); |
| } |
| } |
| #endif |
| |
| switch (src->dm.aa.aeState) { |
| case AE_STATE_CONVERGED: |
| case AE_STATE_LOCKED: |
| if (m_flashMgr != NULL) |
| m_flashMgr->notifyAeResult(); |
| if (aeMode == ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_FLASH_REQUIRED); |
| } |
| break; |
| case AE_STATE_INACTIVE: |
| case AE_STATE_SEARCHING: |
| case AE_STATE_FLASH_REQUIRED: |
| case AE_STATE_PRECAPTURE: |
| default: |
| break; |
| } |
| |
| const uint8_t aeState = tmpAeState; |
| settings.update(ANDROID_CONTROL_AE_STATE, &aeState, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeState(%d), AE_STATE(%d)", __FUNCTION__, src->dm.aa.aeState, aeState); |
| |
| const uint8_t awbState = (uint8_t) CAMERA_METADATA(src->dm.aa.awbState); |
| settings.update(ANDROID_CONTROL_AWB_STATE, &awbState, 1); |
| ALOGV("DEBUG(%s):dm.aa.awbState(%d)", __FUNCTION__, src->dm.aa.awbState); |
| |
| const uint8_t afState = (uint8_t) CAMERA_METADATA(src->dm.aa.afState); |
| settings.update(ANDROID_CONTROL_AF_STATE, &afState, 1); |
| ALOGV("DEBUG(%s):dm.aa.afState(%d)", __FUNCTION__, src->dm.aa.afState); |
| } |
| |
| switch (src->dm.aa.afState) { |
| case AA_AFSTATE_FOCUSED_LOCKED: |
| case AA_AFSTATE_NOT_FOCUSED_LOCKED: |
| if (m_flashMgr != NULL) |
| m_flashMgr->notifyAfResultHAL3(); |
| break; |
| case AA_AFSTATE_INACTIVE: |
| case AA_AFSTATE_PASSIVE_SCAN: |
| case AA_AFSTATE_PASSIVE_FOCUSED: |
| case AA_AFSTATE_ACTIVE_SCAN: |
| case AA_AFSTATE_PASSIVE_UNFOCUSED: |
| default: |
| break; |
| } |
| |
| translateVendorControlMetaData(&service_settings, &settings, &shot_ext, partialMeta); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateEdgeMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const uint8_t edgeMode = (uint8_t) CAMERA_METADATA(service_shot->ctl.edge.mode); |
| settings.update(ANDROID_EDGE_MODE, &edgeMode, 1); |
| ALOGV("DEBUG(%s):dm.edge.mode(%d)", __FUNCTION__, src->dm.edge.mode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateFlashMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| uint8_t controlState = 0; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const uint8_t firingPower = (uint8_t) src->dm.flash.firingPower; |
| settings.update(ANDROID_FLASH_FIRING_POWER, &firingPower, 1); |
| ALOGV("DEBUG(%s):dm.flash.firingPower(%d)", __FUNCTION__, src->dm.flash.firingPower); |
| |
| const int64_t firingTime = (int64_t) src->dm.flash.firingTime; |
| settings.update(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); |
| ALOGV("DEBUG(%s):dm.flash.firingTime(%lld)", __FUNCTION__, src->dm.flash.firingTime); |
| |
| const uint8_t flashMode = (uint8_t)CAMERA_METADATA(src->dm.flash.flashMode); |
| settings.update(ANDROID_FLASH_MODE, &flashMode, 1); |
| ALOGV("DEBUG(%s):dm.flash.flashMode(%d), flashMode=%d", __FUNCTION__, src->dm.flash.flashMode, flashMode); |
| |
| uint8_t flashState = ANDROID_FLASH_STATE_READY; |
| if (m_flashMgr == NULL) |
| flashState = ANDROID_FLASH_STATE_UNAVAILABLE; |
| else if (m_sensorStaticInfo->flashAvailable == ANDROID_FLASH_INFO_AVAILABLE_FALSE) |
| flashState = ANDROID_FLASH_STATE_UNAVAILABLE; |
| else |
| flashState = src->dm.flash.flashState; |
| settings.update(ANDROID_FLASH_STATE, &flashState , 1); |
| ALOGV("DEBUG(%s):flashState=%d", __FUNCTION__, flashState); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateHotPixelMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* HACK : F/W does NOT support some fields */ |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| //const uint8_t hotPixelMode = (uint8_t) CAMERA_METADATA(src->dm.hotpixel.mode); |
| const uint8_t hotPixelMode = (uint8_t) CAMERA_METADATA(service_shot->ctl.hotpixel.mode); |
| settings.update(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); |
| ALOGV("DEBUG(%s):dm.hotpixel.mode(%d)", __FUNCTION__, src->dm.hotpixel.mode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateJpegMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getServiceShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const double gpsCoordinates[3] = |
| { src->ctl.jpeg.gpsCoordinates[0], src->ctl.jpeg.gpsCoordinates[1], src->ctl.jpeg.gpsCoordinates[2] }; |
| settings.update(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3); |
| ALOGV("DEBUG(%s):ctl.jpeg.gpsCoordinates(%f,%f,%f)", __FUNCTION__, |
| src->ctl.jpeg.gpsCoordinates[0], |
| src->ctl.jpeg.gpsCoordinates[1], |
| src->ctl.jpeg.gpsCoordinates[2]); |
| #if 0 |
| if (src->ctl.jpeg.gpsProcessingMethod != NULL) { |
| size_t gpsProcessingMethodLength = strlen((char *)src->ctl.jpeg.gpsProcessingMethod) + 1; |
| uint8_t *gpsProcessingMethod = src->ctl.jpeg.gpsProcessingMethod; |
| settings.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, gpsProcessingMethodLength); |
| ALOGV("DEBUG(%s):ctl.jpeg.gpsProcessingMethod(%s)", __FUNCTION__, |
| gpsProcessingMethod); |
| |
| if (gpsProcessingMethod != NULL) { |
| free(gpsProcessingMethod); |
| gpsProcessingMethod = NULL; |
| } |
| } |
| #endif |
| const int64_t gpsTimestamp = (int64_t) src->ctl.jpeg.gpsTimestamp; |
| settings.update(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); |
| ALOGV("DEBUG(%s):ctl.jpeg.gpsTimestamp(%lld)", __FUNCTION__, |
| src->ctl.jpeg.gpsTimestamp); |
| |
| const int32_t orientation = src->ctl.jpeg.orientation; |
| settings.update(ANDROID_JPEG_ORIENTATION, &orientation, 1); |
| ALOGV("DEBUG(%s):ctl.jpeg.orientation(%d)", __FUNCTION__, src->ctl.jpeg.orientation); |
| |
| const uint8_t quality = (uint8_t) src->ctl.jpeg.quality; |
| settings.update(ANDROID_JPEG_QUALITY, &quality, 1); |
| ALOGV("DEBUG(%s):ctl.jpeg.quality(%d)", __FUNCTION__, src->ctl.jpeg.quality); |
| |
| const uint8_t thumbnailQuality = (uint8_t) src->ctl.jpeg.thumbnailQuality; |
| settings.update(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); |
| ALOGV("DEBUG(%s):ctl.jpeg.thumbnailQuality(%d)", __FUNCTION__, |
| src->ctl.jpeg.thumbnailQuality); |
| |
| const int32_t thumbnailSize[2] = |
| { (int32_t) src->ctl.jpeg.thumbnailSize[0], (int32_t) src->ctl.jpeg.thumbnailSize[1] }; |
| settings.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); |
| ALOGV("DEBUG(%s):ctl.jpeg.thumbnailSize(%d,%d)", __FUNCTION__, |
| src->ctl.jpeg.thumbnailSize[0], src->ctl.jpeg.thumbnailSize[1]); |
| |
| const int32_t jpegSize = (int32_t) src->dm.jpeg.size; |
| settings.update(ANDROID_JPEG_SIZE, &jpegSize, 1); |
| ALOGV("DEBUG(%s):dm.jpeg.size(%d)", __FUNCTION__, src->dm.jpeg.size); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateLensMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| uint8_t controlState = 0; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| settings.update(ANDROID_LENS_APERTURE, &(m_sensorStaticInfo->fNumber), 1); |
| ALOGV("DEBUG(%s):dm.lens.aperture is fNumber(%f)", __FUNCTION__, m_sensorStaticInfo->fNumber); |
| |
| settings.update(ANDROID_LENS_FILTER_DENSITY, &m_sensorStaticInfo->filterDensity, 1); |
| ALOGV("DEBUG(%s):dm.lens.filterDensity(%f)", __FUNCTION__, m_sensorStaticInfo->filterDensity); |
| |
| settings.update(ANDROID_LENS_FOCAL_LENGTH, &(m_sensorStaticInfo->focalLength), 1); |
| ALOGV("DEBUG(%s):dm.lens.focalLength(%f)", __FUNCTION__, m_sensorStaticInfo->focalLength); |
| |
| /* Focus distance 0 means infinite */ |
| float focusDistance = src->dm.lens.focusDistance; |
| if (focusDistance < 0) { |
| focusDistance = 0; |
| } else if (focusDistance > m_sensorStaticInfo->minimumFocusDistance) { |
| focusDistance = m_sensorStaticInfo->minimumFocusDistance; |
| } |
| settings.update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); |
| ALOGV("DEBUG(%s):dm.lens.focusDistance(%f)", __FUNCTION__, src->dm.lens.focusDistance); |
| |
| //uint8_t opticalStabilizationMode = (uint8_t) src->dm.lens.opticalStabilizationMode; |
| uint8_t opticalStabilizationMode = (uint8_t) service_shot->ctl.lens.opticalStabilizationMode; |
| |
| switch (opticalStabilizationMode) { |
| case OPTICAL_STABILIZATION_MODE_STILL: |
| opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; |
| break; |
| case OPTICAL_STABILIZATION_MODE_VIDEO: |
| opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; |
| break; |
| case OPTICAL_STABILIZATION_MODE_CENTERING: |
| default: |
| opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; |
| break; |
| } |
| settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &opticalStabilizationMode, 1); |
| ALOGV("DEBUG(%s):dm.lens.opticalStabilizationMode(%d)", __FUNCTION__, |
| src->dm.lens.opticalStabilizationMode); |
| |
| const uint8_t lensState = src->dm.lens.state; |
| settings.update(ANDROID_LENS_STATE, &lensState, 1); |
| ALOGV("DEBUG(%s):dm.lens.state(%d)", __FUNCTION__, src->dm.lens.state); |
| |
| const float focusRange[2] = |
| { src->dm.lens.focusRange[0], src->dm.lens.focusRange[1] }; |
| settings.update(ANDROID_LENS_FOCUS_RANGE, focusRange, 2); |
| ALOGV("DEBUG(%s):dm.lens.focusRange(%f,%f)", __FUNCTION__, |
| focusRange[0], focusRange[1]); |
| |
| translateVendorLensMetaData(&settings, &shot_ext, &service_shot_ext); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateNoiseMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| uint8_t noiseReductionMode = (uint8_t) CAMERA_METADATA(service_shot->ctl.noise.mode); |
| //uint8_t noiseReductionMode = (uint8_t) CAMERA_METADATA(src->dm.noise.mode); |
| settings.update(ANDROID_NOISE_REDUCTION_MODE, &noiseReductionMode, 1); |
| ALOGV("DEBUG(%s):dm.noise.mode(%d)", __FUNCTION__, src->dm.noise.mode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateQuirksMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| //settings.update(ANDROID_QUIRKS_PARTIAL_RESULT, ,); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateRequestMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| src->dm.request.id = requestInfo->getRequestId(); |
| |
| const int32_t requestId = src->dm.request.id; |
| settings.update(ANDROID_REQUEST_ID, &requestId, 1); |
| ALOGV("DEBUG(%s):dm.request.id(%d)", __FUNCTION__, src->dm.request.id); |
| |
| const uint8_t metadataMode = src->dm.request.metadataMode; |
| settings.update(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); |
| ALOGV("DEBUG(%s):dm.request.metadataMode(%d)", __FUNCTION__, |
| src->dm.request.metadataMode); |
| |
| /* |
| * |
| * pipelineDepth is filed of 'REQUEST' |
| * |
| * but updating pipelineDepth data can be conflict |
| * and we separeted this data not using data but request's private data |
| * |
| * remaining this code as comment is that to prevent missing update pieplineDepth data in the medta of 'REQUEST' field |
| * |
| */ |
| /* |
| * const uint8_t pipelineDepth = src->dm.request.pipelineDepth; |
| * settings.update(ANDROID_REQUEST_PIPELINE_DEPTH, &pipelineDepth, 1); |
| * ALOGV("DEBUG(%s):ANDROID_REQUEST_PIPELINE_DEPTH(%d)", __FUNCTION__, pipelineDepth); |
| */ |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateScalerMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const int32_t cropRegion[4] = |
| { |
| m_cropRegion.x, |
| m_cropRegion.y, |
| m_cropRegion.w, |
| m_cropRegion.h |
| }; |
| settings.update(ANDROID_SCALER_CROP_REGION, cropRegion, 4); |
| ALOGV("DEBUG(%s):dm.scaler.cropRegion(%d,%d,%d,%d)", __FUNCTION__, |
| src->dm.scaler.cropRegion[0], |
| src->dm.scaler.cropRegion[1], |
| src->dm.scaler.cropRegion[2], |
| src->dm.scaler.cropRegion[3]); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateSensorMetaData(ExynosCameraRequestSP_sprt_t requestInfo, bool partialMeta) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* HACK : F/W does NOT support some fields */ |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| int64_t frameDuration = (int64_t) src->dm.sensor.frameDuration; |
| if (frameDuration == 0) { |
| frameDuration = service_shot_ext.shot.ctl.sensor.frameDuration; |
| } |
| settings.update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); |
| ALOGV("DEBUG(%s):dm.sensor.frameDuration(%lld)", __FUNCTION__, src->dm.sensor.frameDuration); |
| |
| int64_t exposureTime = (int64_t)src->dm.sensor.exposureTime; |
| if (exposureTime == 0 || exposureTime > frameDuration) { |
| exposureTime = frameDuration; |
| } |
| src->dm.sensor.exposureTime = exposureTime; // for EXIF Data |
| settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); |
| |
| int32_t sensitivity = (int32_t) src->dm.sensor.sensitivity; |
| if (sensitivity < m_sensorStaticInfo->sensitivityRange[MIN]) { |
| sensitivity = m_sensorStaticInfo->sensitivityRange[MIN]; |
| } else if (sensitivity > m_sensorStaticInfo->sensitivityRange[MAX]) { |
| sensitivity = m_sensorStaticInfo->sensitivityRange[MAX]; |
| } |
| src->dm.sensor.sensitivity = sensitivity; // for EXIF Data |
| settings.update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); |
| |
| ALOGV("DEBUG(%s):[frameCount is %d] exposureTime(%lld) sensitivity(%d)", __FUNCTION__, |
| src->dm.request.frameCount, exposureTime, sensitivity); |
| |
| int32_t testPatternMode = (int32_t) CAMERA_METADATA(src->dm.sensor.testPatternMode); |
| if (src->dm.sensor.testPatternMode == SENSOR_TEST_PATTERN_MODE_CUSTOM1) |
| testPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1; |
| settings.update(ANDROID_SENSOR_TEST_PATTERN_MODE, &testPatternMode, 1); |
| ALOGV("DEBUG(%s):dm.sensor.testPatternMode(%d)", __FUNCTION__, |
| src->dm.sensor.testPatternMode); |
| |
| const int32_t testPatternData[4] = |
| { |
| src->dm.sensor.testPatternData[0], src->dm.sensor.testPatternData[1], |
| src->dm.sensor.testPatternData[2], src->dm.sensor.testPatternData[3] |
| }; |
| settings.update(ANDROID_SENSOR_TEST_PATTERN_DATA, testPatternData, 4); |
| ALOGV("DEBUG(%s):dm.sensor.testPatternData(%d,%d,%d,%d)", __FUNCTION__, |
| src->dm.sensor.testPatternData[0], src->dm.sensor.testPatternData[1], |
| src->dm.sensor.testPatternData[2], src->dm.sensor.testPatternData[3]); |
| |
| if (partialMeta == true) { |
| const int64_t timeStamp = (int64_t) requestInfo->getSensorTimestamp(); |
| settings.update(ANDROID_SENSOR_TIMESTAMP, &timeStamp, 1); |
| ALOGV("DEBUG(%s):reqeust(%d) udm.sensor.timeStampBoot(%lld)", __FUNCTION__, requestInfo->getKey(), timeStamp); |
| |
| /* Store the timeStamp and framecount mapping info */ |
| m_frameCountMap[m_frameCountMapIndex][TIMESTAMP] = src->udm.sensor.timeStampBoot; |
| m_frameCountMap[m_frameCountMapIndex][FRAMECOUNT] = (uint64_t) src->dm.request.frameCount; |
| m_frameCountMapIndex = (m_frameCountMapIndex + 1) % FRAMECOUNT_MAP_LENGTH; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_TIMESTAMP(%llu) (%u)", __FUNCTION__, src->udm.sensor.timeStampBoot, src->dm.request.frameCount); |
| } |
| |
| const camera_metadata_rational_t neutralColorPoint[3] = |
| { |
| {(int32_t) src->dm.sensor.neutralColorPoint[0].num, |
| (int32_t) src->dm.sensor.neutralColorPoint[0].den}, |
| {(int32_t) src->dm.sensor.neutralColorPoint[1].num, |
| (int32_t) src->dm.sensor.neutralColorPoint[1].den}, |
| {(int32_t) src->dm.sensor.neutralColorPoint[2].num, |
| (int32_t) src->dm.sensor.neutralColorPoint[2].den} |
| }; |
| |
| settings.update(ANDROID_SENSOR_NEUTRAL_COLOR_POINT, neutralColorPoint, 3); |
| ALOGV("DEBUG(%s):dm.sensor.neutralColorPoint(%d/%d,%d/%d,%d/%d)", __FUNCTION__, |
| src->dm.sensor.neutralColorPoint[0].num, |
| src->dm.sensor.neutralColorPoint[0].den, |
| src->dm.sensor.neutralColorPoint[1].num, |
| src->dm.sensor.neutralColorPoint[1].den, |
| src->dm.sensor.neutralColorPoint[2].num, |
| src->dm.sensor.neutralColorPoint[2].den); |
| |
| /* HACK : F/W does NOT support this field */ |
| const double noiseProfile[8] = |
| { |
| src->dm.sensor.noiseProfile[0][0], src->dm.sensor.noiseProfile[0][1], |
| src->dm.sensor.noiseProfile[1][0], src->dm.sensor.noiseProfile[1][1], |
| src->dm.sensor.noiseProfile[2][0], src->dm.sensor.noiseProfile[2][1], |
| src->dm.sensor.noiseProfile[3][0], src->dm.sensor.noiseProfile[3][1] |
| }; |
| settings.update(ANDROID_SENSOR_NOISE_PROFILE, noiseProfile , 8); |
| ALOGV("DEBUG(%s):dm.sensor.noiseProfile({%f,%f},{%f,%f},{%f,%f},{%f,%f})", __FUNCTION__, |
| src->dm.sensor.noiseProfile[0][0], |
| src->dm.sensor.noiseProfile[0][1], |
| src->dm.sensor.noiseProfile[1][0], |
| src->dm.sensor.noiseProfile[1][1], |
| src->dm.sensor.noiseProfile[2][0], |
| src->dm.sensor.noiseProfile[2][1], |
| src->dm.sensor.noiseProfile[3][0], |
| src->dm.sensor.noiseProfile[3][1]); |
| |
| const float greenSplit = src->dm.sensor.greenSplit; |
| settings.update(ANDROID_SENSOR_GREEN_SPLIT, &greenSplit, 1); |
| ALOGV("DEBUG(%s):dm.sensor.greenSplit(%f)", __FUNCTION__, src->dm.sensor.greenSplit); |
| |
| const int64_t rollingShutterSkew = (int64_t) src->dm.sensor.rollingShutterSkew; |
| settings.update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &rollingShutterSkew, 1); |
| ALOGV("DEBUG(%s):dm.sensor.rollingShutterSkew(%lld)", __FUNCTION__, |
| src->dm.sensor.rollingShutterSkew); |
| |
| //settings.update(ANDROID_SENSOR_TEMPERATURE, , ); |
| //settings.update(ANDROID_SENSOR_PROFILE_HUE_SAT_MAP, , ); |
| //settings.update(ANDROID_SENSOR_PROFILE_TONE_CURVE, , ); |
| |
| requestInfo->setResultMeta(settings); |
| |
| /* HACK: SensorMetaData sync with shot_ext. These values should be used for EXIF */ |
| requestInfo->setResultShot(&shot_ext); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateShadingMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* HACK : F/W does NOT support some fields */ |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| //const uint8_t shadingMode = (uint8_t) CAMERA_METADATA(src->dm.shading.mode); |
| const uint8_t shadingMode = (uint8_t) CAMERA_METADATA(service_shot->ctl.shading.mode); |
| settings.update(ANDROID_SHADING_MODE, &shadingMode, 1); |
| ALOGV("DEBUG(%s):dm.shading.mode(%d)", __FUNCTION__, src->dm.shading.mode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateStatisticsMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getServiceShot(&service_shot_ext); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| |
| src->dm.stats.faceDetectMode = service_shot_ext.shot.ctl.stats.faceDetectMode; |
| const uint8_t faceDetectMode = (uint8_t) CAMERA_METADATA(src->dm.stats.faceDetectMode); |
| settings.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); |
| ALOGV("DEBUG(%s):dm.stats.faceDetectMode(%d)", __FUNCTION__, |
| src->dm.stats.faceDetectMode); |
| |
| if (faceDetectMode > ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) |
| m_updateFaceDetectionMetaData(&settings, &shot_ext); |
| |
| const uint8_t histogramMode = (uint8_t) CAMERA_METADATA(src->dm.stats.histogramMode); |
| settings.update(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1); |
| ALOGV("DEBUG(%s):dm.stats.histogramMode(%d)", __FUNCTION__, |
| src->dm.stats.histogramMode); |
| |
| const uint8_t sharpnessMapMode = (uint8_t) CAMERA_METADATA(src->dm.stats.sharpnessMapMode); |
| settings.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); |
| ALOGV("DEBUG(%s):dm.stats.sharpnessMapMode(%d)", __FUNCTION__, |
| src->dm.stats.sharpnessMapMode); |
| |
| const uint8_t hotPixelMapMode = (uint8_t) CAMERA_METADATA(src->dm.stats.hotPixelMapMode); |
| settings.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hotPixelMapMode, 1); |
| ALOGV("DEBUG(%s):dm.stats.hotPixelMapMode(%d)", __FUNCTION__, |
| src->dm.stats.hotPixelMapMode); |
| |
| /* HACK : F/W does NOT support this field */ |
| //int32_t *hotPixelMap = (int32_t *) src->dm.stats.hotPixelMap; |
| const int32_t hotPixelMap[] = {}; |
| settings.update(ANDROID_STATISTICS_HOT_PIXEL_MAP, hotPixelMap, ARRAY_LENGTH(hotPixelMap)); |
| ALOGV("DEBUG(%s):dm.stats.hotPixelMap", __FUNCTION__); |
| |
| const uint8_t lensShadingMapMode = (uint8_t) src->dm.stats.lensShadingMapMode; |
| settings.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lensShadingMapMode, 1); |
| ALOGV("DEBUG(%s):dm.stats.lensShadingMapMode(%d)", __FUNCTION__, |
| src->dm.stats.lensShadingMapMode); |
| |
| /* HACK : F/W does NOT support this field */ |
| //float *lensShadingMap = (float *) src->dm.stats.lensShadingMap; |
| const float lensShadingMap[] = {1.0, 1.0, 1.0, 1.0}; |
| settings.update(ANDROID_STATISTICS_LENS_SHADING_MAP, lensShadingMap, 4); |
| ALOGV("DEBUG(%s):dm.stats.lensShadingMap(%f,%f,%f,%f)", __FUNCTION__, |
| lensShadingMap[0], lensShadingMap[1], |
| lensShadingMap[2], lensShadingMap[3]); |
| |
| uint8_t sceneFlicker = (uint8_t) CAMERA_METADATA(src->dm.stats.sceneFlicker); |
| settings.update(ANDROID_STATISTICS_SCENE_FLICKER, &sceneFlicker, 1); |
| ALOGV("DEBUG(%s):dm.stats.sceneFlicker(%d)", __FUNCTION__, src->dm.stats.sceneFlicker); |
| |
| //settings.update(ANDROID_STATISTICS_HISTOGRAM, , ); |
| //settings.update(ANDROID_STATISTICS_SHARPNESS_MAP, , ); |
| //settings.update(ANDROID_STATISTICS_LENS_SHADING_CORRECTION_MAP, , ); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateTonemapMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| uint8_t controlState = 0; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| /* HACK : F/W does NOT support some fields */ |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| float *curveBlue = (float *) src->dm.tonemap.curveBlue; |
| settings.update(ANDROID_TONEMAP_CURVE_BLUE, curveBlue, 64); |
| ALOGV("DEBUG(%s):dm.tonemap.curveBlue", __FUNCTION__); |
| |
| float *curveGreen = (float *) src->dm.tonemap.curveGreen; |
| settings.update(ANDROID_TONEMAP_CURVE_GREEN, curveGreen, 64); |
| ALOGV("DEBUG(%s):dm.tonemap.curveGreen", __FUNCTION__); |
| |
| float *curveRed = (float *) src->dm.tonemap.curveRed; |
| settings.update(ANDROID_TONEMAP_CURVE_RED, curveRed, 64); |
| ALOGV("DEBUG(%s):dm.tonemap.curveRed", __FUNCTION__); |
| |
| //const uint8_t toneMapMode = (uint8_t) CAMERA_METADATA(src->dm.tonemap.mode); |
| const uint8_t toneMapMode = (uint8_t) CAMERA_METADATA(service_shot->ctl.tonemap.mode); |
| settings.update(ANDROID_TONEMAP_MODE, &toneMapMode, 1); |
| ALOGV("DEBUG(%s):dm.tonemap.mode(%d)", __FUNCTION__, src->dm.tonemap.mode); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateLedMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| //settings.update(ANDROID_LED_TRANSMIT, (uint8_t *) NULL, 0); |
| ALOGV("DEBUG(%s):dm.led.transmit(%d)", __FUNCTION__, src->dm.led.transmit); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translateBlackLevelMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| /* HACK: F/W does NOT support this field */ |
| //const uint8_t blackLevelLock = (uint8_t) src->dm.blacklevel.lock; |
| const uint8_t blackLevelLock = (uint8_t) m_blackLevelLockOn; |
| settings.update(ANDROID_BLACK_LEVEL_LOCK, &blackLevelLock, 1); |
| ALOGV("DEBUG(%s):dm.blacklevel.lock(%d)", __FUNCTION__, src->dm.blacklevel.lock); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::translatePartialMetaData(ExynosCameraRequestSP_sprt_t requestInfo) |
| { |
| CameraMetadata settings; |
| struct camera2_shot_ext shot_ext; |
| struct camera2_shot *src = NULL; |
| |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| struct camera2_shot_ext service_shot_ext; |
| struct camera2_shot *service_shot = NULL; |
| requestInfo->getServiceShot(&service_shot_ext); |
| service_shot = &service_shot_ext.shot; |
| |
| settings = requestInfo->getResultMeta(); |
| requestInfo->getResultShot(&shot_ext); |
| src = &shot_ext.shot; |
| |
| const int64_t timeStamp = (int64_t) requestInfo->getSensorTimestamp(); |
| settings.update(ANDROID_SENSOR_TIMESTAMP, &timeStamp, 1); |
| ALOGV("DEBUG(%s):reqeust(%d) udm.sensor.timeStampBoot(%lld)", __FUNCTION__, requestInfo->getKey(), timeStamp); |
| |
| /* Store the timeStamp and framecount mapping info */ |
| m_frameCountMap[m_frameCountMapIndex][TIMESTAMP] = src->udm.sensor.timeStampBoot; |
| m_frameCountMap[m_frameCountMapIndex][FRAMECOUNT] = (uint64_t) src->dm.request.frameCount; |
| m_frameCountMapIndex = (m_frameCountMapIndex + 1) % FRAMECOUNT_MAP_LENGTH; |
| ALOGV("DEBUG(%s):ANDROID_SENSOR_TIMESTAMP(%llu) (%u)", __FUNCTION__, src->udm.sensor.timeStampBoot, src->dm.request.frameCount); |
| |
| uint8_t afMode = (uint8_t) CAMERA_METADATA(src->dm.aa.afMode); |
| settings.update(ANDROID_CONTROL_AF_MODE, &afMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.afMode(%d)", __FUNCTION__, src->dm.aa.afMode); |
| |
| const uint8_t awbMode = (uint8_t) CAMERA_METADATA(src->dm.aa.awbMode); |
| settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.awbMode(%d)", __FUNCTION__, src->dm.aa.awbMode); |
| |
| uint8_t aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| |
| if (src->dm.aa.aeMode == AA_AEMODE_OFF) { |
| aeMode = ANDROID_CONTROL_AE_MODE_OFF; |
| } else { |
| if (m_flashMgr != NULL) { |
| switch (m_flashMgr->getFlashReq()) { |
| case ExynosCameraActivityFlash::FLASH_REQ_AUTO: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_ON: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_RED_EYE: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; |
| break; |
| case ExynosCameraActivityFlash::FLASH_REQ_TORCH: |
| case ExynosCameraActivityFlash::FLASH_REQ_OFF: |
| default: |
| aeMode = ANDROID_CONTROL_AE_MODE_ON; |
| break; |
| } |
| } |
| } |
| settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeMode(%d), AE_MODE(%d)", __FUNCTION__, src->dm.aa.aeMode, aeMode); |
| |
| const uint8_t aeLock = (uint8_t) CAMERA_METADATA(src->dm.aa.aeLock); |
| settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeLock(%d)", __FUNCTION__, aeLock); |
| |
| uint8_t tmpAeState = (uint8_t) CAMERA_METADATA(src->dm.aa.aeState); |
| |
| /* HACK: forcely set AE state during init skip count (FW not supported) */ |
| if (src->dm.request.frameCount < INITIAL_SKIP_FRAME) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_SEARCHING); |
| } |
| |
| #ifdef USE_AE_CONVERGED_UDM |
| if (m_cameraId == CAMERA_ID_BACK && |
| tmpAeState == (uint8_t) CAMERA_METADATA(AE_STATE_CONVERGED)) { |
| uint32_t aeUdmState = (uint32_t)src->udm.ae.vendorSpecific[397]; |
| /* 1: converged, 0: searching */ |
| if (aeUdmState == 0) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_SEARCHING); |
| } |
| } |
| #endif |
| |
| switch (src->dm.aa.aeState) { |
| case AE_STATE_CONVERGED: |
| case AE_STATE_LOCKED: |
| if (m_flashMgr != NULL) |
| m_flashMgr->notifyAeResult(); |
| if (aeMode == ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH) { |
| tmpAeState = (uint8_t) CAMERA_METADATA(AE_STATE_FLASH_REQUIRED); |
| } |
| break; |
| case AE_STATE_INACTIVE: |
| case AE_STATE_SEARCHING: |
| case AE_STATE_FLASH_REQUIRED: |
| case AE_STATE_PRECAPTURE: |
| default: |
| break; |
| } |
| |
| const uint8_t aeState = tmpAeState; |
| settings.update(ANDROID_CONTROL_AE_STATE, &aeState, 1); |
| ALOGV("DEBUG(%s):dm.aa.aeState(%d), AE_STATE(%d)", __FUNCTION__, src->dm.aa.aeState, aeState); |
| |
| const uint8_t afState = (uint8_t) CAMERA_METADATA(src->dm.aa.afState); |
| settings.update(ANDROID_CONTROL_AF_STATE, &afState, 1); |
| ALOGV("DEBUG(%s):dm.aa.afState(%d)", __FUNCTION__, src->dm.aa.afState); |
| |
| const uint8_t awbState = (uint8_t) CAMERA_METADATA(src->dm.aa.awbState); |
| settings.update(ANDROID_CONTROL_AWB_STATE, &awbState, 1); |
| ALOGV("DEBUG(%s):dm.aa.awbState(%d)", __FUNCTION__, src->dm.aa.awbState); |
| |
| translateVendorPartialMetaData(&settings, &shot_ext); |
| |
| requestInfo->setResultMeta(settings); |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::updateDynamicMeta(ExynosCameraRequestSP_sprt_t requestInfo, bool partialmeta) |
| { |
| Mutex::Autolock l(m_requestLock); |
| status_t ret = OK; |
| uint32_t errorFlag = 0; |
| |
| ALOGV("DEBUG(%s[%d]):%d frame", __FUNCTION__, __LINE__, requestInfo->getFrameCount()); |
| /* Validation check */ |
| if (requestInfo == NULL) { |
| ALOGE("ERR(%s[%d]):RequestInfo is NULL!!", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| if (partialmeta == true) { |
| translatePartialMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 0); |
| } else { |
| ret = translateColorMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 0); |
| ret = translateControlMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 1); |
| ret = translateEdgeMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 2); |
| ret = translateFlashMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 3); |
| ret = translateHotPixelMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 4); |
| ret = translateJpegMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 5); |
| ret = translateLensMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 6); |
| ret = translateNoiseMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 7); |
| ret = translateQuirksMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 8); |
| ret = translateRequestMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 9); |
| ret = translateScalerMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 10); |
| ret = translateSensorMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 11); |
| ret = translateShadingMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 12); |
| ret = translateStatisticsMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 13); |
| ret = translateTonemapMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 14); |
| ret = translateLedMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 15); |
| ret = translateBlackLevelMetaData(requestInfo); |
| if (ret != OK) |
| errorFlag |= (1 << 16); |
| } |
| |
| if (errorFlag != 0) { |
| ALOGE("ERR(%s[%d]):failed to translate Meta Data(%d)", __FUNCTION__, __LINE__, errorFlag); |
| return INVALID_OPERATION; |
| } |
| |
| return OK; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::checkAvailableStreamFormat(int format) |
| { |
| int ret = OK; |
| ALOGD("DEBUG(%s[%d]) format(%d)", __FUNCTION__, __LINE__, format); |
| |
| // TODO:check available format |
| return ret; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_createControlAvailableHighSpeedVideoConfigurations( |
| const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int32_t> *streamConfigs, |
| int cameraId) |
| { |
| status_t ret = NO_ERROR; |
| int (*highSpeedVideoSizeList)[3] = NULL; |
| int highSpeedVideoSizeListLength = 0; |
| int (*highSpeedVideoFPSList)[2] = NULL; |
| int highSpeedVideoFPSListLength = 0; |
| int streamConfigSize = 0; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (streamConfigs == NULL) { |
| ALOGE("ERR(%s[%d]):Stream configs is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| if (cameraId == CAMERA_ID_FRONT) { |
| ALOGD("DEBUG(%s[%d]) Front camera does not support High Speed Video", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| highSpeedVideoSizeList = sensorStaticInfo->highSpeedVideoList; |
| highSpeedVideoSizeListLength = sensorStaticInfo->highSpeedVideoListMax; |
| highSpeedVideoFPSList = sensorStaticInfo->highSpeedVideoFPSList; |
| highSpeedVideoFPSListLength = sensorStaticInfo->highSpeedVideoFPSListMax; |
| |
| streamConfigSize = (highSpeedVideoSizeListLength * highSpeedVideoFPSListLength * 5); |
| |
| for (int i = 0; i < highSpeedVideoFPSListLength; i++) { |
| for (int j = 0; j < highSpeedVideoSizeListLength; j++) { |
| streamConfigs->add(highSpeedVideoSizeList[j][0]); |
| streamConfigs->add(highSpeedVideoSizeList[j][1]); |
| streamConfigs->add(highSpeedVideoFPSList[i][0]/1000); |
| streamConfigs->add(highSpeedVideoFPSList[i][1]/1000); |
| streamConfigs->add(1); |
| } |
| } |
| |
| return ret; |
| } |
| |
| /* |
| - Returns NO_ERROR if private reprocessing is supported: streamConfigs will have valid entries. |
| - Returns NAME_NOT_FOUND if private reprocessing is not supported: streamConfigs will be returned as is, |
| and scaler.AvailableInputOutputFormatsMap should not be updated. |
| */ |
| status_t ExynosCamera3MetadataConverter::m_createScalerAvailableInputOutputFormatsMap(const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int32_t> *streamConfigs, |
| __unused int cameraId) |
| { |
| int streamConfigSize = 0; |
| bool isSupportPrivReprocessing = false; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (streamConfigs == NULL) { |
| ALOGE("ERR(%s[%d]):Stream configs is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| isSupportPrivReprocessing = m_hasTagInList( |
| sensorStaticInfo->capabilities, |
| sensorStaticInfo->capabilitiesLength, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING); |
| |
| if(isSupportPrivReprocessing == true) { |
| streamConfigs->add(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); |
| streamConfigs->add(2); |
| streamConfigs->add(HAL_PIXEL_FORMAT_YCbCr_420_888); |
| streamConfigs->add(HAL_PIXEL_FORMAT_BLOB); |
| streamConfigs->setCapacity(streamConfigSize); |
| |
| return NO_ERROR; |
| } else { |
| return NAME_NOT_FOUND; |
| } |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_createScalerAvailableStreamConfigurationsOutput(const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int32_t> *streamConfigs, |
| int cameraId) |
| { |
| status_t ret = NO_ERROR; |
| int (*yuvSizeList)[SIZE_OF_RESOLUTION] = NULL; |
| int yuvSizeListLength = 0; |
| int (*jpegSizeList)[SIZE_OF_RESOLUTION] = NULL; |
| int jpegSizeListLength = 0; |
| int streamConfigSize = 0; |
| bool isSupportHighResolution = false; |
| bool isSupportPrivReprocessing = false; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (streamConfigs == NULL) { |
| ALOGE("ERR(%s[%d]):Stream configs is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| isSupportHighResolution = m_hasTagInList( |
| sensorStaticInfo->capabilities, |
| sensorStaticInfo->capabilitiesLength, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE); |
| |
| if (cameraId == CAMERA_ID_BACK) { |
| yuvSizeList = sensorStaticInfo->rearPreviewList; |
| yuvSizeListLength = sensorStaticInfo->rearPreviewListMax; |
| jpegSizeList = sensorStaticInfo->rearPictureList; |
| jpegSizeListLength = sensorStaticInfo->rearPictureListMax; |
| } else { /* CAMERA_ID_FRONT */ |
| yuvSizeList = sensorStaticInfo->frontPreviewList; |
| yuvSizeListLength = sensorStaticInfo->frontPreviewListMax; |
| jpegSizeList = sensorStaticInfo->frontPictureList; |
| jpegSizeListLength = sensorStaticInfo->frontPictureListMax; |
| } |
| |
| /* Check wheather the private reprocessing is supported or not */ |
| isSupportPrivReprocessing = m_hasTagInList( |
| sensorStaticInfo->capabilities, |
| sensorStaticInfo->capabilitiesLength, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING); |
| |
| /* TODO: Add YUV reprocessing if necessary */ |
| |
| /* HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream configuration list size */ |
| streamConfigSize = yuvSizeListLength * 4; |
| /* YUV output stream configuration list size */ |
| streamConfigSize += (yuvSizeListLength * 4) * (ARRAY_LENGTH(YUV_FORMATS)); |
| /* Stall output stream configuration list size */ |
| streamConfigSize += (jpegSizeListLength * 4) * (ARRAY_LENGTH(STALL_FORMATS)); |
| /* RAW output stream configuration list size */ |
| streamConfigSize += (1 * 4) * (ARRAY_LENGTH(RAW_FORMATS)); |
| /* ZSL input stream configuration list size */ |
| if(isSupportPrivReprocessing == true) { |
| streamConfigSize += 4; |
| } |
| streamConfigs->setCapacity(streamConfigSize); |
| |
| /* HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream supported size list */ |
| for (int i = 0; i < yuvSizeListLength; i++) { |
| streamConfigs->add(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); |
| streamConfigs->add(yuvSizeList[i][0]); |
| streamConfigs->add(yuvSizeList[i][1]); |
| streamConfigs->add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); |
| } |
| |
| /* YUV output stream supported size list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(YUV_FORMATS); i++) { |
| for (int j = 0; j < yuvSizeListLength; j++) { |
| int pixelSize = yuvSizeList[j][0] * yuvSizeList[j][1]; |
| if (isSupportHighResolution == false |
| && pixelSize > HIGH_RESOLUTION_MIN_PIXEL_SIZE) { |
| streamConfigSize -= 4; |
| continue; |
| } |
| |
| streamConfigs->add(YUV_FORMATS[i]); |
| streamConfigs->add(yuvSizeList[j][0]); |
| streamConfigs->add(yuvSizeList[j][1]); |
| streamConfigs->add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); |
| } |
| } |
| |
| /* Stall output stream supported size list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(STALL_FORMATS); i++) { |
| for (int j = 0; j < jpegSizeListLength; j++) { |
| int pixelSize = jpegSizeList[j][0] * jpegSizeList[j][1]; |
| |
| streamConfigs->add(STALL_FORMATS[i]); |
| streamConfigs->add(jpegSizeList[j][0]); |
| streamConfigs->add(jpegSizeList[j][1]); |
| streamConfigs->add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); |
| } |
| } |
| |
| /* RAW output stream supported size list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(RAW_FORMATS); i++) { |
| /* Add sensor max size */ |
| streamConfigs->add(RAW_FORMATS[i]); |
| streamConfigs->add(sensorStaticInfo->maxSensorW); |
| streamConfigs->add(sensorStaticInfo->maxSensorH); |
| streamConfigs->add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); |
| } |
| |
| /* ZSL input stream supported size list */ |
| { |
| if(isSupportPrivReprocessing == true) { |
| streamConfigs->add(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); |
| streamConfigs->add(yuvSizeList[0][0]); |
| streamConfigs->add(yuvSizeList[0][1]); |
| streamConfigs->add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT); |
| } |
| } |
| |
| streamConfigs->setCapacity(streamConfigSize); |
| |
| #ifdef DEBUG_STREAM_CONFIGURATIONS |
| const int32_t* streamConfigArray = NULL; |
| streamConfigArray = streamConfigs->array(); |
| for (int i = 0; i < streamConfigSize; i = i + 4) { |
| ALOGD("DEBUG(%s[%d]):ID %d Size %4dx%4d Format %2x %6s", |
| __FUNCTION__, __LINE__, |
| cameraId, |
| streamConfigArray[i+1], streamConfigArray[i+2], |
| streamConfigArray[i], |
| (streamConfigArray[i+3] == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)? |
| "OUTPUT" : "INPUT"); |
| } |
| #endif |
| |
| return ret; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_createScalerAvailableMinFrameDurations(const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int64_t> *minDurations, |
| int cameraId) |
| { |
| status_t ret = NO_ERROR; |
| int (*yuvSizeList)[SIZE_OF_RESOLUTION] = NULL; |
| int yuvSizeListLength = 0; |
| int (*jpegSizeList)[SIZE_OF_RESOLUTION] = NULL; |
| int jpegSizeListLength = 0; |
| int minDurationSize = 0; |
| int64_t currentMinDuration = 0L; |
| bool isSupportHighResolution = false; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (minDurations == NULL) { |
| ALOGE("ERR(%s[%d]):Stream configs is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| isSupportHighResolution = m_hasTagInList( |
| sensorStaticInfo->capabilities, |
| sensorStaticInfo->capabilitiesLength, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE); |
| |
| if (cameraId == CAMERA_ID_BACK) { |
| yuvSizeList = sensorStaticInfo->rearPreviewList; |
| yuvSizeListLength = sensorStaticInfo->rearPreviewListMax; |
| jpegSizeList = sensorStaticInfo->rearPictureList; |
| jpegSizeListLength = sensorStaticInfo->rearPictureListMax; |
| } else { /* CAMERA_ID_FRONT */ |
| yuvSizeList = sensorStaticInfo->frontPreviewList; |
| yuvSizeListLength = sensorStaticInfo->frontPreviewListMax; |
| jpegSizeList = sensorStaticInfo->frontPictureList; |
| jpegSizeListLength = sensorStaticInfo->frontPictureListMax; |
| } |
| |
| /* HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream min frame duration list size */ |
| minDurationSize = yuvSizeListLength * 4; |
| /* YUV output stream min frame duration list size */ |
| minDurationSize += (yuvSizeListLength * 4) * (ARRAY_LENGTH(YUV_FORMATS)); |
| /* Stall output stream configuration list size */ |
| minDurationSize += (jpegSizeListLength * 4) * (ARRAY_LENGTH(STALL_FORMATS)); |
| /* RAW output stream min frame duration list size */ |
| minDurationSize += (1 * 4) * (ARRAY_LENGTH(RAW_FORMATS)); |
| minDurations->setCapacity(minDurationSize); |
| |
| /* HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED stream min frame duration list */ |
| for (int i = 0; i < yuvSizeListLength; i++) { |
| minDurations->add(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); |
| minDurations->add((int64_t)yuvSizeList[i][0]); |
| minDurations->add((int64_t)yuvSizeList[i][1]); |
| minDurations->add((int64_t)YUV_FORMAT_MIN_DURATION); |
| } |
| |
| /* YUV output stream min frame duration list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(YUV_FORMATS); i++) { |
| for (int j = 0; j < yuvSizeListLength; j++) { |
| int pixelSize = yuvSizeList[j][0] * yuvSizeList[j][1]; |
| if (isSupportHighResolution == false |
| && pixelSize > HIGH_RESOLUTION_MIN_PIXEL_SIZE) { |
| minDurationSize -= 4; |
| continue; |
| } |
| |
| minDurations->add((int64_t)YUV_FORMATS[i]); |
| minDurations->add((int64_t)yuvSizeList[j][0]); |
| minDurations->add((int64_t)yuvSizeList[j][1]); |
| minDurations->add((int64_t)YUV_FORMAT_MIN_DURATION); |
| } |
| } |
| |
| /* Stall output stream min frame duration list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(STALL_FORMATS); i++) { |
| for (int j = 0; j < jpegSizeListLength; j++) { |
| int pixelSize = jpegSizeList[j][0] * jpegSizeList[j][1]; |
| |
| minDurations->add((int64_t)STALL_FORMATS[i]); |
| minDurations->add((int64_t)jpegSizeList[j][0]); |
| minDurations->add((int64_t)jpegSizeList[j][1]); |
| |
| if (pixelSize > HIGH_RESOLUTION_MIN_PIXEL_SIZE) |
| currentMinDuration = HIGH_RESOLUTION_MIN_DURATION; |
| else if (pixelSize > FHD_PIXEL_SIZE) |
| currentMinDuration = STALL_FORMAT_MIN_DURATION; |
| else |
| currentMinDuration = YUV_FORMAT_MIN_DURATION; |
| minDurations->add((int64_t)currentMinDuration); |
| } |
| } |
| |
| /* RAW output stream min frame duration list */ |
| for (size_t i = 0; i < ARRAY_LENGTH(RAW_FORMATS); i++) { |
| /* Add sensor max size */ |
| minDurations->add((int64_t)RAW_FORMATS[i]); |
| minDurations->add((int64_t)sensorStaticInfo->maxSensorW); |
| minDurations->add((int64_t)sensorStaticInfo->maxSensorH); |
| minDurations->add((int64_t)YUV_FORMAT_MIN_DURATION); |
| } |
| |
| minDurations->setCapacity(minDurationSize); |
| |
| #ifdef DEBUG_STREAM_CONFIGURATIONS |
| const int64_t* minDurationArray = NULL; |
| minDurationArray = minDurations->array(); |
| for (int i = 0; i < minDurationSize; i = i + 4) { |
| ALOGD("DEBUG(%s[%d]):ID %d Size %4lldx%4lld Format %2x MinDuration %9lld", |
| __FUNCTION__, __LINE__, |
| cameraId, |
| minDurationArray[i+1], minDurationArray[i+2], |
| (int)minDurationArray[i], minDurationArray[i+3]); |
| } |
| #endif |
| |
| return ret; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_createJpegAvailableThumbnailSizes(const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int32_t> *thumbnailSizes) |
| { |
| int ret = OK; |
| int (*thumbnailSizeList)[3] = NULL; |
| size_t thumbnailSizeListLength = 0; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (thumbnailSizes == NULL) { |
| ALOGE("ERR(%s[%d]):Thumbnail sizes is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| thumbnailSizeList = sensorStaticInfo->thumbnailList; |
| thumbnailSizeListLength = sensorStaticInfo->thumbnailListMax; |
| thumbnailSizes->setCapacity(thumbnailSizeListLength * 2); |
| |
| /* JPEG thumbnail sizes must be delivered with ascending ordering */ |
| for (int i = (int)thumbnailSizeListLength - 1; i >= 0; i--) { |
| thumbnailSizes->add(thumbnailSizeList[i][0]); |
| thumbnailSizes->add(thumbnailSizeList[i][1]); |
| } |
| |
| return ret; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_createAeAvailableFpsRanges(const struct ExynosSensorInfoBase *sensorStaticInfo, |
| Vector<int32_t> *fpsRanges, |
| int cameraId) |
| { |
| int ret = OK; |
| int (*fpsRangesList)[2] = NULL; |
| size_t fpsRangesLength = 0; |
| |
| if (sensorStaticInfo == NULL) { |
| ALOGE("ERR(%s[%d]):Sensor static info is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| if (fpsRanges == NULL) { |
| ALOGE("ERR(%s[%d]):FPS ranges is NULL", __FUNCTION__, __LINE__); |
| return BAD_VALUE; |
| } |
| |
| if (cameraId == CAMERA_ID_BACK) { |
| fpsRangesList = sensorStaticInfo->rearFPSList; |
| fpsRangesLength = sensorStaticInfo->rearFPSListMax; |
| } else { /* CAMERA_ID_FRONT */ |
| fpsRangesList = sensorStaticInfo->frontFPSList; |
| fpsRangesLength = sensorStaticInfo->frontFPSListMax; |
| } |
| |
| fpsRanges->setCapacity(fpsRangesLength * 2); |
| |
| for (size_t i = 0; i < fpsRangesLength; i++) { |
| fpsRanges->add(fpsRangesList[i][0]/1000); |
| fpsRanges->add(fpsRangesList[i][1]/1000); |
| } |
| |
| return ret; |
| } |
| |
| bool ExynosCamera3MetadataConverter::m_hasTagInList(int32_t *list, size_t listSize, int32_t tag) |
| { |
| bool hasTag = false; |
| |
| for (size_t i = 0; i < listSize; i++) { |
| if (list[i] == tag) { |
| hasTag = true; |
| break; |
| } |
| } |
| |
| return hasTag; |
| } |
| |
| bool ExynosCamera3MetadataConverter::m_hasTagInList(uint8_t *list, size_t listSize, int32_t tag) |
| { |
| bool hasTag = false; |
| |
| for (size_t i = 0; i < listSize; i++) { |
| if (list[i] == tag) { |
| hasTag = true; |
| break; |
| } |
| } |
| |
| return hasTag; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::m_integrateOrderedSizeList(int (*list1)[SIZE_OF_RESOLUTION], size_t list1Size, |
| int (*list2)[SIZE_OF_RESOLUTION], size_t list2Size, |
| int (*orderedList)[SIZE_OF_RESOLUTION]) |
| { |
| int *currentSize = NULL; |
| size_t sizeList1Index = 0; |
| size_t sizeList2Index = 0; |
| |
| if (list1 == NULL || list2 == NULL || orderedList == NULL) { |
| ALOGE("ERR(%s[%d]):Arguments are NULL. list1 %p list2 %p orderedlist %p", |
| __FUNCTION__, __LINE__, |
| list1, list2, orderedList); |
| return BAD_VALUE; |
| } |
| |
| /* This loop will integrate two size list in descending order */ |
| for (size_t i = 0; i < list1Size + list2Size; i++) { |
| if (sizeList1Index >= list1Size) { |
| currentSize = list2[sizeList2Index++]; |
| } else if (sizeList2Index >= list2Size) { |
| currentSize = list1[sizeList1Index++]; |
| } else { |
| if (list1[sizeList1Index][0] < list2[sizeList2Index][0]) { |
| currentSize = list2[sizeList2Index++]; |
| } else if (list1[sizeList1Index][0] > list2[sizeList2Index][0]) { |
| currentSize = list1[sizeList1Index++]; |
| } else { |
| if (list1[sizeList1Index][1] < list2[sizeList2Index][1]) |
| currentSize = list2[sizeList2Index++]; |
| else |
| currentSize = list1[sizeList1Index++]; |
| } |
| } |
| orderedList[i][0] = currentSize[0]; |
| orderedList[i][1] = currentSize[1]; |
| orderedList[i][2] = currentSize[2]; |
| } |
| |
| return NO_ERROR; |
| } |
| |
| void ExynosCamera3MetadataConverter::m_updateFaceDetectionMetaData(CameraMetadata *settings, struct camera2_shot_ext *shot_ext) |
| { |
| int32_t faceIds[NUM_OF_DETECTED_FACES]; |
| /* {leftEyeX, leftEyeY, rightEyeX, rightEyeY, mouthX, mouthY} */ |
| int32_t faceLandmarks[NUM_OF_DETECTED_FACES * FACE_LANDMARKS_MAX_INDEX]; |
| /* {xmin, ymin, xmax, ymax} with the absolute coordinate */ |
| int32_t faceRectangles[NUM_OF_DETECTED_FACES * RECTANGLE_MAX_INDEX]; |
| uint8_t faceScores[NUM_OF_DETECTED_FACES]; |
| uint8_t detectedFaceCount = 0; |
| int maxSensorW = 0, maxSensorH = 0; |
| ExynosRect bnsSize, bayerCropSize; |
| int xOffset = 0, yOffset = 0; |
| int hwPreviewW = 0, hwPreviewH = 0; |
| float scaleRatioW = 0.0f, scaleRatioH = 0.0f; |
| |
| if (settings == NULL) { |
| ALOGE("ERR(%s[%d]:CameraMetadata is NULL", __FUNCTION__, __LINE__); |
| return; |
| } |
| |
| if (shot_ext == NULL) { |
| ALOGE("ERR(%s[%d]:camera2_shot_ext is NULL", __FUNCTION__, __LINE__); |
| return; |
| } |
| |
| /* Original FD region : based on FD input size (e.g. preview size) |
| * Camera Metadata FD region : based on sensor active array size (e.g. max sensor size) |
| * The FD region from firmware must be scaled into the size based on sensor active array size |
| */ |
| m_parameters->getMaxSensorSize(&maxSensorW, &maxSensorH); |
| m_parameters->getPreviewBayerCropSize(&bnsSize, &bayerCropSize); |
| if ((maxSensorW - bayerCropSize.w) / 2 > 0) |
| xOffset = ALIGN_DOWN(((maxSensorW - bayerCropSize.w) / 2), 2); |
| if ((maxSensorH - bayerCropSize.h) / 2 > 0) |
| yOffset = ALIGN_DOWN(((maxSensorH - bayerCropSize.h) / 2), 2); |
| if (m_parameters->isMcscVraOtf() == true) |
| m_parameters->getYuvSize(&hwPreviewW, &hwPreviewH, 0); |
| else { |
| hwPreviewW = shot_ext->shot.dm.stats.faceSrcImageSize[0]; |
| hwPreviewH = shot_ext->shot.dm.stats.faceSrcImageSize[1]; |
| } |
| scaleRatioW = (float)bayerCropSize.w / (float)hwPreviewW; |
| scaleRatioH = (float)bayerCropSize.h / (float)hwPreviewH; |
| |
| for (int i = 0; i < NUM_OF_DETECTED_FACES; i++) { |
| if (shot_ext->shot.dm.stats.faceIds[i]) { |
| switch (shot_ext->shot.dm.stats.faceDetectMode) { |
| case FACEDETECT_MODE_FULL: |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + LEFT_EYE_X] = -1; |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + LEFT_EYE_Y] = -1; |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + RIGHT_EYE_X] = -1; |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + RIGHT_EYE_Y] = -1; |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + MOUTH_X] = -1; |
| faceLandmarks[(i * FACE_LANDMARKS_MAX_INDEX) + MOUTH_Y] = -1; |
| case FACEDETECT_MODE_SIMPLE: |
| faceIds[i] = shot_ext->shot.dm.stats.faceIds[i]; |
| /* Normalize the score into the range of [0, 100] */ |
| faceScores[i] = (uint8_t) ((float)shot_ext->shot.dm.stats.faceScores[i] / (255.0f / 100.0f)); |
| |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X1] = (int32_t) ((shot_ext->shot.dm.stats.faceRectangles[i][X1] * scaleRatioW) + xOffset); |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y1] = (int32_t) ((shot_ext->shot.dm.stats.faceRectangles[i][Y1] * scaleRatioH) + yOffset); |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X2] = (int32_t) ((shot_ext->shot.dm.stats.faceRectangles[i][X2] * scaleRatioW) + xOffset); |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y2] = (int32_t) ((shot_ext->shot.dm.stats.faceRectangles[i][Y2] * scaleRatioH) + yOffset); |
| ALOGV("DEBUG(%s):faceIds[%d](%d), faceScores[%d](%d), original(%d,%d,%d,%d), converted(%d,%d,%d,%d)", |
| __FUNCTION__, |
| i, faceIds[i], i, faceScores[i], |
| shot_ext->shot.dm.stats.faceRectangles[i][X1], |
| shot_ext->shot.dm.stats.faceRectangles[i][Y1], |
| shot_ext->shot.dm.stats.faceRectangles[i][X2], |
| shot_ext->shot.dm.stats.faceRectangles[i][Y2], |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X1], |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y1], |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X2], |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y2]); |
| |
| detectedFaceCount++; |
| break; |
| case FACEDETECT_MODE_OFF: |
| faceScores[i] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X1] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y1] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X2] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX)+ Y2] = 0; |
| break; |
| default: |
| ALOGE("ERR(%s[%d]):Not supported FD mode(%d)", __FUNCTION__, __LINE__, |
| shot_ext->shot.dm.stats.faceDetectMode); |
| break; |
| } |
| } else { |
| faceIds[i] = 0; |
| faceScores[i] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X1] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y1] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + X2] = 0; |
| faceRectangles[(i * RECTANGLE_MAX_INDEX) + Y2] = 0; |
| } |
| } |
| |
| if (detectedFaceCount > 0) { |
| switch (shot_ext->shot.dm.stats.faceDetectMode) { |
| case FACEDETECT_MODE_FULL: |
| settings->update(ANDROID_STATISTICS_FACE_LANDMARKS, faceLandmarks, |
| detectedFaceCount * FACE_LANDMARKS_MAX_INDEX); |
| ALOGV("DEBUG(%s):dm.stats.faceLandmarks(%d)", __FUNCTION__, detectedFaceCount); |
| case FACEDETECT_MODE_SIMPLE: |
| settings->update(ANDROID_STATISTICS_FACE_IDS, faceIds, detectedFaceCount); |
| ALOGV("DEBUG(%s):dm.stats.faceIds(%d)", __FUNCTION__, detectedFaceCount); |
| |
| settings->update(ANDROID_STATISTICS_FACE_RECTANGLES, faceRectangles, |
| detectedFaceCount * RECTANGLE_MAX_INDEX); |
| ALOGV("DEBUG(%s):dm.stats.faceRectangles(%d)", __FUNCTION__, detectedFaceCount); |
| |
| settings->update(ANDROID_STATISTICS_FACE_SCORES, faceScores, detectedFaceCount); |
| ALOGV("DEBUG(%s):dm.stats.faceScores(%d)", __FUNCTION__, detectedFaceCount); |
| break; |
| case FACEDETECT_MODE_OFF: |
| default: |
| ALOGE("ERR(%s[%d]):Not supported FD mode(%d)", __FUNCTION__, __LINE__, |
| shot_ext->shot.dm.stats.faceDetectMode); |
| break; |
| } |
| } |
| |
| return; |
| } |
| |
| void ExynosCamera3MetadataConverter::m_convert3AARegion(ExynosRect2 *region) |
| { |
| ExynosRect2 newRect2; |
| ExynosRect maxSensorSize; |
| ExynosRect hwBcropSize; |
| |
| m_parameters->getMaxSensorSize(&maxSensorSize.w, &maxSensorSize.h); |
| m_parameters->getHwBayerCropRegion(&hwBcropSize.w, &hwBcropSize.h, |
| &hwBcropSize.x, &hwBcropSize.y); |
| |
| newRect2 = convertingSrcArea2DstArea(region, &maxSensorSize, &hwBcropSize); |
| |
| region->x1 = newRect2.x1; |
| region->y1 = newRect2.y1; |
| region->x2 = newRect2.x2; |
| region->y2 = newRect2.y2; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::checkMetaValid(camera_metadata_tag_t tag, const void *data) |
| { |
| status_t ret = NO_ERROR; |
| camera_metadata_entry_t entry; |
| |
| int32_t value = 0; |
| const int32_t *i32Range = NULL; |
| |
| if (m_staticInfo.exists(tag) == false) { |
| ALOGE("ERR(%s[%d]):Cannot find entry, tag(%d)", __FUNCTION__, __LINE__, tag); |
| return BAD_VALUE; |
| } |
| |
| entry = m_staticInfo.find(tag); |
| |
| /* TODO: handle all tags |
| * need type check |
| */ |
| switch (tag) { |
| case ANDROID_SENSOR_INFO_SENSITIVITY_RANGE: |
| value = *(int32_t *)data; |
| i32Range = entry.data.i32; |
| if (value < i32Range[0] || value > i32Range[1]) { |
| ALOGE("ERR(%s[%d]):Invalid Sensitivity value(%d), range(%d, %d)", |
| __FUNCTION__, __LINE__, value, i32Range[0], i32Range[1]); |
| ret = BAD_VALUE; |
| } |
| break; |
| default: |
| ALOGE("ERR(%s[%d]):Tag (%d) is not implemented", __FUNCTION__, __LINE__, tag); |
| break; |
| } |
| |
| return ret; |
| } |
| |
| status_t ExynosCamera3MetadataConverter::getDefaultSetting(camera_metadata_tag_t tag, void *data) |
| { |
| status_t ret = NO_ERROR; |
| camera_metadata_entry_t entry; |
| |
| const int32_t *i32Range = NULL; |
| |
| if (m_defaultRequestSetting.exists(tag) == false) { |
| ALOGE("ERR(%s[%d]):Cannot find entry, tag(%d)", __FUNCTION__, __LINE__, tag); |
| return BAD_VALUE; |
| } |
| |
| entry = m_defaultRequestSetting.find(tag); |
| |
| /* TODO: handle all tags |
| * need type check |
| */ |
| switch (tag) { |
| case ANDROID_SENSOR_SENSITIVITY: |
| i32Range = entry.data.i32; |
| *(int32_t *)data = i32Range[0]; |
| break; |
| default: |
| ALOGE("ERR(%s[%d]):Tag (%d) is not implemented", __FUNCTION__, __LINE__, tag); |
| break; |
| } |
| |
| return ret; |
| } |
| |
| uint32_t ExynosCamera3MetadataConverter::m_getFrameCountForTimeStamp(uint64_t timeStamp) |
| { |
| int mapIndex = (m_frameCountMapIndex + FRAMECOUNT_MAP_LENGTH - 1) % FRAMECOUNT_MAP_LENGTH; |
| |
| for (int i = 0; i < FRAMECOUNT_MAP_LENGTH; i++) { |
| if (m_frameCountMap[mapIndex][TIMESTAMP] == timeStamp) { |
| return m_frameCountMap[mapIndex][FRAMECOUNT]; |
| } |
| |
| mapIndex = (mapIndex + FRAMECOUNT_MAP_LENGTH - 1) % FRAMECOUNT_MAP_LENGTH; |
| } |
| |
| return 0; |
| } |
| }; /* namespace android */ |