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 <pross@xvid.org>
This commit is contained in:
Peter Ross 2019-01-13 15:45:07 +11:00
parent 160ebe0a8d
commit d8ebfd1bdf
6 changed files with 213 additions and 178 deletions

View File

@ -252,6 +252,7 @@ static int vp5_parse_coeff(VP56Context *s)
for (i=coeff_idx; i<=ctx_last; i++) for (i=coeff_idx; i<=ctx_last; i++)
s->coeff_ctx[ff_vp56_b6to4[b]][i] = 5; 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->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; return 0;
} }

View File

@ -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) 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; 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: case VP56_MB_INTRA:
for (b=0; b<b_max; b++) { for (b=0; b<b_max; b++) {
plane = ff_vp56_b2p[b+ab]; plane = ff_vp56_b2p[b+ab];
s->vp3dsp.idct_put(frame_current->data[plane] + s->block_offset[b], vp56_idct_put(s, frame_current->data[plane] + s->block_offset[b],
s->stride[plane], s->block_coeff[b]); s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
} }
break; 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, s->hdsp.put_pixels_tab[1][0](frame_current->data[plane] + off,
frame_ref->data[plane] + off, frame_ref->data[plane] + off,
s->stride[plane], 8); s->stride[plane], 8);
s->vp3dsp.idct_add(frame_current->data[plane] + off, vp56_idct_add(s, frame_current->data[plane] + off,
s->stride[plane], s->block_coeff[b]); s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
} }
break; 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]; plane = ff_vp56_b2p[b+ab];
vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane],
16*col+x_off, 16*row+y_off); 16*col+x_off, 16*row+y_off);
s->vp3dsp.idct_add(frame_current->data[plane] + s->block_offset[b], vp56_idct_add(s, frame_current->data[plane] + s->block_offset[b],
s->stride[plane], s->block_coeff[b]); s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
} }
break; break;
} }

View File

@ -105,6 +105,7 @@ typedef struct VP56Macroblock {
typedef struct VP56Model { typedef struct VP56Model {
uint8_t coeff_reorder[64]; /* used in vp6 only */ 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_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_sig[2]; /* delta sign */
uint8_t vector_dct[2]; /* delta coding types */ uint8_t vector_dct[2]; /* delta coding types */
uint8_t vector_pdi[2][2]; /* predefined delta init */ uint8_t vector_pdi[2][2]; /* predefined delta init */
@ -157,6 +158,7 @@ struct vp56_context {
VP56mb mb_type; VP56mb mb_type;
VP56Macroblock *macroblocks; VP56Macroblock *macroblocks;
DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64]; DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
int idct_selector[6];
/* motion vectors */ /* motion vectors */
VP56mv mv[6]; /* vectors for each block in MB */ VP56mv mv[6]; /* vectors for each block in MB */

View File

@ -194,6 +194,18 @@ static void vp6_coeff_order_table_init(VP56Context *s)
for (pos=1; pos<64; pos++) for (pos=1; pos<64; pos++)
if (s->modelp->coeff_reorder[pos] == i) if (s->modelp->coeff_reorder[pos] == i)
s->modelp->coeff_index_to_pos[idx++] = pos; 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) 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); cg = FFMIN(vp6_coeff_groups[coeff_idx], 3);
vlc_coeff = &s->ract_vlc[pt][ct][cg]; vlc_coeff = &s->ract_vlc[pt][ct][cg];
} }
s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)];
} }
return 0; return 0;
} }
@ -527,6 +540,7 @@ static int vp6_parse_coeff(VP56Context *s)
s->left_block[ff_vp56_b6to4[b]].not_null_dc = 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->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; return 0;
} }

View File

