Hi Sakari,
First a practical matter: you should consider using the v4l-helpers.h: it will
shield you and probably the end-user as well from lots of complexities, esp. the
single vs multiplanar differences.
I really need to spend some time documenting it, but it isn't all that
difficult.
On 07/21/2016 05:15 PM, Sakari Ailus wrote:
> Hi everyone,
>
> We've got a number of V4L2 (and MC) test programs for about as many reasons.
> The existing programs are concentrated to work on a single device node at a
> time, and with a single interface, be that Media controller or V4L2.
>
> The test programs are also command line controlled, working their way with
> the device at hand based on the information passed to the test programs on
> the command line. This has made perfect sense for the past 15 years, as long
> as we've had such test programs: they have covered, for large part, needs to
> perform testing in various cases without leaving significant gaps.
>
> With the upcoming request API, however, this has become insufficient. The
> very nature of the request API requires that requests can contain resources
> (e.g. memory buffers) that is associated to a number of video device nodes.
> The requests may well be different from each other, including the types of
> resources that are used for each request.
>
> So I decided we need a new test program. The scope for the original
> mediatext library and test program were slightly different from what is in
> this (very RFC) patchset. I deemed mediatext as the best starting point for
> writing a new test program.
Is this utility meant to testing different scenarios, or as a way to test
drivers
(compliance tests)? I think the first, right?
> mediatext acts as an interface between an end user or a script and the
> kernel interfaces, with an ability to work with multiple devices at a time,
> including multiple video nodes:
>
> shell script
> |
> |
> | <- two-way pipe
> |
> |
> mediatext
> / | \
> / | \
> /dev/video* | /dev/v4l-subdev*
> |
> /dev/mediaX
>
> The shell script (which could be any other program as well but shell scripts
> are convenient for the purpose) is always in the control of the main loop of
> the test. Events are delivered to the script by mediatext based on file
> handle state changes, so the script has a possibility to react to each of
> them (e.g. buffer becoming dequeueable on one of the video nodes).
>
> A simple example script for a UVC compliant Logitech webcam is below. It
> opens the device based on the name of the entity, and sets up the device for
> streaming with a specified format with three MMAP buffers. The first 50
> frames are written to a file, and capturing is stopped once about 100 frames
> have been captured. Dequeued buffers are immediately requeued, and this is
> explicitly done by the shell script.
>
> ---------------------8<---------------------
> #!/bin/bash
>
> eval_line() {
> while [ $# -ne 0 ]; do
> local name=${1%=*}
> local value=${1#*=}
> p[$name]="$value"
> shift
> done
> }
>
> coproc mediatext -d /dev/media0 2>&1
>
> cat <<EOF >&${COPROC[1]}
> v4l open entity="UVC Camera (046d:0825)" name=uvc
> v4l fmt vdev=uvc type=CAPTURE width=320 height=240 \
> pixelformat=YUYV bytesperline=0
> v4l reqbufs vdev=uvc type=CAPTURE count=3 memory=MMAP
> v4l qbuf vdev=uvc
> v4l qbuf vdev=uvc
> v4l qbuf vdev=uvc
>
> v4l streamon vdev=uvc type=CAPTURE
> EOF
>
> while IFS= read -ru ${COPROC[0]} line; do
> unset p; declare -A p
> eval eval_line $line
> echo $line
> case ${p[event]} in
> dqbuf)
> if ((${p[seq]} < 50)); then
> echo v4l write vdev=uvc \
> sequence=${p[seq]} >&${COPROC[1]}
> fi
> if ((${p[seq]} > 100)); then
> echo quit >&${COPROC[1]}
> fi
> cat <<EOF >&${COPROC[1]}
> v4l qbuf vdev=uvc
> EOF
> ;;
> esac;
> done
> ---------------------8<---------------------
>
> Requests are naturally supported as well, right now only for buffer-related
> IOCTLs but support for other IOCTLs can be added as well. The library has
> been designed to be modular and easily extensible. There are no drivers
> implementing them yet, and the kernel patches are still in development.
>
> The kernel patches from which the headers have been generated from are
> available here:
>
> <URL:http://git.retiisi.org.uk/?p=~sailus/linux.git;a=shortlog;h=refs/heads/request>
>
> As noted, the test program is still in development phase. I thought this
> still would be useful for others working on the request API so I decided to
> share it already.
Can you show a test script/shell example of the use of the request API?
>
> Current todo list:
>
> - The scope of the current media-ctl functionality command format does not
> match with the rest of the program. To be fixed.
>
> - Support requests for non-buffer related IOCTLs. This is pending on
> relevant kernel patches.
>
> - Clean up command parameters and event messages to make them more
> consistent.
>
I'd split off the parser code into its own source as well.
Is there a reason you use C instead of C++? C++ would make life a bit easier:
STL
of course, but the cv4l-helpers.h (the C++ variant of v4l-helpers.h) is quite
nice
as well.
Regards,
Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html