OSDN Git Service

Camera: Add opaque user pointer to camera metadata buffer
authorEino-Ville Talvala <etalvala@google.com>
Mon, 21 May 2012 21:46:49 +0000 (14:46 -0700)
committerEino-Ville Talvala <etalvala@google.com>
Mon, 21 May 2012 21:46:49 +0000 (14:46 -0700)
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

camera/include/system/camera_metadata.h
camera/src/camera_metadata.c
camera/tests/camera_metadata_tests.cpp

index a1d19b3..d5eac65 100644 (file)
@@ -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.
index a16b5b7..7c535d9 100644 (file)
@@ -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) {
index 6bac8db..06c59f4 100644 (file)
@@ -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);
+}