CameraMetadata.cpp revision e2d1e3d0436aec645739c65e6d3131dd814f40a1
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>
24cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android {
26cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata() :
283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mBuffer(NULL), mLocked(false) {
29cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
30cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mLocked(false)
33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{
34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity);
35cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
36cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
373b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(const CameraMetadata &other) :
383b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mLocked(false) {
39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = clone_camera_metadata(other.mBuffer);
40cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
41cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(camera_metadata_t *buffer) :
433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mBuffer(NULL), mLocked(false) {
447efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin    acquire(buffer);
457efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin}
467efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin
47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return operator=(other.mBuffer);
49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
50cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) {
523b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
533b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Assignment to a locked CameraMetadata!", __FUNCTION__);
543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return *this;
553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
57cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_LIKELY(buffer != mBuffer)) {
58cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_t *newBuffer = clone_camera_metadata(buffer);
59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        clear();
60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = newBuffer;
61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return *this;
63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() {
663b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = false;
67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    clear();
68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalaconst camera_metadata_t* CameraMetadata::getAndLock() {
713b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = true;
723b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return mBuffer;
733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala}
743b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
753b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::unlock(const camera_metadata_t *buffer) {
763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (!mLocked) {
773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Can't unlock a non-locked CameraMetadata!", __FUNCTION__);
783b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (buffer != mBuffer) {
813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala                __FUNCTION__);
833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return BAD_VALUE;
843b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
853b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = false;
863b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return OK;
873b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala}
883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
89cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() {
903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
923b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return NULL;
933b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
94cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *released = mBuffer;
95cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = NULL;
96cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return released;
97cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() {
1003b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1013b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1023b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mBuffer) {
105cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        free_camera_metadata(mBuffer);
106cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = NULL;
107cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
109cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) {
1113b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1123b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1133b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1143b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    clear();
116cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = buffer;
117e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
118e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK,
119e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin             "%s: Failed to validate metadata structure %p",
120e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin             __FUNCTION__, buffer);
121cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
122cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) {
1243b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1253b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1263b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1273b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
128cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    acquire(other.release());
129cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
130cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
131cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) {
1323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1333b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
136cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return append_camera_metadata(mBuffer, other.mBuffer);
137cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
138cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
139cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const {
140cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return (mBuffer == NULL) ? 0 :
141cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            get_camera_metadata_entry_count(mBuffer);
142cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
143cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const {
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return entryCount() == 0;
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
148cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() {
1493b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1503b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1513b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1523b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return sort_camera_metadata(mBuffer);
154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
156cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
157cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    int tagType = get_camera_metadata_tag_type(tag);
158cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( CC_UNLIKELY(tagType == -1)) {
159cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("Update metadata entry: Unknown tag %d", tag);
160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return INVALID_OPERATION;
161cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
162cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( CC_UNLIKELY(tagType != expectedType) ) {
163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
164cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                "got type %s data instead ",
165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag,
166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                camera_metadata_type_names[tagType],
167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                camera_metadata_type_names[expectedType]);
168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return INVALID_OPERATION;
169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return OK;
171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *data, size_t data_count) {
175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
1763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1783b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_INT32)) != OK) {
181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
1833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const uint8_t *data, size_t data_count) {
188cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
1893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1923b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
195cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
1963b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const float *data, size_t data_count) {
201cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2023b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2053b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_FLOAT)) != OK) {
207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
208cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2093b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
213cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int64_t *data, size_t data_count) {
214cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2153b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2173b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2183b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_INT64)) != OK) {
220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
221cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2223b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const double *data, size_t data_count) {
227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) {
233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
234cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const camera_metadata_rational_t *data, size_t data_count) {
240cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2443b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) {
246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
247cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2483b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const String8 &string) {
253cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2573b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
258cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
260cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2613b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)string.string(), string.size());
262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
2643b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t data_count) {
266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2673b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2683b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2693b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    int type = get_camera_metadata_tag_type(tag);
272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (type == -1) {
273cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Tag %d not found", __FUNCTION__, tag);
274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return BAD_VALUE;
275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    size_t data_size = calculate_camera_metadata_entry_data_size(type,
277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            data_count);
278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
279cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = resizeIfNeeded(1, data_size);
280cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
281cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res == OK) {
282cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_entry_t entry;
283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = find_camera_metadata_entry(mBuffer, tag, &entry);
284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (res == NAME_NOT_FOUND) {
285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = add_camera_metadata_entry(mBuffer,
286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    tag, data, data_count);
287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        } else if (res == OK) {
288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = update_camera_metadata_entry(mBuffer,
289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    entry.index, data, data_count, NULL);
290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != OK) {
294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
296cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
298e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
299e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    IF_ALOGV() {
300e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin        ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) !=
301e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 OK,
302e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
303e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 "%s: Failed to validate metadata structure after update %p",
304e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 __FUNCTION__, mBuffer);
305e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    }
306e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
307cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
309cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
310fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const {
311fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin    camera_metadata_ro_entry entry;
312fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin    return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
313fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin}
314fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin
315cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
316cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_entry entry;
3183b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
3193b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
3203b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        entry.count = 0;
3213b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return entry;
3223b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
323cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_entry(mBuffer, tag, &entry);
324cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
325cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.count = 0;
326cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.data.u8 = NULL;
327cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
328cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return entry;
329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
330cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
331cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
332cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
333cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry entry;
334cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_ro_entry(mBuffer, tag, &entry);
335cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.count = 0;
337cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.data.u8 = NULL;
338cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return entry;
340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
341cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
342cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) {
343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_entry_t entry;
344cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
3453b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
3463b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
3473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
3483b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
349cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_entry(mBuffer, tag, &entry);
350cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res == NAME_NOT_FOUND) {
351cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return OK;
352cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else if (res != OK) {
353cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__,
355cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_section_name(tag),
356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
357cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
358cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
359cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = delete_camera_metadata_entry(mBuffer, entry.index);
360cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != OK) {
361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
362cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__,
363cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_section_name(tag),
364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
366cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
367cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
368cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
369cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const {
370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation);
371cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
373cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
374cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mBuffer == NULL) {
375cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2);
376cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (mBuffer == NULL) {
377cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
378cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            return NO_MEMORY;
379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else {
381cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer);
382cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer);
383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t newEntryCount = currentEntryCount +
384cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                extraEntries;
385cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        newEntryCount = (newEntryCount > currentEntryCap) ?
386cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newEntryCount * 2 : currentEntryCap;
387cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentDataCount = get_camera_metadata_data_count(mBuffer);
389cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer);
390cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t newDataCount = currentDataCount +
391cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                extraData;
392cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        newDataCount = (newDataCount > currentDataCap) ?
393cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newDataCount * 2 : currentDataCap;
394cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (newEntryCount > currentEntryCap ||
396cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newDataCount > currentDataCap) {
397cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            camera_metadata_t *oldBuffer = mBuffer;
398cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mBuffer = allocate_camera_metadata(newEntryCount,
399cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    newDataCount);
400cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (mBuffer == NULL) {
401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
402cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                return NO_MEMORY;
403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            }
404cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            append_camera_metadata(mBuffer, oldBuffer);
405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            free_camera_metadata(oldBuffer);
406cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
408cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return OK;
409cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android
412