测试模型为HM16.5
在解决方案资源管理器里面找到项目TlibEncoder,会看到里面有个源文件TencCU.cpp
(1)打印到屏幕
(在TencCU.cpp的xCompressCU函数(237行)后面添加,即可提取每个CU的相关信息并将其打印到屏幕)
printf("\n---------------CTUAddress(Raster Scan): %d-----------------\n",pCtu->getCtuRsAddr());
printf("\n---------------CUstarts--------------\n");
int iCount =0;
TComSlice *constpcSlice = pCtu->getSlice();
constTComSPS &sps=*(pcSlice->getSPS());
intiWidthInPart = sps.getMaxCUWidth() >> 2;
for (int i = 0; i < pCtu->getTotalNumPart();i++)
{
if ( (iCount & (iWidthInPart - 1)) == 0)
printf("\n");
printf("%d ",pCtu->getDepth(g_auiRasterToZscan[i]));
iCount++;
}
printf("\n---------------CUends--------------\n");
printf("\n---------------TUstarts--------------\n");
iCount = 0;
for (int i = 0; i < pCtu->getTotalNumPart();i++)
{
if ( (iCount & (iWidthInPart - 1)) == 0)
printf("\n");
printf("%d ",pCtu->getTransformIdx(g_auiRasterToZscan[i]) +pCtu->getDepth(g_auiRasterToZscan[i]));
iCount++;
}
printf("\n---------------TUends--------------\n");
(2) 将CU的划分方式提取出来并存储到txt文本
需要添加头文件include<stdlib.h>
然后定义一个文件指针 FILE *fp;
创建一个txt文件,例如命名为BasketballDrill_spilt_CU.txt,注意后面"w"是打开文件方式,将原有内容清空写入新数据,如果文件不存在则新建,类似的还有"r"只读打开(不能写入);"a"向文件中追加内容,原有内容不变,等等
所以要用“a”的形式,以免循环后数值被覆盖
fp = fopen ("BasketballDrill_spilt_CU.txt", "a");
然后将打印的printf注释掉,在(1)中相同的位置添加如下代码即可。
注:要等项目运行完再打开创建的txt文本。
// 添加 开始:CU和TU划分
printf("\n---------------CTU Address(Raster Scan): %d-----------------\n", pCtu->getCtuRsAddr());
printf("\n---------------CU starts--------------\n");
FILE *fp;
fp = fopen ("BasketballDrill_spilt_CU.txt", "a");
int iCount = 0;
TComSlice *const pcSlice = pCtu->getSlice();
const TComSPS &sps =*(pcSlice->getSPS());
int iWidthInPart = sps.getMaxCUWidth() >> 2;
for (int i = 0; i < pCtu->getTotalNumPart(); i++)
{
if ( (iCount & (iWidthInPart - 1)) == 0)
// printf("\n");
fprintf(fp,"\n");
// printf("%d ", pCtu->getDepth(g_auiRasterToZscan[i]));
iCount++;
fprintf(fp,"%d ",pCtu->getDepth(g_auiRasterToZscan[i]));
}
printf("\n---------------CU ends--------------\n");
printf("\n---------------TU starts--------------\n");
iCount = 0;
for (int i = 0; i < pCtu->getTotalNumPart(); i++)
{
if ( (iCount & (iWidthInPart - 1)) == 0)
//printf("\n");
//printf("%d ", pCtu->getTransformIdx(g_auiRasterToZscan[i]) + pCtu->getDepth(g_auiRasterToZscan[i]));
iCount++;
}
// printf("\n---------------TU ends--------------\n");
// 添加 结束:CU和TU划分