2 * Copyright (C) 2011 Marcelina KoĆcielnicka <mwk@0x04.net>
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
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.
30 static const struct vs_vlc_val mbai_vlc
[] = {
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 */
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;
73 if (vs_vlc(str
, &c33
, mbai_vlc
)) return 1;
76 if (vs_vlc(str
, &tmp
, mbai_vlc
)) return 1;
81 if (vs_vlc(str
, &tmp
, mbai_vlc
)) return 1;
84 } else if (tmp
== 34) {
95 static const struct vs_vlc_val motion_code_vlc
[] = {
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 },
132 static const struct vs_vlc_val dmvector_vlc
[] = {
139 int h262_motion_vectors(struct bitstream
*str
, struct h262_seqparm
*seqparm
, struct h262_picparm
*picparm
, struct h262_macroblock
*mb
, int s
) {
141 if (picparm
->picture_structure
== H262_PIC_STRUCT_FRAME
) {
142 switch (mb
->frame_motion_type
) {
143 case H262_FRAME_MOTION_FIELD
:
148 case H262_FRAME_MOTION_FRAME
:
153 case H262_FRAME_MOTION_DUAL_PRIME
:
162 switch (mb
->field_motion_type
) {
163 case H262_FIELD_MOTION_FIELD
:
168 case H262_FIELD_MOTION_16X8
:
173 case H262_FIELD_MOTION_DUAL_PRIME
:
183 for (r
= 0; r
< 2; r
++) {
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;
192 if (vs_infer(str
, &mb
->motion_residual
[r
][s
][t
], 0)) return 1;
195 if (vs_vlc(str
, &mb
->dmvector
[t
], dmvector_vlc
)) return 1;
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;
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;
223 if (vs_infer(str
, &mb
->dmvector
[0], 0)) return 1;
224 if (vs_infer(str
, &mb
->dmvector
[1], 0)) return 1;
229 static const struct vs_vlc_val cbp_vlc
[] = {
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 },
297 int h262_coded_block_pattern(struct bitstream
*str
, int chroma_format
, uint32_t *cbp
) {
298 uint32_t cbplo
= *cbp
& 0x3f;
302 switch (chroma_format
) {
313 fprintf(stderr
, "Invalid chroma format\n");
316 if (vs_vlc(str
, &cbplo
, cbp_vlc
)) return 1;
318 for (i
= 0; i
< cbphs
; i
++) {
319 uint32_t tmp
= *cbp
>> i
& 1;
320 if (vs_u(str
, &tmp
, 1)) return 1;
323 if (str
->dir
== VS_DECODE
)
328 static const struct vs_vlc_val dcs_luma_vlc
[] = {
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 },
344 static const struct vs_vlc_val dcs_chroma_vlc
[] = {
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 },
360 static const struct vs_vlc_val block_vlc
[] = {
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 },
477 static const struct vs_vlc_val block_0_vlc
[] = {
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 },
593 static const struct vs_vlc_val block_intra_vlc
[] = {
594 { 0x00000, 4, 0,1,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 },
710 int h262_block(struct bitstream
*str
, struct h262_seqparm
*seqparm
, struct h262_picparm
*picparm
, int32_t *block
, int intra
, int chroma
) {
715 if (str
->dir
== VS_ENCODE
) {
717 while (abs(block
[0]) >= (1 << dcs
))
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
) {
731 if (dcd
>= (1 << (dcs
- 1)))
734 block
[0] = dcd
- ((1 << dcs
) - 1);
739 if (picparm
->picture_coding_type
== H262_PIC_TYPE_D
)
742 uint32_t tmp
, run
, el
, eb1
, eb2
, sign
;
744 const struct vs_vlc_val
*tab
;
745 if (intra
&& picparm
->intra_vlc_format
)
746 tab
= block_intra_vlc
;
751 if (str
->dir
== VS_ENCODE
) {
753 while (i
< 64 && !block
[i
])
759 if (coeff
<= -0x800 || coeff
>= 0x800) {
760 fprintf(stderr
, "Coeff too large\n");
764 tmp
= abs(coeff
) | run
<< 12;
767 for (j
= 0; tab
[j
].blen
; j
++) {
768 if (tab
[j
].val
== tmp
) {
772 if (tab
[j
].val
!= tmp
)
774 if (tmp
== 0xfffff && !seqparm
->is_ext
) {
775 /* make MPEG1 escape codes */
776 if (abs(coeff
) < 127) {
778 } else if (abs(coeff
) < 255) {
785 fprintf(stderr
, "Coeff too large\n");
792 if (vs_vlc(str
, &tmp
, tab
)) return 1;
795 if (str
->dir
== VS_DECODE
) {
800 } else if (tmp
== 0xfffff) {
801 if (vs_u(str
, &run
, 6)) return 1;
802 if (seqparm
->is_ext
) {
804 if (vs_u(str
, &el
, 12)) return 1;
806 coeff
= el
| -0x1000;
810 fprintf(stderr
, "Invalid escape code\n");
815 if (vs_u(str
, &eb1
, 8)) return 1;
817 if (vs_u(str
, &eb2
, 8)) return 1;
819 fprintf(stderr
, "Invalid escape code\n");
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");
829 coeff
= eb2
| -0x100;
837 /* normal coefficient */
838 if (vs_u(str
, &sign
, 1)) return 1;
841 coeff
= -(tmp
& 0xfff);
845 if (str
->dir
== VS_DECODE
) {
847 fprintf(stderr
, "block overflow\n");
852 fprintf(stderr
, "block overflow\n");
862 static const struct vs_vlc_val mbf_i_vlc
[] = {
863 { 0x10, 1, 1 }, /* INTRA */
864 { 0x11, 2, 0,1 }, /* QUANT INTRA */
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 */
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 */
894 static const struct vs_vlc_val mbf_d_vlc
[] = {
895 { 0x10, 1, 1 }, /* INTRA */
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;
909 case H262_PIC_TYPE_P
:
910 if (vs_vlc(str
, &mb_flags
, mbf_p_vlc
)) return 1;
912 case H262_PIC_TYPE_B
:
913 if (vs_vlc(str
, &mb_flags
, mbf_b_vlc
)) return 1;
915 case H262_PIC_TYPE_D
:
916 if (vs_vlc(str
, &mb_flags
, mbf_d_vlc
)) return 1;
919 fprintf(stderr
, "Invalid picture type\n");
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;
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");
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");
949 if (picparm
->picture_structure
== H262_PIC_STRUCT_FRAME
) {
950 if (vs_infer(str
, &mb
->frame_motion_type
, H262_FRAME_MOTION_FRAME
)) return 1;
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;
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;
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;
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;
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;
984 if (vs_infer(str
, &mb
->coded_block_pattern
, 0)) return 1;
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;
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))
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;
1003 if (vs_u(str
, &tmp
, 8)) return 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");
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
;
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
;
1022 if (!vs_has_more_data(str
))
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");
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;
1039 if (curr_mb_addr
>= picparm
->pic_size_in_mbs
) {
1040 fprintf(stderr
, "MB index overflow\n");
1046 if (slice
->last_mb_in_slice
== curr_mb_addr
) {
1050 while (slice
->last_mb_in_slice
!= curr_mb_addr
&& slice
->mbs
[curr_mb_addr
].macroblock_skipped
) {
1054 if (slice
->last_mb_in_slice
== curr_mb_addr
) {
1055 fprintf(stderr
, "Last MB in slice is skipped\n");
1058 if (h262_mb_addr_inc(str
, &tmp
)) return 1;
1064 void h262_del_slice(struct h262_slice
*slice
) {