From 7915e97d637df3ebbdb9fda542a2657236361e14 Mon Sep 17 00:00:00 2001 From: Alex Ray Date: Thu, 17 Oct 2013 21:52:03 -0700 Subject: modules: camera: add vendor tag functionality Vendor Tag operations were added in module api v2.2 Change-Id: I352a50759d8bb9389d904bb774659e4be883794b --- modules/camera/Android.mk | 1 + modules/camera/CameraHAL.cpp | 43 +++++++++- modules/camera/CameraHAL.h | 2 + modules/camera/Metadata.h | 1 + modules/camera/VendorTags.cpp | 188 ++++++++++++++++++++++++++++++++++++++++++ modules/camera/VendorTags.h | 77 +++++++++++++++++ 6 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 modules/camera/VendorTags.cpp create mode 100644 modules/camera/VendorTags.h (limited to 'modules/camera') 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 #include #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 #include #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 ) 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 #include #include #include 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 +#include "Metadata.h" + +//#define LOG_NDEBUG 0 +#define LOG_TAG "VendorTags" +#include + +#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL) +#include + +#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 §ion->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 +#include + +namespace default_camera_hal { + +// VendorTags contains all vendor-specific metadata tag functionality +class VendorTags { + public: + VendorTags(); + ~VendorTags(); + + // Vendor Tags Operations (see ) + 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 +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_ -- cgit v1.1