Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3419453yba; Mon, 29 Apr 2019 01:52:32 -0700 (PDT) X-Google-Smtp-Source: APXvYqzfjQucPvwYFQRhKTiChIYfC4YDZLi/L4YkMEvfj4XCmXp4+c7uxxMJruf7MTNyp7NJuvjD X-Received: by 2002:a65:4343:: with SMTP id k3mr26381004pgq.384.1556527951951; Mon, 29 Apr 2019 01:52:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556527951; cv=none; d=google.com; s=arc-20160816; b=y1BJpgXTkBeZmwRW8xPr4Pq0LeiPE3zyVGPyiU8SKxrYcBJhBOSjE5nWxZyX7+FCWY JalsZjudlejWlxM+kKxiyE3w8FuT8/NMikBgkONmg2eeOQLEE8CWJM8ezXbZ+K7ZWrvm CmJD4/41+juC/wdzeyKz0vhSilae3Z0TedhWEKwywwZoPZ5B7nKZ4GLrIWw3tnrmgX8J u/NsBGWHVGP8kBb4UzPSXImJZdxIVUM4yaSa4iI5L+rUJ/imDqvgwnDYMloXhp+GJyb/ 6nc81YsddrEnxwp4bM4Jue/SlWfcYIxqfpWm2HkdPgbYQdtZ+l7eKPJ634+jH4e9wnrc 6Uig== 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:from:references:cc:to:subject; bh=hgGauOvw9mTtaC7/vcNx7N199MFmI+aTKiNzC+7EEnI=; b=fYJZu4l/iua8F69NHklQm7AsuAFW6wKOgTU+/BCeL0IDY1ZXXSZkUZZ69FHloAGYoO jq/0kz9RhvRpZ3gpJj6+AEMz3X1D0zdyoEvMPsAKSE0fzDgs5t9ewMdzUb7JRc9jISKc 8pBniIFVrMgAUi29+KNAFCkfc9UqoLyTxSm65oFVCB+gdGpJhV+CvrCdOOuSMMbV6tMO zjjXMEnmY1OlMPQ4gPPKDtYHJEF0b5x08Pne+t82uUHRQuVLJ/LmmhLVcpoAp9xI4BSa ic9XRK80l6W0bhIc0gQzWCmlASG3BD3OhQrXuiyEswhPrJHZ1eQJ+l/NKoYV1XGy5i9A V3Dw== 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 f12si30003530pgo.388.2019.04.29.01.52.16; Mon, 29 Apr 2019 01:52:31 -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 S1727691AbfD2IuB (ORCPT + 99 others); Mon, 29 Apr 2019 04:50:01 -0400 Received: from lb3-smtp-cloud8.xs4all.net ([194.109.24.29]:37291 "EHLO lb3-smtp-cloud8.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727539AbfD2IuB (ORCPT ); Mon, 29 Apr 2019 04:50:01 -0400 Received: from [192.168.2.10] ([46.9.232.72]) by smtp-cloud8.xs4all.net with ESMTPA id L1z0hJeq7b8gSL1z4h7FSb; Mon, 29 Apr 2019 10:49:58 +0200 Subject: Re: [PATCH v4] media: docs-rst: Document m2m stateless video decoder interface To: Paul Kocialkowski , Nicolas Dufresne , Alexandre Courbot Cc: Tomasz Figa , Maxime Ripard , Dafna Hirschfeld , Mauro Carvalho Chehab , Linux Media Mailing List , LKML References: <20190306080019.159676-1-acourbot@chromium.org> <371df0e4ec9e38d83d11171cbd98f19954cbf787.camel@ndufresne.ca> <439b7f57aa3ba2b2ed5b043f961ef87cb83912af.camel@ndufresne.ca> <59e23c5ca5bfbadf9441ea06da2e9b9b5898c6d7.camel@bootlin.com> <0b495143bb260cf9f8927ee541e7f001842ac5c3.camel@ndufresne.ca> <793af82c-6b37-6f69-648e-2cd2a2e87645@xs4all.nl> <0a39c613-440d-c7a9-a078-b4688874f9e6@xs4all.nl> <16a3a61fe354dc545e99aef36aa58c7d4943de26.camel@bootlin.com> From: Hans Verkuil Message-ID: Date: Mon, 29 Apr 2019 10:49:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <16a3a61fe354dc545e99aef36aa58c7d4943de26.camel@bootlin.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-CMAE-Envelope: MS4wfPOATKdVj2R0o6pb2wtLVw8P37ebLhkKKR3sXRAgwOEGGWmELqhKrpp7hq6ZrZnfMte91e8AU6bbBcQt+Gl2UKW1vEcIs9kKGMStdlE8YNGyT6mghWRv Ux6TfETM0MEnwH1qxAkuycPjU2V9jkyppIrSGETLQhU////y3HbYN0R0Mmgie+3NwcxlA/rDE9OqtZpRv7Z/bIw5e2geQtWJFHnFk6EaWRFBO8B93mh+s/fk lN4aABQtLhbtkMP2GrvO6ZsRoVYbnT9exPoI2bTNvDPwiR6AO46cpYOpQu3YUzQQSmznEHdbsdBkEmoQ6nitO+9PMuxANY+jKzRR/jf7T+RORP+bN+Fde+7q l6OrW0pAOJzZzDIKgcIuUxRyk28K2CVvtqPjAk8eASIVDFEyNB19309Ds2UVD6ZUoFkviWJ2qSpmXk4SP0Yc+EcU9eBYnA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 4/29/19 10:48 AM, Paul Kocialkowski wrote: > Hi, > > On Mon, 2019-04-29 at 10:41 +0200, Hans Verkuil wrote: >> On 4/27/19 2:06 PM, Nicolas Dufresne wrote: >>> Le vendredi 26 avril 2019 à 16:18 +0200, Hans Verkuil a écrit : >>>> On 4/16/19 9:22 AM, Alexandre Courbot wrote: >>>> >>>> >>>> >>>>> Thanks for this great discussion. Let me try to summarize the status >>>>> of this thread + the IRC discussion and add my own thoughts: >>>>> >>>>> Proper support for multiple decoding units (e.g. H.264 slices) per >>>>> frame should not be an afterthought ; compliance to encoded formats >>>>> depend on it, and the benefit of lower latency is a significant >>>>> consideration for vendors. >>>>> >>>>> m2m, which we use for all stateless codecs, has a strong assumption >>>>> that one OUTPUT buffer consumed results in one CAPTURE buffer being >>>>> produced. This assumption can however be overruled: at least the venus >>>>> driver does it to implement the stateful specification. >>>>> >>>>> So we need a way to specify frame boundaries when submitting encoded >>>>> content to the driver. One request should contain a single OUTPUT >>>>> buffer, containing a single decoding unit, but we need a way to >>>>> specify whether the driver should directly produce a CAPTURE buffer >>>>> from this request, or keep using the same CAPTURE buffer with >>>>> subsequent requests. >>>>> >>>>> I can think of 2 ways this can be expressed: >>>>> 1) We keep the current m2m behavior as the default (a CAPTURE buffer >>>>> is produced), and add a flag to ask the driver to change that behavior >>>>> and hold on the CAPTURE buffer and reuse it with the next request(s) ; >>>>> 2) We specify that no CAPTURE buffer is produced by default, unless a >>>>> flag asking so is specified. >>>>> >>>>> The flag could be specified in one of two ways: >>>>> a) As a new v4l2_buffer.flag for the OUTPUT buffer ; >>>>> b) As a dedicated control, either format-specific or more common to all codecs. >>>>> >>>>> I tend to favor 2) and b) for this, for the reason that with H.264 at >>>>> least, user-space does not know whether a slice is the last slice of a >>>>> frame until it starts parsing the next one, and we don't know when we >>>>> will receive it. If we use a control to ask that a CAPTURE buffer be >>>>> produced, we can always submit another request with only that control >>>>> set once it is clear that the frame is complete (and not delay >>>>> decoding meanwhile). In practice I am not that familiar with >>>>> latency-sensitive streaming ; maybe a smart streamer would just append >>>>> an AUD NAL unit at the end of every frame and we can thus submit the >>>>> flag it with the last slice without further delay? >>>>> >>>>> An extra constraint to enforce would be that each decoding unit >>>>> belonging to the same frame must be submitted with the same timestamp, >>>>> otherwise the request submission would fail. We really need a >>>>> framework to enforce all this at a higher level than individual >>>>> drivers, once we reach an agreement I will start working on this. >>>>> >>>>> Formats that do not support multiple decoding units per frame would >>>>> reject any request that does not carry the end-of-frame information. >>>>> >>>>> Anything missing / any further comment? >>>>> >>>> >>>> After reading through this thread and a further irc discussion I now >>>> understand the problem. I think there are several ways this can be >>>> solved, but I think this is the easiest: >>>> >>>> Introduce a new V4L2_BUF_FLAG_HOLD_CAPTURE_BUFFER flag. >>>> >>>> If set in the OUTPUT buffer, then don't mark the CAPTURE buffer as >>>> done after processing the OUTPUT buffer. >>>> >>>> If an OUTPUT buffer was queued with a different timestamp than was >>>> used for the currently held CAPTURE buffer, then mark that CAPTURE >>>> buffer as done before starting processing this OUTPUT buffer. >>> >>> Just a curiosity, can you extend on how this would be handled. If there >>> is a number of capture buffer, these should have "no-timestamp". So I >>> suspect we need the condition to differentiate no-timestamp from >>> previous timestamp. What I'm unclear is to what does it mean "no- >>> timestamp". We already stated the timestamp 0 cannot be reserved as >>> being an unset timestamp. >> >> For OUTPUT buffers there is no such thing as 'no timestamp'. They always >> have a timestamp (which may be 0). The currently active CAPTURE buffer >> also always has a timestamp as that was copied from the first OUTPUT buffer >> for that CAPTURE buffer. >> >>>> In other words, for slicing you can just always set this flag and >>>> group the slices by the OUTPUT timestamp. If you know that you >>>> reached the last slice of a frame, then you can optionally clear the >>>> flag to ensure the CAPTURE buffer is marked done without having to wait >>>> for the first slice of the next frame to arrive. >>>> >>>> Potential disadvantage of this approach is that this relies on the >>>> OUTPUT timestamp to be the same for all slices of the same frame. >>>> >>>> Which sounds reasonable to me. >>>> >>>> In addition add a V4L2_BUF_CAP_SUPPORTS_HOLD_CAPTURE_BUFFER >>>> capability to signal support for this flag. >>>> >>>> I think this can be fairly easily implemented in v4l2-mem2mem.c. >>>> >>>> In addition, this approach is not specific to codecs, it can be >>>> used elsewhere as well (composing multiple output buffers into one >>>> capture buffer is one use-case that comes to mind). >>>> >>>> Comments? Other ideas? >>> >>> Sounds reasonable to me. I'll read through Paul's comment now and >>> comment if needed. >> >> Paul's OK with it as well. The only thing I am not 100% happy with is >> the name of the flag. It's a very low-level name: i.e. it does what it >> says, but it doesn't say for what purpose. >> >> Does anyone have any better suggestions? > > Good naming is always so hard to find... I don't have anything better > to suggest off the top of my head, but will definitely keep thinking > about it. > >> Also, who will implement this in v4l2-mem2mem? Paul, where you planning to do that? > > Well, I no longer have time chunks allocated to the VPU topic at work, > so that means I'll have to do it on spare time and it may take me a > while to get there. > > So if either one of you would like to pick it up to get it over with > faster, feel free to do that! OK, then I'll try to come up with something this week or next week. Regards, Hans