264杂

Nal_ref_idc:表示NAL的优先级.0~3,取值越大,表示当前NAL越重要,,需要优先受到保护,如果当前NAL是属于参考帧的
片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0.
Nal_unit_type:当前NAL单元的类型


SODB:数据比特串 --> 最原始的编码数据
RBSP:原始字节序列载荷 --> 在SODB的后面添加了结尾比特若干比特"0",以便字节对齐
EBSP:扩展字节序列载荷 --> 在RBSP基础上添加了仿校验字节(0x03)它的原因是:在NALU加到Annexb上时,需要添加
NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,0x00000001,否则用3位字节
表示0x000001,为了使用NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03,
解码时将0x03去掉,也称为脱壳操作


NALU头结构:0x 1(禁止位) 11(重要性指示位) 11111(NALU类型) 
NALU类型:1~12由h.264使用,24~31由h.264以外的应用使用.
重要性指示:标志该NAL单元用于重建时的重要性,值越大,越重要.
禁止位:网络发现NAL单元有比特错误时可设置该比特为1,以便接收方丢掉该单元.


处理过程:
1.将VCL层输出的SODB封装成nal_unit,Nal_unit是一个通用封装格式,可以适用于有序字节流方式和IP包交换方式.
2.针对不同的传送网络,将nal_unit封装成针对不同网络的封装格式.


VCL层输出的比特流SODB(string of data bits),到nal_unit之间,经过以下三步处理:
    1.SODB字节对齐处理后封装成RBSP(Raw Byte Sequence Payload).
    2.为防止RBSP的字节流与有序字节流传送方式下的SCP(start_code_prefix_one,0x000001)出现
    竞争,循环检测RBSP前三个字节,在出现字节竞争时在第三字节前加入emulation_prevention_three_byte(0x03),
    具体方法:(略)
NAL全称Network AbstractLayer,即网络抽象层.


在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面,视频编码层面(VCL)和网络抽象层面(NAL).
其中前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和
存储介质上的传输.




标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5及12的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。


0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息 (SEI)
7:序列参数集
8:图像参数集
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13 – 23:保留
24 – 31:未规定


profile_idc/level_idc/constraint_set_flags
seq_parameter_set_rbsp(){
    profile_idc;//profile_level
    
    constraint_set0_flag;
    constraint_set1_flag;
    constraint_set2_flag;
    reserved_zero_5bits;
    
    level_idc;//指明所用的level
    
    seq_parameter_set_id;
    log2_max_frame_num_minus4;
    pic_order_cnt_type;
    
    if(pic_order_cnt_type == 0)
        log2_max_pic_order_cnt_lsb_minus4;
    else if(pic_order_cnt_type == 1){
        delta_pic_order_always_zero_flag    
        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;
    gaps_in_frame_num_value_allowed_flag;
    pic_width_in_mbs_minus1;
    pic_height_in_map_units_minus1;
    frame_mbs_only_flag;
    
    if(!frame_mbs_only_flag)
        mb_adaptive_frame_field_flag;
    
    direct_8x8_inference_flag;
    
    frame_cropping_flag;
    if(frame_cropping_flag){
        frame_crop_left_offset;
        frame_crop_right_offset;
        frame_crop_top_offset;
        frame_crop_bottom_offset;
    }
    vui_parameters_present_flag;
    if(vui_parameters_present_flag){
        vui_parameters()
        rbsp_trailing_bits()
    }
}


h.264标准中也有3种熵解码方案:指数哥伦布解码,CAVLC解码和CABAC解码.
在标准中通过描述子(Descriptor)的形式来说明一个语法元素熵解码的方法.
Exp-Golomb的描述子有无符号指数哥伦布ue(v),有符号指数哥伦布se(v),截断
指数哥伦布te(v)和映射指数哥伦布me(v).


0阶指数哥伦布码字是一种有规则结构的码字,它的结构可以表示为
[M zeros][1][INFO]
其中M zeros称为前缀,由M个零组成,而M位INFO称为信息后缀.码字总长为2M+1
编码值索引code_num的值由以下方法得到:
    先读入M位前缀0直至遇到1为止,然后再读入M位INFO后缀,则code_num可以
计算为:
    code_num = 2^M + INFO -1;
则ue(v)从code_num到v的转换公式为v=code_num.




h264的句法和语义
    在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,
    它表示某个特定的物理意义,例如:宏块类型,量化参数等.句法表征句法元素的组织
    结构,语义阐述句法元素的具体含义.所有的视频编码标准都是通过定义句法和语义
    来规范编解码器的工作流程.
    
    码流是由一个个句法元素依次衔接组成的,码流中除了句法元素并不存在专门用于控制或同步的内容.
    将该图像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素.
    h.264中,句法元素共被组织成序列,图像,片,宏块,子宏块五个层次.
    
    
    
    
    
    
    
    
    

你可能感兴趣的:(网络,Parameters,NetWork,byte,Descriptor,h.264)