From patchwork Mon Jan 14 20:49:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Ross X-Patchwork-Id: 11754 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2F6B444CEFB for ; Mon, 14 Jan 2019 22:50:16 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 53ABC68A90B; Mon, 14 Jan 2019 22:50:04 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mx.sdf.org (mx.sdf.org [205.166.94.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7B30468A726 for ; Mon, 14 Jan 2019 22:49:57 +0200 (EET) Received: from 56c4002461c8bc5e2ff374e39cd3a77c (pa49-183-155-131.pa.vic.optusnet.com.au [49.183.155.131]) (authenticated (128 bits)) by mx.sdf.org (8.15.2/8.14.5) with ESMTPSA id x0EKo2Al021742 (using TLSv1.2 with cipher AES256-GCM-SHA384 (256 bits) verified NO) for ; Mon, 14 Jan 2019 20:50:07 GMT Authentication-Results: mx.sdf.org; dkim=none Date: Tue, 15 Jan 2019 07:49:58 +1100 From: Peter Ross To: ffmpeg-devel@ffmpeg.org Message-ID: References: MIME-Version: 1.0 In-Reply-To: User-Agent: Mutt/1.9.4 (2018-02-28) Subject: [FFmpeg-devel] [PATCHv2 6/6] avcodec/vp6: select idct based (loosely) on number of coefficients decoded X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" The VP3/4/5/6 reference decoders all use three IDCT versions: one for the DC-only case, another for blocks with more than 10 coefficients, and an optimised one for blocks with up to 10 AC coefficents. VP6 relies on the sparse 10 coefficient version, and without it, IDCT drift occurs. Fixes: https://trac.ffmpeg.org/ticket/1282 --- libavcodec/vp5.c | 1 + libavcodec/vp56.c | 30 ++++-- libavcodec/vp56.h | 2 + libavcodec/vp6.c | 14 +++ tests/ref/fate/vp6a | 172 ++++++++++++++++----------------- tests/ref/fate/vp6a-skip_alpha | 172 ++++++++++++++++----------------- 6 files changed, 213 insertions(+), 178 deletions(-) diff --git a/libavcodec/vp5.c b/libavcodec/vp5.c index cb08cec33f..49988b8b76 100644 --- a/libavcodec/vp5.c +++ b/libavcodec/vp5.c @@ -252,6 +252,7 @@ static int vp5_parse_coeff(VP56Context *s) for (i=coeff_idx; i<=ctx_last; i++) s->coeff_ctx[ff_vp56_b6to4[b]][i] = 5; s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[ff_vp56_b6to4[b]][0]; + s->idct_selector[b] = 63; } return 0; } diff --git a/libavcodec/vp56.c b/libavcodec/vp56.c index e9e8d5d9fd..72fea3780e 100644 --- a/libavcodec/vp56.c +++ b/libavcodec/vp56.c @@ -406,6 +406,24 @@ static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src, } } +static void vp56_idct_put(VP56Context *s, uint8_t * dest, ptrdiff_t stride, int16_t *block, int selector) +{ + if (selector > 10 || selector == 1) + s->vp3dsp.idct_put(dest, stride, block); + else + ff_vp3dsp_idct10_put(dest, stride, block); +} + +static void vp56_idct_add(VP56Context *s, uint8_t * dest, ptrdiff_t stride, int16_t *block, int selector) +{ + if (selector > 10) + s->vp3dsp.idct_add(dest, stride, block); + else if (selector > 1) + ff_vp3dsp_idct10_add(dest, stride, block); + else + s->vp3dsp.idct_dc_add(dest, stride, block); +} + static av_always_inline void vp56_render_mb(VP56Context *s, int row, int col, int is_alpha, VP56mb mb_type) { int b, ab, b_max, plane, off; @@ -426,8 +444,8 @@ static av_always_inline void vp56_render_mb(VP56Context *s, int row, int col, in case VP56_MB_INTRA: for (b=0; bvp3dsp.idct_put(frame_current->data[plane] + s->block_offset[b], - s->stride[plane], s->block_coeff[b]); + vp56_idct_put(s, frame_current->data[plane] + s->block_offset[b], + s->stride[plane], s->block_coeff[b], s->idct_selector[b]); } break; @@ -439,8 +457,8 @@ static av_always_inline void vp56_render_mb(VP56Context *s, int row, int col, in s->hdsp.put_pixels_tab[1][0](frame_current->data[plane] + off, frame_ref->data[plane] + off, s->stride[plane], 8); - s->vp3dsp.idct_add(frame_current->data[plane] + off, - s->stride[plane], s->block_coeff[b]); + vp56_idct_add(s, frame_current->data[plane] + off, + s->stride[plane], s->block_coeff[b], s->idct_selector[b]); } break; @@ -457,8 +475,8 @@ static av_always_inline void vp56_render_mb(VP56Context *s, int row, int col, in plane = ff_vp56_b2p[b+ab]; vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], 16*col+x_off, 16*row+y_off); - s->vp3dsp.idct_add(frame_current->data[plane] + s->block_offset[b], - s->stride[plane], s->block_coeff[b]); + vp56_idct_add(s, frame_current->data[plane] + s->block_offset[b], + s->stride[plane], s->block_coeff[b], s->idct_selector[b]); } break; } diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index 9b3036895c..84b2f6c94b 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -105,6 +105,7 @@ typedef struct VP56Macroblock { typedef struct VP56Model { uint8_t coeff_reorder[64]; /* used in vp6 only */ uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ + uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */ uint8_t vector_sig[2]; /* delta sign */ uint8_t vector_dct[2]; /* delta coding types */ uint8_t vector_pdi[2][2]; /* predefined delta init */ @@ -157,6 +158,7 @@ struct vp56_context { VP56mb mb_type; VP56Macroblock *macroblocks; DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64]; + int idct_selector[6]; /* motion vectors */ VP56mv mv[6]; /* vectors for each block in MB */ diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c index 645fc5c690..977fcb7076 100644 --- a/libavcodec/vp6.c +++ b/libavcodec/vp6.c @@ -194,6 +194,18 @@ static void vp6_coeff_order_table_init(VP56Context *s) for (pos=1; pos<64; pos++) if (s->modelp->coeff_reorder[pos] == i) s->modelp->coeff_index_to_pos[idx++] = pos; + + for (idx = 0; idx < 64; idx++) { + int max = 0; + for (i = 0; i <= idx; i++) { + int v = s->modelp->coeff_index_to_pos[i]; + if (v > max) + max = v; + } + if (s->sub_version > 6) + max++; + s->modelp->coeff_index_to_idct_selector[idx] = max; + } } static void vp6_default_models_init(VP56Context *s) @@ -446,6 +458,7 @@ static int vp6_parse_coeff_huffman(VP56Context *s) cg = FFMIN(vp6_coeff_groups[coeff_idx], 3); vlc_coeff = &s->ract_vlc[pt][ct][cg]; } + s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)]; } return 0; } @@ -527,6 +540,7 @@ static int vp6_parse_coeff(VP56Context *s) s->left_block[ff_vp56_b6to4[b]].not_null_dc = s->above_blocks[s->above_block_idx[b]].not_null_dc = !!s->block_coeff[b][0]; + s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)]; } return 0; } diff --git a/tests/ref/fate/vp6a b/tests/ref/fate/vp6a index b4f33630f7..8fb2630ff3 100644 --- a/tests/ref/fate/vp6a +++ b/tests/ref/fate/vp6a @@ -4,95 +4,95 @@ #dimensions 0: 300x180 #sar 0: 0/1 0, 0, 0, 1, 135000, 0x9dceed6d -0, 1, 1, 1, 135000, 0x47e5778d -0, 2, 2, 1, 135000, 0x5de36599 -0, 3, 3, 1, 135000, 0x540d8079 -0, 4, 4, 1, 135000, 0xba9ea534 -0, 5, 5, 1, 135000, 0xa75088f8 -0, 6, 6, 1, 135000, 0x7d867559 -0, 7, 7, 1, 135000, 0xcc678fee -0, 8, 8, 1, 135000, 0x79c590b9 -0, 9, 9, 1, 135000, 0x87789918 -0, 10, 10, 1, 135000, 0xaa939213 -0, 11, 11, 1, 135000, 0x3912916d -0, 12, 12, 1, 135000, 0x41305d0b -0, 13, 13, 1, 135000, 0x2686b5dd -0, 14, 14, 1, 135000, 0xa69ae422 -0, 15, 15, 1, 135000, 0x998a3478 -0, 16, 16, 1, 135000, 0x5842768d -0, 17, 17, 1, 135000, 0xf6a85b16 -0, 18, 18, 1, 135000, 0x7a5b2708 -0, 19, 19, 1, 135000, 0x8b2abb63 -0, 20, 20, 1, 135000, 0x7dc8468b -0, 21, 21, 1, 135000, 0x04d85001 -0, 22, 22, 1, 135000, 0x83e3c647 -0, 23, 23, 1, 135000, 0xcddd687e -0, 24, 24, 1, 135000, 0x818e785e -0, 25, 25, 1, 135000, 0x3a915080 -0, 26, 26, 1, 135000, 0x953d603d -0, 27, 27, 1, 135000, 0x79005ebf -0, 28, 28, 1, 135000, 0x80afec75 -0, 29, 29, 1, 135000, 0xfc8e376b -0, 30, 30, 1, 135000, 0xf957b7ef -0, 31, 31, 1, 135000, 0xe878da44 -0, 32, 32, 1, 135000, 0xe68ecca3 -0, 33, 33, 1, 135000, 0x1a2cc7d3 -0, 34, 34, 1, 135000, 0x4f346a69 -0, 35, 35, 1, 135000, 0x7a0cf4ac -0, 36, 36, 1, 135000, 0x6d4eee7a -0, 37, 37, 1, 135000, 0xf0688cbd -0, 38, 38, 1, 135000, 0xca4abbbc -0, 39, 39, 1, 135000, 0x87669519 -0, 40, 40, 1, 135000, 0xd090e9d7 -0, 41, 41, 1, 135000, 0xd7f536c1 -0, 42, 42, 1, 135000, 0x353ede54 -0, 43, 43, 1, 135000, 0xbc8f5358 -0, 44, 44, 1, 135000, 0xb52cd59a -0, 45, 45, 1, 135000, 0x0b882eba -0, 46, 46, 1, 135000, 0xc544cd54 -0, 47, 47, 1, 135000, 0x31ca7e73 +0, 1, 1, 1, 135000, 0x1fc377a4 +0, 2, 2, 1, 135000, 0x0b4465d4 +0, 3, 3, 1, 135000, 0x136b8062 +0, 4, 4, 1, 135000, 0x4691a55c +0, 5, 5, 1, 135000, 0x55bb8a19 +0, 6, 6, 1, 135000, 0xdbf67651 +0, 7, 7, 1, 135000, 0x6fb19113 +0, 8, 8, 1, 135000, 0x3edc9227 +0, 9, 9, 1, 135000, 0x53b39aff +0, 10, 10, 1, 135000, 0x699e94b0 +0, 11, 11, 1, 135000, 0xeedd9388 +0, 12, 12, 1, 135000, 0x14055f96 +0, 13, 13, 1, 135000, 0x71fbb5fd +0, 14, 14, 1, 135000, 0x6fb4e491 +0, 15, 15, 1, 135000, 0x35ca3482 +0, 16, 16, 1, 135000, 0x0c2a7530 +0, 17, 17, 1, 135000, 0x422c5581 +0, 18, 18, 1, 135000, 0x19eb2155 +0, 19, 19, 1, 135000, 0x07e1b114 +0, 20, 20, 1, 135000, 0xa10f3f81 +0, 21, 21, 1, 135000, 0x75684dcd +0, 22, 22, 1, 135000, 0x1721c337 +0, 23, 23, 1, 135000, 0x3897667d +0, 24, 24, 1, 135000, 0x1232769e +0, 25, 25, 1, 135000, 0xec975059 +0, 26, 26, 1, 135000, 0xb2a46123 +0, 27, 27, 1, 135000, 0x052c5f72 +0, 28, 28, 1, 135000, 0x3087eb2f +0, 29, 29, 1, 135000, 0xd1e0373a +0, 30, 30, 1, 135000, 0x64dab704 +0, 31, 31, 1, 135000, 0xa44dd89e +0, 32, 32, 1, 135000, 0x380ecae9 +0, 33, 33, 1, 135000, 0x8c6fc4ab +0, 34, 34, 1, 135000, 0x02096903 +0, 35, 35, 1, 135000, 0x11edf432 +0, 36, 36, 1, 135000, 0x3585ee5f +0, 37, 37, 1, 135000, 0xe1338c40 +0, 38, 38, 1, 135000, 0x5edfbd0c +0, 39, 39, 1, 135000, 0x9420965c +0, 40, 40, 1, 135000, 0x0caceb17 +0, 41, 41, 1, 135000, 0x3fdc36c3 +0, 42, 42, 1, 135000, 0x8a24df14 +0, 43, 43, 1, 135000, 0x5dc057b0 +0, 44, 44, 1, 135000, 0xdc5eda65 +0, 45, 45, 1, 135000, 0x60433612 +0, 46, 46, 1, 135000, 0x6a91d6c9 +0, 47, 47, 1, 135000, 0x53598734 0, 48, 48, 1, 135000, 0xb1569ce9 -0, 49, 49, 1, 135000, 0x8bf4394f -0, 50, 50, 1, 135000, 0xf413812a -0, 51, 51, 1, 135000, 0xf2fa90ab -0, 52, 52, 1, 135000, 0xdcd8b265 -0, 53, 53, 1, 135000, 0xa89cdba1 -0, 54, 54, 1, 135000, 0x212b59a5 -0, 55, 55, 1, 135000, 0x10c589c3 -0, 56, 56, 1, 135000, 0x432ab5b4 +0, 49, 49, 1, 135000, 0xf5e83a33 +0, 50, 50, 1, 135000, 0xebe18275 +0, 51, 51, 1, 135000, 0x98af9447 +0, 52, 52, 1, 135000, 0x3f03b765 +0, 53, 53, 1, 135000, 0x7423e0b8 +0, 54, 54, 1, 135000, 0x6c1b5faa +0, 55, 55, 1, 135000, 0xebf98d52 +0, 56, 56, 1, 135000, 0xf3dfb8b6 0, 57, 57, 1, 135000, 0x85a9634a -0, 58, 58, 1, 135000, 0x10db5b87 -0, 59, 59, 1, 135000, 0x583145d9 -0, 60, 60, 1, 135000, 0x7d3a33bd -0, 61, 61, 1, 135000, 0xcf592423 -0, 62, 62, 1, 135000, 0xb59728e5 -0, 63, 63, 1, 135000, 0x1eeca660 -0, 64, 64, 1, 135000, 0xff7bcc34 -0, 65, 65, 1, 135000, 0x0ef8f271 -0, 66, 66, 1, 135000, 0x8c9ca8ee -0, 67, 67, 1, 135000, 0x8a7ece34 -0, 68, 68, 1, 135000, 0x7d4c3b5d -0, 69, 69, 1, 135000, 0x99118f21 -0, 70, 70, 1, 135000, 0xd97fe7e2 -0, 71, 71, 1, 135000, 0xf93842f1 -0, 72, 72, 1, 135000, 0x35c912e8 -0, 73, 73, 1, 135000, 0x14e59e97 +0, 58, 58, 1, 135000, 0x4d425bb5 +0, 59, 59, 1, 135000, 0xfb7945ee +0, 60, 60, 1, 135000, 0x593534c1 +0, 61, 61, 1, 135000, 0xe3fa2517 +0, 62, 62, 1, 135000, 0x893629e3 +0, 63, 63, 1, 135000, 0xdc3ca6ad +0, 64, 64, 1, 135000, 0x16b1ce27 +0, 65, 65, 1, 135000, 0x8296f478 +0, 66, 66, 1, 135000, 0x9e9baaa3 +0, 67, 67, 1, 135000, 0x994ecd4a +0, 68, 68, 1, 135000, 0x40f83b3c +0, 69, 69, 1, 135000, 0x0de38f90 +0, 70, 70, 1, 135000, 0x5455ea6c +0, 71, 71, 1, 135000, 0x053e41e8 +0, 72, 72, 1, 135000, 0x0fee1281 +0, 73, 73, 1, 135000, 0xa0c9a434 0, 74, 74, 1, 135000, 0x8e4c19aa -0, 75, 75, 1, 135000, 0x4adfbc53 -0, 76, 76, 1, 135000, 0x0613adde -0, 77, 77, 1, 135000, 0x8db264ab -0, 78, 78, 1, 135000, 0x3948b619 -0, 79, 79, 1, 135000, 0x843d7c02 -0, 80, 80, 1, 135000, 0x534fea34 +0, 75, 75, 1, 135000, 0x34bebc00 +0, 76, 76, 1, 135000, 0x6670ad6f +0, 77, 77, 1, 135000, 0xdbba63fc +0, 78, 78, 1, 135000, 0xe34fb839 +0, 79, 79, 1, 135000, 0xa3ce7eb1 +0, 80, 80, 1, 135000, 0xdec7ed7d 0, 81, 81, 1, 135000, 0xdb7041bf -0, 82, 82, 1, 135000, 0xd0ce1cce -0, 83, 83, 1, 135000, 0x3c008335 -0, 84, 84, 1, 135000, 0xb699208f -0, 85, 85, 1, 135000, 0xe07da3ca -0, 86, 86, 1, 135000, 0x26331f41 -0, 87, 87, 1, 135000, 0x4e19fe83 -0, 88, 88, 1, 135000, 0xaa9a9e45 -0, 89, 89, 1, 135000, 0x336b7ed0 -0, 90, 90, 1, 135000, 0xc9bf7611 +0, 82, 82, 1, 135000, 0x2b1d1dc1 +0, 83, 83, 1, 135000, 0xaaa384c1 +0, 84, 84, 1, 135000, 0x37f42217 +0, 85, 85, 1, 135000, 0x928ba4da +0, 86, 86, 1, 135000, 0x2b681f41 +0, 87, 87, 1, 135000, 0xcbe1ff84 +0, 88, 88, 1, 135000, 0x47949f24 +0, 89, 89, 1, 135000, 0x368b7fe5 +0, 90, 90, 1, 135000, 0x1cf4773b 0, 91, 91, 1, 135000, 0x14c33a35 0, 92, 92, 1, 135000, 0xdc08470e diff --git a/tests/ref/fate/vp6a-skip_alpha b/tests/ref/fate/vp6a-skip_alpha index e2c435f402..f092778021 100644 --- a/tests/ref/fate/vp6a-skip_alpha +++ b/tests/ref/fate/vp6a-skip_alpha @@ -4,95 +4,95 @@ #dimensions 0: 300x180 #sar 0: 0/1 0, 0, 0, 1, 81000, 0xcb92962d -0, 1, 1, 1, 81000, 0xae381904 -0, 2, 2, 1, 81000, 0x1fcc0c75 -0, 3, 3, 1, 81000, 0x023f0c21 -0, 4, 4, 1, 81000, 0xad691402 -0, 5, 5, 1, 81000, 0x42390be0 -0, 6, 6, 1, 81000, 0xc1c10a4e -0, 7, 7, 1, 81000, 0x9c0315ac -0, 8, 8, 1, 81000, 0xc2a315a7 -0, 9, 9, 1, 81000, 0x3a631392 -0, 10, 10, 1, 81000, 0x11591414 -0, 11, 11, 1, 81000, 0x1a551125 -0, 12, 12, 1, 81000, 0x2e1efa4f -0, 13, 13, 1, 81000, 0x4aa3f016 -0, 14, 14, 1, 81000, 0x74c029d8 -0, 15, 15, 1, 81000, 0xdee9a98b -0, 16, 16, 1, 81000, 0xdf3502d5 -0, 17, 17, 1, 81000, 0x4653536b -0, 18, 18, 1, 81000, 0x7f658c75 -0, 19, 19, 1, 81000, 0xab18ff13 -0, 20, 20, 1, 81000, 0xac2b8f3b -0, 21, 21, 1, 81000, 0xd61ff094 -0, 22, 22, 1, 81000, 0x425bfc2b -0, 23, 23, 1, 81000, 0x6be7ecd3 -0, 24, 24, 1, 81000, 0x0b0ee65b -0, 25, 25, 1, 81000, 0x3c6f146b -0, 26, 26, 1, 81000, 0x27c4e9c8 -0, 27, 27, 1, 81000, 0x174022c4 -0, 28, 28, 1, 81000, 0x3320fe81 -0, 29, 29, 1, 81000, 0x7a3c342e -0, 30, 30, 1, 81000, 0x448b4346 -0, 31, 31, 1, 81000, 0xd285b23d -0, 32, 32, 1, 81000, 0x852ed590 -0, 33, 33, 1, 81000, 0xc9d3df17 -0, 34, 34, 1, 81000, 0x4d23727b -0, 35, 35, 1, 81000, 0x1fae66cd -0, 36, 36, 1, 81000, 0x384d54ab -0, 37, 37, 1, 81000, 0x2fee6ba3 -0, 38, 38, 1, 81000, 0xd7ad6f59 -0, 39, 39, 1, 81000, 0xaf5e3e76 -0, 40, 40, 1, 81000, 0x10fceda4 -0, 41, 41, 1, 81000, 0xb26df92b -0, 42, 42, 1, 81000, 0xd6676e08 -0, 43, 43, 1, 81000, 0xff6b1b95 -0, 44, 44, 1, 81000, 0x6196d598 -0, 45, 45, 1, 81000, 0x833ebf1b -0, 46, 46, 1, 81000, 0x7b085af1 -0, 47, 47, 1, 81000, 0xe8f583b4 +0, 1, 1, 1, 81000, 0x8fef1925 +0, 2, 2, 1, 81000, 0xf0350cb6 +0, 3, 3, 1, 81000, 0xa70a0c52 +0, 4, 4, 1, 81000, 0x21ef1490 +0, 5, 5, 1, 81000, 0x98bc0c96 +0, 6, 6, 1, 81000, 0x92380b27 +0, 7, 7, 1, 81000, 0xbba216cd +0, 8, 8, 1, 81000, 0x92a8172b +0, 9, 9, 1, 81000, 0xfbc21592 +0, 10, 10, 1, 81000, 0xdad416a1 +0, 11, 11, 1, 81000, 0xec4d13aa +0, 12, 12, 1, 81000, 0xaf36fcff +0, 13, 13, 1, 81000, 0xb4fcf056 +0, 14, 14, 1, 81000, 0xe3782a3f +0, 15, 15, 1, 81000, 0x714daa0b +0, 16, 16, 1, 81000, 0xe2770382 +0, 17, 17, 1, 81000, 0x553253ff +0, 18, 18, 1, 81000, 0x928d8c46 +0, 19, 19, 1, 81000, 0x06c8fe82 +0, 20, 20, 1, 81000, 0xb8198f5a +0, 21, 21, 1, 81000, 0x0029f118 +0, 22, 22, 1, 81000, 0x6fe7fc6f +0, 23, 23, 1, 81000, 0x9165edde +0, 24, 24, 1, 81000, 0xe76ae791 +0, 25, 25, 1, 81000, 0xa4dd145a +0, 26, 26, 1, 81000, 0x2d7de9d8 +0, 27, 27, 1, 81000, 0xe102228b +0, 28, 28, 1, 81000, 0xc57ffe0e +0, 29, 29, 1, 81000, 0x324434cb +0, 30, 30, 1, 81000, 0xedc0433e +0, 31, 31, 1, 81000, 0xd42bb18a +0, 32, 32, 1, 81000, 0xedb3d561 +0, 33, 33, 1, 81000, 0x5244de92 +0, 34, 34, 1, 81000, 0x0bb27280 +0, 35, 35, 1, 81000, 0xc6116736 +0, 36, 36, 1, 81000, 0x42f154e2 +0, 37, 37, 1, 81000, 0xffbd6bf9 +0, 38, 38, 1, 81000, 0x813170d0 +0, 39, 39, 1, 81000, 0x430c4040 +0, 40, 40, 1, 81000, 0x56d1eecb +0, 41, 41, 1, 81000, 0xaa4afa12 +0, 42, 42, 1, 81000, 0x2c3d6fb8 +0, 43, 43, 1, 81000, 0xfedf1e3e +0, 44, 44, 1, 81000, 0xf538d893 +0, 45, 45, 1, 81000, 0xcc81c3b5 +0, 46, 46, 1, 81000, 0x59b95fbc +0, 47, 47, 1, 81000, 0xb4da87a0 0, 48, 48, 1, 81000, 0x3426d5e4 -0, 49, 49, 1, 81000, 0x214069ed -0, 50, 50, 1, 81000, 0x7dbdfd3f -0, 51, 51, 1, 81000, 0xf19b3f45 -0, 52, 52, 1, 81000, 0x0f05c7e2 -0, 53, 53, 1, 81000, 0xba94e323 -0, 54, 54, 1, 81000, 0x0de7b0c2 -0, 55, 55, 1, 81000, 0xfcf93c55 -0, 56, 56, 1, 81000, 0x8a8dbd55 +0, 49, 49, 1, 81000, 0x8d066aae +0, 50, 50, 1, 81000, 0x09effe79 +0, 51, 51, 1, 81000, 0xecc540ae +0, 52, 52, 1, 81000, 0x845dc90c +0, 53, 53, 1, 81000, 0x9c2fe4d2 +0, 54, 54, 1, 81000, 0x8887b277 +0, 55, 55, 1, 81000, 0x3bdc3ca9 +0, 56, 56, 1, 81000, 0x094fbe27 0, 57, 57, 1, 81000, 0xddf22b97 -0, 58, 58, 1, 81000, 0x49a830ff -0, 59, 59, 1, 81000, 0x82ab2a4b -0, 60, 60, 1, 81000, 0xd23420e5 -0, 61, 61, 1, 81000, 0x7c1017d1 -0, 62, 62, 1, 81000, 0x9aa61b38 -0, 63, 63, 1, 81000, 0x2a724a18 -0, 64, 64, 1, 81000, 0xc18055f2 -0, 65, 65, 1, 81000, 0xecba3855 -0, 66, 66, 1, 81000, 0x0eed6b0f -0, 67, 67, 1, 81000, 0x4be73816 -0, 68, 68, 1, 81000, 0xa681214e -0, 69, 69, 1, 81000, 0x4958f83d -0, 70, 70, 1, 81000, 0xca0f0d61 -0, 71, 71, 1, 81000, 0x3c453de1 -0, 72, 72, 1, 81000, 0xff60360a -0, 73, 73, 1, 81000, 0xdcef0949 +0, 58, 58, 1, 81000, 0x31b23156 +0, 59, 59, 1, 81000, 0xf5bf2ad8 +0, 60, 60, 1, 81000, 0x4a9321c4 +0, 61, 61, 1, 81000, 0xdd1b18ca +0, 62, 62, 1, 81000, 0x4ece1cdd +0, 63, 63, 1, 81000, 0x6a9a4b53 +0, 64, 64, 1, 81000, 0x6624578b +0, 65, 65, 1, 81000, 0x89273a0f +0, 66, 66, 1, 81000, 0x9eb56c4c +0, 67, 67, 1, 81000, 0xe60238f5 +0, 68, 68, 1, 81000, 0xbc4c228a +0, 69, 69, 1, 81000, 0x3feefa08 +0, 70, 70, 1, 81000, 0x0d620f37 +0, 71, 71, 1, 81000, 0x93693fc8 +0, 72, 72, 1, 81000, 0xfc4b3848 +0, 73, 73, 1, 81000, 0xd9950bfb 0, 74, 74, 1, 81000, 0xe5e3732d -0, 75, 75, 1, 81000, 0x39747fd4 -0, 76, 76, 1, 81000, 0x6bec70e6 -0, 77, 77, 1, 81000, 0x7026a8c0 -0, 78, 78, 1, 81000, 0x92de5b61 -0, 79, 79, 1, 81000, 0x3f00507f -0, 80, 80, 1, 81000, 0x5620c377 +0, 75, 75, 1, 81000, 0x53517fd2 +0, 76, 76, 1, 81000, 0xb57c70b0 +0, 77, 77, 1, 81000, 0x378ea87c +0, 78, 78, 1, 81000, 0xfd2b5b58 +0, 79, 79, 1, 81000, 0x66d45077 +0, 80, 80, 1, 81000, 0x6e07c3f8 0, 81, 81, 1, 81000, 0x39f5ed38 -0, 82, 82, 1, 81000, 0x6ee35d67 -0, 83, 83, 1, 81000, 0x4f99a409 -0, 84, 84, 1, 81000, 0x0a05b6ea -0, 85, 85, 1, 81000, 0xd6c442d9 -0, 86, 86, 1, 81000, 0x0bb3d2f0 -0, 87, 87, 1, 81000, 0x6891c5b1 -0, 88, 88, 1, 81000, 0xf16ba9be -0, 89, 89, 1, 81000, 0xba53528e -0, 90, 90, 1, 81000, 0xc847de49 +0, 82, 82, 1, 81000, 0x55b05da7 +0, 83, 83, 1, 81000, 0x7f78a42c +0, 84, 84, 1, 81000, 0x5139b79c +0, 85, 85, 1, 81000, 0x4054437d +0, 86, 86, 1, 81000, 0x0f9dd327 +0, 87, 87, 1, 81000, 0xa885c60e +0, 88, 88, 1, 81000, 0x37abaa72 +0, 89, 89, 1, 81000, 0xdab25345 +0, 90, 90, 1, 81000, 0xbdf4df9d 0, 91, 91, 1, 81000, 0xc5b2e2b0 0, 92, 92, 1, 81000, 0xb0b497ff