CameraMetadata.cpp revision fc42642ab78da5fe25bcbea7a568bf880268a9dc
1cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala/* 2cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 4cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * you may not use this file except in compliance with the License. 6cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * You may obtain a copy of the License at 7cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 8cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 10cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * See the License for the specific language governing permissions and 14cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * limitations under the License. 15cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala */ 16cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Metadata" 18cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Log.h> 19cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Errors.h> 20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 217efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include <camera/CameraMetadata.h> 22cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 23cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android { 24cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata() : 26cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer(NULL) { 27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 28cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 29cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) 30cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{ 31cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity); 32cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata(const CameraMetadata &other) { 35cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = clone_camera_metadata(other.mBuffer); 36cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 37cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 387efa520c76e6a1f6b3146404cc6aca5a8353583aIgor MurashkinCameraMetadata::CameraMetadata(camera_metadata_t *buffer) : mBuffer(NULL) { 397efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin acquire(buffer); 407efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin} 417efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin 42cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) { 43cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return operator=(other.mBuffer); 44cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 46cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) { 47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_LIKELY(buffer != mBuffer)) { 48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *newBuffer = clone_camera_metadata(buffer); 49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 50cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = newBuffer; 51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 52cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return *this; 53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 54cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() { 56cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 57cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 58cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() { 60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *released = mBuffer; 61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return released; 63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() { 66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer) { 67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(mBuffer); 68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 70cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 71cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 72cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) { 73cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 74cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = buffer; 75cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 76cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 77cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) { 78cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala acquire(other.release()); 79cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 80cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 81cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) { 82cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return append_camera_metadata(mBuffer, other.mBuffer); 83cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 84cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 85cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const { 86cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return (mBuffer == NULL) ? 0 : 87cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_entry_count(mBuffer); 88cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 89cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const { 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return entryCount() == 0; 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 94cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() { 95cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return sort_camera_metadata(mBuffer); 96cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 97cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) { 99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int tagType = get_camera_metadata_tag_type(tag); 100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType == -1)) { 101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Update metadata entry: Unknown tag %d", tag); 102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType != expectedType) ) { 105cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; " 106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala "got type %s data instead ", 107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, 108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[tagType], 109cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[expectedType]); 110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 113cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 116cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *data, size_t data_count) { 117cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 118cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT32)) != OK) { 119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 122cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 124cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 125cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *data, size_t data_count) { 126cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 127cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 128cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 129cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 130cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 131cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 132cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 134cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const float *data, size_t data_count) { 135cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 136cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_FLOAT)) != OK) { 137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 138cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 139cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 140cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 141cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 142cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 143cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int64_t *data, size_t data_count) { 144cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 145cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT64)) != OK) { 146cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 147cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 148cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 149cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const double *data, size_t data_count) { 153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) { 155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 156cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 157cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 158cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 159cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 161cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const camera_metadata_rational_t *data, size_t data_count) { 162cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) { 164cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const String8 &string) { 171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)string.string(), string.size()); 176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 177cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, const void *data, 179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_count) { 180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int type = get_camera_metadata_tag_type(tag); 182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (type == -1) { 183cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Tag %d not found", __FUNCTION__, tag); 184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return BAD_VALUE; 185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_size = calculate_camera_metadata_entry_data_size(type, 187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala data_count); 188cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 189cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = resizeIfNeeded(1, data_size); 190cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == OK) { 192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 195cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = add_camera_metadata_entry(mBuffer, 196cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tag, data, data_count); 197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = update_camera_metadata_entry(mBuffer, 199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.index, data, data_count, NULL); 200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 201cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 202cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 203cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 204cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 208cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 209cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 211fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const { 212fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin camera_metadata_ro_entry entry; 213fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0; 214fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin} 215fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin 216cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) { 217cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry entry; 219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 221cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 222cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const { 228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 229cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry entry; 230cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_ro_entry(mBuffer, tag, &entry); 231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 234cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 235cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) { 239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 240cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 241cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 242cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 243cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res != OK) { 245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 247cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 248cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = delete_camera_metadata_entry(mBuffer, entry.index); 252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 253cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 254cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 255cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 258cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 260cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 261cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const { 262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation); 263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { 266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 267cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2); 268cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 269cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else { 273cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer); 274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer); 275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newEntryCount = currentEntryCount + 276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraEntries; 277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount = (newEntryCount > currentEntryCap) ? 278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount * 2 : currentEntryCap; 279cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 280cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCount = get_camera_metadata_data_count(mBuffer); 281cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer); 282cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newDataCount = currentDataCount + 283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraData; 284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount = (newDataCount > currentDataCap) ? 285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount * 2 : currentDataCap; 286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (newEntryCount > currentEntryCap || 288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount > currentDataCap) { 289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *oldBuffer = mBuffer; 290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(newEntryCount, 291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount); 292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 296cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala append_camera_metadata(mBuffer, oldBuffer); 297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(oldBuffer); 298cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 300cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 301cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 303cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android 304