@ -4,95 +4,95 @@
#dimensions 0: 300x180 #dimensions 0: 300x180
#sar 0: 0/1 #sar 0: 0/1
0, 0, 0, 1, 135000, 0x9dceed6d 0, 0, 0, 1, 135000, 0x9dceed6d
0, 1, 1, 1, 135000, 0x47e5778d 0, 1, 1, 1, 135000, 0x1fc377a4
0, 2, 2, 1, 135000, 0x5de36599 0, 2, 2, 1, 135000, 0x0b4465d4
0, 3, 3, 1, 135000, 0x540d8079 0, 3, 3, 1, 135000, 0x136b8062
0, 4, 4, 1, 135000, 0xba9ea534 0, 4, 4, 1, 135000, 0x4691a55c
0, 5, 5, 1, 135000, 0xa75088f8 0, 5, 5, 1, 135000, 0x55bb8a19
0, 6, 6, 1, 135000, 0x7d867559 0, 6, 6, 1, 135000, 0xdbf67651
0, 7, 7, 1, 135000, 0xcc678fee 0, 7, 7, 1, 135000, 0x6fb19113
0, 8, 8, 1, 135000, 0x79c590b9 0, 8, 8, 1, 135000, 0x3edc9227
0, 9, 9, 1, 135000, 0x87789918 0, 9, 9, 1, 135000, 0x53b39aff
0, 10, 10, 1, 135000, 0xaa939213 0, 10, 10, 1, 135000, 0x699e94b0
0, 11, 11, 1, 135000, 0x3912916d 0, 11, 11, 1, 135000, 0xeedd9388
0, 12, 12, 1, 135000, 0x41305d0b 0, 12, 12, 1, 135000, 0x14055f96
0, 13, 13, 1, 135000, 0x2686b5dd 0, 13, 13, 1, 135000, 0x71fbb5fd
0, 14, 14, 1, 135000, 0xa69ae422 0, 14, 14, 1, 135000, 0x6fb4e491
0, 15, 15, 1, 135000, 0x998a3478 0, 15, 15, 1, 135000, 0x35ca3482
0, 16, 16, 1, 135000, 0x5842768d 0, 16, 16, 1, 135000, 0x0c2a7530
0, 17, 17, 1, 135000, 0xf6a85b16 0, 17, 17, 1, 135000, 0x422c5581
0, 18, 18, 1, 135000, 0x7a5b2708 0, 18, 18, 1, 135000, 0x19eb2155
0, 19, 19, 1, 135000, 0x8b2abb63 0, 19, 19, 1, 135000, 0x07e1b114
0, 20, 20, 1, 135000, 0x7dc8468b 0, 20, 20, 1, 135000, 0xa10f3f81
0, 21, 21, 1, 135000, 0x04d85001 0, 21, 21, 1, 135000, 0x75684dcd
0, 22, 22, 1, 135000, 0x83e3c647 0, 22, 22, 1, 135000, 0x1721c337
0, 23, 23, 1, 135000, 0xcddd687e 0, 23, 23, 1, 135000, 0x3897667d
0, 24, 24, 1, 135000, 0x818e785e 0, 24, 24, 1, 135000, 0x1232769e
0, 25, 25, 1, 135000, 0x3a915080 0, 25, 25, 1, 135000, 0xec975059
0, 26, 26, 1, 135000, 0x953d603d 0, 26, 26, 1, 135000, 0xb2a46123
0, 27, 27, 1, 135000, 0x79005ebf 0, 27, 27, 1, 135000, 0x052c5f72
0, 28, 28, 1, 135000, 0x80afec75 0, 28, 28, 1, 135000, 0x3087eb2f
0, 29, 29, 1, 135000, 0xfc8e376b 0, 29, 29, 1, 135000, 0xd1e0373a
0, 30, 30, 1, 135000, 0xf957b7ef 0, 30, 30, 1, 135000, 0x64dab704
0, 31, 31, 1, 135000, 0xe878da44 0, 31, 31, 1, 135000, 0xa44dd89e
0, 32, 32, 1, 135000, 0xe68ecca3 0, 32, 32, 1, 135000, 0x380ecae9
0, 33, 33, 1, 135000, 0x1a2cc7d3 0, 33, 33, 1, 135000, 0x8c6fc4ab
0, 34, 34, 1, 135000, 0x4f346a69 0, 34, 34, 1, 135000, 0x02096903
0, 35, 35, 1, 135000, 0x7a0cf4ac 0, 35, 35, 1, 135000, 0x11edf432
0, 36, 36, 1, 135000, 0x6d4eee7a 0, 36, 36, 1, 135000, 0x3585ee5f
0, 37, 37, 1, 135000, 0xf0688cbd 0, 37, 37, 1, 135000, 0xe1338c40
0, 38, 38, 1, 135000, 0xca4abbbc 0, 38, 38, 1, 135000, 0x5edfbd0c
0, 39, 39, 1, 135000, 0x87669519 0, 39, 39, 1, 135000, 0x9420965c
0, 40, 40, 1, 135000, 0xd090e9d7 0, 40, 40, 1, 135000, 0x0caceb17
0, 41, 41, 1, 135000, 0xd7f536c1 0, 41, 41, 1, 135000, 0x3fdc36c3
0, 42, 42, 1, 135000, 0x353ede54 0, 42, 42, 1, 135000, 0x8a24df14
0, 43, 43, 1, 135000, 0xbc8f5358 0, 43, 43, 1, 135000, 0x5dc057b0
0, 44, 44, 1, 135000, 0xb52cd59a 0, 44, 44, 1, 135000, 0xdc5eda65
0, 45, 45, 1, 135000, 0x0b882eba 0, 45, 45, 1, 135000, 0x60433612
0, 46, 46, 1, 135000, 0xc544cd54 0, 46, 46, 1, 135000, 0x6a91d6c9
0, 47, 47, 1, 135000, 0x31ca7e73 0, 47, 47, 1, 135000, 0x53598734
0, 48, 48, 1, 135000, 0xb1569ce9 0, 48, 48, 1, 135000, 0xb1569ce9
0, 49, 49, 1, 135000, 0x8bf4394f 0, 49, 49, 1, 135000, 0xf5e83a33
0, 50, 50, 1, 135000, 0xf413812a 0, 50, 50, 1, 135000, 0xebe18275
0, 51, 51, 1, 135000, 0xf2fa90ab 0, 51, 51, 1, 135000, 0x98af9447
0, 52, 52, 1, 135000, 0xdcd8b265 0, 52, 52, 1, 135000, 0x3f03b765
0, 53, 53, 1, 135000, 0xa89cdba1 0, 53, 53, 1, 135000, 0x7423e0b8
0, 54, 54, 1, 135000, 0x212b59a5 0, 54, 54, 1, 135000, 0x6c1b5faa
0, 55, 55, 1, 135000, 0x10c589c3 0, 55, 55, 1, 135000, 0xebf98d52
0, 56, 56, 1, 135000, 0x432ab5b4 0, 56, 56, 1, 135000, 0xf3dfb8b6
0, 57, 57, 1, 135000, 0x85a9634a 0, 57, 57, 1, 135000, 0x85a9634a
0, 58, 58, 1, 135000, 0x10db5b87 0, 58, 58, 1, 135000, 0x4d425bb5
0, 59, 59, 1, 135000, 0x583145d9 0, 59, 59, 1, 135000, 0xfb7945ee
0, 60, 60, 1, 135000, 0x7d3a33bd 0, 60, 60, 1, 135000, 0x593534c1
0, 61, 61, 1, 135000, 0xcf592423 0, 61, 61, 1, 135000, 0xe3fa2517
0, 62, 62, 1, 135000, 0xb59728e5 0, 62, 62, 1, 135000, 0x893629e3
0, 63, 63, 1, 135000, 0x1eeca660 0, 63, 63, 1, 135000, 0xdc3ca6ad
0, 64, 64, 1, 135000, 0xff7bcc34 0, 64, 64, 1, 135000, 0x16b1ce27
0, 65, 65, 1, 135000, 0x0ef8f271 0, 65, 65, 1, 135000, 0x8296f478
0, 66, 66, 1, 135000, 0x8c9ca8ee 0, 66, 66, 1, 135000, 0x9e9baaa3
0, 67, 67, 1, 135000, 0x8a7ece34 0, 67, 67, 1, 135000, 0x994ecd4a
0, 68, 68, 1, 135000, 0x7d4c3b5d 0, 68, 68, 1, 135000, 0x40f83b3c
0, 69, 69, 1, 135000, 0x99118f21 0, 69, 69, 1, 135000, 0x0de38f90
0, 70, 70, 1, 135000, 0xd97fe7e2 0, 70, 70, 1, 135000, 0x5455ea6c
0, 71, 71, 1, 135000, 0xf93842f1 0, 71, 71, 1, 135000, 0x053e41e8
0, 72, 72, 1, 135000, 0x35c912e8 0, 72, 72, 1, 135000, 0x0fee1281
0, 73, 73, 1, 135000, 0x14e59e97 0, 73, 73, 1, 135000, 0xa0c9a434
0, 74, 74, 1, 135000, 0x8e4c19aa 0, 74, 74, 1, 135000, 0x8e4c19aa
0, 75, 75, 1, 135000, 0x4adfbc53 0, 75, 75, 1, 135000, 0x34bebc00
0, 76, 76, 1, 135000, 0x0613adde 0, 76, 76, 1, 135000, 0x6670ad6f
0, 77, 77, 1, 135000, 0x8db264ab 0, 77, 77, 1, 135000, 0xdbba63fc
0, 78, 78, 1, 135000, 0x3948b619 0, 78, 78, 1, 135000, 0xe34fb839
0, 79, 79, 1, 135000, 0x843d7c02 0, 79, 79, 1, 135000, 0xa3ce7eb1
0, 80, 80, 1, 135000, 0x534fea34 0, 80, 80, 1, 135000, 0xdec7ed7d
0, 81, 81, 1, 135000, 0xdb7041bf 0, 81, 81, 1, 135000, 0xdb7041bf
0, 82, 82, 1, 135000, 0xd0ce1cce 0, 82, 82, 1, 135000, 0x2b1d1dc1
0, 83, 83, 1, 135000, 0x3c008335 0, 83, 83, 1, 135000, 0xaaa384c1
0, 84, 84, 1, 135000, 0xb699208f 0, 84, 84, 1, 135000, 0x37f42217
0, 85, 85, 1, 135000, 0xe07da3ca 0, 85, 85, 1, 135000, 0x928ba4da
0, 86, 86, 1, 135000, 0x26331f41 0, 86, 86, 1, 135000, 0x2b681f41
0, 87, 87, 1, 135000, 0x4e19fe83 0, 87, 87, 1, 135000, 0xcbe1ff84
0, 88, 88, 1, 135000, 0xaa9a9e45 0, 88, 88, 1, 135000, 0x47949f24
0, 89, 89, 1, 135000, 0x336b7ed0 0, 89, 89, 1, 135000, 0x368b7fe5
0, 90, 90, 1, 135000, 0xc9bf7611 0, 90, 90, 1, 135000, 0x1cf4773b
0, 91, 91, 1, 135000, 0x14c33a35 0, 91, 91, 1, 135000, 0x14c33a35
0, 92, 92, 1, 135000, 0xdc08470e 0, 92, 92, 1, 135000, 0xdc08470e

