From bd24d5b0c8b6181d1f37989edea72d345401abee Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Thu, 25 Jun 2020 09:51:09 +0200 Subject: [PATCH 1/8] StreamTranscoder: fix positive offset in case of codec latency --- src/AvTranscoder/transcoder/StreamTranscoder.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index 7e397dac..ead27693 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -588,6 +588,15 @@ void StreamTranscoder::preProcessCodecLatency() wasARewrapCase = true; } + if(_offset > 0) { + const double fps = 1.0 * _outputEncoder->getCodec().getAVCodecContext().time_base.den / + (_outputEncoder->getCodec().getAVCodecContext().time_base.num * _outputEncoder->getCodec().getAVCodecContext().ticks_per_frame); + const double frame_duration = 1.0 / fps; + const double output_latency_duration = frame_duration * (latency - 1); + LOG_WARN("Compensate for offset with codec latency by " << output_latency_duration << " seconds (fps=" << fps << ", latency=" << latency << ")"); + _offset -= output_latency_duration; + } + while((latency--) > 0) { processFrame(); From 388d84757e0d199e5dcb5a7b4c955c8ab49e9710 Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Thu, 25 Jun 2020 09:57:58 +0200 Subject: [PATCH 2/8] Add test output files to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 427a1344..e08b9c55 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,10 @@ *.la *.a -build +build* dist +install* +test/**/test*[.wav|.avi|.mov|.h264|.mxf] # CMake CMakeCache.txt From c06898bbccb1514f8a45c8c2be15a23e69252227 Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Fri, 26 Jun 2020 11:44:42 +0200 Subject: [PATCH 3/8] IDecoder: add decoded frames counter --- src/AvTranscoder/decoder/AudioDecoder.cpp | 4 ++++ src/AvTranscoder/decoder/AudioGenerator.cpp | 2 ++ src/AvTranscoder/decoder/IDecoder.hpp | 19 +++++++++++++++++++ src/AvTranscoder/decoder/VideoDecoder.cpp | 4 ++++ src/AvTranscoder/decoder/VideoGenerator.cpp | 2 ++ 5 files changed, 31 insertions(+) diff --git a/src/AvTranscoder/decoder/AudioDecoder.cpp b/src/AvTranscoder/decoder/AudioDecoder.cpp index a995a3df..f1086fcc 100644 --- a/src/AvTranscoder/decoder/AudioDecoder.cpp +++ b/src/AvTranscoder/decoder/AudioDecoder.cpp @@ -121,6 +121,10 @@ bool AudioDecoder::decodeNextFrame(IFrame& frameBuffer) return false; } } + + if(decodeNextFrame) + incrementNbDecodedFrames(frameBuffer.getAVFrame().nb_samples); + return decodeNextFrame; } diff --git a/src/AvTranscoder/decoder/AudioGenerator.cpp b/src/AvTranscoder/decoder/AudioGenerator.cpp index 9374b3df..6842ba21 100644 --- a/src/AvTranscoder/decoder/AudioGenerator.cpp +++ b/src/AvTranscoder/decoder/AudioGenerator.cpp @@ -58,6 +58,8 @@ bool AudioGenerator::decodeNextFrame(IFrame& frameBuffer) LOG_DEBUG("Convert data of the audio specified when decode next frame") _audioTransform.convert(*_inputFrame, frameBuffer); } + + incrementNbDecodedFrames(_silent->getNbSamplesPerChannel()); return true; } diff --git a/src/AvTranscoder/decoder/IDecoder.hpp b/src/AvTranscoder/decoder/IDecoder.hpp index d9acf8d1..40e79619 100644 --- a/src/AvTranscoder/decoder/IDecoder.hpp +++ b/src/AvTranscoder/decoder/IDecoder.hpp @@ -10,7 +10,16 @@ namespace avtranscoder class AvExport IDecoder { +protected: + IDecoder::IDecoder() + : _decoded_frames_counter(0) + { + } + public: + + + virtual ~IDecoder(){}; /** @@ -51,6 +60,16 @@ class AvExport IDecoder * @note Not sense for generators. */ virtual void flushDecoder() {} + + size_t getNbDecodedFrames() { return _decoded_frames_counter; } + +protected: + void incrementNbDecodedFrames(const size_t& nb_frames = 1) { + _decoded_frames_counter += nb_frames; + } + +private: + size_t _decoded_frames_counter; }; } diff --git a/src/AvTranscoder/decoder/VideoDecoder.cpp b/src/AvTranscoder/decoder/VideoDecoder.cpp index ae76fb05..3c1e1beb 100644 --- a/src/AvTranscoder/decoder/VideoDecoder.cpp +++ b/src/AvTranscoder/decoder/VideoDecoder.cpp @@ -114,6 +114,10 @@ bool VideoDecoder::decodeNextFrame(IFrame& frameBuffer) return false; } } + + if(decodeNextFrame) + incrementNbDecodedFrames(); + return decodeNextFrame; } diff --git a/src/AvTranscoder/decoder/VideoGenerator.cpp b/src/AvTranscoder/decoder/VideoGenerator.cpp index ad89c9ac..155d635d 100644 --- a/src/AvTranscoder/decoder/VideoGenerator.cpp +++ b/src/AvTranscoder/decoder/VideoGenerator.cpp @@ -51,6 +51,8 @@ bool VideoGenerator::decodeNextFrame(IFrame& frameBuffer) LOG_DEBUG("Convert data of the image specified when decode next frame") _videoTransform.convert(*_inputFrame, frameBuffer); } + + incrementNbDecodedFrames(); return true; } From 691e4fe82cfc477a2f54986b25607bb67d5904d3 Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Fri, 26 Jun 2020 11:46:14 +0200 Subject: [PATCH 4/8] StreamTranscoder: check end of positive offset based on number of generated frames --- .../transcoder/StreamTranscoder.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index ead27693..b912e32e 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -588,15 +588,6 @@ void StreamTranscoder::preProcessCodecLatency() wasARewrapCase = true; } - if(_offset > 0) { - const double fps = 1.0 * _outputEncoder->getCodec().getAVCodecContext().time_base.den / - (_outputEncoder->getCodec().getAVCodecContext().time_base.num * _outputEncoder->getCodec().getAVCodecContext().ticks_per_frame); - const double frame_duration = 1.0 / fps; - const double output_latency_duration = frame_duration * (latency - 1); - LOG_WARN("Compensate for offset with codec latency by " << output_latency_duration << " seconds (fps=" << fps << ", latency=" << latency << ")"); - _offset -= output_latency_duration; - } - while((latency--) > 0) { processFrame(); @@ -626,7 +617,20 @@ bool StreamTranscoder::processFrame() // Manage offset if(_offset > 0) { - const bool endOfOffset = _outputStream->getStreamDuration() >= _offset; + bool endOfOffset = false; + if(_currentDecoder == _generators.at(0)) + { + const double fps = 1.0 * _outputEncoder->getCodec().getAVCodecContext().time_base.den / + (_outputEncoder->getCodec().getAVCodecContext().time_base.num * _outputEncoder->getCodec().getAVCodecContext().ticks_per_frame); + const double frame_duration = 1.0 / fps; + const double generated_duration = _currentDecoder->getNbDecodedFrames() * frame_duration; + endOfOffset = generated_duration >= _offset; + } + else + { + endOfOffset = _outputStream->getStreamDuration() >= _offset; + } + if(endOfOffset) { LOG_INFO("End of positive offset") From b62ed71bdba5e4f979041029d1c722b464acbdf9 Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Fri, 26 Jun 2020 11:47:54 +0200 Subject: [PATCH 5/8] StreamTranscoder: don't flush encoder before switching to generator if needed --- src/AvTranscoder/transcoder/StreamTranscoder.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index b912e32e..6add9cc2 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -763,8 +763,7 @@ bool StreamTranscoder::processTranscode() } } - // Transform - CodedData data; + // Check decoding status bool continueProcess = true; for(size_t index = 0; index < decodingStatus.size(); ++index) { @@ -773,6 +772,17 @@ bool StreamTranscoder::processTranscode() if(!_filterGraph->hasFilters() || !_filterGraph->hasBufferedFrames(index)) { continueProcess = false; + if(_needToSwitchToGenerator) + { + switchToGeneratorDecoder(); + LOG_INFO("Force reallocation of the decoded data buffers since the decoders could have cleared them.") + for(std::vector::iterator it = _decodedData.begin(); it != _decodedData.end(); ++it) + { + if(! (*it)->isDataAllocated()) + (*it)->allocateData(); + } + return processTranscode(); + } break; } LOG_DEBUG("Some frames remain into filter graph buffer " << index); @@ -784,8 +794,10 @@ bool StreamTranscoder::processTranscode() } } + CodedData data; if(continueProcess) { + // Transform IFrame* dataToTransform = NULL; if(_filterGraph->hasFilters()) { From 83d6565c46514e04564a379cf8d2e6aade43e94f Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Fri, 26 Jun 2020 11:48:59 +0200 Subject: [PATCH 6/8] StreamTranscoder: assert that generators and encoders number are equal --- src/AvTranscoder/transcoder/StreamTranscoder.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index 6add9cc2..8ce1c22f 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -717,6 +717,7 @@ bool StreamTranscoder::processTranscode() assert(_outputEncoder != NULL); assert(! _decodedData.empty()); assert(_transform != NULL); + assert(_generators.size() == _inputDecoders.size()); LOG_DEBUG("StreamTranscoder::processTranscode") From 319af3cfffe27c3a691b899efdacb41dbc3e1e3a Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Fri, 26 Jun 2020 12:18:50 +0200 Subject: [PATCH 7/8] IDecoder: fix constructor definition --- src/AvTranscoder/decoder/IDecoder.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/decoder/IDecoder.hpp b/src/AvTranscoder/decoder/IDecoder.hpp index 40e79619..48e254a4 100644 --- a/src/AvTranscoder/decoder/IDecoder.hpp +++ b/src/AvTranscoder/decoder/IDecoder.hpp @@ -11,7 +11,7 @@ namespace avtranscoder class AvExport IDecoder { protected: - IDecoder::IDecoder() + IDecoder() : _decoded_frames_counter(0) { } From 76481a8b44b7ef4127bf415cea201fb40f1fc558 Mon Sep 17 00:00:00 2001 From: Valentin NOEL Date: Mon, 29 Jun 2020 14:23:35 +0200 Subject: [PATCH 8/8] IDecoder: Remove empty lines --- src/AvTranscoder/decoder/IDecoder.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/AvTranscoder/decoder/IDecoder.hpp b/src/AvTranscoder/decoder/IDecoder.hpp index 48e254a4..66062140 100644 --- a/src/AvTranscoder/decoder/IDecoder.hpp +++ b/src/AvTranscoder/decoder/IDecoder.hpp @@ -17,9 +17,6 @@ class AvExport IDecoder } public: - - - virtual ~IDecoder(){}; /** pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy