summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-05-21 14:46:49 -0700
committerEino-Ville Talvala <etalvala@google.com>2012-05-21 14:46:49 -0700
commit98d02fd0be8cd09479262959a542dd2620bf6074 (patch)
tree89ac5fdeebe12e498596367d10a60e0fa4d705df
parente86a770948e22cd7802b94898fad38377d2fd2bc (diff)
downloadandroid_system_media-98d02fd0be8cd09479262959a542dd2620bf6074.tar.gz
android_system_media-98d02fd0be8cd09479262959a542dd2620bf6074.tar.bz2
android_system_media-98d02fd0be8cd09479262959a542dd2620bf6074.zip
Camera: Add opaque user pointer to camera metadata buffer
This is useful for associating a metadata buffer handed off to a third party with its parent object, when the buffer is returned. Change-Id: I7e19708bb3adf4da26fc6101e78c276477276608
-rw-r--r--camera/include/system/camera_metadata.h15
-rw-r--r--camera/src/camera_metadata.c15
-rw-r--r--camera/tests/camera_metadata_tests.cpp48
3 files changed, 78 insertions, 0 deletions
diff --git a/camera/include/system/camera_metadata.h b/camera/include/system/camera_metadata.h
index a1d19b31..d5eac654 100644
--- a/camera/include/system/camera_metadata.h
+++ b/camera/include/system/camera_metadata.h
@@ -322,6 +322,21 @@ int update_camera_metadata_entry(camera_metadata_t *dst,
camera_metadata_entry_t *updated_entry);
/**
+ * Set user pointer in buffer. This can be used for linking the metadata buffer
+ * with other associated data. This user pointer is not copied with
+ * copy_camera_metadata, and is unaffected by append or any other methods.
+ */
+ANDROID_API
+int set_camera_metadata_user_pointer(camera_metadata_t *dst, void* user);
+
+/**
+ * Retrieve user pointer in buffer. Returns NULL in user if
+ * set_camera_metadata_user_pointer has not been called with this buffer.
+ */
+ANDROID_API
+int get_camera_metadata_user_pointer(camera_metadata_t *dst, void** user);
+
+/**
* Retrieve human-readable name of section the tag is in. Returns NULL if
* no such tag is defined. Returns NULL for tags in the vendor section, unless
* set_vendor_tag_query_ops() has been used.
diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c
index a16b5b78..7c535d92 100644
--- a/camera/src/camera_metadata.c
+++ b/camera/src/camera_metadata.c
@@ -84,6 +84,7 @@ struct camera_metadata {
size_t data_count;
size_t data_capacity;
uint8_t *data;
+ void *user; // User set pointer, not copied with buffer
uint8_t reserved[0];
};
@@ -156,6 +157,7 @@ camera_metadata_t *place_camera_metadata(void *dst,
} else {
metadata->data = NULL;
}
+ metadata->user = NULL;
return metadata;
}
@@ -236,6 +238,7 @@ camera_metadata_t* copy_camera_metadata(void *dst, size_t dst_size,
sizeof(camera_metadata_buffer_entry_t[metadata->entry_count]));
memcpy(metadata->data, src->data,
sizeof(uint8_t[metadata->data_count]));
+ metadata->user = NULL;
return metadata;
}
@@ -517,6 +520,18 @@ int update_camera_metadata_entry(camera_metadata_t *dst,
return OK;
}
+int set_camera_metadata_user_pointer(camera_metadata_t *dst, void* user) {
+ if (dst == NULL) return ERROR;
+ dst->user = user;
+ return OK;
+}
+
+int get_camera_metadata_user_pointer(camera_metadata_t *dst, void** user) {
+ if (dst == NULL) return ERROR;
+ *user = dst->user;
+ return OK;
+}
+
static const vendor_tag_query_ops_t *vendor_tag_ops = NULL;
const char *get_camera_metadata_section_name(uint32_t tag) {
diff --git a/camera/tests/camera_metadata_tests.cpp b/camera/tests/camera_metadata_tests.cpp
index 6bac8db7..06c59f43 100644
--- a/camera/tests/camera_metadata_tests.cpp
+++ b/camera/tests/camera_metadata_tests.cpp
@@ -1548,3 +1548,51 @@ TEST(camera_metadata, update_metadata) {
}
}
+
+TEST(camera_metadata, user_pointer) {
+ camera_metadata_t *m = NULL;
+ const size_t entry_capacity = 50;
+ const size_t data_capacity = 450;
+
+ int result;
+
+ m = allocate_camera_metadata(entry_capacity, data_capacity);
+
+ size_t num_entries = 5;
+ size_t data_per_entry =
+ calculate_camera_metadata_entry_data_size(TYPE_INT64, 1);
+ size_t num_data = num_entries * data_per_entry;
+
+ add_test_metadata(m, num_entries);
+ EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m));
+ EXPECT_EQ(num_data, get_camera_metadata_data_count(m));
+
+ void* ptr;
+ result = get_camera_metadata_user_pointer(m, &ptr);
+ EXPECT_EQ(OK, result);
+ EXPECT_NULL(ptr);
+
+ int testValue = 10;
+ result = set_camera_metadata_user_pointer(m, &testValue);
+ EXPECT_EQ(OK, result);
+
+ result = get_camera_metadata_user_pointer(m, &ptr);
+ EXPECT_EQ(OK, result);
+ EXPECT_EQ(&testValue, (int*)ptr);
+ EXPECT_EQ(testValue, *(int*)ptr);
+
+ size_t buf_size = get_camera_metadata_compact_size(m);
+ EXPECT_LT((size_t)0, buf_size);
+
+ uint8_t *buf = (uint8_t*)malloc(buf_size);
+ EXPECT_NOT_NULL(buf);
+
+ camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m);
+ EXPECT_NOT_NULL(m2);
+
+ result = get_camera_metadata_user_pointer(m2, &ptr);
+ EXPECT_NULL(ptr);
+
+ free(buf);
+ free_camera_metadata(m);
+}