宏块到条带组的映射类型及解码

一、宏块到条带组的映射类型及解码

条带组是一个编码图象中若干宏块的一个子集,它可包含一个或若干个条带。在一个条带组中,每个条带的宏块按光栅扫描次序被编码,如果每幅图象仅取一个条带组,则该图象中所有的宏块均按光栅扫描次序被编码(除非使用ASO,即任意的条带次序,即一个编码帧中的条带之后可跟随任一解码程序的条带)。

还有一种条带组,叫灵活宏块次序(FMO),它可用灵活的方法,把编码宏块序列映射到解码图象中宏块的分配用宏块到条带组之间的映射来确定,它表示每一个MB属于哪个条带组。FMO能够提高错误恢复的性能,因为每个条带可以被独立解码。

宏块到条带组的各种映射类型如表1所示。

表1 宏块到条带组的各种映射类型

宏块到条带组的映射类型及解码_第1张图片

二、宏块到条带组的映射解码

slice_group_map_type是图像参数集PPS的语法元素,标识条带组映射单元到条带组的映射类型,该语法元素的取值范围为0到6,与表1中的Type对应。

num_slice_groups_minus1是PPS的语法元素,加1表示图像中的条带总数。该值为0表示图像中的所有条带都只属于一个条带组。当num_slice_groups_minus1的值为1,且slice_group_map_type的值为3、4和5时,条带组0和1的大小和形状由slice_group_change_direction_flag决定,如表2所示:

宏块到条带组的映射类型及解码_第2张图片

在这种情况下,MapUnitsInSliceGroup0 条带组映射单元按照规定的增长顺序分配给条带组0,图像的其他的PicSizeInMapUnits − MapUnitsInSliceGroup0个条带组映射单元分配到条带组1。

当num_slice_groups_minus1等于1并且slice_group_map_type等于4、5时:

sizeOfUpperLeftGroup = ( slice_group_change_direction_flag ?
               ( PicSizeInMapUnits − MapUnitsInSliceGroup0 ) : MapUnitsInSliceGroup0 )

在得到宏块到条带组的映射之前,要先得到条带组映射单元到条带组的映射,然后在将条带组映射单元到条带组的映射转换成宏块到条带组的映射。

如果num_slice_groups_minus1的值为0,说明图像中的所有条带都只属于一个条带组0,则:

mapUnitToSliceGroupMap[ i ] = 0。

如果num_slice_groups_minus1的值为1,则需要根据slice_group_map_type不同的值去获得mapUnitToSliceGroupMap。

获得mapUnitToSliceGroupMap之后,将其转换为宏块到条带组的映射MbToSliceGroupMap,过程如下所示:

if (frame_mbs_only_flag == 1 || field_pic_flag ==1) {
    MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ i ];
} else if (MbaffFrameFlag == 1) {
    MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ i / 2 ];
} else if (!frame_mbs_only_flag && !mb_adaptive_frame_field_flag && !field_pic_flag) {
    MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ ( i / ( 2 * PicWidthInMbs ) ) 
                                                    * PicWidthInMbs + ( i % PicWidthInMbs ) ];
}

你可能感兴趣的:(音视频编解码)