H.264 SPS、PPS详解

目录

一、SPS、PPS概述

二、SPS、PPS语意

2.1 SPS语意

2.2 PPS语意

三、指数哥伦布熵编码

3.1 无符号指数哥伦布熵编码 ue(v)

3.2 有符号指数哥伦布熵编码 se(v)

3.3 映射指数哥伦布熵编码 me(v)

3.4 截断指数哥伦布熵编码 te(v)

一、SPS、PPS概述

1、写在前面:学习的时候一定要参考官方文档,不同资料有歧义的地方以官方文档为准。

(1) 官方文档(中文版可以参考 2005年3月这一版):

H.264 : Advanced video coding for generic audiovisual services

2、SPS(Sequence Paramater Set)又称作序列参数集。对应的是针对一段连续编码视频序列的参数。包含 帧数、POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等信息。

3、PPS(Picture Parameter Set)又称作图像参数集。对应的是一个序列中某一副图像或者某几幅图像的参数。包含 熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等信息。

4、SPS、PPS的内容都是编码器写入的。解码时,解码器一开始要收到SPS、PPS来做初始化,如果H.264码流中没有SPS或PPS的话,解码器是无法解析码流数据,自然是无法播放。如果编码参数改变,则还需要一组新的SPS、PPS。

5、H.264流行的NALU包装格式有annexB和avcC,SPS和PPS的数据形式也不同。

(1)在annexB格式中,SPS、PPS在nalu中,nalu header->nal_unit_type=7时,nalu payload中是SPS,nalu header->nal_unit_type=8时,nalu payload中是PPS。这种格式下SPS、PPS通常放在关键帧之前。

(2)在avcC格式中SPS、PPS在extradata中,这种格式下SPS/PPS的存放位置和帧数据无关。例如普通模式下的mp4,SPS、PPS放在MOOV中,在帧数据后面。(H.264 NALU详解_~小生的博客-CSDN博客

二、SPS、PPS语意

1、在标准文档中,都是用三列表格描述SPS/PPS:

第一列,写的是语法元素和语法规则;第二列,写的是分类信息。第三列,写的是该行语法元素的描述信息,就是这个元素采用什么编码方式,占用多少空间,又被称作描述子。u(n):无符号整数,n bit长度。ue(v):无符号指数哥伦布熵编码。se(v):有符号指数哥伦布熵编码。

2、码流中读到的SPS、PPS中的某些字段数据是经过一次编码之后的数据,并不是原始数据。这个过程被称之为熵编码,熵编码是一类编码的总称,在SPS和PPS中主要使用的是一种叫做指数哥伦布编码的熵编码算法。

        在官方文档的描述中,如果第三列是ue(v)或se(v)字样,则说明对应字段的数据经过编码,读到数据之后需要先解码,然后才能获得真实的数据。如果第三列是u(8),则说明此字段没有经过编码,读取的数据就是原始数据。如下图所示,level_idc没有经过编码,seq_parameter_set_id经过了编码。

2.1 SPS语意

(1)profile_idc:标识当前H.264码流的profile,例如baseline profile、main profile、extended profile、High、High 10、High 4:2:2、High 4:4:4等。

(2)constraint_set0_flag ~ constraint_set5_flag:在编码的档次方面对码流增加的其它一些额外限制性条件。

(3)reserved_zero_4bits:应等于0。reserved_zero_4bits的其它取值将由 ITU-T | ISO/IEC 未来规定。解码器将忽略reserved_zero_4bits的值。

(4)level_idc:标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。例如,level_idc = 0x1e = 30,因此码流的级别为3。

(5)seq_parameter_set_id:表示当前的序列参数集的id。通过该id值,图像参数集PPS可以引用其代表的SPS中的参数。

(6)chroma_format_idc:与亮度取样对应的色度取样chroma_format_idc不存在时,默认值是1,表示yuv420。

(7)residual_colour_transform_flag:等于1时,应用 H.264标准文档 中中 8.5 节规定的残余颜色变换。等于0时则不使用残余颜色变换。当residual_colour_transform_flag不存在时,默认值为 0。

(8)bit_depth_luma_minus8:是指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移QpBdOffsetY,如下所示

        BitDepthY = 8 + bit_depth_luma_minus8

        QpBdOffsetY = 6 * bit_depth_luma_minus8

当bit_depth_luma_minus8不存在时,应推定其值为0。bit_depth_luma_minus8取值范围应该在0到4之间(包括0和4)。

(9)bit_depth_chroma_minus8:是指色度队列样值的比特深度以及色度量化参数范围的取值偏移QpBdOffsetC,如下所示

        BitDepthC = 8 + bit_depth_chroma_minus8

        QpBdOffsetC = 6 * ( bit_depth_chroma_minus8 + residual_colour_transform_flag )

当bit_depth_chroma_minus8不存在时,应推定其值为0。bit_depth_chroma_minus8取值范围应该在0到4之间(包括0和4)。

(10)qpprime_y_zero_transform_bypass_flag:等于1时是指当QP’Y等0时变换系数解码过程的变换旁路操作和图像构建过程将会在 H.264标准文档 中第 8.5 节给出的去块效应滤波过程之前执行。等于0时是指变换系数解码过程和图像构建过程在去块效应滤波过程之前执行而不使用变换旁路操作。当qpprime_y_zero_transform_bypass_flag没有特别指定时,应推定其值为0。

(11)seq_scaling_matrix_present_flag:等于1时表示存在i=0..7的标志 seq_scaling_list_present_flag[i]。等于0时则表示不存在这些标志并且由Flat_4x4_16表示的序列级别的缩放比例列表应被推断出来(对应i=0..5),由Flat_8x8_16表示的序列级别的缩放比例列表应被推断出来(对应i=6..7)。当seq_scaling_matrix_present_flag没有特别指定时,应推定其值为0。

(12)seq_scaling_list_present_flag[i]:等于1时是指视频序列参数集中存在缩放比例列表i的语法结构。等于0时表示视频序列参数集中不存在缩放比例列表i的语法结构并且在 H.264标准文档 中表 7-2 中列出的缩放比例序列后退规则集A应用于以i值为索引的序列级别的缩放比例列表。

(13)log2_max_frame_num_minus4:用于计算MaxFrameNum的值。计算公式为MaxFrameNum = 2^(log2_max_frame_num_minus4 + 4)。MaxFrameNum是frame_num的上限值,frame_num是图像序号的一种表示方法,在帧间编码中常用作一种参考帧标记的手段。

(14)pic_order_cnt_type:表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。

(15)log2_max_pic_order_cnt_lsb_minus4:用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)。

