Hi Hans,
Huge thanks for the review!
On Mon, Jan 3, 2011 at 23:53, Hans Verkuil <[email protected]> wrote:
> On Tuesday, January 04, 2011 05:20:45 Pawel Osciak wrote:
>> Add DocBook documentation for the new multi-planar API extensions to the
>> Video for Linux 2 API DocBook.
>>
>> Signed-off-by: Pawel Osciak <[email protected]>
>> ---
>> Documentation/DocBook/media-entities.tmpl | 4 +
>> Documentation/DocBook/v4l/common.xml | 2 +
>> Documentation/DocBook/v4l/compat.xml | 11 +
>> Documentation/DocBook/v4l/dev-capture.xml | 13 +-
>> Documentation/DocBook/v4l/dev-output.xml | 13 +-
>> Documentation/DocBook/v4l/func-mmap.xml | 10 +-
>> Documentation/DocBook/v4l/func-munmap.xml | 3 +-
>> Documentation/DocBook/v4l/io.xml | 242
>> +++++++++++++++++++++----
>> Documentation/DocBook/v4l/pixfmt.xml | 114 +++++++++++-
>> Documentation/DocBook/v4l/planar-apis.xml | 79 ++++++++
>> Documentation/DocBook/v4l/v4l2.xml | 21 ++-
>> Documentation/DocBook/v4l/vidioc-enum-fmt.xml | 2 +
>> Documentation/DocBook/v4l/vidioc-g-fmt.xml | 15 ++-
>> Documentation/DocBook/v4l/vidioc-qbuf.xml | 24 ++-
>> Documentation/DocBook/v4l/vidioc-querybuf.xml | 14 +-
>> Documentation/DocBook/v4l/vidioc-querycap.xml | 14 ++
>> 16 files changed, 515 insertions(+), 66 deletions(-)
>> create mode 100644 Documentation/DocBook/v4l/planar-apis.xml
>>
>> diff --git a/Documentation/DocBook/media-entities.tmpl
>> b/Documentation/DocBook/media-entities.tmpl
>> index be34dcb..74923d7 100644
>> --- a/Documentation/DocBook/media-entities.tmpl
>> +++ b/Documentation/DocBook/media-entities.tmpl
<snip>
>> +memset (&reqbuf, 0, sizeof (reqbuf));
>
> No space before (
>
I used the previous example and modified it, I didn't want to change
code style. But I guess it's maybe the original one that should be
corrected as well...
>> +reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
>> +reqbuf.memory = V4L2_MEMORY_MMAP;
>> +reqbuf.count = 20;
>> +
>> +if (-1 == ioctl (fd, &VIDIOC-REQBUFS;, &reqbuf)) {
>
> Ditto. Same below.
>
> It's also better to do 'if (ioctl() < 0) {'
>
Ditto ;) Maybe I should do a separate patch for the original example later.
<snip>
>> @@ -596,6 +702,64 @@ should set this to 0.</entry>
>> </tgroup>
>> </table>
>>
>> + <table frame="none" pgwide="1" id="v4l2-plane">
>> + <title>struct <structname>v4l2_plane</structname></title>
>> + <tgroup cols="4">
>> + &cs-ustr;
>> + <tbody valign="top">
>> + <row>
>> + <entry>__u32</entry>
>> + <entry><structfield>bytesused</structfield></entry>
>> + <entry></entry>
>> + <entry>The number of bytes occupied by data in the plane
>> + (its payload).</entry>
>> + </row>
>> + <row>
>> + <entry>__u32</entry>
>> + <entry><structfield>length</structfield></entry>
>> + <entry></entry>
>> + <entry>Size in bytes of the plane (not its payload).</entry>
>> + </row>
>> + <row>
>> + <entry>union</entry>
>> + <entry><structfield>m</structfield></entry>
>> + <entry></entry>
>> + <entry></entry>
>> + </row>
>> + <row>
>> + <entry></entry>
>> + <entry>__u32</entry>
>> + <entry><structfield>mem_offset</structfield></entry>
>> + <entry>When memory type in the containing &v4l2-buffer; is
>
> When the
>
>> + <constant>V4L2_MEMORY_MMAP</constant>, this is the value that
>> + should be passed to &func-mmap;, analogically to the
>
> analogically -> similar
>
>> + <structfield>offset</structfield> field in &v4l2-buffer;.</entry>
>> + </row>
>> + <row>
>> + <entry></entry>
>> + <entry>__unsigned long</entry>
>> + <entry><structfield>userptr</structfield></entry>
>> + <entry>When memory type in the containing &v4l2-buffer; is
>
> When the
>
>> + <constant>V4L2_MEMORY_USERPTR</constant>, a userspace pointer
>
> a userspace -> this is a userspace
>
>> + to memory allocated for this plane by an application.</entry>
>> + </row>
>> + <row>
>> + <entry>__u32</entry>
>> + <entry><structfield>data_offset</structfield></entry>
>> + <entry></entry>
>> + <entry>Offset in bytes to video data in the plane, if applicable.
>> + </entry>
>> + </row>
>> + <row>
>> + <entry>__u32</entry>
>> + <entry><structfield>reserved[11]</structfield></entry>
>> + <entry></entry>
>> + <entry>Reserved for future use. Should be zero.</entry>
>
> Who zeroes this? Driver and/or application?
>
Well, it's ignored, as most reserved fields are. Should I say the
application should zero it? Or maybe even say nothing at all?
<snip>
>> diff --git a/Documentation/DocBook/v4l/planar-apis.xml
>> b/Documentation/DocBook/v4l/planar-apis.xml
>> new file mode 100644
>> index 0000000..ce89831
>> --- /dev/null
>> +++ b/Documentation/DocBook/v4l/planar-apis.xml
>> @@ -0,0 +1,79 @@
>> +<section id="planar-apis">
>> + <title>Single- and multi-planar APIs</title>
>> +
>> + <para>Some devices require data for each input or output video frame
>> + to be placed in discontiguous memory buffers. In such cases one
>> + video frame has to be addressed using more than one memory address, i.e.
>> one
>> + pointer per "plane". A plane is a sub-buffer of current frame. For
>> examples
>> + of such formats see <xref linkend="pixfmt" />.</para>
>> +
>> + <para>Initially, V4L2 API did not support multi-planar buffers and a set
>> of
>> + extensions has been introduced to handle them. Those extensions constitute
>> + what is being referred to as the "multi-planar API".</para>
>> +
>> + <para>Some of the V4L2 API calls and structures are interpreted
>> differently,
>> + depending on whether single- or multi-planar API is being used. An
>> application
>> + can choose whether to use one or the other by passing a corresponding
>> buffer
>> + type to its ioctl calls. Multi-planar versions of buffer types are
>> suffixed with
>> + an `_MPLANE' string. For a list of available multi-planar buffer types
>> + see &v4l2-buf-type;.
>> + </para>
>> +
>> + <section>
>> + <title>Multi-planar formats</title>
>> + <para>Multi-planar API introduces new multi-planar formats. Those
>> formats
>> + use a separate set of FourCC codes. It is important to distinguish
>> between
>> + the multi-planar API and a multi-planar format. Multi-planar API calls
>> can
>> + handle all single-planar formats as well, while single-planar API cannot
>
> while -> while the
>
>> + handle multi-planar formats. Applications do not have to switch between
>> APIs
>> + when handling both single- and multi-planar devices and should use the
>> + multi-planar API version for both single- and multi-planar formats.
>> + Drivers that do not support multi-planar API can still be handled with
>> it,
>> + utilizing a compatibility layer built into standard V4L2 ioctl handling.
>> + </para>
>> + </section>
>> +
>> + <section>
>> + <title>Single and multi-planar API compatibility layer</title>
>> + <para>In most cases, applications can use the multi-planar API with
>> older
>
> 'In most cases': I know why, but we really need to work on converting those
> drivers that still do not use video_ioctl2 :-(
>
> Perhaps a footnote explaining this might be useful here.
>
>> + drivers that support only its single-planar version and vice versa.
>> + Appropriate conversion is done seamlessly for both applications and
>> drivers
>> + in the V4L2 core. The general rule of thumb is: as long as an
>> application
>> + uses formats that a driver supports, it can use either API (although use
>> + of multi-planar formats is only possible with the multi-planar API). The
>> + list of formats supported by a driver can be obtained using the
>> + &VIDIOC-ENUM-FMT; call. It is possible, but discouraged, for a driver or
>> + an application to support and use both versions of the API.</para>
>> + </section>
>> +
>> + <section>
>> + <title>Calls that distinguish between single and multi-planar
>> APIs</title>
>> + <variablelist>
>> + <varlistentry>
>> + <term>&VIDIOC-QUERYCAP;</term>
>> + <listitem>Two additional multi-planar capabilities are added. They
>> can
>> + be set together with non-multi-planar ones for devices that support
>> both
>> + APIs.</listitem>
>
> What happens if a driver supports only single-planar API, but the core adds
> transparent support for multi-planar API? Are the MPLANE caps set or not?
> I can't remember what we decided to do. Ditto for the other way around (driver
> does only multi-planar, but core adds single-planar support).
>
Hm, that's a good point. Right now are not hijacking the caps ioctl...
This is tricky though, I don't see any good solutions. Adding
additional caps artificially would practically result in
V4L2_CAP_VIDEO_CAPTURE_MPLANE == V4L2_CAP_VIDEO_CAPTURE. But what
makes MPLANE or not-MPLANE "supported" are the actual formats later
on, not the API.
If we were to add artificial caps, then adding non-mplane caps to
mplane drivers might actually be the problematic case: if a
multi-planar driver didn't support any single-planar formats (and
there would be no practical way of knowing that from our standpoint),
a single-planar application would ENUM_FMT and get 0 formats, which
wouldn't be good.
Adding mplane caps to non-mplane drivers might actually be somehow
safer, as long as the application behaves and uses only single-planar
formats (as ENUM_FMT would return), it'll always work.
So ironically, all (what about the non-video_ioctl2 case?) splanar
drivers would be supporting mplane API, but not all mplane drivers
would be supporting splane API, because of the enumeration problem. I
hope I got it right, it's kind of late for me now...
What do you think?
<snip>
>>
>
> Thank you for the documentation!
>
> Regards,
>
> Hans
>
> --
> Hans Verkuil - video4linux developer - sponsored by Cisco
>
Again, big thanks for reviewing!
--
Best regards,
Pawel Osciak
--
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