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