1 2 3 #include "h264.h" 4 #include "h264parse.h" 5 6 /*---------------------------------------------*/ 7 /*---------------------------------------------*/ 8 /*---------------------------------------------*/ 9 h264_Status h264_Parse_PicParameterSet(void *parent,h264_Info * pInfo,h264_PicParameterSet_t* PictureParameterSet) 10 { 11 h264_Status ret = H264_PPS_ERROR; 12 13 //h264_PicParameterSet_t* PictureParameterSet = &pInfo->PictureParameterSet; 14 uint32_t code=0, i = 0; 15 16 do { 17 ///// PPS par1: pic_parameter_set_id & seq_parameter_set_id 18 code = h264_GetVLCElement(parent, pInfo, false); 19 if(code > MAX_PIC_PARAMS) { 20 break; 21 } 22 PictureParameterSet->pic_parameter_set_id = (uint8_t)code; 23 24 25 code = h264_GetVLCElement(parent, pInfo, false); 26 if(code > MAX_NUM_SPS-1) { 27 break; 28 } 29 PictureParameterSet->seq_parameter_set_id = (uint8_t)code; 30 31 ///// entropy_coding_mode_flag 32 viddec_pm_get_bits(parent, &code, 1); 33 PictureParameterSet->entropy_coding_mode_flag = (uint8_t)code; 34 ///// pic_order_present_flag 35 viddec_pm_get_bits(parent, &code, 1); 36 PictureParameterSet->pic_order_present_flag = (uint8_t)code; 37 38 PictureParameterSet->num_slice_groups_minus1 = h264_GetVLCElement(parent, pInfo, false); 39 40 // 41 // In main profile, FMO is excluded and num_slice_groups_minus1 should be 0 42 // 43 if(PictureParameterSet->num_slice_groups_minus1 > 0) //MAX_NUM_SLICE_GRPS) 44 break; 45 46 PictureParameterSet->num_ref_idx_l0_active = h264_GetVLCElement(parent, pInfo, false)+1; 47 PictureParameterSet->num_ref_idx_l1_active = h264_GetVLCElement(parent, pInfo, false)+1; 48 49 //// PPS->num_ref_idx_l0_active --- [0,32] 50 if(((PictureParameterSet->num_ref_idx_l0_active) > MAX_NUM_REF_FRAMES) || ((PictureParameterSet->num_ref_idx_l1_active) > MAX_NUM_REF_FRAMES)) 51 { 52 break; 53 } 54 55 //// weighting prediction 56 viddec_pm_get_bits(parent, &code, 1); 57 PictureParameterSet->weighted_pred_flag = (uint8_t)code; 58 59 viddec_pm_get_bits(parent, &code, 2); 60 PictureParameterSet->weighted_bipred_idc = (uint8_t)code; 61 62 //// QP 63 PictureParameterSet->pic_init_qp_minus26 = h264_GetVLCElement(parent, pInfo, true); 64 PictureParameterSet->pic_init_qs_minus26 = h264_GetVLCElement(parent, pInfo, true); 65 if(((PictureParameterSet->pic_init_qp_minus26+26) > MAX_QP) || ((PictureParameterSet->pic_init_qs_minus26+26) > MAX_QP)) 66 break; 67 PictureParameterSet->chroma_qp_index_offset = h264_GetVLCElement(parent, pInfo, true); 68 69 //// Deblocking ctl parameters 70 viddec_pm_get_bits(parent, &code, 1); 71 PictureParameterSet->deblocking_filter_control_present_flag = (uint8_t)code; 72 73 viddec_pm_get_bits(parent, &code, 1); 74 PictureParameterSet->constrained_intra_pred_flag = (uint8_t)code; 75 76 if( viddec_pm_get_bits(parent, &code, 1) == -1) 77 break; 78 PictureParameterSet->redundant_pic_cnt_present_flag = (uint8_t)code; 79 80 //// Check if have more RBSP Data for additional parameters 81 if(h264_More_RBSP_Data(parent, pInfo)) 82 { 83 viddec_pm_get_bits(parent, &code, 1); 84 PictureParameterSet->transform_8x8_mode_flag = (uint8_t)code; 85 86 if( viddec_pm_get_bits(parent, &code, 1) == -1) 87 break; 88 PictureParameterSet->pic_scaling_matrix_present_flag = (uint8_t)code; 89 90 if(PictureParameterSet->pic_scaling_matrix_present_flag) 91 { 92 uint32_t n_ScalingList = 6 + (PictureParameterSet->transform_8x8_mode_flag << 1); 93 for(i=0; i<n_ScalingList; i++) 94 { 95 if( viddec_pm_get_bits(parent, &code, 1) == -1) 96 break; 97 PictureParameterSet->pic_scaling_list_present_flag[i] = (uint8_t)code; 98 99 if(PictureParameterSet->pic_scaling_list_present_flag[i]) 100 { 101 if(i<6) 102 h264_Scaling_List(parent, PictureParameterSet->ScalingList4x4[i], 16, &PictureParameterSet->UseDefaultScalingMatrix4x4Flag[i], pInfo); 103 else 104 h264_Scaling_List(parent, PictureParameterSet->ScalingList8x8[i-6], 64, &PictureParameterSet->UseDefaultScalingMatrix8x8Flag[i-6], pInfo); 105 } 106 } 107 } 108 109 PictureParameterSet->second_chroma_qp_index_offset = h264_GetVLCElement(parent, pInfo, true); //fix 110 //if((PictureParameterSet->second_chroma_qp_index_offset>12) || (PictureParameterSet->second_chroma_qp_index_offset < -12)) 111 // break; 112 } 113 else 114 { 115 PictureParameterSet->transform_8x8_mode_flag = 0; 116 PictureParameterSet->pic_scaling_matrix_present_flag = 0; 117 PictureParameterSet->second_chroma_qp_index_offset = PictureParameterSet->chroma_qp_index_offset; 118 } 119 120 ret = H264_STATUS_OK; 121 }while(0); 122 123 //h264_Parse_rbsp_trailing_bits(pInfo); 124 return ret; 125 } 126 127 ////////// EOF/////////////// 128 129