(16)delta_pic_order_always_zero_flag:等于1时表示视频序列的条带头中没有 delta_pic_order_cnt[0]和delta_pic_order_cnt[1]两个字段,它们的值都默认为0。等于0时表示视频序列的条带头中包含delta_pic_order_cnt[0]字段,并可能包括delta_pic_order_cnt[1]的字段(也可以不包括)。

(17)offset_for_non_ref_pic:用于计算 H.264标准文档 中 8.2.1 节规定的一个非参考图像的图像顺序号。offset_for_non_ref_pic的取值范围是-2^31到2^31-1(包括-2^31和2^31-1)。

(18)offset_for_top_to_bottom_field:用于计算 H.264标准文档 中 8.2.1 节规定的一个帧的底场的图像顺序号。offset_for_top_to_bottom_field的取值范围是-2^31到2^31-1(包括-2^31和2^31-1)。

(19)num_ref_frames_in_pic_order_cnt_cycle:用于 H.264标准文档 中 8.2.1 节规定的图像顺序号的解码过程。num_ref_frames_in_pic_order_cnt_cycle的取值范围是0到255(包括0和 255)。

(20)offset_for_ref_frame[i]:是在 H.264标准文档 中 8.2.1 节规定的图像顺序号的解码过程中使用的一个num_ref_frames_in_pic_order_cnt_cycle值的列表中的一个元素。offset_for_ref_frame[i]的取值范围是-2^31到2^31-1(包括-2^31和2^31-1)。

(21)num_ref_frames:规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames字段也决定了 H.264标准文档 中 8.2.5.3 节规定的滑动窗口操作的大小。num_ref_frames的取值范围应该在0到MaxDpbSize(参见 H.264标准文档 中A.3.1或A.3.2节的定义)范围内,包括0和MaxDpbSize。

(22)gaps_in_frame_num_value_allowed_flag:表示 H.264标准文档 中 7.4.3 节给出的 frame_num的允许值以及在 8.2.5.2 节给出的frame_num值之间存在推测的差异的情况下进行的解码过程。

