懒人李冰

记录我的生活、学习

HM源码分析(一):HEVC编码结构

本文主要记录了 HEVC 的编码时的分层处理架构和编码完成后码流的语法结构两个方面的学习。

编码分层处理架构

GOP(Group Of Pictures,GOP):若干时间连续的图像构成视频序列,视频序列分割成的图像组就为 GOP。GOP 分为封闭式 GOP 和 开放式 GOP,其中封闭式 GOP 其第一帧为 IDR, GOP内的图像不会参考到其他 GOP 内图像;开放式 GOP 只有第一个 GOP 内的第一帧才是 IDR,后续的 GOP 中的第一个帧内编码图像为 non-IDR,会参考前一个 GOP 中的已编码图像做参考图像。

Slice,每个 GOP 又被划分为多个 Slice 片,每个片由一个或多个片段(Slice Segment, SS) 组成。

CTU(Coding Tree Unit, CTU):每个 CTU 包括一个亮度树形编码块(Coding Tree Block, CTB) 和两个色差树形编码块。

一个 SS 在编码时,先被分割为相同大小的 CTU ,每个CTU 按照四叉树分割方式被划分为不同类型的编码单元(Coding Unit, CU)。

码流的语法架构

VPS(Video Parameter Set):视频参数集,主要用于传输视频分级信息,包含多个子层和操作点共享的语法元素、会话所需要的有关操作的关键信息(档次/级别等)、其他不属于 SPS 的操作点特性信息(如HRD)。

SPS(Sequence Parameter Set):序列参数集,主要包含一个 CVS 中所有编码图像的共享编码参数。如图像格式信息(采样格式/图像分辨率/量化深度/Crop信息)、编码参数信息(编码块/变换块的尺寸等)、与参考图像相关的信息、可视话可用性信息(VUI)等。

PPS(Picture Parameter Set):图像参数集。主要包括编码工具的可用性标志、量化过程相关的句法元素、Tile 相关句法元素、去方块滤波相关句法元素、片头中的控制信息。

由上图可看出,SPS 会根据 parse 出来的VPS index来引用 VPS 的信息,同样的 PPS 会根据 parse 出来的SPS index来引用 PPS 的信息。当 SPS 中包含有 VPS 的信息时,使用 SPS 的信息,VPS内的信息失效,同样的当 PPS 中含有 SPS 的信息时,使用 PPS 中的信息,SPS 中的信息失效。

参考内容:新一代高效视频编码H.265/HEVC:原理、标准与实现第三章编码结构。

HM中关于VPS SPS PPS编码结构的介绍主要在lib\tlibcommon\TComSlice.h内,稍后会对它们进行详细分析。

官方参考 code 中,有定义如下的类结构。

TComReferencePictureSetTComRPSListTComScalingListProfileTierLevel TComPTLHrdSubLayerInfoTComHRDTimingInfoTComVPSWindowTComVUI TComSPSTComRefPicListModificationTComPPSTComSlice

它们之间的结构关系如下:

VPS syntax 分析

VPS 中有关于 timing info 的信息,其中的 syntax vps_timing_info_present_flag表示是否含有 timing info 信息。 其中的vps_num_units_in_tickvps_time_scale可以用于计算 FPS,FPS = vps_time_scale / vps_num_units_in_tick,其实FPS的计算,除了在 VPS 中 有这样的信息外,还在 SPS 中同样有类似的信息FPS = sps_vui_time_scale/sps_vui_num_units_in_tick

VPS 中有关 timing info 的信息,除了可以计算 FPS 外,还有hrd_parametersprofile_tier_level等信息。

SPS syntax 分析

跟 VPS 一样,SPS 中同样包含了profile_tier_level的信息。除此之外,还有pic_width_in_luma_samplespic_height_in_luma_samples分别代表了视频的宽高信息,例如(1920x1080)。代表对解码图像裁剪输出的 conformance_window 信息,包括conf_win_left_offsetconf_win_right_offsetconf_win_top_offset conf_win_bottom_offset。代表码流 bit_depth 的bit_depth_luma_minus8bit_depth_chroma_minus8等。 还包括scaling_list_data,表示参考帧信息的short_term_ref_pic_setlong_term_ref_pics。可视化可用信息 vui_parameters等等。

PPS syntax 分析

PPS 中同样包含了scaling_list_data、QP信息(如init_qp_minus26pps_cb_qp_offsetpps_cr_qp_offset)、Tile 相关信息(如num_tile_columns_minus1num_tile_rows_minus1)、 与去方块滤波相关信息(如deblocking_filter_override_enabled_flag)。

SEI syntax 分析

目前遇到的 SEI 信息包括pic_timinghdr_compatibility_infocontent_light_level_info等。

Profile Tier And Level syntax 分析

包含了用于指示图片是 progressive 和 interlaced 的general_progressive_source_flaggeneral_interlaced_$ source_flag。其中的 Profile包括 Main、Main10、STILLPICTURE等。Tier包括 Main、HIGH。Level又包括LEVLE1LEVLE2LEVLE6等,不同的tier和level对应不同的 Max luma sample rateMax luma picture sizeMax bit ratepicture resolution等信息。