1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
18#define SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
19
20#include <string.h>
21#include <stdint.h>
22#include <cutils/compiler.h>
23#include <system/camera_vendor_tags.h>
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
29/**
30 * Tag hierarchy and enum definitions for camera_metadata_entry
31 * =============================================================================
32 */
33
34/**
35 * Main enum definitions are in a separate file to make it easy to
36 * maintain
37 */
38#include "camera_metadata_tags.h"
39
40/**
41 * Enum range for each top-level category
42 */
43ANDROID_API
44extern unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2];
45ANDROID_API
46extern const char *camera_metadata_section_names[ANDROID_SECTION_COUNT];
47
48/**
49 * Type definitions for camera_metadata_entry
50 * =============================================================================
51 */
52enum {
53    // Unsigned 8-bit integer (uint8_t)
54    TYPE_BYTE = 0,
55    // Signed 32-bit integer (int32_t)
56    TYPE_INT32 = 1,
57    // 32-bit float (float)
58    TYPE_FLOAT = 2,
59    // Signed 64-bit integer (int64_t)
60    TYPE_INT64 = 3,
61    // 64-bit float (double)
62    TYPE_DOUBLE = 4,
63    // A 64-bit fraction (camera_metadata_rational_t)
64    TYPE_RATIONAL = 5,
65    // Number of type fields
66    NUM_TYPES
67};
68
69typedef struct camera_metadata_rational {
70    int32_t numerator;
71    int32_t denominator;
72} camera_metadata_rational_t;
73
74/**
75 * A reference to a metadata entry in a buffer.
76 *
77 * The data union pointers point to the real data in the buffer, and can be
78 * modified in-place if the count does not need to change. The count is the
79 * number of entries in data of the entry's type, not a count of bytes.
80 */
81typedef struct camera_metadata_entry {
82    size_t   index;
83    uint32_t tag;
84    uint8_t  type;
85    size_t   count;
86    union {
87        uint8_t *u8;
88        int32_t *i32;
89        float   *f;
90        int64_t *i64;
91        double  *d;
92        camera_metadata_rational_t *r;
93    } data;
94} camera_metadata_entry_t;
95
96/**
97 * A read-only reference to a metadata entry in a buffer. Identical to
98 * camera_metadata_entry in layout
99 */
100typedef struct camera_metadata_ro_entry {
101    size_t   index;
102    uint32_t tag;
103    uint8_t  type;
104    size_t   count;
105    union {
106        const uint8_t *u8;
107        const int32_t *i32;
108        const float   *f;
109        const int64_t *i64;
110        const double  *d;
111        const camera_metadata_rational_t *r;
112    } data;
113} camera_metadata_ro_entry_t;
114
115/**
116 * Size in bytes of each entry type
117 */
118ANDROID_API
119extern const size_t camera_metadata_type_size[NUM_TYPES];
120
121/**
122 * Human-readable name of each entry type
123 */
124ANDROID_API
125extern const char* camera_metadata_type_names[NUM_TYPES];
126
127/**
128 * Main definitions for the metadata entry and array structures
129 * =============================================================================
130 */
131
132/**
133 * A packet of metadata. This is a list of metadata entries, each of which has
134 * an integer tag to identify its meaning, 'type' and 'count' field, and the
135 * data, which contains a 'count' number of entries of type 'type'. The packet
136 * has a fixed capacity for entries and for extra data.  A new entry uses up one
137 * entry slot, and possibly some amount of data capacity; the function
138 * calculate_camera_metadata_entry_data_size() provides the amount of data
139 * capacity that would be used up by an entry.
140 *
141 * Entries are not sorted by default, and are not forced to be unique - multiple
142 * entries with the same tag are allowed. The packet will not dynamically resize
143 * when full.
144 *
145 * The packet is contiguous in memory, with size in bytes given by
146 * get_camera_metadata_size(). Therefore, it can be copied safely with memcpy()
147 * to a buffer of sufficient size. The copy_camera_metadata() function is
148 * intended for eliminating unused capacity in the destination packet.
149 */
150struct camera_metadata;
151typedef struct camera_metadata camera_metadata_t;
152
153/**
154 * Functions for manipulating camera metadata
155 * =============================================================================
156 *
157 * NOTE: Unless otherwise specified, functions that return type "int"
158 * return 0 on success, and non-0 value on error.
159 */
160
161/**
162 * Allocate a new camera_metadata structure, with some initial space for entries
163 * and extra data. The entry_capacity is measured in entry counts, and
164 * data_capacity in bytes. The resulting structure is all contiguous in memory,
165 * and can be freed with free_camera_metadata().
166 */
167ANDROID_API
168camera_metadata_t *allocate_camera_metadata(size_t entry_capacity,
169        size_t data_capacity);
170
171/**
172 * Get the required alignment of a packet of camera metadata, which is the
173 * maximal alignment of the embedded camera_metadata, camera_metadata_buffer_entry,
174 * and camera_metadata_data.
175 */
176ANDROID_API
177size_t get_camera_metadata_alignment();
178
179/**
180 * Allocate a new camera_metadata structure of size src_size. Copy the data,
181 * ignoring alignment, and then attempt validation. If validation
182 * fails, free the memory and return NULL. Otherwise return the pointer.
183 *
184 * The resulting pointer can be freed with free_camera_metadata().
185 */
186ANDROID_API
187camera_metadata_t *allocate_copy_camera_metadata_checked(
188        const camera_metadata_t *src,
189        size_t src_size);
190
191/**
192 * Place a camera metadata structure into an existing buffer. Returns NULL if
193 * the buffer is too small for the requested number of reserved entries and
194 * bytes of data. The entry_capacity is measured in entry counts, and
195 * data_capacity in bytes. If the buffer is larger than the required space,
196 * unused space will be left at the end. If successful, returns a pointer to the
197 * metadata header placed at the start of the buffer. It is the caller's
198 * responsibility to free the original buffer; do not call
199 * free_camera_metadata() with the returned pointer.
200 */
201ANDROID_API
202camera_metadata_t *place_camera_metadata(void *dst, size_t dst_size,
203        size_t entry_capacity,
204        size_t data_capacity);
205
206/**
207 * Free a camera_metadata structure. Should only be used with structures
208 * allocated with allocate_camera_metadata().
209 */
210ANDROID_API
211void free_camera_metadata(camera_metadata_t *metadata);
212
213/**
214 * Calculate the buffer size needed for a metadata structure of entry_count
215 * metadata entries, needing a total of data_count bytes of extra data storage.
216 */
217ANDROID_API
218size_t calculate_camera_metadata_size(size_t entry_count,
219        size_t data_count);
220
221/**
222 * Get current size of entire metadata structure in bytes, including reserved
223 * but unused space.
224 */
225ANDROID_API
226size_t get_camera_metadata_size(const camera_metadata_t *metadata);
227
228/**
229 * Get size of entire metadata buffer in bytes, not including reserved but
230 * unused space. This is the amount of space needed by copy_camera_metadata for
231 * its dst buffer.
232 */
233ANDROID_API
234size_t get_camera_metadata_compact_size(const camera_metadata_t *metadata);
235
236/**
237 * Get the current number of entries in the metadata packet.
238 *
239 * metadata packet must be valid, which can be checked before the call with
240 * validate_camera_metadata_structure().
241 */
242ANDROID_API
243size_t get_camera_metadata_entry_count(const camera_metadata_t *metadata);
244
245/**
246 * Get the maximum number of entries that could fit in the metadata packet.
247 */
248ANDROID_API
249size_t get_camera_metadata_entry_capacity(const camera_metadata_t *metadata);
250
251/**
252 * Get the current count of bytes used for value storage in the metadata packet.
253 */
254ANDROID_API
255size_t get_camera_metadata_data_count(const camera_metadata_t *metadata);
256
257/**
258 * Get the maximum count of bytes that could be used for value storage in the
259 * metadata packet.
260 */
261ANDROID_API
262size_t get_camera_metadata_data_capacity(const camera_metadata_t *metadata);
263
264/**
265 * Copy a metadata structure to a memory buffer, compacting it along the
266 * way. That is, in the copied structure, entry_count == entry_capacity, and
267 * data_count == data_capacity.
268 *
269 * If dst_size > get_camera_metadata_compact_size(), the unused bytes are at the
270 * end of the buffer. If dst_size < get_camera_metadata_compact_size(), returns
271 * NULL. Otherwise returns a pointer to the metadata structure header placed at
272 * the start of dst.
273 *
274 * Since the buffer was not allocated by allocate_camera_metadata, the caller is
275 * responsible for freeing the underlying buffer when needed; do not call
276 * free_camera_metadata.
277 */
278ANDROID_API
279camera_metadata_t *copy_camera_metadata(void *dst, size_t dst_size,
280        const camera_metadata_t *src);
281
282/**
283 * Validate that a metadata is structurally sane. That is, its internal
284 * state is such that we won't get buffer overflows or run into other
285 * 'impossible' issues when calling the other API functions.
286 *
287 * This is useful in particular after copying the binary metadata blob
288 * from an untrusted source, since passing this check means the data is at least
289 * consistent.
290 *
291 * The expected_size argument is optional.
292 *
293 * Returns 0 on success. A non-0 value is returned on error.
294 */
295ANDROID_API
296int validate_camera_metadata_structure(const camera_metadata_t *metadata,
297                                       const size_t *expected_size);
298
299/**
300 * Append camera metadata in src to an existing metadata structure in dst.  This
301 * does not resize the destination structure, so if it is too small, a non-zero
302 * value is returned. On success, 0 is returned. Appending onto a sorted
303 * structure results in a non-sorted combined structure.
304 */
305ANDROID_API
306int append_camera_metadata(camera_metadata_t *dst, const camera_metadata_t *src);
307
308/**
309 * Clone an existing metadata buffer, compacting along the way. This is
310 * equivalent to allocating a new buffer of the minimum needed size, then
311 * appending the buffer to be cloned into the new buffer. The resulting buffer
312 * can be freed with free_camera_metadata(). Returns NULL if cloning failed.
313 */
314ANDROID_API
315camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src);
316
317/**
318 * Calculate the number of bytes of extra data a given metadata entry will take
319 * up. That is, if entry of 'type' with a payload of 'data_count' values is
320 * added, how much will the value returned by get_camera_metadata_data_count()
321 * be increased? This value may be zero, if no extra data storage is needed.
322 */
323ANDROID_API
324size_t calculate_camera_metadata_entry_data_size(uint8_t type,
325        size_t data_count);
326
327/**
328 * Add a metadata entry to a metadata structure. Returns 0 if the addition
329 * succeeded. Returns a non-zero value if there is insufficient reserved space
330 * left to add the entry, or if the tag is unknown.  data_count is the number of
331 * entries in the data array of the tag's type, not a count of
332 * bytes. Vendor-defined tags can not be added using this method, unless
333 * set_vendor_tag_query_ops() has been called first. Entries are always added to
334 * the end of the structure (highest index), so after addition, a
335 * previously-sorted array will be marked as unsorted.
336 *
337 * Returns 0 on success. A non-0 value is returned on error.
338 */
339ANDROID_API
340int add_camera_metadata_entry(camera_metadata_t *dst,
341        uint32_t tag,
342        const void *data,
343        size_t data_count);
344
345/**
346 * Sort the metadata buffer for fast searching. If already marked as sorted,
347 * does nothing. Adding or appending entries to the buffer will place the buffer
348 * back into an unsorted state.
349 *
350 * Returns 0 on success. A non-0 value is returned on error.
351 */
352ANDROID_API
353int sort_camera_metadata(camera_metadata_t *dst);
354
355/**
356 * Get metadata entry at position index in the metadata buffer.
357 * Index must be less than entry count, which is returned by
358 * get_camera_metadata_entry_count().
359 *
360 * src and index are inputs; the passed-in entry is updated with the details of
361 * the entry. The data pointer points to the real data in the buffer, and can be
362 * updated as long as the data count does not change.
363 *
364 * Returns 0 on success. A non-0 value is returned on error.
365 */
366ANDROID_API
367int get_camera_metadata_entry(camera_metadata_t *src,
368        size_t index,
369        camera_metadata_entry_t *entry);
370
371/**
372 * Get metadata entry at position index, but disallow editing the data.
373 */
374ANDROID_API
375int get_camera_metadata_ro_entry(const camera_metadata_t *src,
376        size_t index,
377        camera_metadata_ro_entry_t *entry);
378
379/**
380 * Find an entry with given tag value. If not found, returns -ENOENT. Otherwise,
381 * returns entry contents like get_camera_metadata_entry.
382 *
383 * If multiple entries with the same tag exist, does not have any guarantees on
384 * which is returned. To speed up searching for tags, sort the metadata
385 * structure first by calling sort_camera_metadata().
386 */
387ANDROID_API
388int find_camera_metadata_entry(camera_metadata_t *src,
389        uint32_t tag,
390        camera_metadata_entry_t *entry);
391
392/**
393 * Find an entry with given tag value, but disallow editing the data
394 */
395ANDROID_API
396int find_camera_metadata_ro_entry(const camera_metadata_t *src,
397        uint32_t tag,
398        camera_metadata_ro_entry_t *entry);
399
400/**
401 * Delete an entry at given index. This is an expensive operation, since it
402 * requires repacking entries and possibly entry data. This also invalidates any
403 * existing camera_metadata_entry.data pointers to this buffer. Sorting is
404 * maintained.
405 */
406ANDROID_API
407int delete_camera_metadata_entry(camera_metadata_t *dst,
408        size_t index);
409
410/**
411 * Updates a metadata entry with new data. If the data size is changing, may
412 * need to adjust the data array, making this an O(N) operation. If the data
413 * size is the same or still fits in the entry space, this is O(1). Maintains
414 * sorting, but invalidates camera_metadata_entry instances that point to the
415 * updated entry. If a non-NULL value is passed in to entry, the entry structure
416 * is updated to match the new buffer state.  Returns a non-zero value if there
417 * is no room for the new data in the buffer.
418 */
419ANDROID_API
420int update_camera_metadata_entry(camera_metadata_t *dst,
421        size_t index,
422        const void *data,
423        size_t data_count,
424        camera_metadata_entry_t *updated_entry);
425
426/**
427 * Retrieve human-readable name of section the tag is in. Returns NULL if
428 * no such tag is defined. Returns NULL for tags in the vendor section, unless
429 * set_vendor_tag_query_ops() has been used.
430 */
431ANDROID_API
432const char *get_camera_metadata_section_name(uint32_t tag);
433
434/**
435 * Retrieve human-readable name of tag (not including section). Returns NULL if
436 * no such tag is defined. Returns NULL for tags in the vendor section, unless
437 * set_vendor_tag_query_ops() has been used.
438 */
439ANDROID_API
440const char *get_camera_metadata_tag_name(uint32_t tag);
441
442/**
443 * Retrieve the type of a tag. Returns -1 if no such tag is defined. Returns -1
444 * for tags in the vendor section, unless set_vendor_tag_query_ops() has been
445 * used.
446 */
447ANDROID_API
448int get_camera_metadata_tag_type(uint32_t tag);
449
450/**
451 * Set up vendor-specific tag query methods. These are needed to properly add
452 * entries with vendor-specified tags and to use the
453 * get_camera_metadata_section_name, _tag_name, and _tag_type methods with
454 * vendor tags. Returns 0 on success.
455 *
456 * **DEPRECATED** - Please use vendor_tag_ops defined in camera_vendor_tags.h
457 *        instead.
458 */
459typedef struct vendor_tag_query_ops vendor_tag_query_ops_t;
460struct vendor_tag_query_ops {
461    /**
462     * Get vendor section name for a vendor-specified entry tag. Only called for
463     * tags >= 0x80000000. The section name must start with the name of the
464     * vendor in the Java package style. For example, CameraZoom inc must prefix
465     * their sections with "com.camerazoom." Must return NULL if the tag is
466     * outside the bounds of vendor-defined sections.
467     */
468    const char *(*get_camera_vendor_section_name)(
469        const vendor_tag_query_ops_t *v,
470        uint32_t tag);
471    /**
472     * Get tag name for a vendor-specified entry tag. Only called for tags >=
473     * 0x80000000. Must return NULL if the tag is outside the bounds of
474     * vendor-defined sections.
475     */
476    const char *(*get_camera_vendor_tag_name)(
477        const vendor_tag_query_ops_t *v,
478        uint32_t tag);
479    /**
480     * Get tag type for a vendor-specified entry tag. Only called for tags >=
481     * 0x80000000. Must return -1 if the tag is outside the bounds of
482     * vendor-defined sections.
483     */
484    int (*get_camera_vendor_tag_type)(
485        const vendor_tag_query_ops_t *v,
486        uint32_t tag);
487    /**
488     * Get the number of vendor tags supported on this platform. Used to
489     * calculate the size of buffer needed for holding the array of all tags
490     * returned by get_camera_vendor_tags().
491     */
492    int (*get_camera_vendor_tag_count)(
493        const vendor_tag_query_ops_t *v);
494    /**
495     * Fill an array with all the supported vendor tags on this platform.
496     * get_camera_vendor_tag_count() returns the number of tags supported, and
497     * tag_array should be allocated with enough space to hold all of the tags.
498     */
499    void (*get_camera_vendor_tags)(
500        const vendor_tag_query_ops_t *v,
501        uint32_t *tag_array);
502};
503
504/**
505 * **DEPRECATED** - This should only be used by the camera framework. Camera
506 *      metadata will transition to using vendor_tag_ops defined in
507 *      camera_vendor_tags.h instead.
508 */
509ANDROID_API
510int set_camera_metadata_vendor_tag_ops(const vendor_tag_query_ops_t *query_ops);
511
512/**
513 * Print fields in the metadata to the log.
514 * verbosity = 0: Only tag entry information
515 * verbosity = 1: Tag entry information plus at most 16 data values
516 * verbosity = 2: All information
517 */
518ANDROID_API
519void dump_camera_metadata(const camera_metadata_t *metadata,
520        int fd,
521        int verbosity);
522
523/**
524 * Print fields in the metadata to the log; adds indentation parameter, which
525 * specifies the number of spaces to insert before each line of the dump
526 */
527ANDROID_API
528void dump_indented_camera_metadata(const camera_metadata_t *metadata,
529        int fd,
530        int verbosity,
531        int indentation);
532
533/**
534 * Prints the specified tag value as a string. Only works for enum tags.
535 * Returns 0 on success, -1 on failure.
536 */
537ANDROID_API
538int camera_metadata_enum_snprint(uint32_t tag,
539                                 uint32_t value,
540                                 char *dst,
541                                 size_t size);
542
543#ifdef __cplusplus
544}
545#endif
546
547#endif
548