h264_Status h264_Parse_NAL_Unit(void *parent, h264_Info* pInfo, uint8_t *nal_ref_idc) { h264_Status ret = H264_STATUS_ERROR; //h264_NAL_Unit_t* NAL = &pInfo->NAL; uint32_t code; #if 0 viddec_pm_get_bits(void * parent,uint32_t * data,uint32_t num_bits)(parent, &code, 24); viddec_pm_get_bits(parent, &code, 1); //forbidden_zero_bit viddec_pm_get_bits(parent, &code, 2); SliceHeader->nal_ref_idc = (uint8_t)code; viddec_pm_get_bits(parent, &code, 5); pInfo->nal_unit_type = (uint8_t)code; #else #ifdef VBP if( viddec_pm_get_bits(parent, &code, 8) != -1) #else //// 24bit SC, 1 bit: forbidden_zero_bit, 2 bitrs: nal_ref_idc, 5 bits: nal_unit_type if( viddec_pm_get_bits(parent, &code, 32) != -1) #endif { *nal_ref_idc = (uint8_t)((code>>5)&0x3); pInfo->nal_unit_type = (uint8_t)((code>>0)&0x1f); ret = H264_STATUS_OK; }
h264_Status h264_Parse_HRD_Parameters(void *parent, h264_Info* pInfo, int nal_hrd,seq_param_set_used_ptr SPS, vui_seq_parameters_t_not_used_ptr pVUI_Seq_Not_Used) { //seq_param_set_ptr SPS = pInfo->p_active_SPS; int32_t i = 0; uint32_t code; if (nal_hrd) { SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1 = h264_GetVLCElement(parent, pInfo, false); if (SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1 >= MAX_CPB_CNT) { return H264_SPS_ERROR; } viddec_pm_get_bits(parent, &code, 8); pVUI_Seq_Not_Used->nal_hrd_bit_rate_scale = (uint8_t)(code>>4); pVUI_Seq_Not_Used->nal_hrd_cpb_size_scale = (uint8_t)(code & 0xf); for (i=0; i<=SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1; i++) { pVUI_Seq_Not_Used->nal_hrd_parameters.bit_rate_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); pVUI_Seq_Not_Used->nal_hrd_parameters.cpb_size_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); viddec_pm_get_bits(parent, &code, 1); pVUI_Seq_Not_Used->nal_hrd_parameters.cbr_flag[i] = (uint8_t)code; } if ( viddec_pm_get_bits(parent, &code, 20) == -1) return H264_SPS_ERROR; SPS->sps_disp.vui_seq_parameters.nal_hrd_initial_cpb_removal_delay_length_minus1 = (uint8_t)((code>>15)&0x1f); SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_removal_delay_length_minus1 = (uint8_t)((code>>10)&0x1f);; SPS->sps_disp.vui_seq_parameters.nal_hrd_dpb_output_delay_length_minus1 = (uint8_t)((code>>5)&0x1f);; SPS->sps_disp.vui_seq_parameters.nal_hrd_time_offset_length = (uint8_t)(code&0x1f);; } else {