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 D7FC9420B0 for ; Tue, 22 Feb 2022 11:26:41 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D0F0568B0A7; Tue, 22 Feb 2022 13:26:38 +0200 (EET) Received: from shout01.mail.de (shout01.mail.de [62.201.172.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA82868094F for ; Tue, 22 Feb 2022 13:26:32 +0200 (EET) Received: from postfix01.mail.de (postfix02.bt.mail.de [10.0.121.126]) by shout01.mail.de (Postfix) with ESMTP id 46AFCA1DD9 for ; Tue, 22 Feb 2022 12:26:32 +0100 (CET) Received: from smtp02.mail.de (smtp02.bt.mail.de [10.0.121.212]) by postfix01.mail.de (Postfix) with ESMTP id 2DEA3A03C1 for ; Tue, 22 Feb 2022 12:26:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mail.de; s=mailde202009; t=1645529192; bh=HPJNx0mxq8QQMOhzPWWADcjtazAIuhYZm4GvNBoZY9M=; h=Message-ID:Date:Subject:To:From:From:To:CC:Subject:Reply-To; b=o0QGAUH9E45EyEGdmDhObEOF//Q8Co1Y3+qEVWIDpN3QFB7XEFvduJUc2qBwg3CgK LVXAEd7YWksrMmA2/kyiwJljbJAUGr3EejE1Y1Q1KoD7Y9TdTy32pLmXA1IBiWK3Gg vJhRvDr309sps1/2fwTVCmYsnfJuzAoIoqVDkiNG7dRR2Ci/Kg5PD6Eg0yjNcSHE8b S120wJg67QejHTf8KnWkPoJl5oOkLX5q+GcReYigLTQEF9cxgLayAc4zRPaHFluKIm bZmASvBT73hZdUpcAQ2YiqS+xGPQ56HWxsbx8aLfb1u3gH0YSSO5cbglVdUigc5Q/1 /wHpTTs0gLz/Q== Received: from [127.0.0.1] (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtp02.mail.de (Postfix) with ESMTPSA id C8926A04DB for ; Tue, 22 Feb 2022 12:26:31 +0100 (CET) Content-Type: multipart/mixed; boundary="------------Irm224Tir0YhENvLgQkDyrAW" Message-ID: <2aa0196e-71bd-34c7-11b0-25739347b435@mail.de> Date: Tue, 22 Feb 2022 12:26:31 +0100 MIME-Version: 1.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20210115045832.76405-1-borbarak@fb.com> <3fa8e9b2-6824-eb3a-2390-22fd024efa9f@mail.de> <164363001951.23111.4989616914372511566@lain.red.khirnov.net> <164491528780.19727.15494655440668021866@lain.red.khirnov.net> From: Thilo Borgmann In-Reply-To: <164491528780.19727.15494655440668021866@lain.red.khirnov.net> X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 26613 X-purgate-ID: 154282::1645529191-00002C8C-CBB66B89/0/0 Subject: Re: [FFmpeg-devel] [PATCH] avfilter: Added siti filter 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------Irm224Tir0YhENvLgQkDyrAW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Am 15.02.22 um 09:54 schrieb Anton Khirnov: > Quoting Thilo Borgmann (2022-02-12 11:55:39) >> Am 31.01.22 um 12:55 schrieb James Almer: >> +static int config_input(AVFilterLink *inlink) >> +{ >> + // Video input data avilable >> + AVFilterContext *ctx = inlink->dst; >> + SiTiContext *s = ctx->priv; >> + int max_pixsteps[4]; >> + size_t pixel_sz; >> + size_t data_sz; >> + size_t gradient_sz; >> + size_t motion_sz; >> + >> + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); >> + av_image_fill_max_pixsteps(max_pixsteps, NULL, desc); >> + >> + s->pixel_depth = max_pixsteps[0]; >> + s->width = inlink->w; >> + s->height = inlink->h; >> + pixel_sz = s->pixel_depth == 1 ? sizeof(uint8_t) : sizeof(uint16_t); >> + data_sz = s->width * pixel_sz * s->height; >> + >> + s->prev_frame = av_malloc(data_sz); >> + >> + gradient_sz = (s->width - 2) * sizeof(double) * (s->height - 2); >> + s->gradient_matrix = (double*)av_malloc(gradient_sz); >> + >> + motion_sz = s->width * sizeof(double) * s->height; >> + s->motion_matrix = (double*)av_malloc(motion_sz); > > useless casts > >> + >> + if (!s->prev_frame || ! s->gradient_matrix || !s->motion_matrix) { >> + av_freep(&s->prev_frame); >> + av_freep(&s->gradient_matrix); >> + av_freep(&s->motion_matrix); > > You don't need to free them on failure, that will be done in uninit. But > you should free them at the beginning of this function, because > config_input can be called multiple times. Always freep'd and fail on alloc error. >> +// Applies sobel convolution >> +static void convolve_sobel(SiTiContext *s, const uint8_t *src, double *dst, int linesize) >> +{ >> + double x_conv_sum; >> + double y_conv_sum; >> + double gradient; >> + int ki; >> + int kj; >> + int index; >> + uint16_t data; >> + int filter_width = 3; >> + int filter_size = filter_width * filter_width; >> + int stride = linesize / s->pixel_depth; >> + >> + // Dst matrix is smaller than src since we ignore edges that can't be convolved >> + #define CONVOLVE(bps) \ >> + { \ >> + uint##bps##_t *vsrc = (uint##bps##_t*)src; \ >> + for (int j = 1; j < s->height - 1; j++) { \ >> + for (int i = 1; i < s->width - 1; i++) { \ >> + x_conv_sum = 0.0; \ >> + y_conv_sum = 0.0; \ >> + for (int k = 0; k < filter_size; k++) { \ >> + ki = k % filter_width - 1; \ >> + kj = floor(k / filter_width) - 1; \ >> + index = (j + kj) * stride + (i + ki); \ >> + data = convert_full_range(s, vsrc[index]); \ > > Pass bps as a parameter to convert_full_range() instead of accessing > s->pixel_depth, so the compiler can optimize the branch away. I am not sure if the changes I did here suit the optimization you had in mind... pls check if v4 does this right. > >> +// Calculate pixel difference between current and previous frame, and update previous >> +static void calculate_motion(SiTiContext *s, const uint8_t *curr, >> + double *motion_matrix, int linesize) >> +{ >> + int stride = linesize / s->pixel_depth; >> + double motion; >> + int curr_index; >> + int prev_index; >> + uint16_t curr_data; >> + >> + // Previous frame is already converted to full range >> + #define CALCULATE(bps) \ >> + { \ >> + uint##bps##_t *vsrc = (uint##bps##_t*)curr; \ >> + for (int j = 0; j < s->height; j++) { \ >> + for (int i = 0; i < s->width; i++) { \ >> + motion = 0; \ >> + curr_index = j * stride + i; \ >> + prev_index = j * s->width + i; \ >> + curr_data = convert_full_range(s, vsrc[curr_index]); \ >> + if (s->nb_frames > 1) \ >> + motion = curr_data - s->prev_frame[prev_index]; \ >> + s->prev_frame[prev_index] = curr_data; \ > > previous code accessed this as uint8_t or uint16_t based on bps > Fixed in v4. Attached. Thanks, Thilo --------------Irm224Tir0YhENvLgQkDyrAW Content-Type: text/plain; charset=UTF-8; name="v4-0001-lavfilter-Add-SITI-filter.patch" Content-Disposition: attachment; filename="v4-0001-lavfilter-Add-SITI-filter.patch" Content-Transfer-Encoding: base64 RnJvbSA4ZjJjNDEwZGJmYzdlODY1MWM2NjU0Y2U1N2VmZTE0NGRiYTYyNTkyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCb3JpcyBCYXJhY2FsZG8gPGJvcmJhcmFrQGZiLmNv bT4KRGF0ZTogVHVlLCAyMiBGZWIgMjAyMiAxMjoyMzowNyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggdjRdIGxhdmZpbHRlcjogQWRkIFNJVEkgZmlsdGVyCgpDYWxjdWxhdGUgU3BhdGlhbCBJ bmZvIChTSSkgYW5kIFRlbXBvcmFsIEluZm8gKFRJKSBzY29yZXMgZm9yIGEgdmlkZW8sIGFz IGRlZmluZWQKaW4gSVRVLVQgUC45MTA6IFN1YmplY3RpdmUgdmlkZW8gcXVhbGl0eSBhc3Nl c3NtZW50IG1ldGhvZHMgZm9yIG11bHRpbWVkaWEKYXBwbGljYXRpb25zLgotLS0KIENoYW5n ZWxvZyAgICAgICAgICAgICAgICB8ICAgMSArCiBkb2MvZmlsdGVycy50ZXhpICAgICAgICAg fCAgMjMgKysrCiBsaWJhdmZpbHRlci9NYWtlZmlsZSAgICAgfCAgIDEgKwogbGliYXZmaWx0 ZXIvYWxsZmlsdGVycy5jIHwgICAxICsKIGxpYmF2ZmlsdGVyL3ZlcnNpb24uaCAgICB8ICAg MiArLQogbGliYXZmaWx0ZXIvdmZfc2l0aS5jICAgIHwgMzQ4ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAzNzUgaW5zZXJ0aW9u cygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2ZmlsdGVyL3Zm X3NpdGkuYwoKZGlmZiAtLWdpdCBhL0NoYW5nZWxvZyBiL0NoYW5nZWxvZwppbmRleCAzZGRl MzMyNmJlLi5kY2IyYzM2OGQyIDEwMDY0NAotLS0gYS9DaGFuZ2Vsb2cKKysrIGIvQ2hhbmdl bG9nCkBAIC0xMzIsNiArMTMyLDcgQEAgdmVyc2lvbiA0LjQ6CiAtIG1zYWQgdmlkZW8gZmls dGVyCiAtIGdvcGhlcnMgcHJvdG9jb2wKIC0gUklTVCBwcm90b2NvbCB2aWEgbGlicmlzdAor LSBzaXRpIGZpbHRlcgogCiAKIHZlcnNpb24gNC4zOgpkaWZmIC0tZ2l0IGEvZG9jL2ZpbHRl cnMudGV4aSBiL2RvYy9maWx0ZXJzLnRleGkKaW5kZXggMDVkNGIxYTU2ZS4uZjhhOGEyY2I3 MiAxMDA2NDQKLS0tIGEvZG9jL2ZpbHRlcnMudGV4aQorKysgYi9kb2MvZmlsdGVycy50ZXhp CkBAIC0xOTg3NSw2ICsxOTg3NSwyOSBAQCBmZm1wZWcgLWkgaW5wdXQxLm1rdiAtaSBpbnB1 dDIubWt2IC1maWx0ZXJfY29tcGxleCAiWzA6dl1bMTp2XSBzaWduYXR1cmU9bmJfaW5wdQog CiBAZW5kIGl0ZW1pemUKIAorQGFuY2hvcntzaXRpfQorQHNlY3Rpb24gc2l0aQorCitDYWxj dWxhdGUgU3BhdGlhbCBJbmZvIChTSSkgYW5kIFRlbXBvcmFsIEluZm8gKFRJKSBzY29yZXMg Zm9yIGEgdmlkZW8sIGFzIGRlZmluZWQKK2luIElUVS1UIFAuOTEwOiBTdWJqZWN0aXZlIHZp ZGVvIHF1YWxpdHkgYXNzZXNzbWVudCBtZXRob2RzIGZvciBtdWx0aW1lZGlhCithcHBsaWNh dGlvbnMuIEF2YWlsYWJsZSBQREYgYXQgQHVybHtodHRwczovL3d3dy5pdHUuaW50L3JlYy9U LVJFQy1QLjkxMC0xOTk5MDktUy9lbiB9LgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcg b3B0aW9uOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcHJpbnRfc3VtbWFyeQorSWYgc2V0 IHRvIDEsIFN1bW1hcnkgc3RhdGlzdGljcyB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNv bGUuIERlZmF1bHQgMC4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKK0Bp dGVtaXplCitAaXRlbQorVG8gY2FsY3VsYXRlIFNJL1RJIG1ldHJpY3MgYW5kIHByaW50IHN1 bW1hcnk6CitAZXhhbXBsZQorZmZtcGVnIC1pIGlucHV0Lm1wNCAtdmYgc2l0aT1wcmludF9z dW1tYXJ5PTEgLWYgbnVsbCAtCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAYW5j aG9ye3NtYXJ0Ymx1cn0KIEBzZWN0aW9uIHNtYXJ0Ymx1cgogCmRpZmYgLS1naXQgYS9saWJh dmZpbHRlci9NYWtlZmlsZSBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCmluZGV4IDFhZGJlYTc1 YmQuLjMyNjFkMDUzMTEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL01ha2VmaWxlCisrKyBi L2xpYmF2ZmlsdGVyL01ha2VmaWxlCkBAIC00NTQsNiArNDU0LDcgQEAgT0JKUy0kKENPTkZJ R19TTUFSVEJMVVJfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfc21hcnRibHVyLm8KIE9C SlMtJChDT05GSUdfU09CRUxfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX2NvbnZv bHV0aW9uLm8KIE9CSlMtJChDT05GSUdfU09CRUxfT1BFTkNMX0ZJTFRFUikgICAgICAgICAg ICs9IHZmX2NvbnZvbHV0aW9uX29wZW5jbC5vIG9wZW5jbC5vIFwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5jbC9jb252b2x1dGlvbi5v CitPQkpTLSQoQ09ORklHX1NJVElfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl9z aXRpLm8KIE9CSlMtJChDT05GSUdfU1BMSVRfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9 IHNwbGl0Lm8KIE9CSlMtJChDT05GSUdfU1BQX0ZJTFRFUikgICAgICAgICAgICAgICAgICAg ICs9IHZmX3NwcC5vIHFwX3RhYmxlLm8KIE9CSlMtJChDT05GSUdfU1JfRklMVEVSKSAgICAg ICAgICAgICAgICAgICAgICs9IHZmX3NyLm8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2Fs bGZpbHRlcnMuYyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwppbmRleCA0MzI1YTNlNTU3 Li44MDhjMTcyYjI4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMKKysr IGIvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jCkBAIC00MzAsNiArNDMwLDcgQEAgZXh0ZXJu IGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3NodWZmbGVwbGFuZXM7CiBleHRlcm4gY29uc3QgQVZG aWx0ZXIgZmZfdmZfc2lkZWRhdGE7CiBleHRlcm4gY29uc3QgQVZGaWx0ZXIgZmZfdmZfc2ln bmFsc3RhdHM7CiBleHRlcm4gY29uc3QgQVZGaWx0ZXIgZmZfdmZfc2lnbmF0dXJlOworZXh0 ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3NpdGk7CiBleHRlcm4gY29uc3QgQVZGaWx0ZXIg ZmZfdmZfc21hcnRibHVyOwogZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3NvYmVsOwog ZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3NvYmVsX29wZW5jbDsKZGlmZiAtLWdpdCBh L2xpYmF2ZmlsdGVyL3ZlcnNpb24uaCBiL2xpYmF2ZmlsdGVyL3ZlcnNpb24uaAppbmRleCAx YTk4NDllZjgyLi44OTcxNGJjZTg0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92ZXJzaW9u LmgKKysrIGIvbGliYXZmaWx0ZXIvdmVyc2lvbi5oCkBAIC0zMCw3ICszMCw3IEBACiAjaW5j bHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKIAogI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJT SU9OX01BSk9SICAgOAotI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SICAyNQor I2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SICAyNgogI2RlZmluZSBMSUJBVkZJ TFRFUl9WRVJTSU9OX01JQ1JPIDEwMAogCiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3Zm X3NpdGkuYyBiL2xpYmF2ZmlsdGVyL3ZmX3NpdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwLi5iYWU2YWUzYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZm aWx0ZXIvdmZfc2l0aS5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChj KSAyMDIxIEJvcmlzIEJhcmFjYWxkbworICogQ29weXJpZ2h0IChjKSAyMDIyIFRoaWxvIEJv cmdtYW5uIAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBG Rm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBu b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1 MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEg VVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIENhbGN1bGF0ZSBTcGF0aWFsIEluZm8g KFNJKSBhbmQgVGVtcG9yYWwgSW5mbyAoVEkpIHNjb3JlcworICovCisKKyNpbmNsdWRlIDxt YXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJs aWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNp bmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJp bnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3N0YXRpYyBjb25zdCBpbnQgWF9G SUxURVJbOV0gPSB7CisgICAgMSwgMCwgLTEsCisgICAgMiwgMCwgLTIsCisgICAgMSwgMCwg LTEKK307CisKK3N0YXRpYyBjb25zdCBpbnQgWV9GSUxURVJbOV0gPSB7CisgICAgMSwgMiwg MSwKKyAgICAwLCAwLCAwLAorICAgIC0xLCAtMiwgLTEKK307CisKK3R5cGVkZWYgc3RydWN0 IFNpVGlDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgcGl4 ZWxfZGVwdGg7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgdWludDY0X3QgbmJfZnJh bWVzOworICAgIHVpbnQ4X3QgKnByZXZfZnJhbWU7CisgICAgZmxvYXQgbWF4X3NpOworICAg IGZsb2F0IG1heF90aTsKKyAgICBmbG9hdCBtaW5fc2k7CisgICAgZmxvYXQgbWluX3RpOwor ICAgIGZsb2F0IHN1bV9zaTsKKyAgICBmbG9hdCBzdW1fdGk7CisgICAgZmxvYXQgKmdyYWRp ZW50X21hdHJpeDsKKyAgICBmbG9hdCAqbW90aW9uX21hdHJpeDsKKyAgICBpbnQgZnVsbF9y YW5nZTsKKyAgICBpbnQgcHJpbnRfc3VtbWFyeTsKK30gU2lUaUNvbnRleHQ7CisKK3N0YXRp YyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhf Rk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICBBVl9QSVhfRk1UX1lVVko0 MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBB Vl9QSVhfRk1UX1lVVjQyMlAxMCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRp YyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8vIFVz ZXIgb3B0aW9ucyBidXQgbm8gaW5wdXQgZGF0YQorICAgIFNpVGlDb250ZXh0ICpzID0gY3R4 LT5wcml2OworICAgIHMtPm1heF9zaSA9IDA7CisgICAgcy0+bWF4X3RpID0gMDsKKyAgICBy ZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250 ZXh0ICpjdHgpCit7CisgICAgU2lUaUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBp ZiAocy0+cHJpbnRfc3VtbWFyeSkgeworICAgICAgICBmbG9hdCBhdmdfc2kgPSBzLT5zdW1f c2kgLyBzLT5uYl9mcmFtZXM7CisgICAgICAgIGZsb2F0IGF2Z190aSA9IHMtPnN1bV90aSAv IHMtPm5iX2ZyYW1lczsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAg ICAgICAgICAgICAiU0lUSSBTdW1tYXJ5OlxuVG90YWwgZnJhbWVzOiAlIlBSSWQ2NCJcblxu IgorICAgICAgICAgICAgICAgIlNwYXRpYWwgSW5mb3JtYXRpb246XG5BdmVyYWdlOiAlZlxu TWF4OiAlZlxuTWluOiAlZlxuXG4iCisgICAgICAgICAgICAgICAiVGVtcG9yYWwgSW5mb3Jt YXRpb246XG5BdmVyYWdlOiAlZlxuTWF4OiAlZlxuTWluOiAlZlxuIiwKKyAgICAgICAgICAg ICAgIHMtPm5iX2ZyYW1lcywgYXZnX3NpLCBzLT5tYXhfc2ksIHMtPm1pbl9zaSwgYXZnX3Rp LCBzLT5tYXhfdGksIHMtPm1pbl90aQorICAgICAgICApOworICAgIH0KKworICAgIGF2X2Zy ZWVwKCZzLT5wcmV2X2ZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+Z3JhZGllbnRfbWF0cml4 KTsKKyAgICBhdl9mcmVlcCgmcy0+bW90aW9uX21hdHJpeCk7Cit9CisKK3N0YXRpYyBpbnQg Y29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIC8vIFZpZGVvIGlu cHV0IGRhdGEgYXZpbGFibGUKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ ZHN0OworICAgIFNpVGlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBtYXhfcGl4 c3RlcHNbNF07CisgICAgc2l6ZV90IHBpeGVsX3N6OworICAgIHNpemVfdCBkYXRhX3N6Owor ICAgIHNpemVfdCBncmFkaWVudF9zejsKKyAgICBzaXplX3QgbW90aW9uX3N6OworCisgICAg Y29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChp bmxpbmstPmZvcm1hdCk7CisgICAgYXZfaW1hZ2VfZmlsbF9tYXhfcGl4c3RlcHMobWF4X3Bp eHN0ZXBzLCBOVUxMLCBkZXNjKTsKKworICAgIC8vIGZyZWUgcHJldmlvdXMgYnVmZmVycyBp biBjYXNlIHRoZXkgYXJlIGFsbG9jYXRlZCBhbHJlYWR5CisgICAgYXZfZnJlZXAoJnMtPnBy ZXZfZnJhbWUpOworICAgIGF2X2ZyZWVwKCZzLT5ncmFkaWVudF9tYXRyaXgpOworICAgIGF2 X2ZyZWVwKCZzLT5tb3Rpb25fbWF0cml4KTsKKworICAgIHMtPnBpeGVsX2RlcHRoID0gbWF4 X3BpeHN0ZXBzWzBdOworICAgIHMtPndpZHRoID0gaW5saW5rLT53OworICAgIHMtPmhlaWdo dCA9IGlubGluay0+aDsKKyAgICBwaXhlbF9zeiA9IHMtPnBpeGVsX2RlcHRoID09IDEgPyBz aXplb2YodWludDhfdCkgOiBzaXplb2YodWludDE2X3QpOworICAgIGRhdGFfc3ogPSBzLT53 aWR0aCAqIHBpeGVsX3N6ICogcy0+aGVpZ2h0OworCisgICAgcy0+cHJldl9mcmFtZSA9IGF2 X21hbGxvYyhkYXRhX3N6KTsKKworICAgIGdyYWRpZW50X3N6ID0gKHMtPndpZHRoIC0gMikg KiBzaXplb2YoZmxvYXQpICogKHMtPmhlaWdodCAtIDIpOworICAgIHMtPmdyYWRpZW50X21h dHJpeCA9IChmbG9hdCopYXZfbWFsbG9jKGdyYWRpZW50X3N6KTsKKworICAgIG1vdGlvbl9z eiA9IHMtPndpZHRoICogc2l6ZW9mKGZsb2F0KSAqIHMtPmhlaWdodDsKKyAgICBzLT5tb3Rp b25fbWF0cml4ID0gKGZsb2F0Kilhdl9tYWxsb2MobW90aW9uX3N6KTsKKworICAgIGlmICgh cy0+cHJldl9mcmFtZSB8fCAhIHMtPmdyYWRpZW50X21hdHJpeCB8fCAhcy0+bW90aW9uX21h dHJpeCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAg IHJldHVybiAwOworfQorCisvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmlkZW8gaXMgaW4g ZnVsbCBvciBsaW1pdGVkIHJhbmdlLiBJZiBub3QgZGVmaW5lZCwgYXNzdW1lIGxpbWl0ZWQu CitzdGF0aWMgaW50IGlzX2Z1bGxfcmFuZ2UoQVZGcmFtZSogZnJhbWUpCit7CisgICAgLy8g SWYgY29sb3IgcmFuZ2Ugbm90IHNwZWNpZmllZCwgZmFsbGJhY2sgdG8gcGl4ZWwgZm9ybWF0 CisgICAgaWYgKGZyYW1lLT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9VTlNQRUNJRklF RCB8fCBmcmFtZS0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfTkIpCisgICAgICAgIHJl dHVybiBmcmFtZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWSjQyMFAgfHwgZnJhbWUtPmZv cm1hdCA9PSBBVl9QSVhfRk1UX1lVVko0MjJQOworICAgIHJldHVybiBmcmFtZS0+Y29sb3Jf cmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRzsKK30KKworLy8gQ2hlY2sgZnJhbWUncyBjb2xv ciByYW5nZSBhbmQgY29udmVydCB0byBmdWxsIHJhbmdlIGlmIG5lZWRlZAorc3RhdGljIHVp bnQxNl90IGNvbnZlcnRfZnVsbF9yYW5nZShpbnQgZmFjdG9yLCB1aW50MTZfdCB5KQorewor ICAgIGludCBzaGlmdDsKKyAgICBpbnQgbGltaXRfdXBwZXI7CisgICAgaW50IGZ1bGxfdXBw ZXI7CisgICAgaW50IGxpbWl0X3k7CisKKyAgICAvLyBGb3IgOCBiaXRzLCBsaW1pdGVkIHJh bmdlIGdvZXMgZnJvbSAxNiB0byAyMzUsIGZvciAxMCBiaXRzIHRoZSByYW5nZSBpcyBtdWx0 aXBsaWVkIGJ5IDQKKyAgICBzaGlmdCA9IDE2ICogZmFjdG9yOworICAgIGxpbWl0X3VwcGVy ID0gMjM1ICogZmFjdG9yIC0gc2hpZnQ7CisgICAgZnVsbF91cHBlciA9IDI1NiAqIGZhY3Rv ciAtIDE7CisgICAgbGltaXRfeSA9IGZtaW4oZm1heCh5IC0gc2hpZnQsIDApLCBsaW1pdF91 cHBlcik7CisgICAgcmV0dXJuIChmdWxsX3VwcGVyICogbGltaXRfeSAvIGxpbWl0X3VwcGVy KTsKK30KKworLy8gQXBwbGllcyBzb2JlbCBjb252b2x1dGlvbgorc3RhdGljIHZvaWQgY29u dm9sdmVfc29iZWwoU2lUaUNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgZmxvYXQg KmRzdCwgaW50IGxpbmVzaXplKQoreworICAgIGZsb2F0IHhfY29udl9zdW07CisgICAgZmxv YXQgeV9jb252X3N1bTsKKyAgICBmbG9hdCBncmFkaWVudDsKKyAgICBpbnQga2k7CisgICAg aW50IGtqOworICAgIGludCBpbmRleDsKKyAgICB1aW50MTZfdCBkYXRhOworICAgIGludCBm aWx0ZXJfd2lkdGggPSAzOworICAgIGludCBmaWx0ZXJfc2l6ZSA9IGZpbHRlcl93aWR0aCAq IGZpbHRlcl93aWR0aDsKKyAgICBpbnQgc3RyaWRlID0gbGluZXNpemUgLyBzLT5waXhlbF9k ZXB0aDsKKyAgICAvLyBGb3IgOCBiaXRzLCBsaW1pdGVkIHJhbmdlIGdvZXMgZnJvbSAxNiB0 byAyMzUsIGZvciAxMCBiaXRzIHRoZSByYW5nZSBpcyBtdWx0aXBsaWVkIGJ5IDQKKyAgICBp bnQgZmFjdG9yID0gcy0+cGl4ZWxfZGVwdGggPT0gMSA/IDEgOiA0OworCisgICAgLy8gRHN0 IG1hdHJpeCBpcyBzbWFsbGVyIHRoYW4gc3JjIHNpbmNlIHdlIGlnbm9yZSBlZGdlcyB0aGF0 IGNhbid0IGJlIGNvbnZvbHZlZAorICAgICNkZWZpbmUgQ09OVk9MVkUoYnBzKSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICAgICAgdWludCMjYnBzIyNfdCAqdnNyYyA9ICh1aW50IyNicHMjI190KilzcmM7ICAg ICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IHMtPmhlaWdo dCAtIDE7IGorKykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGlu dCBpID0gMTsgaSA8IHMtPndpZHRoIC0gMTsgaSsrKSB7ICAgICAgICAgICAgICAgIFwKKyAg ICAgICAgICAgICAgICB4X2NvbnZfc3VtID0gMC4wOyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHlfY29udl9zdW0gPSAwLjA7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yIChp bnQgayA9IDA7IGsgPCBmaWx0ZXJfc2l6ZTsgaysrKSB7ICAgICAgICAgICAgIFwKKyAgICAg ICAgICAgICAgICAgICAga2kgPSBrICUgZmlsdGVyX3dpZHRoIC0gMTsgICAgICAgICAgICAg ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBraiA9IGZsb29yKGsgLyBmaWx0ZXJf d2lkdGgpIC0gMTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGluZGV4 ID0gKGogKyBraikgKiBzdHJpZGUgKyAoaSArIGtpKTsgICAgICAgICAgIFwKKyAgICAgICAg ICAgICAgICAgICAgZGF0YSA9IHMtPmZ1bGxfcmFuZ2UgPyB2c3JjW2luZGV4XSA6IGNvbnZl cnRfZnVsbF9yYW5nZShmYWN0b3IsIHZzcmNbaW5kZXhdKTsgXAorICAgICAgICAgICAgICAg ICAgICB4X2NvbnZfc3VtICs9IGRhdGEgKiBYX0ZJTFRFUltrXTsgICAgICAgICAgICAgICBc CisgICAgICAgICAgICAgICAgICAgIHlfY29udl9zdW0gKz0gZGF0YSAqIFlfRklMVEVSW2td OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdy YWRpZW50ID0gc3FydCh4X2NvbnZfc3VtICogeF9jb252X3N1bSArIHlfY29udl9zdW0gKiB5 X2NvbnZfc3VtKTsgXAorICAgICAgICAgICAgICAgIGRzdFsoaiAtIDEpICogKHMtPndpZHRo IC0gMikgKyAoaSAtIDEpXSA9IGdyYWRpZW50OyBcCisgICAgICAgICAgICB9ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg ICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAorICAgIH0KKworICAgIGlmIChzLT5waXhlbF9kZXB0aCA9PSAyKSB7Cisg ICAgICAgIENPTlZPTFZFKDE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBDT05WT0xWRSg4 KTsKKyAgICB9Cit9CisKKy8vIENhbGN1bGF0ZSBwaXhlbCBkaWZmZXJlbmNlIGJldHdlZW4g Y3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWUsIGFuZCB1cGRhdGUgcHJldmlvdXMKK3N0YXRp YyB2b2lkIGNhbGN1bGF0ZV9tb3Rpb24oU2lUaUNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3Qg KmN1cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptb3Rpb25fbWF0 cml4LCBpbnQgbGluZXNpemUpCit7CisgICAgaW50IHN0cmlkZSA9IGxpbmVzaXplIC8gcy0+ cGl4ZWxfZGVwdGg7CisgICAgZmxvYXQgbW90aW9uOworICAgIGludCBjdXJyX2luZGV4Owor ICAgIGludCBwcmV2X2luZGV4OworICAgIHVpbnQxNl90IGN1cnJfZGF0YTsKKyAgICAvLyBG b3IgOCBiaXRzLCBsaW1pdGVkIHJhbmdlIGdvZXMgZnJvbSAxNiB0byAyMzUsIGZvciAxMCBi aXRzIHRoZSByYW5nZSBpcyBtdWx0aXBsaWVkIGJ5IDQKKyAgICBpbnQgZmFjdG9yID0gcy0+ cGl4ZWxfZGVwdGggPT0gMSA/IDEgOiA0OworCisgICAgLy8gUHJldmlvdXMgZnJhbWUgaXMg YWxyZWFkeSBjb252ZXJ0ZWQgdG8gZnVsbCByYW5nZQorICAgICNkZWZpbmUgQ0FMQ1VMQVRF KGJwcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICB1aW50IyNicHMjI190ICp2c3JjID0gKHVpbnQjI2Jw cyMjX3QqKWN1cnI7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50IyNicHMjI190 ICp2ZHN0ID0gKHVpbnQjI2JwcyMjX3QqKXMtPnByZXZfZnJhbWU7ICAgICAgICAgXAorICAg ICAgICBmb3IgKGludCBqID0gMDsgaiA8IHMtPmhlaWdodDsgaisrKSB7ICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLT53aWR0 aDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1vdGlv biA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg ICAgICAgICAgICAgIGN1cnJfaW5kZXggPSBqICogc3RyaWRlICsgaTsgICAgICAgICAgICAg ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByZXZfaW5kZXggPSBqICogcy0+d2lk dGggKyBpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGN1cnJf ZGF0YSA9IHMtPmZ1bGxfcmFuZ2UgPyB2c3JjW2N1cnJfaW5kZXhdIDogY29udmVydF9mdWxs X3JhbmdlKGZhY3RvciwgdnNyY1tjdXJyX2luZGV4XSk7IFwKKyAgICAgICAgICAgICAgICBp ZiAocy0+bmJfZnJhbWVzID4gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICAgICAgICAgICAgICAgICAgbW90aW9uID0gY3Vycl9kYXRhIC0gdmRzdFtwcmV2X2lu ZGV4XTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB2ZHN0W3ByZXZfaW5kZXhdID0g Y3Vycl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBt b3Rpb25fbWF0cml4W2ogKiBzLT53aWR0aCArIGldID0gbW90aW9uOyAgICAgICAgICAgIFwK KyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBpZiAo cy0+cGl4ZWxfZGVwdGggPT0gMikgeworICAgICAgICBDQUxDVUxBVEUoMTYpOworICAgIH0g ZWxzZSB7CisgICAgICAgIENBTENVTEFURSg4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBmbG9h dCBzdGRfZGV2aWF0aW9uKGZsb2F0ICppbWdfbWV0cmljcywgaW50IHdpZHRoLCBpbnQgaGVp Z2h0KQoreworICAgIGludCBzaXplID0gaGVpZ2h0ICogd2lkdGg7CisgICAgZmxvYXQgbWVh biA9IDAuMDsKKyAgICBmbG9hdCBzcXJfZGlmZiA9IDA7CisKKyAgICBmb3IgKGludCBqID0g MDsgaiA8IGhlaWdodDsgaisrKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRo OyBpKyspCisgICAgICAgICAgICBtZWFuICs9IGltZ19tZXRyaWNzW2ogKiB3aWR0aCArIGld OworCisgICAgbWVhbiAvPSBzaXplOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoZWln aHQ7IGorKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsK KyAgICAgICAgICAgIGZsb2F0IG1lYW5fZGlmZiA9IGltZ19tZXRyaWNzW2ogKiB3aWR0aCAr IGldIC0gbWVhbjsKKyAgICAgICAgICAgIHNxcl9kaWZmICs9IChtZWFuX2RpZmYgKiBtZWFu X2RpZmYpOworICAgICAgICB9CisgICAgfQorICAgIHNxcl9kaWZmID0gc3FyX2RpZmYgLyBz aXplOworICAgIHJldHVybiBzcXJ0KHNxcl9kaWZmKTsKK30KKworc3RhdGljIHZvaWQgc2V0 X21ldGEoQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGNvbnN0IGNoYXIgKmtleSwgZmxvYXQg ZCkKK3sKKyAgICBjaGFyIHZhbHVlWzEyOF07CisgICAgc25wcmludGYodmFsdWUsIHNpemVv Zih2YWx1ZSksICIlMC4yZiIsIGQpOworICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCBrZXks IHZhbHVlLCAwKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5r ICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4 ID0gaW5saW5rLT5kc3Q7CisgICAgU2lUaUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAg ZmxvYXQgc2k7CisgICAgZmxvYXQgdGk7CisKKyAgICBzLT5mdWxsX3JhbmdlID0gaXNfZnVs bF9yYW5nZShmcmFtZSk7CisgICAgcy0+bmJfZnJhbWVzKys7CisKKyAgICAvLyBDYWxjdWxh dGUgc2kgYW5kIHRpCisgICAgY29udm9sdmVfc29iZWwocywgZnJhbWUtPmRhdGFbMF0sIHMt PmdyYWRpZW50X21hdHJpeCwgZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICBjYWxjdWxhdGVf bW90aW9uKHMsIGZyYW1lLT5kYXRhWzBdLCBzLT5tb3Rpb25fbWF0cml4LCBmcmFtZS0+bGlu ZXNpemVbMF0pOworICAgIHNpID0gc3RkX2RldmlhdGlvbihzLT5ncmFkaWVudF9tYXRyaXgs IHMtPndpZHRoIC0gMiwgcy0+aGVpZ2h0IC0gMik7CisgICAgdGkgPSBzdGRfZGV2aWF0aW9u KHMtPm1vdGlvbl9tYXRyaXgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworCisgICAgLy8gQ2Fs Y3VsYXRlIHN0YXRpc3RpY3MKKyAgICBzLT5tYXhfc2kgID0gZm1heChzaSwgcy0+bWF4X3Np KTsKKyAgICBzLT5tYXhfdGkgID0gZm1heCh0aSwgcy0+bWF4X3RpKTsKKyAgICBzLT5zdW1f c2kgKz0gc2k7CisgICAgcy0+c3VtX3RpICs9IHRpOworICAgIHMtPm1pbl9zaSAgPSBzLT5u Yl9mcmFtZXMgPT0gMSA/IHNpIDogZm1pbihzaSwgcy0+bWluX3NpKTsKKyAgICBzLT5taW5f dGkgID0gcy0+bmJfZnJhbWVzID09IDEgPyB0aSA6IGZtaW4odGksIHMtPm1pbl90aSk7CisK KyAgICAvLyBTZXQgc2kgdGkgaW5mb3JtYXRpb24gaW4gZnJhbWUgbWV0YWRhdGEKKyAgICBz ZXRfbWV0YSgmZnJhbWUtPm1ldGFkYXRhLCAibGF2Zmkuc2l0aS5zaSIsIHNpKTsKKyAgICBz ZXRfbWV0YSgmZnJhbWUtPm1ldGFkYXRhLCAibGF2Zmkuc2l0aS50aSIsIHRpKTsKKworICAg IHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGZyYW1l KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2lUaUNvbnRleHQsIHgpCisj ZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRF UklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc2l0aV9vcHRpb25zW10gPSB7 CisgICAgeyAicHJpbnRfc3VtbWFyeSIsICJQcmludCBzdW1tYXJ5IHNob3dpbmcgYXZlcmFn ZSB2YWx1ZXMiLCBPRkZTRVQocHJpbnRfc3VtbWFyeSksIEFWX09QVF9UWVBFX0JPT0wsIHsg Lmk2ND0wIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVS X0RFRklORV9DTEFTUyhzaXRpKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2Zmls dGVyX3ZmX3NpdGlfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAg ID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJ REVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAu ZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCit9OworCitzdGF0aWMgY29u c3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfdmZfc2l0aV9vdXRwdXRzW10gPSB7CisgICAgewor ICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZ UEVfVklERU8KKyAgICB9LAorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2l0aSA9IHsKKyAgICAu bmFtZSAgICAgICAgICA9ICJzaXRpIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZf Q09ORklHX1NNQUxMKCJDYWxjdWxhdGUgc3BhdGlhbCBpbmZvcm1hdGlvbiAoU0kpIGFuZCB0 ZW1wb3JhbCBpbmZvcm1hdGlvbiAoVEkpLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6 ZW9mKFNpVGlDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZzaXRpX2NsYXNzLAor ICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5p dCwKKyAgICBGSUxURVJfUElYRk1UU19BUlJBWShwaXhfZm10cyksCisgICAgRklMVEVSX0lO UFVUUyhhdmZpbHRlcl92Zl9zaXRpX2lucHV0cyksCisgICAgRklMVEVSX09VVFBVVFMoYXZm aWx0ZXJfdmZfc2l0aV9vdXRwdXRzKSwKK307Ci0tIAoyLjIwLjEgKEFwcGxlIEdpdC0xMTcp Cgo= --------------Irm224Tir0YhENvLgQkDyrAW Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --------------Irm224Tir0YhENvLgQkDyrAW--