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