From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B77823AE for ; Thu, 24 Nov 2022 10:28:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26949C433D6; Thu, 24 Nov 2022 10:28:45 +0000 (UTC) Message-ID: Date: Thu, 24 Nov 2022 11:28:44 +0100 Precedence: bulk X-Mailing-List: linux-staging@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Nicolas Dufresne , linux-media@vger.kernel.org, Ezequiel Garcia , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: kernel@collabora.com, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org References: <20220610125215.240539-1-nicolas.dufresne@collabora.com> <20220610125215.240539-3-nicolas.dufresne@collabora.com> <46211420a76c7608c34cd6b3569f41accdfd08a1.camel@collabora.com> From: Hans Verkuil Subject: Re: [PATCH v1 2/5] media: rkvdec: Add an ops to check for decode errors In-Reply-To: <46211420a76c7608c34cd6b3569f41accdfd08a1.camel@collabora.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi Nicolas, On 14/06/2022 18:14, Nicolas Dufresne wrote: > Le mardi 14 juin 2022 à 16:44 +0200, Hans Verkuil a écrit : >> On 6/10/22 14:52, Nicolas Dufresne wrote: >>> This optional internal ops allow each codec to do their own >>> error status checking. The presence of an error is reported >>> using the ERROR buffer state. This patch have no functional >>> changes. >> >> If a buffer is returned with state ERROR, then that means that it is >> seriously corrupt and userspace is expected to drop it. You might still >> want to show it for debugging purposes, but the normal action is to drop it. > > The discussion should be around the ERROR flag, and not the error state. Error > state is just an internal thing that have no meaning API wise, but turns out to > be the only way to get the ERROR flag to be set. With that in mind, this is not > what V4L2_BUF_FLAG_ERROR specification says: > >> When this flag is set, the buffer has been dequeued successfully, although >> the data might have been corrupted. This is recoverable, streaming may >> continue as normal and the buffer may be reused normally. Drivers set  >> this flag when the VIDIOC_DQBUF ioctl is called. > > For me "seriously corrupt" and "might have been corrupted" is very different. So I did some more digging (better late than never): the documentation for the stateful/stateless codecs explicitly states that ERROR should be used to indicate de/encoding errors. I am actually not that happy about that, since the original purpose of ERROR was really to indicate that there is something seriously wrong with the captured data, and applications should skip it, except for debugging purposes. But since it has been adopted in the codec documentation I have to accept this behavior for codecs. So I am OK with this series. There were some comments about some typos, so I will mark it as 'Changes Requested' in patchwork, but if you post a v2, then I'll take it. Regards, Hans > >> >> So this is not a valid approach for a decoder that can still produce a >> decent picture, albeit with macroblock artifacts. >> >> A separate control that can be returned as part of the request and contains >> some sort of error indication would be more appropriate. >> >> Buffer state ERROR is really meant for e.g. DMA errors and it shouldn't >> be mixed with decode errors that still produce a valid picture. > > The ERROR flag has been used for many years by the UVC driver to indicate a > partially received image (possibly due to DMA error). That driver went even > further and set the bytesused to the amount of bytes that was received. How this > have been interpreted (mostly due to how the spec around ERROR flag is written) > in GStreamer is that the buffer contains "some valid" data unless payload size > is 0. > > As explained earlier, the decision to display "some valid" data is not something > we should decided for our users. This should be left to the application to > decide. Same goes for GStreamer, if a buffer exist but has "some valid data", we > have a GST_BUFFER_FLAG_CORRUPTED flag for it. It is then up for the application > to drop if needed for the application. I'm pretty sure some stateful decoders > also behaves like this (simply because an error is an error, regardless of the > nature of it). > > It might be different today, but few years ago, dropping or not dropping was the > main difference between Apple Facetime (dropping) and the other video streaming > applications. One would freeze, the other would show "some valid data". > > If you look at the outcome of a partially corrupted decoded images and the > outcome of a mid-frame DMA error (typically from a camera stream), you'll find > that these are visually the same. So it is unfair to consider these two error so > different that a new mechanism must be added. In my opinion, adding RO controls > to signal these corruption only make sense if the hardware can provide detailed > reports of what is corrupted (list/range of macro-blocks, or CTU that are > affected). Then you could measure the level of corruption, but in reality, I > doubt there would be a vast usage of this, specially that the report will likely > be inconsistent due to limited HW support. > > Finally, in the bitstream decoder world, including all software decoders I've > worked with, the decode is a success only if all bits are perfectly decoded. > This is the baseline for good vs bad. Userland expected an image, and whatever > happened, in real-time scenario, it must send an image. Sending a corrupted > image, or sending the previously good image remains a decision to be made by > application. As application exist around the implemented mechanism here, I'd > prefer to go for that rather then adding a new API. > > Nicolas > >> >> Regards, >> >> Hans >> >>> >>> Signed-off-by: Nicolas Dufresne >>> --- >>> drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++---- >>> drivers/staging/media/rkvdec/rkvdec.h | 2 ++ >>> 2 files changed, 8 insertions(+), 4 deletions(-) >>> >>> diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c >>> index 7bab7586918c..7e76f8b72885 100644 >>> --- a/drivers/staging/media/rkvdec/rkvdec.c >>> +++ b/drivers/staging/media/rkvdec/rkvdec.c >>> @@ -950,6 +950,7 @@ static void rkvdec_v4l2_cleanup(struct rkvdec_dev *rkvdec) >>> static irqreturn_t rkvdec_irq_handler(int irq, void *priv) >>> { >>> struct rkvdec_dev *rkvdec = priv; >>> + struct rkvdec_ctx *ctx; >>> enum vb2_buffer_state state; >>> u32 status; >>> >>> @@ -958,12 +959,13 @@ static irqreturn_t rkvdec_irq_handler(int irq, void *priv) >>> VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR; >>> >>> writel(0, rkvdec->regs + RKVDEC_REG_INTERRUPT); >>> - if (cancel_delayed_work(&rkvdec->watchdog_work)) { >>> - struct rkvdec_ctx *ctx; >>> + ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); >>> >>> - ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); >>> + if (ctx->coded_fmt_desc->ops->check_error_info) >>> + state = ctx->coded_fmt_desc->ops->check_error_info(ctx); >>> + >>> + if (cancel_delayed_work(&rkvdec->watchdog_work)) >>> rkvdec_job_finish(ctx, state); >>> - } >>> >>> return IRQ_HANDLED; >>> } >>> diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h >>> index 633335ebb9c4..4ae8e6c6b03c 100644 >>> --- a/drivers/staging/media/rkvdec/rkvdec.h >>> +++ b/drivers/staging/media/rkvdec/rkvdec.h >>> @@ -73,6 +73,8 @@ struct rkvdec_coded_fmt_ops { >>> struct vb2_v4l2_buffer *dst_buf, >>> enum vb2_buffer_state result); >>> int (*try_ctrl)(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl); >>> + /* called from IRQ handler */ >>> + int (*check_error_info)(struct rkvdec_ctx *ctx); >>> }; >>> >>> struct rkvdec_coded_fmt_desc { >> > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BFA7AC433FE for ; Thu, 24 Nov 2022 10:29:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:Subject:From:References:Cc: To:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cAyXubelYv97r0aUJZpL0CC+MCUXmkRItdd6bzBPsJE=; b=MRQJ9A3efH0jpm R0rEzBHWzZzeMusCfrtGkVkMt787NBCSq2nh77irbFVs47RSwiGbJiycdRqT9v3U/ksdo5HMYzjjS dnZgo/G0pnYaEjwdKdWwQWlzODBt8Pf1m6E8yBEV/JUYa8GGXCY/MBE3MckNAqMq+trZDmqUhSmpO cnurtj5XWeHmCcMyhqH9iwAKRVSAGuiZHSUTSe926Gc/Rqb2arBWcB0jtnmKXouiyMAAvSbDyjjR6 uAGlI36u/tYQ0lzmEpoYM5w3eFuCHlZu6Zl23RCUTG3sU8xEoi+ifM8tJsi7EiLk1GNRtKLTFNYHo l7UUQ/FkFSjhPKtQNAYQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oy9Tg-007fnH-Nj; Thu, 24 Nov 2022 10:29:08 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oy9TN-007fdU-5D for linux-rockchip@lists.infradead.org; Thu, 24 Nov 2022 10:28:52 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 59FCF6206E; Thu, 24 Nov 2022 10:28:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26949C433D6; Thu, 24 Nov 2022 10:28:45 +0000 (UTC) Message-ID: Date: Thu, 24 Nov 2022 11:28:44 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Nicolas Dufresne , linux-media@vger.kernel.org, Ezequiel Garcia , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: kernel@collabora.com, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org References: <20220610125215.240539-1-nicolas.dufresne@collabora.com> <20220610125215.240539-3-nicolas.dufresne@collabora.com> <46211420a76c7608c34cd6b3569f41accdfd08a1.camel@collabora.com> From: Hans Verkuil Subject: Re: [PATCH v1 2/5] media: rkvdec: Add an ops to check for decode errors In-Reply-To: <46211420a76c7608c34cd6b3569f41accdfd08a1.camel@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221124_022849_340727_5DEEF407 X-CRM114-Status: GOOD ( 50.80 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgTmljb2xhcywKCk9uIDE0LzA2LzIwMjIgMTg6MTQsIE5pY29sYXMgRHVmcmVzbmUgd3JvdGU6 Cj4gTGUgbWFyZGkgMTQganVpbiAyMDIyIMOgIDE2OjQ0ICswMjAwLCBIYW5zIFZlcmt1aWwgYSDD qWNyaXTCoDoKPj4gT24gNi8xMC8yMiAxNDo1MiwgTmljb2xhcyBEdWZyZXNuZSB3cm90ZToKPj4+ IFRoaXMgb3B0aW9uYWwgaW50ZXJuYWwgb3BzIGFsbG93IGVhY2ggY29kZWMgdG8gZG8gdGhlaXIg b3duCj4+PiBlcnJvciBzdGF0dXMgY2hlY2tpbmcuIFRoZSBwcmVzZW5jZSBvZiBhbiBlcnJvciBp cyByZXBvcnRlZAo+Pj4gdXNpbmcgdGhlIEVSUk9SIGJ1ZmZlciBzdGF0ZS4gVGhpcyBwYXRjaCBo YXZlIG5vIGZ1bmN0aW9uYWwKPj4+IGNoYW5nZXMuCj4+Cj4+IElmIGEgYnVmZmVyIGlzIHJldHVy bmVkIHdpdGggc3RhdGUgRVJST1IsIHRoZW4gdGhhdCBtZWFucyB0aGF0IGl0IGlzCj4+IHNlcmlv dXNseSBjb3JydXB0IGFuZCB1c2Vyc3BhY2UgaXMgZXhwZWN0ZWQgdG8gZHJvcCBpdC4gWW91IG1p Z2h0IHN0aWxsCj4+IHdhbnQgdG8gc2hvdyBpdCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBidXQg dGhlIG5vcm1hbCBhY3Rpb24gaXMgdG8gZHJvcCBpdC4KPiAKPiBUaGUgZGlzY3Vzc2lvbiBzaG91 bGQgYmUgYXJvdW5kIHRoZSBFUlJPUiBmbGFnLCBhbmQgbm90IHRoZSBlcnJvciBzdGF0ZS4gRXJy b3IKPiBzdGF0ZSBpcyBqdXN0IGFuIGludGVybmFsIHRoaW5nIHRoYXQgaGF2ZSBubyBtZWFuaW5n IEFQSSB3aXNlLCBidXQgdHVybnMgb3V0IHRvCj4gYmUgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUg RVJST1IgZmxhZyB0byBiZSBzZXQuIFdpdGggdGhhdCBpbiBtaW5kLCB0aGlzIGlzIG5vdAo+IHdo YXQgVjRMMl9CVUZfRkxBR19FUlJPUiBzcGVjaWZpY2F0aW9uIHNheXM6Cj4gCj4+IFdoZW4gdGhp cyBmbGFnIGlzIHNldCwgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkZXF1ZXVlZCBzdWNjZXNzZnVsbHks IGFsdGhvdWdoCj4+IHRoZSBkYXRhIG1pZ2h0IGhhdmUgYmVlbiBjb3JydXB0ZWQuIFRoaXMgaXMg cmVjb3ZlcmFibGUsIHN0cmVhbWluZyBtYXkKPj4gY29udGludWUgYXMgbm9ybWFsIGFuZCB0aGUg YnVmZmVyIG1heSBiZSByZXVzZWQgbm9ybWFsbHkuIERyaXZlcnMgc2V0wqAKPj4gdGhpcyBmbGFn IHdoZW4gdGhlIFZJRElPQ19EUUJVRiBpb2N0bCBpcyBjYWxsZWQuCj4gCj4gRm9yIG1lICJzZXJp b3VzbHkgY29ycnVwdCIgYW5kICJtaWdodCBoYXZlIGJlZW4gY29ycnVwdGVkIiBpcyB2ZXJ5IGRp ZmZlcmVudC4KClNvIEkgZGlkIHNvbWUgbW9yZSBkaWdnaW5nIChiZXR0ZXIgbGF0ZSB0aGFuIG5l dmVyKTogdGhlIGRvY3VtZW50YXRpb24gZm9yCnRoZSBzdGF0ZWZ1bC9zdGF0ZWxlc3MgY29kZWNz IGV4cGxpY2l0bHkgc3RhdGVzIHRoYXQgRVJST1Igc2hvdWxkIGJlIHVzZWQKdG8gaW5kaWNhdGUg ZGUvZW5jb2RpbmcgZXJyb3JzLgoKSSBhbSBhY3R1YWxseSBub3QgdGhhdCBoYXBweSBhYm91dCB0 aGF0LCBzaW5jZSB0aGUgb3JpZ2luYWwgcHVycG9zZSBvZiBFUlJPUgp3YXMgcmVhbGx5IHRvIGlu ZGljYXRlIHRoYXQgdGhlcmUgaXMgc29tZXRoaW5nIHNlcmlvdXNseSB3cm9uZyB3aXRoIHRoZQpj YXB0dXJlZCBkYXRhLCBhbmQgYXBwbGljYXRpb25zIHNob3VsZCBza2lwIGl0LCBleGNlcHQgZm9y IGRlYnVnZ2luZyBwdXJwb3Nlcy4KCkJ1dCBzaW5jZSBpdCBoYXMgYmVlbiBhZG9wdGVkIGluIHRo ZSBjb2RlYyBkb2N1bWVudGF0aW9uIEkgaGF2ZSB0byBhY2NlcHQgdGhpcwpiZWhhdmlvciBmb3Ig Y29kZWNzLgoKU28gSSBhbSBPSyB3aXRoIHRoaXMgc2VyaWVzLiBUaGVyZSB3ZXJlIHNvbWUgY29t bWVudHMgYWJvdXQgc29tZSB0eXBvcywgc28KSSB3aWxsIG1hcmsgaXQgYXMgJ0NoYW5nZXMgUmVx dWVzdGVkJyBpbiBwYXRjaHdvcmssIGJ1dCBpZiB5b3UgcG9zdCBhIHYyLCB0aGVuCkknbGwgdGFr ZSBpdC4KClJlZ2FyZHMsCgoJSGFucwoKPiAKPj4KPj4gU28gdGhpcyBpcyBub3QgYSB2YWxpZCBh cHByb2FjaCBmb3IgYSBkZWNvZGVyIHRoYXQgY2FuIHN0aWxsIHByb2R1Y2UgYQo+PiBkZWNlbnQg cGljdHVyZSwgYWxiZWl0IHdpdGggbWFjcm9ibG9jayBhcnRpZmFjdHMuCj4+Cj4+IEEgc2VwYXJh dGUgY29udHJvbCB0aGF0IGNhbiBiZSByZXR1cm5lZCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0IGFu ZCBjb250YWlucwo+PiBzb21lIHNvcnQgb2YgZXJyb3IgaW5kaWNhdGlvbiB3b3VsZCBiZSBtb3Jl IGFwcHJvcHJpYXRlLgo+Pgo+PiBCdWZmZXIgc3RhdGUgRVJST1IgaXMgcmVhbGx5IG1lYW50IGZv ciBlLmcuIERNQSBlcnJvcnMgYW5kIGl0IHNob3VsZG4ndAo+PiBiZSBtaXhlZCB3aXRoIGRlY29k ZSBlcnJvcnMgdGhhdCBzdGlsbCBwcm9kdWNlIGEgdmFsaWQgcGljdHVyZS4KPiAKPiBUaGUgRVJS T1IgZmxhZyBoYXMgYmVlbiB1c2VkIGZvciBtYW55IHllYXJzIGJ5IHRoZSBVVkMgZHJpdmVyIHRv IGluZGljYXRlIGEKPiBwYXJ0aWFsbHkgcmVjZWl2ZWQgaW1hZ2UgKHBvc3NpYmx5IGR1ZSB0byBE TUEgZXJyb3IpLiBUaGF0IGRyaXZlciB3ZW50IGV2ZW4KPiBmdXJ0aGVyIGFuZCBzZXQgdGhlIGJ5 dGVzdXNlZCB0byB0aGUgYW1vdW50IG9mIGJ5dGVzIHRoYXQgd2FzIHJlY2VpdmVkLiBIb3cgdGhp cwo+IGhhdmUgYmVlbiBpbnRlcnByZXRlZCAobW9zdGx5IGR1ZSB0byBob3cgdGhlIHNwZWMgYXJv dW5kIEVSUk9SIGZsYWcgaXMgd3JpdHRlbikKPiBpbiBHU3RyZWFtZXIgaXMgdGhhdCB0aGUgYnVm ZmVyIGNvbnRhaW5zICJzb21lIHZhbGlkIiBkYXRhIHVubGVzcyBwYXlsb2FkIHNpemUKPiBpcyAw Lgo+IAo+IEFzIGV4cGxhaW5lZCBlYXJsaWVyLCB0aGUgZGVjaXNpb24gdG8gZGlzcGxheSAic29t ZSB2YWxpZCIgZGF0YSBpcyBub3Qgc29tZXRoaW5nCj4gd2Ugc2hvdWxkIGRlY2lkZWQgZm9yIG91 ciB1c2Vycy4gVGhpcyBzaG91bGQgYmUgbGVmdCB0byB0aGUgYXBwbGljYXRpb24gdG8KPiBkZWNp ZGUuIFNhbWUgZ29lcyBmb3IgR1N0cmVhbWVyLCBpZiBhIGJ1ZmZlciBleGlzdCBidXQgaGFzICJz b21lIHZhbGlkIGRhdGEiLCB3ZQo+IGhhdmUgYSBHU1RfQlVGRkVSX0ZMQUdfQ09SUlVQVEVEIGZs YWcgZm9yIGl0LiBJdCBpcyB0aGVuIHVwIGZvciB0aGUgYXBwbGljYXRpb24KPiB0byBkcm9wIGlm IG5lZWRlZCBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJJ20gcHJldHR5IHN1cmUgc29tZSBzdGF0ZWZ1 bCBkZWNvZGVycwo+IGFsc28gYmVoYXZlcyBsaWtlIHRoaXMgKHNpbXBseSBiZWNhdXNlIGFuIGVy cm9yIGlzIGFuIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQo+IG5hdHVyZSBvZiBpdCkuCj4gCj4g SXQgbWlnaHQgYmUgZGlmZmVyZW50IHRvZGF5LCBidXQgZmV3IHllYXJzIGFnbywgZHJvcHBpbmcg b3Igbm90IGRyb3BwaW5nIHdhcyB0aGUKPiBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBBcHBsZSBG YWNldGltZSAoZHJvcHBpbmcpIGFuZCB0aGUgb3RoZXIgdmlkZW8gc3RyZWFtaW5nCj4gYXBwbGlj YXRpb25zLiBPbmUgd291bGQgZnJlZXplLCB0aGUgb3RoZXIgd291bGQgc2hvdyAic29tZSB2YWxp ZCBkYXRhIi4KPiAKPiBJZiB5b3UgbG9vayBhdCB0aGUgb3V0Y29tZSBvZiBhIHBhcnRpYWxseSBj b3JydXB0ZWQgZGVjb2RlZCBpbWFnZXMgYW5kIHRoZQo+IG91dGNvbWUgb2YgYSBtaWQtZnJhbWUg RE1BIGVycm9yICh0eXBpY2FsbHkgZnJvbSBhIGNhbWVyYSBzdHJlYW0pLCB5b3UnbGwgZmluZAo+ IHRoYXQgdGhlc2UgYXJlIHZpc3VhbGx5IHRoZSBzYW1lLiBTbyBpdCBpcyB1bmZhaXIgdG8gY29u c2lkZXIgdGhlc2UgdHdvIGVycm9yIHNvCj4gZGlmZmVyZW50IHRoYXQgYSBuZXcgbWVjaGFuaXNt IG11c3QgYmUgYWRkZWQuIEluIG15IG9waW5pb24sIGFkZGluZyBSTyBjb250cm9scwo+IHRvIHNp Z25hbCB0aGVzZSBjb3JydXB0aW9uIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgaGFyZHdhcmUgY2Fu IHByb3ZpZGUgZGV0YWlsZWQKPiByZXBvcnRzIG9mIHdoYXQgaXMgY29ycnVwdGVkIChsaXN0L3Jh bmdlIG9mIG1hY3JvLWJsb2Nrcywgb3IgQ1RVIHRoYXQgYXJlCj4gYWZmZWN0ZWQpLiBUaGVuIHlv dSBjb3VsZCBtZWFzdXJlIHRoZSBsZXZlbCBvZiBjb3JydXB0aW9uLCBidXQgaW4gcmVhbGl0eSwg SQo+IGRvdWJ0IHRoZXJlIHdvdWxkIGJlIGEgdmFzdCB1c2FnZSBvZiB0aGlzLCBzcGVjaWFsbHkg dGhhdCB0aGUgcmVwb3J0IHdpbGwgbGlrZWx5Cj4gYmUgaW5jb25zaXN0ZW50IGR1ZSB0byBsaW1p dGVkIEhXIHN1cHBvcnQuCj4gCj4gRmluYWxseSwgaW4gdGhlIGJpdHN0cmVhbSBkZWNvZGVyIHdv cmxkLCBpbmNsdWRpbmcgYWxsIHNvZnR3YXJlIGRlY29kZXJzIEkndmUKPiB3b3JrZWQgd2l0aCwg dGhlIGRlY29kZSBpcyBhIHN1Y2Nlc3Mgb25seSBpZiBhbGwgYml0cyBhcmUgcGVyZmVjdGx5IGRl Y29kZWQuCj4gVGhpcyBpcyB0aGUgYmFzZWxpbmUgZm9yIGdvb2QgdnMgYmFkLiBVc2VybGFuZCBl eHBlY3RlZCBhbiBpbWFnZSwgYW5kIHdoYXRldmVyCj4gaGFwcGVuZWQsIGluIHJlYWwtdGltZSBz Y2VuYXJpbywgaXQgbXVzdCBzZW5kIGFuIGltYWdlLiBTZW5kaW5nIGEgY29ycnVwdGVkCj4gaW1h Z2UsIG9yIHNlbmRpbmcgdGhlIHByZXZpb3VzbHkgZ29vZCBpbWFnZSByZW1haW5zIGEgZGVjaXNp b24gdG8gYmUgbWFkZSBieQo+IGFwcGxpY2F0aW9uLiBBcyBhcHBsaWNhdGlvbiBleGlzdCBhcm91 bmQgdGhlIGltcGxlbWVudGVkIG1lY2hhbmlzbSBoZXJlLCBJJ2QKPiBwcmVmZXIgdG8gZ28gZm9y IHRoYXQgcmF0aGVyIHRoZW4gYWRkaW5nIGEgbmV3IEFQSS4KPiAKPiBOaWNvbGFzCj4gCj4+Cj4+ IFJlZ2FyZHMsCj4+Cj4+IAlIYW5zCj4+Cj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTogTmljb2xhcyBE dWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgo+Pj4gLS0tCj4+PiAgZHJp dmVycy9zdGFnaW5nL21lZGlhL3JrdmRlYy9ya3ZkZWMuYyB8IDEwICsrKysrKy0tLS0KPj4+ICBk cml2ZXJzL3N0YWdpbmcvbWVkaWEvcmt2ZGVjL3JrdmRlYy5oIHwgIDIgKysKPj4+ICAyIGZpbGVz IGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3JrdmRlYy9ya3ZkZWMuYyBiL2RyaXZlcnMvc3Rh Z2luZy9tZWRpYS9ya3ZkZWMvcmt2ZGVjLmMKPj4+IGluZGV4IDdiYWI3NTg2OTE4Yy4uN2U3NmY4 YjcyODg1IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3JrdmRlYy9ya3Zk ZWMuYwo+Pj4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3JrdmRlYy9ya3ZkZWMuYwo+Pj4g QEAgLTk1MCw2ICs5NTAsNyBAQCBzdGF0aWMgdm9pZCBya3ZkZWNfdjRsMl9jbGVhbnVwKHN0cnVj dCBya3ZkZWNfZGV2ICpya3ZkZWMpCj4+PiAgc3RhdGljIGlycXJldHVybl90IHJrdmRlY19pcnFf aGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2KQo+Pj4gIHsKPj4+ICAJc3RydWN0IHJrdmRlY19k ZXYgKnJrdmRlYyA9IHByaXY7Cj4+PiArCXN0cnVjdCBya3ZkZWNfY3R4ICpjdHg7Cj4+PiAgCWVu dW0gdmIyX2J1ZmZlcl9zdGF0ZSBzdGF0ZTsKPj4+ICAJdTMyIHN0YXR1czsKPj4+ICAKPj4+IEBA IC05NTgsMTIgKzk1OSwxMyBAQCBzdGF0aWMgaXJxcmV0dXJuX3Qgcmt2ZGVjX2lycV9oYW5kbGVy KGludCBpcnEsIHZvaWQgKnByaXYpCj4+PiAgCQlWQjJfQlVGX1NUQVRFX0RPTkUgOiBWQjJfQlVG X1NUQVRFX0VSUk9SOwo+Pj4gIAo+Pj4gIAl3cml0ZWwoMCwgcmt2ZGVjLT5yZWdzICsgUktWREVD X1JFR19JTlRFUlJVUFQpOwo+Pj4gLQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmcmt2ZGVjLT53 YXRjaGRvZ193b3JrKSkgewo+Pj4gLQkJc3RydWN0IHJrdmRlY19jdHggKmN0eDsKPj4+ICsJY3R4 ID0gdjRsMl9tMm1fZ2V0X2N1cnJfcHJpdihya3ZkZWMtPm0ybV9kZXYpOwo+Pj4gIAo+Pj4gLQkJ Y3R4ID0gdjRsMl9tMm1fZ2V0X2N1cnJfcHJpdihya3ZkZWMtPm0ybV9kZXYpOwo+Pj4gKwlpZiAo Y3R4LT5jb2RlZF9mbXRfZGVzYy0+b3BzLT5jaGVja19lcnJvcl9pbmZvKQo+Pj4gKwkJc3RhdGUg PSBjdHgtPmNvZGVkX2ZtdF9kZXNjLT5vcHMtPmNoZWNrX2Vycm9yX2luZm8oY3R4KTsKPj4+ICsK Pj4+ICsJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnJrdmRlYy0+d2F0Y2hkb2dfd29yaykpCj4+ PiAgCQlya3ZkZWNfam9iX2ZpbmlzaChjdHgsIHN0YXRlKTsKPj4+IC0JfQo+Pj4gIAo+Pj4gIAly ZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+PiAgfQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2lu Zy9tZWRpYS9ya3ZkZWMvcmt2ZGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcmt2ZGVjL3Jr dmRlYy5oCj4+PiBpbmRleCA2MzMzMzVlYmI5YzQuLjRhZThlNmM2YjAzYyAxMDA2NDQKPj4+IC0t LSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9ya3ZkZWMvcmt2ZGVjLmgKPj4+ICsrKyBiL2RyaXZl cnMvc3RhZ2luZy9tZWRpYS9ya3ZkZWMvcmt2ZGVjLmgKPj4+IEBAIC03Myw2ICs3Myw4IEBAIHN0 cnVjdCBya3ZkZWNfY29kZWRfZm10X29wcyB7Cj4+PiAgCQkgICAgIHN0cnVjdCB2YjJfdjRsMl9i dWZmZXIgKmRzdF9idWYsCj4+PiAgCQkgICAgIGVudW0gdmIyX2J1ZmZlcl9zdGF0ZSByZXN1bHQp Owo+Pj4gIAlpbnQgKCp0cnlfY3RybCkoc3RydWN0IHJrdmRlY19jdHggKmN0eCwgc3RydWN0IHY0 bDJfY3RybCAqY3RybCk7Cj4+PiArCS8qIGNhbGxlZCBmcm9tIElSUSBoYW5kbGVyICovCj4+PiAr CWludCAoKmNoZWNrX2Vycm9yX2luZm8pKHN0cnVjdCBya3ZkZWNfY3R4ICpjdHgpOwo+Pj4gIH07 Cj4+PiAgCj4+PiAgc3RydWN0IHJrdmRlY19jb2RlZF9mbXRfZGVzYyB7Cj4+Cj4gCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtcm9ja2NoaXAg bWFpbGluZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yb2NrY2hpcAo=