HEVC预测块(PU)模式划分显示

来源:互联网 发布:php程序员岗位职责 编辑:程序博客网 时间:2024/04/26 15:49

最近在做关于3D-HEVC的实验,很想直观显示出最终的预测模式(PU)划分结果。最近看到了一个帖子,动了HEVC解码器部分,能直观显示出PU划分结果,但是,只能显示一帧(即解码的第一帧 I-Slice), 后面的全乱了。对于做帧间的是不够的,必须把每帧的划分结果直观地显示出来。仔细看了他的教程,我在此基础进行了改进,目前能够正常显示出HEVC、MV-HEVC的PU划分结果。在此,感谢网站(程光曦微)的作者。

1. PU模式划分显示效果图

HEVC第一帧划分显示

HEVC帧间PU划分显示

2. HEVC decoder 代码修改

该程序是基于HM 11.0/3D-HTM的,废话不多说了,给出修改代码步骤。

2.1 PU划分数据结构体定义及宏定义

为了不改变源代码程序逻辑,我们所有修改的代码都放在自己定义的预处理命令宏定义中。
在TypeDef.h中,定义自己的条件编译预处理命令。
在TypeDef.h中,定义保存PU划分坐标点结构体。

2.2 PU划分及mode向量定义

为了保存各帧CU及mode最终划分结果,在TAppDecTop.h文件中定义如下代码:

2.3 修改各函数头,将m_plistPt传递进去

在TAppDecTop.cpp文件中, 按照下面的方式替换源代码:
编译程序,肯定会出错,因为没有修改相应的函数头。在TDecTop.cpp文件中,按照下面的方式修改decode函数头:
在TDecTop.h中,也需要对应修改decode函数声明,按照以下方式修改该函数声明:
接下来,将m_plistPt传递到xDecodeSlice函数中,将decode函数中的xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay)修改成xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay,list);即将m_plistPt传递到xDecodeSlice函数中。同样地,需要修改相应的函数头,在TDecTop.cpp文件中,修改对应的函数头,按照下面方式修改:
在TDecTop.h中,按照下面方式替换DecodeSlice函数声明:
接下来,在xDecodeSlice函数中,将m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic);替换成如下代码:
不要忘了,修改对应的函数头和声明,按照下面方式修改:
在TDecTop.cpp文件中,
在TDecTop.h文件中,
在decompressSlice函数中,将m_pcSliceDecoder->decompressSlice( ppcSubstreams, rpcPic, m_pcSbacDecoder, m_pcSbacDecoders) 修改成如下代码:
接着,修改相应的函数头函数声明:
在TDecSlice.cpp文件中,
在TDecSlice.h文件中,

接下来,将decompressSlice函数中的m_pcCuDecoder->decompressCU ( pcCU );修改成如下代码:
当然,也有修改相应的函数头和函数声明:
在TDecCu.cpp文件中,
在TDecCu.h文件中,

2.4 保存CU划分和mode选择结果

在xDecompressCU函数中,保存每一帧的CU划分结果及mode结果,在if( ( ( uiDepth < pcCU->getDepth( uiAbsPartIdx ) ) && ( uiDepth < g_uiMaxCUDepth - g_uiAddCUDepth ) ) || bBoundary )结束后,添加如下代码保存结果:
接着,修改xDecompressCU函数中的xDecompressCU函数递归调用,
到目前为止,数据保存完成。接下来,就是怎样把CU划分显示出来。

2.5 PU划分结果显示

在decode()函数中修改xFlushOutput和xWriteOutput函数调用,
接着,修改xFlushOutput和xWriteOutput函数头和声明,
现在到了最后关头,也是最重要的一部分,贴出xWriteOutput和xFlushOutput函数全部代码,不想具体说了,对照代码修改吧!

2.6 解码看结果

将先编码过后的文件,用解码器解码,就会看到最终结果。有的可能不知道怎样使用解码器,贴出命令行供参考
TAppDecoder -b 2Dmodes.bin -o 2Dmodes.yuv (TAppDecoder解码器应用程序,2Dmodes.bin编码器输出的压缩文件,2Dmodes.yuv 为重建文件名,2Dmodes.yuv 总的2Dmodes可以任意取名)。

3. 

如果不想自己修改代码,我这有编译好的解码器,解码过后,就会看到像我们展示出的样例结果,是不是很直观吧!该解码器在以下QQ群:101118126







0 0
原创粉丝点击