从H264的SPS中获取图像长宽.docx
- 文档编号:26899465
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:14
- 大小:17.02KB
从H264的SPS中获取图像长宽.docx
《从H264的SPS中获取图像长宽.docx》由会员分享,可在线阅读,更多相关《从H264的SPS中获取图像长宽.docx(14页珍藏版)》请在冰豆网上搜索。
从H264的SPS中获取图像长宽
从H264的SPS中获取图像长宽
李国帅
从开源项目mpegip中选取,并封装。
1,调用方法
#include"H264Parser.h"
outWidth=dec.pic_width;//1920;//
outHeight=dec.pic_height;//1080;//
h264_decode_tdec;
memset(&dec,0,sizeof(dec));
uint8_t*buffer=(uint8_t*)cbSPS;
h264_parse_sequence_parameter_set(&dec,buffer,nSPS*8);
2,H264Parser.h代码
#pragmaonce
#ifndef__H264_H__
#define__H264_H__1
#include
#include
#include"stdint.h"
#include"bitstream.h"//在mpegip中得到,就不粘贴了。
typedefunsignedintuint;
#defineH264_START_CODE0x0001
#defineH264_PREVENT_3_BYTE0x0003
#pragmapack(push)
#pragmapack
(1)
typedefstructh264_decode_t{uint8_tprofile;
uint8_tlevel;
uint32_tchroma_format_idc;
uint8_tresidual_colour_transform_flag;
uint32_tbit_depth_luma_minus8;
uint32_tbit_depth_chroma_minus8;
uint8_tqpprime_y_zero_transform_bypass_flag;
uint8_tseq_scaling_matrix_present_flag;
uint32_tlog2_max_frame_num_minus4;
uint8_tframe_mbs_only_flag;
uint8_tpic_order_present_flag;
uint8_tdelta_pic_order_always_zero_flag;
int32_toffset_for_non_ref_pic;
int32_toffset_for_top_to_bottom_field;
int16_toffset_for_ref_frame[256];
uint8_tnal_ref_idc;
uint8_tnal_unit_type;
uint8_tfield_pic_flag;
uint8_tbottom_field_flag;
uint32_tframe_num;
uint32_tidr_pic_id;
uint32_tpic_width,pic_height;
uint32_tslice_type;
/*POCstate*/
uint32_tframe_num_prev;
int32_tframe_num_offset;
int32_tframe_num_offset_prev;
uint8_tNalHrdBpPresentFlag;
uint8_tVclHrdBpPresentFlag;
uint8_tCpbDelaysPresentFlag;
uint8_tpic_struct_present_flag;
uint8_tcpb_removal_delay_length_minus1;
uint8_tdpb_output_delay_length_minus1;
uint8_ttime_offset_length;
uint8_tinitial_cpb_removal_delay_length_minus1;
}h264_decode_t;
staticuint8_texp_golomb_bits[]={8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//256
staticconstuint8_ttrailing_bits[]={0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//9#ifdef__cplus
extern"C"{
#endif
uint32_th264_ue(CBitstream*bs){uint32_tbits,read;
intbits_left;
uint8_tcoded;
booldone=false;
bits=0;
//wewanttoread8bitsatatime-ifwedon'thave8bits,
//readwhat'sleft,andshift.Theexp_golomb_bitscalcremainsthe
//same.
while(done==false){bits_left=bs->bits_remain();
if(bits_left<8){}
elseread=bs->PeekBits(bits_left)<<(8-bits_left);
done=true;
}{
}read=bs->PeekBits
(8);
if(read==0){}
else{}done=true;
bs->GetBits
(8);
bits+=8;
coded=exp_golomb_bits[read];
bs->GetBits(coded);
bits+=coded;
}//printf("ue-bits%d\n",bits);
returnbs->GetBits(bits+1)-1;
int32_th264_se(CBitstream*bs){}
voidh264_check_0s(CBitstream*bs,intcount){}uint32_tval;
val=bs->GetBits(count);
if(val!
=0){}//printf("fielderror-%dbitsshouldbe0is%x\n",count,val);uint32_tret;
ret=h264_ue(bs);
if((ret&0x1)==0){}
return(ret+1)>>1;
ret>>=1;
int32_ttemp=0-ret;
returntemp;
voidscaling_list(uint32_tix,uint32_tsizeOfScalingList,CBitstream*bs){uint32_tlastScale=8,nextScale=8;
uint32_tjx;
intdeltaScale;
}for(jx=0;jx =0){} if(nextScale==0){} else{} //printf("scalinglist[%u][%u]: %u\n",ix,jx,lastScale);lastScale=nextScale; lastScale=lastScale; deltaScale=h264_se(bs); nextScale=(lastScale+deltaScale+256)%256; //printf("delta: %d\n",deltaScale); voidh264_parse_sequence_parameter_set(h264_decode_t*dec,uint8_t*Buffer,size_t{ CBitstreamourbs; ourbs.init(Buffer,Buffer_Size); CBitstream*bs= uint32_ttype=0; h264_check_0s(bs,1);//检查首字节 dec->nal_ref_idc=bs->GetBits (2);//NAL的优先级 dec->nal_unit_type=type=bs->GetBits (5);//nal类型 if(type! =0x7){}return; Buffer_Size) uint32_ttemp; dec->profile=bs->GetBits (8);//第个字节 //printf("profile: %u\n",dec->profile); temp=bs->GetBits (1); //printf("constaint_set0_flag: %d\n",temp); temp=bs->GetBits (1); //printf("constaint_set1_flag: %d\n",temp); temp=bs->GetBits (1); //printf("constaint_set2_flag: %d\n",temp); temp=bs->GetBits (1); //printf("constaint_set3_flag: %d\n",temp); h264_check_0s(bs,4);//第个字节 temp=bs->GetBits (8);//第个字节 //printf("level_idc: %u\n",temp); temp=h264_ue(bs); //printf("seqparametersetid: %u\n",temp); if(dec->profile==100||dec->profile==110||dec->profile==122||dec->profile{ dec->chroma_format_idc=h264_ue(bs); ==144) }if(dec->chroma_format_idc==3){} dec->bit_depth_luma_minus8=h264_ue(bs); dec->bit_depth_chroma_minus8=h264_ue(bs); dec->qpprime_y_zero_transform_bypass_flag=bs->GetBits (1); dec->seq_scaling_matrix_present_flag=bs->GetBits (1); if(dec->seq_scaling_matrix_present_flag){}for(uint32_tix=0;ix<8;ix++){}temp=bs->GetBits (1); if(temp){}scaling_list(ix,ix<6? 16: 64,bs); dec->residual_colour_transform_flag=bs->GetBits (1); dec->log2_max_frame_num_minus4=h264_ue(bs); temp=h264_ue(bs); //printf("num_ref_frames: %u\n",temp); temp=bs->GetBits (1); //printf("gaps_in_frame_num_value_allowed_flag: %u\n",temp); uint32_tPicWidthInMbs=h264_ue(bs)+1; //printf("pic_width_in_mbs_minus1: %u(%u)\n",PicWidthInMbs-1,PicWidthInMbs*dec->delta_pic_order_always_zero_flag=bs->GetBits (1); temp=h264_se(bs); //printf("offset_for_non_ref_pic: %d\n",temp); temp=h264_se(bs); //printf("offset_for_top_to_bottom_field: %d\n",temp); temp=h264_ue(bs); for(uint32_tix=0;ix //printf("offset_for_ref_frame[%u]: %d\n",ix,temp); 16); dec->frame_mbs_only_flag=bs->GetBits (1); if(! dec->frame_mbs_only_flag){} temp=bs->GetBits (1); //printf("direct_8x8_inference_flag: %u\n",temp); temp=bs->GetBits (1); if(temp){temp=h264_ue(bs); //printf("frame_crop_left_offset: %u\n",temp); temp=h264_ue(bs); //printf("frame_crop_right_offset: %u\n",temp); temp=bs->GetBits (1); //printf("mb_adaptive_frame_field_flag: %u\n",temp); uint32_tPicHeightInMapUnits=h264_ue(bs)+1; //printf("pic_height_in_map_minus1: %u\n",PicHeightInMapUnits-1);}}temp=h264_ue(bs); //printf("frame_crop_top_offset: %u\n",temp); temp=h264_ue(bs); //printf("frame_crop_bottom_offset: %u\n",temp); //temp=bs->GetBits (1); //if(temp) //{ //h264_vui_parameters(dec,bs);//海康sps可能没有这个东西 //} dec->pic_width=PicWidthInMbs*16; dec->pic_height=(2-dec->frame_mbs_only_flag)*PicHeightInMapUnits*16;staticuint32_tcalc_ceil_log2(uint32_tval){} voidh264_parse_pic_parameter_set(h264_decode_t*dec,CBitstream*bs){uint32_tnum_slice_groups,temp,iGroup; temp=h264_ue(bs); //printf("pic_parameter_set_id: %u\n",temp); temp=h264_ue(bs); //printf("seq_parameter_set_id: %u\n",temp); temp=bs->GetBits (1); //printf("entropy_coding_mode_flag: %u\n",temp); dec->pic_order_present_flag=bs->GetBits (1); //printf("pic_order_present_flag: %u\n",dec->pic_order_present_flag);num_slice_groups=h264_ue(bs); //printf("num_slice_groups_minus1: %u\n",num_slice_groups); if(num_slice_groups>0){temp=h264_ue(bs); uint32_tix,cval; ix=0; cval=1; while(ix<32){} returnix; if(cval>=val)returnix; cval<<=1; ix++; }//printf("slice_group_map_type: %u\n",temp); if(temp==0){} elseif(temp==2){} elseif(temp<6)//3,4,5{} elseif(temp==6){}temp=h264_ue(bs); //printf("pic_size_in_map_units_minus1: %u\n",temp); uint32_tbits=calc_ceil_log2(num_slice_groups+1); //printf("bits-%u\n",bits); for(iGroup=0;iGroup<=temp;iGroup++){}temp=bs->GetBits(bits); //printf("slice_group_id[%u]: %u\n",iGroup,temp);temp=bs->GetBits (1); //printf("slice_group_change_direction_flag: %u\n",temp);temp=h264_ue(bs); //printf("slice_group_change_rate_minus1: %u\n",temp); for(iGroup=0;iGroup //printf("top_left[%u]: %u\n",iGroup,temp); temp=h264_ue(bs); //printf("bottom_right[%u]: %u\n",iGroup,temp); for(iGroup=0;iGroup<=num_slice_groups;iGroup++){}temp=h264_ue(bs); //printf("run_length_minus1[%u]: %u\n",iGroup,temp);temp=h264_ue(bs); //printf("num_ref_idx_l0_active_minus1: %u\n",temp); temp=h264_ue(bs); //printf("num_ref_idx_l1_active_minus1: %u\n",temp); temp=bs->GetBits (1); }//printf("weighted_pred_flag: %u\n",temp); temp=bs->GetBits (2); //printf("weighted_bipred_idc: %u\n",temp); temp=h264_se(bs); //printf("pic_init_qp_minus26: %d\n",temp); temp=h264_se(bs); //printf("pic_init_qs_minus26: %d\n",temp); temp=h264_se(bs); //printf("chroma_qp_index_offset: %d\n",temp); temp=bs->GetBits (1); //printf("deblocking_filter_control_present_flag: %u\n",temp); temp=bs->GetBits (1); //printf("constrained_intra_pred_flag: %u\n",temp); temp=bs->GetBits (1); %u\n",temp); intbits=bs->bits_remain(); if(bits==0)return; if(bits<=8){} //wehavetheextensions uint8_ttransform_8x8_mode_flag=bs->GetBits (1); //printf("transform_8x8_mode_flag: %u\n",transform_8x8_mode_flag); temp=bs->GetBits (1); //printf("pic_scaling_matrix_present_flag: %u\n",temp); if(te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- H264 SPS 获取 图像