(23)pic_width_in_mbs_minus1:加1是指以宏块为单元的每个解码图像的宽度。

        以宏块为单元的图像宽度: PicWidthInMbs = pic_width_in_mbs_minus1 + 1

        亮度分量的图像宽度: PicWidthInSamplesL = PicWidthInMbs * 16

        色度分量的图像宽度: PicWidthInSamplesC = PicWidthInMbs * MbWidthC

(24)pic_height_in_map_units_minus1:加1表示以条带组映射为单位的一个解码帧或场的高度。变量PicHeightInMapUnits和PicSizeInMapUnits由下列公式得出:

        PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1

        PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits

(25)frame_mbs_only_flag:等于0时表示编码视频序列的编码图像可能是编码场或编码帧。等于1时表示编码视频序列的每个编码图像都是一个仅包含帧宏块的编码帧。

        变量pic_height_in_map_units_minus1的语义依赖于变量frame_mbs_only_flag。如果frame_mbs_only_flag等于0,pic_height_in_map_units_minus1加1就表示以宏块为单位的一场的高度。否则(frame_mbs_only_flag等于1),pic_height_in_map_units_minus1加1就表示以宏块为单位的一帧的高度。变量FrameHeightInMbs由公式得出:

        FrameHeightInMbs = ( 2 – frame_mbs_only_flag ) * PicHeightInMapUnits

(26)mb_adaptive_frame_field_flag:等于0表示在一个图像的帧和场宏块之间没有交换。 mb_adaptive_frame_field_flag等于1表示在帧和帧内的场宏块之间可能会有交换。当 mb_adaptive_frame_field_flag没有特别规定时,默认其值为0。

(27)direct_8x8_inference_flag:表示在 H.264标准文档 中 8.4.1.2 节中规定的B_Skip、B_Direct_16x16和B_Direct_8x8亮度运动矢量的计算过程使用的方法。当frame_mbs_only_flag等于0时direct_8x8_inference_flag应等于1。

(28)frame_cropping_flag:等于1时表示帧剪切偏移参数遵从视频序列参数集中的下一个值。frame_cropping_flag等于0表示不存在帧剪切偏移参数。

(29)frame_crop_left_offset、frame_crop_right_offset、frame_crop_top_offset、frame_crop_bottom_offset:是指从解码过程中输出的编码图像序列中的图像样值以帧坐标中的一个矩阵区域的形式输出。

        变量CropUnitX和CropUnitY由下列公式得出:

        如果chroma_format_idc等于0:

                CropUnitX = 1

                CropUnitY = 2 - frame_mbs_only_flag

        如果chroma_format_idc等于1、 2或3:

                CropUnitX = SubWidthC

                CropUnitY = SubHeightC * ( 2 - frame_mbs_only_flag )

        帧剪切矩形包括水平帧坐标从CropUnitX * frame_crop_left_offset到PicWidthInSamplesL - ( CropUnitX * frame_crop_right_offset + 1 )且垂直帧坐标从CropUnitY * frame_crop_top_offset到( 16 * FrameHeightInMbs ) - ( CropUnitY * frame_crop_bottom_offset + 1 )的亮度样点。

        frame_crop_left_offset的值应在0到( PicWidthInSamplesL / CropUnitX ) - ( frame_crop_right_offset + 1 )范围内(包括边界值),frame_crop_top_offset的值应在0到( 16 * FrameHeightInMbs / CropUnitY ) - ( frame_crop_bottom_offset + 1 )范围内(包括边界值)。

        当frame_cropping_flag等于0时,frame_crop_left_offset、frame_crop_right_offset、 frame_crop_top_offset和frame_crop_bottom_offset的值应等于0。

        当chroma_format_idc 不等于0时,两个色度队列的相应的指定样点是那些帧坐标为(x / SubWidthC, y / SubHeightC)的样点,其中(x,y)是指定的亮度样点的帧坐标。

        对于解码场,解码场的指定样点是那些帧坐标落在指定的矩形当中的样点。

(30)vui_parameters_present_flag:等于1时表示 H.264标准文档 中存在附录E提到的vui_parameters()语法结构 。等于0时表示不存在附录E提到的vui_parameters()语法结构。

2.2 PPS语意

(1)pic_parameter_set_id:表示当前PPS的id。某个PPS在码流中会被相应的slice引用,slice引用PPS的方式就是在Slice header中保存PPS的id值。该值的取值范围为0到255(包括0和255)。

