Commit graph

898 commits

Author SHA1 Message Date
Laurent Pinchart
207d57c8b4 libcamera: v4l2_controls: Replace V4L2ControlInfo with V4L2ControlRange
The V4L2ControlInfo class only stores a ControlRange. Make it inherit
from ControlRange to provide a convenience constructor from a struct
v4l2_query_ext_ctrl and rename it to V4L2ControlRange.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:31 +03:00
Laurent Pinchart
7bb4d7144c test: v4l2_videodevice: controls: Use correct control range in check
A value check on the V4L2_CID_CONTRAST control is using the brightness
control range. Fix it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:30 +03:00
Laurent Pinchart
6d2411fcb7 libcamera: v4l2_controls: Index V4L2ControlInfoMap by ControlId *
To bring the libcamera and V4L2 control info maps closer, index the
latter by ControlId * like the former. As V4L2ControlInfoMap is widely
indexed by V4L2 numerical IDs, add accessors based on numerical IDs.

This allows complete removal of the ControId pointer from the
V4L2ControlInfo, as the ControId is accessible as the key when iterating
over the map. A handful of users have to be modified to adapt to the
change.

The controlInfo argument from V4L2Device::updateControls() can also be
removed as it itsn't used anymore.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:29 +03:00
Laurent Pinchart
f24f77e7f5 libcamera: controls: Prevent copies of ControlId class
Now that the V4L2ControlId embedded in V4L2ControlInfo has been moved
out and doesn't require to be copied anymore, the base ControlId class
doesn't need to be copyable either. Delete the ControlId copy
constructor and copy assignment operator.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:28 +03:00
Jacopo Mondi
75e7452fc5 libcamera: v4l2_controls: Move V4L2ControlId out of V4L2ControlInfo
In order to reconcile the libcamera and V4L2 control info maps, we need
to move the V4L2ControlId embedded in V4L2ControlInfo map out of the
class. Store the V4L2ControlId instances in the V4L2Device that creates
them, and only reference them from V4L2ControlInfo.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:27 +03:00
Laurent Pinchart
35e6319b35 libcamera: v4l2_controls: Remove V4L2ControlInfo::size()
We don't support V4L2 compound controls, the size field is thus unused.
Remove it to ease merging of the libcamera and V4L2 control info
classes. Support for array controls can then be added later on top, and
would be useful for libcamera controls too.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 22:33:26 +03:00
Laurent Pinchart
876b900862 libcamera: v4l2_device: Print control ID in unknown type log messagge
When the type of a control enumerated from a V4L2 device is not
supported, we log a debug message that mentions the control type. This
makes it hard to figure out which control is faulty. Print the control
ID instead.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-15 22:33:26 +03:00
Laurent Pinchart
f391048a7b libcamera: utils: Add hex stream output helper
Add a utils::hex() function that simplifies writing hexadecimal values
to an ostream. The function handles the '0x' prefix, the field width and
the fill character automatically. Use it through the libcamera code
base, and add a test.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-15 16:49:55 +03:00
Laurent Pinchart
ce739e616c libcamera: ipa: Merge controls and v4l2controls in IPAOperationData
Now that the V4L2ControlList is merely a helper to construct a
ControlList for V4L2 controls, without any data member, all controls can
be transferred between pipeline handlers and IPAs using ControlList
only. Remove the v4l2controls member for IPAOperationData and use the
control member instead.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:57 +03:00
Laurent Pinchart
343978af0b libcamera: v4l2_device: Replace V4L2ControlList with ControlList
The V4L2Device class uses V4L2ControlList as a controls container for
the getControls() and setControls() operations. Having a distinct
container from ControlList will makes the IPA API more complex, as it
needs to explicitly transport both types of lists. This will become even
more painful when implementing serialisation and deserialisation.

To simplify the IPA API and ease the implementation of serialisation and
deserialisation, replace usage of V4L2ControlList with ControlList in
the V4L2Device (and thus CameraSensor) API. The V4L2ControlList class
becomes a thin wrapper around ControlList that slightly simplifies the
creation of control lists for V4L2 controls, and may be removed in the
future.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:51 +03:00
Laurent Pinchart
2fe723440a libcamera: v4l2_controls: Turn V4L2ControlInfoMap into a class
In preparation for extending V4L2ControlInfoMap with control idmap
support, turn it into a real class. Make it inherit from std::map<>
instead of wrapping it to keep the API simple.

