此系列是为了记录自己学习VTM10.0的过程和锻炼表达能力,主要是从解码端进行入手。由于本人水平有限,出现的错误恳请大家指正,欢迎与大家一起交流进步。
1.初始化
int poc;//picture order count
PicList* pcListPic = NULL;//存有图片的线性表
ifstream bitstreamFile(m_bitstreamFileName.c_str(), ifstream::in | ifstream::binary);//c_str()将string类型转换为c语言的字符串,in代表输入,binary代表为二进制模式。创建一个文件输入比特流。
InputByteStream bytestream(bitstreamFile);//将比特流转为字节流
// 创建解码器类
xCreateDecLib();
//舍弃RAP的前置图像中为RASL,更新the last displayed POC?
m_iPOCLastDisplay += m_iSkipFrame; // set the last displayed POC correctly for skip forward.
bool loopFiltered[MAX_VPS_LAYERS] = {
false };//标记是否已进行环路滤波
bool bPicSkipped = false;//表示是否跳过解码图像
bool isEosPresentInPu = false;//表示前一个NALU所在的PU是否是Eos
poc:帧的播放顺序
pcListPic:存放着解码出来的帧
bitstreamFile和bytestream:解码端的输入码流,一个是以比特为单位,另一个是以字节为单位
xCreateDecLib():函数包含着解码器类的创建和初始化,存在ROM上变量的初始化,量化和变换相关的初始化
m_iPOCLastDisplay += m_iSkipFrame :不确定
loopFiltered:标记是否已经环路滤波
bPicSkipped:是否跳过解码上一个NALU所在的图像
isEosPresentInPu:判断前一个NALU是否是EOS
2.循环进行NALU解码
while (!!bitstreamFile)
{
//创建NALU类
InputNALUnit nalu;
nalu.m_nalUnitType = NAL_UNIT_INVALID;
bool bNewPicture = m_cDecLib.isNewPicture(&bitstreamFile, &bytestream);//将要解码的NALU是否是图像中的第一个NALU
bool bNewAccessUnit = bNewPicture && m_cDecLib.isNewAccessUnit( bNewPicture, &bitstreamFile, &bytestream );//将要解码的NALU是否是新的一帧中的第一个NALU,同时也是新的AU中的第一个NALU
if(!bNewPicture)
{
//分支1
}
if ((bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS) && !m_cDecLib.getFirstSliceInSequence(nalu.m_nuhLayerId) && !bPicSkipped)
{
//分支2
//满足不是跳过解码的图像,同时满足不是sequence中的第一个slice,同时满足以下至少一个条件:1)将要解码的NALU是图像中的第一个NALU;2)比特流文件eof?;3)上一个NALU的类型是EOS
}
else if ( (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS ) &&
m_cDecLib.getFirstSliceInSequence(nalu.m_nuhLayerId))//在下一个NALU所在的slice将是sequence中的第一个slice的情况下,同时满足以下至少一个条件:1)将要解码的NALU是图像中的第一个NALU;
{
//2)比特流文件eof?;3)上一个NALU的类型是EOS。则下一个NALU所在的slice也是picture中的第一个slice。
m_cDecLib.setFirstSliceInPicture (true