📄 h264avcdecodertest.cpp
字号:
auiStartPos[uiFragNb+1],
auiEndPos[uiFragNb+1],
bFragmented,
bDiscardable,
0,
&uiNumFragments,
apucFragBuffers ) );
}
else
m_pcH264AVCDecoder->initPacket( cBinDataAccessor );
bDecode = true;
}
}
else {RNOK(m_pcReadBitstream->releasePacket(pcBinDataTmp[uiFragNb])); }//NS leak fix
}
}
return Err::m_nOK;
}
ErrVal H264AVCDecoderTest::go()
{
PicBuffer* pcPicBuffer = NULL;
PicBufferList cPicBufferOutputList;
PicBufferList cPicBufferUnusedList;
PicBufferList cPicBufferReleaseList;
#ifdef SHARP_AVC_REWRITE_OUTPUT
ExtBinDataAccessor avcRewriteExtBinDataAccessor;
UChar* avcRewriteBinDataBuffer = NULL;
BinData* avcRewriteBinData = NULL;
int avcRewriteBufsize=0;
bool avcRewriteInitialized = false;
#endif
UInt uiMbX = 0;
UInt uiMbY = 0;
UInt uiNalUnitType = 0;
UInt uiSize = 0;
//UInt uiNonRequiredPic= 0; //NonRequired JVT-Q066
UInt uiLumOffset = 0;
UInt uiCbOffset = 0;
UInt uiCrOffset = 0;
UInt uiFrame;
Bool bEOS = false;
Bool bYuvDimSet = false;
Bool bFinish = false;
Bool SuffixEnable; //JVT-S036 lsj
// HS: packet trace
Int iMaxPocDiff = (Int)m_pcParameter->uiMaxPocDiff;
Int iLastPoc = MSYS_INT_MAX;
UChar* pcLastFrame = 0;
UInt uiPreNalUnitType = 0;
cPicBufferOutputList.clear();
cPicBufferUnusedList.clear();
RNOK( m_pcH264AVCDecoder->init( true ) );
Bool bToDecode = false; //JVT-P031
Bool bVirtual = false; //TMM_EC_FIX
for( uiFrame = 0; ( uiFrame <= MSYS_UINT_MAX && ! bEOS); )
{
BinData* pcBinData = 0;
BinData* pcBinDataAVCNALU; //NS leak fix
BinDataAccessor cBinDataAccessor;
Int iPos;
Bool bFinishChecking = false;
RNOK( m_pcReadBitstream->getPosition(iPos) );
do
{
// analyze the dependency information
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
//TMM_EC {{
{
pcBinData->setMemAccessor( cBinDataAccessor );
bFinish = false;
RNOK( removeRedundencySlice( &cBinDataAccessor, bFinish ) );
if ( bFinish )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL; //TMM_JV
continue;
}
}
//TMM_EC }}
//TMM_EC {{
if ( !bEOS && ((pcBinData->data())[0] & 0x1f) == 0x0b)
{
bEOS = true;
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = new BinData;
UInt uiTotalLength = 0;
pcBinData->set( new UChar[uiTotalLength], uiTotalLength );
}
//TMM_EC }}
pcBinData->setMemAccessor( cBinDataAccessor );
// open the NAL Unit, determine the type and if it's a slice get the frame size
bFinishChecking = false;
RNOK( m_pcH264AVCDecoder->checkSliceLayerDependency( &cBinDataAccessor, bFinishChecking ) );
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
} while( ! bFinishChecking );
RNOK( m_pcReadBitstream->setPosition(iPos) );
//TMM_EC {{ check slice gap and process virtual slice
if ( m_pcParameter->uiErrorConceal != 0)
{
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
pcBinData->setMemAccessor( cBinDataAccessor );
//TMM_EC {{
bFinish = false;
RNOK( removeRedundencySlice( &cBinDataAccessor, bFinish ) );
if ( bFinish )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
continue;
}
//TMM_EC }}
do
{
BinDataAccessor lcBinDataAccessor;
lcBinDataAccessor = cBinDataAccessor;
MyList<BinData*> cVirtualSliceList;
while ( Err::m_nERR == m_pcH264AVCDecoder->checkSliceGap( &lcBinDataAccessor, cVirtualSliceList))
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
RNOK( m_pcReadBitstream->getPosition(iPos) );
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
pcBinData->setMemAccessor( cBinDataAccessor );
lcBinDataAccessor = cBinDataAccessor;
}
if ( cVirtualSliceList.empty())
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
RNOK( m_pcReadBitstream->setPosition(iPos) );
break;
}
bVirtual = false;
while( !cVirtualSliceList.empty())
{
Bool bStart = false;
bVirtual = true;//TMM_EC_FIX
BinData *pcBinDataS = 0;
RNOK(initPacketToDecode(bToDecode, pcBinDataS, &lcBinDataAccessor, bEOS,
uiNalUnitType, uiMbX, uiMbY, uiSize, uiPreNalUnitType, iPos, cVirtualSliceList, true));
//NonRequired JVT-Q066{
if(m_pcH264AVCDecoder->isNonRequiredPic())
continue;
//NonRequired JVT-Q066}
if(bToDecode)//JVT-P031
{
// get new picture buffer if required if coded Slice || coded IDR slice
pcPicBuffer = NULL;
if( uiNalUnitType == 1 || uiNalUnitType == 5 || uiNalUnitType == 20 || uiNalUnitType == 21)
{
RNOK( xGetNewPicBuffer( pcPicBuffer, uiSize ) );
if( ! bYuvDimSet )
{
UInt uiLumSize = ((uiMbX<<3)+ YUV_X_MARGIN) * ((uiMbY<<3) + YUV_Y_MARGIN ) * 4;
uiLumOffset = ((uiMbX<<4)+2*YUV_X_MARGIN) * YUV_Y_MARGIN + YUV_X_MARGIN;
uiCbOffset = ((uiMbX<<3)+ YUV_X_MARGIN) * YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + uiLumSize;
uiCrOffset = ((uiMbX<<3)+ YUV_X_MARGIN) * YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + 5*uiLumSize/4;
bYuvDimSet = true;
// HS: decoder robustness
pcLastFrame = new UChar [uiSize];
ROF( pcLastFrame );
}
}
//JVT-S036 lsj start
if( (uiNalUnitType == 1 || uiNalUnitType == 5 ) && !bVirtual) //TMM_EC_FIX
{
SuffixEnable = true;
// RNOK(m_pcH264AVCDecoderSuffix->init( false )); // THAT'S REALLY BAD !!!
RNOK( m_pcReadBitstream->getPosition( iPos ) );
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
pcBinData->setMemAccessor( cBinDataAccessor );
//EMM_TC {{
bFinish = false;
RNOK( removeRedundencySlice( &cBinDataAccessor, bFinish ) );
if ( bFinish )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
}
else
{
//TMM_EC
RNOK(m_pcH264AVCDecoderSuffix->init( false )); // THAT'S REALLY BAD !!!
RNOK( m_pcH264AVCDecoderSuffix->initPacketSuffix( &cBinDataAccessor, uiNalUnitType, true,
false, //FRAG_FIX_3
bStart, m_pcH264AVCDecoder,SuffixEnable
)
);
RNOK( m_pcH264AVCDecoderSuffix->uninit( false )); // THAT'S REALLY BAD !!!
if( !SuffixEnable )
{
RNOK( m_pcReadBitstream->setPosition( iPos ) );
//bug-fix suffix{{
bEOS = false;
}
else
{
m_pcH264AVCDecoder->decreaseNumOfNALInAU();
//bug-fix suffix}}
}
}
if( pcBinData)
{
m_pcReadBitstream->releasePacket( pcBinData ) ;
pcBinData=NULL;
}
}
//JVT-S036 lsj end
// decode the NAL unit
RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );
// ROI DECODE ICU/ETRI
m_pcH264AVCDecoder->RoiDecodeInit();
// picture output
while( ! cPicBufferOutputList.empty() )
{
PicBuffer* pcPicBufferTmp = cPicBufferOutputList.front();
cPicBufferOutputList.pop_front();
if( pcPicBufferTmp != NULL )
{
// HS: decoder robustness
while( abs( iLastPoc + iMaxPocDiff ) < abs( (Int)pcPicBufferTmp->getCts() ) )
// while( uiLastPoc + uiMaxPocDiff < (UInt)pcPicBufferTmp->getCts() && (Int)pcPicBufferTmp->getCts() > 0) //EIDR bug-fix
{
RNOK( m_pcWriteYuv->writeFrame( pcLastFrame + uiLumOffset,
pcLastFrame + uiCbOffset,
pcLastFrame + uiCrOffset,
uiMbY << 4,
uiMbX << 4,
(uiMbX << 4)+ YUV_X_MARGIN*2 ) );
printf("REPEAT FRAME\n");
uiFrame ++;
iLastPoc += iMaxPocDiff;
}
RNOK( m_pcWriteYuv->writeFrame( *pcPicBufferTmp + uiLumOffset,
*pcPicBufferTmp + uiCbOffset,
*pcPicBufferTmp + uiCrOffset,
uiMbY << 4,
uiMbX << 4,
(uiMbX << 4)+ YUV_X_MARGIN*2 ) );
uiFrame++;
// HS: decoder robustness
iLastPoc = (Int) pcPicBufferTmp->getCts();
::memcpy( pcLastFrame, *pcPicBufferTmp+0, uiSize*sizeof(UChar) );
}
}
RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
RNOK( xRemovePicBuffer( cPicBufferUnusedList ) );
// if(pcBinDataS) //TMM_JV
// RNOK( m_pcReadBitstream->releasePacket( pcBinDataS ) );
}
//TMM_JV
if(pcBinDataS)
RNOK( m_pcReadBitstream->releasePacket( pcBinDataS ) );
}
} while( true);
}
//TMM_EC }}
Bool bStart = false;
MyList<BinData*> cVirtualSliceList;
pcBinData = 0;
RNOK(initPacketToDecode(bToDecode, pcBinData, &cBinDataAccessor, bEOS,
uiNalUnitType, uiMbX, uiMbY, uiSize, uiPreNalUnitType, iPos, cVirtualSliceList, false));
//prefix unit{{
if(uiNalUnitType == 14)
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
continue;
}
//prefix unit}}
//JVT-T054_FIX{
Bool bWasAVCNALUnit = (uiNalUnitType == 1 || uiNalUnitType == 5);
//JVT-T054}
//NonRequired JVT-Q066{
if(m_pcH264AVCDecoder->isNonRequiredPic())
continue;
//NonRequired JVT-Q066}
// JVT-Q054 Red. Picture {
RNOK( m_pcH264AVCDecoder->checkRedundantPic() );
if ( m_pcH264AVCDecoder->isRedundantPic() )
//bug-fix suffix{{
{
if((uiNalUnitType == 1 || uiNalUnitType == 5) && !bEOS)
{
SuffixEnable = true;
RNOK(m_pcH264AVCDecoderSuffix->init( false )); // THAT'S REALLY BAD !!!
RNOK( m_pcReadBitstream->getPosition( iPos ) );
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
pcBinData->setMemAccessor( cBinDataAccessor );
RNOK( m_pcH264AVCDecoderSuffix->initPacketSuffix( &cBinDataAccessor, uiNalUnitType, true,
false, //FRAG_FIX_3
bStart, m_pcH264AVCDecoder,SuffixEnable
)
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -