summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2023-01-16uvc-gadget v0.3.0HEADv0.3.0masterKieran Bingham
This release brings in some new support and features for UVC Gadget to operate with libcamera based cameras. - libcamera sources are now supported - Support for encoded streams - Software based MJPEG encoding is managed by the libcamera source only. Please be aware, that as part of this release, the existing V4L2 source option '-c' is renamed to '-d'. The new libcamera source is now supported by the option '-c' and can be selected by camera index, or explictly choosing the camera based on it's libcamera id. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2023-01-16lib/mjpeg_encoder: Add an MJPEG encoder for YUV420 dataDaniel Scally
MJPEG is an extremely useful format given its compression allows high framerates even over limited bandwith USB connections. Add an MJPEG encoder class that converts YUV420 data into MJPEG data. Where a libcamera-source does not support MJPEG natively, convert YUV420 into MJPEG if the user tries to set MJPEG format. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16lib/stream: Add and handle new VIDEO_SOURCE_ENCODED typeDaniel Scally
Add functions to handle a new entry into video_source_type, representing data with an encoding step between the source and sink. When running through this route, buffers are allocated and mmaped on both the source and the sink, then imported to the source to be filled before being queued to the sink. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16lib/video-source: Add video_source_import_buffersDaniel Scally
We need to be able to place encoded data into the sink device's bufs. To facilitate that add a video_source operation that allows the source to import buffers from the sink. Add a .import_buffers() callback so that the libcamera-source can access a sink's buffers. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16lib: Add video_source_type enumerationDaniel Scally
Add an enum to struct video_source that details the type of source we're dealing with. This will be used to make decisions about buffer allocation and handling in a more explicit way. Use the video_source_type associated with a video_source to decide on the appropriate allocation function and buffer handler at stream on time. This is a more explicit method than relying on the presence of the .alloc_buffers op and allows more flexibility. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16main: Provide a libcamera sourceKieran Bingham
Allow callers to create a libcamera source when available. libcamera support is optional, so conditionally compile the new options depending on whether libcamera is available. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16libcamera: Add new libcamera sourceDaniel Scally
Provide the integration of a libcamera source within uvc-gadget. This adds C++ support to the project and adds libcamera as an optional external dependency. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2023-01-16main: Rename V4L2 option to 'd'Kieran Bingham
Use the option 'd' to specify a v4l2 capture device. This will free up the use of option 'c' for 'camera' identifiers based on libcamera. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2023-01-12uvc-gadget v0.2.0v0.2.0Kieran Bingham
This release extends UVC Gadget with the ability to provide a 'slideshow' source. This can assist in the testing of performance and capabilities of a UVC Gadget based device, by providing a known set of data frames and configurations to stream to the host. Further more this release contains: - lib/timer: Add timer infrastructure - lib/jpg-source: Constrain fps These allow sources with out a controlling device to be configured to deliver at the rate requested by the host. Finally, the Makefile 'helper' is fixed to correctly call the install target in ninja. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-12-06main: add support for slideshow_sourcePaul Elder
Add facilities in main() to allow selection and usage of slideshow_source. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
2022-12-06slideshow-source: add slideshow source classPaul Elder
The slideshow_source class is an implementation of the video_source class that streams a set of images as video. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
2022-12-06list: Add list_next_entry()Daniel Scally
Lists are useful for more than just iteration! Add a macro to fetch just the next item in the list. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-30Makefile: Fix install targetKieran Bingham
Fix the install target to supply the correct call to ninja, and ensure that it is marked as a phony target to prevent conflicts with any local files or directories of the same name. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-30lib/jpg-source: Constrain fpsDaniel Scally
As written the fps output by the jpg-source is unconstrained; it will simply fill buffers as quickly as the USB subsysem can handle them. This is not particularly realistic and also means that the frame rates configured (and thus expected) by the host are not being adhered to. Use the new timer infrastructure to slow down the buffer fill operation such that the frame rates seen match those configured by the host. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-30lib/timer: Add timer infrastructureDaniel Scally
Some sources simply fill the buffers passed by the USB subsystem and return them as quickly as possible. Particularly with compressed formats operating at superspeed this rapidly results in unrealistic frame rates. Add infrastructure that allows us to define a specific framerate and introduce blocking calls that constrain those sources to the framerates expected by the host. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-25uvc-gadget v0.1.0v0.1.0Kieran Bingham
This release culminates being able to integrate many historical changes and updates that we had pending for quite some time along with some bugfixes and clean ups. Key new features already added to this release include: - SuperSpeed descriptor support - MJPEG support fixes - Update to support new gadget locations - Conversion to Meson build infrastructure - A new test pattern source generator - Support for JPEG sources - Improved logging - Commencement of control support Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-25scripts: Provide a release scriptKieran Bingham
Support making releases of uvc-gadget by introducing a helper script which will facilitate the increment of any release version, along with generating an associated tag, derived from the equivalent implementation in libcamera [0]. [0] https://git.libcamera.org/libcamera/libcamera.git/tree/utils/release.sh?h=v0.0.2 Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-25scripts: semver: Add version helperKieran Bingham
Provide the semver utility (version 3.4.0) from [0] to make use of it with our versioning and release scripts. [0] https://raw.githubusercontent.com/fsaintjacques/semver-tool/3c76a6f9d113f4045f693845131185611a62162e/src/semver Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22lib: uvc: Respond to control requests with dummy valuesDaniel Scally
Without a response, the host will assume there has been an error and throw a bunch of errors. The noise of those errors makes it difficult to see what's going on properly, so return a dummy response that silences the errors until the functionality is properly implemented. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22lib: uvc: Add control names in output printsDaniel Scally
It's easier to see what's going on at a glance when the output is human-readable, so replace the control codes with their names. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22lib: uvc: Drop maxsizeDaniel Scally
The maxsize field of struct uvc_device is probably unecessary even if it weren't currently fixed at 0. It's used to set dwMaxVideoFrameSize in addition to the sizeimage member of a struct v4l2_pix_fmt (multiplied in the latter instance by 1.5x). The documentary definitions for those two values are such that they should be identical though, so simply set dwMaxVideoFrameSize to width*height*2 (to maintain commonality with other UVC Video devices) and use that to set the sizeimage. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22lib: events: Use list_for_each_entry() instead of the _safe() versionDaniel Scally
For the UVC_EVENT_STREAMOFF event, the callback frees _other_ events because it's closing down the pipe. The use of the _safe() version of the list iterator results in a use-after-free of those events because they're fetched before the callback that frees them. The _safe() version is unecessary here; no other callback's behaviour requires it. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22main: add support for jpg_sourcePaul Elder
Add facilities in main() to allow selection and usage of jpg_source. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22jpg-source: add jpg source classPaul Elder
The jpg_source class is an implementation of the video_source class that streams a still jpg image as video. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22main: add default option to use test-sourcePaul Elder
Now that we have test-source which provides video by generating a test pattern in userspace, allow its selection in the command line options. Since it isn't backed by anything, it is set as the default video source if nothing else is specified. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22test-source: add test source classPaul Elder
The test_source class is an implementation of the video_source class that generates a test pattern in userspace to provide video. We have some operations which are implemented as no-ops. To quiet the compiler warnings this causes, flag their arguments as unused. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22v4l2: write size value when dequeueing bufferPaul Elder
When we dequeue a buffer from a V4L2 device, it would be good to know the size of the buffer. Save it to our struct video_buffer when dequeueing. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22v4l2: populate video_buffer mem field at dequeuePaul Elder
Our v4l2_queue_buffer and v4l2_dequeue_buffer functions give us a wrapper around the raw V4L2 ioctls with a wrapper struct video_buffer around the raw struct v4l2_buffer. The problem is that the video_buffer's mem field is never populated, so there's no way to access the mem that the buffer refers to given only the buffer. Populate the video_buffer's mem field at v4l2_dequeue_buffer based on the dequeued v4l2 buf's index. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22stream: allow buffers to be allocated on uvc sidePaul Elder
We want to allow video sources whose data is generated in userspace. Currently buffers are allocated on the V4L2-backed video source and exported to the uvc-gadget's V4L2 device. Since a video source with data generated in userspace will not be backed by a V4L2 device, we allow a way for buffers to be allocated on uvc-gadget's V4L2 device. As a corollary, the way the buffers are passed has to be changed as well. Previously they were queued and dequeued between the V4L2 video source and uvc and vice versa. To allow a video source not backed by a V4L2 device, we allow an alternative flow where they are dequeued and queued from and to uvc, and giving a chance to the video source to fill the buffer in between. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22video-source: add fill_bufferPaul Elder
We are preparing to allow video sources whose data is generated in userspace. To this end, add a fill_buffer function to video_source. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22Makefile: Provide a make wrapper around mesonKieran Bingham
Provide a convenience wrapper around the build system to allow auto-complete and simply targets. 'make help' will report the available options. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22meson: Convert CMake to Meson build infrastructureKieran Bingham
Provide infrastructure to be able to build the uvc-gadget library as a shared object and an executable which links against this as a dependency to implment the reference 'uvc-gadget' application. All existing cmake infrastructure is removed. This removes custom glob support that was previously used by an early development for Android, which is expected to be re-added later when required. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22main/lib: mark unused variablesKieran Bingham
Bringing in the meson infrastructure will enable extra warnings, including -Wunused... Directly reference the two locations that have known unused arguments. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22src: Move main to srcKieran Bingham
Move the main uvc-gadget application to src/ to make it clear there is a separation between library and application code. Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-22scripts: Add gen-version.shKieran Bingham
Import the gen-version.sh helper script from libcamera [0] [0] https://git.libcamera.org/libcamera/libcamera.git/tree/utils/gen-version.sh?h=v0.0.1 Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-11-17main: reorganize usage printPaul Elder
Minor changes to the -h usage output. Reorder the input and the help option printing, and make the example usages use argv0. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
2022-11-17uvc-gadget.sh: Add additional frame sizes for MJPEG formatDaniel Scally
Add a new frame describing a 640x480 frame size, and 640x360 frame size for MJPEG format. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-17lib: configfs: Use wildcard in path to gadget deviceDaniel Scally
At some point the kernel has been updated to include a .id descriptor in the gadget directory name - add that to uvc_find_video_device() so that the video node is located properly. Rather than hardcode a specific gadget (for instance with device name gadget.0) use a wildcard. This has the advantage of backwards compatability with older kernels that did not use the ID as part of the device name, though still limits us to supporting scenarios where only a single gadget is bound to the UDC. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-17lib: v4l2: Set sizeimage during v4l2_set_format()Daniel Scally
videobuf2 relies on the sizeimage field to calculate buffer size when the format is MJPEG, because the bytes-per-line calculation is missing. Fill in that field as part of v4l2_set_format() so the API works correctly. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2022-11-17uvc-gadget.sh: Add class descriptors for SuperSpeedDaniel Scally
Create Super speed streaming class descriptor during create_uvc() Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
2019-05-02uvc-gadget.sh: add mjpegPaul Elder
Add MJPEG configfs setup to uvc-gadget.sh. In order to get it to work, I had to add another two parameters to create_frame() to specify the format (uncompressed vs mjpeg) and to specify the format descriptor name. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-05-02configfs: parse mjpeg streaming formatPaul Elder
The MJPEG descriptor does not have a guidFormat, and so configfs doesn't have it either, but we currently error out if there is no guidFormat. To fix this, extract the stream type part of the real path, and if it is MJPEG then hardcode it, otherwise read the guid if it is uncompressed. This does mean that in configfs the MJPEG format descriptor path must be "mjpeg" for this to work, though this is already guranteed by configfs. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-02-14gitignore: replace all entries by build directoryPaul Elder
The official build instructions mandate usage of out-of-tree builds in the build subdirectory. Replace the list of generated files in .gitignore with just the build directory. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> [Remove all other .gitignore entries] Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-02-14cmake: enable C warning flagsPaul Elder
The C flags for warning were present but commented out. Uncomment them to enable them. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-02-06uvc: reply with max frame rate in response to UVC_GET_MAXPaul Elder
Previously, the interval rate that would be selected and replied to the host in response to UVC_GET_MAX, UVC_GET_MIN, and UVC_GET_DEF were all the same and were the first interval rate. Assuming the interval rates are sorted in ascending order, this means that UVC_GET_MAX would always yield the minimum interval rate. Modify the call to uvc_fill_streaming_control such that UVC_GET_MAX will yield the maximum interval rate. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2019-02-06stream, uvc: add uvc_stream_set_frame_ratePaul Elder
We would like to be able to set the frame rate of the video source of a stream. This patch adds such a function to set the source's frame rate from the stream. The frame rate is set right after the format is set. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2019-02-06v4l2-source: implement set_frame_rate opPaul Elder
Implement the video source op set_frame_rate for v4l2-source video source. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2019-02-06video-source: add video_source_set_frame_ratePaul Elder
We would like to be able to set the frame rate for video sources. This patch adds a set_frame_rate op for video sources, along with a wrapper to call video sources' set_frame_rate functions. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2019-02-06v4l2: add v4l2_set_frame_ratePaul Elder
We would like to be able to set the frame rate of video sources. This patch adds such a function for v4l2-based video sources to use. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2018-08-31main: Initialise stream object to NULLKieran Bingham
If the capture device fails to load the default cleanup path will be taken. This error path relies on objects either existing or being set to NULL. Ensure that the stream pointer is initialised to prevent segfaults on the error path. Fixes: 1b8f9204db68 ("stream: Use abstract video sources") Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reiewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>