camera_metadata_tests.cpp revision 9c13e191ea2d9622d00621d6acb009a9a759dc92
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#include "cutils/log.h"
20f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
2194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala#include <errno.h>
2294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
2308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin#include <vector>
2408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin#include <algorithm>
25d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "gtest/gtest.h"
26d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "system/camera_metadata.h"
279c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk#include "camera_metadata_hidden.h"
28d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
29d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "camera_metadata_tests_fake_vendor.h"
30d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
31d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define EXPECT_NULL(x)     EXPECT_EQ((void*)0, x)
32d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define EXPECT_NOT_NULL(x) EXPECT_NE((void*)0, x)
337e59ded046175c20258be150cbc94be085924d28Zhijun He#define ARRAY_SIZE(a)      (sizeof(a) / sizeof((a)[0]))
34d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
35d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define OK    0
36d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#define ERROR 1
3794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala#define NOT_FOUND (-ENOENT)
38d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
39555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin#define _Alignas(T) \
40555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ({struct _AlignasStruct { char c; T field; };       \
41555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        offsetof(struct _AlignasStruct, field); })
42555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
43d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin#define FINISH_USING_CAMERA_METADATA(m)                         \
44d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL)); \
45d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    free_camera_metadata(m);                                    \
46555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
47d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_normal) {
48d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
49d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
50d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
51d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
52d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
53d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
54d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
55d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
56d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
57d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
58d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
59d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
60d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
61d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
62d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
63d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_nodata) {
64d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
65d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
66d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(1, 0);
67d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
68d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
69d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
70d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)1, get_camera_metadata_entry_capacity(m));
71d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
72d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
73d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
74d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
75d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
76d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
77246a1adacce4854b91adc9635887453ba4f58e51Zhijun HeTEST(camera_metadata, clone_nodata) {
78246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    camera_metadata_t *src = NULL;
79246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    camera_metadata_t *copy = NULL;
80246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
81246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    src = allocate_camera_metadata(10, 0);
82246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
83246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)src);
84246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    copy = clone_camera_metadata(src);
85246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)copy);
86246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(copy));
87246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(copy));
88246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(copy));
89246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(copy));
90246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
91246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    FINISH_USING_CAMERA_METADATA(src);
92246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    FINISH_USING_CAMERA_METADATA(copy);
93246a1adacce4854b91adc9635887453ba4f58e51Zhijun He}
94246a1adacce4854b91adc9635887453ba4f58e51Zhijun He
95d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, allocate_nothing) {
96d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
97d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
98d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(0, 0);
99d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
100246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    ASSERT_NE((void*)NULL, (void*)m);
101246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
102246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_entry_capacity(m));
103246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
104246a1adacce4854b91adc9635887453ba4f58e51Zhijun He    EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m));
105d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
106d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
107d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_normal) {
108d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
109d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    void *buf = NULL;
110d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
111d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
112d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
113d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
114d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
115d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
116d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
117d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_TRUE(buf_size > 0);
118d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
119d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = malloc(buf_size);
120d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
121d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
122d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
123d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
124d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
125d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf, (uint8_t*)m);
126d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
127d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
128d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
129d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
130d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
131d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
132d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
133d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
134d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
135d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
136d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_nospace) {
137d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
138d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    void *buf = NULL;
139d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
140d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
141d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
142d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
143d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
144d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
145d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
146d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_GT(buf_size, (size_t)0);
147d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
148d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size--;
149d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
150d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = malloc(buf_size);
151d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
152d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
153d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
154d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
155d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
156d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(m);
157d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
158d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
159d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
160d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
161d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, place_extraspace) {
162d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
163d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = NULL;
164d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
165d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
166d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
167d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t extra_space = 10;
168d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
169d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = calculate_camera_metadata_size(entry_capacity,
170d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            data_capacity);
171d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
172d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_GT(buf_size, (size_t)0);
173d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
174d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size += extra_space;
175d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
176d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf = (uint8_t*)malloc(buf_size);
177d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
178d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
179d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
180d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity);
181d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
182d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((uint8_t*)m, buf);
183d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m));
184d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
185d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m));
186d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
187d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf + buf_size - extra_space, (uint8_t*)m + get_camera_metadata_size(m));
188d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
189d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, &buf_size));
190d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
191d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
192d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
193d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
194d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, get_size) {
195d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
196d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
197d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 32;
198d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
199d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
200d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
201d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
202d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_size(m) );
203d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
204d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(0,0),
205d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_compact_size(m) );
206d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
207d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
208d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
209d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
210d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_get_normal) {
211d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
212d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
2137e59ded046175c20258be150cbc94be085924d28Zhijun He    const size_t data_capacity = 128;
214d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
215d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
216d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
217d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
218d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
219d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
220d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t data_used = 0;
221d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t entries_used = 0;
222d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
223d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // INT64
224d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
225d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t exposure_time = 1000000000;
226d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
227d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
228d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &exposure_time, 1);
229d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
230d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
231d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
232d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
233d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
234d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
235d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
236d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // INT32
237d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
238d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t sensitivity = 800;
239d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
240d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
241d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &sensitivity, 1);
242d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
243d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
244d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_SENSOR_SENSITIVITY), 1);
245d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
246d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
247d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
248d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
249d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // FLOAT
250d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
251d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    float focusDistance = 0.5f;
252d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
253d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
254d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &focusDistance, 1);
255d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
256d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
257d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(ANDROID_LENS_FOCUS_DISTANCE), 1);
258d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
259d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
260d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
261d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
262d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Array of FLOAT
263d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
2647e59ded046175c20258be150cbc94be085924d28Zhijun He    float colorCorrectionGains[] = {1.69f,  1.00f,  1.00f,  2.41f};
2657e59ded046175c20258be150cbc94be085924d28Zhijun He    result = add_camera_metadata_entry(m,
2667e59ded046175c20258be150cbc94be085924d28Zhijun He            ANDROID_COLOR_CORRECTION_GAINS,
2677e59ded046175c20258be150cbc94be085924d28Zhijun He            colorCorrectionGains, ARRAY_SIZE(colorCorrectionGains));
2687e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, result);
2697e59ded046175c20258be150cbc94be085924d28Zhijun He    data_used += calculate_camera_metadata_entry_data_size(
2707e59ded046175c20258be150cbc94be085924d28Zhijun He           get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_GAINS),
2717e59ded046175c20258be150cbc94be085924d28Zhijun He           ARRAY_SIZE(colorCorrectionGains));
2727e59ded046175c20258be150cbc94be085924d28Zhijun He    entries_used++;
2737e59ded046175c20258be150cbc94be085924d28Zhijun He
2747e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
2757e59ded046175c20258be150cbc94be085924d28Zhijun He
2767e59ded046175c20258be150cbc94be085924d28Zhijun He
2777e59ded046175c20258be150cbc94be085924d28Zhijun He    // Array of RATIONAL
2787e59ded046175c20258be150cbc94be085924d28Zhijun He
2797e59ded046175c20258be150cbc94be085924d28Zhijun He    camera_metadata_rational_t colorTransform[] = {
2807e59ded046175c20258be150cbc94be085924d28Zhijun He        {9, 10}, {0, 1}, {0, 1},
2817e59ded046175c20258be150cbc94be085924d28Zhijun He        {1, 5}, {1, 2}, {0, 1},
2827e59ded046175c20258be150cbc94be085924d28Zhijun He        {0, 1}, {1, 10}, {7, 10}
283d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    };
284d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
28508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_COLOR_CORRECTION_TRANSFORM,
2867e59ded046175c20258be150cbc94be085924d28Zhijun He            colorTransform, ARRAY_SIZE(colorTransform));
287d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
288d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    data_used += calculate_camera_metadata_entry_data_size(
2897e59ded046175c20258be150cbc94be085924d28Zhijun He           get_camera_metadata_tag_type(ANDROID_COLOR_CORRECTION_TRANSFORM),
2907e59ded046175c20258be150cbc94be085924d28Zhijun He           ARRAY_SIZE(colorTransform));
291d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    entries_used++;
292d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
293d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
294d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
295d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Check added entries
296d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
2977e59ded046175c20258be150cbc94be085924d28Zhijun He    size_t index = 0;
298f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry entry;
2997e59ded046175c20258be150cbc94be085924d28Zhijun He
300d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3017e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
302d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3037e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, (int)entry.index);
304f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
305f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, entry.type);
306f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
307f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(exposure_time, *entry.data.i64);
3087e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
309d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
310d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3117e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
312d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3137e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
314f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_SENSITIVITY, entry.tag);
315f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, entry.type);
316f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
317f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(sensitivity, *entry.data.i32);
3187e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
319d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
320d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3217e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
322d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3237e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
324f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
325f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
326f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
327f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focusDistance, *entry.data.f);
3287e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
329d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
330d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
3317e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
332d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
3337e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
3347e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ANDROID_COLOR_CORRECTION_GAINS, entry.tag);
335f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
3367e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ARRAY_SIZE(colorCorrectionGains), entry.count);
3377e59ded046175c20258be150cbc94be085924d28Zhijun He    for (unsigned int i=0; i < entry.count; i++) {
3387e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorCorrectionGains[i], entry.data.f[i]);
3397e59ded046175c20258be150cbc94be085924d28Zhijun He    }
3407e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
3417e59ded046175c20258be150cbc94be085924d28Zhijun He
3427e59ded046175c20258be150cbc94be085924d28Zhijun He    result = get_camera_metadata_entry(m,
3437e59ded046175c20258be150cbc94be085924d28Zhijun He            index, &entry);
3447e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(OK, result);
3457e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(index, entry.index);
3467e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ANDROID_COLOR_CORRECTION_TRANSFORM, entry.tag);
3477e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(TYPE_RATIONAL, entry.type);
3487e59ded046175c20258be150cbc94be085924d28Zhijun He    EXPECT_EQ(ARRAY_SIZE(colorTransform), entry.count);
349f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (unsigned int i=0; i < entry.count; i++) {
3507e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorTransform[i].numerator, entry.data.r[i].numerator);
3517e59ded046175c20258be150cbc94be085924d28Zhijun He        EXPECT_EQ(colorTransform[i].denominator, entry.data.r[i].denominator);
352d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
3537e59ded046175c20258be150cbc94be085924d28Zhijun He    index++;
354d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
355d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity),
356d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_size(m) );
357d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
358d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(calculate_camera_metadata_size(entries_used, data_used),
359d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_compact_size(m) );
360d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
361f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
362f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
363f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
364d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
365d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
366d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
367d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
368d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalavoid add_test_metadata(camera_metadata_t *m, int entry_count) {
369d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
370d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m);
371d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
372d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
373d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t data_used = 0;
374d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t entries_used = 0;
375d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t exposure_time;
376d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i=0; i < entry_count; i++ ) {
377d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        exposure_time = 100 + i * 100;
378d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = add_camera_metadata_entry(m,
379d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                ANDROID_SENSOR_EXPOSURE_TIME,
380d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                &exposure_time, 1);
381d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
382d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        data_used += calculate_camera_metadata_entry_data_size(
383d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
384d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        entries_used++;
385d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
386d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_used, get_camera_metadata_data_count(m));
387d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entries_used, get_camera_metadata_entry_count(m));
3883154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    EXPECT_GE(get_camera_metadata_data_capacity(m),
389d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m));
390d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
391d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
392d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_get_toomany) {
393d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
394d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
395d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
396d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
397d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
398d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
399d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
400d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
401d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
402d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t sensitivity = 100;
403d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
404d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
405d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &sensitivity, 1);
406d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
407d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
408d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
409f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry entry;
410d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < entry_capacity; i++) {
411d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int64_t exposure_time = 100 + i * 100;
412d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
413f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i, &entry);
414d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
415f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, entry.index);
416f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag);
417f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, entry.type);
418f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ((size_t)1, entry.count);
419f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposure_time, *entry.data.i64);
420d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
421f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.tag = 1234;
422f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.type = 56;
423f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.data.u8 = NULL;
424f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    entry.count = 7890;
425d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = get_camera_metadata_entry(m,
426f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            entry_capacity, &entry);
427d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
428f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((uint32_t)1234, entry.tag);
429f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((uint8_t)56, entry.type);
430f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(NULL, entry.data.u8);
431f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)7890, entry.count);
432d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
433f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
434f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
435f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
436d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
437d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
438d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
439d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
4403154036acd2cc809388d08ff856198a8512f05f0Eino-Ville TalvalaTEST(camera_metadata, add_too_much_data) {
4413154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    camera_metadata_t *m = NULL;
4423154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    const size_t entry_capacity = 5;
4433154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    int result;
4443154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    size_t data_used = entry_capacity * calculate_camera_metadata_entry_data_size(
4453154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala        get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1);
4463154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity + 1, data_used);
4473154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4483154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4493154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    add_test_metadata(m, entry_capacity);
4503154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
4513154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    int64_t exposure_time = 12345;
4523154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    result = add_camera_metadata_entry(m,
4533154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
4543154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala            &exposure_time, 1);
4553154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
4563154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
457d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
4583154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala}
4593154036acd2cc809388d08ff856198a8512f05f0Eino-Ville Talvala
460d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, copy_metadata) {
461d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
462d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 50;
463d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 450;
464d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
465d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
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    int result;
521d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
522d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
523d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
524d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
525d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
526d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
527d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
528d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size += extra_space;
529d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
530d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
531d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
532d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
533d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
534d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
535d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf, (uint8_t*)m2);
536d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
537d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
538d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
539d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
540d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_capacity(m2),
541d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_entry_count(m2));
542d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_capacity(m2),
543d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
544d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(buf + buf_size - extra_space,
545d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            (uint8_t*)m2 + get_camera_metadata_size(m2) );
546d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
547d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
548f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
549d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
550d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
551f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
552d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
553f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
554f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
555d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
556f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
557f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
558f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
559f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
560f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
561f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
562f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
563f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
564d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
565d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
566d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
567d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
568d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
569d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
570d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
571d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
572d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
573d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, copy_metadata_nospace) {
574d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
575d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
576d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
577d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
578d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
579d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
580d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
581d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
582d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
583d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
584d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
585d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
586d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
587d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    buf_size--;
588d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
589d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
590d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(buf);
591d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
592d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
593d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(m2);
594d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
595d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    free(buf);
596d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
597d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
598d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
599d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
600d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata) {
601d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
602d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
603d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
604d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
605d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
606d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
607d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
608d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
609d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
610d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
611d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
612d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
613d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity*2, data_capacity*2);
614d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
615d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
616d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
617d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
618d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
619d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
620f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
621f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
622f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
623f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
624d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
625d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
626d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
627d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
628f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
629d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
630f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
631d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
632f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
633f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
634d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
635f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
636f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
637f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
638f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
639f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
640f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
641f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
642f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
643d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
644d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
645d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
646d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
647d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
648d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
649d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
650f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m)*2,
651f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
652f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m)*2,
653f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
654d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2));
655d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity*2,  get_camera_metadata_data_capacity(m2));
656d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
657d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
658f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
659d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
660d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
661d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
662f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i % entry_capacity, &e1);
663d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
664f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i % entry_capacity, e1.index);
665d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m2,
666f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i, &e2);
667d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
668f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
669f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
670f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
671f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
672f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
673f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
674f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
675f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
676d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
677d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
678d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
679d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
680d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
681d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
682d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
683d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata_nospace) {
684d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
685d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
686d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
687d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
688d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
689d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
690d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
691d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
692d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
693d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
694d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
695d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
696d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity-1, data_capacity);
697d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
698d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
699d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
700d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
701d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
702d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m2));
703d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m2));
704d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
705d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
706d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
707d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
708d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
709d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, append_metadata_onespace) {
710d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
711d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
712d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
713d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity2 = entry_capacity * 2 - 2;
714d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity2 = data_capacity * 2;
715d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
716d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
717d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
718d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
719d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    add_test_metadata(m, entry_capacity);
720d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
721d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m2 = NULL;
722d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
723d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m2 = allocate_camera_metadata(entry_capacity2, data_capacity2);
724d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NOT_NULL(m2);
725d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
726d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
727d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
728d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
729d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
730f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_count(m),
731f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_entry_count(m2));
732f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
733f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m2));
734d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
735d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
736d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
737d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) {
738f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
739d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
740d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
741f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
742d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
743f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e1.index);
744f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
745d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
746f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
747f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
748f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
749f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
750f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
751f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
752f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
753f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
754d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
755d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
756d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
757d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = append_camera_metadata(m2, m);
758d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
759d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
760d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_count(m2));
761d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
762d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_data_count(m2));
763d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2));
764d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(data_capacity2,  get_camera_metadata_data_capacity(m2));
765d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
766d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) {
767f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e1, e2;
768d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
769d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int result;
770d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        result = get_camera_metadata_entry(m,
771f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala                i % entry_capacity, &e1);
772d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
773f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i % entry_capacity, e1.index);
774f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
775d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        EXPECT_EQ(OK, result);
776f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
777f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
778f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.type, e2.type);
779f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(e1.count, e2.count);
780f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        for (unsigned int j=0;
781f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j < e1.count * camera_metadata_type_size[e1.type];
782f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala             j++) {
783f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]);
784d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
785d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
786d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
787d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
788d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m2);
789d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
790d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
791d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, vendor_tags) {
792d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    camera_metadata_t *m = NULL;
793d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t entry_capacity = 5;
794d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    const size_t data_capacity = 50;
795d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
796d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
797d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
798d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
799d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t superMode = 5;
800d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
801d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
802d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
803d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
804d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
805d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
806d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
807d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
808d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
809d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
810d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
811d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
812d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
813d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
814d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
815d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
8169c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk    set_camera_metadata_vendor_ops(&fakevendor_ops);
817d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
818d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
819d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
820d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
821d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
822d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
823d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
824d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
825d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
826d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
827d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
828d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
829d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
830d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
831d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SCALER_END,
832d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
833d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
834d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
835d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
836d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("com.fakevendor.sensor",
837d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
838d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("superMode",
839d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
840d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(TYPE_BYTE,
841d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
842d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
843d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_STREQ("com.fakevendor.scaler",
844d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            get_camera_metadata_section_name(FAKEVENDOR_SCALER_END));
845d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SCALER_END));
846d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SCALER_END));
847d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
8489c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk    set_camera_metadata_vendor_ops(NULL);
849d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    // TODO: fix vendor ops. Then the below 3 validations should fail.
850d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
851d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
852d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
853d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            FAKEVENDOR_SENSOR_SUPERMODE,
854d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
855d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(ERROR, result);
856d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
857d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
858d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    result = add_camera_metadata_entry(m,
859d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ANDROID_REQUEST_METADATA_MODE,
860d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            &superMode, 1);
861d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(OK, result);
862d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m, NULL));
863d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
864d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE));
865d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE));
866d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE));
867d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
868d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    // Remove all vendor entries so validation passes
869d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    {
870d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        camera_metadata_ro_entry_t entry;
871d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        EXPECT_EQ(OK, find_camera_metadata_ro_entry(m,
872d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                                                    FAKEVENDOR_SENSOR_SUPERMODE,
873d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                                                    &entry));
874d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        EXPECT_EQ(OK, delete_camera_metadata_entry(m, entry.index));
875d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    }
876d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
877d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
878d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
879d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
880d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaTEST(camera_metadata, add_all_tags) {
881d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int total_tag_count = 0;
882d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
883d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        total_tag_count += camera_metadata_section_bounds[i][1] -
884d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                camera_metadata_section_bounds[i][0];
885d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
886d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int entry_data_count = 3;
887d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int conservative_data_space = total_tag_count * entry_data_count * 8;
888d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    uint8_t data[entry_data_count * 8];
889d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t *data_int32 = (int32_t *)data;
890d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    float *data_float   = (float *)data;
891d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int64_t *data_int64 = (int64_t *)data;
892d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    double *data_double = (double *)data;
893f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_rational_t *data_rational =
894f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            (camera_metadata_rational_t *)data;
895d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
896f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = allocate_camera_metadata(total_tag_count,
897f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            conservative_data_space);
898d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
899d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    ASSERT_NE((void*)NULL, (void*)m);
900d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
901d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int result;
902d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
903d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int counter = 0;
904d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    for (int i = 0; i < ANDROID_SECTION_COUNT; i++) {
905d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        for (uint32_t tag = camera_metadata_section_bounds[i][0];
906d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                tag < camera_metadata_section_bounds[i][1];
907d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala             tag++, counter++) {
908d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            int type = get_camera_metadata_tag_type(tag);
909d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ASSERT_NE(-1, type);
910d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
911d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            switch (type) {
912d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_BYTE:
913d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[0] = tag & 0xFF;
914d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[1] = (tag >> 8) & 0xFF;
915d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data[2] = (tag >> 16) & 0xFF;
916d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
917d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_INT32:
918d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[0] = tag;
919d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[1] = i;
920d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int32[2] = counter;
921d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
922d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_FLOAT:
923d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[0] = tag;
924d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[1] = i;
925d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_float[2] = counter / (float)total_tag_count;
926d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
927d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_INT64:
928d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[0] = (int64_t)tag | ( (int64_t)tag << 32);
929d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[1] = i;
930d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_int64[2] = counter;
931d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
932d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_DOUBLE:
933d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[0] = tag;
934d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[1] = i;
935d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_double[2] = counter / (double)total_tag_count;
936d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
937d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                case TYPE_RATIONAL:
938d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[0].numerator = tag;
939d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[0].denominator = 1;
940d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[1].numerator = i;
941d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[1].denominator = 1;
942d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[2].numerator = counter;
943d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data_rational[2].denominator = total_tag_count;
944d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
945d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                default:
946d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    FAIL() << "Unknown type field encountered:" << type;
947d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    break;
948d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            }
949d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            result = add_camera_metadata_entry(m,
950d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    tag,
951d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    data,
952d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala                    entry_data_count);
953d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala            ASSERT_EQ(OK, result);
954d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
955d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        }
956d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    }
957d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
958f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
959f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
960f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
96194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
962d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
96394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala}
96494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
96594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville TalvalaTEST(camera_metadata, sort_metadata) {
96694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    camera_metadata_t *m = NULL;
96794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const size_t entry_capacity = 5;
96894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const size_t data_capacity = 100;
96994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
97094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int result;
97194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
97294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
97394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
97494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Add several unique entries in non-sorted order
97594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
9767e59ded046175c20258be150cbc94be085924d28Zhijun He    camera_metadata_rational_t colorTransform[] = {
9777e59ded046175c20258be150cbc94be085924d28Zhijun He        {9, 10}, {0, 1}, {0, 1},
9787e59ded046175c20258be150cbc94be085924d28Zhijun He        {1, 5}, {1, 2}, {0, 1},
9797e59ded046175c20258be150cbc94be085924d28Zhijun He        {0, 1}, {1, 10}, {7, 10}
98094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    };
98194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
98208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_COLOR_CORRECTION_TRANSFORM,
9837e59ded046175c20258be150cbc94be085924d28Zhijun He            colorTransform, ARRAY_SIZE(colorTransform));
98494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
98594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
98694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    float focus_distance = 0.5f;
98794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
98894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
98994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &focus_distance, 1);
99094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
99194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
99294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int64_t exposure_time = 1000000000;
99394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
99494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_SENSOR_EXPOSURE_TIME,
99594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &exposure_time, 1);
99694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
99794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
99894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int32_t sensitivity = 800;
99994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = add_camera_metadata_entry(m,
100094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_SENSOR_SENSITIVITY,
100194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            &sensitivity, 1);
100294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
100394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
100494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Test unsorted find
1005f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry_t entry;
100694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
100794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
1008f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
100994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
1010f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1011f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.index);
1012f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1013f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1014f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
101594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
101694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
101708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_NOISE_REDUCTION_STRENGTH,
1018f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
101994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(NOT_FOUND, result);
1020f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.index);
1021f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1022f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1023f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1024f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
102594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
102694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Sort
1027f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
1028f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        std::cout << "Pre-sorted metadata" << std::endl;
1029f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
1030f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
103194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
103294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = sort_camera_metadata(m);
103394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
103494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
1035f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    IF_ALOGV() {
1036f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        std::cout << "Sorted metadata" << std::endl;
1037f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        dump_camera_metadata(m, 0, 2);
1038f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
103994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
104094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    // Test sorted find
104108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    size_t lensFocusIndex = -1;
104208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    {
104308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        std::vector<uint32_t> tags;
104408b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_COLOR_CORRECTION_TRANSFORM);
104508b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_LENS_FOCUS_DISTANCE);
104608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_SENSOR_EXPOSURE_TIME);
104708b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        tags.push_back(ANDROID_SENSOR_SENSITIVITY);
104808b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        std::sort(tags.begin(), tags.end());
104908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin
105008b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin        lensFocusIndex =
105108b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            std::find(tags.begin(), tags.end(), ANDROID_LENS_FOCUS_DISTANCE)
105208b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            - tags.begin();
105308b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    }
105494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
105594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
105694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE,
1057f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
105894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(OK, result);
105908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    EXPECT_EQ(lensFocusIndex, entry.index);
1060f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1061f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1062f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, (size_t)entry.count);
1063f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
106494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
106594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    result = find_camera_metadata_entry(m,
106608b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin            ANDROID_NOISE_REDUCTION_STRENGTH,
1067f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &entry);
106894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    EXPECT_EQ(NOT_FOUND, result);
106908b8aadab1b04a4451d06f152580df2a3ac3afefIgor Murashkin    EXPECT_EQ(lensFocusIndex, entry.index);
1070f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag);
1071f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_FLOAT, entry.type);
1072f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, entry.count);
1073f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(focus_distance, *entry.data.f);
107494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
1075d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
1076d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
1077d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
1078f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1079f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaTEST(camera_metadata, delete_metadata) {
1080f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = NULL;
1081f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t entry_capacity = 50;
1082f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t data_capacity = 450;
1083f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1084f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int result;
1085f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1086f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1087f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1088f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_entries = 5;
1089f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t data_per_entry =
1090f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1091f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_data = num_entries * data_per_entry;
1092f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1093f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete an entry with data
1094f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1095f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    add_test_metadata(m, num_entries);
1096f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1097f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1098f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1099f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 1);
1100f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1101f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1102f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1103f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1104f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1105f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1106f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1107f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1108f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1109f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1110f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1111f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1112f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1113f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1114f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1115f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1116f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1117f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1118f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e;
1119f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e);
1120f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1121f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e.index);
1122f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1123f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e.type);
1124f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1125f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e.data.i64);
1126f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1127f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1128f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete an entry with no data, at end of array
1129f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1130f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t frameCount = 12;
1131f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1132f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1133f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1134f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1135f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1136f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1137f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1138f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1139f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1140f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1141f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1142f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry e;
1143f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m, 4, &e);
1144f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1145f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1146f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.index);
1147f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1148f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1149f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1150f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1151f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1152f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1153f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1154f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1155f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1156f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1157f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1158f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1159f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1160f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1161f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 4);
1162f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1163f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1164f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m, 4, &e);
1165f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1166f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1167f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1168f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1169f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1170f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1171f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1172f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete with extra data on end of array
1173f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, 3);
1174f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1175f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1176f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1177f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1178f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1179f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1180f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1181f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1182f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1183f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1184f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1185f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1186f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1187f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1188f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1189f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Delete without extra data in front of array
1190f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1191f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    frameCount = 1001;
1192f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1193f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1194f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1195f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1196f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1197f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1198f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1199f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1200f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1201f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1202f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1203f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = sort_camera_metadata(m);
1204f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1205f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1206f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1207f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1208f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1209f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1210f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1211f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1212f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1213f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1214f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1215f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = delete_camera_metadata_entry(m, e.index);
1216f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1217f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries--;
1218f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1219f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1220f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1221f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1222f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1223f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1224f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 0; i < num_entries; i++) {
1225f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1226f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1227f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1228f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1229f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1230f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1231f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i;
1232f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1233f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1234f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala}
1235f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1236f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaTEST(camera_metadata, update_metadata) {
1237f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m = NULL;
1238f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t entry_capacity = 50;
1239f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    const size_t data_capacity = 450;
1240f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1241f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int result;
1242f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1243f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1244f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1245f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_entries = 5;
1246f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t data_per_entry =
1247f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1248f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t num_data = num_entries * data_per_entry;
1249f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1250f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    add_test_metadata(m, num_entries);
1251f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1252f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1253f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1254f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with same-size data, doesn't fit in entry
1255f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1256f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int64_t newExposureTime = 1000;
1257f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_entry_t e;
1258f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1259f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newExposureTime, 1, &e);
1260f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1261f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1262f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1263f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1264f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1265f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1266f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1267f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1268f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1269f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1270f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1271f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1272f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1273f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1274f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1275f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1276f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1277f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1278f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1279f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1280f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1281f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1282f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1283f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1284f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1285f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1286f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1287f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1288f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1289f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with larger data
1290f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int64_t newExposures[2] = { 5000, 6000 };
1291f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1292f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, newExposures, 2, &e);
1293f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1294f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += data_per_entry;
1295f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1296f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1297f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1298f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1299f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1300f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1301f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1302f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1303f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1304f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1305f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1306f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1307f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1308f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1309f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1310f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1311f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1312f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1313f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1314f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1315f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1316f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1317f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1318f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1319f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1320f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1321f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1322f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1323f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1324f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1325f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1326f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1327f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1328f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with smaller data
1329f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newExposureTime = 100;
1330f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1331f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newExposureTime, 1, &e);
1332f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1333f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1334f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= data_per_entry;
1335f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1336f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1337f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1338f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1339f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1340f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1341f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1342f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1343f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1344f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1345f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1346f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m,
1347f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &e);
1348f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1349f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1350f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1351f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1352f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1353f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, *e.data.i64);
1354f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1355f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1356f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1357f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1358f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1359f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1360f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1361f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1362f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 + 100 * i;
1363f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1364f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1365f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1366f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update with size fitting in entry
1367f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1368f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t frameCount = 1001;
1369f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = add_camera_metadata_entry(m,
1370f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT,
1371f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            &frameCount, 1);
1372f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1373f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_entries++;
1374f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1375f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1376f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m));
1377f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1378f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m));
1379f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1380f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = sort_camera_metadata(m);
1381f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1382f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1383f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1384f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1385f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1386f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1387f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1388f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1389f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1390f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(frameCount, *e.data.i32);
1391f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1392f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t newFrameCount = 0x12349876;
1393f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1394f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1395f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1396f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1397f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1398f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1399f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1400f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1401f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1402f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1403f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1404f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1405f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1406f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1407f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1408f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1409f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1410f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1411f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1412f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1413f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1414f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1415f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1416f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1417f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1418f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1419f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1420f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1421f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1422f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1423f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1424f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update to bigger than entry
1425f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1426f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    int32_t newFrameCounts[4] = { 0x0, 0x1, 0x10, 0x100 };
1427f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1428f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1429f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCounts, 4, &e);
1430f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1431f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1432f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1433f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += calculate_camera_metadata_entry_data_size(TYPE_INT32,
1434f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            4);
1435f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1436f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1437f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1438f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1439f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1440f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1441f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1442f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.count);
1443f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1444f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1445f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1446f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1447f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1448f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    e.count = 0;
1449f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1450f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1451f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1452f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1453f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1454f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1455f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1456f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1457f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)4, e.count);
1458f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[0], e.data.i32[0]);
1459f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[1], e.data.i32[1]);
1460f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[2], e.data.i32[2]);
1461f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCounts[3], e.data.i32[3]);
1462f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1463f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1464f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry e2;
1465f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1466f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1467f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1468f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1469f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1470f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1471f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1472f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1473f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1474f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update to smaller than entry
1475f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1476f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1477f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1478f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1479f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1480f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= camera_metadata_type_size[TYPE_INT32] * 4;
1481f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1482f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1483f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1484f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1485f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1486f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1487f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1488f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1489f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1490f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1491f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m,
1492f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1493f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1494f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1495f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1496f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1497f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1498f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1499f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1500f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1501f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 1; i < num_entries; i++) {
1502f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1503f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e2);
1504f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1505f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1506f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1507f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1508f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1509f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1510f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1511f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1512f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Setup new buffer with no spare data space
1513f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1514f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m,
1515f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, newExposures, 2, &e);
1516f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1517f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1518f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += data_per_entry;
1519f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1520f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
1521f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
1522f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1523f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1524f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1525f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1526f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1527f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1528f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1529f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1530f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    camera_metadata_t *m2;
1531f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    m2 = allocate_camera_metadata(get_camera_metadata_entry_count(m),
1532f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            get_camera_metadata_data_count(m));
1533f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_NOT_NULL(m2);
1534f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1535f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = append_camera_metadata(m2, m);
1536f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1537f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1538f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1539f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1540f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1541f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1542f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1543f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1544f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1545f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1546f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1547f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1548f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no more room
1549f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1550f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1551f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCounts, 4, &e);
1552f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ERROR, result);
1553f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1554f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1555f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1556f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1557f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1558f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1559f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1560f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1561f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1562f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1563f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but change fits into entry
1564f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1565f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newFrameCount = 5;
1566f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1567f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            0, &newFrameCount, 1, &e);
1568f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1569f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1570f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1571f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1572f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1573f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1574f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1575f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1576f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1577f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1578f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1579f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1580f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1581f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1582f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1583f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1584f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1585f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1586f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1587f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1588f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1589f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = get_camera_metadata_entry(m2, 1, &e);
1590f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1591f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1592f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1593f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1594f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1595f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1596f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1597f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1598f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1599f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1600f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1601f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1602f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1603f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1604f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1605f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1606f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1607f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1608f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but data size doesn't change
1609f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1610f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    newExposures[0] = 1000;
1611f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1612f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1613f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, newExposures, 2, &e);
1614f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1615f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1616f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1617f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1618f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1619f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1620f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1621f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1622f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)2, e.count);
1623f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[0], e.data.i64[0]);
1624f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposures[1], e.data.i64[1]);
1625f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1626f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1627f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1628f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1629f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1630f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1631f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1632f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1633f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1634f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1635f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1636f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1637f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1638f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1639f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1640f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1641f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1642f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1643f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1644f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1645f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1646f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1647f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    // Update when there's no data room, but data size shrinks
1648f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1649f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = update_camera_metadata_entry(m2,
1650f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            1, &newExposureTime, 1, &e);
1651f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1652f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1653f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data -= calculate_camera_metadata_entry_data_size(TYPE_INT64, 2);
1654f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    num_data += calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
1655f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1656f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2));
1657f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m2));
1658f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1659f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.index);
1660f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag);
1661f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT64, e.type);
1662f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1663f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newExposureTime, e.data.i64[0]);
1664f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1665f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    result = find_camera_metadata_entry(m2,
1666f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala            ANDROID_REQUEST_FRAME_COUNT, &e);
1667f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1668f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(OK, result);
1669f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)0, e.index);
1670f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag);
1671f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(TYPE_INT32, e.type);
1672f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ((size_t)1, e.count);
1673f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    EXPECT_EQ(newFrameCount, *e.data.i32);
1674f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1675f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    for (size_t i = 2; i < num_entries; i++) {
1676f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t e2;
1677f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1678f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(OK, result);
1679f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(i, e2.index);
1680f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag);
1681f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(TYPE_INT64, e2.type);
1682f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t exposureTime = 100 * i;
1683f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        EXPECT_EQ(exposureTime, *e2.data.i64);
1684f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    }
1685f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
1686f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala}
168798d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
168898d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville TalvalaTEST(camera_metadata, user_pointer) {
168998d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    camera_metadata_t *m = NULL;
169098d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    const size_t entry_capacity = 50;
169198d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    const size_t data_capacity = 450;
169298d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
169398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    int result;
169498d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
169598d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
169698d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
169798d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    size_t num_entries = 5;
169898d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    size_t data_per_entry =
169998d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala            calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
170098d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    size_t num_data = num_entries * data_per_entry;
170198d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
170298d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    add_test_metadata(m, num_entries);
170398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
170498d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
170598d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
170698d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    void* ptr;
170798d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    result = get_camera_metadata_user_pointer(m, &ptr);
170898d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(OK, result);
170998d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_NULL(ptr);
171098d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
171198d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    int testValue = 10;
171298d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    result = set_camera_metadata_user_pointer(m, &testValue);
171398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(OK, result);
171498d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
171598d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    result = get_camera_metadata_user_pointer(m, &ptr);
171698d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(OK, result);
171798d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(&testValue, (int*)ptr);
171898d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_EQ(testValue, *(int*)ptr);
171998d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
172098d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    size_t buf_size = get_camera_metadata_compact_size(m);
172198d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_LT((size_t)0, buf_size);
172298d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
172398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    uint8_t *buf = (uint8_t*)malloc(buf_size);
172498d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_NOT_NULL(buf);
172598d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
172698d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
172798d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_NOT_NULL(m2);
172898d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
172998d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    result = get_camera_metadata_user_pointer(m2, &ptr);
173098d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    EXPECT_NULL(ptr);
173198d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala
1732d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &buf_size));
173398d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala    free(buf);
1734d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
173598d02fd0be8cd09479262959a542dd2620bf6074Eino-Ville Talvala}
1736b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1737b10d56ad43a91924d3666127963e5fdce725389cEino-Ville TalvalaTEST(camera_metadata, memcpy) {
1738b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_t *m = NULL;
1739b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    const size_t entry_capacity = 50;
1740b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    const size_t data_capacity = 450;
1741b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1742b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    int result;
1743b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1744b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    m = allocate_camera_metadata(entry_capacity, data_capacity);
1745b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1746b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    add_test_metadata(m, 5);
1747b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1748d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    size_t m_size = get_camera_metadata_size(m);
1749d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    uint8_t *dst = new uint8_t[m_size];
1750b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1751d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    memcpy(dst, m, m_size);
1752b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1753b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_t *m2 = reinterpret_cast<camera_metadata_t*>(dst);
1754b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1755b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(get_camera_metadata_size(m),
1756b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_size(m2));
1757b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_compact_size(m),
1758b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_compact_size(m2));
1759b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(get_camera_metadata_entry_count(m),
1760b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_entry_count(m2));
1761b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_entry_capacity(m),
1762b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_entry_capacity(m2));
1763b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_count(m),
1764b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_data_count(m2));
1765b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(get_camera_metadata_data_capacity(m),
1766b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            get_camera_metadata_data_capacity(m2));
1767b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1768b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    camera_metadata_entry_t e1, e2;
1769b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    for (size_t i = 0; i < get_camera_metadata_entry_count(m); i++) {
1770b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        result = get_camera_metadata_entry(m, i, &e1);
1771b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(OK, result);
1772b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        result = get_camera_metadata_entry(m2, i, &e2);
1773b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(OK, result);
1774b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1775b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        EXPECT_EQ(e1.index, e2.index);
1776b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        EXPECT_EQ(e1.tag, e2.tag);
1777b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(e1.type, e2.type);
1778b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_EQ(e1.count, e2.count);
1779b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1780b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala        ASSERT_TRUE(!memcmp(e1.data.u8, e2.data.u8,
1781b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala                        camera_metadata_type_size[e1.type] * e1.count));
1782b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    }
1783b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1784b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    // Make sure updating one metadata buffer doesn't change the other
1785b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1786b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    int64_t double_exposure_time[] = { 100, 200 };
1787b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1788b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = update_camera_metadata_entry(m, 0,
1789b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            double_exposure_time,
1790b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1791b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(OK, result);
1792b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1793b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m, 0, &e1);
1794b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1795b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m2, 0, &e2);
1796b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1797b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1798b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.index, e2.index);
1799b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.tag, e2.tag);
1800b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(e1.type, e2.type);
1801b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e1.count);
1802b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)1, e2.count);
1803b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e1.data.i64[0]);
1804b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e1.data.i64[1]);
1805b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e2.data.i64[0]);
1806b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1807b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    // And in the reverse direction as well
1808b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1809b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    double_exposure_time[0] = 300;
1810b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = update_camera_metadata_entry(m2, 0,
1811b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            double_exposure_time,
1812b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala            sizeof(double_exposure_time)/sizeof(int64_t), NULL);
1813b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(OK, result);
1814b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1815b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m, 0, &e1);
1816b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1817b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    result = get_camera_metadata_entry(m2, 0, &e2);
1818b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(OK, result);
1819b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1820b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.index, e2.index);
1821b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(e1.tag, e2.tag);
1822b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ(e1.type, e2.type);
1823b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e1.count);
1824b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    ASSERT_EQ((size_t)2, e2.count);
1825b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(100, e1.data.i64[0]);
1826b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e1.data.i64[1]);
1827b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(300, e2.data.i64[0]);
1828b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    EXPECT_EQ(200, e2.data.i64[1]);
1829b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala
1830d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    EXPECT_EQ(OK, validate_camera_metadata_structure(m2, &m_size));
1831d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
1832b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala    delete dst;
1833d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin    FINISH_USING_CAMERA_METADATA(m);
1834b10d56ad43a91924d3666127963e5fdce725389cEino-Ville Talvala}
1835555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1836555aac882ed63e70019c78ccc58032a5be0f58ecIgor MurashkinTEST(camera_metadata, data_alignment) {
1837555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    // Verify that when we store the data, the data aligned as we expect
1838555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    camera_metadata_t *m = NULL;
1839555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t entry_capacity = 50;
1840555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t data_capacity = 450;
1841555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    char dummy_data[data_capacity] = {0,};
1842555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1843555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    int m_types[] = {
1844555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_BYTE,
1845555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_INT32,
1846555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_FLOAT,
1847555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_INT64,
1848555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_DOUBLE,
1849555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        TYPE_RATIONAL
1850555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1851555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    const size_t (&m_type_sizes)[NUM_TYPES] = camera_metadata_type_size;
1852555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    size_t m_type_align[] = {
1853555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(uint8_t),                    // BYTE
1854555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(int32_t),                    // INT32
1855555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(float),                      // FLOAT
1856555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(int64_t),                    // INT64
1857555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(double),                     // DOUBLE
1858555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        _Alignas(camera_metadata_rational_t), // RATIONAL
1859555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1860555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    /* arbitrary tags. the important thing is that their type
1861555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin       corresponds to m_type_sizes[i]
1862555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin       */
1863555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    int m_type_tags[] = {
1864555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_REQUEST_TYPE,
1865555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_REQUEST_ID,
1866555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_LENS_FOCUS_DISTANCE,
1867555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_SENSOR_EXPOSURE_TIME,
1868555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ANDROID_JPEG_GPS_COORDINATES,
1869f94330452c56b7f6a513f377d3fc20fabec389c1Eino-Ville Talvala        ANDROID_CONTROL_AE_COMPENSATION_STEP
1870555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    };
1871555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1872555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    /*
1873555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    if the asserts fail, its because we added more types.
1874555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        this means the test should be updated to include more types.
1875555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    */
1876555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_types)/sizeof(m_types[0]));
1877555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_align)/sizeof(m_type_align[0]));
1878555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    ASSERT_EQ((size_t)NUM_TYPES, sizeof(m_type_tags)/sizeof(m_type_tags[0]));
1879555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1880555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    for (int m_type = 0; m_type < (int)NUM_TYPES; ++m_type) {
1881555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1882555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        ASSERT_EQ(m_types[m_type],
1883555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            get_camera_metadata_tag_type(m_type_tags[m_type]));
1884555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1885555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        // misalignment possibilities are [0,type_size) for any type pointer
1886555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        for (size_t i = 0; i < m_type_sizes[m_type]; ++i) {
1887555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1888555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            /* data_count = 1, we may store data in the index.
1889555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin               data_count = 10, we will store data separately
1890555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin             */
1891555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            for (int data_count = 1; data_count <= 10; data_count += 9) {
1892555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1893555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                m = allocate_camera_metadata(entry_capacity, data_capacity);
1894555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1895555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // add dummy data to test various different padding requirements
1896555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1897555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    add_camera_metadata_entry(m,
1898555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              m_type_tags[TYPE_BYTE],
1899555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              &dummy_data[0],
1900555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                              data_count + i));
1901555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // insert the type we care to test
1902555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1903555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    add_camera_metadata_entry(m, m_type_tags[m_type],
1904555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                             &dummy_data[0], data_count));
1905555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1906555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                // now check the alignment for our desired type. it should be ok
1907555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                camera_metadata_ro_entry_t entry = camera_metadata_ro_entry_t();
1908555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                ASSERT_EQ(OK,
1909555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    find_camera_metadata_ro_entry(m, m_type_tags[m_type],
1910555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                                                 &entry));
1911555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1912555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                void* data_ptr = (void*)entry.data.u8;
1913555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                void* aligned_ptr = (void*)((uintptr_t)data_ptr & ~(m_type_align[m_type] - 1));
1914555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                EXPECT_EQ(aligned_ptr, data_ptr) <<
1915555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    "Wrong alignment for type " <<
1916555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    camera_metadata_type_names[m_type] <<
1917555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " with " << (data_count + i) << " dummy bytes and " <<
1918555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " data_count " << data_count <<
1919555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin                    " expected alignment was: " << m_type_align[m_type];
1920555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin
1921d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                FINISH_USING_CAMERA_METADATA(m);
1922555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin            }
1923555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin        }
1924555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin    }
1925555aac882ed63e70019c78ccc58032a5be0f58ecIgor Murashkin}
1926