android: camera_device: Report pipeline depth

Report the pipeline depth in the capture results if the pipeline
reports it.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi 2020-12-09 17:51:57 +01:00
parent f5e80e609c
commit 3535e0c104
3 changed files with 22 additions and 7 deletions

View file

@ -675,10 +675,10 @@ std::tuple<uint32_t, uint32_t> CameraDevice::calculateStaticMetadataSize()
{ {
/* /*
* \todo Keep this in sync with the actual number of entries. * \todo Keep this in sync with the actual number of entries.
* Currently: 51 entries, 687 bytes of static metadata * Currently: 52 entries, 698 bytes of static metadata
*/ */
uint32_t numEntries = 52; uint32_t numEntries = 52;
uint32_t byteSize = 694; uint32_t byteSize = 698;
/* /*
* Calculate space occupation in bytes for dynamically built metadata * Calculate space occupation in bytes for dynamically built metadata
@ -1187,6 +1187,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
ANDROID_CONTROL_AWB_STATE, ANDROID_CONTROL_AWB_STATE,
ANDROID_CONTROL_AWB_LOCK, ANDROID_CONTROL_AWB_LOCK,
ANDROID_LENS_STATE, ANDROID_LENS_STATE,
ANDROID_REQUEST_PIPELINE_DEPTH,
ANDROID_SCALER_CROP_REGION, ANDROID_SCALER_CROP_REGION,
ANDROID_SENSOR_TIMESTAMP, ANDROID_SENSOR_TIMESTAMP,
ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, ANDROID_SENSOR_ROLLING_SHUTTER_SKEW,
@ -1704,7 +1705,7 @@ void CameraDevice::requestComplete(Request *request)
* pipeline handlers) timestamp in the Request itself. * pipeline handlers) timestamp in the Request itself.
*/ */
uint64_t timestamp = buffers.begin()->second->metadata().timestamp; uint64_t timestamp = buffers.begin()->second->metadata().timestamp;
resultMetadata = getResultMetadata(descriptor->frameNumber_, timestamp); resultMetadata = getResultMetadata(descriptor, timestamp);
/* Handle any JPEG compression. */ /* Handle any JPEG compression. */
for (unsigned int i = 0; i < descriptor->numBuffers_; ++i) { for (unsigned int i = 0; i < descriptor->numBuffers_; ++i) {
@ -1822,15 +1823,17 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)
* Produce a set of fixed result metadata. * Produce a set of fixed result metadata.
*/ */
std::unique_ptr<CameraMetadata> std::unique_ptr<CameraMetadata>
CameraDevice::getResultMetadata([[maybe_unused]] int frame_number, CameraDevice::getResultMetadata(Camera3RequestDescriptor *descriptor,
int64_t timestamp) int64_t timestamp)
{ {
const ControlList &metadata = descriptor->request_->metadata();
/* /*
* \todo Keep this in sync with the actual number of entries. * \todo Keep this in sync with the actual number of entries.
* Currently: 18 entries, 62 bytes * Currently: 18 entries, 62 bytes
*/ */
std::unique_ptr<CameraMetadata> resultMetadata = std::unique_ptr<CameraMetadata> resultMetadata =
std::make_unique<CameraMetadata>(18, 62); std::make_unique<CameraMetadata>(19, 63);
if (!resultMetadata->isValid()) { if (!resultMetadata->isValid()) {
LOG(HAL, Error) << "Failed to allocate static metadata"; LOG(HAL, Error) << "Failed to allocate static metadata";
return nullptr; return nullptr;
@ -1880,6 +1883,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER, resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,
&scene_flicker, 1); &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 * Return the result metadata pack even is not valid: get() will return
* nullptr. * nullptr.

View file

@ -105,8 +105,8 @@ private:
void notifyError(uint32_t frameNumber, camera3_stream_t *stream); void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
CameraMetadata *requestTemplatePreview(); CameraMetadata *requestTemplatePreview();
libcamera::PixelFormat toPixelFormat(int format) const; libcamera::PixelFormat toPixelFormat(int format) const;
std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number, std::unique_ptr<CameraMetadata> getResultMetadata(
int64_t timestamp); Camera3RequestDescriptor *descriptor, int64_t timestamp);
unsigned int id_; unsigned int id_;
camera3_device_t camera3Device_; camera3_device_t camera3Device_;

View file

@ -25,6 +25,10 @@ public:
CaptureRequest(libcamera::Camera *camera, uint64_t cookie); CaptureRequest(libcamera::Camera *camera, uint64_t cookie);
const std::vector<int> &fences() const { return acquireFences_; } const std::vector<int> &fences() const { return acquireFences_; }
const libcamera::ControlList &metadata() const
{
return request_->metadata();
}
void addBuffer(libcamera::Stream *stream, void addBuffer(libcamera::Stream *stream,
libcamera::FrameBuffer *buffer, int fence); libcamera::FrameBuffer *buffer, int fence);