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