From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 7B546435AB for ; Fri, 17 Jun 2022 13:32:51 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5558168B8B8; Fri, 17 Jun 2022 16:32:20 +0300 (EEST) Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 35C9068B8CF for ; Fri, 17 Jun 2022 16:32:12 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id C3A2B24017C for ; Fri, 17 Jun 2022 15:32:11 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id pe3LK2vZXHyZ for ; Fri, 17 Jun 2022 15:32:10 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id F2F2724017E for ; Fri, 17 Jun 2022 15:32:08 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id DE04D3A11FE; Fri, 17 Jun 2022 15:32:08 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Jun 2022 15:32:03 +0200 Message-Id: <20220617133206.23643-2-anton@khirnov.net> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220617133206.23643-1-anton@khirnov.net> References: <20220617133206.23643-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/5] lavc: add standalone cached bitstream reader X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: RnJvbTogQWxleGFuZHJhIEjDoWprb3bDoSA8YWxleGFuZHJhLmtoaXJub3ZhQGdtYWlsLmNvbT4K ClRoZSBjYWNoZWQgYml0c3RyZWFtIHJlYWRlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEFs ZXhhbmRyYSBIw6Fqa292w6EKZm9yIExpYmF2LCB3aXRoIHNpZ25pZmljYW50IGlucHV0IGZyb20g S29zdHlhIFNoaXNoa292IGFuZCBMdWNhIEJhcmJhdG8uCkl0IHdhcyB0aGVuIGNvbW1pdHRlZCB0 byBGRm1wZWcgaW4gY2EwNzliMDk1NDksIGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKaW1wbGVtZW50 YXRpb24gb2YgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHJlYWRlci4KClRoaXMgbWVyZ2UgbWFrZXMg dGhlIGNvZGUgb2YgZ2V0X2JpdHMuaCBzaWduaWZpY2FudGx5IGhhcmRlciB0byByZWFkLApzaW5j ZSBpdCBub3cgY29udGFpbnMgdHdvIGRpZmZlcmVudCBiaXRzdHJlYW0gcmVhZGVycyBpbnRlcmxl YXZlZCB3aXRoCiAjaWZkZWZzLiBBZGRpdGlvbmFsbHksIHRoZSBjb2RlIHdhcyBjb21taXR0ZWQg d2l0aG91dCBwcm9wZXIgYXV0aG9yc2hpcAphdHRyaWJ1dGlvbi4KClRoaXMgY29tbWl0IHJlLWFk ZHMgdGhlIGNhY2hlZCBiaXRzdHJlYW0gcmVhZGVyIGFzIGEgc3RhbmRhbG9uZSBoZWFkZXIsCmFz IGl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZC4gSXQgd2lsbCBiZSBtYWRlIHVzZWZ1bCBpbiBm b2xsb3dpbmcKY29tbWl0cy4KCkludGVncmF0aW9uIGJ5IEFudG9uIEtoaXJub3YuCgpTaWduZWQt b2ZmLWJ5OiBBbnRvbiBLaGlybm92IDxhbnRvbkBraGlybm92Lm5ldD4KLS0tCiBsaWJhdmNvZGVj L2JpdHN0cmVhbS5oIHwgNDkwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiAxIGZpbGUgY2hhbmdlZCwgNDkwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBsaWJhdmNvZGVjL2JpdHN0cmVhbS5oCgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9iaXRzdHJl YW0uaCBiL2xpYmF2Y29kZWMvYml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uODVmMWFmMjhjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYml0 c3RyZWFtLmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxl eGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAq CisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwg d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLwor CisvKioKKyAqIEBmaWxlCisgKiBiaXRzdHJlYW0gcmVhZGVyIEFQSSBoZWFkZXIuCisgKi8KKwor I2lmbmRlZiBBVkNPREVDX0JJVFNUUkVBTV9ICisjZGVmaW5lIEFWQ09ERUNfQklUU1RSRUFNX0gK KworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRl ICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5o IgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNp bmNsdWRlICJ2bGMuaCIKKworI2lmbmRlZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorI2Rl ZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAhQ09ORklHX1NBRkVfQklUU1RSRUFNX1JF QURFUgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEJpdHN0cmVhbUNvbnRleHQgeworICAgIHVp bnQ2NF90IGJpdHM7ICAgICAgLy8gc3RvcmVzIGJpdHMgcmVhZCBmcm9tIHRoZSBidWZmZXIKKyAg ICBjb25zdCB1aW50OF90ICpidWZmZXIsICpidWZmZXJfZW5kOworICAgIGNvbnN0IHVpbnQ4X3Qg KnB0cjsgLy8gcG9pbnRlciB0byB0aGUgcG9zaXRpb24gaW5zaWRlIGEgYnVmZmVyCisgICAgdW5z aWduZWQgYml0c19sZWZ0OyAvLyBudW1iZXIgb2YgYml0cyBsZWZ0IGluIGJpdHMgZmllbGQKKyAg ICB1bnNpZ25lZCBzaXplX2luX2JpdHM7Cit9IEJpdHN0cmVhbUNvbnRleHQ7CisKK3N0YXRpYyBp bmxpbmUgdm9pZCByZWZpbGxfNjQoQml0c3RyZWFtQ29udGV4dCAqYmMpCit7CisjaWYgIVVOQ0hF Q0tFRF9CSVRTVFJFQU1fUkVBREVSCisgICAgaWYgKGJjLT5wdHIgPj0gYmMtPmJ1ZmZlcl9lbmQp CisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQor ICAgIGJjLT5iaXRzICAgICAgID0gQVZfUkw2NChiYy0+cHRyKTsKKyNlbHNlCisgICAgYmMtPmJp dHMgICAgICAgPSBBVl9SQjY0KGJjLT5wdHIpOworI2VuZGlmCisgICAgYmMtPnB0ciAgICAgICAr PSA4OworICAgIGJjLT5iaXRzX2xlZnQgID0gNjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBy ZWZpbGxfMzIoQml0c3RyZWFtQ29udGV4dCAqYmMpCit7CisjaWYgIVVOQ0hFQ0tFRF9CSVRTVFJF QU1fUkVBREVSCisgICAgaWYgKGJjLT5wdHIgPj0gYmMtPmJ1ZmZlcl9lbmQpCisgICAgICAgIHJl dHVybjsKKyNlbmRpZgorCisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorICAgIGJjLT5iaXRz ICAgICAgID0gKHVpbnQ2NF90KUFWX1JMMzIoYmMtPnB0cikgPDwgYmMtPmJpdHNfbGVmdCB8IGJj LT5iaXRzOworI2Vsc2UKKyAgICBiYy0+Yml0cyAgICAgICA9IGJjLT5iaXRzIHwgKHVpbnQ2NF90 KUFWX1JCMzIoYmMtPnB0cikgPDwgKDMyIC0gYmMtPmJpdHNfbGVmdCk7CisjZW5kaWYKKyAgICBi Yy0+cHRyICAgICAgICs9IDQ7CisgICAgYmMtPmJpdHNfbGVmdCArPSAzMjsKK30KKworLyoqCisg KiBJbml0aWFsaXplIEJpdHN0cmVhbUNvbnRleHQuCisgKiBAcGFyYW0gYnVmZmVyIGJpdHN0cmVh bSBidWZmZXIsIG11c3QgYmUgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcworICog ICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRp bWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgcmVhZGVycyByZWFkIDMyIG9yIDY0IGJpdHMgYXQg b25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQKKyAqIEBwYXJhbSBiaXRfc2l6ZSB0aGUg c2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJpdHMKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBBVkVS Uk9SX0lOVkFMSUREQVRBIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZCBvdmVyZmxvdy4KKyAqLwor c3RhdGljIGlubGluZSBpbnQgYml0c3RyZWFtX2luaXQoQml0c3RyZWFtQ29udGV4dCAqYmMsIGNv bnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCBiaXRfc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CisK KyAgICBpZiAoYml0X3NpemUgPiBJTlRfTUFYIC0gNyB8fCAhYnVmZmVyKSB7CisgICAgICAgIGJj LT5idWZmZXIgICAgPSBOVUxMOworICAgICAgICBiYy0+cHRyICAgICAgID0gTlVMTDsKKyAgICAg ICAgYmMtPmJpdHNfbGVmdCA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRB OworICAgIH0KKworICAgIGJ1ZmZlcl9zaXplID0gKGJpdF9zaXplICsgNykgPj4gMzsKKworICAg IGJjLT5idWZmZXIgICAgICAgPSBidWZmZXI7CisgICAgYmMtPmJ1ZmZlcl9lbmQgICA9IGJ1ZmZl ciArIGJ1ZmZlcl9zaXplOworICAgIGJjLT5wdHIgICAgICAgICAgPSBiYy0+YnVmZmVyOworICAg IGJjLT5zaXplX2luX2JpdHMgPSBiaXRfc2l6ZTsKKyAgICBiYy0+Yml0c19sZWZ0ICAgID0gMDsK KyAgICBiYy0+Yml0cyAgICAgICAgID0gMDsKKworICAgIHJlZmlsbF82NChiYyk7CisKKyAgICBy ZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIEJpdHN0cmVhbUNvbnRleHQuCisgKiBA cGFyYW0gYnVmZmVyIGJpdHN0cmVhbSBidWZmZXIsIG11c3QgYmUgQVZfSU5QVVRfQlVGRkVSX1BB RERJTkdfU0laRSBieXRlcworICogICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBi aXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgcmVhZGVycyBy ZWFkIDMyIG9yIDY0IGJpdHMgYXQgb25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQKKyAq IEBwYXJhbSBieXRlX3NpemUgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcworICogQHJl dHVybiAwIG9uIHN1Y2Nlc3MsIEFWRVJST1JfSU5WQUxJRERBVEEgaWYgdGhlIGJ1ZmZlcl9zaXpl IHdvdWxkIG92ZXJmbG93CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdHN0cmVhbV9pbml0OChC aXRzdHJlYW1Db250ZXh0ICpiYywgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlX3NpemUpCit7CisgICAgaWYg KGJ5dGVfc2l6ZSA+IElOVF9NQVggLyA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElE REFUQTsKKyAgICByZXR1cm4gYml0c3RyZWFtX2luaXQoYmMsIGJ1ZmZlciwgYnl0ZV9zaXplICog OCk7Cit9CisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBiaXRzIGFscmVhZHkgcmVhZC4KKyAq Lworc3RhdGljIGlubGluZSBpbnQgYml0c3RyZWFtX3RlbGwoY29uc3QgQml0c3RyZWFtQ29udGV4 dCAqYmMpCit7CisgICAgcmV0dXJuIChiYy0+cHRyIC0gYmMtPmJ1ZmZlcikgKiA4IC0gYmMtPmJp dHNfbGVmdDsKK30KKworLyoqCisgKiBSZXR1cm4gYnVmZmVyIHNpemUgaW4gYml0cy4KKyAqLwor c3RhdGljIGlubGluZSBpbnQgYml0c3RyZWFtX3RlbGxfc2l6ZShjb25zdCBCaXRzdHJlYW1Db250 ZXh0ICpiYykKK3sKKyAgICByZXR1cm4gYmMtPnNpemVfaW5fYml0czsKK30KKworLyoqCisgKiBS ZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgYml0cyBsZWZ0IGluIGEgYnVmZmVyLgorICovCitzdGF0 aWMgaW5saW5lIGludCBiaXRzdHJlYW1fYml0c19sZWZ0KGNvbnN0IEJpdHN0cmVhbUNvbnRleHQg KmJjKQoreworICAgIHJldHVybiAoYmMtPmJ1ZmZlciAtIGJjLT5wdHIpICogOCArIGJjLT5zaXpl X2luX2JpdHMgKyBiYy0+Yml0c19sZWZ0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdl dF92YWwoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIHVpbnQ2 NF90IHJldDsKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICByZXQgPSBiYy0+Yml0 cyAmICgoVUlOVDY0X0MoMSkgPDwgbikgLSAxKTsKKyAgICBiYy0+Yml0cyA+Pj0gbjsKKyNlbHNl CisgICAgcmV0ID0gYmMtPmJpdHMgPj4gKDY0IC0gbik7CisgICAgYmMtPmJpdHMgPDw9IG47Cisj ZW5kaWYKKyAgICBiYy0+Yml0c19sZWZ0IC09IG47CisKKyAgICByZXR1cm4gcmV0OworfQorCisv KioKKyAqIFJldHVybiBvbmUgYml0IGZyb20gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX3JlYWRfYml0KEJpdHN0cmVhbUNvbnRleHQgKmJjKQor eworICAgIGlmICghYmMtPmJpdHNfbGVmdCkKKyAgICAgICAgcmVmaWxsXzY0KGJjKTsKKworICAg IHJldHVybiBnZXRfdmFsKGJjLCAxKTsKK30KKworLyoqCisgKiBSZXR1cm4gbiBiaXRzIGZyb20g dGhlIGJ1ZmZlciwgbiBoYXMgdG8gYmUgaW4gdGhlIDAtNjMgcmFuZ2UuCisgKi8KK3N0YXRpYyBp bmxpbmUgdWludDY0X3QgYml0c3RyZWFtX3JlYWRfNjMoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVu c2lnbmVkIGludCBuKQoreworICAgIHVpbnQ2NF90IHJldCA9IDA7CisjaWZkZWYgQklUU1RSRUFN X1JFQURFUl9MRQorICAgIHVpbnQ2NF90IGxlZnQgPSAwOworI2VuZGlmCisKKyAgICBpZiAoIW4p CisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG4gPiBiYy0+Yml0c19sZWZ0KSB7CisgICAg ICAgIG4gLT0gYmMtPmJpdHNfbGVmdDsKKyNpZmRlZiBCSVRTVFJFQU1fUkVBREVSX0xFCisgICAg ICAgIGxlZnQgPSBiYy0+Yml0c19sZWZ0OworI2VuZGlmCisgICAgICAgIHJldCA9IGdldF92YWwo YmMsIGJjLT5iaXRzX2xlZnQpOworICAgICAgICByZWZpbGxfNjQoYmMpOworICAgIH0KKworI2lm ZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICByZXQgPSBnZXRfdmFsKGJjLCBuKSA8PCBsZWZ0 IHwgcmV0OworI2Vsc2UKKyAgICByZXQgPSBnZXRfdmFsKGJjLCBuKSB8IHJldCA8PCBuOworI2Vu ZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFJldHVybiBuIGJpdHMgZnJvbSB0 aGUgYnVmZmVyLCBuIGhhcyB0byBiZSBpbiB0aGUgMC0zMiAgcmFuZ2UuCisgKi8KK3N0YXRpYyBp bmxpbmUgdWludDMyX3QgYml0c3RyZWFtX3JlYWQoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2ln bmVkIGludCBuKQoreworICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAo biA+IGJjLT5iaXRzX2xlZnQpIHsKKyAgICAgICAgcmVmaWxsXzMyKGJjKTsKKyAgICAgICAgaWYg KGJjLT5iaXRzX2xlZnQgPCAzMikKKyAgICAgICAgICAgIGJjLT5iaXRzX2xlZnQgPSBuOworICAg IH0KKworICAgIHJldHVybiBnZXRfdmFsKGJjLCBuKTsKK30KKworLyoqCisgKiBSZXR1cm4gbiBi aXRzIGZyb20gdGhlIGJ1ZmZlciBhcyBhIHNpZ25lZCBpbnRlZ2VyLgorICogbiBoYXMgdG8gYmUg aW4gdGhlIDAtMzIgcmFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBiaXRzdHJlYW1f cmVhZF9zaWduZWQoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQoreworICAg IHJldHVybiBzaWduX2V4dGVuZChiaXRzdHJlYW1fcmVhZChiYywgbiksIG4pOworfQorCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGludCBzaG93X3ZhbChCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5z aWduZWQgaW50IG4pCit7CisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorICAgIHJldHVybiBi Yy0+Yml0cyAmICgoVUlOVDY0X0MoMSkgPDwgbikgLSAxKTsKKyNlbHNlCisgICAgcmV0dXJuIGJj LT5iaXRzID4+ICg2NCAtIG4pOworI2VuZGlmCit9CisKKy8qKgorICogUmV0dXJuIG4gYml0cyBm cm9tIHRoZSBidWZmZXIgYnV0IGRvIG5vdCBjaGFuZ2UgdGhlIGJ1ZmZlciBzdGF0ZS4KKyAqIG4g aGFzIHRvIGJlIGluIHRoZSAwLTMyIHJhbmdlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGludCBiaXRzdHJlYW1fcGVlayhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4p Cit7CisgICAgaWYgKG4gPiBiYy0+Yml0c19sZWZ0KQorICAgICAgICByZWZpbGxfMzIoYmMpOwor CisgICAgcmV0dXJuIHNob3dfdmFsKGJjLCBuKTsKK30KKworLyoqCisgKiBSZXR1cm4gbiBiaXRz IGZyb20gdGhlIGJ1ZmZlciBhcyBhIHNpZ25lZCBpbnRlZ2VyLAorICogZG8gbm90IGNoYW5nZSB0 aGUgYnVmZmVyIHN0YXRlLgorICogbiBoYXMgdG8gYmUgaW4gdGhlIDAtMzIgcmFuZ2UuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50IGJpdHN0cmVhbV9wZWVrX3NpZ25lZChCaXRzdHJlYW1Db250ZXh0 ICpiYywgdW5zaWduZWQgaW50IG4pCit7CisgICAgcmV0dXJuIHNpZ25fZXh0ZW5kKGJpdHN0cmVh bV9wZWVrKGJjLCBuKSwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX3JlbWFpbmlu ZyhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCit7CisjaWZkZWYgQklUU1RS RUFNX1JFQURFUl9MRQorICAgIGJjLT5iaXRzID4+PSBuOworI2Vsc2UKKyAgICBiYy0+Yml0cyA8 PD0gbjsKKyNlbmRpZgorICAgIGJjLT5iaXRzX2xlZnQgLT0gbjsKK30KKworLyoqCisgKiBTa2lw IG4gYml0cyBpbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYml0c3RyZWFt X3NraXAoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIGlmIChu IDwgYmMtPmJpdHNfbGVmdCkKKyAgICAgICAgc2tpcF9yZW1haW5pbmcoYmMsIG4pOworICAgIGVs c2UgeworICAgICAgICBuIC09IGJjLT5iaXRzX2xlZnQ7CisgICAgICAgIGJjLT5iaXRzICAgICAg PSAwOworICAgICAgICBiYy0+Yml0c19sZWZ0ID0gMDsKKworICAgICAgICBpZiAobiA+PSA2NCkg eworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNraXAgPSBuIC8gODsKKworICAgICAgICAgICAg biAtPSBza2lwICogODsKKyAgICAgICAgICAgIGJjLT5wdHIgKz0gc2tpcDsKKyAgICAgICAgfQor ICAgICAgICByZWZpbGxfNjQoYmMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIHNraXBf cmVtYWluaW5nKGJjLCBuKTsKKyAgICB9Cit9CisKKy8qKgorICogU2VlayB0byB0aGUgZ2l2ZW4g Yml0IHBvc2l0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYml0c3RyZWFtX3NlZWsoQml0 c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIHBvcykKK3sKKyAgICBiYy0+cHRyICAgICAgID0g YmMtPmJ1ZmZlcjsKKyAgICBiYy0+Yml0cyAgICAgID0gMDsKKyAgICBiYy0+Yml0c19sZWZ0ID0g MDsKKworICAgIGJpdHN0cmVhbV9za2lwKGJjLCBwb3MpOworfQorCisvKioKKyAqIFNraXAgYml0 cyB0byBhIGJ5dGUgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgdWludDhfdCAq Yml0c3RyZWFtX2FsaWduKEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworICAgIHVuc2lnbmVkIGlu dCBuID0gLWJpdHN0cmVhbV90ZWxsKGJjKSAmIDc7CisgICAgaWYgKG4pCisgICAgICAgIGJpdHN0 cmVhbV9za2lwKGJjLCBuKTsKKyAgICByZXR1cm4gYmMtPmJ1ZmZlciArIChiaXRzdHJlYW1fdGVs bChiYykgPj4gMyk7Cit9CisKKy8qKgorICogUmVhZCBNUEVHLTEgZGMtc3R5bGUgVkxDIChzaWdu IGJpdCArIG1hbnRpc3NhIHdpdGggbm8gTVNCKS4KKyAqIElmIE1TQiBub3Qgc2V0IGl0IGlzIG5l Z2F0aXZlLgorICogQHBhcmFtIG4gbGVuZ3RoIGluIGJpdHMKKyAqLworc3RhdGljIGlubGluZSBp bnQgYml0c3RyZWFtX3JlYWRfeGJpdHMoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGlu dCBuKQoreworICAgIGludDMyX3QgY2FjaGUgPSBiaXRzdHJlYW1fcGVlayhiYywgMzIpOworICAg IGludCBzaWduID0gfmNhY2hlID4+IDMxOworICAgIHNraXBfcmVtYWluaW5nKGJjLCBuKTsKKwor ICAgIHJldHVybiAoKCgodWludDMyX3QpKHNpZ24gXiBjYWNoZSkpID4+ICgzMiAtIG4pKSBeIHNp Z24pIC0gc2lnbjsKK30KKworLyoqCisgKiBSZXR1cm4gZGVjb2RlZCB0cnVuY2F0ZWQgdW5hcnkg Y29kZSBmb3IgdGhlIHZhbHVlcyAwLCAxLCAyLgorICovCitzdGF0aWMgaW5saW5lIGludCBiaXRz dHJlYW1fZGVjb2RlMDEyKEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworICAgIGlmICghYml0c3Ry ZWFtX3JlYWRfYml0KGJjKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICBy ZXR1cm4gYml0c3RyZWFtX3JlYWRfYml0KGJjKSArIDE7Cit9CisKKy8qKgorICogUmV0dXJuIGRl Y29kZWQgdHJ1bmNhdGVkIHVuYXJ5IGNvZGUgZm9yIHRoZSB2YWx1ZXMgMiwgMSwgMC4KKyAqLwor c3RhdGljIGlubGluZSBpbnQgYml0c3RyZWFtX2RlY29kZTIxMChCaXRzdHJlYW1Db250ZXh0ICpi YykKK3sKKyAgICBpZiAoYml0c3RyZWFtX3JlYWRfYml0KGJjKSkKKyAgICAgICAgcmV0dXJuIDA7 CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMiAtIGJpdHN0cmVhbV9yZWFkX2JpdChiYyk7Cit9 CisKKy8qIFJlYWQgc2lnbiBiaXQgYW5kIGZsaXAgdGhlIHNpZ24gb2YgdGhlIHByb3ZpZGVkIHZh bHVlIGFjY29yZGluZ2x5LiAqLworc3RhdGljIGlubGluZSBpbnQgYml0c3RyZWFtX2FwcGx5X3Np Z24oQml0c3RyZWFtQ29udGV4dCAqYmMsIGludCB2YWwpCit7CisgICAgaW50IHNpZ24gPSBiaXRz dHJlYW1fcmVhZF9zaWduZWQoYmMsIDEpOworICAgIHJldHVybiAodmFsIF4gc2lnbikgLSBzaWdu OworfQorCitzdGF0aWMgaW5saW5lIGludCBiaXRzdHJlYW1fc2tpcF8xc3RvcF84ZGF0YShCaXRz dHJlYW1Db250ZXh0ICpzKQoreworICAgIGlmIChiaXRzdHJlYW1fYml0c19sZWZ0KHMpIDw9IDAp CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgd2hpbGUgKGJpdHN0 cmVhbV9yZWFkKHMsIDEpKSB7CisgICAgICAgIGJpdHN0cmVhbV9za2lwKHMsIDgpOworICAgICAg ICBpZiAoYml0c3RyZWFtX2JpdHNfbGVmdChzKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIEFW RVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFVud2lu ZCB0aGUgY2FjaGUgc28gYSByZWZpbGxfMzIgY2FuIGZpbGwgaXQgYWdhaW4uICovCitzdGF0aWMg aW5saW5lIHZvaWQgYml0c3RyZWFtX3Vud2luZChCaXRzdHJlYW1Db250ZXh0ICpiYykKK3sKKyAg ICBpbnQgdW53aW5kID0gNDsKKyAgICBpbnQgdW53aW5kX2JpdHMgPSB1bndpbmQgKiA4OworCisg ICAgaWYgKGJjLT5iaXRzX2xlZnQgPCB1bndpbmRfYml0cykKKyAgICAgICAgcmV0dXJuOworCisg ICAgYmMtPmJpdHMgICAgICA+Pj0gdW53aW5kX2JpdHM7CisgICAgYmMtPmJpdHMgICAgICA8PD0g dW53aW5kX2JpdHM7CisgICAgYmMtPmJpdHNfbGVmdCAgLT0gdW53aW5kX2JpdHM7CisgICAgYmMt PnB0ciAgICAgICAgLT0gdW53aW5kOworfQorCisvKiBVbmdldCB1cCB0byAzMiBiaXRzLiAqLwor c3RhdGljIGlubGluZSB2b2lkIGJpdHN0cmVhbV91bmdldChCaXRzdHJlYW1Db250ZXh0ICpiYywg dWludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVf dCBhbW91bnQpCit7CisgICAgc2l6ZV90IGNhY2hlX3NpemUgPSBzaXplb2YoYmMtPmJpdHMpICog ODsKKworICAgIGlmIChiYy0+Yml0c19sZWZ0ICsgYW1vdW50ID4gY2FjaGVfc2l6ZSkKKyAgICAg ICAgYml0c3RyZWFtX3Vud2luZChiYyk7CisKKyAgICBiYy0+Yml0cyAgICAgICA9IChiYy0+Yml0 cyA+PiBhbW91bnQpIHwgKHZhbHVlIDw8IChjYWNoZV9zaXplIC0gYW1vdW50KSk7CisgICAgYmMt PmJpdHNfbGVmdCArPSBhbW91bnQ7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBMVVQgZWxlbWVu dCBmb3IgdGhlIGdpdmVuIGJpdHN0cmVhbSBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgaW5s aW5lIGludCBzZXRfaWR4KEJpdHN0cmVhbUNvbnRleHQgKmJjLCBpbnQgY29kZSwgaW50ICpuLCBp bnQgKm5iX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQ19UWVBFICgqdGFibGUp WzJdKQoreworICAgIHVuc2lnbmVkIGlkeDsKKworICAgICpuYl9iaXRzID0gLSpuOworICAgIGlk eCA9IGJpdHN0cmVhbV9wZWVrKGJjLCAqbmJfYml0cykgKyBjb2RlOworICAgICpuID0gdGFibGVb aWR4XVsxXTsKKworICAgIHJldHVybiB0YWJsZVtpZHhdWzBdOworfQorCisvKioKKyAqIFBhcnNl IGEgdmxjIGNvZGUuCisgKiBAcGFyYW0gYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgd2hpY2gg d2lsbCBiZSByZWFkIGF0IG9uY2UsIG11c3QgYmUKKyAqICAgICAgICAgICAgIGlkZW50aWNhbCB0 byBuYl9iaXRzIGluIGluaXRfdmxjKCkKKyAqIEBwYXJhbSBtYXhfZGVwdGggaXMgdGhlIG51bWJl ciBvZiB0aW1lcyBiaXRzIGJpdHMgbXVzdCBiZSByZWFkIHRvIGNvbXBsZXRlbHkKKyAqICAgICAg ICAgICAgICAgICAgcmVhZCB0aGUgbG9uZ2VzdCB2bGMgY29kZQorICogICAgICAgICAgICAgICAg ICA9IChtYXhfdmxjX2xlbmd0aCArIGJpdHMgLSAxKSAvIGJpdHMKKyAqIElmIHRoZSB2bGMgY29k ZSBpcyBpbnZhbGlkIGFuZCBtYXhfZGVwdGg9MSwgdGhlbiBubyBiaXRzIHdpbGwgYmUgcmVtb3Zl ZC4KKyAqIElmIHRoZSB2bGMgY29kZSBpcyBpbnZhbGlkIGFuZCBtYXhfZGVwdGg+MSwgdGhlbiB0 aGUgbnVtYmVyIG9mIGJpdHMgcmVtb3ZlZAorICogaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMg aW5saW5lIGludCBiaXRzdHJlYW1fcmVhZF92bGMoQml0c3RyZWFtQ29udGV4dCAqYmMsIFZMQ19U WVBFICgqdGFibGUpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dCBiaXRzLCBpbnQgbWF4X2RlcHRoKQoreworICAgIGludCBuYl9iaXRzOworICAgIHVuc2lnbmVk IGlkeCA9IGJpdHN0cmVhbV9wZWVrKGJjLCBiaXRzKTsKKyAgICBpbnQgY29kZSAgICAgPSB0YWJs ZVtpZHhdWzBdOworICAgIGludCBuICAgICAgICA9IHRhYmxlW2lkeF1bMV07CisKKyAgICBpZiAo bWF4X2RlcHRoID4gMSAmJiBuIDwgMCkgeworICAgICAgICBza2lwX3JlbWFpbmluZyhiYywgYml0 cyk7CisgICAgICAgIGNvZGUgPSBzZXRfaWR4KGJjLCBjb2RlLCAmbiwgJm5iX2JpdHMsIHRhYmxl KTsKKyAgICAgICAgaWYgKG1heF9kZXB0aCA+IDIgJiYgbiA8IDApIHsKKyAgICAgICAgICAgIHNr aXBfcmVtYWluaW5nKGJjLCBuYl9iaXRzKTsKKyAgICAgICAgICAgIGNvZGUgPSBzZXRfaWR4KGJj LCBjb2RlLCAmbiwgJm5iX2JpdHMsIHRhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBza2lw X3JlbWFpbmluZyhiYywgbik7CisKKyAgICByZXR1cm4gY29kZTsKK30KKworI2RlZmluZSBCSVRT VFJFQU1fUkxfVkxDKGxldmVsLCBydW4sIGJjLCB0YWJsZSwgYml0cywgbWF4X2RlcHRoKSBcCisg ICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKyAgICAgICAgaW50IG4sIG5iX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBiaXRzdHJl YW1fcGVlayhiYywgYml0cyk7ICAgICAgICAgICBcCisgICAgICAgIGxldmVsID0gdGFibGVbaW5k ZXhdLmxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbiAgICAg PSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgIGlmIChtYXhfZGVwdGggPiAxICYmIG4gPCAwKSB7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJpdHN0cmVhbV9za2lwKGJjLCBiaXRzKTsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuYl9i aXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAorICAgICAgICAgICAgaW5kZXggPSBiaXRzdHJlYW1fcGVlayhiYywgbmJfYml0cykgKyBs ZXZlbDsgICAgICAgICBcCisgICAgICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG4gICAgID0gdGFibGVbaW5k ZXhdLmxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG1h eF9kZXB0aCA+IDIgJiYgbiA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAg ICAgICAgICAgYml0c3RyZWFtX3NraXAoYmMsIG5iX2JpdHMpOyAgICAgICAgICAgICAgICAgICAg IFwKKyAgICAgICAgICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW5kZXggPSBiaXRzdHJl YW1fcGVlayhiYywgbmJfYml0cykgKyBsZXZlbDsgICAgIFwKKyAgICAgICAgICAgICAgICBsZXZl bCA9IHRhYmxlW2luZGV4XS5sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAg ICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhdLmxlbjsgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBydW4gPSB0YWJsZVtpbmRleF0ucnVuOyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpdHN0cmVhbV9za2lw KGJjLCBuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxl ICgwKQorCisjZW5kaWYgLyogQVZDT0RFQ19CSVRTVFJFQU1fSCAqLwotLSAKMi4zNC4xCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpmZm1wZWctZGV2ZWwg bWFpbGluZyBsaXN0CmZmbXBlZy1kZXZlbEBmZm1wZWcub3JnCmh0dHBzOi8vZmZtcGVnLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbAoKVG8gdW5zdWJzY3JpYmUsIHZpc2l0IGxpbmsg YWJvdmUsIG9yIGVtYWlsCmZmbXBlZy1kZXZlbC1yZXF1ZXN0QGZmbXBlZy5vcmcgd2l0aCBzdWJq ZWN0ICJ1bnN1YnNjcmliZSIuCg==