diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2012-06-06 17:22:42 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2012-06-06 17:22:42 -0700 |
commit | fd2588282491637c61ba828eeb69c9486d8aaeab (patch) | |
tree | 51c1f94cbd464ad46eb9251eb710025e3a33bd9e | |
parent | 98d02fd0be8cd09479262959a542dd2620bf6074 (diff) | |
download | android_system_media-fd2588282491637c61ba828eeb69c9486d8aaeab.tar.gz android_system_media-fd2588282491637c61ba828eeb69c9486d8aaeab.tar.bz2 android_system_media-fd2588282491637c61ba828eeb69c9486d8aaeab.zip |
Camera: Add clone buffer, make type names public
Clone metadata buffer allows for straightforward duplication of
existing buffers; type names are useful for debugging code.
Bug: 6243944
Change-Id: Ibf70f4e3bcf49d6c772bba18a577e2673f2b9213
-rw-r--r-- | camera/include/system/camera_metadata.h | 17 | ||||
-rw-r--r-- | camera/src/camera_metadata.c | 19 |
2 files changed, 33 insertions, 3 deletions
diff --git a/camera/include/system/camera_metadata.h b/camera/include/system/camera_metadata.h index d5eac654..62963a2c 100644 --- a/camera/include/system/camera_metadata.h +++ b/camera/include/system/camera_metadata.h @@ -96,7 +96,13 @@ typedef struct camera_metadata_entry { * Size in bytes of each entry type */ ANDROID_API -extern size_t camera_metadata_type_size[NUM_TYPES]; +extern const size_t camera_metadata_type_size[NUM_TYPES]; + +/** + * Human-readable name of each entry type + */ +ANDROID_API +extern const char* camera_metadata_type_names[NUM_TYPES]; /** * Main definitions for the metadata entry and array structures @@ -237,6 +243,15 @@ ANDROID_API int append_camera_metadata(camera_metadata_t *dst, const camera_metadata_t *src); /** + * Clone an existing metadata buffer, compacting along the way. This is + * equivalent to allocating a new buffer of the minimum needed size, then + * appending the buffer to be cloned into the new buffer. The resulting buffer + * can be freed with free_camera_metadata(). Returns NULL if cloning failed. + */ +ANDROID_API +camera_metadata_t *clone_camera_metadata(camera_metadata_t *src); + +/** * Calculate the number of bytes of extra data a given metadata entry will take * up. That is, if entry of 'type' with a payload of 'data_count' values is * added, how much will the value returned by get_camera_metadata_data_count() diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c index 7c535d92..ee00ee60 100644 --- a/camera/src/camera_metadata.c +++ b/camera/src/camera_metadata.c @@ -103,7 +103,7 @@ typedef struct tag_info { #include "camera_metadata_tag_info.c" -size_t camera_metadata_type_size[NUM_TYPES] = { +const size_t camera_metadata_type_size[NUM_TYPES] = { [TYPE_BYTE] = sizeof(uint8_t), [TYPE_INT32] = sizeof(int32_t), [TYPE_FLOAT] = sizeof(float), @@ -112,7 +112,7 @@ size_t camera_metadata_type_size[NUM_TYPES] = { [TYPE_RATIONAL] = sizeof(camera_metadata_rational_t) }; -char *camera_metadata_type_names[NUM_TYPES] = { +const char *camera_metadata_type_names[NUM_TYPES] = { [TYPE_BYTE] = "byte", [TYPE_INT32] = "int32", [TYPE_FLOAT] = "float", @@ -280,6 +280,21 @@ int append_camera_metadata(camera_metadata_t *dst, return OK; } +camera_metadata_t *clone_camera_metadata(camera_metadata_t *src) { + int res; + camera_metadata_t *clone = allocate_camera_metadata( + get_camera_metadata_entry_count(src), + get_camera_metadata_data_count(src)); + if (clone != NULL) { + res = append_camera_metadata(clone, src); + if (res != OK) { + free_camera_metadata(clone); + clone = NULL; + } + } + return clone; +} + size_t calculate_camera_metadata_entry_data_size(uint8_t type, size_t data_count) { if (type >= NUM_TYPES) return 0; |