summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2022-07-23libcamera: v4l2_videodevice: Reintroduce toV4L2PixelFormat()Jacopo Mondi
This is a partial revert of commit 395d43d6d75b ("libcamera: v4l2_videodevice: Drop toV4L2PixelFormat()") The function was removed because it incorrectly maps non-contigous V4L2 format variants (ie V4L2_PIX_FMT_YUV420M) to the API version supported by the video device (singleplanar API and multiplanar API). It was decided at the time to remove the function and let its users call directly V4L2PixelFormat::fromPixelFormat() which accepts a 'multiplanar' flags. As we now aim to associate multiple V4L2PixelFormat to a single libcamera format, it is necessary to verify which of them is actually supported by the video device. Hence re-introduce V4L2VideoDevice::toV4L2PixelFormat() and convert all the V4L2PixelFormat::fromPixelFormat() users to use it. The V4L2 compatibility layer is the only outliner as it doesn't have a video device to poke, hence it still uses V4L2PixelFormat::fromPixelFormat() and defaults to the first format. Next patches will implement the device format matching logic and handle the non-contiguous plane issue in V4L2VideoDevice::toV4L2PixelFormat(). Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-23libcamera: v4l2_pixelformat: Return a format list in fromPixelFormat()Jacopo Mondi
As we prepare to associate multiple V4L2 FourCC to a single libcamera format, make the V4L2PixelFormat::fromPixelFormat() return a list of formats and convert all its users to pick the first one. This change prepares to re-introduce V4L2VideoDevice::toV4L2PixelFormat() which will instead match the list of V4L2 FourCC against the formats supported by the video device. While at it, reword the V4L2PixelFormat::fromPixelFormat() documentation to distinguish between planar/multiplanar and contiguous/non-contiguous. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-23libcamera: formats: Search PixelFormatInfo on multiple formatsJacopo Mondi
The PixelFormatInfo::info(const V4L2PixelFormat &format) function returns the PixelFormatInfo associated with a V4L2 pixel format. As we prepare to associate multiple V4L2 formats to a single PixelFormatInfo rework the function to search the given V4L2 format in a list. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-23libcamera: formats: Support multiple V4L2 pixel formatsJacopo Mondi
Associate a list of V4L2PixelFormat entries to a libcamera Format in the PixelFormatInfo. This change prepares for supporting through a single libcamera Format devices which use different but equivalent versions of the same format, like V4L2_PIX_FMT_MJPEG and V4L2_PIX_FMT_JPEG. Change the existing users to always use the first entry to not break the build. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-22qcam: assets: shader: bayer_8.frag: Add precisionKunal Agarwal
The OpenGL ES shading language has no default precision declared implicitly for floats in fragment shaders. The lack of an explicit default precision results in shader compilation errors. Specify a default precision of mediump for floats. This matches the other fragment shaders, and is guaranteed by the OpenGL ES shader language specification to be supported by all devices, while the higher precision highp is optional. Signed-off-by: Kunal Agarwal <kunalagarwal1072002@gmail.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-22ipa: rkisp1: Transfer queueRequest() call to each algorithmFlorian Sylvestre
Implement rkisp1 queueRequest() function to update each algorithm with user controls. Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-22ipa: libipa: algorithm: Add queueRequest() to the Algorithm classFlorian Sylvestre
Add queueRequest() function to the Algorithm class. The queueRequest() function provides controls values coming from the application to each algorithm. Each algorithm is responsible for retrieving the controls associated to them. Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-22pipeline: raspberrypi: Improve image/embedded buffer matching logicNaushir Patuck
The logic used to match asynchronous image and embedded buffers was being overly aggressive by possibly allowing an unmatched image buffer to be sent to the IPA if the matching embedded buffer had not yet been dequeued. This condition only occurs when the system is heavily loaded and dropping frames. Fix this by holding image buffer in the queue during these conditions until the next embedded buffer dequeue event. Reported-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Tested-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-21libcamera: pipeline: simple: converter: Handle unsupported input formatXavier Roumegue
SimpleConverter::formats() should return an empty vector if the input format is not supported by the converter. Signed-off-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-20ipa: rkisp1: Drop unnecessary forward declarations and includesLaurent Pinchart
Forward declarations of IPACameraSensorInfo and inclusion of linux/rkisp1-config.h are not needed in headers that use them only for arguments to functions defined by the Algorithm base class, as inclusion of algorithm.h will bring the necessary declarations for function arguments. Drop them. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Florian Sylvestre <fsylvestre@baylibre.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20libcamera: controls: Suppress error message from ControlList::get()Naushir Patuck
Now that ControlList::get() returns a std::optional<T> to handle missing controls, the error log message in the call to ControlList::find() is unnecessary and likely invalid. Fix this by avoiding the call to ControlList::find() from ControlList::get() and replacing with a call to the underlying std::unordered_map::find(). Fixes: 1c4d48018505 ("libcamera: controls: Use std::optional to handle invalid control values") Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-20libcamera: controls: Drop ControlList::contains()Laurent Pinchart
The ControlList::contains(const ControlId &id) function isn't used, as it has been replaced by usage of the get() function. Document get as being the preferred way to check for the presence of a control in a ControlList, and drop the contains() function. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20test: control_list: Use get() to test for control presenceLaurent Pinchart
Now that the ControlList::get() function returns an std::optional<>, it is the preferred way to test if a control is present in a ControlList. Use it in the test to prepare for removal of ControlList::contains(). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20licamera: controls: Update ControlList::get() documentationLaurent Pinchart
The ControlList::get(const Control<T> &ctrl) function has been modified in commit 1c4d48018505 ("libcamera: controls: Use std::optional to handle invalid control values") to return an std::optional<>, but its documentation wasn't updated. Fix it. Fixes: 1c4d48018505 ("libcamera: controls: Use std::optional to handle invalid control values") Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20licamera: controls: Drop unnecessary template qualifiers in documentationLaurent Pinchart
The doxygen document blocks of various ControlList function qualify functions with full template and return type specification. This isn't needed, and the extra verbosity makes the documentation blocks more difficult to read. Drop the template qualifiers and return types. The generated documentation is not affected. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20libcamera: Remove extra ':' after '\todo'Laurent Pinchart
The doxygen '\todo' directory doesn't need to be followed by a colon, yet a few strayed occurrences have made their way in. Fix them. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-20pipeline: rkisp1: Support devices without self pathPaul Elder
Some hardware supported by the rkisp1 driver, such as the ISP in the i.MX8MP, don't have a self path. Although at the moment the driver still exposes the self path, prepare the rkisp1 pipeline handler for when the self path will be removed for devices that don't support it. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-19gstreamer: Be pedantic on srcpads accessUmang Jain
Use the std::vector::back() instead of [0] index which corresponds to std::vector::push_back() for tracking of pads. This doesn't introduce a functional change as the gst_libcamera_src_init() will only add one pad but it helps with readability. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-19utils: ipu3-pack: Provide a 10-bit bayer packing utilityUmang Jain
Provide a 10-bit bayer packing utility for the unpacked data produced by ipu3-unpack. Usage: ipu3-unpack input-file output-file The output-file can be "-" to pack the data to stdout. The output file generated by ipu3-pack can be directly fed to IMGU for streaming. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-19libcamera: controls: Avoid double lookupsLaurent Pinchart
Now that the ControlList::get() function returns an instance of std::optional<>, we can replace the ControlList::contains() calls with a nullopt check on the return value of get(). This avoids double lookups of controls through the code base. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-19libcamera: controls: Use std::optional to handle invalid control valuesChristian Rauch
Previously, ControlList::get<T>() would use default constructed objects to indicate that a ControlList does not have the requested Control. This has several disadvantages: 1) It requires types to be default constructible, 2) it does not differentiate between a default constructed object and an object that happens to have the same state as a default constructed object. std::optional<T> additionally stores the information if the object is valid or not, and therefore is more expressive than a default constructed object. Signed-off-by: Christian Rauch <Rauch.Christian@gmx.de> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-18qcam: viewfinder_qt: Support X RGB variantsKieran Bingham
Support the X variants of the RGB pixel formats alongside the equivalent Alpha component based versions. The QImage::Format_RGB32 and QImage::Format_RGBX8888 formats only specify that the alpha component must be 0xff. While the Qt documentation doesn't guarantee that the alpha value will be ignored by consumers, this seems to be the implemented behaviour, at least when rendering with QPainter::drawImage(). The existing use of QImage::Format_RGBA8888 is updated to use the QImage::Format_RGBX8888 variant to ensure that the image data is visible. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-18qcam: format_converter: Support X RGB variantsKieran Bingham
Support the X variants of the RGB pixel formats along side the equivalent Alpha component based versions. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-18qcam: viewfinder_qt: Fix include ordersKieran Bingham
Update the header orders to match the code style as decreed by clang-format. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-18qcam: main_window: Fix include orderingKieran Bingham
Fix the sort order of the Qt headers to match the expected sort order from clang-format. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-18libcamera: raspberry: Fix format validationJacopo Mondi
If the pixel format gets adjusted to the default NV12 format during validation, it gets currently ignored and the user-supplied format is used nonetheless. Fix it by using the adjusted pixel format. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-15cam: sdl: Use uint32_t in place of SDL_PixelFormatEnumJacopo Mondi
The SDL_PixelFormatEnum type has been introduced in libsdl by 1a4c0d4e17e6 ("Fixed bug 4377 - SDL_PIXELFORMAT enum is anonymous, which prevents its use in a templated function") which is only available after release 2.0.10 of the library. Debian 10 ships libsdl at version 2.0.9 and building cam with sdl support there fails with error: ./src/cam/sdl_texture.h:27:8: error: ‘SDL_PixelFormatEnum’ does not name a type; did you mean ‘SDL_PixelFormat’? Fix that by using the base type uint32_t in place of SDL_PixelFormatEnum. Reported-by: https://buildbot.libcamera.org/#/builders/6/builds/355 Fixes: 11554a259f4e ("cam: sdl_sink: Add SDL sink with initial YUYV support") Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Eric Curtin <ecurtin@redhat.com>
2022-07-15utils: rkisp1: Support optional CSI-2 receiver subdevLaurent Pinchart
The media graph may include a CSI-2 receiver entity between the sensor and the ISP for platforms that have a CSI-2 receiver external to the ISP. Support this by configuring the pipeline accordingly. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-15utils: rkisp1: Fix pixel format for raw captureLaurent Pinchart
The regexp to convert the raw pixel media bus code to a pixel format is incorrect. Fix it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-15utils: rkisp1: Fix sensor format parsingLaurent Pinchart
With sensors supporting crop, the regexp used to parse the media-ctl output isn't correct as the pad configuration may span multiple lines and contain other parameters. Fix it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-15utils: rkisp1: Remove frames before starting captureLaurent Pinchart
Delete frames previously captured before starting a new capture, to avoid mixing old and new frames. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-14pipeline: raspberrypi: Fix incorrect advertising of ScalerCropNaushir Patuck
The controls::ScalerCrop in the ControlInfoMap was advertised based on the ISP output Rectangle. This is incorrect, it needs to be set based on the sensor analogue crop Rectangle. Fix this. Additionally, do not use emplace to be consistent with the other controls set in the ControlInfoMap. Fixes: 9dacde0d651d (pipeline: raspberrypi: Advertise ScalerCrop from the pipeline handler) Reported-by: David Plowman <david.plowman@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Tested-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-14pipeline: rkisp1: Support media graph with separate CSI RXPaul Elder
The rkisp1 hardware supports both a CSI-2 input and a parallel input, where the sensor is connected directly to the ISP. On RK3399, the CSI-2 receiver is internal, but on the i.MX8MP, the CSI-2 receiver is a separate IP core, connected to the parallel input of the ISP, and gets exposed to userspace as a V4L2 subdev. To prepare for this, handle an optional CSI-2 receiver subdev in the pipeline. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-13utils: ipu3-unpack: Fix error stringUmang Jain
Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-13libcamera: base: Suppress clang-11 compile error on ARM32Naushir Patuck
Compiling backtrace.cpp for ARM32 produces the following error with the clang-11 (and later) compiler: -------------------- ../src/libcamera/base/backtrace.cpp:195:12: error: use of SP or PC in the list is deprecated [-Werror,-Winline-asm] int ret = unw_getcontext(&uc); ^ /usr/include/arm-linux-gnueabihf/libunwind-common.h:114:29: note: expanded from macro 'unw_getcontext' ^ /usr/include/arm-linux-gnueabihf/libunwind-arm.h:270:5: note: expanded from macro 'unw_tdep_getcontext' "stmia %[base], {r0-r15}" \ ^ <inline asm>:1:2: note: instantiated into assembly here stmia r0, {r0-r15} -------------------- Suppress this compilation error with a clang-specific pragma around the offending statements. Further information about this error can be found at https://github.com/dotnet/runtime/issues/38652 Bug: https://bugs.libcamera.org/show_bug.cgi?id=136 Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Tested-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Naushir Patuck <naush@rasbperrypi.com> Tested-by: Naushir Patuck <naush@rasbperrypi.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-07meson: Correctly pass the global include to the compilerEli Schwartz
It's not safe to assume `-include config.h` works, since this depends on the functionality of the compiler that the cwd when running the compiler is searched first. When libcamera is included as a Meson subproject, the cwd of the compiler is the cwd of the main project, not of libcamera's build dir, and thus cannot be found. Instead, pass the include filename as a path based on the current build dir. Signed-off-by: Eli Schwartz <eschwartz93@gmail.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-06utils: raspberrypi: ctt: load_image: Ignore JPEG files with no raw dataWilliam Vinnicombe
The load_image function would throw errors with JPEG or JPG files containing no raw data. Prevent throwing these errors by returning 0 if an error has occurred. Signed-off-by: William Vinnicombe <william.vinnicombe@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-06test: delayed_controls: Remove sequenceOffsetJacopo Mondi
Commit 6f539a6d2fa9 ("delayed_controls: Remove reduandant firstSequence_") removed support for frame number start offset from the DelayedControls class, as it is now guaranteed that the first sequence number as it comes from the V4L2VideoDevice will always be 0. However the delayed_controls.cpp unit still has two tests that passes a non-zero first sequence number to the DelayedControl class, causing the test to spin forever and consequentially fail. Remove the two tests from the unit to fix this. The first removed test was testing the class against frame start sequence numbers greater than zero and can safely be removed. The second test was instead validating the class against sequence number overflow, which is now not possible to test anymore as the DelayedControls class now assumes 0 as first frame sequence number. Fixes: 6f539a6d2fa9 ("delayed_controls: Remove reduandant firstSequence_") Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-05libcamera: camera: Reset request sequence number on stop/startUmang Jain
We now have V4L2VideoDevice ensuring that sensor sequence numbers start from zero [1], and we desire that these should match the Request sequence number as well. [1] 1c9dc0fd89cf ("libcamera: v4l2_videodevice: Identify non-zero stream starts") Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-05delayed_controls: Remove reduandant firstSequence_Kieran Bingham
The DelayedControls implementation tracked the sequence numbers to determine the offset if a device did not commence with a sequence number of 0. This guarantee is now handled by the V4L2VideoDevice. Remove the firstSequence_ offset and the corresponding running_ flag which was used to track setting firstSequence_ from the DelayedControls. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-07-04gstreamer: Fix race conditions in task pause/resumeLaurent Pinchart
The task run function races with two other threads that want to resume the task: the requestCompleted() handler and the buffer-notify signal handler. If the former queues completed requests or the latter queues back buffers to the pool, and then resume the task, after the task run handler checks the queues but before it attemps to pause the task, then the task may be paused without noticing that more work is available. The most immediate way to fix this is to take the stream_lock in the requestCompleted() and buffer-notify signal handlers, or cover the whole task run handler with the GstLibcameraSrcState lock. This could cause long delays in the requestCompleted() handler, so that's not a good option. Instead, pause the task unconditionally at the beginning of its run function, and track while processing buffers and requests if the task needs to be resumed. It may also get resumed externally by the buffer-notify signal handler or the request completion handler, which are guaranteed not to race due to the lock taken by the gst_task_pause() and gst_task_resume() functions. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
2022-07-04gstreamer: Split completed request processing to a separate functionLaurent Pinchart
Simplify the task run function futher by moving the processing of completed requests to a separate function. No functional change intended, only increased readability. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Split request creation to a separate functionLaurent Pinchart
In order to prepare for creation and queuing of multiple requests, move the request creation and queueing code to a separate function. No functional change intended. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Fix pads lockingLaurent Pinchart
The srcpads_ vector is protected by two different locks, the GstObject lock of the libcamerasrc element, and the stream_lock that covers the run function of the thread. This isn't correct. Use the stream_lock consistently to protect the pads. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Use dedicated lock for request queuesLaurent Pinchart
Add a new lock to the GstLibcameraSrcState class to protect the queued and completed requests queues. This replaces the GstObject lock, and minimizes the lock contention between the request completion handler and the task run handler as the former must run as fast as possible. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Combine the two pad loops in the task run handlerLaurent Pinchart
This simplifies the code, and allows removing the internal queue in the GstLibcameraPad object. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Handle completed requests in the libcamerasrc taskLaurent Pinchart
Move the request wrap to a completed queue in the request completion handler to move more of the request completion processing to the libcamerasrc task. This lowers the amount of time spent in the completion handler, and prepares for reworking the usage of locks. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Rename queued requests queue to queuedRequests_Laurent Pinchart
To prepare for the addition of a completed requests queue, rename the existing queued requests queue from requests_ to queuedRequests_. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Move timestamp calculation out of pad loopLaurent Pinchart
The buffer pts and the pad latency are computed from the framebuffer timestamp, separately for each pad. Use the sensor timestamp provided through the request metadata instead, to compute the values once outside of the pads loop. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-04gstreamer: Pass Stream to RequestWrap::addBuffer()Laurent Pinchart
For symmetry with RequestWrap::removeBuffer(), pass the Stream pointer to addBuffer(). This handles streams at the GstPad level instead of the GstBuffer level, which allows making the GstLibcameraPool API a bit cleaner by removing the gst_libcamera_buffer_get_stream() helper function. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>