View File

@ -4,95 +4,95 @@
#dimensions 0: 300x180 #dimensions 0: 300x180
#sar 0: 0/1 #sar 0: 0/1
0, 0, 0, 1, 81000, 0xcb92962d 0, 0, 0, 1, 81000, 0xcb92962d
0, 1, 1, 1, 81000, 0xae381904 0, 1, 1, 1, 81000, 0x8fef1925
0, 2, 2, 1, 81000, 0x1fcc0c75 0, 2, 2, 1, 81000, 0xf0350cb6
0, 3, 3, 1, 81000, 0x023f0c21 0, 3, 3, 1, 81000, 0xa70a0c52
0, 4, 4, 1, 81000, 0xad691402 0, 4, 4, 1, 81000, 0x21ef1490
0, 5, 5, 1, 81000, 0x42390be0 0, 5, 5, 1, 81000, 0x98bc0c96
0, 6, 6, 1, 81000, 0xc1c10a4e 0, 6, 6, 1, 81000, 0x92380b27
0, 7, 7, 1, 81000, 0x9c0315ac 0, 7, 7, 1, 81000, 0xbba216cd
0, 8, 8, 1, 81000, 0xc2a315a7 0, 8, 8, 1, 81000, 0x92a8172b
0, 9, 9, 1, 81000, 0x3a631392 0, 9, 9, 1, 81000, 0xfbc21592
0, 10, 10, 1, 81000, 0x11591414 0, 10, 10, 1, 81000, 0xdad416a1
0, 11, 11, 1, 81000, 0x1a551125 0, 11, 11, 1, 81000, 0xec4d13aa
0, 12, 12, 1, 81000, 0x2e1efa4f 0, 12, 12, 1, 81000, 0xaf36fcff
0, 13, 13, 1, 81000, 0x4aa3f016 0, 13, 13, 1, 81000, 0xb4fcf056
0, 14, 14, 1, 81000, 0x74c029d8 0, 14, 14, 1, 81000, 0xe3782a3f
0, 15, 15, 1, 81000, 0xdee9a98b 0, 15, 15, 1, 81000, 0x714daa0b
0, 16, 16, 1, 81000, 0xdf3502d5 0, 16, 16, 1, 81000, 0xe2770382
0, 17, 17, 1, 81000, 0x4653536b 0, 17, 17, 1, 81000, 0x553253ff
0, 18, 18, 1, 81000, 0x7f658c75 0, 18, 18, 1, 81000, 0x928d8c46
0, 19, 19, 1, 81000, 0xab18ff13 0, 19, 19, 1, 81000, 0x06c8fe82
0, 20, 20, 1, 81000, 0xac2b8f3b 0, 20, 20, 1, 81000, 0xb8198f5a
0, 21, 21, 1, 81000, 0xd61ff094 0, 21, 21, 1, 81000, 0x0029f118
0, 22, 22, 1, 81000, 0x425bfc2b 0, 22, 22, 1, 81000, 0x6fe7fc6f
0, 23, 23, 1, 81000, 0x6be7ecd3 0, 23, 23, 1, 81000, 0x9165edde
0, 24, 24, 1, 81000, 0x0b0ee65b 0, 24, 24, 1, 81000, 0xe76ae791
0, 25, 25, 1, 81000, 0x3c6f146b 0, 25, 25, 1, 81000, 0xa4dd145a
0, 26, 26, 1, 81000, 0x27c4e9c8 0, 26, 26, 1, 81000, 0x2d7de9d8
0, 27, 27, 1, 81000, 0x174022c4 0, 27, 27, 1, 81000, 0xe102228b
0, 28, 28, 1, 81000, 0x3320fe81 0, 28, 28, 1, 81000, 0xc57ffe0e
0, 29, 29, 1, 81000, 0x7a3c342e 0, 29, 29, 1, 81000, 0x324434cb
0, 30, 30, 1, 81000, 0x448b4346 0, 30, 30, 1, 81000, 0xedc0433e
0, 31, 31, 1, 81000, 0xd285b23d 0, 31, 31, 1, 81000, 0xd42bb18a
0, 32, 32, 1, 81000, 0x852ed590 0, 32, 32, 1, 81000, 0xedb3d561
0, 33, 33, 1, 81000, 0xc9d3df17 0, 33, 33, 1, 81000, 0x5244de92
0, 34, 34, 1, 81000, 0x4d23727b 0, 34, 34, 1, 81000, 0x0bb27280
0, 35, 35, 1, 81000, 0x1fae66cd 0, 35, 35, 1, 81000, 0xc6116736
0, 36, 36, 1, 81000, 0x384d54ab 0, 36, 36, 1, 81000, 0x42f154e2
0, 37, 37, 1, 81000, 0x2fee6ba3 0, 37, 37, 1, 81000, 0xffbd6bf9
0, 38, 38, 1, 81000, 0xd7ad6f59 0, 38, 38, 1, 81000, 0x813170d0
0, 39, 39, 1, 81000, 0xaf5e3e76 0, 39, 39, 1, 81000, 0x430c4040
0, 40, 40, 1, 81000, 0x10fceda4 0, 40, 40, 1, 81000, 0x56d1eecb
0, 41, 41, 1, 81000, 0xb26df92b 0, 41, 41, 1, 81000, 0xaa4afa12
0, 42, 42, 1, 81000, 0xd6676e08 0, 42, 42, 1, 81000, 0x2c3d6fb8
0, 43, 43, 1, 81000, 0xff6b1b95 0, 43, 43, 1, 81000, 0xfedf1e3e
0, 44, 44, 1, 81000, 0x6196d598 0, 44, 44, 1, 81000, 0xf538d893
0, 45, 45, 1, 81000, 0x833ebf1b 0, 45, 45, 1, 81000, 0xcc81c3b5
0, 46, 46, 1, 81000, 0x7b085af1 0, 46, 46, 1, 81000, 0x59b95fbc
0, 47, 47, 1, 81000, 0xe8f583b4 0, 47, 47, 1, 81000, 0xb4da87a0
0, 48, 48, 1, 81000, 0x3426d5e4 0, 48, 48, 1, 81000, 0x3426d5e4
0, 49, 49, 1, 81000, 0x214069ed 0, 49, 49, 1, 81000, 0x8d066aae
0, 50, 50, 1, 81000, 0x7dbdfd3f 0, 50, 50, 1, 81000, 0x09effe79
0, 51, 51, 1, 81000, 0xf19b3f45 0, 51, 51, 1, 81000, 0xecc540ae
0, 52, 52, 1, 81000, 0x0f05c7e2 0, 52, 52, 1, 81000, 0x845dc90c
0, 53, 53, 1, 81000, 0xba94e323 0, 53, 53, 1, 81000, 0x9c2fe4d2
0, 54, 54, 1, 81000, 0x0de7b0c2 0, 54, 54, 1, 81000, 0x8887b277
0, 55, 55, 1, 81000, 0xfcf93c55 0, 55, 55, 1, 81000, 0x3bdc3ca9
0, 56, 56, 1, 81000, 0x8a8dbd55 0, 56, 56, 1, 81000, 0x094fbe27
0, 57, 57, 1, 81000, 0xddf22b97 0, 57, 57, 1, 81000, 0xddf22b97
0, 58, 58, 1, 81000, 0x49a830ff 0, 58, 58, 1, 81000, 0x31b23156
0, 59, 59, 1, 81000, 0x82ab2a4b 0, 59, 59, 1, 81000, 0xf5bf2ad8
0, 60, 60, 1, 81000, 0xd23420e5 0, 60, 60, 1, 81000, 0x4a9321c4
0, 61, 61, 1, 81000, 0x7c1017d1 0, 61, 61, 1, 81000, 0xdd1b18ca
0, 62, 62, 1, 81000, 0x9aa61b38 0, 62, 62, 1, 81000, 0x4ece1cdd
0, 63, 63, 1, 81000, 0x2a724a18 0, 63, 63, 1, 81000, 0x6a9a4b53
0, 64, 64, 1, 81000, 0xc18055f2 0, 64, 64, 1, 81000, 0x6624578b
0, 65, 65, 1, 81000, 0xecba3855 0, 65, 65, 1, 81000, 0x89273a0f
0, 66, 66, 1, 81000, 0x0eed6b0f 0, 66, 66, 1, 81000, 0x9eb56c4c
0, 67, 67, 1, 81000, 0x4be73816 0, 67, 67, 1, 81000, 0xe60238f5
0, 68, 68, 1, 81000, 0xa681214e 0, 68, 68, 1, 81000, 0xbc4c228a
0, 69, 69, 1, 81000, 0x4958f83d 0, 69, 69, 1, 81000, 0x3feefa08
0, 70, 70, 1, 81000, 0xca0f0d61 0, 70, 70, 1, 81000, 0x0d620f37
0, 71, 71, 1, 81000, 0x3c453de1 0, 71, 71, 1, 81000, 0x93693fc8
0, 72, 72, 1, 81000, 0xff60360a 0, 72, 72, 1, 81000, 0xfc4b3848
0, 73, 73, 1, 81000, 0xdcef0949 0, 73, 73, 1, 81000, 0xd9950bfb
0, 74, 74, 1, 81000, 0xe5e3732d 0, 74, 74, 1, 81000, 0xe5e3732d
0, 75, 75, 1, 81000, 0x39747fd4 0, 75, 75, 1, 81000, 0x53517fd2
0, 76, 76, 1, 81000, 0x6bec70e6 0, 76, 76, 1, 81000, 0xb57c70b0
0, 77, 77, 1, 81000, 0x7026a8c0 0, 77, 77, 1, 81000, 0x378ea87c
0, 78, 78, 1, 81000, 0x92de5b61 0, 78, 78, 1, 81000, 0xfd2b5b58
0, 79, 79, 1, 81000, 0x3f00507f 0, 79, 79, 1, 81000, 0x66d45077
0, 80, 80, 1, 81000, 0x5620c377 0, 80, 80, 1, 81000, 0x6e07c3f8
0, 81, 81, 1, 81000, 0x39f5ed38 0, 81, 81, 1, 81000, 0x39f5ed38
0, 82, 82, 1, 81000, 0x6ee35d67 0, 82, 82, 1, 81000, 0x55b05da7
0, 83, 83, 1, 81000, 0x4f99a409 0, 83, 83, 1, 81000, 0x7f78a42c
0, 84, 84, 1, 81000, 0x0a05b6ea 0, 84, 84, 1, 81000, 0x5139b79c
0, 85, 85, 1, 81000, 0xd6c442d9 0, 85, 85, 1, 81000, 0x4054437d
0, 86, 86, 1, 81000, 0x0bb3d2f0 0, 86, 86, 1, 81000, 0x0f9dd327
0, 87, 87, 1, 81000, 0x6891c5b1 0, 87, 87, 1, 81000, 0xa885c60e
0, 88, 88, 1, 81000, 0xf16ba9be 0, 88, 88, 1, 81000, 0x37abaa72
0, 89, 89, 1, 81000, 0xba53528e 0, 89, 89, 1, 81000, 0xdab25345
0, 90, 90, 1, 81000, 0xc847de49 0, 90, 90, 1, 81000, 0xbdf4df9d
0, 91, 91, 1, 81000, 0xc5b2e2b0 0, 91, 91, 1, 81000, 0xc5b2e2b0
0, 92, 92, 1, 81000, 0xb0b497ff 0, 92, 92, 1, 81000, 0xb0b497ff