1
|
1 /*
|
|
2 * slice.c
|
|
3 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
|
|
4 *
|
|
5 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
|
|
6 *
|
|
7 * mpeg2dec is free software; you can redistribute it and/or modify
|
|
8 * it under the terms of the GNU General Public License as published by
|
|
9 * the Free Software Foundation; either version 2 of the License, or
|
|
10 * (at your option) any later version.
|
|
11 *
|
|
12 * mpeg2dec is distributed in the hope that it will be useful,
|
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 * GNU General Public License for more details.
|
|
16 *
|
|
17 * You should have received a copy of the GNU General Public License
|
|
18 * along with this program; if not, write to the Free Software
|
|
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
20 */
|
|
21
|
|
22 #include "config.h"
|
|
23
|
|
24 #include <string.h>
|
|
25 #include <inttypes.h>
|
|
26
|
|
27 #include "mpeg2_internal.h"
|
|
28 #include "attributes.h"
|
|
29
|
|
30 extern mc_functions_t mc_functions;
|
|
31 extern void (* idct_block_copy) (int16_t * block, uint8_t * dest, int stride);
|
|
32 extern void (* idct_block_add) (int16_t * block, uint8_t * dest, int stride);
|
|
33
|
|
34 static int16_t DCTblock[64] ATTR_ALIGN(16);
|
|
35
|
|
36 #include "vlc.h"
|
|
37
|
|
38 static int non_linear_quantizer_scale [] = {
|
|
39 0, 1, 2, 3, 4, 5, 6, 7,
|
|
40 8, 10, 12, 14, 16, 18, 20, 22,
|
|
41 24, 28, 32, 36, 40, 44, 48, 52,
|
|
42 56, 64, 72, 80, 88, 96, 104, 112
|
|
43 };
|
|
44
|
|
45 static inline int get_macroblock_modes (slice_t * slice, int picture_structure,
|
|
46 int picture_coding_type,
|
|
47 int frame_pred_frame_dct)
|
|
48 {
|
|
49 #define bit_buf (slice->bitstream_buf)
|
|
50 #define bits (slice->bitstream_bits)
|
|
51 #define bit_ptr (slice->bitstream_ptr)
|
|
52 int macroblock_modes;
|
|
53 MBtab * tab;
|
|
54
|
|
55 switch (picture_coding_type) {
|
|
56 case I_TYPE:
|
|
57
|
|
58 tab = MB_I + UBITS (bit_buf, 1);
|
|
59 DUMPBITS (bit_buf, bits, tab->len);
|
|
60 macroblock_modes = tab->modes;
|
|
61
|
|
62 if ((! frame_pred_frame_dct) && (picture_structure == FRAME_PICTURE)) {
|
|
63 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
|
|
64 DUMPBITS (bit_buf, bits, 1);
|
|
65 }
|
|
66
|
|
67 return macroblock_modes;
|
|
68
|
|
69 case P_TYPE:
|
|
70
|
|
71 tab = MB_P + UBITS (bit_buf, 5);
|
|
72 DUMPBITS (bit_buf, bits, tab->len);
|
|
73 macroblock_modes = tab->modes;
|
|
74
|
|
75 if (picture_structure != FRAME_PICTURE) {
|
|
76 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
|
|
77 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
|
|
78 DUMPBITS (bit_buf, bits, 2);
|
|
79 }
|
|
80 return macroblock_modes;
|
|
81 } else if (frame_pred_frame_dct) {
|
|
82 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
|
|
83 macroblock_modes |= MC_FRAME;
|
|
84 return macroblock_modes;
|
|
85 } else {
|
|
86 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
|
|
87 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
|
|
88 DUMPBITS (bit_buf, bits, 2);
|
|
89 }
|
|
90 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
|
|
91 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
|
|
92 DUMPBITS (bit_buf, bits, 1);
|
|
93 }
|
|
94 return macroblock_modes;
|
|
95 }
|
|
96
|
|
97 case B_TYPE:
|
|
98
|
|
99 tab = MB_B + UBITS (bit_buf, 6);
|
|
100 DUMPBITS (bit_buf, bits, tab->len);
|
|
101 macroblock_modes = tab->modes;
|
|
102
|
|
103 if (picture_structure != FRAME_PICTURE) {
|
|
104 if (! (macroblock_modes & MACROBLOCK_INTRA)) {
|
|
105 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
|
|
106 DUMPBITS (bit_buf, bits, 2);
|
|
107 }
|
|
108 return macroblock_modes;
|
|
109 } else if (frame_pred_frame_dct) {
|
|
110 //if (! (macroblock_modes & MACROBLOCK_INTRA))
|
|
111 macroblock_modes |= MC_FRAME;
|
|
112 return macroblock_modes;
|
|
113 } else {
|
|
114 if (macroblock_modes & MACROBLOCK_INTRA)
|
|
115 goto intra;
|
|
116 macroblock_modes |= UBITS (bit_buf, 2) * MOTION_TYPE_BASE;
|
|
117 DUMPBITS (bit_buf, bits, 2);
|
|
118 if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
|
|
119 intra:
|
|
120 macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
|
|
121 DUMPBITS (bit_buf, bits, 1);
|
|
122 }
|
|
123 return macroblock_modes;
|
|
124 }
|
|
125
|
|
126 case D_TYPE:
|
|
127
|
|
128 DUMPBITS (bit_buf, bits, 1);
|
|
129 return MACROBLOCK_INTRA;
|
|
130
|
|
131 default:
|
|
132 return 0;
|
|
133 }
|
|
134 #undef bit_buf
|
|
135 #undef bits
|
|
136 #undef bit_ptr
|
|
137 }
|
|
138
|
|
139 static inline int get_quantizer_scale (slice_t * slice, int q_scale_type)
|
|
140 {
|
|
141 #define bit_buf (slice->bitstream_buf)
|
|
142 #define bits (slice->bitstream_bits)
|
|
143 #define bit_ptr (slice->bitstream_ptr)
|
|
144
|
|
145 int quantizer_scale_code;
|
|
146
|
|
147 quantizer_scale_code = UBITS (bit_buf, 5);
|
|
148 DUMPBITS (bit_buf, bits, 5);
|
|
149
|
|
150 if (q_scale_type)
|
|
151 return non_linear_quantizer_scale [quantizer_scale_code];
|
|
152 else
|
|
153 return quantizer_scale_code << 1;
|
|
154 #undef bit_buf
|
|
155 #undef bits
|
|
156 #undef bit_ptr
|
|
157 }
|
|
158
|
|
159 static inline int get_motion_delta (slice_t * slice, int f_code)
|
|
160 {
|
|
161 #define bit_buf (slice->bitstream_buf)
|
|
162 #define bits (slice->bitstream_bits)
|
|
163 #define bit_ptr (slice->bitstream_ptr)
|
|
164
|
|
165 int delta;
|
|
166 int sign;
|
|
167 MVtab * tab;
|
|
168
|
|
169 if (bit_buf & 0x80000000) {
|
|
170 DUMPBITS (bit_buf, bits, 1);
|
|
171 return 0;
|
|
172 } else if (bit_buf >= 0x0c000000) {
|
|
173
|
|
174 tab = MV_4 + UBITS (bit_buf, 4);
|
|
175 delta = (tab->delta << f_code) + 1;
|
|
176 bits += tab->len + f_code + 1;
|
|
177 bit_buf <<= tab->len;
|
|
178
|
|
179 sign = SBITS (bit_buf, 1);
|
|
180 bit_buf <<= 1;
|
|
181
|
|
182 if (f_code)
|
|
183 delta += UBITS (bit_buf, f_code);
|
|
184 bit_buf <<= f_code;
|
|
185
|
|
186 return (delta ^ sign) - sign;
|
|
187
|
|
188 } else {
|
|
189
|
|
190 tab = MV_10 + UBITS (bit_buf, 10);
|
|
191 delta = (tab->delta << f_code) + 1;
|
|
192 bits += tab->len + 1;
|
|
193 bit_buf <<= tab->len;
|
|
194
|
|
195 sign = SBITS (bit_buf, 1);
|
|
196 bit_buf <<= 1;
|
|
197
|
|
198 if (f_code) {
|
|
199 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
200 delta += UBITS (bit_buf, f_code);
|
|
201 DUMPBITS (bit_buf, bits, f_code);
|
|
202 }
|
|
203
|
|
204 return (delta ^ sign) - sign;
|
|
205
|
|
206 }
|
|
207 #undef bit_buf
|
|
208 #undef bits
|
|
209 #undef bit_ptr
|
|
210 }
|
|
211
|
|
212 static inline int bound_motion_vector (int vector, int f_code)
|
|
213 {
|
|
214 #if 1
|
|
215 int limit;
|
|
216
|
|
217 limit = 16 << f_code;
|
|
218
|
|
219 if (vector >= limit)
|
|
220 return vector - 2*limit;
|
|
221 else if (vector < -limit)
|
|
222 return vector + 2*limit;
|
|
223 else return vector;
|
|
224 #else
|
|
225 return (vector << (27 - f_code)) >> (27 - f_code);
|
|
226 #endif
|
|
227 }
|
|
228
|
|
229 static inline int get_dmv (slice_t * slice)
|
|
230 {
|
|
231 #define bit_buf (slice->bitstream_buf)
|
|
232 #define bits (slice->bitstream_bits)
|
|
233 #define bit_ptr (slice->bitstream_ptr)
|
|
234
|
|
235 DMVtab * tab;
|
|
236
|
|
237 tab = DMV_2 + UBITS (bit_buf, 2);
|
|
238 DUMPBITS (bit_buf, bits, tab->len);
|
|
239 return tab->dmv;
|
|
240 #undef bit_buf
|
|
241 #undef bits
|
|
242 #undef bit_ptr
|
|
243 }
|
|
244
|
|
245 static inline int get_coded_block_pattern (slice_t * slice)
|
|
246 {
|
|
247 #define bit_buf (slice->bitstream_buf)
|
|
248 #define bits (slice->bitstream_bits)
|
|
249 #define bit_ptr (slice->bitstream_ptr)
|
|
250
|
|
251 CBPtab * tab;
|
|
252
|
|
253 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
254
|
|
255 if (bit_buf >= 0x20000000) {
|
|
256
|
|
257 tab = CBP_7 - 16 + UBITS (bit_buf, 7);
|
|
258 DUMPBITS (bit_buf, bits, tab->len);
|
|
259 return tab->cbp;
|
|
260
|
|
261 } else {
|
|
262
|
|
263 tab = CBP_9 + UBITS (bit_buf, 9);
|
|
264 DUMPBITS (bit_buf, bits, tab->len);
|
|
265 return tab->cbp;
|
|
266 }
|
|
267
|
|
268 #undef bit_buf
|
|
269 #undef bits
|
|
270 #undef bit_ptr
|
|
271 }
|
|
272
|
|
273 static inline int get_luma_dc_dct_diff (slice_t * slice)
|
|
274 {
|
|
275 #define bit_buf (slice->bitstream_buf)
|
|
276 #define bits (slice->bitstream_bits)
|
|
277 #define bit_ptr (slice->bitstream_ptr)
|
|
278 DCtab * tab;
|
|
279 int size;
|
|
280 int dc_diff;
|
|
281
|
|
282 if (bit_buf < 0xf8000000) {
|
|
283 tab = DC_lum_5 + UBITS (bit_buf, 5);
|
|
284 size = tab->size;
|
|
285 if (size) {
|
|
286 bits += tab->len + size;
|
|
287 bit_buf <<= tab->len;
|
|
288 dc_diff =
|
|
289 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
|
|
290 bit_buf <<= size;
|
|
291 return dc_diff;
|
|
292 } else {
|
|
293 DUMPBITS (bit_buf, bits, 3);
|
|
294 return 0;
|
|
295 }
|
|
296 } else {
|
|
297 tab = DC_long - 0x1e0 + UBITS (bit_buf, 9);
|
|
298 size = tab->size;
|
|
299 DUMPBITS (bit_buf, bits, tab->len);
|
|
300 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
301 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
|
|
302 DUMPBITS (bit_buf, bits, size);
|
|
303 return dc_diff;
|
|
304 }
|
|
305 #undef bit_buf
|
|
306 #undef bits
|
|
307 #undef bit_ptr
|
|
308 }
|
|
309
|
|
310 static inline int get_chroma_dc_dct_diff (slice_t * slice)
|
|
311 {
|
|
312 #define bit_buf (slice->bitstream_buf)
|
|
313 #define bits (slice->bitstream_bits)
|
|
314 #define bit_ptr (slice->bitstream_ptr)
|
|
315 DCtab * tab;
|
|
316 int size;
|
|
317 int dc_diff;
|
|
318
|
|
319 if (bit_buf < 0xf8000000) {
|
|
320 tab = DC_chrom_5 + UBITS (bit_buf, 5);
|
|
321 size = tab->size;
|
|
322 if (size) {
|
|
323 bits += tab->len + size;
|
|
324 bit_buf <<= tab->len;
|
|
325 dc_diff =
|
|
326 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
|
|
327 bit_buf <<= size;
|
|
328 return dc_diff;
|
|
329 } else {
|
|
330 DUMPBITS (bit_buf, bits, 2);
|
|
331 return 0;
|
|
332 }
|
|
333 } else {
|
|
334 tab = DC_long - 0x3e0 + UBITS (bit_buf, 10);
|
|
335 size = tab->size;
|
|
336 DUMPBITS (bit_buf, bits, tab->len + 1);
|
|
337 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
338 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
|
|
339 DUMPBITS (bit_buf, bits, size);
|
|
340 return dc_diff;
|
|
341 }
|
|
342 #undef bit_buf
|
|
343 #undef bits
|
|
344 #undef bit_ptr
|
|
345 }
|
|
346
|
|
347 #define SATURATE(val) \
|
|
348 do { \
|
|
349 if (val > 2047) \
|
|
350 val = 2047; \
|
|
351 else if (val < -2048) \
|
|
352 val = -2048; \
|
|
353 } while (0)
|
|
354
|
|
355 static void get_intra_block_B14 (picture_t * picture, slice_t * slice,
|
|
356 int16_t * dest)
|
|
357 {
|
|
358 int i;
|
|
359 int j;
|
|
360 int val;
|
|
361 uint8_t * scan = picture->scan;
|
|
362 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
|
|
363 int quantizer_scale = slice->quantizer_scale;
|
|
364 int mismatch;
|
|
365 DCTtab * tab;
|
|
366 uint32_t bit_buf;
|
|
367 int bits;
|
|
368 uint8_t * bit_ptr;
|
|
369
|
|
370 i = 0;
|
|
371 mismatch = ~dest[0];
|
|
372
|
|
373 bit_buf = slice->bitstream_buf;
|
|
374 bits = slice->bitstream_bits;
|
|
375 bit_ptr = slice->bitstream_ptr;
|
|
376
|
|
377 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
378
|
|
379 while (1) {
|
|
380 if (bit_buf >= 0x28000000) {
|
|
381
|
|
382 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
|
|
383
|
|
384 i += tab->run;
|
|
385 if (i >= 64)
|
|
386 break; // end of block
|
|
387
|
|
388 normal_code:
|
|
389 j = scan[i];
|
|
390 bit_buf <<= tab->len;
|
|
391 bits += tab->len + 1;
|
|
392 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
|
|
393
|
|
394 // if (bitstream_get (1)) val = -val;
|
|
395 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
|
|
396
|
|
397 SATURATE (val);
|
|
398 dest[j] = val;
|
|
399 mismatch ^= val;
|
|
400
|
|
401 bit_buf <<= 1;
|
|
402 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
403
|
|
404 continue;
|
|
405
|
|
406 } else if (bit_buf >= 0x04000000) {
|
|
407
|
|
408 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
|
|
409
|
|
410 i += tab->run;
|
|
411 if (i < 64)
|
|
412 goto normal_code;
|
|
413
|
|
414 // escape code
|
|
415
|
|
416 i += UBITS (bit_buf << 6, 6) - 64;
|
|
417 if (i >= 64)
|
|
418 break; // illegal, but check needed to avoid buffer overflow
|
|
419
|
|
420 j = scan[i];
|
|
421
|
|
422 DUMPBITS (bit_buf, bits, 12);
|
|
423 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
424 val = (SBITS (bit_buf, 12) *
|
|
425 quantizer_scale * quant_matrix[j]) / 16;
|
|
426
|
|
427 SATURATE (val);
|
|
428 dest[j] = val;
|
|
429 mismatch ^= val;
|
|
430
|
|
431 DUMPBITS (bit_buf, bits, 12);
|
|
432 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
433
|
|
434 continue;
|
|
435
|
|
436 } else if (bit_buf >= 0x02000000) {
|
|
437 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
|
|
438 i += tab->run;
|
|
439 if (i < 64)
|
|
440 goto normal_code;
|
|
441 } else if (bit_buf >= 0x00800000) {
|
|
442 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
|
|
443 i += tab->run;
|
|
444 if (i < 64)
|
|
445 goto normal_code;
|
|
446 } else if (bit_buf >= 0x00200000) {
|
|
447 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
|
|
448 i += tab->run;
|
|
449 if (i < 64)
|
|
450 goto normal_code;
|
|
451 } else {
|
|
452 tab = DCT_16 + UBITS (bit_buf, 16);
|
|
453 bit_buf <<= 16;
|
|
454 GETWORD (bit_buf, bits + 16, bit_ptr);
|
|
455 i += tab->run;
|
|
456 if (i < 64)
|
|
457 goto normal_code;
|
|
458 }
|
|
459 break; // illegal, but check needed to avoid buffer overflow
|
|
460 }
|
|
461 dest[63] ^= mismatch & 1;
|
|
462 DUMPBITS (bit_buf, bits, 2); // dump end of block code
|
|
463 slice->bitstream_buf = bit_buf;
|
|
464 slice->bitstream_bits = bits;
|
|
465 slice->bitstream_ptr = bit_ptr;
|
|
466 }
|
|
467
|
|
468 static void get_intra_block_B15 (picture_t * picture, slice_t * slice,
|
|
469 int16_t * dest)
|
|
470 {
|
|
471 int i;
|
|
472 int j;
|
|
473 int val;
|
|
474 uint8_t * scan = picture->scan;
|
|
475 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
|
|
476 int quantizer_scale = slice->quantizer_scale;
|
|
477 int mismatch;
|
|
478 DCTtab * tab;
|
|
479 uint32_t bit_buf;
|
|
480 int bits;
|
|
481 uint8_t * bit_ptr;
|
|
482
|
|
483 i = 0;
|
|
484 mismatch = ~dest[0];
|
|
485
|
|
486 bit_buf = slice->bitstream_buf;
|
|
487 bits = slice->bitstream_bits;
|
|
488 bit_ptr = slice->bitstream_ptr;
|
|
489
|
|
490 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
491
|
|
492 while (1) {
|
|
493 if (bit_buf >= 0x04000000) {
|
|
494
|
|
495 tab = DCT_B15_8 - 4 + UBITS (bit_buf, 8);
|
|
496
|
|
497 i += tab->run;
|
|
498 if (i < 64) {
|
|
499
|
|
500 normal_code:
|
|
501 j = scan[i];
|
|
502 bit_buf <<= tab->len;
|
|
503 bits += tab->len + 1;
|
|
504 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
|
|
505
|
|
506 // if (bitstream_get (1)) val = -val;
|
|
507 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
|
|
508
|
|
509 SATURATE (val);
|
|
510 dest[j] = val;
|
|
511 mismatch ^= val;
|
|
512
|
|
513 bit_buf <<= 1;
|
|
514 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
515
|
|
516 continue;
|
|
517
|
|
518 } else {
|
|
519
|
|
520 // end of block. I commented out this code because if we
|
|
521 // dont exit here we will still exit at the later test :)
|
|
522
|
|
523 //if (i >= 128) break; // end of block
|
|
524
|
|
525 // escape code
|
|
526
|
|
527 i += UBITS (bit_buf << 6, 6) - 64;
|
|
528 if (i >= 64)
|
|
529 break; // illegal, but check against buffer overflow
|
|
530
|
|
531 j = scan[i];
|
|
532
|
|
533 DUMPBITS (bit_buf, bits, 12);
|
|
534 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
535 val = (SBITS (bit_buf, 12) *
|
|
536 quantizer_scale * quant_matrix[j]) / 16;
|
|
537
|
|
538 SATURATE (val);
|
|
539 dest[j] = val;
|
|
540 mismatch ^= val;
|
|
541
|
|
542 DUMPBITS (bit_buf, bits, 12);
|
|
543 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
544
|
|
545 continue;
|
|
546
|
|
547 }
|
|
548 } else if (bit_buf >= 0x02000000) {
|
|
549 tab = DCT_B15_10 - 8 + UBITS (bit_buf, 10);
|
|
550 i += tab->run;
|
|
551 if (i < 64)
|
|
552 goto normal_code;
|
|
553 } else if (bit_buf >= 0x00800000) {
|
|
554 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
|
|
555 i += tab->run;
|
|
556 if (i < 64)
|
|
557 goto normal_code;
|
|
558 } else if (bit_buf >= 0x00200000) {
|
|
559 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
|
|
560 i += tab->run;
|
|
561 if (i < 64)
|
|
562 goto normal_code;
|
|
563 } else {
|
|
564 tab = DCT_16 + UBITS (bit_buf, 16);
|
|
565 bit_buf <<= 16;
|
|
566 GETWORD (bit_buf, bits + 16, bit_ptr);
|
|
567 i += tab->run;
|
|
568 if (i < 64)
|
|
569 goto normal_code;
|
|
570 }
|
|
571 break; // illegal, but check needed to avoid buffer overflow
|
|
572 }
|
|
573 dest[63] ^= mismatch & 1;
|
|
574 DUMPBITS (bit_buf, bits, 4); // dump end of block code
|
|
575 slice->bitstream_buf = bit_buf;
|
|
576 slice->bitstream_bits = bits;
|
|
577 slice->bitstream_ptr = bit_ptr;
|
|
578 }
|
|
579
|
|
580 static void get_non_intra_block (picture_t * picture, slice_t * slice,
|
|
581 int16_t * dest)
|
|
582 {
|
|
583 int i;
|
|
584 int j;
|
|
585 int val;
|
|
586 uint8_t * scan = picture->scan;
|
|
587 uint8_t * quant_matrix = picture->non_intra_quantizer_matrix;
|
|
588 int quantizer_scale = slice->quantizer_scale;
|
|
589 int mismatch;
|
|
590 DCTtab * tab;
|
|
591 uint32_t bit_buf;
|
|
592 int bits;
|
|
593 uint8_t * bit_ptr;
|
|
594
|
|
595 i = -1;
|
|
596 mismatch = 1;
|
|
597
|
|
598 bit_buf = slice->bitstream_buf;
|
|
599 bits = slice->bitstream_bits;
|
|
600 bit_ptr = slice->bitstream_ptr;
|
|
601
|
|
602 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
603 if (bit_buf >= 0x28000000) {
|
|
604 tab = DCT_B14DC_5 - 5 + UBITS (bit_buf, 5);
|
|
605 goto entry_1;
|
|
606 } else
|
|
607 goto entry_2;
|
|
608
|
|
609 while (1) {
|
|
610 if (bit_buf >= 0x28000000) {
|
|
611
|
|
612 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
|
|
613
|
|
614 entry_1:
|
|
615 i += tab->run;
|
|
616 if (i >= 64)
|
|
617 break; // end of block
|
|
618
|
|
619 normal_code:
|
|
620 j = scan[i];
|
|
621 bit_buf <<= tab->len;
|
|
622 bits += tab->len + 1;
|
|
623 val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
|
|
624
|
|
625 // if (bitstream_get (1)) val = -val;
|
|
626 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
|
|
627
|
|
628 SATURATE (val);
|
|
629 dest[j] = val;
|
|
630 mismatch ^= val;
|
|
631
|
|
632 bit_buf <<= 1;
|
|
633 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
634
|
|
635 continue;
|
|
636
|
|
637 }
|
|
638
|
|
639 entry_2:
|
|
640 if (bit_buf >= 0x04000000) {
|
|
641
|
|
642 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
|
|
643
|
|
644 i += tab->run;
|
|
645 if (i < 64)
|
|
646 goto normal_code;
|
|
647
|
|
648 // escape code
|
|
649
|
|
650 i += UBITS (bit_buf << 6, 6) - 64;
|
|
651 if (i >= 64)
|
|
652 break; // illegal, but check needed to avoid buffer overflow
|
|
653
|
|
654 j = scan[i];
|
|
655
|
|
656 DUMPBITS (bit_buf, bits, 12);
|
|
657 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
658 val = 2 * (SBITS (bit_buf, 12) + SBITS (bit_buf, 1)) + 1;
|
|
659 val = (val * quantizer_scale * quant_matrix[j]) / 32;
|
|
660
|
|
661 SATURATE (val);
|
|
662 dest[j] = val;
|
|
663 mismatch ^= val;
|
|
664
|
|
665 DUMPBITS (bit_buf, bits, 12);
|
|
666 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
667
|
|
668 continue;
|
|
669
|
|
670 } else if (bit_buf >= 0x02000000) {
|
|
671 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
|
|
672 i += tab->run;
|
|
673 if (i < 64)
|
|
674 goto normal_code;
|
|
675 } else if (bit_buf >= 0x00800000) {
|
|
676 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
|
|
677 i += tab->run;
|
|
678 if (i < 64)
|
|
679 goto normal_code;
|
|
680 } else if (bit_buf >= 0x00200000) {
|
|
681 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
|
|
682 i += tab->run;
|
|
683 if (i < 64)
|
|
684 goto normal_code;
|
|
685 } else {
|
|
686 tab = DCT_16 + UBITS (bit_buf, 16);
|
|
687 bit_buf <<= 16;
|
|
688 GETWORD (bit_buf, bits + 16, bit_ptr);
|
|
689 i += tab->run;
|
|
690 if (i < 64)
|
|
691 goto normal_code;
|
|
692 }
|
|
693 break; // illegal, but check needed to avoid buffer overflow
|
|
694 }
|
|
695 dest[63] ^= mismatch & 1;
|
|
696 DUMPBITS (bit_buf, bits, 2); // dump end of block code
|
|
697 slice->bitstream_buf = bit_buf;
|
|
698 slice->bitstream_bits = bits;
|
|
699 slice->bitstream_ptr = bit_ptr;
|
|
700 }
|
|
701
|
|
702 static void get_mpeg1_intra_block (picture_t * picture, slice_t * slice,
|
|
703 int16_t * dest)
|
|
704 {
|
|
705 int i;
|
|
706 int j;
|
|
707 int val;
|
|
708 uint8_t * scan = picture->scan;
|
|
709 uint8_t * quant_matrix = picture->intra_quantizer_matrix;
|
|
710 int quantizer_scale = slice->quantizer_scale;
|
|
711 DCTtab * tab;
|
|
712 uint32_t bit_buf;
|
|
713 int bits;
|
|
714 uint8_t * bit_ptr;
|
|
715
|
|
716 i = 0;
|
|
717
|
|
718 bit_buf = slice->bitstream_buf;
|
|
719 bits = slice->bitstream_bits;
|
|
720 bit_ptr = slice->bitstream_ptr;
|
|
721
|
|
722 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
723
|
|
724 while (1) {
|
|
725 if (bit_buf >= 0x28000000) {
|
|
726
|
|
727 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
|
|
728
|
|
729 i += tab->run;
|
|
730 if (i >= 64)
|
|
731 break; // end of block
|
|
732
|
|
733 normal_code:
|
|
734 j = scan[i];
|
|
735 bit_buf <<= tab->len;
|
|
736 bits += tab->len + 1;
|
|
737 val = (tab->level * quantizer_scale * quant_matrix[j]) >> 4;
|
|
738
|
|
739 // oddification
|
|
740 val = (val - 1) | 1;
|
|
741
|
|
742 // if (bitstream_get (1)) val = -val;
|
|
743 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
|
|
744
|
|
745 SATURATE (val);
|
|
746 dest[j] = val;
|
|
747
|
|
748 bit_buf <<= 1;
|
|
749 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
750
|
|
751 continue;
|
|
752
|
|
753 } else if (bit_buf >= 0x04000000) {
|
|
754
|
|
755 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
|
|
756
|
|
757 i += tab->run;
|
|
758 if (i < 64)
|
|
759 goto normal_code;
|
|
760
|
|
761 // escape code
|
|
762
|
|
763 i += UBITS (bit_buf << 6, 6) - 64;
|
|
764 if (i >= 64)
|
|
765 break; // illegal, but check needed to avoid buffer overflow
|
|
766
|
|
767 j = scan[i];
|
|
768
|
|
769 DUMPBITS (bit_buf, bits, 12);
|
|
770 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
771 val = SBITS (bit_buf, 8);
|
|
772 if (! (val & 0x7f)) {
|
|
773 DUMPBITS (bit_buf, bits, 8);
|
|
774 val = UBITS (bit_buf, 8) + 2 * val;
|
|
775 }
|
|
776 val = (val * quantizer_scale * quant_matrix[j]) / 16;
|
|
777
|
|
778 // oddification
|
|
779 val = (val + ~SBITS (val, 1)) | 1;
|
|
780
|
|
781 SATURATE (val);
|
|
782 dest[j] = val;
|
|
783
|
|
784 DUMPBITS (bit_buf, bits, 8);
|
|
785 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
786
|
|
787 continue;
|
|
788
|
|
789 } else if (bit_buf >= 0x02000000) {
|
|
790 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
|
|
791 i += tab->run;
|
|
792 if (i < 64)
|
|
793 goto normal_code;
|
|
794 } else if (bit_buf >= 0x00800000) {
|
|
795 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
|
|
796 i += tab->run;
|
|
797 if (i < 64)
|
|
798 goto normal_code;
|
|
799 } else if (bit_buf >= 0x00200000) {
|
|
800 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
|
|
801 i += tab->run;
|
|
802 if (i < 64)
|
|
803 goto normal_code;
|
|
804 } else {
|
|
805 tab = DCT_16 + UBITS (bit_buf, 16);
|
|
806 bit_buf <<= 16;
|
|
807 GETWORD (bit_buf, bits + 16, bit_ptr);
|
|
808 i += tab->run;
|
|
809 if (i < 64)
|
|
810 goto normal_code;
|
|
811 }
|
|
812 break; // illegal, but check needed to avoid buffer overflow
|
|
813 }
|
|
814 DUMPBITS (bit_buf, bits, 2); // dump end of block code
|
|
815 slice->bitstream_buf = bit_buf;
|
|
816 slice->bitstream_bits = bits;
|
|
817 slice->bitstream_ptr = bit_ptr;
|
|
818 }
|
|
819
|
|
820 static void get_mpeg1_non_intra_block (picture_t * picture, slice_t * slice,
|
|
821 int16_t * dest)
|
|
822 {
|
|
823 int i;
|
|
824 int j;
|
|
825 int val;
|
|
826 uint8_t * scan = picture->scan;
|
|
827 uint8_t * quant_matrix = picture->non_intra_quantizer_matrix;
|
|
828 int quantizer_scale = slice->quantizer_scale;
|
|
829 DCTtab * tab;
|
|
830 uint32_t bit_buf;
|
|
831 int bits;
|
|
832 uint8_t * bit_ptr;
|
|
833
|
|
834 i = -1;
|
|
835
|
|
836 bit_buf = slice->bitstream_buf;
|
|
837 bits = slice->bitstream_bits;
|
|
838 bit_ptr = slice->bitstream_ptr;
|
|
839
|
|
840 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
841 if (bit_buf >= 0x28000000) {
|
|
842 tab = DCT_B14DC_5 - 5 + UBITS (bit_buf, 5);
|
|
843 goto entry_1;
|
|
844 } else
|
|
845 goto entry_2;
|
|
846
|
|
847 while (1) {
|
|
848 if (bit_buf >= 0x28000000) {
|
|
849
|
|
850 tab = DCT_B14AC_5 - 5 + UBITS (bit_buf, 5);
|
|
851
|
|
852 entry_1:
|
|
853 i += tab->run;
|
|
854 if (i >= 64)
|
|
855 break; // end of block
|
|
856
|
|
857 normal_code:
|
|
858 j = scan[i];
|
|
859 bit_buf <<= tab->len;
|
|
860 bits += tab->len + 1;
|
|
861 val = ((2*tab->level+1) * quantizer_scale * quant_matrix[j]) >> 5;
|
|
862
|
|
863 // oddification
|
|
864 val = (val - 1) | 1;
|
|
865
|
|
866 // if (bitstream_get (1)) val = -val;
|
|
867 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
|
|
868
|
|
869 SATURATE (val);
|
|
870 dest[j] = val;
|
|
871
|
|
872 bit_buf <<= 1;
|
|
873 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
874
|
|
875 continue;
|
|
876
|
|
877 }
|
|
878
|
|
879 entry_2:
|
|
880 if (bit_buf >= 0x04000000) {
|
|
881
|
|
882 tab = DCT_B14_8 - 4 + UBITS (bit_buf, 8);
|
|
883
|
|
884 i += tab->run;
|
|
885 if (i < 64)
|
|
886 goto normal_code;
|
|
887
|
|
888 // escape code
|
|
889
|
|
890 i += UBITS (bit_buf << 6, 6) - 64;
|
|
891 if (i >= 64)
|
|
892 break; // illegal, but check needed to avoid buffer overflow
|
|
893
|
|
894 j = scan[i];
|
|
895
|
|
896 DUMPBITS (bit_buf, bits, 12);
|
|
897 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
898 val = SBITS (bit_buf, 8);
|
|
899 if (! (val & 0x7f)) {
|
|
900 DUMPBITS (bit_buf, bits, 8);
|
|
901 val = UBITS (bit_buf, 8) + 2 * val;
|
|
902 }
|
|
903 val = 2 * (val + SBITS (val, 1)) + 1;
|
|
904 val = (val * quantizer_scale * quant_matrix[j]) / 32;
|
|
905
|
|
906 // oddification
|
|
907 val = (val + ~SBITS (val, 1)) | 1;
|
|
908
|
|
909 SATURATE (val);
|
|
910 dest[j] = val;
|
|
911
|
|
912 DUMPBITS (bit_buf, bits, 8);
|
|
913 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
914
|
|
915 continue;
|
|
916
|
|
917 } else if (bit_buf >= 0x02000000) {
|
|
918 tab = DCT_B14_10 - 8 + UBITS (bit_buf, 10);
|
|
919 i += tab->run;
|
|
920 if (i < 64)
|
|
921 goto normal_code;
|
|
922 } else if (bit_buf >= 0x00800000) {
|
|
923 tab = DCT_13 - 16 + UBITS (bit_buf, 13);
|
|
924 i += tab->run;
|
|
925 if (i < 64)
|
|
926 goto normal_code;
|
|
927 } else if (bit_buf >= 0x00200000) {
|
|
928 tab = DCT_15 - 16 + UBITS (bit_buf, 15);
|
|
929 i += tab->run;
|
|
930 if (i < 64)
|
|
931 goto normal_code;
|
|
932 } else {
|
|
933 tab = DCT_16 + UBITS (bit_buf, 16);
|
|
934 bit_buf <<= 16;
|
|
935 GETWORD (bit_buf, bits + 16, bit_ptr);
|
|
936 i += tab->run;
|
|
937 if (i < 64)
|
|
938 goto normal_code;
|
|
939 }
|
|
940 break; // illegal, but check needed to avoid buffer overflow
|
|
941 }
|
|
942 DUMPBITS (bit_buf, bits, 2); // dump end of block code
|
|
943 slice->bitstream_buf = bit_buf;
|
|
944 slice->bitstream_bits = bits;
|
|
945 slice->bitstream_ptr = bit_ptr;
|
|
946 }
|
|
947
|
|
948 static inline int get_macroblock_address_increment (slice_t * slice)
|
|
949 {
|
|
950 #define bit_buf (slice->bitstream_buf)
|
|
951 #define bits (slice->bitstream_bits)
|
|
952 #define bit_ptr (slice->bitstream_ptr)
|
|
953
|
|
954 MBAtab * tab;
|
|
955 int mba;
|
|
956
|
|
957 mba = 0;
|
|
958
|
|
959 while (1) {
|
|
960 if (bit_buf >= 0x10000000) {
|
|
961 tab = MBA_5 - 2 + UBITS (bit_buf, 5);
|
|
962 DUMPBITS (bit_buf, bits, tab->len);
|
|
963 return mba + tab->mba;
|
|
964 } else if (bit_buf >= 0x03000000) {
|
|
965 tab = MBA_11 - 24 + UBITS (bit_buf, 11);
|
|
966 DUMPBITS (bit_buf, bits, tab->len);
|
|
967 return mba + tab->mba;
|
|
968 } else switch (UBITS (bit_buf, 11)) {
|
|
969 case 8: // macroblock_escape
|
|
970 mba += 33;
|
|
971 // no break here on purpose
|
|
972 case 15: // macroblock_stuffing (MPEG1 only)
|
|
973 DUMPBITS (bit_buf, bits, 11);
|
|
974 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
975 break;
|
|
976 default: // end of slice, or error
|
|
977 return 0;
|
|
978 }
|
|
979 }
|
|
980
|
|
981 #undef bit_buf
|
|
982 #undef bits
|
|
983 #undef bit_ptr
|
|
984 }
|
|
985
|
|
986 static inline void slice_intra_DCT (picture_t * picture, slice_t * slice,
|
|
987 int cc, uint8_t * dest, int stride)
|
|
988 {
|
|
989 #define bit_buf (slice->bitstream_buf)
|
|
990 #define bits (slice->bitstream_bits)
|
|
991 #define bit_ptr (slice->bitstream_ptr)
|
|
992 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
993 //Get the intra DC coefficient and inverse quantize it
|
|
994 if (cc == 0)
|
|
995 slice->dc_dct_pred[0] += get_luma_dc_dct_diff (slice);
|
|
996 else
|
|
997 slice->dc_dct_pred[cc] += get_chroma_dc_dct_diff (slice);
|
|
998 DCTblock[0] = slice->dc_dct_pred[cc] << (3 - picture->intra_dc_precision);
|
|
999
|
|
1000 if (picture->mpeg1) {
|
|
1001 if (picture->picture_coding_type != D_TYPE)
|
|
1002 get_mpeg1_intra_block (picture, slice, DCTblock);
|
|
1003 } else if (picture->intra_vlc_format)
|
|
1004 get_intra_block_B15 (picture, slice, DCTblock);
|
|
1005 else
|
|
1006 get_intra_block_B14 (picture, slice, DCTblock);
|
|
1007 idct_block_copy (DCTblock, dest, stride);
|
|
1008 memset (DCTblock, 0, sizeof (DCTblock));
|
|
1009 #undef bit_buf
|
|
1010 #undef bits
|
|
1011 #undef bit_ptr
|
|
1012 }
|
|
1013
|
|
1014 static inline void slice_non_intra_DCT (picture_t * picture, slice_t * slice,
|
|
1015 uint8_t * dest, int stride)
|
|
1016 {
|
|
1017 if (picture->mpeg1)
|
|
1018 get_mpeg1_non_intra_block (picture, slice, DCTblock);
|
|
1019 else
|
|
1020 get_non_intra_block (picture, slice, DCTblock);
|
|
1021 idct_block_add (DCTblock, dest, stride);
|
|
1022 memset (DCTblock, 0, sizeof (DCTblock));
|
|
1023 }
|
|
1024
|
|
1025 static inline void motion_block (void (** table) (uint8_t *, uint8_t *,
|
|
1026 int32_t, int32_t),
|
|
1027 int x_pred, int y_pred,
|
|
1028 uint8_t * dest[3], int dest_offset,
|
|
1029 uint8_t * src[3], int src_offset,
|
|
1030 int stride, int height, int second_half)
|
|
1031 {
|
|
1032 int xy_half;
|
|
1033 uint8_t * src1;
|
|
1034 uint8_t * src2;
|
|
1035
|
|
1036 xy_half = ((y_pred & 1) << 1) | (x_pred & 1);
|
|
1037
|
|
1038 src1 = src[0] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride +
|
|
1039 second_half * (stride << 3);
|
|
1040
|
|
1041 table[xy_half] (dest[0] + dest_offset + second_half * (stride << 3),
|
|
1042 src1, stride, height);
|
|
1043
|
|
1044 x_pred /= 2;
|
|
1045 y_pred /= 2;
|
|
1046
|
|
1047 xy_half = ((y_pred & 1) << 1) | (x_pred & 1);
|
|
1048 stride >>= 1;
|
|
1049 height >>= 1;
|
|
1050 src_offset >>= 1; src_offset += second_half * (stride << 2);
|
|
1051 dest_offset >>= 1; dest_offset += second_half * (stride << 2);
|
|
1052
|
|
1053 src1 = src[1] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride;
|
|
1054 src2 = src[2] + src_offset + (x_pred >> 1) + (y_pred >> 1) * stride;
|
|
1055
|
|
1056 table[4+xy_half] (dest[1] + dest_offset, src1, stride, height);
|
|
1057 table[4+xy_half] (dest[2] + dest_offset, src2, stride, height);
|
|
1058 }
|
|
1059
|
|
1060
|
|
1061 static void motion_mp1 (slice_t * slice, motion_t * motion,
|
|
1062 uint8_t * dest[3], int offset, int width,
|
|
1063 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1064 {
|
|
1065 #define bit_buf (slice->bitstream_buf)
|
|
1066 #define bits (slice->bitstream_bits)
|
|
1067 #define bit_ptr (slice->bitstream_ptr)
|
|
1068 int motion_x, motion_y;
|
|
1069
|
|
1070 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1071 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1072 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1073 motion->pmv[0][0] = motion_x;
|
|
1074
|
|
1075 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1076 motion_y = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[0]);
|
|
1077 motion_y = bound_motion_vector (motion_y, motion->f_code[0]);
|
|
1078 motion->pmv[0][1] = motion_y;
|
|
1079
|
|
1080 if (motion->f_code[1]) {
|
|
1081 motion_x <<= 1;
|
|
1082 motion_y <<= 1;
|
|
1083 }
|
|
1084
|
|
1085 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1086 motion->ref[0], offset, width, 16, 0);
|
|
1087 #undef bit_buf
|
|
1088 #undef bits
|
|
1089 #undef bit_ptr
|
|
1090 }
|
|
1091
|
|
1092 static void motion_mp1_reuse (slice_t * slice, motion_t * motion,
|
|
1093 uint8_t * dest[3], int offset, int width,
|
|
1094 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1095 {
|
|
1096 int motion_x, motion_y;
|
|
1097
|
|
1098 motion_x = motion->pmv[0][0];
|
|
1099 motion_y = motion->pmv[0][1];
|
|
1100
|
|
1101 if (motion->f_code[1]) {
|
|
1102 motion_x <<= 1;
|
|
1103 motion_y <<= 1;
|
|
1104 }
|
|
1105
|
|
1106 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1107 motion->ref[0], offset, width, 16, 0);
|
|
1108 }
|
|
1109
|
|
1110 static void motion_fr_frame (slice_t * slice, motion_t * motion,
|
|
1111 uint8_t * dest[3], int offset, int width,
|
|
1112 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1113 {
|
|
1114 #define bit_buf (slice->bitstream_buf)
|
|
1115 #define bits (slice->bitstream_bits)
|
|
1116 #define bit_ptr (slice->bitstream_ptr)
|
|
1117 int motion_x, motion_y;
|
|
1118
|
|
1119 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1120 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1121 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1122 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
|
|
1123
|
|
1124 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1125 motion_y = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1126 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1127 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
|
|
1128
|
|
1129 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1130 motion->ref[0], offset, width, 16, 0);
|
|
1131 #undef bit_buf
|
|
1132 #undef bits
|
|
1133 #undef bit_ptr
|
|
1134 }
|
|
1135
|
|
1136 static void motion_fr_field (slice_t * slice, motion_t * motion,
|
|
1137 uint8_t * dest[3], int offset, int width,
|
|
1138 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1139 {
|
|
1140 #define bit_buf (slice->bitstream_buf)
|
|
1141 #define bits (slice->bitstream_bits)
|
|
1142 #define bit_ptr (slice->bitstream_ptr)
|
|
1143 int motion_x, motion_y;
|
|
1144 int field_select;
|
|
1145
|
|
1146 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1147 field_select = SBITS (bit_buf, 1);
|
|
1148 DUMPBITS (bit_buf, bits, 1);
|
|
1149
|
|
1150 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1151 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1152 motion->pmv[0][0] = motion_x;
|
|
1153
|
|
1154 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1155 motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta (slice,
|
|
1156 motion->f_code[1]);
|
|
1157 //motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1158 motion->pmv[0][1] = motion_y << 1;
|
|
1159
|
|
1160 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1161 motion->ref[0], offset + (field_select & width),
|
|
1162 width * 2, 8, 0);
|
|
1163
|
|
1164 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1165 field_select = SBITS (bit_buf, 1);
|
|
1166 DUMPBITS (bit_buf, bits, 1);
|
|
1167
|
|
1168 motion_x = motion->pmv[1][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1169 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1170 motion->pmv[1][0] = motion_x;
|
|
1171
|
|
1172 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1173 motion_y = (motion->pmv[1][1] >> 1) + get_motion_delta (slice,
|
|
1174 motion->f_code[1]);
|
|
1175 //motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1176 motion->pmv[1][1] = motion_y << 1;
|
|
1177
|
|
1178 motion_block (table, motion_x, motion_y, dest, offset + width,
|
|
1179 motion->ref[0], offset + (field_select & width),
|
|
1180 width * 2, 8, 0);
|
|
1181 #undef bit_buf
|
|
1182 #undef bits
|
|
1183 #undef bit_ptr
|
|
1184 }
|
|
1185
|
|
1186 static int motion_dmv_top_field_first;
|
|
1187 static void motion_fr_dmv (slice_t * slice, motion_t * motion,
|
|
1188 uint8_t * dest[3], int offset, int width,
|
|
1189 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1190 {
|
|
1191 #define bit_buf (slice->bitstream_buf)
|
|
1192 #define bits (slice->bitstream_bits)
|
|
1193 #define bit_ptr (slice->bitstream_ptr)
|
|
1194 int motion_x, motion_y;
|
|
1195 int dmv_x, dmv_y;
|
|
1196 int m;
|
|
1197 int other_x, other_y;
|
|
1198
|
|
1199 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1200 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1201 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1202 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
|
|
1203
|
|
1204 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1205 dmv_x = get_dmv (slice);
|
|
1206
|
|
1207 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1208 motion_y = (motion->pmv[0][1] >> 1) + get_motion_delta (slice,
|
|
1209 motion->f_code[1]);
|
|
1210 //motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1211 motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1;
|
|
1212
|
|
1213 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1214 dmv_y = get_dmv (slice);
|
|
1215
|
|
1216 motion_block (mc_functions.put, motion_x, motion_y, dest, offset,
|
|
1217 motion->ref[0], offset, width * 2, 8, 0);
|
|
1218
|
|
1219 m = motion_dmv_top_field_first ? 1 : 3;
|
|
1220 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
|
|
1221 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1;
|
|
1222 motion_block (mc_functions.avg, other_x, other_y, dest, offset,
|
|
1223 motion->ref[0], offset + width, width * 2, 8, 0);
|
|
1224
|
|
1225 motion_block (mc_functions.put, motion_x, motion_y, dest, offset + width,
|
|
1226 motion->ref[0], offset + width, width * 2, 8, 0);
|
|
1227
|
|
1228 m = motion_dmv_top_field_first ? 3 : 1;
|
|
1229 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x;
|
|
1230 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1;
|
|
1231 motion_block (mc_functions.avg, other_x, other_y, dest, offset + width,
|
|
1232 motion->ref[0], offset, width * 2, 8, 0);
|
|
1233 #undef bit_buf
|
|
1234 #undef bits
|
|
1235 #undef bit_ptr
|
|
1236 }
|
|
1237
|
|
1238 // like motion_frame, but reuse previous motion vectors
|
|
1239 static void motion_fr_reuse (slice_t * slice, motion_t * motion,
|
|
1240 uint8_t * dest[3], int offset, int width,
|
|
1241 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1242 {
|
|
1243 motion_block (table, motion->pmv[0][0], motion->pmv[0][1], dest, offset,
|
|
1244 motion->ref[0], offset, width, 16, 0);
|
|
1245 }
|
|
1246
|
|
1247 // like motion_frame, but use null motion vectors
|
|
1248 static void motion_fr_zero (slice_t * slice, motion_t * motion,
|
|
1249 uint8_t * dest[3], int offset, int width,
|
|
1250 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1251 {
|
|
1252 motion_block (table, 0, 0, dest, offset,
|
|
1253 motion->ref[0], offset, width, 16, 0);
|
|
1254 }
|
|
1255
|
|
1256 // like motion_frame, but parsing without actual motion compensation
|
|
1257 static void motion_fr_conceal (slice_t * slice, motion_t * motion)
|
|
1258 {
|
|
1259 #define bit_buf (slice->bitstream_buf)
|
|
1260 #define bits (slice->bitstream_bits)
|
|
1261 #define bit_ptr (slice->bitstream_ptr)
|
|
1262 int tmp;
|
|
1263
|
|
1264 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1265 tmp = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1266 tmp = bound_motion_vector (tmp, motion->f_code[0]);
|
|
1267 motion->pmv[1][0] = motion->pmv[0][0] = tmp;
|
|
1268
|
|
1269 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1270 tmp = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1271 tmp = bound_motion_vector (tmp, motion->f_code[1]);
|
|
1272 motion->pmv[1][1] = motion->pmv[0][1] = tmp;
|
|
1273
|
|
1274 DUMPBITS (bit_buf, bits, 1); // remove marker_bit
|
|
1275 #undef bit_buf
|
|
1276 #undef bits
|
|
1277 #undef bit_ptr
|
|
1278 }
|
|
1279
|
|
1280 static void motion_fi_field (slice_t * slice, motion_t * motion,
|
|
1281 uint8_t * dest[3], int offset, int width,
|
|
1282 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1283 {
|
|
1284 #define bit_buf (slice->bitstream_buf)
|
|
1285 #define bits (slice->bitstream_bits)
|
|
1286 #define bit_ptr (slice->bitstream_ptr)
|
|
1287 int motion_x, motion_y;
|
|
1288 int field_select;
|
|
1289
|
|
1290 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1291 field_select = UBITS (bit_buf, 1);
|
|
1292 DUMPBITS (bit_buf, bits, 1);
|
|
1293
|
|
1294 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1295 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1296 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1297 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
|
|
1298
|
|
1299 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1300 motion_y = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1301 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1302 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
|
|
1303
|
|
1304 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1305 motion->ref[field_select], offset, width, 16, 0);
|
|
1306 #undef bit_buf
|
|
1307 #undef bits
|
|
1308 #undef bit_ptr
|
|
1309 }
|
|
1310
|
|
1311 static void motion_fi_16x8 (slice_t * slice, motion_t * motion,
|
|
1312 uint8_t * dest[3], int offset, int width,
|
|
1313 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1314 {
|
|
1315 #define bit_buf (slice->bitstream_buf)
|
|
1316 #define bits (slice->bitstream_bits)
|
|
1317 #define bit_ptr (slice->bitstream_ptr)
|
|
1318 int motion_x, motion_y;
|
|
1319 int field_select;
|
|
1320
|
|
1321 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1322 field_select = UBITS (bit_buf, 1);
|
|
1323 DUMPBITS (bit_buf, bits, 1);
|
|
1324
|
|
1325 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1326 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1327 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1328 motion->pmv[0][0] = motion_x;
|
|
1329
|
|
1330 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1331 motion_y = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1332 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1333 motion->pmv[0][1] = motion_y;
|
|
1334
|
|
1335 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1336 motion->ref[field_select], offset, width, 8, 0);
|
|
1337
|
|
1338 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1339 field_select = UBITS (bit_buf, 1);
|
|
1340 DUMPBITS (bit_buf, bits, 1);
|
|
1341
|
|
1342 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1343 motion_x = motion->pmv[1][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1344 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1345 motion->pmv[1][0] = motion_x;
|
|
1346
|
|
1347 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1348 motion_y = motion->pmv[1][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1349 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1350 motion->pmv[1][1] = motion_y;
|
|
1351
|
|
1352 motion_block (table, motion_x, motion_y, dest, offset,
|
|
1353 motion->ref[field_select], offset, width, 8, 1);
|
|
1354 #undef bit_buf
|
|
1355 #undef bits
|
|
1356 #undef bit_ptr
|
|
1357 }
|
|
1358
|
|
1359 static int current_field = 0;
|
|
1360 static void motion_fi_dmv (slice_t * slice, motion_t * motion,
|
|
1361 uint8_t * dest[3], int offset, int width,
|
|
1362 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1363 {
|
|
1364 #define bit_buf (slice->bitstream_buf)
|
|
1365 #define bits (slice->bitstream_bits)
|
|
1366 #define bit_ptr (slice->bitstream_ptr)
|
|
1367 int motion_x, motion_y;
|
|
1368 int dmv_x, dmv_y;
|
|
1369
|
|
1370 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1371 motion_x = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1372 motion_x = bound_motion_vector (motion_x, motion->f_code[0]);
|
|
1373 motion->pmv[1][0] = motion->pmv[0][0] = motion_x;
|
|
1374
|
|
1375 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1376 dmv_x = get_dmv (slice);
|
|
1377
|
|
1378 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1379 motion_y = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1380 motion_y = bound_motion_vector (motion_y, motion->f_code[1]);
|
|
1381 motion->pmv[1][1] = motion->pmv[0][1] = motion_y;
|
|
1382
|
|
1383 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1384 dmv_y = get_dmv (slice);
|
|
1385
|
|
1386 motion_block (mc_functions.put, motion_x, motion_y, dest, offset,
|
|
1387 motion->ref[current_field], offset, width, 16, 0);
|
|
1388
|
|
1389 motion_x = ((motion_x + (motion_x > 0)) >> 1) + dmv_x;
|
|
1390 motion_y = ((motion_y + (motion_y > 0)) >> 1) + dmv_y +
|
|
1391 2 * current_field - 1;
|
|
1392 motion_block (mc_functions.avg, motion_x, motion_y, dest, offset,
|
|
1393 motion->ref[!current_field], offset, width, 16, 0);
|
|
1394 #undef bit_buf
|
|
1395 #undef bits
|
|
1396 #undef bit_ptr
|
|
1397 }
|
|
1398
|
|
1399 static void motion_fi_reuse (slice_t * slice, motion_t * motion,
|
|
1400 uint8_t * dest[3], int offset, int width,
|
|
1401 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1402 {
|
|
1403 motion_block (table, motion->pmv[0][0], motion->pmv[0][1], dest, offset,
|
|
1404 motion->ref[current_field], offset, width, 16, 0);
|
|
1405 }
|
|
1406
|
|
1407 static void motion_fi_zero (slice_t * slice, motion_t * motion,
|
|
1408 uint8_t * dest[3], int offset, int width,
|
|
1409 void (** table) (uint8_t *, uint8_t *, int, int))
|
|
1410 {
|
|
1411 motion_block (table, 0, 0, dest, offset,
|
|
1412 motion->ref[current_field], offset, width, 16, 0);
|
|
1413 }
|
|
1414
|
|
1415 static void motion_fi_conceal (slice_t * slice, motion_t * motion)
|
|
1416 {
|
|
1417 #define bit_buf (slice->bitstream_buf)
|
|
1418 #define bits (slice->bitstream_bits)
|
|
1419 #define bit_ptr (slice->bitstream_ptr)
|
|
1420 int tmp;
|
|
1421
|
|
1422 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1423 DUMPBITS (bit_buf, bits, 1); // remove field_select
|
|
1424
|
|
1425 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1426 tmp = motion->pmv[0][0] + get_motion_delta (slice, motion->f_code[0]);
|
|
1427 tmp = bound_motion_vector (tmp, motion->f_code[0]);
|
|
1428 motion->pmv[1][0] = motion->pmv[0][0] = tmp;
|
|
1429
|
|
1430 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1431 tmp = motion->pmv[0][1] + get_motion_delta (slice, motion->f_code[1]);
|
|
1432 tmp = bound_motion_vector (tmp, motion->f_code[1]);
|
|
1433 motion->pmv[1][1] = motion->pmv[0][1] = tmp;
|
|
1434
|
|
1435 DUMPBITS (bit_buf, bits, 1); // remove marker_bit
|
|
1436 #undef bit_buf
|
|
1437 #undef bits
|
|
1438 #undef bit_ptr
|
|
1439 }
|
|
1440
|
|
1441 #define MOTION(routine,direction,slice,dest,offset,stride) \
|
|
1442 do { \
|
|
1443 if ((direction) & MACROBLOCK_MOTION_FORWARD) \
|
|
1444 routine (&slice, &((slice).f_motion), dest, offset, stride, \
|
|
1445 mc_functions.put); \
|
|
1446 if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
|
|
1447 routine (&slice, &((slice).b_motion), dest, offset, stride, \
|
|
1448 ((direction) & MACROBLOCK_MOTION_FORWARD ? \
|
|
1449 mc_functions.avg : mc_functions.put)); \
|
|
1450 } while (0)
|
|
1451
|
|
1452 #define CHECK_DISPLAY \
|
|
1453 do { \
|
|
1454 if (offset == width) { \
|
|
1455 slice.f_motion.ref[0][0] += 16 * offset; \
|
|
1456 slice.f_motion.ref[0][1] += 4 * offset; \
|
|
1457 slice.f_motion.ref[0][2] += 4 * offset; \
|
|
1458 slice.b_motion.ref[0][0] += 16 * offset; \
|
|
1459 slice.b_motion.ref[0][1] += 4 * offset; \
|
|
1460 slice.b_motion.ref[0][2] += 4 * offset; \
|
|
1461 dest[0] += 16 * offset; \
|
|
1462 dest[1] += 4 * offset; \
|
|
1463 dest[2] += 4 * offset; \
|
|
1464 offset = 0; ++ypos; \
|
|
1465 } \
|
|
1466 } while (0)
|
|
1467
|
|
1468 int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
|
|
1469 {
|
|
1470 #define bit_buf (slice.bitstream_buf)
|
|
1471 #define bits (slice.bitstream_bits)
|
|
1472 #define bit_ptr (slice.bitstream_ptr)
|
|
1473 slice_t slice;
|
|
1474 int macroblock_modes;
|
|
1475 int width;
|
|
1476 int ypos=code-1;
|
|
1477 uint8_t * dest[3];
|
|
1478 int offset;
|
|
1479 uint8_t ** forward_ref[2];
|
|
1480
|
|
1481 width = picture->coded_picture_width;
|
|
1482 offset = ypos * width * 4;
|
|
1483
|
|
1484 forward_ref[0] = picture->forward_reference_frame;
|
|
1485 if (picture->picture_structure != FRAME_PICTURE) {
|
|
1486 offset <<= 1;
|
|
1487 forward_ref[1] = picture->forward_reference_frame;
|
|
1488 current_field = (picture->picture_structure == BOTTOM_FIELD);
|
|
1489 if ((picture->second_field) &&
|
|
1490 (picture->picture_coding_type != B_TYPE))
|
|
1491 forward_ref[picture->picture_structure == TOP_FIELD] =
|
|
1492 picture->current_frame;
|
|
1493 slice.f_motion.ref[1][0] = forward_ref[1][0] + offset * 4 + width;
|
|
1494 slice.f_motion.ref[1][1] = forward_ref[1][1] + offset + (width >> 1);
|
|
1495 slice.f_motion.ref[1][2] = forward_ref[1][2] + offset + (width >> 1);
|
|
1496 slice.b_motion.ref[1][0] =
|
|
1497 picture->backward_reference_frame[0] + offset * 4 + width;
|
|
1498 slice.b_motion.ref[1][1] =
|
|
1499 picture->backward_reference_frame[1] + offset + (width >> 1);
|
|
1500 slice.b_motion.ref[1][2] =
|
|
1501 picture->backward_reference_frame[2] + offset + (width >> 1);
|
|
1502 }
|
|
1503
|
|
1504 slice.f_motion.ref[0][0] = forward_ref[0][0] + offset * 4;
|
|
1505 slice.f_motion.ref[0][1] = forward_ref[0][1] + offset;
|
|
1506 slice.f_motion.ref[0][2] = forward_ref[0][2] + offset;
|
|
1507 slice.f_motion.f_code[0] = picture->f_code[0][0];
|
|
1508 slice.f_motion.f_code[1] = picture->f_code[0][1];
|
|
1509 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1510 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1511 slice.b_motion.ref[0][0] =
|
|
1512 picture->backward_reference_frame[0] + offset * 4;
|
|
1513 slice.b_motion.ref[0][1] =
|
|
1514 picture->backward_reference_frame[1] + offset;
|
|
1515 slice.b_motion.ref[0][2] =
|
|
1516 picture->backward_reference_frame[2] + offset;
|
|
1517 slice.b_motion.f_code[0] = picture->f_code[1][0];
|
|
1518 slice.b_motion.f_code[1] = picture->f_code[1][1];
|
|
1519 slice.b_motion.pmv[0][0] = slice.b_motion.pmv[0][1] = 0;
|
|
1520 slice.b_motion.pmv[1][0] = slice.b_motion.pmv[1][1] = 0;
|
|
1521
|
|
1522 if ((! HACK_MODE) && (!picture->mpeg1) &&
|
|
1523 (picture->picture_coding_type == B_TYPE))
|
|
1524 offset = 0;
|
|
1525
|
|
1526 dest[0] = picture->current_frame[0] + offset * 4;
|
|
1527 dest[1] = picture->current_frame[1] + offset;
|
|
1528 dest[2] = picture->current_frame[2] + offset;
|
|
1529
|
|
1530 switch (picture->picture_structure) {
|
|
1531 case BOTTOM_FIELD:
|
|
1532 dest[0] += width;
|
|
1533 dest[1] += width >> 1;
|
|
1534 dest[2] += width >> 1;
|
|
1535 // follow thru
|
|
1536 case TOP_FIELD:
|
|
1537 width <<= 1;
|
|
1538 }
|
|
1539
|
|
1540 //reset intra dc predictor
|
|
1541 slice.dc_dct_pred[0]=slice.dc_dct_pred[1]=slice.dc_dct_pred[2]=
|
|
1542 1<< (picture->intra_dc_precision + 7) ;
|
|
1543
|
|
1544 bitstream_init (&slice, buffer);
|
|
1545
|
|
1546 slice.quantizer_scale = get_quantizer_scale (&slice,
|
|
1547 picture->q_scale_type);
|
|
1548
|
|
1549 //Ignore intra_slice and all the extra data
|
|
1550 while (bit_buf & 0x80000000) {
|
|
1551 DUMPBITS (bit_buf, bits, 9);
|
|
1552 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1553 }
|
|
1554 DUMPBITS (bit_buf, bits, 1);
|
|
1555
|
|
1556 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1557 offset = get_macroblock_address_increment (&slice) << 4;
|
|
1558
|
|
1559 while (1) {
|
|
1560 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1561
|
|
1562 macroblock_modes =
|
|
1563 get_macroblock_modes (&slice, picture->picture_structure,
|
|
1564 picture->picture_coding_type,
|
|
1565 picture->frame_pred_frame_dct);
|
|
1566
|
|
1567 // maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ?
|
|
1568 if (macroblock_modes & MACROBLOCK_QUANT)
|
|
1569 slice.quantizer_scale =
|
|
1570 get_quantizer_scale (&slice, picture->q_scale_type);
|
|
1571
|
|
1572 if (macroblock_modes & MACROBLOCK_INTRA) {
|
|
1573
|
|
1574 int DCT_offset, DCT_stride;
|
|
1575
|
|
1576 if (picture->concealment_motion_vectors) {
|
|
1577 if (picture->picture_structure == FRAME_PICTURE)
|
|
1578 motion_fr_conceal (&slice, &slice.f_motion);
|
|
1579 else
|
|
1580 motion_fi_conceal (&slice, &slice.f_motion);
|
|
1581 } else {
|
|
1582 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1583 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1584 slice.b_motion.pmv[0][0] = slice.b_motion.pmv[0][1] = 0;
|
|
1585 slice.b_motion.pmv[1][0] = slice.b_motion.pmv[1][1] = 0;
|
|
1586 }
|
|
1587
|
|
1588 if (macroblock_modes & DCT_TYPE_INTERLACED) {
|
|
1589 DCT_offset = width;
|
|
1590 DCT_stride = width * 2;
|
|
1591 } else {
|
|
1592 DCT_offset = width * 8;
|
|
1593 DCT_stride = width;
|
|
1594 }
|
|
1595
|
|
1596 // Decode lum blocks
|
|
1597 slice_intra_DCT (picture, &slice, 0,
|
|
1598 dest[0] + offset, DCT_stride);
|
|
1599 slice_intra_DCT (picture, &slice, 0,
|
|
1600 dest[0] + offset + 8, DCT_stride);
|
|
1601 slice_intra_DCT (picture, &slice, 0,
|
|
1602 dest[0] + offset + DCT_offset, DCT_stride);
|
|
1603 slice_intra_DCT (picture, &slice, 0,
|
|
1604 dest[0] + offset + DCT_offset + 8, DCT_stride);
|
|
1605
|
|
1606 // Decode chroma blocks
|
|
1607 slice_intra_DCT (picture, &slice, 1,
|
|
1608 dest[1] + (offset>>1), width>>1);
|
|
1609 slice_intra_DCT (picture, &slice, 2,
|
|
1610 dest[2] + (offset>>1), width>>1);
|
|
1611
|
|
1612 if (picture->picture_coding_type == D_TYPE) {
|
|
1613 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1614 DUMPBITS (bit_buf, bits, 1);
|
|
1615 }
|
|
1616 } else {
|
|
1617
|
|
1618 if (picture->mpeg1) {
|
|
1619 if ((macroblock_modes & MOTION_TYPE_MASK) == MC_FRAME)
|
|
1620 MOTION (motion_mp1, macroblock_modes, slice,
|
|
1621 dest, offset,width);
|
|
1622 else {
|
|
1623 // non-intra mb without forward mv in a P picture
|
|
1624 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1625 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1626
|
|
1627 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD, slice,
|
|
1628 dest, offset, width);
|
|
1629 }
|
|
1630 } else if (picture->picture_structure == FRAME_PICTURE)
|
|
1631 switch (macroblock_modes & MOTION_TYPE_MASK) {
|
|
1632 case MC_FRAME:
|
|
1633 MOTION (motion_fr_frame, macroblock_modes, slice,
|
|
1634 dest, offset, width);
|
|
1635 break;
|
|
1636
|
|
1637 case MC_FIELD:
|
|
1638 MOTION (motion_fr_field, macroblock_modes, slice,
|
|
1639 dest, offset, width);
|
|
1640 break;
|
|
1641
|
|
1642 case MC_DMV:
|
|
1643 motion_dmv_top_field_first = picture->top_field_first;
|
|
1644 MOTION (motion_fr_dmv, MACROBLOCK_MOTION_FORWARD, slice,
|
|
1645 dest, offset, width);
|
|
1646 break;
|
|
1647
|
|
1648 case 0:
|
|
1649 // non-intra mb without forward mv in a P picture
|
|
1650 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1651 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1652
|
|
1653 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD, slice,
|
|
1654 dest, offset, width);
|
|
1655 break;
|
|
1656 }
|
|
1657 else
|
|
1658 switch (macroblock_modes & MOTION_TYPE_MASK) {
|
|
1659 case MC_FIELD:
|
|
1660 MOTION (motion_fi_field, macroblock_modes, slice,
|
|
1661 dest, offset, width);
|
|
1662 break;
|
|
1663
|
|
1664 case MC_16X8:
|
|
1665 MOTION (motion_fi_16x8, macroblock_modes, slice,
|
|
1666 dest, offset, width);
|
|
1667 break;
|
|
1668
|
|
1669 case MC_DMV:
|
|
1670 motion_dmv_top_field_first = picture->top_field_first;
|
|
1671 MOTION (motion_fi_dmv, MACROBLOCK_MOTION_FORWARD, slice,
|
|
1672 dest, offset, width);
|
|
1673 break;
|
|
1674
|
|
1675 case 0:
|
|
1676 // non-intra mb without forward mv in a P picture
|
|
1677 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1678 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1679
|
|
1680 MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD, slice,
|
|
1681 dest, offset, width);
|
|
1682 break;
|
|
1683 }
|
|
1684
|
|
1685 //6.3.17.4 Coded block pattern
|
|
1686 if (macroblock_modes & MACROBLOCK_PATTERN) {
|
|
1687 int coded_block_pattern;
|
|
1688 int DCT_offset, DCT_stride;
|
|
1689
|
|
1690 if (macroblock_modes & DCT_TYPE_INTERLACED) {
|
|
1691 DCT_offset = width;
|
|
1692 DCT_stride = width * 2;
|
|
1693 } else {
|
|
1694 DCT_offset = width * 8;
|
|
1695 DCT_stride = width;
|
|
1696 }
|
|
1697
|
|
1698 coded_block_pattern = get_coded_block_pattern (&slice);
|
|
1699
|
|
1700 // Decode lum blocks
|
|
1701
|
|
1702 if (coded_block_pattern & 0x20)
|
|
1703 slice_non_intra_DCT (picture, &slice,
|
|
1704 dest[0] + offset, DCT_stride);
|
|
1705 if (coded_block_pattern & 0x10)
|
|
1706 slice_non_intra_DCT (picture, &slice,
|
|
1707 dest[0] + offset + 8, DCT_stride);
|
|
1708 if (coded_block_pattern & 0x08)
|
|
1709 slice_non_intra_DCT (picture, &slice,
|
|
1710 dest[0] + offset + DCT_offset,
|
|
1711 DCT_stride);
|
|
1712 if (coded_block_pattern & 0x04)
|
|
1713 slice_non_intra_DCT (picture, &slice,
|
|
1714 dest[0] + offset + DCT_offset + 8,
|
|
1715 DCT_stride);
|
|
1716
|
|
1717 // Decode chroma blocks
|
|
1718
|
|
1719 if (coded_block_pattern & 0x2)
|
|
1720 slice_non_intra_DCT (picture, &slice,
|
|
1721 dest[1] + (offset>>1), width >> 1);
|
|
1722 if (coded_block_pattern & 0x1)
|
|
1723 slice_non_intra_DCT (picture, &slice,
|
|
1724 dest[2] + (offset>>1), width >> 1);
|
|
1725 }
|
|
1726
|
|
1727 slice.dc_dct_pred[0]=slice.dc_dct_pred[1]=slice.dc_dct_pred[2]=
|
|
1728 1 << (picture->intra_dc_precision + 7);
|
|
1729 }
|
|
1730
|
|
1731 // printf("[%d]",slice.quantizer_scale);
|
|
1732 // printf("[%d,%d]",offset>>4,ypos);
|
|
1733 quant_store[ypos+1][(offset>>4)+1] = slice.quantizer_scale;
|
|
1734
|
|
1735 offset += 16;
|
|
1736 CHECK_DISPLAY;
|
|
1737
|
|
1738 NEEDBITS (bit_buf, bits, bit_ptr);
|
|
1739
|
|
1740 if (bit_buf & 0x80000000) {
|
|
1741 DUMPBITS (bit_buf, bits, 1);
|
|
1742 } else {
|
|
1743 int mba_inc;
|
|
1744
|
|
1745 mba_inc = get_macroblock_address_increment (&slice);
|
|
1746 if (!mba_inc)
|
|
1747 break;
|
|
1748
|
|
1749 //reset intra dc predictor on skipped block
|
|
1750 slice.dc_dct_pred[0]=slice.dc_dct_pred[1]=slice.dc_dct_pred[2]=
|
|
1751 1<< (picture->intra_dc_precision + 7);
|
|
1752
|
|
1753 //handling of skipped mb's differs between P_TYPE and B_TYPE
|
|
1754 //pictures
|
|
1755 if (picture->picture_coding_type == P_TYPE) {
|
|
1756 slice.f_motion.pmv[0][0] = slice.f_motion.pmv[0][1] = 0;
|
|
1757 slice.f_motion.pmv[1][0] = slice.f_motion.pmv[1][1] = 0;
|
|
1758
|
|
1759 do {
|
|
1760 if (picture->picture_structure == FRAME_PICTURE)
|
|
1761 MOTION (motion_fr_zero, MACROBLOCK_MOTION_FORWARD,
|
|
1762 slice, dest, offset, width);
|
|
1763 else
|
|
1764 MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD,
|
|
1765 slice, dest, offset, width);
|
|
1766
|
|
1767 quant_store[ypos+1][(offset>>4)+1] = slice.quantizer_scale;
|
|
1768 // printf("[%d,%d]",offset>>4,ypos);
|
|
1769 offset += 16;
|
|
1770 CHECK_DISPLAY;
|
|
1771 } while (--mba_inc);
|
|
1772 } else {
|
|
1773 do {
|
|
1774 if (picture->mpeg1)
|
|
1775 MOTION (motion_mp1_reuse, macroblock_modes,
|
|
1776 slice, dest, offset, width);
|
|
1777 else if (picture->picture_structure == FRAME_PICTURE)
|
|
1778 MOTION (motion_fr_reuse, macroblock_modes,
|
|
1779 slice, dest, offset, width);
|
|
1780 else
|
|
1781 MOTION (motion_fi_reuse, macroblock_modes,
|
|
1782 slice, dest, offset, width);
|
|
1783
|
|
1784 quant_store[ypos+1][(offset>>4)+1] = slice.quantizer_scale;
|
|
1785 // printf("[%d,%d]",offset>>4,ypos);
|
|
1786 offset += 16;
|
|
1787 CHECK_DISPLAY;
|
|
1788 } while (--mba_inc);
|
|
1789 }
|
|
1790 }
|
|
1791 }
|
|
1792
|
|
1793 return 0;
|
|
1794 #undef bit_buf
|
|
1795 #undef bits
|
|
1796 #undef bit_ptr
|
|
1797 }
|