From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomasz Figa <tfiga@chromium.org>
Cc: "Linux Media Mailing List" <linux-media@vger.kernel.org>,
"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
"Stanimir Varbanov" <stanimir.varbanov@linaro.org>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Hans Verkuil" <hverkuil@xs4all.nl>,
"Pawel Osciak" <posciak@chromium.org>,
"Alexandre Courbot" <acourbot@chromium.org>,
kamil@wypas.org, a.hajda@samsung.com,
"Kyungmin Park" <kyungmin.park@samsung.com>,
jtp.park@samsung.com, "Philipp Zabel" <p.zabel@pengutronix.de>,
"Tiffany Lin (林慧珊)" <tiffany.lin@mediatek.com>,
"Andrew-CT Chen (陳智迪)" <andrew-ct.chen@mediatek.com>,
todor.tomov@linaro.org, nicolas@ndufresne.ca,
"Paul Kocialkowski" <paul.kocialkowski@bootlin.com>,
dave.stevenson@raspberrypi.org,
"Ezequiel Garcia" <ezequiel@collabora.com>
Subject: Re: [PATCH 1/2] media: docs-rst: Document memory-to-memory video decoder interface
Date: Sun, 21 Oct 2018 12:23:43 +0300 [thread overview]
Message-ID: <2340231.s4xOQAu5Wh@avalon> (raw)
In-Reply-To: <CAAFQd5BnfZdbBpDq5qGwLQrWOzae-kd57JTv1ieokCs8H5K1MQ@mail.gmail.com>
Hi Tomasz,
On Saturday, 20 October 2018 11:52:57 EEST Tomasz Figa wrote:
> On Thu, Oct 18, 2018 at 8:22 PM Laurent Pinchart wrote:
> > On Thursday, 18 October 2018 13:03:33 EEST Tomasz Figa wrote:
> >> On Wed, Oct 17, 2018 at 10:34 PM Laurent Pinchart wrote:
> >>> On Tuesday, 24 July 2018 17:06:20 EEST Tomasz Figa wrote:
> >>>> Due to complexity of the video decoding process, the V4L2 drivers of
> >>>> stateful decoder hardware require specific sequences of V4L2 API
> >>>> calls to be followed. These include capability enumeration,
> >>>> initialization, decoding, seek, pause, dynamic resolution change, drain
> >>>> and end of stream.
> >>>>
> >>>> Specifics of the above have been discussed during Media Workshops at
> >>>> LinuxCon Europe 2012 in Barcelona and then later Embedded Linux
> >>>> Conference Europe 2014 in Düsseldorf. The de facto Codec API that
> >>>> originated at those events was later implemented by the drivers we
> >>>> already have merged in mainline, such as s5p-mfc or coda.
> >>>>
> >>>> The only thing missing was the real specification included as a part
> >>>> of Linux Media documentation. Fix it now and document the decoder part
> >>>> of the Codec API.
> >>>>
> >>>> Signed-off-by: Tomasz Figa <tfiga@chromium.org>
> >>>> ---
> >>>>
> >>>> Documentation/media/uapi/v4l/dev-decoder.rst | 872 +++++++++++++++++++
> >>>> Documentation/media/uapi/v4l/devices.rst | 1 +
> >>>> Documentation/media/uapi/v4l/v4l2.rst | 10 +-
> >>>> 3 files changed, 882 insertions(+), 1 deletion(-)
> >>>> create mode 100644 Documentation/media/uapi/v4l/dev-decoder.rst
> >>>>
> >>>> diff --git a/Documentation/media/uapi/v4l/dev-decoder.rst
> >>>> b/Documentation/media/uapi/v4l/dev-decoder.rst new file mode 100644
> >>>> index 000000000000..f55d34d2f860
> >>>> --- /dev/null
> >>>> +++ b/Documentation/media/uapi/v4l/dev-decoder.rst
> >>>> @@ -0,0 +1,872 @@
> >
> > [snip]
> >
> >>>> +4. Allocate source (bitstream) buffers via :c:func:`VIDIOC_REQBUFS`
> >>>> on
> >>>> + ``OUTPUT``.
> >>>> +
> >>>> + * **Required fields:**
> >>>> +
> >>>> + ``count``
> >>>> + requested number of buffers to allocate; greater than zero
> >>>> +
> >>>> + ``type``
> >>>> + a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``
> >>>> +
> >>>> + ``memory``
> >>>> + follows standard semantics
> >>>> +
> >>>> + ``sizeimage``
> >>>> + follows standard semantics; the client is free to choose
> >>>> any
> >>>> + suitable size, however, it may be subject to change by the
> >>>> + driver
> >>>> +
> >>>> + * **Return fields:**
> >>>> +
> >>>> + ``count``
> >>>> + actual number of buffers allocated
> >>>> +
> >>>> + * The driver must adjust count to minimum of required number of
> >>>> + ``OUTPUT`` buffers for given format and count passed.
> >>>
> >>> Isn't it the maximum, not the minimum ?
> >>
> >> It's actually neither. All we can generally say here is that the
> >> number will be adjusted and the client must note it.
> >
> > I expect it to be clamp(requested count, driver minimum, driver maximum).
> > I'm not sure it's worth capturing this in the document though, but we
> > could say
> >
> > "The driver must clam count to the minimum and maximum number of required
> > ``OUTPUT`` buffers for the given format ."
>
> I'd leave the details to the documentation of VIDIOC_REQBUFS, if
> needed. This document focuses on the decoder UAPI and with this note I
> want to ensure that the applications don't assume that exactly the
> requested number of buffers is always allocated.
>
> How about making it even simpler:
>
> The actual number of allocated buffers may differ from the ``count``
> given. The client must check the updated value of ``count`` after the
> call returns.
That works for me. You may want to see "... given, as specified in the
VIDIOC_REQBUFS documentation.".
> >>>> The client must
> >>>> + check this value after the ioctl returns to get the number of
> >>>> + buffers allocated.
> >>>> +
> >>>> + .. note::
> >>>> +
> >>>> + To allocate more than minimum number of buffers (for pipeline
> >>>> + depth), use G_CTRL(``V4L2_CID_MIN_BUFFERS_FOR_OUTPUT``) to
> >>>> + get minimum number of buffers required by the driver/format,
> >>>> + and pass the obtained value plus the number of additional
> >>>> + buffers needed in count to :c:func:`VIDIOC_REQBUFS`.
> >>>> +
> >>>> +5. Start streaming on ``OUTPUT`` queue via
> >>>> :c:func:`VIDIOC_STREAMON`.
> >>>> +
> >>>> +6. This step only applies to coded formats that contain resolution
> >>>> + information in the stream. Continue queuing/dequeuing bitstream
> >>>> + buffers to/from the ``OUTPUT`` queue via :c:func:`VIDIOC_QBUF`
> >>>> and
> >>>> + :c:func:`VIDIOC_DQBUF`. The driver must keep processing and
> >>>> returning
> >>>> + each buffer to the client until required metadata to configure
> >>>> the
> >>>> + ``CAPTURE`` queue are found. This is indicated by the driver
> >>>> sending
> >>>> + a ``V4L2_EVENT_SOURCE_CHANGE`` event with
> >>>> + ``V4L2_EVENT_SRC_CH_RESOLUTION`` source change type. There is no
> >>>> + requirement to pass enough data for this to occur in the first
> >>>> buffer
> >>>> + and the driver must be able to process any number.
> >>>> +
> >>>> + * If data in a buffer that triggers the event is required to
> >>>> decode
> >>>> + the first frame, the driver must not return it to the client,
> >>>> + but must retain it for further decoding.
> >>>> +
> >>>> + * If the client set width and height of ``OUTPUT`` format to 0,
> >>>> calling
> >>>> + :c:func:`VIDIOC_G_FMT` on the ``CAPTURE`` queue will return
> >>>> -EPERM,
> >>>> + until the driver configures ``CAPTURE`` format according to
> >>>> stream
> >>>> + metadata.
> >>>
> >>> That's a pretty harsh handling for this condition. What's the
> >>> rationale for returning -EPERM instead of for instance succeeding with
> >>> width and height set to 0 ?
> >>
> >> I don't like it, but the error condition must stay for compatibility
> >> reasons as that's what current drivers implement and applications
> >> expect. (Technically current drivers would return -EINVAL, but we
> >> concluded that existing applications don't care about the exact value,
> >> so we can change it to make more sense.)
> >
> > Fair enough :-/ A bit of a shame though. Should we try to use an error
> > code that would have less chance of being confused with an actual
> > permission problem ? -EILSEQ could be an option for "illegal sequence" of
> > operations, but better options could exist.
>
> In Request API we concluded that -EACCES is the right code to return
> for G_EXT_CTRLS on a request that has not finished yet. The case here
> is similar - the capture queue is not yet set up. What do you think?
Good question. -EPERM is documented as "Operation not permitted", while -
EACCES is documented as "Permission denied". The former appears to be
understood as "This isn't a good idea, I can't let you do that", and the
latter as "You don't have sufficient privileges, if you retry with the correct
privileges this will succeed". Neither are a perfect match, but -EACCES might
be better if you replace getting privileges by performing the required setup.
> >>>> + * If the client subscribes to ``V4L2_EVENT_SOURCE_CHANGE``
> >>>> events and
> >>>> + the event is signaled, the decoding process will not continue
> >>>> until
> >>>> + it is acknowledged by either (re-)starting streaming on
> >>>> ``CAPTURE``,
> >>>> + or via :c:func:`VIDIOC_DECODER_CMD` with
> >>>> ``V4L2_DEC_CMD_START``
> >>>> + command.
> >>>> +
> >>>> + .. note::
> >>>> +
> >>>> + No decoded frames are produced during this phase.
> >>>> +
[snip]
> >> Also added a note:
> >> To fulfill those requirements, the client may attempt to use
> >> :c:func:`VIDIOC_CREATE_BUFS` to add more buffers. However, due to
> >> hardware limitations, the decoder may not support adding buffers
> >> at this point and the client must be able to handle a failure
> >> using the steps below.
> >
> > I wonder if there could be a way to work around those limitations on the
> > driver side. At the beginning of step 7, the decoder is effectively
> > stopped. If the hardware doesn't support adding new buffers on the fly,
> > can't the driver support the VIDIOC_CREATE_BUFS + V4L2_DEC_CMD_START
> > sequence the same way it would support the VIDIOC_STREAMOFF +
> > VIDIOC_REQBUFS(0) +
> > VIDIOC_REQBUFS(n) + VIDIOC_STREAMON ?
>
> I guess that would work. I would only allow it for the case where
> existing buffers are already big enough and just more buffers are
> needed. Otherwise it would lead to some weird cases, such as some old
> buffers already in the CAPTURE queue, blocking the decode of further
> frames. (While it could be handled by the driver returning them with
> an error state, it would only complicate the interface.)
Good point. I wonder if this could be handled in the framework. If it can't,
or with non trivial support code on the driver side, then I would agree with
you. Otherwise, handling the workaround in the framework would ensure
consistent behaviour across drivers with minimal cost, and simplify the
userspace API, so I think it would be a good thing.
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2018-10-21 9:23 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-24 14:06 [PATCH 0/2] Document memory-to-memory video codec interfaces Tomasz Figa
2018-07-24 14:06 ` [PATCH 1/2] media: docs-rst: Document memory-to-memory video decoder interface Tomasz Figa
2018-07-25 11:58 ` Hans Verkuil
2018-07-26 10:20 ` Tomasz Figa
2018-07-26 10:36 ` Philipp Zabel
2018-08-07 6:55 ` Tomasz Figa
2018-07-26 10:57 ` Hans Verkuil
2018-08-07 7:05 ` Tomasz Figa
2018-08-07 7:37 ` Hans Verkuil
2018-08-08 2:55 ` Tomasz Figa
2018-08-21 11:29 ` Stanimir Varbanov
2018-08-27 4:09 ` Tomasz Figa
2018-10-15 10:13 ` Tomasz Figa
2018-10-16 1:09 ` Nicolas Dufresne
2018-08-07 7:13 ` Hans Verkuil
2018-08-07 19:11 ` Maxime Jourdan
2018-08-08 3:07 ` Tomasz Figa
2018-08-08 7:19 ` Maxime Jourdan
2018-08-08 3:11 ` Tomasz Figa
2018-08-08 6:43 ` Hans Verkuil
2018-08-08 6:54 ` Ian Arkver
2018-09-19 10:17 ` Tomasz Figa
2018-10-08 12:22 ` Hans Verkuil
2018-10-09 4:23 ` Tomasz Figa
2018-10-09 6:39 ` Hans Verkuil
2018-07-30 12:52 ` Hans Verkuil
2018-08-07 7:08 ` Tomasz Figa
2018-08-08 2:46 ` Tomasz Figa
2018-08-20 13:04 ` Philipp Zabel
2018-08-20 13:12 ` Tomasz Figa
2018-08-20 14:13 ` Philipp Zabel
2018-08-20 14:27 ` Tomasz Figa
2018-08-20 15:33 ` Philipp Zabel
2018-08-27 4:03 ` Tomasz Figa
2018-08-31 8:26 ` Alexandre Courbot
2018-09-05 5:45 ` Tomasz Figa
2018-10-17 13:34 ` Laurent Pinchart
2018-10-18 10:03 ` Tomasz Figa
2018-10-18 11:22 ` Laurent Pinchart
2018-10-20 8:52 ` Tomasz Figa
2018-10-21 9:23 ` Laurent Pinchart [this message]
2018-10-22 6:19 ` Tomasz Figa
2018-10-20 10:24 ` Tomasz Figa
2018-10-21 9:26 ` Laurent Pinchart
2018-10-20 15:39 ` Tomasz Figa
2018-07-24 14:06 ` [PATCH 2/2] media: docs-rst: Document memory-to-memory video encoder interface Tomasz Figa
2018-07-25 13:41 ` Philipp Zabel
2018-08-07 6:07 ` Tomasz Figa
2018-07-25 13:57 ` Hans Verkuil
2018-08-07 6:54 ` Tomasz Figa
2018-08-07 7:25 ` Hans Verkuil
2018-10-16 7:36 ` Tomasz Figa
2018-10-16 13:49 ` Hans Verkuil
2018-10-22 4:50 ` Tomasz Figa
2018-09-07 20:17 ` Ezequiel Garcia
2018-09-10 3:34 ` Tomasz Figa
2018-10-17 15:19 ` Laurent Pinchart
2018-10-22 6:12 ` Tomasz Figa
2018-07-25 13:28 ` [PATCH 0/2] Document memory-to-memory video codec interfaces Philipp Zabel
2018-07-25 13:35 ` Tomasz Figa
2018-09-10 9:13 ` Hans Verkuil
2018-09-11 3:52 ` Tomasz Figa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2340231.s4xOQAu5Wh@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=a.hajda@samsung.com \
--cc=acourbot@chromium.org \
--cc=andrew-ct.chen@mediatek.com \
--cc=dave.stevenson@raspberrypi.org \
--cc=ezequiel@collabora.com \
--cc=hverkuil@xs4all.nl \
--cc=jtp.park@samsung.com \
--cc=kamil@wypas.org \
--cc=kyungmin.park@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=nicolas@ndufresne.ca \
--cc=p.zabel@pengutronix.de \
--cc=paul.kocialkowski@bootlin.com \
--cc=posciak@chromium.org \
--cc=stanimir.varbanov@linaro.org \
--cc=tfiga@chromium.org \
--cc=tiffany.lin@mediatek.com \
--cc=todor.tomov@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).