V4L2ControlInfoMap is meant to be constructed with a set of control
info, and never modified afterwards. To ensure this, inherit from
std::map<> with private access specifier, and explicitly expose the
std::map<> methods that do not allow insertion or removal of elements. A
custom move assignment operator is implemented to allow efficient
construction of the V4L2ControlInfoMap.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:47 +03:00
Laurent Pinchart
90d0f193eb libcamera: v4l2_controls: Remove V4L2ControlInfo type field
The V4L2ControlInfo type field stores the V4L2 control type. It partly
duplicates the V4L2ControlInfo id().type() that stores the corresponding
libcamera control type. The two fields are not strictly identical, but
having two types doesn't provide us with any extra value. As this is
confusing, remove the V4L2ControlInfo type field.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:46 +03:00
Laurent Pinchart
c0dc218eb8 libcamera: v4l2_controls: Add V4L2ControlId
Add a V4L2 specialisation of the ControlId class, in order to construct
a ControlId from a v4l2_query_ext_ctrl. The V4L2ControlId is embedded in
V4L2ControlInfo, and thus needs to be copyable to allow for
V4L2ControlInfo to be passed to IPAs. The ControlId copy constructor and
assignment operators are thus restored, but made protected to avoid the
Control class being copyable.

This is needed in order to use ControlList for V4L2 controls, as
ControlList requires ControlId instances for all controls.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:45 +03:00
Laurent Pinchart
764ff6fdf3 libcamera: v4l2_device: Avoid copy of V4L2ControlInfo
The V4L2Device::listControls() method creates an instance of
V4L2ControlInfo and then inserts it in the device's list of controls.
The insertion uses std::map::emplace(), but passes the V4L2ControlInfo,
resulting in a copy being performed (using the copy constructor of
V4L2ControlInfo).

Optimise this by really constructing the V4L2ControlInfo in-place. The
use of std::piecewise_construct is required for gcc-5 that seems to have
trouble with std::map::emplace() on non-copyable values in this case.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:44 +03:00
Laurent Pinchart
abe2c1b55c test: v4l2_videodevice: Add V4L2 control test
Add a test that exercises the control enumeration, get and set APIs on a
V4L2Device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:37 +03:00
Laurent Pinchart
a1c6b2b641 libcamera: controls: Support accessing controls by numerical ID
The ControlList class has template get() and set() methods to get and
set control values. The methods require a reference to a Control
instance, which is only available when calling them with a hardcoded
control. In order to support usage of ControlList for V4L2 controls, as
well as serialisation and deserialisation of ControlList, we need a way
to get and set control values based on a control numerical ID. Add new
contains(), get() and set() overload methods to do so.

As this change prepares the ControlList to be used for other objects
than camera, update its documentation accordingly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:34 +03:00
Laurent Pinchart
576b8aa079 libcamera: controls: Store control name in ControlId
The ControlId class stores a pointer to the control name. This works
fine for statically-defined controls, but requires code that allocates
controls dynamically (for instance based on control discovery on a V4L2
device) to keep a list of control names in separate storage. To ease
usage of dynamically allocated controls, store a copy of the control
name string in the ControlId class.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:33 +03:00
Laurent Pinchart
a1772d44e8 libcamera: controls: Default ControlList validator argument to nullptr
The ControlList constructor takes a validator pointer that can be null.
Set its default value to nullptr to simplify code in users of
ControlList.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:32 +03:00
Laurent Pinchart
273b87c781 libcamera: controls: Add comparison operators for ControlValue
Add equality and non equality comparison operators for the ControlValue
class. This simplifies code that deals with control values.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:30 +03:00
Laurent Pinchart
33ee44dc16 libcamera: control_ids: Generate map of all supported controls
In order to deserialise a ControlList, we will need to lookup ControlId
instances based on their numerical ID. Generate a global map from the
controls definitions to support such a lookup.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:24 +03:00
Laurent Pinchart
5af6a1a012 libcamera: control_ids: Fix documentation for controls namespace
The controls namespace isn't documenting, making it impossible to
reference the variables it contains. Furthermore, within the
documentation page for the control_ids.h file, links from overview to
detailed variable documentation are broken for the same reason. Both
issues can be fixed by documenting the controls namespace.

