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.
size_t data_count;
size_t data_capacity;
uint8_t *data;
+ void *user; // User set pointer, not copied with buffer
uint8_t reserved[0];
};
} else {
metadata->data = NULL;
}
+ metadata->user = NULL;
return metadata;
}
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;
}
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) {
}
}
+
+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);
+}