summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-06-06 17:22:42 -0700
committerEino-Ville Talvala <etalvala@google.com>2012-06-06 17:22:42 -0700
commitfd2588282491637c61ba828eeb69c9486d8aaeab (patch)
tree51c1f94cbd464ad46eb9251eb710025e3a33bd9e
parent98d02fd0be8cd09479262959a542dd2620bf6074 (diff)
downloadandroid_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.h17
-rw-r--r--camera/src/camera_metadata.c19
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;