1.宏块的分块模式,在配置文件encoer_baseline.cfg中有
##########################################################################################
# Encoder Control
##########################################################################################
.....
InterSearch16x16 = 1 # Inter block search 16x16 (0=disable, 1=enable)
InterSearch16x8 = 1 # Inter block search 16x8 (0=disable, 1=enable)
InterSearch8x16 = 1 # Inter block search 8x16 (0=disable, 1=enable)
InterSearch8x8 = 1 # Inter block search 8x8 (0=disable, 1=enable)
InterSearch8x4 = 1 # Inter block search 8x4 (0=disable, 1=enable)
InterSearch4x8 = 1 # Inter block search 4x8 (0=disable, 1=enable)
InterSearch4x4 = 1 # Inter block search 4x4 (0=disable, 1=enable)
2.宏块的分块模式mode即bolcktype含义如下:1->(16*16),2->(16*8),3->(8*16),4->(8*8),5->(8*4),6->(4*8),7->(4*4),常量与分块模式(类型)相对应。
16x16, 16x8, 8x16(8×8)被称为宏块级,而8×8,8×4,4×8,4×4被称为亚宏块级。
3.在encode_one_macroblock(),在rdopt.c中,也就是编码一个宏块,其中做运动估计时需要调用函数PartitionMotionSearch (int blocktype, //宏块分块的类型
int block8x8, //分块的编号
double lambda) //拉格朗日系数
(1)bx0,by0是各个模式下分块的起始坐标,坐标的单位是4*4小块,原型为bx0[parttype][block8*8],by0bx0[parttype][block8*8],4个分块,所以block8*8=4,4种类型分割:mode=1,2,3,4 (parttype != 0),因为到mode>4的时候,parttype为4,即用parttype4代表所有的亚宏块分割。
//各种宏块模式下的子块的起始偏移量,相对4*4块来讲,这有利于运动矢量的存放
//[5]表示宏块的类型,[4]表示各种类型下的子块序号,最多子块情况为P8X8模式下有4个
int parttype = (blocktype<4?blocktype:4);//亚宏块的parttype都设为4
(2)step_h0,step_v0,step_h,step_v的含义。如果blocktype为1-4,step_h0与step_h相等,代表当前搜索块的高,同理另一组代表搜索块的宽。如果blocktype大于4,则step_h0为8*8块的高,step_h为blocktype类型的高,同理得宽。这是因为,8*8块是计算代价最小单位,8*8以下的分块代价需要累加起来。
(3)该函数其实主要是做运动搜索的流程控制,完成对各个分块以及参考帧的遍历工作,真正计算代价和进行运动搜索的是靠调用BlockMotionSearch函数来完成。