CameraMetadata.cpp revision cab96a4a7a2900fa991ab77ae45ba8d4be97e054
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 17cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#define LOG_TAG "CameraMetadata" 18cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Log.h> 19cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Errors.h> 20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 21cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include "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 38cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) { 39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return operator=(other.mBuffer); 40cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 41cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 42cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) { 43cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_LIKELY(buffer != mBuffer)) { 44cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *newBuffer = clone_camera_metadata(buffer); 45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 46cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = newBuffer; 47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return *this; 49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 50cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() { 52cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 54cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() { 56cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *released = mBuffer; 57cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 58cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return released; 59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() { 62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer) { 63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(mBuffer); 64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) { 69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 70cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = buffer; 71cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 72cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 73cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) { 74cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala acquire(other.release()); 75cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 76cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 77cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) { 78cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return append_camera_metadata(mBuffer, other.mBuffer); 79cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 80cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 81cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const { 82cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return (mBuffer == NULL) ? 0 : 83cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_entry_count(mBuffer); 84cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 85cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 86cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() { 87cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return sort_camera_metadata(mBuffer); 88cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 89cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 90cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) { 91cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int tagType = get_camera_metadata_tag_type(tag); 92cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType == -1)) { 93cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Update metadata entry: Unknown tag %d", tag); 94cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 95cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 96cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType != expectedType) ) { 97cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; " 98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala "got type %s data instead ", 99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, 100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[tagType], 101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[expectedType]); 102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 105cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *data, size_t data_count) { 109cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT32)) != OK) { 111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 113cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 116cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 117cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *data, size_t data_count) { 118cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 122cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 124cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 125cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 126cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const float *data, size_t data_count) { 127cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 128cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_FLOAT)) != OK) { 129cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 130cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 131cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 132cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 134cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 135cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int64_t *data, size_t data_count) { 136cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT64)) != OK) { 138cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 139cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 140cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 141cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 142cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 143cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 144cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const double *data, size_t data_count) { 145cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 146cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) { 147cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 148cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 149cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const camera_metadata_rational_t *data, size_t data_count) { 154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) { 156cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 157cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 158cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)data, data_count); 159cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 161cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 162cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const String8 &string) { 163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 164cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return update(tag, (const void*)string.string(), string.size()); 168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, const void *data, 171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_count) { 172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int type = get_camera_metadata_tag_type(tag); 174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (type == -1) { 175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Tag %d not found", __FUNCTION__, tag); 176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return BAD_VALUE; 177cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_size = calculate_camera_metadata_entry_data_size(type, 179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala data_count); 180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = resizeIfNeeded(1, data_size); 182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 183cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == OK) { 184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = add_camera_metadata_entry(mBuffer, 188cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tag, data, data_count); 189cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 190cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = update_camera_metadata_entry(mBuffer, 191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.index, data, data_count, NULL); 192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 195cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 196cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 201cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 202cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 203cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) { 204cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry entry; 206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 208cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 209cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 213cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 214cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const { 215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 216cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry entry; 217cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_ro_entry(mBuffer, tag, &entry); 218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 221cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 222cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) { 226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 229cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 230cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res != OK) { 232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 234cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 235cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = delete_camera_metadata_entry(mBuffer, entry.index); 239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 240cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 241cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 242cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 243cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 247cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 248cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const { 249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation); 250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { 253cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 254cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2); 255cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 258cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else { 260cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer); 261cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer); 262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newEntryCount = currentEntryCount + 263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraEntries; 264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount = (newEntryCount > currentEntryCap) ? 265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount * 2 : currentEntryCap; 266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 267cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCount = get_camera_metadata_data_count(mBuffer); 268cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer); 269cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newDataCount = currentDataCount + 270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraData; 271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount = (newDataCount > currentDataCap) ? 272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount * 2 : currentDataCap; 273cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (newEntryCount > currentEntryCap || 275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount > currentDataCap) { 276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *oldBuffer = mBuffer; 277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(newEntryCount, 278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount); 279cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 280cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 281cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 282cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala append_camera_metadata(mBuffer, oldBuffer); 284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(oldBuffer); 285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android 291