diff --git a/source/app/InputStream.cpp b/source/app/InputStream.cpp index cbab9f8..5f1699f 100755 --- a/source/app/InputStream.cpp +++ b/source/app/InputStream.cpp @@ -133,10 +133,9 @@ Bool InputStream::open( QString filename, UInt width, UInt height, Int input_for #ifdef USE_FFMPEG if( QFileInfo( filename ).completeSuffix().compare( QString( "yuv" ) ) ) { - avStatus = m_cLibAvContext.initAvFormat( m_cFilename.toLocal8Bit().data(), m_uiWidth, m_uiHeight, m_iPixelFormat, m_uiFrameRate ); + avStatus = m_cLibAvContext.initAvFormat( m_cFilename.toLocal8Bit().data(), m_uiWidth, m_uiHeight, m_iPixelFormat, m_uiFrameRate, m_uiTotalFrameNum ); m_cFormatName = QFileInfo( filename ).completeSuffix().toUpper(); m_cCodedName = QString::fromUtf8( m_cLibAvContext.getCodecName() ).toUpper(); - m_uiTotalFrameNum = 100; } #endif @@ -222,7 +221,9 @@ Void InputStream::close() if( m_pInputBuffer ) freeMem1D( m_pInputBuffer ); - qDebug() << "Frame read time: " << QString::number( 1000 / (m_uiAveragePlayInterval+1) ) << " fps"; + qDebug( ) << "Frame read time: " + << QString::number( 1000 / ( m_uiAveragePlayInterval + 1 ) ) + << " fps"; m_bInit = false; } @@ -286,6 +287,28 @@ Bool InputStream::guessFormat( QString filename, UInt& rWidth, UInt& rHeight, In return bRet; } +Void InputStream::getDuration( Int* duration_array ) +{ + Int hours, mins, secs; +#ifdef USE_FFMPEG + if( m_cLibAvContext.getStatus() ) + { + secs = m_cLibAvContext.getStreamDuration(); + } + else +#endif + { + secs = m_uiTotalFrameNum * m_uiFrameRate; + } + mins = secs / 60; + secs %= 60; + hours = mins / 60; + mins %= 60; + *duration_array++ = hours; + *duration_array++ = mins; + *duration_array++ = secs; +} + Void InputStream::readNextFrame() { UInt64 bytes_read = 0; @@ -396,7 +419,7 @@ Void InputStream::seekInput( UInt64 new_frame_num ) readNextFrame(); setNextFrame(); if( m_uiTotalFrameNum > 1 ) - readNextFrame(); + readNextFrame(); } Bool InputStream::checkErrors( Int error_type ) diff --git a/source/app/InputStream.h b/source/app/InputStream.h index 9915a85..6365c9d 100755 --- a/source/app/InputStream.h +++ b/source/app/InputStream.h @@ -167,6 +167,7 @@ public: { return m_uiFrameRate; } + Void getDuration( Int* duration_array ); Void setWidth( UInt new_width ) { diff --git a/source/app/PropertiesSidebar.cpp b/source/app/PropertiesSidebar.cpp index a72deb1..23daea2 100755 --- a/source/app/PropertiesSidebar.cpp +++ b/source/app/PropertiesSidebar.cpp @@ -39,7 +39,7 @@ static inline QSize bestSize( QSize currSize ); //////////////////////////////////////////////////////////////////////////////// StreamPropertiesSideBar::StreamPropertiesSideBar( QWidget* parent ) : - QWidget( parent ) + QWidget( parent ) { // -------------- Variables definition -------------- m_pcStream = NULL; @@ -58,12 +58,20 @@ StreamPropertiesSideBar::StreamPropertiesSideBar( QWidget* parent ) : labelCodecValue = new QLabel; labelCodecValue->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); - QLabel *sizeLabel = new QLabel( tr( "Size (pixels):" ) ); + QLabel *durationLabel = new QLabel( tr( "Duration:" ) ); + durationLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); + labelDurationValueTime = new QLabel; + labelDurationValueTime->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + + labelDurationValueFrames = new QLabel; + labelDurationValueFrames->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + + QLabel *sizeLabel = new QLabel( tr( "Resolution:" ) ); sizeLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); labelSizeValue = new QLabel; labelSizeValue->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); - QLabel *colorSpaceLabel = new QLabel( tr( "Colorspace:" ) ); + QLabel *colorSpaceLabel = new QLabel( tr( "Color Space:" ) ); colorSpaceLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); labelColorSpaceValue = new QLabel; labelColorSpaceValue->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); @@ -76,20 +84,26 @@ StreamPropertiesSideBar::StreamPropertiesSideBar( QWidget* parent ) : propertiesLayout->addWidget( codecLabel, layout_line, 0 ); propertiesLayout->addWidget( labelCodecValue, layout_line, 1 ); layout_line++; + propertiesLayout->addWidget( durationLabel, layout_line, 0 ); + propertiesLayout->addWidget( labelDurationValueTime, layout_line, 1 ); + layout_line++; + propertiesLayout->addWidget( labelDurationValueFrames, layout_line, 1 ); + layout_line++; propertiesLayout->addWidget( sizeLabel, layout_line, 0 ); propertiesLayout->addWidget( labelSizeValue, layout_line, 1 ); layout_line++; propertiesLayout->addWidget( colorSpaceLabel, layout_line, 0 ); propertiesLayout->addWidget( labelColorSpaceValue, layout_line, 1 ); - QGroupBox *propertiesGroup = new QGroupBox( tr( "Properties" ) ); - propertiesGroup->setLayout( propertiesLayout ); - mainLayout->addWidget( propertiesGroup, 6, 0, 1, 4 ); +// QGroupBox *propertiesGroup = new QGroupBox; +// propertiesGroup->setLayout( propertiesLayout ); +// mainLayout->addWidget( propertiesGroup ); +// mainLayout->setRowStretch( 8, 10 ); - mainLayout->setRowStretch( 8, 10 ); - setLayout( mainLayout ); + propertiesLayout->setRowStretch( 8, 10 ); + setLayout( propertiesLayout ); + //setLayout( mainLayout ); setEnabled( false ); - } StreamPropertiesSideBar::~StreamPropertiesSideBar() @@ -122,9 +136,16 @@ Void StreamPropertiesSideBar::setData( InputStream* pcStream ) QString value; labelFormatValue->setText( m_pcStream->getFormatName() ); labelCodecValue->setText( m_pcStream->getCodecName() ); - uint width = m_pcStream->getWidth(); - uint height = m_pcStream->getHeight(); - value = QString( tr( "%1 x %2" ) ).arg( width ).arg( height ); + Int duration[3]; + m_pcStream->getDuration( duration ); + value = QString( tr( "%1h:%2m:%3s" ) ).arg( duration[0] ).arg( duration[1] ).arg( duration[2] ); + labelDurationValueTime->setText( value ); + value = QString( tr( "%1 frms" ) ).arg( m_pcStream->getFrameNum() ); + labelDurationValueFrames->setText( value ); + UInt width = m_pcStream->getWidth(); + UInt height = m_pcStream->getHeight(); + UInt fps = m_pcStream->getFrameRate(); + value = QString( tr( "%1 x %2 @ %3 Hz" ) ).arg( width ).arg( height ).arg( fps ); labelSizeValue->setText( value ); value = QString( PlaYUVerFrame::supportedPixelFormatList().at( m_pcStream->getCurrFrame()->getPelFormat() ) ); labelColorSpaceValue->setText( value ); @@ -136,7 +157,7 @@ Void StreamPropertiesSideBar::setData( InputStream* pcStream ) //////////////////////////////////////////////////////////////////////////////// FramePropertiesSideBar::FramePropertiesSideBar( QWidget* parent ) : - QWidget( parent ) + QWidget( parent ) { // -------------- Variables definition -------------- m_pcFrame = NULL; @@ -244,6 +265,5 @@ static inline QSize bestSize( QSize currSize ) return currSize; } - } // NAMESPACE diff --git a/source/app/PropertiesSidebar.h b/source/app/PropertiesSidebar.h index 35855c9..57e9e5b 100755 --- a/source/app/PropertiesSidebar.h +++ b/source/app/PropertiesSidebar.h @@ -53,6 +53,8 @@ private: QLabel* labelFormatValue; QLabel* labelCodecValue; + QLabel* labelDurationValueTime; + QLabel* labelDurationValueFrames; QLabel* labelSizeValue; QLabel* labelColorSpaceValue; }; diff --git a/source/lib/ffmpeg/LibAvContextHandle.cpp b/source/lib/ffmpeg/LibAvContextHandle.cpp index 1c284bb..436933d 100755 --- a/source/lib/ffmpeg/LibAvContextHandle.cpp +++ b/source/lib/ffmpeg/LibAvContextHandle.cpp @@ -81,7 +81,7 @@ Void LibAvContextHandle::closeAvFormat() m_bHasStream = false; } -Bool LibAvContextHandle::initAvFormat( char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& frame_rate ) +Bool LibAvContextHandle::initAvFormat( char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& frame_rate, UInt64& num_frames ) { int ret = 0; @@ -152,9 +152,7 @@ Bool LibAvContextHandle::initAvFormat( char* filename, UInt& width, UInt& height video_dst_bufsize = ret; } - const char *codec_name = avcodec_get_name(video_dec_ctx->codec_id); - sprintf(m_acCodecName, "%s", codec_name); Double fr = 30; @@ -171,6 +169,18 @@ Bool LibAvContextHandle::initAvFormat( char* filename, UInt& width, UInt& height frame_rate = ( UInt )fr; + if( fmt_ctx->duration != AV_NOPTS_VALUE ) + { + Int64 duration = fmt_ctx->duration + 5000; + m_uiSecs = duration / AV_TIME_BASE; + num_frames = m_uiSecs * frame_rate; + m_uiMicroSec = duration % AV_TIME_BASE; + } + else + { + num_frames = 0; + } + width = video_dec_ctx->width; height = video_dec_ctx->height; switch( video_dec_ctx->pix_fmt ) @@ -191,6 +201,7 @@ Bool LibAvContextHandle::initAvFormat( char* filename, UInt& width, UInt& height pixel_format = PlaYUVerFrame::RGB8; break; default: + pixel_format = PlaYUVerFrame::NO_FMT; break; } @@ -269,7 +280,7 @@ Bool LibAvContextHandle::decodeAvFormat() Void LibAvContextHandle::seekAvFormat( UInt64 frame_num ) { - av_seek_frame( fmt_ctx, video_stream_idx, frame_num, AVSEEK_FLAG_ANY ); + av_seek_frame( fmt_ctx, video_stream_idx, frame_num, AVSEEK_FLAG_FRAME ); } } // NAMESPACE diff --git a/source/lib/ffmpeg/LibAvContextHandle.h b/source/lib/ffmpeg/LibAvContextHandle.h index 9fd15be..10e84d8 100755 --- a/source/lib/ffmpeg/LibAvContextHandle.h +++ b/source/lib/ffmpeg/LibAvContextHandle.h @@ -53,10 +53,10 @@ class LibAvContextHandle { public: LibAvContextHandle() : - m_bHasStream( false ) + m_bHasStream( false ) { } - Bool initAvFormat( char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& frame_rate ); + Bool initAvFormat( char* filename, UInt& width, UInt& height, Int& pixel_format, UInt& frame_rate, UInt64& num_frames ); Void closeAvFormat(); Bool decodeAvFormat(); @@ -70,6 +70,10 @@ public: { return m_acCodecName; } + UInt getStreamDuration( ) + { + return m_uiSecs; + } uint8_t *video_dst_data[4]; int video_dst_linesize[4]; @@ -86,6 +90,8 @@ private: Bool m_bHasStream; Char m_acCodecName[20]; + UInt m_uiSecs; + UInt m_uiMicroSec; }; } // NAMESPACE