blob: f447c5b3e202db312aa0fd824ef6c0d253ef9f0e [file] [log] [blame]
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Igor Murashkine2d1e3d2013-04-30 18:18:06 -070017// #define LOG_NDEBUG 0
18
Eino-Ville Talvala4bb81182012-09-24 09:46:53 -070019#define LOG_TAG "Camera2-Metadata"
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070020#include <utils/Log.h>
21#include <utils/Errors.h>
22
Igor Murashkin7efa5202013-02-13 15:53:56 -080023#include <camera/CameraMetadata.h>
Igor Murashkine7ee7632013-06-11 18:10:18 -070024#include <binder/Parcel.h>
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070025
26namespace android {
27
Igor Murashkine7ee7632013-06-11 18:10:18 -070028typedef Parcel::WritableBlob WritableBlob;
29typedef Parcel::ReadableBlob ReadableBlob;
30
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070031CameraMetadata::CameraMetadata() :
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080032 mBuffer(NULL), mLocked(false) {
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070033}
34
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080035CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity) :
36 mLocked(false)
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070037{
38 mBuffer = allocate_camera_metadata(entryCapacity, dataCapacity);
39}
40
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080041CameraMetadata::CameraMetadata(const CameraMetadata &other) :
42 mLocked(false) {
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070043 mBuffer = clone_camera_metadata(other.mBuffer);
44}
45
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080046CameraMetadata::CameraMetadata(camera_metadata_t *buffer) :
47 mBuffer(NULL), mLocked(false) {
Igor Murashkin7efa5202013-02-13 15:53:56 -080048 acquire(buffer);
49}
50
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070051CameraMetadata &CameraMetadata::operator=(const CameraMetadata &other) {
52 return operator=(other.mBuffer);
53}
54
55CameraMetadata &CameraMetadata::operator=(const camera_metadata_t *buffer) {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080056 if (mLocked) {
57 ALOGE("%s: Assignment to a locked CameraMetadata!", __FUNCTION__);
58 return *this;
59 }
60
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070061 if (CC_LIKELY(buffer != mBuffer)) {
62 camera_metadata_t *newBuffer = clone_camera_metadata(buffer);
63 clear();
64 mBuffer = newBuffer;
65 }
66 return *this;
67}
68
69CameraMetadata::~CameraMetadata() {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080070 mLocked = false;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070071 clear();
72}
73
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080074const camera_metadata_t* CameraMetadata::getAndLock() {
75 mLocked = true;
76 return mBuffer;
77}
78
79status_t CameraMetadata::unlock(const camera_metadata_t *buffer) {
80 if (!mLocked) {
81 ALOGE("%s: Can't unlock a non-locked CameraMetadata!", __FUNCTION__);
82 return INVALID_OPERATION;
83 }
84 if (buffer != mBuffer) {
85 ALOGE("%s: Can't unlock CameraMetadata with wrong pointer!",
86 __FUNCTION__);
87 return BAD_VALUE;
88 }
89 mLocked = false;
90 return OK;
91}
92
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070093camera_metadata_t* CameraMetadata::release() {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -080094 if (mLocked) {
95 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
96 return NULL;
97 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -070098 camera_metadata_t *released = mBuffer;
99 mBuffer = NULL;
100 return released;
101}
102
103void CameraMetadata::clear() {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800104 if (mLocked) {
105 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
106 return;
107 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700108 if (mBuffer) {
109 free_camera_metadata(mBuffer);
110 mBuffer = NULL;
111 }
112}
113
114void CameraMetadata::acquire(camera_metadata_t *buffer) {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800115 if (mLocked) {
116 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
117 return;
118 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700119 clear();
120 mBuffer = buffer;
Igor Murashkine2d1e3d2013-04-30 18:18:06 -0700121
122 ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK,
123 "%s: Failed to validate metadata structure %p",
124 __FUNCTION__, buffer);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700125}
126
127void CameraMetadata::acquire(CameraMetadata &other) {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800128 if (mLocked) {
129 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
130 return;
131 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700132 acquire(other.release());
133}
134
135status_t CameraMetadata::append(const CameraMetadata &other) {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800136 if (mLocked) {
137 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
138 return INVALID_OPERATION;
139 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700140 return append_camera_metadata(mBuffer, other.mBuffer);
141}
142
143size_t CameraMetadata::entryCount() const {
144 return (mBuffer == NULL) ? 0 :
145 get_camera_metadata_entry_count(mBuffer);
146}
147
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700148bool CameraMetadata::isEmpty() const {
149 return entryCount() == 0;
150}
151
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700152status_t CameraMetadata::sort() {
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800153 if (mLocked) {
154 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
155 return INVALID_OPERATION;
156 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700157 return sort_camera_metadata(mBuffer);
158}
159
160status_t CameraMetadata::checkType(uint32_t tag, uint8_t expectedType) {
161 int tagType = get_camera_metadata_tag_type(tag);
162 if ( CC_UNLIKELY(tagType == -1)) {
163 ALOGE("Update metadata entry: Unknown tag %d", tag);
164 return INVALID_OPERATION;
165 }
166 if ( CC_UNLIKELY(tagType != expectedType) ) {
167 ALOGE("Mismatched tag type when updating entry %s (%d) of type %s; "
168 "got type %s data instead ",
169 get_camera_metadata_tag_name(tag), tag,
170 camera_metadata_type_names[tagType],
171 camera_metadata_type_names[expectedType]);
172 return INVALID_OPERATION;
173 }
174 return OK;
175}
176
177status_t CameraMetadata::update(uint32_t tag,
178 const int32_t *data, size_t data_count) {
179 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800180 if (mLocked) {
181 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
182 return INVALID_OPERATION;
183 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700184 if ( (res = checkType(tag, TYPE_INT32)) != OK) {
185 return res;
186 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800187 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700188}
189
190status_t CameraMetadata::update(uint32_t tag,
191 const uint8_t *data, size_t data_count) {
192 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800193 if (mLocked) {
194 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
195 return INVALID_OPERATION;
196 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700197 if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
198 return res;
199 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800200 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700201}
202
203status_t CameraMetadata::update(uint32_t tag,
204 const float *data, size_t data_count) {
205 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800206 if (mLocked) {
207 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
208 return INVALID_OPERATION;
209 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700210 if ( (res = checkType(tag, TYPE_FLOAT)) != OK) {
211 return res;
212 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800213 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700214}
215
216status_t CameraMetadata::update(uint32_t tag,
217 const int64_t *data, size_t data_count) {
218 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800219 if (mLocked) {
220 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
221 return INVALID_OPERATION;
222 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700223 if ( (res = checkType(tag, TYPE_INT64)) != OK) {
224 return res;
225 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800226 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700227}
228
229status_t CameraMetadata::update(uint32_t tag,
230 const double *data, size_t data_count) {
231 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800232 if (mLocked) {
233 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
234 return INVALID_OPERATION;
235 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700236 if ( (res = checkType(tag, TYPE_DOUBLE)) != OK) {
237 return res;
238 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800239 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700240}
241
242status_t CameraMetadata::update(uint32_t tag,
243 const camera_metadata_rational_t *data, size_t data_count) {
244 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800245 if (mLocked) {
246 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
247 return INVALID_OPERATION;
248 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700249 if ( (res = checkType(tag, TYPE_RATIONAL)) != OK) {
250 return res;
251 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800252 return updateImpl(tag, (const void*)data, data_count);
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700253}
254
255status_t CameraMetadata::update(uint32_t tag,
256 const String8 &string) {
257 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800258 if (mLocked) {
259 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
260 return INVALID_OPERATION;
261 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700262 if ( (res = checkType(tag, TYPE_BYTE)) != OK) {
263 return res;
264 }
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800265 return updateImpl(tag, (const void*)string.string(), string.size());
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700266}
267
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800268status_t CameraMetadata::updateImpl(uint32_t tag, const void *data,
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700269 size_t data_count) {
270 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800271 if (mLocked) {
272 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
273 return INVALID_OPERATION;
274 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700275 int type = get_camera_metadata_tag_type(tag);
276 if (type == -1) {
277 ALOGE("%s: Tag %d not found", __FUNCTION__, tag);
278 return BAD_VALUE;
279 }
280 size_t data_size = calculate_camera_metadata_entry_data_size(type,
281 data_count);
282
283 res = resizeIfNeeded(1, data_size);
284
285 if (res == OK) {
286 camera_metadata_entry_t entry;
287 res = find_camera_metadata_entry(mBuffer, tag, &entry);
288 if (res == NAME_NOT_FOUND) {
289 res = add_camera_metadata_entry(mBuffer,
290 tag, data, data_count);
291 } else if (res == OK) {
292 res = update_camera_metadata_entry(mBuffer,
293 entry.index, data, data_count, NULL);
294 }
295 }
296
297 if (res != OK) {
298 ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
299 __FUNCTION__, get_camera_metadata_section_name(tag),
300 get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
301 }
Igor Murashkine2d1e3d2013-04-30 18:18:06 -0700302
303 IF_ALOGV() {
304 ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) !=
305 OK,
306
307 "%s: Failed to validate metadata structure after update %p",
308 __FUNCTION__, mBuffer);
309 }
310
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700311 return res;
312}
313
Igor Murashkinfc426422013-02-13 18:23:39 -0800314bool CameraMetadata::exists(uint32_t tag) const {
315 camera_metadata_ro_entry entry;
316 return find_camera_metadata_ro_entry(mBuffer, tag, &entry) == 0;
317}
318
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700319camera_metadata_entry_t CameraMetadata::find(uint32_t tag) {
320 status_t res;
321 camera_metadata_entry entry;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800322 if (mLocked) {
323 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
324 entry.count = 0;
325 return entry;
326 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700327 res = find_camera_metadata_entry(mBuffer, tag, &entry);
328 if (CC_UNLIKELY( res != OK )) {
329 entry.count = 0;
330 entry.data.u8 = NULL;
331 }
332 return entry;
333}
334
335camera_metadata_ro_entry_t CameraMetadata::find(uint32_t tag) const {
336 status_t res;
337 camera_metadata_ro_entry entry;
338 res = find_camera_metadata_ro_entry(mBuffer, tag, &entry);
339 if (CC_UNLIKELY( res != OK )) {
340 entry.count = 0;
341 entry.data.u8 = NULL;
342 }
343 return entry;
344}
345
346status_t CameraMetadata::erase(uint32_t tag) {
347 camera_metadata_entry_t entry;
348 status_t res;
Eino-Ville Talvala3b53bc92013-02-27 18:02:26 -0800349 if (mLocked) {
350 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
351 return INVALID_OPERATION;
352 }
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700353 res = find_camera_metadata_entry(mBuffer, tag, &entry);
354 if (res == NAME_NOT_FOUND) {
355 return OK;
356 } else if (res != OK) {
357 ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
358 __FUNCTION__,
359 get_camera_metadata_section_name(tag),
360 get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
361 return res;
362 }
363 res = delete_camera_metadata_entry(mBuffer, entry.index);
364 if (res != OK) {
365 ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
366 __FUNCTION__,
367 get_camera_metadata_section_name(tag),
368 get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
369 }
370 return res;
371}
372
373void CameraMetadata::dump(int fd, int verbosity, int indentation) const {
374 dump_indented_camera_metadata(mBuffer, fd, verbosity, indentation);
375}
376
377status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) {
378 if (mBuffer == NULL) {
379 mBuffer = allocate_camera_metadata(extraEntries * 2, extraData * 2);
380 if (mBuffer == NULL) {
381 ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
382 return NO_MEMORY;
383 }
384 } else {
385 size_t currentEntryCount = get_camera_metadata_entry_count(mBuffer);
386 size_t currentEntryCap = get_camera_metadata_entry_capacity(mBuffer);
387 size_t newEntryCount = currentEntryCount +
388 extraEntries;
389 newEntryCount = (newEntryCount > currentEntryCap) ?
390 newEntryCount * 2 : currentEntryCap;
391
392 size_t currentDataCount = get_camera_metadata_data_count(mBuffer);
393 size_t currentDataCap = get_camera_metadata_data_capacity(mBuffer);
394 size_t newDataCount = currentDataCount +
395 extraData;
396 newDataCount = (newDataCount > currentDataCap) ?
397 newDataCount * 2 : currentDataCap;
398
399 if (newEntryCount > currentEntryCap ||
400 newDataCount > currentDataCap) {
401 camera_metadata_t *oldBuffer = mBuffer;
402 mBuffer = allocate_camera_metadata(newEntryCount,
403 newDataCount);
404 if (mBuffer == NULL) {
405 ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__);
406 return NO_MEMORY;
407 }
408 append_camera_metadata(mBuffer, oldBuffer);
409 free_camera_metadata(oldBuffer);
410 }
411 }
412 return OK;
413}
414
Igor Murashkine7ee7632013-06-11 18:10:18 -0700415status_t CameraMetadata::readFromParcel(const Parcel& data,
416 camera_metadata_t** out) {
417
418 status_t err = OK;
419
420 camera_metadata_t* metadata = NULL;
421
422 if (out) {
423 *out = NULL;
424 }
425
426 // arg0 = metadataSize (int32)
427 int32_t metadataSizeTmp = -1;
428 if ((err = data.readInt32(&metadataSizeTmp)) != OK) {
429 ALOGE("%s: Failed to read metadata size (error %d %s)",
430 __FUNCTION__, err, strerror(-err));
431 return err;
432 }
433 const size_t metadataSize = static_cast<size_t>(metadataSizeTmp);
434
435 if (metadataSize == 0) {
436 ALOGV("%s: Read 0-sized metadata", __FUNCTION__);
437 return OK;
438 }
439
440 // NOTE: this doesn't make sense to me. shouldnt the blob
441 // know how big it is? why do we have to specify the size
442 // to Parcel::readBlob ?
443
444 ReadableBlob blob;
445 // arg1 = metadata (blob)
446 do {
447 if ((err = data.readBlob(metadataSize, &blob)) != OK) {
448 ALOGE("%s: Failed to read metadata blob (sized %d). Possible "
449 " serialization bug. Error %d %s",
450 __FUNCTION__, metadataSize, err, strerror(-err));
451 break;
452 }
453 const camera_metadata_t* tmp =
454 reinterpret_cast<const camera_metadata_t*>(blob.data());
455
456 metadata = allocate_copy_camera_metadata_checked(tmp, metadataSize);
457 if (metadata == NULL) {
458 // We consider that allocation only fails if the validation
459 // also failed, therefore the readFromParcel was a failure.
460 err = BAD_VALUE;
461 }
462 } while(0);
463 blob.release();
464
465 if (out) {
466 ALOGV("%s: Set out metadata to %p", __FUNCTION__, metadata);
467 *out = metadata;
468 } else if (metadata != NULL) {
469 ALOGV("%s: Freed camera metadata at %p", __FUNCTION__, metadata);
470 free_camera_metadata(metadata);
471 }
472
473 return err;
474}
475
476status_t CameraMetadata::writeToParcel(Parcel& data,
477 const camera_metadata_t* metadata) {
478 status_t res = OK;
479
480 // arg0 = metadataSize (int32)
481
482 if (metadata == NULL) {
483 return data.writeInt32(0);
484 }
485
486 const size_t metadataSize = get_camera_metadata_compact_size(metadata);
487 res = data.writeInt32(static_cast<int32_t>(metadataSize));
488 if (res != OK) {
489 return res;
490 }
491
492 // arg1 = metadata (blob)
493 WritableBlob blob;
494 do {
495 res = data.writeBlob(metadataSize, &blob);
496 if (res != OK) {
497 break;
498 }
499 copy_camera_metadata(blob.data(), metadataSize, metadata);
500
501 IF_ALOGV() {
502 if (validate_camera_metadata_structure(
503 (const camera_metadata_t*)blob.data(),
504 &metadataSize) != OK) {
505 ALOGV("%s: Failed to validate metadata %p after writing blob",
506 __FUNCTION__, blob.data());
507 } else {
508 ALOGV("%s: Metadata written to blob. Validation success",
509 __FUNCTION__);
510 }
511 }
512
513 // Not too big of a problem since receiving side does hard validation
514 // Don't check the size since the compact size could be larger
515 if (validate_camera_metadata_structure(metadata, /*size*/NULL) != OK) {
516 ALOGW("%s: Failed to validate metadata %p before writing blob",
517 __FUNCTION__, metadata);
518 }
519
520 } while(false);
521 blob.release();
522
523 return res;
524}
525
526status_t CameraMetadata::readFromParcel(Parcel *parcel) {
527
528 ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
529
530 status_t res = OK;
531
532 if (parcel == NULL) {
533 ALOGE("%s: parcel is null", __FUNCTION__);
534 return BAD_VALUE;
535 }
536
537 if (mLocked) {
538 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
539 return INVALID_OPERATION;
540 }
541
542 camera_metadata *buffer = NULL;
543 // TODO: reading should return a status code, in case validation fails
544 res = CameraMetadata::readFromParcel(*parcel, &buffer);
545
546 if (res != NO_ERROR) {
547 ALOGE("%s: Failed to read from parcel. Metadata is unchanged.",
548 __FUNCTION__);
549 return res;
550 }
551
552 clear();
553 mBuffer = buffer;
554
555 return OK;
556}
557
558status_t CameraMetadata::writeToParcel(Parcel *parcel) const {
559
560 ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
561
562 if (parcel == NULL) {
563 ALOGE("%s: parcel is null", __FUNCTION__);
564 return BAD_VALUE;
565 }
566
567 return CameraMetadata::writeToParcel(*parcel, mBuffer);
568}
569
570void CameraMetadata::swap(CameraMetadata& other) {
571 if (mLocked) {
572 ALOGE("%s: CameraMetadata is locked", __FUNCTION__);
573 return;
574 } else if (other.mLocked) {
575 ALOGE("%s: Other CameraMetadata is locked", __FUNCTION__);
576 return;
577 }
578
579 camera_metadata* thisBuf = mBuffer;
580 camera_metadata* otherBuf = other.mBuffer;
581
582 other.mBuffer = thisBuf;
583 mBuffer = otherBuf;
584}
585
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700586}; // namespace android