(这一届内容不太友好,没看懂,后面会回顾重新理解)
解码器在对每个片解码之前,首先需要基于当前有效图像参数集和需解码的片头,产生“宏块片组映射图”变量MbToSliceGroupMap,该变量对于一个接入单元中的所有片均有效。当num_slice_groups_minus1等于1而且slice_group_map_type等于3、4或5时,片组0和1的大小和形状根据下表由“片组变化方向标记”slice_group_change_direction_flag确定。

按照定义的增长顺序的片组图单元MapUnitsInSliceGroup0被分配给片组0,剩余的片组图单元PicSizeInMapUnits-MapUnitsInSliceGroup0被分配给片组1。
当num_slice_groups_minus1等于1且slice_group_map_type等于4或5时,标记左上片组大小的变量sizeOfUpperLeftGroup这样定义:当片组变化方向标记=1时,该变量大小等于PicSizeInMapUnits-MapUnitsInSliceGroup0,否则等于MapUnitsInSliceGroup0。
变量mapUnitToSliceGroupMap的计算方法参见下方流程图。

在上图的前景左切出类型中,在从0到PicSizeInMapUnits–1之间至少存在一个i,满足
mapUnitToSliceGroupMap[i]等于iGroup(对于每个从0到num_slice_groups_minus1的iGroup 值)即每个片组中至少包含一个片组图单元。此时片组覆盖区域的矩形可能重叠。片组0 包含处于
top_left[0]和bottom_right[0]定义的矩形内部的所有宏块。一个ID大于0且小于num_slice_groups_minus1的片组包含所定义的矩形所覆盖的宏块,且这些宏块没有被ID较小的片组覆盖。ID等于num_slice_groups_minus1的片组包含没有被别的片组覆盖的宏块。
计算出mapUnitToSliceGroupMap后,会调用下面将要描述的片组图单元转换成宏块片组图的过
程将片组图单元mapUnitToSliceGroupMap转换成宏块片组映射图MbToSliceGroupMap,完成转换后,调用函数NextMbAddress(n)计算变量nextMbAddress,函数流程如下图所示。

在片组图单元转换成宏块片组图的过程规定如下:
- 如frame_mbs_only_flag等于1或field_pic_flag等于1,宏块片组图设置为:

- 如MbaffFrameFlag等于1,宏块片组图设置为:

- 否则(即frame_mbs_only_flag等于0且mb_adaptive_frame_field_flag等于0且field_pic_flag等于0),宏块片组图设置为:

其中i 表示从0 到PicSizeInMbs – 1 的每个值。
本文详细解析了解码器如何通过宏块片组映射图 MbToSliceGroupMap 来组织和解码视频数据,涉及片组划分、大小确定和映射计算,特别关注了num_slice_groups和slice_group_map_type对片组结构的影响。
1378

被折叠的 条评论
为什么被折叠?



