• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
25 extern "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  */
42 ANDROID_API
43 extern unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2];
44 ANDROID_API
45 extern const char *camera_metadata_section_names[ANDROID_SECTION_COUNT];
46 
47 /**
48  * Type definitions for camera_metadata_entry
49  * =============================================================================
50  */
51 enum {
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 
68 typedef 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  */
80 typedef 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  */
99 typedef 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  */
117 ANDROID_API
118 extern const size_t camera_metadata_type_size[NUM_TYPES];
119 
120 /**
121  * Human-readable name of each entry type
122  */
123 ANDROID_API
124 extern 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  */
149 struct camera_metadata;
150 typedef 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  */
166 ANDROID_API
167 camera_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  */
175 ANDROID_API
176 size_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  */
185 ANDROID_API
186 camera_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  */
200 ANDROID_API
201 camera_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  */
209 ANDROID_API
210 void 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  */
216 ANDROID_API
217 size_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  */
224 ANDROID_API
225 size_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  */
232 ANDROID_API
233 size_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  */
241 ANDROID_API
242 size_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  */
247 ANDROID_API
248 size_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  */
253 ANDROID_API
254 size_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  */
260 ANDROID_API
261 size_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  */
277 ANDROID_API
278 camera_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
283 enum {
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  */
305 ANDROID_API
306 int 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  */
315 ANDROID_API
316 int 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  */
324 ANDROID_API
325 camera_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  */
333 ANDROID_API
334 size_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  */
349 ANDROID_API
350 int 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  */
362 ANDROID_API
363 int 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  */
376 ANDROID_API
377 int 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  */
384 ANDROID_API
385 int 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  */
397 ANDROID_API
398 int 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  */
405 ANDROID_API
406 int 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  */
416 ANDROID_API
417 int 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  */
429 ANDROID_API
430 int 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  */
441 ANDROID_API
442 const 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  */
449 ANDROID_API
450 const 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  */
457 ANDROID_API
458 int 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  */
464 ANDROID_API
465 const 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  */
472 ANDROID_API
473 const 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  */
479 ANDROID_API
480 int 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  */
492 typedef struct vendor_tag_query_ops vendor_tag_query_ops_t;
493 struct 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  */
542 ANDROID_API
543 int 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  */
551 ANDROID_API
552 void 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  */
560 ANDROID_API
561 void 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  */
570 ANDROID_API
571 int 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