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 "avcdec_lib.h"
     19 #include "avcdec_bitstream.h"
     20 #include "oscl_mem.h"
     21 #include "avcdec_api.h"
     22 
     23 /** see subclause 7.4.2.1 */
     24 AVCDec_Status DecodeSPS(AVCDecObject *decvid, AVCDecBitstream *stream)
     25 {
     26     AVCDec_Status status = AVCDEC_SUCCESS;
     27     AVCSeqParamSet *seqParam;
     28     uint temp;
     29     int i;
     30     uint profile_idc, constrained_set0_flag, constrained_set1_flag, constrained_set2_flag;
     31     uint level_idc, seq_parameter_set_id;
     32     void *userData = decvid->avcHandle->userData;
     33     AVCHandle *avcHandle = decvid->avcHandle;
     34 
     35     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "DecodeSPS", -1, -1);
     36 
     37     BitstreamReadBits(stream, 8, &profile_idc);
     38     BitstreamRead1Bit(stream, &constrained_set0_flag);
     39 //  if (profile_idc != 66 && constrained_set0_flag != 1)
     40 //  {
     41 //      return AVCDEC_FAIL;
     42 //  }
     43     BitstreamRead1Bit(stream, &constrained_set1_flag);
     44     BitstreamRead1Bit(stream, &constrained_set2_flag);
     45     BitstreamReadBits(stream, 5, &temp);
     46     BitstreamReadBits(stream, 8, &level_idc);
     47     if (level_idc > 51)
     48     {
     49         return AVCDEC_FAIL;
     50     }
     51     if (mapLev2Idx[level_idc] == 255)
     52     {
     53         return AVCDEC_FAIL;
     54     }
     55     ue_v(stream, &seq_parameter_set_id);
     56 
     57     if (seq_parameter_set_id > 31)
     58     {
     59         return AVCDEC_FAIL;
     60     }
     61 
     62     /* Allocate sequence param set for seqParams[seq_parameter_set_id]. */
     63     if (decvid->seqParams[seq_parameter_set_id] == NULL)  /* allocate seqParams[id] */
     64     {
     65         decvid->seqParams[seq_parameter_set_id] =
     66             (AVCSeqParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSeqParamSet), DEFAULT_ATTR);
     67 
     68         if (decvid->seqParams[seq_parameter_set_id] == NULL)
     69         {
     70             return AVCDEC_MEMORY_FAIL;
     71         }
     72     }
     73 
     74     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "done alloc seqParams", -1, -1);
     75 
     76     seqParam = decvid->seqParams[seq_parameter_set_id];
     77 
     78     seqParam->profile_idc = profile_idc;
     79     seqParam->constrained_set0_flag = constrained_set0_flag;
     80     seqParam->constrained_set1_flag = constrained_set1_flag;
     81     seqParam->constrained_set2_flag = constrained_set2_flag;
     82     seqParam->level_idc = level_idc;
     83     seqParam->seq_parameter_set_id = seq_parameter_set_id;
     84 
     85     /* continue decoding SPS */
     86     ue_v(stream, &(seqParam->log2_max_frame_num_minus4));
     87 
     88     if (seqParam->log2_max_frame_num_minus4 > 12)
     89     {
     90         return AVCDEC_FAIL;
     91     }
     92 
     93     ue_v(stream, &(seqParam->pic_order_cnt_type));
     94 
     95     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 1", seqParam->log2_max_frame_num_minus4, seqParam->pic_order_cnt_type);
     96 
     97     if (seqParam->pic_order_cnt_type == 0)
     98     {
     99         ue_v(stream, &(seqParam->log2_max_pic_order_cnt_lsb_minus4));
    100     }
    101     else if (seqParam->pic_order_cnt_type == 1)
    102     {               // MC_CHECK
    103         BitstreamRead1Bit(stream, (uint*)&(seqParam->delta_pic_order_always_zero_flag));
    104         se_v32bit(stream, &(seqParam->offset_for_non_ref_pic));
    105         se_v32bit(stream, &(seqParam->offset_for_top_to_bottom_field));
    106         ue_v(stream, &(seqParam->num_ref_frames_in_pic_order_cnt_cycle));
    107 
    108         for (i = 0; i < (int)(seqParam->num_ref_frames_in_pic_order_cnt_cycle); i++)
    109         {
    110             se_v32bit(stream, &(seqParam->offset_for_ref_frame[i]));
    111         }
    112     }
    113 
    114     ue_v(stream, &(seqParam->num_ref_frames));
    115 
    116     if (seqParam->num_ref_frames > 16)
    117     {
    118         return AVCDEC_FAIL;
    119     }
    120 
    121     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 2", seqParam->num_ref_frames, -1);
    122 
    123     BitstreamRead1Bit(stream, (uint*)&(seqParam->gaps_in_frame_num_value_allowed_flag));
    124     ue_v(stream, &(seqParam->pic_width_in_mbs_minus1));
    125 
    126     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "picwidth", seqParam->pic_width_in_mbs_minus1, -1);
    127 
    128     ue_v(stream, &(seqParam->pic_height_in_map_units_minus1));
    129 
    130     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "picwidth", seqParam->pic_height_in_map_units_minus1, -1);
    131 
    132     BitstreamRead1Bit(stream, (uint*)&(seqParam->frame_mbs_only_flag));
    133 
    134     seqParam->mb_adaptive_frame_field_flag = 0; /* default value */
    135     if (!seqParam->frame_mbs_only_flag)
    136     {
    137         BitstreamRead1Bit(stream, (uint*)&(seqParam->mb_adaptive_frame_field_flag));
    138     }
    139 
    140     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 3", seqParam->frame_mbs_only_flag, -1);
    141 
    142     BitstreamRead1Bit(stream, (uint*)&(seqParam->direct_8x8_inference_flag));
    143 
    144     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 4", seqParam->direct_8x8_inference_flag, -1);
    145 
    146     BitstreamRead1Bit(stream, (uint*)&(seqParam->frame_cropping_flag));
    147     seqParam->frame_crop_left_offset = 0;  /* default value */
    148     seqParam->frame_crop_right_offset = 0;/* default value */
    149     seqParam->frame_crop_top_offset = 0;/* default value */
    150     seqParam->frame_crop_bottom_offset = 0;/* default value */
    151     if (seqParam->frame_cropping_flag)
    152     {
    153         ue_v(stream, &(seqParam->frame_crop_left_offset));
    154         ue_v(stream, &(seqParam->frame_crop_right_offset));
    155         ue_v(stream, &(seqParam->frame_crop_top_offset));
    156         ue_v(stream, &(seqParam->frame_crop_bottom_offset));
    157     }
    158 
    159     DEBUG_LOG(userData, AVC_LOGTYPE_INFO, "check point 5", seqParam->frame_cropping_flag, -1);
    160 
    161     BitstreamRead1Bit(stream, (uint*)&(seqParam->vui_parameters_present_flag));
    162     if (seqParam->vui_parameters_present_flag)
    163     {
    164         status = vui_parameters(decvid, stream, seqParam);
    165         if (status != AVCDEC_SUCCESS)
    166         {
    167             return AVCDEC_FAIL;
    168         }
    169     }
    170 
    171     return status;
    172 }
    173 
    174 
    175 AVCDec_Status vui_parameters(AVCDecObject *decvid, AVCDecBitstream *stream, AVCSeqParamSet *currSPS)
    176 {
    177     uint temp;
    178     uint temp32;
    179     uint aspect_ratio_idc, overscan_appopriate_flag, video_format, video_full_range_flag;
    180     /* aspect_ratio_info_present_flag */
    181     BitstreamRead1Bit(stream, &temp);
    182     if (temp)
    183     {
    184         BitstreamReadBits(stream, 8, &aspect_ratio_idc);
    185         if (aspect_ratio_idc == 255)
    186         {
    187             /* sar_width */
    188             BitstreamReadBits(stream, 16, &temp);
    189             /* sar_height */
    190             BitstreamReadBits(stream, 16, &temp);
    191         }
    192     }
    193     /* overscan_info_present */
    194     BitstreamRead1Bit(stream, &temp);
    195     if (temp)
    196     {
    197         BitstreamRead1Bit(stream, &overscan_appopriate_flag);
    198     }
    199     /* video_signal_type_present_flag */
    200     BitstreamRead1Bit(stream, &temp);
    201     if (temp)
    202     {
    203         BitstreamReadBits(stream, 3, &video_format);
    204         BitstreamRead1Bit(stream, &video_full_range_flag);
    205         /* colour_description_present_flag */
    206         BitstreamRead1Bit(stream, &temp);
    207         if (temp)
    208         {
    209             /* colour_primaries */
    210             BitstreamReadBits(stream, 8, &temp);
    211             /* transfer_characteristics */
    212             BitstreamReadBits(stream, 8, &temp);
    213             /* matrix coefficients */
    214             BitstreamReadBits(stream, 8, &temp);
    215         }
    216     }
    217     /*  chroma_loc_info_present_flag */
    218     BitstreamRead1Bit(stream, &temp);
    219     if (temp)
    220     {
    221         /*  chroma_sample_loc_type_top_field */
    222         ue_v(stream, &temp);
    223         /*  chroma_sample_loc_type_bottom_field */
    224         ue_v(stream, &temp);
    225     }
    226 
    227     /*  timing_info_present_flag*/
    228     BitstreamRead1Bit(stream, &temp);
    229     if (temp)
    230     {
    231         /*  num_unit_in_tick*/
    232         BitstreamReadBits(stream, 32, &temp32);
    233         /*  time_scale */
    234         BitstreamReadBits(stream, 32, &temp32);
    235         /*  fixed_frame_rate_flag */
    236         BitstreamRead1Bit(stream, &temp);
    237     }
    238 
    239     /*  nal_hrd_parameters_present_flag */
    240     BitstreamRead1Bit(stream, &temp);
    241     currSPS->vui_parameters.nal_hrd_parameters_present_flag = temp;
    242     if (temp)
    243     {
    244         hrd_parameters(decvid, stream, &(currSPS->vui_parameters.nal_hrd_parameters));
    245     }
    246     /*  vcl_hrd_parameters_present_flag*/
    247     BitstreamRead1Bit(stream, &temp);
    248     currSPS->vui_parameters.vcl_hrd_parameters_present_flag = temp;
    249     if (temp)
    250     {
    251         hrd_parameters(decvid, stream, &(currSPS->vui_parameters.vcl_hrd_parameters));
    252     }
    253     if (currSPS->vui_parameters.nal_hrd_parameters_present_flag || currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
    254     {
    255         /*  low_delay_hrd_flag */
    256         BitstreamRead1Bit(stream, &temp);
    257     }
    258     /*  pic_struct_present_flag */
    259     BitstreamRead1Bit(stream, &temp);
    260     currSPS->vui_parameters.pic_struct_present_flag = temp;
    261     /*  bitstream_restriction_flag */
    262     BitstreamRead1Bit(stream, &temp);
    263     if (temp)
    264     {
    265         /*  motion_vectors_over_pic_boundaries_flag */
    266         BitstreamRead1Bit(stream, &temp);
    267         /*  max_bytes_per_pic_denom */
    268         ue_v(stream, &temp);
    269         /*  max_bits_per_mb_denom */
    270         ue_v(stream, &temp);
    271         /*  log2_max_mv_length_horizontal */
    272         ue_v(stream, &temp);
    273         /*  log2_max_mv_length_vertical */
    274         ue_v(stream, &temp);
    275         /*  num_reorder_frames */
    276         ue_v(stream, &temp);
    277         /*  max_dec_frame_buffering */
    278         ue_v(stream, &temp);
    279     }
    280     return AVCDEC_SUCCESS;
    281 }
    282 AVCDec_Status hrd_parameters(AVCDecObject *decvid, AVCDecBitstream *stream, AVCHRDParams *HRDParam)
    283 {
    284     OSCL_UNUSED_ARG(decvid);
    285     uint temp;
    286     uint cpb_cnt_minus1;
    287     uint i;
    288     ue_v(stream, &cpb_cnt_minus1);
    289     HRDParam->cpb_cnt_minus1 = cpb_cnt_minus1;
    290     /*  bit_rate_scale */
    291     BitstreamReadBits(stream, 4, &temp);
    292     /*  cpb_size_scale */
    293     BitstreamReadBits(stream, 4, &temp);
    294     for (i = 0; i <= cpb_cnt_minus1; i++)
    295     {
    296         /*  bit_rate_value_minus1[i] */
    297         ue_v(stream, &temp);
    298         /*  cpb_size_value_minus1[i] */
    299         ue_v(stream, &temp);
    300         /*  cbr_flag[i] */
    301         ue_v(stream, &temp);
    302     }
    303     /*  initial_cpb_removal_delay_length_minus1 */
    304     BitstreamReadBits(stream, 5, &temp);
    305     /*  cpb_removal_delay_length_minus1 */
    306     BitstreamReadBits(stream, 5, &temp);
    307     HRDParam->cpb_removal_delay_length_minus1 = temp;
    308     /*  dpb_output_delay_length_minus1 */
    309     BitstreamReadBits(stream, 5, &temp);
    310     HRDParam->dpb_output_delay_length_minus1 = temp;
    311     /*  time_offset_length  */
    312     BitstreamReadBits(stream, 5, &temp);
    313     HRDParam->time_offset_length = temp;
    314     return AVCDEC_SUCCESS;
    315 }
    316 
    317 
    318 /** see subclause 7.4.2.2 */
    319 AVCDec_Status DecodePPS(AVCDecObject *decvid, AVCCommonObj *video, AVCDecBitstream *stream)
    320 {
    321     AVCPicParamSet *picParam;
    322     AVCDec_Status status;
    323     int i, iGroup, numBits;
    324     int PicWidthInMbs, PicHeightInMapUnits, PicSizeInMapUnits;
    325     uint pic_parameter_set_id, seq_parameter_set_id;
    326     void *userData = decvid->avcHandle->userData;
    327     AVCHandle *avcHandle = decvid->avcHandle;
    328 
    329     ue_v(stream, &pic_parameter_set_id);
    330     if (pic_parameter_set_id > 255)
    331     {
    332         return AVCDEC_FAIL;
    333     }
    334 
    335     ue_v(stream, &seq_parameter_set_id);
    336 
    337     if (seq_parameter_set_id > 31)
    338     {
    339         return AVCDEC_FAIL;
    340     }
    341 
    342     /* 2.1 if picParams[pic_param_set_id] is NULL, allocate it. */
    343     if (decvid->picParams[pic_parameter_set_id] == NULL)
    344     {
    345         decvid->picParams[pic_parameter_set_id] =
    346             (AVCPicParamSet*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCPicParamSet), DEFAULT_ATTR);
    347         if (decvid->picParams[pic_parameter_set_id] == NULL)
    348         {
    349             return AVCDEC_MEMORY_FAIL;
    350         }
    351 
    352         decvid->picParams[pic_parameter_set_id]->slice_group_id = NULL;
    353     }
    354 
    355     video->currPicParams = picParam = decvid->picParams[pic_parameter_set_id];
    356     picParam->seq_parameter_set_id = seq_parameter_set_id;
    357     picParam->pic_parameter_set_id = pic_parameter_set_id;
    358 
    359     BitstreamRead1Bit(stream, (uint*)&(picParam->entropy_coding_mode_flag));
    360     if (picParam->entropy_coding_mode_flag)
    361     {
    362         status = AVCDEC_FAIL;
    363         goto clean_up;
    364     }
    365     BitstreamRead1Bit(stream, (uint*)&(picParam->pic_order_present_flag));
    366     ue_v(stream, &(picParam->num_slice_groups_minus1));
    367 
    368     if (picParam->num_slice_groups_minus1 > MAX_NUM_SLICE_GROUP - 1)
    369     {
    370         status = AVCDEC_FAIL;
    371         goto clean_up;
    372     }
    373 
    374     picParam->slice_group_change_rate_minus1 = 0; /* default value */
    375     if (picParam->num_slice_groups_minus1 > 0)
    376     {
    377         ue_v(stream, &(picParam->slice_group_map_type));
    378         if (picParam->slice_group_map_type == 0)
    379         {
    380             for (iGroup = 0; iGroup <= (int)picParam->num_slice_groups_minus1; iGroup++)
    381             {
    382                 ue_v(stream, &(picParam->run_length_minus1[iGroup]));
    383             }
    384         }
    385         else if (picParam->slice_group_map_type == 2)
    386         {   // MC_CHECK  <= or <
    387             for (iGroup = 0; iGroup < (int)picParam->num_slice_groups_minus1; iGroup++)
    388             {
    389                 ue_v(stream, &(picParam->top_left[iGroup]));
    390                 ue_v(stream, &(picParam->bottom_right[iGroup]));
    391             }
    392         }
    393         else if (picParam->slice_group_map_type == 3 ||
    394                  picParam->slice_group_map_type == 4 ||
    395                  picParam->slice_group_map_type == 5)
    396         {
    397             BitstreamRead1Bit(stream, (uint*)&(picParam->slice_group_change_direction_flag));
    398             ue_v(stream, &(picParam->slice_group_change_rate_minus1));
    399         }
    400         else if (picParam->slice_group_map_type == 6)
    401         {
    402             ue_v(stream, &(picParam->pic_size_in_map_units_minus1));
    403 
    404             numBits = 0;/* ceil(log2(num_slice_groups_minus1+1)) bits */
    405             i = picParam->num_slice_groups_minus1;
    406             while (i > 0)
    407             {
    408                 numBits++;
    409                 i >>= 1;
    410             }
    411 
    412             i = picParam->seq_parameter_set_id;
    413             if (decvid->seqParams[i] == NULL)
    414             {
    415                 status = AVCDEC_FAIL;
    416                 goto clean_up;
    417             }
    418 
    419 
    420             PicWidthInMbs = decvid->seqParams[i]->pic_width_in_mbs_minus1 + 1;
    421             PicHeightInMapUnits = decvid->seqParams[i]->pic_height_in_map_units_minus1 + 1 ;
    422             PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits ;
    423 
    424             /* information has to be consistent with the seq_param */
    425             if ((int)picParam->pic_size_in_map_units_minus1 != PicSizeInMapUnits - 1)
    426             {
    427                 status = AVCDEC_FAIL;
    428                 goto clean_up;
    429             }
    430 
    431             if (picParam->slice_group_id)
    432             {
    433                 avcHandle->CBAVC_Free(userData, (int)picParam->slice_group_id);
    434             }
    435             picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * PicSizeInMapUnits, DEFAULT_ATTR);
    436             if (picParam->slice_group_id == NULL)
    437             {
    438                 status =  AVCDEC_MEMORY_FAIL;
    439                 goto clean_up;
    440             }
    441 
    442             for (i = 0; i < PicSizeInMapUnits; i++)
    443             {
    444                 BitstreamReadBits(stream, numBits, &(picParam->slice_group_id[i]));
    445             }
    446         }
    447 
    448     }
    449 
    450     ue_v(stream, &(picParam->num_ref_idx_l0_active_minus1));
    451     if (picParam->num_ref_idx_l0_active_minus1 > 31)
    452     {
    453         status = AVCDEC_FAIL; /* out of range */
    454         goto clean_up;
    455     }
    456 
    457     ue_v(stream, &(picParam->num_ref_idx_l1_active_minus1));
    458     if (picParam->num_ref_idx_l1_active_minus1 > 31)
    459     {
    460         status = AVCDEC_FAIL; /* out of range */
    461         goto clean_up;
    462     }
    463 
    464     BitstreamRead1Bit(stream, (uint*)&(picParam->weighted_pred_flag));
    465     BitstreamReadBits(stream, 2, &(picParam->weighted_bipred_idc));
    466     if (picParam->weighted_bipred_idc > 2)
    467     {
    468         status = AVCDEC_FAIL; /* out of range */
    469         goto clean_up;
    470     }
    471 
    472     se_v(stream, &(picParam->pic_init_qp_minus26));
    473     if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
    474     {
    475         status = AVCDEC_FAIL; /* out of range */
    476         goto clean_up;
    477     }
    478 
    479     se_v(stream, &(picParam->pic_init_qs_minus26));
    480     if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
    481     {
    482         status = AVCDEC_FAIL; /* out of range */
    483         goto clean_up;
    484     }
    485 
    486     se_v(stream, &(picParam->chroma_qp_index_offset));
    487     if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
    488     {
    489         status = AVCDEC_FAIL; /* out of range */
    490         status = AVCDEC_FAIL; /* out of range */
    491         goto clean_up;
    492     }
    493 
    494     BitstreamReadBits(stream, 3, &pic_parameter_set_id);
    495     picParam->deblocking_filter_control_present_flag = pic_parameter_set_id >> 2;
    496     picParam->constrained_intra_pred_flag = (pic_parameter_set_id >> 1) & 1;
    497     picParam->redundant_pic_cnt_present_flag = pic_parameter_set_id & 1;
    498 
    499     return AVCDEC_SUCCESS;
    500 clean_up:
    501     if (decvid->picParams[pic_parameter_set_id])
    502     {
    503         if (picParam->slice_group_id)
    504         {
    505             avcHandle->CBAVC_Free(userData, (int)picParam->slice_group_id);
    506         }
    507         decvid->picParams[pic_parameter_set_id]->slice_group_id = NULL;
    508         avcHandle->CBAVC_Free(userData, (int)decvid->picParams[pic_parameter_set_id]);
    509         decvid->picParams[pic_parameter_set_id] = NULL;
    510         return status;
    511     }
    512     return AVCDEC_SUCCESS;
    513 }
    514 
    515 
    516 /* FirstPartOfSliceHeader();
    517     RestOfSliceHeader() */
    518 /** see subclause 7.4.3 */
    519 AVCDec_Status DecodeSliceHeader(AVCDecObject *decvid, AVCCommonObj *video, AVCDecBitstream *stream)
    520 {
    521     AVCSliceHeader *sliceHdr = video->sliceHdr;
    522     AVCPicParamSet *currPPS;
    523     AVCSeqParamSet *currSPS;
    524     AVCDec_Status status;
    525     uint idr_pic_id;
    526     int slice_type, temp, i;
    527 
    528     ue_v(stream, &(sliceHdr->first_mb_in_slice));
    529     ue_v(stream, (uint*)&slice_type);
    530 
    531     if (sliceHdr->first_mb_in_slice != 0)
    532     {
    533         if ((int)sliceHdr->slice_type >= 5 && slice_type != (int)sliceHdr->slice_type - 5)
    534         {
    535             return AVCDEC_FAIL; /* slice type doesn't follow the first slice in the picture */
    536         }
    537     }
    538     sliceHdr->slice_type = (AVCSliceType) slice_type;
    539     if (slice_type > 4)
    540     {
    541         slice_type -= 5;
    542     }
    543 
    544     if (slice_type == 1 || slice_type > 2)
    545     {
    546         return AVCDEC_FAIL;
    547     }
    548 
    549     video->slice_type = (AVCSliceType) slice_type;
    550 
    551     ue_v(stream, &(sliceHdr->pic_parameter_set_id));
    552     /* end FirstPartSliceHeader() */
    553     /* begin RestOfSliceHeader() */
    554     /* after getting pic_parameter_set_id, we have to load corresponding SPS and PPS */
    555     if (sliceHdr->pic_parameter_set_id > 255)
    556     {
    557         return AVCDEC_FAIL;
    558     }
    559 
    560     if (decvid->picParams[sliceHdr->pic_parameter_set_id] == NULL)
    561         return AVCDEC_FAIL; /* PPS doesn't exist */
    562 
    563     currPPS = video->currPicParams = decvid->picParams[sliceHdr->pic_parameter_set_id];
    564 
    565     if (decvid->seqParams[currPPS->seq_parameter_set_id] == NULL)
    566         return AVCDEC_FAIL; /* SPS doesn't exist */
    567 
    568     currSPS = video->currSeqParams = decvid->seqParams[currPPS->seq_parameter_set_id];
    569 
    570     if (currPPS->seq_parameter_set_id != video->seq_parameter_set_id)
    571     {
    572         video->seq_parameter_set_id = currPPS->seq_parameter_set_id;
    573         status = (AVCDec_Status)AVCConfigureSequence(decvid->avcHandle, video, false);
    574         if (status != AVCDEC_SUCCESS)
    575             return status;
    576         video->level_idc = currSPS->level_idc;
    577     }
    578 
    579     /* derived variables from SPS */
    580     video->MaxFrameNum = 1 << (currSPS->log2_max_frame_num_minus4 + 4);
    581     // MC_OPTIMIZE
    582     video->PicWidthInMbs = currSPS->pic_width_in_mbs_minus1 + 1;
    583     video->PicWidthInSamplesL = video->PicWidthInMbs * 16 ;
    584     video->PicWidthInSamplesC = video->PicWidthInMbs * 8 ;
    585     video->PicHeightInMapUnits = currSPS->pic_height_in_map_units_minus1 + 1 ;
    586     video->PicSizeInMapUnits = video->PicWidthInMbs * video->PicHeightInMapUnits ;
    587     video->FrameHeightInMbs = (2 - currSPS->frame_mbs_only_flag) * video->PicHeightInMapUnits ;
    588 
    589     /* derived from PPS */
    590     video->SliceGroupChangeRate = currPPS->slice_group_change_rate_minus1 + 1;
    591 
    592     /* then we can continue decoding slice header */
    593 
    594     BitstreamReadBits(stream, currSPS->log2_max_frame_num_minus4 + 4, &(sliceHdr->frame_num));
    595 
    596     if (video->currFS == NULL && sliceHdr->frame_num != 0)
    597     {
    598         video->prevFrameNum = video->PrevRefFrameNum = sliceHdr->frame_num - 1;
    599     }
    600 
    601     if (!currSPS->frame_mbs_only_flag)
    602     {
    603         BitstreamRead1Bit(stream, &(sliceHdr->field_pic_flag));
    604         if (sliceHdr->field_pic_flag)
    605         {
    606             return AVCDEC_FAIL;
    607         }
    608     }
    609 
    610     /* derived variables from slice header*/
    611     video->PicHeightInMbs = video->FrameHeightInMbs;
    612     video->PicHeightInSamplesL = video->PicHeightInMbs * 16;
    613     video->PicHeightInSamplesC = video->PicHeightInMbs * 8;
    614     video->PicSizeInMbs = video->PicWidthInMbs * video->PicHeightInMbs;
    615 
    616     if (sliceHdr->first_mb_in_slice >= video->PicSizeInMbs)
    617     {
    618         return AVCDEC_FAIL;
    619     }
    620     video->MaxPicNum = video->MaxFrameNum;
    621     video->CurrPicNum = sliceHdr->frame_num;
    622 
    623 
    624     if (video->nal_unit_type == AVC_NALTYPE_IDR)
    625     {
    626         if (sliceHdr->frame_num != 0)
    627         {
    628             return AVCDEC_FAIL;
    629         }
    630         ue_v(stream, &idr_pic_id);
    631     }
    632 
    633     sliceHdr->delta_pic_order_cnt_bottom = 0; /* default value */
    634     sliceHdr->delta_pic_order_cnt[0] = 0; /* default value */
    635     sliceHdr->delta_pic_order_cnt[1] = 0; /* default value */
    636     if (currSPS->pic_order_cnt_type == 0)
    637     {
    638         BitstreamReadBits(stream, currSPS->log2_max_pic_order_cnt_lsb_minus4 + 4,
    639                           &(sliceHdr->pic_order_cnt_lsb));
    640         video->MaxPicOrderCntLsb =  1 << (currSPS->log2_max_pic_order_cnt_lsb_minus4 + 4);
    641         if (sliceHdr->pic_order_cnt_lsb > video->MaxPicOrderCntLsb - 1)
    642             return AVCDEC_FAIL; /* out of range */
    643 
    644         if (currPPS->pic_order_present_flag)
    645         {
    646             se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt_bottom));
    647         }
    648     }
    649     if (currSPS->pic_order_cnt_type == 1 && !currSPS->delta_pic_order_always_zero_flag)
    650     {
    651         se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt[0]));
    652         if (currPPS->pic_order_present_flag)
    653         {
    654             se_v32bit(stream, &(sliceHdr->delta_pic_order_cnt[1]));
    655         }
    656     }
    657 
    658     sliceHdr->redundant_pic_cnt = 0; /* default value */
    659     if (currPPS->redundant_pic_cnt_present_flag)
    660     {
    661         // MC_CHECK
    662         ue_v(stream, &(sliceHdr->redundant_pic_cnt));
    663         if (sliceHdr->redundant_pic_cnt > 127) /* out of range */
    664             return AVCDEC_FAIL;
    665 
    666         if (sliceHdr->redundant_pic_cnt > 0) /* redundant picture */
    667             return AVCDEC_FAIL; /* not supported */
    668     }
    669     sliceHdr->num_ref_idx_l0_active_minus1 = currPPS->num_ref_idx_l0_active_minus1;
    670     sliceHdr->num_ref_idx_l1_active_minus1 = currPPS->num_ref_idx_l1_active_minus1;
    671 
    672     if (slice_type == AVC_P_SLICE)
    673     {
    674         BitstreamRead1Bit(stream, &(sliceHdr->num_ref_idx_active_override_flag));
    675         if (sliceHdr->num_ref_idx_active_override_flag)
    676         {
    677             ue_v(stream, &(sliceHdr->num_ref_idx_l0_active_minus1));
    678         }
    679         else  /* the following condition is not allowed if the flag is zero */
    680         {
    681             if ((slice_type == AVC_P_SLICE) && currPPS->num_ref_idx_l0_active_minus1 > 15)
    682             {
    683                 return AVCDEC_FAIL; /* not allowed */
    684             }
    685         }
    686     }
    687 
    688 
    689     if (sliceHdr->num_ref_idx_l0_active_minus1 > 15 ||
    690             sliceHdr->num_ref_idx_l1_active_minus1 > 15)
    691     {
    692         return AVCDEC_FAIL; /* not allowed */
    693     }
    694     /* if MbaffFrameFlag =1,
    695     max value of index is num_ref_idx_l0_active_minus1 for frame MBs and
    696     2*sliceHdr->num_ref_idx_l0_active_minus1 + 1 for field MBs */
    697 
    698     /* ref_pic_list_reordering() */
    699     status = ref_pic_list_reordering(video, stream, sliceHdr, slice_type);
    700     if (status != AVCDEC_SUCCESS)
    701     {
    702         return status;
    703     }
    704 
    705 
    706     if (video->nal_ref_idc != 0)
    707     {
    708         dec_ref_pic_marking(video, stream, sliceHdr);
    709     }
    710     se_v(stream, &(sliceHdr->slice_qp_delta));
    711 
    712     video->QPy = 26 + currPPS->pic_init_qp_minus26 + sliceHdr->slice_qp_delta;
    713     if (video->QPy > 51 || video->QPy < 0)
    714     {
    715         video->QPy = AVC_CLIP3(0, 51, video->QPy);
    716 //                  return AVCDEC_FAIL;
    717     }
    718     video->QPc = mapQPi2QPc[AVC_CLIP3(0, 51, video->QPy + video->currPicParams->chroma_qp_index_offset)];
    719 
    720     video->QPy_div_6 = (video->QPy * 43) >> 8;
    721     video->QPy_mod_6 = video->QPy - 6 * video->QPy_div_6;
    722 
    723     video->QPc_div_6 = (video->QPc * 43) >> 8;
    724     video->QPc_mod_6 = video->QPc - 6 * video->QPc_div_6;
    725 
    726     sliceHdr->slice_alpha_c0_offset_div2 = 0;
    727     sliceHdr->slice_beta_offset_div_2 = 0;
    728     sliceHdr->disable_deblocking_filter_idc = 0;
    729     video->FilterOffsetA = video->FilterOffsetB = 0;
    730 
    731     if (currPPS->deblocking_filter_control_present_flag)
    732     {
    733         ue_v(stream, &(sliceHdr->disable_deblocking_filter_idc));
    734         if (sliceHdr->disable_deblocking_filter_idc > 2)
    735         {
    736             return AVCDEC_FAIL; /* out of range */
    737         }
    738         if (sliceHdr->disable_deblocking_filter_idc != 1)
    739         {
    740             se_v(stream, &(sliceHdr->slice_alpha_c0_offset_div2));
    741             if (sliceHdr->slice_alpha_c0_offset_div2 < -6 ||
    742                     sliceHdr->slice_alpha_c0_offset_div2 > 6)
    743             {
    744                 return AVCDEC_FAIL;
    745             }
    746             video->FilterOffsetA = sliceHdr->slice_alpha_c0_offset_div2 << 1;
    747 
    748             se_v(stream, &(sliceHdr->slice_beta_offset_div_2));
    749             if (sliceHdr->slice_beta_offset_div_2 < -6 ||
    750                     sliceHdr->slice_beta_offset_div_2 > 6)
    751             {
    752                 return AVCDEC_FAIL;
    753             }
    754             video->FilterOffsetB = sliceHdr->slice_beta_offset_div_2 << 1;
    755         }
    756     }
    757 
    758     if (currPPS->num_slice_groups_minus1 > 0 && currPPS->slice_group_map_type >= 3
    759             && currPPS->slice_group_map_type <= 5)
    760     {
    761         /* Ceil(Log2(PicSizeInMapUnits/(float)SliceGroupChangeRate + 1)) */
    762         temp = video->PicSizeInMapUnits / video->SliceGroupChangeRate;
    763         if (video->PicSizeInMapUnits % video->SliceGroupChangeRate)
    764         {
    765             temp++;
    766         }
    767         i = 0;
    768         temp++;
    769         while (temp)
    770         {
    771             temp >>= 1;
    772             i++;
    773         }
    774 
    775         BitstreamReadBits(stream, i, &(sliceHdr->slice_group_change_cycle));
    776         video->MapUnitsInSliceGroup0 =
    777             AVC_MIN(sliceHdr->slice_group_change_cycle * video->SliceGroupChangeRate, video->PicSizeInMapUnits);
    778     }
    779 
    780     return AVCDEC_SUCCESS;
    781 }
    782 
    783 
    784 AVCDec_Status fill_frame_num_gap(AVCHandle *avcHandle, AVCCommonObj *video)
    785 {
    786     AVCDec_Status status;
    787     int CurrFrameNum;
    788     int UnusedShortTermFrameNum;
    789     int tmp1 = video->sliceHdr->delta_pic_order_cnt[0];
    790     int tmp2 = video->sliceHdr->delta_pic_order_cnt[1];
    791     int tmp3 = video->CurrPicNum;
    792     int tmp4 = video->sliceHdr->adaptive_ref_pic_marking_mode_flag;
    793     UnusedShortTermFrameNum = (video->prevFrameNum + 1) % video->MaxFrameNum;
    794     CurrFrameNum = video->sliceHdr->frame_num;
    795 
    796     video->sliceHdr->delta_pic_order_cnt[0] = 0;
    797     video->sliceHdr->delta_pic_order_cnt[1] = 0;
    798     while (CurrFrameNum != UnusedShortTermFrameNum)
    799     {
    800         video->CurrPicNum = UnusedShortTermFrameNum;
    801         video->sliceHdr->frame_num = UnusedShortTermFrameNum;
    802 
    803         status = (AVCDec_Status)DPBInitBuffer(avcHandle, video);
    804         if (status != AVCDEC_SUCCESS)  /* no buffer available */
    805         {
    806             return status;
    807         }
    808         DecodePOC(video);
    809         DPBInitPic(video, UnusedShortTermFrameNum);
    810 
    811 
    812         video->currFS->PicOrderCnt = video->PicOrderCnt;
    813         video->currFS->FrameNum = video->sliceHdr->frame_num;
    814 
    815         /* initialize everything to zero */
    816         video->currFS->IsOutputted = 0x01;
    817         video->currFS->IsReference = 3;
    818         video->currFS->IsLongTerm = 0;
    819         video->currFS->frame.isReference = TRUE;
    820         video->currFS->frame.isLongTerm = FALSE;
    821 
    822         video->sliceHdr->adaptive_ref_pic_marking_mode_flag = 0;
    823 
    824         status = (AVCDec_Status)StorePictureInDPB(avcHandle, video);  // MC_CHECK check the return status
    825         if (status != AVCDEC_SUCCESS)
    826         {
    827             return AVCDEC_FAIL;
    828         }
    829         video->prevFrameNum = UnusedShortTermFrameNum;
    830         UnusedShortTermFrameNum = (UnusedShortTermFrameNum + 1) % video->MaxFrameNum;
    831     }
    832     video->sliceHdr->frame_num = CurrFrameNum;
    833     video->CurrPicNum = tmp3;
    834     video->sliceHdr->delta_pic_order_cnt[0] = tmp1;
    835     video->sliceHdr->delta_pic_order_cnt[1] = tmp2;
    836     video->sliceHdr->adaptive_ref_pic_marking_mode_flag = tmp4;
    837     return AVCDEC_SUCCESS;
    838 }
    839 
    840 /** see subclause 7.4.3.1 */
    841 AVCDec_Status ref_pic_list_reordering(AVCCommonObj *video, AVCDecBitstream *stream, AVCSliceHeader *sliceHdr, int slice_type)
    842 {
    843     int i;
    844 
    845     if (slice_type != AVC_I_SLICE)
    846     {
    847         BitstreamRead1Bit(stream, &(sliceHdr->ref_pic_list_reordering_flag_l0));
    848         if (sliceHdr->ref_pic_list_reordering_flag_l0)
    849         {
    850             i = 0;
    851             do
    852             {
    853                 ue_v(stream, &(sliceHdr->reordering_of_pic_nums_idc_l0[i]));
    854                 if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 0 ||
    855                         sliceHdr->reordering_of_pic_nums_idc_l0[i] == 1)
    856                 {
    857                     ue_v(stream, &(sliceHdr->abs_diff_pic_num_minus1_l0[i]));
    858                     if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 0 &&
    859                             sliceHdr->abs_diff_pic_num_minus1_l0[i] > video->MaxPicNum / 2 - 1)
    860                     {
    861                         return AVCDEC_FAIL; /* out of range */
    862                     }
    863                     if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 1 &&
    864                             sliceHdr->abs_diff_pic_num_minus1_l0[i] > video->MaxPicNum / 2 - 2)
    865                     {
    866                         return AVCDEC_FAIL; /* out of range */
    867                     }
    868                 }
    869                 else if (sliceHdr->reordering_of_pic_nums_idc_l0[i] == 2)
    870                 {
    871                     ue_v(stream, &(sliceHdr->long_term_pic_num_l0[i]));
    872                 }
    873                 i++;
    874             }
    875             while (sliceHdr->reordering_of_pic_nums_idc_l0[i-1] != 3
    876                     && i <= (int)sliceHdr->num_ref_idx_l0_active_minus1 + 1) ;
    877         }
    878     }
    879     return AVCDEC_SUCCESS;
    880 }
    881 
    882 /** see subclause 7.4.3.3 */
    883 AVCDec_Status dec_ref_pic_marking(AVCCommonObj *video, AVCDecBitstream *stream, AVCSliceHeader *sliceHdr)
    884 {
    885     int i;
    886     if (video->nal_unit_type == AVC_NALTYPE_IDR)
    887     {
    888         BitstreamRead1Bit(stream, &(sliceHdr->no_output_of_prior_pics_flag));
    889         BitstreamRead1Bit(stream, &(sliceHdr->long_term_reference_flag));
    890         if (sliceHdr->long_term_reference_flag == 0) /* used for short-term */
    891         {
    892             video->MaxLongTermFrameIdx = -1; /* no long-term frame indx */
    893         }
    894         else /* used for long-term */
    895         {
    896             video->MaxLongTermFrameIdx = 0;
    897             video->LongTermFrameIdx = 0;
    898         }
    899     }
    900     else
    901     {
    902         BitstreamRead1Bit(stream, &(sliceHdr->adaptive_ref_pic_marking_mode_flag));
    903         if (sliceHdr->adaptive_ref_pic_marking_mode_flag)
    904         {
    905             i = 0;
    906             do
    907             {
    908                 ue_v(stream, &(sliceHdr->memory_management_control_operation[i]));
    909                 if (sliceHdr->memory_management_control_operation[i] == 1 ||
    910                         sliceHdr->memory_management_control_operation[i] == 3)
    911                 {
    912                     ue_v(stream, &(sliceHdr->difference_of_pic_nums_minus1[i]));
    913                 }
    914                 if (sliceHdr->memory_management_control_operation[i] == 2)
    915                 {
    916                     ue_v(stream, &(sliceHdr->long_term_pic_num[i]));
    917                 }
    918                 if (sliceHdr->memory_management_control_operation[i] == 3 ||
    919                         sliceHdr->memory_management_control_operation[i] == 6)
    920                 {
    921                     ue_v(stream, &(sliceHdr->long_term_frame_idx[i]));
    922                 }
    923                 if (sliceHdr->memory_management_control_operation[i] == 4)
    924                 {
    925                     ue_v(stream, &(sliceHdr->max_long_term_frame_idx_plus1[i]));
    926                 }
    927                 i++;
    928             }
    929             while (sliceHdr->memory_management_control_operation[i-1] != 0 && i < MAX_DEC_REF_PIC_MARKING);
    930             if (i >= MAX_DEC_REF_PIC_MARKING)
    931             {
    932                 return AVCDEC_FAIL; /* we're screwed!!, not enough memory */
    933             }
    934         }
    935     }
    936 
    937     return AVCDEC_SUCCESS;
    938 }
    939 
    940 /* see subclause 8.2.1 Decoding process for picture order count. */
    941 AVCDec_Status DecodePOC(AVCCommonObj *video)
    942 {
    943     AVCSeqParamSet *currSPS = video->currSeqParams;
    944     AVCSliceHeader *sliceHdr = video->sliceHdr;
    945     int i;
    946 
    947     switch (currSPS->pic_order_cnt_type)
    948     {
    949         case 0: /* POC MODE 0 , subclause 8.2.1.1 */
    950             if (video->nal_unit_type == AVC_NALTYPE_IDR)
    951             {
    952                 video->prevPicOrderCntMsb = 0;
    953                 video->prevPicOrderCntLsb = 0;
    954             }
    955 
    956             /* Calculate the MSBs of current picture */
    957             if (sliceHdr->pic_order_cnt_lsb  <  video->prevPicOrderCntLsb  &&
    958                     (video->prevPicOrderCntLsb - sliceHdr->pic_order_cnt_lsb)  >= (video->MaxPicOrderCntLsb / 2))
    959                 video->PicOrderCntMsb = video->prevPicOrderCntMsb + video->MaxPicOrderCntLsb;
    960             else if (sliceHdr->pic_order_cnt_lsb  >  video->prevPicOrderCntLsb  &&
    961                      (sliceHdr->pic_order_cnt_lsb - video->prevPicOrderCntLsb)  > (video->MaxPicOrderCntLsb / 2))
    962                 video->PicOrderCntMsb = video->prevPicOrderCntMsb - video->MaxPicOrderCntLsb;
    963             else
    964                 video->PicOrderCntMsb = video->prevPicOrderCntMsb;
    965 
    966             /* JVT-I010 page 81 is different from JM7.3 */
    967 
    968 
    969             video->PicOrderCnt = video->TopFieldOrderCnt = video->PicOrderCntMsb + sliceHdr->pic_order_cnt_lsb;
    970             video->BottomFieldOrderCnt = video->TopFieldOrderCnt + sliceHdr->delta_pic_order_cnt_bottom;
    971 
    972             break;
    973 
    974 
    975         case 1: /* POC MODE 1, subclause 8.2.1.2 */
    976             /* calculate FrameNumOffset */
    977             if (video->nal_unit_type == AVC_NALTYPE_IDR)
    978             {
    979                 video->prevFrameNumOffset = 0;
    980                 video->FrameNumOffset = 0;
    981             }
    982             else if (video->prevFrameNum > sliceHdr->frame_num)
    983             {
    984                 video->FrameNumOffset = video->prevFrameNumOffset + video->MaxFrameNum;
    985             }
    986             else
    987             {
    988                 video->FrameNumOffset = video->prevFrameNumOffset;
    989             }
    990             /* calculate absFrameNum */
    991             if (currSPS->num_ref_frames_in_pic_order_cnt_cycle)
    992             {
    993                 video->absFrameNum = video->FrameNumOffset + sliceHdr->frame_num;
    994             }
    995             else
    996             {
    997                 video->absFrameNum = 0;
    998             }
    999 
   1000             if (video->absFrameNum > 0 && video->nal_ref_idc == 0)
   1001             {
   1002                 video->absFrameNum--;
   1003             }
   1004 
   1005             /* derive picOrderCntCycleCnt and frameNumInPicOrderCntCycle */
   1006             if (video->absFrameNum > 0)
   1007             {
   1008                 video->picOrderCntCycleCnt = (video->absFrameNum - 1) / currSPS->num_ref_frames_in_pic_order_cnt_cycle;
   1009                 video->frameNumInPicOrderCntCycle = (video->absFrameNum - 1) % currSPS->num_ref_frames_in_pic_order_cnt_cycle;
   1010             }
   1011             /* derive expectedDeltaPerPicOrderCntCycle */
   1012             video->expectedDeltaPerPicOrderCntCycle = 0;
   1013             for (i = 0; i < (int)currSPS->num_ref_frames_in_pic_order_cnt_cycle; i++)
   1014             {
   1015                 video->expectedDeltaPerPicOrderCntCycle += currSPS->offset_for_ref_frame[i];
   1016             }
   1017             /* derive expectedPicOrderCnt */
   1018             if (video->absFrameNum)
   1019             {
   1020                 video->expectedPicOrderCnt = video->picOrderCntCycleCnt * video->expectedDeltaPerPicOrderCntCycle;
   1021                 for (i = 0; i <= video->frameNumInPicOrderCntCycle; i++)
   1022                 {
   1023                     video->expectedPicOrderCnt += currSPS->offset_for_ref_frame[i];
   1024                 }
   1025             }
   1026             else
   1027             {
   1028                 video->expectedPicOrderCnt = 0;
   1029             }
   1030 
   1031             if (video->nal_ref_idc == 0)
   1032             {
   1033                 video->expectedPicOrderCnt += currSPS->offset_for_non_ref_pic;
   1034             }
   1035             /* derive TopFieldOrderCnt and BottomFieldOrderCnt */
   1036 
   1037             video->TopFieldOrderCnt = video->expectedPicOrderCnt + sliceHdr->delta_pic_order_cnt[0];
   1038             video->BottomFieldOrderCnt = video->TopFieldOrderCnt + currSPS->offset_for_top_to_bottom_field + sliceHdr->delta_pic_order_cnt[1];
   1039 
   1040             video->PicOrderCnt = AVC_MIN(video->TopFieldOrderCnt, video->BottomFieldOrderCnt);
   1041 
   1042 
   1043             break;
   1044 
   1045 
   1046         case 2: /* POC MODE 2, subclause 8.2.1.3 */
   1047             if (video->nal_unit_type == AVC_NALTYPE_IDR)
   1048             {
   1049                 video->FrameNumOffset = 0;
   1050             }
   1051             else if (video->prevFrameNum > sliceHdr->frame_num)
   1052             {
   1053                 video->FrameNumOffset = video->prevFrameNumOffset + video->MaxFrameNum;
   1054             }
   1055             else
   1056             {
   1057                 video->FrameNumOffset = video->prevFrameNumOffset;
   1058             }
   1059             /* derive tempPicOrderCnt, we just use PicOrderCnt */
   1060             if (video->nal_unit_type == AVC_NALTYPE_IDR)
   1061             {
   1062                 video->PicOrderCnt = 0;
   1063             }
   1064             else if (video->nal_ref_idc == 0)
   1065             {
   1066                 video->PicOrderCnt = 2 * (video->FrameNumOffset + sliceHdr->frame_num) - 1;
   1067             }
   1068             else
   1069             {
   1070                 video->PicOrderCnt = 2 * (video->FrameNumOffset + sliceHdr->frame_num);
   1071             }
   1072             video->TopFieldOrderCnt = video->BottomFieldOrderCnt = video->PicOrderCnt;
   1073             break;
   1074         default:
   1075             return AVCDEC_FAIL;
   1076     }
   1077 
   1078     return AVCDEC_SUCCESS;
   1079 }
   1080 
   1081 
   1082 AVCDec_Status DecodeSEI(AVCDecObject *decvid, AVCDecBitstream *stream)
   1083 {
   1084     OSCL_UNUSED_ARG(decvid);
   1085     OSCL_UNUSED_ARG(stream);
   1086     return AVCDEC_SUCCESS;
   1087 }
   1088 
   1089 AVCDec_Status sei_payload(AVCDecObject *decvid, AVCDecBitstream *stream, uint payloadType, uint payloadSize)
   1090 {
   1091     AVCDec_Status status = AVCDEC_SUCCESS;
   1092     uint i;
   1093     switch (payloadType)
   1094     {
   1095         case 0:
   1096             /*  buffering period SEI */
   1097             status = buffering_period(decvid, stream);
   1098             break;
   1099         case 1:
   1100             /*  picture timing SEI */
   1101             status = pic_timing(decvid, stream);
   1102             break;
   1103         case 2:
   1104 
   1105         case 3:
   1106 
   1107         case 4:
   1108 
   1109         case 5:
   1110 
   1111         case 8:
   1112 
   1113         case 9:
   1114 
   1115         case 10:
   1116 
   1117         case 11:
   1118 
   1119         case 12:
   1120 
   1121         case 13:
   1122 
   1123         case 14:
   1124 
   1125         case 15:
   1126 
   1127         case 16:
   1128 
   1129         case 17:
   1130             for (i = 0; i < payloadSize; i++)
   1131             {
   1132                 BitstreamFlushBits(stream, 8);
   1133             }
   1134             break;
   1135         case 6:
   1136             /*      recovery point SEI              */
   1137             status = recovery_point(decvid, stream);
   1138             break;
   1139         case 7:
   1140             /*      decoded reference picture marking repetition SEI */
   1141             status = dec_ref_pic_marking_repetition(decvid, stream);
   1142             break;
   1143 
   1144         case 18:
   1145             /*      motion-constrained slice group set SEI */
   1146             status = motion_constrained_slice_group_set(decvid, stream);
   1147             break;
   1148         default:
   1149             /*          reserved_sei_message */
   1150             for (i = 0; i < payloadSize; i++)
   1151             {
   1152                 BitstreamFlushBits(stream, 8);
   1153             }
   1154             break;
   1155     }
   1156     BitstreamByteAlign(stream);
   1157     return status;
   1158 }
   1159 
   1160 AVCDec_Status buffering_period(AVCDecObject *decvid, AVCDecBitstream *stream)
   1161 {
   1162     AVCSeqParamSet *currSPS;
   1163     uint seq_parameter_set_id;
   1164     uint temp;
   1165     uint i;
   1166     ue_v(stream, &seq_parameter_set_id);
   1167     if (seq_parameter_set_id > 31)
   1168     {
   1169         return AVCDEC_FAIL;
   1170     }
   1171 
   1172 //  decvid->common->seq_parameter_set_id = seq_parameter_set_id;
   1173 
   1174     currSPS = decvid->seqParams[seq_parameter_set_id];
   1175     if (currSPS->vui_parameters.nal_hrd_parameters_present_flag)
   1176     {
   1177         for (i = 0; i <= currSPS->vui_parameters.nal_hrd_parameters.cpb_cnt_minus1; i++)
   1178         {
   1179             /* initial_cpb_removal_delay[i] */
   1180             BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1181             /*initial _cpb_removal_delay_offset[i] */
   1182             BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1183         }
   1184     }
   1185 
   1186     if (currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
   1187     {
   1188         for (i = 0; i <= currSPS->vui_parameters.vcl_hrd_parameters.cpb_cnt_minus1; i++)
   1189         {
   1190             /* initial_cpb_removal_delay[i] */
   1191             BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1192             /*initial _cpb_removal_delay_offset[i] */
   1193             BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1194         }
   1195     }
   1196 
   1197     return AVCDEC_SUCCESS;
   1198 }
   1199 AVCDec_Status pic_timing(AVCDecObject *decvid, AVCDecBitstream *stream)
   1200 {
   1201     AVCSeqParamSet *currSPS;
   1202     uint temp, NumClockTs = 0, time_offset_length = 24, full_timestamp_flag;
   1203     uint i;
   1204 
   1205     currSPS = decvid->seqParams[decvid->common->seq_parameter_set_id];
   1206 
   1207     if (currSPS->vui_parameters.nal_hrd_parameters_present_flag)
   1208     {
   1209         BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1210         BitstreamReadBits(stream, currSPS->vui_parameters.nal_hrd_parameters.dpb_output_delay_length_minus1 + 1, &temp);
   1211         time_offset_length = currSPS->vui_parameters.nal_hrd_parameters.time_offset_length;
   1212     }
   1213     else if (currSPS->vui_parameters.vcl_hrd_parameters_present_flag)
   1214     {
   1215         BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.cpb_removal_delay_length_minus1 + 1, &temp);
   1216         BitstreamReadBits(stream, currSPS->vui_parameters.vcl_hrd_parameters.dpb_output_delay_length_minus1 + 1, &temp);
   1217         time_offset_length = currSPS->vui_parameters.vcl_hrd_parameters.time_offset_length;
   1218     }
   1219 
   1220     if (currSPS->vui_parameters.pic_struct_present_flag)
   1221     {
   1222         /* pic_struct */
   1223         BitstreamReadBits(stream, 4, &temp);
   1224 
   1225         switch (temp)
   1226         {
   1227             case 0:
   1228             case 1:
   1229             case 2:
   1230                 NumClockTs = 1;
   1231                 break;
   1232             case 3:
   1233             case 4:
   1234             case 7:
   1235                 NumClockTs = 2;
   1236                 break;
   1237             case 5:
   1238             case 6:
   1239             case 8:
   1240                 NumClockTs = 3;
   1241                 break;
   1242             default:
   1243                 NumClockTs = 0;
   1244                 break;
   1245         }
   1246 
   1247         for (i = 0; i < NumClockTs; i++)
   1248         {
   1249             /* clock_timestamp_flag[i] */
   1250             BitstreamRead1Bit(stream, &temp);
   1251             if (temp)
   1252             {
   1253                 /* ct_type */
   1254                 BitstreamReadBits(stream, 2, &temp);
   1255                 /* nuit_field_based_flag */
   1256                 BitstreamRead1Bit(stream, &temp);
   1257                 /* counting_type        */
   1258                 BitstreamReadBits(stream, 5, &temp);
   1259                 /* full_timestamp_flag */
   1260                 BitstreamRead1Bit(stream, &temp);
   1261                 full_timestamp_flag = temp;
   1262                 /* discontinuity_flag */
   1263                 BitstreamRead1Bit(stream, &temp);
   1264                 /* cnt_dropped_flag */
   1265                 BitstreamRead1Bit(stream, &temp);
   1266                 /* n_frames           */
   1267                 BitstreamReadBits(stream, 8, &temp);
   1268 
   1269 
   1270                 if (full_timestamp_flag)
   1271                 {
   1272                     /* seconds_value */
   1273                     BitstreamReadBits(stream, 6, &temp);
   1274                     /* minutes_value */
   1275                     BitstreamReadBits(stream, 6, &temp);
   1276                     /* hours_value */
   1277                     BitstreamReadBits(stream, 5, &temp);
   1278                 }
   1279                 else
   1280                 {
   1281                     /* seconds_flag  */
   1282                     BitstreamRead1Bit(stream, &temp);
   1283                     if (temp)
   1284                     {
   1285                         /* seconds_value */
   1286                         BitstreamReadBits(stream, 6, &temp);
   1287                         /* minutes_flag  */
   1288                         BitstreamRead1Bit(stream, &temp);
   1289                         if (temp)
   1290                         {
   1291                             /* minutes_value */
   1292                             BitstreamReadBits(stream, 6, &temp);
   1293 
   1294                             /* hourss_flag  */
   1295                             BitstreamRead1Bit(stream, &temp);
   1296 
   1297                             if (temp)
   1298                             {
   1299                                 /* hours_value */
   1300                                 BitstreamReadBits(stream, 5, &temp);
   1301                             }
   1302 
   1303                         }
   1304                     }
   1305                 }
   1306 
   1307                 if (time_offset_length)
   1308                 {
   1309                     /* time_offset */
   1310                     BitstreamReadBits(stream, time_offset_length, &temp);
   1311                 }
   1312                 else
   1313                 {
   1314                     /* time_offset */
   1315                     temp = 0;
   1316                 }
   1317             }
   1318         }
   1319     }
   1320     return AVCDEC_SUCCESS;
   1321 }
   1322 AVCDec_Status recovery_point(AVCDecObject *decvid, AVCDecBitstream *stream)
   1323 {
   1324     OSCL_UNUSED_ARG(decvid);
   1325     uint temp;
   1326     /* recover_frame_cnt */
   1327     ue_v(stream, &temp);
   1328     /* exact_match_flag */
   1329     BitstreamRead1Bit(stream, &temp);
   1330     /* broken_link_flag */
   1331     BitstreamRead1Bit(stream, &temp);
   1332     /* changing slic_group_idc */
   1333     BitstreamReadBits(stream, 2, &temp);
   1334     return AVCDEC_SUCCESS;
   1335 }
   1336 AVCDec_Status dec_ref_pic_marking_repetition(AVCDecObject *decvid, AVCDecBitstream *stream)
   1337 {
   1338     AVCSeqParamSet *currSPS;
   1339     uint temp;
   1340     currSPS = decvid->seqParams[decvid->common->seq_parameter_set_id];
   1341     /* original_idr_flag */
   1342     BitstreamRead1Bit(stream, &temp);
   1343     /* original_frame_num */
   1344     ue_v(stream, &temp);
   1345     if (currSPS->frame_mbs_only_flag == 0)
   1346     {
   1347         /* original_field_pic_flag */
   1348         BitstreamRead1Bit(stream, &temp);
   1349         if (temp)
   1350         {
   1351             /* original_bottom_field_flag */
   1352             BitstreamRead1Bit(stream, &temp);
   1353         }
   1354     }
   1355 
   1356     /*  dec_ref_pic_marking(video,stream,sliceHdr); */
   1357 
   1358 
   1359     return AVCDEC_SUCCESS;
   1360 }
   1361 AVCDec_Status motion_constrained_slice_group_set(AVCDecObject *decvid, AVCDecBitstream *stream)
   1362 {
   1363     OSCL_UNUSED_ARG(decvid);
   1364     uint temp, i, numBits;
   1365     /* num_slice_groups_in_set_minus1 */
   1366     ue_v(stream, &temp);
   1367 
   1368     numBits = 0;/* ceil(log2(num_slice_groups_minus1+1)) bits */
   1369     i = temp;
   1370     while (i > 0)
   1371     {
   1372         numBits++;
   1373         i >>= 1;
   1374     }
   1375     for (i = 0; i <= temp; i++)
   1376     {
   1377         /* slice_group_id */
   1378         BitstreamReadBits(stream, numBits, &temp);
   1379     }
   1380     /* exact_sample_value_match_flag */
   1381     BitstreamRead1Bit(stream, &temp);
   1382     /* pan_scan_rect_flag */
   1383     BitstreamRead1Bit(stream, &temp);
   1384     if (temp)
   1385     {
   1386         /* pan_scan_rect_id */
   1387         ue_v(stream, &temp);
   1388     }
   1389 
   1390     return AVCDEC_SUCCESS;
   1391 }
   1392 
   1393