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