I 编码器project中的主要文件说明:搜索算法模块
Lencod.c文件作为main函数所在的文件,体现了整个编码器的处理流程。对于image,picture, slice, macroblock, block(submacroblock,partition)等主要的数据结构,构成了进行编解码的处理对象。对于模式确定,是和rd计算分不开的,还有就是运动向量的确定。在进行运动估计(ME)时,JM12.0采用了5种不同的搜索算法。对不同搜索算法的研究,主要是算法思想,算法采用的数据结构,算法的具体实现编码技巧,算法的执行效率和分析。今天的研究主要是搞清楚了螺旋搜索方式下的搜索中心点的选择方法。该实现可参见代码实现。
II 变量含义:
mv-search.c中,
static int bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}};
static int by0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,0,0,0}, {0,0,2,2}};
指示了在一个macroblock进行搜索或预测的起始位置
类似的结构在PartitionMotionSearch中也有出现
注意,BlockType可以为1,2,3,4,5,6,7,当BlockType>=4时,PartType=4
当PartType为1时,Block8x8只能为0
当PartType为2,3时,Block8x8为0或者1
当PartType为4时,Block8x8为0,1,2,3
当PartType为1时,Block8x8=0 查询by0和bx0得到v=h=0
表示这时的LumaPrediction4x4的位置从macroblock的左上角开始. v的单位是block4x4。预测的范围由step_v0和step_h0指定,实际上就是以block4x4为单位的分块大小。
当parttype=2时,依据block8x8的取值(0或者1)
h,v的取值分别是 h=v=0 (左上角)
h=0 v=2 (下面分块的坐上角)
parttype=3的情况类推,h=v=0(左边分块),h=2 v=0(右边分块)
parttype=4时 实际上macroblock作了P8x8的分块
这是 依据block8x8的取值(0,1,2,3)
h,v分别是
0,0
2,0
0,2
2,2
III JM中mode的含义
From:lencod.c(1540)
Intra | Mode used
Mode 0 intra 4x4
Mode 1 intra 8x8
(Mode 2+ intra 16x16
Mode intra IPCM
Inter | Mode used
Mode 0 (copy)
Mode 1 (16x16)
Mode 2 (16x8)
Mode 3 (8x16)
Mode 4 (8x8)
Mode 5 intra 4x4
Mode 6 intra 8x8
Mode 7+ intra 16x16
Mode intra IPCM
B frame | Mode used
Mode 0 (copy)
Mode 1 (16x16)
Mode 2 (16x8)
Mode 3 (8x16)
Mode 4 (8x8)
Mode 5 intra 4x4
Mode 6 intra 8x8
Mode 7+ intra 16x16
Mode intra IPCM
IV
qp_per_matrix
q_matrix.c(369): if ((qp_per_matrix = (int*)malloc((MAX_QP + 1 + bitdepth_qp_scale)*sizeof(int))) == NULL),从这里可以看出,它包括的元素数量,和对应元素的数据类型。并且有:
q_matrix.c(376): qp_per_matrix[i] = i / 6;
V
q_matrix.c(377): qp_rem_matrix[i] = i % 6;
VI
Intra4x4Macroblock的模式确定过程
①int Mode_Decision_for_Intra4x4Macroblock (double lambda, int* cost)
其中,调用② Mode_Decision_for_8x8IntraBlocks (b8, lambda, &cost8x8),②中间调用③Mode_Decision_for_4x4IntraBlocks (b8, b4, lambda, &cost4x4)。函数③完整展现了一个4x4block的Intra模式确定过程。
VII
结构体PixelPos中坐标值含义
int pos_x;
int pos_y;
在整个frame中的绝对坐标
int x;
int y;
在macroblock中的坐标
以上解答来自qq群:RD_ARM.