Merge pull request #218 from saper/build-fixes
[envytools.git] / vstream / h262_slice.c
blob69abf4ec77157637fab3cd6d9b6536a6b3d42408
1 /*
2 * Copyright (C) 2011 Marcelina Koƛcielnicka <mwk@0x04.net>
3 * All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
25 #include "h262.h"
26 #include "vstream.h"
27 #include <stdio.h>
28 #include <stdlib.h>
30 static const struct vs_vlc_val mbai_vlc[] = {
31 { 0, 1, 1 },
32 { 1, 3, 0,1,1 },
33 { 2, 3, 0,1,0 },
34 { 3, 4, 0,0,1,1 },
35 { 4, 4, 0,0,1,0 },
36 { 5, 5, 0,0,0,1,1 },
37 { 6, 5, 0,0,0,1,0 },
38 { 7, 7, 0,0,0,0,1,1,1 },
39 { 8, 7, 0,0,0,0,1,1,0 },
40 { 9, 8, 0,0,0,0,1,0,1,1 },
41 { 10, 8, 0,0,0,0,1,0,1,0 },
42 { 11, 8, 0,0,0,0,1,0,0,1 },
43 { 12, 8, 0,0,0,0,1,0,0,0 },
44 { 13, 8, 0,0,0,0,0,1,1,1 },
45 { 14, 8, 0,0,0,0,0,1,1,0 },
46 { 15, 10, 0,0,0,0,0,1,0,1,1,1 },
47 { 16, 10, 0,0,0,0,0,1,0,1,1,0 },
48 { 17, 10, 0,0,0,0,0,1,0,1,0,1 },
49 { 18, 10, 0,0,0,0,0,1,0,1,0,0 },
50 { 19, 10, 0,0,0,0,0,1,0,0,1,1 },
51 { 20, 10, 0,0,0,0,0,1,0,0,1,0 },
52 { 21, 11, 0,0,0,0,0,1,0,0,0,1,1 },
53 { 22, 11, 0,0,0,0,0,1,0,0,0,1,0 },
54 { 23, 11, 0,0,0,0,0,1,0,0,0,0,1 },
55 { 24, 11, 0,0,0,0,0,1,0,0,0,0,0 },
56 { 25, 11, 0,0,0,0,0,0,1,1,1,1,1 },
57 { 26, 11, 0,0,0,0,0,0,1,1,1,1,0 },
58 { 27, 11, 0,0,0,0,0,0,1,1,1,0,1 },
59 { 28, 11, 0,0,0,0,0,0,1,1,1,0,0 },
60 { 29, 11, 0,0,0,0,0,0,1,1,0,1,1 },
61 { 30, 11, 0,0,0,0,0,0,1,1,0,1,0 },
62 { 31, 11, 0,0,0,0,0,0,1,1,0,0,1 },
63 { 32, 11, 0,0,0,0,0,0,1,1,0,0,0 },
64 { 33, 11, 0,0,0,0,0,0,0,1,0,0,0 }, /* escape */
65 { 34, 11, 0,0,0,0,0,0,0,1,1,1,1 }, /* stuffing */
66 { 0 },
69 int h262_mb_addr_inc(struct bitstream *str, uint32_t *val) {
70 if (str->dir == VS_ENCODE) {
71 uint32_t tmp = *val, c33 = 33;
72 while (tmp > 32) {
73 if (vs_vlc(str, &c33, mbai_vlc)) return 1;
74 tmp -= 33;
76 if (vs_vlc(str, &tmp, mbai_vlc)) return 1;
77 } else {
78 *val = 0;
79 uint32_t tmp;
80 while (1) {
81 if (vs_vlc(str, &tmp, mbai_vlc)) return 1;
82 if (tmp == 33) {
83 *val += 33;
84 } else if (tmp == 34) {
85 /* stuffing */
86 } else {
87 *val += tmp;
88 break;
92 return 0;
95 static const struct vs_vlc_val motion_code_vlc[] = {
96 { 0, 1, 1 },
97 { 1, 3, 0,1,0 },
98 { -1, 3, 0,1,1 },
99 { 2, 4, 0,0,1,0 },
100 { -2, 4, 0,0,1,1 },
101 { 3, 5, 0,0,0,1,0 },
102 { -3, 5, 0,0,0,1,1 },
103 { 4, 7, 0,0,0,0,1,1,0 },
104 { -4, 7, 0,0,0,0,1,1,1 },
105 { 5, 8, 0,0,0,0,1,0,1,0 },
106 { -5, 8, 0,0,0,0,1,0,1,1 },
107 { 6, 8, 0,0,0,0,1,0,0,0 },
108 { -6, 8, 0,0,0,0,1,0,0,1 },
109 { 7, 8, 0,0,0,0,0,1,1,0 },
110 { -7, 8, 0,0,0,0,0,1,1,1 },
111 { 8, 10, 0,0,0,0,0,1,0,1,1,0 },
112 { -8, 10, 0,0,0,0,0,1,0,1,1,1 },
113 { 9, 10, 0,0,0,0,0,1,0,1,0,0 },
114 { -9, 10, 0,0,0,0,0,1,0,1,0,1 },
115 { 10, 10, 0,0,0,0,0,1,0,0,1,0 },
116 { -10, 10, 0,0,0,0,0,1,0,0,1,1 },
117 { 11, 11, 0,0,0,0,0,1,0,0,0,1,0 },
118 { -11, 11, 0,0,0,0,0,1,0,0,0,1,1 },
119 { 12, 11, 0,0,0,0,0,1,0,0,0,0,0 },
120 { -12, 11, 0,0,0,0,0,1,0,0,0,0,1 },
121 { 13, 11, 0,0,0,0,0,0,1,1,1,1,0 },
122 { -13, 11, 0,0,0,0,0,0,1,1,1,1,1 },
123 { 14, 11, 0,0,0,0,0,0,1,1,1,0,0 },
124 { -14, 11, 0,0,0,0,0,0,1,1,1,0,1 },
125 { 15, 11, 0,0,0,0,0,0,1,1,0,1,0 },
126 { -15, 11, 0,0,0,0,0,0,1,1,0,1,1 },
127 { 16, 11, 0,0,0,0,0,0,1,1,0,0,0 },
128 { -16, 11, 0,0,0,0,0,0,1,1,0,0,1 },
129 { 0 },
132 static const struct vs_vlc_val dmvector_vlc[] = {
133 { 0, 1, 0 },
134 { 1, 2, 1,0 },
135 { -1, 2, 1,1 },
136 { 0 },
139 int h262_motion_vectors(struct bitstream *str, struct h262_seqparm *seqparm, struct h262_picparm *picparm, struct h262_macroblock *mb, int s) {
140 int mvc, mfs, dmv;
141 if (picparm->picture_structure == H262_PIC_STRUCT_FRAME) {
142 switch (mb->frame_motion_type) {
143 case H262_FRAME_MOTION_FIELD:
144 mvc = 2;
145 mfs = 1;
146 dmv = 0;
147 break;
148 case H262_FRAME_MOTION_FRAME:
149 mvc = 1;
150 mfs = 0;
151 dmv = 0;
152 break;
153 case H262_FRAME_MOTION_DUAL_PRIME:
154 mvc = 1;
155 mfs = 0;
156 dmv = 1;
157 break;
158 default:
159 abort();
161 } else {
162 switch (mb->field_motion_type) {
163 case H262_FIELD_MOTION_FIELD:
164 mvc = 1;
165 mfs = 1;
166 dmv = 0;
167 break;
168 case H262_FIELD_MOTION_16X8:
169 mvc = 2;
170 mfs = 1;
171 dmv = 0;
172 break;
173 case H262_FIELD_MOTION_DUAL_PRIME:
174 mvc = 1;
175 mfs = 0;
176 dmv = 1;
177 break;
178 default:
179 abort();
182 int r, t;
183 for (r = 0; r < 2; r++) {
184 if (r < mvc) {
185 if (mfs)
186 if (vs_u(str, &mb->motion_vertical_field_select[r][s], 1)) return 1;
187 for (t = 0; t < 2; t++) {
188 if (vs_vlc(str, &mb->motion_code[r][s][t], motion_code_vlc)) return 1;
189 if (mb->motion_code[r][s][t]) {
190 if (vs_u(str, &mb->motion_residual[r][s][t], picparm->f_code[s][t]-1)) return 1;
191 } else {
192 if (vs_infer(str, &mb->motion_residual[r][s][t], 0)) return 1;
194 if (dmv) {
195 if (vs_vlc(str, &mb->dmvector[t], dmvector_vlc)) return 1;
198 } else {
199 if (vs_infer(str, &mb->motion_code[r][s][0], 0)) return 1;
200 if (vs_infer(str, &mb->motion_code[r][s][1], 0)) return 1;
201 if (vs_infer(str, &mb->motion_residual[r][s][0], 0)) return 1;
202 if (vs_infer(str, &mb->motion_residual[r][s][1], 0)) return 1;
205 return 0;
208 int h262_infer_vectors(struct bitstream *str, struct h262_seqparm *seqparm, struct h262_picparm *picparm, struct h262_macroblock *mb, int s) {
209 if (picparm->picture_structure != H262_PIC_STRUCT_FRAME) {
210 int bottom = picparm->picture_structure == H262_PIC_STRUCT_FIELD_BOTTOM;
211 if (vs_infer(str, &mb->motion_vertical_field_select[s][0], bottom)) return 1;
212 if (vs_infer(str, &mb->motion_vertical_field_select[s][1], bottom)) return 1;
214 if (vs_infer(str, &mb->motion_code[0][s][0], 0)) return 1;
215 if (vs_infer(str, &mb->motion_code[0][s][1], 0)) return 1;
216 if (vs_infer(str, &mb->motion_code[1][s][0], 0)) return 1;
217 if (vs_infer(str, &mb->motion_code[1][s][1], 0)) return 1;
218 if (vs_infer(str, &mb->motion_residual[0][s][0], 0)) return 1;
219 if (vs_infer(str, &mb->motion_residual[0][s][1], 0)) return 1;
220 if (vs_infer(str, &mb->motion_residual[1][s][0], 0)) return 1;
221 if (vs_infer(str, &mb->motion_residual[1][s][1], 0)) return 1;
222 if (!s) {
223 if (vs_infer(str, &mb->dmvector[0], 0)) return 1;
224 if (vs_infer(str, &mb->dmvector[1], 0)) return 1;
226 return 0;
229 static const struct vs_vlc_val cbp_vlc[] = {
230 { 0x0f, 3, 1,1,1 },
231 { 0x08, 4, 1,1,0,1 },
232 { 0x04, 4, 1,1,0,0 },
233 { 0x02, 4, 1,0,1,1 },
234 { 0x01, 4, 1,0,1,0 },
235 { 0x0c, 5, 1,0,0,1,1 },
236 { 0x03, 5, 1,0,0,1,0 },
237 { 0x0a, 5, 1,0,0,0,1 },
238 { 0x05, 5, 1,0,0,0,0 },
239 { 0x0e, 5, 0,1,1,1,1 },
240 { 0x0d, 5, 0,1,1,1,0 },
241 { 0x0b, 5, 0,1,1,0,1 },
242 { 0x07, 5, 0,1,1,0,0 },
243 { 0x20, 5, 0,1,0,1,1 },
244 { 0x2f, 5, 0,1,0,1,0 },
245 { 0x10, 5, 0,1,0,0,1 },
246 { 0x1f, 5, 0,1,0,0,0 },
247 { 0x06, 6, 0,0,1,1,1,1 },
248 { 0x09, 6, 0,0,1,1,1,0 },
249 { 0x30, 6, 0,0,1,1,0,1 },
250 { 0x3f, 6, 0,0,1,1,0,0 },
251 { 0x28, 7, 0,0,1,0,1,1,1 },
252 { 0x24, 7, 0,0,1,0,1,1,0 },
253 { 0x22, 7, 0,0,1,0,1,0,1 },
254 { 0x21, 7, 0,0,1,0,1,0,0 },
255 { 0x18, 7, 0,0,1,0,0,1,1 },
256 { 0x14, 7, 0,0,1,0,0,1,0 },
257 { 0x12, 7, 0,0,1,0,0,0,1 },
258 { 0x11, 7, 0,0,1,0,0,0,0 },
259 { 0x38, 8, 0,0,0,1,1,1,1,1 },
260 { 0x34, 8, 0,0,0,1,1,1,1,0 },
261 { 0x32, 8, 0,0,0,1,1,1,0,1 },
262 { 0x31, 8, 0,0,0,1,1,1,0,0 },
263 { 0x2c, 8, 0,0,0,1,1,0,1,1 },
264 { 0x23, 8, 0,0,0,1,1,0,1,0 },
265 { 0x2a, 8, 0,0,0,1,1,0,0,1 },
266 { 0x25, 8, 0,0,0,1,1,0,0,0 },
267 { 0x1c, 8, 0,0,0,1,0,1,1,1 },
268 { 0x13, 8, 0,0,0,1,0,1,1,0 },
269 { 0x1a, 8, 0,0,0,1,0,1,0,1 },
270 { 0x15, 8, 0,0,0,1,0,1,0,0 },
271 { 0x3c, 8, 0,0,0,1,0,0,1,1 },
272 { 0x33, 8, 0,0,0,1,0,0,1,0 },
273 { 0x3a, 8, 0,0,0,1,0,0,0,1 },
274 { 0x35, 8, 0,0,0,1,0,0,0,0 },
275 { 0x26, 8, 0,0,0,0,1,1,1,1 },
276 { 0x29, 8, 0,0,0,0,1,1,1,0 },
277 { 0x16, 8, 0,0,0,0,1,1,0,1 },
278 { 0x19, 8, 0,0,0,0,1,1,0,0 },
279 { 0x2e, 8, 0,0,0,0,1,0,1,1 },
280 { 0x2d, 8, 0,0,0,0,1,0,1,0 },
281 { 0x2b, 8, 0,0,0,0,1,0,0,1 },
282 { 0x27, 8, 0,0,0,0,1,0,0,0 },
283 { 0x1e, 8, 0,0,0,0,0,1,1,1 },
284 { 0x1d, 8, 0,0,0,0,0,1,1,0 },
285 { 0x1b, 8, 0,0,0,0,0,1,0,1 },
286 { 0x17, 8, 0,0,0,0,0,1,0,0 },
287 { 0x3e, 9, 0,0,0,0,0,0,1,1,1 },
288 { 0x3d, 9, 0,0,0,0,0,0,1,1,0 },
289 { 0x3b, 9, 0,0,0,0,0,0,1,0,1 },
290 { 0x37, 9, 0,0,0,0,0,0,1,0,0 },
291 { 0x36, 9, 0,0,0,0,0,0,0,1,1 },
292 { 0x39, 9, 0,0,0,0,0,0,0,1,0 },
293 { 0x00, 9, 0,0,0,0,0,0,0,0,1 },
294 { 0 },
297 int h262_coded_block_pattern(struct bitstream *str, int chroma_format, uint32_t *cbp) {
298 uint32_t cbplo = *cbp & 0x3f;
299 int cbphs;
300 int i;
301 uint32_t val;
302 switch (chroma_format) {
303 case 1:
304 cbphs = 0;
305 break;
306 case 2:
307 cbphs = 2;
308 break;
309 case 3:
310 cbphs = 6;
311 break;
312 default:
313 fprintf(stderr, "Invalid chroma format\n");
314 return 1;
316 if (vs_vlc(str, &cbplo, cbp_vlc)) return 1;
317 val = cbplo;
318 for (i = 0; i < cbphs; i++) {
319 uint32_t tmp = *cbp >> i & 1;
320 if (vs_u(str, &tmp, 1)) return 1;
321 val |= tmp << i;
323 if (str->dir == VS_DECODE)
324 *cbp = val;
325 return 0;
328 static const struct vs_vlc_val dcs_luma_vlc[] = {
329 { 0, 3, 1,0,0 },
330 { 1, 2, 0,0 },
331 { 2, 2, 0,1 },
332 { 3, 3, 1,0,1 },
333 { 4, 3, 1,1,0 },
334 { 5, 4, 1,1,1,0 },
335 { 6, 5, 1,1,1,1,0 },
336 { 7, 6, 1,1,1,1,1,0 },
337 { 8, 7, 1,1,1,1,1,1,0 },
338 { 9, 8, 1,1,1,1,1,1,1,0 },
339 { 10, 9, 1,1,1,1,1,1,1,1,0 },
340 { 11, 9, 1,1,1,1,1,1,1,1,1 },
341 { 0 },
344 static const struct vs_vlc_val dcs_chroma_vlc[] = {
345 { 0, 2, 0,0 },
346 { 1, 2, 0,1 },
347 { 2, 2, 1,0 },
348 { 3, 3, 1,1,0 },
349 { 4, 4, 1,1,1,0 },
350 { 5, 5, 1,1,1,1,0 },
351 { 6, 6, 1,1,1,1,1,0 },
352 { 7, 7, 1,1,1,1,1,1,0 },
353 { 8, 8, 1,1,1,1,1,1,1,0 },
354 { 9, 9, 1,1,1,1,1,1,1,1,0 },
355 { 10, 10, 1,1,1,1,1,1,1,1,1,0 },
356 { 11, 10, 1,1,1,1,1,1,1,1,1,1 },
357 { 0 },
360 static const struct vs_vlc_val block_vlc[] = {
361 { 0x00000, 2, 1,0 },
362 { 0x00001, 2, 1,1 },
363 { 0x00002, 4, 0,1,0,0 },
364 { 0x00003, 5, 0,0,1,0,1 },
365 { 0x00004, 7, 0,0,0,0,1,1,0 },
366 { 0x00005, 8, 0,0,1,0,0,1,1,0 },
367 { 0x00006, 8, 0,0,1,0,0,0,0,1 },
368 { 0x00007, 10, 0,0,0,0,0,0,1,0,1,0 },
369 { 0x00008, 12, 0,0,0,0,0,0,0,1,1,1,0,1 },
370 { 0x00009, 12, 0,0,0,0,0,0,0,1,1,0,0,0 },
371 { 0x0000a, 12, 0,0,0,0,0,0,0,1,0,0,1,1 },
372 { 0x0000b, 12, 0,0,0,0,0,0,0,1,0,0,0,0 },
373 { 0x0000c, 13, 0,0,0,0,0,0,0,0,1,1,0,1,0 },
374 { 0x0000d, 13, 0,0,0,0,0,0,0,0,1,1,0,0,1 },
375 { 0x0000e, 13, 0,0,0,0,0,0,0,0,1,1,0,0,0 },
376 { 0x0000f, 13, 0,0,0,0,0,0,0,0,1,0,1,1,1 },
377 { 0x00010, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
378 { 0x00011, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
379 { 0x00012, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
380 { 0x00013, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
381 { 0x00014, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
382 { 0x00015, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
383 { 0x00016, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
384 { 0x00017, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
385 { 0x00018, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
386 { 0x00019, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
387 { 0x0001a, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
388 { 0x0001b, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
389 { 0x0001c, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
390 { 0x0001d, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
391 { 0x0001e, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
392 { 0x0001f, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
393 { 0x00020, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
394 { 0x00021, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
395 { 0x00022, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
396 { 0x00023, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
397 { 0x00024, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
398 { 0x00025, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
399 { 0x00026, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
400 { 0x00027, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
401 { 0x00028, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
402 { 0x01001, 3, 0,1,1 },
403 { 0x01002, 6, 0,0,0,1,1,0 },
404 { 0x01003, 8, 0,0,1,0,0,1,0,1 },
405 { 0x01004, 10, 0,0,0,0,0,0,1,1,0,0 },
406 { 0x01005, 12, 0,0,0,0,0,0,0,1,1,0,1,1 },
407 { 0x01006, 13, 0,0,0,0,0,0,0,0,1,0,1,1,0 },
408 { 0x01007, 13, 0,0,0,0,0,0,0,0,1,0,1,0,1 },
409 { 0x01008, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
410 { 0x01009, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
411 { 0x0100a, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
412 { 0x0100b, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
413 { 0x0100c, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
414 { 0x0100d, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
415 { 0x0100e, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
416 { 0x0100f, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
417 { 0x01010, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
418 { 0x01011, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
419 { 0x01012, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
420 { 0x02001, 4, 0,1,0,1 },
421 { 0x02002, 7, 0,0,0,0,1,0,0 },
422 { 0x02003, 10, 0,0,0,0,0,0,1,0,1,1 },
423 { 0x02004, 12, 0,0,0,0,0,0,0,1,0,1,0,0 },
424 { 0x02005, 13, 0,0,0,0,0,0,0,0,1,0,1,0,0 },
425 { 0x03001, 5, 0,0,1,1,1 },
426 { 0x03002, 8, 0,0,1,0,0,1,0,0 },
427 { 0x03003, 12, 0,0,0,0,0,0,0,1,1,1,0,0 },
428 { 0x03004, 13, 0,0,0,0,0,0,0,0,1,0,0,1,1 },
429 { 0x04001, 5, 0,0,1,1,0 },
430 { 0x04002, 10, 0,0,0,0,0,0,1,1,1,1 },
431 { 0x04003, 12, 0,0,0,0,0,0,0,1,0,0,1,0 },
432 { 0x05001, 6, 0,0,0,1,1,1 },
433 { 0x05002, 10, 0,0,0,0,0,0,1,0,0,1 },
434 { 0x05003, 13, 0,0,0,0,0,0,0,0,1,0,0,1,0 },
435 { 0x06001, 6, 0,0,0,1,0,1 },
436 { 0x06002, 12, 0,0,0,0,0,0,0,1,1,1,1,0 },
437 { 0x06003, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
438 { 0x07001, 6, 0,0,0,1,0,0 },
439 { 0x07002, 12, 0,0,0,0,0,0,0,1,0,1,0,1 },
440 { 0x08001, 7, 0,0,0,0,1,1,1 },
441 { 0x08002, 12, 0,0,0,0,0,0,0,1,0,0,0,1 },
442 { 0x09001, 7, 0,0,0,0,1,0,1 },
443 { 0x09002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,1 },
444 { 0x0a001, 8, 0,0,1,0,0,1,1,1 },
445 { 0x0a002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,0 },
446 { 0x0b001, 8, 0,0,1,0,0,0,1,1 },
447 { 0x0b002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
448 { 0x0c001, 8, 0,0,1,0,0,0,1,0 },
449 { 0x0c002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
450 { 0x0d001, 8, 0,0,1,0,0,0,0,0 },
451 { 0x0d002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
452 { 0x0e001, 10, 0,0,0,0,0,0,1,1,1,0 },
453 { 0x0e002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
454 { 0x0f001, 10, 0,0,0,0,0,0,1,1,0,1 },
455 { 0x0f002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
456 { 0x10001, 10, 0,0,0,0,0,0,1,0,0,0 },
457 { 0x10002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
458 { 0x11001, 12, 0,0,0,0,0,0,0,1,1,1,1,1 },
459 { 0x12001, 12, 0,0,0,0,0,0,0,1,1,0,1,0 },
460 { 0x13001, 12, 0,0,0,0,0,0,0,1,1,0,0,1 },
461 { 0x14001, 12, 0,0,0,0,0,0,0,1,0,1,1,1 },
462 { 0x15001, 12, 0,0,0,0,0,0,0,1,0,1,1,0 },
463 { 0x16001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,1 },
464 { 0x17001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,0 },
465 { 0x18001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,1 },
466 { 0x19001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,0 },
467 { 0x1a001, 13, 0,0,0,0,0,0,0,0,1,1,0,1,1 },
468 { 0x1b001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
469 { 0x1c001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
470 { 0x1d001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
471 { 0x1e001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
472 { 0x1f001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
473 { 0xfffff, 6, 0,0,0,0,0,1 },
474 { 0 },
477 static const struct vs_vlc_val block_0_vlc[] = {
478 { 0x00001, 1, 1 },
479 { 0x00002, 4, 0,1,0,0 },
480 { 0x00003, 5, 0,0,1,0,1 },
481 { 0x00004, 7, 0,0,0,0,1,1,0 },
482 { 0x00005, 8, 0,0,1,0,0,1,1,0 },
483 { 0x00006, 8, 0,0,1,0,0,0,0,1 },
484 { 0x00007, 10, 0,0,0,0,0,0,1,0,1,0 },
485 { 0x00008, 12, 0,0,0,0,0,0,0,1,1,1,0,1 },
486 { 0x00009, 12, 0,0,0,0,0,0,0,1,1,0,0,0 },
487 { 0x0000a, 12, 0,0,0,0,0,0,0,1,0,0,1,1 },
488 { 0x0000b, 12, 0,0,0,0,0,0,0,1,0,0,0,0 },
489 { 0x0000c, 13, 0,0,0,0,0,0,0,0,1,1,0,1,0 },
490 { 0x0000d, 13, 0,0,0,0,0,0,0,0,1,1,0,0,1 },
491 { 0x0000e, 13, 0,0,0,0,0,0,0,0,1,1,0,0,0 },
492 { 0x0000f, 13, 0,0,0,0,0,0,0,0,1,0,1,1,1 },
493 { 0x00010, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
494 { 0x00011, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
495 { 0x00012, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
496 { 0x00013, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
497 { 0x00014, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
498 { 0x00015, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
499 { 0x00016, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
500 { 0x00017, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
501 { 0x00018, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
502 { 0x00019, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
503 { 0x0001a, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
504 { 0x0001b, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
505 { 0x0001c, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
506 { 0x0001d, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
507 { 0x0001e, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
508 { 0x0001f, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
509 { 0x00020, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
510 { 0x00021, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
511 { 0x00022, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
512 { 0x00023, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
513 { 0x00024, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
514 { 0x00025, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
515 { 0x00026, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
516 { 0x00027, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
517 { 0x00028, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
518 { 0x01001, 3, 0,1,1 },
519 { 0x01002, 6, 0,0,0,1,1,0 },
520 { 0x01003, 8, 0,0,1,0,0,1,0,1 },
521 { 0x01004, 10, 0,0,0,0,0,0,1,1,0,0 },
522 { 0x01005, 12, 0,0,0,0,0,0,0,1,1,0,1,1 },
523 { 0x01006, 13, 0,0,0,0,0,0,0,0,1,0,1,1,0 },
524 { 0x01007, 13, 0,0,0,0,0,0,0,0,1,0,1,0,1 },
525 { 0x01008, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
526 { 0x01009, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
527 { 0x0100a, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
528 { 0x0100b, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
529 { 0x0100c, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
530 { 0x0100d, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
531 { 0x0100e, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
532 { 0x0100f, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
533 { 0x01010, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
534 { 0x01011, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
535 { 0x01012, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
536 { 0x02001, 4, 0,1,0,1 },
537 { 0x02002, 7, 0,0,0,0,1,0,0 },
538 { 0x02003, 10, 0,0,0,0,0,0,1,0,1,1 },
539 { 0x02004, 12, 0,0,0,0,0,0,0,1,0,1,0,0 },
540 { 0x02005, 13, 0,0,0,0,0,0,0,0,1,0,1,0,0 },
541 { 0x03001, 5, 0,0,1,1,1 },
542 { 0x03002, 8, 0,0,1,0,0,1,0,0 },
543 { 0x03003, 12, 0,0,0,0,0,0,0,1,1,1,0,0 },
544 { 0x03004, 13, 0,0,0,0,0,0,0,0,1,0,0,1,1 },
545 { 0x04001, 5, 0,0,1,1,0 },
546 { 0x04002, 10, 0,0,0,0,0,0,1,1,1,1 },
547 { 0x04003, 12, 0,0,0,0,0,0,0,1,0,0,1,0 },
548 { 0x05001, 6, 0,0,0,1,1,1 },
549 { 0x05002, 10, 0,0,0,0,0,0,1,0,0,1 },
550 { 0x05003, 13, 0,0,0,0,0,0,0,0,1,0,0,1,0 },
551 { 0x06001, 6, 0,0,0,1,0,1 },
552 { 0x06002, 12, 0,0,0,0,0,0,0,1,1,1,1,0 },
553 { 0x06003, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
554 { 0x07001, 6, 0,0,0,1,0,0 },
555 { 0x07002, 12, 0,0,0,0,0,0,0,1,0,1,0,1 },
556 { 0x08001, 7, 0,0,0,0,1,1,1 },
557 { 0x08002, 12, 0,0,0,0,0,0,0,1,0,0,0,1 },
558 { 0x09001, 7, 0,0,0,0,1,0,1 },
559 { 0x09002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,1 },
560 { 0x0a001, 8, 0,0,1,0,0,1,1,1 },
561 { 0x0a002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,0 },
562 { 0x0b001, 8, 0,0,1,0,0,0,1,1 },
563 { 0x0b002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
564 { 0x0c001, 8, 0,0,1,0,0,0,1,0 },
565 { 0x0c002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
566 { 0x0d001, 8, 0,0,1,0,0,0,0,0 },
567 { 0x0d002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
568 { 0x0e001, 10, 0,0,0,0,0,0,1,1,1,0 },
569 { 0x0e002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
570 { 0x0f001, 10, 0,0,0,0,0,0,1,1,0,1 },
571 { 0x0f002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
572 { 0x10001, 10, 0,0,0,0,0,0,1,0,0,0 },
573 { 0x10002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
574 { 0x11001, 12, 0,0,0,0,0,0,0,1,1,1,1,1 },
575 { 0x12001, 12, 0,0,0,0,0,0,0,1,1,0,1,0 },
576 { 0x13001, 12, 0,0,0,0,0,0,0,1,1,0,0,1 },
577 { 0x14001, 12, 0,0,0,0,0,0,0,1,0,1,1,1 },
578 { 0x15001, 12, 0,0,0,0,0,0,0,1,0,1,1,0 },
579 { 0x16001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,1 },
580 { 0x17001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,0 },
581 { 0x18001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,1 },
582 { 0x19001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,0 },
583 { 0x1a001, 13, 0,0,0,0,0,0,0,0,1,1,0,1,1 },
584 { 0x1b001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
585 { 0x1c001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
586 { 0x1d001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
587 { 0x1e001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
588 { 0x1f001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
589 { 0xfffff, 6, 0,0,0,0,0,1 },
590 { 0 },
593 static const struct vs_vlc_val block_intra_vlc[] = {
594 { 0x00000, 4, 0,1,1,0 },
595 { 0x00001, 2, 1,0 },
596 { 0x00002, 3, 1,1,0 },
597 { 0x00003, 4, 0,1,1,1 },
598 { 0x00004, 5, 1,1,1,0,0 },
599 { 0x00005, 5, 1,1,1,0,1 },
600 { 0x00006, 6, 0,0,0,1,0,1 },
601 { 0x00007, 6, 0,0,0,1,0,0 },
602 { 0x00008, 7, 1,1,1,1,0,1,1 },
603 { 0x00009, 7, 1,1,1,1,1,0,0 },
604 { 0x0000a, 8, 0,0,1,0,0,0,1,1 },
605 { 0x0000b, 8, 0,0,1,0,0,0,1,0 },
606 { 0x0000c, 8, 1,1,1,1,1,0,1,0 },
607 { 0x0000d, 8, 1,1,1,1,1,0,1,1 },
608 { 0x0000e, 8, 1,1,1,1,1,1,1,0 },
609 { 0x0000f, 8, 1,1,1,1,1,1,1,1 },
610 { 0x00010, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
611 { 0x00011, 14, 0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
612 { 0x00012, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
613 { 0x00013, 14, 0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
614 { 0x00014, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
615 { 0x00015, 14, 0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
616 { 0x00016, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
617 { 0x00017, 14, 0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
618 { 0x00018, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
619 { 0x00019, 14, 0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
620 { 0x0001a, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
621 { 0x0001b, 14, 0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
622 { 0x0001c, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
623 { 0x0001d, 14, 0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
624 { 0x0001e, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
625 { 0x0001f, 14, 0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
626 { 0x00020, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
627 { 0x00021, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
628 { 0x00022, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
629 { 0x00023, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
630 { 0x00024, 15, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
631 { 0x00025, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
632 { 0x00026, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
633 { 0x00027, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
634 { 0x00028, 15, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
635 { 0x01001, 3, 0,1,0 },
636 { 0x01002, 5, 0,0,1,1,0 },
637 { 0x01003, 7, 1,1,1,1,0,0,1 },
638 { 0x01004, 8, 0,0,1,0,0,1,1,1 },
639 { 0x01005, 8, 0,0,1,0,0,0,0,0 },
640 { 0x01006, 13, 0,0,0,0,0,0,0,0,1,0,1,1,0 },
641 { 0x01007, 13, 0,0,0,0,0,0,0,0,1,0,1,0,1 },
642 { 0x01008, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
643 { 0x01009, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
644 { 0x0100a, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
645 { 0x0100b, 15, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
646 { 0x0100c, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
647 { 0x0100d, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
648 { 0x0100e, 15, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
649 { 0x0100f, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1 },
650 { 0x01010, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 },
651 { 0x01011, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
652 { 0x01012, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
653 { 0x02001, 5, 0,0,1,0,1 },
654 { 0x02002, 7, 0,0,0,0,1,1,1 },
655 { 0x02003, 8, 1,1,1,1,1,1,0,0 },
656 { 0x02004, 10, 0,0,0,0,0,0,1,1,0,0 },
657 { 0x02005, 13, 0,0,0,0,0,0,0,0,1,0,1,0,0 },
658 { 0x03001, 5, 0,0,1,1,1 },
659 { 0x03002, 8, 0,0,1,0,0,1,1,0 },
660 { 0x03003, 12, 0,0,0,0,0,0,0,1,1,1,0,0 },
661 { 0x03004, 13, 0,0,0,0,0,0,0,0,1,0,0,1,1 },
662 { 0x04001, 6, 0,0,0,1,1,0 },
663 { 0x04002, 8, 1,1,1,1,1,1,0,1 },
664 { 0x04003, 12, 0,0,0,0,0,0,0,1,0,0,1,0 },
665 { 0x05001, 6, 0,0,0,1,1,1 },
666 { 0x05002, 9, 0,0,0,0,0,0,1,0,0 },
667 { 0x05003, 13, 0,0,0,0,0,0,0,0,1,0,0,1,0 },
668 { 0x06001, 7, 0,0,0,0,1,1,0 },
669 { 0x06002, 12, 0,0,0,0,0,0,0,1,1,1,1,0 },
670 { 0x06003, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 },
671 { 0x07001, 7, 0,0,0,0,1,0,0 },
672 { 0x07002, 12, 0,0,0,0,0,0,0,1,0,1,0,1 },
673 { 0x08001, 7, 0,0,0,0,1,0,1 },
674 { 0x08002, 12, 0,0,0,0,0,0,0,1,0,0,0,1 },
675 { 0x09001, 7, 1,1,1,1,0,0,0 },
676 { 0x09002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,1 },
677 { 0x0a001, 7, 1,1,1,1,0,1,0 },
678 { 0x0a002, 13, 0,0,0,0,0,0,0,0,1,0,0,0,0 },
679 { 0x0b001, 8, 0,0,1,0,0,0,0,1 },
680 { 0x0b002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0 },
681 { 0x0c001, 8, 0,0,1,0,0,1,0,1 },
682 { 0x0c002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1 },
683 { 0x0d001, 8, 0,0,1,0,0,1,0,0 },
684 { 0x0d002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 },
685 { 0x0e001, 9, 0,0,0,0,0,0,1,0,1 },
686 { 0x0e002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1 },
687 { 0x0f001, 9, 0,0,0,0,0,0,1,1,1 },
688 { 0x0f002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0 },
689 { 0x10001, 10, 0,0,0,0,0,0,1,1,0,1 },
690 { 0x10002, 16, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1 },
691 { 0x11001, 12, 0,0,0,0,0,0,0,1,1,1,1,1 },
692 { 0x12001, 12, 0,0,0,0,0,0,0,1,1,0,1,0 },
693 { 0x13001, 12, 0,0,0,0,0,0,0,1,1,0,0,1 },
694 { 0x14001, 12, 0,0,0,0,0,0,0,1,0,1,1,1 },
695 { 0x15001, 12, 0,0,0,0,0,0,0,1,0,1,1,0 },
696 { 0x16001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,1 },
697 { 0x17001, 13, 0,0,0,0,0,0,0,0,1,1,1,1,0 },
698 { 0x18001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,1 },
699 { 0x19001, 13, 0,0,0,0,0,0,0,0,1,1,1,0,0 },
700 { 0x1a001, 13, 0,0,0,0,0,0,0,0,1,1,0,1,1 },
701 { 0x1b001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 },
702 { 0x1c001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0 },
703 { 0x1d001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1 },
704 { 0x1e001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0 },
705 { 0x1f001, 16, 0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1 },
706 { 0xfffff, 6, 0,0,0,0,0,1 },
707 { 0 },
710 int h262_block(struct bitstream *str, struct h262_seqparm *seqparm, struct h262_picparm *picparm, int32_t *block, int intra, int chroma) {
711 int i = 0;
712 if (intra) {
713 uint32_t dcs;
714 uint32_t dcd;
715 if (str->dir == VS_ENCODE) {
716 dcs = 0;
717 while (abs(block[0]) >= (1 << dcs))
718 dcs++;
719 if (block[0] >= 0) {
720 dcd = block[0];
721 } else {
722 dcd = block[0] + (1 << dcs) - 1;
725 if (vs_vlc(str, &dcs, chroma?dcs_chroma_vlc:dcs_luma_vlc)) return 1;
726 if (vs_u(str, &dcd, dcs)) return 1;
727 if (str->dir == VS_DECODE) {
728 if (!dcs) {
729 block[0] = 0;
730 } else {
731 if (dcd >= (1 << (dcs - 1)))
732 block[0] = dcd;
733 else
734 block[0] = dcd - ((1 << dcs) - 1);
737 i = 1;
739 if (picparm->picture_coding_type == H262_PIC_TYPE_D)
740 return 0;
741 while (1) {
742 uint32_t tmp, run, el, eb1, eb2, sign;
743 int32_t coeff;
744 const struct vs_vlc_val *tab;
745 if (intra && picparm->intra_vlc_format)
746 tab = block_intra_vlc;
747 else if (i == 0)
748 tab = block_0_vlc;
749 else
750 tab = block_vlc;
751 if (str->dir == VS_ENCODE) {
752 run = 0;
753 while (i < 64 && !block[i])
754 i++, run++;
755 if (i == 64) {
756 tmp = 0;
757 } else {
758 coeff = block[i];
759 if (coeff <= -0x800 || coeff >= 0x800) {
760 fprintf(stderr, "Coeff too large\n");
761 return 1;
763 el = coeff & 0xfff;
764 tmp = abs(coeff) | run << 12;
765 sign = coeff < 0;
766 int j;
767 for (j = 0; tab[j].blen; j++) {
768 if (tab[j].val == tmp) {
769 break;
772 if (tab[j].val != tmp)
773 tmp = 0xfffff;
774 if (tmp == 0xfffff && !seqparm->is_ext) {
775 /* make MPEG1 escape codes */
776 if (abs(coeff) < 127) {
777 eb1 = coeff & 0xff;
778 } else if (abs(coeff) < 255) {
779 if (coeff < 0)
780 eb1 = 0x80;
781 else
782 eb1 = 0;
783 eb2 = coeff & 0xff;
784 } else {
785 fprintf(stderr, "Coeff too large\n");
786 return 1;
789 i++;
792 if (vs_vlc(str, &tmp, tab)) return 1;
793 if (tmp == 0) {
794 /* end of block */
795 if (str->dir == VS_DECODE) {
796 while (i < 64)
797 block[i++] = 0;
799 return 0;
800 } else if (tmp == 0xfffff) {
801 if (vs_u(str, &run, 6)) return 1;
802 if (seqparm->is_ext) {
803 /* MPEG2 escape */
804 if (vs_u(str, &el, 12)) return 1;
805 if (el & 0x800)
806 coeff = el | -0x1000;
807 else
808 coeff = el;
809 if (!(el & 0x7ff)) {
810 fprintf(stderr, "Invalid escape code\n");
811 return 1;
813 } else {
814 /* MPEG1 escape */
815 if (vs_u(str, &eb1, 8)) return 1;
816 if (eb1 == 0) {
817 if (vs_u(str, &eb2, 8)) return 1;
818 if (eb2 < 0x80) {
819 fprintf(stderr, "Invalid escape code\n");
820 return 1;
822 coeff = eb2;
823 } else if (eb1 == 0x80) {
824 if (vs_u(str, &eb2, 8)) return 1;
825 if (eb2 == 0 || eb2 > 0x80) {
826 fprintf(stderr, "Invalid escape code\n");
827 return 1;
829 coeff = eb2 | -0x100;
830 } else {
831 coeff = eb1;
832 if (coeff > 0x80)
833 coeff |= -0x100;
836 } else {
837 /* normal coefficient */
838 if (vs_u(str, &sign, 1)) return 1;
839 run = tmp >> 12;
840 if (sign)
841 coeff = -(tmp & 0xfff);
842 else
843 coeff = tmp & 0xfff;
845 if (str->dir == VS_DECODE) {
846 if (i >= 64) {
847 fprintf(stderr, "block overflow\n");
848 return 1;
850 while (run--) {
851 if (i >= 64) {
852 fprintf(stderr, "block overflow\n");
853 return 1;
855 block[i++] = 0;
857 block[i++] = coeff;
862 static const struct vs_vlc_val mbf_i_vlc[] = {
863 { 0x10, 1, 1 }, /* INTRA */
864 { 0x11, 2, 0,1 }, /* QUANT INTRA */
865 { 0 },
868 static const struct vs_vlc_val mbf_p_vlc[] = {
869 { 0x0a, 1, 1 }, /* FWD PATTERN */
870 { 0x08, 2, 0,1 }, /* PATTERN */
871 { 0x02, 3, 0,0,1 }, /* FWD */
872 { 0x10, 5, 0,0,0,1,1 }, /* INTRA */
873 { 0x0b, 5, 0,0,0,1,0 }, /* QUANT FWD PATTERN */
874 { 0x09, 5, 0,0,0,0,1 }, /* QUANT PATTERN */
875 { 0x11, 6, 0,0,0,0,0,1 }, /* QUANT INTRA */
876 { 0 },
879 static const struct vs_vlc_val mbf_b_vlc[] = {
880 { 0x0e, 2, 1,1 }, /* FWD BWD PATTERN */
881 { 0x06, 2, 1,0 }, /* FWD BWD */
882 { 0x0c, 3, 0,1,1 }, /* BWD PATTERN */
883 { 0x04, 3, 0,1,0 }, /* BWD */
884 { 0x0a, 4, 0,0,1,1 }, /* FWD PATTERN */
885 { 0x02, 4, 0,0,1,0 }, /* FWD */
886 { 0x10, 5, 0,0,0,1,1 }, /* INTRA */
887 { 0x0f, 5, 0,0,0,1,0 }, /* QUANT FWD BWD PATTERN */
888 { 0x0b, 6, 0,0,0,0,1,1 }, /* QUANT FWD PATTERN */
889 { 0x0d, 6, 0,0,0,0,1,0 }, /* QUANT BWD PATTERN */
890 { 0x11, 6, 0,0,0,0,0,1 }, /* QUANT INTRA */
891 { 0 },
894 static const struct vs_vlc_val mbf_d_vlc[] = {
895 { 0x10, 1, 1 }, /* INTRA */
896 { 0 },
899 int h262_macroblock(struct bitstream *str, struct h262_seqparm *seqparm, struct h262_picparm *picparm, struct h262_macroblock *mb, uint32_t *qsc) {
900 uint32_t mb_flags = mb->macroblock_quant
901 | mb->macroblock_motion_forward << 1
902 | mb->macroblock_motion_backward << 2
903 | mb->macroblock_pattern << 3
904 | mb->macroblock_intra << 4;
905 switch (picparm->picture_coding_type) {
906 case H262_PIC_TYPE_I:
907 if (vs_vlc(str, &mb_flags, mbf_i_vlc)) return 1;
908 break;
909 case H262_PIC_TYPE_P:
910 if (vs_vlc(str, &mb_flags, mbf_p_vlc)) return 1;
911 break;
912 case H262_PIC_TYPE_B:
913 if (vs_vlc(str, &mb_flags, mbf_b_vlc)) return 1;
914 break;
915 case H262_PIC_TYPE_D:
916 if (vs_vlc(str, &mb_flags, mbf_d_vlc)) return 1;
917 break;
918 default:
919 fprintf(stderr, "Invalid picture type\n");
920 return 1;
922 if (str->dir == VS_DECODE) {
923 mb->macroblock_skipped = 0;
924 mb->macroblock_quant = mb_flags >> 0 & 1;
925 mb->macroblock_motion_forward = mb_flags >> 1 & 1;
926 mb->macroblock_motion_backward = mb_flags >> 2 & 1;
927 mb->macroblock_pattern = mb_flags >> 3 & 1;
928 mb->macroblock_intra = mb_flags >> 4 & 1;
930 if (mb->macroblock_motion_forward || mb->macroblock_motion_backward) {
931 if (picparm->picture_structure == H262_PIC_STRUCT_FRAME) {
932 if (picparm->frame_pred_frame_dct) {
933 if (vs_infer(str, &mb->frame_motion_type, H262_FRAME_MOTION_FRAME)) return 1;
934 } else {
935 if (vs_u(str, &mb->frame_motion_type, 2)) return 1;
936 if (!mb->frame_motion_type) {
937 fprintf(stderr, "Invalid frame_motion_type\n");
938 return 1;
941 } else {
942 if (vs_u(str, &mb->field_motion_type, 2)) return 1;
943 if (!mb->field_motion_type) {
944 fprintf(stderr, "Invalid field_motion_type\n");
945 return 1;
948 } else {
949 if (picparm->picture_structure == H262_PIC_STRUCT_FRAME) {
950 if (vs_infer(str, &mb->frame_motion_type, H262_FRAME_MOTION_FRAME)) return 1;
951 } else {
952 if (vs_infer(str, &mb->field_motion_type, H262_FIELD_MOTION_FIELD)) return 1;
955 if (picparm->picture_structure == H262_PIC_STRUCT_FRAME && !picparm->frame_pred_frame_dct && (mb->macroblock_intra || mb->macroblock_pattern)) {
956 if (vs_u(str, &mb->dct_type, 1)) return 1;
957 } else {
958 if (vs_infer(str, &mb->dct_type, 0)) return 1;
960 if (mb->macroblock_quant) {
961 if (vs_u(str, &mb->quantiser_scale_code, 5)) return 1;
962 } else {
963 if (vs_infer(str, &mb->quantiser_scale_code, *qsc)) return 1;
965 *qsc = mb->quantiser_scale_code;
966 if (mb->macroblock_motion_forward || (mb->macroblock_intra && picparm->concealment_motion_vectors)) {
967 if (h262_motion_vectors(str, seqparm, picparm, mb, 0)) return 1;
968 } else {
969 if (h262_infer_vectors(str, seqparm, picparm, mb, 0)) return 1;
971 if (mb->macroblock_motion_backward) {
972 if (h262_motion_vectors(str, seqparm, picparm, mb, 1)) return 1;
973 } else {
974 if (h262_infer_vectors(str, seqparm, picparm, mb, 1)) return 1;
976 if (mb->macroblock_intra && picparm->concealment_motion_vectors)
977 if (vs_mark(str, 1, 1)) return 1;
978 static const int block_count[4] = { 4, 6, 8, 12 };
979 if (mb->macroblock_intra) {
980 if (vs_infer(str, &mb->coded_block_pattern, (1 << block_count[seqparm->chroma_format]) - 1)) return 1;
981 } else if (mb->macroblock_pattern) {
982 if (h262_coded_block_pattern(str, seqparm->chroma_format, &mb->coded_block_pattern)) return 1;
983 } else {
984 if (vs_infer(str, &mb->coded_block_pattern, 0)) return 1;
986 int i;
987 for (i = 0; i < block_count[seqparm->chroma_format]; i++)
988 if (mb->coded_block_pattern & 1 << i) {
989 if (h262_block(str, seqparm, picparm, mb->block[i], mb->macroblock_intra, i >= 4)) return 1;
991 if (picparm->picture_coding_type == H262_PIC_TYPE_D)
992 if (vs_mark(str, 1, 1)) return 1;
993 return 0;
996 int h262_slice(struct bitstream *str, struct h262_seqparm *seqparm, struct h262_picparm *picparm, struct h262_slice *slice) {
997 if (vs_u(str, &slice->quantiser_scale_code, 5))
998 return 1;
999 if (vs_u(str, &slice->intra_slice_flag, 1)) return 1;
1000 if (slice->intra_slice_flag) {
1001 if (vs_u(str, &slice->intra_slice, 1)) return 1;
1002 uint32_t tmp = 0;
1003 if (vs_u(str, &tmp, 8)) return 1;
1004 while(tmp & 1) {
1005 if (vs_u(str, &tmp, 9)) return 1;
1008 uint32_t tmp = slice->first_mb_in_slice % picparm->pic_width_in_mbs;
1009 if (h262_mb_addr_inc(str, &tmp)) return 1;
1010 if (tmp >= picparm->pic_width_in_mbs) {
1011 fprintf(stderr, "Initial mb_addr_inc too large\n");
1012 return 1;
1014 slice->first_mb_in_slice = slice->slice_vertical_position * picparm->pic_width_in_mbs + tmp;
1015 uint32_t qsc = slice->quantiser_scale_code;
1016 uint32_t curr_mb_addr = slice->first_mb_in_slice;
1017 while (1) {
1018 if (h262_macroblock(str, seqparm, picparm, &slice->mbs[curr_mb_addr], &qsc)) return 1;
1019 if (str->dir == VS_DECODE) {
1020 slice->last_mb_in_slice = curr_mb_addr;
1021 curr_mb_addr++;
1022 if (!vs_has_more_data(str))
1023 return 0;
1024 if (h262_mb_addr_inc(str, &tmp)) return 1;
1025 if (curr_mb_addr >= picparm->pic_size_in_mbs) {
1026 fprintf(stderr, "MB index overflow\n");
1027 return 1;
1029 while (tmp) {
1030 slice->mbs[curr_mb_addr].macroblock_skipped = 1;
1031 slice->mbs[curr_mb_addr].macroblock_quant = 0;
1032 slice->mbs[curr_mb_addr].macroblock_motion_forward = 0;
1033 slice->mbs[curr_mb_addr].macroblock_motion_backward = 0;
1034 slice->mbs[curr_mb_addr].macroblock_pattern = 0;
1035 slice->mbs[curr_mb_addr].macroblock_intra = 0;
1036 if (h262_infer_vectors(str, seqparm, picparm, &slice->mbs[curr_mb_addr], 0)) return 1;
1037 if (h262_infer_vectors(str, seqparm, picparm, &slice->mbs[curr_mb_addr], 1)) return 1;
1038 curr_mb_addr++;
1039 if (curr_mb_addr >= picparm->pic_size_in_mbs) {
1040 fprintf(stderr, "MB index overflow\n");
1041 return 1;
1043 tmp--;
1045 } else {
1046 if (slice->last_mb_in_slice == curr_mb_addr) {
1047 return 0;
1049 tmp = 0;
1050 while (slice->last_mb_in_slice != curr_mb_addr && slice->mbs[curr_mb_addr].macroblock_skipped) {
1051 tmp++;
1052 curr_mb_addr++;
1054 if (slice->last_mb_in_slice == curr_mb_addr) {
1055 fprintf(stderr, "Last MB in slice is skipped\n");
1056 return 1;
1058 if (h262_mb_addr_inc(str, &tmp)) return 1;
1061 return 0;
1064 void h262_del_slice(struct h262_slice *slice) {
1065 free(slice->mbs);
1066 free(slice);