Merge branch devel

This commit is contained in:
jfmcarreira committed 2017-09-23 02:15:29 +01:00
1 parent ed075fcbd3
commit eb31fc0287
16 files changed
+231 -205

No files matched your search

+106 -127
View File
@@ -42,6 +42,52 @@
#include "StreamHandlerOpenCV.h"
#endif
class PlaYUVerStreamBufferPrivate
{
private:
std::vector<PlaYUVerFrame*> m_apcFrameBuffer;
UInt m_uiIndex;
public:
PlaYUVerStreamBufferPrivate( UInt size, UInt width, UInt height, Int pelFormat, Int bitsPixel )
{
for( UInt i = 0; i < size; i++ )
{
PlaYUVerFrame* pFrame = new PlaYUVerFrame( width, height, pelFormat, bitsPixel );
m_apcFrameBuffer.push_back( pFrame );
}
m_uiIndex = 0;
}
~PlaYUVerStreamBufferPrivate()
{
while( m_apcFrameBuffer.size() > 0 )
{
delete m_apcFrameBuffer.back();
m_apcFrameBuffer.pop_back();
}
}
Void increase( UInt newSize )
{
for( UInt i = m_apcFrameBuffer.size(); i < newSize; i++ )
{
PlaYUVerFrame* pFrame = new PlaYUVerFrame( m_apcFrameBuffer.at( 0 ) );
m_apcFrameBuffer.push_back( pFrame );
}
}
UInt size() { return m_apcFrameBuffer.size(); }
Void setIndex( UInt i ) { m_uiIndex = i; }
PlaYUVerFrame* frame( Int i ) { return m_apcFrameBuffer.at( i ); }
PlaYUVerFrame* current() { return m_apcFrameBuffer.at( m_uiIndex ); }
PlaYUVerFrame* next() { return m_apcFrameBuffer.at( nextIndex() ); }
Void setNextFrame() { m_uiIndex = nextIndex(); }
private:
inline Int nextIndex() { return m_uiIndex + 1 >= m_apcFrameBuffer.size() ? 0 : m_uiIndex + 1; }
inline Int prevIndex() { return m_uiIndex - 1 < 0 ? m_apcFrameBuffer.size() - 1 : m_uiIndex - 1; }
};
std::vector<PlaYUVerSupportedFormat> PlaYUVerStream::supportedReadFormats()
{
INI_REGIST_PLAYUVER_SUPPORTED_FMT;
@@ -138,12 +184,6 @@ PlaYUVerStream::PlaYUVerStream()
m_uiTotalFrameNum = 0;
m_iCurrFrameNum = -1;
m_cFilename = "";
m_pcCurrFrame = NULL;
m_pcNextFrame = NULL;
m_ppcFrameBuffer = NULL;
m_uiFrameBufferSize = 2;
m_uiFrameBufferIndex = 0;
m_uiCurrFrameFileIdx = 0;
}
PlaYUVerStream::~PlaYUVerStream()
@@ -246,28 +286,21 @@ Bool PlaYUVerStream::open( String filename,
return m_bInit;
}
m_uiFrameBufferSize = m_bIsInput ? 2 : 1;
getMem1D<PlaYUVerFrame*>( &m_ppcFrameBuffer, m_uiFrameBufferSize );
for( UInt i = 0; i < m_uiFrameBufferSize; i++ )
// Keep past, current and future frames
try
{
try
{
m_ppcFrameBuffer[i] =
new PlaYUVerFrame( m_pcHandler->m_uiWidth, m_pcHandler->m_uiHeight,
m_pcHandler->m_iPixelFormat, m_pcHandler->m_uiBitsPerPixel );
}
catch( PlaYUVerFailure& e )
{
close();
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot allocated frame buffer" );
return m_bInit;
}
m_frameBuffer = new PlaYUVerStreamBufferPrivate(
m_bIsInput ? 3 : 1, m_pcHandler->m_uiWidth, m_pcHandler->m_uiHeight,
m_pcHandler->m_iPixelFormat, m_pcHandler->m_uiBitsPerPixel );
}
catch( PlaYUVerFailure& e )
{
close();
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot allocated frame buffer" );
return m_bInit;
}
m_uiFrameBufferIndex = 0;
m_pcCurrFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
m_pcHandler->setBytesPerFrame( m_pcCurrFrame->getBytesPerFrame() );
m_pcHandler->setBytesPerFrame( m_frameBuffer->current()->getBytesPerFrame() );
if( m_bIsInput )
{
@@ -281,7 +314,7 @@ Bool PlaYUVerStream::open( String filename,
return m_bInit;
}
if( !m_pcHandler->configureBuffer( m_pcCurrFrame ) )
if( !m_pcHandler->configureBuffer( m_frameBuffer->current() ) )
{
close();
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot allocated memory" );
@@ -304,7 +337,7 @@ Bool PlaYUVerStream::reload()
{
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot open file" );
}
m_pcHandler->setBytesPerFrame( m_pcCurrFrame->getBytesPerFrame() );
m_pcHandler->setBytesPerFrame( m_frameBuffer->current()->getBytesPerFrame() );
m_uiTotalFrameNum = m_pcHandler->calculateFrameNumber();
if( m_pcHandler->m_uiWidth <= 0 || m_pcHandler->m_uiHeight <= 0 ||
@@ -331,17 +364,7 @@ Void PlaYUVerStream::close()
m_pcHandler->closeHandler();
m_pcHandler->Delete();
if( m_ppcFrameBuffer )
{
for( UInt i = 0; i < m_uiFrameBufferSize; i++ )
{
if( m_ppcFrameBuffer[i] )
delete m_ppcFrameBuffer[i];
m_ppcFrameBuffer[i] = NULL;
}
freeMem1D<PlaYUVerFrame*>( m_ppcFrameBuffer );
m_ppcFrameBuffer = NULL;
}
delete m_frameBuffer;
m_bLoadAll = false;
m_bInit = false;
@@ -410,43 +433,23 @@ Void PlaYUVerStream::loadAll()
if( m_bLoadAll || !m_bIsInput )
return;
if( m_ppcFrameBuffer )
try
{
for( UInt i = 0; i < m_uiFrameBufferSize; i++ )
{
if( m_ppcFrameBuffer[i] )
delete m_ppcFrameBuffer[i];
m_ppcFrameBuffer[i] = NULL;
}
freeMem1D<PlaYUVerFrame*>( m_ppcFrameBuffer );
m_ppcFrameBuffer = NULL;
m_frameBuffer->increase( m_uiTotalFrameNum );
}
m_uiFrameBufferSize = m_uiTotalFrameNum;
getMem1D<PlaYUVerFrame*>( &m_ppcFrameBuffer, m_uiFrameBufferSize );
for( UInt i = 0; i < m_uiFrameBufferSize; i++ )
catch( PlaYUVerFailure& e )
{
m_ppcFrameBuffer[i] =
new PlaYUVerFrame( m_pcHandler->m_uiWidth, m_pcHandler->m_uiHeight,
m_pcHandler->m_iPixelFormat, m_pcHandler->m_uiBitsPerPixel );
if( !m_ppcFrameBuffer[i] )
{
close();
}
close();
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot allocated frame buffer" );
}
m_uiFrameBufferIndex = 0;
m_pcCurrFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
m_iCurrFrameNum = -1;
seekInput( 0 );
for( UInt i = m_uiFrameBufferIndex + 1; i < m_uiFrameBufferSize; i++ )
for( UInt i = 2; i < m_frameBuffer->size(); i++ )
{
m_pcNextFrame = m_ppcFrameBuffer[i];
readFrame();
readFrame( m_frameBuffer->frame( i ) );
}
m_bLoadAll = true;
m_uiFrameBufferIndex = 0;
m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
m_iCurrFrameNum = -1;
setNextFrame();
m_iCurrFrameNum = 0;
}
Void PlaYUVerStream::getDuration( Int* duration_array )
@@ -472,38 +475,25 @@ Void PlaYUVerStream::getDuration( Int* duration_array )
// *duration_array++ = secs;
}
Void PlaYUVerStream::readFrameFillRGBBuffer()
Bool PlaYUVerStream::readFrame( PlaYUVerFrame* frame )
{
readFrame();
if( m_pcNextFrame )
m_pcNextFrame->fillRGBBuffer();
return;
}
if( !m_bInit || !m_bIsInput || m_pcHandler->m_uiCurrFrameFileIdx >= m_uiTotalFrameNum )
return false;
Void PlaYUVerStream::readFrame()
{
if( !m_bInit || !m_bIsInput || m_bLoadAll )
return;
if( m_bLoadAll )
return true;
if( m_uiCurrFrameFileIdx >= m_uiTotalFrameNum )
{
m_pcNextFrame = NULL;
return;
}
if( !m_pcHandler->read( m_pcNextFrame ) )
if( !m_pcHandler->read( frame ) )
{
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot read file" );
return;
return false;
}
m_uiCurrFrameFileIdx++;
return;
return true;
}
Void PlaYUVerStream::writeFrame()
{
writeFrame( m_pcCurrFrame );
writeFrame( m_frameBuffer->current() );
}
Void PlaYUVerStream::writeFrame( PlaYUVerFrame* pcFrame )
@@ -517,7 +507,7 @@ Void PlaYUVerStream::writeFrame( PlaYUVerFrame* pcFrame )
Bool PlaYUVerStream::saveFrame( const String& filename )
{
return saveFrame( filename, m_pcCurrFrame );
return saveFrame( filename, m_frameBuffer->current() );
}
Bool PlaYUVerStream::saveFrame( const String& filename, PlaYUVerFrame* saveFrame )
@@ -537,23 +527,11 @@ Bool PlaYUVerStream::saveFrame( const String& filename, PlaYUVerFrame* saveFrame
Bool PlaYUVerStream::setNextFrame()
{
Bool bEndOfSeq = false;
if( m_pcNextFrame )
if( m_iCurrFrameNum + 1 < Int( m_uiTotalFrameNum ) )
{
m_pcCurrFrame = m_pcNextFrame;
m_frameBuffer->setNextFrame();
m_iCurrFrameNum++;
if( m_iCurrFrameNum + 1 < Int( m_uiTotalFrameNum ) )
{
m_uiFrameBufferIndex++;
if( m_uiFrameBufferIndex == m_uiFrameBufferSize )
{
m_uiFrameBufferIndex = 0;
}
m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
}
else
{
m_pcNextFrame = NULL;
}
}
else
{
@@ -562,23 +540,30 @@ Bool PlaYUVerStream::setNextFrame()
return bEndOfSeq;
}
Void PlaYUVerStream::readNextFrame()
{
readFrame( m_frameBuffer->next() );
}
Void PlaYUVerStream::readNextFrameFillRGBBuffer()
{
readNextFrame();
m_frameBuffer->next()->fillRGBBuffer();
return;
}
PlaYUVerFrame* PlaYUVerStream::getCurrFrame( PlaYUVerFrame* pyuv_image )
{
if( pyuv_image == NULL )
pyuv_image = new PlaYUVerFrame( m_pcCurrFrame );
pyuv_image = new PlaYUVerFrame( m_frameBuffer->current() );
else
pyuv_image->copyFrom( m_pcCurrFrame );
pyuv_image->copyFrom( m_frameBuffer->current() );
return pyuv_image;
}
PlaYUVerFrame* PlaYUVerStream::getCurrFrame()
{
return m_pcCurrFrame;
}
PlaYUVerFrame* PlaYUVerStream::getNextFrame()
{
return m_pcNextFrame;
return m_frameBuffer->current();
}
Bool PlaYUVerStream::seekInputRelative( Bool bIsFoward )
@@ -590,7 +575,7 @@ Bool PlaYUVerStream::seekInputRelative( Bool bIsFoward )
if( bIsFoward )
{
bRet = !setNextFrame();
readFrame();
readFrame( m_frameBuffer->next() );
}
else
{
@@ -605,29 +590,23 @@ Bool PlaYUVerStream::seekInput( UInt64 new_frame_num )
if( !m_bInit || new_frame_num >= m_uiTotalFrameNum || (Int64)new_frame_num == m_iCurrFrameNum )
return false;
m_iCurrFrameNum = new_frame_num - 1;
m_iCurrFrameNum = new_frame_num;
if( m_bLoadAll )
{
m_uiFrameBufferIndex = new_frame_num;
m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
setNextFrame();
m_frameBuffer->setIndex( m_iCurrFrameNum );
return true;
}
if( !m_pcHandler->seek( new_frame_num ) )
if( !m_pcHandler->seek( m_iCurrFrameNum ) )
{
throw PlaYUVerFailure( "PlaYUVerStream", "Cannot write into the file" );
}
m_uiCurrFrameFileIdx = new_frame_num;
m_uiFrameBufferIndex = 0;
m_pcCurrFrame = m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex];
readFrame();
setNextFrame();
m_frameBuffer->setIndex( 0 );
readFrame( m_frameBuffer->current() );
if( m_uiTotalFrameNum > 1 )
readFrame();
readFrame( m_frameBuffer->next() );
return true;
}