From: Eino-Ville Talvala Date: Mon, 21 May 2012 21:46:49 +0000 (-0700) Subject: Camera: Add opaque user pointer to camera metadata buffer X-Git-Tag: android-x86-7.1-r1~580 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=98d02fd0be8cd09479262959a542dd2620bf6074;p=android-x86%2Fsystem-media.git 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 --- 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); +}