From 30851a7f13c023f077d5034292a02711b53d497b Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:39:45 +0100 Subject: [PATCH 01/39] AudioCodec: refactore getters * Do not duplicate getters with AudioFrameDesc (getSampleRate, getChannels...). * Keep symmetry with VideoCodec (rename getFrameDesc to getAudioFrameDesc). --- app/presetChecker/presetChecker.cpp | 2 +- src/AvTranscoder/codec/AudioCodec.cpp | 20 +------------------ src/AvTranscoder/codec/AudioCodec.hpp | 7 ++----- .../essenceStream/AvInputAudio.cpp | 2 +- .../transcoder/StreamTranscoder.cpp | 8 ++++---- 5 files changed, 9 insertions(+), 30 deletions(-) diff --git a/app/presetChecker/presetChecker.cpp b/app/presetChecker/presetChecker.cpp index f921f25f..5f8ae768 100644 --- a/app/presetChecker/presetChecker.cpp +++ b/app/presetChecker/presetChecker.cpp @@ -34,7 +34,7 @@ int main( int argc, char** argv ) if( profile.find( avtranscoder::constants::avProfileType )->second == avtranscoder::constants::avProfileTypeAudio ) { avtranscoder::AvOutputAudio outputAudio; - outputAudio.setProfile( profile, outputAudio.getAudioCodec().getFrameDesc() ); + outputAudio.setProfile( profile, outputAudio.getAudioCodec().getAudioFrameDesc() ); } } catch( ... ) diff --git a/src/AvTranscoder/codec/AudioCodec.cpp b/src/AvTranscoder/codec/AudioCodec.cpp index b96bbdaf..ba94746e 100644 --- a/src/AvTranscoder/codec/AudioCodec.cpp +++ b/src/AvTranscoder/codec/AudioCodec.cpp @@ -20,7 +20,7 @@ AudioCodec::AudioCodec( const ICodec& codec ) { } -AudioFrameDesc AudioCodec::getFrameDesc() const +AudioFrameDesc AudioCodec::getAudioFrameDesc() const { assert( _codecContext != NULL ); AudioFrameDesc audioFrameDesc; @@ -33,24 +33,6 @@ AudioFrameDesc AudioCodec::getFrameDesc() const return audioFrameDesc; } -const size_t AudioCodec::getSampleRate() const -{ - assert( _codecContext != NULL ); - return _codecContext->sample_rate; -} - -const size_t AudioCodec::getChannels() const -{ - assert( _codecContext != NULL ); - return _codecContext->channels; -} - -const AVSampleFormat AudioCodec::getAVSampleFormat() const -{ - assert( _codecContext != NULL ); - return _codecContext->sample_fmt; -} - void AudioCodec::setAudioParameters( const AudioFrameDesc& audioFrameDesc ) { setAudioParameters( audioFrameDesc.getSampleRate(), audioFrameDesc.getChannels(), audioFrameDesc.getAVSampleFormat() ); diff --git a/src/AvTranscoder/codec/AudioCodec.hpp b/src/AvTranscoder/codec/AudioCodec.hpp index 5d86e1aa..75c0734c 100644 --- a/src/AvTranscoder/codec/AudioCodec.hpp +++ b/src/AvTranscoder/codec/AudioCodec.hpp @@ -14,11 +14,8 @@ class AvExport AudioCodec : public ICodec AudioCodec( const ECodecType type, const AVCodecID codecId ); AudioCodec( const ICodec& codec ); - AudioFrameDesc getFrameDesc() const; - const size_t getSampleRate() const; - const size_t getChannels() const; - const AVSampleFormat getAVSampleFormat() const; - + AudioFrameDesc getAudioFrameDesc() const; + void setAudioParameters( const AudioFrameDesc& audioFrameDesc ); void setAudioParameters( const size_t sampleRate, const size_t channels, const AVSampleFormat sampleFormat ); }; diff --git a/src/AvTranscoder/essenceStream/AvInputAudio.cpp b/src/AvTranscoder/essenceStream/AvInputAudio.cpp index 0187f20e..21f29679 100644 --- a/src/AvTranscoder/essenceStream/AvInputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvInputAudio.cpp @@ -49,7 +49,7 @@ void AvInputAudio::setup() AVCodecContext* avCodecContext = _codec.getAVCodecContext(); AVCodec* avCodec = _codec.getAVCodec(); - avCodecContext->channels = _inputStream->getAudioCodec().getChannels(); + avCodecContext->channels = _inputStream->getAudioCodec().getAudioFrameDesc().getChannels(); int ret = avcodec_open2( avCodecContext, avCodec, NULL ); diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index da35ceb8..841a606a 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -126,7 +126,7 @@ StreamTranscoder::StreamTranscoder( _outputEssence = outputAudio; - AudioFrameDesc outputFrameDesc( _inputStream->getAudioCodec().getFrameDesc() ); + AudioFrameDesc outputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() ); outputFrameDesc.setParameters( profile ); if( subStreamIndex > -1 ) { @@ -137,12 +137,12 @@ StreamTranscoder::StreamTranscoder( _outputStream = &outputFile.addAudioStream( outputAudio->getAudioCodec() ); - AudioFrameDesc inputFrameDesc( _inputStream->getAudioCodec().getFrameDesc() ); + AudioFrameDesc inputFrameDesc( _inputStream->getAudioCodec().getAudioFrameDesc() ); if( subStreamIndex > -1 ) inputFrameDesc.setChannels( 1 ); _sourceBuffer = new AudioFrame( inputFrameDesc ); - _frameBuffer = new AudioFrame( outputAudio->getAudioCodec().getFrameDesc() ); + _frameBuffer = new AudioFrame( outputAudio->getAudioCodec().getAudioFrameDesc() ); _transform = new AudioTransform(); @@ -223,7 +223,7 @@ StreamTranscoder::StreamTranscoder( _inputEssence = generatorAudio; // Create inputFrame, and outputFrame which is based on a given profile - AudioFrameDesc inputFrameDesc = inputAudioCodec.getFrameDesc(); + AudioFrameDesc inputFrameDesc = inputAudioCodec.getAudioFrameDesc(); AudioFrameDesc outputFrameDesc = inputFrameDesc; outputFrameDesc.setParameters( profile ); _sourceBuffer = new AudioFrame( inputFrameDesc ); From 01c9b19f0d7e66aa98111186afc744de90c18d13 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:45:05 +0100 Subject: [PATCH 02/39] VideoCodec: refactore getVideoFrameDesc --- src/AvTranscoder/codec/VideoCodec.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/AvTranscoder/codec/VideoCodec.cpp b/src/AvTranscoder/codec/VideoCodec.cpp index faae1076..f29b581b 100644 --- a/src/AvTranscoder/codec/VideoCodec.cpp +++ b/src/AvTranscoder/codec/VideoCodec.cpp @@ -23,14 +23,16 @@ VideoCodec::VideoCodec( const ICodec& codec ) VideoFrameDesc VideoCodec::getVideoFrameDesc() const { assert( _codecContext != NULL ); - VideoFrameDesc VideoFrameDesc; + + VideoFrameDesc videoFrameDesc; + videoFrameDesc.setWidth ( _codecContext->width ); + videoFrameDesc.setHeight( _codecContext->height ); + videoFrameDesc.setDar( _codecContext->width, _codecContext->height ); + Pixel pixel( _codecContext->pix_fmt ); + videoFrameDesc.setPixel( pixel ); - VideoFrameDesc.setWidth ( _codecContext->width ); - VideoFrameDesc.setHeight( _codecContext->height ); - VideoFrameDesc.setPixel ( pixel ); - VideoFrameDesc.setDar ( _codecContext->height, _codecContext->width ); - return VideoFrameDesc; + return videoFrameDesc; } std::pair< size_t, size_t > VideoCodec::getTimeBase() const From 1c786365de8c3619000dc069ad652895c7f39ace Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:46:25 +0100 Subject: [PATCH 03/39] Generators: add documentation for attributes --- src/AvTranscoder/essenceStream/GeneratorAudio.hpp | 4 ++-- src/AvTranscoder/essenceStream/GeneratorVideo.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/essenceStream/GeneratorAudio.hpp b/src/AvTranscoder/essenceStream/GeneratorAudio.hpp index 0c8e80d1..1c1588de 100644 --- a/src/AvTranscoder/essenceStream/GeneratorAudio.hpp +++ b/src/AvTranscoder/essenceStream/GeneratorAudio.hpp @@ -24,8 +24,8 @@ class AvExport GeneratorAudio : public IInputEssence bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ); private: - const AudioCodec* _codec; - Frame* _inputFrame; + const AudioCodec* _codec; ///< Has link (no ownership) + Frame* _inputFrame; ///< Has link (no ownership) AudioFrameDesc _frameDesc; }; diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.hpp b/src/AvTranscoder/essenceStream/GeneratorVideo.hpp index 54a206ab..59d027b3 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.hpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.hpp @@ -25,8 +25,8 @@ class AvExport GeneratorVideo : public IInputEssence bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ); private: - const VideoCodec* _codec; - Frame* _inputFrame; + const VideoCodec* _codec; ///< Has link (no ownership) + Frame* _inputFrame; ///< Has link (no ownership) VideoFrameDesc _videoFrameDesc; size_t _numberOfView; From 4ca62566b1d4b86d33f8beb128ec4a875aa81579 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:48:54 +0100 Subject: [PATCH 04/39] GeneratorVideo: throw exception if no codec --- src/AvTranscoder/essenceStream/GeneratorVideo.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp index e1a37861..3fd12211 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp @@ -2,6 +2,8 @@ #include +#include + namespace avtranscoder { @@ -32,8 +34,14 @@ void GeneratorVideo::setFrame( Frame& inputFrame ) bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) { + // Generate black image if( ! _inputFrame ) { + if( ! _codec ) + { + throw std::runtime_error( "Can't readNextFrame of video generator without knowing codec." ); + } + // @todo support PAL (0 to 255) and NTFS (16 to 235) int fillChar = 0; @@ -55,7 +63,8 @@ bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) return true; } - + + // Take image from _inputFrame if( frameBuffer.getSize() != _inputFrame->getSize() ) frameBuffer.getBuffer().resize( _inputFrame->getSize() ); std::memcpy( frameBuffer.getPtr(), _inputFrame->getPtr(), _inputFrame->getSize() ); From b91fc308e8c9be8ad2bc171579505d1039ee2c3e Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:49:24 +0100 Subject: [PATCH 05/39] AvOutputVideo: clean encodeFrame Remove comments. --- .../essenceStream/AvOutputVideo.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp index 0c636e15..3c56f417 100644 --- a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp @@ -103,25 +103,7 @@ bool AvOutputVideo::encodeFrame( const Frame& sourceFrame, Frame& codedFrame ) memcpy( codedFrame.getPtr(), packet.data, packet.size ); } #endif -/* - std::string imgType = ""; - switch( codecContext->coded_frame->pict_type ) - { - case AV_PICTURE_TYPE_NONE : imgType = "None"; break; - case AV_PICTURE_TYPE_I : imgType = "I"; break; - case AV_PICTURE_TYPE_P : imgType = "P"; break; - case AV_PICTURE_TYPE_B : imgType = "B"; break; - case AV_PICTURE_TYPE_S : imgType = "S"; break; - case AV_PICTURE_TYPE_SI : imgType = "SI"; break; - case AV_PICTURE_TYPE_SP : imgType = "SP"; break; - case AV_PICTURE_TYPE_BI : imgType = "BI"; break; - } - std::clog << "\tframe " << codecContext->coded_frame->display_picture_number; - std::clog << " coded @ " << codecContext->coded_frame->coded_picture_number; - std::clog << " type : " << imgType; - std::clog << " quality : " << codecContext->coded_frame->quality << std::endl; -*/ av_free_packet( &packet ); #if LIBAVCODEC_VERSION_MAJOR > 54 av_frame_free( &frame ); From 1869f4a0fc9a814e568f2bd54e6de335c0d6268e Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:50:19 +0100 Subject: [PATCH 06/39] VideoFrame: setPixel takes a reference --- src/AvTranscoder/frame/VideoFrame.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/frame/VideoFrame.hpp b/src/AvTranscoder/frame/VideoFrame.hpp index 569cb10a..fedc69f2 100644 --- a/src/AvTranscoder/frame/VideoFrame.hpp +++ b/src/AvTranscoder/frame/VideoFrame.hpp @@ -40,7 +40,7 @@ class AvExport VideoFrameDesc void setWidth ( const size_t width ) { _width = width; } void setHeight( const size_t height ) { _height = height; } - void setPixel ( const Pixel pixel ) { _pixel = pixel; } + void setPixel( const Pixel& pixel ) { _pixel = pixel; } void setDar( const size_t num, const size_t den ) { _displayAspectRatio.num = num; _displayAspectRatio.den = den; } void setDar( const Rational ratio ) { _displayAspectRatio = ratio; } From 7c885d3e74da330cca4f958b920b07230081da9f Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 31 Oct 2014 18:51:38 +0100 Subject: [PATCH 07/39] Context: add typedef to manipulate options Add OptionArray and OptionMap. --- src/AvTranscoder/option/Context.hpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/AvTranscoder/option/Context.hpp b/src/AvTranscoder/option/Context.hpp index b804943c..b7e43e8d 100644 --- a/src/AvTranscoder/option/Context.hpp +++ b/src/AvTranscoder/option/Context.hpp @@ -11,6 +11,9 @@ namespace avtranscoder { +typedef std::vector