From d8ebfd1bdf7e2c47af3eb057b97de5b7fe854e35 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Sun, 13 Jan 2019 15:45:07 +1100 Subject: [PATCH] avcodec/vp6: select idct based (loosely) on number of coefficients decoded 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 Signed-off-by: Peter Ross --- 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