ACameraMetadata.cpp revision 0dea57fd9fc4b2ccaab97d9477359fbd5a626f5c
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17//#define LOG_NDEBUG 0 18#define LOG_TAG "ACameraMetadata" 19 20#include "ACameraMetadata.h" 21#include <utils/Vector.h> 22 23using namespace android; 24 25/** 26 * ACameraMetadata Implementation 27 */ 28ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) : 29 mData(buffer), mType(type) { 30 filterUnsupportedFeatures(); 31} 32 33bool 34ACameraMetadata::isNdkSupportedCapability(int32_t capability) { 35 switch (capability) { 36 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE: 37 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR: 38 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING: 39 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW: 40 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS: 41 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE: 42 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT: 43 return true; 44 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING: 45 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING: 46 case ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO: 47 return false; 48 default: 49 // Newly defined capabilities will be unsupported by default (blacklist) 50 // TODO: Should we do whitelist or blacklist here? 51 ALOGE("%s: Unknonwn capability %d", __FUNCTION__, capability); 52 return false; 53 } 54} 55 56void 57ACameraMetadata::filterUnsupportedFeatures() { 58 // Hide unsupported capabilities (reprocessing) 59 camera_metadata_entry entry = mData.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 60 if (entry.count == 0 || entry.type != ACAMERA_TYPE_BYTE) { 61 ALOGE("%s: malformed available capability key! count %zu, type %d", 62 __FUNCTION__, entry.count, entry.type); 63 return; 64 } 65 66 Vector<uint8_t> capabilities; 67 capabilities.setCapacity(entry.count); 68 for (size_t i = 0; i < entry.count; i++) { 69 uint8_t capability = entry.data.u8[i]; 70 if (isNdkSupportedCapability(capability)) { 71 capabilities.push(capability); 72 } 73 } 74 mData.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, capabilities); 75 // TODO: Hide unsupported streams (input/bidirectional streams) 76} 77 78bool 79ACameraMetadata::isVendorTag(const uint32_t tag) { 80 uint32_t tag_section = tag >> 16; 81 if (tag_section >= VENDOR_SECTION) { 82 return true; 83 } 84 return false; 85} 86 87camera_status_t 88ACameraMetadata::getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const { 89 if (entry == nullptr) { 90 return ACAMERA_ERROR_INVALID_PARAMETER; 91 } 92 93 camera_metadata_ro_entry rawEntry = mData.find(tag); 94 if (rawEntry.count == 0) { 95 ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag); 96 return ACAMERA_ERROR_METADATA_NOT_FOUND; 97 } 98 entry->tag = tag; 99 entry->type = rawEntry.type; 100 entry->count = rawEntry.count; 101 entry->data.u8 = rawEntry.data.u8; 102 return ACAMERA_OK; 103} 104 105camera_status_t 106ACameraMetadata::update(uint32_t tag, uint32_t count, const uint8_t* data) { 107 return updateImpl<uint8_t>(tag, count, data); 108} 109 110camera_status_t 111ACameraMetadata::update(uint32_t tag, uint32_t count, const int32_t* data) { 112 return updateImpl<int32_t>(tag, count, data); 113} 114 115camera_status_t 116ACameraMetadata::update(uint32_t tag, uint32_t count, const float* data) { 117 return updateImpl<float>(tag, count, data); 118} 119 120camera_status_t 121ACameraMetadata::update(uint32_t tag, uint32_t count, const double* data) { 122 return updateImpl<double>(tag, count, data); 123} 124 125camera_status_t 126ACameraMetadata::update(uint32_t tag, uint32_t count, const int64_t* data) { 127 return updateImpl<int64_t>(tag, count, data); 128} 129 130camera_status_t 131ACameraMetadata::update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data) { 132 return updateImpl<camera_metadata_rational_t>(tag, count, data); 133} 134 135 136// TODO: some of key below should be hidden from user 137// ex: ACAMERA_REQUEST_ID and ACAMERA_REPROCESS_EFFECTIVE_EXPOSURE_FACTOR 138/*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ 139 * The key entries below this point are generated from metadata 140 * definitions in /system/media/camera/docs. Do not modify by hand or 141 * modify the comment blocks at the start or end. 142 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/ 143 144bool 145ACameraMetadata::isCaptureRequestTag(const uint32_t tag) { 146 // Skip check for vendor keys 147 if (isVendorTag(tag)) { 148 return true; 149 } 150 151 switch (tag) { 152 case ACAMERA_COLOR_CORRECTION_MODE: 153 case ACAMERA_COLOR_CORRECTION_TRANSFORM: 154 case ACAMERA_COLOR_CORRECTION_GAINS: 155 case ACAMERA_COLOR_CORRECTION_ABERRATION_MODE: 156 case ACAMERA_CONTROL_AE_ANTIBANDING_MODE: 157 case ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION: 158 case ACAMERA_CONTROL_AE_LOCK: 159 case ACAMERA_CONTROL_AE_MODE: 160 case ACAMERA_CONTROL_AE_REGIONS: 161 case ACAMERA_CONTROL_AE_TARGET_FPS_RANGE: 162 case ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER: 163 case ACAMERA_CONTROL_AF_MODE: 164 case ACAMERA_CONTROL_AF_REGIONS: 165 case ACAMERA_CONTROL_AF_TRIGGER: 166 case ACAMERA_CONTROL_AWB_LOCK: 167 case ACAMERA_CONTROL_AWB_MODE: 168 case ACAMERA_CONTROL_AWB_REGIONS: 169 case ACAMERA_CONTROL_CAPTURE_INTENT: 170 case ACAMERA_CONTROL_EFFECT_MODE: 171 case ACAMERA_CONTROL_MODE: 172 case ACAMERA_CONTROL_SCENE_MODE: 173 case ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE: 174 case ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST: 175 case ACAMERA_EDGE_MODE: 176 case ACAMERA_FLASH_MODE: 177 case ACAMERA_HOT_PIXEL_MODE: 178 case ACAMERA_JPEG_GPS_COORDINATES: 179 case ACAMERA_JPEG_GPS_PROCESSING_METHOD: 180 case ACAMERA_JPEG_GPS_TIMESTAMP: 181 case ACAMERA_JPEG_ORIENTATION: 182 case ACAMERA_JPEG_QUALITY: 183 case ACAMERA_JPEG_THUMBNAIL_QUALITY: 184 case ACAMERA_JPEG_THUMBNAIL_SIZE: 185 case ACAMERA_LENS_APERTURE: 186 case ACAMERA_LENS_FILTER_DENSITY: 187 case ACAMERA_LENS_FOCAL_LENGTH: 188 case ACAMERA_LENS_FOCUS_DISTANCE: 189 case ACAMERA_LENS_OPTICAL_STABILIZATION_MODE: 190 case ACAMERA_NOISE_REDUCTION_MODE: 191 case ACAMERA_REQUEST_ID: 192 case ACAMERA_SCALER_CROP_REGION: 193 case ACAMERA_SENSOR_EXPOSURE_TIME: 194 case ACAMERA_SENSOR_FRAME_DURATION: 195 case ACAMERA_SENSOR_SENSITIVITY: 196 case ACAMERA_SENSOR_TEST_PATTERN_DATA: 197 case ACAMERA_SENSOR_TEST_PATTERN_MODE: 198 case ACAMERA_SHADING_MODE: 199 case ACAMERA_STATISTICS_FACE_DETECT_MODE: 200 case ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE: 201 case ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE: 202 case ACAMERA_TONEMAP_CURVE_BLUE: 203 case ACAMERA_TONEMAP_CURVE_GREEN: 204 case ACAMERA_TONEMAP_CURVE_RED: 205 case ACAMERA_TONEMAP_MODE: 206 case ACAMERA_TONEMAP_GAMMA: 207 case ACAMERA_TONEMAP_PRESET_CURVE: 208 case ACAMERA_LED_TRANSMIT: 209 case ACAMERA_BLACK_LEVEL_LOCK: 210 case ACAMERA_REPROCESS_EFFECTIVE_EXPOSURE_FACTOR: 211 return true; 212 default: 213 return false; 214 } 215} 216 217/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ 218 * End generated code 219 *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ 220