仗剑独行编辑为了能够在网络上进行更好的传输,首先将每幀图像划分为NAL单元,为了提高压缩率及错误处理能力提出了RBSP编码算法。
nal_unit(NumBytesInNALunit){//NumBytesInNALunit规定了NAL单元的大小forbidden_zero_bitnal_ref_idc//nal_ref_idc如果不为0,说明NAL单元的内容包含一个序列参数集或一个图像参数集,或一个参考图像条带,或一个参考图像的条带数据分割。
nal_unit_type//指明含在NAL单元中的RBSP数据结构的类型NumBytesInRBSP=0for(i=1;i<NumBytesInNALunit;i++){if(i+2<NumBytesInNALunit&&next_bits(24)==0x000003){rbsp_byte[NumBytesInRBSP++]//一个RBSP中的字节数。
rbsp_byte[NumBytesInRBSP++]i+=2emulation_prevention_three_byte//值等于0X03的字节,解码器不处理该字节。
}elserbsp_byte[NumBytesInRBSP++]}}RBSP根据格式可以分为:序列参数集SPS的RBSP,图像参数集PPS的RBSP,访问单元分隔符Slice data partition的RBSP,序列参数集扩展的RBSP,辅助增强信息SEI的RBSP,没有分割的条带层的RBSP,条带数据分割块A的RBSP,条带数据分割块B的RBSP,条带数据分割块C的RBSP,条带尾比特的RBSP,尾比特end of stream的RBSP.Seq_Parameter_Set_rbsp(){profile_idcconstraint_set0_flagconstraint_set1_flagconstraint_set2_flagreserved_z ero_5bits/*equal to0*/level_idcseq_parameter_set_idlog2_max_frame_num_minus4//可通过计算得到变量max_frame_num的值。
pic_order_cnt_type//指解码图像顺序的计数方法。
if(pic_order_cnt_type==0)log2_max_pic_order_cnt_lsb_minus4//通过计算得到图像顺序解码过程中的max_pic_order_cnt_lsb的值,log2_max_pic_order_cnt_lsb_minus4的取值在0到12之间。
else if(pic_order_cnt_type==1){delta_pic_order_always_z ero_flag//指示视频序列的条带头中是否有delta_pic_order_cnt[0]和delta_pic_order_cnt[1]两个字段。
offset_for_non_ref_pic//通过计算得到非参考图像的图像序列号。
offset_for_top_to_bottom_field//通过计算得到一个幀的底场的图像顺序号。
num_ref_frames_in_pic_order_cnt_cycle//指示图像顺序号的解码过程。
for(i=0;i<num_ref_frames_in_pic_order_cnt_cycle;i++)offset_for_ref_frame[i]//图像顺序号的解码过程中使用的一个num_ref_frames_in_pic_order_cnt_cycle值的列表中的一个元素。
}num_ref_frames//可能在视频序列中任何图像帧间预测的编码过程中用到的短期参考帧和长期参考帧,互补参考场对以及不成对的参考场的最大数量。
gaps_in_frame_num_value_allowed_flag//指示frame_num的允许值及解码过程。
pic_width_in_mbs_minus1//指示以宏块为单元的每个解码图像的宽度。
pic_height_in_map_units_minus1//指示以条带组映射为单元的以解码幀或场的高度。
frame_mbs_only_flagif(!frame_mbs_only_flag)//frame_mbs_only_flag如果值为0,表示编码视频序列的每个编码图像可能是编码幀或编码场,如值为1,则表示编码视频序列的每个编码图像都是一个仅含幀宏块的编码幀。
mb_adaptive_frame_field_flag//指示一个图像的幀和场宏块之间是否有交换。
direct_8x8_inference_flag//指示BxSKIP,B_direct16X16和B_direct8X8亮度运动矢量。
frame_cropping_flag//如果值为1,表示幀剪切偏移参数遵从视频序列参数集中的下一个值。
如果值为0,表示不存在幀剪切偏移参数。
if(frame_cropping_flag){frame_crop_left_offset//指示从解码过程中输出的编码图像序列中的图像样值以幀坐标中的一个矩阵区域的形式输出。
frame_crop_right_offsetframe_crop_top_offsetframe_crop_bottom_offset}vui_parameters_present_flagif(vui_parameters_present_flag)vui_parameters()rbsp_trailing_bits()}序列参数集扩展RBSPseq_partition_set_id//标识与序列参数集扩展有关的序列参数。
aux_format_idc//设置辅助编码图像信息。
bit_depth_aux_minus8//指示辅助编码图像的样点队列中样值的比特深度。
alpha_incr_flag//值为0表示alpha混合的目的每个解码辅助编码图像样点值的解释样点值等于解码辅助编码图像样点的值。
值为1表示alpha混合的目的在解码辅助编码图像样点之后,任何大于MIN(alpha_opaque_value,alpha_transparent_value)的辅助解码图像应加1,以得到辅助图像编码图像样点的解释样点值并且任何小于(alpha_opaque_value,alpha_transparent_value)的辅助解码图像样点应不改变,即可使用,像解码辅助编码图像样点值的解释样点值一样。
alpha_opaque_value//指示一个辅助编码图像样点的解释样点值,并且为alpha 混色,该解释样点值的同一个访问单元的相关的亮度和色度样点认为是不透明的。
alpha_transparent_value//指示一个辅助编码图像样点的解释样点值,并且为alpha混色,该解释样点值的同一个访问单元的相关的亮度和色度样点认为是透明的。
additional_extension_flag=0//表示在RBSP拖尾比特之前的视频序列参数集扩展语法结构中没有跟随额外的数,其值应等于0。
pic_parament_set_id//指示在条带头中提到的图像参数。
seq_parament_set_id//指示活动的序列参数集。
entropy_coding_mode_flag//指示与图像顺序数有关的语法元素是否出现在条带头中。
num_slice_groups_minus1//加1表示一个图像中的条带组数。
slice_group_map_type//表示条带组中条带组映射单元的映射是如何编码的,值为0表示隔行扫描带组。
值为1表示分数的条带组映射。
值为2表示一个或多个前景条带组和一个残余条带组。
值为3,4,5表示变换条带组。
值为6表示每个条带组映射单元清楚地分配一个条带组。
run_length_minus1[igroup]//用来指定条带映射单元的光栅扫描顺序中分配给第i个条带组的连续条带组映射单元的数目。
top_left[igroup]//表示一个矩形的左上角bottom_right[igroup]//表示一个矩形的右下角slice_Group_change_direction_flag//与slice_Group_map_type一起用来表示当slice_Group_map_type的值为3,4,5时精确的表示映射关系。
slice_Group_change_rate_flag//设置一个条带组的大小,从一个图像到下一个图像改变的倍数,以条带组映射单元为单位。
pic_size_in_map_unit_minus1用来指定图像中的条带组映射单元数。
slice_group_id[i]//指定光栅扫描顺序中的第i个条带组映射单元的一个条带组。
num_ref_idx_l0_active_minus1//指示参考图像列表0的最大参考索引号。
num_ref_idx_l1_active_minus1//指示参考图像列表1的最大参考索引号。
weighted_pred_flag//值为0表示加权的预测不应用于P和SP条带。
值为1表示在P和SP条带中应使用加权的预测。
weight_bipred_idc//值为0表示B条带采用默认的加权预测,值为1表示B条带采用具体指定的加权预测,值为2表示B条带采用隐含的加权预测。
pic_init_qp_minus26//表示每个条带的slice qpy初始值减26pic_init_qs_minus26//表示在SP或SI条带中的所有的宏块的slice qsy初始值减26 chroma_qp_index_offset//表示为在QPC值的表格中寻找Cb色度分量而应加到参数QPY和QSY上的偏移。
deblocking_filter_control_present_flag//值等于1表示控制去块效应滤波器的特征的一组语法元素将出现在条带头中。
值等于0表示控制去块效应滤波器的特征的一组语法元素将不会出现在条带头中。
contrained_intra_pred_flag//值为0表示幀内预测允许使用残余数据且使用幀内宏块预测方式编码,宏块的预测可以使用幀间宏块预测模式编码样值。
值为1表示变限制的幀内预测,在这种情况下,使用幀内宏块预测方式编码的宏块的预测仅使用残余数据和来自I或SI宏块类型的解码样值。
redundant_pic_cnt_press_flag()//值为0表示redundant_pic_cnt语法元素不会在条带头、图像参数集中指明(直接或与相应的数据分割A关联)的数据分割块B和数据分割块C中出现。