JM代码阅读之一SODB RBSP EBSP NALU | JM Code Notes 1 – SODB RBSP EBSP NALU

本文通过分析H.264编码标准下的JM版本16.0编码过程,详细解释了码流的第一个NALU(SPS)是如何形成的。文中还介绍了ElecardStreamEyeTools工具的使用,并对SPS和PPS中的关键参数进行了详细解读。

JM版本16.0,配置文件encoder_baseline.cfg,H.264标准文档(03/2010)版。

通过对码流的第一个NALU(SPS)的形成来分析。

首先给出编码后的最终码流(SPS + PPS):
00 00 00 01 67 42 00 28 F3 05 89 C8 00 00 00 01 68 C9 4A 38 80

将SPS(红色部分)转换成二进制:00000000 00000000 00000000 00000001 0110011101000010 00000000 00101000 11110011 00000101 10001001 11001000

 

然后介绍一个码流分析工具:Elecard StreamEye Tools

用这个工具分析用JM编码得到的码流,它会给出各个NALU的信息

其中SPS的内容如下:
profile_idc = 66 (PROFILE_IDC_Baseline) (01000010)
constraint_set0_flag = 0 
constraint_set1_flag = 0 
constraint_set2_flag = 0 
constraint_set3_flag = 0 
reserved_zero_4bits = 0
level_idc = 40(00101000)
seq_parameter_set_id = 0 ue_v
log2_max_frame_num_minus4 = 0 ue_v
pic_order_cnt_type = 0 ue_v
log2_max_pic_order_cnt_lsb_minus4 = 0 ue_v
num_ref_frames = 5 ue_v
gaps_in_frame_num_value_allowed_flag = 0
pic_width_in_mbs_minus1 = 10 (176) ue_v
pic_height_in_map_units_minus1 = 8 (144) ue_v
frame_mbs_only_flag = 1 
direct_8x8_inference_flag = 1 
frame_cropping_flag = 0 
vui_parameters_present_flag = 0

其中每一个参数对应码流中的位置用颜色对应关系给出,其中后面标有ue_v的是采用Exp-Golomb-coded编码的,暂时还没有研究。其他没有颜色的bit为一些填充或头部,后面详细分析。

—————————————————————————————————

好吧,下面分析这个NALU是怎么形成的:00 00 00 01 67 42 00 28 F3 05 89 C8

首先形成的是String Of Data Bits (SODB),请参考标准文档7.2.3.1.1部分

01000010 00000000 00101000 11110011 00000101 10001001 1100

这个就是形成的SODB,转换成16进制,可以发现它就是上面码流的42 00 28 F3 05 89 C这一段。

然后要形成的是Raw Byte Sequence Packet (RBSP),它其实就是在SODB后面加上

RBSP trailing bits的结果,见标准文档7.2.3.1,目的是为了形成整数字节。

填充规则见标准文档的7.4.1部分,大概为先填充一个1(rbsp_stop_one_bit),然后都填充0(rbsp_alignment_zero_bit),所以对于上面的SODB,填充一个1,3个0之后,便得到了
01000010 00000000 00101000 11110011 00000101 10001001 11001000
即42 00 28 F3 05 89 C8

现在,码流的后面7个字节都得到了,现在要得到的是Extended Byte Sequence Packet (EBSP),它在RBSP基础上填加了仿校验字节,防止与起始码冲突,如果出现连续的三个字节00000000 00000000 000000xx,着插入一个0×03,变成00000000 00000000 00000003 000000xx。在上面的RBSP中没有出现这样的序列,所以木有改变什么。

最后在EBSP前面加上一个4字节的起始码00 00 00 01和一个NAL unit type字节就形成最后的Network Abstraction Layer Unit (NALU)

NAL unit type字节包含三个字段(具体含义见7.4.1):67 <==> 0 11 00111
forbidden_zero_bit,总为0
nal_ref_idc,2个bit,表示该NAL的重要性,是00的话,说明它可以被安全的丢弃,这里SPS的这个指为3(11),即最高值。参考RFC 3984。(现在知道这个字节叫作NAL unit type octet了)
nal_unit_type,5个bit,在7.4.1中的table 7-1中有说明。这里值为7(00111),表示NAL中是SPS,验证成功:-D

——————————————————————————————————————–

在JM代码中,输出SPS和PPS的实现在函数int start_sequence(ImageParameters *p_Img, InputParameters *p_Inp)中,有兴趣的小朋友自己研究研究吧。

最后把PPS的信息也贴出来:

pic_parameter_set_id = 0
seq_parameter_set_id = 0
entropy_coding_mode_flag = 0
pic_order_present_flag = 0
num_slice_groups_minus1 = 0
num_ref_idx_L0_active_minus1 = 4
num_ref_idx_L1_active_minus1 = 4
weighted_pred_flag = 0
weighted_bipred_idc = 0
pic_init_qp_minus26 = 0
pic_init_qs_minus26 = 0
chroma_qp_index_offset = 0
deblocking_filter_control_present_flag = 0
constrained_intra_pred_flag = 0
redundant_pic_cnt_present_flag = 0

 

转载自:http://lsharemy.com/wordpress/index.php/csit/jm-code-notes-1/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值