yading@10
|
1 /*
|
yading@10
|
2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
|
yading@10
|
3 *
|
yading@10
|
4 * Copyright (c) 2009 Maxim Poliakovski
|
yading@10
|
5 *
|
yading@10
|
6 * This file is part of FFmpeg.
|
yading@10
|
7 *
|
yading@10
|
8 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
9 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
10 * License as published by the Free Software Foundation; either
|
yading@10
|
11 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
12 *
|
yading@10
|
13 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
16 * Lesser General Public License for more details.
|
yading@10
|
17 *
|
yading@10
|
18 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
19 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
21 */
|
yading@10
|
22
|
yading@10
|
23 /**
|
yading@10
|
24 * @file
|
yading@10
|
25 * This file contains functions and data shared by both Indeo4 and
|
yading@10
|
26 * Indeo5 decoders.
|
yading@10
|
27 */
|
yading@10
|
28
|
yading@10
|
29 #define BITSTREAM_READER_LE
|
yading@10
|
30 #include "libavutil/attributes.h"
|
yading@10
|
31 #include "avcodec.h"
|
yading@10
|
32 #include "get_bits.h"
|
yading@10
|
33 #include "internal.h"
|
yading@10
|
34 #include "mathops.h"
|
yading@10
|
35 #include "ivi_common.h"
|
yading@10
|
36 #include "ivi_dsp.h"
|
yading@10
|
37
|
yading@10
|
38 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
|
yading@10
|
39 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
|
yading@10
|
40
|
yading@10
|
41 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
|
yading@10
|
42 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
|
yading@10
|
43
|
yading@10
|
44 /**
|
yading@10
|
45 * Reverse "nbits" bits of the value "val" and return the result
|
yading@10
|
46 * in the least significant bits.
|
yading@10
|
47 */
|
yading@10
|
48 static uint16_t inv_bits(uint16_t val, int nbits)
|
yading@10
|
49 {
|
yading@10
|
50 uint16_t res;
|
yading@10
|
51
|
yading@10
|
52 if (nbits <= 8) {
|
yading@10
|
53 res = ff_reverse[val] >> (8-nbits);
|
yading@10
|
54 } else
|
yading@10
|
55 res = ((ff_reverse[val & 0xFF] << 8) + (ff_reverse[val >> 8])) >> (16-nbits);
|
yading@10
|
56
|
yading@10
|
57 return res;
|
yading@10
|
58 }
|
yading@10
|
59
|
yading@10
|
60 /*
|
yading@10
|
61 * Generate a huffman codebook from the given descriptor
|
yading@10
|
62 * and convert it into the FFmpeg VLC table.
|
yading@10
|
63 *
|
yading@10
|
64 * @param[in] cb pointer to codebook descriptor
|
yading@10
|
65 * @param[out] vlc where to place the generated VLC table
|
yading@10
|
66 * @param[in] flag flag: 1 - for static or 0 for dynamic tables
|
yading@10
|
67 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
|
yading@10
|
68 */
|
yading@10
|
69 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
|
yading@10
|
70 {
|
yading@10
|
71 int pos, i, j, codes_per_row, prefix, not_last_row;
|
yading@10
|
72 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
|
yading@10
|
73 uint8_t bits[256];
|
yading@10
|
74
|
yading@10
|
75 pos = 0; /* current position = 0 */
|
yading@10
|
76
|
yading@10
|
77 for (i = 0; i < cb->num_rows; i++) {
|
yading@10
|
78 codes_per_row = 1 << cb->xbits[i];
|
yading@10
|
79 not_last_row = (i != cb->num_rows - 1);
|
yading@10
|
80 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
|
yading@10
|
81
|
yading@10
|
82 for (j = 0; j < codes_per_row; j++) {
|
yading@10
|
83 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
|
yading@10
|
84 break; /* elements, but only 256 codes are allowed! */
|
yading@10
|
85
|
yading@10
|
86 bits[pos] = i + cb->xbits[i] + not_last_row;
|
yading@10
|
87 if (bits[pos] > IVI_VLC_BITS)
|
yading@10
|
88 return -1; /* invalid descriptor */
|
yading@10
|
89
|
yading@10
|
90 codewords[pos] = inv_bits((prefix | j), bits[pos]);
|
yading@10
|
91 if (!bits[pos])
|
yading@10
|
92 bits[pos] = 1;
|
yading@10
|
93
|
yading@10
|
94 pos++;
|
yading@10
|
95 }//for j
|
yading@10
|
96 }//for i
|
yading@10
|
97
|
yading@10
|
98 /* number of codewords = pos */
|
yading@10
|
99 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
|
yading@10
|
100 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
|
yading@10
|
101 }
|
yading@10
|
102
|
yading@10
|
103 void ff_ivi_init_static_vlc(void)
|
yading@10
|
104 {
|
yading@10
|
105 int i;
|
yading@10
|
106 static VLC_TYPE table_data[8192 * 16][2];
|
yading@10
|
107 static int initialized_vlcs = 0;
|
yading@10
|
108
|
yading@10
|
109 if (initialized_vlcs)
|
yading@10
|
110 return;
|
yading@10
|
111 for (i = 0; i < 8; i++) {
|
yading@10
|
112 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
|
yading@10
|
113 ivi_mb_vlc_tabs[i].table_allocated = 8192;
|
yading@10
|
114 ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ivi_mb_vlc_tabs[i], 1);
|
yading@10
|
115 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
|
yading@10
|
116 ivi_blk_vlc_tabs[i].table_allocated = 8192;
|
yading@10
|
117 ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ivi_blk_vlc_tabs[i], 1);
|
yading@10
|
118 }
|
yading@10
|
119 initialized_vlcs = 1;
|
yading@10
|
120 }
|
yading@10
|
121
|
yading@10
|
122 /*
|
yading@10
|
123 * Copy huffman codebook descriptors.
|
yading@10
|
124 *
|
yading@10
|
125 * @param[out] dst ptr to the destination descriptor
|
yading@10
|
126 * @param[in] src ptr to the source descriptor
|
yading@10
|
127 */
|
yading@10
|
128 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
|
yading@10
|
129 {
|
yading@10
|
130 dst->num_rows = src->num_rows;
|
yading@10
|
131 memcpy(dst->xbits, src->xbits, src->num_rows);
|
yading@10
|
132 }
|
yading@10
|
133
|
yading@10
|
134 /*
|
yading@10
|
135 * Compare two huffman codebook descriptors.
|
yading@10
|
136 *
|
yading@10
|
137 * @param[in] desc1 ptr to the 1st descriptor to compare
|
yading@10
|
138 * @param[in] desc2 ptr to the 2nd descriptor to compare
|
yading@10
|
139 * @return comparison result: 0 - equal, 1 - not equal
|
yading@10
|
140 */
|
yading@10
|
141 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
|
yading@10
|
142 {
|
yading@10
|
143 return desc1->num_rows != desc2->num_rows
|
yading@10
|
144 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
|
yading@10
|
145 }
|
yading@10
|
146
|
yading@10
|
147 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
|
yading@10
|
148 IVIHuffTab *huff_tab, AVCodecContext *avctx)
|
yading@10
|
149 {
|
yading@10
|
150 int i, result;
|
yading@10
|
151 IVIHuffDesc new_huff;
|
yading@10
|
152
|
yading@10
|
153 if (!desc_coded) {
|
yading@10
|
154 /* select default table */
|
yading@10
|
155 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
|
yading@10
|
156 : &ivi_mb_vlc_tabs [7];
|
yading@10
|
157 } else {
|
yading@10
|
158 huff_tab->tab_sel = get_bits(gb, 3);
|
yading@10
|
159 if (huff_tab->tab_sel == 7) {
|
yading@10
|
160 /* custom huffman table (explicitly encoded) */
|
yading@10
|
161 new_huff.num_rows = get_bits(gb, 4);
|
yading@10
|
162 if (!new_huff.num_rows) {
|
yading@10
|
163 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
|
yading@10
|
164 return AVERROR_INVALIDDATA;
|
yading@10
|
165 }
|
yading@10
|
166
|
yading@10
|
167 for (i = 0; i < new_huff.num_rows; i++)
|
yading@10
|
168 new_huff.xbits[i] = get_bits(gb, 4);
|
yading@10
|
169
|
yading@10
|
170 /* Have we got the same custom table? Rebuild if not. */
|
yading@10
|
171 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
|
yading@10
|
172 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
|
yading@10
|
173
|
yading@10
|
174 if (huff_tab->cust_tab.table)
|
yading@10
|
175 ff_free_vlc(&huff_tab->cust_tab);
|
yading@10
|
176 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
|
yading@10
|
177 &huff_tab->cust_tab, 0);
|
yading@10
|
178 if (result) {
|
yading@10
|
179 huff_tab->cust_desc.num_rows = 0; // reset faulty description
|
yading@10
|
180 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
181 "Error while initializing custom vlc table!\n");
|
yading@10
|
182 return result;
|
yading@10
|
183 }
|
yading@10
|
184 }
|
yading@10
|
185 huff_tab->tab = &huff_tab->cust_tab;
|
yading@10
|
186 } else {
|
yading@10
|
187 /* select one of predefined tables */
|
yading@10
|
188 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
|
yading@10
|
189 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
|
yading@10
|
190 }
|
yading@10
|
191 }
|
yading@10
|
192
|
yading@10
|
193 return 0;
|
yading@10
|
194 }
|
yading@10
|
195
|
yading@10
|
196 /*
|
yading@10
|
197 * Free planes, bands and macroblocks buffers.
|
yading@10
|
198 *
|
yading@10
|
199 * @param[in] planes pointer to the array of the plane descriptors
|
yading@10
|
200 */
|
yading@10
|
201 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
|
yading@10
|
202 {
|
yading@10
|
203 int p, b, t;
|
yading@10
|
204
|
yading@10
|
205 for (p = 0; p < 3; p++) {
|
yading@10
|
206 if (planes[p].bands)
|
yading@10
|
207 for (b = 0; b < planes[p].num_bands; b++) {
|
yading@10
|
208 av_freep(&planes[p].bands[b].bufs[0]);
|
yading@10
|
209 av_freep(&planes[p].bands[b].bufs[1]);
|
yading@10
|
210 av_freep(&planes[p].bands[b].bufs[2]);
|
yading@10
|
211
|
yading@10
|
212 if (planes[p].bands[b].blk_vlc.cust_tab.table)
|
yading@10
|
213 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
|
yading@10
|
214 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
|
yading@10
|
215 av_freep(&planes[p].bands[b].tiles[t].mbs);
|
yading@10
|
216 av_freep(&planes[p].bands[b].tiles);
|
yading@10
|
217 }
|
yading@10
|
218 av_freep(&planes[p].bands);
|
yading@10
|
219 }
|
yading@10
|
220 }
|
yading@10
|
221
|
yading@10
|
222 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
|
yading@10
|
223 {
|
yading@10
|
224 int p, b;
|
yading@10
|
225 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
|
yading@10
|
226 IVIBandDesc *band;
|
yading@10
|
227
|
yading@10
|
228 ivi_free_buffers(planes);
|
yading@10
|
229
|
yading@10
|
230 /* fill in the descriptor of the luminance plane */
|
yading@10
|
231 planes[0].width = cfg->pic_width;
|
yading@10
|
232 planes[0].height = cfg->pic_height;
|
yading@10
|
233 planes[0].num_bands = cfg->luma_bands;
|
yading@10
|
234
|
yading@10
|
235 /* fill in the descriptors of the chrominance planes */
|
yading@10
|
236 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
|
yading@10
|
237 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
|
yading@10
|
238 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
|
yading@10
|
239
|
yading@10
|
240 for (p = 0; p < 3; p++) {
|
yading@10
|
241 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
|
yading@10
|
242 if (!planes[p].bands)
|
yading@10
|
243 return AVERROR(ENOMEM);
|
yading@10
|
244
|
yading@10
|
245 /* select band dimensions: if there is only one band then it
|
yading@10
|
246 * has the full size, if there are several bands each of them
|
yading@10
|
247 * has only half size */
|
yading@10
|
248 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
|
yading@10
|
249 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
|
yading@10
|
250
|
yading@10
|
251 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
|
yading@10
|
252 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
|
yading@10
|
253 align_fac = p ? 8 : 16;
|
yading@10
|
254 width_aligned = FFALIGN(b_width , align_fac);
|
yading@10
|
255 height_aligned = FFALIGN(b_height, align_fac);
|
yading@10
|
256 buf_size = width_aligned * height_aligned * sizeof(int16_t);
|
yading@10
|
257
|
yading@10
|
258 for (b = 0; b < planes[p].num_bands; b++) {
|
yading@10
|
259 band = &planes[p].bands[b]; /* select appropriate plane/band */
|
yading@10
|
260 band->plane = p;
|
yading@10
|
261 band->band_num = b;
|
yading@10
|
262 band->width = b_width;
|
yading@10
|
263 band->height = b_height;
|
yading@10
|
264 band->pitch = width_aligned;
|
yading@10
|
265 band->aheight = height_aligned;
|
yading@10
|
266 band->bufs[0] = av_mallocz(buf_size);
|
yading@10
|
267 band->bufs[1] = av_mallocz(buf_size);
|
yading@10
|
268 band->bufsize = buf_size/2;
|
yading@10
|
269 if (!band->bufs[0] || !band->bufs[1])
|
yading@10
|
270 return AVERROR(ENOMEM);
|
yading@10
|
271
|
yading@10
|
272 /* allocate the 3rd band buffer for scalability mode */
|
yading@10
|
273 if (cfg->luma_bands > 1) {
|
yading@10
|
274 band->bufs[2] = av_mallocz(buf_size);
|
yading@10
|
275 if (!band->bufs[2])
|
yading@10
|
276 return AVERROR(ENOMEM);
|
yading@10
|
277 }
|
yading@10
|
278
|
yading@10
|
279 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
|
yading@10
|
280 }
|
yading@10
|
281 }
|
yading@10
|
282
|
yading@10
|
283 return 0;
|
yading@10
|
284 }
|
yading@10
|
285
|
yading@10
|
286 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
|
yading@10
|
287 {
|
yading@10
|
288 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
|
yading@10
|
289 IVIBandDesc *band;
|
yading@10
|
290 IVITile *tile, *ref_tile;
|
yading@10
|
291
|
yading@10
|
292 for (p = 0; p < 3; p++) {
|
yading@10
|
293 t_width = !p ? tile_width : (tile_width + 3) >> 2;
|
yading@10
|
294 t_height = !p ? tile_height : (tile_height + 3) >> 2;
|
yading@10
|
295
|
yading@10
|
296 if (!p && planes[0].num_bands == 4) {
|
yading@10
|
297 t_width >>= 1;
|
yading@10
|
298 t_height >>= 1;
|
yading@10
|
299 }
|
yading@10
|
300 if(t_width<=0 || t_height<=0)
|
yading@10
|
301 return AVERROR(EINVAL);
|
yading@10
|
302
|
yading@10
|
303 for (b = 0; b < planes[p].num_bands; b++) {
|
yading@10
|
304 band = &planes[p].bands[b];
|
yading@10
|
305 x_tiles = IVI_NUM_TILES(band->width, t_width);
|
yading@10
|
306 y_tiles = IVI_NUM_TILES(band->height, t_height);
|
yading@10
|
307 band->num_tiles = x_tiles * y_tiles;
|
yading@10
|
308
|
yading@10
|
309 av_freep(&band->tiles);
|
yading@10
|
310 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
|
yading@10
|
311 if (!band->tiles)
|
yading@10
|
312 return AVERROR(ENOMEM);
|
yading@10
|
313
|
yading@10
|
314 tile = band->tiles;
|
yading@10
|
315
|
yading@10
|
316 /* use the first luma band as reference for motion vectors
|
yading@10
|
317 * and quant */
|
yading@10
|
318 ref_tile = planes[0].bands[0].tiles;
|
yading@10
|
319
|
yading@10
|
320 for (y = 0; y < band->height; y += t_height) {
|
yading@10
|
321 for (x = 0; x < band->width; x += t_width) {
|
yading@10
|
322 tile->xpos = x;
|
yading@10
|
323 tile->ypos = y;
|
yading@10
|
324 tile->mb_size = band->mb_size;
|
yading@10
|
325 tile->width = FFMIN(band->width - x, t_width);
|
yading@10
|
326 tile->height = FFMIN(band->height - y, t_height);
|
yading@10
|
327 tile->is_empty = tile->data_size = 0;
|
yading@10
|
328 /* calculate number of macroblocks */
|
yading@10
|
329 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
|
yading@10
|
330 band->mb_size);
|
yading@10
|
331
|
yading@10
|
332 av_freep(&tile->mbs);
|
yading@10
|
333 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
|
yading@10
|
334 if (!tile->mbs)
|
yading@10
|
335 return AVERROR(ENOMEM);
|
yading@10
|
336
|
yading@10
|
337 tile->ref_mbs = 0;
|
yading@10
|
338 if (p || b) {
|
yading@10
|
339 if (tile->num_MBs <= ref_tile->num_MBs) {
|
yading@10
|
340 tile->ref_mbs = ref_tile->mbs;
|
yading@10
|
341 }else
|
yading@10
|
342 av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
|
yading@10
|
343 ref_tile++;
|
yading@10
|
344 }
|
yading@10
|
345
|
yading@10
|
346 tile++;
|
yading@10
|
347 }
|
yading@10
|
348 }
|
yading@10
|
349
|
yading@10
|
350 }// for b
|
yading@10
|
351 }// for p
|
yading@10
|
352
|
yading@10
|
353 return 0;
|
yading@10
|
354 }
|
yading@10
|
355
|
yading@10
|
356 /*
|
yading@10
|
357 * Decode size of the tile data.
|
yading@10
|
358 * The size is stored as a variable-length field having the following format:
|
yading@10
|
359 * if (tile_data_size < 255) than this field is only one byte long
|
yading@10
|
360 * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
|
yading@10
|
361 * where X1-X3 is size of the tile data
|
yading@10
|
362 *
|
yading@10
|
363 * @param[in,out] gb the GetBit context
|
yading@10
|
364 * @return size of the tile data in bytes
|
yading@10
|
365 */
|
yading@10
|
366 static int ivi_dec_tile_data_size(GetBitContext *gb)
|
yading@10
|
367 {
|
yading@10
|
368 int len;
|
yading@10
|
369
|
yading@10
|
370 len = 0;
|
yading@10
|
371 if (get_bits1(gb)) {
|
yading@10
|
372 len = get_bits(gb, 8);
|
yading@10
|
373 if (len == 255)
|
yading@10
|
374 len = get_bits_long(gb, 24);
|
yading@10
|
375 }
|
yading@10
|
376
|
yading@10
|
377 /* align the bitstream reader on the byte boundary */
|
yading@10
|
378 align_get_bits(gb);
|
yading@10
|
379
|
yading@10
|
380 return len;
|
yading@10
|
381 }
|
yading@10
|
382
|
yading@10
|
383 /*
|
yading@10
|
384 * Decode block data:
|
yading@10
|
385 * extract huffman-coded transform coefficients from the bitstream,
|
yading@10
|
386 * dequantize them, apply inverse transform and motion compensation
|
yading@10
|
387 * in order to reconstruct the picture.
|
yading@10
|
388 *
|
yading@10
|
389 * @param[in,out] gb the GetBit context
|
yading@10
|
390 * @param[in] band pointer to the band descriptor
|
yading@10
|
391 * @param[in] tile pointer to the tile descriptor
|
yading@10
|
392 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
|
yading@10
|
393 */
|
yading@10
|
394 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile,
|
yading@10
|
395 AVCodecContext *avctx)
|
yading@10
|
396 {
|
yading@10
|
397 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
|
yading@10
|
398 pos, is_intra, mc_type = 0, av_uninit(mv_x), av_uninit(mv_y), col_mask;
|
yading@10
|
399 uint8_t col_flags[8];
|
yading@10
|
400 int32_t prev_dc, trvec[64];
|
yading@10
|
401 uint32_t cbp, av_uninit(sym), lo, hi, quant, buf_offs, q;
|
yading@10
|
402 IVIMbInfo *mb;
|
yading@10
|
403 RVMapDesc *rvmap = band->rv_map;
|
yading@10
|
404 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
|
yading@10
|
405 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
|
yading@10
|
406 const uint16_t *base_tab;
|
yading@10
|
407 const uint8_t *scale_tab;
|
yading@10
|
408
|
yading@10
|
409 prev_dc = 0; /* init intra prediction for the DC coefficient */
|
yading@10
|
410
|
yading@10
|
411 blk_size = band->blk_size;
|
yading@10
|
412 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */
|
yading@10
|
413 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
|
yading@10
|
414 num_coeffs = blk_size * blk_size;
|
yading@10
|
415 if (blk_size == 8) {
|
yading@10
|
416 mc_with_delta_func = ff_ivi_mc_8x8_delta;
|
yading@10
|
417 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
|
yading@10
|
418 } else {
|
yading@10
|
419 mc_with_delta_func = ff_ivi_mc_4x4_delta;
|
yading@10
|
420 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
|
yading@10
|
421 }
|
yading@10
|
422
|
yading@10
|
423 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
|
yading@10
|
424 is_intra = !mb->type;
|
yading@10
|
425 cbp = mb->cbp;
|
yading@10
|
426 buf_offs = mb->buf_offs;
|
yading@10
|
427
|
yading@10
|
428 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
|
yading@10
|
429
|
yading@10
|
430 base_tab = is_intra ? band->intra_base : band->inter_base;
|
yading@10
|
431 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
|
yading@10
|
432 if (scale_tab)
|
yading@10
|
433 quant = scale_tab[quant];
|
yading@10
|
434
|
yading@10
|
435 if (!is_intra) {
|
yading@10
|
436 mv_x = mb->mv_x;
|
yading@10
|
437 mv_y = mb->mv_y;
|
yading@10
|
438 if (band->is_halfpel) {
|
yading@10
|
439 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
|
yading@10
|
440 mv_x >>= 1;
|
yading@10
|
441 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
|
yading@10
|
442 }
|
yading@10
|
443 if (mb->type) {
|
yading@10
|
444 int dmv_x, dmv_y, cx, cy;
|
yading@10
|
445
|
yading@10
|
446 dmv_x = mb->mv_x >> band->is_halfpel;
|
yading@10
|
447 dmv_y = mb->mv_y >> band->is_halfpel;
|
yading@10
|
448 cx = mb->mv_x & band->is_halfpel;
|
yading@10
|
449 cy = mb->mv_y & band->is_halfpel;
|
yading@10
|
450
|
yading@10
|
451 if ( mb->xpos + dmv_x < 0
|
yading@10
|
452 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
|
yading@10
|
453 || mb->ypos + dmv_y < 0
|
yading@10
|
454 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
|
yading@10
|
455 return AVERROR_INVALIDDATA;
|
yading@10
|
456 }
|
yading@10
|
457 }
|
yading@10
|
458 }
|
yading@10
|
459
|
yading@10
|
460 for (blk = 0; blk < num_blocks; blk++) {
|
yading@10
|
461 /* adjust block position in the buffer according to its number */
|
yading@10
|
462 if (blk & 1) {
|
yading@10
|
463 buf_offs += blk_size;
|
yading@10
|
464 } else if (blk == 2) {
|
yading@10
|
465 buf_offs -= blk_size;
|
yading@10
|
466 buf_offs += blk_size * band->pitch;
|
yading@10
|
467 }
|
yading@10
|
468
|
yading@10
|
469 if (cbp & 1) { /* block coded ? */
|
yading@10
|
470 if (!band->scan) {
|
yading@10
|
471 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
|
yading@10
|
472 return AVERROR_INVALIDDATA;
|
yading@10
|
473 }
|
yading@10
|
474
|
yading@10
|
475 scan_pos = -1;
|
yading@10
|
476 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
|
yading@10
|
477 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
|
yading@10
|
478
|
yading@10
|
479 while (scan_pos <= num_coeffs) {
|
yading@10
|
480 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
|
yading@10
|
481 if (sym == rvmap->eob_sym)
|
yading@10
|
482 break; /* End of block */
|
yading@10
|
483
|
yading@10
|
484 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
|
yading@10
|
485 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
|
yading@10
|
486 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
|
yading@10
|
487 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
|
yading@10
|
488 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
|
yading@10
|
489 } else {
|
yading@10
|
490 if (sym >= 256U) {
|
yading@10
|
491 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
|
yading@10
|
492 return -1;
|
yading@10
|
493 }
|
yading@10
|
494 run = rvmap->runtab[sym];
|
yading@10
|
495 val = rvmap->valtab[sym];
|
yading@10
|
496 }
|
yading@10
|
497
|
yading@10
|
498 /* de-zigzag and dequantize */
|
yading@10
|
499 scan_pos += run;
|
yading@10
|
500 if (scan_pos >= (unsigned)num_coeffs)
|
yading@10
|
501 break;
|
yading@10
|
502 pos = band->scan[scan_pos];
|
yading@10
|
503
|
yading@10
|
504 if (!val)
|
yading@10
|
505 av_dlog(avctx, "Val = 0 encountered!\n");
|
yading@10
|
506
|
yading@10
|
507 q = (base_tab[pos] * quant) >> 9;
|
yading@10
|
508 if (q > 1)
|
yading@10
|
509 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
|
yading@10
|
510 trvec[pos] = val;
|
yading@10
|
511 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
|
yading@10
|
512 }// while
|
yading@10
|
513
|
yading@10
|
514 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
|
yading@10
|
515 return -1; /* corrupt block data */
|
yading@10
|
516
|
yading@10
|
517 /* undoing DC coeff prediction for intra-blocks */
|
yading@10
|
518 if (is_intra && band->is_2d_trans) {
|
yading@10
|
519 prev_dc += trvec[0];
|
yading@10
|
520 trvec[0] = prev_dc;
|
yading@10
|
521 col_flags[0] |= !!prev_dc;
|
yading@10
|
522 }
|
yading@10
|
523 if(band->transform_size > band->blk_size){
|
yading@10
|
524 av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
|
yading@10
|
525 return AVERROR_INVALIDDATA;
|
yading@10
|
526 }
|
yading@10
|
527 /* apply inverse transform */
|
yading@10
|
528 band->inv_transform(trvec, band->buf + buf_offs,
|
yading@10
|
529 band->pitch, col_flags);
|
yading@10
|
530
|
yading@10
|
531 /* apply motion compensation */
|
yading@10
|
532 if (!is_intra)
|
yading@10
|
533 mc_with_delta_func(band->buf + buf_offs,
|
yading@10
|
534 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
|
yading@10
|
535 band->pitch, mc_type);
|
yading@10
|
536 } else {
|
yading@10
|
537 /* block not coded */
|
yading@10
|
538 /* for intra blocks apply the dc slant transform */
|
yading@10
|
539 /* for inter - perform the motion compensation without delta */
|
yading@10
|
540 if (is_intra) {
|
yading@10
|
541 band->dc_transform(&prev_dc, band->buf + buf_offs,
|
yading@10
|
542 band->pitch, blk_size);
|
yading@10
|
543 } else
|
yading@10
|
544 mc_no_delta_func(band->buf + buf_offs,
|
yading@10
|
545 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
|
yading@10
|
546 band->pitch, mc_type);
|
yading@10
|
547 }
|
yading@10
|
548
|
yading@10
|
549 cbp >>= 1;
|
yading@10
|
550 }// for blk
|
yading@10
|
551 }// for mbn
|
yading@10
|
552
|
yading@10
|
553 align_get_bits(gb);
|
yading@10
|
554
|
yading@10
|
555 return 0;
|
yading@10
|
556 }
|
yading@10
|
557
|
yading@10
|
558 /**
|
yading@10
|
559 * Handle empty tiles by performing data copying and motion
|
yading@10
|
560 * compensation respectively.
|
yading@10
|
561 *
|
yading@10
|
562 * @param[in] avctx ptr to the AVCodecContext
|
yading@10
|
563 * @param[in] band pointer to the band descriptor
|
yading@10
|
564 * @param[in] tile pointer to the tile descriptor
|
yading@10
|
565 * @param[in] mv_scale scaling factor for motion vectors
|
yading@10
|
566 */
|
yading@10
|
567 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
|
yading@10
|
568 IVITile *tile, int32_t mv_scale)
|
yading@10
|
569 {
|
yading@10
|
570 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
|
yading@10
|
571 int offs, mb_offset, row_offset;
|
yading@10
|
572 IVIMbInfo *mb, *ref_mb;
|
yading@10
|
573 const int16_t *src;
|
yading@10
|
574 int16_t *dst;
|
yading@10
|
575 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
|
yading@10
|
576 int mc_type);
|
yading@10
|
577
|
yading@10
|
578 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
|
yading@10
|
579 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
|
yading@10
|
580 "parameters %d in ivi_process_empty_tile()\n",
|
yading@10
|
581 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
|
yading@10
|
582 return AVERROR_INVALIDDATA;
|
yading@10
|
583 }
|
yading@10
|
584
|
yading@10
|
585 offs = tile->ypos * band->pitch + tile->xpos;
|
yading@10
|
586 mb = tile->mbs;
|
yading@10
|
587 ref_mb = tile->ref_mbs;
|
yading@10
|
588 row_offset = band->mb_size * band->pitch;
|
yading@10
|
589 need_mc = 0; /* reset the mc tracking flag */
|
yading@10
|
590
|
yading@10
|
591 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
|
yading@10
|
592 mb_offset = offs;
|
yading@10
|
593
|
yading@10
|
594 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
|
yading@10
|
595 mb->xpos = x;
|
yading@10
|
596 mb->ypos = y;
|
yading@10
|
597 mb->buf_offs = mb_offset;
|
yading@10
|
598
|
yading@10
|
599 mb->type = 1; /* set the macroblocks type = INTER */
|
yading@10
|
600 mb->cbp = 0; /* all blocks are empty */
|
yading@10
|
601
|
yading@10
|
602 if (!band->qdelta_present && !band->plane && !band->band_num) {
|
yading@10
|
603 mb->q_delta = band->glob_quant;
|
yading@10
|
604 mb->mv_x = 0;
|
yading@10
|
605 mb->mv_y = 0;
|
yading@10
|
606 }
|
yading@10
|
607
|
yading@10
|
608 if (band->inherit_qdelta && ref_mb)
|
yading@10
|
609 mb->q_delta = ref_mb->q_delta;
|
yading@10
|
610
|
yading@10
|
611 if (band->inherit_mv && ref_mb) {
|
yading@10
|
612 /* motion vector inheritance */
|
yading@10
|
613 if (mv_scale) {
|
yading@10
|
614 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
|
yading@10
|
615 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
|
yading@10
|
616 } else {
|
yading@10
|
617 mb->mv_x = ref_mb->mv_x;
|
yading@10
|
618 mb->mv_y = ref_mb->mv_y;
|
yading@10
|
619 }
|
yading@10
|
620 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
|
yading@10
|
621 {
|
yading@10
|
622 int dmv_x, dmv_y, cx, cy;
|
yading@10
|
623
|
yading@10
|
624 dmv_x = mb->mv_x >> band->is_halfpel;
|
yading@10
|
625 dmv_y = mb->mv_y >> band->is_halfpel;
|
yading@10
|
626 cx = mb->mv_x & band->is_halfpel;
|
yading@10
|
627 cy = mb->mv_y & band->is_halfpel;
|
yading@10
|
628
|
yading@10
|
629 if ( mb->xpos + dmv_x < 0
|
yading@10
|
630 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
|
yading@10
|
631 || mb->ypos + dmv_y < 0
|
yading@10
|
632 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
|
yading@10
|
633 av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
|
yading@10
|
634 return AVERROR_INVALIDDATA;
|
yading@10
|
635 }
|
yading@10
|
636 }
|
yading@10
|
637 }
|
yading@10
|
638
|
yading@10
|
639 mb++;
|
yading@10
|
640 if (ref_mb)
|
yading@10
|
641 ref_mb++;
|
yading@10
|
642 mb_offset += band->mb_size;
|
yading@10
|
643 } // for x
|
yading@10
|
644 offs += row_offset;
|
yading@10
|
645 } // for y
|
yading@10
|
646
|
yading@10
|
647 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
|
yading@10
|
648 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
|
yading@10
|
649 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
|
yading@10
|
650 : ff_ivi_mc_4x4_no_delta;
|
yading@10
|
651
|
yading@10
|
652 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
|
yading@10
|
653 mv_x = mb->mv_x;
|
yading@10
|
654 mv_y = mb->mv_y;
|
yading@10
|
655 if (!band->is_halfpel) {
|
yading@10
|
656 mc_type = 0; /* we have only fullpel vectors */
|
yading@10
|
657 } else {
|
yading@10
|
658 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
|
yading@10
|
659 mv_x >>= 1;
|
yading@10
|
660 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
|
yading@10
|
661 }
|
yading@10
|
662
|
yading@10
|
663 for (blk = 0; blk < num_blocks; blk++) {
|
yading@10
|
664 /* adjust block position in the buffer according with its number */
|
yading@10
|
665 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
|
yading@10
|
666 mc_no_delta_func(band->buf + offs,
|
yading@10
|
667 band->ref_buf + offs + mv_y * band->pitch + mv_x,
|
yading@10
|
668 band->pitch, mc_type);
|
yading@10
|
669 }
|
yading@10
|
670 }
|
yading@10
|
671 } else {
|
yading@10
|
672 /* copy data from the reference tile into the current one */
|
yading@10
|
673 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
|
yading@10
|
674 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
|
yading@10
|
675 for (y = 0; y < tile->height; y++) {
|
yading@10
|
676 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
|
yading@10
|
677 src += band->pitch;
|
yading@10
|
678 dst += band->pitch;
|
yading@10
|
679 }
|
yading@10
|
680 }
|
yading@10
|
681
|
yading@10
|
682 return 0;
|
yading@10
|
683 }
|
yading@10
|
684
|
yading@10
|
685
|
yading@10
|
686 #ifdef DEBUG
|
yading@10
|
687 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
|
yading@10
|
688 {
|
yading@10
|
689 int x, y;
|
yading@10
|
690 int16_t *src, checksum;
|
yading@10
|
691
|
yading@10
|
692 src = band->buf;
|
yading@10
|
693 checksum = 0;
|
yading@10
|
694
|
yading@10
|
695 for (y = 0; y < band->height; src += band->pitch, y++)
|
yading@10
|
696 for (x = 0; x < band->width; x++)
|
yading@10
|
697 checksum += src[x];
|
yading@10
|
698
|
yading@10
|
699 return checksum;
|
yading@10
|
700 }
|
yading@10
|
701 #endif
|
yading@10
|
702
|
yading@10
|
703 /*
|
yading@10
|
704 * Convert and output the current plane.
|
yading@10
|
705 * This conversion is done by adding back the bias value of 128
|
yading@10
|
706 * (subtracted in the encoder) and clipping the result.
|
yading@10
|
707 *
|
yading@10
|
708 * @param[in] plane pointer to the descriptor of the plane being processed
|
yading@10
|
709 * @param[out] dst pointer to the buffer receiving converted pixels
|
yading@10
|
710 * @param[in] dst_pitch pitch for moving to the next y line
|
yading@10
|
711 */
|
yading@10
|
712 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
|
yading@10
|
713 {
|
yading@10
|
714 int x, y;
|
yading@10
|
715 const int16_t *src = plane->bands[0].buf;
|
yading@10
|
716 uint32_t pitch = plane->bands[0].pitch;
|
yading@10
|
717
|
yading@10
|
718 if (!src)
|
yading@10
|
719 return;
|
yading@10
|
720
|
yading@10
|
721 for (y = 0; y < plane->height; y++) {
|
yading@10
|
722 for (x = 0; x < plane->width; x++)
|
yading@10
|
723 dst[x] = av_clip_uint8(src[x] + 128);
|
yading@10
|
724 src += pitch;
|
yading@10
|
725 dst += dst_pitch;
|
yading@10
|
726 }
|
yading@10
|
727 }
|
yading@10
|
728
|
yading@10
|
729 /**
|
yading@10
|
730 * Decode an Indeo 4 or 5 band.
|
yading@10
|
731 *
|
yading@10
|
732 * @param[in,out] ctx ptr to the decoder context
|
yading@10
|
733 * @param[in,out] band ptr to the band descriptor
|
yading@10
|
734 * @param[in] avctx ptr to the AVCodecContext
|
yading@10
|
735 * @return result code: 0 = OK, -1 = error
|
yading@10
|
736 */
|
yading@10
|
737 static int decode_band(IVI45DecContext *ctx,
|
yading@10
|
738 IVIBandDesc *band, AVCodecContext *avctx)
|
yading@10
|
739 {
|
yading@10
|
740 int result, i, t, idx1, idx2, pos;
|
yading@10
|
741 IVITile *tile;
|
yading@10
|
742
|
yading@10
|
743 band->buf = band->bufs[ctx->dst_buf];
|
yading@10
|
744 if (!band->buf) {
|
yading@10
|
745 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
|
yading@10
|
746 return AVERROR_INVALIDDATA;
|
yading@10
|
747 }
|
yading@10
|
748 band->ref_buf = band->bufs[ctx->ref_buf];
|
yading@10
|
749 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
|
yading@10
|
750
|
yading@10
|
751 result = ctx->decode_band_hdr(ctx, band, avctx);
|
yading@10
|
752 if (result) {
|
yading@10
|
753 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
|
yading@10
|
754 result);
|
yading@10
|
755 return result;
|
yading@10
|
756 }
|
yading@10
|
757
|
yading@10
|
758 if (band->is_empty) {
|
yading@10
|
759 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
|
yading@10
|
760 return AVERROR_INVALIDDATA;
|
yading@10
|
761 }
|
yading@10
|
762
|
yading@10
|
763 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
|
yading@10
|
764
|
yading@10
|
765 /* apply corrections to the selected rvmap table if present */
|
yading@10
|
766 for (i = 0; i < band->num_corr; i++) {
|
yading@10
|
767 idx1 = band->corr[i * 2];
|
yading@10
|
768 idx2 = band->corr[i * 2 + 1];
|
yading@10
|
769 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
|
yading@10
|
770 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
|
yading@10
|
771 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
|
yading@10
|
772 band->rv_map->eob_sym ^= idx1 ^ idx2;
|
yading@10
|
773 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
|
yading@10
|
774 band->rv_map->esc_sym ^= idx1 ^ idx2;
|
yading@10
|
775 }
|
yading@10
|
776
|
yading@10
|
777 pos = get_bits_count(&ctx->gb);
|
yading@10
|
778
|
yading@10
|
779 for (t = 0; t < band->num_tiles; t++) {
|
yading@10
|
780 tile = &band->tiles[t];
|
yading@10
|
781
|
yading@10
|
782 if (tile->mb_size != band->mb_size) {
|
yading@10
|
783 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
|
yading@10
|
784 band->mb_size, tile->mb_size);
|
yading@10
|
785 return AVERROR_INVALIDDATA;
|
yading@10
|
786 }
|
yading@10
|
787 tile->is_empty = get_bits1(&ctx->gb);
|
yading@10
|
788 if (tile->is_empty) {
|
yading@10
|
789 result = ivi_process_empty_tile(avctx, band, tile,
|
yading@10
|
790 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
|
yading@10
|
791 if (result < 0)
|
yading@10
|
792 break;
|
yading@10
|
793 av_dlog(avctx, "Empty tile encountered!\n");
|
yading@10
|
794 } else {
|
yading@10
|
795 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
|
yading@10
|
796 if (!tile->data_size) {
|
yading@10
|
797 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
|
yading@10
|
798 result = AVERROR_INVALIDDATA;
|
yading@10
|
799 break;
|
yading@10
|
800 }
|
yading@10
|
801
|
yading@10
|
802 result = ctx->decode_mb_info(ctx, band, tile, avctx);
|
yading@10
|
803 if (result < 0)
|
yading@10
|
804 break;
|
yading@10
|
805
|
yading@10
|
806 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
|
yading@10
|
807 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
|
yading@10
|
808 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
|
yading@10
|
809 break;
|
yading@10
|
810 }
|
yading@10
|
811
|
yading@10
|
812 pos += tile->data_size << 3; // skip to next tile
|
yading@10
|
813 }
|
yading@10
|
814 }
|
yading@10
|
815
|
yading@10
|
816 /* restore the selected rvmap table by applying its corrections in reverse order */
|
yading@10
|
817 for (i = band->num_corr-1; i >= 0; i--) {
|
yading@10
|
818 idx1 = band->corr[i*2];
|
yading@10
|
819 idx2 = band->corr[i*2+1];
|
yading@10
|
820 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
|
yading@10
|
821 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
|
yading@10
|
822 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
|
yading@10
|
823 band->rv_map->eob_sym ^= idx1 ^ idx2;
|
yading@10
|
824 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
|
yading@10
|
825 band->rv_map->esc_sym ^= idx1 ^ idx2;
|
yading@10
|
826 }
|
yading@10
|
827
|
yading@10
|
828 #ifdef DEBUG
|
yading@10
|
829 if (band->checksum_present) {
|
yading@10
|
830 uint16_t chksum = ivi_calc_band_checksum(band);
|
yading@10
|
831 if (chksum != band->checksum) {
|
yading@10
|
832 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
833 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
|
yading@10
|
834 band->plane, band->band_num, band->checksum, chksum);
|
yading@10
|
835 }
|
yading@10
|
836 }
|
yading@10
|
837 #endif
|
yading@10
|
838
|
yading@10
|
839 align_get_bits(&ctx->gb);
|
yading@10
|
840
|
yading@10
|
841 return result;
|
yading@10
|
842 }
|
yading@10
|
843
|
yading@10
|
844 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
yading@10
|
845 AVPacket *avpkt)
|
yading@10
|
846 {
|
yading@10
|
847 IVI45DecContext *ctx = avctx->priv_data;
|
yading@10
|
848 const uint8_t *buf = avpkt->data;
|
yading@10
|
849 AVFrame *frame = data;
|
yading@10
|
850 int buf_size = avpkt->size;
|
yading@10
|
851 int result, p, b;
|
yading@10
|
852
|
yading@10
|
853 init_get_bits(&ctx->gb, buf, buf_size * 8);
|
yading@10
|
854 ctx->frame_data = buf;
|
yading@10
|
855 ctx->frame_size = buf_size;
|
yading@10
|
856
|
yading@10
|
857 result = ctx->decode_pic_hdr(ctx, avctx);
|
yading@10
|
858 if (result) {
|
yading@10
|
859 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
860 "Error while decoding picture header: %d\n", result);
|
yading@10
|
861 return -1;
|
yading@10
|
862 }
|
yading@10
|
863 if (ctx->gop_invalid)
|
yading@10
|
864 return AVERROR_INVALIDDATA;
|
yading@10
|
865
|
yading@10
|
866 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
|
yading@10
|
867 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
|
yading@10
|
868 return -1;
|
yading@10
|
869 }
|
yading@10
|
870
|
yading@10
|
871 ctx->switch_buffers(ctx);
|
yading@10
|
872
|
yading@10
|
873 //{ START_TIMER;
|
yading@10
|
874
|
yading@10
|
875 if (ctx->is_nonnull_frame(ctx)) {
|
yading@10
|
876 ctx->buf_invalid[ctx->dst_buf] = 1;
|
yading@10
|
877 for (p = 0; p < 3; p++) {
|
yading@10
|
878 for (b = 0; b < ctx->planes[p].num_bands; b++) {
|
yading@10
|
879 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
|
yading@10
|
880 if (result) {
|
yading@10
|
881 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
882 "Error while decoding band: %d, plane: %d\n", b, p);
|
yading@10
|
883 return -1;
|
yading@10
|
884 }
|
yading@10
|
885 }
|
yading@10
|
886 }
|
yading@10
|
887 ctx->buf_invalid[ctx->dst_buf] = 0;
|
yading@10
|
888 }
|
yading@10
|
889 if (ctx->buf_invalid[ctx->dst_buf])
|
yading@10
|
890 return -1;
|
yading@10
|
891
|
yading@10
|
892 //STOP_TIMER("decode_planes"); }
|
yading@10
|
893
|
yading@10
|
894 /* If the bidirectional mode is enabled, next I and the following P frame will */
|
yading@10
|
895 /* be sent together. Unfortunately the approach below seems to be the only way */
|
yading@10
|
896 /* to handle the B-frames mode. That's exactly the same Intel decoders do. */
|
yading@10
|
897 if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
|
yading@10
|
898 while (get_bits(&ctx->gb, 8)); // skip version string
|
yading@10
|
899 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
|
yading@10
|
900 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
|
yading@10
|
901 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
|
yading@10
|
902 }
|
yading@10
|
903
|
yading@10
|
904 if (!ctx->is_nonnull_frame(ctx))
|
yading@10
|
905 return buf_size;
|
yading@10
|
906
|
yading@10
|
907 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
|
yading@10
|
908 if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
|
yading@10
|
909 return result;
|
yading@10
|
910
|
yading@10
|
911 if (ctx->is_scalable) {
|
yading@10
|
912 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
|
yading@10
|
913 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
|
yading@10
|
914 else
|
yading@10
|
915 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
|
yading@10
|
916 } else {
|
yading@10
|
917 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
|
yading@10
|
918 }
|
yading@10
|
919
|
yading@10
|
920 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
|
yading@10
|
921 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
|
yading@10
|
922
|
yading@10
|
923 *got_frame = 1;
|
yading@10
|
924
|
yading@10
|
925 return buf_size;
|
yading@10
|
926 }
|
yading@10
|
927
|
yading@10
|
928 /**
|
yading@10
|
929 * Close Indeo5 decoder and clean up its context.
|
yading@10
|
930 */
|
yading@10
|
931 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
|
yading@10
|
932 {
|
yading@10
|
933 IVI45DecContext *ctx = avctx->priv_data;
|
yading@10
|
934
|
yading@10
|
935 ivi_free_buffers(&ctx->planes[0]);
|
yading@10
|
936
|
yading@10
|
937 if (ctx->mb_vlc.cust_tab.table)
|
yading@10
|
938 ff_free_vlc(&ctx->mb_vlc.cust_tab);
|
yading@10
|
939
|
yading@10
|
940 #if IVI4_STREAM_ANALYSER
|
yading@10
|
941 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
|
yading@10
|
942 if (ctx->is_scalable)
|
yading@10
|
943 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
|
yading@10
|
944 if (ctx->uses_tiling)
|
yading@10
|
945 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
|
yading@10
|
946 if (ctx->has_b_frames)
|
yading@10
|
947 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
|
yading@10
|
948 if (ctx->has_transp)
|
yading@10
|
949 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
|
yading@10
|
950 if (ctx->uses_haar)
|
yading@10
|
951 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
|
yading@10
|
952 if (ctx->uses_fullpel)
|
yading@10
|
953 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
|
yading@10
|
954 }
|
yading@10
|
955 #endif
|
yading@10
|
956
|
yading@10
|
957 return 0;
|
yading@10
|
958 }
|
yading@10
|
959
|
yading@10
|
960
|
yading@10
|
961 /**
|
yading@10
|
962 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
|
yading@10
|
963 * signals. They are specified using "huffman descriptors" in order to
|
yading@10
|
964 * avoid huge static tables. The decoding tables will be generated at
|
yading@10
|
965 * startup from these descriptors.
|
yading@10
|
966 */
|
yading@10
|
967 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
|
yading@10
|
968 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
|
yading@10
|
969 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
|
yading@10
|
970 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
|
yading@10
|
971 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
|
yading@10
|
972 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
|
yading@10
|
973 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
|
yading@10
|
974 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
|
yading@10
|
975 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
|
yading@10
|
976 };
|
yading@10
|
977
|
yading@10
|
978 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
|
yading@10
|
979 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
|
yading@10
|
980 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
|
yading@10
|
981 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
|
yading@10
|
982 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
|
yading@10
|
983 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
|
yading@10
|
984 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
|
yading@10
|
985 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
|
yading@10
|
986 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
|
yading@10
|
987 };
|
yading@10
|
988
|
yading@10
|
989
|
yading@10
|
990 /**
|
yading@10
|
991 * Scan patterns shared between indeo4 and indeo5
|
yading@10
|
992 */
|
yading@10
|
993 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
|
yading@10
|
994 0, 8, 16, 24, 32, 40, 48, 56,
|
yading@10
|
995 1, 9, 17, 25, 33, 41, 49, 57,
|
yading@10
|
996 2, 10, 18, 26, 34, 42, 50, 58,
|
yading@10
|
997 3, 11, 19, 27, 35, 43, 51, 59,
|
yading@10
|
998 4, 12, 20, 28, 36, 44, 52, 60,
|
yading@10
|
999 5, 13, 21, 29, 37, 45, 53, 61,
|
yading@10
|
1000 6, 14, 22, 30, 38, 46, 54, 62,
|
yading@10
|
1001 7, 15, 23, 31, 39, 47, 55, 63
|
yading@10
|
1002 };
|
yading@10
|
1003
|
yading@10
|
1004 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
|
yading@10
|
1005 0, 1, 2, 3, 4, 5, 6, 7,
|
yading@10
|
1006 8, 9, 10, 11, 12, 13, 14, 15,
|
yading@10
|
1007 16, 17, 18, 19, 20, 21, 22, 23,
|
yading@10
|
1008 24, 25, 26, 27, 28, 29, 30, 31,
|
yading@10
|
1009 32, 33, 34, 35, 36, 37, 38, 39,
|
yading@10
|
1010 40, 41, 42, 43, 44, 45, 46, 47,
|
yading@10
|
1011 48, 49, 50, 51, 52, 53, 54, 55,
|
yading@10
|
1012 56, 57, 58, 59, 60, 61, 62, 63
|
yading@10
|
1013 };
|
yading@10
|
1014
|
yading@10
|
1015 const uint8_t ff_ivi_direct_scan_4x4[16] = {
|
yading@10
|
1016 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
|
yading@10
|
1017 };
|
yading@10
|
1018
|
yading@10
|
1019
|
yading@10
|
1020 /**
|
yading@10
|
1021 * Run-value (RLE) tables.
|
yading@10
|
1022 */
|
yading@10
|
1023 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
|
yading@10
|
1024 { /* MapTab0 */
|
yading@10
|
1025 5, /* eob_sym */
|
yading@10
|
1026 2, /* esc_sym */
|
yading@10
|
1027 /* run table */
|
yading@10
|
1028 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
|
yading@10
|
1029 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
|
yading@10
|
1030 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
|
yading@10
|
1031 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
|
yading@10
|
1032 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
|
yading@10
|
1033 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
|
yading@10
|
1034 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
|
yading@10
|
1035 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
|
yading@10
|
1036 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
|
yading@10
|
1037 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
|
yading@10
|
1038 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
|
yading@10
|
1039 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
|
yading@10
|
1040 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
|
yading@10
|
1041 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
|
yading@10
|
1042 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
|
yading@10
|
1043 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
|
yading@10
|
1044
|
yading@10
|
1045 /* value table */
|
yading@10
|
1046 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
|
yading@10
|
1047 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
|
yading@10
|
1048 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
|
yading@10
|
1049 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
|
yading@10
|
1050 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
|
yading@10
|
1051 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
|
yading@10
|
1052 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
|
yading@10
|
1053 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
|
yading@10
|
1054 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
|
yading@10
|
1055 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
|
yading@10
|
1056 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
|
yading@10
|
1057 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
|
yading@10
|
1058 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
|
yading@10
|
1059 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
|
yading@10
|
1060 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
|
yading@10
|
1061 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
|
yading@10
|
1062 },{
|
yading@10
|
1063 /* MapTab1 */
|
yading@10
|
1064 0, /* eob_sym */
|
yading@10
|
1065 38, /* esc_sym */
|
yading@10
|
1066 /* run table */
|
yading@10
|
1067 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
|
yading@10
|
1068 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
|
yading@10
|
1069 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
|
yading@10
|
1070 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
|
yading@10
|
1071 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
|
yading@10
|
1072 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
|
yading@10
|
1073 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
|
yading@10
|
1074 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
|
yading@10
|
1075 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
|
yading@10
|
1076 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
|
yading@10
|
1077 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
|
yading@10
|
1078 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
|
yading@10
|
1079 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
|
yading@10
|
1080 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
|
yading@10
|
1081 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
|
yading@10
|
1082 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
|
yading@10
|
1083
|
yading@10
|
1084 /* value table */
|
yading@10
|
1085 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
|
yading@10
|
1086 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
|
yading@10
|
1087 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
|
yading@10
|
1088 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
|
yading@10
|
1089 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
|
yading@10
|
1090 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
|
yading@10
|
1091 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
|
yading@10
|
1092 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
|
yading@10
|
1093 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
|
yading@10
|
1094 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
|
yading@10
|
1095 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
|
yading@10
|
1096 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
|
yading@10
|
1097 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
|
yading@10
|
1098 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
|
yading@10
|
1099 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
|
yading@10
|
1100 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
|
yading@10
|
1101 },{
|
yading@10
|
1102 /* MapTab2 */
|
yading@10
|
1103 2, /* eob_sym */
|
yading@10
|
1104 11, /* esc_sym */
|
yading@10
|
1105 /* run table */
|
yading@10
|
1106 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
|
yading@10
|
1107 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
|
yading@10
|
1108 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
|
yading@10
|
1109 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
|
yading@10
|
1110 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
|
yading@10
|
1111 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
|
yading@10
|
1112 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
|
yading@10
|
1113 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
|
yading@10
|
1114 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
|
yading@10
|
1115 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
|
yading@10
|
1116 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
|
yading@10
|
1117 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
|
yading@10
|
1118 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
|
yading@10
|
1119 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
|
yading@10
|
1120 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
|
yading@10
|
1121 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
|
yading@10
|
1122
|
yading@10
|
1123 /* value table */
|
yading@10
|
1124 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
|
yading@10
|
1125 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
|
yading@10
|
1126 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
|
yading@10
|
1127 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
|
yading@10
|
1128 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
|
yading@10
|
1129 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
|
yading@10
|
1130 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
|
yading@10
|
1131 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
|
yading@10
|
1132 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
|
yading@10
|
1133 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
|
yading@10
|
1134 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
|
yading@10
|
1135 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
|
yading@10
|
1136 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
|
yading@10
|
1137 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
|
yading@10
|
1138 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
|
yading@10
|
1139 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
|
yading@10
|
1140 },{
|
yading@10
|
1141 /* MapTab3 */
|
yading@10
|
1142 0, /* eob_sym */
|
yading@10
|
1143 35, /* esc_sym */
|
yading@10
|
1144 /* run table */
|
yading@10
|
1145 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
|
yading@10
|
1146 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
|
yading@10
|
1147 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
|
yading@10
|
1148 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
|
yading@10
|
1149 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
|
yading@10
|
1150 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
|
yading@10
|
1151 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
|
yading@10
|
1152 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
|
yading@10
|
1153 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
|
yading@10
|
1154 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
|
yading@10
|
1155 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
|
yading@10
|
1156 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
|
yading@10
|
1157 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
|
yading@10
|
1158 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
|
yading@10
|
1159 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
|
yading@10
|
1160 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
|
yading@10
|
1161
|
yading@10
|
1162 /* value table */
|
yading@10
|
1163 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
|
yading@10
|
1164 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
|
yading@10
|
1165 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
|
yading@10
|
1166 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
|
yading@10
|
1167 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
|
yading@10
|
1168 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
|
yading@10
|
1169 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
|
yading@10
|
1170 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
|
yading@10
|
1171 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
|
yading@10
|
1172 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
|
yading@10
|
1173 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
|
yading@10
|
1174 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
|
yading@10
|
1175 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
|
yading@10
|
1176 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
|
yading@10
|
1177 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
|
yading@10
|
1178 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
|
yading@10
|
1179 },{
|
yading@10
|
1180 /* MapTab4 */
|
yading@10
|
1181 0, /* eob_sym */
|
yading@10
|
1182 34, /* esc_sym */
|
yading@10
|
1183 /* run table */
|
yading@10
|
1184 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
|
yading@10
|
1185 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
|
yading@10
|
1186 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
|
yading@10
|
1187 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
|
yading@10
|
1188 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
|
yading@10
|
1189 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
yading@10
|
1190 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
|
yading@10
|
1191 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
|
yading@10
|
1192 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
|
yading@10
|
1193 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
|
yading@10
|
1194 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
|
yading@10
|
1195 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
|
yading@10
|
1196 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
|
yading@10
|
1197 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
|
yading@10
|
1198 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
|
yading@10
|
1199 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
|
yading@10
|
1200
|
yading@10
|
1201 /* value table */
|
yading@10
|
1202 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
|
yading@10
|
1203 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
|
yading@10
|
1204 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
|
yading@10
|
1205 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
|
yading@10
|
1206 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
|
yading@10
|
1207 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
|
yading@10
|
1208 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
|
yading@10
|
1209 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
|
yading@10
|
1210 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
|
yading@10
|
1211 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
|
yading@10
|
1212 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
|
yading@10
|
1213 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
|
yading@10
|
1214 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
|
yading@10
|
1215 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
|
yading@10
|
1216 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
|
yading@10
|
1217 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
|
yading@10
|
1218 },{
|
yading@10
|
1219 /* MapTab5 */
|
yading@10
|
1220 2, /* eob_sym */
|
yading@10
|
1221 33, /* esc_sym */
|
yading@10
|
1222 /* run table */
|
yading@10
|
1223 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
|
yading@10
|
1224 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
|
yading@10
|
1225 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
|
yading@10
|
1226 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
|
yading@10
|
1227 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
|
yading@10
|
1228 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
|
yading@10
|
1229 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
|
yading@10
|
1230 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
|
yading@10
|
1231 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
|
yading@10
|
1232 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
|
yading@10
|
1233 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
|
yading@10
|
1234 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
|
yading@10
|
1235 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
|
yading@10
|
1236 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
|
yading@10
|
1237 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
|
yading@10
|
1238 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
|
yading@10
|
1239
|
yading@10
|
1240 /* value table */
|
yading@10
|
1241 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
|
yading@10
|
1242 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
|
yading@10
|
1243 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
|
yading@10
|
1244 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
|
yading@10
|
1245 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
|
yading@10
|
1246 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
|
yading@10
|
1247 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
|
yading@10
|
1248 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
|
yading@10
|
1249 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
|
yading@10
|
1250 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
|
yading@10
|
1251 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
|
yading@10
|
1252 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
|
yading@10
|
1253 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
|
yading@10
|
1254 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
|
yading@10
|
1255 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
|
yading@10
|
1256 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
|
yading@10
|
1257 },{
|
yading@10
|
1258 /* MapTab6 */
|
yading@10
|
1259 2, /* eob_sym */
|
yading@10
|
1260 13, /* esc_sym */
|
yading@10
|
1261 /* run table */
|
yading@10
|
1262 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
|
yading@10
|
1263 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
|
yading@10
|
1264 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
|
yading@10
|
1265 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
|
yading@10
|
1266 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
|
yading@10
|
1267 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
|
yading@10
|
1268 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
|
yading@10
|
1269 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
|
yading@10
|
1270 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
|
yading@10
|
1271 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
|
yading@10
|
1272 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
|
yading@10
|
1273 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
|
yading@10
|
1274 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
|
yading@10
|
1275 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
|
yading@10
|
1276 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
|
yading@10
|
1277 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
|
yading@10
|
1278
|
yading@10
|
1279 /* value table */
|
yading@10
|
1280 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
|
yading@10
|
1281 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
|
yading@10
|
1282 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
|
yading@10
|
1283 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
|
yading@10
|
1284 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
|
yading@10
|
1285 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
|
yading@10
|
1286 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
|
yading@10
|
1287 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
|
yading@10
|
1288 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
|
yading@10
|
1289 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
|
yading@10
|
1290 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
|
yading@10
|
1291 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
|
yading@10
|
1292 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
|
yading@10
|
1293 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
|
yading@10
|
1294 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
|
yading@10
|
1295 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
|
yading@10
|
1296 },{
|
yading@10
|
1297 /* MapTab7 */
|
yading@10
|
1298 2, /* eob_sym */
|
yading@10
|
1299 38, /* esc_sym */
|
yading@10
|
1300 /* run table */
|
yading@10
|
1301 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
|
yading@10
|
1302 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
|
yading@10
|
1303 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
|
yading@10
|
1304 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
|
yading@10
|
1305 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
|
yading@10
|
1306 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
|
yading@10
|
1307 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
|
yading@10
|
1308 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
|
yading@10
|
1309 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
|
yading@10
|
1310 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
|
yading@10
|
1311 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
|
yading@10
|
1312 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
|
yading@10
|
1313 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
|
yading@10
|
1314 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
|
yading@10
|
1315 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
|
yading@10
|
1316 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
|
yading@10
|
1317
|
yading@10
|
1318 /* value table */
|
yading@10
|
1319 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
|
yading@10
|
1320 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
|
yading@10
|
1321 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
|
yading@10
|
1322 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
|
yading@10
|
1323 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
|
yading@10
|
1324 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
|
yading@10
|
1325 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
|
yading@10
|
1326 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
|
yading@10
|
1327 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
|
yading@10
|
1328 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
|
yading@10
|
1329 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
|
yading@10
|
1330 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
|
yading@10
|
1331 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
|
yading@10
|
1332 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
|
yading@10
|
1333 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
|
yading@10
|
1334 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
|
yading@10
|
1335 },{
|
yading@10
|
1336 /* MapTab8 */
|
yading@10
|
1337 4, /* eob_sym */
|
yading@10
|
1338 11, /* esc_sym */
|
yading@10
|
1339 /* run table */
|
yading@10
|
1340 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
|
yading@10
|
1341 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
|
yading@10
|
1342 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
|
yading@10
|
1343 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
|
yading@10
|
1344 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
|
yading@10
|
1345 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
|
yading@10
|
1346 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
|
yading@10
|
1347 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
|
yading@10
|
1348 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
|
yading@10
|
1349 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
|
yading@10
|
1350 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
|
yading@10
|
1351 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
|
yading@10
|
1352 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
|
yading@10
|
1353 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
|
yading@10
|
1354 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
|
yading@10
|
1355 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
|
yading@10
|
1356
|
yading@10
|
1357 /* value table */
|
yading@10
|
1358 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
|
yading@10
|
1359 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
|
yading@10
|
1360 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
|
yading@10
|
1361 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
|
yading@10
|
1362 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
|
yading@10
|
1363 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
|
yading@10
|
1364 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
|
yading@10
|
1365 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
|
yading@10
|
1366 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
|
yading@10
|
1367 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
|
yading@10
|
1368 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
|
yading@10
|
1369 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
|
yading@10
|
1370 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
|
yading@10
|
1371 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
|
yading@10
|
1372 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
|
yading@10
|
1373 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
|
yading@10
|
1374 }
|
yading@10
|
1375 };
|