summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
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>
2018-07-31lib: configfs: Detect configfs mount pointKieran Bingham
Parse /proc/mounts to identify the correct mount location of the ConfigFS filesystem. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: Compile custom glob() implementation for AndroidPaul Elder
The Android C library doesn't provide the glob() function which we use in the configfs code. Add conditional compilation to cmake such that a local copy of glob is automatically compiled if glob isn't provided. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: glob: Fix compilation on AndroidLaurent Pinchart
The glibc glob() implementation doesn't compile on Android due to missing support for getlogin_r (before Android ABI 28) and to missing __THROW, __THROWNL and __attribute_noinline__ macros. getlogin_r is only used to implement support for the '~' path component which we don't use in the uvc-gadget library, so we can compile it out. The three macros can safely be defined as no-op. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: glob: Fix compilationLaurent Pinchart
The glibc glob() implementation seems to be meant to be compilable outside of glibc, but that clearly hasn't been tested for some time. Fix compilation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: Import glob.c from glibc 2.26Laurent Pinchart
The Android libc implementation (bionic) doesn't provide the glob() function. To enable compilation of the UVC gadget library for Android, import the glibc glob() implementation. The glob.c and glob.h files are imported unmodified to ease copyright management, even if they don't compile as-is. Compilation will be fixed separately. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-07-31lib: configfs: Globalize nested configfs callback functionsPaul Elder
Android now uses clang as the default C compiler, and gcc support is deprecated. clang doesn't support nested functions, which were used to implement callback functions in the ConfigFS code. We thus move the callbacks to the global scope. 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>
2018-07-31lib: configfs: Fix asprintf return value usageKieran Bingham
The asprintf function returns -1, and leaves the first parameter undefined in case of an allocation error. This conflicts with the code's assumption that the parameter is set NULL on error. Check all return values of asprintf, and ensure that the string parameter is not used as a return value on error paths. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12uvc: check ioctl return value for errorPaul Elder
There is code that is meant to check for the error of an ioctl, but the return variable that it checks isn't actually assigned from the ioctl. Assign the return value before checking it. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> [Fixed error message] Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Add README.md fileLaurent Pinchart
Start by adding short build instructions. The documentation should be expanded later. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Import the g_uvc.h header from the kernel sourcesLaurent Pinchart
In order to avoid depending on an external kernel source tree recent enough to provide the g_uvc.h header, import in the the project. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12lib: Relicense code under the LGPL-2.1+Laurent Pinchart
To allow usage of the UVC gadget library in closed-source or otherwise GPL-incompatible applications, relicense the library under the terms of the LGPL v2.1 or later, as published by the Free Software Foundation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Update copyright dates and ownerLaurent Pinchart
Ideas on Board SPRL, the original copyright owner of the UVC gadget application code, has been dissolved. All company copyrights have been transferred to Laurent Pinchart. Update the copyright notices to accordingly. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Use SPDX headersLaurent Pinchart
Replace the boilerplate copyright headers with an SPDX header to ease license compliance. This doesn't change the license of any of the files. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-12Split UVC gadget into a library and test applicationLaurent Pinchart
Split the project into a UVC gadget library and a test application. To avoid rolling out a custom build system, switch to CMake. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Fix file description headerLaurent Pinchart
The file description came from a bad copy&paste, fix it. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Make uvc_device structure opaqueLaurent Pinchart
The internals of the uvc_device structure should not be accessed outside of uvc.c. The only existing need to access the structure internals is in stream.c, where access to the UVC V4L2 device is needed. To avoid that, create an accessor function uvc_v4l2_device(), and make the structure private. Ideally the UVC V4L2 device should not be exposed. This can be achieved by creating an abstract video sink class to handle the UVC video sink. This is however out of scope for now. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Use abstract video sourcesLaurent Pinchart
Replace the manual V4L2 capture implementation by an abstract video_source, provided by the user of the UVC stream. Removes any knowledge of the video source internals from the uvc_stream class, allowing usage of different source types. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09Makefile: Suppress unused parameter warningsLaurent Pinchart
When implementing callback APIs, it is common to not use some of the parameters to the callback functions. Instead of requiring the user of the callback to annotate unused parameters manually, suppress the warning. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09v4l2-source: Add V4L2 source classLaurent Pinchart
The v4l2_source class is an implementation of the video_source class that uses a V4L2 capture device to provide video. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09video-source: Add abstract video source classLaurent Pinchart
The video_source is an abstract class representing a source of video buffers. It can be subclassed by implementing the video_source_ops operations to support different types of video sources. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09v4l2: Extract video buffer structure to separate fileLaurent Pinchart
The v4l2_video_buffer structure describes a video buffer. It is used by the v4l2_device class only, but isn't otherwise tied to V4L2. To prepare for non-V4L2 video sources, extract it to a separate file and rename it to video_buffer. At the same time, add a new video_buffer_set structure to represent as set of video buffers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Initialize the maxsize field internallyLaurent Pinchart
The uvc_device maxsize field is initialized in stream.c, requiring access to the uvc_device internals. Move its initialization to uvc.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Add API to set video formatLaurent Pinchart
Add a uvc_setformat() function to set the format for the UVC video stream instead of accessing the internals of the uvc_device in stream.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Add API to set function configurationLaurent Pinchart
Add a uvc_set_config() function to set the UVC function configuration instead of accessing the internals of the uvc_device in stream.c. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: Make the uvc_stream structure opaqueLaurent Pinchart
The internals of the uvc_stream structure don't need to be accessed outside stream.c. Move the structure definition from stream.h to stream.c to make it opaque. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc: Handle UVC events internally in uvc.cLaurent Pinchart
The event notifier for the UVC device is registered in uvc_stream_set_event_handler(), which requires exposing the uvc_events_process() event handler to the uvc_stream class. Make the event handler internal by registering it in uvc_events_init(). This requires passing the uvc_stream pointer to the uvc_open() function and storing it internally in the uvc_device object. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09stream: add documentationPaul Elder
Add documentation to functions in stream.h header file. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2018-06-09uvc-gadget: factor out uvc protocol and stream handling codePaul Elder
uvc-gadget.c has been getting cluttered with functions related to UVC protocol handling and stream handling. Additionally, it is forseen that we might want stream handling to be modular for different system models. Factor out code related to UVC protocol handling to uvc.c (and uvc.h) and code related to stream handling to stream.c (and stream.h), and update the Makefile accordingly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>