?? qualitylevelassigner.cpp
字號:
{
Int iPos;
Bool bFinishChecking;
BinData* pcBinData;
BinDataAccessor cBinDataAccessor;
//----- analyse access unit -----
RNOK( pcReadBitStream->getPosition( iPos ) );
do
{
RNOK( xGetNextValidPacket( pcBinData, pcReadBitStream, uiTopLayer, uiLayer, uiFGSLayer, uiLevel, bIndependent, bEOS, auiFrameNumAnalysis ) );
pcBinData->setMemAccessor( cBinDataAccessor );
bFinishChecking = false;
if( m_pcH264AVCDecoder->getNumOfNALInAU() == 0 )
{
m_pcH264AVCDecoder->setDependencyInitialized( false );
m_pcH264AVCDecoder->initNumberOfFragment ();
}
RNOK( m_pcH264AVCDecoder->checkSliceLayerDependency( &cBinDataAccessor, bFinishChecking ) );
RNOK( pcReadBitStream->releasePacket( pcBinData ) );
} while( !bFinishChecking );
#define MAX_FRAGMENTS 10 // see H264AVCDecoderTest::go()
Bool bFragmented = false;
Bool bDiscardable = false;
Bool bStart = false;
Bool bFirst = true;
Bool bConcatenated = false;
UInt uiTotalLength = 0;
UInt uiFragmentNumber = 0;
BinData* apcBinDataTmp [MAX_FRAGMENTS];
BinDataAccessor acBinDataAccessorTmp[MAX_FRAGMENTS];
UInt auiStartPos [MAX_FRAGMENTS];
UInt auiEndPos [MAX_FRAGMENTS];
for( pcBinData = 0, bEOS = false; !bStart && !bEOS; )
{
if( bFirst )
{
RNOK( pcReadBitStream->setPosition( iPos ) );
bFirst = false;
}
RNOK( xGetNextValidPacket( apcBinDataTmp[uiFragmentNumber], pcReadBitStream, uiTopLayer, uiLayer, uiFGSLayer, uiLevel, bIndependent, bEOS, auiFrameNumDecoding ) );
::memcpy( auiFrameNumAnalysis, auiFrameNumDecoding, MAX_LAYERS*sizeof(UInt) );
apcBinDataTmp[uiFragmentNumber]->setMemAccessor( acBinDataAccessorTmp[uiFragmentNumber] );
RNOK( m_pcH264AVCDecoder->initPacket( &acBinDataAccessorTmp[uiFragmentNumber],
uiNalUnitType, uiMbX, uiMbY, uiSize,
//uiNonRequiredPic, //NonRequired JVT-Q066
true, false, //FRAG_FIX_3
bStart, auiStartPos[uiFragmentNumber], auiEndPos[uiFragmentNumber],
bFragmented, bDiscardable ) );
//NonRequired JVT-Q066
/*
if( uiNonRequiredPic )
{
continue;
}
*/
//NonRequired JVT-Q066
uiTotalLength += ( auiEndPos[uiFragmentNumber] - auiStartPos[uiFragmentNumber] );
if( !bStart )
{
uiFragmentNumber++;
}
else
{
if( apcBinDataTmp[0]->size() != 0 )
{
pcBinData = new BinData();
pcBinData->set( new UChar[uiTotalLength], uiTotalLength );
UInt uiOffset = 0;
for( UInt uiFragment = 0; uiFragment <= uiFragmentNumber; uiFragment++ )
{
::memcpy ( pcBinData->data()+uiOffset,
apcBinDataTmp[uiFragment]->data() + auiStartPos[uiFragment],
auiEndPos[uiFragment] - auiStartPos[uiFragment] );
uiOffset += auiEndPos[uiFragment] - auiStartPos[uiFragment];
RNOK( pcReadBitStream->releasePacket( apcBinDataTmp[uiFragment] ) );
apcBinDataTmp[uiFragment] = 0;
if(uiNalUnitType != 6) //JVT-T054
m_pcH264AVCDecoder->decreaseNumOfNALInAU();
if( uiFragment > 0 )
{
bConcatenated = true;
}
}
pcBinData->setMemAccessor( cBinDataAccessor );
bToDecode = false;
if( ( uiTotalLength != 0 ) && ( !bDiscardable || bFragmented ) )
{
if( ( uiNalUnitType == 20 ) || ( uiNalUnitType == 21 ) || ( uiNalUnitType == 1 ) || ( uiNalUnitType == 5 ) )
{
RNOK( m_pcH264AVCDecoder->initPacket( &cBinDataAccessor, uiNalUnitType,
uiMbX, uiMbY, uiSize,
//uiNonRequiredPic, //NonRequired JVT-Q066
false, bConcatenated, bStart,
auiStartPos[uiFragmentNumber+1], auiEndPos[uiFragmentNumber+1],
bFragmented, bDiscardable ) );
}
else
{
RNOK( m_pcH264AVCDecoder->initPacket( &cBinDataAccessor ) );
}
bToDecode = true;
}
}
//manu.mathew@samsung : memory leak fix
else
{
RNOK( pcReadBitStream->releasePacket( apcBinDataTmp[0] ) );
apcBinDataTmp[0] = NULL;
}
//--
}
}
//NonRequired JVT-Q066{
if(m_pcH264AVCDecoder->isNonRequiredPic())
continue;
//NonRequired JVT-Q066}
if( bToDecode )
{
//----- get pic buffer -----
pcPicBuffer = 0;
if( uiNalUnitType == 1 || uiNalUnitType == 5 || uiNalUnitType == 20 || uiNalUnitType == 21 )
{
RNOK( xGetNewPicBuffer( pcPicBuffer, uiSize ) );
if( !bYuvDimSet )
{
RNOK( xGetNewPicBuffer( pcPicBufferOrig, uiSize ) );
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;
}
}
//----- decode packet -----
{
//----- re-direct stdout -----
#if WIN32 // for linux, this have to be slightly re-formulated
Int orig_stdout = _dup(1);
FILE* stdout_copy = freopen( tmp_file_name, "wt", stdout );
#endif
//----- decode -----
RNOK( m_pcH264AVCDecoder->process( pcPicBuffer,
cPicBufferOutputList,
cPicBufferUnusedList,
cPicBufferReleaseList ) );
//---- restore stdout -----
#if WIN32 // for linux, this have to be slightly re-formulated
fclose( stdout );
_dup2( orig_stdout, 1 );
_iob[1] = *fdopen( 1, "wt" );
fclose( fdopen( orig_stdout, "w" ) );
#endif
}
//----- determine distortion (and output for debugging) -----
while( ! cPicBufferOutputList.empty() )
{
PicBuffer* pcPicBufferTmp = cPicBufferOutputList.front();
cPicBufferOutputList.pop_front();
if( pcPicBufferTmp )
{
//----- output (for debugging) -----
if( pcWriteYuv )
{
RNOK( pcWriteYuv->writeFrame( *pcPicBufferTmp + uiLumOffset,
*pcPicBufferTmp + uiCbOffset,
*pcPicBufferTmp + uiCrOffset,
uiMbY << 4,
uiMbX << 4,
(uiMbX << 4) + YUV_X_MARGIN*2 ) );
}
//----- read in reference picture ------
RNOK( pcReadYuv->readFrame ( *pcPicBufferOrig + uiLumOffset,
*pcPicBufferOrig + uiCbOffset,
*pcPicBufferOrig + uiCrOffset,
uiMbY << 4,
uiMbX << 4,
(uiMbX << 4) + YUV_X_MARGIN*2 ) );
//----- get distortion -----
RNOK( xGetDistortion ( auiDistortion[uiFrame],
*pcPicBufferTmp + uiLumOffset,
*pcPicBufferOrig + uiLumOffset,
uiMbY << 4,
uiMbX << 4,
(uiMbX << 4) + YUV_X_MARGIN*2 ) );
//----- increment output picture number -----
uiFrame++;
if( uiLevel == MSYS_UINT_MAX )
printf( "\rdetermine distortion (layer %d - FGS %d - base layer ) --> frame %d completed", uiLayer, uiFGSLayer, uiFrame );
else
printf( "\rdetermine distortion (layer %d - FGS %d - lev%2d - %s ) --> frame %d completed", uiLayer, uiFGSLayer, uiLevel, bIndependent?"ind":"dep", uiFrame );
}
}
} // if( bToDecode )
//----- free buffers -----
RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
RNOK( xRemovePicBuffer( cPicBufferUnusedList ) );
//----- delete bin data -----
if( pcBinData )
{
RNOK( pcReadBitStream->releasePacket( pcBinData ) );
pcBinData = 0;
}
}
//----- remove original pic buffer -----
PicBufferList cPicBufferListOrig; cPicBufferListOrig.push_back( pcPicBufferOrig );
RNOK( xRemovePicBuffer( cPicBufferListOrig ) );
#if WIN32
remove( tmp_file_name );
#endif
//===== uninit =====
RNOK( m_pcH264AVCPacketAnalyzer ->uninit () );
RNOK( m_pcH264AVCDecoder ->uninit ( true ) );
RNOK( pcReadBitStream ->uninit () );
RNOK( pcReadYuv ->uninit () );
RNOK( pcReadBitStream ->destroy () );
RNOK( pcReadYuv ->destroy () );
if( pcWriteYuv )
{
RNOK( pcWriteYuv->destroy() );
}
//---- re-create decoder (there's something wrong) -----
RNOK( m_pcH264AVCDecoder->destroy() );
RNOK( CreaterH264AVCDecoder::create( m_pcH264AVCDecoder ) );
printf("\n");
return Err::m_nOK;
}
ErrVal
QualityLevelAssigner::xWriteDataFile( const std::string& cFileName )
{
printf( "write data to file \"%s\" ...", cFileName.c_str() );
FILE* pFile = fopen( cFileName.c_str(), "wt" );
if( !pFile )
{
fprintf( stderr, "\nERROR: Cannot open file \"%s\" for writing!\n\n", cFileName.c_str() );
return Err::m_nERR;
}
for( UInt uiLayer = 0; uiLayer < m_uiNumLayers; uiLayer ++ )
for( UInt uiFGS = 0; uiFGS <= m_auiNumFGSLayers[uiLayer]; uiFGS ++ )
for( UInt uiFrame = 0; uiFrame < m_auiNumFrames [uiLayer]; uiFrame ++ )
{
fprintf( pFile,
"%d %d %5d %6d %lf\n",
uiLayer, uiFGS, uiFrame,
m_aaauiPacketSize [uiLayer][uiFGS][uiFrame],
m_aaadDeltaDist [uiLayer][uiFGS][uiFrame] );
}
fclose( pFile );
printf("\n");
return Err::m_nOK;
}
ErrVal
QualityLevelAssigner::xReadDataFile( const std::string& cFileName )
{
printf( "read data from file \"%s\" ...", cFileName.c_str() );
FILE* pFile = fopen( cFileName.c_str(), "rt" );
if( !pFile )
{
fprintf( stderr, "\nERROR: Cannot open file \"%s\" for reading!\n\n", cFileName.c_str() );
return Err::m_nERR;
}
Bool bEOS = false;
UInt uiLayer, uiFGS, uiFrame, uiPacketSize, uiNumPackets;
Double dDeltaDist;
for( uiNumPackets = 0; !bEOS; uiNumPackets++ )
{
Int iNumRead = fscanf( pFile,
" %d %d %d %d %lf",
&uiLayer, &uiFGS, &uiFrame, &uiPacketSize, &dDeltaDist );
if( iNumRead == 5 )
{
ROF( uiLayer < m_uiNumLayers );
ROF( uiFGS <= m_auiNumFGSLayers[uiLayer] );
ROF( uiFrame < m_auiNumFrames [uiLayer] );
m_aaauiPacketSize [uiLayer][uiFGS][uiFrame] = uiPacketSize;
m_aaadDeltaDist [uiLayer][uiFGS][uiFrame] = dDeltaDist;
}
else
{
bEOS = true;
uiNumPackets--;
}
}
//----- check number of elements -----
UInt uiTargetPackets = 0;
for( uiLayer = 0; uiLayer < m_uiNumLayers; uiLayer++ )
{
uiTargetPackets += ( 1 + m_auiNumFGSLayers[uiLayer] ) * m_auiNumFrames[uiLayer];
}
if( uiTargetPackets != uiNumPackets )
{
fprintf( stderr, "\nERROR: File \"%s\" contains incomplete data!\n\n", cFileName.c_str() );
return Err::m_nERR;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -