Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp2735682imm; Mon, 10 Sep 2018 05:51:43 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZZd11oxRcEFv0WCVuqbiUtXMLYq58ugQBb5CSdtuVW6fo00WU+HlzEho2iyi/9B+4MA/XZ X-Received: by 2002:a17:902:a9ca:: with SMTP id b10-v6mr21392637plr.198.1536583903478; Mon, 10 Sep 2018 05:51:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536583903; cv=none; d=google.com; s=arc-20160816; b=aQCukI3P/kJZwWKfg4UHxHu/KcPx2JgPVF6o91MMsTQESxwTMHjWXIxScy8wY8EmzW cK5UlyCTrGCaY3gkUuAHIOojFD8UwvjY0V6zHyqUi99Xn7E7xa0VMssnDRHiOGkx84wo DrGJiRr+m/ChWz6betvSZURn0xASBQWWX9jSlB5f1U8CocqRxib3baVk96Oi9hwSaAuz WsJAMgH+DM3mAbXkmdMulC3xH5sBIl1v/DkANJXlGqG24GM+XxySIVy0IVZcINHrffr9 3EzrGOW/B/ZR/MYlMdZPxF3pCoqz7mDPVWDyfY0ntBjNKU0zOyN05IwFcuyN2SQtZn3I 1QWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject; bh=tLIot8xZClV1rr5VFmbIoafNpTs22EI8AbvBwscd3HY=; b=chOT7fzzIXOxYs3Hzc5RIMnpIKA1GmgYW51GzI9093HBnDgo01gTcA7Z1bVU2N2ApP a0/NnDSL3fqhMmf3F8YwhURZPZPZybUWhrj0eWHaNSxVm99S6GzPIWdFaMqcTvfkp3Cp VbJMYr4kPU1KUAKip2tacKSA48cwDlGOeClL25IX/M7yfosuN59s2Lxr9KcVyWE3jnjA k9bdpmFSX40tj2Ut8amPUFqqvz+zvjjdkNZxLCufbUy3KYLYVWnPzHyeDXsAD/sO81Sn S7mig78evShgckTHQbQyCBD3tldaaf90T4m6kYmrBM9xBvGuCfXFmOdHfJjIdrr0Wq+S R3VA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y6-v6si18525261pgr.684.2018.09.10.05.51.27; Mon, 10 Sep 2018 05:51:43 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728546AbeIJRnr (ORCPT + 99 others); Mon, 10 Sep 2018 13:43:47 -0400 Received: from lb1-smtp-cloud7.xs4all.net ([194.109.24.24]:53077 "EHLO lb1-smtp-cloud7.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727974AbeIJRnr (ORCPT ); Mon, 10 Sep 2018 13:43:47 -0400 Received: from [192.168.2.10] ([212.251.195.8]) by smtp-cloud7.xs4all.net with ESMTPA id zLdRf389Yw2L8zLdVfKX8g; Mon, 10 Sep 2018 14:49:49 +0200 Subject: Re: [RFC PATCH] media: docs-rst: Document m2m stateless video decoder interface From: Hans Verkuil To: Alexandre Courbot , Tomasz Figa , Paul Kocialkowski , Mauro Carvalho Chehab , Pawel Osciak , linux-media@vger.kernel.org Cc: linux-kernel@vger.kernel.org References: <20180831074743.235010-1-acourbot@chromium.org> <38b32d24-6957-4bee-9168-b3afbfcae083@xs4all.nl> Message-ID: Date: Mon, 10 Sep 2018 14:49:45 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <38b32d24-6957-4bee-9168-b3afbfcae083@xs4all.nl> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfKDCyMhQoPS4WykIhQG/5bq4wIL+TDfVnmsMwMtLenBVl5Q29TlacvtyYsDI5khQLfZ+RGAWALROm7OyUFdwQvTjKezSNTR0WnndzoEO/LjMFHTsIiz8 CPbvjOb/QIi+6E2UirAhQ65AeroSkBpIlV69etNERbFuGKGTHXMBPf2BFrgq2L6HIQAqb9vlYuY1IwzXSDWmUn3ili4aUxauyklgxL5Z3msJVKha7RX8YtZ7 V+SpXtqI/TDhBnwE4K5IVxEm+tbypnwnEyyE7qF8pZX/AnKvuCxu/qtTDkvDhifJSmvNhskXznw6rJdfykK+2XHk2Oi1hDyww/XRf6IcM3ZTqFWwXLE5+AKa TVoRocJGmnfUpe9hZUlRlZaX54ghjojGP9SwgZprFpfP6wSdpDI= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/10/2018 01:57 PM, Hans Verkuil wrote: > On 09/10/2018 01:25 PM, Hans Verkuil wrote: >>> + >>> +Decoding >>> +======== >>> + >>> +For each frame, the client is responsible for submitting a request to which the >>> +following is attached: >>> + >>> +* Exactly one frame worth of encoded data in a buffer submitted to the >>> + ``OUTPUT`` queue, >>> +* All the controls relevant to the format being decoded (see below for details). >>> + >>> +``CAPTURE`` buffers must not be part of the request, but must be queued >>> +independently. The driver will pick one of the queued ``CAPTURE`` buffers and >>> +decode the frame into it. Although the client has no control over which >>> +``CAPTURE`` buffer will be used with a given ``OUTPUT`` buffer, it is guaranteed >>> +that ``CAPTURE`` buffers will be returned in decode order (i.e. the same order >>> +as ``OUTPUT`` buffers were submitted), so it is trivial to associate a dequeued >>> +``CAPTURE`` buffer to its originating request and ``OUTPUT`` buffer. >>> + >>> +If the request is submitted without an ``OUTPUT`` buffer or if one of the >>> +required controls are missing, then :c:func:`MEDIA_REQUEST_IOC_QUEUE` will return >>> +``-EINVAL``. >> >> Not entirely true: if buffers are missing, then ENOENT is returned. Missing required >> controls or more than one OUTPUT buffer will result in EINVAL. This per the latest >> Request API changes. >> >> Decoding errors are signaled by the ``CAPTURE`` buffers being >>> +dequeued carrying the ``V4L2_BUF_FLAG_ERROR`` flag. >> >> Add here that if the reference frame had an error, then all other frames that refer >> to it should also set the ERROR flag. It is up to userspace to decide whether or >> not to drop them (part of the frame might still be valid). >> >> I am not sure whether this should be documented, but there are some additional >> restrictions w.r.t. reference frames: >> >> Since decoders need access to the decoded reference frames there are some corner >> cases that need to be checked: >> >> 1) V4L2_MEMORY_USERPTR cannot be used for the capture queue: the driver does not >> know when a malloced but dequeued buffer is freed, so the reference frame >> could suddenly be gone. >> >> 2) V4L2_MEMORY_DMABUF can be used, but drivers should check that the dma buffer is >> still available AND increase the dmabuf refcount while it is used by the HW. >> >> 3) What to do if userspace has requeued a buffer containing a reference frame, >> and you want to decode a B/P-frame that refers to that buffer? We need to >> check against that: I think that when you queue a capture buffer whose index >> is used in a pending request as a reference frame, than that should fail with >> an error. And trying to queue a request referring to a buffer that has been >> requeued should also fail. >> >> We might need to add some support for this in v4l2-mem2mem.c or vb2. >> >> We will have similar (but not quite identical) issues with stateless encoders. > > Related to this is the question whether buffer indices that are used to refer > to reference frames should refer to the capture or output queue. > > Using capture indices works if you never queue more than one request at a time: > you know exactly what the capture buffer index is of the decoded I-frame, and > you can use that in the following requests. > > But if multiple requests are queued, then you don't necessarily know to which > capture buffer an I-frame will be decoded, so then you can't provide this index > to following B/P-frames. This puts restrictions on userspace: you can only > queue B/P-frames once you have decoded the I-frame. This might be perfectly > acceptable, though. > > Using output buffer indices will work (the driver will know to which capture > buffer index the I-frames mapped), but it requires that the output buffer that > contained a reference frame isn't requeued, since that means that the driver > will lose this mapping. I think this will make things too confusing, though. > > A third option is that you don't refer to reference frames by buffer index, > but instead by some other counter (sequence counter, perhaps?). Definitely not sequence number, since it has the same problem as buffer index. This could be a value relative to the frame you are trying to decode: i.e. 'use the capture buffer from X frames ago'. This makes it index independent and is still easy to keep track of inside the driver and application. Regards, Hans