[libcamera-devel] [PATCH 07/10] android: camera_device: Handle PIPELINE_MAX_DEPTH
Jacopo Mondi
jacopo at jmondi.org
Fri Oct 9 14:20:58 CEST 2020
Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property
inspecting what the value returned by the pipeline handler
through the properties::draft::PipelineMaxDepth libcamera property.
Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that
reports the processing stage a frame went through by inspecting the
controls::draft::PipelineDepth libcamera control reported in the
completed Request.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/android/camera_device.cpp | 28 ++++++++++++++++++++++------
src/android/camera_device.h | 3 ++-
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 0a94c1ae17ac..bccec358ea13 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -12,6 +12,7 @@
#include <tuple>
#include <vector>
+#include <libcamera/control_ids.h>
#include <libcamera/controls.h>
#include <libcamera/formats.h>
#include <libcamera/property_ids.h>
@@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
return nullptr;
}
+ const ControlList &cameraProperties = camera_->properties();
+
/* Color correction static metadata. */
std::vector<uint8_t> aberrationModes = {
ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,
@@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
staticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
&partialResultCount, 1);
- uint8_t maxPipelineDepth = 2;
- staticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
- &maxPipelineDepth, 1);
+ if (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {
+ uint8_t maxPipelineDepth =
+ cameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);
+ staticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
+ &maxPipelineDepth, 1);
+ }
/* LIMITED does not support reprocessing. */
uint32_t maxNumInputStreams = 0;
@@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)
* pipeline handlers) timestamp in the Request itself.
*/
FrameBuffer *buffer = buffers.begin()->second;
- resultMetadata = getResultMetadata(descriptor->frameNumber,
+ resultMetadata = getResultMetadata(request->metadata(),
+ descriptor->frameNumber,
buffer->metadata().timestamp);
/* Handle any JPEG compression. */
@@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)
* Produce a set of fixed result metadata.
*/
std::unique_ptr<CameraMetadata>
-CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
+CameraDevice::getResultMetadata(ControlList &metadata,
+ [[maybe_unused]] int frame_number,
int64_t timestamp)
{
/*
@@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
* Currently: 18 entries, 62 bytes
*/
std::unique_ptr<CameraMetadata> resultMetadata =
- std::make_unique<CameraMetadata>(18, 62);
+ std::make_unique<CameraMetadata>(19, 63);
if (!resultMetadata->isValid()) {
LOG(HAL, Error) << "Failed to allocate static metadata";
return nullptr;
@@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,
&scene_flicker, 1);
+ /* Add metadata tags reported by libcamera. */
+ if (metadata.contains(controls::draft::PipelineDepth)) {
+ uint8_t pipeline_depth =
+ metadata.get<int32_t>(controls::draft::PipelineDepth);
+ resultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,
+ &pipeline_depth, 1);
+ }
+
/*
* Return the result metadata pack even is not valid: get() will return
* nullptr.
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 777d1a35e801..8cf1006c0840 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -102,7 +102,8 @@ private:
void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
CameraMetadata *requestTemplatePreview();
libcamera::PixelFormat toPixelFormat(int format);
- std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
+ std::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,
+ int frame_number,
int64_t timestamp);
unsigned int id_;
--
2.28.0
More information about the libcamera-devel
mailing list