1d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/*
2d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
4d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * you may not use this file except in compliance with the License.
6d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * You may obtain a copy of the License at
7d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
8d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
10d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * See the License for the specific language governing permissions and
14d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * limitations under the License.
15d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
16d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
17f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala#define LOG_NDEBUG 1
18f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala#define LOG_TAG "camera_metadata_tests"
19f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
2094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala#include <errno.h>
2194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
2208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin#include <vector>
2308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin#include <algorithm>
248198c3b752e2fb00acb15345496e2a03eefb5ffbMark Salyzyn
258198c3b752e2fb00acb15345496e2a03eefb5ffbMark Salyzyn#include <gtest/gtest.h>
264df5a2bb302fb5cb61ab48dff7fa2b1984b6ced8Mark Salyzyn#include <log/log.h>
278198c3b752e2fb00acb15345496e2a03eefb5ffbMark Salyzyn
28d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "system/camera_metadata.h"
299c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk#include "camera_metadata_hidden.h"
30d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
31d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "camera_metadata_tests_fake_vendor.h"
32d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
33d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define EXPECT_NULL(x)     EXPECT_EQ((void*)0, x)
34d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define EXPECT_NOT_NULL(x) EXPECT_NE((void*)0, x)
357e59ded046175c20258be150cbc94be085924d28Zhijun He#define ARRAY_SIZE(a)      (sizeof(a) / sizeof((a)[0]))
36d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
37d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define OK    0
38d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define ERROR 1
3994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala#define NOT_FOUND (-ENOENT)
40d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
41555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin#define _Alignas(T) \
42555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ({struct _AlignasStruct { char c; T field; };       \
43555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        offsetof(struct _AlignasStruct, field); })
44555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
45d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin#define FINISH_USING_CAMERA_METADATA(m)                         \
46d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL)); \
47d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    free_camera_metadata(m);                                    \
48555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
49d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_normal) {
50d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
51d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
52d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
53d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
54d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
55d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
56d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
57d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
58d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
59d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
60d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
61d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
62d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
63d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
64d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
65d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_nodata) {
66d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
67d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
68d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(1, 0);
69d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
70d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
71d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
72d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)1, get_camera_metadata_entry_capacity(m));
73d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
74d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
75d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
76d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
77d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
78d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
79246a1adacce4854b91adc9635887453ba4f58e51Zhijun HeTEST(camera_metadata, clone_nodata) {
80246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    camera_metadata_t *src = NULL;
81246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    camera_metadata_t *copy = NULL;
82246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
83246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    src = allocate_camera_metadata(10, 0);
84246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
85246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)src);
86246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    copy = clone_camera_metadata(src);
87246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)copy);
88246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(copy));
89246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(copy));
90246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(copy));
91246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(copy));
92246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
93246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    FINISH_USING_CAMERA_METADATA(src);
94246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    FINISH_USING_CAMERA_METADATA(copy);
95246a1adacce4854b91adc9635887453ba4f58e51Zhijun He}
96246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
97d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_nothing) {
98d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
99d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
100d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(0, 0);
101d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
102246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)m);
103246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
104246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(m));
105246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
106246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
107d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
108d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
109d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_normal) {
110d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
111d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    void *buf = NULL;
112d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
113d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
114d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
115d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
116d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
117d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
118d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
119d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_TRUE(buf_size > 0);
120d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
121d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = malloc(buf_size);
122d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
123d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
124d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
125d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
126d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
127d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf, (uint8_t*)m);
128d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
129d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
130d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
131d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
132d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
133d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
134d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
135d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
136d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
137d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
138d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_nospace) {
139d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
140d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    void *buf = NULL;
141d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
142d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
143d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
144d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
145d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
146d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
147d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
148d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_GT(buf_size, (size_t)0);
149d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
150d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size--;
151d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
152d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = malloc(buf_size);
153d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
154d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
155d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
156d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
157d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
158d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(m);
159d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
160d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
161d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
162d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
163d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_extraspace) {
164d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
165d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = NULL;
166d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
167d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
168d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
169d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t extra_space = 10;
170d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
171d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
172d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
173d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
174d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_GT(buf_size, (size_t)0);
175d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
176d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size += extra_space;
177d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
178d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = (uint8_t*)malloc(buf_size);
179d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
180d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
181d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
182d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
183d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
184d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((uint8_t*)m, buf);
185d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
186d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
187d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
188d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
189d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf + buf_size - extra_space, (uint8_t*)m + get_camera_metadata_size(m));
190d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
191d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
192d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
193d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
194d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
195d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
196d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, get_size) {
197d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
198d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
199d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
200d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
201d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
202d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
203d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
204d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_size(m) );
205d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
206d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(0,0),
207d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_compact_size(m) );
208d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
209d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
210d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
211d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
212d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_get_normal) {
213d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
214d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
2157e59ded046175c20258be150cbc94be085924d28Zhijun He    const size_t data_capacity = 128;
216d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
217d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
218d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
219d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
220d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
221d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
222d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t data_used = 0;
223d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t entries_used = 0;
224d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
225d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // INT64
226d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
227d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t exposure_time = 1000000000;
228d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
229d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
230d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &exposure_time, 1);
231d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
232d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
233d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
234d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
235d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
236d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
237d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
238d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // INT32
239d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
240d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t sensitivity = 800;
241d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
242d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
243d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &sensitivity, 1);
244d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
245d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
246d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_SENSOR_SENSITIVITY), 1);
247d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
248d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
249d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
250d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
251d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // FLOAT
252d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
253d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    float focusDistance = 0.5f;
254d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
255d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
256d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &focusDistance, 1);
257d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
258d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
259d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_LENS_FOCUS_DISTANCE), 1);
260d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
261d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
262d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
263d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
264d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Array of FLOAT
265d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
2667e59ded046175c20258be150cbc94be085924d28Zhijun He    float colorCorrectionGains[] = {1.69f,  1.00f,  1.00f,  2.41f};
2677e59ded046175c20258be150cbc94be085924d28Zhijun He    result = add_camera_metadata_entry(m,
2687e59ded046175c20258be150cbc94be085924d28Zhijun He            ANDROID_COLOR_CORRECTION_GAINS,
2697e59ded046175c20258be150cbc94be085924d28Zhijun He            colorCorrectionGains, ARRAY_SIZE(colorCorrectionGains));
2707e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, result);
2717e59ded046175c20258be150cbc94be085924d28Zhijun He    data_used += calculate_camera_metadata_entry_data_size(
2727e59ded046175c20258be150cbc94be085924d28Zhijun He           get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_GAINS),
2737e59ded046175c20258be150cbc94be085924d28Zhijun He           ARRAY_SIZE(colorCorrectionGains));
2747e59ded046175c20258be150cbc94be085924d28Zhijun He    entries_used++;
2757e59ded046175c20258be150cbc94be085924d28Zhijun He
2767e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
2777e59ded046175c20258be150cbc94be085924d28Zhijun He
2787e59ded046175c20258be150cbc94be085924d28Zhijun He
2797e59ded046175c20258be150cbc94be085924d28Zhijun He    // Array of RATIONAL
2807e59ded046175c20258be150cbc94be085924d28Zhijun He
2817e59ded046175c20258be150cbc94be085924d28Zhijun He    camera_metadata_rational_t colorTransform[] = {
2827e59ded046175c20258be150cbc94be085924d28Zhijun He        {9, 10}, {0, 1}, {0, 1},
2837e59ded046175c20258be150cbc94be085924d28Zhijun He        {1, 5}, {1, 2}, {0, 1},
2847e59ded046175c20258be150cbc94be085924d28Zhijun He        {0, 1}, {1, 10}, {7, 10}
285d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    };
286d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
28708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_COLOR_CORRECTION_TRANSFORM,
2887e59ded046175c20258be150cbc94be085924d28Zhijun He            colorTransform, ARRAY_SIZE(colorTransform));
289d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
290d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
2917e59ded046175c20258be150cbc94be085924d28Zhijun He           get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_TRANSFORM),
2927e59ded046175c20258be150cbc94be085924d28Zhijun He           ARRAY_SIZE(colorTransform));
293d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
294d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
295d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
296d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
297d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Check added entries
298d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
2997e59ded046175c20258be150cbc94be085924d28Zhijun He    size_t index = 0;
300f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry entry;
3017e59ded046175c20258be150cbc94be085924d28Zhijun He
302d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3037e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
304d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3058baea5c0846f99e9305ffddb174e6cbb2d100a55Dan Albert    EXPECT_EQ(index, entry.index);
306f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
307f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, entry.type);
308f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
309f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(exposure_time, *entry.data.i64);
3107e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
311d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
312d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3137e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
314d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3157e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
316f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_SENSITIVITY, entry.tag);
317f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, entry.type);
318f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
319f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(sensitivity, *entry.data.i32);
3207e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
321d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
322d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3237e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
324d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3257e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
326f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
327f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
328f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
329f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focusDistance, *entry.data.f);
3307e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
331d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
332d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3337e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
334d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3357e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
3367e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ANDROID_COLOR_CORRECTION_GAINS, entry.tag);
337f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
3387e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ARRAY_SIZE(colorCorrectionGains), entry.count);
3397e59ded046175c20258be150cbc94be085924d28Zhijun He    for (unsigned int i=0; i < entry.count; i++) {
3407e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorCorrectionGains[i], entry.data.f[i]);
3417e59ded046175c20258be150cbc94be085924d28Zhijun He    }
3427e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
3437e59ded046175c20258be150cbc94be085924d28Zhijun He
3447e59ded046175c20258be150cbc94be085924d28Zhijun He    result = get_camera_metadata_entry(m,
3457e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
3467e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, result);
3477e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
3487e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ANDROID_COLOR_CORRECTION_TRANSFORM, entry.tag);
3497e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(TYPE_RATIONAL, entry.type);
3507e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ARRAY_SIZE(colorTransform), entry.count);
351f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (unsigned int i=0; i < entry.count; i++) {
3527e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorTransform[i].numerator, entry.data.r[i].numerator);
3537e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorTransform[i].denominator, entry.data.r[i].denominator);
354d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
3557e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
356d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
357d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
358d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_size(m) );
359d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
360d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entries_used, data_used),
361d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_compact_size(m) );
362d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
363f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
364f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
365f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
366d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
367d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
368d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
369d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
370d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalavoid add_test_metadata(camera_metadata_t *m, int entry_count) {
371d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
372d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
373d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
374d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
375d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t data_used = 0;
376d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t entries_used = 0;
377d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t exposure_time;
378d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i=0; i < entry_count; i++ ) {
379d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        exposure_time = 100 + i * 100;
380d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = add_camera_metadata_entry(m,
381d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                ANDROID_SENSOR_EXPOSURE_TIME,
382d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                &exposure_time, 1);
383d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
384d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        data_used += calculate_camera_metadata_entry_data_size(
385d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
386d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        entries_used++;
387d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
388d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_used, get_camera_metadata_data_count(m));
389d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entries_used, get_camera_metadata_entry_count(m));
3903154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    EXPECT_GE(get_camera_metadata_data_capacity(m),
391d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m));
392d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
393d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
394d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_get_toomany) {
395d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
396d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
397d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
398d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
399d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
400d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
401d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
402d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
403d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
404d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t sensitivity = 100;
405d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
406d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
407d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &sensitivity, 1);
408d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
409d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
410d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
411f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry entry;
412d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < entry_capacity; i++) {
413d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int64_t exposure_time = 100 + i * 100;
414d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
415f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i, &entry);
416d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
417f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, entry.index);
418f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
419f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, entry.type);
420f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ((size_t)1, entry.count);
421f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposure_time, *entry.data.i64);
422d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
423f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.tag = 1234;
424f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.type = 56;
425f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.data.u8 = NULL;
426f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.count = 7890;
427d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
428f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            entry_capacity, &entry);
429d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
430f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((uint32_t)1234, entry.tag);
431f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((uint8_t)56, entry.type);
432f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(NULL, entry.data.u8);
433f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)7890, entry.count);
434d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
435f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
436f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
437f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
438d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
439d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
440d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
441d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
4423154036acd2cc809388d08ff856198a8512f05f0Eino-Ville TalvalaTEST(camera_metadata, add_too_much_data) {
4433154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    camera_metadata_t *m = NULL;
4443154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    const size_t entry_capacity = 5;
4453154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    int result;
4463154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    size_t data_used = entry_capacity * calculate_camera_metadata_entry_data_size(
4473154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala        get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
4483154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity + 1, data_used);
4493154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4503154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4513154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    add_test_metadata(m, entry_capacity);
4523154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4533154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    int64_t exposure_time = 12345;
4543154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    result = add_camera_metadata_entry(m,
4553154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
4563154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala            &exposure_time, 1);
4573154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
4583154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
459d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
4603154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala}
4613154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
462d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, copy_metadata) {
463d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
464d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 50;
465d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 450;
466d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
467d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
468d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
469d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
470d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
471d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
472d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
473d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
474d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
475d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
476d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
477d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
478d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
479d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf, (uint8_t*)m2);
480d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
481d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
482d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
483d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
484d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
485d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
486d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_capacity(m2),
487d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
488d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
489d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
490f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
491d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
492f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
493d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
494f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
495d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
496f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
497f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
498f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
499f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
500f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
501f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
502f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
503f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
504d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
505d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
506d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
507d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
508d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
509d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
510d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
511d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
512d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
513d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, copy_metadata_extraspace) {
514d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
515d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 12;
516d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 100;
517d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
518d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t extra_space = 10;
519d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
520d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
521d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
522d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
523d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
524d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
525d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
526d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size += extra_space;
527d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
528d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
529d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
530d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
531d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
532d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
533d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf, (uint8_t*)m2);
534d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
535d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
536d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
537d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
538d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
539d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
540d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_capacity(m2),
541d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
542d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf + buf_size - extra_space,
543d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            (uint8_t*)m2 + get_camera_metadata_size(m2) );
544d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
545d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
546f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
547d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
548d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
549f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
550d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
551f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
552f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
553d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
554f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
555f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
556f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
557f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
558f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
559f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
560f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
561f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
562d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
563d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
564d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
565d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
566d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
567d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
568d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
569d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
570d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
571d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, copy_metadata_nospace) {
572d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
573d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
574d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
575d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
576d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
577d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
578d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
579d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
580d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
581d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
582d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
583d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size--;
584d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
585d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
586d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
587d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
588d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
589d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(m2);
590d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
591d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
592d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
593d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
594d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
595d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
596d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata) {
597d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
598d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
599d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
600d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
601d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
602d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
603d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
604d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
605d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
606d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
607d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
608d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
609d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity*2, data_capacity*2);
610d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
611d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
612d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
613d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
614d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
615d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
616f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
617f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
618f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
619f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
620d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
621d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
622d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
623d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
624f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
625d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
626f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
627d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
628f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
629f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
630d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
631f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
632f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
633f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
634f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
635f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
636f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
637f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
638f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
639d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
640d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
641d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
642d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
643d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
644d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
645d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
646f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m)*2,
647f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
648f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m)*2,
649f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
650d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
651d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
652d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
653d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
654f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
655d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
656d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
657d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
658f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i % entry_capacity, &e1);
659d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
660f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i % entry_capacity, e1.index);
661d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m2,
662f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i, &e2);
663d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
664f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
665f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
666f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
667f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
668f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
669f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
670f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
671f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
672d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
673d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
674d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
675d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
676d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
677d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
678d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
679d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata_nospace) {
680d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
681d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
682d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
683d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
684d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
685d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
686d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
687d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
688d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
689d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
690d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
691d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
692d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity-1, data_capacity);
693d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
694d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
695d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
696d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
697d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
698d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m2));
699d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m2));
700d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
701d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
702d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
703d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
704d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
705d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata_onespace) {
706d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
707d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
708d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
709d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity2 = entry_capacity * 2 - 2;
710d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity2 = data_capacity * 2;
711d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
712d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
713d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
714d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
715d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
716d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
717d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
718d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
719d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity2, data_capacity2);
720d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
721d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
722d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
723d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
724d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
725d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
726f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
727f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
728f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
729f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
730d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
731d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
732d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
733d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
734f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
735d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
736d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
737f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
738d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
739f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
740f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
741d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
742f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
743f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
744f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
745f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
746f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
747f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
748f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
749f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
750d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
751d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
752d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
753d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
754d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
755d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
756d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_count(m2));
757d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
758d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
759d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
760d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
761d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
762d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
763f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
764d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
765d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
766d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
767f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i % entry_capacity, &e1);
768d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
769f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i % entry_capacity, e1.index);
770f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
771d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
772f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
773f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
774f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
775f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
776f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
777f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
778f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
779f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
780d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
781d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
782d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
783d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
784d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
785d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
786d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
787d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, vendor_tags) {
788d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
789d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
790d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
791d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
792d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
793d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
794d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
795d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t superMode = 5;
796d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
797d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
798d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
799d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
800d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
801d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
802d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
803d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
804d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
805d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
806d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
807d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
808d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
809d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
810d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
811d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
8129c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk    set_camera_metadata_vendor_ops(&fakevendor_ops);
813d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
814d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
815d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
816d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
817d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
818d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
819d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
820d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
821d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
822d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
823d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
824d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
825d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
826d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
827d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SCALER_END,
828d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
829d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
830d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
831d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
832d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("com.fakevendor.sensor",
833d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
834d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("superMode",
835d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
836d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(TYPE_BYTE,
837d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
838d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
839d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("com.fakevendor.scaler",
840d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_section_name(FAKEVENDOR_SCALER_END));
841d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SCALER_END));
842d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SCALER_END));
843d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
8449c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk    set_camera_metadata_vendor_ops(NULL);
845d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    // TODO: fix vendor ops. Then the below 3 validations should fail.
846d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
847d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
848d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
849d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
850d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
851d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
852d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
853d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
854d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
855d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
856d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
857d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
858d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
859d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
860d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
861d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
862d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
863d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
864d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    // Remove all vendor entries so validation passes
865d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    {
866d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        camera_metadata_ro_entry_t entry;
867d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        EXPECT_EQ(OK, find_camera_metadata_ro_entry(m,
868d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                                                    FAKEVENDOR_SENSOR_SUPERMODE,
869d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                                                    &entry));
870d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        EXPECT_EQ(OK, delete_camera_metadata_entry(m, entry.index));
871d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    }
872d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
873d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
874d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
875d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
876d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_all_tags) {
877d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int total_tag_count = 0;
878d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
879d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        total_tag_count += camera_metadata_section_bounds[i][1] -
880d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                camera_metadata_section_bounds[i][0];
881d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
882d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int entry_data_count = 3;
883d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int conservative_data_space = total_tag_count * entry_data_count * 8;
884d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t data[entry_data_count * 8];
885d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t *data_int32 = (int32_t *)data;
886d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    float *data_float   = (float *)data;
887d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t *data_int64 = (int64_t *)data;
888d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    double *data_double = (double *)data;
889f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_rational_t *data_rational =
890f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            (camera_metadata_rational_t *)data;
891d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
892f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = allocate_camera_metadata(total_tag_count,
893f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            conservative_data_space);
894d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
895d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    ASSERT_NE((void*)NULL, (void*)m);
896d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
897d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
898d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
899d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int counter = 0;
900d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
901d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        for (uint32_t tag = camera_metadata_section_bounds[i][0];
902d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                tag < camera_metadata_section_bounds[i][1];
903d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             tag++, counter++) {
904d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            int type = get_camera_metadata_tag_type(tag);
905d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ASSERT_NE(-1, type);
906d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
907d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            switch (type) {
908d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_BYTE:
909d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[0] = tag & 0xFF;
910d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[1] = (tag >> 8) & 0xFF;
911d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[2] = (tag >> 16) & 0xFF;
912d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
913d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_INT32:
914d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[0] = tag;
915d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[1] = i;
916d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[2] = counter;
917d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
918d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_FLOAT:
919d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[0] = tag;
920d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[1] = i;
921d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[2] = counter / (float)total_tag_count;
922d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
923d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_INT64:
924d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[0] = (int64_t)tag | ( (int64_t)tag << 32);
925d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[1] = i;
926d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[2] = counter;
927d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
928d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_DOUBLE:
929d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[0] = tag;
930d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[1] = i;
931d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[2] = counter / (double)total_tag_count;
932d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
933d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_RATIONAL:
934d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[0].numerator = tag;
935d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[0].denominator = 1;
936d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[1].numerator = i;
937d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[1].denominator = 1;
938d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[2].numerator = counter;
939d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[2].denominator = total_tag_count;
940d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
941d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                default:
942d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    FAIL() << "Unknown type field encountered:" << type;
943d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
944d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            }
945d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            result = add_camera_metadata_entry(m,
946d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    tag,
947d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data,
948d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    entry_data_count);
949d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ASSERT_EQ(OK, result);
950d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
951d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
952d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
953d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
954f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
955f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
956f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
95794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
958d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
95994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala}
96094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
96194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville TalvalaTEST(camera_metadata, sort_metadata) {
96294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    camera_metadata_t *m = NULL;
96394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const size_t entry_capacity = 5;
96494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const size_t data_capacity = 100;
96594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
96694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int result;
96794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
96894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
96994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
97094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Add several unique entries in non-sorted order
97194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
9727e59ded046175c20258be150cbc94be085924d28Zhijun He    camera_metadata_rational_t colorTransform[] = {
9737e59ded046175c20258be150cbc94be085924d28Zhijun He        {9, 10}, {0, 1}, {0, 1},
9747e59ded046175c20258be150cbc94be085924d28Zhijun He        {1, 5}, {1, 2}, {0, 1},
9757e59ded046175c20258be150cbc94be085924d28Zhijun He        {0, 1}, {1, 10}, {7, 10}
97694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    };
97794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
97808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_COLOR_CORRECTION_TRANSFORM,
9797e59ded046175c20258be150cbc94be085924d28Zhijun He            colorTransform, ARRAY_SIZE(colorTransform));
98094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
98194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
98294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    float focus_distance = 0.5f;
98394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
98494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
98594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &focus_distance, 1);
98694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
98794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
98894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int64_t exposure_time = 1000000000;
98994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
99094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
99194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &exposure_time, 1);
99294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
99394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
99494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int32_t sensitivity = 800;
99594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
99694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
99794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &sensitivity, 1);
99894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
99994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
100094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Test unsorted find
1001f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry_t entry;
100294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
100394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
1004f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
100594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
1006f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1007f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.index);
1008f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1009f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1010f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
101194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
101294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
101308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_NOISE_REDUCTION_STRENGTH,
1014f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
101594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(NOT_FOUND, result);
1016f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.index);
1017f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1018f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1019f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1020f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
102194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
102294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Sort
1023f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
1024f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        std::cout << "Pre-sorted metadata" << std::endl;
1025f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
1026f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
102794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
102894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = sort_camera_metadata(m);
102994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
103094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
1031f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
1032f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        std::cout << "Sorted metadata" << std::endl;
1033f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
1034f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
103594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
103694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Test sorted find
103708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    size_t lensFocusIndex = -1;
103808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    {
103908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        std::vector<uint32_t> tags;
104008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_COLOR_CORRECTION_TRANSFORM);
104108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_LENS_FOCUS_DISTANCE);
104208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_SENSOR_EXPOSURE_TIME);
104308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_SENSOR_SENSITIVITY);
104408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        std::sort(tags.begin(), tags.end());
104508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
104608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        lensFocusIndex =
104708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            std::find(tags.begin(), tags.end(), ANDROID_LENS_FOCUS_DISTANCE)
104808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            - tags.begin();
104908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
105094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
105194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
105294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
1053f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
105494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
105508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    EXPECT_EQ(lensFocusIndex, entry.index);
1056f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1057f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1058f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, (size_t)entry.count);
1059f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
106094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
106194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
106208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_NOISE_REDUCTION_STRENGTH,
1063f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
106494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(NOT_FOUND, result);
106508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    EXPECT_EQ(lensFocusIndex, entry.index);
1066f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1067f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1068f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1069f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
107094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
1071d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
1072d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
1073d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
1074f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1075f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaTEST(camera_metadata, delete_metadata) {
1076f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = NULL;
1077f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t entry_capacity = 50;
1078f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t data_capacity = 450;
1079f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1080f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int result;
1081f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1082f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1083f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1084f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_entries = 5;
1085f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t data_per_entry =
1086f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1087f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_data = num_entries * data_per_entry;
1088f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1089f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete an entry with data
1090f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1091f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    add_test_metadata(m, num_entries);
1092f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1093f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1094f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1095f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 1);
1096f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1097f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1098f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1099f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1100f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1101f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1102f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1103f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1104f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1105f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1106f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1107f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1108f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1109f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1110f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1111f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1112f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1113f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1114f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e;
1115f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e);
1116f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1117f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e.index);
1118f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1119f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e.type);
1120f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1121f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e.data.i64);
1122f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1123f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1124f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete an entry with no data, at end of array
1125f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1126f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t frameCount = 12;
1127f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1128f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1129f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1130f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1131f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1132f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1133f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1134f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1135f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1136f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1137f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1138f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry e;
1139f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m, 4, &e);
1140f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1141f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1142f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.index);
1143f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1144f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1145f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1146f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1147f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1148f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1149f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1150f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1151f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1152f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1153f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1154f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1155f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1156f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1157f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1158f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1159f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1160f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m, 4, &e);
1161f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1162f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1163f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1164f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1165f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1166f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1167f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1168f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete with extra data on end of array
1169f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 3);
1170f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1171f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1172f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1173f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1174f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1175f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1176f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1177f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1178f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1179f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1180f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1181f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1182f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1183f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1184f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1185f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete without extra data in front of array
1186f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1187f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    frameCount = 1001;
1188f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1189f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1190f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1191f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1192f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1193f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1194f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1195f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1196f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1197f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1198f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1199f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = sort_camera_metadata(m);
1200f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1201f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1202f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1203f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1204f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1205f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1206f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1207f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1208f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1209f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1210f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1211f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, e.index);
1212f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1213f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1214f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1215f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1216f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1217f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1218f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1219f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1220f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1221f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1222f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1223f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1224f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1225f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1226f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1227f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1228f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1229f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1230f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala}
1231f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1232f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaTEST(camera_metadata, update_metadata) {
1233f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = NULL;
1234f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t entry_capacity = 50;
1235f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t data_capacity = 450;
1236f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1237f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int result;
1238f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1239f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1240f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1241f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_entries = 5;
1242f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t data_per_entry =
1243f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1244f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_data = num_entries * data_per_entry;
1245f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1246f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    add_test_metadata(m, num_entries);
1247f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1248f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1249f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1250f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with same-size data, doesn't fit in entry
1251f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1252f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int64_t newExposureTime = 1000;
1253f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry_t e;
1254f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1255f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newExposureTime, 1, &e);
1256f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1257f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1258f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1259f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1260f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1261f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1262f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1263f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1264f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1265f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1266f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1267f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1268f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1269f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1270f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1271f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1272f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1273f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1274f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1275f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1276f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1277f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1278f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1279f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1280f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1281f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1282f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1283f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1284f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1285f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with larger data
1286f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int64_t newExposures[2] = { 5000, 6000 };
1287f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1288f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, newExposures, 2, &e);
1289f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1290f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += data_per_entry;
1291f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1292f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1293f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1294f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1295f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1296f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1297f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1298f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1299f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1300f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1301f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1302f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1303f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1304f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1305f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1306f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1307f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1308f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1309f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1310f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1311f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1312f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1313f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1314f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1315f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1316f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1317f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1318f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1319f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1320f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1321f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1322f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1323f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1324f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with smaller data
1325f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newExposureTime = 100;
1326f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1327f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newExposureTime, 1, &e);
1328f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1329f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1330f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1331f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1332f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1333f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1334f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1335f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1336f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1337f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1338f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1339f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1340f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1341f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1342f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1343f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1344f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1345f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1346f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1347f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1348f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1349f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1350f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1351f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1352f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1353f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1354f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1355f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1356f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1357f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1358f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1359f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1360f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1361f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1362f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with size fitting in entry
1363f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1364f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t frameCount = 1001;
1365f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1366f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1367f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1368f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1369f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1370f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1371f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1372f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1373f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1374f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1375f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1376f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = sort_camera_metadata(m);
1377f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1378f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1379f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1380f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1381f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1382f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1383f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1384f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1385f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1386f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1387f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1388f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t newFrameCount = 0x12349876;
1389f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1390f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1391f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1392f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1393f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1394f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1395f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1396f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1397f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1398f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1399f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1400f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1401f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1402f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1403f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1404f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1405f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1406f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1407f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1408f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1409f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1410f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1411f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1412f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1413f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1414f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1415f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1416f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1417f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1418f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1419f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1420f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update to bigger than entry
1421f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1422f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t newFrameCounts[4] = { 0x0, 0x1, 0x10, 0x100 };
1423f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1424f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1425f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCounts, 4, &e);
1426f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1427f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1428f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1429f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += calculate_camera_metadata_entry_data_size(TYPE_INT32,
1430f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            4);
1431f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1432f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1433f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1434f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1435f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1436f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1437f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1438f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.count);
1439f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1440f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1441f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1442f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1443f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1444f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1445f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1446f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1447f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1448f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1449f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1450f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1451f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1452f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1453f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.count);
1454f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1455f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1456f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1457f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1458f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1459f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1460f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1461f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1462f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1463f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1464f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1465f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1466f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1467f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1468f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1469f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1470f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update to smaller than entry
1471f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1472f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1473f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1474f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1475f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1476f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= camera_metadata_type_size[TYPE_INT32] * 4;
1477f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1478f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1479f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1480f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1481f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1482f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1483f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1484f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1485f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1486f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1487f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1488f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1489f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1490f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1491f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1492f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1493f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1494f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1495f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1496f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1497f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1498f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1499f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1500f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1501f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1502f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1503f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1504f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1505f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1506f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1507f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1508f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Setup new buffer with no spare data space
1509f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1510f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1511f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, newExposures, 2, &e);
1512f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1513f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1514f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += data_per_entry;
1515f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1516f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1517f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1518f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1519f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1520f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1521f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1522f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1523f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1524f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1525f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1526f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m2;
1527f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m2 = allocate_camera_metadata(get_camera_metadata_entry_count(m),
1528f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m));
1529f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_NOT_NULL(m2);
1530f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1531f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = append_camera_metadata(m2, m);
1532f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1533f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1534f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1535f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1536f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1537f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1538f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1539f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1540f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1541f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1542f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1543f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1544f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no more room
1545f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1546f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1547f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCounts, 4, &e);
1548f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1549f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1550f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1551f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1552f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1553f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1554f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1555f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1556f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1557f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1558f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1559f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but change fits into entry
1560f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1561f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newFrameCount = 5;
1562f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1563f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1564f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1565f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1566f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1567f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1568f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1569f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1570f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1571f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1572f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1573f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1574f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1575f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1576f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1577f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1578f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1579f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1580f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1581f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1582f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1583f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1584f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1585f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m2, 1, &e);
1586f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1587f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1588f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1589f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1590f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1591f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1592f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1593f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1594f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1595f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1596f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1597f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1598f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1599f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1600f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1601f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1602f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1603f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1604f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but data size doesn't change
1605f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1606f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newExposures[0] = 1000;
1607f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1608f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1609f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, newExposures, 2, &e);
1610f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1611f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1612f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1613f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1614f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1615f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1616f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1617f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1618f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1619f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1620f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1621f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1622f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1623f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1624f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1625f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1626f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1627f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1628f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1629f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1630f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1631f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1632f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1633f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1634f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1635f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1636f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1637f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1638f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1639f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1640f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1641f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1642f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1643f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but data size shrinks
1644f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1645f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1646f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, &newExposureTime, 1, &e);
1647f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1648f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1649f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= calculate_camera_metadata_entry_data_size(TYPE_INT64, 2);
1650f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1651f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1652f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1653f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1654f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1655f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1656f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1657f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1658f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1659f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, e.data.i64[0]);
1660f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1661f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1662f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1663f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1664f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1665f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1666f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1667f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1668f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1669f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1670f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1671f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1672f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1673f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1674f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1675f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1676f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1677f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1678f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1679f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1680f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1681f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1682f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala}
168398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
1684b10d56ad43a91924d3666127963e5fdce725389cEino-Ville TalvalaTEST(camera_metadata, memcpy) {
1685b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_t *m = NULL;
1686b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    const size_t entry_capacity = 50;
1687b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    const size_t data_capacity = 450;
1688b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1689b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    int result;
1690b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1691b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1692b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1693b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    add_test_metadata(m, 5);
1694b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1695d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    size_t m_size = get_camera_metadata_size(m);
1696d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    uint8_t *dst = new uint8_t[m_size];
1697b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1698d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    memcpy(dst, m, m_size);
1699b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1700b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_t *m2 = reinterpret_cast<camera_metadata_t*>(dst);
1701b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1702b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(get_camera_metadata_size(m),
1703b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_size(m2));
1704b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_compact_size(m),
1705b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_compact_size(m2));
1706b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(get_camera_metadata_entry_count(m),
1707b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_entry_count(m2));
1708b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_capacity(m),
1709b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_entry_capacity(m2));
1710b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
1711b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_data_count(m2));
1712b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_capacity(m),
1713b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_data_capacity(m2));
1714b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1715b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_entry_t e1, e2;
1716b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    for (size_t i = 0; i < get_camera_metadata_entry_count(m); i++) {
1717b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
1718b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(OK, result);
1719b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1720b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(OK, result);
1721b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1722b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
1723b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
1724b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(e1.type, e2.type);
1725b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(e1.count, e2.count);
1726b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1727b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_TRUE(!memcmp(e1.data.u8, e2.data.u8,
1728b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala                        camera_metadata_type_size[e1.type] * e1.count));
1729b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    }
1730b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1731b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    // Make sure updating one metadata buffer doesn't change the other
1732b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1733b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    int64_t double_exposure_time[] = { 100, 200 };
1734b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1735b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = update_camera_metadata_entry(m, 0,
1736b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            double_exposure_time,
1737b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1738b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(OK, result);
1739b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1740b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m, 0, &e1);
1741b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1742b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m2, 0, &e2);
1743b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1744b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1745b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.index, e2.index);
1746b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.tag, e2.tag);
1747b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(e1.type, e2.type);
1748b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e1.count);
1749b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)1, e2.count);
1750b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e1.data.i64[0]);
1751b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e1.data.i64[1]);
1752b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e2.data.i64[0]);
1753b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1754b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    // And in the reverse direction as well
1755b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1756b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    double_exposure_time[0] = 300;
1757b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = update_camera_metadata_entry(m2, 0,
1758b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            double_exposure_time,
1759b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1760b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(OK, result);
1761b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1762b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m, 0, &e1);
1763b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1764b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m2, 0, &e2);
1765b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1766b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1767b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.index, e2.index);
1768b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.tag, e2.tag);
1769b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(e1.type, e2.type);
1770b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e1.count);
1771b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e2.count);
1772b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e1.data.i64[0]);
1773b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e1.data.i64[1]);
1774b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(300, e2.data.i64[0]);
1775b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e2.data.i64[1]);
1776b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1777d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &m_size));
1778d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
17798baea5c0846f99e9305ffddb174e6cbb2d100a55Dan Albert    delete[] dst;
1780d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
1781b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala}
1782555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1783555aac882ed63e70019c78ccc58032a5be0f58ecIgor MurashkinTEST(camera_metadata, data_alignment) {
1784555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    // Verify that when we store the data, the data aligned as we expect
1785555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    camera_metadata_t *m = NULL;
1786555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t entry_capacity = 50;
1787555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t data_capacity = 450;
1788555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    char dummy_data[data_capacity] = {0,};
1789555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1790555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    int m_types[] = {
1791555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_BYTE,
1792555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_INT32,
1793555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_FLOAT,
1794555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_INT64,
1795555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_DOUBLE,
1796555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_RATIONAL
1797555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1798555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t (&m_type_sizes)[NUM_TYPES] = camera_metadata_type_size;
1799555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    size_t m_type_align[] = {
1800555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(uint8_t),                    // BYTE
1801555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(int32_t),                    // INT32
1802555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(float),                      // FLOAT
1803555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(int64_t),                    // INT64
1804555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(double),                     // DOUBLE
1805555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(camera_metadata_rational_t), // RATIONAL
1806555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1807555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    /* arbitrary tags. the important thing is that their type
1808555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin       corresponds to m_type_sizes[i]
1809555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin       */
1810555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    int m_type_tags[] = {
1811555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_REQUEST_TYPE,
1812555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_REQUEST_ID,
1813555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_LENS_FOCUS_DISTANCE,
1814555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_SENSOR_EXPOSURE_TIME,
1815555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_JPEG_GPS_COORDINATES,
1816f94330452c56b7f6a513f377d3fc20fabec389c1Eino-Ville Talvala        ANDROID_CONTROL_AE_COMPENSATION_STEP
1817555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1818555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1819555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    /*
1820555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    if the asserts fail, its because we added more types.
1821555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        this means the test should be updated to include more types.
1822555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    */
1823555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_types)/sizeof(m_types[0]));
1824555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_align)/sizeof(m_type_align[0]));
1825555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_tags)/sizeof(m_type_tags[0]));
1826555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1827555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    for (int m_type = 0; m_type < (int)NUM_TYPES; ++m_type) {
1828555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1829555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ASSERT_EQ(m_types[m_type],
1830555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            get_camera_metadata_tag_type(m_type_tags[m_type]));
1831555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1832555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        // misalignment possibilities are [0,type_size) for any type pointer
1833555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        for (size_t i = 0; i < m_type_sizes[m_type]; ++i) {
1834555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1835555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            /* data_count = 1, we may store data in the index.
1836555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin               data_count = 10, we will store data separately
1837555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin             */
1838555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            for (int data_count = 1; data_count <= 10; data_count += 9) {
1839555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1840555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                m = allocate_camera_metadata(entry_capacity, data_capacity);
1841555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1842555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // add dummy data to test various different padding requirements
1843555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1844555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    add_camera_metadata_entry(m,
1845555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              m_type_tags[TYPE_BYTE],
1846555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              &dummy_data[0],
1847555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              data_count + i));
1848555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // insert the type we care to test
1849555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1850555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    add_camera_metadata_entry(m, m_type_tags[m_type],
1851555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                             &dummy_data[0], data_count));
1852555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1853555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // now check the alignment for our desired type. it should be ok
1854555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                camera_metadata_ro_entry_t entry = camera_metadata_ro_entry_t();
1855555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1856555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    find_camera_metadata_ro_entry(m, m_type_tags[m_type],
1857555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                                 &entry));
1858555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1859555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                void* data_ptr = (void*)entry.data.u8;
1860555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                void* aligned_ptr = (void*)((uintptr_t)data_ptr & ~(m_type_align[m_type] - 1));
1861555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                EXPECT_EQ(aligned_ptr, data_ptr) <<
1862555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    "Wrong alignment for type " <<
1863555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    camera_metadata_type_names[m_type] <<
1864555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " with " << (data_count + i) << " dummy bytes and " <<
1865555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " data_count " << data_count <<
1866555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " expected alignment was: " << m_type_align[m_type];
1867555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1868d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                FINISH_USING_CAMERA_METADATA(m);
1869555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            }
1870555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        }
1871555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    }
1872555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin}
18730b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18740b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville TalvalaTEST(camera_metadata, buffer_alignment) {
18750b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    // Verify that misaligned metadata buffers only fail VALIDATION_SHIFTED, nothing else
18760b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    const size_t entry_capacity = 50;
18770b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    const size_t data_capacity = 450;
18780b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    const size_t offsetRange = 16;
18790b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    const uint32_t validAlignment = 8;
18800b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18810b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    camera_metadata_t *m = NULL;
18820b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
18830b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18840b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    add_test_metadata(m, 15);
18850b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18860b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    size_t m_size = get_camera_metadata_size(m);
18870b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    size_t dst_size = m_size + offsetRange;
18880b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    uint8_t *dst = new uint8_t[dst_size];
18890b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18900b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    for (size_t i = 0; i < offsetRange; i++) {
18910b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        memset(dst, 0, dst_size);
18920b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        memcpy(dst + i, m, m_size);
18930b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        camera_metadata_t *m_shifted = (camera_metadata_t*)(dst + i);
18940b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
18950b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        int err = validate_camera_metadata_structure(m_shifted, &m_size);
18960b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        if (i % validAlignment == 0) {
18970b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala            ASSERT_EQ(OK, err) << "For alignment shift " << i << ", expected OK" ;
18980b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        } else {
18990b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala            ASSERT_EQ(CAMERA_METADATA_VALIDATION_SHIFTED, err) <<
19000b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala                    "For alignment shift " << i << ", expected VALIDATION_SHIFTED" ;
19010b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala        }
19020b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    }
19030b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala
19040b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    delete[] dst;
19050b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala    FINISH_USING_CAMERA_METADATA(m);
19060b47c6ef73b7ca796b506c9b3feb50343863ce9cEino-Ville Talvala}
1907