Home | History | Annotate | Download | only in parser
      1 #include "viddec_mp4_videoobjectlayer.h"
      2 
      3 const unsigned char mp4_DefaultIntraQuantMatrix[64] = {
      4     8, 17, 18, 19, 21, 23, 25, 27,
      5     17, 18, 19, 21, 23, 25, 27, 28,
      6     20, 21, 22, 23, 24, 26, 28, 30,
      7     21, 22, 23, 24, 26, 28, 30, 32,
      8     22, 23, 24, 26, 28, 30, 32, 35,
      9     23, 24, 26, 28, 30, 32, 35, 38,
     10     25, 26, 28, 30, 32, 35, 38, 41,
     11     27, 28, 30, 32, 35, 38, 41, 45
     12 };
     13 const unsigned char mp4_DefaultNonIntraQuantMatrix[64] = {
     14     16, 17, 18, 19, 20, 21, 22, 23,
     15     17, 18, 19, 20, 21, 22, 23, 24,
     16     18, 19, 20, 21, 22, 23, 24, 25,
     17     19, 20, 21, 22, 23, 24, 26, 27,
     18     20, 21, 22, 23, 25, 26, 27, 28,
     19     21, 22, 23, 24, 26, 27, 28, 30,
     20     22, 23, 24, 26, 27, 28, 30, 31,
     21     23, 24, 25, 27, 28, 30, 31, 33
     22 };
     23 const unsigned char mp4_ClassicalZigzag[64] = {
     24     0,   1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
     25     12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
     26     35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
     27     58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
     28 };
     29 
     30 static inline int mp4_GetMacroBlockNumberSize(int nmb)
     31 {
     32     int  nb = 0;
     33     nmb --;
     34     do {
     35         nmb >>= 1;
     36         nb ++;
     37     } while (nmb);
     38     return nb;
     39 }
     40 
     41 static inline void mp4_copy_default_table(const uint8_t *src, uint8_t *dst, uint32_t len)
     42 {
     43     uint32_t i;
     44     for(i=0; i< len; i++)
     45         dst[i] = src[i];
     46 }
     47 
     48 
     49 static inline mp4_Status_t mp4_Parse_QuantMatrix(void *parent, uint8_t *pQM)
     50 {
     51     uint32_t i,code=0;
     52     uint8_t last=0;
     53     int32_t                 getbits=0;
     54     mp4_Status_t            ret = MP4_STATUS_OK;
     55 
     56     for (i = 0; i < 64; i ++)
     57     {
     58         getbits = viddec_pm_get_bits(parent, &code, 8);
     59         BREAK_GETBITS_REQD_MISSING(getbits, ret);
     60         if (code == 0) break;
     61         pQM[mp4_ClassicalZigzag[i]] = (uint8_t)(code & 0xFF);
     62     }
     63     last = pQM[mp4_ClassicalZigzag[i-1]];
     64     for (; i < 64; i ++)
     65     {
     66         pQM[mp4_ClassicalZigzag[i]] = last;
     67     }
     68     return ret;;
     69 }
     70 
     71 static inline uint8_t mp4_pvt_valid_object_type_indication(uint8_t val)
     72 {
     73     return ((1 <= val) || (val <= 18));
     74 }
     75 
     76 static inline uint8_t mp4_pvt_valid_object_layer_verid(uint8_t val)
     77 {
     78     uint8_t ret=false;
     79     switch(val)
     80     {
     81         case 1:
     82         case 2:
     83         case 4:
     84         case 5:
     85         {
     86             ret = true;
     87             break;
     88         }
     89         default:
     90         {
     91             break;
     92         }
     93     }
     94     return ret;
     95 }
     96 
     97 static mp4_Status_t
     98 mp4_pvt_VOL_volcontrolparameters(void *parent, viddec_mp4_parser_t *parser)
     99 {
    100     mp4_VOLControlParameters_t *cxt = &(parser->info.VisualObject.VideoObject.VOLControlParameters);
    101     mp4_Status_t            ret = MP4_STATUS_PARSE_ERROR;
    102     int32_t                 getbits=0;
    103     uint32_t                code=0;
    104 
    105     do
    106     {
    107         getbits = viddec_pm_get_bits(parent, &(code), 4);
    108         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    109         cxt->chroma_format = (code >> 2) & 0x3;
    110         cxt->low_delay = ((code & 0x2) > 0);
    111         cxt->vbv_parameters = code & 0x1;
    112 
    113         if (cxt->chroma_format != MP4_CHROMA_FORMAT_420)
    114         {
    115             DEB("Warning: mp4_Parse_VideoObject:vol_control_parameters.chroma_format != 4:2:0\n");
    116             cxt->chroma_format= MP4_CHROMA_FORMAT_420;
    117             parser->bitstream_error |= MP4_BS_ERROR_HDR_UNSUP;
    118             ret = MP4_STATUS_NOTSUPPORT;
    119         }
    120 
    121         if(cxt->vbv_parameters)
    122         {/* TODO: Check for validity of marker bits */
    123             getbits = viddec_pm_get_bits(parent, &(code), 32);
    124             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    125             /* 32 bits= firsthalf(15) + M + LatterHalf(15) + M */
    126             cxt->bit_rate = (code & 0xFFFE) >> 1; // Get rid of 1 marker bit
    127             cxt->bit_rate |= ((code & 0xFFFE0000) >> 2); // Get rid of 2 marker bits
    128 
    129             if(cxt->bit_rate == 0)
    130             {
    131                 DEB("Error: mp4_Parse_VideoObject:vidObjLay->VOLControlParameters.bit_rate = 0\n");
    132                 parser->bitstream_error |= MP4_BS_ERROR_HDR_UNSUP;
    133                 ret = MP4_STATUS_NOTSUPPORT;
    134                 // Do we need to really break here? Why not just set an error and proceed
    135                 //break;
    136             }
    137 
    138             getbits = viddec_pm_get_bits(parent, &(code), 19);
    139             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    140             /* 19 bits= firsthalf(15) + M + LatterHalf(3)*/
    141             cxt->vbv_buffer_size = code & 0x7;
    142             cxt->vbv_buffer_size |= ( (code >> 4) & 0x7FFF);
    143             if(cxt->vbv_buffer_size == 0)
    144             {
    145                 DEB("Error: mp4_Parse_VideoObject:vidObjLay->VOLControlParameters.vbv_buffer_size = 0\n");
    146                 parser->bitstream_error |= MP4_BS_ERROR_HDR_UNSUP;
    147                 ret = MP4_STATUS_NOTSUPPORT;
    148                 // Do we need to really break here? Why not just set an error and proceed
    149                 //break;
    150             }
    151 
    152             getbits = viddec_pm_get_bits(parent, &(code), 28);
    153             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    154             /* 28 bits= firsthalf(11) + M + LatterHalf(15) + M */
    155             code = code >>1;
    156             cxt->vbv_occupancy = code & 0x7FFF;
    157             code = code >>16;
    158             cxt->vbv_occupancy |= (code & 0x07FF);
    159         }
    160         ret = MP4_STATUS_OK;
    161     } while(0);
    162 
    163     return ret;
    164 }
    165 
    166 static uint32_t mp4_pvt_count_number_of_bits(uint32_t val)
    167 {
    168     uint32_t num_bits=0;
    169     do{
    170         val >>= 1;
    171         num_bits++;
    172     }while(val);
    173     return num_bits;
    174 }
    175 
    176 static mp4_Status_t
    177 mp4_Parse_VOL_sprite(void *parent,  viddec_mp4_parser_t *parser)
    178 {
    179     mp4_VideoObjectLayer_t  *vidObjLay = (&parser->info.VisualObject.VideoObject);
    180     mp4_VOLSpriteInfo_t     *cxt = &(vidObjLay->sprite_info);
    181     uint32_t                sprite_enable = vidObjLay->sprite_enable;
    182     uint32_t                code;
    183     mp4_Status_t            ret = MP4_STATUS_PARSE_ERROR;
    184     int32_t                 getbits=0;
    185 
    186     do{
    187         if ((sprite_enable == MP4_SPRITE_STATIC) ||
    188             (sprite_enable == MP4_SPRITE_GMC))
    189         {
    190             if (sprite_enable != MP4_SPRITE_GMC)
    191             {
    192                 /* This is not a supported type by HW */
    193                 DEB("ERROR: mp4_Parse_VideoObject:sprite_enable = %.2X\n", sprite_enable);
    194                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    195                 break;
    196             }
    197 
    198             getbits = viddec_pm_get_bits(parent, &(code), 9);
    199             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    200             cxt->sprite_brightness_change = code & 0x1;
    201             cxt->sprite_warping_accuracy = (code >> 1) & 0x3;
    202             cxt->no_of_sprite_warping_points = code >> 3;
    203             if(cxt->no_of_sprite_warping_points > 1)
    204             {
    205                 DEB("Error: mp4_Parse_VideoObject:bad no_of_sprite_warping_points %d\n",
    206                     cxt->no_of_sprite_warping_points);
    207                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    208                 break;
    209             }
    210 
    211             if((vidObjLay->sprite_enable == MP4_SPRITE_GMC) && (cxt->sprite_brightness_change))
    212             {
    213                 DEB("Error: mp4_Parse_VideoObject:sprite_brightness_change should be 0 for GMC sprites\n");
    214                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    215                 break;
    216             }
    217 
    218             if (vidObjLay->sprite_enable != MP4_SPRITE_GMC)
    219             {
    220                 DEB("ERROR: mp4_Parse_VideoObject:sprite_enable = %.2X\n", sprite_enable);
    221                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    222                 break;
    223             }
    224         }
    225         ret = MP4_STATUS_OK;
    226     }while(0);
    227 
    228     return ret;
    229 }
    230 
    231 static mp4_Status_t mp4_Parse_VOL_quant_mat(void *parent, mp4_VideoObjectLayer_t  *vidObjLay)
    232 {
    233     uint32_t                code;
    234     mp4_Status_t            ret = MP4_STATUS_PARSE_ERROR;
    235     int32_t                 getbits=0;
    236     mp4_VOLQuant_mat_t      *quant = &(vidObjLay->quant_mat_info);
    237 
    238     do{
    239         getbits = viddec_pm_get_bits(parent, &(code), 1);
    240         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    241         quant->load_intra_quant_mat = code;
    242         if (quant->load_intra_quant_mat)
    243         {
    244             mp4_Parse_QuantMatrix(parent, &(quant->intra_quant_mat[0]));
    245         }
    246         else
    247         {
    248             mp4_copy_default_table((const uint8_t *)&mp4_DefaultIntraQuantMatrix[0], (uint8_t *)&(quant->intra_quant_mat[0]), 64);
    249         }
    250 
    251         getbits = viddec_pm_get_bits(parent, &(code), 1);
    252         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    253         quant->load_nonintra_quant_mat = code;
    254         if (quant->load_nonintra_quant_mat)
    255         {
    256             mp4_Parse_QuantMatrix(parent, &(quant->nonintra_quant_mat[0]));
    257         }
    258         else
    259         {
    260             mp4_copy_default_table((const uint8_t *)&mp4_DefaultNonIntraQuantMatrix[0], (uint8_t *)&(quant->nonintra_quant_mat[0]), 64);
    261         }
    262         ret = MP4_STATUS_OK;
    263     }while(0);
    264     return ret;
    265 }
    266 
    267 static mp4_Status_t mp4_Parse_VOL_notbinaryonly(void *parent, viddec_mp4_parser_t *parser)
    268 {
    269     uint32_t                code;
    270     mp4_Info_t              *pInfo = &(parser->info);
    271     mp4_VideoObjectLayer_t  *vidObjLay = &(pInfo->VisualObject.VideoObject);
    272     mp4_Status_t            ret = MP4_STATUS_PARSE_ERROR;
    273     int32_t                 getbits=0;
    274 
    275     do{
    276         if (vidObjLay->video_object_layer_shape == MP4_SHAPE_TYPE_RECTANGULAR)
    277         {
    278             /* TODO: check for validity of marker bits */
    279             getbits = viddec_pm_get_bits(parent, &(code), 29);
    280             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    281             vidObjLay->video_object_layer_height = (code >> 1) & 0x1FFF;
    282             vidObjLay->video_object_layer_width = (code >> 15) & 0x1FFF;
    283         }
    284 
    285         getbits = viddec_pm_get_bits(parent, &(code), 2);
    286         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    287         vidObjLay->interlaced = ((code & 0x2) > 0);
    288         vidObjLay->obmc_disable = ((code & 0x1) > 0);
    289 
    290         {
    291             uint32_t num_bits=1;
    292             if(vidObjLay->video_object_layer_verid != 1) num_bits=2;
    293             getbits = viddec_pm_get_bits(parent, &(code), num_bits);
    294             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    295             vidObjLay->sprite_enable = code;
    296         }
    297 
    298         ret = mp4_Parse_VOL_sprite(parent, parser);
    299         if(ret != MP4_STATUS_OK)
    300         {
    301             break;
    302         }
    303 
    304         if ((vidObjLay->video_object_layer_verid != 1) &&
    305             (vidObjLay->video_object_layer_shape != MP4_SHAPE_TYPE_RECTANGULAR))
    306         {
    307             /*  not supported shape*/
    308             DEB("Error: mp4_Parse_VideoObject: sadct_disable, not supp\n");
    309             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    310             break;
    311         }
    312 
    313         getbits = viddec_pm_get_bits(parent, &(code), 1);
    314         BREAK_GETBITS_FAIL(getbits, ret);
    315         vidObjLay->not_8_bit = (code  > 0 );
    316         if(vidObjLay->not_8_bit)
    317         {
    318             /*  8 bit is only supported mode*/
    319             DEB("Error: mp4_Parse_VideoObject: not_8_bit, not supp\n");
    320             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    321             break;
    322         }
    323         else
    324         {/* We use default values since only 8 bit mode is supported */
    325             vidObjLay->quant_precision = 5;
    326             vidObjLay->bits_per_pixel = 8;
    327         }
    328 
    329         if (vidObjLay->video_object_layer_shape == MP4_SHAPE_TYPE_GRAYSCALE)
    330         {
    331             /* Should not get here as shape is checked earlier */
    332             DEB("Error: mp4_Parse_VideoObject: GRAYSCALE, not supp\n");
    333             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    334             break;
    335         }
    336 
    337         getbits = viddec_pm_get_bits(parent, &(code), 1);
    338         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    339         vidObjLay->quant_type = code;
    340         if (vidObjLay->quant_type)
    341         {
    342             ret = mp4_Parse_VOL_quant_mat(parent, vidObjLay);
    343             if(ret != MP4_STATUS_OK)
    344             {
    345                 break;
    346             }
    347         }
    348 
    349         if (vidObjLay->video_object_layer_verid != 1)
    350         {
    351             getbits = viddec_pm_get_bits(parent, &(code), 1);
    352             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    353             vidObjLay->quarter_sample = code;
    354         }
    355 
    356         getbits = viddec_pm_get_bits(parent, &(code), 1);
    357         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    358         vidObjLay->complexity_estimation_disable = code;
    359         if(!vidObjLay->complexity_estimation_disable)
    360         {/*  complexity estimation not supported */
    361             DEB("Error: mp4_Parse_VideoObject: vidObjLay->complexity_estimation_disable, not supp\n");
    362             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    363             break;
    364         }
    365 
    366         getbits = viddec_pm_get_bits(parent, &(code), 2);
    367         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    368         vidObjLay->resync_marker_disable = ((code & 0x2) > 0);
    369         vidObjLay->data_partitioned = code & 0x1;
    370         if(vidObjLay->data_partitioned)
    371         {
    372             getbits = viddec_pm_get_bits(parent, &(code), 1);
    373             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    374             vidObjLay->reversible_vlc = code;
    375         }
    376 
    377         if (vidObjLay->video_object_layer_verid != 1)
    378         {
    379             getbits = viddec_pm_get_bits(parent, &(code), 1);
    380             BREAK_GETBITS_FAIL(getbits, ret);
    381             vidObjLay->newpred_enable = code;
    382             if(vidObjLay->newpred_enable)
    383             {
    384                 DEB("Error: NEWPRED mode is not supported\n");
    385                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    386                 break;
    387             }
    388             getbits = viddec_pm_get_bits(parent, &(code), 1);
    389             BREAK_GETBITS_FAIL(getbits, ret);
    390             vidObjLay->reduced_resolution_vop_enable = code;
    391         }
    392 
    393         getbits = viddec_pm_get_bits(parent, &(code), 1);
    394         BREAK_GETBITS_FAIL(getbits, ret);
    395         vidObjLay->scalability = code;
    396         if(vidObjLay->scalability)
    397         {
    398             DEB("Error: VOL scalability is not supported\n");
    399             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    400             break;
    401         }
    402 
    403         // No need to parse further - none of the fields are interesting to parser/decoder/user
    404         ret = MP4_STATUS_OK;
    405     }while(0);
    406     return ret;
    407 }
    408 
    409 mp4_Status_t mp4_Parse_VideoObjectLayer(void *parent, viddec_mp4_parser_t *parser)
    410 {
    411     uint32_t                code;
    412     mp4_Info_t              *pInfo = &(parser->info);
    413     mp4_VisualObject_t      *visObj = &(pInfo->VisualObject);
    414     mp4_VideoObjectLayer_t  *vidObjLay = &(pInfo->VisualObject.VideoObject);
    415     mp4_Status_t            ret = MP4_STATUS_PARSE_ERROR;
    416     int32_t                 getbits=0;
    417 
    418 //DEB("entering mp4_Parse_VideoObjectLayer: bs_err: %d, ret: %d\n", parser->bitstream_error, ret);
    419     do{
    420         vidObjLay->VideoObjectPlane.sprite_transmit_mode = MP4_SPRITE_TRANSMIT_MODE_PIECE;
    421 
    422         vidObjLay->short_video_header = 0;
    423         vidObjLay->video_object_layer_id = (parser->current_sc & 0xF);
    424 
    425         getbits = viddec_pm_get_bits(parent, &code, 9);
    426         BREAK_GETBITS_REQD_MISSING(getbits, ret);
    427         vidObjLay->video_object_type_indication = code & 0xFF;
    428         vidObjLay->random_accessible_vol = ((code & 0x100) > 0);
    429 
    430         if(!mp4_pvt_valid_object_type_indication(vidObjLay->video_object_type_indication))
    431         {        /* Streams with "unknown" type mismatch with ref */
    432             DEB("Warning: video_object_type_indication = %d, forcing to 1\n",
    433                 vidObjLay->video_object_type_indication);
    434             vidObjLay->video_object_type_indication = 1;
    435         }
    436 
    437         if(vidObjLay->video_object_type_indication == MP4_VIDEO_OBJECT_TYPE_FINE_GRANULARITY_SCALABLE)
    438         {/* This is not a supported type by HW */
    439             DEB("ERROR: mp4_Parse_VideoObject:video_object_type_indication = %.2X\n",
    440                 vidObjLay->video_object_type_indication);
    441             ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    442             break;
    443         }
    444         else
    445         {
    446             getbits = viddec_pm_get_bits(parent, &(code), 1);
    447             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    448             vidObjLay->is_object_layer_identifier = code;
    449             vidObjLay->video_object_layer_verid =
    450                 (mp4_pvt_valid_object_layer_verid(visObj->visual_object_verid)) ? visObj->visual_object_verid : 1;
    451 
    452             if (vidObjLay->is_object_layer_identifier)
    453             {
    454                 getbits = viddec_pm_get_bits(parent, &(code), 7);
    455                 BREAK_GETBITS_REQD_MISSING(getbits, ret);
    456                 vidObjLay->video_object_layer_priority = code & 0x7;
    457                 vidObjLay->video_object_layer_verid = (code >> 3) & 0xF;
    458                 if(!mp4_pvt_valid_object_layer_verid(vidObjLay->video_object_layer_verid))
    459                 {
    460                     DEB("Error: mp4_Parse_VideoObject:is_identifier = %d, expected[1,5]\n",
    461                         vidObjLay->video_object_layer_verid);
    462                     ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    463                     break;
    464                 }
    465                 /* Video object layer ID supercedes visual object ID */
    466                 visObj->visual_object_verid = vidObjLay->video_object_layer_verid;
    467             }
    468 
    469             getbits = viddec_pm_get_bits(parent, &(code), 4);
    470             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    471             vidObjLay->aspect_ratio_info = code & 0xF;
    472             if(vidObjLay->aspect_ratio_info == MP4_ASPECT_RATIO_EXTPAR)
    473             {
    474                 getbits = viddec_pm_get_bits(parent, &(code), 16);
    475                 BREAK_GETBITS_REQD_MISSING(getbits, ret);
    476                 vidObjLay->aspect_ratio_info_par_width = (code >> 8) & 0xFF;
    477                 vidObjLay->aspect_ratio_info_par_height = code & 0xFF;
    478             }
    479 
    480             getbits = viddec_pm_get_bits(parent, &(code), 1);
    481             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    482             vidObjLay->is_vol_control_parameters = code;
    483             if(vidObjLay->is_vol_control_parameters)
    484             {
    485                 ret = mp4_pvt_VOL_volcontrolparameters(parent, parser);
    486                 if(ret != MP4_STATUS_OK)
    487                 {
    488                     break;
    489                 }
    490             }
    491 
    492             getbits = viddec_pm_get_bits(parent, &(code), 2);
    493             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    494             vidObjLay->video_object_layer_shape = code;
    495             /* If shape is not rectangluar exit early without parsing */
    496             if (vidObjLay->video_object_layer_shape != MP4_SHAPE_TYPE_RECTANGULAR)
    497             {
    498                 DEB("Error: mp4_Parse_VideoObject: shape not rectangluar(%d):%d\n",
    499                     MP4_SHAPE_TYPE_RECTANGULAR, vidObjLay->video_object_layer_shape);
    500                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    501                 break;
    502             }
    503 
    504             if ((vidObjLay->video_object_layer_verid != 1) &&
    505                 (vidObjLay->video_object_layer_shape == MP4_SHAPE_TYPE_GRAYSCALE))
    506             {/* Grayscale not supported */
    507                 DEB("Error: MP4_SHAPE_TYPE_GRAYSCALE not supported\n");
    508                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    509                 break;
    510             }
    511 
    512             getbits = viddec_pm_get_bits(parent, &(code), 19);
    513             BREAK_GETBITS_REQD_MISSING(getbits, ret);
    514             /* TODO: check validity of marker */
    515             vidObjLay->vop_time_increment_resolution = (code >> 2) & 0xFFFF;
    516             vidObjLay->fixed_vop_rate = code & 0x1;
    517 
    518             if(vidObjLay->vop_time_increment_resolution == 0)
    519             {
    520                 DEB("Error: 0 value for vop_time_increment_resolution\n");
    521                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    522                 break;
    523             }
    524             /* calculate number bits in vop_time_increment_resolution */
    525             vidObjLay->vop_time_increment_resolution_bits = (uint8_t)mp4_pvt_count_number_of_bits(
    526                 (uint32_t)(vidObjLay->vop_time_increment_resolution -1));
    527 
    528             if(vidObjLay->fixed_vop_rate)
    529             {
    530                 getbits = viddec_pm_get_bits(parent, &(code), vidObjLay->vop_time_increment_resolution_bits);
    531                 BREAK_GETBITS_REQD_MISSING(getbits, ret);
    532                 vidObjLay->fixed_vop_time_increment = code;
    533             }
    534 
    535             if (vidObjLay->video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY)
    536             {
    537                 ret = mp4_Parse_VOL_notbinaryonly(parent, parser);
    538                 if(ret != MP4_STATUS_OK)
    539                 {
    540                     break;
    541                 }
    542             }
    543             else
    544             {
    545                 DEB("Error: MP4_SHAPE_TYPE_BINARYONLY not supported\n");
    546                 ret = MP4_STATUS_NOTSUPPORT | MP4_STATUS_REQD_DATA_ERROR;
    547                 break;
    548             }
    549         }
    550 
    551         vidObjLay->VideoObjectPlane.sprite_transmit_mode = MP4_SPRITE_TRANSMIT_MODE_PIECE;
    552         ret = MP4_STATUS_OK;
    553     } while(0);
    554 
    555     mp4_set_hdr_bitstream_error(parser, true, ret);
    556     if(ret != MP4_STATUS_OK)
    557         parser->bitstream_error |= MP4_BS_ERROR_HDR_NONDEC;
    558 //DEB("before wkld mp4_Parse_VideoObjectLayer: bs_err: %d, ret: %d\n", parser->bitstream_error, ret);
    559 
    560     // POPULATE WORKLOAD ITEM
    561     {
    562         viddec_workload_item_t wi;
    563         viddec_workload_t *wl = viddec_pm_get_header(parent);
    564 
    565         wi.vwi_type = VIDDEC_WORKLOAD_MPEG4_VIDEO_OBJ;
    566 
    567         wi.mp4_vol.vol_aspect_ratio = 0;
    568         wi.mp4_vol.vol_bit_rate = 0;
    569         wi.mp4_vol.vol_frame_rate = 0;
    570 
    571         viddec_fw_mp4_vol_set_aspect_ratio_info(&wi.mp4_vol, vidObjLay->aspect_ratio_info);
    572         viddec_fw_mp4_vol_set_par_width(&wi.mp4_vol, vidObjLay->aspect_ratio_info_par_width);
    573         viddec_fw_mp4_vol_set_par_height(&wi.mp4_vol, vidObjLay->aspect_ratio_info_par_height);
    574         viddec_fw_mp4_vol_set_control_param(&wi.mp4_vol, vidObjLay->is_vol_control_parameters);
    575         viddec_fw_mp4_vol_set_chroma_format(&wi.mp4_vol, vidObjLay->VOLControlParameters.chroma_format);
    576         viddec_fw_mp4_vol_set_interlaced(&wi.mp4_vol, vidObjLay->interlaced);
    577         viddec_fw_mp4_vol_set_fixed_vop_rate(&wi.mp4_vol, vidObjLay->fixed_vop_rate);
    578 
    579         viddec_fw_mp4_vol_set_vbv_param(&wi.mp4_vol, vidObjLay->VOLControlParameters.vbv_parameters);
    580         viddec_fw_mp4_vol_set_bit_rate(&wi.mp4_vol, vidObjLay->VOLControlParameters.bit_rate);
    581 
    582         viddec_fw_mp4_vol_set_fixed_vop_time_increment(&wi.mp4_vol, vidObjLay->fixed_vop_time_increment);
    583         viddec_fw_mp4_vol_set_vop_time_increment_resolution(&wi.mp4_vol, vidObjLay->vop_time_increment_resolution);
    584 
    585         ret = viddec_pm_append_workitem(parent, &wi);
    586         if(ret == 1)
    587             ret = MP4_STATUS_OK;
    588 
    589         memset(&(wl->attrs), 0, sizeof(viddec_frame_attributes_t));
    590 
    591         wl->attrs.cont_size.width = vidObjLay->video_object_layer_width;
    592         wl->attrs.cont_size.height = vidObjLay->video_object_layer_height;
    593     }
    594 
    595     return ret;
    596 }
    597