summaryrefslogtreecommitdiffstats
path: root/modules/camera
diff options
context:
space:
mode:
authorAlex Ray <aray@google.com>2013-10-17 21:52:03 -0700
committerAlex Ray <aray@google.com>2013-10-21 12:20:41 -0700
commit7915e97d637df3ebbdb9fda542a2657236361e14 (patch)
treef8e5893f536b8791148c4d6608ad97f9563ba7c0 /modules/camera
parent61f7a0c1c1aa481d798116e5a218df04630886e6 (diff)
downloadhardware_libhardware-7915e97d637df3ebbdb9fda542a2657236361e14.zip
hardware_libhardware-7915e97d637df3ebbdb9fda542a2657236361e14.tar.gz
hardware_libhardware-7915e97d637df3ebbdb9fda542a2657236361e14.tar.bz2
modules: camera: add vendor tag functionality
Vendor Tag operations were added in module api v2.2 Change-Id: I352a50759d8bb9389d904bb774659e4be883794b
Diffstat (limited to 'modules/camera')
-rw-r--r--modules/camera/Android.mk1
-rw-r--r--modules/camera/CameraHAL.cpp43
-rw-r--r--modules/camera/CameraHAL.h2
-rw-r--r--modules/camera/Metadata.h1
-rw-r--r--modules/camera/VendorTags.cpp188
-rw-r--r--modules/camera/VendorTags.h77
6 files changed, 310 insertions, 2 deletions
diff --git a/modules/camera/Android.mk b/modules/camera/Android.mk
index 31062ea..02d8a33 100644
--- a/modules/camera/Android.mk
+++ b/modules/camera/Android.mk
@@ -29,6 +29,7 @@ LOCAL_SRC_FILES := \
ExampleCamera.cpp \
Metadata.cpp \
Stream.cpp \
+ VendorTags.cpp \
LOCAL_SHARED_LIBRARIES := \
libcamera_metadata \
diff --git a/modules/camera/CameraHAL.cpp b/modules/camera/CameraHAL.cpp
index 9a13c98..148f99c 100644
--- a/modules/camera/CameraHAL.cpp
+++ b/modules/camera/CameraHAL.cpp
@@ -18,6 +18,7 @@
#include <hardware/camera_common.h>
#include <hardware/hardware.h>
#include "ExampleCamera.h"
+#include "VendorTags.h"
//#define LOG_NDEBUG 0
#define LOG_TAG "DefaultCameraHAL"
@@ -38,6 +39,8 @@ namespace default_camera_hal {
// Default Camera HAL has 2 cameras, front and rear.
static CameraHAL gCameraHAL(2);
+// Handle containing vendor tag functionality
+static VendorTags gVendorTags;
CameraHAL::CameraHAL(int num_cameras)
: mNumberOfCameras(num_cameras),
@@ -121,6 +124,41 @@ static int set_callbacks(const camera_module_callbacks_t *callbacks)
return gCameraHAL.setCallbacks(callbacks);
}
+static int get_tag_count(const vendor_tag_ops_t* ops)
+{
+ return gVendorTags.getTagCount(ops);
+}
+
+static void get_all_tags(const vendor_tag_ops_t* ops, uint32_t* tag_array)
+{
+ gVendorTags.getAllTags(ops, tag_array);
+}
+
+static const char* get_section_name(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ return gVendorTags.getSectionName(ops, tag);
+}
+
+static const char* get_tag_name(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ return gVendorTags.getTagName(ops, tag);
+}
+
+static int get_tag_type(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ return gVendorTags.getTagType(ops, tag);
+}
+
+static void get_vendor_tag_ops(vendor_tag_ops_t* ops)
+{
+ ALOGV("%s : ops=%p", __func__, ops);
+ ops->get_tag_count = get_tag_count;
+ ops->get_all_tags = get_all_tags;
+ ops->get_section_name = get_section_name;
+ ops->get_tag_name = get_tag_name;
+ ops->get_tag_type = get_tag_type;
+}
+
static int open_dev(const hw_module_t* mod, const char* name, hw_device_t** dev)
{
return gCameraHAL.open(mod, name, dev);
@@ -133,7 +171,7 @@ static hw_module_methods_t gCameraModuleMethods = {
camera_module_t HAL_MODULE_INFO_SYM __attribute__ ((visibility("default"))) = {
common : {
tag : HARDWARE_MODULE_TAG,
- module_api_version : CAMERA_MODULE_API_VERSION_2_0,
+ module_api_version : CAMERA_MODULE_API_VERSION_2_2,
hal_api_version : HARDWARE_HAL_API_VERSION,
id : CAMERA_HARDWARE_MODULE_ID,
name : "Default Camera HAL",
@@ -144,7 +182,8 @@ camera_module_t HAL_MODULE_INFO_SYM __attribute__ ((visibility("default"))) = {
},
get_number_of_cameras : get_number_of_cameras,
get_camera_info : get_camera_info,
- set_callbacks : set_callbacks
+ set_callbacks : set_callbacks,
+ get_vendor_tag_ops : get_vendor_tag_ops
};
} // extern "C"
diff --git a/modules/camera/CameraHAL.h b/modules/camera/CameraHAL.h
index ba0db4e..a5edc85 100644
--- a/modules/camera/CameraHAL.h
+++ b/modules/camera/CameraHAL.h
@@ -21,6 +21,7 @@
#include <hardware/hardware.h>
#include <hardware/camera_common.h>
#include "Camera.h"
+#include "VendorTags.h"
namespace default_camera_hal {
// CameraHAL contains all module state that isn't specific to an individual
@@ -34,6 +35,7 @@ class CameraHAL {
int getNumberOfCameras();
int getCameraInfo(int camera_id, struct camera_info *info);
int setCallbacks(const camera_module_callbacks_t *callbacks);
+ void getVendorTagOps(vendor_tag_ops_t* ops);
// Hardware Module Interface (see <hardware/hardware.h>)
int open(const hw_module_t* mod, const char* name, hw_device_t** dev);
diff --git a/modules/camera/Metadata.h b/modules/camera/Metadata.h
index 22d2f22..c0d9492 100644
--- a/modules/camera/Metadata.h
+++ b/modules/camera/Metadata.h
@@ -17,6 +17,7 @@
#ifndef METADATA_H_
#define METADATA_H_
+#include <pthread.h>
#include <hardware/camera3.h>
#include <hardware/gralloc.h>
#include <system/camera_metadata.h>
diff --git a/modules/camera/VendorTags.cpp b/modules/camera/VendorTags.cpp
new file mode 100644
index 0000000..58bd606
--- /dev/null
+++ b/modules/camera/VendorTags.cpp
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <system/camera_metadata.h>
+#include "Metadata.h"
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "VendorTags"
+#include <cutils/log.h>
+
+#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
+#include <utils/Trace.h>
+
+#include "VendorTags.h"
+
+namespace default_camera_hal {
+
+// Internal representations of vendor tags for convenience.
+// Other classes must access this data via public interfaces.
+// Structured to be easy to extend and contain complexity.
+namespace {
+// Describes a single vendor tag entry
+struct Entry {
+ const char* name;
+ uint8_t type;
+};
+// Describes a vendor tag section
+struct Section {
+ const char* name;
+ uint32_t start;
+ uint32_t end;
+ const Entry* tags;
+};
+
+// Entry arrays for each section
+const Entry DemoWizardry[DEMO_WIZARDRY_END - DEMO_WIZARDRY_START] = {
+ [DEMO_WIZARDRY_DIMENSION_SIZE - DEMO_WIZARDRY_START] =
+ {"dimensionSize", TYPE_INT32},
+ [DEMO_WIZARDRY_DIMENSIONS - DEMO_WIZARDRY_START] =
+ {"dimensions", TYPE_INT32},
+ [DEMO_WIZARDRY_FAMILIAR - DEMO_WIZARDRY_START] =
+ {"familiar", TYPE_BYTE},
+ [DEMO_WIZARDRY_FIRE - DEMO_WIZARDRY_START] =
+ {"fire", TYPE_RATIONAL}
+};
+
+const Entry DemoSorcery[DEMO_SORCERY_END - DEMO_SORCERY_START] = {
+ [DEMO_SORCERY_DIFFICULTY - DEMO_SORCERY_START] =
+ {"difficulty", TYPE_INT64},
+ [DEMO_SORCERY_LIGHT - DEMO_SORCERY_START] =
+ {"light", TYPE_BYTE}
+};
+
+const Entry DemoMagic[DEMO_MAGIC_END - DEMO_MAGIC_START] = {
+ [DEMO_MAGIC_CARD_TRICK - DEMO_MAGIC_START] =
+ {"cardTrick", TYPE_DOUBLE},
+ [DEMO_MAGIC_LEVITATION - DEMO_MAGIC_START] =
+ {"levitation", TYPE_FLOAT}
+};
+
+// Array of all sections
+const Section DemoSections[DEMO_SECTION_COUNT] = {
+ [DEMO_WIZARDRY] = { "demo.wizardry",
+ DEMO_WIZARDRY_START,
+ DEMO_WIZARDRY_END,
+ DemoWizardry },
+ [DEMO_SORCERY] = { "demo.sorcery",
+ DEMO_SORCERY_START,
+ DEMO_SORCERY_END,
+ DemoSorcery },
+ [DEMO_MAGIC] = { "demo.magic",
+ DEMO_MAGIC_START,
+ DEMO_MAGIC_END,
+ DemoMagic }
+};
+
+// Get a static handle to a specific vendor tag section
+const Section* getSection(uint32_t tag)
+{
+ uint32_t section = (tag - VENDOR_SECTION_START) >> 16;
+
+ if (tag < VENDOR_SECTION_START) {
+ ALOGE("%s: Tag 0x%x before vendor section", __func__, tag);
+ return NULL;
+ }
+
+ if (section >= DEMO_SECTION_COUNT) {
+ ALOGE("%s: Tag 0x%x after vendor section", __func__, tag);
+ return NULL;
+ }
+
+ return &DemoSections[section];
+}
+
+// Get a static handle to a specific vendor tag entry
+const Entry* getEntry(uint32_t tag)
+{
+ const Section* section = getSection(tag);
+ int index;
+
+ if (section == NULL)
+ return NULL;
+
+ if (tag >= section->end) {
+ ALOGE("%s: Tag 0x%x outside section", __func__, tag);
+ return NULL;
+ }
+
+ index = tag - section->start;
+ return &section->tags[index];
+}
+} // namespace
+
+VendorTags::VendorTags()
+ : mTagCount(0)
+{
+ for (int i = 0; i < DEMO_SECTION_COUNT; i++) {
+ mTagCount += DemoSections[i].end - DemoSections[i].start;
+ }
+}
+
+VendorTags::~VendorTags()
+{
+}
+
+int VendorTags::getTagCount(const vendor_tag_ops_t* ops)
+{
+ return mTagCount;
+}
+
+void VendorTags::getAllTags(const vendor_tag_ops_t* ops, uint32_t* tag_array)
+{
+ if (tag_array == NULL) {
+ ALOGE("%s: NULL tag_array", __func__);
+ return;
+ }
+
+ for (int i = 0; i < DEMO_SECTION_COUNT; i++) {
+ for (uint32_t tag = DemoSections[i].start;
+ tag < DemoSections[i].end; tag++) {
+ *tag_array++ = tag;
+ }
+ }
+}
+
+const char* VendorTags::getSectionName(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ const Section* section = getSection(tag);
+
+ if (section == NULL)
+ return NULL;
+
+ return section->name;
+}
+
+const char* VendorTags::getTagName(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ const Entry* entry = getEntry(tag);
+
+ if (entry == NULL)
+ return NULL;
+
+ return entry->name;
+}
+
+int VendorTags::getTagType(const vendor_tag_ops_t* ops, uint32_t tag)
+{
+ const Entry* entry = getEntry(tag);
+
+ if (entry == NULL)
+ return -1;
+
+ return entry->type;
+}
+} // namespace default_camera_hal
diff --git a/modules/camera/VendorTags.h b/modules/camera/VendorTags.h
new file mode 100644
index 0000000..9af9f7d
--- /dev/null
+++ b/modules/camera/VendorTags.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VENDOR_TAGS_H_
+#define VENDOR_TAGS_H_
+
+#include <hardware/camera_common.h>
+#include <system/camera_metadata.h>
+
+namespace default_camera_hal {
+
+// VendorTags contains all vendor-specific metadata tag functionality
+class VendorTags {
+ public:
+ VendorTags();
+ ~VendorTags();
+
+ // Vendor Tags Operations (see <hardware/camera_common.h>)
+ int getTagCount(const vendor_tag_ops_t* ops);
+ void getAllTags(const vendor_tag_ops_t* ops, uint32_t* tag_array);
+ const char* getSectionName(const vendor_tag_ops_t* ops, uint32_t tag);
+ const char* getTagName(const vendor_tag_ops_t* ops, uint32_t tag);
+ int getTagType(const vendor_tag_ops_t* ops, uint32_t tag);
+
+ private:
+ // Total number of vendor tags
+ int mTagCount;
+};
+
+// Tag sections start at the beginning of vendor tags (0x8000_0000)
+// See <system/camera_metadata.h>
+enum {
+ DEMO_WIZARDRY,
+ DEMO_SORCERY,
+ DEMO_MAGIC,
+ DEMO_SECTION_COUNT
+};
+
+// Each section starts at increments of 0x1_0000
+enum {
+ DEMO_WIZARDRY_START = (DEMO_WIZARDRY + VENDOR_SECTION) << 16,
+ DEMO_SORCERY_START = (DEMO_SORCERY + VENDOR_SECTION) << 16,
+ DEMO_MAGIC_START = (DEMO_MAGIC + VENDOR_SECTION) << 16,
+};
+
+// Vendor Tag values, start value begins each section
+enum {
+ DEMO_WIZARDRY_DIMENSION_SIZE = DEMO_WIZARDRY_START,
+ DEMO_WIZARDRY_DIMENSIONS,
+ DEMO_WIZARDRY_FAMILIAR,
+ DEMO_WIZARDRY_FIRE,
+ DEMO_WIZARDRY_END,
+
+ DEMO_SORCERY_DIFFICULTY = DEMO_SORCERY_START,
+ DEMO_SORCERY_LIGHT,
+ DEMO_SORCERY_END,
+
+ DEMO_MAGIC_CARD_TRICK = DEMO_MAGIC_START,
+ DEMO_MAGIC_LEVITATION,
+ DEMO_MAGIC_END,
+};
+} // namespace default_camera_hal
+
+#endif // VENDOR_TAGS_H_