视频处理;h264压缩;jm8.6的编码器
有几个问题:
1、关于encode_one_macroblock函数里面cofAC和cofDC,查到的资料都是说DC是直流量,是4x4的子块DCT变换加量化后位置u,v=0时的值,AC是剩下的15个,但是jm8.6的编码器里AC的值我提取出来之后,跟我直接用visa观察得到的值经过想减得到Resiual再DCT变换量化后的值相等,这是为什么?
2、而DC也不只是把宏块划分为8x8矩阵后的左上角的值,为什么不是6个数,而是6x18的矩阵,他后面定义的注释是scan_pos是什么?
3、cofAC4x4也是,按照我了解的,不应该是亮度分量帧内预测编码4x4时的QDCT值吗,可是我将他输出来,发现每调用一次encode_one_macroblock里面的值都不同,视频输入进来处理的顺序不是先帧内预测选择最佳预测模式后,再DCT变换量化吗?
4、我提取出来cofac4x4后跟cofAC对比,发现cofAC4x4在I帧的第一个子块提取出来的前16位数与cofAC相同,两者有什么联系吗?我看代码是在 Mode_Decision_for_4x4IntraBlocks函数里cofAC4x4赋值给cofAC了,但是那个不是已经遍历了这个宏块的Y分量了吗,为什么只有第一个相同,是我提取错了吗?代码如下:(参考 涛歌依旧 的帖子,在encode_one_macroblock函数最后面加上了这段程序,顺便加一句哦他好厉害)
FILE* fp4;
fp4 = fopen(".\\test4.txt", "a + ");
if (fp4 == NULL)
{
perror(" fopen 失败\n");
return 0;
}
//printf("调制后的v1取代cofAC的QDCT矩阵的值为:,此时controlTimes= %d\n 此时ct= %d\n", controlTimes, ct);
fprintf(fp4, "cofAC4x4的值为: ,这是第 %d帧,此时controlTimes= %d \n", img->frame_num, controlTimes);
for (j = 0; j < 2; j++)
{
for (i = 0; i < 18; i++)
{
fprintf(fp4, "%-4d", cofAC4x4[j][i]);
}
fprintf(fp4, "\n");
}
fclose(fp4);