Message ID | 20210308170728.2212649-4-jacopo@jmondi.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, Thank you for the patch. On Mon, Mar 08, 2021 at 06:07:28PM +0100, Jacopo Mondi wrote: > The capture request template for video recording use cases requires > a fixed FPS range. Generate the request templates for the VIDEO_RECORD > and VIDEO_SNAPSHOT capture intents using the preview template and > updating the supported FPS range. > > This change fixes the CTS tests > android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > --- > src/android/camera_device.cpp | 39 +++++++++++++++++++++++++++++------ > src/android/camera_device.h | 1 + > 2 files changed, 34 insertions(+), 6 deletions(-) > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index 0621ec26feb8..58bebab31cb8 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -1396,11 +1396,7 @@ CameraMetadata *CameraDevice::requestTemplatePreview() > } > > /* > - * \todo Depending on the requested CaptureIntent, the FPS range > - * needs to be adjusted. For example, the capture template for > - * video capture intent shall report a fixed value. > - * > - * Also assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > * has been assembled as {{min, max} {max, max}}. > */ > requestTemplate->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, > @@ -1474,6 +1470,30 @@ CameraMetadata *CameraDevice::requestTemplatePreview() > return requestTemplate; > } > > +CameraMetadata *CameraDevice::requestTemplateVideo() > +{ > + CameraMetadata *previewTemplate = requestTemplatePreview(); > + if (!previewTemplate) > + return nullptr; > + > + /* > + * The video template requires a fixed FPS range. Everything else > + * stays the same as the preview template. > + */ > + camera_metadata_ro_entry_t entry; > + staticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, > + &entry); > + > + /* > + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > + * has been assembled as {{min, max} {max, max}}. > + */ > + previewTemplate->updateEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, > + entry.data.i32 + 2, 2); > + > + return previewTemplate; > +} > + > /* > * Produce a metadata pack to be used as template for a capture request. > */ > @@ -1489,14 +1509,22 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > switch (type) { > case CAMERA3_TEMPLATE_PREVIEW: > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; > + requestTemplate = requestTemplatePreview(); > break; > case CAMERA3_TEMPLATE_STILL_CAPTURE: > + /* > + * Use the preview template for still capture, they only differ > + * for the torch mode we currently do not support. > + */ > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; > + requestTemplate = requestTemplatePreview(); > break; > case CAMERA3_TEMPLATE_VIDEO_RECORD: > + requestTemplate = requestTemplateVideo(); > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; Nit-picking, I'd swap the two lines to align with the previous two cases. Same for video snapshot. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > break; > case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: > + requestTemplate = requestTemplateVideo(); > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; > break; > /* \todo Implement templates generation for the remaining use cases. */ > @@ -1507,7 +1535,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > return nullptr; > } > > - requestTemplate = requestTemplatePreview(); > if (!requestTemplate || !requestTemplate->isValid()) { > LOG(HAL, Error) << "Failed to construct request template"; > delete requestTemplate; > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > index f96934dbf4e7..ebbd7b9b8ab1 100644 > --- a/src/android/camera_device.h > +++ b/src/android/camera_device.h > @@ -101,6 +101,7 @@ private: > void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > CameraMetadata *requestTemplatePreview(); > + CameraMetadata *requestTemplateVideo(); > libcamera::PixelFormat toPixelFormat(int format) const; > int processControls(Camera3RequestDescriptor *descriptor); > std::unique_ptr<CameraMetadata> getResultMetadata(
Hi Laurent, On Tue, Mar 09, 2021 at 02:02:29AM +0200, Laurent Pinchart wrote: > Hi Jacopo, > > Thank you for the patch. > > On Mon, Mar 08, 2021 at 06:07:28PM +0100, Jacopo Mondi wrote: > > The capture request template for video recording use cases requires > > a fixed FPS range. Generate the request templates for the VIDEO_RECORD > > and VIDEO_SNAPSHOT capture intents using the preview template and > > updating the supported FPS range. > > > > This change fixes the CTS tests > > android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate > > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > > --- > > src/android/camera_device.cpp | 39 +++++++++++++++++++++++++++++------ > > src/android/camera_device.h | 1 + > > 2 files changed, 34 insertions(+), 6 deletions(-) > > > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > > index 0621ec26feb8..58bebab31cb8 100644 > > --- a/src/android/camera_device.cpp > > +++ b/src/android/camera_device.cpp > > @@ -1396,11 +1396,7 @@ CameraMetadata *CameraDevice::requestTemplatePreview() > > } > > > > /* > > - * \todo Depending on the requested CaptureIntent, the FPS range > > - * needs to be adjusted. For example, the capture template for > > - * video capture intent shall report a fixed value. > > - * > > - * Also assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > > + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > > * has been assembled as {{min, max} {max, max}}. > > */ > > requestTemplate->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, > > @@ -1474,6 +1470,30 @@ CameraMetadata *CameraDevice::requestTemplatePreview() > > return requestTemplate; > > } > > > > +CameraMetadata *CameraDevice::requestTemplateVideo() > > +{ > > + CameraMetadata *previewTemplate = requestTemplatePreview(); > > + if (!previewTemplate) > > + return nullptr; > > + > > + /* > > + * The video template requires a fixed FPS range. Everything else > > + * stays the same as the preview template. > > + */ > > + camera_metadata_ro_entry_t entry; > > + staticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, > > + &entry); > > + > > + /* > > + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata > > + * has been assembled as {{min, max} {max, max}}. > > + */ > > + previewTemplate->updateEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, > > + entry.data.i32 + 2, 2); > > + > > + return previewTemplate; > > +} > > + > > /* > > * Produce a metadata pack to be used as template for a capture request. > > */ > > @@ -1489,14 +1509,22 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > > switch (type) { > > case CAMERA3_TEMPLATE_PREVIEW: > > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; > > + requestTemplate = requestTemplatePreview(); > > break; > > case CAMERA3_TEMPLATE_STILL_CAPTURE: > > + /* > > + * Use the preview template for still capture, they only differ > > + * for the torch mode we currently do not support. > > + */ > > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; > > + requestTemplate = requestTemplatePreview(); > > break; > > case CAMERA3_TEMPLATE_VIDEO_RECORD: > > + requestTemplate = requestTemplateVideo(); > > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; > > Nit-picking, I'd swap the two lines to align with the previous two > cases. Same for video snapshot. Oh indeed! I'll fix this Thanks j > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > break; > > case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: > > + requestTemplate = requestTemplateVideo(); > > captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; > > break; > > /* \todo Implement templates generation for the remaining use cases. */ > > @@ -1507,7 +1535,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) > > return nullptr; > > } > > > > - requestTemplate = requestTemplatePreview(); > > if (!requestTemplate || !requestTemplate->isValid()) { > > LOG(HAL, Error) << "Failed to construct request template"; > > delete requestTemplate; > > diff --git a/src/android/camera_device.h b/src/android/camera_device.h > > index f96934dbf4e7..ebbd7b9b8ab1 100644 > > --- a/src/android/camera_device.h > > +++ b/src/android/camera_device.h > > @@ -101,6 +101,7 @@ private: > > void notifyShutter(uint32_t frameNumber, uint64_t timestamp); > > void notifyError(uint32_t frameNumber, camera3_stream_t *stream); > > CameraMetadata *requestTemplatePreview(); > > + CameraMetadata *requestTemplateVideo(); > > libcamera::PixelFormat toPixelFormat(int format) const; > > int processControls(Camera3RequestDescriptor *descriptor); > > std::unique_ptr<CameraMetadata> getResultMetadata( > > -- > Regards, > > Laurent Pinchart
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 0621ec26feb8..58bebab31cb8 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -1396,11 +1396,7 @@ CameraMetadata *CameraDevice::requestTemplatePreview() } /* - * \todo Depending on the requested CaptureIntent, the FPS range - * needs to be adjusted. For example, the capture template for - * video capture intent shall report a fixed value. - * - * Also assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata * has been assembled as {{min, max} {max, max}}. */ requestTemplate->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, @@ -1474,6 +1470,30 @@ CameraMetadata *CameraDevice::requestTemplatePreview() return requestTemplate; } +CameraMetadata *CameraDevice::requestTemplateVideo() +{ + CameraMetadata *previewTemplate = requestTemplatePreview(); + if (!previewTemplate) + return nullptr; + + /* + * The video template requires a fixed FPS range. Everything else + * stays the same as the preview template. + */ + camera_metadata_ro_entry_t entry; + staticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, + &entry); + + /* + * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata + * has been assembled as {{min, max} {max, max}}. + */ + previewTemplate->updateEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, + entry.data.i32 + 2, 2); + + return previewTemplate; +} + /* * Produce a metadata pack to be used as template for a capture request. */ @@ -1489,14 +1509,22 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) switch (type) { case CAMERA3_TEMPLATE_PREVIEW: captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; + requestTemplate = requestTemplatePreview(); break; case CAMERA3_TEMPLATE_STILL_CAPTURE: + /* + * Use the preview template for still capture, they only differ + * for the torch mode we currently do not support. + */ captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; + requestTemplate = requestTemplatePreview(); break; case CAMERA3_TEMPLATE_VIDEO_RECORD: + requestTemplate = requestTemplateVideo(); captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; break; case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: + requestTemplate = requestTemplateVideo(); captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; break; /* \todo Implement templates generation for the remaining use cases. */ @@ -1507,7 +1535,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) return nullptr; } - requestTemplate = requestTemplatePreview(); if (!requestTemplate || !requestTemplate->isValid()) { LOG(HAL, Error) << "Failed to construct request template"; delete requestTemplate; diff --git a/src/android/camera_device.h b/src/android/camera_device.h index f96934dbf4e7..ebbd7b9b8ab1 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -101,6 +101,7 @@ private: void notifyShutter(uint32_t frameNumber, uint64_t timestamp); void notifyError(uint32_t frameNumber, camera3_stream_t *stream); CameraMetadata *requestTemplatePreview(); + CameraMetadata *requestTemplateVideo(); libcamera::PixelFormat toPixelFormat(int format) const; int processControls(Camera3RequestDescriptor *descriptor); std::unique_ptr<CameraMetadata> getResultMetadata(
The capture request template for video recording use cases requires a fixed FPS range. Generate the request templates for the VIDEO_RECORD and VIDEO_SNAPSHOT capture intents using the preview template and updating the supported FPS range. This change fixes the CTS tests android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> --- src/android/camera_device.cpp | 39 +++++++++++++++++++++++++++++------ src/android/camera_device.h | 1 + 2 files changed, 34 insertions(+), 6 deletions(-)