Home | History | Annotate | Download | only in tests
      1 /*
      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 
     17 #define LOG_NDEBUG 1
     18 #define LOG_TAG "camera_metadata_tests"
     19 
     20 #include <errno.h>
     21 
     22 #include <vector>
     23 #include <algorithm>
     24 
     25 #include <gtest/gtest.h>
     26 #include <log/log.h>
     27 
     28 #include "system/camera_metadata.h"
     29 #include "camera_metadata_hidden.h"
     30 
     31 #include "camera_metadata_tests_fake_vendor.h"
     32 
     33 #define EXPECT_NULL(x)     EXPECT_EQ((void*)0, x)
     34 #define EXPECT_NOT_NULL(x) EXPECT_NE((void*)0, x)
     35 #define ARRAY_SIZE(a)      (sizeof(a) / sizeof((a)[0]))
     36 
     37 #define OK    0
     38 #define ERROR 1
     39 #define NOT_FOUND (-ENOENT)
     40 
     41 #define _Alignas(T) \
     42     ({struct _AlignasStruct { char c; T field; };       \
     43         offsetof(struct _AlignasStruct, field); })
     44 
     45 #define FINISH_USING_CAMERA_METADATA(m)                         \
     46     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL)); \
     47     free_camera_metadata(m);                                    \
     48 
     49 TEST(camera_metadata, allocate_normal) {
     50     camera_metadata_t *m = NULL;
     51     const size_t entry_capacity = 5;
     52     const size_t data_capacity = 32;
     53 
     54     m = allocate_camera_metadata(entry_capacity, data_capacity);
     55 
     56     EXPECT_NOT_NULL(m);
     57     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
     58     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
     59     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
     60     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
     61 
     62     FINISH_USING_CAMERA_METADATA(m);
     63 }
     64 
     65 TEST(camera_metadata, allocate_nodata) {
     66     camera_metadata_t *m = NULL;
     67 
     68     m = allocate_camera_metadata(1, 0);
     69 
     70     EXPECT_NOT_NULL(m);
     71     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
     72     EXPECT_EQ((size_t)1, get_camera_metadata_entry_capacity(m));
     73     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
     74     EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
     75 
     76     FINISH_USING_CAMERA_METADATA(m);
     77 }
     78 
     79 TEST(camera_metadata, clone_nodata) {
     80     camera_metadata_t *src = NULL;
     81     camera_metadata_t *copy = NULL;
     82 
     83     src = allocate_camera_metadata(10, 0);
     84 
     85     ASSERT_NE((void*)NULL, (void*)src);
     86     copy = clone_camera_metadata(src);
     87     ASSERT_NE((void*)NULL, (void*)copy);
     88     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(copy));
     89     EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(copy));
     90     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(copy));
     91     EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(copy));
     92 
     93     FINISH_USING_CAMERA_METADATA(src);
     94     FINISH_USING_CAMERA_METADATA(copy);
     95 }
     96 
     97 TEST(camera_metadata, allocate_nothing) {
     98     camera_metadata_t *m = NULL;
     99 
    100     m = allocate_camera_metadata(0, 0);
    101 
    102     ASSERT_NE((void*)NULL, (void*)m);
    103     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
    104     EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(m));
    105     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
    106     EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
    107 }
    108 
    109 TEST(camera_metadata, place_normal) {
    110     camera_metadata_t *m = NULL;
    111     void *buf = NULL;
    112 
    113     const size_t entry_capacity = 5;
    114     const size_t data_capacity = 32;
    115 
    116     size_t buf_size = calculate_camera_metadata_size(entry_capacity,
    117             data_capacity);
    118 
    119     EXPECT_TRUE(buf_size > 0);
    120 
    121     buf = malloc(buf_size);
    122 
    123     EXPECT_NOT_NULL(buf);
    124 
    125     m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
    126 
    127     EXPECT_EQ(buf, (uint8_t*)m);
    128     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
    129     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
    130     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
    131     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
    132 
    133     EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
    134 
    135     free(buf);
    136 }
    137 
    138 TEST(camera_metadata, place_nospace) {
    139     camera_metadata_t *m = NULL;
    140     void *buf = NULL;
    141 
    142     const size_t entry_capacity = 5;
    143     const size_t data_capacity = 32;
    144 
    145     size_t buf_size = calculate_camera_metadata_size(entry_capacity,
    146             data_capacity);
    147 
    148     EXPECT_GT(buf_size, (size_t)0);
    149 
    150     buf_size--;
    151 
    152     buf = malloc(buf_size);
    153 
    154     EXPECT_NOT_NULL(buf);
    155 
    156     m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
    157 
    158     EXPECT_NULL(m);
    159 
    160     free(buf);
    161 }
    162 
    163 TEST(camera_metadata, place_extraspace) {
    164     camera_metadata_t *m = NULL;
    165     uint8_t *buf = NULL;
    166 
    167     const size_t entry_capacity = 5;
    168     const size_t data_capacity = 32;
    169     const size_t extra_space = 10;
    170 
    171     size_t buf_size = calculate_camera_metadata_size(entry_capacity,
    172             data_capacity);
    173 
    174     EXPECT_GT(buf_size, (size_t)0);
    175 
    176     buf_size += extra_space;
    177 
    178     buf = (uint8_t*)malloc(buf_size);
    179 
    180     EXPECT_NOT_NULL(buf);
    181 
    182     m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
    183 
    184     EXPECT_EQ((uint8_t*)m, buf);
    185     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
    186     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
    187     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
    188     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
    189     EXPECT_EQ(buf + buf_size - extra_space, (uint8_t*)m + get_camera_metadata_size(m));
    190 
    191     EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
    192 
    193     free(buf);
    194 }
    195 
    196 TEST(camera_metadata, get_size) {
    197     camera_metadata_t *m = NULL;
    198     const size_t entry_capacity = 5;
    199     const size_t data_capacity = 32;
    200 
    201     m = allocate_camera_metadata(entry_capacity, data_capacity);
    202 
    203     EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
    204             get_camera_metadata_size(m) );
    205 
    206     EXPECT_EQ(calculate_camera_metadata_size(0,0),
    207             get_camera_metadata_compact_size(m) );
    208 
    209     FINISH_USING_CAMERA_METADATA(m);
    210 }
    211 
    212 TEST(camera_metadata, add_get_normal) {
    213     camera_metadata_t *m = NULL;
    214     const size_t entry_capacity = 5;
    215     const size_t data_capacity = 128;
    216 
    217     m = allocate_camera_metadata(entry_capacity, data_capacity);
    218 
    219     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    220 
    221     int result;
    222     size_t data_used = 0;
    223     size_t entries_used = 0;
    224 
    225     // INT64
    226 
    227     int64_t exposure_time = 1000000000;
    228     result = add_camera_metadata_entry(m,
    229             ANDROID_SENSOR_EXPOSURE_TIME,
    230             &exposure_time, 1);
    231     EXPECT_EQ(OK, result);
    232     data_used += calculate_camera_metadata_entry_data_size(
    233             get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
    234     entries_used++;
    235 
    236     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    237 
    238     // INT32
    239 
    240     int32_t sensitivity = 800;
    241     result = add_camera_metadata_entry(m,
    242             ANDROID_SENSOR_SENSITIVITY,
    243             &sensitivity, 1);
    244     EXPECT_EQ(OK, result);
    245     data_used += calculate_camera_metadata_entry_data_size(
    246             get_camera_metadata_tag_type(ANDROID_SENSOR_SENSITIVITY), 1);
    247     entries_used++;
    248 
    249     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    250 
    251     // FLOAT
    252 
    253     float focusDistance = 0.5f;
    254     result = add_camera_metadata_entry(m,
    255             ANDROID_LENS_FOCUS_DISTANCE,
    256             &focusDistance, 1);
    257     EXPECT_EQ(OK, result);
    258     data_used += calculate_camera_metadata_entry_data_size(
    259             get_camera_metadata_tag_type(ANDROID_LENS_FOCUS_DISTANCE), 1);
    260     entries_used++;
    261 
    262     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    263 
    264     // Array of FLOAT
    265 
    266     float colorCorrectionGains[] = {1.69f,  1.00f,  1.00f,  2.41f};
    267     result = add_camera_metadata_entry(m,
    268             ANDROID_COLOR_CORRECTION_GAINS,
    269             colorCorrectionGains, ARRAY_SIZE(colorCorrectionGains));
    270     EXPECT_EQ(OK, result);
    271     data_used += calculate_camera_metadata_entry_data_size(
    272            get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_GAINS),
    273            ARRAY_SIZE(colorCorrectionGains));
    274     entries_used++;
    275 
    276     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    277 
    278 
    279     // Array of RATIONAL
    280 
    281     camera_metadata_rational_t colorTransform[] = {
    282         {9, 10}, {0, 1}, {0, 1},
    283         {1, 5}, {1, 2}, {0, 1},
    284         {0, 1}, {1, 10}, {7, 10}
    285     };
    286     result = add_camera_metadata_entry(m,
    287             ANDROID_COLOR_CORRECTION_TRANSFORM,
    288             colorTransform, ARRAY_SIZE(colorTransform));
    289     EXPECT_EQ(OK, result);
    290     data_used += calculate_camera_metadata_entry_data_size(
    291            get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_TRANSFORM),
    292            ARRAY_SIZE(colorTransform));
    293     entries_used++;
    294 
    295     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    296 
    297     // Check added entries
    298 
    299     size_t index = 0;
    300     camera_metadata_entry entry;
    301 
    302     result = get_camera_metadata_entry(m,
    303             index, &entry);
    304     EXPECT_EQ(OK, result);
    305     EXPECT_EQ(index, entry.index);
    306     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
    307     EXPECT_EQ(TYPE_INT64, entry.type);
    308     EXPECT_EQ((size_t)1, entry.count);
    309     EXPECT_EQ(exposure_time, *entry.data.i64);
    310     index++;
    311 
    312     result = get_camera_metadata_entry(m,
    313             index, &entry);
    314     EXPECT_EQ(OK, result);
    315     EXPECT_EQ(index, entry.index);
    316     EXPECT_EQ(ANDROID_SENSOR_SENSITIVITY, entry.tag);
    317     EXPECT_EQ(TYPE_INT32, entry.type);
    318     EXPECT_EQ((size_t)1, entry.count);
    319     EXPECT_EQ(sensitivity, *entry.data.i32);
    320     index++;
    321 
    322     result = get_camera_metadata_entry(m,
    323             index, &entry);
    324     EXPECT_EQ(OK, result);
    325     EXPECT_EQ(index, entry.index);
    326     EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
    327     EXPECT_EQ(TYPE_FLOAT, entry.type);
    328     EXPECT_EQ((size_t)1, entry.count);
    329     EXPECT_EQ(focusDistance, *entry.data.f);
    330     index++;
    331 
    332     result = get_camera_metadata_entry(m,
    333             index, &entry);
    334     EXPECT_EQ(OK, result);
    335     EXPECT_EQ(index, entry.index);
    336     EXPECT_EQ(ANDROID_COLOR_CORRECTION_GAINS, entry.tag);
    337     EXPECT_EQ(TYPE_FLOAT, entry.type);
    338     EXPECT_EQ(ARRAY_SIZE(colorCorrectionGains), entry.count);
    339     for (unsigned int i=0; i < entry.count; i++) {
    340         EXPECT_EQ(colorCorrectionGains[i], entry.data.f[i]);
    341     }
    342     index++;
    343 
    344     result = get_camera_metadata_entry(m,
    345             index, &entry);
    346     EXPECT_EQ(OK, result);
    347     EXPECT_EQ(index, entry.index);
    348     EXPECT_EQ(ANDROID_COLOR_CORRECTION_TRANSFORM, entry.tag);
    349     EXPECT_EQ(TYPE_RATIONAL, entry.type);
    350     EXPECT_EQ(ARRAY_SIZE(colorTransform), entry.count);
    351     for (unsigned int i=0; i < entry.count; i++) {
    352         EXPECT_EQ(colorTransform[i].numerator, entry.data.r[i].numerator);
    353         EXPECT_EQ(colorTransform[i].denominator, entry.data.r[i].denominator);
    354     }
    355     index++;
    356 
    357     EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
    358             get_camera_metadata_size(m) );
    359 
    360     EXPECT_EQ(calculate_camera_metadata_size(entries_used, data_used),
    361             get_camera_metadata_compact_size(m) );
    362 
    363     IF_ALOGV() {
    364         dump_camera_metadata(m, 0, 2);
    365     }
    366 
    367     FINISH_USING_CAMERA_METADATA(m);
    368 }
    369 
    370 void add_test_metadata(camera_metadata_t *m, int entry_count) {
    371 
    372     EXPECT_NOT_NULL(m);
    373 
    374     int result;
    375     size_t data_used = 0;
    376     size_t entries_used = 0;
    377     int64_t exposure_time;
    378     for (int i=0; i < entry_count; i++ ) {
    379         exposure_time = 100 + i * 100;
    380         result = add_camera_metadata_entry(m,
    381                 ANDROID_SENSOR_EXPOSURE_TIME,
    382                 &exposure_time, 1);
    383         EXPECT_EQ(OK, result);
    384         data_used += calculate_camera_metadata_entry_data_size(
    385                 get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
    386         entries_used++;
    387     }
    388     EXPECT_EQ(data_used, get_camera_metadata_data_count(m));
    389     EXPECT_EQ(entries_used, get_camera_metadata_entry_count(m));
    390     EXPECT_GE(get_camera_metadata_data_capacity(m),
    391             get_camera_metadata_data_count(m));
    392 }
    393 
    394 TEST(camera_metadata, add_get_toomany) {
    395     camera_metadata_t *m = NULL;
    396     const size_t entry_capacity = 5;
    397     const size_t data_capacity = 50;
    398     int result;
    399 
    400     m = allocate_camera_metadata(entry_capacity, data_capacity);
    401 
    402     add_test_metadata(m, entry_capacity);
    403 
    404     int32_t sensitivity = 100;
    405     result = add_camera_metadata_entry(m,
    406             ANDROID_SENSOR_SENSITIVITY,
    407             &sensitivity, 1);
    408 
    409     EXPECT_EQ(ERROR, result);
    410 
    411     camera_metadata_entry entry;
    412     for (unsigned int i=0; i < entry_capacity; i++) {
    413         int64_t exposure_time = 100 + i * 100;
    414         result = get_camera_metadata_entry(m,
    415                 i, &entry);
    416         EXPECT_EQ(OK, result);
    417         EXPECT_EQ(i, entry.index);
    418         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
    419         EXPECT_EQ(TYPE_INT64, entry.type);
    420         EXPECT_EQ((size_t)1, entry.count);
    421         EXPECT_EQ(exposure_time, *entry.data.i64);
    422     }
    423     entry.tag = 1234;
    424     entry.type = 56;
    425     entry.data.u8 = NULL;
    426     entry.count = 7890;
    427     result = get_camera_metadata_entry(m,
    428             entry_capacity, &entry);
    429     EXPECT_EQ(ERROR, result);
    430     EXPECT_EQ((uint32_t)1234, entry.tag);
    431     EXPECT_EQ((uint8_t)56, entry.type);
    432     EXPECT_EQ(NULL, entry.data.u8);
    433     EXPECT_EQ((size_t)7890, entry.count);
    434 
    435     IF_ALOGV() {
    436         dump_camera_metadata(m, 0, 2);
    437     }
    438 
    439     FINISH_USING_CAMERA_METADATA(m);
    440 }
    441 
    442 TEST(camera_metadata, add_too_much_data) {
    443     camera_metadata_t *m = NULL;
    444     const size_t entry_capacity = 5;
    445     int result;
    446     size_t data_used = entry_capacity * calculate_camera_metadata_entry_data_size(
    447         get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
    448     m = allocate_camera_metadata(entry_capacity + 1, data_used);
    449 
    450 
    451     add_test_metadata(m, entry_capacity);
    452 
    453     int64_t exposure_time = 12345;
    454     result = add_camera_metadata_entry(m,
    455             ANDROID_SENSOR_EXPOSURE_TIME,
    456             &exposure_time, 1);
    457     EXPECT_EQ(ERROR, result);
    458 
    459     FINISH_USING_CAMERA_METADATA(m);
    460 }
    461 
    462 TEST(camera_metadata, copy_metadata) {
    463     camera_metadata_t *m = NULL;
    464     const size_t entry_capacity = 50;
    465     const size_t data_capacity = 450;
    466 
    467     m = allocate_camera_metadata(entry_capacity, data_capacity);
    468 
    469     add_test_metadata(m, entry_capacity);
    470 
    471     size_t buf_size = get_camera_metadata_compact_size(m);
    472     EXPECT_LT((size_t)0, buf_size);
    473 
    474     uint8_t *buf = (uint8_t*)malloc(buf_size);
    475     EXPECT_NOT_NULL(buf);
    476 
    477     camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
    478     EXPECT_NOT_NULL(m2);
    479     EXPECT_EQ(buf, (uint8_t*)m2);
    480     EXPECT_EQ(get_camera_metadata_entry_count(m),
    481             get_camera_metadata_entry_count(m2));
    482     EXPECT_EQ(get_camera_metadata_data_count(m),
    483             get_camera_metadata_data_count(m2));
    484     EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
    485             get_camera_metadata_entry_count(m2));
    486     EXPECT_EQ(get_camera_metadata_data_capacity(m2),
    487             get_camera_metadata_data_count(m2));
    488 
    489     for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
    490         camera_metadata_entry e1, e2;
    491         int result;
    492         result = get_camera_metadata_entry(m, i, &e1);
    493         EXPECT_EQ(OK, result);
    494         result = get_camera_metadata_entry(m2, i, &e2);
    495         EXPECT_EQ(OK, result);
    496         EXPECT_EQ(e1.index, e2.index);
    497         EXPECT_EQ(e1.tag, e2.tag);
    498         EXPECT_EQ(e1.type, e2.type);
    499         EXPECT_EQ(e1.count, e2.count);
    500         for (unsigned int j=0;
    501              j < e1.count * camera_metadata_type_size[e1.type];
    502              j++) {
    503             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    504         }
    505     }
    506 
    507     EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
    508     free(buf);
    509 
    510     FINISH_USING_CAMERA_METADATA(m);
    511 }
    512 
    513 TEST(camera_metadata, copy_metadata_extraspace) {
    514     camera_metadata_t *m = NULL;
    515     const size_t entry_capacity = 12;
    516     const size_t data_capacity = 100;
    517 
    518     const size_t extra_space = 10;
    519 
    520     m = allocate_camera_metadata(entry_capacity, data_capacity);
    521 
    522     add_test_metadata(m, entry_capacity);
    523 
    524     size_t buf_size = get_camera_metadata_compact_size(m);
    525     EXPECT_LT((size_t)0, buf_size);
    526     buf_size += extra_space;
    527 
    528     uint8_t *buf = (uint8_t*)malloc(buf_size);
    529     EXPECT_NOT_NULL(buf);
    530 
    531     camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
    532     EXPECT_NOT_NULL(m2);
    533     EXPECT_EQ(buf, (uint8_t*)m2);
    534     EXPECT_EQ(get_camera_metadata_entry_count(m),
    535             get_camera_metadata_entry_count(m2));
    536     EXPECT_EQ(get_camera_metadata_data_count(m),
    537             get_camera_metadata_data_count(m2));
    538     EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
    539             get_camera_metadata_entry_count(m2));
    540     EXPECT_EQ(get_camera_metadata_data_capacity(m2),
    541             get_camera_metadata_data_count(m2));
    542     EXPECT_EQ(buf + buf_size - extra_space,
    543             (uint8_t*)m2 + get_camera_metadata_size(m2) );
    544 
    545     for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
    546         camera_metadata_entry e1, e2;
    547 
    548         int result;
    549         result = get_camera_metadata_entry(m, i, &e1);
    550         EXPECT_EQ(OK, result);
    551         EXPECT_EQ(i, e1.index);
    552         result = get_camera_metadata_entry(m2, i, &e2);
    553         EXPECT_EQ(OK, result);
    554         EXPECT_EQ(e1.index, e2.index);
    555         EXPECT_EQ(e1.tag, e2.tag);
    556         EXPECT_EQ(e1.type, e2.type);
    557         EXPECT_EQ(e1.count, e2.count);
    558         for (unsigned int j=0;
    559              j < e1.count * camera_metadata_type_size[e1.type];
    560              j++) {
    561             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    562         }
    563     }
    564 
    565     EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
    566     free(buf);
    567 
    568     FINISH_USING_CAMERA_METADATA(m);
    569 }
    570 
    571 TEST(camera_metadata, copy_metadata_nospace) {
    572     camera_metadata_t *m = NULL;
    573     const size_t entry_capacity = 5;
    574     const size_t data_capacity = 50;
    575 
    576     m = allocate_camera_metadata(entry_capacity, data_capacity);
    577 
    578     add_test_metadata(m, entry_capacity);
    579 
    580     size_t buf_size = get_camera_metadata_compact_size(m);
    581     EXPECT_LT((size_t)0, buf_size);
    582 
    583     buf_size--;
    584 
    585     uint8_t *buf = (uint8_t*)malloc(buf_size);
    586     EXPECT_NOT_NULL(buf);
    587 
    588     camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
    589     EXPECT_NULL(m2);
    590 
    591     free(buf);
    592 
    593     FINISH_USING_CAMERA_METADATA(m);
    594 }
    595 
    596 TEST(camera_metadata, append_metadata) {
    597     camera_metadata_t *m = NULL;
    598     const size_t entry_capacity = 5;
    599     const size_t data_capacity = 50;
    600 
    601     int result;
    602 
    603     m = allocate_camera_metadata(entry_capacity, data_capacity);
    604 
    605     add_test_metadata(m, entry_capacity);
    606 
    607     camera_metadata_t *m2 = NULL;
    608 
    609     m2 = allocate_camera_metadata(entry_capacity*2, data_capacity*2);
    610     EXPECT_NOT_NULL(m2);
    611 
    612     result = append_camera_metadata(m2, m);
    613 
    614     EXPECT_EQ(OK, result);
    615 
    616     EXPECT_EQ(get_camera_metadata_entry_count(m),
    617             get_camera_metadata_entry_count(m2));
    618     EXPECT_EQ(get_camera_metadata_data_count(m),
    619             get_camera_metadata_data_count(m2));
    620     EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
    621     EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
    622 
    623     for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
    624         camera_metadata_entry e1, e2;
    625         int result;
    626         result = get_camera_metadata_entry(m, i, &e1);
    627         EXPECT_EQ(OK, result);
    628         EXPECT_EQ(i, e1.index);
    629         result = get_camera_metadata_entry(m2, i, &e2);
    630         EXPECT_EQ(OK, result);
    631         EXPECT_EQ(e1.index, e2.index);
    632         EXPECT_EQ(e1.tag, e2.tag);
    633         EXPECT_EQ(e1.type, e2.type);
    634         EXPECT_EQ(e1.count, e2.count);
    635         for (unsigned int j=0;
    636              j < e1.count * camera_metadata_type_size[e1.type];
    637              j++) {
    638             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    639         }
    640     }
    641 
    642     result = append_camera_metadata(m2, m);
    643 
    644     EXPECT_EQ(OK, result);
    645 
    646     EXPECT_EQ(get_camera_metadata_entry_count(m)*2,
    647             get_camera_metadata_entry_count(m2));
    648     EXPECT_EQ(get_camera_metadata_data_count(m)*2,
    649             get_camera_metadata_data_count(m2));
    650     EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
    651     EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
    652 
    653     for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
    654         camera_metadata_entry e1, e2;
    655 
    656         int result;
    657         result = get_camera_metadata_entry(m,
    658                 i % entry_capacity, &e1);
    659         EXPECT_EQ(OK, result);
    660         EXPECT_EQ(i % entry_capacity, e1.index);
    661         result = get_camera_metadata_entry(m2,
    662                 i, &e2);
    663         EXPECT_EQ(OK, result);
    664         EXPECT_EQ(i, e2.index);
    665         EXPECT_EQ(e1.tag, e2.tag);
    666         EXPECT_EQ(e1.type, e2.type);
    667         EXPECT_EQ(e1.count, e2.count);
    668         for (unsigned int j=0;
    669              j < e1.count * camera_metadata_type_size[e1.type];
    670              j++) {
    671             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    672         }
    673     }
    674 
    675     FINISH_USING_CAMERA_METADATA(m);
    676     FINISH_USING_CAMERA_METADATA(m2);
    677 }
    678 
    679 TEST(camera_metadata, append_metadata_nospace) {
    680     camera_metadata_t *m = NULL;
    681     const size_t entry_capacity = 5;
    682     const size_t data_capacity = 50;
    683 
    684     int result;
    685 
    686     m = allocate_camera_metadata(entry_capacity, data_capacity);
    687 
    688     add_test_metadata(m, entry_capacity);
    689 
    690     camera_metadata_t *m2 = NULL;
    691 
    692     m2 = allocate_camera_metadata(entry_capacity-1, data_capacity);
    693     EXPECT_NOT_NULL(m2);
    694 
    695     result = append_camera_metadata(m2, m);
    696 
    697     EXPECT_EQ(ERROR, result);
    698     EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m2));
    699     EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m2));
    700 
    701     FINISH_USING_CAMERA_METADATA(m);
    702     FINISH_USING_CAMERA_METADATA(m2);
    703 }
    704 
    705 TEST(camera_metadata, append_metadata_onespace) {
    706     camera_metadata_t *m = NULL;
    707     const size_t entry_capacity = 5;
    708     const size_t data_capacity = 50;
    709     const size_t entry_capacity2 = entry_capacity * 2 - 2;
    710     const size_t data_capacity2 = data_capacity * 2;
    711     int result;
    712 
    713     m = allocate_camera_metadata(entry_capacity, data_capacity);
    714 
    715     add_test_metadata(m, entry_capacity);
    716 
    717     camera_metadata_t *m2 = NULL;
    718 
    719     m2 = allocate_camera_metadata(entry_capacity2, data_capacity2);
    720     EXPECT_NOT_NULL(m2);
    721 
    722     result = append_camera_metadata(m2, m);
    723 
    724     EXPECT_EQ(OK, result);
    725 
    726     EXPECT_EQ(get_camera_metadata_entry_count(m),
    727             get_camera_metadata_entry_count(m2));
    728     EXPECT_EQ(get_camera_metadata_data_count(m),
    729             get_camera_metadata_data_count(m2));
    730     EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
    731     EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
    732 
    733     for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
    734         camera_metadata_entry e1, e2;
    735 
    736         int result;
    737         result = get_camera_metadata_entry(m, i, &e1);
    738         EXPECT_EQ(OK, result);
    739         EXPECT_EQ(i, e1.index);
    740         result = get_camera_metadata_entry(m2, i, &e2);
    741         EXPECT_EQ(OK, result);
    742         EXPECT_EQ(e1.index, e2.index);
    743         EXPECT_EQ(e1.tag, e2.tag);
    744         EXPECT_EQ(e1.type, e2.type);
    745         EXPECT_EQ(e1.count, e2.count);
    746         for (unsigned int j=0;
    747              j < e1.count * camera_metadata_type_size[e1.type];
    748              j++) {
    749             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    750         }
    751     }
    752 
    753     result = append_camera_metadata(m2, m);
    754 
    755     EXPECT_EQ(ERROR, result);
    756     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_count(m2));
    757     EXPECT_EQ(get_camera_metadata_data_count(m),
    758             get_camera_metadata_data_count(m2));
    759     EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
    760     EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
    761 
    762     for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
    763         camera_metadata_entry e1, e2;
    764 
    765         int result;
    766         result = get_camera_metadata_entry(m,
    767                 i % entry_capacity, &e1);
    768         EXPECT_EQ(OK, result);
    769         EXPECT_EQ(i % entry_capacity, e1.index);
    770         result = get_camera_metadata_entry(m2, i, &e2);
    771         EXPECT_EQ(OK, result);
    772         EXPECT_EQ(i, e2.index);
    773         EXPECT_EQ(e1.tag, e2.tag);
    774         EXPECT_EQ(e1.type, e2.type);
    775         EXPECT_EQ(e1.count, e2.count);
    776         for (unsigned int j=0;
    777              j < e1.count * camera_metadata_type_size[e1.type];
    778              j++) {
    779             EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
    780         }
    781     }
    782 
    783     FINISH_USING_CAMERA_METADATA(m);
    784     FINISH_USING_CAMERA_METADATA(m2);
    785 }
    786 
    787 TEST(camera_metadata, vendor_tags) {
    788     camera_metadata_t *m = NULL;
    789     const size_t entry_capacity = 5;
    790     const size_t data_capacity = 50;
    791     int result;
    792 
    793     m = allocate_camera_metadata(entry_capacity, data_capacity);
    794 
    795     uint8_t superMode = 5;
    796     result = add_camera_metadata_entry(m,
    797             FAKEVENDOR_SENSOR_SUPERMODE,
    798             &superMode, 1);
    799     EXPECT_EQ(ERROR, result);
    800     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    801 
    802     result = add_camera_metadata_entry(m,
    803             ANDROID_REQUEST_METADATA_MODE,
    804             &superMode, 1);
    805     EXPECT_EQ(OK, result);
    806     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    807 
    808     EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
    809     EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
    810     EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
    811 
    812     set_camera_metadata_vendor_ops(&fakevendor_ops);
    813 
    814     result = add_camera_metadata_entry(m,
    815             FAKEVENDOR_SENSOR_SUPERMODE,
    816             &superMode, 1);
    817     EXPECT_EQ(OK, result);
    818     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    819 
    820     result = add_camera_metadata_entry(m,
    821             ANDROID_REQUEST_METADATA_MODE,
    822             &superMode, 1);
    823     EXPECT_EQ(OK, result);
    824     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    825 
    826     result = add_camera_metadata_entry(m,
    827             FAKEVENDOR_SCALER_END,
    828             &superMode, 1);
    829     EXPECT_EQ(ERROR, result);
    830     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    831 
    832     EXPECT_STREQ("com.fakevendor.sensor",
    833             get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
    834     EXPECT_STREQ("superMode",
    835             get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
    836     EXPECT_EQ(TYPE_BYTE,
    837             get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
    838 
    839     EXPECT_STREQ("com.fakevendor.scaler",
    840             get_camera_metadata_section_name(FAKEVENDOR_SCALER_END));
    841     EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SCALER_END));
    842     EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SCALER_END));
    843 
    844     set_camera_metadata_vendor_ops(NULL);
    845     // TODO: fix vendor ops. Then the below 3 validations should fail.
    846     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    847 
    848     result = add_camera_metadata_entry(m,
    849             FAKEVENDOR_SENSOR_SUPERMODE,
    850             &superMode, 1);
    851     EXPECT_EQ(ERROR, result);
    852     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    853 
    854     result = add_camera_metadata_entry(m,
    855             ANDROID_REQUEST_METADATA_MODE,
    856             &superMode, 1);
    857     EXPECT_EQ(OK, result);
    858     EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
    859 
    860     EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
    861     EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
    862     EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
    863 
    864     // Remove all vendor entries so validation passes
    865     {
    866         camera_metadata_ro_entry_t entry;
    867         EXPECT_EQ(OK, find_camera_metadata_ro_entry(m,
    868                                                     FAKEVENDOR_SENSOR_SUPERMODE,
    869                                                     &entry));
    870         EXPECT_EQ(OK, delete_camera_metadata_entry(m, entry.index));
    871     }
    872 
    873     FINISH_USING_CAMERA_METADATA(m);
    874 }
    875 
    876 TEST(camera_metadata, add_all_tags) {
    877     int total_tag_count = 0;
    878     for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
    879         total_tag_count += camera_metadata_section_bounds[i][1] -
    880                 camera_metadata_section_bounds[i][0];
    881     }
    882     int entry_data_count = 3;
    883     int conservative_data_space = total_tag_count * entry_data_count * 8;
    884     uint8_t data[entry_data_count * 8];
    885     int32_t *data_int32 = (int32_t *)data;
    886     float *data_float   = (float *)data;
    887     int64_t *data_int64 = (int64_t *)data;
    888     double *data_double = (double *)data;
    889     camera_metadata_rational_t *data_rational =
    890             (camera_metadata_rational_t *)data;
    891 
    892     camera_metadata_t *m = allocate_camera_metadata(total_tag_count,
    893             conservative_data_space);
    894 
    895     ASSERT_NE((void*)NULL, (void*)m);
    896 
    897     int result;
    898 
    899     int counter = 0;
    900     for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
    901         for (uint32_t tag = camera_metadata_section_bounds[i][0];
    902                 tag < camera_metadata_section_bounds[i][1];
    903              tag++, counter++) {
    904             int type = get_camera_metadata_tag_type(tag);
    905             ASSERT_NE(-1, type);
    906 
    907             switch (type) {
    908                 case TYPE_BYTE:
    909                     data[0] = tag & 0xFF;
    910                     data[1] = (tag >> 8) & 0xFF;
    911                     data[2] = (tag >> 16) & 0xFF;
    912                     break;
    913                 case TYPE_INT32:
    914                     data_int32[0] = tag;
    915                     data_int32[1] = i;
    916                     data_int32[2] = counter;
    917                     break;
    918                 case TYPE_FLOAT:
    919                     data_float[0] = tag;
    920                     data_float[1] = i;
    921                     data_float[2] = counter / (float)total_tag_count;
    922                     break;
    923                 case TYPE_INT64:
    924                     data_int64[0] = (int64_t)tag | ( (int64_t)tag << 32);
    925                     data_int64[1] = i;
    926                     data_int64[2] = counter;
    927                     break;
    928                 case TYPE_DOUBLE:
    929                     data_double[0] = tag;
    930                     data_double[1] = i;
    931                     data_double[2] = counter / (double)total_tag_count;
    932                     break;
    933                 case TYPE_RATIONAL:
    934                     data_rational[0].numerator = tag;
    935                     data_rational[0].denominator = 1;
    936                     data_rational[1].numerator = i;
    937                     data_rational[1].denominator = 1;
    938                     data_rational[2].numerator = counter;
    939                     data_rational[2].denominator = total_tag_count;
    940                     break;
    941                 default:
    942                     FAIL() << "Unknown type field encountered:" << type;
    943                     break;
    944             }
    945             result = add_camera_metadata_entry(m,
    946                     tag,
    947                     data,
    948                     entry_data_count);
    949             ASSERT_EQ(OK, result);
    950 
    951         }
    952     }
    953 
    954     IF_ALOGV() {
    955         dump_camera_metadata(m, 0, 2);
    956     }
    957 
    958     FINISH_USING_CAMERA_METADATA(m);
    959 }
    960 
    961 TEST(camera_metadata, sort_metadata) {
    962     camera_metadata_t *m = NULL;
    963     const size_t entry_capacity = 5;
    964     const size_t data_capacity = 100;
    965 
    966     int result;
    967 
    968     m = allocate_camera_metadata(entry_capacity, data_capacity);
    969 
    970     // Add several unique entries in non-sorted order
    971 
    972     camera_metadata_rational_t colorTransform[] = {
    973         {9, 10}, {0, 1}, {0, 1},
    974         {1, 5}, {1, 2}, {0, 1},
    975         {0, 1}, {1, 10}, {7, 10}
    976     };
    977     result = add_camera_metadata_entry(m,
    978             ANDROID_COLOR_CORRECTION_TRANSFORM,
    979             colorTransform, ARRAY_SIZE(colorTransform));
    980     EXPECT_EQ(OK, result);
    981 
    982     float focus_distance = 0.5f;
    983     result = add_camera_metadata_entry(m,
    984             ANDROID_LENS_FOCUS_DISTANCE,
    985             &focus_distance, 1);
    986     EXPECT_EQ(OK, result);
    987 
    988     int64_t exposure_time = 1000000000;
    989     result = add_camera_metadata_entry(m,
    990             ANDROID_SENSOR_EXPOSURE_TIME,
    991             &exposure_time, 1);
    992     EXPECT_EQ(OK, result);
    993 
    994     int32_t sensitivity = 800;
    995     result = add_camera_metadata_entry(m,
    996             ANDROID_SENSOR_SENSITIVITY,
    997             &sensitivity, 1);
    998     EXPECT_EQ(OK, result);
    999 
   1000     // Test unsorted find
   1001     camera_metadata_entry_t entry;
   1002     result = find_camera_metadata_entry(m,
   1003             ANDROID_LENS_FOCUS_DISTANCE,
   1004             &entry);
   1005     EXPECT_EQ(OK, result);
   1006     EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
   1007     EXPECT_EQ((size_t)1, entry.index);
   1008     EXPECT_EQ(TYPE_FLOAT, entry.type);
   1009     EXPECT_EQ((size_t)1, entry.count);
   1010     EXPECT_EQ(focus_distance, *entry.data.f);
   1011 
   1012     result = find_camera_metadata_entry(m,
   1013             ANDROID_NOISE_REDUCTION_STRENGTH,
   1014             &entry);
   1015     EXPECT_EQ(NOT_FOUND, result);
   1016     EXPECT_EQ((size_t)1, entry.index);
   1017     EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
   1018     EXPECT_EQ(TYPE_FLOAT, entry.type);
   1019     EXPECT_EQ((size_t)1, entry.count);
   1020     EXPECT_EQ(focus_distance, *entry.data.f);
   1021 
   1022     // Sort
   1023     IF_ALOGV() {
   1024         std::cout << "Pre-sorted metadata" << std::endl;
   1025         dump_camera_metadata(m, 0, 2);
   1026     }
   1027 
   1028     result = sort_camera_metadata(m);
   1029     EXPECT_EQ(OK, result);
   1030 
   1031     IF_ALOGV() {
   1032         std::cout << "Sorted metadata" << std::endl;
   1033         dump_camera_metadata(m, 0, 2);
   1034     }
   1035 
   1036     // Test sorted find
   1037     size_t lensFocusIndex = -1;
   1038     {
   1039         std::vector<uint32_t> tags;
   1040         tags.push_back(ANDROID_COLOR_CORRECTION_TRANSFORM);
   1041         tags.push_back(ANDROID_LENS_FOCUS_DISTANCE);
   1042         tags.push_back(ANDROID_SENSOR_EXPOSURE_TIME);
   1043         tags.push_back(ANDROID_SENSOR_SENSITIVITY);
   1044         std::sort(tags.begin(), tags.end());
   1045 
   1046         lensFocusIndex =
   1047             std::find(tags.begin(), tags.end(), ANDROID_LENS_FOCUS_DISTANCE)
   1048             - tags.begin();
   1049     }
   1050 
   1051     result = find_camera_metadata_entry(m,
   1052             ANDROID_LENS_FOCUS_DISTANCE,
   1053             &entry);
   1054     EXPECT_EQ(OK, result);
   1055     EXPECT_EQ(lensFocusIndex, entry.index);
   1056     EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
   1057     EXPECT_EQ(TYPE_FLOAT, entry.type);
   1058     EXPECT_EQ((size_t)1, (size_t)entry.count);
   1059     EXPECT_EQ(focus_distance, *entry.data.f);
   1060 
   1061     result = find_camera_metadata_entry(m,
   1062             ANDROID_NOISE_REDUCTION_STRENGTH,
   1063             &entry);
   1064     EXPECT_EQ(NOT_FOUND, result);
   1065     EXPECT_EQ(lensFocusIndex, entry.index);
   1066     EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
   1067     EXPECT_EQ(TYPE_FLOAT, entry.type);
   1068     EXPECT_EQ((size_t)1, entry.count);
   1069     EXPECT_EQ(focus_distance, *entry.data.f);
   1070 
   1071 
   1072     FINISH_USING_CAMERA_METADATA(m);
   1073 }
   1074 
   1075 TEST(camera_metadata, delete_metadata) {
   1076     camera_metadata_t *m = NULL;
   1077     const size_t entry_capacity = 50;
   1078     const size_t data_capacity = 450;
   1079 
   1080     int result;
   1081 
   1082     m = allocate_camera_metadata(entry_capacity, data_capacity);
   1083 
   1084     size_t num_entries = 5;
   1085     size_t data_per_entry =
   1086             calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
   1087     size_t num_data = num_entries * data_per_entry;
   1088 
   1089     // Delete an entry with data
   1090 
   1091     add_test_metadata(m, num_entries);
   1092     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1093     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1094 
   1095     result = delete_camera_metadata_entry(m, 1);
   1096     EXPECT_EQ(OK, result);
   1097     num_entries--;
   1098     num_data -= data_per_entry;
   1099 
   1100     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1101     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1102     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1103     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1104 
   1105     result = delete_camera_metadata_entry(m, 4);
   1106     EXPECT_EQ(ERROR, result);
   1107 
   1108     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1109     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1110     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1111     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1112 
   1113     for (size_t i = 0; i < num_entries; i++) {
   1114         camera_metadata_entry e;
   1115         result = get_camera_metadata_entry(m, i, &e);
   1116         EXPECT_EQ(OK, result);
   1117         EXPECT_EQ(i, e.index);
   1118         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1119         EXPECT_EQ(TYPE_INT64, e.type);
   1120         int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
   1121         EXPECT_EQ(exposureTime, *e.data.i64);
   1122     }
   1123 
   1124     // Delete an entry with no data, at end of array
   1125 
   1126     int32_t frameCount = 12;
   1127     result = add_camera_metadata_entry(m,
   1128             ANDROID_REQUEST_FRAME_COUNT,
   1129             &frameCount, 1);
   1130     EXPECT_EQ(OK, result);
   1131     num_entries++;
   1132 
   1133     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1134     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1135     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1136     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1137 
   1138     camera_metadata_entry e;
   1139     result = get_camera_metadata_entry(m, 4, &e);
   1140     EXPECT_EQ(OK, result);
   1141 
   1142     EXPECT_EQ((size_t)4, e.index);
   1143     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1144     EXPECT_EQ(TYPE_INT32, e.type);
   1145     EXPECT_EQ((size_t)1, e.count);
   1146     EXPECT_EQ(frameCount, *e.data.i32);
   1147 
   1148     result = delete_camera_metadata_entry(m, 4);
   1149     EXPECT_EQ(OK, result);
   1150 
   1151     num_entries--;
   1152     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1153     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1154     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1155     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1156 
   1157     result = delete_camera_metadata_entry(m, 4);
   1158     EXPECT_EQ(ERROR, result);
   1159 
   1160     result = get_camera_metadata_entry(m, 4, &e);
   1161     EXPECT_EQ(ERROR, result);
   1162 
   1163     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1164     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1165     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1166     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1167 
   1168     // Delete with extra data on end of array
   1169     result = delete_camera_metadata_entry(m, 3);
   1170     EXPECT_EQ(OK, result);
   1171     num_entries--;
   1172     num_data -= data_per_entry;
   1173 
   1174     for (size_t i = 0; i < num_entries; i++) {
   1175         camera_metadata_entry e2;
   1176         result = get_camera_metadata_entry(m, i, &e2);
   1177         EXPECT_EQ(OK, result);
   1178         EXPECT_EQ(i, e2.index);
   1179         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1180         EXPECT_EQ(TYPE_INT64, e2.type);
   1181         int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
   1182         EXPECT_EQ(exposureTime, *e2.data.i64);
   1183     }
   1184 
   1185     // Delete without extra data in front of array
   1186 
   1187     frameCount = 1001;
   1188     result = add_camera_metadata_entry(m,
   1189             ANDROID_REQUEST_FRAME_COUNT,
   1190             &frameCount, 1);
   1191     EXPECT_EQ(OK, result);
   1192     num_entries++;
   1193 
   1194     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1195     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1196     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1197     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1198 
   1199     result = sort_camera_metadata(m);
   1200     EXPECT_EQ(OK, result);
   1201 
   1202     result = find_camera_metadata_entry(m,
   1203             ANDROID_REQUEST_FRAME_COUNT, &e);
   1204     EXPECT_EQ(OK, result);
   1205     EXPECT_EQ((size_t)0, e.index);
   1206     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1207     EXPECT_EQ(TYPE_INT32, e.type);
   1208     EXPECT_EQ((size_t)1, e.count);
   1209     EXPECT_EQ(frameCount, *e.data.i32);
   1210 
   1211     result = delete_camera_metadata_entry(m, e.index);
   1212     EXPECT_EQ(OK, result);
   1213     num_entries--;
   1214 
   1215     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1216     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1217     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1218     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1219 
   1220     for (size_t i = 0; i < num_entries; i++) {
   1221         camera_metadata_entry e2;
   1222         result = get_camera_metadata_entry(m, i, &e2);
   1223         EXPECT_EQ(OK, result);
   1224         EXPECT_EQ(i, e2.index);
   1225         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1226         EXPECT_EQ(TYPE_INT64, e2.type);
   1227         int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
   1228         EXPECT_EQ(exposureTime, *e2.data.i64);
   1229     }
   1230 }
   1231 
   1232 TEST(camera_metadata, update_metadata) {
   1233     camera_metadata_t *m = NULL;
   1234     const size_t entry_capacity = 50;
   1235     const size_t data_capacity = 450;
   1236 
   1237     int result;
   1238 
   1239     m = allocate_camera_metadata(entry_capacity, data_capacity);
   1240 
   1241     size_t num_entries = 5;
   1242     size_t data_per_entry =
   1243             calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
   1244     size_t num_data = num_entries * data_per_entry;
   1245 
   1246     add_test_metadata(m, num_entries);
   1247     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1248     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1249 
   1250     // Update with same-size data, doesn't fit in entry
   1251 
   1252     int64_t newExposureTime = 1000;
   1253     camera_metadata_entry_t e;
   1254     result = update_camera_metadata_entry(m,
   1255             0, &newExposureTime, 1, &e);
   1256     EXPECT_EQ(OK, result);
   1257 
   1258     EXPECT_EQ((size_t)0, e.index);
   1259     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1260     EXPECT_EQ(TYPE_INT64, e.type);
   1261     EXPECT_EQ((size_t)1, e.count);
   1262     EXPECT_EQ(newExposureTime, *e.data.i64);
   1263 
   1264     e.count = 0;
   1265     result = get_camera_metadata_entry(m,
   1266             0, &e);
   1267 
   1268     EXPECT_EQ((size_t)0, e.index);
   1269     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1270     EXPECT_EQ(TYPE_INT64, e.type);
   1271     EXPECT_EQ((size_t)1, e.count);
   1272     EXPECT_EQ(newExposureTime, *e.data.i64);
   1273 
   1274     for (size_t i = 1; i < num_entries; i++) {
   1275         camera_metadata_entry e2;
   1276         result = get_camera_metadata_entry(m, i, &e2);
   1277         EXPECT_EQ(OK, result);
   1278         EXPECT_EQ(i, e2.index);
   1279         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1280         EXPECT_EQ(TYPE_INT64, e2.type);
   1281         int64_t exposureTime = 100 + 100 * i;
   1282         EXPECT_EQ(exposureTime, *e2.data.i64);
   1283     }
   1284 
   1285     // Update with larger data
   1286     int64_t newExposures[2] = { 5000, 6000 };
   1287     result = update_camera_metadata_entry(m,
   1288             0, newExposures, 2, &e);
   1289     EXPECT_EQ(OK, result);
   1290     num_data += data_per_entry;
   1291 
   1292     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1293     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1294 
   1295     EXPECT_EQ((size_t)0, e.index);
   1296     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1297     EXPECT_EQ(TYPE_INT64, e.type);
   1298     EXPECT_EQ((size_t)2, e.count);
   1299     EXPECT_EQ(newExposures[0], e.data.i64[0]);
   1300     EXPECT_EQ(newExposures[1], e.data.i64[1]);
   1301 
   1302     e.count = 0;
   1303     result = get_camera_metadata_entry(m,
   1304             0, &e);
   1305 
   1306     EXPECT_EQ((size_t)0, e.index);
   1307     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1308     EXPECT_EQ(TYPE_INT64, e.type);
   1309     EXPECT_EQ((size_t)2, e.count);
   1310     EXPECT_EQ(newExposures[0], e.data.i64[0]);
   1311     EXPECT_EQ(newExposures[1], e.data.i64[1]);
   1312 
   1313     for (size_t i = 1; i < num_entries; i++) {
   1314         camera_metadata_entry e2;
   1315         result = get_camera_metadata_entry(m, i, &e2);
   1316         EXPECT_EQ(OK, result);
   1317         EXPECT_EQ(i, e2.index);
   1318         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1319         EXPECT_EQ(TYPE_INT64, e2.type);
   1320         int64_t exposureTime = 100 + 100 * i;
   1321         EXPECT_EQ(exposureTime, *e2.data.i64);
   1322     }
   1323 
   1324     // Update with smaller data
   1325     newExposureTime = 100;
   1326     result = update_camera_metadata_entry(m,
   1327             0, &newExposureTime, 1, &e);
   1328     EXPECT_EQ(OK, result);
   1329 
   1330     num_data -= data_per_entry;
   1331 
   1332     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1333     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1334 
   1335     EXPECT_EQ((size_t)0, e.index);
   1336     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1337     EXPECT_EQ(TYPE_INT64, e.type);
   1338     EXPECT_EQ((size_t)1, e.count);
   1339     EXPECT_EQ(newExposureTime, *e.data.i64);
   1340 
   1341     e.count = 0;
   1342     result = get_camera_metadata_entry(m,
   1343             0, &e);
   1344 
   1345     EXPECT_EQ((size_t)0, e.index);
   1346     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1347     EXPECT_EQ(TYPE_INT64, e.type);
   1348     EXPECT_EQ((size_t)1, e.count);
   1349     EXPECT_EQ(newExposureTime, *e.data.i64);
   1350 
   1351     for (size_t i = 1; i < num_entries; i++) {
   1352         camera_metadata_entry e2;
   1353         result = get_camera_metadata_entry(m, i, &e2);
   1354         EXPECT_EQ(OK, result);
   1355         EXPECT_EQ(i, e2.index);
   1356         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1357         EXPECT_EQ(TYPE_INT64, e2.type);
   1358         int64_t exposureTime = 100 + 100 * i;
   1359         EXPECT_EQ(exposureTime, *e2.data.i64);
   1360     }
   1361 
   1362     // Update with size fitting in entry
   1363 
   1364     int32_t frameCount = 1001;
   1365     result = add_camera_metadata_entry(m,
   1366             ANDROID_REQUEST_FRAME_COUNT,
   1367             &frameCount, 1);
   1368     EXPECT_EQ(OK, result);
   1369     num_entries++;
   1370 
   1371     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1372     EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
   1373     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1374     EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
   1375 
   1376     result = sort_camera_metadata(m);
   1377     EXPECT_EQ(OK, result);
   1378 
   1379     result = find_camera_metadata_entry(m,
   1380             ANDROID_REQUEST_FRAME_COUNT, &e);
   1381     EXPECT_EQ(OK, result);
   1382     EXPECT_EQ((size_t)0, e.index);
   1383     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1384     EXPECT_EQ(TYPE_INT32, e.type);
   1385     EXPECT_EQ((size_t)1, e.count);
   1386     EXPECT_EQ(frameCount, *e.data.i32);
   1387 
   1388     int32_t newFrameCount = 0x12349876;
   1389     result = update_camera_metadata_entry(m,
   1390             0, &newFrameCount, 1, &e);
   1391 
   1392     EXPECT_EQ(OK, result);
   1393     EXPECT_EQ((size_t)0, e.index);
   1394     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1395     EXPECT_EQ(TYPE_INT32, e.type);
   1396     EXPECT_EQ((size_t)1, e.count);
   1397     EXPECT_EQ(newFrameCount, *e.data.i32);
   1398 
   1399     result = find_camera_metadata_entry(m,
   1400             ANDROID_REQUEST_FRAME_COUNT, &e);
   1401 
   1402     EXPECT_EQ(OK, result);
   1403     EXPECT_EQ((size_t)0, e.index);
   1404     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1405     EXPECT_EQ(TYPE_INT32, e.type);
   1406     EXPECT_EQ((size_t)1, e.count);
   1407     EXPECT_EQ(newFrameCount, *e.data.i32);
   1408 
   1409     for (size_t i = 1; i < num_entries; i++) {
   1410         camera_metadata_entry e2;
   1411         result = get_camera_metadata_entry(m, i, &e2);
   1412         EXPECT_EQ(OK, result);
   1413         EXPECT_EQ(i, e2.index);
   1414         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1415         EXPECT_EQ(TYPE_INT64, e2.type);
   1416         int64_t exposureTime = 100 * i;
   1417         EXPECT_EQ(exposureTime, *e2.data.i64);
   1418     }
   1419 
   1420     // Update to bigger than entry
   1421 
   1422     int32_t newFrameCounts[4] = { 0x0, 0x1, 0x10, 0x100 };
   1423 
   1424     result = update_camera_metadata_entry(m,
   1425             0, &newFrameCounts, 4, &e);
   1426 
   1427     EXPECT_EQ(OK, result);
   1428 
   1429     num_data += calculate_camera_metadata_entry_data_size(TYPE_INT32,
   1430             4);
   1431 
   1432     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1433     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1434 
   1435     EXPECT_EQ((size_t)0, e.index);
   1436     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1437     EXPECT_EQ(TYPE_INT32, e.type);
   1438     EXPECT_EQ((size_t)4, e.count);
   1439     EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
   1440     EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
   1441     EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
   1442     EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
   1443 
   1444     e.count = 0;
   1445 
   1446     result = find_camera_metadata_entry(m,
   1447             ANDROID_REQUEST_FRAME_COUNT, &e);
   1448 
   1449     EXPECT_EQ(OK, result);
   1450     EXPECT_EQ((size_t)0, e.index);
   1451     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1452     EXPECT_EQ(TYPE_INT32, e.type);
   1453     EXPECT_EQ((size_t)4, e.count);
   1454     EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
   1455     EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
   1456     EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
   1457     EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
   1458 
   1459     for (size_t i = 1; i < num_entries; i++) {
   1460         camera_metadata_entry e2;
   1461         result = get_camera_metadata_entry(m, i, &e2);
   1462         EXPECT_EQ(OK, result);
   1463         EXPECT_EQ(i, e2.index);
   1464         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1465         EXPECT_EQ(TYPE_INT64, e2.type);
   1466         int64_t exposureTime = 100 * i;
   1467         EXPECT_EQ(exposureTime, *e2.data.i64);
   1468     }
   1469 
   1470     // Update to smaller than entry
   1471     result = update_camera_metadata_entry(m,
   1472             0, &newFrameCount, 1, &e);
   1473 
   1474     EXPECT_EQ(OK, result);
   1475 
   1476     num_data -= camera_metadata_type_size[TYPE_INT32] * 4;
   1477 
   1478     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1479     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1480 
   1481     EXPECT_EQ((size_t)0, e.index);
   1482     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1483     EXPECT_EQ(TYPE_INT32, e.type);
   1484     EXPECT_EQ((size_t)1, e.count);
   1485     EXPECT_EQ(newFrameCount, *e.data.i32);
   1486 
   1487     result = find_camera_metadata_entry(m,
   1488             ANDROID_REQUEST_FRAME_COUNT, &e);
   1489 
   1490     EXPECT_EQ(OK, result);
   1491     EXPECT_EQ((size_t)0, e.index);
   1492     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1493     EXPECT_EQ(TYPE_INT32, e.type);
   1494     EXPECT_EQ((size_t)1, e.count);
   1495     EXPECT_EQ(newFrameCount, *e.data.i32);
   1496 
   1497     for (size_t i = 1; i < num_entries; i++) {
   1498         camera_metadata_entry_t e2;
   1499         result = get_camera_metadata_entry(m, i, &e2);
   1500         EXPECT_EQ(OK, result);
   1501         EXPECT_EQ(i, e2.index);
   1502         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1503         EXPECT_EQ(TYPE_INT64, e2.type);
   1504         int64_t exposureTime = 100 * i;
   1505         EXPECT_EQ(exposureTime, *e2.data.i64);
   1506     }
   1507 
   1508     // Setup new buffer with no spare data space
   1509 
   1510     result = update_camera_metadata_entry(m,
   1511             1, newExposures, 2, &e);
   1512     EXPECT_EQ(OK, result);
   1513 
   1514     num_data += data_per_entry;
   1515 
   1516     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
   1517     EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
   1518 
   1519     EXPECT_EQ((size_t)1, e.index);
   1520     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1521     EXPECT_EQ(TYPE_INT64, e.type);
   1522     EXPECT_EQ((size_t)2, e.count);
   1523     EXPECT_EQ(newExposures[0], e.data.i64[0]);
   1524     EXPECT_EQ(newExposures[1], e.data.i64[1]);
   1525 
   1526     camera_metadata_t *m2;
   1527     m2 = allocate_camera_metadata(get_camera_metadata_entry_count(m),
   1528             get_camera_metadata_data_count(m));
   1529     EXPECT_NOT_NULL(m2);
   1530 
   1531     result = append_camera_metadata(m2, m);
   1532     EXPECT_EQ(OK, result);
   1533 
   1534     result = find_camera_metadata_entry(m2,
   1535             ANDROID_REQUEST_FRAME_COUNT, &e);
   1536 
   1537     EXPECT_EQ(OK, result);
   1538     EXPECT_EQ((size_t)0, e.index);
   1539     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1540     EXPECT_EQ(TYPE_INT32, e.type);
   1541     EXPECT_EQ((size_t)1, e.count);
   1542     EXPECT_EQ(newFrameCount, *e.data.i32);
   1543 
   1544     // Update when there's no more room
   1545 
   1546     result = update_camera_metadata_entry(m2,
   1547             0, &newFrameCounts, 4, &e);
   1548     EXPECT_EQ(ERROR, result);
   1549 
   1550     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
   1551     EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
   1552 
   1553     EXPECT_EQ((size_t)0, e.index);
   1554     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1555     EXPECT_EQ(TYPE_INT32, e.type);
   1556     EXPECT_EQ((size_t)1, e.count);
   1557     EXPECT_EQ(newFrameCount, *e.data.i32);
   1558 
   1559     // Update when there's no data room, but change fits into entry
   1560 
   1561     newFrameCount = 5;
   1562     result = update_camera_metadata_entry(m2,
   1563             0, &newFrameCount, 1, &e);
   1564     EXPECT_EQ(OK, result);
   1565 
   1566     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
   1567     EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
   1568 
   1569     EXPECT_EQ((size_t)0, e.index);
   1570     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1571     EXPECT_EQ(TYPE_INT32, e.type);
   1572     EXPECT_EQ((size_t)1, e.count);
   1573     EXPECT_EQ(newFrameCount, *e.data.i32);
   1574 
   1575     result = find_camera_metadata_entry(m2,
   1576             ANDROID_REQUEST_FRAME_COUNT, &e);
   1577 
   1578     EXPECT_EQ(OK, result);
   1579     EXPECT_EQ((size_t)0, e.index);
   1580     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1581     EXPECT_EQ(TYPE_INT32, e.type);
   1582     EXPECT_EQ((size_t)1, e.count);
   1583     EXPECT_EQ(newFrameCount, *e.data.i32);
   1584 
   1585     result = get_camera_metadata_entry(m2, 1, &e);
   1586     EXPECT_EQ((size_t)1, e.index);
   1587     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1588     EXPECT_EQ(TYPE_INT64, e.type);
   1589     EXPECT_EQ((size_t)2, e.count);
   1590     EXPECT_EQ(newExposures[0], e.data.i64[0]);
   1591     EXPECT_EQ(newExposures[1], e.data.i64[1]);
   1592 
   1593     for (size_t i = 2; i < num_entries; i++) {
   1594         camera_metadata_entry_t e2;
   1595         result = get_camera_metadata_entry(m2, i, &e2);
   1596         EXPECT_EQ(OK, result);
   1597         EXPECT_EQ(i, e2.index);
   1598         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1599         EXPECT_EQ(TYPE_INT64, e2.type);
   1600         int64_t exposureTime = 100 * i;
   1601         EXPECT_EQ(exposureTime, *e2.data.i64);
   1602     }
   1603 
   1604     // Update when there's no data room, but data size doesn't change
   1605 
   1606     newExposures[0] = 1000;
   1607 
   1608     result = update_camera_metadata_entry(m2,
   1609             1, newExposures, 2, &e);
   1610     EXPECT_EQ(OK, result);
   1611 
   1612     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
   1613     EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
   1614 
   1615     EXPECT_EQ((size_t)1, e.index);
   1616     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1617     EXPECT_EQ(TYPE_INT64, e.type);
   1618     EXPECT_EQ((size_t)2, e.count);
   1619     EXPECT_EQ(newExposures[0], e.data.i64[0]);
   1620     EXPECT_EQ(newExposures[1], e.data.i64[1]);
   1621 
   1622     result = find_camera_metadata_entry(m2,
   1623             ANDROID_REQUEST_FRAME_COUNT, &e);
   1624 
   1625     EXPECT_EQ(OK, result);
   1626     EXPECT_EQ((size_t)0, e.index);
   1627     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1628     EXPECT_EQ(TYPE_INT32, e.type);
   1629     EXPECT_EQ((size_t)1, e.count);
   1630     EXPECT_EQ(newFrameCount, *e.data.i32);
   1631 
   1632     for (size_t i = 2; i < num_entries; i++) {
   1633         camera_metadata_entry_t e2;
   1634         result = get_camera_metadata_entry(m2, i, &e2);
   1635         EXPECT_EQ(OK, result);
   1636         EXPECT_EQ(i, e2.index);
   1637         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1638         EXPECT_EQ(TYPE_INT64, e2.type);
   1639         int64_t exposureTime = 100 * i;
   1640         EXPECT_EQ(exposureTime, *e2.data.i64);
   1641     }
   1642 
   1643     // Update when there's no data room, but data size shrinks
   1644 
   1645     result = update_camera_metadata_entry(m2,
   1646             1, &newExposureTime, 1, &e);
   1647     EXPECT_EQ(OK, result);
   1648 
   1649     num_data -= calculate_camera_metadata_entry_data_size(TYPE_INT64, 2);
   1650     num_data += calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
   1651 
   1652     EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
   1653     EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
   1654 
   1655     EXPECT_EQ((size_t)1, e.index);
   1656     EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
   1657     EXPECT_EQ(TYPE_INT64, e.type);
   1658     EXPECT_EQ((size_t)1, e.count);
   1659     EXPECT_EQ(newExposureTime, e.data.i64[0]);
   1660 
   1661     result = find_camera_metadata_entry(m2,
   1662             ANDROID_REQUEST_FRAME_COUNT, &e);
   1663 
   1664     EXPECT_EQ(OK, result);
   1665     EXPECT_EQ((size_t)0, e.index);
   1666     EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
   1667     EXPECT_EQ(TYPE_INT32, e.type);
   1668     EXPECT_EQ((size_t)1, e.count);
   1669     EXPECT_EQ(newFrameCount, *e.data.i32);
   1670 
   1671     for (size_t i = 2; i < num_entries; i++) {
   1672         camera_metadata_entry_t e2;
   1673         result = get_camera_metadata_entry(m2, i, &e2);
   1674         EXPECT_EQ(OK, result);
   1675         EXPECT_EQ(i, e2.index);
   1676         EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
   1677         EXPECT_EQ(TYPE_INT64, e2.type);
   1678         int64_t exposureTime = 100 * i;
   1679         EXPECT_EQ(exposureTime, *e2.data.i64);
   1680     }
   1681 
   1682 }
   1683 
   1684 TEST(camera_metadata, memcpy) {
   1685     camera_metadata_t *m = NULL;
   1686     const size_t entry_capacity = 50;
   1687     const size_t data_capacity = 450;
   1688 
   1689     int result;
   1690 
   1691     m = allocate_camera_metadata(entry_capacity, data_capacity);
   1692 
   1693     add_test_metadata(m, 5);
   1694 
   1695     size_t m_size = get_camera_metadata_size(m);
   1696     uint8_t *dst = new uint8_t[m_size];
   1697 
   1698     memcpy(dst, m, m_size);
   1699 
   1700     camera_metadata_t *m2 = reinterpret_cast<camera_metadata_t*>(dst);
   1701 
   1702     ASSERT_EQ(get_camera_metadata_size(m),
   1703             get_camera_metadata_size(m2));
   1704     EXPECT_EQ(get_camera_metadata_compact_size(m),
   1705             get_camera_metadata_compact_size(m2));
   1706     ASSERT_EQ(get_camera_metadata_entry_count(m),
   1707             get_camera_metadata_entry_count(m2));
   1708     EXPECT_EQ(get_camera_metadata_entry_capacity(m),
   1709             get_camera_metadata_entry_capacity(m2));
   1710     EXPECT_EQ(get_camera_metadata_data_count(m),
   1711             get_camera_metadata_data_count(m2));
   1712     EXPECT_EQ(get_camera_metadata_data_capacity(m),
   1713             get_camera_metadata_data_capacity(m2));
   1714 
   1715     camera_metadata_entry_t e1, e2;
   1716     for (size_t i = 0; i < get_camera_metadata_entry_count(m); i++) {
   1717         result = get_camera_metadata_entry(m, i, &e1);
   1718         ASSERT_EQ(OK, result);
   1719         result = get_camera_metadata_entry(m2, i, &e2);
   1720         ASSERT_EQ(OK, result);
   1721 
   1722         EXPECT_EQ(e1.index, e2.index);
   1723         EXPECT_EQ(e1.tag, e2.tag);
   1724         ASSERT_EQ(e1.type, e2.type);
   1725         ASSERT_EQ(e1.count, e2.count);
   1726 
   1727         ASSERT_TRUE(!memcmp(e1.data.u8, e2.data.u8,
   1728                         camera_metadata_type_size[e1.type] * e1.count));
   1729     }
   1730 
   1731     // Make sure updating one metadata buffer doesn't change the other
   1732 
   1733     int64_t double_exposure_time[] = { 100, 200 };
   1734 
   1735     result = update_camera_metadata_entry(m, 0,
   1736             double_exposure_time,
   1737             sizeof(double_exposure_time)/sizeof(int64_t), NULL);
   1738     EXPECT_EQ(OK, result);
   1739 
   1740     result = get_camera_metadata_entry(m, 0, &e1);
   1741     ASSERT_EQ(OK, result);
   1742     result = get_camera_metadata_entry(m2, 0, &e2);
   1743     ASSERT_EQ(OK, result);
   1744 
   1745     EXPECT_EQ(e1.index, e2.index);
   1746     EXPECT_EQ(e1.tag, e2.tag);
   1747     ASSERT_EQ(e1.type, e2.type);
   1748     ASSERT_EQ((size_t)2, e1.count);
   1749     ASSERT_EQ((size_t)1, e2.count);
   1750     EXPECT_EQ(100, e1.data.i64[0]);
   1751     EXPECT_EQ(200, e1.data.i64[1]);
   1752     EXPECT_EQ(100, e2.data.i64[0]);
   1753 
   1754     // And in the reverse direction as well
   1755 
   1756     double_exposure_time[0] = 300;
   1757     result = update_camera_metadata_entry(m2, 0,
   1758             double_exposure_time,
   1759             sizeof(double_exposure_time)/sizeof(int64_t), NULL);
   1760     EXPECT_EQ(OK, result);
   1761 
   1762     result = get_camera_metadata_entry(m, 0, &e1);
   1763     ASSERT_EQ(OK, result);
   1764     result = get_camera_metadata_entry(m2, 0, &e2);
   1765     ASSERT_EQ(OK, result);
   1766 
   1767     EXPECT_EQ(e1.index, e2.index);
   1768     EXPECT_EQ(e1.tag, e2.tag);
   1769     ASSERT_EQ(e1.type, e2.type);
   1770     ASSERT_EQ((size_t)2, e1.count);
   1771     ASSERT_EQ((size_t)2, e2.count);
   1772     EXPECT_EQ(100, e1.data.i64[0]);
   1773     EXPECT_EQ(200, e1.data.i64[1]);
   1774     EXPECT_EQ(300, e2.data.i64[0]);
   1775     EXPECT_EQ(200, e2.data.i64[1]);
   1776 
   1777     EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &m_size));
   1778 
   1779     delete[] dst;
   1780     FINISH_USING_CAMERA_METADATA(m);
   1781 }
   1782 
   1783 TEST(camera_metadata, data_alignment) {
   1784     // Verify that when we store the data, the data aligned as we expect
   1785     camera_metadata_t *m = NULL;
   1786     const size_t entry_capacity = 50;
   1787     const size_t data_capacity = 450;
   1788     char dummy_data[data_capacity] = {0,};
   1789 
   1790     int m_types[] = {
   1791         TYPE_BYTE,
   1792         TYPE_INT32,
   1793         TYPE_FLOAT,
   1794         TYPE_INT64,
   1795         TYPE_DOUBLE,
   1796         TYPE_RATIONAL
   1797     };
   1798     const size_t (&m_type_sizes)[NUM_TYPES] = camera_metadata_type_size;
   1799     size_t m_type_align[] = {
   1800         _Alignas(uint8_t),                    // BYTE
   1801         _Alignas(int32_t),                    // INT32
   1802         _Alignas(float),                      // FLOAT
   1803         _Alignas(int64_t),                    // INT64
   1804         _Alignas(double),                     // DOUBLE
   1805         _Alignas(camera_metadata_rational_t), // RATIONAL
   1806     };
   1807     /* arbitrary tags. the important thing is that their type
   1808        corresponds to m_type_sizes[i]
   1809        */
   1810     int m_type_tags[] = {
   1811         ANDROID_REQUEST_TYPE,
   1812         ANDROID_REQUEST_ID,
   1813         ANDROID_LENS_FOCUS_DISTANCE,
   1814         ANDROID_SENSOR_EXPOSURE_TIME,
   1815         ANDROID_JPEG_GPS_COORDINATES,
   1816         ANDROID_CONTROL_AE_COMPENSATION_STEP
   1817     };
   1818 
   1819     /*
   1820     if the asserts fail, its because we added more types.
   1821         this means the test should be updated to include more types.
   1822     */
   1823     ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_types)/sizeof(m_types[0]));
   1824     ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_align)/sizeof(m_type_align[0]));
   1825     ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_tags)/sizeof(m_type_tags[0]));
   1826 
   1827     for (int m_type = 0; m_type < (int)NUM_TYPES; ++m_type) {
   1828 
   1829         ASSERT_EQ(m_types[m_type],
   1830             get_camera_metadata_tag_type(m_type_tags[m_type]));
   1831 
   1832         // misalignment possibilities are [0,type_size) for any type pointer
   1833         for (size_t i = 0; i < m_type_sizes[m_type]; ++i) {
   1834 
   1835             /* data_count = 1, we may store data in the index.
   1836                data_count = 10, we will store data separately
   1837              */
   1838             for (int data_count = 1; data_count <= 10; data_count += 9) {
   1839 
   1840                 m = allocate_camera_metadata(entry_capacity, data_capacity);
   1841 
   1842                 // add dummy data to test various different padding requirements
   1843                 ASSERT_EQ(OK,
   1844                     add_camera_metadata_entry(m,
   1845                                               m_type_tags[TYPE_BYTE],
   1846                                               &dummy_data[0],
   1847                                               data_count + i));
   1848                 // insert the type we care to test
   1849                 ASSERT_EQ(OK,
   1850                     add_camera_metadata_entry(m, m_type_tags[m_type],
   1851                                              &dummy_data[0], data_count));
   1852 
   1853                 // now check the alignment for our desired type. it should be ok
   1854                 camera_metadata_ro_entry_t entry = camera_metadata_ro_entry_t();
   1855                 ASSERT_EQ(OK,
   1856                     find_camera_metadata_ro_entry(m, m_type_tags[m_type],
   1857                                                  &entry));
   1858 
   1859                 void* data_ptr = (void*)entry.data.u8;
   1860                 void* aligned_ptr = (void*)((uintptr_t)data_ptr & ~(m_type_align[m_type] - 1));
   1861                 EXPECT_EQ(aligned_ptr, data_ptr) <<
   1862                     "Wrong alignment for type " <<
   1863                     camera_metadata_type_names[m_type] <<
   1864                     " with " << (data_count + i) << " dummy bytes and " <<
   1865                     " data_count " << data_count <<
   1866                     " expected alignment was: " << m_type_align[m_type];
   1867 
   1868                 FINISH_USING_CAMERA_METADATA(m);
   1869             }
   1870         }
   1871     }
   1872 }
   1873 
   1874 TEST(camera_metadata, buffer_alignment) {
   1875     // Verify that misaligned metadata buffers only fail VALIDATION_SHIFTED, nothing else
   1876     const size_t entry_capacity = 50;
   1877     const size_t data_capacity = 450;
   1878     const size_t offsetRange = 16;
   1879     const uint32_t validAlignment = 8;
   1880 
   1881     camera_metadata_t *m = NULL;
   1882     m = allocate_camera_metadata(entry_capacity, data_capacity);
   1883 
   1884     add_test_metadata(m, 15);
   1885 
   1886     size_t m_size = get_camera_metadata_size(m);
   1887     size_t dst_size = m_size + offsetRange;
   1888     uint8_t *dst = new uint8_t[dst_size];
   1889 
   1890     for (size_t i = 0; i < offsetRange; i++) {
   1891         memset(dst, 0, dst_size);
   1892         memcpy(dst + i, m, m_size);
   1893         camera_metadata_t *m_shifted = (camera_metadata_t*)(dst + i);
   1894 
   1895         int err = validate_camera_metadata_structure(m_shifted, &m_size);
   1896         if (i % validAlignment == 0) {
   1897             ASSERT_EQ(OK, err) << "For alignment shift " << i << ", expected OK" ;
   1898         } else {
   1899             ASSERT_EQ(CAMERA_METADATA_VALIDATION_SHIFTED, err) <<
   1900                     "For alignment shift " << i << ", expected VALIDATION_SHIFTED" ;
   1901         }
   1902     }
   1903 
   1904     delete[] dst;
   1905     FINISH_USING_CAMERA_METADATA(m);
   1906 }
   1907