diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2012-08-24 11:42:06 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2012-08-24 14:28:30 -0700 |
commit | ad0c0c836d0276079bf8fe1bfb0bef25d4bce601 (patch) | |
tree | 260f70dce4d8a277dc621932b0b2a521b37391f8 | |
parent | 4589e489353e5062fb9285c0b872629ca6454dad (diff) | |
download | android_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.tar.gz android_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.tar.bz2 android_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.zip |
Camera: Add methods for read-only access to metadata.
- Define a read-only version of camera_metadata_entry_t
- Support finding with read-only output
- Add const to clone method input camera_metadata_t.
Bug: 6243944
Change-Id: Icd581e48f5fafaa6da22ca25e872bf3ede192222
-rw-r--r-- | camera/include/system/camera_metadata.h | 33 | ||||
-rw-r--r-- | camera/src/camera_metadata.c | 18 |
2 files changed, 45 insertions, 6 deletions
diff --git a/camera/include/system/camera_metadata.h b/camera/include/system/camera_metadata.h index f44338db..3396312e 100644 --- a/camera/include/system/camera_metadata.h +++ b/camera/include/system/camera_metadata.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef SYSTEM_CORE_INCLUDE_ANDROID_CAMERA_METADATA_H -#define SYSTEM_CORE_INCLUDE_ANDROID_CAMERA_METADATA_H +#ifndef SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H +#define SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H #include <string.h> #include <stdint.h> @@ -93,6 +93,25 @@ typedef struct camera_metadata_entry { } camera_metadata_entry_t; /** + * A read-only reference to a metadata entry in a buffer. Identical to + * camera_metadata_entry in layout + */ +typedef struct camera_metadata_ro_entry { + size_t index; + uint32_t tag; + uint8_t type; + size_t count; + union { + const uint8_t *u8; + const int32_t *i32; + const float *f; + const int64_t *i64; + const double *d; + const camera_metadata_rational_t *r; + } data; +} camera_metadata_ro_entry_t; + +/** * Size in bytes of each entry type */ ANDROID_API @@ -249,7 +268,7 @@ int append_camera_metadata(camera_metadata_t *dst, const camera_metadata_t *src) * can be freed with free_camera_metadata(). Returns NULL if cloning failed. */ ANDROID_API -camera_metadata_t *clone_camera_metadata(camera_metadata_t *src); +camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src); /** * Calculate the number of bytes of extra data a given metadata entry will take @@ -311,6 +330,14 @@ int find_camera_metadata_entry(camera_metadata_t *src, camera_metadata_entry_t *entry); /** + * Find an entry with given tag value, but disallow editing the data + */ +ANDROID_API +int find_camera_metadata_ro_entry(const camera_metadata_t *src, + uint32_t tag, + camera_metadata_ro_entry_t *entry); + +/** * Delete an entry at given index. This is an expensive operation, since it * requires repacking entries and possibly entry data. This also invalidates any * existing camera_metadata_entry.data pointers to this buffer. Sorting is diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c index afbaac50..7bca3f4c 100644 --- a/camera/src/camera_metadata.c +++ b/camera/src/camera_metadata.c @@ -123,6 +123,8 @@ const char *camera_metadata_type_names[NUM_TYPES] = { camera_metadata_t *allocate_camera_metadata(size_t entry_capacity, size_t data_capacity) { + if (entry_capacity == 0) return NULL; + size_t memory_needed = calculate_camera_metadata_size(entry_capacity, data_capacity); void *buffer = malloc(memory_needed); @@ -280,8 +282,9 @@ int append_camera_metadata(camera_metadata_t *dst, return OK; } -camera_metadata_t *clone_camera_metadata(camera_metadata_t *src) { +camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src) { int res; + if (src == NULL) return NULL; camera_metadata_t *clone = allocate_camera_metadata( get_camera_metadata_entry_count(src), get_camera_metadata_data_count(src)); @@ -425,6 +428,14 @@ int find_camera_metadata_entry(camera_metadata_t *src, entry); } +int find_camera_metadata_ro_entry(const camera_metadata_t *src, + uint32_t tag, + camera_metadata_ro_entry_t *entry) { + return find_camera_metadata_entry((camera_metadata_t*)src, tag, + (camera_metadata_entry_t*)entry); +} + + int delete_camera_metadata_entry(camera_metadata_t *dst, size_t index) { if (dst == NULL) return ERROR; @@ -611,12 +622,13 @@ void dump_indented_camera_metadata(const camera_metadata_t *metadata, int verbosity, int indentation) { if (metadata == NULL) { - ALOGE("%s: Metadata is null.", __FUNCTION__); + fdprintf(fd, "%*sDumping camera metadata array: Not allocated", + indentation, ""); return; } unsigned int i; fdprintf(fd, - "%*sDumping camera metadata array. %d / %d entries, " + "%*sDumping camera metadata array: %d / %d entries, " "%d / %d bytes of extra data.\n", indentation, "", metadata->entry_count, metadata->entry_capacity, metadata->data_count, metadata->data_capacity); |