From 5387b95cd97edee38fb96082c945e48f61687441 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Fri, 21 Nov 2014 12:27:28 +0100 Subject: [PATCH 1/4] OutputFile: add getter for format context --- src/AvTranscoder/file/OutputFile.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index e94c5f40..fb49717c 100644 --- a/src/AvTranscoder/file/OutputFile.hpp +++ b/src/AvTranscoder/file/OutputFile.hpp @@ -108,6 +108,8 @@ class AvExport OutputFile virtual void addMetadata( const std::string& key, const std::string& value ); virtual void setVerbose( bool verbose = false ){ _verbose = verbose; } + + AVFormatContext& getFormatContext() { return *_formatContext; } private: std::vector _outputStreams; From d8afcb8915c7e8ad9ec24b0487fbe5a64cc861da Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Fri, 21 Nov 2014 12:28:24 +0100 Subject: [PATCH 2/4] Transcoder: compute progress duration from output format context --- src/AvTranscoder/transcoder/Transcoder.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 2ee022a6..4eef233f 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace avtranscoder { @@ -310,10 +311,18 @@ void Transcoder::process( IProgress& progress ) { if( _verbose ) std::cout << "process frame " << frame << std::endl; - if( ! processFrame() ) - break; - - if( progress.progress( 1 / _outputFps * ( frame ), totalDuration ) == eJobStatusCancel ) + + bool frameProcessed = processFrame(); + if( ! frameProcessed ) + break; + + int currentDts = _outputFile.getFormatContext().streams[0]->cur_dts; + int timebaseNum = _outputFile.getFormatContext().streams[0]->time_base.num; + int timebaseDen = _outputFile.getFormatContext().streams[0]->time_base.den; + + double duration = (double)currentDts * timebaseNum / timebaseDen; + + if( progress.progress( duration, totalDuration ) == eJobStatusCancel ) { break; } From d76c4109a8c6bc61c0d60a049891e620d97c44bd Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Fri, 21 Nov 2014 13:47:14 +0100 Subject: [PATCH 3/4] Transcoder: use av_q2d to compute progress duration --- src/AvTranscoder/transcoder/Transcoder.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 4eef233f..728b317d 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -316,11 +316,8 @@ void Transcoder::process( IProgress& progress ) if( ! frameProcessed ) break; - int currentDts = _outputFile.getFormatContext().streams[0]->cur_dts; - int timebaseNum = _outputFile.getFormatContext().streams[0]->time_base.num; - int timebaseDen = _outputFile.getFormatContext().streams[0]->time_base.den; - - double duration = (double)currentDts * timebaseNum / timebaseDen; + AVStream* firstOutputStream = _outputFile.getFormatContext().streams[0]; + double duration = firstOutputStream->cur_dts * av_q2d( firstOutputStream->time_base ); if( progress.progress( duration, totalDuration ) == eJobStatusCancel ) { From cf43b3b81c5dbaa728f538236865108913fcb42e Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Fri, 21 Nov 2014 14:36:31 +0100 Subject: [PATCH 4/4] Transcoder: switch progress duration computing members (for using automatic cast to double) --- src/AvTranscoder/transcoder/Transcoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 728b317d..5ce9a8db 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -317,7 +317,7 @@ void Transcoder::process( IProgress& progress ) break; AVStream* firstOutputStream = _outputFile.getFormatContext().streams[0]; - double duration = firstOutputStream->cur_dts * av_q2d( firstOutputStream->time_base ); + double duration = av_q2d( firstOutputStream->time_base ) * firstOutputStream->cur_dts; if( progress.progress( duration, totalDuration ) == eJobStatusCancel ) {