Patch Detail
Show a patch.
GET /api/1.1/patches/1725/?format=api
{ "id": 1725, "url": "https://patchwork.libcamera.org/api/1.1/patches/1725/?format=api", "web_url": "https://patchwork.libcamera.org/patch/1725/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20190801155420.24694-6-jacopo@jmondi.org>", "date": "2019-08-01T15:54:20", "name": "[libcamera-devel,5/5] android: hal: Add Camera3 HAL", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "a23758e192f9894b607987172f4bd75bf428dd70", "submitter": { "id": 3, "url": "https://patchwork.libcamera.org/api/1.1/people/3/?format=api", "name": "Jacopo Mondi", "email": "jacopo@jmondi.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/1725/mbox/", "series": [ { "id": 444, "url": "https://patchwork.libcamera.org/api/1.1/series/444/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=444", "date": "2019-08-01T15:54:15", "name": "android: Add initial Camera HAL implementation", "version": 1, "mbox": "https://patchwork.libcamera.org/series/444/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/1725/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/1725/checks/", "tags": {}, "headers": { "Return-Path": "<jacopo@jmondi.org>", "Received": [ "from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net\n\t[217.70.183.196])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B5AFC615FF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 1 Aug 2019 17:53:31 +0200 (CEST)", "from uno.homenet.telecomitalia.it\n\t(host211-19-dynamic.58-82-r.retail.telecomitalia.it [82.58.19.211])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 91E44E000A;\n\tThu, 1 Aug 2019 15:53:27 +0000 (UTC)" ], "X-Originating-IP": "82.58.19.211", "From": "Jacopo Mondi <jacopo@jmondi.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Thu, 1 Aug 2019 17:54:20 +0200", "Message-Id": "<20190801155420.24694-6-jacopo@jmondi.org>", "X-Mailer": "git-send-email 2.22.0", "In-Reply-To": "<20190801155420.24694-1-jacopo@jmondi.org>", "References": "<20190801155420.24694-1-jacopo@jmondi.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 5/5] android: hal: Add Camera3 HAL", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.23", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "X-List-Received-Date": "Thu, 01 Aug 2019 15:53:32 -0000" }, "content": "Add Libcamera Android Camerav3 HAL implementation.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n src/android/camera3_hal.cpp | 130 +++++\n src/android/camera_hal_manager.cpp | 173 +++++++\n src/android/camera_hal_manager.h | 56 ++\n src/android/camera_module.cpp | 795 +++++++++++++++++++++++++++++\n src/android/camera_module.h | 69 +++\n src/android/camera_proxy.cpp | 181 +++++++\n src/android/camera_proxy.h | 41 ++\n src/android/meson.build | 8 +\n src/android/tags | 424 +++++++++++++++\n src/android/thread_rpc.cpp | 41 ++\n src/android/thread_rpc.h | 56 ++\n src/libcamera/meson.build | 22 +-\n src/meson.build | 4 +\n 13 files changed, 1995 insertions(+), 5 deletions(-)\n create mode 100644 src/android/camera3_hal.cpp\n create mode 100644 src/android/camera_hal_manager.cpp\n create mode 100644 src/android/camera_hal_manager.h\n create mode 100644 src/android/camera_module.cpp\n create mode 100644 src/android/camera_module.h\n create mode 100644 src/android/camera_proxy.cpp\n create mode 100644 src/android/camera_proxy.h\n create mode 100644 src/android/tags\n create mode 100644 src/android/thread_rpc.cpp\n create mode 100644 src/android/thread_rpc.h", "diff": "diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp\nnew file mode 100644\nindex 000000000000..0a97a9333d20\n--- /dev/null\n+++ b/src/android/camera3_hal.cpp\n@@ -0,0 +1,130 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera3_hal.cpp - Android Camera3 HAL module\n+ */\n+\n+#include <iostream>\n+#include <memory>\n+#include <vector>\n+\n+#include <hardware/hardware.h>\n+#include <system/camera_metadata.h>\n+\n+#include <libcamera/libcamera.h>\n+\n+#include \"log.h\"\n+\n+#include \"camera_hal_manager.h\"\n+#include \"camera_module.h\"\n+#include \"camera_proxy.h\"\n+\n+using namespace libcamera;\n+\n+LOG_DEFINE_CATEGORY(HAL)\n+\n+static CameraHalManager cameraManager;\n+\n+/*------------------------------------------------------------------------------\n+ * Android Camera HAL callbacks\n+ */\n+\n+static int hal_get_number_of_cameras(void)\n+{\n+\treturn cameraManager.numCameras();\n+}\n+\n+static int hal_get_camera_info(int id, struct camera_info *info)\n+{\n+\treturn cameraManager.getCameraInfo(id, info);\n+}\n+\n+static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)\n+{\n+\treturn 0;\n+}\n+\n+static int hal_open_legacy(const struct hw_module_t *module, const char *id,\n+\t\t\t uint32_t halVersion, struct hw_device_t **device)\n+{\n+\treturn -ENOSYS;\n+}\n+\n+static int hal_set_torch_mode(const char *camera_id, bool enabled)\n+{\n+\treturn -ENOSYS;\n+}\n+\n+/*\n+ * First entry point of the camera HAL module.\n+ *\n+ * Initialize the HAL but does not open any camera device yet (see hal_dev_open)\n+ */\n+static int hal_init()\n+{\n+\tLOG(HAL, Info) << \"Initialising Android camera HAL\";\n+\n+\tcameraManager.initialize();\n+\n+\treturn 0;\n+}\n+\n+/*------------------------------------------------------------------------------\n+ * Android Camera Device\n+ */\n+\n+static int hal_dev_close(hw_device_t *hw_device)\n+{\n+\tif (!hw_device)\n+\t\treturn -EINVAL;\n+\n+\tcamera3_device_t *dev = reinterpret_cast<camera3_device_t *>(hw_device);\n+\tCameraProxy *cameraModule = reinterpret_cast<CameraProxy *>(dev->priv);\n+\n+\treturn cameraManager.close(cameraModule);\n+}\n+\n+static int hal_dev_open(const hw_module_t* module, const char* name,\n+\t\t\thw_device_t** device)\n+{\n+\tLOG(HAL, Debug) << \"Open camera: \" << name;\n+\n+\tint id = atoi(name);\n+\tCameraProxy *proxy = cameraManager.open(id, module);\n+\tif (!proxy) {\n+\t\tLOG(HAL, Error) << \"Failed to open camera module \" << id;\n+\t\treturn -ENODEV;\n+\t}\n+\tproxy->device()->common.close = hal_dev_close;\n+\t*device = &proxy->device()->common;\n+\n+\treturn 0;\n+}\n+\n+static struct hw_module_methods_t hal_module_methods = {\n+\t.open = hal_dev_open,\n+};\n+\n+camera_module_t HAL_MODULE_INFO_SYM = {\n+\t.common = {\n+\t\t.tag = HARDWARE_MODULE_TAG,\n+\t\t.module_api_version = CAMERA_MODULE_API_VERSION_2_4,\n+\t\t.hal_api_version = HARDWARE_HAL_API_VERSION,\n+\t\t.id = CAMERA_HARDWARE_MODULE_ID,\n+\t\t.name = \"Libcamera Camera3HAL Module\",\n+\t\t.author = \"libcamera\",\n+\t\t.methods = &hal_module_methods,\n+\t\t.dso = nullptr,\n+\t\t.reserved = {},\n+\t},\n+\n+\t.get_number_of_cameras = hal_get_number_of_cameras,\n+\t.get_camera_info = hal_get_camera_info,\n+\t.set_callbacks = hal_set_callbacks,\n+\t.get_vendor_tag_ops = nullptr,\n+\t.open_legacy = hal_open_legacy,\n+\t.set_torch_mode = hal_set_torch_mode,\n+\t.init = hal_init,\n+\t.reserved = {},\n+};\ndiff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp\nnew file mode 100644\nindex 000000000000..734b5eebd9a5\n--- /dev/null\n+++ b/src/android/camera_hal_manager.cpp\n@@ -0,0 +1,173 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_hal_manager.cpp - Libcamera Android Camera Manager\n+ */\n+\n+#include \"camera_hal_manager.h\"\n+\n+#include <map>\n+\n+#include <hardware/hardware.h>\n+#include <system/camera_metadata.h>\n+\n+#include <libcamera/libcamera.h>\n+#include <libcamera/camera.h>\n+\n+#include \"log.h\"\n+\n+#include \"camera_module.h\"\n+#include \"camera_proxy.h\"\n+\n+using namespace libcamera;\n+LOG_DECLARE_CATEGORY(HAL);\n+\n+CameraHalManager::~CameraHalManager()\n+{\n+\tfor (auto metadata : staticMetadataMap_)\n+\t\tfree_camera_metadata(metadata.second);\n+}\n+\n+int CameraHalManager::initialize()\n+{\n+\t/*\n+\t * Thread::start() will create a std::thread which will execute\n+\t * CameraHalManager::run()\n+\t */\n+\tstart();\n+\n+\t/*\n+\t * Wait for run() to notify us before returning to the caller to\n+\t * make sure libcamera is fully initialized before we start handling\n+\t * calls from the camera stack.\n+\t */\n+\tMutexLocker locker(mutex_);\n+\tcv_.wait(locker);\n+\n+\treturn 0;\n+}\n+\n+void CameraHalManager::run()\n+{\n+\t/*\n+\t * The run() operation is scheduled in its own thread;\n+\t * It exec() to run the even dispatcher loop and initialize libcamera.\n+\t *\n+\t * All the libcamera components initialized from here will be tied to\n+\t * the same thread as the here below run event dispatcher.\n+\t */\n+\tlibcameraManager_ = libcamera::CameraManager::instance();\n+\n+\tint ret = libcameraManager_->start();\n+\tif (ret) {\n+\t\tLOG(HAL, Error) << \"Failed to start camera manager: \"\n+\t\t\t\t<< strerror(-ret);\n+\t\treturn;\n+\t}\n+\n+\t/*\n+\t * For each Camera registered in the system, a CameraModule\n+\t * get created here with an associated Camera and a proxy.\n+\t *\n+\t * \\todo Support camera hotplug.\n+\t */\n+\tunsigned int cameraIndex = 0;\n+\tfor (auto camera : libcameraManager_->cameras()) {\n+\t\tcameras_.push_back(camera);\n+\n+\t\tCameraModule *module = new CameraModule(cameraIndex,\n+\t\t\t\t\t\t\tcamera.get());\n+\t\tmodules_.emplace_back(module);\n+\n+\t\tCameraProxy *proxy = new CameraProxy(cameraIndex,\n+\t\t\t\t\t\t module);\n+\t\tproxies_.emplace_back(proxy);\n+\n+\t\t++cameraIndex;\n+\t}\n+\n+\t/*\n+\t * libcamera has been initialized! Unlock the initialize() caller\n+\t * as we're now ready to handle calls from the framework.\n+\t */\n+\tcv_.notify_one();\n+\n+\t/* Now start processing events and messages! */\n+\texec();\n+}\n+\n+CameraProxy *CameraHalManager::open(unsigned int id,\n+\t\t\t\t const hw_module_t *hardwareModule)\n+{\n+\tif (id < 0 || id >= numCameras()) {\n+\t\tLOG(HAL, Error) << \"Invalid camera id '\" << id << \"'\";\n+\t\treturn nullptr;\n+\t}\n+\n+\tCameraProxy *proxy = proxies_[id].get();\n+\tif (proxy->open(hardwareModule))\n+\t\treturn proxy;\n+\n+\tLOG(HAL, Info) << \"Camera: '\" << id << \"' opened\";\n+\n+\treturn proxy;\n+}\n+\n+int CameraHalManager::close(CameraProxy *proxy)\n+{\n+\tproxy->close();\n+\tLOG(HAL, Info) << \"Close camera: \" << proxy->id();\n+\n+\treturn 0;\n+}\n+\n+unsigned int CameraHalManager::numCameras() const\n+{\n+\treturn libcameraManager_->cameras().size();\n+}\n+\n+/*\n+ * Before the camera framework even tries to open a camera device with\n+ * hal_dev_open() it requires the camera HAL to report a list of static\n+ * informations on the camera device with id \\a id in the hal_get_camera_info()\n+ * method.\n+ *\n+ * The static metadata should be then generated probably from a\n+ * platform-specific module, as we cannot operate on the camera at this time as\n+ * it has not yet been open by the framework.\n+ *\n+ * This is what the Intel XML file is used for, it is parsed and the data there\n+ * combined with informations from the PSL service (which I -think- it's what\n+ * our IPA is) to generate a list of static metadata per-camera device.\n+ */\n+int CameraHalManager::getCameraInfo(int id, struct camera_info *info)\n+{\n+\tint cameras = numCameras();\n+\tif (id >= cameras || id < 0 || !info) {\n+\t\tLOG(HAL, Error) << \"Invalid camera id: \" << id;\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tcamera_metadata_t *staticMetadata;\n+\tauto it = staticMetadataMap_.find(id);\n+\tif (it != staticMetadataMap_.end()) {\n+\t\tstaticMetadata = it->second;\n+\t} else {\n+\t\tCameraModule *cameraModule = modules_[id].get();\n+\n+\t\tstaticMetadata = cameraModule->getStaticMetadata();\n+\t\tstaticMetadataMap_[id] = staticMetadata;\n+\t}\n+\n+\t/* \\todo: Get these info dynamically inspecting the camera module. */\n+\tinfo->facing = id ? CAMERA_FACING_FRONT : CAMERA_FACING_BACK;\n+\tinfo->orientation = 0;\n+\tinfo->device_version = 0;\n+\tinfo->resource_cost = 0;\n+\tinfo->static_camera_characteristics = staticMetadata;\n+\tinfo->conflicting_devices = nullptr;\n+\tinfo->conflicting_devices_length = 0;\n+\n+\treturn 0;\n+}\ndiff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h\nnew file mode 100644\nindex 000000000000..65d6fa3150ef\n--- /dev/null\n+++ b/src/android/camera_hal_manager.h\n@@ -0,0 +1,56 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_hal_manager.h - Libcamera Android Camera Manager\n+ */\n+#ifndef __ANDROID_CAMERA_MANAGER_H__\n+#define __ANDROID_CAMERA_MANAGER_H__\n+\n+#include <condition_variable>\n+#include <cstddef>\n+#include <map>\n+#include <memory>\n+#include <vector>\n+\n+#include <hardware/hardware.h>\n+#include <system/camera_metadata.h>\n+\n+#include <libcamera/libcamera.h>\n+\n+#include \"thread.h\"\n+#include \"thread_rpc.h\"\n+\n+class CameraModule;\n+class CameraProxy;\n+\n+class CameraHalManager : public libcamera::Thread\n+{\n+public:\n+\t~CameraHalManager();\n+\n+\tint initialize();\n+\n+\tCameraProxy *open(unsigned int id, const hw_module_t *module);\n+\tint close(CameraProxy *proxy);\n+\n+\tunsigned int numCameras() const;\n+\tint getCameraInfo(int id, struct camera_info *info);\n+\n+private:\n+\tvoid run() override;\n+\tcamera_metadata_t *getStaticMetadata(unsigned int id);\n+\n+\tlibcamera::CameraManager *libcameraManager_;\n+\n+\tstd::mutex mutex_;\n+\tstd::condition_variable cv_;\n+\n+\tstd::vector<std::shared_ptr<libcamera::Camera>> cameras_;\n+\tstd::vector<std::unique_ptr<CameraModule>> modules_;\n+\tstd::vector<std::unique_ptr<CameraProxy>> proxies_;\n+\n+\tstd::map<unsigned int, camera_metadata_t *> staticMetadataMap_;\n+};\n+\n+#endif /* __ANDROID_CAMERA_MANAGER_H__ */\ndiff --git a/src/android/camera_module.cpp b/src/android/camera_module.cpp\nnew file mode 100644\nindex 000000000000..1d7e007f62c0\n--- /dev/null\n+++ b/src/android/camera_module.cpp\n@@ -0,0 +1,795 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_module.cpp - Libcamera Android Camera Module\n+ */\n+\n+#include \"camera_module.h\"\n+\n+#include <iostream>\n+#include <memory>\n+\n+#include <system/camera_metadata.h>\n+\n+#include <hardware/camera3.h>\n+#include <libcamera/libcamera.h>\n+\n+#include \"message.h\"\n+\n+#include \"log.h\"\n+\n+using namespace libcamera;\n+\n+LOG_DECLARE_CATEGORY(HAL);\n+\n+CameraModule::CameraModule(unsigned int id, libcamera::Camera *camera)\n+\t: id_(id), camera_(camera), requestTemplate_(nullptr)\n+{\n+\tcamera_->requestCompleted.connect(this,\n+\t\t\t\t\t &CameraModule::requestComplete);\n+}\n+\n+CameraModule::~CameraModule()\n+{\n+\tif (requestTemplate_)\n+\t\tfree_camera_metadata(requestTemplate_);\n+\trequestTemplate_ = nullptr;\n+}\n+\n+void CameraModule::message(Message *message)\n+{\n+\tThreadRpcMessage *rpcMessage = static_cast<ThreadRpcMessage *>\n+\t\t\t\t (message);\n+\n+\tif (rpcMessage->type() != ThreadRpcMessage::type())\n+\t\treturn Object::message(message);\n+\n+\tThreadRpc *rpc = rpcMessage->rpc;\n+\n+\tswitch (rpc->tag) {\n+\tcase ThreadRpc::ProcessCaptureRequest:\n+\t\tprocessCaptureRequest(rpc->request);\n+\t\tbreak;\n+\tcase ThreadRpc::Close:\n+\t\tclose();\n+\t\tbreak;\n+\tdefault:\n+\t\tLOG(HAL, Error) << \"Unknown RPC operation: \" << rpc->tag;\n+\t}\n+\n+\trpc->notifyReception();\n+}\n+\n+int CameraModule::open()\n+{\n+\tint ret = camera_->acquire();\n+\tif (ret) {\n+\t\tLOG(HAL, Error) << \"Failed to acquire the camera\";\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+void CameraModule::close()\n+{\n+\tif (camera_->state() >= CameraRunning)\n+\t\tcamera_->stop();\n+\n+\tcamera_->freeBuffers();\n+\tcamera_->release();\n+}\n+\n+void CameraModule::setCallbacks(const struct camera3_device *camera3Device,\n+\t\t\t\tconst camera3_callback_ops_t *callbacks)\n+{\n+\tcamera3Device_ = camera3Device;\n+\tcallbacks_ = callbacks;\n+}\n+\n+camera_metadata_t *CameraModule::getStaticMetadata()\n+{\n+\tint ret;\n+\n+\t/*\n+\t * The below metadata has been added by inspecting the Intel XML\n+\t * file and it's associated parsing routines in the Intel IPU3 HAL.\n+\t *\n+\t * The here below metadata are enough to satisfy the camera3-test\n+\t * provided by ChromeOS, but a real camera implementation might require\n+\t * more.\n+\t *\n+\t * See CameraConf::AiqConf class implementation in the Intel HAL\n+\t * to get a list of the static metadata registered by parsing the\n+\t * XML config file in AiqConf::fillStaticMetadataFromCMC\n+\t */\n+\n+\t/*\n+\t * FIXME: this sizes come from the Intel IPU3 HAL, and are way too large for\n+\t * this intial HAL version.\n+\t */\n+\t#define STATIC_ENTRY_CAP 256\n+\t#define STATIC_DATA_CAP 6688\n+\tcamera_metadata_t *staticMetadata =\n+\t\tallocate_camera_metadata(STATIC_ENTRY_CAP, STATIC_DATA_CAP);\n+\n+\t/* Sensor static metadata. */\n+\tint32_t pixelArraySize[] = {\n+\t\t2592, 1944,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,\n+\t\t\t\t&pixelArraySize, 2);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t sensorSizes[] = {\n+\t\t0, 0, 2560, 1920,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,\n+\t\t\t\t&sensorSizes, 4);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t sensitivityRange[] = {\n+\t\t32, 2400,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_INFO_SENSITIVITY_RANGE,\n+\t\t\t\t&sensitivityRange, 2);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint16_t filterArr = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,\n+\t\t\t\t&filterArr, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint64_t exposureTimeRange[] = {\n+\t\t100000, 200000000,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,\n+\t\t\t\t&exposureTimeRange, 2);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t orientation = 0;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_SENSOR_ORIENTATION,\n+\t\t\t\t&orientation, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* Flash static metadata. */\n+\tchar flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_FLASH_INFO_AVAILABLE,\n+\t\t\t&flashAvailable, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* Lens static metadata. */\n+\tfloat fn = 2.53 / 100;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\t\tANDROID_LENS_INFO_AVAILABLE_APERTURES, &fn, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* Control metadata. */\n+\tchar controlMetadata = ANDROID_CONTROL_MODE_AUTO;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_CONTROL_AVAILABLE_MODES,\n+\t\t\t&controlMetadata, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tchar availableAntiBandingModes[] = {\n+\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,\n+\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ,\n+\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ,\n+\t\tANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,\n+\t\t\tavailableAntiBandingModes, 4);\n+\tMETADATA_ASSERT(ret);\n+\n+\tchar aeAvailableModes[] = {\n+\t\tANDROID_CONTROL_AE_MODE_ON,\n+\t\tANDROID_CONTROL_AE_MODE_OFF,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_CONTROL_AE_AVAILABLE_MODES,\n+\t\t\taeAvailableModes, 2);\n+\tMETADATA_ASSERT(ret);\n+\n+\tcontrolMetadata = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_CONTROL_AE_LOCK_AVAILABLE,\n+\t\t\t&controlMetadata, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n+\t\t\t&awbLockAvailable, 1);\n+\n+\t/* Scaler static metadata. */\n+\tstd::vector<uint32_t> availableStreamFormats = {\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_SCALER_AVAILABLE_FORMATS,\n+\t\t\tavailableStreamFormats.data(),\n+\t\t\tavailableStreamFormats.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\tstd::vector<uint32_t> availableStreamConfigurations = {\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920,\n+\t\tANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, 2560, 1920,\n+\t\tANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED, 2560, 1920,\n+\t\tANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,\n+\t\t\tavailableStreamConfigurations.data(),\n+\t\t\tavailableStreamConfigurations.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\tstd::vector<int64_t> availableStallDurations = {\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920, 33333333,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_SCALER_AVAILABLE_STALL_DURATIONS,\n+\t\t\tavailableStallDurations.data(),\n+\t\t\tavailableStallDurations.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\tstd::vector<int64_t> minFrameDurations = {\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 2560, 1920, 33333333,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_IMPLEMENTATION_DEFINED, 2560, 1920, 33333333,\n+\t\tANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, 2560, 1920, 33333333,\n+\t};\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,\n+\t\t\tminFrameDurations.data(), minFrameDurations.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* Info static metadata. */\n+\tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;\n+\tret = add_camera_metadata_entry(staticMetadata,\n+\t\t\tANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,\n+\t\t\t&supportedHWLevel, 1);\n+\n+\treturn staticMetadata;\n+}\n+\n+const camera_metadata_t *CameraModule::constructDefaultRequestMetadata(int type)\n+{\n+\tint ret;\n+\n+\t/*\n+\t * TODO: inspect type and pick the right metadata pack.\n+\t * As of now just use a single one for all templates\n+\t */\n+\tuint8_t captureIntent;\n+\tswitch (type) {\n+\tcase CAMERA3_TEMPLATE_PREVIEW:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_MANUAL:\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n+\t\tbreak;\n+\tdefault:\n+\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n+\t\treturn nullptr;\n+\t}\n+\n+\tif (requestTemplate_)\n+\t\treturn requestTemplate_;\n+\n+\t/* FIXME: this sizes are quite arbitrary ones */\n+\t#define REQUEST_TEMPLATE_ENTRIES\t 30\n+\t#define REQUEST_TEMPLATE_DATA\t\t2048\n+\trequestTemplate_ = allocate_camera_metadata(REQUEST_TEMPLATE_ENTRIES,\n+\t\t\t\t\t\t REQUEST_TEMPLATE_DATA);\n+\tif (!requestTemplate_) {\n+\t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n+\t\treturn nullptr;\n+\t}\n+\n+\t/*\n+\t * Fill in the required Request metadata.\n+\t *\n+\t * Part (most?) of this entries comes from inspecting the Intel's IPU3\n+\t * HAL xml configuration file.\n+\t */\n+\n+\t/* Set to 0 the number of 'processed and stalling' streams (ie JPEG). */\n+\tint32_t maxOutStream[] = { 0, 2, 0 };\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,\n+\t\t\tmaxOutStream, 3);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t maxPipelineDepth = 5;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n+\t\t\t&maxPipelineDepth, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t inputStreams = 0;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,\n+\t\t\t&inputStreams, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t partialResultCount = 1;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n+\t\t\t&partialResultCount, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t availableCapabilities[] = {\n+\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,\n+\t};\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_AVAILABLE_CAPABILITIES,\n+\t\t\tavailableCapabilities, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AE_MODE,\n+\t\t\t&aeMode, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t aeExposureCompensation = 0;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n+\t\t\t&aeExposureCompensation, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n+\t\t\t&aePrecaptureTrigger, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AE_LOCK,\n+\t\t\t&aeLock, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AF_TRIGGER,\n+\t\t\t&afTrigger, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AWB_MODE,\n+\t\t\t&awbMode, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AWB_LOCK,\n+\t\t\t&awbLock, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n+\t\t\t&awbLockAvailable, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_FLASH_MODE,\n+\t\t\t&flashMode, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n+\t\t\t&faceDetectMode, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_CONTROL_CAPTURE_INTENT,\n+\t\t\t&captureIntent, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\t/*\n+\t * This is quite hard to list at the moment wihtout knowing what\n+\t * we could control.\n+\t *\n+\t * For now, just list in the available Request keys and in the available\n+\t * result keys the control and reporting of the AE algorithm.\n+\t */\n+\tstd::vector<int32_t> availableRequestKeys = {\n+\t\tANDROID_CONTROL_AE_MODE,\n+\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n+\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n+\t\tANDROID_CONTROL_AE_LOCK,\n+\t\tANDROID_CONTROL_AF_TRIGGER,\n+\t\tANDROID_CONTROL_AWB_MODE,\n+\t\tANDROID_CONTROL_AWB_LOCK,\n+\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n+\t\tANDROID_CONTROL_CAPTURE_INTENT,\n+\t\tANDROID_FLASH_MODE,\n+\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n+\t};\n+\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,\n+\t\t\tavailableRequestKeys.data(),\n+\t\t\tavailableRequestKeys.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\tstd::vector<int32_t> availableResultKeys = {\n+\t\tANDROID_CONTROL_AE_MODE,\n+\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n+\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n+\t\tANDROID_CONTROL_AE_LOCK,\n+\t\tANDROID_CONTROL_AF_TRIGGER,\n+\t\tANDROID_CONTROL_AWB_MODE,\n+\t\tANDROID_CONTROL_AWB_LOCK,\n+\t\tANDROID_CONTROL_AWB_LOCK_AVAILABLE,\n+\t\tANDROID_CONTROL_CAPTURE_INTENT,\n+\t\tANDROID_FLASH_MODE,\n+\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n+\t};\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_AVAILABLE_RESULT_KEYS,\n+\t\t\tavailableResultKeys.data(),\n+\t\t\tavailableResultKeys.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\t/*\n+\t * The available characteristics should be the tags reported\n+\t * as part of the static metadata reported at hal_get_camera_info()\n+\t * time. The xml file sets those to 0 though.\n+\t */\n+\tstd::vector<int32_t> availableCharacteristicsKeys = {};\n+\tret = add_camera_metadata_entry(requestTemplate_,\n+\t\t\tANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,\n+\t\t\tavailableCharacteristicsKeys.data(),\n+\t\t\tavailableCharacteristicsKeys.size());\n+\tMETADATA_ASSERT(ret);\n+\n+\treturn requestTemplate_;\n+}\n+\n+/**\n+ * Inspect the stream_list to produce a list of StreamConfiguration to\n+ * be use to configure the Camera.\n+ */\n+int CameraModule::configureStreams(camera3_stream_configuration_t *stream_list)\n+{\n+\n+\tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n+\t\tcamera3_stream_t *stream = stream_list->streams[i];\n+\n+\t\tLOG(HAL, Info) << \"Stream #\" << i\n+\t\t\t << \": direction: \" << stream->stream_type\n+\t\t\t << \" - width: \" << stream->width\n+\t\t\t << \" - height: \" << stream->height\n+\t\t\t << \" - format: \" << std::hex << stream->format;\n+\t}\n+\n+\t/* Hardcode viewfinder role, collecting sizes from the stream config. */\n+\tif (stream_list->num_streams != 1) {\n+\t\tLOG(HAL, Error) << \"Only one stream supported\";\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tStreamRoles roles = {};\n+\troles.push_back(StreamRole::StillCapture);\n+\n+\tconfig_ = camera_->generateConfiguration(roles);\n+\tif (!config_ || config_->empty()) {\n+\t\tLOG(HAL, Error) << \"Failed to generate camera configuration\";\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Only one stream is supported. */\n+\tcamera3_stream_t *camera3Stream = stream_list->streams[0];\n+\tStreamConfiguration *streamConfiguration = &config_->at(0);\n+\tstreamConfiguration->size.width = camera3Stream->width;\n+\tstreamConfiguration->size.height = camera3Stream->height;\n+\tstreamConfiguration->memoryType = ExternalMemory;\n+\n+\t/*\n+\t * FIXME: do not change the pixel format from the one returned\n+\t * from the Camera::generateConfiguration();\n+\t *\n+\t * We'll need to translate from Android defined pixel format codes\n+\t * to whatever libcamera will use.\n+\t */\n+\n+\tswitch (config_->validate()) {\n+\tcase CameraConfiguration::Valid:\n+\t\tbreak;\n+\tcase CameraConfiguration::Adjusted:\n+\t\tLOG(HAL, Info) << \"Camera configuration adjusted\";\n+\t\treturn -EINVAL;\n+\tcase CameraConfiguration::Invalid:\n+\t\tLOG(HAL, Info) << \"Camera configuration invalid\";\n+\t\tconfig_.reset();\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tcamera3Stream->max_buffers = streamConfiguration->bufferCount;\n+\n+\t/*\n+\t * Once the CameraConfiguration has been adjusted/validated\n+\t * it can be applied to the camera.\n+\t */\n+\tint ret = camera_->configure(config_.get());\n+\tif (ret) {\n+\t\tLOG(HAL, Error) << \"Failed to configure camera '\"\n+\t\t\t\t<< camera_->name() << \"'\";\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int CameraModule::processCaptureRequest(camera3_capture_request_t *camera3Request)\n+{\n+\tStreamConfiguration *streamConfiguration = &config_->at(0);\n+\tStream *stream = streamConfiguration->stream();\n+\n+\tif (camera3Request->num_output_buffers != 1) {\n+\t\tLOG(HAL, Error) << \"Invalid number of output buffers: \"\n+\t\t\t\t<< camera3Request->num_output_buffers;\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* Start the camera if that's the first request we handle. */\n+\tif (camera_->state() < CameraRunning) {\n+\t\tint ret = camera_->allocateBuffers();\n+\t\tif (ret) {\n+\t\t\tLOG(HAL, Error) << \"Failed to allocate buffers\";\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tret = camera_->start();\n+\t\tif (ret) {\n+\t\t\tLOG(HAL, Error) << \"Failed to start camera\";\n+\t\t\tcamera_->freeBuffers();\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\t/*\n+\t * Queue a request for the Camera with the provided dmabuf file\n+\t * descriptors.\n+\t */\n+\tconst camera3_stream_buffer_t *camera3Buffer =\n+\t\t\t\t\t&camera3Request->output_buffers[0];\n+\tconst buffer_handle_t camera3Handle = *camera3Buffer->buffer;\n+\n+\tstd::array<int, 3> fds = {\n+\t\tcamera3Handle->data[0],\n+\t\tcamera3Handle->data[1],\n+\t\tcamera3Handle->data[2],\n+\t};\n+\tstd::unique_ptr<Buffer> buffer = stream->createBuffer(fds);\n+\tif (!buffer) {\n+\t\tLOG(HAL, Error) << \"Failed to create buffer\";\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tRequest *request = camera_->createRequest();\n+\trequest->addBuffer(std::move(buffer));\n+\tint ret = camera_->queueRequest(request);\n+\tif (ret) {\n+\t\tLOG(HAL, Error) << \"Failed to queue request\";\n+\t\treturn ret;\n+\t}\n+\n+\t/* Save the request descriptors for use at completion time. */\n+\tCamera3RequestDescriptor descriptor = {};\n+\tdescriptor.frameNumber = camera3Request->frame_number,\n+\tdescriptor.numBuffers = camera3Request->num_output_buffers,\n+\tdescriptor.buffers = new camera3_stream_buffer_t[descriptor.numBuffers];\n+\tfor (unsigned int i = 0; i < descriptor.numBuffers; ++i) {\n+\t\tcamera3_stream_buffer_t &buffer = descriptor.buffers[i];\n+\t\tbuffer = camera3Request->output_buffers[i];\n+\t}\n+\n+\trequestMap_[request] = descriptor;\n+\n+\treturn 0;\n+}\n+\n+void CameraModule::requestComplete(Request *request,\n+\t\t\t\t const std::map<Stream *, Buffer *> &buffers)\n+{\n+\tBuffer *libcameraBuffer = buffers.begin()->second;\n+\tcamera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK;\n+\tcamera_metadata_t *resultMetadata = nullptr;\n+\n+\tif (request->status() != Request::RequestComplete) {\n+\t\tLOG(HAL, Error) << \"Request not succesfully completed: \"\n+\t\t\t\t<< request->status();\n+\t\tstatus = CAMERA3_BUFFER_STATUS_ERROR;\n+\t}\n+\n+\t/* Prepare to call back the Android camera stack. */\n+\tCamera3RequestDescriptor &descriptor = requestMap_[request];\n+\n+\tcamera3_capture_result_t captureResult = {};\n+\tcaptureResult.frame_number = descriptor.frameNumber;\n+\tcaptureResult.num_output_buffers = descriptor.numBuffers;\n+\n+\tcamera3_stream_buffer_t *resultBuffers =\n+\t\tnew camera3_stream_buffer_t[descriptor.numBuffers];\n+\tfor (unsigned int i = 0; i < descriptor.numBuffers; ++i) {\n+\t\tcamera3_stream_buffer_t resultBuffer;\n+\n+\t\tresultBuffer = descriptor.buffers[i];\n+\t\tresultBuffer.acquire_fence = -1;\n+\t\tresultBuffer.release_fence = -1;\n+\t\tresultBuffer.status = status;\n+\n+\t\tresultBuffers[i] = resultBuffer;\n+\t}\n+\tcaptureResult.output_buffers =\n+\t\tconst_cast<const camera3_stream_buffer_t *>(resultBuffers);\n+\n+\tif (status == CAMERA3_BUFFER_STATUS_ERROR) {\n+\t\t/* \\todo Improve error handling. */\n+\t\tnotifyError(descriptor.frameNumber, resultBuffers->stream);\n+\t} else {\n+\t\tnotifyShutter(descriptor.frameNumber, libcameraBuffer->timestamp());\n+\n+\t\tcaptureResult.partial_result = 1;\n+\t\tresultMetadata = getResultMetadata(descriptor.frameNumber,\n+\t\t\t\t\t\t libcameraBuffer->timestamp());\n+\t\tcaptureResult.result = resultMetadata;\n+\t}\n+\n+\tcallbacks_->process_capture_result(callbacks_, &captureResult);\n+\n+\tif (resultMetadata)\n+\t\tfree_camera_metadata(resultMetadata);\n+\n+\tdelete[] resultBuffers;\n+\tdelete[] descriptor.buffers;\n+\trequestMap_.erase(request);\n+\n+\treturn;\n+}\n+\n+void CameraModule::notifyShutter(uint32_t frameNumber, uint64_t timestamp)\n+{\n+\tcamera3_notify_msg_t notify = {};\n+\n+\tnotify.type = CAMERA3_MSG_SHUTTER;\n+\tnotify.message.shutter.frame_number = frameNumber;\n+\tnotify.message.shutter.timestamp = timestamp;\n+\n+\tcallbacks_->notify(callbacks_, ¬ify);\n+}\n+\n+void CameraModule::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n+{\n+\tcamera3_notify_msg_t notify = {};\n+\n+\tnotify.type = CAMERA3_MSG_ERROR;\n+\tnotify.message.error.error_stream = stream;\n+\tnotify.message.error.frame_number = frameNumber;\n+\tnotify.message.error.error_code = CAMERA3_MSG_ERROR_REQUEST;\n+\n+\tcallbacks_->notify(callbacks_, ¬ify);\n+}\n+\n+/*\n+ * Fixed result metadata, mostly imported from the UVC camera HAL, which\n+ * does not produces metadata and thus needs to generate a fixed set.\n+ */\n+camera_metadata_t *CameraModule::getResultMetadata(int frame_number,\n+\t\t\t\t\t\t int64_t timestamp)\n+{\n+\tint ret;\n+\n+\t/* FIXME: random \"big enough\" values. */\n+\t#define RESULT_ENTRY_CAP 256\n+\t#define RESULT_DATA_CAP 6688\n+\tcamera_metadata_t *resultMetadata =\n+\t\tallocate_camera_metadata(STATIC_ENTRY_CAP, STATIC_DATA_CAP);\n+\n+\tconst uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;\n+\tret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AE_STATE,\n+\t\t\t\t\t&ae_state, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t ae_lock = ANDROID_CONTROL_AE_LOCK_OFF;\n+\tret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AE_LOCK,\n+\t\t\t\t\t&ae_lock, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tuint8_t af_state = ANDROID_CONTROL_AF_STATE_INACTIVE;\n+\tret = add_camera_metadata_entry(resultMetadata, ANDROID_CONTROL_AF_STATE,\n+\t\t\t\t\t&af_state, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t awb_state = ANDROID_CONTROL_AWB_STATE_CONVERGED;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_CONTROL_AWB_STATE,\n+\t\t\t\t\t&awb_state, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t awb_lock = ANDROID_CONTROL_AWB_LOCK_OFF;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_CONTROL_AWB_LOCK,\n+\t\t\t\t\t&awb_lock, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t lens_state = ANDROID_LENS_STATE_STATIONARY;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_LENS_STATE,\n+\t\t\t\t\t&lens_state, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tint32_t sensorSizes[] = {\n+\t\t0, 0, 2560, 1920,\n+\t};\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_SCALER_CROP_REGION,\n+\t\t\t\t\tsensorSizes, 4);\n+\tMETADATA_ASSERT(ret);\n+\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_SENSOR_TIMESTAMP,\n+\t\t\t\t\t×tamp, 1);\n+\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* 33.3 msec */\n+\tconst int64_t rolling_shutter_skew = 33300000;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_SENSOR_ROLLING_SHUTTER_SKEW,\n+\t\t\t\t\t&rolling_shutter_skew, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\t/* 16.6 msec */\n+\tconst int64_t exposure_time = 16600000;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_SENSOR_EXPOSURE_TIME,\n+\t\t\t\t\t&exposure_time, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t lens_shading_map_mode =\n+\t\t\t\tANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_STATISTICS_LENS_SHADING_MAP_MODE,\n+\t\t\t\t\t&lens_shading_map_mode, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\tconst uint8_t scene_flicker = ANDROID_STATISTICS_SCENE_FLICKER_NONE;\n+\tret = add_camera_metadata_entry(resultMetadata,\n+\t\t\t\t\tANDROID_STATISTICS_SCENE_FLICKER,\n+\t\t\t\t\t&scene_flicker, 1);\n+\tMETADATA_ASSERT(ret);\n+\n+\treturn resultMetadata;\n+}\ndiff --git a/src/android/camera_module.h b/src/android/camera_module.h\nnew file mode 100644\nindex 000000000000..c33fde590cdc\n--- /dev/null\n+++ b/src/android/camera_module.h\n@@ -0,0 +1,69 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_module.h - Libcamera Android Camera Module\n+ */\n+#ifndef __ANDROID_CAMERA_MODULE_H__\n+#define __ANDROID_CAMERA_MODULE_H__\n+\n+#include <memory>\n+\n+#include <hardware/camera3.h>\n+#include <libcamera/libcamera.h>\n+\n+#include \"message.h\"\n+\n+#include \"camera_hal_manager.h\"\n+\n+#define METADATA_ASSERT(_r)\t\t\\\n+\tdo {\t\t\t\t\\\n+\t\tif (!(_r)) break;\t\\\n+\t\tLOG(HAL, Error) << \"Error: \" << __func__ << \":\" << __LINE__; \\\n+\t\treturn nullptr;\t\t\\\n+\t} while(0);\n+\n+class CameraModule : public libcamera::Object\n+{\n+public:\n+\tCameraModule(unsigned int id, libcamera::Camera *camera);\n+\t~CameraModule();\n+\n+\tvoid message(libcamera::Message *message);\n+\n+\tint open();\n+\tvoid close();\n+\tvoid setCallbacks(const struct camera3_device *cameraDevice,\n+\t\t\t const camera3_callback_ops_t *callbacks);\n+\tcamera_metadata_t *getStaticMetadata();\n+\tconst camera_metadata_t *constructDefaultRequestMetadata(int type);\n+\tint configureStreams(camera3_stream_configuration_t *stream_list);\n+\tint processCaptureRequest(camera3_capture_request_t *request);\n+\tvoid requestComplete(libcamera::Request *request,\n+\t\t\t const std::map<libcamera::Stream *, libcamera::Buffer *> &buffers);\n+\n+\tunsigned int id() const { return id_; }\n+\n+private:\n+\tstruct Camera3RequestDescriptor {\n+\t\tuint32_t frameNumber;\n+\t\tuint32_t numBuffers;\n+\t\tcamera3_stream_buffer_t *buffers;\n+\t};\n+\n+\tvoid notifyShutter(uint32_t frameNumber, uint64_t timestamp);\n+\tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n+\tcamera_metadata_t *getResultMetadata(int frame_number, int64_t timestamp);\n+\n+\tunsigned int id_;\n+\tlibcamera::Camera *camera_;\n+\tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n+\n+\tcamera_metadata_t *requestTemplate_;\n+\tconst camera3_callback_ops_t *callbacks_;\n+\tconst struct camera3_device *camera3Device_;\n+\n+\tstd::map<libcamera::Request *, Camera3RequestDescriptor> requestMap_;\n+};\n+\n+#endif /* __ANDROID_CAMERA_MODULE_H__ */\ndiff --git a/src/android/camera_proxy.cpp b/src/android/camera_proxy.cpp\nnew file mode 100644\nindex 000000000000..af7817f29137\n--- /dev/null\n+++ b/src/android/camera_proxy.cpp\n@@ -0,0 +1,181 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_proxy.cpp - Proxy to camera module instances\n+ */\n+\n+#include \"camera_proxy.h\"\n+\n+#include <hardware/camera3.h>\n+#include <libcamera/libcamera.h>\n+#include <system/camera_metadata.h>\n+\n+#include <memory>\n+\n+#include \"log.h\"\n+#include \"message.h\"\n+#include \"thread_rpc.h\"\n+#include \"utils.h\"\n+\n+using namespace libcamera;\n+\n+LOG_DECLARE_CATEGORY(HAL);\n+\n+#define LIBCAMERA_HAL_FUNC_DBG\t\\\n+\tLOG(HAL, Debug);\n+\n+static int hal_dev_initialize(const struct camera3_device *dev,\n+\t\t\t const camera3_callback_ops_t *callback_ops)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tif (!dev)\n+\t\treturn -EINVAL;\n+\n+\tCameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);\n+\tproxy->setCallbacks(callback_ops);\n+\n+\treturn 0;\n+}\n+\n+static int hal_dev_configure_streams(const struct camera3_device *dev,\n+\t\t\t\t camera3_stream_configuration_t *stream_list)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tif (!dev)\n+\t\treturn -EINVAL;\n+\n+\tCameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);\n+\tproxy->configureStreams(stream_list);\n+\n+\treturn 0;\n+}\n+\n+static const camera_metadata_t *\n+hal_dev_construct_default_request_settings(const struct camera3_device *dev,\n+\t\t\t\t\t int type)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tif (!dev)\n+\t\treturn nullptr;\n+\n+\tCameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);\n+\treturn proxy->constructDefaultRequest(type);\n+}\n+\n+static int hal_dev_process_capture_request(const struct camera3_device *dev,\n+\t\t\t\t\t camera3_capture_request_t *request)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tif (!dev)\n+\t\treturn -EINVAL;\n+\n+\tCameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);\n+\treturn proxy->processCaptureRequest(request);\n+}\n+\n+static void hal_dev_dump(const struct camera3_device *dev, int fd)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+}\n+\n+static int hal_dev_flush(const struct camera3_device *dev)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\treturn 0;\n+}\n+\n+static camera3_device_ops hal_dev_ops = {\n+\t.initialize = hal_dev_initialize,\n+\t.configure_streams = hal_dev_configure_streams,\n+\t.register_stream_buffers = nullptr,\n+\t.construct_default_request_settings = hal_dev_construct_default_request_settings,\n+\t.process_capture_request = hal_dev_process_capture_request,\n+\t.get_metadata_vendor_tag_ops = nullptr,\n+\t.dump = hal_dev_dump,\n+\t.flush = hal_dev_flush,\n+\t.reserved = { 0 },\n+};\n+\n+CameraProxy::CameraProxy(unsigned int id, CameraModule *cameraModule)\n+\t: open_(false), id_(id), cameraModule_(cameraModule)\n+{\n+}\n+\n+int CameraProxy::open(const hw_module_t *hardwareModule)\n+{\n+\tint ret = cameraModule_->open();\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/* Initialize the hw_device_t in the instance camera3_module_t. */\n+\tcameraDevice_.common.tag = HARDWARE_DEVICE_TAG;\n+\tcameraDevice_.common.version = CAMERA_DEVICE_API_VERSION_3_3;\n+\tcameraDevice_.common.module = (hw_module_t *)hardwareModule;\n+\n+\t/*\n+\t * The camera device operations. These actually implement\n+\t * the Android Camera HALv3 interface.\n+\t */\n+\tcameraDevice_.ops = &hal_dev_ops;\n+\tcameraDevice_.priv = this;\n+\n+\topen_ = true;\n+\n+\treturn 0;\n+}\n+\n+void CameraProxy::close()\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tThreadRpc rpcRequest;\n+\trpcRequest.tag = ThreadRpc::Close;\n+\n+\tthreadRpcCall(rpcRequest);\n+\n+\topen_ = false;\n+}\n+\n+void CameraProxy::setCallbacks(const camera3_callback_ops_t *callbacks)\n+{\n+\tLIBCAMERA_HAL_FUNC_DBG\n+\n+\tcameraModule_->setCallbacks(&cameraDevice_, callbacks);\n+}\n+\n+const camera_metadata_t *CameraProxy::constructDefaultRequest(int type)\n+{\n+\treturn cameraModule_->constructDefaultRequestMetadata(type);\n+}\n+\n+int CameraProxy::configureStreams(camera3_stream_configuration_t *stream_list)\n+{\n+\treturn cameraModule_->configureStreams(stream_list);\n+}\n+\n+int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)\n+{\n+\tThreadRpc rpcRequest;\n+\trpcRequest.tag = ThreadRpc::ProcessCaptureRequest;\n+\trpcRequest.request = request;\n+\n+\tthreadRpcCall(rpcRequest);\n+\n+\treturn 0;\n+}\n+\n+void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)\n+{\n+\tstd::unique_ptr<ThreadRpcMessage> message =\n+\t\t\t\tutils::make_unique<ThreadRpcMessage>();\n+\tmessage->rpc = &rpcRequest;\n+\n+\tcameraModule_->postMessage(std::move(message));\n+\trpcRequest.waitDelivery();\n+}\ndiff --git a/src/android/camera_proxy.h b/src/android/camera_proxy.h\nnew file mode 100644\nindex 000000000000..69e6878c4352\n--- /dev/null\n+++ b/src/android/camera_proxy.h\n@@ -0,0 +1,41 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * camera_proxy.h - Proxy to camera module instances\n+ */\n+#ifndef __ANDROID_CAMERA_PROXY_H__\n+#define __ANDROID_CAMERA_PROXY_H__\n+\n+#include <hardware/camera3.h>\n+#include <libcamera/libcamera.h>\n+\n+#include \"camera_module.h\"\n+\n+class CameraProxy\n+{\n+public:\n+\tCameraProxy(unsigned int id, CameraModule *cameraModule);\n+\n+\tint open(const hw_module_t *hardwareModule);\n+\tvoid close();\n+\n+\tvoid setCallbacks(const camera3_callback_ops_t *callbacks);\n+\tconst camera_metadata_t *constructDefaultRequest(int type);\n+\tint configureStreams(camera3_stream_configuration_t *stream_list);\n+\tint processCaptureRequest(camera3_capture_request_t *request);\n+\n+\tbool isOpen() const { return open_; }\n+\tunsigned int id() const { return id_; }\n+\tcamera3_device_t *device() { return &cameraDevice_; }\n+\n+private:\n+\tvoid threadRpcCall(ThreadRpc &rpcRequest);\n+\n+\tbool open_;\n+\tunsigned int id_;\n+\tCameraModule *cameraModule_;\n+\tcamera3_device_t cameraDevice_;\n+};\n+\n+#endif /* __ANDROID_CAMERA_PROXY_H__ */\ndiff --git a/src/android/meson.build b/src/android/meson.build\nindex e988dfa9ee63..eb0b6fce39da 100644\n--- a/src/android/meson.build\n+++ b/src/android/meson.build\n@@ -1,3 +1,11 @@\n+android_hal_sources = files([\n+ 'camera3_hal.cpp',\n+ 'camera_hal_manager.cpp',\n+ 'camera_module.cpp',\n+ 'camera_proxy.cpp',\n+ 'thread_rpc.cpp'\n+])\n+\n android_camera_metadata_sources = files([\n 'metadata/camera_metadata.c',\n ])\ndiff --git a/src/android/tags b/src/android/tags\nnew file mode 100644\nindex 000000000000..0ef3ad649604\n--- /dev/null\n+++ b/src/android/tags\n@@ -0,0 +1,424 @@\n+!_TAG_FILE_FORMAT\t2\t/extended format; --format=1 will not append ;\" to lines/\n+!_TAG_FILE_SORTED\t1\t/0=unsorted, 1=sorted, 2=foldcase/\n+!_TAG_OUTPUT_MODE\tu-ctags\t/u-ctags or e-ctags/\n+!_TAG_PROGRAM_AUTHOR\tUniversal Ctags Team\t//\n+!_TAG_PROGRAM_NAME\tUniversal Ctags\t/Derived from Exuberant Ctags/\n+!_TAG_PROGRAM_URL\thttps://ctags.io/\t/official site/\n+!_TAG_PROGRAM_VERSION\t0.0.0\t/3fdf28bc/\n+ALIGN_TO\tmetadata/camera_metadata.c\t/^#define ALIGN_TO(/;\"\td\tfile:\tsignature:(val,alignment)\n+ALOGE\tmetadata/camera_metadata.c\t/^#define ALOGE(/;\"\td\tfile:\tsignature:(...)\n+CAMERA_METADATA_ENUM_STRING_MAX_SIZE\tmetadata/camera_metadata_tag_info.c\t/^#define CAMERA_METADATA_ENUM_STRING_MAX_SIZE /;\"\td\tfile:\n+CURRENT_METADATA_VERSION\tmetadata/camera_metadata.c\t/^#define CURRENT_METADATA_VERSION /;\"\td\tfile:\n+CameraModule\tcamera_module.cpp\t/^CameraModule::CameraModule(unsigned int id, const hw_module_t *module,$/;\"\tf\tclass:CameraModule\tsignature:(unsigned int id,const hw_module_t * module,CameraManager * cameraManager)\n+CameraModule\tcamera_module.h\t/^\tCameraModule(unsigned int id, const hw_module_t *module,$/;\"\tp\tclass:CameraModule\taccess:public\tsignature:(unsigned int id,const hw_module_t * module,libcamera::CameraManager * cameraManager)\n+CameraModule\tcamera_module.h\t/^class CameraModule : public libcamera::Thread$/;\"\tc\tinherits:libcamera::Thread\n+CameraModule::CameraModule\tcamera_module.cpp\t/^CameraModule::CameraModule(unsigned int id, const hw_module_t *module,$/;\"\tf\tclass:CameraModule\tsignature:(unsigned int id,const hw_module_t * module,CameraManager * cameraManager)\n+CameraModule::CameraModule\tcamera_module.h\t/^\tCameraModule(unsigned int id, const hw_module_t *module,$/;\"\tp\tclass:CameraModule\taccess:public\tsignature:(unsigned int id,const hw_module_t * module,libcamera::CameraManager * cameraManager)\n+CameraModule::callbacks_\tcamera_module.h\t/^\tconst camera3_callback_ops_t *callbacks_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:const camera3_callback_ops_t *\taccess:private\n+CameraModule::cameraDevice\tcamera_module.h\t/^\tcamera3_device_t *cameraDevice() { return &cameraDevice_; }$/;\"\tf\tclass:CameraModule\ttyperef:typename:camera3_device_t *\taccess:public\tsignature:()\n+CameraModule::cameraDevice_\tcamera_module.h\t/^\tcamera3_device_t cameraDevice_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:camera3_device_t\taccess:private\n+CameraModule::cameraManager_\tcamera_module.h\t/^\tlibcamera::CameraManager *cameraManager_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:libcamera::CameraManager *\taccess:private\n+CameraModule::camera_\tcamera_module.h\t/^\tstd::shared_ptr<libcamera::Camera> camera_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:std::shared_ptr<libcamera::Camera>\taccess:private\n+CameraModule::close\tcamera_module.cpp\t/^void CameraModule::close()$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:()\n+CameraModule::close\tcamera_module.h\t/^\tvoid close();$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:()\n+CameraModule::config_\tcamera_module.h\t/^\tstd::unique_ptr<libcamera::CameraConfiguration> config_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:std::unique_ptr<libcamera::CameraConfiguration>\taccess:private\n+CameraModule::configureStreams\tcamera_module.cpp\t/^int CameraModule::configureStreams(camera3_stream_configuration_t *stream_list)$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:(camera3_stream_configuration_t * stream_list)\n+CameraModule::configureStreams\tcamera_module.h\t/^\tint configureStreams(camera3_stream_configuration_t *stream_list);$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:(camera3_stream_configuration_t * stream_list)\n+CameraModule::generateDefaultRequestMetadata\tcamera_module.cpp\t/^const camera_metadata_t *CameraModule::generateDefaultRequestMetadata(int type)$/;\"\tf\tclass:CameraModule\ttyperef:typename:const camera_metadata_t *\tsignature:(int type)\n+CameraModule::generateDefaultRequestMetadata\tcamera_module.h\t/^\tconst camera_metadata_t *generateDefaultRequestMetadata(int type);$/;\"\tp\tclass:CameraModule\ttyperef:typename:const camera_metadata_t *\taccess:public\tsignature:(int type)\n+CameraModule::id\tcamera_module.h\t/^\tunsigned int id() const { return id_; }$/;\"\tf\tclass:CameraModule\ttyperef:typename:unsigned int\taccess:public\tsignature:() const\n+CameraModule::id_\tcamera_module.h\t/^\tunsigned int id_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:unsigned int\taccess:private\n+CameraModule::init\tcamera_module.cpp\t/^int CameraModule::init()$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:()\n+CameraModule::init\tcamera_module.h\t/^\tint init();$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:()\n+CameraModule::module_\tcamera_module.h\t/^\tconst hw_module_t *module_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:const hw_module_t *\taccess:private\n+CameraModule::processCaptureRequest\tcamera_module.cpp\t/^int CameraModule::processCaptureRequest(camera3_capture_request_t *camera3Request)$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:(camera3_capture_request_t * camera3Request)\n+CameraModule::processCaptureRequest\tcamera_module.h\t/^\tint processCaptureRequest(camera3_capture_request_t *request);$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:(camera3_capture_request_t * request)\n+CameraModule::requestComplete\tcamera_module.cpp\t/^void CameraModule::requestComplete(Request *request,$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:(Request * request,const std::map<Stream *,Buffer * > & buffers)\n+CameraModule::requestComplete\tcamera_module.h\t/^\tvoid requestComplete(libcamera::Request *request,$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:(libcamera::Request * request,const std::map<libcamera::Stream *,libcamera::Buffer * > & buffers)\n+CameraModule::requestTemplate_\tcamera_module.h\t/^\tcamera_metadata_t *requestTemplate_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:camera_metadata_t *\taccess:private\n+CameraModule::run\tcamera_module.cpp\t/^void CameraModule::run()$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:()\n+CameraModule::run\tcamera_module.h\t/^\tvoid run();$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:()\n+CameraModule::setCallbacks\tcamera_module.h\t/^\tvoid setCallbacks(const camera3_callback_ops_t *callbacks)$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:(const camera3_callback_ops_t * callbacks)\n+DATA_ALIGNMENT\tmetadata/camera_metadata.c\t/^#define DATA_ALIGNMENT /;\"\td\tfile:\n+ENTRY_ALIGNMENT\tmetadata/camera_metadata.c\t/^#define ENTRY_ALIGNMENT /;\"\td\tfile:\n+ERROR\tmetadata/camera_metadata.c\t/^#define ERROR /;\"\td\tfile:\n+FLAG_SORTED\tmetadata/camera_metadata.c\t/^#define FLAG_SORTED /;\"\td\tfile:\n+HAL_MODULE_INFO_SYM\tcamera3_hal.cpp\t/^camera_module_t HAL_MODULE_INFO_SYM = {$/;\"\tv\ttyperef:typename:camera_module_t\n+LIBCAMERA_HAL_FUNC_DBG\tcamera_module.h\t/^#define LIBCAMERA_HAL_FUNC_DBG\t/;\"\td\n+LOG\tcamera3_hal.cpp\t/^\tLOG(HAL, Debug) << \"Open camera: \" << name;$/;\"\tl\tfunction:hal_dev_open\ttyperef:typename:LIBCAMERA_HAL_FUNC_DBG\tfile:\n+LOG_DECLARE_CATEGORY\tcamera_module.cpp\t/^LOG_DECLARE_CATEGORY(HAL);$/;\"\tp\tfile:\tsignature:(HAL)\n+LOG_DEFINE_CATEGORY\tcamera3_hal.cpp\t/^LOG_DEFINE_CATEGORY(HAL);$/;\"\tp\tfile:\tsignature:(HAL)\n+LOG_TAG\tmetadata/camera_metadata.c\t/^#define LOG_TAG /;\"\td\tfile:\n+MAX_ALIGNMENT\tmetadata/camera_metadata.c\t/^#define MAX_ALIGNMENT(/;\"\td\tfile:\tsignature:(A,B)\n+METADATA_ALIGNMENT\tmetadata/camera_metadata.c\t/^#define METADATA_ALIGNMENT /;\"\td\tfile:\n+METADATA_ASSERT\tcamera_module.h\t/^#define METADATA_ASSERT(/;\"\td\tsignature:(_r)\n+METADATA_PACKET_ALIGNMENT\tmetadata/camera_metadata.c\t/^#define METADATA_PACKET_ALIGNMENT /;\"\td\tfile:\n+NOT_FOUND\tmetadata/camera_metadata.c\t/^#define NOT_FOUND /;\"\td\tfile:\n+OK\tmetadata/camera_metadata.c\t/^#define OK /;\"\td\tfile:\n+REQUEST_TEMPLATE_DATA\tcamera_module.h\t/^#define REQUEST_TEMPLATE_DATA\t/;\"\td\n+REQUEST_TEMPLATE_ENTRIES\tcamera_module.h\t/^#define REQUEST_TEMPLATE_ENTRIES\t/;\"\td\n+SN_EVENT_LOG_ID\tmetadata/camera_metadata.c\t/^#define SN_EVENT_LOG_ID /;\"\td\tfile:\n+STATIC_DATA_CAP\tcamera3_hal.cpp\t/^#define STATIC_DATA_CAP /;\"\td\tfile:\n+STATIC_ENTRY_CAP\tcamera3_hal.cpp\t/^#define STATIC_ENTRY_CAP /;\"\td\tfile:\n+__ANDROID_LIBCAMERA_HAL_H__\tcamera_module.h\t/^#define __ANDROID_LIBCAMERA_HAL_H__$/;\"\td\n+__anon2a3e460f010a\tmetadata/camera_metadata.c\t/^ union {$/;\"\tu\tstruct:camera_metadata_buffer_entry\tfile:\taccess:public\n+__anon2a3e460f0208\tmetadata/camera_metadata.c\t/^ static const struct {$/;\"\ts\tfunction:validate_camera_metadata_structure\tfile:\n+add_camera_metadata_entry\tmetadata/camera_metadata.c\t/^int add_camera_metadata_entry(camera_metadata_t *dst,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * dst,uint32_t tag,const void * data,size_t data_count)\n+add_camera_metadata_entry_raw\tmetadata/camera_metadata.c\t/^static int add_camera_metadata_entry_raw(camera_metadata_t *dst,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(camera_metadata_t * dst,uint32_t tag,uint8_t type,const void * data,size_t data_count)\n+aeAvailableModes\tcamera3_hal.cpp\t/^\tchar aeAvailableModes[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:char[]\tfile:\n+aeExposureCompensation\tcamera_module.cpp\t/^\tint32_t aeExposureCompensation = 0;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:int32_t\tfile:\n+aeLock\tcamera_module.cpp\t/^\tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+aeMode\tcamera_module.cpp\t/^\tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+aePrecaptureTrigger\tcamera_module.cpp\t/^\tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+afTrigger\tcamera_module.cpp\t/^\tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+aligned_ptr\tmetadata/camera_metadata.c\t/^ uintptr_t aligned_ptr = ALIGN_TO((uintptr_t) metadata + alignmentOffset,$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:uintptr_t\tfile:\n+aligned_ptr\tmetadata/camera_metadata.c\t/^ uintptr_t aligned_ptr = ALIGN_TO(metadata, METADATA_PACKET_ALIGNMENT);$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:uintptr_t\tfile:\n+alignment\tmetadata/camera_metadata.c\t/^ size_t alignment;$/;\"\tm\tstruct:validate_camera_metadata_structure::__anon2a3e460f0208\ttyperef:typename:size_t\tfile:\taccess:public\n+alignmentOffset\tmetadata/camera_metadata.c\t/^ const uintptr_t alignmentOffset = aligned_ptr - (uintptr_t) metadata;$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:const uintptr_t\tfile:\n+alignments\tmetadata/camera_metadata.c\t/^ } alignments[] = {$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:const struct validate_camera_metadata_structure::__anon2a3e460f0208[]\tfile:\n+allocate_camera_metadata\tmetadata/camera_metadata.c\t/^camera_metadata_t *allocate_camera_metadata(size_t entry_capacity,$/;\"\tf\ttyperef:typename:camera_metadata_t *\tsignature:(size_t entry_capacity,size_t data_capacity)\n+allocate_copy_camera_metadata_checked\tmetadata/camera_metadata.c\t/^camera_metadata_t *allocate_copy_camera_metadata_checked($/;\"\tf\ttyperef:typename:camera_metadata_t *\tsignature:(const camera_metadata_t * src,size_t src_size)\n+android_black_level\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_black_level[ANDROID_BLACK_LEVEL_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_color_correction\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_color_correction[ANDROID_COLOR_CORRECTION_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_control\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_control[ANDROID_CONTROL_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_demosaic\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_demosaic[ANDROID_DEMOSAIC_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_depth\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_depth[ANDROID_DEPTH_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_distortion_correction\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_distortion_correction[ANDROID_DISTORTION_CORRECTION_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_edge\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_edge[ANDROID_EDGE_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_flash\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_flash[ANDROID_FLASH_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_flash_info\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_flash_info[ANDROID_FLASH_INFO_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_hot_pixel\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_hot_pixel[ANDROID_HOT_PIXEL_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_info\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_info[ANDROID_INFO_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_jpeg\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_jpeg[ANDROID_JPEG_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_led\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_led[ANDROID_LED_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_lens\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_lens[ANDROID_LENS_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_lens_info\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_lens_info[ANDROID_LENS_INFO_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_logical_multi_camera\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_logical_multi_camera[ANDROID_LOGICAL_MULTI_CAMERA_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_noise_reduction\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_noise_reduction[ANDROID_NOISE_REDUCTION_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_quirks\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_quirks[ANDROID_QUIRKS_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_reprocess\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_reprocess[ANDROID_REPROCESS_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_request\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_request[ANDROID_REQUEST_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_scaler\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_scaler[ANDROID_SCALER_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_sensor\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_sensor[ANDROID_SENSOR_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_sensor_info\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_sensor_info[ANDROID_SENSOR_INFO_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_shading\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_shading[ANDROID_SHADING_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_statistics\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_statistics[ANDROID_STATISTICS_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_statistics_info\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_statistics_info[ANDROID_STATISTICS_INFO_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_sync\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_sync[ANDROID_SYNC_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+android_tonemap\tmetadata/camera_metadata_tag_info.c\t/^static tag_info_t android_tonemap[ANDROID_TONEMAP_END -$/;\"\tv\ttyperef:typename:tag_info_t[]\tfile:\n+append_camera_metadata\tmetadata/camera_metadata.c\t/^int append_camera_metadata(camera_metadata_t *dst,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * dst,const camera_metadata_t * src)\n+availableAntiBandingModes\tcamera3_hal.cpp\t/^\tchar availableAntiBandingModes[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:char[]\tfile:\n+availableCapabilities\tcamera_module.cpp\t/^\tuint8_t availableCapabilities[] = {$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t[]\tfile:\n+availableCharacteristicsKeys\tcamera_module.cpp\t/^\tstd::vector<int32_t> availableCharacteristicsKeys = {$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:std::vector<int32_t>\tfile:\n+availableRequestKeys\tcamera_module.cpp\t/^\tstd::vector<int32_t> availableRequestKeys = {$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:std::vector<int32_t>\tfile:\n+availableResultKeys\tcamera_module.cpp\t/^\tstd::vector<int32_t> availableResultKeys = {$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:std::vector<int32_t>\tfile:\n+availableStallDurations\tcamera3_hal.cpp\t/^\tstd::vector<int64_t> availableStallDurations = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:std::vector<int64_t>\tfile:\n+availableStreamConfigurations\tcamera3_hal.cpp\t/^\tstd::vector<uint32_t> availableStreamConfigurations = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:std::vector<uint32_t>\tfile:\n+availableStreamFormats\tcamera3_hal.cpp\t/^\tstd::vector<uint32_t> availableStreamFormats = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:std::vector<uint32_t>\tfile:\n+awbLock\tcamera_module.cpp\t/^\tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+awbLockAvailable\tcamera3_hal.cpp\t/^\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:uint8_t\tfile:\n+awbLockAvailable\tcamera_module.cpp\t/^\tuint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+awbMode\tcamera_module.cpp\t/^\tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+buffer\tmetadata/camera_metadata.c\t/^ void *buffer = malloc(memory_needed);$/;\"\tl\tfunction:allocate_camera_metadata\ttyperef:typename:void *\tfile:\n+buffer\tmetadata/camera_metadata.c\t/^ void *buffer = malloc(src_size);$/;\"\tl\tfunction:allocate_copy_camera_metadata_checked\ttyperef:typename:void *\tfile:\n+buffer_entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *buffer_entry = get_entries(src) + index;$/;\"\tl\tfunction:get_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+calculate_camera_metadata_entry_data_size\tmetadata/camera_metadata.c\t/^size_t calculate_camera_metadata_entry_data_size(uint8_t type,$/;\"\tf\ttyperef:typename:size_t\tsignature:(uint8_t type,size_t data_count)\n+calculate_camera_metadata_size\tmetadata/camera_metadata.c\t/^size_t calculate_camera_metadata_size(size_t entry_count,$/;\"\tf\ttyperef:typename:size_t\tsignature:(size_t entry_count,size_t data_count)\n+callbacks_\tcamera_module.h\t/^\tconst camera3_callback_ops_t *callbacks_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:const camera3_callback_ops_t *\taccess:private\n+camera\tcamera3_hal.cpp\t/^\tstd::shared_ptr<libcamera::Camera> camera = cameraManager->cameras()[id];$/;\"\tl\tfunction:hal_get_camera_info\ttyperef:typename:std::shared_ptr<libcamera::Camera>\tfile:\n+camera3Stream\tcamera_module.cpp\t/^\tcamera3_stream_t *camera3Stream = stream_list->streams[0];$/;\"\tl\tfunction:CameraModule::configureStreams\ttyperef:typename:camera3_stream_t *\tfile:\n+cameraDevice\tcamera_module.h\t/^\tcamera3_device_t *cameraDevice() { return &cameraDevice_; }$/;\"\tf\tclass:CameraModule\ttyperef:typename:camera3_device_t *\taccess:public\tsignature:()\n+cameraDevice_\tcamera_module.h\t/^\tcamera3_device_t cameraDevice_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:camera3_device_t\taccess:private\n+cameraManager\tcamera3_hal.cpp\t/^static libcamera::CameraManager *cameraManager;$/;\"\tv\ttyperef:typename:libcamera::CameraManager *\tfile:\n+cameraManager_\tcamera_module.h\t/^\tlibcamera::CameraManager *cameraManager_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:libcamera::CameraManager *\taccess:private\n+cameraMap\tcamera3_hal.cpp\t/^static std::map<unsigned int, CameraModule *> cameraMap;$/;\"\tv\ttyperef:typename:std::map<unsigned int,CameraModule * >\tfile:\n+cameraModule\tcamera3_hal.cpp\t/^\tCameraModule *cameraModule = new CameraHal(id, module, cameraManager);$/;\"\tl\tfunction:hal_dev_open\ttyperef:typename:CameraModule *\tfile:\n+cameraModule\tcamera3_hal.cpp\t/^\tCameraModule *cameraModule = reinterpret_cast<CameraModule *>(dev->priv);$/;\"\tl\tfunction:hal_dev_close\ttyperef:typename:CameraModule *\tfile:\n+camera_\tcamera_module.h\t/^\tstd::shared_ptr<libcamera::Camera> camera_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:std::shared_ptr<libcamera::Camera>\taccess:private\n+camera_metadata\tmetadata/camera_metadata.c\t/^struct camera_metadata {$/;\"\ts\tfile:\n+camera_metadata::data_capacity\tmetadata/camera_metadata.c\t/^ metadata_size_t data_capacity;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+camera_metadata::data_count\tmetadata/camera_metadata.c\t/^ metadata_size_t data_count;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+camera_metadata::data_start\tmetadata/camera_metadata.c\t/^ metadata_uptrdiff_t data_start; \\/\\/ Offset from camera_metadata$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_uptrdiff_t\tfile:\taccess:public\n+camera_metadata::entries_start\tmetadata/camera_metadata.c\t/^ metadata_uptrdiff_t entries_start; \\/\\/ Offset from camera_metadata$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_uptrdiff_t\tfile:\taccess:public\n+camera_metadata::entry_capacity\tmetadata/camera_metadata.c\t/^ metadata_size_t entry_capacity;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+camera_metadata::entry_count\tmetadata/camera_metadata.c\t/^ metadata_size_t entry_count;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+camera_metadata::flags\tmetadata/camera_metadata.c\t/^ uint32_t flags;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata::padding\tmetadata/camera_metadata.c\t/^ uint32_t padding; \\/\\/ padding to 8 bytes boundary$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata::size\tmetadata/camera_metadata.c\t/^ metadata_size_t size;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+camera_metadata::vendor_id\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t vendor_id;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_vendor_id_t\tfile:\taccess:public\n+camera_metadata::version\tmetadata/camera_metadata.c\t/^ uint32_t version;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata_buffer_entry\tmetadata/camera_metadata.c\t/^typedef struct camera_metadata_buffer_entry {$/;\"\ts\tfile:\n+camera_metadata_buffer_entry::__anon2a3e460f010a\tmetadata/camera_metadata.c\t/^ union {$/;\"\tu\tstruct:camera_metadata_buffer_entry\tfile:\taccess:public\n+camera_metadata_buffer_entry::__anon2a3e460f010a::offset\tmetadata/camera_metadata.c\t/^ uint32_t offset;$/;\"\tm\tunion:camera_metadata_buffer_entry::__anon2a3e460f010a\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata_buffer_entry::__anon2a3e460f010a::value\tmetadata/camera_metadata.c\t/^ uint8_t value[4];$/;\"\tm\tunion:camera_metadata_buffer_entry::__anon2a3e460f010a\ttyperef:typename:uint8_t[4]\tfile:\taccess:public\n+camera_metadata_buffer_entry::count\tmetadata/camera_metadata.c\t/^ uint32_t count;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata_buffer_entry::data\tmetadata/camera_metadata.c\t/^ } data;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:union:camera_metadata_buffer_entry::__anon2a3e460f010a\tfile:\taccess:public\n+camera_metadata_buffer_entry::reserved\tmetadata/camera_metadata.c\t/^ uint8_t reserved[3];$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint8_t[3]\tfile:\taccess:public\n+camera_metadata_buffer_entry::tag\tmetadata/camera_metadata.c\t/^ uint32_t tag;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint32_t\tfile:\taccess:public\n+camera_metadata_buffer_entry::type\tmetadata/camera_metadata.c\t/^ uint8_t type;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint8_t\tfile:\taccess:public\n+camera_metadata_buffer_entry_t\tmetadata/camera_metadata.c\t/^} camera_metadata_buffer_entry_t;$/;\"\tt\ttyperef:struct:camera_metadata_buffer_entry\tfile:\n+camera_metadata_data\tmetadata/camera_metadata.c\t/^typedef union camera_metadata_data {$/;\"\tu\tfile:\n+camera_metadata_data::d\tmetadata/camera_metadata.c\t/^ double d;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:double\tfile:\taccess:public\n+camera_metadata_data::f\tmetadata/camera_metadata.c\t/^ float f;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:float\tfile:\taccess:public\n+camera_metadata_data::i32\tmetadata/camera_metadata.c\t/^ int32_t i32;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:int32_t\tfile:\taccess:public\n+camera_metadata_data::i64\tmetadata/camera_metadata.c\t/^ int64_t i64;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:int64_t\tfile:\taccess:public\n+camera_metadata_data::r\tmetadata/camera_metadata.c\t/^ camera_metadata_rational_t r;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:camera_metadata_rational_t\tfile:\taccess:public\n+camera_metadata_data::u8\tmetadata/camera_metadata.c\t/^ uint8_t u8;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:uint8_t\tfile:\taccess:public\n+camera_metadata_data_t\tmetadata/camera_metadata.c\t/^} camera_metadata_data_t;$/;\"\tt\ttyperef:union:camera_metadata_data\tfile:\n+camera_metadata_enum_snprint\tmetadata/camera_metadata_tag_info.c\t/^int camera_metadata_enum_snprint(uint32_t tag,$/;\"\tf\ttyperef:typename:int\tsignature:(uint32_t tag,uint32_t value,char * dst,size_t size)\n+camera_metadata_section_bounds\tmetadata/camera_metadata_tag_info.c\t/^unsigned int camera_metadata_section_bounds[ANDROID_SECTION_COUNT][2] = {$/;\"\tv\ttyperef:typename:unsigned int[][2]\n+camera_metadata_section_names\tmetadata/camera_metadata_tag_info.c\t/^const char *camera_metadata_section_names[ANDROID_SECTION_COUNT] = {$/;\"\tv\ttyperef:typename:const char * []\n+camera_metadata_type_names\tmetadata/camera_metadata.c\t/^const char *camera_metadata_type_names[NUM_TYPES] = {$/;\"\tv\ttyperef:typename:const char * []\n+camera_metadata_type_size\tmetadata/camera_metadata.c\t/^const size_t camera_metadata_type_size[NUM_TYPES] = {$/;\"\tv\ttyperef:typename:const size_t[]\n+captureIntent\tcamera_module.cpp\t/^\tuint8_t captureIntent;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+clone\tmetadata/camera_metadata.c\t/^ camera_metadata_t *clone = allocate_camera_metadata($/;\"\tl\tfunction:clone_camera_metadata\ttyperef:typename:camera_metadata_t *\tfile:\n+clone_camera_metadata\tmetadata/camera_metadata.c\t/^camera_metadata_t *clone_camera_metadata(const camera_metadata_t *src) {$/;\"\tf\ttyperef:typename:camera_metadata_t *\tsignature:(const camera_metadata_t * src)\n+close\tcamera_module.cpp\t/^void CameraModule::close()$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:()\n+close\tcamera_module.h\t/^\tvoid close();$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:()\n+compare_entry_tags\tmetadata/camera_metadata.c\t/^static int compare_entry_tags(const void *p1, const void *p2) {$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const void * p1,const void * p2)\n+config_\tcamera_module.h\t/^\tstd::unique_ptr<libcamera::CameraConfiguration> config_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:std::unique_ptr<libcamera::CameraConfiguration>\taccess:private\n+configureStreams\tcamera_module.cpp\t/^int CameraModule::configureStreams(camera3_stream_configuration_t *stream_list)$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:(camera3_stream_configuration_t * stream_list)\n+configureStreams\tcamera_module.h\t/^\tint configureStreams(camera3_stream_configuration_t *stream_list);$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:(camera3_stream_configuration_t * stream_list)\n+controlMetadata\tcamera3_hal.cpp\t/^\tchar controlMetadata = ANDROID_CONTROL_MODE_AUTO;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:char\tfile:\n+copy_camera_metadata\tmetadata/camera_metadata.c\t/^camera_metadata_t* copy_camera_metadata(void *dst, size_t dst_size,$/;\"\tf\ttyperef:typename:camera_metadata_t *\tsignature:(void * dst,size_t dst_size,const camera_metadata_t * src)\n+count\tmetadata/camera_metadata.c\t/^ int count = entry->count;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:int\tfile:\n+count\tmetadata/camera_metadata.c\t/^ uint32_t count;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint32_t\tfile:\taccess:public\n+d\tmetadata/camera_metadata.c\t/^ double d;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:double\tfile:\taccess:public\n+data\tmetadata/camera_metadata.c\t/^ camera_metadata_data_t *data =$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:camera_metadata_data_t *\tfile:\n+data\tmetadata/camera_metadata.c\t/^ } data;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:union:camera_metadata_buffer_entry::__anon2a3e460f010a\tfile:\taccess:public\n+data_bytes\tmetadata/camera_metadata.c\t/^ size_t data_bytes = calculate_camera_metadata_entry_data_size(entry->type,$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+data_bytes\tmetadata/camera_metadata.c\t/^ size_t data_bytes = data_count * camera_metadata_type_size[type];$/;\"\tl\tfunction:validate_and_calculate_camera_metadata_entry_data_size\ttyperef:typename:size_t\tfile:\n+data_bytes\tmetadata/camera_metadata.c\t/^ size_t data_bytes = data_count *$/;\"\tl\tfunction:calculate_camera_metadata_entry_data_size\ttyperef:typename:size_t\tfile:\n+data_bytes\tmetadata/camera_metadata.c\t/^ size_t data_bytes =$/;\"\tl\tfunction:add_camera_metadata_entry_raw\ttyperef:typename:size_t\tfile:\n+data_bytes\tmetadata/camera_metadata.c\t/^ size_t data_bytes =$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+data_capacity\tmetadata/camera_metadata.c\t/^ metadata_size_t data_capacity;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+data_count\tmetadata/camera_metadata.c\t/^ metadata_size_t data_count;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+data_end\tmetadata/camera_metadata.c\t/^ const metadata_uptrdiff_t data_end =$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:const metadata_uptrdiff_t\tfile:\n+data_entry_end\tmetadata/camera_metadata.c\t/^ size_t data_entry_end = entry.data.offset + data_size;$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:size_t\tfile:\n+data_payload_bytes\tmetadata/camera_metadata.c\t/^ size_t data_payload_bytes =$/;\"\tl\tfunction:add_camera_metadata_entry_raw\ttyperef:typename:size_t\tfile:\n+data_payload_bytes\tmetadata/camera_metadata.c\t/^ size_t data_payload_bytes =$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+data_ptr\tmetadata/camera_metadata.c\t/^ uint8_t *data_ptr;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:uint8_t *\tfile:\n+data_size\tmetadata/camera_metadata.c\t/^ size_t data_size;$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:size_t\tfile:\n+data_start\tmetadata/camera_metadata.c\t/^ metadata_uptrdiff_t data_start; \\/\\/ Offset from camera_metadata$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_uptrdiff_t\tfile:\taccess:public\n+data_unaligned\tmetadata/camera_metadata.c\t/^ size_t data_unaligned = (uint8_t*)(get_entries(metadata) +$/;\"\tl\tfunction:place_camera_metadata\ttyperef:typename:size_t\tfile:\n+delete_camera_metadata_entry\tmetadata/camera_metadata.c\t/^int delete_camera_metadata_entry(camera_metadata_t *dst,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * dst,size_t index)\n+denominator\tmetadata/camera_metadata.c\t/^ int32_t denominator = *(int32_t*)(data_ptr + index + 4);$/;\"\tl\tfunction:print_data\ttyperef:typename:int32_t\tfile:\n+dev\tcamera3_hal.cpp\t/^\tcamera3_device_t *dev = reinterpret_cast<camera3_device_t *>(hw_device);$/;\"\tl\tfunction:hal_dev_close\ttyperef:typename:camera3_device_t *\tfile:\n+dispatcher\tcamera_module.cpp\t/^\tEventDispatcher *dispatcher = cameraManager_->eventDispatcher();$/;\"\tl\tfunction:CameraModule::run\ttyperef:typename:EventDispatcher *\tfile:\n+dump_camera_metadata\tmetadata/camera_metadata.c\t/^void dump_camera_metadata(const camera_metadata_t *metadata,$/;\"\tf\ttyperef:typename:void\tsignature:(const camera_metadata_t * metadata,int fd,int verbosity)\n+dump_indented_camera_metadata\tmetadata/camera_metadata.c\t/^void dump_indented_camera_metadata(const camera_metadata_t *metadata,$/;\"\tf\ttyperef:typename:void\tsignature:(const camera_metadata_t * metadata,int fd,int verbosity,int indentation)\n+e\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *e = get_entries(dst);$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+e\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *e = get_entries(dst);$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+end\tmetadata/camera_metadata.c\t/^ uint8_t *end = start + entry_bytes;$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:uint8_t *\tfile:\n+end\tmetadata/camera_metadata.c\t/^ uint8_t *end = start + data_bytes;$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:uint8_t *\tfile:\n+entries\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entries = get_entries(metadata);$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entries_end\tmetadata/camera_metadata.c\t/^ const metadata_uptrdiff_t entries_end =$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:const metadata_uptrdiff_t\tfile:\n+entries_start\tmetadata/camera_metadata.c\t/^ metadata_uptrdiff_t entries_start; \\/\\/ Offset from camera_metadata$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_uptrdiff_t\tfile:\taccess:public\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;$/;\"\tl\tfunction:append_camera_metadata\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t entry = entries[i];$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:camera_metadata_buffer_entry_t\tfile:\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entry = get_entries(dst) + dst->entry_count;$/;\"\tl\tfunction:add_camera_metadata_entry_raw\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entry = get_entries(dst) + index;$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *entry = get_entries(metadata);$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+entry_bytes\tmetadata/camera_metadata.c\t/^ size_t entry_bytes =$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+entry_capacity\tmetadata/camera_metadata.c\t/^ metadata_size_t entry_capacity;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+entry_count\tmetadata/camera_metadata.c\t/^ const metadata_size_t entry_count = metadata->entry_count;$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:const metadata_size_t\tfile:\n+entry_count\tmetadata/camera_metadata.c\t/^ metadata_size_t entry_count;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+exposureTimeRange\tcamera3_hal.cpp\t/^\tint64_t exposureTimeRange[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int64_t[]\tfile:\n+f\tmetadata/camera_metadata.c\t/^ float f;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:float\tfile:\taccess:public\n+faceDetectMode\tcamera_module.cpp\t/^\tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+filterArr\tcamera3_hal.cpp\t/^\tuint16_t filterArr = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:uint16_t\tfile:\n+find_camera_metadata_entry\tmetadata/camera_metadata.c\t/^int find_camera_metadata_entry(camera_metadata_t *src,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * src,uint32_t tag,camera_metadata_entry_t * entry)\n+find_camera_metadata_ro_entry\tmetadata/camera_metadata.c\t/^int find_camera_metadata_ro_entry(const camera_metadata_t *src,$/;\"\tf\ttyperef:typename:int\tsignature:(const camera_metadata_t * src,uint32_t tag,camera_metadata_ro_entry_t * entry)\n+flags\tmetadata/camera_metadata.c\t/^ uint32_t flags;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\n+flashAvailable\tcamera3_hal.cpp\t/^\tchar flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:char\tfile:\n+flashMode\tcamera_module.cpp\t/^\tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+fn\tcamera3_hal.cpp\t/^\tfloat fn = 2.53 \\/ 100;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:float\tfile:\n+free_camera_metadata\tmetadata/camera_metadata.c\t/^void free_camera_metadata(camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:void\tsignature:(camera_metadata_t * metadata)\n+generateDefaultRequestMetadata\tcamera_module.cpp\t/^const camera_metadata_t *CameraModule::generateDefaultRequestMetadata(int type)$/;\"\tf\tclass:CameraModule\ttyperef:typename:const camera_metadata_t *\tsignature:(int type)\n+generateDefaultRequestMetadata\tcamera_module.h\t/^\tconst camera_metadata_t *generateDefaultRequestMetadata(int type);$/;\"\tp\tclass:CameraModule\ttyperef:typename:const camera_metadata_t *\taccess:public\tsignature:(int type)\n+getStaticMetadata\tcamera3_hal.cpp\t/^static camera_metadata_t *getStaticMetadata(unsigned int id)$/;\"\tf\ttyperef:typename:camera_metadata_t *\tfile:\tsignature:(unsigned int id)\n+get_camera_metadata_alignment\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_alignment() {$/;\"\tf\ttyperef:typename:size_t\tsignature:()\n+get_camera_metadata_compact_size\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_compact_size(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_data_capacity\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_data_capacity(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_data_count\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_data_count(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_entry\tmetadata/camera_metadata.c\t/^int get_camera_metadata_entry(camera_metadata_t *src,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * src,size_t index,camera_metadata_entry_t * entry)\n+get_camera_metadata_entry_capacity\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_entry_capacity(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_entry_count\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_entry_count(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_ro_entry\tmetadata/camera_metadata.c\t/^int get_camera_metadata_ro_entry(const camera_metadata_t *src,$/;\"\tf\ttyperef:typename:int\tsignature:(const camera_metadata_t * src,size_t index,camera_metadata_ro_entry_t * entry)\n+get_camera_metadata_section_name\tmetadata/camera_metadata.c\t/^const char *get_camera_metadata_section_name(uint32_t tag) {$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag)\n+get_camera_metadata_size\tmetadata/camera_metadata.c\t/^size_t get_camera_metadata_size(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:size_t\tsignature:(const camera_metadata_t * metadata)\n+get_camera_metadata_tag_name\tmetadata/camera_metadata.c\t/^const char *get_camera_metadata_tag_name(uint32_t tag) {$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag)\n+get_camera_metadata_tag_type\tmetadata/camera_metadata.c\t/^int get_camera_metadata_tag_type(uint32_t tag) {$/;\"\tf\ttyperef:typename:int\tsignature:(uint32_t tag)\n+get_camera_metadata_vendor_id\tmetadata/camera_metadata.c\t/^metadata_vendor_id_t get_camera_metadata_vendor_id($/;\"\tf\ttyperef:typename:metadata_vendor_id_t\tsignature:(const camera_metadata_t * meta)\n+get_data\tmetadata/camera_metadata.c\t/^static uint8_t *get_data(const camera_metadata_t *metadata) {$/;\"\tf\ttyperef:typename:uint8_t *\tfile:\tsignature:(const camera_metadata_t * metadata)\n+get_entries\tmetadata/camera_metadata.c\t/^static camera_metadata_buffer_entry_t *get_entries($/;\"\tf\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\tsignature:(const camera_metadata_t * metadata)\n+get_local_camera_metadata_section_name\tmetadata/camera_metadata.c\t/^const char *get_local_camera_metadata_section_name(uint32_t tag,$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag,const camera_metadata_t * meta)\n+get_local_camera_metadata_section_name_vendor_id\tmetadata/camera_metadata.c\t/^const char *get_local_camera_metadata_section_name_vendor_id(uint32_t tag,$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag,metadata_vendor_id_t id)\n+get_local_camera_metadata_tag_name\tmetadata/camera_metadata.c\t/^const char *get_local_camera_metadata_tag_name(uint32_t tag,$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag,const camera_metadata_t * meta)\n+get_local_camera_metadata_tag_name_vendor_id\tmetadata/camera_metadata.c\t/^const char *get_local_camera_metadata_tag_name_vendor_id(uint32_t tag,$/;\"\tf\ttyperef:typename:const char *\tsignature:(uint32_t tag,metadata_vendor_id_t id)\n+get_local_camera_metadata_tag_type\tmetadata/camera_metadata.c\t/^int get_local_camera_metadata_tag_type(uint32_t tag,$/;\"\tf\ttyperef:typename:int\tsignature:(uint32_t tag,const camera_metadata_t * meta)\n+get_local_camera_metadata_tag_type_vendor_id\tmetadata/camera_metadata.c\t/^int get_local_camera_metadata_tag_type_vendor_id(uint32_t tag,$/;\"\tf\ttyperef:typename:int\tsignature:(uint32_t tag,metadata_vendor_id_t id)\n+hal_dev_close\tcamera3_hal.cpp\t/^static int hal_dev_close(hw_device_t *hw_device)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(hw_device_t * hw_device)\n+hal_dev_configure_streams\tcamera_module.cpp\t/^static int hal_dev_configure_streams(const struct camera3_device *dev,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const struct camera3_device * dev,camera3_stream_configuration_t * stream_list)\n+hal_dev_construct_default_request_settings\tcamera_module.cpp\t/^hal_dev_construct_default_request_settings(const struct camera3_device *dev,$/;\"\tf\ttyperef:typename:const camera_metadata_t *\tfile:\tsignature:(const struct camera3_device * dev,int type)\n+hal_dev_dump\tcamera_module.cpp\t/^static void hal_dev_dump(const struct camera3_device *dev, int fd)$/;\"\tf\ttyperef:typename:void\tfile:\tsignature:(const struct camera3_device * dev,int fd)\n+hal_dev_flush\tcamera_module.cpp\t/^static int hal_dev_flush(const struct camera3_device *dev)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const struct camera3_device * dev)\n+hal_dev_initialize\tcamera_module.cpp\t/^static int hal_dev_initialize(const struct camera3_device *dev,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const struct camera3_device * dev,const camera3_callback_ops_t * callback_ops)\n+hal_dev_open\tcamera3_hal.cpp\t/^static int hal_dev_open(const hw_module_t* module, const char* name,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const hw_module_t * module,const char * name,hw_device_t ** device)\n+hal_dev_ops\tcamera_module.cpp\t/^static camera3_device_ops hal_dev_ops = {$/;\"\tv\ttyperef:typename:camera3_device_ops\tfile:\n+hal_dev_process_capture_request\tcamera_module.cpp\t/^static int hal_dev_process_capture_request(const struct camera3_device *dev,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const struct camera3_device * dev,camera3_capture_request_t * request)\n+hal_get_camera_info\tcamera3_hal.cpp\t/^static int hal_get_camera_info(int id, struct camera_info *info)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(int id,struct camera_info * info)\n+hal_get_number_of_cameras\tcamera3_hal.cpp\t/^static int hal_get_number_of_cameras(void)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(void)\n+hal_init\tcamera3_hal.cpp\t/^static int hal_init()$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:()\n+hal_module_methods\tcamera3_hal.cpp\t/^static struct hw_module_methods_t hal_module_methods = {$/;\"\tv\ttyperef:struct:hw_module_methods_t\tfile:\n+hal_open_legacy\tcamera3_hal.cpp\t/^static int hal_open_legacy(const struct hw_module_t* module, const char* id,$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const struct hw_module_t * module,const char * id,uint32_t halVersion,struct hw_device_t ** device)\n+hal_set_callbacks\tcamera3_hal.cpp\t/^static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const camera_module_callbacks_t * callbacks)\n+hal_set_torch_mode\tcamera3_hal.cpp\t/^static int hal_set_torch_mode(const char* camera_id, bool enabled)$/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(const char * camera_id,bool enabled)\n+i\tcamera_module.cpp\t/^\tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {$/;\"\tl\tfunction:hal_dev_configure_streams\ttyperef:typename:unsigned int\tfile:\n+i\tmetadata/camera_metadata.c\t/^ size_t i;$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+i\tmetadata/camera_metadata.c\t/^ for (size_t i = 0; i < sizeof(alignments)\\/sizeof(alignments[0]); ++i) {$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:size_t\tfile:\n+i\tmetadata/camera_metadata.c\t/^ for (size_t i = 0; i < src->entry_count; i++, entry++) {$/;\"\tl\tfunction:append_camera_metadata\ttyperef:typename:size_t\tfile:\n+i\tmetadata/camera_metadata.c\t/^ size_t i;$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+i\tmetadata/camera_metadata.c\t/^ for (size_t i = 0; i < entry_count; ++i) {$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:size_t\tfile:\n+i\tmetadata/camera_metadata.c\t/^ unsigned int i;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:unsigned int\tfile:\n+i32\tmetadata/camera_metadata.c\t/^ int32_t i32;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:int32_t\tfile:\taccess:public\n+i64\tmetadata/camera_metadata.c\t/^ int64_t i64;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:int64_t\tfile:\taccess:public\n+id\tcamera3_hal.cpp\t/^\tint id = atoi(name);$/;\"\tl\tfunction:hal_dev_open\ttyperef:typename:int\tfile:\n+id\tcamera3_hal.cpp\t/^\tunsigned int id = cameraModule->id();$/;\"\tl\tfunction:hal_dev_close\ttyperef:typename:unsigned int\tfile:\n+id\tcamera_module.h\t/^\tunsigned int id() const { return id_; }$/;\"\tf\tclass:CameraModule\ttyperef:typename:unsigned int\taccess:public\tsignature:() const\n+id\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t id = (NULL == meta) ? CAMERA_METADATA_INVALID_VENDOR_ID :$/;\"\tl\tfunction:get_local_camera_metadata_section_name\ttyperef:typename:metadata_vendor_id_t\tfile:\n+id\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t id = (NULL == meta) ? CAMERA_METADATA_INVALID_VENDOR_ID :$/;\"\tl\tfunction:get_local_camera_metadata_tag_name\ttyperef:typename:metadata_vendor_id_t\tfile:\n+id\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t id = (NULL == meta) ? CAMERA_METADATA_INVALID_VENDOR_ID :$/;\"\tl\tfunction:get_local_camera_metadata_tag_type\ttyperef:typename:metadata_vendor_id_t\tfile:\n+id_\tcamera_module.h\t/^\tunsigned int id_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:unsigned int\taccess:private\n+index\tmetadata/camera_metadata.c\t/^ int index = 0;$/;\"\tl\tfunction:print_data\ttyperef:typename:int\tfile:\n+index\tmetadata/camera_metadata.c\t/^ uint32_t index;$/;\"\tl\tfunction:find_camera_metadata_entry\ttyperef:typename:uint32_t\tfile:\n+init\tcamera_module.cpp\t/^int CameraModule::init()$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:()\n+init\tcamera_module.h\t/^\tint init();$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:()\n+inputStreams\tcamera_module.cpp\t/^\tint32_t inputStreams = 0;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:int32_t\tfile:\n+it\tcamera_module.cpp\t/^\tfor (const auto &it : buffers)$/;\"\tl\tfunction:CameraModule::requestComplete\ttyperef:typename:const auto &\tfile:\n+j\tmetadata/camera_metadata.c\t/^ int j, k;$/;\"\tl\tfunction:print_data\ttyperef:typename:int\tfile:\n+k\tmetadata/camera_metadata.c\t/^ int j, k;$/;\"\tl\tfunction:print_data\ttyperef:typename:int\tfile:\n+key\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t key;$/;\"\tl\tfunction:find_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t\tfile:\n+length\tmetadata/camera_metadata.c\t/^ size_t length = dst->data_count - entry->data.offset - entry_bytes;$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+length\tmetadata/camera_metadata.c\t/^ size_t length = dst->data_count - entry->data.offset - data_bytes;$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:size_t\tfile:\n+libcameraHal\tcamera_module.cpp\t/^\tCameraModule *libcameraHal = reinterpret_cast<CameraModule *>(dev->priv);$/;\"\tl\tfunction:hal_dev_configure_streams\ttyperef:typename:CameraModule *\tfile:\n+libcameraHal\tcamera_module.cpp\t/^\tCameraModule *libcameraHal = reinterpret_cast<CameraModule *>(dev->priv);$/;\"\tl\tfunction:hal_dev_construct_default_request_settings\ttyperef:typename:CameraModule *\tfile:\n+libcameraHal\tcamera_module.cpp\t/^\tCameraModule *libcameraHal = reinterpret_cast<CameraModule *>(dev->priv);$/;\"\tl\tfunction:hal_dev_initialize\ttyperef:typename:CameraModule *\tfile:\n+libcameraHal\tcamera_module.cpp\t/^\tCameraModule *libcameraHal = reinterpret_cast<CameraModule *>(dev->priv);$/;\"\tl\tfunction:hal_dev_process_capture_request\ttyperef:typename:CameraModule *\tfile:\n+lines\tmetadata/camera_metadata.c\t/^ int lines = count \\/ values_per_line[type];$/;\"\tl\tfunction:print_data\ttyperef:typename:int\tfile:\n+maxOutStream\tcamera_module.cpp\t/^\tint32_t maxOutStream[] = { 0, 2, 0};$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:int32_t[]\tfile:\n+maxPipelineDepth\tcamera_module.cpp\t/^\tuint8_t maxPipelineDepth = 5;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:uint8_t\tfile:\n+memory_needed\tmetadata/camera_metadata.c\t/^ size_t memory_needed = calculate_camera_metadata_size(entry_capacity,$/;\"\tl\tfunction:allocate_camera_metadata\ttyperef:typename:size_t\tfile:\n+memory_needed\tmetadata/camera_metadata.c\t/^ size_t memory_needed = calculate_camera_metadata_size(entry_capacity,$/;\"\tl\tfunction:place_camera_metadata\ttyperef:typename:size_t\tfile:\n+memory_needed\tmetadata/camera_metadata.c\t/^ size_t memory_needed = get_camera_metadata_compact_size(src);$/;\"\tl\tfunction:copy_camera_metadata\ttyperef:typename:size_t\tfile:\n+memory_needed\tmetadata/camera_metadata.c\t/^ size_t memory_needed = sizeof(camera_metadata_t);$/;\"\tl\tfunction:calculate_camera_metadata_size\ttyperef:typename:size_t\tfile:\n+metadata\tmetadata/camera_metadata.c\t/^ camera_metadata_t *metadata = (camera_metadata_t*) buffer;$/;\"\tl\tfunction:allocate_copy_camera_metadata_checked\ttyperef:typename:camera_metadata_t *\tfile:\n+metadata\tmetadata/camera_metadata.c\t/^ camera_metadata_t *metadata = (camera_metadata_t*)dst;$/;\"\tl\tfunction:place_camera_metadata\ttyperef:typename:camera_metadata_t *\tfile:\n+metadata\tmetadata/camera_metadata.c\t/^ camera_metadata_t *metadata = place_camera_metadata($/;\"\tl\tfunction:allocate_camera_metadata\ttyperef:typename:camera_metadata_t *\tfile:\n+metadata\tmetadata/camera_metadata.c\t/^ camera_metadata_t *metadata =$/;\"\tl\tfunction:copy_camera_metadata\ttyperef:typename:camera_metadata_t *\tfile:\n+metadataMap\tcamera3_hal.cpp\t/^static std::map<unsigned int, camera_metadata_t *> metadataMap;$/;\"\tv\ttyperef:typename:std::map<unsigned int,camera_metadata_t * >\tfile:\n+metadata_size_t\tmetadata/camera_metadata.c\t/^typedef uint32_t metadata_size_t;$/;\"\tt\ttyperef:typename:uint32_t\tfile:\n+metadata_uptrdiff_t\tmetadata/camera_metadata.c\t/^typedef uint32_t metadata_uptrdiff_t;$/;\"\tt\ttyperef:typename:uint32_t\tfile:\n+minFrameDurations\tcamera3_hal.cpp\t/^\tstd::vector<int64_t> minFrameDurations = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:std::vector<int64_t>\tfile:\n+module_\tcamera_module.h\t/^\tconst hw_module_t *module_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:const hw_module_t *\taccess:private\n+msg\tmetadata/camera_metadata_tag_info.c\t/^ const char *msg = \"error: not an enum\";$/;\"\tl\tfunction:camera_metadata_enum_snprint\ttyperef:typename:const char *\tfile:\n+name\tmetadata/camera_metadata.c\t/^ const char *name;$/;\"\tm\tstruct:validate_camera_metadata_structure::__anon2a3e460f0208\ttyperef:typename:const char *\tfile:\taccess:public\n+numCameras\tcamera3_hal.cpp\t/^\tint numCameras = cameraManager->cameras().size();$/;\"\tl\tfunction:hal_get_camera_info\ttyperef:typename:LIBCAMERA_HAL_FUNC_DBG int\tfile:\n+numerator\tmetadata/camera_metadata.c\t/^ int32_t numerator = *(int32_t*)(data_ptr + index);$/;\"\tl\tfunction:print_data\ttyperef:typename:int32_t\tfile:\n+offset\tmetadata/camera_metadata.c\t/^ uint32_t offset;$/;\"\tm\tunion:camera_metadata_buffer_entry::__anon2a3e460f010a\ttyperef:typename:uint32_t\tfile:\taccess:public\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_buffer_entry_t, count) == 4,$/;\"\tp\ttyperef:typename:_Static_assert (==4,\"Offset of count must be 4\")\tfile:\tsignature:(camera_metadata_buffer_entry_t,count)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_buffer_entry_t, data) == 8,$/;\"\tp\ttyperef:typename:_Static_assert (==8,\"Offset of data must be 8\")\tfile:\tsignature:(camera_metadata_buffer_entry_t,data)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_buffer_entry_t, tag) == 0,$/;\"\tp\ttyperef:typename:_Static_assert (==0,\"Offset of tag must be 0\")\tfile:\tsignature:(camera_metadata_buffer_entry_t,tag)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_buffer_entry_t, type) == 12,$/;\"\tp\ttyperef:typename:_Static_assert (==12,\"Offset of type must be 12\")\tfile:\tsignature:(camera_metadata_buffer_entry_t,type)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, data_capacity) == 28,$/;\"\tp\ttyperef:typename:_Static_assert (==28,\"Offset of data_capacity must be 28\")\tfile:\tsignature:(camera_metadata_t,data_capacity)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, data_count) == 24,$/;\"\tp\ttyperef:typename:_Static_assert (==24,\"Offset of data_count must be 24\")\tfile:\tsignature:(camera_metadata_t,data_count)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, data_start) == 32,$/;\"\tp\ttyperef:typename:_Static_assert (==32,\"Offset of data_start must be 32\")\tfile:\tsignature:(camera_metadata_t,data_start)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, entries_start) == 20,$/;\"\tp\ttyperef:typename:_Static_assert (==20,\"Offset of entries_start must be 20\")\tfile:\tsignature:(camera_metadata_t,entries_start)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, entry_capacity) == 16,$/;\"\tp\ttyperef:typename:_Static_assert (==16,\"Offset of entry_capacity must be 16\")\tfile:\tsignature:(camera_metadata_t,entry_capacity)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, entry_count) == 12,$/;\"\tp\ttyperef:typename:_Static_assert (==12,\"Offset of entry_count must be 12\")\tfile:\tsignature:(camera_metadata_t,entry_count)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, flags) == 8,$/;\"\tp\ttyperef:typename:_Static_assert (==8,\"Offset of flags must be 8\")\tfile:\tsignature:(camera_metadata_t,flags)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, size) == 0,$/;\"\tp\ttyperef:typename:_Static_assert (==0,\"Offset of size must be 0\")\tfile:\tsignature:(camera_metadata_t,size)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, vendor_id) == 40,$/;\"\tp\ttyperef:typename:_Static_assert (==40,\"Offset of vendor_id must be 40\")\tfile:\tsignature:(camera_metadata_t,vendor_id)\n+offsetof\tmetadata/camera_metadata.c\t/^_Static_assert(offsetof(camera_metadata_t, version) == 4,$/;\"\tp\ttyperef:typename:_Static_assert (==4,\"Offset of version must be 4\")\tfile:\tsignature:(camera_metadata_t,version)\n+orientation\tcamera3_hal.cpp\t/^\tint32_t orientation = 0;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int32_t\tfile:\n+padding\tmetadata/camera_metadata.c\t/^ uint32_t padding; \\/\\/ padding to 8 bytes boundary$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\n+partialResultCount\tcamera_module.cpp\t/^\tint32_t partialResultCount = 1;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:int32_t\tfile:\n+pixelArraySize\tcamera3_hal.cpp\t/^\tint32_t pixelArraySize[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int32_t[]\tfile:\n+place_camera_metadata\tmetadata/camera_metadata.c\t/^camera_metadata_t *place_camera_metadata(void *dst,$/;\"\tf\ttyperef:typename:camera_metadata_t *\tsignature:(void * dst,size_t dst_size,size_t entry_capacity,size_t data_capacity)\n+print_data\tmetadata/camera_metadata.c\t/^static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag, int type,$/;\"\tp\ttyperef:typename:void\tfile:\tsignature:(int fd,const uint8_t * data_ptr,uint32_t tag,int type,int count,int indentation)\n+print_data\tmetadata/camera_metadata.c\t/^static void print_data(int fd, const uint8_t *data_ptr, uint32_t tag,$/;\"\tf\ttyperef:typename:void\tfile:\tsignature:(int fd,const uint8_t * data_ptr,uint32_t tag,int type,int count,int indentation)\n+processCaptureRequest\tcamera_module.cpp\t/^int CameraModule::processCaptureRequest(camera3_capture_request_t *camera3Request)$/;\"\tf\tclass:CameraModule\ttyperef:typename:int\tsignature:(camera3_capture_request_t * camera3Request)\n+processCaptureRequest\tcamera_module.h\t/^\tint processCaptureRequest(camera3_capture_request_t *request);$/;\"\tp\tclass:CameraModule\ttyperef:typename:int\taccess:public\tsignature:(camera3_capture_request_t * request)\n+r\tmetadata/camera_metadata.c\t/^ camera_metadata_rational_t r;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:camera_metadata_rational_t\tfile:\taccess:public\n+requestComplete\tcamera_module.cpp\t/^void CameraModule::requestComplete(Request *request,$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:(Request * request,const std::map<Stream *,Buffer * > & buffers)\n+requestComplete\tcamera_module.h\t/^\tvoid requestComplete(libcamera::Request *request,$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:(libcamera::Request * request,const std::map<libcamera::Stream *,libcamera::Buffer * > & buffers)\n+requestTemplate_\tcamera_module.h\t/^\tcamera_metadata_t *requestTemplate_;$/;\"\tm\tclass:CameraModule\ttyperef:typename:camera_metadata_t *\taccess:private\n+res\tmetadata/camera_metadata.c\t/^ int res;$/;\"\tl\tfunction:clone_camera_metadata\ttyperef:typename:int\tfile:\n+reserved\tmetadata/camera_metadata.c\t/^ uint8_t reserved[3];$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint8_t[3]\tfile:\taccess:public\n+ret\tcamera3_hal.cpp\t/^\tint ret = cameraManager->start();$/;\"\tl\tfunction:hal_init\ttyperef:typename:int\tfile:\n+ret\tcamera3_hal.cpp\t/^\tint ret;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int\tfile:\n+ret\tcamera_module.cpp\t/^\t\tint ret = camera_->allocateBuffers();$/;\"\tl\tfunction:CameraModule::processCaptureRequest\ttyperef:typename:int\tfile:\n+ret\tcamera_module.cpp\t/^\tint ret = camera_->configure(config_.get());$/;\"\tl\tfunction:CameraModule::configureStreams\ttyperef:typename:int\tfile:\n+ret\tcamera_module.cpp\t/^\tint ret;$/;\"\tl\tfunction:CameraModule::generateDefaultRequestMetadata\ttyperef:typename:int\tfile:\n+ret\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID;$/;\"\tl\tfunction:get_camera_metadata_vendor_id\ttyperef:typename:metadata_vendor_id_t\tfile:\n+ret\tmetadata/camera_metadata_tag_info.c\t/^ int ret = -1;$/;\"\tl\tfunction:camera_metadata_enum_snprint\ttyperef:typename:int\tfile:\n+roles\tcamera_module.cpp\t/^\tStreamRoles roles = {};$/;\"\tl\tfunction:CameraModule::configureStreams\ttyperef:typename:StreamRoles\tfile:\n+run\tcamera_module.cpp\t/^void CameraModule::run()$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\tsignature:()\n+run\tcamera_module.h\t/^\tvoid run();$/;\"\tp\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:()\n+search_entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *search_entry = NULL;$/;\"\tl\tfunction:find_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+search_entry\tmetadata/camera_metadata.c\t/^ camera_metadata_buffer_entry_t *search_entry = get_entries(src);$/;\"\tl\tfunction:find_camera_metadata_entry\ttyperef:typename:camera_metadata_buffer_entry_t *\tfile:\n+sensitivityRange\tcamera3_hal.cpp\t/^\tint32_t sensitivityRange[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int32_t[]\tfile:\n+sensorSizes\tcamera3_hal.cpp\t/^\tint32_t sensorSizes[] = {$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:int32_t[]\tfile:\n+setCallbacks\tcamera_module.h\t/^\tvoid setCallbacks(const camera3_callback_ops_t *callbacks)$/;\"\tf\tclass:CameraModule\ttyperef:typename:void\taccess:public\tsignature:(const camera3_callback_ops_t * callbacks)\n+set_camera_metadata_vendor_cache_ops\tmetadata/camera_metadata.c\t/^int set_camera_metadata_vendor_cache_ops($/;\"\tf\ttyperef:typename:int\tsignature:(const struct vendor_tag_cache_ops * query_cache_ops)\n+set_camera_metadata_vendor_id\tmetadata/camera_metadata.c\t/^void set_camera_metadata_vendor_id(camera_metadata_t *meta,$/;\"\tf\ttyperef:typename:void\tsignature:(camera_metadata_t * meta,metadata_vendor_id_t id)\n+set_camera_metadata_vendor_ops\tmetadata/camera_metadata.c\t/^int set_camera_metadata_vendor_ops(const vendor_tag_ops_t* ops) {$/;\"\tf\ttyperef:typename:int\tsignature:(const vendor_tag_ops_t * ops)\n+set_camera_metadata_vendor_tag_ops\tmetadata/camera_metadata.c\t/^int set_camera_metadata_vendor_tag_ops(const vendor_tag_query_ops_t* ops) {$/;\"\tf\ttyperef:typename:int\tsignature:(const vendor_tag_query_ops_t * ops)\n+size\tmetadata/camera_metadata.c\t/^ metadata_size_t size;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_size_t\tfile:\taccess:public\n+sort_camera_metadata\tmetadata/camera_metadata.c\t/^int sort_camera_metadata(camera_metadata_t *dst) {$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * dst)\n+start\tmetadata/camera_metadata.c\t/^ uint8_t *start = get_data(dst) + entry->data.offset;$/;\"\tl\tfunction:update_camera_metadata_entry\ttyperef:typename:uint8_t *\tfile:\n+start\tmetadata/camera_metadata.c\t/^ uint8_t *start = get_data(dst) + entry->data.offset;$/;\"\tl\tfunction:delete_camera_metadata_entry\ttyperef:typename:uint8_t *\tfile:\n+staticMetadata\tcamera3_hal.cpp\t/^\tcamera_metadata_t *staticMetadata = allocate_camera_metadata(STATIC_ENTRY_CAP,$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:camera_metadata_t *\tfile:\n+staticMetadata\tcamera3_hal.cpp\t/^\tcamera_metadata_t *staticMetadata = getStaticMetadata(id);$/;\"\tl\tfunction:hal_get_camera_info\ttyperef:typename:camera_metadata_t *\tfile:\n+stream\tcamera_module.cpp\t/^\t\tcamera3_stream_t *stream = stream_list->streams[i];$/;\"\tl\tfunction:hal_dev_configure_streams\ttyperef:typename:camera3_stream_t *\tfile:\n+streamConfiguration\tcamera_module.cpp\t/^\tStreamConfiguration *streamConfiguration = &config_->at(0);$/;\"\tl\tfunction:CameraModule::configureStreams\ttyperef:typename:StreamConfiguration *\tfile:\n+supportedHWLevel\tcamera3_hal.cpp\t/^\tuint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;$/;\"\tl\tfunction:getStaticMetadata\ttyperef:typename:uint8_t\tfile:\n+tag\tmetadata/camera_metadata.c\t/^ uint32_t tag;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint32_t\tfile:\taccess:public\n+tag1\tmetadata/camera_metadata.c\t/^ uint32_t tag1 = ((camera_metadata_buffer_entry_t*)p1)->tag;$/;\"\tl\tfunction:compare_entry_tags\ttyperef:typename:uint32_t\tfile:\n+tag2\tmetadata/camera_metadata.c\t/^ uint32_t tag2 = ((camera_metadata_buffer_entry_t*)p2)->tag;$/;\"\tl\tfunction:compare_entry_tags\ttyperef:typename:uint32_t\tfile:\n+tag_index\tmetadata/camera_metadata.c\t/^ uint32_t tag_index = tag & 0xFFFF;$/;\"\tl\tfunction:get_local_camera_metadata_tag_name_vendor_id\ttyperef:typename:uint32_t\tfile:\n+tag_index\tmetadata/camera_metadata.c\t/^ uint32_t tag_index = tag & 0xFFFF;$/;\"\tl\tfunction:get_local_camera_metadata_tag_type_vendor_id\ttyperef:typename:uint32_t\tfile:\n+tag_info\tmetadata/camera_metadata.c\t/^typedef struct tag_info {$/;\"\ts\tfile:\n+tag_info\tmetadata/camera_metadata_tag_info.c\t/^tag_info_t *tag_info[ANDROID_SECTION_COUNT] = {$/;\"\tv\ttyperef:typename:tag_info_t * []\n+tag_info::tag_name\tmetadata/camera_metadata.c\t/^ const char *tag_name;$/;\"\tm\tstruct:tag_info\ttyperef:typename:const char *\tfile:\taccess:public\n+tag_info::tag_type\tmetadata/camera_metadata.c\t/^ uint8_t tag_type;$/;\"\tm\tstruct:tag_info\ttyperef:typename:uint8_t\tfile:\taccess:public\n+tag_info_t\tmetadata/camera_metadata.c\t/^} tag_info_t;$/;\"\tt\ttyperef:struct:tag_info\tfile:\n+tag_name\tmetadata/camera_metadata.c\t/^ const char *tag_name, *tag_section;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:const char *\tfile:\n+tag_name\tmetadata/camera_metadata.c\t/^ const char *tag_name;$/;\"\tm\tstruct:tag_info\ttyperef:typename:const char *\tfile:\taccess:public\n+tag_section\tmetadata/camera_metadata.c\t/^ const char *tag_name, *tag_section;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:const char **\tfile:\n+tag_section\tmetadata/camera_metadata.c\t/^ uint32_t tag_section = entry.tag >> 16;$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:uint32_t\tfile:\n+tag_section\tmetadata/camera_metadata.c\t/^ uint32_t tag_section = tag >> 16;$/;\"\tl\tfunction:get_local_camera_metadata_section_name_vendor_id\ttyperef:typename:uint32_t\tfile:\n+tag_section\tmetadata/camera_metadata.c\t/^ uint32_t tag_section = tag >> 16;$/;\"\tl\tfunction:get_local_camera_metadata_tag_name_vendor_id\ttyperef:typename:uint32_t\tfile:\n+tag_section\tmetadata/camera_metadata.c\t/^ uint32_t tag_section = tag >> 16;$/;\"\tl\tfunction:get_local_camera_metadata_tag_type_vendor_id\ttyperef:typename:uint32_t\tfile:\n+tag_type\tmetadata/camera_metadata.c\t/^ int tag_type = get_local_camera_metadata_tag_type(entry.tag, metadata);$/;\"\tl\tfunction:validate_camera_metadata_structure\ttyperef:typename:int\tfile:\n+tag_type\tmetadata/camera_metadata.c\t/^ uint8_t tag_type;$/;\"\tm\tstruct:tag_info\ttyperef:typename:uint8_t\tfile:\taccess:public\n+type\tmetadata/camera_metadata.c\t/^ int type = get_local_camera_metadata_tag_type(tag, dst);$/;\"\tl\tfunction:add_camera_metadata_entry\ttyperef:typename:int\tfile:\n+type\tmetadata/camera_metadata.c\t/^ uint8_t type;$/;\"\tm\tstruct:camera_metadata_buffer_entry\ttyperef:typename:uint8_t\tfile:\taccess:public\n+type_name\tmetadata/camera_metadata.c\t/^ const char *type_name;$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:const char *\tfile:\n+type_size\tmetadata/camera_metadata.c\t/^ size_t type_size = camera_metadata_type_size[entry->type];$/;\"\tl\tfunction:dump_indented_camera_metadata\ttyperef:typename:size_t\tfile:\n+type_size\tmetadata/camera_metadata.c\t/^ size_t type_size = camera_metadata_type_size[type];$/;\"\tl\tfunction:print_data\ttyperef:typename:size_t\tfile:\n+u8\tmetadata/camera_metadata.c\t/^ uint8_t u8;$/;\"\tm\tunion:camera_metadata_data\ttyperef:typename:uint8_t\tfile:\taccess:public\n+update_camera_metadata_entry\tmetadata/camera_metadata.c\t/^int update_camera_metadata_entry(camera_metadata_t *dst,$/;\"\tf\ttyperef:typename:int\tsignature:(camera_metadata_t * dst,size_t index,const void * data,size_t data_count,camera_metadata_entry_t * updated_entry)\n+validate_and_calculate_camera_metadata_entry_data_size\tmetadata/camera_metadata.c\t/^static int validate_and_calculate_camera_metadata_entry_data_size(size_t *data_size, uint8_t typ/;\"\tf\ttyperef:typename:int\tfile:\tsignature:(size_t * data_size,uint8_t type,size_t data_count)\n+validate_camera_metadata_structure\tmetadata/camera_metadata.c\t/^int validate_camera_metadata_structure(const camera_metadata_t *metadata,$/;\"\tf\ttyperef:typename:int\tsignature:(const camera_metadata_t * metadata,const size_t * expected_size)\n+validate_camera_metadata_structure::__anon2a3e460f0208::alignment\tmetadata/camera_metadata.c\t/^ size_t alignment;$/;\"\tm\tstruct:validate_camera_metadata_structure::__anon2a3e460f0208\ttyperef:typename:size_t\tfile:\taccess:public\n+validate_camera_metadata_structure::__anon2a3e460f0208::name\tmetadata/camera_metadata.c\t/^ const char *name;$/;\"\tm\tstruct:validate_camera_metadata_structure::__anon2a3e460f0208\ttyperef:typename:const char *\tfile:\taccess:public\n+value\tmetadata/camera_metadata.c\t/^ uint8_t value[4];$/;\"\tm\tunion:camera_metadata_buffer_entry::__anon2a3e460f010a\ttyperef:typename:uint8_t[4]\tfile:\taccess:public\n+value\tmetadata/camera_metadata.c\t/^ uint32_t value;$/;\"\tl\tfunction:print_data\ttyperef:typename:uint32_t\tfile:\n+value_string_tmp\tmetadata/camera_metadata.c\t/^ char value_string_tmp[CAMERA_METADATA_ENUM_STRING_MAX_SIZE];$/;\"\tl\tfunction:print_data\ttyperef:typename:char[]\tfile:\n+values_per_line\tmetadata/camera_metadata.c\t/^ static int values_per_line[NUM_TYPES] = {$/;\"\tl\tfunction:print_data\ttyperef:typename:int[]\tfile:\n+vendor_cache_ops\tmetadata/camera_metadata.c\t/^static const struct vendor_tag_cache_ops *vendor_cache_ops = NULL;$/;\"\tv\ttyperef:typename:const struct vendor_tag_cache_ops *\tfile:\n+vendor_id\tmetadata/camera_metadata.c\t/^ metadata_vendor_id_t vendor_id;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:metadata_vendor_id_t\tfile:\taccess:public\n+vendor_tag_ops\tmetadata/camera_metadata.c\t/^static const vendor_tag_ops_t *vendor_tag_ops = NULL;$/;\"\tv\ttyperef:typename:const vendor_tag_ops_t *\tfile:\n+version\tmetadata/camera_metadata.c\t/^ uint32_t version;$/;\"\tm\tstruct:camera_metadata\ttyperef:typename:uint32_t\tfile:\taccess:public\ndiff --git a/src/android/thread_rpc.cpp b/src/android/thread_rpc.cpp\nnew file mode 100644\nindex 000000000000..f13db59d0d75\n--- /dev/null\n+++ b/src/android/thread_rpc.cpp\n@@ -0,0 +1,41 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * thread_call.cpp - Inter-thread procedure call\n+ */\n+\n+#include \"message.h\"\n+#include \"thread_rpc.h\"\n+\n+using namespace libcamera;\n+\n+libcamera::Message::Type ThreadRpcMessage::rpcType_ = Message::Type::None;\n+\n+ThreadRpcMessage::ThreadRpcMessage()\n+\t: Message(type())\n+{\n+}\n+\n+void ThreadRpc::notifyReception()\n+{\n+\t{\n+\t\tlibcamera::MutexLocker locker(mutex_);\n+\t\tdelivered_ = true;\n+\t}\n+\tcv_.notify_one();\n+}\n+\n+void ThreadRpc::waitDelivery()\n+{\n+\tlibcamera::MutexLocker locker(mutex_);\n+\tcv_.wait(locker, [&]{ return delivered_; });\n+}\n+\n+Message::Type ThreadRpcMessage::type()\n+{\n+\tif (ThreadRpcMessage::rpcType_ == Message::Type::None)\n+\t\trpcType_ = Message::registerMessageType();\n+\n+\treturn rpcType_;\n+}\ndiff --git a/src/android/thread_rpc.h b/src/android/thread_rpc.h\nnew file mode 100644\nindex 000000000000..173caba1a515\n--- /dev/null\n+++ b/src/android/thread_rpc.h\n@@ -0,0 +1,56 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * thread_call.h - Inter-thread procedure call\n+ */\n+#ifndef __ANDROID_THREAD_CALL_H__\n+#define __ANDROID_THREAD_CALL_H__\n+\n+#include <condition_variable>\n+#include <string>\n+\n+#include <hardware/camera3.h>\n+#include <libcamera/libcamera.h>\n+\n+#include \"message.h\"\n+#include \"thread.h\"\n+\n+class ThreadRpc\n+{\n+public:\n+\tenum RpcTag {\n+\t\tProcessCaptureRequest,\n+\t\tClose,\n+\t};\n+\n+\tThreadRpc()\n+\t\t: delivered_(false) {}\n+\n+\tvoid notifyReception();\n+\tvoid waitDelivery();\n+\n+\tRpcTag tag;\n+\n+\tcamera3_capture_request_t *request;\n+\n+private:\n+\tbool delivered_;\n+\tstd::mutex mutex_;\n+\tstd::condition_variable cv_;\n+};\n+\n+class ThreadRpcMessage : public libcamera::Message\n+{\n+public:\n+\tThreadRpcMessage();\n+\tThreadRpc *rpc;\n+\n+\tstatic Message::Type type();\n+\n+private:\n+\tstatic libcamera::Message::Type rpcType_;\n+};\n+\n+#endif /* __ANDROID_THREAD_CALL_H__ */\n+\ndiff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\nindex a09b23d60022..9b6e4b769760 100644\n--- a/src/libcamera/meson.build\n+++ b/src/libcamera/meson.build\n@@ -103,11 +103,23 @@ libcamera_deps = [\n dependency('threads'),\n ]\n \n-libcamera = shared_library('camera',\n- libcamera_sources,\n- install : true,\n- include_directories : includes,\n- dependencies : libcamera_deps)\n+if get_option('android')\n+ libcamera_sources += android_hal_sources\n+ includes += android_includes\n+\n+ libcamera = shared_library('camera',\n+ libcamera_sources,\n+ install : true,\n+ link_with : android_camera_metadata,\n+ include_directories : includes,\n+ dependencies : libcamera_deps)\n+else\n+ libcamera = shared_library('camera',\n+ libcamera_sources,\n+ install : true,\n+ include_directories : includes,\n+ dependencies : libcamera_deps)\n+endif\n \n libcamera_dep = declare_dependency(sources : [libcamera_api, libcamera_h],\n include_directories : libcamera_includes,\ndiff --git a/src/meson.build b/src/meson.build\nindex 628e7a7f23f2..67ad20aab86b 100644\n--- a/src/meson.build\n+++ b/src/meson.build\n@@ -1,3 +1,7 @@\n+if get_option('android')\n+ subdir('android')\n+endif\n+\n subdir('libcamera')\n subdir('ipa')\n subdir('cam')\n", "prefixes": [ "libcamera-devel", "5/5" ] }