[libcamera-devel,v7,6/9] android: Add CameraMetadata helper class

Message ID 20190905210940.32358-7-jacopo@jmondi.org
State Accepted
Headers show
Series
  • android: Rework metadata tags
Related show

Commit Message

Jacopo Mondi Sept. 5, 2019, 9:09 p.m. UTC
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

The new CameraMetadata helper class wraps the Android camera_metadata_t
to simplify its usage.

Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/android/camera_metadata.cpp | 52 +++++++++++++++++++++++++++++++++
 src/android/camera_metadata.h   | 30 +++++++++++++++++++
 src/android/meson.build         |  1 +
 3 files changed, 83 insertions(+)
 create mode 100644 src/android/camera_metadata.cpp
 create mode 100644 src/android/camera_metadata.h

Patch

diff --git a/src/android/camera_metadata.cpp b/src/android/camera_metadata.cpp
new file mode 100644
index 000000000000..76965108c08b
--- /dev/null
+++ b/src/android/camera_metadata.cpp
@@ -0,0 +1,52 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * camera_metadata.cpp - libcamera Android Camera Metadata Helper
+ */
+
+#include "camera_metadata.h"
+
+#include "log.h"
+
+using namespace libcamera;
+
+LOG_DEFINE_CATEGORY(CameraMetadata);
+
+CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity)
+{
+	metadata_ = allocate_camera_metadata(entryCapacity, dataCapacity);
+	valid_ = metadata_ != nullptr;
+}
+
+CameraMetadata::~CameraMetadata()
+{
+	if (metadata_)
+		free_camera_metadata(metadata_);
+}
+
+bool CameraMetadata::addEntry(uint32_t tag, const void *data, size_t count)
+{
+	if (!valid_)
+		return false;
+
+	if (!add_camera_metadata_entry(metadata_, tag, data, count))
+		return true;
+
+	const char *name = get_camera_metadata_tag_name(tag);
+	if (name)
+		LOG(CameraMetadata, Error)
+			<< "Failed to add tag " << name;
+	else
+		LOG(CameraMetadata, Error)
+			<< "Failed to add unknown tag " << tag;
+
+	valid_ = false;
+
+	return false;
+}
+
+camera_metadata_t *CameraMetadata::get()
+{
+	return valid_ ? metadata_ : nullptr;
+}
diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h
new file mode 100644
index 000000000000..75a9d7066f31
--- /dev/null
+++ b/src/android/camera_metadata.h
@@ -0,0 +1,30 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * camera_metadata.h - libcamera Android Camera Metadata Helper
+ */
+#ifndef __ANDROID_CAMERA_METADATA_H__
+#define __ANDROID_CAMERA_METADATA_H__
+
+#include <stdint.h>
+
+#include <system/camera_metadata.h>
+
+class CameraMetadata
+{
+public:
+	CameraMetadata(size_t entryCapacity, size_t dataCapacity);
+	~CameraMetadata();
+
+	bool isValid() { return valid_; }
+	bool addEntry(uint32_t tag, const void *data, size_t data_count);
+
+	camera_metadata_t *get();
+
+private:
+	camera_metadata_t *metadata_;
+	bool valid_;
+};
+
+#endif /* __ANDROID_CAMERA_METADATA_H__ */
diff --git a/src/android/meson.build b/src/android/meson.build
index 26537794bc29..b5e4eeeb73a8 100644
--- a/src/android/meson.build
+++ b/src/android/meson.build
@@ -2,6 +2,7 @@  android_hal_sources = files([
     'camera3_hal.cpp',
     'camera_hal_manager.cpp',
     'camera_device.cpp',
+    'camera_metadata.cpp',
     'camera_proxy.cpp',
     'thread_rpc.cpp'
 ])