Unfortunately doxygen then fails to parse the initialisers for the
controls global variables correctly and considers them as functions. To
work around this, modify the control_ids.cpp generation script to hide
the variables from doxygen, but still expose their documentation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:23 +03:00
Laurent Pinchart
4ebc7297e1 libcamera: pipeline: rkisp1: Avoid copy assignment of V4L2 control map
Use the std::map::emplace() method to avoid unnecessary creation of an
empty V4L2ControlInfoMap folled by a copy assignment.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-13 20:37:21 +03:00
Laurent Pinchart
f3c53dbf53 libamera: pipeline: rkisp1: timeline: Fix compilation with gcc-[56]
With gcc 5 and 6, insertion in a std::multimap copies the pair passed as
an argument to the insert() method. As the mapped type is a non-copyable
std::unique_ptr<>, this fails to compile.

Compilation with newer gcc versions succeed due to support for C++-17
and the fix described in https://cplusplus.github.io/LWG/issue2354. To
support gcc 5 and 6, fix the issue by using std::multimap::emplace().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-11 17:31:02 +03:00
Laurent Pinchart
8647991cd8 ipa: rkisp1: Avoid unnecessary copy
Use const references in a for loop to avoid an unnecessary copy.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-11 17:30:54 +03:00
Niklas Söderlund
0eb65e14e1 libcamera: pipeline: rkisp1: Attach to an IPA
Add the plumbing to the pipeline handler to interact with an IPA module.
This change makes the usage of an IPA module mandatory for the rkisp1
pipeline.

The RkISP1 pipeline handler makes use of a timeline component to
schedule actions. This might be useful for other pipeline handlers going
forward so keep the generic timeline implementation separate to make it
easy to break out.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-11 15:31:47 +02:00
Niklas Söderlund
bf0915a4e8 libcamera: ipa: rkisp1: Add basic control of auto exposure
Add an IPA which controls the exposure time and analog gain for a sensor
connected to the rkisp1 pipeline. The IPA supports turning AE on and off
and informing the camera of the status of the AE control loop.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-11 15:30:54 +02:00
Niklas Söderlund
97dce7a13f include: linux: Add rkisp1 kernel header and format definitions
Add kernel header and format definitions from v8 of the rkisp1 series
[1]. The driver is currently out of tree, the header file is not
exported as part of the standard kernel uAPI.

Headers have been exported on top of a v5.2 kernel tree using
scripts/headers_install.sh.

1. https://lore.kernel.org/linux-media/20190730184256.30338-1-helen.koike@collabora.com/

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-11 14:33:18 +02:00
Niklas Söderlund
5c35fa04d0 libcamera: ipa: Extend to support IPA interactions
The IPA interface needs to support interactions with the pipeline; add
interfaces to control the sensor and handling of request ISP parameters
and statistics.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-11 14:32:51 +02:00
Niklas Söderlund
f3022d91dc libcamera: request: Add metadata information
A new ControlList container is needed to hold metadata coming out of
the IPA. The list of supported controls in this list is expected to
grow, so for now do not add a validator for the list.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-10 21:39:53 +03:00
Niklas Söderlund
abee318ce8 libcamera: controls: Add AeLocked control
Add a control to report lock status of the Auto Exposure algorithm. The
idea is that if an AE algorithm is running the control shall be added to
the metadata control list.

If the AE algorithm is locked the value shall be set to true, if it's
converging it shall be set to false. If the AE algorithm is not running
the control shall not be present in the metadata control list.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-10 21:39:53 +03:00
Niklas Söderlund
914f9a7003 libcamera: controls: Add AeEnable control
Add a control to enable/disable Auto Exposure.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-10 21:39:53 +03:00
Niklas Söderlund
39ef1f32c1 libcamera: controls: Fix documentation of AwbEnable
Align the wording of the documentation for the AwbEnable control with
review comments for similar controls.

Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-10 21:39:53 +03:00
Niklas Söderlund
8eec5712c0 libcamera: pipeline: Move IPA from pipeline to camera data
The IPA acts on a camera and not on a pipeline which can expose more
then one camera. Move the IPA reference to the CameraData.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-10-10 21:39:53 +03:00
Jacopo Mondi
3a924ee250 test: ipa: Add test for the IPA Interface
Implement a basic test for IPA Interface using the VIMC dummy IPA
module. The test implements an out-of-band feedback channel between the
test and the dummy IPA module to verify the success of the IPA
interactions.

