[PATCH v3 3/4] libcamera: pipeline: uvcvideo: Retrieve current exposure mode on start
Barnabás Pőcze
barnabas.pocze at ideasonboard.com
Tue May 6 17:53:44 CEST 2025
Hi
2025. 03. 21. 15:53 keltezéssel, Jacopo Mondi írta:
> Hi Barnabás
>
> On Fri, Mar 21, 2025 at 03:36:10PM +0100, Barnabás Pőcze wrote:
>> Hi
>>
>> 2025. 03. 21. 15:02 keltezéssel, Jacopo Mondi írta:
>>> Hi Barnabás
>>>
>>> On Fri, Mar 14, 2025 at 06:42:47PM +0100, Barnabás Pőcze wrote:
>>>> If `ExposureTimeMode` is supported, then retrieve the current value
>>>> of `V4L2_CID_EXPOSURE_AUTO` in `PipelineHandlerUVC::start()`, and
>>>> convert it to the appropriate `ExposureTimeModeEnum` value. If it
>>>> is not supported or the conversion fails, then fall back to assuming
>>>> that `ExposureTimeModeManual` is in effect.
>>>>
>>>> This is necessary to be able to properly handle the `ExposureTime`
>>>> control as its value is required to be ignored if `ExposureTimeMode`
>>>> is not manual.
>>>>
>>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
>>>> ---
>>>> src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 20 ++++++++++++++++++++
>>>> 1 file changed, 20 insertions(+)
>>>>
>>>> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
>>>> index 4ff79c291..7d882ebe1 100644
>>>> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
>>>> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
>>>> @@ -62,6 +62,15 @@ public:
>>>> std::optional<v4l2_exposure_auto_type> autoExposureMode_;
>>>> std::optional<v4l2_exposure_auto_type> manualExposureMode_;
>>>>
>>>> + struct State {
>>>> + std::optional<controls::ExposureTimeModeEnum> exp;
>>>> +
>>>> + void reset()
>>>> + {
>>>> + exp.reset();
>>>> + }
>>>> + } state_;
>>>
>>> Do you expect this to grow ? Otherwise there's no much difference than
>>> just using an optional<> directly.
>>
>> No idea to be honest, but state objects are passed to functions, so
>> it's certainly less typing.
>>
>
> True, and probably more tidy than just passing the optional<> around..
>
> Let's make it clear this is about controls maybe naming the type
> ControlsState ? (uvc doesn't have an IPA, but in IPA-terms this would
> actually be the ActiveState..)
Hmm... I like `ActiveState` better than `ControlsState`, but let's continue
this discussion at the new version of the patch.
Regards,
Barnabás Pőcze
>
>>
>>>
>>>> +
>>>> private:
>>>> bool generateId();
>>>>
>>>> @@ -303,6 +312,16 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList
>>>> return ret;
>>>> }
>>>>
>>>> + if (data->autoExposureMode_ || data->manualExposureMode_) {
>>>> + const auto &ctrls = data->video_->getControls({ V4L2_CID_EXPOSURE_AUTO });
>>>> + const auto &value = ctrls.get(V4L2_CID_EXPOSURE_AUTO);
>>>
>>> Is this safe in case there's no V4L2_CID_EXPOSURE_AUTO ? Isn't it
>>> safer to check
>>
>> It is apparently not, documentation says undefined behaviour. I have
>> added a `ctrls.contains(...)` check.
>>
>>
>>>
>>> if (!ctrls.empty()) {
>>> const auto &value = ctrls.get(V4L2_CID_EXPOSURE_AUTO);
>>> data->state_.exp = v4l2ToExposureMode(value.get<int32_t>());
>>>
>>> }
>>>> + if (!value.isNone())
>>>> + data->state_.exp = v4l2ToExposureMode(value.get<int32_t>());
>>>> + }
>>>> +
>>>> + if (!data->state_.exp)
>>>> + data->state_.exp = controls::ExposureTimeModeManual;
>>>> +
>>>
>>> I presume this is safer than just relying on the control default
>>> value, specifically in start-stop-start sessions (if controls are not
>>> reset in between ofc)
>>
>> At this point I have different thoughts every time I look at this...
>> This is a fallback path for very unlikely scenarios, but now I am
>> thinking that the current value shouldn't even be retrieved for
>> two reasons:
>>
>> * the current values of controls are not retrievable by the user application
>> (with libcamera at least);
>> * the user application will have to set `ExposureTimeMode=Manual` explicitly
>> before setting `ExposureTime` at least once (otherwise correct operation is
>> not guaranteed by the docs) and at that point up to date state information
>> will be available.
>>
>> Or is there possibly an expectation that the controls will have their "default"
>> values when streaming starts? That is surely not guaranteed by the UVC pipeline
>> handler, do others guarantee that?
>>
>>
>> Regards,
>> Barnabás Pőcze
>>
>>>
>>>> return 0;
>>>> }
>>>>
>>>> @@ -311,6 +330,7 @@ void PipelineHandlerUVC::stopDevice(Camera *camera)
>>>> UVCCameraData *data = cameraData(camera);
>>>> data->video_->streamOff();
>>>> data->video_->releaseBuffers();
>>>> + data->state_.reset();
>>>> }
>>>>
>>>> int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *controls,
>>>> --
>>>> 2.48.1
>>>>
>>
More information about the libcamera-devel
mailing list