summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-08-24 11:42:06 -0700
committerEino-Ville Talvala <etalvala@google.com>2012-08-24 14:28:30 -0700
commitad0c0c836d0276079bf8fe1bfb0bef25d4bce601 (patch)
tree260f70dce4d8a277dc621932b0b2a521b37391f8
parent4589e489353e5062fb9285c0b872629ca6454dad (diff)
downloadandroid_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.tar.gz
android_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.tar.bz2
android_system_media-ad0c0c836d0276079bf8fe1bfb0bef25d4bce601.zip
Camera: Add methods for read-only access to metadata.
- Define a read-only version of camera_metadata_entry_t - Support finding with read-only output - Add const to clone method input camera_metadata_t. Bug: 6243944 Change-Id: Icd581e48f5fafaa6da22ca25e872bf3ede192222
-rw-r--r--camera/include/system/camera_metadata.h33
-rw-r--r--camera/src/camera_metadata.c18
2 files changed, 45 insertions, 6 deletions
diff --git a/camera/include/system/camera_metadata.h b/camera/include/system/camera_metadata.h
index f44338db..3396312e 100644
--- a/camera/include/system/camera_metadata.h
+++ b/camera/include/system/camera_metadata.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SYSTEM_CORE_INCLUDE_ANDROID_CAMERA_METADATA_H
-#define SYSTEM_CORE_INCLUDE_ANDROID_CAMERA_METADATA_H
+#ifndef SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
+#define SYSTEM_MEDIA_INCLUDE_ANDROID_CAMERA_METADATA_H
#include <string.h>
#include <stdint.h>
@@ -93,6 +93,25 @@ typedef struct camera_metadata_entry {
} camera_metadata_entry_t;
/**
+ * A read-only reference to a metadata entry in a buffer. Identical to
+ * camera_metadata_entry in layout
+ */
+typedef struct camera_metadata_ro_entry {
+ size_t index;
+ uint32_t tag;
+ uint8_t type;
+ size_t count;
+ union {
+ const uint8_t *u8;
+ const int32_t *i32;
+ const float *f;
+ const int64_t *i64;
+ const double *d;
+ const camera_metadata_rational_t *r;
+ } data;
+} camera_metadata_ro_entry_t;
+
+/**
* Size in bytes of each entry type
*/
ANDROID_API
@@ -249,7 +268,7 @@ int append_camera_metadata(camera_metadata_t *dst, const camera_metadata_t *src)
* can be freed with free_camera_metadata(). Returns NULL if cloning failed.
*/
ANDROID_API
-camera_metadata_t *clone_camera_metadata(camera_metadata_t *src);
+camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src);
/**
* Calculate the number of bytes of extra data a given metadata entry will take
@@ -311,6 +330,14 @@ int find_camera_metadata_entry(camera_metadata_t *src,
camera_metadata_entry_t *entry);
/**
+ * Find an entry with given tag value, but disallow editing the data
+ */
+ANDROID_API
+int find_camera_metadata_ro_entry(const camera_metadata_t *src,
+ uint32_t tag,
+ camera_metadata_ro_entry_t *entry);
+
+/**
* Delete an entry at given index. This is an expensive operation, since it
* requires repacking entries and possibly entry data. This also invalidates any
* existing camera_metadata_entry.data pointers to this buffer. Sorting is
diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c
index afbaac50..7bca3f4c 100644
--- a/camera/src/camera_metadata.c
+++ b/camera/src/camera_metadata.c
@@ -123,6 +123,8 @@ const char *camera_metadata_type_names[NUM_TYPES] = {
camera_metadata_t *allocate_camera_metadata(size_t entry_capacity,
size_t data_capacity) {
+ if (entry_capacity == 0) return NULL;
+
size_t memory_needed = calculate_camera_metadata_size(entry_capacity,
data_capacity);
void *buffer = malloc(memory_needed);
@@ -280,8 +282,9 @@ int append_camera_metadata(camera_metadata_t *dst,
return OK;
}
-camera_metadata_t *clone_camera_metadata(camera_metadata_t *src) {
+camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src) {
int res;
+ if (src == NULL) return NULL;
camera_metadata_t *clone = allocate_camera_metadata(
get_camera_metadata_entry_count(src),
get_camera_metadata_data_count(src));
@@ -425,6 +428,14 @@ int find_camera_metadata_entry(camera_metadata_t *src,
entry);
}
+int find_camera_metadata_ro_entry(const camera_metadata_t *src,
+ uint32_t tag,
+ camera_metadata_ro_entry_t *entry) {
+ return find_camera_metadata_entry((camera_metadata_t*)src, tag,
+ (camera_metadata_entry_t*)entry);
+}
+
+
int delete_camera_metadata_entry(camera_metadata_t *dst,
size_t index) {
if (dst == NULL) return ERROR;
@@ -611,12 +622,13 @@ void dump_indented_camera_metadata(const camera_metadata_t *metadata,
int verbosity,
int indentation) {
if (metadata == NULL) {
- ALOGE("%s: Metadata is null.", __FUNCTION__);
+ fdprintf(fd, "%*sDumping camera metadata array: Not allocated",
+ indentation, "");
return;
}
unsigned int i;
fdprintf(fd,
- "%*sDumping camera metadata array. %d / %d entries, "
+ "%*sDumping camera metadata array: %d / %d entries, "
"%d / %d bytes of extra data.\n", indentation, "",
metadata->entry_count, metadata->entry_capacity,
metadata->data_count, metadata->data_capacity);