Test the only available operation defined by the IPA interface by
receiving a confirmation code on the fifo communication channel.

Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-08 15:37:15 +02:00
Jacopo Mondi
c86dc5e00e ipa: vimc: Add support for tracing operations
Add support to the dummy VIMC IPA for tracing operation by using a FIFO
channel that will be used by the IPA Interface test to verify
communications with the IPA.

At the moment only add support for the init() operation as it's the only
defined one.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-08 15:37:15 +02:00
Jacopo Mondi
ecbe309b06 ipa: meson: Give IPAs access to internal libcamera APIs
Open source IPA implementations can benefit from usage of libcamera
internal APIs. Allow this by compiling against the internal headers and
linking against libcamera.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-08 15:37:15 +02:00
Jacopo Mondi
b999161b7d test: ipa: Rename the ipa_test to ipa_module_test
Update the IPA test to match the test class name in prevision of adding
more IPA tests. Also update the description comment in the test unit, as
the old name for the test was still used.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-08 15:37:15 +02:00
Jacopo Mondi
4e51845a38 ipa: vimc: Rename ipa_dummy to ipa_vimc
The DummyIPA is actually a test IPA module for the virtual media
controller driver VIMC. Rename it accordingly to its usage.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-08 15:37:15 +02:00
Laurent Pinchart
c5d682a548 test: timer: Test start() with absolute deadline
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:20:16 +03:00
Laurent Pinchart
9d250417a2 libcamera: timer: Add start() method with absolute deadline
The Timer class is started using a timer duration. To help callers that
require waiting for an absolute deadline, add a start() overload that
takes a std::chrono::steady_clock::time_point value. This will be used
by IPAs.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:14:49 +03:00
Laurent Pinchart
ada18bf65a test: timer-thread: Test starting a timer from another thread
Timers can't be started from another thread. Ensure that attempting to
do so fails.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-07 06:02:24 +03:00
Laurent Pinchart
62e3357681 libcamera: timer: Forbid starting or stopping timer from another thread
Starting or stopping a timer from a different thread than the one it
belongs to is inherently racy. Disallow it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:02:23 +03:00
Laurent Pinchart
de5d7bfb41 libcamera: timer: Allow restarting a timer before expiration
The Timer API allows restarting a timer before expiration. This isn't
correctly implemented, fix it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-07 06:02:23 +03:00
Laurent Pinchart
dfe1d89441 test: timer: Test that a timer can be restarted before it expires
The Timer API allows restarting a timer before it expires. Add a
corresponding test. The test fails as the Timer class doesn't comply
with its API documentation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-07 06:02:23 +03:00
Laurent Pinchart
9c6794164d test: timer: Test that deadline() isn't reset upon time out
Verify that the timer deadline stays valid after the timer expires. As
the test now uses the deadline in order to compute the jitter, the
interval_ field isn't used anymore and can be removed.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:02:21 +03:00
Laurent Pinchart
36c35345fa libcamera: timer: Don't reset deadline after time out
Users of the Timer class may benefit from retrieving the timer deadline
after it times out. This is currently not possible as the deadline is
reset to 0 when the timer times out or is stopped. Fix this by not
resetting the deadline, and adding a new running_ field to the Timer
class to implement isRunning().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:02:19 +03:00
Laurent Pinchart
e85f42110f libcamera: timer: Remove the interval() method
The libcamera timers are single-shot timers. They are started with a
duration, but fire once only, not based on an interval. Remove the
interval concept by removing the interval() method, and rename other
occurences of interval to duration.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
2019-10-07 06:02:16 +03:00
Laurent Pinchart
ecf1c2e57b libcamera: controls: Use ControlValidator to validate ControlList
Replace the manual validation of controls against a Camera with usage of
the new ControlValidator interface.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-05 20:02:51 +03:00
Laurent Pinchart
f671d84ceb libcamera: Add ControlValidator implementation for Camera
Add a new CameraControlValidator class that implements the
ControlValidator interface for a Camera object.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-05 20:02:51 +03:00
Laurent Pinchart
aae2b5d666 libcamera: Add ControlValidator
The new abstract ControlValidator class defines an interface that will
be used by the ControlList class to validate controls. This will allow
controls to the validated against different object types, such as Camera
and V4L2Device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-05 20:02:51 +03:00