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) { 136fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return append(other.mBuffer); 137fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 138fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 139fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalastatus_t CameraMetadata::append(const camera_metadata_t* other) { 1403b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 144fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala size_t extraEntries = get_camera_metadata_entry_count(other); 145fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala size_t extraData = get_camera_metadata_data_count(other); 146fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala resizeIfNeeded(extraEntries, extraData); 147fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 148fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return append_camera_metadata(mBuffer, other); 149cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const { 152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return (mBuffer == NULL) ? 0 : 153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_entry_count(mBuffer); 154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const { 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return entryCount() == 0; 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() { 1613b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1623b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1633b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1643b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return sort_camera_metadata(mBuffer); 166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) { 169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int tagType = get_camera_metadata_tag_type(tag); 170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType == -1)) { 171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Update metadata entry: Unknown tag %d", tag); 172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType != expectedType) ) { 175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; " 176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala "got type %s data instead ", 177cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, 178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[tagType], 179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[expectedType]); 180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 183cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *data, size_t data_count) { 187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT32)) != OK) { 193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 1953b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 196cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *data, size_t data_count) { 200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2013b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2023b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2083b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 209cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const float *data, size_t data_count) { 213cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2143b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2153b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2173b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_FLOAT)) != OK) { 219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2213b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 222cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int64_t *data, size_t data_count) { 226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2273b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT64)) != OK) { 232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 235cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const double *data, size_t data_count) { 239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2403b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) { 245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 248cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const camera_metadata_rational_t *data, size_t data_count) { 252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2533b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) { 258cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 261cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const String8 &string) { 265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2663b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2673b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2683b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2693b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)string.string(), string.size()); 274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::updateImpl(uint32_t tag, const void *data, 277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_count) { 278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int type = get_camera_metadata_tag_type(tag); 284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (type == -1) { 285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Tag %d not found", __FUNCTION__, tag); 286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return BAD_VALUE; 287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_size = calculate_camera_metadata_entry_data_size(type, 289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala data_count); 290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = resizeIfNeeded(1, data_size); 292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == OK) { 294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 296cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = add_camera_metadata_entry(mBuffer, 298cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tag, data, data_count); 299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 300cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = update_camera_metadata_entry(mBuffer, 301cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.index, data, data_count, NULL); 302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 303cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 304cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 305cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 306cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 307cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 309cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 310e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 311e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin IF_ALOGV() { 312e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != 313e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin OK, 314e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 315e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin "%s: Failed to validate metadata structure after update %p", 316e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin __FUNCTION__, mBuffer); 317e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin } 318e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin 319cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 321cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 322fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const { 323fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin camera_metadata_ro_entry entry; 324fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0; 325fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin} 326fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin 327cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) { 328cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry entry; 3303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala entry.count = 0; 3333b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return entry; 3343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 335cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 337cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 338cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 341cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 342cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const { 344cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 345cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry entry; 346cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_ro_entry(mBuffer, tag, &entry); 347cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 349cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 350cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 351cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 352cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 353cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) { 355cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 3573b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3593b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 3603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 362cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 363cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res != OK) { 365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error looking for 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 return res; 370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 371cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = delete_camera_metadata_entry(mBuffer, entry.index); 372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 373cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 374cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 375cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 376cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 377cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 378cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 381cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const { 382cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation); 383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 384cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 385cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { 386cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 387cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2); 388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 389cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 390cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 391cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 392cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else { 393cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer); 394cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer); 395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newEntryCount = currentEntryCount + 396cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraEntries; 397cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount = (newEntryCount > currentEntryCap) ? 398cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount * 2 : currentEntryCap; 399cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 400cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCount = get_camera_metadata_data_count(mBuffer); 401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer); 402cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newDataCount = currentDataCount + 403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraData; 404cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount = (newDataCount > currentDataCap) ? 405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount * 2 : currentDataCap; 406cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (newEntryCount > currentEntryCap || 408cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount > currentDataCap) { 409cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *oldBuffer = mBuffer; 410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(newEntryCount, 411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount); 412cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 413cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 414cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 415cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 416cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala append_camera_metadata(mBuffer, oldBuffer); 417cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(oldBuffer); 418cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 419cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 420cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 421cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 422cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(const Parcel& data, 424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata_t** out) { 425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t err = OK; 427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata_t* metadata = NULL; 429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (out) { 431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *out = NULL; 432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = metadataSize (int32) 435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t metadataSizeTmp = -1; 436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if ((err = data.readInt32(&metadataSizeTmp)) != OK) { 437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read metadata size (error %d %s)", 438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, err, strerror(-err)); 439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return err; 440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const size_t metadataSize = static_cast<size_t>(metadataSizeTmp); 442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadataSize == 0) { 444e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Read 0-sized metadata", __FUNCTION__); 445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return OK; 446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // NOTE: this doesn't make sense to me. shouldnt the blob 449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // know how big it is? why do we have to specify the size 450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // to Parcel::readBlob ? 451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ReadableBlob blob; 453e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = metadata (blob) 454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin do { 455e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if ((err = data.readBlob(metadataSize, &blob)) != OK) { 456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read metadata blob (sized %d). Possible " 457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin " serialization bug. Error %d %s", 458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, metadataSize, err, strerror(-err)); 459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin break; 460e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 461e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const camera_metadata_t* tmp = 462e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reinterpret_cast<const camera_metadata_t*>(blob.data()); 463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin metadata = allocate_copy_camera_metadata_checked(tmp, metadataSize); 465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadata == NULL) { 466e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // We consider that allocation only fails if the validation 467e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // also failed, therefore the readFromParcel was a failure. 468e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin err = BAD_VALUE; 469e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 470e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } while(0); 471e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin blob.release(); 472e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 473e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (out) { 474e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Set out metadata to %p", __FUNCTION__, metadata); 475e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *out = metadata; 476e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else if (metadata != NULL) { 477e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Freed camera metadata at %p", __FUNCTION__, metadata); 478e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin free_camera_metadata(metadata); 479e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 480e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 481e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return err; 482e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 483e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 484e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel& data, 485e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const camera_metadata_t* metadata) { 486e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t res = OK; 487e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 488e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = metadataSize (int32) 489e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 490e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (metadata == NULL) { 491e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return data.writeInt32(0); 492e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 493e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 494e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const size_t metadataSize = get_camera_metadata_compact_size(metadata); 495e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = data.writeInt32(static_cast<int32_t>(metadataSize)); 496e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != OK) { 497e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 498e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 499e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 500e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = metadata (blob) 501e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin WritableBlob blob; 502e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin do { 503e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = data.writeBlob(metadataSize, &blob); 504e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != OK) { 505e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin break; 506e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 507e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin copy_camera_metadata(blob.data(), metadataSize, metadata); 508e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 509e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin IF_ALOGV() { 510e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (validate_camera_metadata_structure( 511e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin (const camera_metadata_t*)blob.data(), 512e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin &metadataSize) != OK) { 513e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Failed to validate metadata %p after writing blob", 514e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, blob.data()); 515e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 516e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: Metadata written to blob. Validation success", 517e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 518e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 519e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 520e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 521e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Not too big of a problem since receiving side does hard validation 522e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Don't check the size since the compact size could be larger 523e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (validate_camera_metadata_structure(metadata, /*size*/NULL) != OK) { 524e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGW("%s: Failed to validate metadata %p before writing blob", 525e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__, metadata); 526e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 527e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 528e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } while(false); 529e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin blob.release(); 530e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 531e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 532e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 533e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 534e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(Parcel *parcel) { 535e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 536e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: parcel = %p", __FUNCTION__, parcel); 537e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 538e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t res = OK; 539e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 540e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (parcel == NULL) { 541e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: parcel is null", __FUNCTION__); 542e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BAD_VALUE; 543e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 544e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 545e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (mLocked) { 546e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 547e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return INVALID_OPERATION; 548e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 549e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 550e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata *buffer = NULL; 551e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // TODO: reading should return a status code, in case validation fails 552e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin res = CameraMetadata::readFromParcel(*parcel, &buffer); 553e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 554e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (res != NO_ERROR) { 555e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Failed to read from parcel. Metadata is unchanged.", 556e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 557e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return res; 558e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 559e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 560e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin clear(); 561e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin mBuffer = buffer; 562e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 563e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return OK; 564e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 565e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 566e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel *parcel) const { 567e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 568e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: parcel = %p", __FUNCTION__, parcel); 569e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 570e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (parcel == NULL) { 571e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: parcel is null", __FUNCTION__); 572e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BAD_VALUE; 573e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 574e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 575e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return CameraMetadata::writeToParcel(*parcel, mBuffer); 576e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 577e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 578e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinvoid CameraMetadata::swap(CameraMetadata& other) { 579e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (mLocked) { 580e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 581e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return; 582e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else if (other.mLocked) { 583e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGE("%s: Other CameraMetadata is locked", __FUNCTION__); 584e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return; 585e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 586e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 587e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata* thisBuf = mBuffer; 588e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin camera_metadata* otherBuf = other.mBuffer; 589e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 590e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin other.mBuffer = thisBuf; 591e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin mBuffer = otherBuf; 592e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 593e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 594cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android 595