www.pudn.com > avs-m3.rar > Errhandle.c
/*! ************************************************************************************* * \file * ErrHandle.c * \brief * uncertion error handling such as illegal syntax elemenet, illegal memory access etc * \notes: * Zhan MA Huazhong Univ. of Science and Technology************************************************************************************* */ #include #include #include "global.h" #include "nalu.h" /*! ************************************************************************************* * \brief : * Error handling procedure. Print error message to stderr and exit * with supplied code. ************************************************************************************* */ void error(char *text, int code) { fprintf(stderr, "%s\n", text); exit(code); } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckNALUValid(unsigned char nalu_header,FILE *error_file) { int nal_unit_type,nal_ref_idc,forbidden_bit; nal_unit_type = (nalu_header & 0x1f); nal_ref_idc = ((nalu_header >> 5) & 0x3); forbidden_bit = ((nalu_header >> 7) & 0x1); if (forbidden_bit !=0 ) fprintf(error_file,"NALU Header ERR: %d is inValid forbidded_zero_bit, should be 0, see FCD 7.2.1\n",forbidden_bit); switch (nal_unit_type) { case 2: if (nal_ref_idc == 0 ) fprintf(error_file,"IDR Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); break; case 4: if (nal_ref_idc == 0 ) fprintf(error_file,"SPS Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); break; case 5: if (nal_ref_idc == 0 ) fprintf(error_file,"PPS Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); break; case 7: if (nal_ref_idc == 0 ) fprintf(error_file,"RAPIR Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); break; case 6: if (nal_ref_idc != 0) fprintf(error_file,"SEI Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); break; case 1: case 3: if ((nal_unit_type == 1) && (nal_ref_idc) == 0) { if ((nal_unit_type == 3)&& (nal_ref_idc!=0)) fprintf(error_file,"Slice Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); } else { if ((nal_unit_type == 3)&& (nal_ref_idc ==0)) fprintf(error_file,"Slice Header ERR: %d is inValid nal_ref_idc, should be [1:7], see FCD 7.2.1\n", nal_ref_idc); } break; default: fprintf(error_file,"NALU Header ERR: %d is inValid nal_unit_type, should be [1:7], see FCD 7.2.1",nal_unit_type); break; } } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckPPSValid(pic_parameter_set *PicParaSet) { #if ERR_REPORT if (PicParaSet->pic_parameter_set_id>127) fprintf(p_err,"PPS ERR: %d is Invalid pic_parameter_set_id, should be [0:127], see FCD 7.2.3\n",PicParaSet->pic_parameter_set_id); if (PicParaSet->seq_parameter_set_id>15) fprintf(p_err,"PPS ERR: %d is Invalid seq_parameter_set_id, should be [0:15], see FCD 7.2.3\n",PicParaSet->seq_parameter_set_id); #endif } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckSPSValid(seq_parameter_set *SeqParaSet) { #if ERR_REPORT int x1,y1,x2,y2; /* profile check */ if (SeqParaSet->profile_idc != 0x10) fprintf(p_err,"SPS ERR: %d is Invalid Profile IDC, should be 0x10, see FCD B.1.1\n", SeqParaSet->profile_idc); /* level check */ switch (SeqParaSet->level_idc) { case 10: case 12: case 14: case 16: case 30: case 32: case 34: case 50: case 52: break; default: fprintf(p_err,"SPS ERR: %d is Invalid Level IDC, should be [10,12,14,16,30,32,34,50,52], see FCD B.1.1\n",SeqParaSet->level_idc); break; } if (SeqParaSet->seq_parameter_set_id>15) fprintf(p_err,"SPS ERR: %d is Invalid seq_parameter_set_id, should be [0:15], see FCD 7.2.2 C.2.5\n", SeqParaSet->seq_parameter_set_id); if ( (SeqParaSet->num_ref_frames <0) || (SeqParaSet->num_ref_frames >2) ) fprintf(p_err,"SPS ERR: %d is Invalid ref_frame_num, should be [0:2], see FCD 7.2.2\n", SeqParaSet->num_ref_frames); if ( (SeqParaSet->aspect_ratio <1) || (SeqParaSet->aspect_ratio >4) ) fprintf(p_err,"SPS ERR: %d is Invalid aspect_ration, should be [1:4], see FCD 7.2.2\n", SeqParaSet->aspect_ratio); if (SeqParaSet->frame_cropping_flag) { x2 = (SeqParaSet->horizontal_size_minus1 + 1)*16 - (2*SeqParaSet->frame_crop_right_offset +1); y2 = (SeqParaSet->vertical_size_minus1 +1)*16 - (2*SeqParaSet->frame_crop_bottom_offset); x1 = 2*SeqParaSet->frame_cropping_left_offset; y1 = 2*SeqParaSet->frame_crop_top_offset; if ((x2 frame_cropping_flag); } #endif } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckPictureHeaderValid(picture_header *p,NALU_t *nalu) { #if ERR_REPORT if ( !((p->picture_coding_type == 0) || (p->picture_coding_type == 1)) ) fprintf(p_err,"Picture Header ERR: %d is inValid picture_coding_type, should be [0:1], see FCD 7.2.6\n",p->picture_coding_type); if (p->frame_num == 0) { if (p->picture_distance !=0) fprintf(p_err,"Picture Header ERR: %d is inValid picture_distance in IDR picture, should be 0, see FCD 7.2.6\n",p->picture_distance); if(nalu->nal_unit_type != NALU_TYPE_IDR) fprintf(p_err,"Picture Header ERR: the first picture of a sequence must be an IDR picture, see FCD 3.38\n"); else if (p->picture_coding_type != 0) fprintf(p_err,"Picture Header ERR: an IDR picture must have (nal_unit_type = 2, picture_coding_type = 0), see FCD 7.2.6\n"); } if (p->picture_distance_gap_minus1<0 || p->picture_distance_gap_minus1>31) fprintf(p_err,"Picture Header ERR: %d is inValid picture_distance_gap_minus1, should be [0:31], see FCD 7.2.6\n",p->picture_distance_gap_minus1); if ((p->alpha_ci_offset<-8) || (p->alpha_ci_offset>8)) fprintf(p_err,"Picture Header ERR: %d is inValid alpha_ci_offset, should be [-8:8], see FCD 7.2.6\n",p->alpha_ci_offset); if ((p->cp_offset<-16) || (p->cp_offset>16)) fprintf(p_err,"Picture Header ERR: %d is inValid cp_offset, should be [-16:16], see FCD 7.2.6\n",p->cp_offset); if ((p->loopfilter_qp_offset<-40) || (p->loopfilter_qp_offset>23)) fprintf(p_err,"Picture Header ERR: %d is inValid loopfilter_qp_offset, should be [-40:23], see FCD 7.2.6\n",p->loopfilter_qp_offset); #endif } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckSliceHeaderValid(int first_mb_in_slice,int delta_qp) { #if ERR_REPORT if ((first_mb_in_slice<0)||(first_mb_in_slice>=pgImage->PicSizeInMbs)) fprintf(p_err,"Slice Header ERR: %d is inValid first_mb_in_slice, should be [0:%d], see FCD 7.2.7.1",first_mb_in_slice,(pgImage->PicSizeInMbs-1)); if ((delta_qp<-32)||(delta_qp>31)) fprintf(p_err,"Slice Header ERR: %d is inValid delta_qp, should be [-32:31], see FCD 7.2.7.1",delta_qp); #endif } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckMbOverHeadValid(Macroblock *curMb) { #if ERR_REPORT int i,j,k; if ((curMb->mb_type<0)||(curMb->mb_type>5)) fprintf(p_err,"MbOverHead ERR: %d is invalid mb_type, should be [0:5], see FCD 9.3.1\n",curMb->mb_type); if (IS_INTRA(curMb)) { if ((curMb->c_ipred_mode<0)||(curMb->c_ipred_mode>2)) fprintf(p_err,"MbOverHead ERR: %d is invalid intra_chroma_pred_mode, should be [0:2], see FCD 9.3.2\n",curMb->c_ipred_mode); } if ((curMb->delta_quant<-32)||(curMb->delta_quant>31)) fprintf(p_err,"MbOverHead ERR: %d is invalid intra_chroma_pred_mode, should be [-32:31], see FCD 7.2.8\n",curMb->delta_quant); for (i=0;i<4;i++) { if ((curMb->sub_mb_type[i]<0)||(curMb->sub_mb_type[i]>3)) fprintf(p_err,"MbOverHead ERR: %d is invalid sub_mb_type, should be [0:3], see FCD 7.2.8\n",curMb->sub_mb_type[i]); } for (j=0; j < BLOCK_MULTIPLE; j++) for (i=0; i < BLOCK_MULTIPLE; i++) for (k=0; k < 2; k++) if ((curMb->mvd[j][i][k]<-1024)||(curMb->mvd[j][i][k]>1023)) fprintf(p_err,"MbOverHead ERR: %d is invalid mvd, should be [-1024:1023], see FCD 7.2.8\n",curMb->mvd[j][i][k]); #endif } /*! ************************************************************************************* * \brief : * Match the FCD 9.6 ************************************************************************************* */ void CheckQCoeffValid(int MbNr,int b8, int b4, int QCoeff) { #if ERR_REPORT if ((QCoeff > 1023) || (QCoeff < -1024)) fprintf(p_err, "Q Coeff ERR: %d is inValid Quantized Coefficient at (%d,%d) in %d Macroblock, should be [-1024:1023], see FCD 9.5.2\n", QCoeff, b8, b4,MbNr); #endif } void CheckDCTCoeffValid(int MbNr,int b8, int b4, int DCTCoeff) { #if ERR_REPORT if ((DCTCoeff > 2047) || (DCTCoeff < -2048)) fprintf(p_err, "DCT Coeff ERR: %d is inValid inverse quantized DCT Coefficient at (%d,%d) in %d Macroblock, should be [-2048:2047], see FCD 9.5.2\n", DCTCoeff, b8, b4,MbNr); #endif } void CheckHCoeffValid(int MbNr,int b8, int b4, int HCoeff) { #if ERR_REPORT if ((HCoeff > 32751) || (HCoeff < -32768)) fprintf(p_err, "IDCT H Coeff ERR: %d is inValid H Coefficient at (%d,%d) in %d Macroblock, should be [-8192:8188], see FCD 9.6\n", HCoeff, b8, b4,MbNr); #endif } /*! ************************************************************************************* * \brief : * ************************************************************************************* */ void CheckBitstreamStatus(FILE *error_file) { #if ERR_REPORT fprintf(p_err,"\n\n-----------------------------------------------------------------------\n"); fprintf(p_err,"-------------- Bitstream Statistics -------------\n"); fprintf(p_err,"-----------------------------------------------------------------------\n"); /* Seq Parameter Check */ fprintf(p_err,"total frame nums \t = %d\n", stat_parameter->tot_frame_number); fprintf(p_err,"picture_width \t = %d\n", stat_parameter->img_width); fprintf(p_err,"picture_height \t = %d\n", stat_parameter->img_height); fprintf(p_err,"delta_time_picture_distance_1 \t = %d\n", stat_parameter->delta_time_picture_distance_1); fprintf(p_err,"frame_skip \t = %d\n", stat_parameter->frame_skip); fprintf(p_err,"num_ref_frames \t = %d\n", stat_parameter->ref_frame_number); fprintf(p_err,"frame_cropping_flag \t = %d\n", stat_parameter->frame_cropping_flag); /* Pic Parameter Check */ fprintf(p_err,"picture_reference_flag \t = %d\n", stat_parameter->picture_reference_flag); fprintf(p_err,"skip_mode_flag \t = %d\n", stat_parameter->skip_mode_flag); fprintf(p_err,"loop_filter_disable_flag \t = %d\n", stat_parameter->loop_filter_disable_flag); fprintf(p_err,"loop_filter_parameter_flag \t = %d\n", stat_parameter->loop_filter_parameter_flag); fprintf(p_err,"constrained_intra_pred_flag \t = %d\n", stat_parameter->constrained_intra_pred_flag); fprintf(p_err,"half_pixel_mv_flag \t = %d\n", stat_parameter->half_pixel_mv_flag); /*Picture Header Check */ fprintf(p_err,"loop_filter_alpha_ci_offset \t = %d\n", stat_parameter->alpha_ci_offset); fprintf(p_err,"loop_fiter_qp_offset \t = %d\n", stat_parameter->loop_fiter_qp_offset); fprintf(p_err,"loop_fiter_qp_offset \t = %d\n", stat_parameter->loop_fiter_qp_offset); /* MbOverhead Check */ fprintf(p_err,"\nMb_type:\n 0 1 2 3 4 5\n"); fprintf(p_err," %d %d %d %d %d %d\n",stat_parameter->mb_type[0],stat_parameter->mb_type[1],\ stat_parameter->mb_type[2],stat_parameter->mb_type[3],\ stat_parameter->mb_type[4],stat_parameter->mb_type[5]); fprintf(p_err,"\nintra_luma_pred_mode:\n 0 1 2 3 4 5 6 7 8\n"); fprintf(p_err," %d %d %d %d %d %d %d %d %d\n",stat_parameter->intra_luma_pred_mode[0],stat_parameter->intra_luma_pred_mode[1],\ stat_parameter->intra_luma_pred_mode[2],stat_parameter->intra_luma_pred_mode[3],\ stat_parameter->intra_luma_pred_mode[4],stat_parameter->intra_luma_pred_mode[5],\ stat_parameter->intra_luma_pred_mode[6],stat_parameter->intra_luma_pred_mode[7],\ stat_parameter->intra_luma_pred_mode[8]); fprintf(p_err,"\nintra_chroma_pred_mode:\n 0 1 2 \n %d %d %d \n",stat_parameter->intra_chroma_pred_mode[0],\ stat_parameter->intra_chroma_pred_mode[1],\ stat_parameter->intra_chroma_pred_mode[2]); fprintf(p_err,"\nmv_x \t = [%4d:%4d]\n", stat_parameter->min_mv[0],stat_parameter->max_mv[0]); fprintf(p_err,"mv_y \t = [%4d:%4d]\n", stat_parameter->min_mv[1],stat_parameter->max_mv[1]); #endif }