CameraMetadata.cpp revision e7ee7637747371635a85fedd24d2190bb1f38651
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 17e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin// #define LOG_NDEBUG 0 18e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 194bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Metadata" 20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Log.h> 21cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Errors.h> 22cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 237efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include <camera/CameraMetadata.h> 24e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <binder/Parcel.h> 25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 26cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android { 27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::WritableBlob WritableBlob; 29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::ReadableBlob ReadableBlob; 30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 31cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata() : 323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mBuffer(NULL), mLocked(false) { 33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) : 363b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked(false) 37cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{ 38cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity); 39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 40cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(const CameraMetadata &other) : 423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked(false) { 43cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = clone_camera_metadata(other.mBuffer); 44cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 463b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(camera_metadata_t *buffer) : 473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mBuffer(NULL), mLocked(false) { 487efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin acquire(buffer); 497efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin} 507efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin 51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) { 52cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return operator=(other.mBuffer); 53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 54cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) { 563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 573b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Assignment to a locked CameraMetadata!", __FUNCTION__); 583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return *this; 593b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_LIKELY(buffer != mBuffer)) { 62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *newBuffer = clone_camera_metadata(buffer); 63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = newBuffer; 65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return *this; 67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() { 703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = false; 71cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 72cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 73cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 743b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalaconst camera_metadata_t* CameraMetadata::getAndLock() { 753b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = true; 763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return mBuffer; 773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala} 783b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::unlock(const camera_metadata_t *buffer) { 803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (!mLocked) { 813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Can't unlock a non-locked CameraMetadata!", __FUNCTION__); 823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 843b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (buffer != mBuffer) { 853b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Can't unlock CameraMetadata with wrong pointer!", 863b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala __FUNCTION__); 873b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return BAD_VALUE; 883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = false; 903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return OK; 913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala} 923b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 93cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() { 943b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 953b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 963b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return NULL; 973b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *released = mBuffer; 99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return released; 101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() { 1043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1053b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1063b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1073b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer) { 109cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(mBuffer); 110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 113cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) { 1153b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1173b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1183b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = buffer; 121e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 122e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK, 123e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin "%s: Failed to validate metadata structure %p", 124e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin __FUNCTION__, buffer); 125cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 126cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 127cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) { 1283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 132cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala acquire(other.release()); 133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 134cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 135cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) { 1363b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1373b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1383b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1393b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 140cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return append_camera_metadata(mBuffer, other.mBuffer); 141cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 142cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 143cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const { 144cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return (mBuffer == NULL) ? 0 : 145cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_entry_count(mBuffer); 146cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 147cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const { 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return entryCount() == 0; 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() { 1533b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 157cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return sort_camera_metadata(mBuffer); 158cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 159cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) { 161cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int tagType = get_camera_metadata_tag_type(tag); 162cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType == -1)) { 163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Update metadata entry: Unknown tag %d", tag); 164cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType != expectedType) ) { 167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; " 168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala "got type %s data instead ", 169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, 170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[tagType], 171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[expectedType]); 172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 177cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *data, size_t data_count) { 179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT32)) != OK) { 185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 1873b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 188cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 189cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 190cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *data, size_t data_count) { 192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1933b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1943b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1953b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1963b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2003b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 201cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 202cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 203cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 204cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const float *data, size_t data_count) { 205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2063b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2073b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2083b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2093b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_FLOAT)) != OK) { 211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2133b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 214cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 216cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 217cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int64_t *data, size_t data_count) { 218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2193b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2203b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2213b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2223b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT64)) != OK) { 224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2263b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 229cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 230cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const double *data, size_t data_count) { 231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2333b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) { 237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2393b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 240cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 241cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 242cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 243cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const camera_metadata_rational_t *data, size_t data_count) { 244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2453b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2463b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2483b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) { 250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2523b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 253cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 254cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 255cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const String8 &string) { 257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2593b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2613b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2653b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)string.string(), string.size()); 266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 267cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2683b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::updateImpl(uint32_t tag, const void *data, 269cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_count) { 270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2713b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2723b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2743b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int type = get_camera_metadata_tag_type(tag); 276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (type == -1) { 277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Tag %d not found", __FUNCTION__, tag); 278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return BAD_VALUE; 279cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 280cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_size = calculate_camera_metadata_entry_data_size(type, 281cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala data_count); 282cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = resizeIfNeeded(1, data_size); 284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == OK) { 286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = add_camera_metadata_entry(mBuffer, 290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tag, data, data_count); 291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = update_camera_metadata_entry(mBuffer, 293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.index, data, data_count, NULL); 294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 296cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 298cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 300cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 301cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 302e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 303e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin IF_ALOGV() { 304e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != 305e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin OK, 306e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 307e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin "%s: Failed to validate metadata structure after update %p", 308e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin __FUNCTION__, mBuffer); 309e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin } 310e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 312cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 313cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 314fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const { 315fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin camera_metadata_ro_entry entry; 316fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0; 317fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin} 318fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin 319cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) { 320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 321cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry entry; 3223b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3233b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3243b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala entry.count = 0; 3253b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return entry; 3263b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 327cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 328cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 330cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 331cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 332cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 333cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 334cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 335cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const { 336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 337cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry entry; 338cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_ro_entry(mBuffer, tag, &entry); 339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 341cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 342cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 344cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 345cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 346cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) { 347cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 3493b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3503b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3513b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 3523b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 353cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 355cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res != OK) { 357cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 358cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 359cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 360cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 362cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 363cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = delete_camera_metadata_entry(mBuffer, entry.index); 364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 366cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 367cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 368cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 369cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 371cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 373cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const { 374cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation); 375cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 376cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 377cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { 378cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2); 380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 381cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 382cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 384cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else { 385cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer); 386cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer); 387cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newEntryCount = currentEntryCount + 388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraEntries; 389cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount = (newEntryCount > currentEntryCap) ? 390cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount * 2 : currentEntryCap; 391cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 392cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCount = get_camera_metadata_data_count(mBuffer); 393cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer); 394cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newDataCount = currentDataCount + 395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraData; 396cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount = (newDataCount > currentDataCap) ? 397cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount * 2 : currentDataCap; 398cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 399cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (newEntryCount > currentEntryCap || 400cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount > currentDataCap) { 401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *oldBuffer = mBuffer; 402cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(newEntryCount, 403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount); 404cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 406cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 408cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala append_camera_metadata(mBuffer, oldBuffer); 409cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(oldBuffer); 410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 412cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 413cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 414cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 415e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(const Parcel& data, 416e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata_t** out) { 417e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 418e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t err = OK; 419e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 420e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata_t* metadata = NULL; 421e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 422e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (out) { 423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *out = NULL; 424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = metadataSize (int32) 427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t metadataSizeTmp = -1; 428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if ((err = data.readInt32(&metadataSizeTmp)) != OK) { 429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read metadata size (error %d %s)", 430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, err, strerror(-err)); 431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return err; 432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const size_t metadataSize = static_cast<size_t>(metadataSizeTmp); 434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadataSize == 0) { 436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Read 0-sized metadata", __FUNCTION__); 437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return OK; 438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // NOTE: this doesn't make sense to me. shouldnt the blob 441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // know how big it is? why do we have to specify the size 442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // to Parcel::readBlob ? 443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 444e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ReadableBlob blob; 445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = metadata (blob) 446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin do { 447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if ((err = data.readBlob(metadataSize, &blob)) != OK) { 448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read metadata blob (sized %d). Possible " 449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin " serialization bug. Error %d %s", 450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, metadataSize, err, strerror(-err)); 451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin break; 452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 453e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const camera_metadata_t* tmp = 454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reinterpret_cast<const camera_metadata_t*>(blob.data()); 455e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin metadata = allocate_copy_camera_metadata_checked(tmp, metadataSize); 457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadata == NULL) { 458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // We consider that allocation only fails if the validation 459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // also failed, therefore the readFromParcel was a failure. 460e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin err = BAD_VALUE; 461e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 462e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } while(0); 463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin blob.release(); 464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (out) { 466e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Set out metadata to %p", __FUNCTION__, metadata); 467e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *out = metadata; 468e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else if (metadata != NULL) { 469e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Freed camera metadata at %p", __FUNCTION__, metadata); 470e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin free_camera_metadata(metadata); 471e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 472e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 473e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return err; 474e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 475e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 476e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel& data, 477e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const camera_metadata_t* metadata) { 478e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t res = OK; 479e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 480e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = metadataSize (int32) 481e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 482e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadata == NULL) { 483e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return data.writeInt32(0); 484e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 485e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 486e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const size_t metadataSize = get_camera_metadata_compact_size(metadata); 487e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = data.writeInt32(static_cast<int32_t>(metadataSize)); 488e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != OK) { 489e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 490e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 491e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 492e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = metadata (blob) 493e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin WritableBlob blob; 494e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin do { 495e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = data.writeBlob(metadataSize, &blob); 496e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != OK) { 497e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin break; 498e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 499e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin copy_camera_metadata(blob.data(), metadataSize, metadata); 500e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 501e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin IF_ALOGV() { 502e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (validate_camera_metadata_structure( 503e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin (const camera_metadata_t*)blob.data(), 504e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin &metadataSize) != OK) { 505e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Failed to validate metadata %p after writing blob", 506e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, blob.data()); 507e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 508e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Metadata written to blob. Validation success", 509e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 510e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 511e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 512e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 513e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Not too big of a problem since receiving side does hard validation 514e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Don't check the size since the compact size could be larger 515e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (validate_camera_metadata_structure(metadata, /*size*/NULL) != OK) { 516e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGW("%s: Failed to validate metadata %p before writing blob", 517e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, metadata); 518e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 519e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 520e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } while(false); 521e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin blob.release(); 522e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 523e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 524e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 525e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 526e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(Parcel *parcel) { 527e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 528e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: parcel = %p", __FUNCTION__, parcel); 529e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 530e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t res = OK; 531e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 532e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (parcel == NULL) { 533e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: parcel is null", __FUNCTION__); 534e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BAD_VALUE; 535e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 536e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 537e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (mLocked) { 538e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 539e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return INVALID_OPERATION; 540e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 541e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 542e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata *buffer = NULL; 543e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // TODO: reading should return a status code, in case validation fails 544e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = CameraMetadata::readFromParcel(*parcel, &buffer); 545e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 546e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != NO_ERROR) { 547e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read from parcel. Metadata is unchanged.", 548e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 549e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 550e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 551e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 552e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin clear(); 553e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin mBuffer = buffer; 554e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 555e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return OK; 556e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 557e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 558e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel *parcel) const { 559e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 560e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: parcel = %p", __FUNCTION__, parcel); 561e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 562e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (parcel == NULL) { 563e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: parcel is null", __FUNCTION__); 564e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BAD_VALUE; 565e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 566e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 567e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return CameraMetadata::writeToParcel(*parcel, mBuffer); 568e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 569e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 570e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinvoid CameraMetadata::swap(CameraMetadata& other) { 571e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (mLocked) { 572e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 573e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return; 574e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else if (other.mLocked) { 575e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Other CameraMetadata is locked", __FUNCTION__); 576e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return; 577e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 578e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 579e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata* thisBuf = mBuffer; 580e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata* otherBuf = other.mBuffer; 581e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 582e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin other.mBuffer = thisBuf; 583e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin mBuffer = otherBuf; 584e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 585e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 586cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android 587