📄 h264avcdecodertest.cpp
字号:
RNOK( m_pcH264AVCDecoderSuffix->uninit( false )); // THAT'S REALLY BAD !!!
if( !SuffixEnable )
{
RNOK( m_pcReadBitstream->setPosition( iPos ) );
bEOS = false;
}
else
{
m_pcH264AVCDecoder->decreaseNumOfNALInAU();
}
}
continue;
}
//bug-fix suffix}}
// JVT-Q054 Red. Picture }
#ifdef SHARP_AVC_REWRITE_OUTPUT
if (m_pcH264AVCDecoder->getAvcRewriteFlag())
{
if (avcRewriteInitialized==false )
{
// initialize, this is called only once
avcRewriteBinData = new BinData;
avcRewriteBinData->setMemAccessor(avcRewriteExtBinDataAccessor);
m_pcH264AVCDecoder->startAvcRewrite(avcRewriteBinDataBuffer, avcRewriteBinData, &avcRewriteExtBinDataAccessor);
avcRewriteInitialized = true;
// open the rewrite bit stream file
RNOKS( WriteBitstreamToFile::create(m_pcAvcReWriteBitstream) );
RNOKS( m_pcAvcReWriteBitstream->init(m_cAvcReWriteBitstreamFileName) );
//===== set start code =====
m_aucStartCodeBuffer[0] = 0;
m_aucStartCodeBuffer[1] = 0;
m_aucStartCodeBuffer[2] = 0;
m_aucStartCodeBuffer[3] = 1;
m_cBinDataStartCode.reset ();
m_cBinDataStartCode.set ( m_aucStartCodeBuffer, 4 );
// write parameter sets
bool moreSet = true;
UInt index = 0;
while (moreSet) {
moreSet = m_pcH264AVCDecoder->writeAvcRewriteParameterSets(7, index); // NAL_UNIT_SPS
RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );
RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData));
index ++;
}
moreSet = true;
index = 0;
while (moreSet)
{
moreSet = m_pcH264AVCDecoder->writeAvcRewriteParameterSets(8, index); //NAL_UNIT_PPS
RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );
RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData));
index ++;
}
}
}
#endif
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) && !bEOS)
{
SuffixEnable = true;
RNOK( m_pcReadBitstream->getPosition( iPos ) );
RNOK( m_pcReadBitstream->extractPacket( pcBinDataAVCNALU, bEOS ) ); //NS leak fix
pcBinDataAVCNALU->setMemAccessor( cBinDataAccessor ); //NS leak fix
//TMM_EC
bFinish = false;
RNOK( removeRedundencySlice( &cBinDataAccessor, bFinish ) );
if ( bFinish )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinDataAVCNALU ) ); //NS leak fix
pcBinDataAVCNALU = NULL; //NS leak fix
}
else
{
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 ) );
bEOS = false;
}
//bug-fix suffix{{
else
{
m_pcH264AVCDecoder->decreaseNumOfNALInAU();
}
}
//bug-fix suffix}}
//NS leak fix begin
if (pcBinDataAVCNALU)
{
RNOK( m_pcReadBitstream->releasePacket( pcBinDataAVCNALU ) );
pcBinDataAVCNALU = NULL;
}
//NS leak fix end
}
//JVT-S036 lsj end
// decode the NAL unit
RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );
//JVT-T054_FIX{
//add last decoded frame to SVC DPB if last frame was an AVC unit
if(bWasAVCNALUnit && m_pcH264AVCDecoder->getBaseSVCActive())
{
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 );
}
RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );
}
//JVT-T054}
#ifdef SHARP_AVC_REWRITE_OUTPUT
if (avcRewriteInitialized && avcRewriteBinData->size())
{
RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );
RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData)); // SVC-AVC rewrite -- slice header and data
avcRewriteBinData->reset();
}
#endif
// 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 = (UInt)pcPicBufferTmp->getCts();
::memcpy( pcLastFrame, *pcPicBufferTmp+0, uiSize*sizeof(UChar) );
}
}
}
RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
RNOK( xRemovePicBuffer( cPicBufferUnusedList ) );
if( pcBinData )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = 0;
}
}
printf("\n %d frames decoded\n", uiFrame );
delete [] pcLastFrame; // HS: decoder robustness
#ifdef SHARP_AVC_REWRITE_OUTPUT
if (avcRewriteInitialized==true) {
avcRewriteBinData->reset();
m_pcH264AVCDecoder->closeAvcRewrite(); // free the avcRewriteBinDataBuffer inside this function
// close file
if( NULL != m_pcAvcReWriteBitstream )
{
RNOK( m_pcAvcReWriteBitstream->uninit() );
RNOK( m_pcAvcReWriteBitstream->destroy() );
}
m_pcAvcReWriteBitstream = NULL;
}
#endif
RNOK( m_pcH264AVCDecoder->uninit( true ) );
m_pcParameter->nFrames = uiFrame;
m_pcParameter->nResult = 0;
return Err::m_nOK;
}
#ifdef SHARP_AVC_REWRITE_OUTPUT
ErrVal
H264AVCDecoderTest::setAvcReWriteBitstreamFile (char* AvcReWriteBitstreamFileName) {
m_cAvcReWriteBitstreamFileName = AvcReWriteBitstreamFileName;
return Err::m_nOK;
}
#endif
//TMM_EC
ErrVal
H264AVCDecoderTest::removeRedundencySlice(BinDataAccessor* pcBinDataAccessor,
Bool& bFinishChecking )
{
Bool bEos;
bFinishChecking = false;
UInt eNalUnitType;
int uiLayerId;
int uiQualityLevel;
int m_bFGSFragFlag;
if ( m_pcParameter->uiErrorConceal == 0)
return Err::m_nOK;
ROT( NULL == pcBinDataAccessor );
bEos = ( NULL == pcBinDataAccessor->data() ) || ( 0 == pcBinDataAccessor->size() );
if ( bEos )
{
return Err::m_nOK;
}
ROF( pcBinDataAccessor->size() );
ROF( pcBinDataAccessor->data() );
UChar ucByte = pcBinDataAccessor->data()[0];
ROT( ucByte & 0x80 ); // forbidden_zero_bit ( &10000000b)
eNalUnitType = ( ucByte & 0x1F ); // nal_unit_type ( &00011111b)
if ( *(int*)(pcBinDataAccessor->data()+1) != 0xdeadface)
{
if( eNalUnitType == 20 ||
eNalUnitType == 21 )
{
ROF( pcBinDataAccessor->size() > 3 );
ucByte = pcBinDataAccessor->data()[1];
ucByte = pcBinDataAccessor->data()[2];
uiLayerId = ( ucByte >> 2 ) & 7;
uiQualityLevel = ( ucByte ) & 3;
ucByte = pcBinDataAccessor->data()[3];
// JVT-U116 LMI {
//ROT( ucByte & 0x80 );
m_bFGSFragFlag = ( ucByte >> 4) & 1;
// JVT-U116 LMI {
}
else
{
uiLayerId = 0;
}
}
else //TMM_EC
{
uiLayerId = 0;
return Err::m_nERR;
}
if ( ( eNalUnitType == 20
|| eNalUnitType == 21)
&& uiLayerId == 0 )
{
bFinishChecking = true;
}
return Err::m_nOK;
}
//TMM_EC }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -