Home | History | Annotate | Download | only in system
      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
     26 extern "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  */
     43 ANDROID_API
     44 extern unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2];
     45 ANDROID_API
     46 extern const char *camera_metadata_section_names[ANDROID_SECTION_COUNT];
     47 
     48 /**
     49  * Type definitions for camera_metadata_entry
     50  * =============================================================================
     51  */
     52 enum {
     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 
     69 typedef 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  */
     81 typedef 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  */
    100 typedef 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  */
    118 ANDROID_API
    119 extern const size_t camera_metadata_type_size[NUM_TYPES];
    120 
    121 /**
    122  * Human-readable name of each entry type
    123  */
    124 ANDROID_API
    125 extern 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  */
    150 struct camera_metadata;
    151 typedef 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  */
    167 ANDROID_API
    168 camera_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  */
    176 ANDROID_API
    177 size_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  */
    186 ANDROID_API
    187 camera_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  */
    201 ANDROID_API
    202 camera_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  */
    210 ANDROID_API
    211 void 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  */
    217 ANDROID_API
    218 size_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  */
    225 ANDROID_API
    226 size_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  */
    233 ANDROID_API
    234 size_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  */
    242 ANDROID_API
    243 size_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  */
    248 ANDROID_API
    249 size_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  */
    254 ANDROID_API
    255 size_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  */
    261 ANDROID_API
    262 size_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  */
    278 ANDROID_API
    279 camera_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  */
    295 ANDROID_API
    296 int 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  */
    305 ANDROID_API
    306 int 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  */
    314 ANDROID_API
    315 camera_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  */
    323 ANDROID_API
    324 size_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  */
    339 ANDROID_API
    340 int 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  */
    352 ANDROID_API
    353 int 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  */
    366 ANDROID_API
    367 int 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  */
    374 ANDROID_API
    375 int 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  */
    387 ANDROID_API
    388 int 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  */
    395 ANDROID_API
    396 int 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  */
    406 ANDROID_API
    407 int 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  */
    419 ANDROID_API
    420 int 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  */
    431 ANDROID_API
    432 const 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  */
    439 ANDROID_API
    440 const 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  */
    447 ANDROID_API
    448 int 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  */
    459 typedef struct vendor_tag_query_ops vendor_tag_query_ops_t;
    460 struct 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  */
    509 ANDROID_API
    510 int 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  */
    518 ANDROID_API
    519 void 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  */
    527 ANDROID_API
    528 void 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  */
    537 ANDROID_API
    538 int 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