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
172f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala#ifndef SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
182f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala#define SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
19d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
20d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include <string.h>
21d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include <stdint.h>
22d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include <cutils/compiler.h>
23f260382cd29623ff49c6a230d07a7657919f0f89Ruben Brunk#include <system/camera_vendor_tags.h>
24d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
25d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#ifdef __cplusplus
26d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaextern "C" {
27d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#endif
28d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
29d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
30d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Tag hierarchy and enum definitions for camera_metadata_entry
31d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * =============================================================================
32d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
33d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
34d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
35d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Main enum definitions are in a separate file to make it easy to
36d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * maintain
37d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
38d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#include "camera_metadata_tags.h"
39d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
40d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
41d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Enum range for each top-level category
42d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
43d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
44d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaextern unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2];
45d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
46d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaextern const char *camera_metadata_section_names[ANDROID_SECTION_COUNT];
47d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
48d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
49d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Type definitions for camera_metadata_entry
50d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * =============================================================================
51d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
52d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaenum {
53d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Unsigned 8-bit integer (uint8_t)
54d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_BYTE = 0,
55d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Signed 32-bit integer (int32_t)
56d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_INT32 = 1,
57d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // 32-bit float (float)
58d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_FLOAT = 2,
59d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Signed 64-bit integer (int64_t)
60d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_INT64 = 3,
61d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // 64-bit float (double)
62d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_DOUBLE = 4,
63d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // A 64-bit fraction (camera_metadata_rational_t)
64d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    TYPE_RATIONAL = 5,
65d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    // Number of type fields
66d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    NUM_TYPES
67d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala};
68d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
69d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalatypedef struct camera_metadata_rational {
70d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t numerator;
71d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    int32_t denominator;
72d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala} camera_metadata_rational_t;
73d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
74d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
75f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * A reference to a metadata entry in a buffer.
76f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala *
77f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * The data union pointers point to the real data in the buffer, and can be
78f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * modified in-place if the count does not need to change. The count is the
79f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * number of entries in data of the entry's type, not a count of bytes.
80f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala */
81f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvalatypedef struct camera_metadata_entry {
82f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t   index;
83f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    uint32_t tag;
84f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    uint8_t  type;
85f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    size_t   count;
86f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    union {
87f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        uint8_t *u8;
88f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int32_t *i32;
89f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        float   *f;
90f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        int64_t *i64;
91f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        double  *d;
92f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_rational_t *r;
93f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala    } data;
94f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala} camera_metadata_entry_t;
95f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
96f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala/**
972f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala * A read-only reference to a metadata entry in a buffer. Identical to
982f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala * camera_metadata_entry in layout
992f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala */
1002f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvalatypedef struct camera_metadata_ro_entry {
1012f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    size_t   index;
1022f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    uint32_t tag;
1032f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    uint8_t  type;
1042f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    size_t   count;
1052f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    union {
1062f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const uint8_t *u8;
1072f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const int32_t *i32;
1082f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const float   *f;
1092f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const int64_t *i64;
1102f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const double  *d;
1112f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        const camera_metadata_rational_t *r;
1122f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala    } data;
1132f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala} camera_metadata_ro_entry_t;
1142f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala
1152f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala/**
116d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Size in bytes of each entry type
117d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
118d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
119fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvalaextern const size_t camera_metadata_type_size[NUM_TYPES];
120fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala
121fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala/**
122fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala * Human-readable name of each entry type
123fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala */
124fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville TalvalaANDROID_API
125fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvalaextern const char* camera_metadata_type_names[NUM_TYPES];
126d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
127d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
128d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Main definitions for the metadata entry and array structures
129d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * =============================================================================
130d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
131d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
132d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
133d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * A packet of metadata. This is a list of metadata entries, each of which has
134d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * an integer tag to identify its meaning, 'type' and 'count' field, and the
135d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * data, which contains a 'count' number of entries of type 'type'. The packet
136d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * has a fixed capacity for entries and for extra data.  A new entry uses up one
137d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * entry slot, and possibly some amount of data capacity; the function
138d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * calculate_camera_metadata_entry_data_size() provides the amount of data
139d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * capacity that would be used up by an entry.
140d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
141f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * Entries are not sorted by default, and are not forced to be unique - multiple
142f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * entries with the same tag are allowed. The packet will not dynamically resize
143f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * when full.
144d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
145d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * The packet is contiguous in memory, with size in bytes given by
146d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * get_camera_metadata_size(). Therefore, it can be copied safely with memcpy()
147d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * to a buffer of sufficient size. The copy_camera_metadata() function is
148d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * intended for eliminating unused capacity in the destination packet.
149d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
150d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalastruct camera_metadata;
151d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalatypedef struct camera_metadata camera_metadata_t;
152d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
153d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
154d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Functions for manipulating camera metadata
155d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * =============================================================================
156d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray *
157d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray * NOTE: Unless otherwise specified, functions that return type "int"
158d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray * return 0 on success, and non-0 value on error.
159d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
160d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
161d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
162d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Allocate a new camera_metadata structure, with some initial space for entries
163d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * and extra data. The entry_capacity is measured in entry counts, and
164d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * data_capacity in bytes. The resulting structure is all contiguous in memory,
165d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * and can be freed with free_camera_metadata().
166d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
167d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
168d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalacamera_metadata_t *allocate_camera_metadata(size_t entry_capacity,
169d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t data_capacity);
170d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
171d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
1721450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He * Get the required alignment of a packet of camera metadata, which is the
1731450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He * maximal alignment of the embedded camera_metadata, camera_metadata_buffer_entry,
1741450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He * and camera_metadata_data.
1751450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He */
1761450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun HeANDROID_API
1771450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun Hesize_t get_camera_metadata_alignment();
1781450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He
1791450f7f45376976100d63d3b7f8a39c4dfd47553Zhijun He/**
180d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * Allocate a new camera_metadata structure of size src_size. Copy the data,
181d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * ignoring alignment, and then attempt validation. If validation
182d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * fails, free the memory and return NULL. Otherwise return the pointer.
183d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin *
184d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * The resulting pointer can be freed with free_camera_metadata().
185d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin */
186d1cecc16420d1e210b0643530e552e3427b2bab2Igor MurashkinANDROID_API
187d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkincamera_metadata_t *allocate_copy_camera_metadata_checked(
188d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        const camera_metadata_t *src,
189d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin        size_t src_size);
190d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
191d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin/**
192d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Place a camera metadata structure into an existing buffer. Returns NULL if
193d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * the buffer is too small for the requested number of reserved entries and
194d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * bytes of data. The entry_capacity is measured in entry counts, and
195d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * data_capacity in bytes. If the buffer is larger than the required space,
196d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * unused space will be left at the end. If successful, returns a pointer to the
197d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * metadata header placed at the start of the buffer. It is the caller's
198d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * responsibility to free the original buffer; do not call
199d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * free_camera_metadata() with the returned pointer.
200d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
201d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
202d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalacamera_metadata_t *place_camera_metadata(void *dst, size_t dst_size,
203d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t entry_capacity,
204d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t data_capacity);
205d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
206d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
207d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Free a camera_metadata structure. Should only be used with structures
208d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * allocated with allocate_camera_metadata().
209d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
210d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
211d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalavoid free_camera_metadata(camera_metadata_t *metadata);
212d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
213d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
214d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Calculate the buffer size needed for a metadata structure of entry_count
215d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * metadata entries, needing a total of data_count bytes of extra data storage.
216d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
217d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
218d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t calculate_camera_metadata_size(size_t entry_count,
219d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t data_count);
220d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
221d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
222d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get current size of entire metadata structure in bytes, including reserved
223d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * but unused space.
224d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
225d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
226d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_size(const camera_metadata_t *metadata);
227d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
228d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
229d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get size of entire metadata buffer in bytes, not including reserved but
230d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * unused space. This is the amount of space needed by copy_camera_metadata for
231d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * its dst buffer.
232d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
233d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
234d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_compact_size(const camera_metadata_t *metadata);
235d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
236d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
237d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get the current number of entries in the metadata packet.
23871fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray *
23971fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * metadata packet must be valid, which can be checked before the call with
24071fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * validate_camera_metadata_structure().
241d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
242d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
243d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_entry_count(const camera_metadata_t *metadata);
244d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
245d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
246d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get the maximum number of entries that could fit in the metadata packet.
247d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
248d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
249d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_entry_capacity(const camera_metadata_t *metadata);
250d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
251d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
252d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get the current count of bytes used for value storage in the metadata packet.
253d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
254d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
255d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_data_count(const camera_metadata_t *metadata);
256d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
257d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
258d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Get the maximum count of bytes that could be used for value storage in the
259d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * metadata packet.
260d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
261d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
262d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t get_camera_metadata_data_capacity(const camera_metadata_t *metadata);
263d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
264d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
265d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Copy a metadata structure to a memory buffer, compacting it along the
266d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * way. That is, in the copied structure, entry_count == entry_capacity, and
267d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * data_count == data_capacity.
268d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
269d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * If dst_size > get_camera_metadata_compact_size(), the unused bytes are at the
270d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * end of the buffer. If dst_size < get_camera_metadata_compact_size(), returns
271d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * NULL. Otherwise returns a pointer to the metadata structure header placed at
272d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * the start of dst.
273d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
274d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Since the buffer was not allocated by allocate_camera_metadata, the caller is
275d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * responsible for freeing the underlying buffer when needed; do not call
276d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * free_camera_metadata.
277d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
278d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
279d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalacamera_metadata_t *copy_camera_metadata(void *dst, size_t dst_size,
280d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        const camera_metadata_t *src);
281d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
282d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
283d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * Validate that a metadata is structurally sane. That is, its internal
284d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * state is such that we won't get buffer overflows or run into other
285d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * 'impossible' issues when calling the other API functions.
286d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin *
287d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * This is useful in particular after copying the binary metadata blob
288d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * from an untrusted source, since passing this check means the data is at least
289d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * consistent.
290d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin *
291d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * The expected_size argument is optional.
292d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin *
293d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin * Returns 0 on success. A non-0 value is returned on error.
294d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin */
295d1cecc16420d1e210b0643530e552e3427b2bab2Igor MurashkinANDROID_API
296d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkinint validate_camera_metadata_structure(const camera_metadata_t *metadata,
297d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin                                       const size_t *expected_size);
298d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin
299d1cecc16420d1e210b0643530e552e3427b2bab2Igor Murashkin/**
300d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Append camera metadata in src to an existing metadata structure in dst.  This
301d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * does not resize the destination structure, so if it is too small, a non-zero
30294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * value is returned. On success, 0 is returned. Appending onto a sorted
30394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * structure results in a non-sorted combined structure.
304d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
305d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
306d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaint append_camera_metadata(camera_metadata_t *dst, const camera_metadata_t *src);
307d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
308d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
309fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala * Clone an existing metadata buffer, compacting along the way. This is
310fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala * equivalent to allocating a new buffer of the minimum needed size, then
311fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala * appending the buffer to be cloned into the new buffer. The resulting buffer
312fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala * can be freed with free_camera_metadata(). Returns NULL if cloning failed.
313fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala */
314fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville TalvalaANDROID_API
3152f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvalacamera_metadata_t *clone_camera_metadata(const camera_metadata_t *src);
316fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala
317fd2588282491637c61ba828eeb69c9486d8aaeabEino-Ville Talvala/**
318d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Calculate the number of bytes of extra data a given metadata entry will take
319d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * up. That is, if entry of 'type' with a payload of 'data_count' values is
320d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * added, how much will the value returned by get_camera_metadata_data_count()
321d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * be increased? This value may be zero, if no extra data storage is needed.
322d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
323d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
324d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalasize_t calculate_camera_metadata_entry_data_size(uint8_t type,
325d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t data_count);
326d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
327d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
328d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Add a metadata entry to a metadata structure. Returns 0 if the addition
329d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * succeeded. Returns a non-zero value if there is insufficient reserved space
330d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * left to add the entry, or if the tag is unknown.  data_count is the number of
331d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * entries in the data array of the tag's type, not a count of
332d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * bytes. Vendor-defined tags can not be added using this method, unless
33394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * set_vendor_tag_query_ops() has been called first. Entries are always added to
33494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * the end of the structure (highest index), so after addition, a
33594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * previously-sorted array will be marked as unsorted.
336d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray *
337d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray * Returns 0 on success. A non-0 value is returned on error.
338d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
339d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
340d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaint add_camera_metadata_entry(camera_metadata_t *dst,
341d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        uint32_t tag,
342d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        const void *data,
343d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        size_t data_count);
344d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
345d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
346f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * Sort the metadata buffer for fast searching. If already marked as sorted,
347f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * does nothing. Adding or appending entries to the buffer will place the buffer
348f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * back into an unsorted state.
349d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray *
350d17641aec6446a250f0da6b6952bcb54ca54fc64Alex Ray * Returns 0 on success. A non-0 value is returned on error.
35194c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala */
35294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville TalvalaANDROID_API
35394c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvalaint sort_camera_metadata(camera_metadata_t *dst);
35494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
35594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala/**
356f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * Get metadata entry at position index in the metadata buffer.
35771fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * Index must be less than entry count, which is returned by
35871fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * get_camera_metadata_entry_count().
359d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala *
360f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * src and index are inputs; the passed-in entry is updated with the details of
361f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * the entry. The data pointer points to the real data in the buffer, and can be
362f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * updated as long as the data count does not change.
36371fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray *
36471fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * Returns 0 on success. A non-0 value is returned on error.
365d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
366d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
367d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaint get_camera_metadata_entry(camera_metadata_t *src,
368f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        size_t index,
369f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t *entry);
370d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
371d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
37271fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray * Get metadata entry at position index, but disallow editing the data.
37371fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray */
37471fe0f87dd5339a93ab2f376ca50568d45de617cAlex RayANDROID_API
37571fe0f87dd5339a93ab2f376ca50568d45de617cAlex Rayint get_camera_metadata_ro_entry(const camera_metadata_t *src,
37671fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray        size_t index,
37771fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray        camera_metadata_ro_entry_t *entry);
37871fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray
37971fe0f87dd5339a93ab2f376ca50568d45de617cAlex Ray/**
38094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala * Find an entry with given tag value. If not found, returns -ENOENT. Otherwise,
381f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * returns entry contents like get_camera_metadata_entry.
38294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala *
383f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * If multiple entries with the same tag exist, does not have any guarantees on
384f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * which is returned. To speed up searching for tags, sort the metadata
385f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * structure first by calling sort_camera_metadata().
38694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala */
38794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville TalvalaANDROID_API
38894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvalaint find_camera_metadata_entry(camera_metadata_t *src,
38994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        uint32_t tag,
390f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t *entry);
391f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
392f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala/**
3932f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala * Find an entry with given tag value, but disallow editing the data
3942f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala */
3952f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville TalvalaANDROID_API
3962f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvalaint find_camera_metadata_ro_entry(const camera_metadata_t *src,
3972f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        uint32_t tag,
3982f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala        camera_metadata_ro_entry_t *entry);
3992f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala
4002f4aca6526bbbaa9069f2683cdc60c0453a22055Eino-Ville Talvala/**
401f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * Delete an entry at given index. This is an expensive operation, since it
402f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * requires repacking entries and possibly entry data. This also invalidates any
403f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * existing camera_metadata_entry.data pointers to this buffer. Sorting is
404f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * maintained.
405f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala */
406f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaANDROID_API
407f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvalaint delete_camera_metadata_entry(camera_metadata_t *dst,
408f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        size_t index);
409f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala
410f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala/**
411f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * Updates a metadata entry with new data. If the data size is changing, may
412f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * need to adjust the data array, making this an O(N) operation. If the data
413f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * size is the same or still fits in the entry space, this is O(1). Maintains
414f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * sorting, but invalidates camera_metadata_entry instances that point to the
415f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * updated entry. If a non-NULL value is passed in to entry, the entry structure
416f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * is updated to match the new buffer state.  Returns a non-zero value if there
417f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala * is no room for the new data in the buffer.
418f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala */
419f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville TalvalaANDROID_API
420f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvalaint update_camera_metadata_entry(camera_metadata_t *dst,
421f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        size_t index,
422f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        const void *data,
423f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        size_t data_count,
424f5fb8a5516876c5a48cc44b4f1c99504e0b9f245Eino-Ville Talvala        camera_metadata_entry_t *updated_entry);
42594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala
42694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala/**
427d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Retrieve human-readable name of section the tag is in. Returns NULL if
428d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * no such tag is defined. Returns NULL for tags in the vendor section, unless
429d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * set_vendor_tag_query_ops() has been used.
430d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
431d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
432d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaconst char *get_camera_metadata_section_name(uint32_t tag);
433d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
434d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
435d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Retrieve human-readable name of tag (not including section). Returns NULL if
436d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * no such tag is defined. Returns NULL for tags in the vendor section, unless
437d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * set_vendor_tag_query_ops() has been used.
438d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
439d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
440d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaconst char *get_camera_metadata_tag_name(uint32_t tag);
441d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
442d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
443d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Retrieve the type of a tag. Returns -1 if no such tag is defined. Returns -1
444d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * for tags in the vendor section, unless set_vendor_tag_query_ops() has been
445d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * used.
446d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
447d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
448d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaint get_camera_metadata_tag_type(uint32_t tag);
449d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
450d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
451d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Set up vendor-specific tag query methods. These are needed to properly add
452d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * entries with vendor-specified tags and to use the
453d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * get_camera_metadata_section_name, _tag_name, and _tag_type methods with
454d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * vendor tags. Returns 0 on success.
455f260382cd29623ff49c6a230d07a7657919f0f89Ruben Brunk *
4569c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk * **DEPRECATED** - Please use vendor_tag_ops defined in camera_vendor_tags.h
4579c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk *        instead.
458d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
45994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvalatypedef struct vendor_tag_query_ops vendor_tag_query_ops_t;
46094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvalastruct vendor_tag_query_ops {
461d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    /**
462d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * Get vendor section name for a vendor-specified entry tag. Only called for
463d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * tags >= 0x80000000. The section name must start with the name of the
464d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * vendor in the Java package style. For example, CameraZoom inc must prefix
465d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * their sections with "com.camerazoom." Must return NULL if the tag is
466d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * outside the bounds of vendor-defined sections.
467d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     */
46894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const char *(*get_camera_vendor_section_name)(
46994c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        const vendor_tag_query_ops_t *v,
47094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        uint32_t tag);
471d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    /**
472d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * Get tag name for a vendor-specified entry tag. Only called for tags >=
473d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * 0x80000000. Must return NULL if the tag is outside the bounds of
474d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * vendor-defined sections.
475d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     */
47694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    const char *(*get_camera_vendor_tag_name)(
47794c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        const vendor_tag_query_ops_t *v,
47894c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        uint32_t tag);
479d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala    /**
480d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * Get tag type for a vendor-specified entry tag. Only called for tags >=
481d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * 0x80000000. Must return -1 if the tag is outside the bounds of
482d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     * vendor-defined sections.
483d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala     */
48494c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala    int (*get_camera_vendor_tag_type)(
48594c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        const vendor_tag_query_ops_t *v,
48694c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        uint32_t tag);
48703486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray    /**
48803486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * Get the number of vendor tags supported on this platform. Used to
48903486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * calculate the size of buffer needed for holding the array of all tags
49003486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * returned by get_camera_vendor_tags().
49103486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     */
49203486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray    int (*get_camera_vendor_tag_count)(
49303486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray        const vendor_tag_query_ops_t *v);
49403486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray    /**
49503486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * Fill an array with all the supported vendor tags on this platform.
49603486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * get_camera_vendor_tag_count() returns the number of tags supported, and
49703486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     * tag_array should be allocated with enough space to hold all of the tags.
49803486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray     */
49903486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray    void (*get_camera_vendor_tags)(
50003486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray        const vendor_tag_query_ops_t *v,
50103486956904a461e2b9ea368ecf355e40cbea17aAlexander Ray        uint32_t *tag_array);
50294c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala};
503d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
504f260382cd29623ff49c6a230d07a7657919f0f89Ruben Brunk/**
5059c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk * **DEPRECATED** - This should only be used by the camera framework. Camera
5069c13e191ea2d9622d00621d6acb009a9a759dc92Ruben Brunk *      metadata will transition to using vendor_tag_ops defined in
507f260382cd29623ff49c6a230d07a7657919f0f89Ruben Brunk *      camera_vendor_tags.h instead.
508f260382cd29623ff49c6a230d07a7657919f0f89Ruben Brunk */
509d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
510d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalaint set_camera_metadata_vendor_tag_ops(const vendor_tag_query_ops_t *query_ops);
511d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
512d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala/**
513d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * Print fields in the metadata to the log.
514d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * verbosity = 0: Only tag entry information
515d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * verbosity = 1: Tag entry information plus at most 16 data values
516d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala * verbosity = 2: All information
517d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala */
518d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville TalvalaANDROID_API
519d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvalavoid dump_camera_metadata(const camera_metadata_t *metadata,
52094c1901a96c268f55012809f8261f2ec89c16deaEino-Ville Talvala        int fd,
521d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala        int verbosity);
522d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
5231d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala/**
5241d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala * Print fields in the metadata to the log; adds indentation parameter, which
5251d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala * specifies the number of spaces to insert before each line of the dump
5261d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala */
5271d27e5b8a575620bb64406289c7c229662de92caEino-Ville TalvalaANDROID_API
5281d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvalavoid dump_indented_camera_metadata(const camera_metadata_t *metadata,
5291d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala        int fd,
5301d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala        int verbosity,
5311d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala        int indentation);
5321d27e5b8a575620bb64406289c7c229662de92caEino-Ville Talvala
533e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin/**
534e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin * Prints the specified tag value as a string. Only works for enum tags.
535e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin * Returns 0 on success, -1 on failure.
536e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin */
537e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor MurashkinANDROID_API
538e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkinint camera_metadata_enum_snprint(uint32_t tag,
539e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin                                 uint32_t value,
540e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin                                 char *dst,
541e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin                                 size_t size);
542e572c2efab8edaae7c59aaa9fa06c44a6d4d3d35Igor Murashkin
543d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#ifdef __cplusplus
544d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala}
545d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#endif
546d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala
547d8afb4d1a4245b2a9d722cbb358a4d6febed89cfEino-Ville Talvala#endif
548