(2)seq_parameter_set_id:表示当前PPS所引用的激活的SPS的id。通过这种方式,PPS中也可以取到对应SPS中的参数。该值的取值范围为0到31(包括0和31)。

(3)entropy_coding_mode_flag:熵编码模式标识,该标识位表示码流中熵编码/解码选择的算法。对于部分语法元素,在不同的编码配置下,选择的熵编码方式不同。例如在一个宏块语法元素中,宏块类型mb_type的语法元素描述符为“ue(v)|ae(v)”,在baseline profile等设置下采用指数哥伦布编码,在main profile等设置下采用CABAC编码。标识位entropy_coding_mode_flag的作用就是控制这种算法选择。当该值为0时,选择左边的算法,通常为指数哥伦布编码或者CAVLC;当该值为1时,选择右边的算法,通常为CABAC。(H264码流中SPS PPS详解 - 知乎

(4)pic_order_present_flag:等于1时表示与图像顺序数有关的语法元素将出现于条带头中,如  H.264标准文档 中 7.3.3 节所规定。pic_order_present_flag等于0时表示条带头中不会出现与图像顺序数有关的语法元素。

(5)num_slice_groups_minus1:加1表示一个图像中的条带组(slice group)数。等于0时,图像中所有的条带属于同一个条带组。num_slice_groups_minus1的允许取值范围在 H.264标准文档 中附件A中给出。

(6)slice_group_map_type:表示条带组中条带组映射单元的映射是如何编码的。取值范围应该在0到6内(包括0和6)。

        slice_group_map_type等于0表示隔行扫描的条带组。

        slice_group_map_type等于1表示一种分散的条带组映射。

        slice_group_map_type等于2表示一个或多个前景条带组和一个残余条带组。

        slice_group_map_type等于3、4和5表示变换的条带组。当num_slice_groups_minus1不等于 1时,slice_group_map_type不应等于3、4或5。

        slice_group_map_type等于6表示对每个条带组映射单元清楚地分配一个条带组。条带组映射单元规则:(1)如果frame_mbs_only_flag等于0,mb_adaptive_frame_field_flag等于1,而且编码图像是一个帧,那么条带组映射单元就是宏块对单元。(2)如果frame_mbs_only_flag等于1或者一个编码图像是一个场,条带组映射单元就是宏块的单元。(3)如果frame_mbs_only_flag等于0,mb_adaptive_frame_field_flag等于0,并且编码图像是一个帧,条带组映射单元就是像在一个MBAFF帧中的一个帧宏块对中一样垂直相邻的两个宏块的单元。

(7)run_length_minus1[i]用来指定条带组映射单元的光栅扫描顺序中分配给第i个条带组的连续条带组映射单元的数目。run_length_minus1[i]的取值范围应该在0到PicSizeInMapUnits-1内(包括边界值)。

(8)top_left[i]和bottom_right[i]分别表示一个矩形的左上角和右下角。top_left[i]和bottom_right[i] 是条带组映射单元所在图像的光栅扫描中的条带组映射单元位置。对于每个矩形i,语法元素 top_left[i]和bottom_right[i]的值都应该遵从下面所有的规定。

        top_left[i]应小于或等于bottom_right[i]并且bottom_right[i]应小于PicSizeInMapUnits。

     (top_left[i]%PicWidthInMbs)应小于或等于(bottom_right[i]%PicWidthInMbs)的值。

(9)slice_group_change_direction_flag:通常与slice_group_map_type一起用来表示当 slice_group_map_type的值为3、4或5时精确的映射类型。

(10)slice_group_change_rate_minus1:用来指定变量SliceGroupChangeRate, SliceGroupChangeRate = slice_group_change_rate_minus1 + 1。SliceGroupChangeRate表示一个条带组的大小从一个图像到下一个的改变的倍数,以条带组映射单元为单位。slice_group_change_rate_minus1的值应该在0到PicSizeInMapUnits-1的范围内(包括边界值)。

(11)pic_size_in_map_units_minus1:用来指定图像中的条带组映射单元数。pic_size_in_map_units_minus1 = PicSizeInMapUnits - 1。

(12)slice_group_id[i]:表示光栅扫描顺序中的第i个条带组映射单元的一个条带组。slice_group_id[i]语法元素的大小是Ceil(Log2(num_slice_groups_minus1 + 1))比特。 slice_group_id[i]的值应该在0到num_slice_groups_minus1范围内(包括边界值)。

(13)num_ref_idx_l0_active_minus1:表示参考图像列表0的最大参考索引号,该索引号将用来在一幅图像中num_ref_idx_active_override_flag等于0的条带使用列表0预测时,解码该图像的这些条带。当MbaffFrameFlag等于1时,num_ref_idx_l0_active_minus1是帧宏块解码的最大索引号值,而2 * num_ref_idx_l0_active_minus1 + 1是场宏块解码的最大索引号值。num_ref_idx_l0_active_minus1的值应该在0到31的范围内(包括0和31)。

(14)num_ref_idx_l1_active_minus1:与num_ref_idx_l0_active_minus1具有同样的定义,只是分别用11和列表1取代10和列表0。

(15)weighted_pred_flag:等于0时表示加权的预测不应用于P和SP条带。等于1时表示在P和SP条带中应使用加权的预测。

(16)weighted_bipred_idc:等于0时表示B条带应该采用默认的加权预测。等于1时表示B条带应该采用具体指明的加权预测。weighted_bipred_idc等于2表示B条带应该采用隐含的加权预测。weighted_bipred_idc的值应该在0到2之间(包括0和2)。

(17)pic_init_qp_minus26:表示每个条带的SliceQPY初始值减26。当解码非0值的 slice_qp_delta时,该初始值在条带层被修正,并且在宏块层解码非0值的mb_qp_delta时进一步被修正。pic_init_qp_minus26的值应该在-(26+QpBdOffsetY)到+25之间(包括边界值)。

(18)pic_init_qs_minus26:表示在SP或SI条带中的所有宏块的SliceQSY初始值减26。当解码非 0值的slice_qs_delta时,该初始值在条带层被修正。pic_init_qs_minus26的值应该在-26到+25之间(包括边界值)。

(19)chroma_qp_index_offset:表示为在QPC值的表格中寻找Cb色度分量而应加到参数QPY和 QSY上的偏移。chroma_qp_index_offset的值应在-12到+12范围内(包括边界值)。

(20)deblocking_filter_control_present_flag:等于1时表示控制去块效应滤波器的特征的一组语法元素将出现在条带头中。等于0时表示控制去块效应滤波器的特征的一组语法元素不会出现在条 带头中,并且它们的推定值将会生效。

(21)constrained_intra_pred_flag:等于0时表示帧内预测允许使用残余数据,且使用帧内宏块预测模式编码的宏块的预测可以使用帧间宏块预测模式编码的相邻宏块的解码样值。等于1时表示受限制的帧内预测,在这种情况下,使用帧内宏块预测模式编码的宏块的预测仅使用残余数据和来自I或SI宏块类型的解码样值。

(22)redundant_pic_cnt_present_flag:等于0时表示redundant_pic_cnt语法元素不会在条带头、图像参数集中指明(直接或与相应的数据分割块A关联)的数据分割块B和数据分割块C中出现。redundant_pic_cnt_present_flag等于1表示redundant_pic_cnt语法元素将出现在条带头、图像参数集中指明(直接或与相应的数据分割块A关联)的数据分割块B和数据分割块C中。

(23)transform_8x8_mode_flag:等于1时表示8x8变换解码过程可能正在使用(参见 H.264标准文档 中 8.5 节)。等于0时表示未使用8x8变换解码过程。当transform_8x8_mode_flag不存在时,默认其值为0。

(24)pic_scaling_matrix_present_flag:等于1时表示存在用来修改在序列参数集中指定的缩放比例列表的参数。等于0时表示用于该图像中的缩放比例列表应等于那些由序列参数集规定的。当pic_scaling_matrix_present_flag不存在时,默认其值为0。

(25)pic_scaling_list_present_flag[i]:等于1时表示存在缩放比例列表的语法结构并用于指定序号为i的缩放比例列表。等于0时表示在图像参数集中不存在缩放比例列表i的语法结构,并且根据 seq_scaling_matrix_present_flag的值,应用下列条款:如果seq_scaling_matrix_present_flag等于0时,H.264标准文档 中表7-2中指定的缩放比例列表后退规则集A应用于获取序号为i的图像级缩放比例列表。seq_scaling_matrix_present_flag等于1时,H.264标准文档 中表7-2中指定的缩放比例列表后退规则集B应用来获取序号为i的图像级缩放比例列表。

(26)second_chroma_qp_index_offset:表示为在QPC值的表格中寻找Cr色度分量而应加到参数 QPY和QSY上的偏移。second_chroma_qp_index_offset的值应在-12到+12范围内(包括边界值)。当 second_chroma_qp_index_offset不存在时,默认其值等于chroma_qp_index_offset。

三、指数哥伦布熵编码

1、指数哥伦布编码(Exponential-Golomb coding, Exp-Golomb)是一种通用的无损压缩编码方法,由Teuhola在1978年提出。在H.264中,指数哥伦布编码又分成了4种:无符号指数哥伦布熵编码ue(v)、有符号指数哥伦布熵编码se(v)、映射指数哥伦布熵编码me(v)、截断指数哥伦布熵编码 te(v)。

2、SPS、PPS中主要使用的是指数哥伦布编码中的无符号指数哥伦布熵编码ue(v)、有符号指数哥伦布熵编码se(v)。

3.1 无符号指数哥伦布熵编码 ue(v)

1、编码范围仅限大于等于0的数。

2、编码算法(指数哥伦布熵编码-ZigZagSin

(1)先把要编码的数字加1,假设我们要编码的数字是4,那么我们先对4加1,就是5。

(2)将加1后的数字5先转换成二进制,就是:101。

(3)转化成二进制之后,在二进制数之前补二进制位数减1个0。例如,101有3位,那么我们应该在前面补两个0。最后,4进行无符号指数哥伦布编码之后得到的二进制码流就是00101。

3、为什么第3步要补0?

假设我们有两个数字,4和5,我们想要将这两个数字编码成一路二进制数据。

(1)不补0时:

4经过前2步编码后的数据是:101。

5经过前2步编码后的数据是:110。

然后我们把这两组二进制数据收尾相连就是:101110。

然后问题来了,这样的数据没办法知道里面到底编码了几个数字,所以也根本没有办法进行解码。

(2)补0时:

4经过前3步编码后的数据是:00101。

5经过前3步编码后的数据是:00110。

然后我们把这两组二进制数据收尾相连就是:0010100110

其实补0就是指明了需要解码的二进制数的长度,在解码的时候,先读0,读到的几个连续的0,就可以推断出需要解码的二进制数的长度,由此就可以成功解码。

4、为什么第1步要加1?

因为第3步通过补0来表示数据的长度,如果要编码的数据是0不加1,则会和补充的0冲突。所以要先加1再编码。0编码后的值就是1。

3.2 有符号指数哥伦布熵编码 se(v)

1、编码范围包括负数、0、正数,相当于是对ue(v)的扩展。

2、编码算法(指数哥伦布熵编码-ZigZagSin

(1)先把要编码的数字取绝对值后转换成二进制,例如我们要编码的数字是-5,取绝对值就是5 ,转换成二进制就是101。

(2)在二进制序列后增加一位符号位:0表示正,1表示负。二进制序列就变成了1011。

(3)在二进制数之前补二进制位数减1个0。二进制序列就变成了0001011。

2、规定0的有符号指数哥伦布熵编码的二进制序列为1。(编码算法之指数哥伦布编码_有符号哥伦布编码解码-CSDN博客

3.3 映射指数哥伦布熵编码 me(v)

1、映射指数哥伦布熵编码提供了一个码表,当遇到一段数据的时候,先用无符号指数哥伦布熵编码ue(v)进行解码,然后得到的结果其实是一个映射表的索引,最后查表得到真实数据。例如,通过ue(v)解码出的数据是2,然后去查表,2对应的数字就是最终结果。

2、对于不同的情况,映射指数哥伦布熵编码可能会选择不同的码表。

3、指数哥伦布熵编码有个特性,那就是数字越大,占用的空间将会越大。那么如果我们要编码的数字集中在某一个区间比较小的范围,而这个范围内的数字又比较大,有没有什么办法能够节省一些空间呢?为了解决这个问题,就出现了映射指数哥伦布熵编码,通过一个映射表可以只编码一个很小的数字来得到一个很大的数字。

3.4 截断指数哥伦布熵编码 te(v)

1、当语法元素以截断指数哥伦布解码时,首先需要判断的是语法元素的取值范围,假定为[0, x], x≥1。根据x的取值情况,语法元素根据不同情况进行解析。若 x>1,解析方法同无符号指数哥伦布熵编码ue(v)相同。若 x=1 ,语法元素值等同于下一位bit值的取反。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值