Age | Commit message (Collapse) | Author |
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Start by adding short build instructions. The documentation should be
expanded later.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
The file description came from a bad copy&paste, fix it.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
Create a couple more frame sizes through configfs. This is so that we
can test by default with multiple frame sizes. The frame sizes are
instantiated in a non-sorted order purposefully to test and make sure
that bFrameIndex parsing is done properly by all involved components.
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>
|
|
Currently there are a set of files that need to be written to in
configfs to instantiate a single frame size of a UVC function. Add a
function create_frame() to do this in one call.
There is no delete_frame() since delete_uvc() will delete the frame
settings. Previously delete_uvc() only deleted the single frame size, so
this has been changed to a wildcard to catch all frame sizes.
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>
|
|
Driver now supports bFrameIndex through configfs; enable reading this
attribute from configfs. This is necessary to associate the correct
bFrameIndexes with the UVC frame descriptors.
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>
|
|
Use the streaming endpoint maximum packet size parsed from ConfigFS
instead of hardcoding an arbitrary value.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
Replace the hardcode formats and frame sizes with the configuration read
from ConfigFS.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
Extend the ConfigFS parser to parse UVC formats and intervals.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
Modify the attribute_read() function to not add a terminating 0 to the
buffer, and to return the number of bytes read, in order to support
binary attributes. The attribute_read_uint() and attribute_read_str()
functions are modified accordingly to use the new attribute_read()
semantics.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
Move all attribute parsing to a top-level configfs_parse_uvc() function,
and split control and streaming interface attributes to two separate
helper functions. In addition to making the code more structured, it
will also allow supporting multiple streaming interfaces in a single UVC
function in the future.
The uvc_function_config structure is similarly reorganized in a
hierarchical representation of the configuration.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|