Mercurial > mplayer.hg
annotate libmpeg2/slice.c @ 37104:91b00a4407cd
demux_real: Improve buffer allocation for interleaved audio handling.
Allocate buffers where they are needed.
This avoids code duplication, allocating them when they are not
needed, and might avoid a crash if an audio stream is specified
via -aid that does not exist in the headers but does exist in the
file since then we might run the deinterleaving without having
the buffers allocated first (note: I have not tested this can
actually happen).
| author | reimar |
|---|---|
| date | Tue, 13 May 2014 21:06:38 +0000 |
| parents | 60709ef498be |
| children |
| rev | line source |
|---|---|
| 1 | 1 /* |
| 2 * slice.c | |
| 12932 | 3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> |
| 4 * Copyright (C) 2003 Peter Gubanov <peter@elecard.net.ru> | |
| 9852 | 5 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> |
| 1 | 6 * |
| 7 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. | |
| 9852 | 8 * See http://libmpeg2.sourceforge.net/ for updates. |
| 1 | 9 * |
| 10 * mpeg2dec is free software; you can redistribute it and/or modify | |
| 11 * it under the terms of the GNU General Public License as published by | |
| 12 * the Free Software Foundation; either version 2 of the License, or | |
| 13 * (at your option) any later version. | |
| 14 * | |
| 15 * mpeg2dec is distributed in the hope that it will be useful, | |
| 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 * GNU General Public License for more details. | |
| 19 * | |
| 20 * You should have received a copy of the GNU General Public License | |
| 21 * along with this program; if not, write to the Free Software | |
| 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 31329 | 23 * |
| 24 * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes. | |
| 25 * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ | |
| 26 * $Id$ | |
| 1 | 27 */ |
| 28 | |
| 29 #include "config.h" | |
| 30 | |
| 31 #include <inttypes.h> | |
| 32 | |
| 9852 | 33 #include "mpeg2.h" |
| 12932 | 34 #include "attributes.h" |
| 1 | 35 #include "mpeg2_internal.h" |
| 36 | |
| 9852 | 37 extern mpeg2_mc_t mpeg2_mc; |
| 38 extern void (* mpeg2_idct_copy) (int16_t * block, uint8_t * dest, int stride); | |
| 39 extern void (* mpeg2_idct_add) (int last, int16_t * block, | |
| 40 uint8_t * dest, int stride); | |
| 41 extern void (* mpeg2_cpu_state_save) (cpu_state_t * state); | |
| 42 extern void (* mpeg2_cpu_state_restore) (cpu_state_t * state); | |
|
2756
b4d0cc1fd14b
workaround for MBC/MBR difference (wrong libavcodec-mplayer version pair)
arpi
parents:
142
diff
changeset
|
43 |
| 1 | 44 #include "vlc.h" |
| 45 | |
| 12932 | 46 static inline int get_macroblock_modes (mpeg2_decoder_t * const decoder) |
| 1 | 47 { |
| 9852 | 48 #define bit_buf (decoder->bitstream_buf) |
| 49 #define bits (decoder->bitstream_bits) | |
| 50 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 51 int macroblock_modes; |
| 9852 | 52 const MBtab * tab; |
| 1 | 53 |
| 9852 | 54 switch (decoder->coding_type) { |
| 1 | 55 case I_TYPE: |
| 56 | |
| 57 tab = MB_I + UBITS (bit_buf, 1); | |
| 58 DUMPBITS (bit_buf, bits, tab->len); | |
| 59 macroblock_modes = tab->modes; | |
| 60 | |
| 9852 | 61 if ((! (decoder->frame_pred_frame_dct)) && |
| 62 (decoder->picture_structure == FRAME_PICTURE)) { | |
| 1 | 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 | |
| 9852 | 75 if (decoder->picture_structure != FRAME_PICTURE) { |
| 1 | 76 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) { |
| 12932 | 77 macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT; |
| 1 | 78 DUMPBITS (bit_buf, bits, 2); |
| 79 } | |
| 12932 | 80 return macroblock_modes | MACROBLOCK_MOTION_FORWARD; |
| 9852 | 81 } else if (decoder->frame_pred_frame_dct) { |
| 1 | 82 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) |
| 12932 | 83 macroblock_modes |= MC_FRAME << MOTION_TYPE_SHIFT; |
| 84 return macroblock_modes | MACROBLOCK_MOTION_FORWARD; | |
| 1 | 85 } else { |
| 86 if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) { | |
| 12932 | 87 macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT; |
| 1 | 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 } | |
| 12932 | 94 return macroblock_modes | MACROBLOCK_MOTION_FORWARD; |
| 1 | 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 | |
| 9852 | 103 if (decoder->picture_structure != FRAME_PICTURE) { |
| 1 | 104 if (! (macroblock_modes & MACROBLOCK_INTRA)) { |
| 12932 | 105 macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT; |
| 1 | 106 DUMPBITS (bit_buf, bits, 2); |
| 107 } | |
| 108 return macroblock_modes; | |
| 9852 | 109 } else if (decoder->frame_pred_frame_dct) { |
| 36 | 110 /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */ |
| 12932 | 111 macroblock_modes |= MC_FRAME << MOTION_TYPE_SHIFT; |
| 1 | 112 return macroblock_modes; |
| 113 } else { | |
| 114 if (macroblock_modes & MACROBLOCK_INTRA) | |
| 115 goto intra; | |
| 12932 | 116 macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT; |
| 1 | 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 | |
| 12932 | 139 static inline void get_quantizer_scale (mpeg2_decoder_t * const decoder) |
| 1 | 140 { |
| 9852 | 141 #define bit_buf (decoder->bitstream_buf) |
| 142 #define bits (decoder->bitstream_bits) | |
| 143 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 144 |
| 145 int quantizer_scale_code; | |
| 146 | |
| 147 quantizer_scale_code = UBITS (bit_buf, 5); | |
| 148 DUMPBITS (bit_buf, bits, 5); | |
| 31329 | 149 decoder->quantizer_scale = decoder->quantizer_scales[quantizer_scale_code]; |
| 1 | 150 |
| 12932 | 151 decoder->quantizer_matrix[0] = |
| 152 decoder->quantizer_prescale[0][quantizer_scale_code]; | |
| 153 decoder->quantizer_matrix[1] = | |
| 154 decoder->quantizer_prescale[1][quantizer_scale_code]; | |
| 155 decoder->quantizer_matrix[2] = | |
| 156 decoder->chroma_quantizer[0][quantizer_scale_code]; | |
| 157 decoder->quantizer_matrix[3] = | |
| 158 decoder->chroma_quantizer[1][quantizer_scale_code]; | |
| 1 | 159 #undef bit_buf |
| 160 #undef bits | |
| 161 #undef bit_ptr | |
| 162 } | |
| 163 | |
| 12932 | 164 static inline int get_motion_delta (mpeg2_decoder_t * const decoder, |
| 9852 | 165 const int f_code) |
| 1 | 166 { |
| 9852 | 167 #define bit_buf (decoder->bitstream_buf) |
| 168 #define bits (decoder->bitstream_bits) | |
| 169 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 170 |
| 171 int delta; | |
| 172 int sign; | |
| 9852 | 173 const MVtab * tab; |
| 1 | 174 |
| 175 if (bit_buf & 0x80000000) { | |
| 176 DUMPBITS (bit_buf, bits, 1); | |
| 177 return 0; | |
| 178 } else if (bit_buf >= 0x0c000000) { | |
| 179 | |
| 180 tab = MV_4 + UBITS (bit_buf, 4); | |
| 181 delta = (tab->delta << f_code) + 1; | |
| 182 bits += tab->len + f_code + 1; | |
| 183 bit_buf <<= tab->len; | |
| 184 | |
| 185 sign = SBITS (bit_buf, 1); | |
| 186 bit_buf <<= 1; | |
| 187 | |
| 188 if (f_code) | |
| 189 delta += UBITS (bit_buf, f_code); | |
| 190 bit_buf <<= f_code; | |
| 191 | |
| 192 return (delta ^ sign) - sign; | |
| 193 | |
| 194 } else { | |
| 195 | |
| 196 tab = MV_10 + UBITS (bit_buf, 10); | |
| 197 delta = (tab->delta << f_code) + 1; | |
| 198 bits += tab->len + 1; | |
| 199 bit_buf <<= tab->len; | |
| 200 | |
| 201 sign = SBITS (bit_buf, 1); | |
| 202 bit_buf <<= 1; | |
| 203 | |
| 204 if (f_code) { | |
| 205 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 206 delta += UBITS (bit_buf, f_code); | |
| 207 DUMPBITS (bit_buf, bits, f_code); | |
| 208 } | |
| 209 | |
| 210 return (delta ^ sign) - sign; | |
| 211 | |
| 212 } | |
| 213 #undef bit_buf | |
| 214 #undef bits | |
| 215 #undef bit_ptr | |
| 216 } | |
| 217 | |
| 9852 | 218 static inline int bound_motion_vector (const int vector, const int f_code) |
| 1 | 219 { |
| 9852 | 220 return ((int32_t)vector << (27 - f_code)) >> (27 - f_code); |
| 1 | 221 } |
| 222 | |
| 12932 | 223 static inline int get_dmv (mpeg2_decoder_t * const decoder) |
| 1 | 224 { |
| 9852 | 225 #define bit_buf (decoder->bitstream_buf) |
| 226 #define bits (decoder->bitstream_bits) | |
| 227 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 228 |
| 9852 | 229 const DMVtab * tab; |
| 1 | 230 |
| 231 tab = DMV_2 + UBITS (bit_buf, 2); | |
| 232 DUMPBITS (bit_buf, bits, tab->len); | |
| 233 return tab->dmv; | |
| 234 #undef bit_buf | |
| 235 #undef bits | |
| 236 #undef bit_ptr | |
| 237 } | |
| 238 | |
| 12932 | 239 static inline int get_coded_block_pattern (mpeg2_decoder_t * const decoder) |
| 1 | 240 { |
| 9852 | 241 #define bit_buf (decoder->bitstream_buf) |
| 242 #define bits (decoder->bitstream_bits) | |
| 243 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 244 |
| 9852 | 245 const CBPtab * tab; |
| 1 | 246 |
| 247 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 248 | |
| 249 if (bit_buf >= 0x20000000) { | |
| 250 | |
| 9852 | 251 tab = CBP_7 + (UBITS (bit_buf, 7) - 16); |
| 1 | 252 DUMPBITS (bit_buf, bits, tab->len); |
| 253 return tab->cbp; | |
| 254 | |
| 255 } else { | |
| 256 | |
| 257 tab = CBP_9 + UBITS (bit_buf, 9); | |
| 258 DUMPBITS (bit_buf, bits, tab->len); | |
| 259 return tab->cbp; | |
| 260 } | |
| 261 | |
| 262 #undef bit_buf | |
| 263 #undef bits | |
| 264 #undef bit_ptr | |
| 265 } | |
| 266 | |
| 12932 | 267 static inline int get_luma_dc_dct_diff (mpeg2_decoder_t * const decoder) |
| 1 | 268 { |
| 9852 | 269 #define bit_buf (decoder->bitstream_buf) |
| 270 #define bits (decoder->bitstream_bits) | |
| 271 #define bit_ptr (decoder->bitstream_ptr) | |
| 272 const DCtab * tab; | |
| 1 | 273 int size; |
| 274 int dc_diff; | |
| 275 | |
| 276 if (bit_buf < 0xf8000000) { | |
| 277 tab = DC_lum_5 + UBITS (bit_buf, 5); | |
| 278 size = tab->size; | |
| 279 if (size) { | |
| 280 bits += tab->len + size; | |
| 281 bit_buf <<= tab->len; | |
| 282 dc_diff = | |
| 283 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size); | |
| 284 bit_buf <<= size; | |
| 12932 | 285 return dc_diff << decoder->intra_dc_precision; |
| 1 | 286 } else { |
| 287 DUMPBITS (bit_buf, bits, 3); | |
| 288 return 0; | |
| 289 } | |
| 290 } else { | |
| 9852 | 291 tab = DC_long + (UBITS (bit_buf, 9) - 0x1e0); |
| 1 | 292 size = tab->size; |
| 293 DUMPBITS (bit_buf, bits, tab->len); | |
| 294 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 295 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size); | |
| 296 DUMPBITS (bit_buf, bits, size); | |
| 12932 | 297 return dc_diff << decoder->intra_dc_precision; |
| 1 | 298 } |
| 299 #undef bit_buf | |
| 300 #undef bits | |
| 301 #undef bit_ptr | |
| 302 } | |
| 303 | |
| 12932 | 304 static inline int get_chroma_dc_dct_diff (mpeg2_decoder_t * const decoder) |
| 1 | 305 { |
| 9852 | 306 #define bit_buf (decoder->bitstream_buf) |
| 307 #define bits (decoder->bitstream_bits) | |
| 308 #define bit_ptr (decoder->bitstream_ptr) | |
| 309 const DCtab * tab; | |
| 1 | 310 int size; |
| 311 int dc_diff; | |
| 312 | |
| 313 if (bit_buf < 0xf8000000) { | |
| 314 tab = DC_chrom_5 + UBITS (bit_buf, 5); | |
| 315 size = tab->size; | |
| 316 if (size) { | |
| 317 bits += tab->len + size; | |
| 318 bit_buf <<= tab->len; | |
| 319 dc_diff = | |
| 320 UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size); | |
| 321 bit_buf <<= size; | |
| 12932 | 322 return dc_diff << decoder->intra_dc_precision; |
| 1 | 323 } else { |
| 324 DUMPBITS (bit_buf, bits, 2); | |
| 325 return 0; | |
| 326 } | |
| 327 } else { | |
| 9852 | 328 tab = DC_long + (UBITS (bit_buf, 10) - 0x3e0); |
| 1 | 329 size = tab->size; |
| 330 DUMPBITS (bit_buf, bits, tab->len + 1); | |
| 331 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 332 dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size); | |
| 333 DUMPBITS (bit_buf, bits, size); | |
| 12932 | 334 return dc_diff << decoder->intra_dc_precision; |
| 1 | 335 } |
| 336 #undef bit_buf | |
| 337 #undef bits | |
| 338 #undef bit_ptr | |
| 339 } | |
| 340 | |
| 12932 | 341 #define SATURATE(val) \ |
| 342 do { \ | |
| 343 val <<= 4; \ | |
| 344 if (unlikely (val != (int16_t) val)) \ | |
| 345 val = (SBITS (val, 1) ^ 2047) << 4; \ | |
| 1 | 346 } while (0) |
| 347 | |
| 12932 | 348 static void get_intra_block_B14 (mpeg2_decoder_t * const decoder, |
| 349 const uint16_t * const quant_matrix) | |
| 1 | 350 { |
| 351 int i; | |
| 352 int j; | |
| 353 int val; | |
| 12932 | 354 const uint8_t * const scan = decoder->scan; |
| 1 | 355 int mismatch; |
| 9852 | 356 const DCTtab * tab; |
| 1 | 357 uint32_t bit_buf; |
| 358 int bits; | |
| 9852 | 359 const uint8_t * bit_ptr; |
| 12932 | 360 int16_t * const dest = decoder->DCTblock; |
| 1 | 361 |
| 362 i = 0; | |
| 363 mismatch = ~dest[0]; | |
| 364 | |
| 9852 | 365 bit_buf = decoder->bitstream_buf; |
| 366 bits = decoder->bitstream_bits; | |
| 367 bit_ptr = decoder->bitstream_ptr; | |
| 1 | 368 |
| 369 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 370 | |
| 371 while (1) { | |
| 372 if (bit_buf >= 0x28000000) { | |
| 373 | |
| 9852 | 374 tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 375 |
| 376 i += tab->run; | |
| 377 if (i >= 64) | |
| 36 | 378 break; /* end of block */ |
| 1 | 379 |
| 380 normal_code: | |
| 381 j = scan[i]; | |
| 382 bit_buf <<= tab->len; | |
| 383 bits += tab->len + 1; | |
| 12932 | 384 val = (tab->level * quant_matrix[j]) >> 4; |
| 1 | 385 |
| 36 | 386 /* if (bitstream_get (1)) val = -val; */ |
| 1 | 387 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1); |
| 388 | |
| 389 SATURATE (val); | |
| 390 dest[j] = val; | |
| 391 mismatch ^= val; | |
| 392 | |
| 393 bit_buf <<= 1; | |
| 394 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 395 | |
| 396 continue; | |
| 397 | |
| 398 } else if (bit_buf >= 0x04000000) { | |
| 399 | |
| 9852 | 400 tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4); |
| 1 | 401 |
| 402 i += tab->run; | |
| 403 if (i < 64) | |
| 404 goto normal_code; | |
| 405 | |
| 36 | 406 /* escape code */ |
| 1 | 407 |
| 408 i += UBITS (bit_buf << 6, 6) - 64; | |
| 409 if (i >= 64) | |
| 36 | 410 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 411 |
| 412 j = scan[i]; | |
| 413 | |
| 414 DUMPBITS (bit_buf, bits, 12); | |
| 415 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 12932 | 416 val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16; |
| 1 | 417 |
| 418 SATURATE (val); | |
| 419 dest[j] = val; | |
| 420 mismatch ^= val; | |
| 421 | |
| 422 DUMPBITS (bit_buf, bits, 12); | |
| 423 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 424 | |
| 425 continue; | |
| 426 | |
| 427 } else if (bit_buf >= 0x02000000) { | |
| 9852 | 428 tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8); |
| 1 | 429 i += tab->run; |
| 430 if (i < 64) | |
| 431 goto normal_code; | |
| 432 } else if (bit_buf >= 0x00800000) { | |
| 9852 | 433 tab = DCT_13 + (UBITS (bit_buf, 13) - 16); |
| 1 | 434 i += tab->run; |
| 435 if (i < 64) | |
| 436 goto normal_code; | |
| 437 } else if (bit_buf >= 0x00200000) { | |
| 9852 | 438 tab = DCT_15 + (UBITS (bit_buf, 15) - 16); |
| 1 | 439 i += tab->run; |
| 440 if (i < 64) | |
| 441 goto normal_code; | |
| 442 } else { | |
| 443 tab = DCT_16 + UBITS (bit_buf, 16); | |
| 444 bit_buf <<= 16; | |
| 445 GETWORD (bit_buf, bits + 16, bit_ptr); | |
| 446 i += tab->run; | |
| 447 if (i < 64) | |
| 448 goto normal_code; | |
| 449 } | |
| 36 | 450 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 451 } |
| 12932 | 452 dest[63] ^= mismatch & 16; |
| 27572 | 453 DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */ |
| 9852 | 454 decoder->bitstream_buf = bit_buf; |
| 455 decoder->bitstream_bits = bits; | |
| 456 decoder->bitstream_ptr = bit_ptr; | |
| 1 | 457 } |
| 458 | |
| 12932 | 459 static void get_intra_block_B15 (mpeg2_decoder_t * const decoder, |
| 460 const uint16_t * const quant_matrix) | |
| 1 | 461 { |
| 462 int i; | |
| 463 int j; | |
| 464 int val; | |
| 12932 | 465 const uint8_t * const scan = decoder->scan; |
| 1 | 466 int mismatch; |
| 9852 | 467 const DCTtab * tab; |
| 1 | 468 uint32_t bit_buf; |
| 469 int bits; | |
| 9852 | 470 const uint8_t * bit_ptr; |
| 12932 | 471 int16_t * const dest = decoder->DCTblock; |
| 1 | 472 |
| 473 i = 0; | |
| 474 mismatch = ~dest[0]; | |
| 475 | |
| 9852 | 476 bit_buf = decoder->bitstream_buf; |
| 477 bits = decoder->bitstream_bits; | |
| 478 bit_ptr = decoder->bitstream_ptr; | |
| 1 | 479 |
| 480 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 481 | |
| 482 while (1) { | |
| 483 if (bit_buf >= 0x04000000) { | |
| 484 | |
| 9852 | 485 tab = DCT_B15_8 + (UBITS (bit_buf, 8) - 4); |
| 1 | 486 |
| 487 i += tab->run; | |
| 488 if (i < 64) { | |
| 489 | |
| 490 normal_code: | |
| 491 j = scan[i]; | |
| 492 bit_buf <<= tab->len; | |
| 493 bits += tab->len + 1; | |
| 12932 | 494 val = (tab->level * quant_matrix[j]) >> 4; |
| 1 | 495 |
| 36 | 496 /* if (bitstream_get (1)) val = -val; */ |
| 1 | 497 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1); |
| 498 | |
| 499 SATURATE (val); | |
| 500 dest[j] = val; | |
| 501 mismatch ^= val; | |
| 502 | |
| 503 bit_buf <<= 1; | |
| 504 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 505 | |
| 506 continue; | |
| 507 | |
| 508 } else { | |
| 509 | |
| 36 | 510 /* end of block. I commented out this code because if we */ |
| 27572 | 511 /* do not exit here we will still exit at the later test :) */ |
| 1 | 512 |
| 36 | 513 /* if (i >= 128) break; */ /* end of block */ |
| 1 | 514 |
| 36 | 515 /* escape code */ |
| 1 | 516 |
| 517 i += UBITS (bit_buf << 6, 6) - 64; | |
| 518 if (i >= 64) | |
| 36 | 519 break; /* illegal, check against buffer overflow */ |
| 1 | 520 |
| 521 j = scan[i]; | |
| 522 | |
| 523 DUMPBITS (bit_buf, bits, 12); | |
| 524 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 12932 | 525 val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16; |
| 1 | 526 |
| 527 SATURATE (val); | |
| 528 dest[j] = val; | |
| 529 mismatch ^= val; | |
| 530 | |
| 531 DUMPBITS (bit_buf, bits, 12); | |
| 532 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 533 | |
| 534 continue; | |
| 535 | |
| 536 } | |
| 537 } else if (bit_buf >= 0x02000000) { | |
| 9852 | 538 tab = DCT_B15_10 + (UBITS (bit_buf, 10) - 8); |
| 1 | 539 i += tab->run; |
| 540 if (i < 64) | |
| 541 goto normal_code; | |
| 542 } else if (bit_buf >= 0x00800000) { | |
| 9852 | 543 tab = DCT_13 + (UBITS (bit_buf, 13) - 16); |
| 1 | 544 i += tab->run; |
| 545 if (i < 64) | |
| 546 goto normal_code; | |
| 547 } else if (bit_buf >= 0x00200000) { | |
| 9852 | 548 tab = DCT_15 + (UBITS (bit_buf, 15) - 16); |
| 1 | 549 i += tab->run; |
| 550 if (i < 64) | |
| 551 goto normal_code; | |
| 552 } else { | |
| 553 tab = DCT_16 + UBITS (bit_buf, 16); | |
| 554 bit_buf <<= 16; | |
| 555 GETWORD (bit_buf, bits + 16, bit_ptr); | |
| 556 i += tab->run; | |
| 557 if (i < 64) | |
| 558 goto normal_code; | |
| 559 } | |
| 36 | 560 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 561 } |
| 12932 | 562 dest[63] ^= mismatch & 16; |
| 27572 | 563 DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */ |
| 9852 | 564 decoder->bitstream_buf = bit_buf; |
| 565 decoder->bitstream_bits = bits; | |
| 566 decoder->bitstream_ptr = bit_ptr; | |
| 1 | 567 } |
| 568 | |
| 12932 | 569 static int get_non_intra_block (mpeg2_decoder_t * const decoder, |
| 570 const uint16_t * const quant_matrix) | |
| 1 | 571 { |
| 572 int i; | |
| 573 int j; | |
| 574 int val; | |
| 12932 | 575 const uint8_t * const scan = decoder->scan; |
| 1 | 576 int mismatch; |
| 9852 | 577 const DCTtab * tab; |
| 1 | 578 uint32_t bit_buf; |
| 579 int bits; | |
| 9852 | 580 const uint8_t * bit_ptr; |
| 12932 | 581 int16_t * const dest = decoder->DCTblock; |
| 1 | 582 |
| 583 i = -1; | |
| 12932 | 584 mismatch = -1; |
| 1 | 585 |
| 9852 | 586 bit_buf = decoder->bitstream_buf; |
| 587 bits = decoder->bitstream_bits; | |
| 588 bit_ptr = decoder->bitstream_ptr; | |
| 1 | 589 |
| 590 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 591 if (bit_buf >= 0x28000000) { | |
| 9852 | 592 tab = DCT_B14DC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 593 goto entry_1; |
| 594 } else | |
| 595 goto entry_2; | |
| 596 | |
| 597 while (1) { | |
| 598 if (bit_buf >= 0x28000000) { | |
| 599 | |
| 9852 | 600 tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 601 |
| 602 entry_1: | |
| 603 i += tab->run; | |
| 604 if (i >= 64) | |
| 36 | 605 break; /* end of block */ |
| 1 | 606 |
| 607 normal_code: | |
| 608 j = scan[i]; | |
| 609 bit_buf <<= tab->len; | |
| 610 bits += tab->len + 1; | |
| 12932 | 611 val = ((2 * tab->level + 1) * quant_matrix[j]) >> 5; |
| 1 | 612 |
| 36 | 613 /* if (bitstream_get (1)) val = -val; */ |
| 1 | 614 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1); |
| 615 | |
| 616 SATURATE (val); | |
| 617 dest[j] = val; | |
| 618 mismatch ^= val; | |
| 619 | |
| 620 bit_buf <<= 1; | |
| 621 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 622 | |
| 623 continue; | |
| 624 | |
| 625 } | |
| 626 | |
| 627 entry_2: | |
| 628 if (bit_buf >= 0x04000000) { | |
| 629 | |
| 9852 | 630 tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4); |
| 1 | 631 |
| 632 i += tab->run; | |
| 633 if (i < 64) | |
| 634 goto normal_code; | |
| 635 | |
| 36 | 636 /* escape code */ |
| 1 | 637 |
| 638 i += UBITS (bit_buf << 6, 6) - 64; | |
| 639 if (i >= 64) | |
| 36 | 640 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 641 |
| 642 j = scan[i]; | |
| 643 | |
| 644 DUMPBITS (bit_buf, bits, 12); | |
| 645 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 646 val = 2 * (SBITS (bit_buf, 12) + SBITS (bit_buf, 1)) + 1; | |
| 12932 | 647 val = (val * quant_matrix[j]) / 32; |
| 1 | 648 |
| 649 SATURATE (val); | |
| 650 dest[j] = val; | |
| 651 mismatch ^= val; | |
| 652 | |
| 653 DUMPBITS (bit_buf, bits, 12); | |
| 654 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 655 | |
| 656 continue; | |
| 657 | |
| 658 } else if (bit_buf >= 0x02000000) { | |
| 9852 | 659 tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8); |
| 1 | 660 i += tab->run; |
| 661 if (i < 64) | |
| 662 goto normal_code; | |
| 663 } else if (bit_buf >= 0x00800000) { | |
| 9852 | 664 tab = DCT_13 + (UBITS (bit_buf, 13) - 16); |
| 1 | 665 i += tab->run; |
| 666 if (i < 64) | |
| 667 goto normal_code; | |
| 668 } else if (bit_buf >= 0x00200000) { | |
| 9852 | 669 tab = DCT_15 + (UBITS (bit_buf, 15) - 16); |
| 1 | 670 i += tab->run; |
| 671 if (i < 64) | |
| 672 goto normal_code; | |
| 673 } else { | |
| 674 tab = DCT_16 + UBITS (bit_buf, 16); | |
| 675 bit_buf <<= 16; | |
| 676 GETWORD (bit_buf, bits + 16, bit_ptr); | |
| 677 i += tab->run; | |
| 678 if (i < 64) | |
| 679 goto normal_code; | |
| 680 } | |
| 36 | 681 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 682 } |
| 12932 | 683 dest[63] ^= mismatch & 16; |
| 27572 | 684 DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */ |
| 9852 | 685 decoder->bitstream_buf = bit_buf; |
| 686 decoder->bitstream_bits = bits; | |
| 687 decoder->bitstream_ptr = bit_ptr; | |
| 688 return i; | |
| 1 | 689 } |
| 690 | |
| 12932 | 691 static void get_mpeg1_intra_block (mpeg2_decoder_t * const decoder) |
| 1 | 692 { |
| 693 int i; | |
| 694 int j; | |
| 695 int val; | |
| 12932 | 696 const uint8_t * const scan = decoder->scan; |
| 697 const uint16_t * const quant_matrix = decoder->quantizer_matrix[0]; | |
| 9852 | 698 const DCTtab * tab; |
| 1 | 699 uint32_t bit_buf; |
| 700 int bits; | |
| 9852 | 701 const uint8_t * bit_ptr; |
| 12932 | 702 int16_t * const dest = decoder->DCTblock; |
| 1 | 703 |
| 704 i = 0; | |
| 705 | |
| 9852 | 706 bit_buf = decoder->bitstream_buf; |
| 707 bits = decoder->bitstream_bits; | |
| 708 bit_ptr = decoder->bitstream_ptr; | |
| 1 | 709 |
| 710 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 711 | |
| 712 while (1) { | |
| 713 if (bit_buf >= 0x28000000) { | |
| 714 | |
| 9852 | 715 tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 716 |
| 717 i += tab->run; | |
| 718 if (i >= 64) | |
| 36 | 719 break; /* end of block */ |
| 1 | 720 |
| 721 normal_code: | |
| 722 j = scan[i]; | |
| 723 bit_buf <<= tab->len; | |
| 724 bits += tab->len + 1; | |
| 12932 | 725 val = (tab->level * quant_matrix[j]) >> 4; |
| 1 | 726 |
| 36 | 727 /* oddification */ |
| 1 | 728 val = (val - 1) | 1; |
| 729 | |
| 36 | 730 /* if (bitstream_get (1)) val = -val; */ |
| 1 | 731 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1); |
| 732 | |
| 733 SATURATE (val); | |
| 734 dest[j] = val; | |
| 735 | |
| 736 bit_buf <<= 1; | |
| 737 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 738 | |
| 739 continue; | |
| 740 | |
| 741 } else if (bit_buf >= 0x04000000) { | |
| 742 | |
| 9852 | 743 tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4); |
| 1 | 744 |
| 745 i += tab->run; | |
| 746 if (i < 64) | |
| 747 goto normal_code; | |
| 748 | |
| 36 | 749 /* escape code */ |
| 1 | 750 |
| 751 i += UBITS (bit_buf << 6, 6) - 64; | |
| 752 if (i >= 64) | |
| 36 | 753 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 754 |
| 755 j = scan[i]; | |
| 756 | |
| 757 DUMPBITS (bit_buf, bits, 12); | |
| 758 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 759 val = SBITS (bit_buf, 8); | |
| 760 if (! (val & 0x7f)) { | |
| 761 DUMPBITS (bit_buf, bits, 8); | |
| 762 val = UBITS (bit_buf, 8) + 2 * val; | |
| 763 } | |
| 12932 | 764 val = (val * quant_matrix[j]) / 16; |
| 1 | 765 |
| 36 | 766 /* oddification */ |
| 1 | 767 val = (val + ~SBITS (val, 1)) | 1; |
| 768 | |
| 769 SATURATE (val); | |
| 770 dest[j] = val; | |
| 771 | |
| 772 DUMPBITS (bit_buf, bits, 8); | |
| 773 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 774 | |
| 775 continue; | |
| 776 | |
| 777 } else if (bit_buf >= 0x02000000) { | |
| 9852 | 778 tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8); |
| 1 | 779 i += tab->run; |
| 780 if (i < 64) | |
| 781 goto normal_code; | |
| 782 } else if (bit_buf >= 0x00800000) { | |
| 9852 | 783 tab = DCT_13 + (UBITS (bit_buf, 13) - 16); |
| 1 | 784 i += tab->run; |
| 785 if (i < 64) | |
| 786 goto normal_code; | |
| 787 } else if (bit_buf >= 0x00200000) { | |
| 9852 | 788 tab = DCT_15 + (UBITS (bit_buf, 15) - 16); |
| 1 | 789 i += tab->run; |
| 790 if (i < 64) | |
| 791 goto normal_code; | |
| 792 } else { | |
| 793 tab = DCT_16 + UBITS (bit_buf, 16); | |
| 794 bit_buf <<= 16; | |
| 795 GETWORD (bit_buf, bits + 16, bit_ptr); | |
| 796 i += tab->run; | |
| 797 if (i < 64) | |
| 798 goto normal_code; | |
| 799 } | |
| 36 | 800 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 801 } |
| 27572 | 802 DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */ |
| 9852 | 803 decoder->bitstream_buf = bit_buf; |
| 804 decoder->bitstream_bits = bits; | |
| 805 decoder->bitstream_ptr = bit_ptr; | |
| 1 | 806 } |
| 807 | |
| 12932 | 808 static int get_mpeg1_non_intra_block (mpeg2_decoder_t * const decoder) |
| 1 | 809 { |
| 810 int i; | |
| 811 int j; | |
| 812 int val; | |
| 12932 | 813 const uint8_t * const scan = decoder->scan; |
| 814 const uint16_t * const quant_matrix = decoder->quantizer_matrix[1]; | |
| 9852 | 815 const DCTtab * tab; |
| 1 | 816 uint32_t bit_buf; |
| 817 int bits; | |
| 9852 | 818 const uint8_t * bit_ptr; |
| 12932 | 819 int16_t * const dest = decoder->DCTblock; |
| 1 | 820 |
| 821 i = -1; | |
| 822 | |
| 9852 | 823 bit_buf = decoder->bitstream_buf; |
| 824 bits = decoder->bitstream_bits; | |
| 825 bit_ptr = decoder->bitstream_ptr; | |
| 1 | 826 |
| 827 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 828 if (bit_buf >= 0x28000000) { | |
| 9852 | 829 tab = DCT_B14DC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 830 goto entry_1; |
| 831 } else | |
| 832 goto entry_2; | |
| 833 | |
| 834 while (1) { | |
| 835 if (bit_buf >= 0x28000000) { | |
| 836 | |
| 9852 | 837 tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5); |
| 1 | 838 |
| 839 entry_1: | |
| 840 i += tab->run; | |
| 841 if (i >= 64) | |
| 36 | 842 break; /* end of block */ |
| 1 | 843 |
| 844 normal_code: | |
| 845 j = scan[i]; | |
| 846 bit_buf <<= tab->len; | |
| 847 bits += tab->len + 1; | |
| 12932 | 848 val = ((2 * tab->level + 1) * quant_matrix[j]) >> 5; |
| 1 | 849 |
| 36 | 850 /* oddification */ |
| 1 | 851 val = (val - 1) | 1; |
| 852 | |
| 36 | 853 /* if (bitstream_get (1)) val = -val; */ |
| 1 | 854 val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1); |
| 855 | |
| 856 SATURATE (val); | |
| 857 dest[j] = val; | |
| 858 | |
| 859 bit_buf <<= 1; | |
| 860 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 861 | |
| 862 continue; | |
| 863 | |
| 864 } | |
| 865 | |
| 866 entry_2: | |
| 867 if (bit_buf >= 0x04000000) { | |
| 868 | |
| 9852 | 869 tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4); |
| 1 | 870 |
| 871 i += tab->run; | |
| 872 if (i < 64) | |
| 873 goto normal_code; | |
| 874 | |
| 36 | 875 /* escape code */ |
| 1 | 876 |
| 877 i += UBITS (bit_buf << 6, 6) - 64; | |
| 878 if (i >= 64) | |
| 36 | 879 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 880 |
| 881 j = scan[i]; | |
| 882 | |
| 883 DUMPBITS (bit_buf, bits, 12); | |
| 884 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 885 val = SBITS (bit_buf, 8); | |
| 886 if (! (val & 0x7f)) { | |
| 887 DUMPBITS (bit_buf, bits, 8); | |
| 888 val = UBITS (bit_buf, 8) + 2 * val; | |
| 889 } | |
| 890 val = 2 * (val + SBITS (val, 1)) + 1; | |
| 12932 | 891 val = (val * quant_matrix[j]) / 32; |
| 1 | 892 |
| 36 | 893 /* oddification */ |
| 1 | 894 val = (val + ~SBITS (val, 1)) | 1; |
| 895 | |
| 896 SATURATE (val); | |
| 897 dest[j] = val; | |
| 898 | |
| 899 DUMPBITS (bit_buf, bits, 8); | |
| 900 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 901 | |
| 902 continue; | |
| 903 | |
| 904 } else if (bit_buf >= 0x02000000) { | |
| 9852 | 905 tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8); |
| 1 | 906 i += tab->run; |
| 907 if (i < 64) | |
| 908 goto normal_code; | |
| 909 } else if (bit_buf >= 0x00800000) { | |
| 9852 | 910 tab = DCT_13 + (UBITS (bit_buf, 13) - 16); |
| 1 | 911 i += tab->run; |
| 912 if (i < 64) | |
| 913 goto normal_code; | |
| 914 } else if (bit_buf >= 0x00200000) { | |
| 9852 | 915 tab = DCT_15 + (UBITS (bit_buf, 15) - 16); |
| 1 | 916 i += tab->run; |
| 917 if (i < 64) | |
| 918 goto normal_code; | |
| 919 } else { | |
| 920 tab = DCT_16 + UBITS (bit_buf, 16); | |
| 921 bit_buf <<= 16; | |
| 922 GETWORD (bit_buf, bits + 16, bit_ptr); | |
| 923 i += tab->run; | |
| 924 if (i < 64) | |
| 925 goto normal_code; | |
| 926 } | |
| 36 | 927 break; /* illegal, check needed to avoid buffer overflow */ |
| 1 | 928 } |
| 27572 | 929 DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */ |
| 9852 | 930 decoder->bitstream_buf = bit_buf; |
| 931 decoder->bitstream_bits = bits; | |
| 932 decoder->bitstream_ptr = bit_ptr; | |
| 933 return i; | |
| 1 | 934 } |
| 935 | |
| 12932 | 936 static inline void slice_intra_DCT (mpeg2_decoder_t * const decoder, |
| 937 const int cc, | |
| 9852 | 938 uint8_t * const dest, const int stride) |
| 1 | 939 { |
| 9852 | 940 #define bit_buf (decoder->bitstream_buf) |
| 941 #define bits (decoder->bitstream_bits) | |
| 942 #define bit_ptr (decoder->bitstream_ptr) | |
| 1 | 943 NEEDBITS (bit_buf, bits, bit_ptr); |
| 36 | 944 /* Get the intra DC coefficient and inverse quantize it */ |
| 1 | 945 if (cc == 0) |
| 12932 | 946 decoder->DCTblock[0] = |
| 947 decoder->dc_dct_pred[0] += get_luma_dc_dct_diff (decoder); | |
| 1 | 948 else |
| 12932 | 949 decoder->DCTblock[0] = |
| 950 decoder->dc_dct_pred[cc] += get_chroma_dc_dct_diff (decoder); | |
| 1 | 951 |
| 9852 | 952 if (decoder->mpeg1) { |
| 953 if (decoder->coding_type != D_TYPE) | |
| 954 get_mpeg1_intra_block (decoder); | |
| 955 } else if (decoder->intra_vlc_format) | |
| 12932 | 956 get_intra_block_B15 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]); |
| 1 | 957 else |
| 12932 | 958 get_intra_block_B14 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]); |
| 9852 | 959 mpeg2_idct_copy (decoder->DCTblock, dest, stride); |
| 1 | 960 #undef bit_buf |
| 961 #undef bits | |
| 962 #undef bit_ptr | |
| 963 } | |
| 964 | |
| 12932 | 965 static inline void slice_non_intra_DCT (mpeg2_decoder_t * const decoder, |
| 966 const int cc, | |
| 9852 | 967 uint8_t * const dest, const int stride) |
| 1 | 968 { |
| 9852 | 969 int last; |
| 970 | |
| 971 if (decoder->mpeg1) | |
| 972 last = get_mpeg1_non_intra_block (decoder); | |
| 1 | 973 else |
| 12932 | 974 last = get_non_intra_block (decoder, |
| 975 decoder->quantizer_matrix[cc ? 3 : 1]); | |
| 9852 | 976 mpeg2_idct_add (last, decoder->DCTblock, dest, stride); |
| 1 | 977 } |
| 978 | |
| 12932 | 979 #define MOTION_420(table,ref,motion_x,motion_y,size,y) \ |
| 9852 | 980 pos_x = 2 * decoder->offset + motion_x; \ |
| 981 pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ | |
| 12932 | 982 if (unlikely (pos_x > decoder->limit_x)) { \ |
| 983 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 984 motion_x = pos_x - 2 * decoder->offset; \ | |
| 985 } \ | |
| 986 if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ | |
| 987 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ | |
| 988 motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ | |
| 989 } \ | |
| 9852 | 990 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ |
| 991 table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ | |
| 992 ref[0] + (pos_x >> 1) + (pos_y >> 1) * decoder->stride, \ | |
| 993 decoder->stride, size); \ | |
| 994 motion_x /= 2; motion_y /= 2; \ | |
| 995 xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ | |
| 996 offset = (((decoder->offset + motion_x) >> 1) + \ | |
| 997 ((((decoder->v_offset + motion_y) >> 1) + y/2) * \ | |
| 998 decoder->uv_stride)); \ | |
| 999 table[4+xy_half] (decoder->dest[1] + y/2 * decoder->uv_stride + \ | |
| 1000 (decoder->offset >> 1), ref[1] + offset, \ | |
| 1001 decoder->uv_stride, size/2); \ | |
| 1002 table[4+xy_half] (decoder->dest[2] + y/2 * decoder->uv_stride + \ | |
| 1003 (decoder->offset >> 1), ref[2] + offset, \ | |
| 1004 decoder->uv_stride, size/2) | |
| 49 | 1005 |
| 12932 | 1006 #define MOTION_FIELD_420(table,ref,motion_x,motion_y,dest_field,op,src_field) \ |
| 9852 | 1007 pos_x = 2 * decoder->offset + motion_x; \ |
| 1008 pos_y = decoder->v_offset + motion_y; \ | |
| 12932 | 1009 if (unlikely (pos_x > decoder->limit_x)) { \ |
| 1010 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1011 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1012 } \ | |
| 1013 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1014 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1015 motion_y = pos_y - decoder->v_offset; \ | |
| 1016 } \ | |
| 9852 | 1017 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ |
| 1018 table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ | |
| 1019 decoder->offset, \ | |
| 1020 (ref[0] + (pos_x >> 1) + \ | |
| 1021 ((pos_y op) + src_field) * decoder->stride), \ | |
| 1022 2 * decoder->stride, 8); \ | |
| 1023 motion_x /= 2; motion_y /= 2; \ | |
| 1024 xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ | |
| 1025 offset = (((decoder->offset + motion_x) >> 1) + \ | |
| 1026 (((decoder->v_offset >> 1) + (motion_y op) + src_field) * \ | |
| 1027 decoder->uv_stride)); \ | |
| 1028 table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \ | |
| 1029 (decoder->offset >> 1), ref[1] + offset, \ | |
| 1030 2 * decoder->uv_stride, 4); \ | |
| 1031 table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \ | |
| 1032 (decoder->offset >> 1), ref[2] + offset, \ | |
| 1033 2 * decoder->uv_stride, 4) | |
| 1 | 1034 |
| 12932 | 1035 #define MOTION_DMV_420(table,ref,motion_x,motion_y) \ |
| 1036 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1037 pos_y = decoder->v_offset + motion_y; \ | |
| 1038 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1039 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1040 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1041 } \ | |
| 1042 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1043 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1044 motion_y = pos_y - decoder->v_offset; \ | |
| 1045 } \ | |
| 1046 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1047 offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ | |
| 1048 table[xy_half] (decoder->dest[0] + decoder->offset, \ | |
| 1049 ref[0] + offset, 2 * decoder->stride, 8); \ | |
| 1050 table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ | |
| 1051 ref[0] + decoder->stride + offset, \ | |
| 1052 2 * decoder->stride, 8); \ | |
| 1053 motion_x /= 2; motion_y /= 2; \ | |
| 1054 xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \ | |
| 1055 offset = (((decoder->offset + motion_x) >> 1) + \ | |
| 1056 (((decoder->v_offset >> 1) + (motion_y & ~1)) * \ | |
| 1057 decoder->uv_stride)); \ | |
| 1058 table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \ | |
| 1059 ref[1] + offset, 2 * decoder->uv_stride, 4); \ | |
| 1060 table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \ | |
| 1061 (decoder->offset >> 1), \ | |
| 1062 ref[1] + decoder->uv_stride + offset, \ | |
| 1063 2 * decoder->uv_stride, 4); \ | |
| 1064 table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \ | |
| 1065 ref[2] + offset, 2 * decoder->uv_stride, 4); \ | |
| 1066 table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \ | |
| 1067 (decoder->offset >> 1), \ | |
| 1068 ref[2] + decoder->uv_stride + offset, \ | |
| 1069 2 * decoder->uv_stride, 4) | |
| 1070 | |
| 1071 #define MOTION_ZERO_420(table,ref) \ | |
| 1072 table[0] (decoder->dest[0] + decoder->offset, \ | |
| 1073 (ref[0] + decoder->offset + \ | |
| 1074 decoder->v_offset * decoder->stride), decoder->stride, 16); \ | |
| 1075 offset = ((decoder->offset >> 1) + \ | |
| 1076 (decoder->v_offset >> 1) * decoder->uv_stride); \ | |
| 1077 table[4] (decoder->dest[1] + (decoder->offset >> 1), \ | |
| 1078 ref[1] + offset, decoder->uv_stride, 8); \ | |
| 1079 table[4] (decoder->dest[2] + (decoder->offset >> 1), \ | |
| 1080 ref[2] + offset, decoder->uv_stride, 8) | |
| 1081 | |
| 1082 #define MOTION_422(table,ref,motion_x,motion_y,size,y) \ | |
| 1083 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1084 pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ | |
| 1085 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1086 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1087 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1088 } \ | |
| 1089 if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ | |
| 1090 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ | |
| 1091 motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ | |
| 1092 } \ | |
| 1093 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1094 offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \ | |
| 1095 table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ | |
| 1096 ref[0] + offset, decoder->stride, size); \ | |
| 1097 offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ | |
| 1098 motion_x /= 2; \ | |
| 1099 xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ | |
| 1100 table[4+xy_half] (decoder->dest[1] + y * decoder->uv_stride + \ | |
| 1101 (decoder->offset >> 1), ref[1] + offset, \ | |
| 1102 decoder->uv_stride, size); \ | |
| 1103 table[4+xy_half] (decoder->dest[2] + y * decoder->uv_stride + \ | |
| 1104 (decoder->offset >> 1), ref[2] + offset, \ | |
| 1105 decoder->uv_stride, size) | |
| 1106 | |
| 1107 #define MOTION_FIELD_422(table,ref,motion_x,motion_y,dest_field,op,src_field) \ | |
| 1108 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1109 pos_y = decoder->v_offset + motion_y; \ | |
| 1110 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1111 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1112 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1113 } \ | |
| 1114 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1115 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1116 motion_y = pos_y - decoder->v_offset; \ | |
| 1117 } \ | |
| 1118 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1119 offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \ | |
| 1120 table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ | |
| 1121 decoder->offset, ref[0] + offset, \ | |
| 1122 2 * decoder->stride, 8); \ | |
| 1123 offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ | |
| 1124 motion_x /= 2; \ | |
| 1125 xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ | |
| 1126 table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \ | |
| 1127 (decoder->offset >> 1), ref[1] + offset, \ | |
| 1128 2 * decoder->uv_stride, 8); \ | |
| 1129 table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \ | |
| 1130 (decoder->offset >> 1), ref[2] + offset, \ | |
| 1131 2 * decoder->uv_stride, 8) | |
| 1132 | |
| 1133 #define MOTION_DMV_422(table,ref,motion_x,motion_y) \ | |
| 1134 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1135 pos_y = decoder->v_offset + motion_y; \ | |
| 1136 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1137 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1138 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1139 } \ | |
| 1140 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1141 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1142 motion_y = pos_y - decoder->v_offset; \ | |
| 1143 } \ | |
| 1144 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1145 offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ | |
| 1146 table[xy_half] (decoder->dest[0] + decoder->offset, \ | |
| 1147 ref[0] + offset, 2 * decoder->stride, 8); \ | |
| 1148 table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ | |
| 1149 ref[0] + decoder->stride + offset, \ | |
| 1150 2 * decoder->stride, 8); \ | |
| 1151 offset = (offset + (motion_x & (motion_x < 0))) >> 1; \ | |
| 1152 motion_x /= 2; \ | |
| 1153 xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \ | |
| 1154 table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \ | |
| 1155 ref[1] + offset, 2 * decoder->uv_stride, 8); \ | |
| 1156 table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \ | |
| 1157 (decoder->offset >> 1), \ | |
| 1158 ref[1] + decoder->uv_stride + offset, \ | |
| 1159 2 * decoder->uv_stride, 8); \ | |
| 1160 table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \ | |
| 1161 ref[2] + offset, 2 * decoder->uv_stride, 8); \ | |
| 1162 table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \ | |
| 1163 (decoder->offset >> 1), \ | |
| 1164 ref[2] + decoder->uv_stride + offset, \ | |
| 1165 2 * decoder->uv_stride, 8) | |
| 1166 | |
| 1167 #define MOTION_ZERO_422(table,ref) \ | |
| 1168 offset = decoder->offset + decoder->v_offset * decoder->stride; \ | |
| 1169 table[0] (decoder->dest[0] + decoder->offset, \ | |
| 1170 ref[0] + offset, decoder->stride, 16); \ | |
| 1171 offset >>= 1; \ | |
| 1172 table[4] (decoder->dest[1] + (decoder->offset >> 1), \ | |
| 1173 ref[1] + offset, decoder->uv_stride, 16); \ | |
| 1174 table[4] (decoder->dest[2] + (decoder->offset >> 1), \ | |
| 1175 ref[2] + offset, decoder->uv_stride, 16) | |
| 1176 | |
| 1177 #define MOTION_444(table,ref,motion_x,motion_y,size,y) \ | |
| 1178 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1179 pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \ | |
| 1180 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1181 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1182 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1183 } \ | |
| 1184 if (unlikely (pos_y > decoder->limit_y_ ## size)) { \ | |
| 1185 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \ | |
| 1186 motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \ | |
| 1187 } \ | |
| 1188 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1189 offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \ | |
| 1190 table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \ | |
| 1191 ref[0] + offset, decoder->stride, size); \ | |
| 1192 table[xy_half] (decoder->dest[1] + y * decoder->stride + decoder->offset, \ | |
| 1193 ref[1] + offset, decoder->stride, size); \ | |
| 1194 table[xy_half] (decoder->dest[2] + y * decoder->stride + decoder->offset, \ | |
| 1195 ref[2] + offset, decoder->stride, size) | |
| 1196 | |
| 1197 #define MOTION_FIELD_444(table,ref,motion_x,motion_y,dest_field,op,src_field) \ | |
| 1198 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1199 pos_y = decoder->v_offset + motion_y; \ | |
| 1200 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1201 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1202 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1203 } \ | |
| 1204 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1205 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1206 motion_y = pos_y - decoder->v_offset; \ | |
| 1207 } \ | |
| 1208 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1209 offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \ | |
| 1210 table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \ | |
| 1211 decoder->offset, ref[0] + offset, \ | |
| 1212 2 * decoder->stride, 8); \ | |
| 1213 table[xy_half] (decoder->dest[1] + dest_field * decoder->stride + \ | |
| 1214 decoder->offset, ref[1] + offset, \ | |
| 1215 2 * decoder->stride, 8); \ | |
| 1216 table[xy_half] (decoder->dest[2] + dest_field * decoder->stride + \ | |
| 1217 decoder->offset, ref[2] + offset, \ | |
| 1218 2 * decoder->stride, 8) | |
| 1219 | |
| 1220 #define MOTION_DMV_444(table,ref,motion_x,motion_y) \ | |
| 1221 pos_x = 2 * decoder->offset + motion_x; \ | |
| 1222 pos_y = decoder->v_offset + motion_y; \ | |
| 1223 if (unlikely (pos_x > decoder->limit_x)) { \ | |
| 1224 pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \ | |
| 1225 motion_x = pos_x - 2 * decoder->offset; \ | |
| 1226 } \ | |
| 1227 if (unlikely (pos_y > decoder->limit_y)) { \ | |
| 1228 pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \ | |
| 1229 motion_y = pos_y - decoder->v_offset; \ | |
| 1230 } \ | |
| 1231 xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ | |
| 1232 offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \ | |
| 1233 table[xy_half] (decoder->dest[0] + decoder->offset, \ | |
| 1234 ref[0] + offset, 2 * decoder->stride, 8); \ | |
| 1235 table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \ | |
| 1236 ref[0] + decoder->stride + offset, \ | |
| 1237 2 * decoder->stride, 8); \ | |
| 1238 table[xy_half] (decoder->dest[1] + decoder->offset, \ | |
| 1239 ref[1] + offset, 2 * decoder->stride, 8); \ | |
| 1240 table[xy_half] (decoder->dest[1] + decoder->stride + decoder->offset, \ | |
| 1241 ref[1] + decoder->stride + offset, \ | |
| 1242 2 * decoder->stride, 8); \ | |
| 1243 table[xy_half] (decoder->dest[2] + decoder->offset, \ | |
| 1244 ref[2] + offset, 2 * decoder->stride, 8); \ | |
| 1245 table[xy_half] (decoder->dest[2] + decoder->stride + decoder->offset, \ | |
| 1246 ref[2] + decoder->stride + offset, \ | |
| 1247 2 * decoder->stride, 8) | |
| 1248 | |
| 1249 #define MOTION_ZERO_444(table,ref) \ | |
| 1250 offset = decoder->offset + decoder->v_offset * decoder->stride; \ | |
| 1251 table[0] (decoder->dest[0] + decoder->offset, \ | |
| 1252 ref[0] + offset, decoder->stride, 16); \ | |
| 1253 table[4] (decoder->dest[1] + decoder->offset, \ | |
| 1254 ref[1] + offset, decoder->stride, 16); \ | |
|
21400
6fe9c6a0c4b0
fix incorrect 4:4:4 chroma handling (backport from 0.4.1)
henry
parents:
20638
diff
changeset
|
1255 table[4] (decoder->dest[2] + decoder->offset, \ |
| 12932 | 1256 ref[2] + offset, decoder->stride, 16) |
| 1257 | |
| 9852 | 1258 #define bit_buf (decoder->bitstream_buf) |
| 1259 #define bits (decoder->bitstream_bits) | |
| 1260 #define bit_ptr (decoder->bitstream_ptr) | |
| 12932 | 1261 |
| 1262 static void motion_mp1 (mpeg2_decoder_t * const decoder, | |
| 1263 motion_t * const motion, | |
| 1264 mpeg2_mc_fct * const * const table) | |
| 1265 { | |
| 1 | 1266 int motion_x, motion_y; |
| 9852 | 1267 unsigned int pos_x, pos_y, xy_half, offset; |
| 1 | 1268 |
| 1269 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 1270 motion_x = (motion->pmv[0][0] + |
| 1271 (get_motion_delta (decoder, | |
| 1272 motion->f_code[0]) << motion->f_code[1])); | |
| 1273 motion_x = bound_motion_vector (motion_x, | |
| 1274 motion->f_code[0] + motion->f_code[1]); | |
| 1 | 1275 motion->pmv[0][0] = motion_x; |
| 1276 | |
| 1277 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 1278 motion_y = (motion->pmv[0][1] + |
| 1279 (get_motion_delta (decoder, | |
| 1280 motion->f_code[0]) << motion->f_code[1])); | |
| 1281 motion_y = bound_motion_vector (motion_y, | |
| 1282 motion->f_code[0] + motion->f_code[1]); | |
| 1 | 1283 motion->pmv[0][1] = motion_y; |
| 1284 | |
| 12932 | 1285 MOTION_420 (table, motion->ref[0], motion_x, motion_y, 16, 0); |
| 1 | 1286 } |
| 1287 | |
| 12932 | 1288 #define MOTION_FUNCTIONS(FORMAT,MOTION,MOTION_FIELD,MOTION_DMV,MOTION_ZERO) \ |
| 1289 \ | |
| 1290 static void motion_fr_frame_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1291 motion_t * const motion, \ | |
| 1292 mpeg2_mc_fct * const * const table) \ | |
| 1293 { \ | |
| 1294 int motion_x, motion_y; \ | |
| 1295 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1296 \ | |
| 1297 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1298 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1299 motion->f_code[0]); \ | |
| 1300 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1301 motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ | |
| 1302 \ | |
| 1303 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1304 motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ | |
| 1305 motion->f_code[1]); \ | |
| 1306 motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ | |
| 1307 motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ | |
| 1308 \ | |
| 1309 MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \ | |
| 1310 } \ | |
| 1311 \ | |
| 1312 static void motion_fr_field_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1313 motion_t * const motion, \ | |
| 1314 mpeg2_mc_fct * const * const table) \ | |
| 1315 { \ | |
| 1316 int motion_x, motion_y, field; \ | |
| 1317 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1318 \ | |
| 1319 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1320 field = UBITS (bit_buf, 1); \ | |
| 1321 DUMPBITS (bit_buf, bits, 1); \ | |
| 1322 \ | |
| 1323 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1324 motion->f_code[0]); \ | |
| 1325 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1326 motion->pmv[0][0] = motion_x; \ | |
| 1327 \ | |
| 1328 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1329 motion_y = ((motion->pmv[0][1] >> 1) + \ | |
| 1330 get_motion_delta (decoder, motion->f_code[1])); \ | |
| 1331 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ | |
| 1332 motion->pmv[0][1] = motion_y << 1; \ | |
| 1333 \ | |
| 1334 MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 0, & ~1, field); \ | |
| 1335 \ | |
| 1336 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1337 field = UBITS (bit_buf, 1); \ | |
| 1338 DUMPBITS (bit_buf, bits, 1); \ | |
| 1339 \ | |
| 1340 motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \ | |
| 1341 motion->f_code[0]); \ | |
| 1342 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1343 motion->pmv[1][0] = motion_x; \ | |
| 1344 \ | |
| 1345 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1346 motion_y = ((motion->pmv[1][1] >> 1) + \ | |
| 1347 get_motion_delta (decoder, motion->f_code[1])); \ | |
| 1348 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ | |
| 1349 motion->pmv[1][1] = motion_y << 1; \ | |
| 1350 \ | |
| 1351 MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 1, & ~1, field); \ | |
| 1352 } \ | |
| 1353 \ | |
| 1354 static void motion_fr_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1355 motion_t * const motion, \ | |
| 1356 mpeg2_mc_fct * const * const table) \ | |
| 1357 { \ | |
| 1358 int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y; \ | |
| 1359 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1360 \ | |
| 1361 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1362 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1363 motion->f_code[0]); \ | |
| 1364 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1365 motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ | |
| 1366 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1367 dmv_x = get_dmv (decoder); \ | |
| 1368 \ | |
| 1369 motion_y = ((motion->pmv[0][1] >> 1) + \ | |
| 1370 get_motion_delta (decoder, motion->f_code[1])); \ | |
| 1371 /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \ | |
| 1372 motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1; \ | |
| 1373 dmv_y = get_dmv (decoder); \ | |
| 1374 \ | |
| 1375 m = decoder->top_field_first ? 1 : 3; \ | |
| 1376 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \ | |
| 1377 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1; \ | |
| 1378 MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 0, | 1, 0); \ | |
| 1379 \ | |
| 1380 m = decoder->top_field_first ? 3 : 1; \ | |
| 1381 other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \ | |
| 1382 other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1; \ | |
| 1383 MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 1, & ~1, 0);\ | |
| 1384 \ | |
| 1385 MOTION_DMV (mpeg2_mc.avg, motion->ref[0], motion_x, motion_y); \ | |
| 1386 } \ | |
| 1387 \ | |
| 1388 static void motion_reuse_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1389 motion_t * const motion, \ | |
| 1390 mpeg2_mc_fct * const * const table) \ | |
| 1391 { \ | |
| 1392 int motion_x, motion_y; \ | |
| 1393 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1394 \ | |
| 1395 motion_x = motion->pmv[0][0]; \ | |
| 1396 motion_y = motion->pmv[0][1]; \ | |
| 1397 \ | |
| 1398 MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \ | |
| 1399 } \ | |
| 1400 \ | |
| 1401 static void motion_zero_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1402 motion_t * const motion, \ | |
| 1403 mpeg2_mc_fct * const * const table) \ | |
| 1404 { \ | |
| 1405 unsigned int offset; \ | |
| 1406 \ | |
| 1407 motion->pmv[0][0] = motion->pmv[0][1] = 0; \ | |
| 1408 motion->pmv[1][0] = motion->pmv[1][1] = 0; \ | |
| 1409 \ | |
| 1410 MOTION_ZERO (table, motion->ref[0]); \ | |
| 1411 } \ | |
| 1412 \ | |
| 1413 static void motion_fi_field_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1414 motion_t * const motion, \ | |
| 1415 mpeg2_mc_fct * const * const table) \ | |
| 1416 { \ | |
| 1417 int motion_x, motion_y; \ | |
| 1418 uint8_t ** ref_field; \ | |
| 1419 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1420 \ | |
| 1421 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1422 ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ | |
| 1423 DUMPBITS (bit_buf, bits, 1); \ | |
| 1424 \ | |
| 1425 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1426 motion->f_code[0]); \ | |
| 1427 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1428 motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ | |
| 1429 \ | |
| 1430 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1431 motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ | |
| 1432 motion->f_code[1]); \ | |
| 1433 motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ | |
| 1434 motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ | |
| 1435 \ | |
| 1436 MOTION (table, ref_field, motion_x, motion_y, 16, 0); \ | |
| 1437 } \ | |
| 1438 \ | |
| 1439 static void motion_fi_16x8_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1440 motion_t * const motion, \ | |
| 1441 mpeg2_mc_fct * const * const table) \ | |
| 1442 { \ | |
| 1443 int motion_x, motion_y; \ | |
| 1444 uint8_t ** ref_field; \ | |
| 1445 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1446 \ | |
| 1447 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1448 ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ | |
| 1449 DUMPBITS (bit_buf, bits, 1); \ | |
| 1450 \ | |
| 1451 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1452 motion->f_code[0]); \ | |
| 1453 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1454 motion->pmv[0][0] = motion_x; \ | |
| 1455 \ | |
| 1456 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1457 motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ | |
| 1458 motion->f_code[1]); \ | |
| 1459 motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ | |
| 1460 motion->pmv[0][1] = motion_y; \ | |
| 1461 \ | |
| 1462 MOTION (table, ref_field, motion_x, motion_y, 8, 0); \ | |
| 1463 \ | |
| 1464 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1465 ref_field = motion->ref2[UBITS (bit_buf, 1)]; \ | |
| 1466 DUMPBITS (bit_buf, bits, 1); \ | |
| 1467 \ | |
| 1468 motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \ | |
| 1469 motion->f_code[0]); \ | |
| 1470 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1471 motion->pmv[1][0] = motion_x; \ | |
| 1472 \ | |
| 1473 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1474 motion_y = motion->pmv[1][1] + get_motion_delta (decoder, \ | |
| 1475 motion->f_code[1]); \ | |
| 1476 motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ | |
| 1477 motion->pmv[1][1] = motion_y; \ | |
| 1478 \ | |
| 1479 MOTION (table, ref_field, motion_x, motion_y, 8, 8); \ | |
| 1480 } \ | |
| 1481 \ | |
| 1482 static void motion_fi_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \ | |
| 1483 motion_t * const motion, \ | |
| 1484 mpeg2_mc_fct * const * const table) \ | |
| 1485 { \ | |
| 1486 int motion_x, motion_y, other_x, other_y; \ | |
| 1487 unsigned int pos_x, pos_y, xy_half, offset; \ | |
| 1488 \ | |
| 1489 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1490 motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \ | |
| 1491 motion->f_code[0]); \ | |
| 1492 motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \ | |
| 1493 motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \ | |
| 1494 NEEDBITS (bit_buf, bits, bit_ptr); \ | |
| 1495 other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv (decoder); \ | |
| 1496 \ | |
| 1497 motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \ | |
| 1498 motion->f_code[1]); \ | |
| 1499 motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \ | |
| 1500 motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \ | |
| 1501 other_y = (((motion_y + (motion_y > 0)) >> 1) + get_dmv (decoder) + \ | |
| 1502 decoder->dmv_offset); \ | |
| 1503 \ | |
| 1504 MOTION (mpeg2_mc.put, motion->ref[0], motion_x, motion_y, 16, 0); \ | |
| 1505 MOTION (mpeg2_mc.avg, motion->ref[1], other_x, other_y, 16, 0); \ | |
| 1506 } \ | |
| 9852 | 1507 |
| 12932 | 1508 MOTION_FUNCTIONS (420, MOTION_420, MOTION_FIELD_420, MOTION_DMV_420, |
| 1509 MOTION_ZERO_420) | |
| 1510 MOTION_FUNCTIONS (422, MOTION_422, MOTION_FIELD_422, MOTION_DMV_422, | |
| 1511 MOTION_ZERO_422) | |
| 1512 MOTION_FUNCTIONS (444, MOTION_444, MOTION_FIELD_444, MOTION_DMV_444, | |
| 1513 MOTION_ZERO_444) | |
| 1 | 1514 |
| 36 | 1515 /* like motion_frame, but parsing without actual motion compensation */ |
| 12932 | 1516 static void motion_fr_conceal (mpeg2_decoder_t * const decoder) |
| 1 | 1517 { |
| 1518 int tmp; | |
| 1519 | |
| 1520 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 1521 tmp = (decoder->f_motion.pmv[0][0] + |
| 1522 get_motion_delta (decoder, decoder->f_motion.f_code[0])); | |
| 1523 tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]); | |
| 1524 decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp; | |
| 1 | 1525 |
| 1526 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 1527 tmp = (decoder->f_motion.pmv[0][1] + |
| 1528 get_motion_delta (decoder, decoder->f_motion.f_code[1])); | |
| 1529 tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]); | |
| 1530 decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp; | |
| 1 | 1531 |
| 36 | 1532 DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */ |
| 1 | 1533 } |
| 1534 | |
| 12932 | 1535 static void motion_fi_conceal (mpeg2_decoder_t * const decoder) |
| 1 | 1536 { |
| 1537 int tmp; | |
| 1538 | |
| 1539 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 36 | 1540 DUMPBITS (bit_buf, bits, 1); /* remove field_select */ |
| 1 | 1541 |
| 9852 | 1542 tmp = (decoder->f_motion.pmv[0][0] + |
| 1543 get_motion_delta (decoder, decoder->f_motion.f_code[0])); | |
| 1544 tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]); | |
| 1545 decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp; | |
| 1 | 1546 |
| 1547 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 1548 tmp = (decoder->f_motion.pmv[0][1] + |
| 1549 get_motion_delta (decoder, decoder->f_motion.f_code[1])); | |
| 1550 tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]); | |
| 1551 decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp; | |
| 1 | 1552 |
| 36 | 1553 DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */ |
| 12932 | 1554 } |
| 1555 | |
| 1 | 1556 #undef bit_buf |
| 1557 #undef bits | |
| 1558 #undef bit_ptr | |
| 1559 | |
| 9852 | 1560 #define MOTION_CALL(routine,direction) \ |
| 1561 do { \ | |
| 1562 if ((direction) & MACROBLOCK_MOTION_FORWARD) \ | |
| 1563 routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \ | |
| 1564 if ((direction) & MACROBLOCK_MOTION_BACKWARD) \ | |
| 1565 routine (decoder, &(decoder->b_motion), \ | |
| 1566 ((direction) & MACROBLOCK_MOTION_FORWARD ? \ | |
| 1567 mpeg2_mc.avg : mpeg2_mc.put)); \ | |
| 1 | 1568 } while (0) |
| 1569 | |
| 9852 | 1570 #define NEXT_MACROBLOCK \ |
| 36 | 1571 do { \ |
| 31329 | 1572 if(decoder->quant_store) { \ |
| 1573 if (decoder->picture_structure == TOP_FIELD) \ | |
| 1574 decoder->quant_store[2 * decoder->quant_stride \ | |
| 1575 * (decoder->v_offset >> 4) \ | |
| 1576 + (decoder->offset >> 4)] \ | |
| 1577 = decoder->quantizer_scale; \ | |
| 1578 else if (decoder->picture_structure == BOTTOM_FIELD) \ | |
| 1579 decoder->quant_store[2 * decoder->quant_stride \ | |
| 1580 * (decoder->v_offset >> 4) \ | |
| 1581 + decoder->quant_stride \ | |
| 1582 + (decoder->offset >> 4)] \ | |
| 1583 = decoder->quantizer_scale; \ | |
| 1584 else \ | |
| 1585 decoder->quant_store[decoder->quant_stride \ | |
| 1586 * (decoder->v_offset >> 4) \ | |
| 1587 + (decoder->offset >> 4)] \ | |
| 1588 = decoder->quantizer_scale; \ | |
| 1589 } \ | |
| 9852 | 1590 decoder->offset += 16; \ |
| 1591 if (decoder->offset == decoder->width) { \ | |
| 36 | 1592 do { /* just so we can use the break statement */ \ |
| 9852 | 1593 if (decoder->convert) { \ |
| 12932 | 1594 decoder->convert (decoder->convert_id, decoder->dest, \ |
| 9852 | 1595 decoder->v_offset); \ |
| 1596 if (decoder->coding_type == B_TYPE) \ | |
| 36 | 1597 break; \ |
| 1598 } \ | |
| 12932 | 1599 decoder->dest[0] += decoder->slice_stride; \ |
| 1600 decoder->dest[1] += decoder->slice_uv_stride; \ | |
| 1601 decoder->dest[2] += decoder->slice_uv_stride; \ | |
| 36 | 1602 } while (0); \ |
| 9852 | 1603 decoder->v_offset += 16; \ |
| 1604 if (decoder->v_offset > decoder->limit_y) { \ | |
| 1605 if (mpeg2_cpu_state_restore) \ | |
| 1606 mpeg2_cpu_state_restore (&cpu_state); \ | |
| 1607 return; \ | |
| 1608 } \ | |
| 1609 decoder->offset = 0; \ | |
| 36 | 1610 } \ |
| 1 | 1611 } while (0) |
| 1612 | |
| 27572 | 1613 /** |
| 1614 * Dummy motion decoding function, to avoid calling NULL in | |
| 1615 * case of malformed streams. | |
| 1616 */ | |
|
21923
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1617 static void motion_dummy (mpeg2_decoder_t * const decoder, |
|
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1618 motion_t * const motion, |
|
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1619 mpeg2_mc_fct * const * const table) |
|
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1620 { |
|
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1621 } |
|
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1622 |
| 12932 | 1623 void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3], |
| 9852 | 1624 uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]) |
| 1 | 1625 { |
| 9852 | 1626 int offset, stride, height, bottom_field; |
| 1627 | |
| 12932 | 1628 stride = decoder->stride_frame; |
| 9852 | 1629 bottom_field = (decoder->picture_structure == BOTTOM_FIELD); |
| 1630 offset = bottom_field ? stride : 0; | |
| 1631 height = decoder->height; | |
| 1 | 1632 |
| 9852 | 1633 decoder->picture_dest[0] = current_fbuf[0] + offset; |
| 1634 decoder->picture_dest[1] = current_fbuf[1] + (offset >> 1); | |
| 1635 decoder->picture_dest[2] = current_fbuf[2] + (offset >> 1); | |
| 1636 | |
| 1637 decoder->f_motion.ref[0][0] = forward_fbuf[0] + offset; | |
| 1638 decoder->f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1); | |
| 1639 decoder->f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1); | |
| 1640 | |
| 1641 decoder->b_motion.ref[0][0] = backward_fbuf[0] + offset; | |
| 1642 decoder->b_motion.ref[0][1] = backward_fbuf[1] + (offset >> 1); | |
| 1643 decoder->b_motion.ref[0][2] = backward_fbuf[2] + (offset >> 1); | |
| 1 | 1644 |
| 9852 | 1645 if (decoder->picture_structure != FRAME_PICTURE) { |
| 1646 decoder->dmv_offset = bottom_field ? 1 : -1; | |
| 1647 decoder->f_motion.ref2[0] = decoder->f_motion.ref[bottom_field]; | |
| 1648 decoder->f_motion.ref2[1] = decoder->f_motion.ref[!bottom_field]; | |
| 1649 decoder->b_motion.ref2[0] = decoder->b_motion.ref[bottom_field]; | |
| 1650 decoder->b_motion.ref2[1] = decoder->b_motion.ref[!bottom_field]; | |
| 1651 offset = stride - offset; | |
| 1652 | |
| 1653 if (decoder->second_field && (decoder->coding_type != B_TYPE)) | |
| 1654 forward_fbuf = current_fbuf; | |
| 49 | 1655 |
| 9852 | 1656 decoder->f_motion.ref[1][0] = forward_fbuf[0] + offset; |
| 1657 decoder->f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1); | |
| 1658 decoder->f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1); | |
| 49 | 1659 |
| 9852 | 1660 decoder->b_motion.ref[1][0] = backward_fbuf[0] + offset; |
| 1661 decoder->b_motion.ref[1][1] = backward_fbuf[1] + (offset >> 1); | |
| 1662 decoder->b_motion.ref[1][2] = backward_fbuf[2] + (offset >> 1); | |
| 1663 | |
| 1664 stride <<= 1; | |
| 1665 height >>= 1; | |
| 1 | 1666 } |
| 1667 | |
| 9852 | 1668 decoder->stride = stride; |
| 1669 decoder->uv_stride = stride >> 1; | |
| 12932 | 1670 decoder->slice_stride = 16 * stride; |
| 1671 decoder->slice_uv_stride = | |
| 1672 decoder->slice_stride >> (2 - decoder->chroma_format); | |
| 9852 | 1673 decoder->limit_x = 2 * decoder->width - 32; |
| 1674 decoder->limit_y_16 = 2 * height - 32; | |
| 1675 decoder->limit_y_8 = 2 * height - 16; | |
| 1676 decoder->limit_y = height - 16; | |
| 12932 | 1677 |
| 1678 if (decoder->mpeg1) { | |
| 1679 decoder->motion_parser[0] = motion_zero_420; | |
|
21923
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1680 decoder->motion_parser[MC_FIELD] = motion_dummy; |
| 27572 | 1681 decoder->motion_parser[MC_FRAME] = motion_mp1; |
|
21923
1658f7d97b27
fix crash with http://sam.zoy.org/zzuf/lol-mplayer.m2v
henry
parents:
21526
diff
changeset
|
1682 decoder->motion_parser[MC_DMV] = motion_dummy; |
| 12932 | 1683 decoder->motion_parser[4] = motion_reuse_420; |
| 1684 } else if (decoder->picture_structure == FRAME_PICTURE) { | |
| 1685 if (decoder->chroma_format == 0) { | |
| 1686 decoder->motion_parser[0] = motion_zero_420; | |
| 1687 decoder->motion_parser[MC_FIELD] = motion_fr_field_420; | |
| 1688 decoder->motion_parser[MC_FRAME] = motion_fr_frame_420; | |
| 1689 decoder->motion_parser[MC_DMV] = motion_fr_dmv_420; | |
| 1690 decoder->motion_parser[4] = motion_reuse_420; | |
| 1691 } else if (decoder->chroma_format == 1) { | |
| 1692 decoder->motion_parser[0] = motion_zero_422; | |
| 1693 decoder->motion_parser[MC_FIELD] = motion_fr_field_422; | |
| 1694 decoder->motion_parser[MC_FRAME] = motion_fr_frame_422; | |
| 1695 decoder->motion_parser[MC_DMV] = motion_fr_dmv_422; | |
| 1696 decoder->motion_parser[4] = motion_reuse_422; | |
| 1697 } else { | |
| 1698 decoder->motion_parser[0] = motion_zero_444; | |
| 1699 decoder->motion_parser[MC_FIELD] = motion_fr_field_444; | |
| 1700 decoder->motion_parser[MC_FRAME] = motion_fr_frame_444; | |
| 1701 decoder->motion_parser[MC_DMV] = motion_fr_dmv_444; | |
| 1702 decoder->motion_parser[4] = motion_reuse_444; | |
| 1703 } | |
| 1704 } else { | |
| 1705 if (decoder->chroma_format == 0) { | |
| 1706 decoder->motion_parser[0] = motion_zero_420; | |
| 1707 decoder->motion_parser[MC_FIELD] = motion_fi_field_420; | |
| 1708 decoder->motion_parser[MC_16X8] = motion_fi_16x8_420; | |
| 1709 decoder->motion_parser[MC_DMV] = motion_fi_dmv_420; | |
| 1710 decoder->motion_parser[4] = motion_reuse_420; | |
| 1711 } else if (decoder->chroma_format == 1) { | |
| 1712 decoder->motion_parser[0] = motion_zero_422; | |
| 1713 decoder->motion_parser[MC_FIELD] = motion_fi_field_422; | |
| 1714 decoder->motion_parser[MC_16X8] = motion_fi_16x8_422; | |
| 1715 decoder->motion_parser[MC_DMV] = motion_fi_dmv_422; | |
| 1716 decoder->motion_parser[4] = motion_reuse_422; | |
| 1717 } else { | |
| 1718 decoder->motion_parser[0] = motion_zero_444; | |
| 1719 decoder->motion_parser[MC_FIELD] = motion_fi_field_444; | |
| 1720 decoder->motion_parser[MC_16X8] = motion_fi_16x8_444; | |
| 1721 decoder->motion_parser[MC_DMV] = motion_fi_dmv_444; | |
| 1722 decoder->motion_parser[4] = motion_reuse_444; | |
| 1723 } | |
| 1724 } | |
| 9852 | 1725 } |
| 49 | 1726 |
| 12932 | 1727 static inline int slice_init (mpeg2_decoder_t * const decoder, int code) |
| 9852 | 1728 { |
| 1729 #define bit_buf (decoder->bitstream_buf) | |
| 1730 #define bits (decoder->bitstream_bits) | |
| 1731 #define bit_ptr (decoder->bitstream_ptr) | |
| 1732 int offset; | |
| 1733 const MBAtab * mba; | |
| 49 | 1734 |
| 9852 | 1735 decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] = |
| 12932 | 1736 decoder->dc_dct_pred[2] = 16384; |
| 1 | 1737 |
| 9852 | 1738 decoder->f_motion.pmv[0][0] = decoder->f_motion.pmv[0][1] = 0; |
| 1739 decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[1][1] = 0; | |
| 1740 decoder->b_motion.pmv[0][0] = decoder->b_motion.pmv[0][1] = 0; | |
| 1741 decoder->b_motion.pmv[1][0] = decoder->b_motion.pmv[1][1] = 0; | |
| 1 | 1742 |
| 9852 | 1743 if (decoder->vertical_position_extension) { |
| 1744 code += UBITS (bit_buf, 3) << 7; | |
| 1745 DUMPBITS (bit_buf, bits, 3); | |
| 1 | 1746 } |
| 9852 | 1747 decoder->v_offset = (code - 1) * 16; |
| 1748 offset = 0; | |
| 1749 if (!(decoder->convert) || decoder->coding_type != B_TYPE) | |
| 12932 | 1750 offset = (code - 1) * decoder->slice_stride; |
| 1 | 1751 |
| 12932 | 1752 decoder->dest[0] = decoder->picture_dest[0] + offset; |
| 1753 offset >>= (2 - decoder->chroma_format); | |
| 9852 | 1754 decoder->dest[1] = decoder->picture_dest[1] + offset; |
| 1755 decoder->dest[2] = decoder->picture_dest[2] + offset; | |
| 1 | 1756 |
| 12932 | 1757 get_quantizer_scale (decoder); |
| 1 | 1758 |
| 36 | 1759 /* ignore intra_slice and all the extra data */ |
| 1 | 1760 while (bit_buf & 0x80000000) { |
| 1761 DUMPBITS (bit_buf, bits, 9); | |
| 1762 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 1763 } | |
| 9852 | 1764 |
| 1765 /* decode initial macroblock address increment */ | |
| 1766 offset = 0; | |
| 1767 while (1) { | |
| 1768 if (bit_buf >= 0x08000000) { | |
| 1769 mba = MBA_5 + (UBITS (bit_buf, 6) - 2); | |
| 1770 break; | |
| 1771 } else if (bit_buf >= 0x01800000) { | |
| 1772 mba = MBA_11 + (UBITS (bit_buf, 12) - 24); | |
| 1773 break; | |
| 1774 } else switch (UBITS (bit_buf, 12)) { | |
| 1775 case 8: /* macroblock_escape */ | |
| 1776 offset += 33; | |
| 1777 DUMPBITS (bit_buf, bits, 11); | |
| 1778 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 1779 continue; | |
| 1780 case 15: /* macroblock_stuffing (MPEG1 only) */ | |
| 1781 bit_buf &= 0xfffff; | |
| 1782 DUMPBITS (bit_buf, bits, 11); | |
| 1783 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 1784 continue; | |
| 1785 default: /* error */ | |
| 1786 return 1; | |
| 1787 } | |
| 1788 } | |
| 1789 DUMPBITS (bit_buf, bits, mba->len + 1); | |
| 1790 decoder->offset = (offset + mba->mba) << 4; | |
| 1 | 1791 |
| 9852 | 1792 while (decoder->offset - decoder->width >= 0) { |
| 1793 decoder->offset -= decoder->width; | |
| 1794 if (!(decoder->convert) || decoder->coding_type != B_TYPE) { | |
| 12932 | 1795 decoder->dest[0] += decoder->slice_stride; |
| 1796 decoder->dest[1] += decoder->slice_uv_stride; | |
| 1797 decoder->dest[2] += decoder->slice_uv_stride; | |
| 9852 | 1798 } |
| 1799 decoder->v_offset += 16; | |
| 1800 } | |
| 1801 if (decoder->v_offset > decoder->limit_y) | |
| 1802 return 1; | |
| 1803 | |
| 1804 return 0; | |
| 1805 #undef bit_buf | |
| 1806 #undef bits | |
| 1807 #undef bit_ptr | |
| 1808 } | |
| 1809 | |
| 12932 | 1810 void mpeg2_slice (mpeg2_decoder_t * const decoder, const int code, |
| 9852 | 1811 const uint8_t * const buffer) |
| 1812 { | |
| 1813 #define bit_buf (decoder->bitstream_buf) | |
| 1814 #define bits (decoder->bitstream_bits) | |
| 1815 #define bit_ptr (decoder->bitstream_ptr) | |
| 1816 cpu_state_t cpu_state; | |
| 1817 | |
| 1818 bitstream_init (decoder, buffer); | |
| 1819 | |
| 1820 if (slice_init (decoder, code)) | |
| 1821 return; | |
| 1822 | |
| 1823 if (mpeg2_cpu_state_save) | |
| 1824 mpeg2_cpu_state_save (&cpu_state); | |
| 1 | 1825 |
| 1826 while (1) { | |
| 9852 | 1827 int macroblock_modes; |
| 1828 int mba_inc; | |
| 1829 const MBAtab * mba; | |
| 1830 | |
| 1 | 1831 NEEDBITS (bit_buf, bits, bit_ptr); |
| 1832 | |
| 9852 | 1833 macroblock_modes = get_macroblock_modes (decoder); |
| 1 | 1834 |
| 36 | 1835 /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */ |
| 1 | 1836 if (macroblock_modes & MACROBLOCK_QUANT) |
| 12932 | 1837 get_quantizer_scale (decoder); |
| 1 | 1838 |
| 1839 if (macroblock_modes & MACROBLOCK_INTRA) { | |
| 1840 | |
| 1841 int DCT_offset, DCT_stride; | |
| 9852 | 1842 int offset; |
| 1843 uint8_t * dest_y; | |
| 1 | 1844 |
| 9852 | 1845 if (decoder->concealment_motion_vectors) { |
| 1846 if (decoder->picture_structure == FRAME_PICTURE) | |
| 1847 motion_fr_conceal (decoder); | |
| 1 | 1848 else |
| 9852 | 1849 motion_fi_conceal (decoder); |
| 1 | 1850 } else { |
| 9852 | 1851 decoder->f_motion.pmv[0][0] = decoder->f_motion.pmv[0][1] = 0; |
| 1852 decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[1][1] = 0; | |
| 1853 decoder->b_motion.pmv[0][0] = decoder->b_motion.pmv[0][1] = 0; | |
| 1854 decoder->b_motion.pmv[1][0] = decoder->b_motion.pmv[1][1] = 0; | |
| 1 | 1855 } |
| 1856 | |
| 1857 if (macroblock_modes & DCT_TYPE_INTERLACED) { | |
| 9852 | 1858 DCT_offset = decoder->stride; |
| 1859 DCT_stride = decoder->stride * 2; | |
| 1 | 1860 } else { |
| 9852 | 1861 DCT_offset = decoder->stride * 8; |
| 1862 DCT_stride = decoder->stride; | |
| 1 | 1863 } |
| 1864 | |
| 9852 | 1865 offset = decoder->offset; |
| 1866 dest_y = decoder->dest[0] + offset; | |
| 1867 slice_intra_DCT (decoder, 0, dest_y, DCT_stride); | |
| 1868 slice_intra_DCT (decoder, 0, dest_y + 8, DCT_stride); | |
| 1869 slice_intra_DCT (decoder, 0, dest_y + DCT_offset, DCT_stride); | |
| 1870 slice_intra_DCT (decoder, 0, dest_y + DCT_offset + 8, DCT_stride); | |
| 12932 | 1871 if (likely (decoder->chroma_format == 0)) { |
| 1872 slice_intra_DCT (decoder, 1, decoder->dest[1] + (offset >> 1), | |
| 1873 decoder->uv_stride); | |
| 1874 slice_intra_DCT (decoder, 2, decoder->dest[2] + (offset >> 1), | |
| 1875 decoder->uv_stride); | |
| 1876 if (decoder->coding_type == D_TYPE) { | |
| 1877 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 1878 DUMPBITS (bit_buf, bits, 1); | |
| 1879 } | |
| 1880 } else if (likely (decoder->chroma_format == 1)) { | |
| 1881 uint8_t * dest_u = decoder->dest[1] + (offset >> 1); | |
| 1882 uint8_t * dest_v = decoder->dest[2] + (offset >> 1); | |
| 1883 DCT_stride >>= 1; | |
| 1884 DCT_offset >>= 1; | |
| 1885 slice_intra_DCT (decoder, 1, dest_u, DCT_stride); | |
| 1886 slice_intra_DCT (decoder, 2, dest_v, DCT_stride); | |
| 1887 slice_intra_DCT (decoder, 1, dest_u + DCT_offset, DCT_stride); | |
| 1888 slice_intra_DCT (decoder, 2, dest_v + DCT_offset, DCT_stride); | |
| 1889 } else { | |
| 1890 uint8_t * dest_u = decoder->dest[1] + offset; | |
| 1891 uint8_t * dest_v = decoder->dest[2] + offset; | |
| 1892 slice_intra_DCT (decoder, 1, dest_u, DCT_stride); | |
| 1893 slice_intra_DCT (decoder, 2, dest_v, DCT_stride); | |
| 1894 slice_intra_DCT (decoder, 1, dest_u + DCT_offset, DCT_stride); | |
| 1895 slice_intra_DCT (decoder, 2, dest_v + DCT_offset, DCT_stride); | |
| 1896 slice_intra_DCT (decoder, 1, dest_u + 8, DCT_stride); | |
| 1897 slice_intra_DCT (decoder, 2, dest_v + 8, DCT_stride); | |
| 1898 slice_intra_DCT (decoder, 1, dest_u + DCT_offset + 8, | |
| 1899 DCT_stride); | |
| 1900 slice_intra_DCT (decoder, 2, dest_v + DCT_offset + 8, | |
| 1901 DCT_stride); | |
| 1 | 1902 } |
| 1903 } else { | |
| 1904 | |
| 12932 | 1905 motion_parser_t * parser; |
| 1 | 1906 |
| 27572 | 1907 if ( ((macroblock_modes >> MOTION_TYPE_SHIFT) < 0) |
| 1908 || ((macroblock_modes >> MOTION_TYPE_SHIFT) >= | |
|
29264
e83eef58b30a
Remove all kind of trailing whitespaces from all MPlayer's files.
bircoph
parents:
27572
diff
changeset
|
1909 (int)(sizeof(decoder->motion_parser) |
| 27572 | 1910 / sizeof(decoder->motion_parser[0]))) |
| 1911 ) { | |
| 1912 break; // Illegal ! | |
| 1913 } | |
| 1914 | |
| 12932 | 1915 parser = |
| 1916 decoder->motion_parser[macroblock_modes >> MOTION_TYPE_SHIFT]; | |
| 1917 MOTION_CALL (parser, macroblock_modes); | |
| 1 | 1918 |
| 1919 if (macroblock_modes & MACROBLOCK_PATTERN) { | |
| 1920 int coded_block_pattern; | |
| 1921 int DCT_offset, DCT_stride; | |
| 1922 | |
| 1923 if (macroblock_modes & DCT_TYPE_INTERLACED) { | |
| 9852 | 1924 DCT_offset = decoder->stride; |
| 1925 DCT_stride = decoder->stride * 2; | |
| 1 | 1926 } else { |
| 9852 | 1927 DCT_offset = decoder->stride * 8; |
| 1928 DCT_stride = decoder->stride; | |
| 1 | 1929 } |
| 1930 | |
| 9852 | 1931 coded_block_pattern = get_coded_block_pattern (decoder); |
| 1 | 1932 |
| 12932 | 1933 if (likely (decoder->chroma_format == 0)) { |
| 1934 int offset = decoder->offset; | |
| 1935 uint8_t * dest_y = decoder->dest[0] + offset; | |
| 1936 if (coded_block_pattern & 1) | |
| 1937 slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride); | |
| 1938 if (coded_block_pattern & 2) | |
| 1939 slice_non_intra_DCT (decoder, 0, dest_y + 8, | |
| 1940 DCT_stride); | |
| 1941 if (coded_block_pattern & 4) | |
| 1942 slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset, | |
| 1943 DCT_stride); | |
| 1944 if (coded_block_pattern & 8) | |
| 1945 slice_non_intra_DCT (decoder, 0, | |
| 1946 dest_y + DCT_offset + 8, | |
| 1947 DCT_stride); | |
| 1948 if (coded_block_pattern & 16) | |
| 1949 slice_non_intra_DCT (decoder, 1, | |
| 1950 decoder->dest[1] + (offset >> 1), | |
| 1951 decoder->uv_stride); | |
| 1952 if (coded_block_pattern & 32) | |
| 1953 slice_non_intra_DCT (decoder, 2, | |
| 1954 decoder->dest[2] + (offset >> 1), | |
| 1955 decoder->uv_stride); | |
| 1956 } else if (likely (decoder->chroma_format == 1)) { | |
| 1957 int offset; | |
| 1958 uint8_t * dest_y; | |
| 1959 | |
| 1960 coded_block_pattern |= bit_buf & (3 << 30); | |
| 1961 DUMPBITS (bit_buf, bits, 2); | |
| 1962 | |
| 1963 offset = decoder->offset; | |
| 1964 dest_y = decoder->dest[0] + offset; | |
| 1965 if (coded_block_pattern & 1) | |
| 1966 slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride); | |
| 1967 if (coded_block_pattern & 2) | |
| 1968 slice_non_intra_DCT (decoder, 0, dest_y + 8, | |
| 1969 DCT_stride); | |
| 1970 if (coded_block_pattern & 4) | |
| 1971 slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset, | |
| 1972 DCT_stride); | |
| 1973 if (coded_block_pattern & 8) | |
| 1974 slice_non_intra_DCT (decoder, 0, | |
| 1975 dest_y + DCT_offset + 8, | |
| 1976 DCT_stride); | |
| 1977 | |
| 1978 DCT_stride >>= 1; | |
| 1979 DCT_offset = (DCT_offset + offset) >> 1; | |
| 1980 if (coded_block_pattern & 16) | |
| 1981 slice_non_intra_DCT (decoder, 1, | |
| 1982 decoder->dest[1] + (offset >> 1), | |
| 1983 DCT_stride); | |
| 1984 if (coded_block_pattern & 32) | |
| 1985 slice_non_intra_DCT (decoder, 2, | |
| 1986 decoder->dest[2] + (offset >> 1), | |
| 1987 DCT_stride); | |
| 1988 if (coded_block_pattern & (2 << 30)) | |
| 1989 slice_non_intra_DCT (decoder, 1, | |
| 1990 decoder->dest[1] + DCT_offset, | |
| 1991 DCT_stride); | |
| 1992 if (coded_block_pattern & (1 << 30)) | |
| 1993 slice_non_intra_DCT (decoder, 2, | |
| 1994 decoder->dest[2] + DCT_offset, | |
| 1995 DCT_stride); | |
| 1996 } else { | |
| 1997 int offset; | |
| 1998 uint8_t * dest_y, * dest_u, * dest_v; | |
| 1999 | |
| 2000 coded_block_pattern |= bit_buf & (63 << 26); | |
| 2001 DUMPBITS (bit_buf, bits, 6); | |
| 2002 | |
| 2003 offset = decoder->offset; | |
| 2004 dest_y = decoder->dest[0] + offset; | |
| 2005 dest_u = decoder->dest[1] + offset; | |
| 2006 dest_v = decoder->dest[2] + offset; | |
| 2007 | |
| 2008 if (coded_block_pattern & 1) | |
| 2009 slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride); | |
| 2010 if (coded_block_pattern & 2) | |
| 2011 slice_non_intra_DCT (decoder, 0, dest_y + 8, | |
| 2012 DCT_stride); | |
| 2013 if (coded_block_pattern & 4) | |
| 2014 slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset, | |
| 2015 DCT_stride); | |
| 2016 if (coded_block_pattern & 8) | |
| 2017 slice_non_intra_DCT (decoder, 0, | |
| 2018 dest_y + DCT_offset + 8, | |
| 2019 DCT_stride); | |
| 2020 | |
| 2021 if (coded_block_pattern & 16) | |
| 2022 slice_non_intra_DCT (decoder, 1, dest_u, DCT_stride); | |
| 2023 if (coded_block_pattern & 32) | |
| 2024 slice_non_intra_DCT (decoder, 2, dest_v, DCT_stride); | |
| 2025 if (coded_block_pattern & (32 << 26)) | |
| 2026 slice_non_intra_DCT (decoder, 1, dest_u + DCT_offset, | |
| 2027 DCT_stride); | |
| 2028 if (coded_block_pattern & (16 << 26)) | |
| 2029 slice_non_intra_DCT (decoder, 2, dest_v + DCT_offset, | |
| 2030 DCT_stride); | |
| 2031 if (coded_block_pattern & (8 << 26)) | |
| 2032 slice_non_intra_DCT (decoder, 1, dest_u + 8, | |
| 2033 DCT_stride); | |
| 2034 if (coded_block_pattern & (4 << 26)) | |
| 2035 slice_non_intra_DCT (decoder, 2, dest_v + 8, | |
| 2036 DCT_stride); | |
| 2037 if (coded_block_pattern & (2 << 26)) | |
| 2038 slice_non_intra_DCT (decoder, 1, | |
| 2039 dest_u + DCT_offset + 8, | |
| 2040 DCT_stride); | |
| 2041 if (coded_block_pattern & (1 << 26)) | |
| 2042 slice_non_intra_DCT (decoder, 2, | |
| 2043 dest_v + DCT_offset + 8, | |
| 2044 DCT_stride); | |
| 2045 } | |
| 1 | 2046 } |
| 2047 | |
| 9852 | 2048 decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] = |
| 12932 | 2049 decoder->dc_dct_pred[2] = 16384; |
| 1 | 2050 } |
| 2051 | |
| 9852 | 2052 NEXT_MACROBLOCK; |
| 1 | 2053 |
| 2054 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 9852 | 2055 mba_inc = 0; |
| 2056 while (1) { | |
| 2057 if (bit_buf >= 0x10000000) { | |
| 2058 mba = MBA_5 + (UBITS (bit_buf, 5) - 2); | |
| 2059 break; | |
| 2060 } else if (bit_buf >= 0x03000000) { | |
| 2061 mba = MBA_11 + (UBITS (bit_buf, 11) - 24); | |
| 2062 break; | |
| 2063 } else switch (UBITS (bit_buf, 11)) { | |
| 2064 case 8: /* macroblock_escape */ | |
| 2065 mba_inc += 33; | |
| 2066 /* pass through */ | |
| 2067 case 15: /* macroblock_stuffing (MPEG1 only) */ | |
| 2068 DUMPBITS (bit_buf, bits, 11); | |
| 2069 NEEDBITS (bit_buf, bits, bit_ptr); | |
| 142 | 2070 continue; |
| 9852 | 2071 default: /* end of slice, or error */ |
| 2072 if (mpeg2_cpu_state_restore) | |
| 2073 mpeg2_cpu_state_restore (&cpu_state); | |
| 2074 return; | |
| 2075 } | |
| 2076 } | |
| 2077 DUMPBITS (bit_buf, bits, mba->len); | |
| 2078 mba_inc += mba->mba; | |
| 1 | 2079 |
| 9852 | 2080 if (mba_inc) { |
| 2081 decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] = | |
| 12932 | 2082 decoder->dc_dct_pred[2] = 16384; |
| 1 | 2083 |
| 9852 | 2084 if (decoder->coding_type == P_TYPE) { |
| 1 | 2085 do { |
| 12932 | 2086 MOTION_CALL (decoder->motion_parser[0], |
| 2087 MACROBLOCK_MOTION_FORWARD); | |
| 9852 | 2088 NEXT_MACROBLOCK; |
| 1 | 2089 } while (--mba_inc); |
| 2090 } else { | |
| 2091 do { | |
| 12932 | 2092 MOTION_CALL (decoder->motion_parser[4], macroblock_modes); |
| 9852 | 2093 NEXT_MACROBLOCK; |
| 1 | 2094 } while (--mba_inc); |
| 2095 } | |
| 2096 } | |
| 2097 } | |
| 2098 #undef bit_buf | |
| 2099 #undef bits | |
| 2100 #undef bit_ptr | |
| 2101 } |
