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 19 //#define LOG_NDEBUG 0 20 #define LOG_TAG "intel_m4v_config_parser.cpp" 21 #include <utils/Log.h> 22 23 24 #include "intel_m4v_config_parser.h" 25 #include "oscl_mem.h" 26 #include "oscl_dll.h" 27 OSCL_DLL_ENTRY_POINT_DEFAULT() 28 29 #define PV_CLZ(A,B) while (((B) & 0x8000) == 0) {(B) <<=1; A++;} 30 31 static const uint32 mask[33] = 32 { 33 0x00000000, 0x00000001, 0x00000003, 0x00000007, 34 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 35 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 36 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 37 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, 38 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 39 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, 40 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 41 0xffffffff 42 }; 43 44 int32 LocateFrameHeader(uint8 *ptr, int32 size) 45 { 46 int32 count = 0; 47 int32 i = size; 48 49 if (size < 1) 50 { 51 return 0; 52 } 53 while (i--) 54 { 55 if ((count > 1) && (*ptr == 0x01)) 56 { 57 i += 2; 58 break; 59 } 60 61 if (*ptr++) 62 count = 0; 63 else 64 count++; 65 } 66 return (size - (i + 1)); 67 } 68 69 void movePointerTo(mp4StreamType *psBits, int32 pos) 70 { 71 uint32 byte_pos; 72 if (pos < 0) 73 { 74 pos = 0; 75 } 76 77 byte_pos = pos >> 3; 78 79 if (byte_pos > (psBits->numBytes - psBits->bytePos)) 80 { 81 byte_pos = (psBits->numBytes - psBits->bytePos); 82 } 83 84 psBits->bytePos = byte_pos & -4; 85 psBits->dataBitPos = psBits->bytePos << 3; 86 FlushBits(psBits, ((pos & 0x7) + ((byte_pos & 0x3) << 3))); 87 } 88 89 int16 SearchNextM4VFrame(mp4StreamType *psBits) 90 { 91 int16 status = 0; 92 uint8 *ptr; 93 int32 i; 94 uint32 initial_byte_aligned_position = (psBits->dataBitPos + 7) >> 3; 95 96 ptr = psBits->data + initial_byte_aligned_position; 97 98 i = LocateFrameHeader(ptr, psBits->numBytes - initial_byte_aligned_position); 99 if (psBits->numBytes <= initial_byte_aligned_position + i) 100 { 101 status = -1; 102 } 103 (void)movePointerTo(psBits, ((i + initial_byte_aligned_position) << 3)); /* ptr + i */ 104 return status; 105 } 106 107 OSCL_EXPORT_REF int16 iGetM4VConfigInfo(uint8 *buffer, int32 length, int32 *width, int32 *height, int32 *display_width, int32 *display_height) 108 { 109 int16 status; 110 mp4StreamType psBits; 111 psBits.data = buffer; 112 psBits.numBytes = length; 113 psBits.bitBuf = 0; 114 psBits.bitPos = 32; 115 psBits.bytePos = 0; 116 psBits.dataBitPos = 0; 117 *width = *height = *display_height = *display_width = 0; 118 119 if (length == 0) 120 { 121 return MP4_INVALID_VOL_PARAM; 122 } 123 int32 profilelevel = 0; // dummy value discarded here 124 status = iDecodeVOLHeader(&psBits, width, height, display_width, display_height, &profilelevel); 125 return status; 126 } 127 128 // name: iDecodeVOLHeader 129 // Purpose: decode VOL header 130 // return: error code 131 OSCL_EXPORT_REF int16 iDecodeVOLHeader(mp4StreamType *psBits, int32 *width, int32 *height, int32 *display_width, int32 *display_height, int32 *profilelevel) 132 { 133 int16 iErrorStat; 134 uint32 codeword; 135 int32 time_increment_resolution, nbits_time_increment; 136 int32 i, j; 137 138 *profilelevel = 0x0000FFFF; // init to some invalid value. When this value is returned, then no profilelevel info is available 139 140 ShowBits(psBits, 32, &codeword); 141 142 if (codeword == VISUAL_OBJECT_SEQUENCE_START_CODE) 143 { 144 //DV: this is the wrong way to skip bits, use FLush or Read psBits->dataBitPos += 32; 145 ReadBits(psBits, 32, &codeword); // skip 32 bits of the Start code 146 147 ReadBits(psBits, 8, &codeword); 148 149 // record profile and level 150 *profilelevel = (int) codeword; 151 152 ShowBits(psBits, 32, &codeword); 153 if (codeword == USER_DATA_START_CODE) 154 { 155 iErrorStat = DecodeUserData(psBits); 156 if (iErrorStat) return MP4_INVALID_VOL_PARAM; 157 } 158 159 160 ReadBits(psBits, 32, &codeword); 161 if (codeword != VISUAL_OBJECT_START_CODE) return MP4_INVALID_VOL_PARAM; 162 163 /* is_visual_object_identifier */ 164 ReadBits(psBits, 1, &codeword); 165 166 if (codeword) 167 { 168 /* visual_object_verid */ 169 ReadBits(psBits, 4, &codeword); 170 /* visual_object_priority */ 171 ReadBits(psBits, 3, &codeword); 172 } 173 /* visual_object_type */ 174 ReadBits(psBits, 4, &codeword); 175 176 if (codeword == 1) 177 { /* video_signal_type */ 178 ReadBits(psBits, 1, &codeword); 179 if (codeword == 1) 180 { 181 /* video_format */ 182 ReadBits(psBits, 3, &codeword); 183 /* video_range */ 184 ReadBits(psBits, 1, &codeword); 185 /* color_description */ 186 ReadBits(psBits, 1, &codeword); 187 if (codeword == 1) 188 { 189 /* color_primaries */ 190 ReadBits(psBits, 8, &codeword);; 191 /* transfer_characteristics */ 192 ReadBits(psBits, 8, &codeword); 193 /* matrix_coefficients */ 194 ReadBits(psBits, 8, &codeword); 195 } 196 } 197 } 198 else 199 { 200 int16 status = 0; 201 do 202 { 203 /* Search for VOL_HEADER */ 204 status = SearchNextM4VFrame(psBits); /* search 0x00 0x00 0x01 */ 205 if (status != 0) 206 return MP4_INVALID_VOL_PARAM; 207 208 status = ReadBits(psBits, VOL_START_CODE_LENGTH, &codeword); 209 } 210 while ((codeword != VOL_START_CODE) && (status == 0)); 211 goto decode_vol; 212 } 213 /* next_start_code() */ 214 ByteAlign(psBits); 215 216 ShowBits(psBits, 32, &codeword); 217 if (codeword == USER_DATA_START_CODE) 218 { 219 iErrorStat = DecodeUserData(psBits); 220 if (iErrorStat) return MP4_INVALID_VOL_PARAM; 221 } 222 ShowBits(psBits, 27, &codeword); 223 } 224 else 225 { 226 ShowBits(psBits, 27, &codeword); 227 } 228 229 if (codeword == VO_START_CODE) 230 { 231 232 ReadBits(psBits, 32, &codeword); 233 234 /* video_object_layer_start_code */ 235 ReadBits(psBits, 28, &codeword); 236 if (codeword != VOL_START_CODE) 237 { 238 if (psBits->dataBitPos >= (psBits->numBytes << 3)) 239 { 240 return SHORT_HEADER_MODE; /* SH */ 241 } 242 else 243 { 244 int16 status = 0; 245 do 246 { 247 /* Search for VOL_HEADER */ 248 status = SearchNextM4VFrame(psBits); /* search 0x00 0x00 0x01 */ 249 if (status != 0) 250 return MP4_INVALID_VOL_PARAM; 251 252 status = ReadBits(psBits, VOL_START_CODE_LENGTH, &codeword); 253 } 254 while ((codeword != VOL_START_CODE) && (status == 0)); 255 goto decode_vol; 256 } 257 } 258 decode_vol: 259 260 uint32 vol_id; 261 262 /* vol_id (4 bits) */ 263 ReadBits(psBits, 4, & vol_id); 264 265 // RandomAccessibleVOLFlag 266 ReadBits(psBits, 1, &codeword); 267 268 //Video Object Type Indication 269 ReadBits(psBits, 8, &codeword); 270 if (codeword != 1) 271 { 272 return MP4_INVALID_VOL_PARAM; 273 } 274 275 // is_object_layer_identifier 276 ReadBits(psBits, 1, &codeword); 277 278 if (codeword) 279 { 280 ReadBits(psBits, 4, &codeword); 281 ReadBits(psBits, 3, &codeword); 282 } 283 284 // aspect ratio 285 ReadBits(psBits, 4, &codeword); 286 287 if (codeword == 0xF) 288 { 289 // Extended Parameter 290 /* width */ 291 ReadBits(psBits, 8, &codeword); 292 /* height */ 293 ReadBits(psBits, 8, &codeword); 294 } 295 296 ReadBits(psBits, 1, &codeword); 297 298 if (codeword) 299 { 300 ReadBits(psBits, 2, &codeword); 301 if (codeword != 1) 302 { 303 return MP4_INVALID_VOL_PARAM; 304 } 305 306 ReadBits(psBits, 1, &codeword); 307 308 if (!codeword) 309 { 310 return MP4_INVALID_VOL_PARAM; 311 } 312 313 ReadBits(psBits, 1, &codeword); 314 if (codeword) /* if (vbv_parameters) {}, page 36 */ 315 { 316 ReadBits(psBits, 15, &codeword); 317 ReadBits(psBits, 1, &codeword); 318 if (codeword != 1) 319 return MP4_INVALID_VOL_PARAM; 320 321 ReadBits(psBits, 15, &codeword); 322 ReadBits(psBits, 1, &codeword); 323 if (codeword != 1) 324 return MP4_INVALID_VOL_PARAM; 325 326 327 ReadBits(psBits, 19, &codeword); 328 if (!(codeword & 0x8)) 329 return MP4_INVALID_VOL_PARAM; 330 331 ReadBits(psBits, 11, &codeword); 332 ReadBits(psBits, 1, &codeword); 333 if (codeword != 1) 334 return MP4_INVALID_VOL_PARAM; 335 336 ReadBits(psBits, 15, &codeword); 337 ReadBits(psBits, 1, &codeword); 338 if (codeword != 1) 339 return MP4_INVALID_VOL_PARAM; 340 } 341 342 } 343 344 ReadBits(psBits, 2, &codeword); 345 346 if (codeword != 0) 347 { 348 return MP4_INVALID_VOL_PARAM; 349 } 350 351 ReadBits(psBits, 1, &codeword); 352 if (codeword != 1) 353 return MP4_INVALID_VOL_PARAM; 354 355 ReadBits(psBits, 16, &codeword); 356 time_increment_resolution = codeword; 357 358 359 ReadBits(psBits, 1, &codeword); 360 if (codeword != 1) 361 return MP4_INVALID_VOL_PARAM; 362 363 364 365 ReadBits(psBits, 1, &codeword); 366 367 if (codeword && time_increment_resolution > 2) 368 { 369 i = time_increment_resolution - 1; 370 j = 1; 371 while (i >>= 1) 372 { 373 j++; 374 } 375 nbits_time_increment = j; 376 377 ReadBits(psBits, nbits_time_increment, &codeword); 378 } 379 380 ReadBits(psBits, 1, &codeword); 381 if (codeword != 1) 382 return MP4_INVALID_VOL_PARAM; 383 384 /* this should be 176 for QCIF */ 385 ReadBits(psBits, 13, &codeword); 386 *display_width = (int32)codeword; 387 ReadBits(psBits, 1, &codeword); 388 if (codeword != 1) 389 return MP4_INVALID_VOL_PARAM; 390 391 /* this should be 144 for QCIF */ 392 ReadBits(psBits, 13, &codeword); 393 *display_height = (int32)codeword; 394 395 *width = (*display_width + 15) & -16; 396 *height = (*display_height + 15) & -16; 397 } 398 else 399 { 400 /* SHORT_HEADER */ 401 ShowBits(psBits, SHORT_VIDEO_START_MARKER_LENGTH, &codeword); 402 if (codeword == SHORT_VIDEO_START_MARKER) 403 { 404 iDecodeShortHeader(psBits, width, height, display_width, display_height); 405 } 406 else 407 { 408 int16 status = 0; 409 do 410 { 411 /* Search for VOL_HEADER */ 412 status = SearchNextM4VFrame(psBits); /* search 0x00 0x00 0x01 */ 413 if (status != 0) 414 return MP4_INVALID_VOL_PARAM; 415 416 status = ReadBits(psBits, VOL_START_CODE_LENGTH, &codeword); 417 } 418 while ((codeword != VOL_START_CODE) && (status == 0)); 419 goto decode_vol; 420 } 421 } 422 return 0; 423 } 424 425 426 427 OSCL_EXPORT_REF 428 int16 iDecodeShortHeader(mp4StreamType *psBits, 429 int32 *width, 430 int32 *height, 431 int32 *display_width, 432 int32 *display_height) 433 { 434 uint32 codeword; 435 int32 extended_PTYPE = 0; 436 int32 UFEP = 0; 437 int32 custom_PFMT = 0; 438 439 ShowBits(psBits, 22, &codeword); 440 441 if (codeword != 0x20) 442 { 443 return MP4_INVALID_VOL_PARAM; 444 } 445 FlushBits(psBits, 22); 446 ReadBits(psBits, 8, &codeword); 447 448 ReadBits(psBits, 1, &codeword); 449 if (codeword == 0) return MP4_INVALID_VOL_PARAM; 450 451 ReadBits(psBits, 1, &codeword); 452 if (codeword == 1) return MP4_INVALID_VOL_PARAM; 453 454 ReadBits(psBits, 1, &codeword); 455 if (codeword == 1) return MP4_INVALID_VOL_PARAM; 456 457 ReadBits(psBits, 1, &codeword); 458 if (codeword == 1) return MP4_INVALID_VOL_PARAM; 459 460 ReadBits(psBits, 1, &codeword); 461 if (codeword == 1) return MP4_INVALID_VOL_PARAM; 462 463 /* source format */ 464 ReadBits(psBits, 3, &codeword); 465 switch (codeword) 466 { 467 case 1: 468 *width = 128; 469 *height = 96; 470 break; 471 472 case 2: 473 *width = 176; 474 *height = 144; 475 break; 476 477 case 3: 478 *width = 352; 479 *height = 288; 480 break; 481 482 case 4: 483 *width = 704; 484 *height = 576; 485 break; 486 487 case 5: 488 *width = 1408; 489 *height = 1152; 490 break; 491 492 case 7: 493 extended_PTYPE = 1; 494 break; 495 default: 496 /* Msg("H.263 source format not legal\n"); */ 497 return MP4_INVALID_VOL_PARAM; 498 } 499 500 if (extended_PTYPE == 0) 501 { 502 *display_width = *width; 503 *display_height = *height; 504 return 0; 505 } 506 /* source format */ 507 ReadBits(psBits, 3, &codeword); 508 UFEP = codeword; 509 if (UFEP == 1) 510 { 511 ReadBits(psBits, 3, &codeword); 512 switch (codeword) 513 { 514 case 1: 515 *width = 128; 516 *height = 96; 517 break; 518 519 case 2: 520 *width = 176; 521 *height = 144; 522 break; 523 524 case 3: 525 *width = 352; 526 *height = 288; 527 break; 528 529 case 4: 530 *width = 704; 531 *height = 576; 532 break; 533 534 case 5: 535 *width = 1408; 536 *height = 1152; 537 break; 538 539 case 6: 540 custom_PFMT = 1; 541 break; 542 default: 543 /* Msg("H.263 source format not legal\n"); */ 544 return MP4_INVALID_VOL_PARAM; 545 } 546 if (custom_PFMT == 0) 547 { 548 *display_width = *width; 549 *display_height = *height; 550 return 0; 551 } 552 ReadBits(psBits, 1, &codeword); 553 ReadBits(psBits, 1, &codeword); 554 if (codeword) return MP4_INVALID_VOL_PARAM; 555 ReadBits(psBits, 1, &codeword); 556 if (codeword) return MP4_INVALID_VOL_PARAM; 557 ReadBits(psBits, 1, &codeword); 558 if (codeword) return MP4_INVALID_VOL_PARAM; 559 ReadBits(psBits, 3, &codeword); 560 ReadBits(psBits, 3, &codeword); 561 if (codeword) return MP4_INVALID_VOL_PARAM; /* RPS, ISD, AIV */ 562 ReadBits(psBits, 1, &codeword); 563 ReadBits(psBits, 4, &codeword); 564 if (codeword != 8) return MP4_INVALID_VOL_PARAM; 565 } 566 if (UFEP == 0 || UFEP == 1) 567 { 568 ReadBits(psBits, 3, &codeword); 569 if (codeword > 1) return MP4_INVALID_VOL_PARAM; 570 ReadBits(psBits, 1, &codeword); 571 if (codeword) return MP4_INVALID_VOL_PARAM; 572 ReadBits(psBits, 1, &codeword); 573 if (codeword) return MP4_INVALID_VOL_PARAM; 574 ReadBits(psBits, 1, &codeword); 575 ReadBits(psBits, 3, &codeword); 576 if (codeword != 1) return MP4_INVALID_VOL_PARAM; 577 } 578 else 579 { 580 return MP4_INVALID_VOL_PARAM; 581 } 582 ReadBits(psBits, 1, &codeword); 583 if (codeword) return MP4_INVALID_VOL_PARAM; /* CPM */ 584 if (custom_PFMT == 1 && UFEP == 1) 585 { 586 ReadBits(psBits, 4, &codeword); 587 if (codeword == 0) return MP4_INVALID_VOL_PARAM; 588 if (codeword == 0xf) 589 { 590 ReadBits(psBits, 8, &codeword); 591 ReadBits(psBits, 8, &codeword); 592 } 593 ReadBits(psBits, 9, &codeword); 594 *display_width = (codeword + 1) << 2; 595 *width = (*display_width + 15) & -16; 596 ReadBits(psBits, 1, &codeword); 597 if (codeword != 1) return MP4_INVALID_VOL_PARAM; 598 ReadBits(psBits, 9, &codeword); 599 if (codeword == 0) return MP4_INVALID_VOL_PARAM; 600 *display_height = codeword << 2; 601 *height = (*display_height + 15) & -16; 602 } 603 604 return 0; 605 } 606 607 608 int16 ShowBits( 609 mp4StreamType *pStream, /* Input Stream */ 610 uint8 ucNBits, /* nr of bits to read */ 611 uint32 *pulOutData /* output target */ 612 ) 613 { 614 uint8 *bits; 615 uint32 dataBitPos = pStream->dataBitPos; 616 uint32 bitPos = pStream->bitPos; 617 uint32 dataBytePos; 618 619 uint i; 620 621 if (ucNBits > (32 - bitPos)) /* not enough bits */ 622 { 623 dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ 624 bitPos = dataBitPos & 7; /* update bit position */ 625 if (dataBytePos > pStream->numBytes - 4) 626 { 627 pStream->bitBuf = 0; 628 for (i = 0; i < pStream->numBytes - dataBytePos; i++) 629 { 630 pStream->bitBuf |= pStream->data[dataBytePos+i]; 631 pStream->bitBuf <<= 8; 632 } 633 pStream->bitBuf <<= 8 * (3 - i); 634 } 635 else 636 { 637 bits = &pStream->data[dataBytePos]; 638 pStream->bitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; 639 } 640 pStream->bitPos = bitPos; 641 } 642 643 bitPos += ucNBits; 644 645 *pulOutData = (pStream->bitBuf >> (32 - bitPos)) & mask[(uint16)ucNBits]; 646 647 648 return 0; 649 } 650 651 int16 FlushBits( 652 mp4StreamType *pStream, /* Input Stream */ 653 uint8 ucNBits /* number of bits to flush */ 654 ) 655 { 656 uint8 *bits; 657 uint32 dataBitPos = pStream->dataBitPos; 658 uint32 bitPos = pStream->bitPos; 659 uint32 dataBytePos; 660 661 662 if ((dataBitPos + ucNBits) > (uint32)(pStream->numBytes << 3)) 663 return (-2); // Buffer over run 664 665 dataBitPos += ucNBits; 666 bitPos += ucNBits; 667 668 if (bitPos > 32) 669 { 670 dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ 671 bitPos = dataBitPos & 7; /* update bit position */ 672 bits = &pStream->data[dataBytePos]; 673 pStream->bitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; 674 } 675 676 pStream->dataBitPos = dataBitPos; 677 pStream->bitPos = bitPos; 678 679 return 0; 680 } 681 682 int16 ReadBits( 683 mp4StreamType *pStream, /* Input Stream */ 684 uint8 ucNBits, /* nr of bits to read */ 685 uint32 *pulOutData /* output target */ 686 ) 687 { 688 uint8 *bits; 689 uint32 dataBitPos = pStream->dataBitPos; 690 uint32 bitPos = pStream->bitPos; 691 uint32 dataBytePos; 692 693 694 if ((dataBitPos + ucNBits) > (pStream->numBytes << 3)) 695 { 696 *pulOutData = 0; 697 return (-2); // Buffer over run 698 } 699 700 // dataBitPos += ucNBits; 701 702 if (ucNBits > (32 - bitPos)) /* not enough bits */ 703 { 704 dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ 705 bitPos = dataBitPos & 7; /* update bit position */ 706 bits = &pStream->data[dataBytePos]; 707 pStream->bitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; 708 } 709 710 pStream->dataBitPos += ucNBits; 711 pStream->bitPos = (unsigned char)(bitPos + ucNBits); 712 713 *pulOutData = (pStream->bitBuf >> (32 - pStream->bitPos)) & mask[(uint16)ucNBits]; 714 715 return 0; 716 } 717 718 719 720 int16 ByteAlign( 721 mp4StreamType *pStream /* Input Stream */ 722 ) 723 { 724 uint8 *bits; 725 uint32 dataBitPos = pStream->dataBitPos; 726 uint32 bitPos = pStream->bitPos; 727 uint32 dataBytePos; 728 uint32 leftBits; 729 730 leftBits = 8 - (dataBitPos & 0x7); 731 if (leftBits == 8) 732 { 733 if ((dataBitPos + 8) > (uint32)(pStream->numBytes << 3)) 734 return (-2); // Buffer over run 735 dataBitPos += 8; 736 bitPos += 8; 737 } 738 else 739 { 740 dataBytePos = dataBitPos >> 3; 741 dataBitPos += leftBits; 742 bitPos += leftBits; 743 } 744 745 746 if (bitPos > 32) 747 { 748 dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ 749 bits = &pStream->data[dataBytePos]; 750 pStream->bitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; 751 } 752 753 pStream->dataBitPos = dataBitPos; 754 pStream->bitPos = bitPos; 755 756 return 0; 757 } 758 759 int16 DecodeUserData(mp4StreamType *pStream) 760 { 761 762 uint32 codeword; 763 int16 iErrorStat; 764 765 iErrorStat = ReadBits(pStream, 32, &codeword); 766 if (iErrorStat) return iErrorStat; 767 iErrorStat = ShowBits(pStream, 24, &codeword); 768 if (iErrorStat) return iErrorStat; 769 770 while (codeword != 1) 771 { 772 /* Discard user data for now. */ 773 iErrorStat = ReadBits(pStream, 8, &codeword); 774 if (iErrorStat) return iErrorStat; 775 iErrorStat = ShowBits(pStream, 24, &codeword); 776 if (iErrorStat) return iErrorStat; 777 } 778 return 0; 779 } 780 781 782 OSCL_EXPORT_REF int16 iGetAVCConfigInfo(uint8 *buffer, int32 length, int32 *width, int32 *height, int32 *display_width, int32 *display_height, int32 *profile_idc, int32 *level_idc) 783 { 784 int16 status; 785 mp4StreamType psBits; 786 uint16 sps_length, pps_length; 787 int32 size; 788 int32 i = 0; 789 uint8* sps = NULL; 790 uint8* temp = (uint8 *)OSCL_MALLOC(sizeof(uint8) * length); 791 uint8* pps = NULL; 792 793 794 if (temp) 795 { 796 sps = temp; // Make a copy of the original pointer to be freed later 797 // Successfull allocation... copy input buffer 798 oscl_memcpy(sps, buffer, length); 799 } 800 else 801 { 802 // Allocation failed 803 return MP4_INVALID_VOL_PARAM; 804 } 805 806 if (length < 3) 807 { 808 OSCL_FREE(temp); 809 return MP4_INVALID_VOL_PARAM; 810 } 811 812 *width = *height = *display_height = *display_width = 0; 813 814 if (sps[0] == 0 && sps[1] == 0) 815 { 816 /* find SC at the beginning of the NAL */ 817 while (sps[i++] == 0 && i < length) 818 { 819 } 820 821 if (sps[i-1] == 1) 822 { 823 sps += i; 824 825 sps_length = 0; 826 // search for the next start code 827 while (!(sps[sps_length] == 0 && sps[sps_length+1] == 0 && sps[sps_length+2] == 1) && 828 sps_length < length - i - 2) 829 { 830 sps_length++; 831 } 832 833 if (sps_length >= length - i - 2) 834 { 835 OSCL_FREE(temp); 836 return MP4_INVALID_VOL_PARAM; 837 } 838 839 pps_length = length - i - sps_length - 3; 840 pps = sps + sps_length + 3; 841 } 842 else 843 { 844 OSCL_FREE(temp); 845 return MP4_INVALID_VOL_PARAM; 846 } 847 } 848 else 849 { 850 sps_length = (uint16)(sps[1] << 8) | sps[0]; 851 sps += 2; 852 pps = sps + sps_length; 853 pps_length = (uint16)(pps[1] << 8) | pps[0]; 854 pps += 2; 855 } 856 857 if (sps_length + pps_length > length) 858 { 859 OSCL_FREE(temp); 860 return MP4_INVALID_VOL_PARAM; 861 } 862 863 size = sps_length; 864 865 Parser_EBSPtoRBSP(sps, &size); 866 867 psBits.data = sps; 868 psBits.numBytes = size; 869 psBits.bitBuf = 0; 870 psBits.bitPos = 32; 871 psBits.bytePos = 0; 872 psBits.dataBitPos = 0; 873 874 LOGV("intel: --- call to DecodeSPS() begin ---\n"); 875 if (DecodeSPS(&psBits, width, height, display_width, display_height, profile_idc, level_idc)) 876 { 877 OSCL_FREE(temp); 878 return MP4_INVALID_VOL_PARAM; 879 } 880 LOGV("intel: --- call to DecodeSPS() end ---\n"); 881 882 // now do PPS 883 size = pps_length; 884 885 Parser_EBSPtoRBSP(pps, &size); 886 psBits.data = pps; 887 psBits.numBytes = size; 888 psBits.bitBuf = 0; 889 psBits.bitPos = 32; 890 psBits.bytePos = 0; 891 psBits.dataBitPos = 0; 892 893 #if 1 894 895 return 0; 896 897 #else 898 899 LOGV("intel: --- call to DecodePPS() begin ---\n"); 900 901 status = DecodePPS(&psBits); 902 903 LOGV("intel: --- call to DecodePPS() end : status = %x ---\n", status); 904 905 OSCL_FREE(temp); 906 907 return status; 908 #endif 909 } 910 911 void scaling_list(mp4StreamType *psBits, uint32 sizeOfScalingList) { 912 uint32 lastScale = 8; 913 uint32 nextScale = 8; 914 int32 delta_scale; 915 uint32 j = 0; 916 917 for (j = 0; j < sizeOfScalingList; j++) { 918 if(nextScale != 0) { 919 /* delta_scale */ 920 se_v(psBits, &delta_scale); 921 nextScale = ( lastScale + delta_scale + 256 ) % 256 ; 922 } 923 lastScale = ( nextScale == 0 ) ? lastScale : nextScale; 924 } 925 } 926 927 928 int16 DecodeSPS(mp4StreamType *psBits, int32 *width, int32 *height, int32 *display_width, int32 *display_height, int32 *profile_idc, int32 *level_idc) 929 { 930 uint32 temp; 931 int32 temp0; 932 uint left_offset, right_offset, top_offset, bottom_offset; 933 uint i; 934 935 ReadBits(psBits, 8, &temp); 936 937 if ((temp & 0x1F) != 7) { 938 return MP4_INVALID_VOL_PARAM; 939 } 940 941 /* Read profile_idc */ 942 ReadBits(psBits, 8, &temp); 943 *profile_idc = temp; 944 945 /* Read Constraint_set0-3_flag */ 946 ReadBits(psBits, 1, &temp); 947 ReadBits(psBits, 1, &temp); 948 ReadBits(psBits, 1, &temp); 949 ReadBits(psBits, 1, &temp); 950 951 LOGV("intel: --- profile_idc = %d ---\n", temp); 952 953 /* reserved_zero_4bits */ 954 ReadBits(psBits, 4, &temp); 955 956 /* level_idc */ 957 ReadBits(psBits, 8, &temp); 958 *level_idc = temp; 959 960 if (temp > 51) 961 return MP4_INVALID_VOL_PARAM; 962 963 /* seq_parameter_set_id */ 964 ue_v(psBits, &temp); 965 if(*profile_idc == 100 || *profile_idc == 110 || 966 *profile_idc == 122 || *profile_idc == 144 ) 967 { 968 /* chroma_format_idc */ 969 ue_v(psBits, &temp); 970 if(temp == 3) { 971 /* residual_colour_transform_flag */ 972 ReadBits(psBits, 1, &temp); 973 } 974 /* bit_depth_luma_minus8 */ 975 ue_v(psBits, &temp); 976 977 /* bit_depth_chroma_minus8 */ 978 ue_v(psBits, &temp); 979 980 /* qpprime_y_zero_transform_bypass_flag */ 981 ReadBits(psBits, 1, &temp); 982 983 /* seq_scaling_matrix_present_flag */ 984 ReadBits(psBits, 1, &temp); 985 986 if(temp) { 987 int i = 0; 988 for(i = 0; i < 8; i++) { 989 ReadBits(psBits, 1, &temp); 990 if(temp) { 991 if(i < 6 ) { 992 scaling_list(psBits, 16); 993 } else { 994 scaling_list(psBits, 64); 995 } 996 } 997 } 998 } 999 } 1000 1001 /* log2_max_frame_num_minus4 */ 1002 ue_v(psBits, &temp); 1003 1004 /* pic_order_cnt_type */ 1005 ue_v(psBits, &temp); 1006 1007 if (temp == 0) 1008 { 1009 ue_v(psBits, &temp); 1010 } 1011 else if (temp == 1) 1012 { 1013 ReadBits(psBits, 1, &temp); 1014 se_v(psBits, &temp0); 1015 se_v(psBits, &temp0); 1016 ue_v(psBits, &temp); 1017 1018 for (i = 0; i < temp; i++) 1019 { 1020 se_v(psBits, &temp0); 1021 } 1022 } 1023 1024 /* num_ref_frames */ 1025 ue_v(psBits, &temp); 1026 1027 /* gaps_in_frame_num_value_allowed_flag */ 1028 ReadBits(psBits, 1, &temp); 1029 1030 1031 /* pic_width_in_mbs_minus1 */ 1032 ue_v(psBits, &temp); 1033 *display_width = *width = (temp + 1) << 4; 1034 1035 /* pic_height_in_map_units_minus1 */ 1036 ue_v(psBits, &temp); 1037 *display_height = *height = (temp + 1) << 4; 1038 1039 1040 LOGV("---intel: 1 *display_width = %d *display_height = %d\n", *display_width, *display_height); 1041 1042 /* frame_mbs_only_flag */ 1043 ReadBits(psBits, 1, &temp); 1044 1045 if (!temp) 1046 { 1047 /* mb_adaptive_frame_field_flag */ 1048 ReadBits(psBits,1, &temp); 1049 } 1050 1051 /* direct_8x8_inference_flag */ 1052 ReadBits(psBits, 1, &temp); 1053 1054 /* frame_cropping_flag */ 1055 ReadBits(psBits, 1, &temp); 1056 1057 if (temp) 1058 { 1059 ue_v(psBits, (uint32*)&left_offset); 1060 ue_v(psBits, (uint32*)&right_offset); 1061 ue_v(psBits, (uint32*)&top_offset); 1062 ue_v(psBits, (uint32*)&bottom_offset); 1063 1064 *display_width = *width - 2 * (right_offset + left_offset); 1065 *display_height = *height - 2 * (top_offset + bottom_offset); 1066 1067 LOGV("---intel: 2 *display_width = %d *display_height = %d\n", *display_width, *display_height); 1068 } 1069 1070 /* no need to check further */ 1071 #if USE_LATER 1072 ReadBits(psBits, 1, &temp); 1073 if (temp) 1074 { 1075 if (!DecodeVUI(psBits)) 1076 { 1077 return MP4_INVALID_VOL_PARAM; 1078 } 1079 } 1080 #endif 1081 return 0; // return 0 for success 1082 } 1083 1084 #if USE_LATER 1085 /* unused for now */ 1086 int32 DecodeVUI(mp4StreamType *psBits) 1087 { 1088 uint temp; 1089 uint32 temp32; 1090 uint aspect_ratio_idc, overscan_appopriate_flag, video_format, video_full_range_flag; 1091 int32 status; 1092 1093 ReadBits(psBits, 1, &temp); /* aspect_ratio_info_present_flag */ 1094 if (temp) 1095 { 1096 ReadBits(psBits, 8, &aspect_ratio_idc); 1097 if (aspect_ratio_idc == 255) 1098 { 1099 ReadBits(psBits, 16, &temp); /* sar_width */ 1100 ReadBits(psBits, 16, &temp); /* sar_height */ 1101 } 1102 } 1103 ReadBits(psBits, 1, &temp); /* overscan_info_present */ 1104 if (temp) 1105 { 1106 ReadBits(psBits, 1, &overscan_appopriate_flag); 1107 } 1108 ReadBits(psBits, 1, &temp); /* video_signal_type_present_flag */ 1109 if (temp) 1110 { 1111 ReadBits(psBits, 3, &video_format); 1112 ReadBits(psBits, 1, &video_full_range_flag); 1113 ReadBits(psBits, 1, &temp); /* colour_description_present_flag */ 1114 if (temp) 1115 { 1116 ReadBits(psBits, 8, &temp); /* colour_primaries */ 1117 ReadBits(psBits, 8, &temp); /* transfer_characteristics */ 1118 ReadBits(psBits, 8, &temp); /* matrix coefficients */ 1119 } 1120 } 1121 ReadBits(psBits, 1, &temp);/* chroma_loc_info_present_flag */ 1122 if (temp) 1123 { 1124 ue_v(psBits, &temp); /* chroma_sample_loc_type_top_field */ 1125 ue_v(psBits, &temp); /* chroma_sample_loc_type_bottom_field */ 1126 } 1127 1128 ReadBits(psBits, 1, &temp); /* timing_info_present_flag*/ 1129 if (temp) 1130 { 1131 ReadBits(psBits, 32, &temp32); /* num_unit_in_tick*/ 1132 ReadBits(psBits, 32, &temp32); /* time_scale */ 1133 ReadBits(psBits, 1, &temp); /* fixed_frame_rate_flag */ 1134 } 1135 1136 ReadBits(psBits, 1, &temp); /* nal_hrd_parameters_present_flag */ 1137 if (temp) 1138 { 1139 if (!DecodeHRD(psBits)) 1140 { 1141 return 1; 1142 } 1143 } 1144 ReadBits(psBits, 1, &temp32); /* vcl_hrd_parameters_present_flag*/ 1145 if (temp32) 1146 { 1147 if (!DecodeHRD(psBits)) 1148 { 1149 return 1; 1150 } 1151 } 1152 if (temp || temp32) 1153 { 1154 ReadBits(psBits, 1, &temp); /* low_delay_hrd_flag */ 1155 } 1156 ReadBits(psBits, 1, &temp); /* pic_struct_present_flag */ 1157 status = ReadBits(psBits, 1, &temp); /* _restriction_flag */ 1158 if (status != 0) // buffer overrun 1159 { 1160 return 1; 1161 } 1162 1163 if (temp) 1164 { 1165 ReadBits(psBits, 1, &temp); /* motion_vectors_over_pic_boundaries_flag */ 1166 ue_v(psBits, &temp); /* max_bytes_per_pic_denom */ 1167 ue_v(psBits, &temp); /* max_bits_per_mb_denom */ 1168 ue_v(psBits, &temp); /* log2_max_mv_length_horizontal */ 1169 ue_v(psBits, &temp); /* log2_max_mv_length_vertical */ 1170 ue_v(psBits, &temp); /* num_reorder_frames */ 1171 ue_v(psBits, &temp); /* max_dec_frame_buffering */ 1172 } 1173 1174 return 0; // 0 for success 1175 } 1176 1177 /* unused for now */ 1178 int32 DecodeHRD(mp4StreamType *psBits) 1179 { 1180 uint temp; 1181 uint cpb_cnt_minus1; 1182 uint i; 1183 int32 status; 1184 1185 ue_v(psBits, &cpb_cnt_minus1); 1186 ReadBits(psBits, 4, &temp); /* bit_rate_scale */ 1187 ReadBits(psBits, 4, &temp); /* cpb_size_scale */ 1188 for (i = 0; i <= cpb_cnt_minus1; i++) 1189 { 1190 ue_v(psBits, &temp); /* bit_rate_value_minus1[i] */ 1191 ue_v(psBits, &temp); /* cpb_size_value_minus1[i] */ 1192 ue_v(psBits, &temp); /* cbr_flag[i] */ 1193 } 1194 ReadBits(psBits, 5, &temp); /* initial_cpb_removal_delay_length_minus1 */ 1195 ReadBits(psBits, 5, &temp); /* cpb_removal_delay_length_minus1 */ 1196 ReadBits(psBits, 5, &temp); /* dpb_output_delay_length_minus1 */ 1197 status = ReadBits(psBits, 5, &temp); /* time_offset_length */ 1198 1199 if (status != 0) // buffer overrun 1200 { 1201 return 1; 1202 } 1203 1204 return 0; // 0 for success 1205 } 1206 #endif 1207 1208 // only check for entropy coding mode 1209 int32 DecodePPS(mp4StreamType *psBits) 1210 { 1211 uint32 temp, pic_parameter_set_id, seq_parameter_set_id, entropy_coding_mode_flag; 1212 1213 ReadBits(psBits, 8, &temp); 1214 1215 if ((temp & 0x1F) != 8) return MP4_INVALID_VOL_PARAM; 1216 1217 ue_v(psBits, &pic_parameter_set_id); 1218 ue_v(psBits, &seq_parameter_set_id); 1219 1220 ReadBits(psBits, 1, &entropy_coding_mode_flag); 1221 if (entropy_coding_mode_flag) 1222 { 1223 return 1; 1224 } 1225 1226 return 0; 1227 } 1228 1229 void ue_v(mp4StreamType *psBits, uint32 *codeNum) 1230 { 1231 uint32 temp; 1232 uint tmp_cnt; 1233 int32 leading_zeros = 0; 1234 ShowBits(psBits, 16, &temp); 1235 1236 tmp_cnt = temp | 0x1; 1237 1238 PV_CLZ(leading_zeros, tmp_cnt) 1239 1240 if (leading_zeros < 8) 1241 { 1242 *codeNum = (temp >> (15 - (leading_zeros << 1))) - 1; 1243 1244 FlushBits(psBits, (leading_zeros << 1) + 1); 1245 1246 } 1247 else 1248 { 1249 ReadBits(psBits, (leading_zeros << 1) + 1, &temp); 1250 *codeNum = temp - 1; 1251 1252 } 1253 1254 } 1255 1256 1257 void se_v(mp4StreamType *psBits, int32 *value) 1258 { 1259 int32 leadingZeros = 0; 1260 uint32 temp; 1261 1262 OSCL_UNUSED_ARG(value); 1263 1264 ReadBits(psBits, 1, &temp); 1265 while (!temp) 1266 { 1267 leadingZeros++; 1268 if (ReadBits(psBits, 1, &temp)) 1269 { 1270 break; 1271 } 1272 } 1273 ReadBits(psBits, leadingZeros, &temp); 1274 } 1275 1276 void Parser_EBSPtoRBSP(uint8 *nal_unit, int32 *size) 1277 { 1278 int32 i, j; 1279 int32 count = 0; 1280 1281 1282 for (i = 0; i < *size; i++) 1283 { 1284 if (count == 2 && nal_unit[i] == 0x03) 1285 { 1286 break; 1287 } 1288 1289 if (nal_unit[i]) 1290 count = 0; 1291 else 1292 count++; 1293 } 1294 1295 count = 0; 1296 j = i++; 1297 for (; i < *size; i++) 1298 { 1299 if (count == 2 && nal_unit[i] == 0x03) 1300 { 1301 i++; 1302 count = 0; 1303 } 1304 nal_unit[j] = nal_unit[i]; 1305 if (nal_unit[i]) 1306 count = 0; 1307 else 1308 count++; 1309 j++; 1310 } 1311 1312 *size = j; 1313 } 1314 1315 1316 1317