H264--H264解码--5
来源:互联网 发布:windows jenkins 卸载 编辑:程序博客网 时间:2024/05/05 13:15
解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。
nal_unit( NumBytesInNALunit ) {/* NumBytesInNALunit为统计出来的数据长度 */
forbidden_zero_bit // forbidden_zero_bit 等于 0表示网络传输没有出错
nal_ref_idc // 指示当前 NAL 的优先级。取值范围为 0-3, 值越高,表示当前 NAL 越重要,需要优先受到保护。H.264 规定如果当前 NAL 是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的数据单位时,本句法元素必须大于 0。
nal_unit_type // NAL类型 指明当前 NAL unit 的类型
NumBytesInRBSP = 0
/* rbsp_byte[i] RBSP 的第 i 个字节。 RBSP 指原始字节载荷,它是 NAL 单元的数据部分的封装格式,封装的数据来自 SODB(原始数据比特流)。SODB 是编码后的原始数据,SODB 经封装为 RBSP 后放入 NAL 的数据部分。下面介绍一个 RBSP 的生成顺序。
从 SODB 到 RBSP 的生成过程:
- 如果 SODB 内容是空的,生成的 RBSP 也是空的
- 否则,RBSP 由如下的方式生成:
1) RBSP 的第一个字节直接取自 SODB 的第 1 到 8 个比特,(RBSP 字节内的比特按照从左到右对应为从高到低的顺序排列,most significant),以此类推,RBSP 其余的每个字节都直接取自 SODB的相应比特。RBSP 的最后一个字节包含 SODB 的最后几个比特,及如下的 rbsp_trailing_bits()
2) rbsp_trailing_bits()的第一个比特是 1,接下来填充 0,直到字节对齐。(填充 0 的目的也是为了字节对齐)
3) 最后添加若干个 cabac_zero_word(其值等于 0x0000)
*/
for( i = 1; i < NumBytesInNALunit; i++ ) {
if( i + 2 < NumBytesInNALunit&& next_bits(24 )= = 0x000003 ) {
/* 0x000003伪起始码,需要删除0x03这个字节 */
rbsp_byte[ NumBytesInRBSP++ ]
rbsp_byte[ NumBytesInRBSP++ ]
i += 2 /* 取出前两个0x00后,跳过0x03 */
//emulation_prevention_three_byte NAL 内部为防止与起始码竞争而引入的填充字节 ,值为 0x03。
emulation_prevention_three_byte
} else
rbsp_byte[ NumBytesInRBSP++ ] /* 继续读取后面的字节 */
}
}
序列参数集(SPS)
句法
C
Desc
seq_parameter_set_rbsp(){
profile_idc/*指明所用的Profile */
0
u(8)
constraint_set0_flag
0
u(1)
constraint_set1_flag
0
u(1)
constraint_set1_flag
0
u(1)
reserved_zero_5bits /* equal to 0 */
0
u(5)
level_idc /* 指明所用的Level */
0
u(8)
seq_parameter_set_id /*指明本序列参数集的id号,0-31,被图像集引用,编码需要产生新的序列集时,使用新的id,而不是改变原来参数集的内容 */
0
ue(v)
log2_max_frame_num_minus4/*为读取元素frame_num服务,frame_num标识图像的解码顺序,frame_num的解码函数是ue(v),其中v=log2_max_frame_num_minus4+4,该元素同时指明frame_num的最大值MaxFrameNum=2( log2_max_frame_num_minus4+4)*/
0
ue(v)
pic_order_cnt_type /* 指明poc的编码方法,poc标识图像的播放顺序,poc可以由frame_num计算,也可以显示传送。poc共三种计算方式 */
0
ue(v)
if(pic_order_cnt_type==0)
log2_max_pic_order_cnt_lsb_minus4 /* 指明变量MaxPicOrderCntLsb的值,MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4) */
0
ue(v)
else if(pic_order_cnt_type==1){
delta_pic_order_always_zero_flag /* 等于1时,元素delta_pic_order_cnt[0]和delta_pic_order_cnt[1]不在片头中出现,并且它们的默认值是0,等于0时,上述两元素出现的片头中 */
0
u(1)
offset_for_non_ref_pic /* 用来计算非参考帧或场的poc,[-231,231-1] */
0
se(v)
offset_for_top_to_bottom_field/*计算帧的底场的poc */
0
se(v)
num_ref_frames_inpic_order_cnt_cycle /* 用来解码poc,[0.255] */
0
ue(v)
for(i=0;i<num_ref_frames_inpic_order_cnt_cycle;i++)
offset_for_ref_frame[i]/*用来解码poc,对于循环中的每个元素指定一个偏移 */
0
se(v)
}
num_ref_frames /* 参考帧队列可达到的最大长度,[0,16] */
0
ue(v)
gaps_in_frame_num_value_allowed_flag /* 为1,允许slice header中的frame_num不连续 */
0
u(1)
pic_width_inmbs_minus1 /*本元素加1,指明以宏块为单位的图像宽度PicWidthInMbs=pic_width_in_mbs_minus1+1 */
0
ue(v)
pic_height_in_map_units_minus1 /* 本元素加1,指明以宏块为单位的图像高宽度PicHeightInMapUnitsMbs=pic_height_in_map_units_minus1+1 */
0
ue(v)
frame_mbs_only_flag /* 等于0表示本序列中所有图像均为帧编码;等于1,表示可能是帧,也可能场或帧场自适应,具体编码方式由其它元素决定。结合前一元素:FrameHeightInMbs=(2-frame_mbs_only_flag)*PicHeightInMapUnits */
0
ue(v)
if(frame_mbs_only_flag)
mb_adaptiv_frame_field_flag /* 指明本序列是否是帧场自适应模式:
frame_mbs_only_flag=1,全部是帧
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=0,帧场共存
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=1,帧场自适应和场共存*/
0
u(1)
direct_8x8_inference_flag /* 用于指明B片的直接和skip模式下的运动矢量的计算方式 */
0
u(1)
frame_cropping_flag /*解码器是否要将图像裁剪后输出,如果是,后面为裁剪的左右上下的宽度 */
0
u(1)
if(frame_cropping_flag){
frame_crop_left_offset
0
ue(1)
frame_crop_right_offset
0
ue(1)
frame_crop_top_offset
0
ue(1)
frame_crop_bottom_offset
0
ue(1)
}
vui_parameters_present_flag /* 指明vui子结构是否出现在码流中,vui子结构在附录中指明,用于表征视频格式的信息 */
0
u(1)
if(vui_parameters_present_flag)
vui_parameters()
0
rbsp_trailing_bits()
0
}
- H264--5--H264解码
- H264--5--H264解码
- H264--H264解码--5
- H264--5--H264解码
- H264--H264解码--5
- H264--5--H264解码
- H264--5--H264解码
- H264--H264解码--5
- h264解码
- h264视频编解码
- Symbian H264视频解码
- H264 解码耗时分析
- H264 解码 主函数
- h264解码实现了
- h264编解码相关
- H264解码流程
- 海思H264解码库
- ffmpeg编译,解码 H264
- BFC(块格式化上下文)知识点整理
- FET335X 之序--确定要用飞凌的AM335X了
- TODO二三事
- gcc -L -I -l
- POJ 2182 Lost Cows
- H264--H264解码--5
- CSS3学习笔记1:结构性伪类选择器
- untiy3d.UGUI.button图片切换
- ffmpeg 解复用视频文件
- CSS3学习笔记2:UI元素状态伪类选择器
- 第四章 对象与类-----笔记
- C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
- angularjs - Error: [$resource:badcfg] Error in resource
- php 发送邮件