⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slicehdr.c

📁 decode the h264 video
💻 C
字号:
#include "common.h"#include "input.h"#include "nal.h"#include "cavlc.h"#include "params.h"#include "slicehdr.h"static void skip_ref_pic_list_reordering() {  int reordering_of_pic_nums_idc;  int abs_diff_pic_num;  int long_term_pic_num;  fprintf(stderr,"Warning: I do not support reference picture list reordering.\n"                 "         Watch out for decoding errors!\n");  do {    reordering_of_pic_nums_idc=get_unsigned_exp_golomb();    if(reordering_of_pic_nums_idc==0 || reordering_of_pic_nums_idc==1)      abs_diff_pic_num=get_unsigned_exp_golomb()+1;    else if(reordering_of_pic_nums_idc==2)      long_term_pic_num=get_unsigned_exp_golomb();  } while(reordering_of_pic_nums_idc!=3);}static void skip_adaptive_ref_pic_marking() {  int memory_management_control_operation;  int difference_of_pic_nums;  int long_term_pic_num;  int long_term_frame_idx;  int max_long_term_frame_idx;  fprintf(stderr,"Warning: I do not support adaptive reference picture marking.\n"                 "         Watch out for decoding errors!\n");  do {    memory_management_control_operation=get_unsigned_exp_golomb();    if(memory_management_control_operation==1 || memory_management_control_operation==3)      difference_of_pic_nums=get_unsigned_exp_golomb()+1;    if(memory_management_control_operation==2)      long_term_pic_num=get_unsigned_exp_golomb();    if(memory_management_control_operation==3 || memory_management_control_operation==6)      long_term_frame_idx=get_unsigned_exp_golomb();    if(memory_management_control_operation==4)      max_long_term_frame_idx=get_unsigned_exp_golomb()-1;  } while(memory_management_control_operation!=0);}void decode_slice_header(slice_header *sh,                         seq_parameter_set *sps,                         pic_parameter_set *pps,                         nal_unit *nalu) {  memset((void*)sh,0,sizeof(slice_header));  sh->first_mb_in_slice                      =get_unsigned_exp_golomb();  sh->slice_type                             =get_unsigned_exp_golomb()%5;  sh->pic_parameter_set_id                   =get_unsigned_exp_golomb();  sh->frame_num                              =input_get_bits(sps->log2_max_frame_num);  if(!sps->frame_mbs_only_flag) {    sh->field_pic_flag                       =input_get_one_bit();    if(sh->field_pic_flag)      sh->bottom_field_flag                  =input_get_one_bit();  }  sh->MbaffFrameFlag=(sps->mb_adaptive_frame_field_flag && !sh->field_pic_flag);  sh->PicHeightInMbs=sps->FrameHeightInMbs/(1+sh->field_pic_flag);  sh->PicHeightInSamples=(sh->PicHeightInMbs)<<4;  sh->PicSizeInMbs=sps->PicWidthInMbs*sh->PicHeightInMbs;  if(nalu->nal_unit_type==5)    sh->idr_pic_id                           =get_unsigned_exp_golomb();  if(sps->pic_order_cnt_type==0) {    sh->pic_order_cnt_lsb                    =input_get_bits(sps->log2_max_pic_order_cnt_lsb);    if(pps->pic_order_present_flag && !sh->field_pic_flag)      sh->delta_pic_order_cnt_bottom         =get_signed_exp_golomb();  }  if(sps->pic_order_cnt_type==1 && !sps->delta_pic_order_always_zero_flag) {    sh->delta_pic_order_cnt[0]               =get_signed_exp_golomb();    if(pps->pic_order_present_flag && !sh->field_pic_flag)      sh->delta_pic_order_cnt[1]             =get_signed_exp_golomb();  }  if(pps->redundant_pic_cnt_present_flag)    sh->redundant_pic_cnt                    =get_unsigned_exp_golomb();  if(sh->slice_type==B_SLICE)    sh->direct_spatial_mv_pred_flag          =input_get_one_bit();  if(sh->slice_type==P_SLICE || sh->slice_type==B_SLICE || sh->slice_type==SP_SLICE) {    sh->num_ref_idx_active_override_flag     =input_get_one_bit();    if(sh->num_ref_idx_active_override_flag) {      sh->num_ref_idx_l0_active              =get_unsigned_exp_golomb()+1;      if(sh->slice_type==B_SLICE)        sh->num_ref_idx_l1_active            =get_unsigned_exp_golomb()+1;    }  }  // ref_pic_list_reordering()  if(sh->slice_type!=I_SLICE && sh->slice_type!=SI_SLICE) {    sh->ref_pic_list_reordering_flag_l0      =input_get_one_bit();    if(sh->ref_pic_list_reordering_flag_l0)      skip_ref_pic_list_reordering();  }  if(sh->slice_type==B_SLICE) {    sh->ref_pic_list_reordering_flag_l1      =input_get_one_bit();    if(sh->ref_pic_list_reordering_flag_l1)      skip_ref_pic_list_reordering();  }  if((pps->weighted_pred_flag && (sh->slice_type==P_SLICE || sh->slice_type==SP_SLICE)) ||     (pps->weighted_bipred_idc==1 && sh->slice_type==B_SLICE)) {    fprintf(stderr,"sorry, I _really_ do not support weighted prediction!\n");    exit(1);  }  if(nalu->nal_ref_idc!=0) {    // dec_ref_pic_marking()    if(nalu->nal_unit_type==5) {      sh->no_output_of_prior_pics_flag       =input_get_one_bit();      sh->long_term_reference_flag           =input_get_one_bit();    } else {      sh->adaptive_ref_pic_marking_mode_flag =input_get_one_bit();      if(sh->adaptive_ref_pic_marking_mode_flag)        skip_adaptive_ref_pic_marking();    }  }  if(pps->entropy_coding_mode_flag && sh->slice_type!=I_SLICE && sh->slice_type!=SI_SLICE)    sh->cabac_init_idc                       =get_unsigned_exp_golomb();  sh->slice_qp_delta                         =get_signed_exp_golomb();  sh->SliceQPy=pps->pic_init_qp+sh->slice_qp_delta;  if(sh->slice_type==SP_SLICE || sh->slice_type==SI_SLICE) {    if(sh->slice_type==SP_SLICE)      sh->sp_for_switch_flag                 =input_get_one_bit();    sh->slice_qs_delta                       =get_signed_exp_golomb();  }  if(pps->deblocking_filter_control_present_flag) {    sh->disable_deblocking_filter_idc        =get_unsigned_exp_golomb();    if(sh->disable_deblocking_filter_idc!=1) {      sh->slice_alpha_c0_offset_div2         =get_signed_exp_golomb();      sh->slice_beta_offset_div2             =get_signed_exp_golomb();    }  }  if(pps->num_slice_groups>1 && pps->slice_group_map_type>=3 && pps->slice_group_map_type<=5)    sh->slice_group_change_cycle             =get_unsigned_exp_golomb();}char *_str_slice_type(int type) {  switch(type) {    case  P_SLICE: case  P_SLICE+5: return "P-Slice";    case  B_SLICE: case  B_SLICE+5: return "B-Slice";    case  I_SLICE: case  I_SLICE+5: return "I-Slice";    case SP_SLICE: case SP_SLICE+5: return "SP-Slice";    case SI_SLICE: case SI_SLICE+5: return "SI-Slice";  }  return "Illegal Slice";}///////////////////////////////////////////////////////////////////////////////#ifdef BUILD_TESTSint _test_slicehdr(int argc, char *argv[]) {  nal_unit unit;  seq_parameter_set sps;  pic_parameter_set pps;  slice_header sh;  int count;  if(!input_open("../streams/nemo_simple.264")) return 1;  for(count=1; get_next_nal_unit(&unit); ++count)    switch(unit.nal_unit_type) {      case 7: decode_seq_parameter_set(&sps); break;      case 8: decode_pic_parameter_set(&pps); break;      case 1: case 5:        decode_slice_header(&sh,&sps,&pps,&unit);        printf("%s at unit #%d (frame_num=%d)\n",               _str_slice_type(sh.slice_type),count,sh.frame_num);        printf("  RefID=0x%08X first_mb_in_slice=%d field_pic=%d\n",               sh.pic_parameter_set_id,sh.first_mb_in_slice,sh.field_pic_flag);        printf("  MbaffFrameFlag=%d PicSizeInSamples=%dx%d\n",               sh.MbaffFrameFlag,sps.PicWidthInSamples,sh.PicHeightInSamples);        printf("  idr_pic_id=0x%04X pic_order_cnt_lsb=%d redundant_pic_cnt=%d\n",               sh.idr_pic_id,sh.pic_order_cnt_lsb,sh.redundant_pic_cnt);        printf("  direct_spatial_mv_pred=%d num_ref_idx_active_override=%d\n",               sh.direct_spatial_mv_pred_flag,sh.num_ref_idx_active_override_flag);        printf("  ref_pic_list_reordering=%d/%d adaptive_ref_pic_marking=%d\n",               sh.ref_pic_list_reordering_flag_l0,sh.ref_pic_list_reordering_flag_l1,               sh.adaptive_ref_pic_marking_mode_flag);        printf("  slice_qp_delta=%d slice_qs_delta=%d\n",               sh.slice_qp_delta,sh.slice_qs_delta);        break;    }  input_close();  return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -