1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #include "mp4dec_lib.h" 19 #include "bitstream.h" 20 #include "vlc_decode.h" 21 #include "zigzag.h" 22 23 #define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA 24 25 #ifdef PV_SUPPORT_MAIN_PROFILE 26 /* INTRA */ 27 const static int mpeg_iqmat_def[NCOEFF_BLOCK] = 28 { 29 8, 17, 18, 19, 21, 23, 25, 27, 30 17, 18, 19, 21, 23, 25, 27, 28, 31 20, 21, 22, 23, 24, 26, 28, 30, 32 21, 22, 23, 24, 26, 28, 30, 32, 33 22, 23, 24, 26, 28, 30, 32, 35, 34 23, 24, 26, 28, 30, 32, 35, 38, 35 25, 26, 28, 30, 32, 35, 38, 41, 36 27, 28, 30, 32, 35, 38, 41, 45 37 }; 38 39 /* INTER */ 40 const static int mpeg_nqmat_def[64] = 41 { 42 16, 17, 18, 19, 20, 21, 22, 23, 43 17, 18, 19, 20, 21, 22, 23, 24, 44 18, 19, 20, 21, 22, 23, 24, 25, 45 19, 20, 21, 22, 23, 24, 26, 27, 46 20, 21, 22, 23, 25, 26, 27, 28, 47 21, 22, 23, 24, 26, 27, 28, 30, 48 22, 23, 24, 26, 27, 28, 30, 31, 49 23, 24, 25, 27, 28, 30, 31, 33 50 }; 51 #endif 52 53 /* ======================================================================== */ 54 /* Function : CalcNumBits() */ 55 /* Purpose : */ 56 /* In/out : */ 57 /* Return : Calculate the minimum number of bits required to */ 58 /* represent x. */ 59 /* Note : This is an equivalent implementation of */ 60 /* (long)ceil(log((double)x)/log(2.0)) */ 61 /* Modified : */ 62 /* ======================================================================== */ 63 int CalcNumBits(uint x) 64 { 65 int i = 1; 66 while (x >>= 1) i++; 67 return i; 68 } 69 70 71 72 /***********************************************************CommentBegin****** 73 * 74 * -- DecodeVolHeader -- Decode the header of a VOL 75 * 76 * 04/10/2000 : initial modification to the new PV-Decoder Lib format. 77 * 10/12/2001 : reject non compliant bitstreams 78 * 79 ***********************************************************CommentEnd********/ 80 PV_STATUS DecodeVOLHeader(VideoDecData *video, int layer) 81 { 82 PV_STATUS status; 83 Vol *currVol; 84 BitstreamDecVideo *stream; 85 uint32 tmpvar, vol_shape; 86 uint32 startCode; 87 #ifdef PV_SUPPORT_MAIN_PROFILE 88 int *qmat, i, j; 89 #endif 90 int version_id = 1; 91 #ifdef PV_TOLERATE_VOL_ERRORS 92 uint32 profile = 0x01; 93 #endif 94 /* There's a "currLayer" variable inside videoDecData. */ 95 /* However, we don't maintain it until we decode frame data. 04/05/2000 */ 96 currVol = video->vol[layer]; 97 stream = currVol->bitstream; 98 currVol->moduloTimeBase = 0; 99 100 /* Determine which start code for the decoder to begin with */ 101 status = BitstreamShowBits32HC(stream, &startCode); 102 103 if (startCode == VISUAL_OBJECT_SEQUENCE_START_CODE) 104 { /* Bitstream Exhchange Fix 9/99 */ 105 /* Bitstream Exchange requires we allow start with Video Object Sequence */ 106 /* visual_object_sequence_start_code */ 107 (void) BitstreamReadBits32HC(stream); 108 tmpvar = (uint32) BitstreamReadBits16(stream, 8); /* profile */ 109 #ifndef PV_TOLERATE_VOL_ERRORS 110 if (layer) /* */ 111 { 112 /* support SSPL0-2 */ 113 if (tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 && 114 tmpvar != 0xA1 && tmpvar != 0xA2 && tmpvar != 0xA3/* Core SP@L1-L3 */) 115 return PV_FAIL; 116 } 117 else 118 { 119 /* support SPL0-3 & SSPL0-2 */ 120 if (tmpvar != 0x01 && tmpvar != 0x02 && tmpvar != 0x03 && tmpvar != 0x08 && 121 /* While not technically supported, try to decode SPL4&SPL5 files as well. */ 122 /* We'll fail later if the size is too large. This is to allow playback of */ 123 /* some <=CIF files generated by other encoders. */ 124 tmpvar != 0x04 && tmpvar != 0x05 && 125 tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 && 126 tmpvar != 0x21 && tmpvar != 0x22 && /* Core Profile Levels */ 127 tmpvar != 0xA1 && tmpvar != 0xA2 && tmpvar != 0xA3 && 128 tmpvar != 0xF0 && tmpvar != 0xF1 && /* Advanced Simple Profile Levels*/ 129 tmpvar != 0xF2 && tmpvar != 0xF3 && 130 tmpvar != 0xF4 && tmpvar != 0xF5) 131 return PV_FAIL; 132 } 133 #else 134 profile = tmpvar; 135 #endif 136 137 // save the profile and level for the query 138 currVol->profile_level_id = (uint)tmpvar; // 6/10/04 139 140 141 142 status = BitstreamShowBits32HC(stream, &tmpvar); 143 if (tmpvar == USER_DATA_START_CODE) 144 { 145 /* Something has to be done with user data 11/11/99 */ 146 status = DecodeUserData(stream); 147 if (status != PV_SUCCESS) return PV_FAIL; 148 } 149 /* visual_object_start_code */ 150 BitstreamShowBits32HC(stream, &tmpvar); 151 if (tmpvar != VISUAL_OBJECT_START_CODE) 152 { 153 do 154 { 155 /* Search for VOL_HEADER */ 156 status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */ 157 if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */ 158 BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar); 159 PV_BitstreamFlushBits(stream, 8); 160 } 161 while (tmpvar != VOL_START_CODE); 162 goto decode_vol; 163 } 164 else 165 { 166 BitstreamReadBits32HC(stream); 167 } 168 169 /* is_visual_object_identifier */ 170 tmpvar = (uint32) BitstreamRead1Bits(stream); 171 if (tmpvar) 172 { 173 /* visual_object_verid */ 174 tmpvar = (uint32) BitstreamReadBits16(stream, 4); 175 /* visual_object_priority */ 176 tmpvar = (uint32) BitstreamReadBits16(stream, 3); 177 } 178 /* visual_object_type */ 179 BitstreamShowBits32(stream, 4, &tmpvar); 180 if (tmpvar == 1) 181 { /* video_signal_type */ 182 PV_BitstreamFlushBits(stream, 4); 183 tmpvar = (uint32) BitstreamRead1Bits(stream); 184 if (tmpvar == 1) 185 { 186 /* video_format */ 187 tmpvar = (uint32) BitstreamReadBits16(stream, 3); 188 /* video_range */ 189 tmpvar = (uint32) BitstreamRead1Bits(stream); 190 /* color_description */ 191 tmpvar = (uint32) BitstreamRead1Bits(stream); 192 if (tmpvar == 1) 193 { 194 /* color_primaries */ 195 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 196 /* transfer_characteristics */ 197 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 198 /* matrix_coefficients */ 199 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 200 } 201 } 202 } 203 else 204 { 205 do 206 { 207 /* Search for VOL_HEADER */ 208 status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */ 209 if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */ 210 BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar); 211 PV_BitstreamFlushBits(stream, 8); 212 } 213 while (tmpvar != VOL_START_CODE); 214 goto decode_vol; 215 } 216 217 /* next_start_code() */ 218 status = PV_BitstreamByteAlign(stream); /* 10/12/01 */ 219 status = BitstreamShowBits32HC(stream, &tmpvar); 220 221 if (tmpvar == USER_DATA_START_CODE) 222 { 223 /* Something has to be done to deal with user data (parse it) 11/11/99 */ 224 status = DecodeUserData(stream); 225 if (status != PV_SUCCESS) return PV_FAIL; 226 } 227 status = BitstreamShowBits32(stream, 27, &tmpvar); /* 10/12/01 */ 228 } 229 else 230 { 231 /* tmpvar = 0; */ /* 10/12/01 */ 232 status = BitstreamShowBits32(stream, 27, &tmpvar); /* uncomment this line if you want 233 to start decoding with a 234 video_object_start_code */ 235 } 236 237 if (tmpvar == VO_START_CODE) 238 { 239 /***** 240 * 241 * Read the VOL header entries from the bitstream 242 * 243 *****/ 244 /* video_object_start_code */ 245 tmpvar = BitstreamReadBits32(stream, 27); 246 tmpvar = (uint32) BitstreamReadBits16(stream, 5); 247 248 249 /* video_object_layer_start_code */ 250 BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar); 251 if (tmpvar != VOL_START_CODE) 252 { 253 status = BitstreamCheckEndBuffer(stream); 254 if (status == PV_END_OF_VOP) 255 { 256 video->shortVideoHeader = TRUE; 257 return PV_SUCCESS; 258 } 259 else 260 { 261 do 262 { 263 /* Search for VOL_HEADER */ 264 status = PVSearchNextM4VFrame(stream);/* search 0x00 0x00 0x01 */ 265 if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */ 266 BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar); 267 PV_BitstreamFlushBits(stream, 8); /* advance the byte ptr */ 268 } 269 while (tmpvar != VOL_START_CODE); 270 } 271 } 272 else 273 { 274 PV_BitstreamFlushBits(stream, 8); 275 } 276 277 decode_vol: 278 PV_BitstreamFlushBits(stream, VOL_START_CODE_LENGTH - 8); 279 video->shortVideoHeader = 0; 280 281 /* vol_id (4 bits) */ 282 currVol->volID = (int) BitstreamReadBits16(stream, 4); 283 284 /* RandomAccessible flag */ 285 tmpvar = (uint32) BitstreamRead1Bits(stream); 286 287 /* object type */ 288 tmpvar = (uint32) BitstreamReadBits16(stream, 8); /* */ 289 290 #ifdef PV_TOLERATE_VOL_ERRORS 291 if (tmpvar == 0) 292 { 293 if (layer) /* */ 294 { 295 /* support SSPL0-2 */ 296 if (profile != 0x10 && profile != 0x11 && profile != 0x12) 297 return PV_FAIL; 298 tmpvar = 0x02; 299 } 300 else 301 { 302 /* support SPL0-3 & SSPL0-2 */ 303 if (profile != 0x01 && profile != 0x02 && profile != 0x03 && profile != 0x08 && 304 profile != 0x10 && profile != 0x11 && profile != 0x12) 305 return PV_FAIL; 306 tmpvar = 0x01; 307 } 308 profile |= 0x0100; 309 } 310 #endif 311 312 if (layer) 313 { 314 if (tmpvar != 0x02) return PV_FAIL; 315 } 316 else 317 { 318 if (tmpvar != 0x01) return PV_FAIL; 319 } 320 321 /* version id specified? */ 322 tmpvar = (uint32) BitstreamRead1Bits(stream); 323 if (tmpvar == 1) 324 { 325 /* version ID */ 326 version_id = (uint32) BitstreamReadBits16(stream, 4); 327 /* priority */ 328 tmpvar = (uint32) BitstreamReadBits16(stream, 3); 329 330 } 331 332 /* aspect ratio info */ 333 tmpvar = (uint32) BitstreamReadBits16(stream, 4); 334 if (tmpvar == 0) return PV_FAIL; 335 if (tmpvar == 0xf /* extended_par */) 336 { 337 /* width */ 338 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 339 /* height */ 340 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 341 } 342 343 344 /* control parameters present? */ 345 tmpvar = (uint32) BitstreamRead1Bits(stream); 346 347 /* Get the parameters (skipped) */ 348 /* 03/10/99 */ 349 if (tmpvar) 350 { 351 /* chroma_format */ 352 tmpvar = BitstreamReadBits16(stream, 2); 353 if (tmpvar != 1) return PV_FAIL; 354 /* low_delay */ 355 tmpvar = BitstreamRead1Bits(stream); 356 357 /* vbv_parameters present? */ 358 tmpvar = (uint32) BitstreamRead1Bits(stream); 359 if (tmpvar) 360 { 361 /* first_half_bit_rate */ 362 BitstreamReadBits16(stream, 15); 363 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 364 /* latter_half_bit_rate */ 365 BitstreamReadBits16(stream, 15); 366 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 367 /* first_half_vbv_buffer_size */ 368 BitstreamReadBits16(stream, 15); 369 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 370 /* latter_half_vbv_buffer_size */ 371 BitstreamReadBits16(stream, 3); 372 /* first_half_vbv_occupancy */ 373 BitstreamReadBits16(stream, 11); 374 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 375 /* latter_half_vbv_occupancy */ 376 BitstreamReadBits16(stream, 15); 377 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 378 } 379 } 380 381 /* video_object_layer_shape (2 bits), only 00 (rect) is supported for now */ 382 vol_shape = (uint32) BitstreamReadBits16(stream, 2); 383 if (vol_shape) return PV_FAIL; 384 385 /* marker bit, 03/10/99 */ 386 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 387 388 /* vop_time_increment_resolution */ 389 currVol->timeIncrementResolution = BitstreamReadBits16(stream, 16); 390 if (currVol->timeIncrementResolution == 0) return PV_FAIL; 391 392 /* . since nbitsTimeIncRes will be used over and over again, */ 393 /* we should put it in Vol structure. 04/12/2000. */ 394 currVol->nbitsTimeIncRes = CalcNumBits((uint)currVol->timeIncrementResolution - 1); 395 396 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 397 398 /* fixed_vop_rate */ 399 currVol->fixedVopRate = (int) BitstreamRead1Bits(stream); 400 if (currVol->fixedVopRate) 401 { 402 /* fixed_vop_time_increment */ 403 tmpvar = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes); 404 } 405 406 /* marker bit */ 407 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 408 409 /* video_object_layer_width (13 bits) */ 410 video->displayWidth = video->width = (int) BitstreamReadBits16(stream, 13); 411 412 /* round up to a multiple of MB_SIZE. 08/09/2000 */ 413 video->width = (video->width + 15) & -16; 414 // video->displayWidth += (video->displayWidth & 0x1); /* displayed image should be even size */ 415 416 /* marker bit */ 417 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 418 419 /* video_object_layer_height (13 bits) */ 420 video->displayHeight = video->height = (int) BitstreamReadBits16(stream, 13); 421 422 /* round up to a multiple of MB_SIZE. 08/09/2000 */ 423 video->height = (video->height + 15) & -16; 424 // video->displayHeight += (video->displayHeight & 0x1); /* displayed image should be even size */ 425 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 426 427 /* 03/10/99 */ 428 /* interlaced */ 429 tmpvar = (uint32) BitstreamRead1Bits(stream); 430 if (tmpvar != 0) 431 { 432 mp4dec_log("DecodeVOLHeader(): Interlaced video is not supported.\n"); 433 return PV_FAIL; 434 } 435 436 /* obmc_disable */ 437 tmpvar = (uint32) BitstreamRead1Bits(stream); 438 if (tmpvar == 0) return PV_FAIL; 439 440 if (version_id == 1) 441 { 442 /* sprite_enable (1 bits) */ 443 tmpvar = (uint32) BitstreamRead1Bits(stream); 444 if (tmpvar) 445 { 446 mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n"); 447 return PV_FAIL; 448 } 449 } 450 else 451 { 452 /* For version 2, vol_sprite_usage has two bits. */ 453 /* sprite_enable */ 454 tmpvar = (uint32) BitstreamReadBits16(stream, 2); 455 if (tmpvar) 456 { 457 mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n"); 458 return PV_FAIL; 459 } 460 } 461 462 /* not_8_bit */ 463 if (BitstreamRead1Bits(stream)) 464 { 465 /* quant_precision */ 466 currVol->quantPrecision = BitstreamReadBits16(stream, 4); 467 /* bits_per_pixel */ 468 currVol->bitsPerPixel = BitstreamReadBits16(stream, 4); 469 mp4dec_log("DecodeVOLHeader(): not an 8-bit stream.\n"); // For the time being we do not support != 8 bits 470 471 return PV_FAIL; 472 } 473 else 474 { 475 currVol->quantPrecision = 5; 476 currVol->bitsPerPixel = 8; 477 } 478 479 /* quant_type (1 bit) */ 480 currVol->quantType = BitstreamRead1Bits(stream); 481 if (currVol->quantType) 482 { 483 #ifdef PV_SUPPORT_MAIN_PROFILE 484 /* load quantization matrices. 5/22/2000 */ 485 /* load_intra_quant_mat (1 bit) */ 486 qmat = currVol->iqmat; 487 currVol->loadIntraQuantMat = BitstreamRead1Bits(stream); 488 if (currVol->loadIntraQuantMat) 489 { 490 /* intra_quant_mat (8*64 bits) */ 491 i = 0; 492 do 493 { 494 qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8); 495 } 496 while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64)); 497 498 for (j = i; j < 64; j++) 499 qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)]; 500 } 501 else 502 { 503 oscl_memcpy(qmat, mpeg_iqmat_def, 64*sizeof(int)); 504 } 505 506 qmat[0] = 0; /* necessary for switched && MPEG quant 07/09/01 */ 507 508 /* load_nonintra_quant_mat (1 bit) */ 509 qmat = currVol->niqmat; 510 currVol->loadNonIntraQuantMat = BitstreamRead1Bits(stream); 511 if (currVol->loadNonIntraQuantMat) 512 { 513 /* nonintra_quant_mat (8*64 bits) */ 514 i = 0; 515 do 516 { 517 qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8); 518 } 519 while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64)); 520 521 for (j = i; j < 64; j++) 522 qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)]; 523 } 524 else 525 { 526 oscl_memcpy(qmat, mpeg_nqmat_def, 64*sizeof(int)); 527 } 528 #else 529 return PV_FAIL; 530 #endif 531 } 532 533 if (version_id != 1) 534 { 535 /* quarter_sample enabled */ 536 tmpvar = BitstreamRead1Bits(stream); 537 if (tmpvar) return PV_FAIL; 538 } 539 540 /* complexity_estimation_disable */ 541 currVol->complexity_estDisable = BitstreamRead1Bits(stream); 542 if (currVol->complexity_estDisable == 0) 543 { 544 currVol->complexity_estMethod = BitstreamReadBits16(stream, 2); 545 546 if (currVol->complexity_estMethod < 2) 547 { 548 /* shape_complexity_estimation_disable */ 549 tmpvar = BitstreamRead1Bits(stream); 550 if (tmpvar == 0) 551 { 552 mp4dec_log("DecodeVOLHeader(): Shape Complexity estimation is not supported.\n"); 553 return PV_FAIL; 554 } 555 /* texture_complexity_estimation_set_1_disable */ 556 tmpvar = BitstreamRead1Bits(stream); 557 if (tmpvar == 0) 558 { 559 currVol->complexity.text_1 = BitstreamReadBits16(stream, 4); 560 } 561 /* marker bit */ 562 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 563 /* texture_complexity_estimation_set_2_disable */ 564 tmpvar = BitstreamRead1Bits(stream); 565 if (tmpvar == 0) 566 { 567 currVol->complexity.text_2 = BitstreamReadBits16(stream, 4); 568 } 569 /* motion_compensation_complexity_disable */ 570 tmpvar = BitstreamRead1Bits(stream); 571 if (tmpvar == 0) 572 { 573 currVol->complexity.mc = BitstreamReadBits16(stream, 6); 574 } 575 /* marker bit */ 576 if (!BitstreamRead1Bits(stream)) return PV_FAIL; 577 578 if (currVol->complexity_estMethod == 1) 579 { /* version2_complexity_estimation_disable */ 580 tmpvar = BitstreamRead1Bits(stream); 581 if (tmpvar == 0) 582 { 583 mp4dec_log("DecodeVOLHeader(): sadct, quarter pel not supported.\n"); 584 return PV_FAIL; 585 } 586 } 587 } 588 } 589 590 /* 03/10/99 */ 591 /* resync_marker_disable */ 592 currVol->errorResDisable = (int) BitstreamRead1Bits(stream); 593 /* data_partititioned */ 594 currVol->dataPartitioning = (int) BitstreamRead1Bits(stream); 595 596 video->vlcDecCoeffIntra = &VlcDecTCOEFIntra; 597 video->vlcDecCoeffInter = &VlcDecTCOEFInter; 598 599 if (currVol->dataPartitioning) 600 { 601 if (layer) return PV_FAIL; /* */ 602 /* reversible_vlc */ 603 currVol->useReverseVLC = (int)BitstreamRead1Bits(stream); 604 if (currVol->useReverseVLC) 605 { 606 video->vlcDecCoeffIntra = &RvlcDecTCOEFIntra; 607 video->vlcDecCoeffInter = &RvlcDecTCOEFInter; 608 } 609 currVol->errorResDisable = 0; 610 } 611 else 612 { 613 currVol->useReverseVLC = 0; 614 } 615 616 if (version_id != 1) 617 { 618 /* newpred_enable */ 619 tmpvar = BitstreamRead1Bits(stream); 620 if (tmpvar) return PV_FAIL; 621 622 /* reduced_resolution_vop */ 623 tmpvar = BitstreamRead1Bits(stream); 624 if (tmpvar) return PV_FAIL; 625 626 } 627 628 /* Intra AC/DC prediction is always true */ 629 video->intra_acdcPredDisable = 0; 630 /* scalability */ 631 currVol->scalability = (int) BitstreamRead1Bits(stream); 632 633 if (currVol->scalability) 634 { 635 if (layer == 0) return PV_FAIL; /* */ 636 /* hierarchy_type: 1 : temporal, 0 : spatial */ 637 /* 03/10/99 */ 638 currVol->scalType = (int) BitstreamRead1Bits(stream); /* */ 639 if (!currVol->scalType) return PV_FAIL; 640 641 /* ref_layer_id (4 bits) */ 642 currVol->refVolID = (int) BitstreamReadBits16(stream, 4); 643 if (layer) /* */ 644 { 645 if (currVol->refVolID != video->vol[0]->volID) return PV_FAIL; 646 } 647 /* ref_layer_sampling_direc (1 bits) */ 648 /* 1 : ref. layer has higher resolution */ 649 /* 0 : ref. layer has equal or lower resolution */ 650 currVol->refSampDir = (int) BitstreamRead1Bits(stream); 651 if (currVol->refSampDir) return PV_FAIL; 652 653 /* hor_sampling_factor_n (5 bits) */ 654 currVol->horSamp_n = (int) BitstreamReadBits16(stream, 5); 655 656 /* hor_sampling_factor_m (5 bits) */ 657 currVol->horSamp_m = (int) BitstreamReadBits16(stream, 5); 658 659 if (currVol->horSamp_m == 0) return PV_FAIL; 660 if (currVol->horSamp_n != currVol->horSamp_m) return PV_FAIL; 661 662 /* ver_sampling_factor_n (5 bits) */ 663 currVol->verSamp_n = (int) BitstreamReadBits16(stream, 5); 664 665 /* ver_sampling_factor_m (5 bits) */ 666 currVol->verSamp_m = (int) BitstreamReadBits16(stream, 5); 667 668 if (currVol->verSamp_m == 0) return PV_FAIL; 669 if (currVol->verSamp_n != currVol->verSamp_m) return PV_FAIL; 670 671 672 /* enhancement_type: 1 : partial region, 0 : full region */ 673 /* 04/10/2000: we only support full region enhancement layer. */ 674 if (BitstreamRead1Bits(stream)) return PV_FAIL; 675 } 676 677 PV_BitstreamByteAlign(stream); 678 679 status = BitstreamShowBits32HC(stream, &tmpvar); 680 681 /* if we hit the end of buffer, tmpvar == 0. 08/30/2000 */ 682 if (tmpvar == USER_DATA_START_CODE) 683 { 684 status = DecodeUserData(stream); 685 /* you should not check for status here 03/19/2002 */ 686 status = PV_SUCCESS; 687 } 688 689 /* Compute some convenience variables: 04/13/2000 */ 690 video->nMBPerRow = video->width / MB_SIZE; 691 video->nMBPerCol = video->height / MB_SIZE; 692 video->nTotalMB = video->nMBPerRow * video->nMBPerCol; 693 video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1); 694 #ifdef PV_ANNEX_IJKT_SUPPORT 695 video->modified_quant = 0; 696 video->advanced_INTRA = 0; 697 video->deblocking = 0; 698 video->slice_structure = 0; 699 #endif 700 } 701 else 702 { 703 /* SHORT_HEADER */ 704 status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar); 705 706 if (tmpvar == SHORT_VIDEO_START_MARKER) 707 { 708 video->shortVideoHeader = TRUE; 709 } 710 else 711 { 712 do 713 { 714 /* Search for VOL_HEADER */ 715 status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */ 716 if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */ 717 BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar); 718 PV_BitstreamFlushBits(stream, 8); 719 } 720 while (tmpvar != VOL_START_CODE); 721 goto decode_vol; 722 } 723 } 724 #ifdef PV_TOLERATE_VOL_ERRORS 725 if (profile > 0xFF || profile == 0) 726 { 727 return PV_BAD_VOLHEADER; 728 } 729 #endif 730 731 return status; 732 } 733 734 735 /***********************************************************CommentBegin****** 736 * 737 * -- DecodeGOV -- Decodes the Group of VOPs from bitstream 738 * 739 * 04/20/2000 initial modification to the new PV-Decoder Lib format. 740 * 741 ***********************************************************CommentEnd********/ 742 PV_STATUS DecodeGOVHeader(BitstreamDecVideo *stream, uint32 *time_base) 743 { 744 uint32 tmpvar, time_s; 745 int closed_gov, broken_link; 746 747 /* group_start_code (32 bits) */ 748 // tmpvar = BitstreamReadBits32(stream, 32); 749 750 /* hours */ 751 tmpvar = (uint32) BitstreamReadBits16(stream, 5); 752 time_s = tmpvar * 3600; 753 754 /* minutes */ 755 tmpvar = (uint32) BitstreamReadBits16(stream, 6); 756 time_s += tmpvar * 60; 757 758 /* marker bit */ 759 tmpvar = (uint32) BitstreamRead1Bits(stream); 760 761 /* seconds */ 762 tmpvar = (uint32) BitstreamReadBits16(stream, 6); 763 time_s += tmpvar; 764 765 /* We have to check the timestamp here. If the sync timestamp is */ 766 /* earlier than the previous timestamp or longer than 60 sec. */ 767 /* after the previous timestamp, assume the GOV header is */ 768 /* corrupted. 05/12/2000 */ 769 *time_base = time_s; /* 02/27/2002 */ 770 // *time_base = *time_base/1000; 771 // tmpvar = time_s - *time_base; 772 // if (tmpvar <= 60) *time_base = time_s; 773 // else return PV_FAIL; 774 775 tmpvar = (uint32) BitstreamRead1Bits(stream); 776 closed_gov = tmpvar; 777 tmpvar = (uint32) BitstreamRead1Bits(stream); 778 broken_link = tmpvar; 779 780 if ((closed_gov == 0) && (broken_link == 1)) 781 { 782 return PV_SUCCESS; /* 03/15/2002 you can also return PV_FAIL */ 783 } 784 785 PV_BitstreamByteAlign(stream); 786 787 BitstreamShowBits32HC(stream, &tmpvar); 788 789 while (tmpvar == USER_DATA_START_CODE) /* 03/15/2002 */ 790 { 791 DecodeUserData(stream); 792 BitstreamShowBits32HC(stream, &tmpvar); 793 } 794 795 return PV_SUCCESS; 796 } 797 798 /***********************************************************CommentBegin****** 799 * 800 * -- DecodeVopHeader -- Decodes the VOPheader information from the bitstream 801 * 802 * 04/12/2000 Initial port to the new PV decoder library format. 803 * 05/10/2000 Error resilient decoding of vop header. 804 * 805 ***********************************************************CommentEnd********/ 806 PV_STATUS DecodeVOPHeader(VideoDecData *video, Vop *currVop, Bool use_ext_timestamp) 807 { 808 PV_STATUS status = PV_SUCCESS; 809 Vol *currVol = video->vol[video->currLayer]; 810 BitstreamDecVideo *stream = currVol->bitstream; 811 uint32 tmpvar; 812 int time_base; 813 814 /***** 815 * Read the VOP header from the bitstream (No shortVideoHeader Mode here!) 816 *****/ 817 BitstreamShowBits32HC(stream, &tmpvar); 818 819 /* check if we have a GOV header here. 08/30/2000 */ 820 if (tmpvar == GROUP_START_CODE) 821 { 822 tmpvar = BitstreamReadBits32HC(stream); 823 // rewindBitstream(stream, START_CODE_LENGTH); /* for backward compatibility */ 824 status = DecodeGOVHeader(stream, &tmpvar); 825 if (status != PV_SUCCESS) 826 { 827 return status; 828 } 829 // use_ext_timestamp = TRUE; /* 02/08/2002 */ 830 /* We should have a VOP header following the GOV header. 03/15/2001 */ 831 BitstreamShowBits32HC(stream, &tmpvar); 832 } 833 #ifdef PV_SUPPORT_TEMPORAL_SCALABILITY 834 currVop->timeStamp = -1; 835 #endif 836 if (tmpvar == VOP_START_CODE) 837 { 838 tmpvar = BitstreamReadBits32HC(stream); 839 } 840 else 841 { 842 PV_BitstreamFlushBits(stream, 8); // advance by a byte 843 status = PV_FAIL; 844 goto return_point; 845 } 846 847 848 849 /* vop_prediction_type (2 bits) */ 850 currVop->predictionType = (int) BitstreamReadBits16(stream, 2); 851 852 /* modulo_time_base (? bits) */ 853 time_base = -1; 854 do 855 { 856 time_base++; 857 tmpvar = (uint32) BitstreamRead1Bits(stream); 858 } 859 while (tmpvar == 1); 860 861 862 863 if (!use_ext_timestamp) 864 { 865 currVol->moduloTimeBase += 1000 * time_base; /* milliseconds based MTB 11/12/01 */ 866 } 867 868 /* marker_bit (1 bit) */ 869 if (!BitstreamRead1Bits(stream)) 870 { 871 status = PV_FAIL; 872 goto return_point; 873 } 874 875 /* vop_time_increment (1-15 bits) in Nov_Compliant (1-16 bits) */ 876 /* we always assumes fixed vop rate here */ 877 currVop->timeInc = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes); 878 879 880 /* marker_bit (1 bit) */ 881 if (!BitstreamRead1Bits(stream)) 882 { 883 status = PV_FAIL; 884 goto return_point; 885 } 886 887 /* vop_coded */ 888 currVop->vopCoded = (int) BitstreamRead1Bits(stream); 889 890 891 if (currVop->vopCoded == 0) 892 { 893 status = PV_SUCCESS; 894 goto return_point; 895 } 896 897 898 /* read vop_rounding_type */ 899 if (currVop->predictionType == P_VOP) 900 { 901 currVop->roundingType = (int) BitstreamRead1Bits(stream); 902 } 903 else 904 { 905 currVop->roundingType = 0; 906 } 907 908 if (currVol->complexity_estDisable == 0) 909 { 910 if (currVol->complexity_estMethod < 2) /* OCT 2002 */ 911 { 912 if ((currVol->complexity.text_1 >> 3) & 0x1) /* intra */ 913 BitstreamReadBits16(stream, 8); 914 if (currVol->complexity.text_1 & 0x1) /* not_coded */ 915 BitstreamReadBits16(stream, 8); 916 if ((currVol->complexity.text_2 >> 3) & 0x1) /* dct_coefs */ 917 BitstreamReadBits16(stream, 8); 918 if ((currVol->complexity.text_2 >> 2) & 0x1) /* dct_lines */ 919 BitstreamReadBits16(stream, 8); 920 if ((currVol->complexity.text_2 >> 1) & 0x1) /* vlc_symbols */ 921 BitstreamReadBits16(stream, 8); 922 if (currVol->complexity.text_2 & 0x1) /* vlc_bits */ 923 BitstreamReadBits16(stream, 4); 924 925 if (currVop->predictionType != I_VOP) 926 { 927 if ((currVol->complexity.text_1 >> 2) & 0x1) /* inter */ 928 BitstreamReadBits16(stream, 8); 929 if ((currVol->complexity.text_1 >> 1) & 0x1) /* inter_4v */ 930 BitstreamReadBits16(stream, 8); 931 if ((currVol->complexity.mc >> 5) & 0x1) /* apm */ 932 BitstreamReadBits16(stream, 8); 933 if ((currVol->complexity.mc >> 4) & 0x1) /* npm */ 934 BitstreamReadBits16(stream, 8); 935 /* interpolate_mc_q */ 936 if ((currVol->complexity.mc >> 2) & 0x1) /* forw_back_mc_q */ 937 BitstreamReadBits16(stream, 8); 938 if ((currVol->complexity.mc >> 1) & 0x1) /* halfpel2 */ 939 BitstreamReadBits16(stream, 8); 940 if (currVol->complexity.mc & 0x1) /* halfpel4 */ 941 BitstreamReadBits16(stream, 8); 942 } 943 if (currVop->predictionType == B_VOP) 944 { 945 if ((currVol->complexity.mc >> 3) & 0x1) /* interpolate_mc_q */ 946 BitstreamReadBits16(stream, 8); 947 } 948 } 949 } 950 951 /* read intra_dc_vlc_thr */ 952 currVop->intraDCVlcThr = (int) BitstreamReadBits16(stream, 3); 953 954 /* read vop_quant (currVol->quantPrecision bits) */ 955 currVop->quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision); 956 if (currVop->quantizer == 0) 957 { 958 currVop->quantizer = video->prevVop->quantizer; 959 status = PV_FAIL; 960 goto return_point; 961 } 962 963 964 /* read vop_fcode_forward */ 965 if (currVop->predictionType != I_VOP) 966 { 967 tmpvar = (uint32) BitstreamReadBits16(stream, 3); 968 if (tmpvar < 1) 969 { 970 currVop->fcodeForward = 1; 971 status = PV_FAIL; 972 goto return_point; 973 } 974 currVop->fcodeForward = tmpvar; 975 } 976 else 977 { 978 currVop->fcodeForward = 0; 979 } 980 981 /* read vop_fcode_backward */ 982 if (currVop->predictionType == B_VOP) 983 { 984 tmpvar = (uint32) BitstreamReadBits16(stream, 3); 985 if (tmpvar < 1) 986 { 987 currVop->fcodeBackward = 1; 988 status = PV_FAIL; 989 goto return_point; 990 } 991 currVop->fcodeBackward = tmpvar; 992 } 993 else 994 { 995 currVop->fcodeBackward = 0; 996 } 997 998 if (currVol->scalability) 999 { 1000 currVop->refSelectCode = (int) BitstreamReadBits16(stream, 2); 1001 } 1002 1003 return_point: 1004 return status; 1005 } 1006 1007 1008 /***********************************************************CommentBegin****** 1009 * 1010 * -- VideoPlaneWithShortHeader -- Decodes the short_video_header information from the bitstream 1011 * Modified : 1012 04/23/2001. Remove the codes related to the 1013 "first pass" decoding. We use a different function 1014 to set up the decoder now. 1015 ***********************************************************CommentEnd********/ 1016 PV_STATUS DecodeShortHeader(VideoDecData *video, Vop *currVop) 1017 { 1018 PV_STATUS status = PV_SUCCESS; 1019 Vol *currVol = video->vol[0]; 1020 BitstreamDecVideo *stream = currVol->bitstream; 1021 uint32 tmpvar; 1022 int32 size; 1023 1024 int extended_PTYPE = FALSE; 1025 int UFEP = 0, custom_PFMT = 0, custom_PCF = 0; 1026 1027 status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar); 1028 1029 if (tmpvar != SHORT_VIDEO_START_MARKER) 1030 { 1031 status = PV_FAIL; 1032 goto return_point; 1033 } 1034 1035 1036 PV_BitstreamFlushBits(stream, SHORT_VIDEO_START_MARKER_LENGTH); 1037 1038 /* Temporal reference. Using vop_time_increment_resolution = 30000 */ 1039 tmpvar = (uint32) BitstreamReadBits16(stream, 8); 1040 currVop->temporalRef = (int) tmpvar; 1041 1042 1043 currVop->timeInc = 0xff & (256 + currVop->temporalRef - video->prevVop->temporalRef); 1044 currVol->moduloTimeBase += currVop->timeInc; /* mseconds 11/12/01 */ 1045 /* Marker Bit */ 1046 if (!BitstreamRead1Bits(stream)) 1047 { 1048 mp4dec_log("DecodeShortHeader(): Marker bit wrong.\n"); 1049 status = PV_FAIL; 1050 goto return_point; 1051 } 1052 1053 /* Zero Bit */ 1054 if (BitstreamRead1Bits(stream)) 1055 { 1056 mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n"); 1057 status = PV_FAIL; 1058 goto return_point; 1059 } 1060 1061 /*split_screen_indicator*/ 1062 if (BitstreamRead1Bits(stream)) 1063 { 1064 mp4dec_log("DecodeShortHeader(): Split Screen not supported.\n"); 1065 VideoDecoderErrorDetected(video); 1066 } 1067 1068 /*document_freeze_camera*/ 1069 if (BitstreamRead1Bits(stream)) 1070 { 1071 mp4dec_log("DecodeShortHeader(): Freeze Camera not supported.\n"); 1072 VideoDecoderErrorDetected(video); 1073 } 1074 1075 /*freeze_picture_release*/ 1076 if (BitstreamRead1Bits(stream)) 1077 { 1078 mp4dec_log("DecodeShortHeader(): Freeze Release not supported.\n"); 1079 VideoDecoderErrorDetected(video); 1080 } 1081 /* source format */ 1082 switch (BitstreamReadBits16(stream, 3)) 1083 { 1084 case 1: 1085 if (video->size < 128*96) 1086 { 1087 status = PV_FAIL; 1088 goto return_point; 1089 } 1090 video->displayWidth = video->width = 128; 1091 video->displayHeight = video->height = 96; 1092 break; 1093 1094 case 2: 1095 if (video->size < 176*144) 1096 { 1097 status = PV_FAIL; 1098 goto return_point; 1099 } 1100 video->displayWidth = video->width = 176; 1101 video->displayHeight = video->height = 144; 1102 break; 1103 1104 case 3: 1105 if (video->size < 352*288) 1106 { 1107 status = PV_FAIL; 1108 goto return_point; 1109 } 1110 video->displayWidth = video->width = 352; 1111 video->displayHeight = video->height = 288; 1112 break; 1113 1114 case 4: 1115 if (video->size < 704*576) 1116 { 1117 status = PV_FAIL; 1118 goto return_point; 1119 } 1120 video->displayWidth = video->width = 704; 1121 video->displayHeight = video->height = 576; 1122 break; 1123 1124 case 5: 1125 if (video->size < 1408*1152) 1126 { 1127 status = PV_FAIL; 1128 goto return_point; 1129 } 1130 video->displayWidth = video->width = 1408; 1131 video->displayHeight = video->height = 1152; 1132 break; 1133 1134 case 7: 1135 extended_PTYPE = TRUE; 1136 break; 1137 1138 default: 1139 /* Msg("H.263 source format not legal\n"); */ 1140 status = PV_FAIL; 1141 goto return_point; 1142 } 1143 1144 1145 currVop->roundingType = 0; 1146 1147 if (extended_PTYPE == FALSE) 1148 { 1149 currVop->predictionType = (int) BitstreamRead1Bits(stream); 1150 1151 /* four_reserved_zero_bits */ 1152 if (BitstreamReadBits16(stream, 4)) 1153 { 1154 mp4dec_log("DecodeShortHeader(): Reserved bits wrong.\n"); 1155 status = PV_FAIL; 1156 goto return_point; 1157 } 1158 } 1159 else 1160 { 1161 UFEP = BitstreamReadBits16(stream, 3); 1162 if (UFEP == 1) 1163 { 1164 /* source format */ 1165 switch (BitstreamReadBits16(stream, 3)) 1166 { 1167 case 1: 1168 if (video->size < 128*96) 1169 { 1170 status = PV_FAIL; 1171 goto return_point; 1172 } 1173 video->displayWidth = video->width = 128; 1174 video->displayHeight = video->height = 96; 1175 break; 1176 1177 case 2: 1178 if (video->size < 176*144) 1179 { 1180 status = PV_FAIL; 1181 goto return_point; 1182 } 1183 video->displayWidth = video->width = 176; 1184 video->displayHeight = video->height = 144; 1185 break; 1186 1187 case 3: 1188 if (video->size < 352*288) 1189 { 1190 status = PV_FAIL; 1191 goto return_point; 1192 } 1193 video->displayWidth = video->width = 352; 1194 video->displayHeight = video->height = 288; 1195 break; 1196 1197 case 4: 1198 if (video->size < 704*576) 1199 { 1200 status = PV_FAIL; 1201 goto return_point; 1202 } 1203 video->displayWidth = video->width = 704; 1204 video->displayHeight = video->height = 576; 1205 break; 1206 1207 case 5: 1208 if (video->size < 1408*1152) 1209 { 1210 status = PV_FAIL; 1211 goto return_point; 1212 } 1213 video->displayWidth = video->width = 1408; 1214 video->displayHeight = video->height = 1152; 1215 break; 1216 1217 case 6: 1218 custom_PFMT = TRUE; 1219 break; 1220 1221 default: 1222 /* Msg("H.263 source format not legal\n"); */ 1223 status = PV_FAIL; 1224 goto return_point; 1225 } 1226 1227 custom_PCF = BitstreamRead1Bits(stream); 1228 /* unrestricted MV */ 1229 if (BitstreamRead1Bits(stream)) 1230 { 1231 status = PV_FAIL; 1232 goto return_point; 1233 } 1234 /* SAC */ 1235 if (BitstreamRead1Bits(stream)) 1236 { 1237 status = PV_FAIL; 1238 goto return_point; 1239 } 1240 1241 /* AP */ 1242 if (BitstreamRead1Bits(stream)) 1243 { 1244 status = PV_FAIL; 1245 goto return_point; 1246 } 1247 1248 video->advanced_INTRA = BitstreamRead1Bits(stream); 1249 1250 video->deblocking = BitstreamRead1Bits(stream); 1251 1252 video->slice_structure = BitstreamRead1Bits(stream); 1253 1254 /* RPS, ISD, AIV */ 1255 if (BitstreamReadBits16(stream, 3)) 1256 { 1257 status = PV_FAIL; 1258 goto return_point; 1259 } 1260 video->modified_quant = BitstreamRead1Bits(stream); 1261 1262 /* Marker Bit and reserved*/ 1263 if (BitstreamReadBits16(stream, 4) != 8) 1264 { 1265 status = PV_FAIL; 1266 goto return_point; 1267 } 1268 } 1269 #ifndef PV_ANNEX_IJKT_SUPPORT 1270 if (video->advanced_INTRA | video->deblocking | video->modified_quant | video->modified_quant) 1271 { 1272 status = PV_FAIL; 1273 goto return_point; 1274 } 1275 #endif 1276 1277 if (UFEP == 0 || UFEP == 1) 1278 { 1279 tmpvar = BitstreamReadBits16(stream, 3); 1280 if (tmpvar > 1) 1281 { 1282 status = PV_FAIL; 1283 goto return_point; 1284 } 1285 currVop->predictionType = tmpvar; 1286 /* RPR */ 1287 if (BitstreamRead1Bits(stream)) 1288 { 1289 status = PV_FAIL; 1290 goto return_point; 1291 } 1292 1293 /* RRU */ 1294 if (BitstreamRead1Bits(stream)) 1295 { 1296 status = PV_FAIL; 1297 goto return_point; 1298 } 1299 currVop->roundingType = (int) BitstreamRead1Bits(stream); 1300 if (BitstreamReadBits16(stream, 3) != 1) 1301 { 1302 status = PV_FAIL; 1303 goto return_point; 1304 } 1305 } 1306 else 1307 { 1308 status = PV_FAIL; 1309 goto return_point; 1310 } 1311 /* CPM */ 1312 if (BitstreamRead1Bits(stream)) 1313 { 1314 status = PV_FAIL; 1315 goto return_point; 1316 } 1317 /* CPFMT */ 1318 if (custom_PFMT == 1 && UFEP == 1) 1319 { 1320 /* aspect ratio */ 1321 tmpvar = BitstreamReadBits16(stream, 4); 1322 if (tmpvar == 0) 1323 { 1324 status = PV_FAIL; 1325 goto return_point; 1326 } 1327 /* Extended PAR */ 1328 if (tmpvar == 0xF) 1329 { 1330 /* Read par_width and par_height but do nothing */ 1331 /* par_width */ 1332 tmpvar = BitstreamReadBits16(stream, 8); 1333 1334 /* par_height */ 1335 tmpvar = BitstreamReadBits16(stream, 8); 1336 } 1337 tmpvar = BitstreamReadBits16(stream, 9); 1338 1339 video->displayWidth = (tmpvar + 1) << 2; 1340 video->width = (video->displayWidth + 15) & -16; 1341 /* marker bit */ 1342 if (!BitstreamRead1Bits(stream)) 1343 { 1344 status = PV_FAIL; 1345 goto return_point; 1346 } 1347 tmpvar = BitstreamReadBits16(stream, 9); 1348 if (tmpvar == 0) 1349 { 1350 status = PV_FAIL; 1351 goto return_point; 1352 } 1353 video->displayHeight = tmpvar << 2; 1354 video->height = (video->displayHeight + 15) & -16; 1355 1356 if (video->height * video->width > video->size) 1357 { 1358 status = PV_FAIL; 1359 goto return_point; 1360 } 1361 1362 video->nTotalMB = video->width / MB_SIZE * video->height / MB_SIZE; 1363 1364 if (video->nTotalMB <= 48) 1365 { 1366 video->nBitsForMBID = 6; 1367 } 1368 else if (video->nTotalMB <= 99) 1369 { 1370 video->nBitsForMBID = 7; 1371 } 1372 else if (video->nTotalMB <= 396) 1373 { 1374 video->nBitsForMBID = 9; 1375 } 1376 else if (video->nTotalMB <= 1584) 1377 { 1378 video->nBitsForMBID = 11; 1379 } 1380 else if (video->nTotalMB <= 6336) 1381 { 1382 video->nBitsForMBID = 13 ; 1383 } 1384 else if (video->nTotalMB <= 9216) 1385 { 1386 video->nBitsForMBID = 14 ; 1387 } 1388 else 1389 { 1390 status = PV_FAIL; 1391 goto return_point; 1392 } 1393 } 1394 if (UFEP == 1 && custom_PCF == 1) 1395 { 1396 BitstreamRead1Bits(stream); 1397 1398 tmpvar = BitstreamReadBits16(stream, 7); 1399 if (tmpvar == 0) 1400 { 1401 status = PV_FAIL; 1402 goto return_point; 1403 } 1404 } 1405 1406 if (custom_PCF == 1) 1407 { 1408 currVop->ETR = BitstreamReadBits16(stream, 2); 1409 } 1410 1411 if (UFEP == 1 && video->slice_structure == 1) 1412 { 1413 /* SSS */ 1414 tmpvar = BitstreamReadBits16(stream, 2); 1415 if (tmpvar != 0) 1416 { 1417 status = PV_FAIL; 1418 goto return_point; 1419 } 1420 } 1421 } 1422 1423 /* Recalculate number of macroblocks per row & col since */ 1424 /* the frame size can change. 04/23/2001. */ 1425 video->nMBinGOB = video->nMBPerRow = video->width / MB_SIZE; 1426 video->nGOBinVop = video->nMBPerCol = video->height / MB_SIZE; 1427 video->nTotalMB = video->nMBPerRow * video->nMBPerCol; 1428 if (custom_PFMT == 0 || UFEP == 0) 1429 { 1430 video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1); /* otherwise calculate above */ 1431 } 1432 size = (int32)video->width * video->height; 1433 if (currVop->predictionType == P_VOP && size > video->videoDecControls->size) 1434 { 1435 status = PV_FAIL; 1436 goto return_point; 1437 } 1438 video->videoDecControls->size = size; 1439 video->currVop->uChan = video->currVop->yChan + size; 1440 video->currVop->vChan = video->currVop->uChan + (size >> 2); 1441 video->prevVop->uChan = video->prevVop->yChan + size; 1442 video->prevVop->vChan = video->prevVop->uChan + (size >> 2); 1443 1444 1445 currVop->quantizer = (int16) BitstreamReadBits16(stream, 5); 1446 1447 if (currVop->quantizer == 0) /* 04/03/01 */ 1448 { 1449 currVop->quantizer = video->prevVop->quantizer; 1450 status = PV_FAIL; 1451 goto return_point; 1452 } 1453 1454 1455 /* Zero bit */ 1456 if (extended_PTYPE == FALSE) 1457 { 1458 if (BitstreamRead1Bits(stream)) 1459 { 1460 mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n"); 1461 status = PV_FAIL; 1462 goto return_point; 1463 } 1464 } 1465 /* pei */ 1466 tmpvar = (uint32) BitstreamRead1Bits(stream); 1467 1468 while (tmpvar) 1469 { 1470 tmpvar = (uint32) BitstreamReadBits16(stream, 8); /* "PSPARE" */ 1471 tmpvar = (uint32) BitstreamRead1Bits(stream); /* "PEI" */ 1472 } 1473 1474 if (video->slice_structure) /* ANNEX_K */ 1475 { 1476 if (!BitstreamRead1Bits(stream)) /* SEPB1 */ 1477 { 1478 status = PV_FAIL; 1479 goto return_point; 1480 } 1481 1482 // if (currVol->nBitsForMBID // 1483 if (BitstreamReadBits16(stream, video->nBitsForMBID)) 1484 { 1485 status = PV_FAIL; /* no ASO, RS support for Annex K */ 1486 goto return_point; 1487 } 1488 1489 if (!BitstreamRead1Bits(stream)) /*SEPB3 */ 1490 { 1491 status = PV_FAIL; 1492 goto return_point; 1493 } 1494 1495 } 1496 /* Setting of other VOP-header parameters */ 1497 currVop->gobNumber = 0; 1498 currVop->vopCoded = 1; 1499 1500 currVop->intraDCVlcThr = 0; 1501 currVop->gobFrameID = 0; /* initial value, 05/22/00 */ 1502 currVol->errorResDisable = 0; 1503 /*PutVopInterlaced(0,curr_vop); no implemented yet */ 1504 if (currVop->predictionType != I_VOP) 1505 currVop->fcodeForward = 1; 1506 else 1507 currVop->fcodeForward = 0; 1508 1509 return_point: 1510 1511 return status; 1512 } 1513 /***********************************************************CommentBegin****** 1514 * 1515 * -- PV_DecodeVop -- Decodes the VOP information from the bitstream 1516 * 1517 * 04/12/2000 1518 * Initial port to the new PV decoder library format. 1519 * This function is different from the one in MoMuSys MPEG-4 1520 * visual decoder. We handle combined mode with or withput 1521 * error resilience and H.263 mode through the sam path now. 1522 * 1523 * 05/04/2000 1524 * Added temporal scalability to the decoder. 1525 * 1526 ***********************************************************CommentEnd********/ 1527 PV_STATUS PV_DecodeVop(VideoDecData *video) 1528 { 1529 Vol *currVol = video->vol[video->currLayer]; 1530 PV_STATUS status; 1531 uint32 tmpvar; 1532 1533 /***** 1534 * Do scalable or non-scalable decoding of the current VOP 1535 *****/ 1536 1537 if (!currVol->scalability) 1538 { 1539 if (currVol->dataPartitioning) 1540 { 1541 /* Data partitioning mode comes here */ 1542 status = DecodeFrameDataPartMode(video); 1543 } 1544 else 1545 { 1546 /* Combined mode with or without error resilience */ 1547 /* and short video header comes here. */ 1548 status = DecodeFrameCombinedMode(video); 1549 } 1550 } 1551 else 1552 { 1553 #ifdef DO_NOT_FOLLOW_STANDARD 1554 /* according to the standard, only combined mode is allowed */ 1555 /* in the enhancement layer. 06/01/2000. */ 1556 if (currVol->dataPartitioning) 1557 { 1558 /* Data partitioning mode comes here */ 1559 status = DecodeFrameDataPartMode(video); 1560 } 1561 else 1562 { 1563 /* Combined mode with or without error resilience */ 1564 /* and short video header comes here. */ 1565 status = DecodeFrameCombinedMode(video); 1566 } 1567 #else 1568 status = DecodeFrameCombinedMode(video); 1569 #endif 1570 } 1571 1572 /* This part is for consuming Visual_object_sequence_end_code and EOS Code */ /* 10/15/01 */ 1573 if (!video->shortVideoHeader) 1574 { 1575 /* at this point bitstream is expected to be byte aligned */ 1576 BitstreamByteAlignNoForceStuffing(currVol->bitstream); 1577 1578 status = BitstreamShowBits32HC(currVol->bitstream, &tmpvar); /* 07/07/01 */ 1579 if (tmpvar == VISUAL_OBJECT_SEQUENCE_END_CODE)/* VOS_END_CODE */ 1580 { 1581 PV_BitstreamFlushBits(currVol->bitstream, 16); 1582 PV_BitstreamFlushBits(currVol->bitstream, 16); 1583 } 1584 1585 } 1586 else 1587 { 1588 #ifdef PV_ANNEX_IJKT_SUPPORT 1589 if (video->deblocking) 1590 { 1591 H263_Deblock(video->currVop->yChan, video->width, video->height, video->QPMB, video->headerInfo.Mode, 0, 0); 1592 H263_Deblock(video->currVop->uChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant); 1593 H263_Deblock(video->currVop->vChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant); 1594 } 1595 #endif 1596 /* Read EOS code for shortheader bitstreams */ 1597 status = BitstreamShowBits32(currVol->bitstream, 22, &tmpvar); 1598 if (tmpvar == SHORT_VIDEO_END_MARKER) 1599 { 1600 PV_BitstreamFlushBits(currVol->bitstream, 22); 1601 } 1602 else 1603 { 1604 status = PV_BitstreamShowBitsByteAlign(currVol->bitstream, 22, &tmpvar); 1605 if (tmpvar == SHORT_VIDEO_END_MARKER) 1606 { 1607 PV_BitstreamByteAlign(currVol->bitstream); 1608 PV_BitstreamFlushBits(currVol->bitstream, 22); 1609 } 1610 } 1611 } 1612 return status; 1613 } 1614 1615 1616 /***********************************************************CommentBegin****** 1617 * 1618 * -- CalcVopDisplayTime -- calculate absolute time when VOP is to be displayed 1619 * 1620 * 04/12/2000 Initial port to the new PV decoder library format. 1621 * 1622 ***********************************************************CommentEnd********/ 1623 uint32 CalcVopDisplayTime(Vol *currVol, Vop *currVop, int shortVideoHeader) 1624 { 1625 uint32 display_time; 1626 1627 1628 /***** 1629 * Calculate the time when the VOP is to be displayed next 1630 *****/ 1631 1632 if (!shortVideoHeader) 1633 { 1634 display_time = (uint32)(currVol->moduloTimeBase + (((int32)currVop->timeInc - (int32)currVol->timeInc_offset) * 1000) / ((int32)currVol->timeIncrementResolution)); /* 11/12/2001 */ 1635 if (currVop->timeStamp >= display_time) 1636 { 1637 display_time += 1000; /* this case is valid if GOVHeader timestamp is ignored */ 1638 } 1639 } 1640 else 1641 { 1642 display_time = (uint32)(currVol->moduloTimeBase * 33 + (currVol->moduloTimeBase * 11) / 30); /* 11/12/2001 */ 1643 } 1644 1645 return(display_time); 1646 } 1647 1648