1cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala/*
2cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala *
4cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * you may not use this file except in compliance with the License.
6cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * You may obtain a copy of the License at
7cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala *
8cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala *
10cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * See the License for the specific language governing permissions and
14cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala * limitations under the License.
15cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala */
16cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
17e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin// #define LOG_NDEBUG 0
18e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
194bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Metadata"
20cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Log.h>
21cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include <utils/Errors.h>
22cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
237efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include <camera/CameraMetadata.h>
24e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <binder/Parcel.h>
25cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
26cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalanamespace android {
27cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::WritableBlob WritableBlob;
29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::ReadableBlob ReadableBlob;
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
31cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::CameraMetadata() :
323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mBuffer(NULL), mLocked(false) {
33cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
34cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
353b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
363b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mLocked(false)
37cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala{
38cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity);
39cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
40cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(const CameraMetadata &other) :
423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mLocked(false) {
43cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = clone_camera_metadata(other.mBuffer);
44cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
463b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville TalvalaCameraMetadata::CameraMetadata(camera_metadata_t *buffer) :
473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        mBuffer(NULL), mLocked(false) {
487efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin    acquire(buffer);
497efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin}
507efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin
51cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
52cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return operator=(other.mBuffer);
53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
54cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) {
563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
573b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Assignment to a locked CameraMetadata!", __FUNCTION__);
583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return *this;
593b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_LIKELY(buffer != mBuffer)) {
62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_t *newBuffer = clone_camera_metadata(buffer);
63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        clear();
64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = newBuffer;
65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return *this;
67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
68cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
69cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville TalvalaCameraMetadata::~CameraMetadata() {
703b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = false;
71cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    clear();
72cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
73cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
743b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalaconst camera_metadata_t* CameraMetadata::getAndLock() {
753b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = true;
763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return mBuffer;
773b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala}
783b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::unlock(const camera_metadata_t *buffer) {
803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (!mLocked) {
813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Can't unlock a non-locked CameraMetadata!", __FUNCTION__);
823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
833b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
843b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (buffer != mBuffer) {
853b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
863b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala                __FUNCTION__);
873b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return BAD_VALUE;
883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    mLocked = false;
903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return OK;
913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala}
923b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala
93cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_t* CameraMetadata::release() {
943b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
953b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
963b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return NULL;
973b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
98cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *released = mBuffer;
99cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = NULL;
100cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return released;
101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
102cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
103cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::clear() {
1043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1053b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1063b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1073b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
108cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mBuffer) {
109cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        free_camera_metadata(mBuffer);
110cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = NULL;
111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
113cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
114cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(camera_metadata_t *buffer) {
1153b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1173b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1183b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    clear();
120cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mBuffer = buffer;
121e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
122e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK,
123e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin             "%s: Failed to validate metadata structure %p",
124e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin             __FUNCTION__, buffer);
125cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
126cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
127cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::acquire(CameraMetadata &other) {
1283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return;
1313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
132cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    acquire(other.release());
133cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
134cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
135cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::append(const CameraMetadata &other) {
136fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return append(other.mBuffer);
137fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
138fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
139fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalastatus_t CameraMetadata::append(const camera_metadata_t* other) {
1403b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
144fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    size_t extraEntries = get_camera_metadata_entry_count(other);
145fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    size_t extraData = get_camera_metadata_data_count(other);
146fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    resizeIfNeeded(extraEntries, extraData);
147fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
148fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return append_camera_metadata(mBuffer, other);
149cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalasize_t CameraMetadata::entryCount() const {
152cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return (mBuffer == NULL) ? 0 :
153cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            get_camera_metadata_entry_count(mBuffer);
154cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CameraMetadata::isEmpty() const {
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return entryCount() == 0;
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
160cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::sort() {
1613b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1623b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1633b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1643b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
165cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return sort_camera_metadata(mBuffer);
166cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
167cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
168cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
169cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    int tagType = get_camera_metadata_tag_type(tag);
170cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( CC_UNLIKELY(tagType == -1)) {
171cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("Update metadata entry: Unknown tag %d", tag);
172cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return INVALID_OPERATION;
173cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
174cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( CC_UNLIKELY(tagType != expectedType) ) {
175cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
176cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                "got type %s data instead ",
177cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag,
178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                camera_metadata_type_names[tagType],
179cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                camera_metadata_type_names[expectedType]);
180cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return INVALID_OPERATION;
181cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
182cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return OK;
183cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
184cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
185cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
186cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *data, size_t data_count) {
187cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
1883b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
1893b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
1903b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
1913b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
192cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_INT32)) != OK) {
193cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
194cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
1953b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
196cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
197cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
199cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const uint8_t *data, size_t data_count) {
200cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2013b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2023b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2033b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2043b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
206cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
207cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2083b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
209cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
210cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const float *data, size_t data_count) {
213cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2143b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2153b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2163b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2173b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_FLOAT)) != OK) {
219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2213b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
222cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int64_t *data, size_t data_count) {
226cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2273b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2283b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2293b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_INT64)) != OK) {
232cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
235cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
237cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const double *data, size_t data_count) {
239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2403b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2413b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2423b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2433b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
244cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) {
245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
246cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2473b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
248cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
249cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
250cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const camera_metadata_rational_t *data, size_t data_count) {
252cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2533b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2543b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2553b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2563b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
257cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) {
258cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)data, data_count);
261cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
262cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
263cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::update(uint32_t tag,
264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const String8 &string) {
265cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2663b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2673b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2683b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2693b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
270cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
271cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
272cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
2733b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    return updateImpl(tag, (const void*)string.string(), string.size());
274cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
275cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
2763b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvalastatus_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
277cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t data_count) {
278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
2793b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
2803b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
2813b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
2823b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
283cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    int type = get_camera_metadata_tag_type(tag);
284cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (type == -1) {
285cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Tag %d not found", __FUNCTION__, tag);
286cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return BAD_VALUE;
287cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    size_t data_size = calculate_camera_metadata_entry_data_size(type,
289cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            data_count);
290cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
291cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = resizeIfNeeded(1, data_size);
292cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
293cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res == OK) {
294cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_entry_t entry;
295cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = find_camera_metadata_entry(mBuffer, tag, &entry);
296cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (res == NAME_NOT_FOUND) {
297cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = add_camera_metadata_entry(mBuffer,
298cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    tag, data, data_count);
299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        } else if (res == OK) {
300cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = update_camera_metadata_entry(mBuffer,
301cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    entry.index, data, data_count, NULL);
302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
303cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
304cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
305cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != OK) {
306cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
307cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
309cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
310e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
311e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    IF_ALOGV() {
312e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin        ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) !=
313e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 OK,
314e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
315e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 "%s: Failed to validate metadata structure after update %p",
316e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin                 __FUNCTION__, mBuffer);
317e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin    }
318e2d1e3d0436aec645739c65e6d3131dd814f40a1Igor Murashkin
319cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
321cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
322fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkinbool CameraMetadata::exists(uint32_t tag) const {
323fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin    camera_metadata_ro_entry entry;
324fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin    return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
325fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin}
326fc42642ab78da5fe25bcbea7a568bf880268a9dcIgor Murashkin
327cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
328cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
329cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_entry entry;
3303b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
3313b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
3323b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        entry.count = 0;
3333b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return entry;
3343b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
335cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_entry(mBuffer, tag, &entry);
336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
337cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.count = 0;
338cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.data.u8 = NULL;
339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return entry;
341cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
342cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalacamera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
344cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
345cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry entry;
346cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_ro_entry(mBuffer, tag, &entry);
347cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.count = 0;
349cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry.data.u8 = NULL;
350cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
351cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return entry;
352cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
353cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
354cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::erase(uint32_t tag) {
355cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_entry_t entry;
356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
3573b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    if (mLocked) {
3583b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
3593b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala        return INVALID_OPERATION;
3603b53bc9b41c262d22f094406e3751bc5a41ef2efEino-Ville Talvala    }
361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = find_camera_metadata_entry(mBuffer, tag, &entry);
362cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res == NAME_NOT_FOUND) {
363cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return OK;
364cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else if (res != OK) {
365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
366cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__,
367cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_section_name(tag),
368cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
369cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return res;
370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
371cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = delete_camera_metadata_entry(mBuffer, entry.index);
372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != OK) {
373cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
374cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                __FUNCTION__,
375cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_section_name(tag),
376cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
377cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
378cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
381cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalavoid CameraMetadata::dump(int fd, int verbosity, int indentation) const {
382cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation);
383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
384cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
385cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
386cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mBuffer == NULL) {
387cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2);
388cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (mBuffer == NULL) {
389cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
390cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            return NO_MEMORY;
391cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
392cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else {
393cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer);
394cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer);
395cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t newEntryCount = currentEntryCount +
396cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                extraEntries;
397cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        newEntryCount = (newEntryCount > currentEntryCap) ?
398cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newEntryCount * 2 : currentEntryCap;
399cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
400cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentDataCount = get_camera_metadata_data_count(mBuffer);
401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer);
402cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        size_t newDataCount = currentDataCount +
403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                extraData;
404cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        newDataCount = (newDataCount > currentDataCap) ?
405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newDataCount * 2 : currentDataCap;
406cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (newEntryCount > currentEntryCap ||
408cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                newDataCount > currentDataCap) {
409cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            camera_metadata_t *oldBuffer = mBuffer;
410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mBuffer = allocate_camera_metadata(newEntryCount,
411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    newDataCount);
412cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (mBuffer == NULL) {
413cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
414cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                return NO_MEMORY;
415cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            }
416cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            append_camera_metadata(mBuffer, oldBuffer);
417cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            free_camera_metadata(oldBuffer);
418cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
419cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
420cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return OK;
421cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
422cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(const Parcel& data,
424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                        camera_metadata_t** out) {
425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t err = OK;
427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata_t* metadata = NULL;
429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (out) {
431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        *out = NULL;
432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // arg0 = metadataSize (int32)
435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int32_t metadataSizeTmp = -1;
436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((err = data.readInt32(&metadataSizeTmp)) != OK) {
437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Failed to read metadata size (error %d %s)",
438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, err, strerror(-err));
439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return err;
440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const size_t metadataSize = static_cast<size_t>(metadataSizeTmp);
442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (metadataSize == 0) {
444e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Read 0-sized metadata", __FUNCTION__);
445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return OK;
446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // NOTE: this doesn't make sense to me. shouldnt the blob
449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // know how big it is? why do we have to specify the size
450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // to Parcel::readBlob ?
451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ReadableBlob blob;
453e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // arg1 = metadata (blob)
454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    do {
455e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if ((err = data.readBlob(metadataSize, &blob)) != OK) {
456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGE("%s: Failed to read metadata blob (sized %d). Possible "
457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  " serialization bug. Error %d %s",
458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  __FUNCTION__, metadataSize, err, strerror(-err));
459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
460e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
461e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const camera_metadata_t* tmp =
462e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                       reinterpret_cast<const camera_metadata_t*>(blob.data());
463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        metadata = allocate_copy_camera_metadata_checked(tmp, metadataSize);
465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (metadata == NULL) {
466e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // We consider that allocation only fails if the validation
467e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // also failed, therefore the readFromParcel was a failure.
468e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            err = BAD_VALUE;
469e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
470e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } while(0);
471e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    blob.release();
472e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
473e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (out) {
474e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Set out metadata to %p", __FUNCTION__, metadata);
475e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        *out = metadata;
476e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } else if (metadata != NULL) {
477e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Freed camera metadata at %p", __FUNCTION__, metadata);
478e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        free_camera_metadata(metadata);
479e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
480e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
481e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return err;
482e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
483e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
484e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel& data,
485e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                       const camera_metadata_t* metadata) {
486e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res = OK;
487e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
488e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // arg0 = metadataSize (int32)
489e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
490e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (metadata == NULL) {
491e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return data.writeInt32(0);
492e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
493e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
494e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const size_t metadataSize = get_camera_metadata_compact_size(metadata);
495e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = data.writeInt32(static_cast<int32_t>(metadataSize));
496e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res != OK) {
497e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
498e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
499e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
500e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // arg1 = metadata (blob)
501e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    WritableBlob blob;
502e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    do {
503e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        res = data.writeBlob(metadataSize, &blob);
504e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (res != OK) {
505e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
506e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
507e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        copy_camera_metadata(blob.data(), metadataSize, metadata);
508e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
509e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        IF_ALOGV() {
510e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            if (validate_camera_metadata_structure(
511e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                        (const camera_metadata_t*)blob.data(),
512e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                        &metadataSize) != OK) {
513e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: Failed to validate metadata %p after writing blob",
514e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                       __FUNCTION__, blob.data());
515e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            } else {
516e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: Metadata written to blob. Validation success",
517e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                        __FUNCTION__);
518e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
519e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
520e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
521e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // Not too big of a problem since receiving side does hard validation
522e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // Don't check the size since the compact size could be larger
523e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (validate_camera_metadata_structure(metadata, /*size*/NULL) != OK) {
524e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGW("%s: Failed to validate metadata %p before writing blob",
525e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                   __FUNCTION__, metadata);
526e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
527e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
528e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } while(false);
529e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    blob.release();
530e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
531e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
532e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
533e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
534e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::readFromParcel(Parcel *parcel) {
535e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
536e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
537e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
538e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res = OK;
539e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
540e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (parcel == NULL) {
541e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: parcel is null", __FUNCTION__);
542e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
543e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
544e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
545e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (mLocked) {
546e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
547e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return INVALID_OPERATION;
548e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
549e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
550e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata *buffer = NULL;
551e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: reading should return a status code, in case validation fails
552e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = CameraMetadata::readFromParcel(*parcel, &buffer);
553e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
554e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res != NO_ERROR) {
555e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Failed to read from parcel. Metadata is unchanged.",
556e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__);
557e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
558e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
559e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
560e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    clear();
561e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mBuffer = buffer;
562e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
563e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return OK;
564e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
565e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
566e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraMetadata::writeToParcel(Parcel *parcel) const {
567e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
568e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
569e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
570e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (parcel == NULL) {
571e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: parcel is null", __FUNCTION__);
572e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
573e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
574e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
575e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return CameraMetadata::writeToParcel(*parcel, mBuffer);
576e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
577e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
578e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinvoid CameraMetadata::swap(CameraMetadata& other) {
579e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (mLocked) {
580e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
581e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return;
582e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } else if (other.mLocked) {
583e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Other CameraMetadata is locked", __FUNCTION__);
584e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return;
585e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
586e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
587e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata* thisBuf = mBuffer;
588e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata* otherBuf = other.mBuffer;
589e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
590e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    other.mBuffer = thisBuf;
591e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mBuffer = otherBuf;
592e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
593e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
594cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}; // namespace android
595