CameraMetadata.cpp revision 3b53bc9b41c262d22f094406e3751bc5a41ef2ef
1cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala/* 2cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 4cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * you may not use this file except in compliance with the License. 6cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * You may obtain a copy of the License at 7cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 8cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * 10cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * See the License for the specific language governing permissions and 14cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * limitations under the License. 15cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala */ 16cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Metadata" 18cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Log.h> 19cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Errors.h> 20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 217efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include <camera/CameraMetadata.h> 22cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 23cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android { 24cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata() : 263b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mBuffer(NULL), mLocked(false) { 27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 28cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) : 303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked(false) 31cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{ 32cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity); 33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(const CameraMetadata &other) : 363b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked(false) { 37cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = clone_camera_metadata(other.mBuffer); 38cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 403b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(camera_metadata_t *buffer) : 413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mBuffer(NULL), mLocked(false) { 427efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin acquire(buffer); 437efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin} 447efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin 45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) { 46cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return operator=(other.mBuffer); 47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) { 503b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 513b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Assignment to a locked CameraMetadata!", __FUNCTION__); 523b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return *this; 533b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_LIKELY(buffer != mBuffer)) { 56cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *newBuffer = clone_camera_metadata(buffer); 57cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 58cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = newBuffer; 59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return *this; 61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() { 643b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = false; 65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 683b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalaconst camera_metadata_t* CameraMetadata::getAndLock() { 693b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = true; 703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return mBuffer; 713b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala} 723b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::unlock(const camera_metadata_t *buffer) { 743b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (!mLocked) { 753b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Can't unlock a non-locked CameraMetadata!", __FUNCTION__); 763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 783b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (buffer != mBuffer) { 793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: Can't unlock CameraMetadata with wrong pointer!", 803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala __FUNCTION__); 813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return BAD_VALUE; 823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala mLocked = false; 843b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return OK; 853b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala} 863b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala 87cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() { 883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return NULL; 913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 92cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *released = mBuffer; 93cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 94cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return released; 95cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 96cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 97cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() { 983b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 993b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1003b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1013b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer) { 103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(mBuffer); 104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = NULL; 105cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) { 1093b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1103b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1113b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1123b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 113cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala clear(); 114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = buffer; 115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 116cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 117cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) { 1183b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1193b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1203b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return; 1213b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 122cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala acquire(other.release()); 123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 124cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 125cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) { 1263b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1273b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 130cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return append_camera_metadata(mBuffer, other.mBuffer); 131cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 132cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const { 134cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return (mBuffer == NULL) ? 0 : 135cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_entry_count(mBuffer); 136cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const { 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return entryCount() == 0; 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 142cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() { 1433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1443b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1453b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1463b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 147cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return sort_camera_metadata(mBuffer); 148cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 149cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) { 151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int tagType = get_camera_metadata_tag_type(tag); 152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType == -1)) { 153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Update metadata entry: Unknown tag %d", tag); 154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 156cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( CC_UNLIKELY(tagType != expectedType) ) { 157cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; " 158cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala "got type %s data instead ", 159cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, 160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[tagType], 161cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_type_names[expectedType]); 162cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return INVALID_OPERATION; 163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 164cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int32_t *data, size_t data_count) { 169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1713b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1723b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT32)) != OK) { 175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 1773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const uint8_t *data, size_t data_count) { 182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1843b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1853b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1863b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 188cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 189cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 1903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const float *data, size_t data_count) { 195cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 1963b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 1973b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 1983b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 1993b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_FLOAT)) != OK) { 201cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 202cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 204cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const int64_t *data, size_t data_count) { 208cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2093b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2103b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2113b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2123b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 213cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_INT64)) != OK) { 214cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 217cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const double *data, size_t data_count) { 221cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2223b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2233b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2243b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2253b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) { 227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 230cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const camera_metadata_rational_t *data, size_t data_count) { 234cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2363b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2373b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2383b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) { 240cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 241cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)data, data_count); 243cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag, 246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala const String8 &string) { 247cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2483b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2493b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2503b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2513b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if ( (res = checkType(tag, TYPE_BYTE)) != OK) { 253cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 254cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 2553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return updateImpl(tag, (const void*)string.string(), string.size()); 256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 2583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::updateImpl(uint32_t tag, const void *data, 259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_count) { 260cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 2613b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 2623b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 2633b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 2643b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala int type = get_camera_metadata_tag_type(tag); 266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (type == -1) { 267cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Tag %d not found", __FUNCTION__, tag); 268cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return BAD_VALUE; 269cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t data_size = calculate_camera_metadata_entry_data_size(type, 271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala data_count); 272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 273cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = resizeIfNeeded(1, data_size); 274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == OK) { 276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 279cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = add_camera_metadata_entry(mBuffer, 280cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala tag, data, data_count); 281cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 282cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = update_camera_metadata_entry(mBuffer, 283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.index, data, data_count, NULL); 284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, get_camera_metadata_section_name(tag), 290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 295fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const { 296fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin camera_metadata_ro_entry entry; 297fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0; 298fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin} 299fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin 300cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) { 301cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry entry; 3033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3053b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala entry.count = 0; 3063b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return entry; 3073b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 309cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 310cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 312cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 313cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 314cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 315cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 316cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const { 317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 318cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_ro_entry entry; 319cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_ro_entry(mBuffer, tag, &entry); 320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (CC_UNLIKELY( res != OK )) { 321cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.count = 0; 322cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala entry.data.u8 = NULL; 323cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 324cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return entry; 325cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 326cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 327cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) { 328cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_entry_t entry; 329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 3303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala if (mLocked) { 3313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala ALOGE("%s: CameraMetadata is locked", __FUNCTION__); 3323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala return INVALID_OPERATION; 3333b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala } 334cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = find_camera_metadata_entry(mBuffer, tag, &entry); 335cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res == NAME_NOT_FOUND) { 336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 337cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res != OK) { 338cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 341cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 342cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 344cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = delete_camera_metadata_entry(mBuffer, entry.index); 345cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (res != OK) { 346cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 347cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala __FUNCTION__, 348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_section_name(tag), 349cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 350cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 351cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 352cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 353cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const { 355cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation); 356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 357cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 358cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { 359cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 360cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2); 361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 362cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 363cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else { 366cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer); 367cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer); 368cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newEntryCount = currentEntryCount + 369cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraEntries; 370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount = (newEntryCount > currentEntryCap) ? 371cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newEntryCount * 2 : currentEntryCap; 372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 373cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCount = get_camera_metadata_data_count(mBuffer); 374cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer); 375cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala size_t newDataCount = currentDataCount + 376cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala extraData; 377cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount = (newDataCount > currentDataCap) ? 378cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount * 2 : currentDataCap; 379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (newEntryCount > currentEntryCap || 381cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount > currentDataCap) { 382cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *oldBuffer = mBuffer; 383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala mBuffer = allocate_camera_metadata(newEntryCount, 384cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala newDataCount); 385cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (mBuffer == NULL) { 386cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); 387cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NO_MEMORY; 388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 389cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala append_camera_metadata(mBuffer, oldBuffer); 390cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala free_camera_metadata(oldBuffer); 391cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 392cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 393cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return OK; 394cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala} 395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala 396cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android 397