From ddaa54b3edd80a8953d546b218e0435cd25e8a3b Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Mon, 30 Jun 2014 09:31:21 -0400 Subject: [PATCH 01/15] starting reformating StreamTranscoder --- .../Transcoder/StreamTranscoder.cpp | 57 ++++-- .../Transcoder/StreamTranscoder.hpp | 30 ++- src/AvTranscoder/Transcoder/Transcoder.cpp | 183 ++++++++++-------- src/AvTranscoder/Transcoder/Transcoder.hpp | 12 +- src/AvTranscoder/avTranscoder.i | 6 + 5 files changed, 174 insertions(+), 114 deletions(-) diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp index 5d0e7838..9c2b96ed 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp @@ -6,13 +6,40 @@ namespace avtranscoder { -StreamTranscoder::StreamTranscoder( InputStream& stream, OutputFile& outputFile, const size_t& streamId ) - : _stream( &stream ) +StreamTranscoder::StreamTranscoder( InputStream& inputStream, OutputStream& outputStream ) + : _inputStream( &inputStream ) + , _outputStream( &outputStream ) , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) , _inputEssence( NULL ) , _outputEssence( NULL ) - , _outputFile( &outputFile ) - , _streamIndex( streamId ) + , _transcodeStream( false ) +{ + +} + +StreamTranscoder::StreamTranscoder( InputStream& inputStream, OutputStream& outputStream, Profile::ProfileDesc& profile ) + : _inputStream( &inputStream ) + , _outputStream( &outputStream ) + , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) + , _inputEssence( NULL ) + , _outputEssence( NULL ) + , _transcodeStream( false ) +{ + +} + +StreamTranscoder::StreamTranscoder( InputEssence& inputEssence, OutputStream& outputStream, Profile::ProfileDesc& profile ) + : _inputStream( NULL ) + , _outputStream( &outputStream ) + , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) + , _inputEssence( &inputEssence ) + , _outputEssence( NULL ) , _transcodeStream( false ) { } @@ -31,17 +58,17 @@ void StreamTranscoder::init( const std::string& profile ) { _transcodeStream = profile.size(); - switch( _stream->getStreamType() ) + switch( _inputStream->getStreamType() ) { case AVMEDIA_TYPE_VIDEO : { - _inputEssence = new InputVideo( *static_cast( _stream ) ); + _inputEssence = new InputVideo( *static_cast( _inputStream ) ); _inputEssence->setup(); // re-wrap only, get output descriptor from input if( profile.empty() ) { - _outputFile->addVideoStream( _stream->getVideoDesc() ); + // _outputFile->addVideoStream( _inputStream->getVideoDesc() ); break; } @@ -49,7 +76,7 @@ void StreamTranscoder::init( const std::string& profile ) _outputEssence = outputVideo; _outputEssence->setProfile( profile ); - _outputFile->addVideoStream( outputVideo->getVideoDesc() ); + // _outputFile->addVideoStream( outputVideo->getVideoDesc() ); _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); _frameBuffer = _videoFrameBuffer; @@ -57,13 +84,13 @@ void StreamTranscoder::init( const std::string& profile ) } case AVMEDIA_TYPE_AUDIO : { - _inputEssence = new InputAudio( *static_cast( _stream ) ); + _inputEssence = new InputAudio( *static_cast( _inputStream ) ); _inputEssence->setup(); // re-wrap only, get output descriptor from input if( profile.empty() ) { - _outputFile->addAudioStream( _stream->getAudioDesc() ); + // _outputFile->addAudioStream( _inputStream->getAudioDesc() ); break; } @@ -71,7 +98,7 @@ void StreamTranscoder::init( const std::string& profile ) _outputEssence = outputAudio; _outputEssence->setProfile( profile ); - _outputFile->addAudioStream( outputAudio->getAudioDesc() ); + // _outputFile->addAudioStream( outputAudio->getAudioDesc() ); _audioFrameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); _frameBuffer = _audioFrameBuffer; @@ -87,14 +114,12 @@ bool StreamTranscoder::processFrame() DataStream dataStream; if( ! _transcodeStream ) { - if( ! _stream->readNextPacket( dataStream ) ) + if( ! _inputStream->readNextPacket( dataStream ) ) return false; - _outputFile->wrap( dataStream, _streamIndex ); + _outputStream->wrap( dataStream ); return true; } - // std::cout << "encode & wrap" << _streamIndex << std::endl; - if( _inputEssence->readNextFrame( *_frameBuffer ) ) { _outputEssence->encodeFrame( *_frameBuffer, dataStream ); @@ -104,7 +129,7 @@ bool StreamTranscoder::processFrame() return false; } - _outputFile->wrap( dataStream, _streamIndex ); + _outputStream->wrap( dataStream ); return true; } diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp index 9f004f85..4fa6ded9 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp @@ -11,6 +11,7 @@ #include +#include namespace avtranscoder { @@ -18,7 +19,21 @@ namespace avtranscoder class StreamTranscoder { public: - StreamTranscoder( InputStream& stream, OutputFile& outputFile, const size_t& streamId ); + /** + * @brief rewrap stream + **/ + StreamTranscoder( InputStream& inputStream, OutputStream& outputStream ); + + /** + * @brief transcode stream + **/ + StreamTranscoder( InputStream& inputStream, OutputStream& outputStream, Profile::ProfileDesc& profile ); + + /** + * @brief encode from dummy stream + **/ + StreamTranscoder( InputEssence& inputEssence, OutputStream& outputStream, Profile::ProfileDesc& profile ); + ~StreamTranscoder(); void init( const std::string& profile ); @@ -28,17 +43,15 @@ class StreamTranscoder bool isTranscodeStream() const { return _transcodeStream; } private: - InputStream* _stream; + InputStream* _inputStream; + OutputStream* _outputStream; - Frame* _frameBuffer; - Image* _videoFrameBuffer; - AudioFrame* _audioFrameBuffer; + Frame* _frameBuffer; + Image* _videoFrameBuffer; + AudioFrame* _audioFrameBuffer; InputEssence* _inputEssence; OutputEssence* _outputEssence; - OutputFile* _outputFile; - - size_t _streamIndex; bool _transcodeStream; @@ -48,4 +61,3 @@ class StreamTranscoder } #endif - diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index 9494d2d4..fdb20b01 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -19,12 +19,14 @@ Transcoder::~Transcoder() { delete (*it); } - - for( std::vector< DummyInputStream* >::iterator it = _dummyInputStreams.begin(); it != _dummyInputStreams.end(); ++it ) + for( std::vector< DummyAudio* >::iterator it = _dummyAudio.begin(); it != _dummyAudio.end(); ++it ) + { + delete (*it); + } + for( std::vector< DummyVideo* >::iterator it = _dummyVideo.begin(); it != _dummyVideo.end(); ++it ) { delete (*it); } - for( std::vector< StreamTranscoder* >::iterator it = _streamTranscoders.begin(); it != _streamTranscoders.end(); ++it ) { delete (*it); @@ -33,76 +35,65 @@ Transcoder::~Transcoder() void Transcoder::add( const std::string& filename, const size_t streamIndex, const std::string& profile ) { - if( ! filename.length() ) - { - try - { - // be sure the first inputStream is an AvInputStream created from an audio file - dynamic_cast( _inputStreams.at( 0 ) ); - } - catch( std::exception& e) - { - throw std::runtime_error( "dummy stream can't be the first audio channel" ); - } - - _dummyInputStreams.push_back( new DummyInputStream() ); - - _inputStreams.push_back( _dummyInputStreams.back() ); - - _dummyInputStreams.back()->setAudioDesc( _inputStreams.at( 0 )->getAudioDesc() ); - _outputFile.addAudioStream( _inputStreams.back()->getAudioDesc() ); - - StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyInputStreams.back(), _outputFile, _streamTranscoders.size() ); - _streamTranscoders.push_back( streamTranscoder ); - - return; - } - - InputFile* referenceFile = NULL; - - for( std::vector< InputFile* >::iterator it = _inputFiles.begin(); it != _inputFiles.end(); ++it ) - { - if( (*it)->getFilename() == filename ) - { - referenceFile = (*it); - break; - } - } - - if( ! referenceFile ) - { - _inputFiles.push_back( new InputFile( filename ) ); - referenceFile = _inputFiles.back(); - } - - referenceFile->readStream( streamIndex ); - - switch( referenceFile->getStreamType( streamIndex ) ) - { - case AVMEDIA_TYPE_VIDEO: - { - StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, _streamTranscoders.size() ); - streamTranscoder->init( profile ); - _streamTranscoders.push_back( streamTranscoder ); - _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); - break; - } - case AVMEDIA_TYPE_AUDIO: - { - StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, _streamTranscoders.size() ); - streamTranscoder->init( profile ); - _streamTranscoders.push_back( streamTranscoder ); - _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); - break; - } - case AVMEDIA_TYPE_DATA: - case AVMEDIA_TYPE_SUBTITLE: - case AVMEDIA_TYPE_ATTACHMENT: - default: - { - return; - } - } + // if( ! filename.length() ) + // { + // addDummyStream( profile ); + // return; + // } + + // if( ! profile.length() ) + // { + // addRewrapStream( filename, streamIndex ); + // return; + // } + + // addTranscodeStream( filename, streamIndex, profile ); + + // InputFile* referenceFile = NULL; + + // for( std::vector< InputFile* >::iterator it = _inputFiles.begin(); it != _inputFiles.end(); ++it ) + // { + // if( (*it)->getFilename() == filename ) + // { + // referenceFile = (*it); + // break; + // } + // } + + // if( ! referenceFile ) + // { + // _inputFiles.push_back( new InputFile( filename ) ); + // referenceFile = _inputFiles.back(); + // } + + // referenceFile->readStream( streamIndex ); + + // switch( referenceFile->getStreamType( streamIndex ) ) + // { + // case AVMEDIA_TYPE_VIDEO: + // { + // StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile.getStream( _streamTranscoders.size() ) ); + // streamTranscoder->init( profile ); + // _streamTranscoders.push_back( streamTranscoder ); + // _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); + // break; + // } + // case AVMEDIA_TYPE_AUDIO: + // { + // StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile.getStream( _streamTranscoders.size() ) ); + // streamTranscoder->init( profile ); + // _streamTranscoders.push_back( streamTranscoder ); + // _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); + // break; + // } + // case AVMEDIA_TYPE_DATA: + // case AVMEDIA_TYPE_SUBTITLE: + // case AVMEDIA_TYPE_ATTACHMENT: + // default: + // { + // return; + // } + // } return; } @@ -176,17 +167,39 @@ void Transcoder::process( ProgressListener& progress ) _outputFile.endWrap(); } -bool Transcoder::getStreamsNextPacket( std::vector< DataStream >& dataStreams ) -{ - for( size_t i = 0; i < _inputStreams.size(); ++i ) - { - bool ret = _inputStreams.at( i )->readNextPacket( dataStreams.at( i ) ); - if( ! ret || ( dataStreams.at( i ).getBuffer().size() == 0 ) ) - { - return false; - } - } - return true; -} + +// void addRewrapStream() +// { + +// } + +// void addTranscodeStream() +// { + +// } + +// void addDummyStream( const Profile::ProfileDesc& profile ) +// { +// try +// { +// // be sure the first inputStream is an AvInputStream created from an audio file +// dynamic_cast( _inputStreams.at( 0 ) ); +// } +// catch( std::exception& e) +// { +// throw std::runtime_error( "dummy stream can't be the first audio channel" ); +// } + +// _dummyAudio.push_back( new DummyAudio() ); + +// //_inputStreams.push_back( _dummyAudio.back() ); + +// // _dummyAudio.back()->setAudioDesc( _inputStreams.at( 0 )->getAudioDesc() ); +// // _outputFile.addAudioStream( _inputStreams.back()->getAudioDesc() ); + +// StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyAudio.back(), _outputFile.getStream( _streamTranscoders.size() ), profile ); +// _streamTranscoders.push_back( streamTranscoder ); +// } + } diff --git a/src/AvTranscoder/Transcoder/Transcoder.hpp b/src/AvTranscoder/Transcoder/Transcoder.hpp index 83fbd5e1..90082d2f 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.hpp +++ b/src/AvTranscoder/Transcoder/Transcoder.hpp @@ -4,8 +4,9 @@ #include #include #include +#include +#include #include -#include #include #include @@ -45,7 +46,9 @@ class Transcoder void process( ProgressListener& progress ); private: - bool getStreamsNextPacket( std::vector< DataStream >& dataStreams ); + // void addRewrapStream(); + // void addTranscodeStream(); + // void addDummyStream(); private: OutputFile& _outputFile; @@ -54,9 +57,10 @@ class Transcoder std::vector< InputStream* > _inputStreams; std::vector< StreamTranscoder* > _streamTranscoders; - std::vector< DummyInputStream* > _dummyInputStreams; + std::vector< DummyAudio* > _dummyAudio; + std::vector< DummyVideo* > _dummyVideo; }; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 9926261f..6693466e 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -38,9 +38,12 @@ #include #include +#include + #include #include + %} %include "AvTranscoder/ProgressListener.i" @@ -85,5 +88,8 @@ namespace std { %include %include +%include + %include %include + From 1eb251f2e1f27168c1342475e98f11bf52d4b19d Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Mon, 30 Jun 2014 09:33:35 -0400 Subject: [PATCH 02/15] start clean Dummy streams --- src/AvTranscoder/DummyInputStream.cpp | 78 ------------------- src/AvTranscoder/DummyInputStream.hpp | 51 ------------ src/AvTranscoder/EssenceStream/DummyAudio.cpp | 69 ++++++++++++++++ src/AvTranscoder/EssenceStream/DummyAudio.hpp | 36 +++++++++ src/AvTranscoder/EssenceStream/DummyVideo.cpp | 55 +++++++++++++ src/AvTranscoder/EssenceStream/DummyVideo.hpp | 38 +++++++++ src/AvTranscoder/EssenceStream/InputAudio.cpp | 2 +- .../EssenceStream/InputEssence.hpp | 3 +- src/AvTranscoder/EssenceStream/InputVideo.cpp | 7 +- src/AvTranscoder/EssenceStream/InputVideo.hpp | 1 + 10 files changed, 208 insertions(+), 132 deletions(-) delete mode 100644 src/AvTranscoder/DummyInputStream.cpp delete mode 100644 src/AvTranscoder/DummyInputStream.hpp create mode 100644 src/AvTranscoder/EssenceStream/DummyAudio.cpp create mode 100644 src/AvTranscoder/EssenceStream/DummyAudio.hpp create mode 100644 src/AvTranscoder/EssenceStream/DummyVideo.cpp create mode 100644 src/AvTranscoder/EssenceStream/DummyVideo.hpp diff --git a/src/AvTranscoder/DummyInputStream.cpp b/src/AvTranscoder/DummyInputStream.cpp deleted file mode 100644 index 5cf27d04..00000000 --- a/src/AvTranscoder/DummyInputStream.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "DummyInputStream.hpp" - -#include -#include - -namespace avtranscoder -{ - -DummyInputStream::DummyInputStream( ) - : InputStream( ) -{ -} - -DummyInputStream::~DummyInputStream( ) -{ -} - -bool DummyInputStream::readNextPacket( DataStream& data ) -{ - data.getBuffer().resize( _frameDesc.getDataSize() ); - - //av_samples_set_silence( data.getPtr(), offset, nb_samples, nb_channels, sample_fmt ); - int fill_char = ( - _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 || - _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P - ) ? 0x80 : 0x00; - - memset( data.getPtr(), fill_char, data.getSize() ); - - return true; -} - -void DummyInputStream::setVideoDesc( VideoDesc videoDesc ) -{ - _videoDesc = videoDesc; -} - -void DummyInputStream::setAudioDesc( AudioDesc audioDesc ) -{ - _audioDesc = audioDesc; - _frameDesc.setSampleRate ( _audioDesc.getCodecContext()->sample_rate ); - _frameDesc.setChannels ( _audioDesc.getCodecContext()->channels ); - _frameDesc.setFps ( 25.0 ); - _frameDesc.setSampleFormat( _audioDesc.getCodecContext()->sample_fmt ); -} - - -VideoDesc DummyInputStream::getVideoDesc() const -{ - return _videoDesc; -} - -AudioDesc DummyInputStream::getAudioDesc() const -{ - return _audioDesc; -} - -AVMediaType DummyInputStream::getStreamType() const -{ - //TODO return different type whether it's an audio or video type - return AVMEDIA_TYPE_AUDIO; -} - -double DummyInputStream::getDuration() const -{ - return 0; -} - -double DummyInputStream::getPacketDuration() const -{ - return 0; -} - -void DummyInputStream::clearBuffering() -{ -} - -} diff --git a/src/AvTranscoder/DummyInputStream.hpp b/src/AvTranscoder/DummyInputStream.hpp deleted file mode 100644 index 37d40126..00000000 --- a/src/AvTranscoder/DummyInputStream.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _AV_TRANSCODER_DUMMY_INPUT_STREAM_HPP_ -#define _AV_TRANSCODER_DUMMY_INPUT_STREAM_HPP_ - -#include -#include -#include - -namespace avtranscoder -{ - -class AvExport DummyInputStream : public InputStream -{ -public: - DummyInputStream( ); - - ~DummyInputStream( ); - - size_t getStreamIndex() const { return 0; } - - bool readNextPacket( DataStream& data ); - - // Stream properties - void setVideoDesc( VideoDesc videoDesc ); - void setAudioDesc( AudioDesc audioDesc ); - - void setImageDesc( ImageDesc& imageDesc ){ _imageDesc = imageDesc; } - void setFrameDesc( AudioFrameDesc& frameDesc ){ _frameDesc = frameDesc; } - - VideoDesc getVideoDesc() const; - AudioDesc getAudioDesc() const; - - AVMediaType getStreamType() const; - - double getDuration() const; - double getPacketDuration() const; - - void setBufferred( const bool bufferized ){ } - - void clearBuffering(); - -private: - VideoDesc _videoDesc; - AudioDesc _audioDesc; - - ImageDesc _imageDesc; - AudioFrameDesc _frameDesc; -}; - -} - -#endif \ No newline at end of file diff --git a/src/AvTranscoder/EssenceStream/DummyAudio.cpp b/src/AvTranscoder/EssenceStream/DummyAudio.cpp new file mode 100644 index 00000000..59cbe8d9 --- /dev/null +++ b/src/AvTranscoder/EssenceStream/DummyAudio.cpp @@ -0,0 +1,69 @@ +#include "DummyAudio.hpp" + +#include +#include + +namespace avtranscoder +{ + +DummyAudio::DummyAudio( ) + : InputEssence( ) +{ +} + +DummyAudio::~DummyAudio( ) +{ +} + +void DummyAudio::setAudioDesc( AudioDesc& audioDesc ) +{ + _audioDesc = audioDesc; + _frameDesc.setSampleRate ( _audioDesc.getCodecContext()->sample_rate ); + _frameDesc.setChannels ( _audioDesc.getCodecContext()->channels ); + _frameDesc.setFps ( 25.0 ); + _frameDesc.setSampleFormat( _audioDesc.getCodecContext()->sample_fmt ); +} + +AudioDesc DummyAudio::getAudioDesc() const +{ + return _audioDesc; +} + +bool DummyAudio::readNextFrame( Frame& frameBuffer ) +{ + frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); + + //av_samples_set_silence( data.getPtr(), offset, nb_samples, nb_channels, sample_fmt ); + int fill_char = ( + _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 || + _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P + ) ? 0x80 : 0x00; + + memset( frameBuffer.getPtr(), fill_char, frameBuffer.getSize() ); + + return true; +} + +bool DummyAudio::readNextFrame( std::vector& frameBuffer ) +{ + if( frameBuffer.size() != _frameDesc.getChannels() ) + { + frameBuffer.resize( _frameDesc.getChannels() ); + } + + size_t dataSizeOneChannel = _frameDesc.getDataSize() / _frameDesc.getChannels(); + int fill_char = ( + _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 || + _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P + ) ? 0x80 : 0x00; + + for( size_t channel = 0; channel < _frameDesc.getChannels(); ++channel ) + { + frameBuffer.at( channel).getBuffer().resize( dataSizeOneChannel ); + memset( frameBuffer.at( channel).getPtr(), fill_char, frameBuffer.at( channel).getSize() ); + } + + return true; +} + +} diff --git a/src/AvTranscoder/EssenceStream/DummyAudio.hpp b/src/AvTranscoder/EssenceStream/DummyAudio.hpp new file mode 100644 index 00000000..fc443468 --- /dev/null +++ b/src/AvTranscoder/EssenceStream/DummyAudio.hpp @@ -0,0 +1,36 @@ +#ifndef _AV_TRANSCODER_ESSENCE_STREAM_DUMMY_AUDIO_HPP_ +#define _AV_TRANSCODER_ESSENCE_STREAM_DUMMY_AUDIO_HPP_ + +#include "InputEssence.hpp" + +#include +#include + +namespace avtranscoder +{ + +class AvExport DummyAudio : public InputEssence +{ +public: + DummyAudio( ); + + ~DummyAudio( ); + + // Stream properties + void setAudioDesc( AudioDesc& audioDesc ); + + AudioDesc getAudioDesc() const; + + void setup() {} + + bool readNextFrame( Frame& frameBuffer ); + bool readNextFrame( std::vector& frameBuffer ); + +private: + AudioDesc _audioDesc; + AudioFrameDesc _frameDesc; +}; + +} + +#endif \ No newline at end of file diff --git a/src/AvTranscoder/EssenceStream/DummyVideo.cpp b/src/AvTranscoder/EssenceStream/DummyVideo.cpp new file mode 100644 index 00000000..072ff9f4 --- /dev/null +++ b/src/AvTranscoder/EssenceStream/DummyVideo.cpp @@ -0,0 +1,55 @@ +#include "DummyVideo.hpp" + +#include +#include + +namespace avtranscoder +{ + +DummyVideo::DummyVideo( ) + : InputEssence( ) + , numberOfView( 1 ) +{ +} + +DummyVideo::~DummyVideo( ) +{ +} + +void DummyVideo::setVideoDesc( VideoDesc& videoDesc ) +{ + _videoDesc = videoDesc; + _imageDesc = _videoDesc.getImageDesc(); +} + +VideoDesc DummyVideo::getVideoDesc() const +{ + return _videoDesc; +} + +bool DummyVideo::readNextFrame( Frame& frameBuffer ) +{ + frameBuffer.getBuffer().resize( _imageDesc.getDataSize() ); + + int fillChar = 0; // fill images with black + memset( frameBuffer.getPtr(), fillChar, frameBuffer.getSize() ); + + return true; +} + +bool DummyVideo::readNextFrame( std::vector& frameBuffer ) +{ + if( frameBuffer.size() != numberOfView ) + { + frameBuffer.resize( numberOfView ); + } + + for( size_t view = 0; view < numberOfView; ++view ) + { + readNextFrame( frameBuffer.at( view ) ); + } + + return true; +} + +} diff --git a/src/AvTranscoder/EssenceStream/DummyVideo.hpp b/src/AvTranscoder/EssenceStream/DummyVideo.hpp new file mode 100644 index 00000000..5a994c7f --- /dev/null +++ b/src/AvTranscoder/EssenceStream/DummyVideo.hpp @@ -0,0 +1,38 @@ +#ifndef _AV_TRANSCODER_ESSENCE_STREAM_DUMMY_VIDEO_HPP_ +#define _AV_TRANSCODER_ESSENCE_STREAM_DUMMY_VIDEO_HPP_ + +#include "InputEssence.hpp" + +#include +#include + +namespace avtranscoder +{ + +class AvExport DummyVideo : public InputEssence +{ +public: + DummyVideo( ); + + ~DummyVideo( ); + + // Stream properties + void setVideoDesc( VideoDesc& videoDesc ); + + VideoDesc getVideoDesc() const; + + void setup() {} + + bool readNextFrame( Frame& frameBuffer ); + bool readNextFrame( std::vector& frameBuffer ); + +private: + VideoDesc _videoDesc; + ImageDesc _imageDesc; + + size_t numberOfView; +}; + +} + +#endif \ No newline at end of file diff --git a/src/AvTranscoder/EssenceStream/InputAudio.cpp b/src/AvTranscoder/EssenceStream/InputAudio.cpp index d8b21b63..8221be02 100644 --- a/src/AvTranscoder/EssenceStream/InputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/InputAudio.cpp @@ -20,7 +20,7 @@ namespace avtranscoder { InputAudio::InputAudio( AvInputStream& inputStream ) - : InputEssence ( inputStream ) + : InputEssence() , _inputStream ( &inputStream ) , _codec ( NULL ) , _codecContext ( NULL ) diff --git a/src/AvTranscoder/EssenceStream/InputEssence.hpp b/src/AvTranscoder/EssenceStream/InputEssence.hpp index 05d28b17..80c4b86e 100644 --- a/src/AvTranscoder/EssenceStream/InputEssence.hpp +++ b/src/AvTranscoder/EssenceStream/InputEssence.hpp @@ -12,13 +12,14 @@ class AvInputStream; class AvExport InputEssence { public: - InputEssence( AvInputStream& inputStream ) {}; + InputEssence() {}; virtual ~InputEssence() {}; virtual void setup() = 0; virtual bool readNextFrame( Frame& frameBuffer ) = 0; + virtual bool readNextFrame( std::vector& frameBuffer ) = 0; }; } diff --git a/src/AvTranscoder/EssenceStream/InputVideo.cpp b/src/AvTranscoder/EssenceStream/InputVideo.cpp index 9ee0284f..9c33e79e 100644 --- a/src/AvTranscoder/EssenceStream/InputVideo.cpp +++ b/src/AvTranscoder/EssenceStream/InputVideo.cpp @@ -19,7 +19,7 @@ namespace avtranscoder { InputVideo::InputVideo( AvInputStream& inputStream ) - : InputEssence ( inputStream ) + : InputEssence() , _inputStream ( &inputStream ) , _codec ( NULL ) , _codecContext ( NULL ) @@ -136,6 +136,11 @@ bool InputVideo::readNextFrame( Frame& frameBuffer ) return true; } +bool InputVideo::readNextFrame( std::vector& frameBuffer ) +{ + +} + void InputVideo::flushDecoder() { avcodec_flush_buffers( _codecContext ); diff --git a/src/AvTranscoder/EssenceStream/InputVideo.hpp b/src/AvTranscoder/EssenceStream/InputVideo.hpp index 0789408c..bc77fb34 100644 --- a/src/AvTranscoder/EssenceStream/InputVideo.hpp +++ b/src/AvTranscoder/EssenceStream/InputVideo.hpp @@ -25,6 +25,7 @@ class AvExport InputVideo : public InputEssence void setup(); bool readNextFrame( Frame& frameBuffer ); + bool readNextFrame( std::vector& frameBuffer ); void flushDecoder(); From cb8c289c9e458904103c94b3095d8d142be938b1 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 09:50:12 -0400 Subject: [PATCH 03/15] add setup to fix reader --- app/avplay/AvReader.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/avplay/AvReader.hpp b/app/avplay/AvReader.hpp index 8d9a522e..32c0cc1d 100644 --- a/app/avplay/AvReader.hpp +++ b/app/avplay/AvReader.hpp @@ -27,6 +27,8 @@ class AvReader : public Reader m_inputVideo = new avtranscoder::InputVideo( m_inputFile.getStream( m_videoStream ) ); + m_inputVideo->setup(); + m_sourceImage = new avtranscoder::Image( m_inputFile.getStream( m_videoStream ).getVideoDesc().getImageDesc() ); pixel.setBitsPerPixel( getComponents() * getBitDepth() ); From 15e7e5227cbebf34d5034885f45e02154d4f33d9 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 09:50:49 -0400 Subject: [PATCH 04/15] adding verbose informations --- app/genericProcessor/genericProcessor.cpp | 24 +++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/genericProcessor/genericProcessor.cpp b/app/genericProcessor/genericProcessor.cpp index d9bc3496..f3f1485c 100644 --- a/app/genericProcessor/genericProcessor.cpp +++ b/app/genericProcessor/genericProcessor.cpp @@ -42,11 +42,17 @@ int main( int argc, char** argv ) return( -1 ); } + bool verbose = false; + av_log_set_level( AV_LOG_FATAL ); + if( verbose ) + av_log_set_level( AV_LOG_DEBUG ); + try { - std::cout << "start ..." << std::endl; + if( verbose ) + std::cout << "start ..." << std::endl; avtranscoder::Profile profiles( true ); @@ -59,20 +65,30 @@ int main( int argc, char** argv ) avtranscoder::Transcoder transcoder( outputFile ); + transcoder.setVerbose( verbose ); + if( verbose ) + std::cout << "add streams to transcoder" << std::endl; + transcoder.add( streams ); - std::cout << "start Transcode" << std::endl; + if( verbose ) + std::cout << "start Transcode" << std::endl; avtranscoder::ProgressListener progress; // video re-wrapping or transcoding if necessary transcoder.process( progress ); - std::cout << std::endl << "end ..." << std::endl; + if( verbose ) + std::cout << std::endl << "end ..." << std::endl; } catch( std::exception& e ) { - std::cerr << "ERROR: during process, an error occured:" << std::endl << e.what() << std::endl; + std::cerr << "ERROR: during process, an error occured: " << e.what() << std::endl; + } + catch( ... ) + { + std::cerr << "ERROR: during process, an unknown error occured" << std::endl; } } From e07d011e25e047e968a385edba379c71125525f0 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 09:51:24 -0400 Subject: [PATCH 05/15] fix transcoder processor --- .../CodedStream/AvOutputStream.cpp | 11 ++- src/AvTranscoder/File/OutputFile.cpp | 15 ++-- src/AvTranscoder/File/OutputFile.hpp | 2 +- .../Transcoder/StreamTranscoder.cpp | 70 +++++++++++++------ .../Transcoder/StreamTranscoder.hpp | 10 ++- src/AvTranscoder/Transcoder/Transcoder.cpp | 33 ++++++--- src/AvTranscoder/Transcoder/Transcoder.hpp | 4 ++ 7 files changed, 103 insertions(+), 42 deletions(-) diff --git a/src/AvTranscoder/CodedStream/AvOutputStream.cpp b/src/AvTranscoder/CodedStream/AvOutputStream.cpp index ec55a1b2..7f8be7b5 100644 --- a/src/AvTranscoder/CodedStream/AvOutputStream.cpp +++ b/src/AvTranscoder/CodedStream/AvOutputStream.cpp @@ -2,17 +2,22 @@ #include +#include +#include + namespace avtranscoder { AvOutputStream::AvOutputStream( ) - : _outputFile( NULL ) + : OutputStream() + , _outputFile( NULL ) , _streamIndex( 0 ) { } AvOutputStream::AvOutputStream( OutputFile& outputFile, const size_t streamIndex ) - : _outputFile( &outputFile ) + : OutputStream() + , _outputFile( &outputFile ) , _streamIndex( streamIndex ) { } @@ -23,6 +28,8 @@ AvOutputStream::~AvOutputStream() bool AvOutputStream::wrap( DataStream& data ) { + assert( _outputFile != NULL ); + return _outputFile->wrap( data, _streamIndex ); } diff --git a/src/AvTranscoder/File/OutputFile.cpp b/src/AvTranscoder/File/OutputFile.cpp index 6a6b191f..8e141311 100644 --- a/src/AvTranscoder/File/OutputFile.cpp +++ b/src/AvTranscoder/File/OutputFile.cpp @@ -86,9 +86,11 @@ AvOutputStream& OutputFile::addVideoStream( const VideoDesc& videoDesc ) _stream->time_base = _stream->codec->time_base; - _outputStreams.push_back( AvOutputStream( *this, _formatContext->nb_streams ) ); + AvOutputStream* avOutputStream = new AvOutputStream( *this, _formatContext->nb_streams - 1 ); - return _outputStreams.back(); + _outputStreams.push_back( avOutputStream ); + + return *_outputStreams.back(); } AvOutputStream& OutputFile::addAudioStream( const AudioDesc& audioDesc ) @@ -104,14 +106,17 @@ AvOutputStream& OutputFile::addAudioStream( const AudioDesc& audioDesc ) _stream->codec->channels = audioDesc.getCodecContext()->channels; _stream->codec->sample_fmt = audioDesc.getCodecContext()->sample_fmt; - _outputStreams.push_back( AvOutputStream( *this, _formatContext->nb_streams ) ); + AvOutputStream* avOutputStream = new AvOutputStream( *this, _formatContext->nb_streams - 1 ); + _outputStreams.push_back( avOutputStream ); - return _outputStreams.back(); + return *_outputStreams.back(); } AvOutputStream& OutputFile::getStream( const size_t streamId ) { - return _outputStreams.at( streamId ); + if( streamId >= _outputStreams.size() ) + throw std::runtime_error( "unable to get output stream (out of range)" ); + return *_outputStreams.at( streamId ); } bool OutputFile::beginWrap( ) diff --git a/src/AvTranscoder/File/OutputFile.hpp b/src/AvTranscoder/File/OutputFile.hpp index 7f9bbc2f..b44fbf21 100644 --- a/src/AvTranscoder/File/OutputFile.hpp +++ b/src/AvTranscoder/File/OutputFile.hpp @@ -83,7 +83,7 @@ class AvExport OutputFile virtual bool endWrap( ); private: - std::vector _outputStreams; + std::vector _outputStreams; AVOutputFormat* _outputFormat; AVFormatContext* _formatContext; diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp index 8d97aae8..83e4f4c0 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp @@ -3,16 +3,17 @@ #include +#include + namespace avtranscoder { StreamTranscoder::StreamTranscoder( InputStream& inputStream, - OutputStream& outputStream, OutputFile& outputFile ) : _inputStream( &inputStream ) - , _outputStream( &outputStream ) + , _outputStream( NULL ) , _frameBuffer( NULL ) , _videoFrameBuffer( NULL ) , _audioFrameBuffer( NULL ) @@ -25,12 +26,12 @@ StreamTranscoder::StreamTranscoder( { case AVMEDIA_TYPE_VIDEO : { - outputFile.addVideoStream( _inputStream->getVideoDesc() ); + _outputStream = &outputFile.addVideoStream( _inputStream->getVideoDesc() ); break; } case AVMEDIA_TYPE_AUDIO : { - outputFile.addAudioStream( _inputStream->getAudioDesc() ); + _outputStream = &outputFile.addAudioStream( _inputStream->getAudioDesc() ); break; } default: @@ -40,12 +41,11 @@ StreamTranscoder::StreamTranscoder( StreamTranscoder::StreamTranscoder( InputStream& inputStream, - OutputStream& outputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ) : _inputStream( &inputStream ) - , _outputStream( &outputStream ) + , _outputStream( NULL ) , _frameBuffer( NULL ) , _videoFrameBuffer( NULL ) , _audioFrameBuffer( NULL ) @@ -62,10 +62,11 @@ StreamTranscoder::StreamTranscoder( _inputEssence->setup(); OutputVideo* outputVideo = new OutputVideo(); - _outputEssence = outputVideo; + _outputEssence = outputVideo; _outputEssence->setProfile( profile ); - outputFile.addVideoStream( outputVideo->getVideoDesc() ); + + _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); _frameBuffer = _videoFrameBuffer; @@ -77,28 +78,31 @@ StreamTranscoder::StreamTranscoder( _inputEssence->setup(); OutputAudio* outputAudio = new OutputAudio(); - _outputEssence = outputAudio; + _outputEssence = outputAudio; _outputEssence->setProfile( profile ); - outputFile.addAudioStream( outputAudio->getAudioDesc() ); + + _outputStream = &outputFile.addAudioStream( outputAudio->getAudioDesc() ); _audioFrameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); _frameBuffer = _audioFrameBuffer; break; } default: + { + throw std::runtime_error( "unupported stream type" ); break; + } } } StreamTranscoder::StreamTranscoder( InputEssence& inputEssence, - OutputStream& outputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ) : _inputStream( NULL ) - , _outputStream( &outputStream ) + , _outputStream( NULL ) , _frameBuffer( NULL ) , _videoFrameBuffer( NULL ) , _audioFrameBuffer( NULL ) @@ -115,7 +119,7 @@ StreamTranscoder::StreamTranscoder( _outputEssence = outputVideo; _outputEssence->setProfile( profile ); - outputFile.addVideoStream( outputVideo->getVideoDesc() ); + _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); _frameBuffer = _videoFrameBuffer; @@ -127,14 +131,17 @@ StreamTranscoder::StreamTranscoder( _outputEssence = outputAudio; _outputEssence->setProfile( profile ); - outputFile.addAudioStream( outputAudio->getAudioDesc() ); + _outputStream = &outputFile.addAudioStream( outputAudio->getAudioDesc() ); _audioFrameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); _frameBuffer = _audioFrameBuffer; break; } default: + { + throw std::runtime_error( "unupported stream type" ); break; + } } } @@ -151,22 +158,41 @@ StreamTranscoder::~StreamTranscoder() bool StreamTranscoder::processFrame() { - DataStream dataStream; - if( ! _transcodeStream ) + if( _transcodeStream ) { - if( ! _inputStream->readNextPacket( dataStream ) ) - return false; - _outputStream->wrap( dataStream ); - return true; + return processTranscode(); } + return processRewrap(); +} +bool StreamTranscoder::processRewrap() +{ + assert( _inputStream != NULL ); + + DataStream dataStream; + if( ! _inputStream->readNextPacket( dataStream ) ) + return false; + _outputStream->wrap( dataStream ); + return true; +} + +bool StreamTranscoder::processTranscode() +{ + assert( _inputEssence != NULL ); + assert( _outputEssence != NULL ); + assert( _frameBuffer != NULL ); + + DataStream dataStream; if( _inputEssence->readNextFrame( *_frameBuffer ) ) { _outputEssence->encodeFrame( *_frameBuffer, dataStream ); } - else if( ! _outputEssence->encodeFrame( dataStream ) ) + else { - return false; + if( ! _outputEssence->encodeFrame( dataStream ) ) + { + return false; + } } _outputStream->wrap( dataStream ); diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp index 7096e6e0..996816e9 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp @@ -22,17 +22,17 @@ class StreamTranscoder /** * @brief rewrap stream **/ - StreamTranscoder( InputStream& inputStream, OutputStream& outputStream, OutputFile& outputFile ); + StreamTranscoder( InputStream& inputStream, OutputFile& outputFile ); /** * @brief transcode stream **/ - StreamTranscoder( InputStream& inputStream, OutputStream& outputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ); + StreamTranscoder( InputStream& inputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ); /** * @brief encode from dummy stream **/ - StreamTranscoder( InputEssence& inputEssence, OutputStream& outputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ); + StreamTranscoder( InputEssence& inputEssence, OutputFile& outputFile, Profile::ProfileDesc& profile ); ~StreamTranscoder(); @@ -44,6 +44,10 @@ class StreamTranscoder bool isTranscodeStream() const { return _transcodeStream; } +private: + bool processRewrap(); + bool processTranscode(); + private: InputStream* _inputStream; OutputStream* _outputStream; diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index 6b143d59..bc59cb3c 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -9,6 +9,7 @@ namespace avtranscoder Transcoder::Transcoder( OutputFile& outputFile ) : _outputFile( outputFile ) , _profile( true ) + , _verbose( false ) { _outputFile.setup(); } @@ -52,6 +53,8 @@ void Transcoder::add( InputStreamsDesc& streamsDefinition ) { for( InputStreamsDesc::iterator itStream = streamsDefinition.begin(); itStream != streamsDefinition.end(); ++itStream ) { + if( _verbose ) + std::cout << "+ add stream" << std::endl; add( *itStream ); } } @@ -93,6 +96,8 @@ void Transcoder::process( ProgressListener& progress ) dataStreams.push_back( dataStream ); } + if( _verbose ) + std::cout << "begin transcoding" << std::endl; _outputFile.beginWrap(); @@ -109,6 +114,9 @@ void Transcoder::process( ProgressListener& progress ) ++frame; } + if( _verbose ) + std::cout << "end of transcoding" << std::endl; + _outputFile.endWrap(); } @@ -116,16 +124,20 @@ void Transcoder::add( InputStreamDesc& streamDefinition ) { if( ! streamDefinition.filename.length() ) { + if( _verbose ) + std::cout << "add encoding stream for dummy input" << std::endl; addDummyStream( streamDefinition.transcodeProfile ); return; } // if( ! streamDefinition.transcodeProfile.length() ) { - addRewrapStream( streamDefinition.filename, streamDefinition.streamId ); - return; + // addRewrapStream( streamDefinition.filename, streamDefinition.streamId ); + // return; } + if( _verbose ) + std::cout << "add transcoding stream" << std::endl; addTranscodeStream( streamDefinition.filename, streamDefinition.streamId, streamDefinition.transcodeProfile ); return; } @@ -134,7 +146,7 @@ void Transcoder::addRewrapStream( const std::string& filename, const size_t stre { InputFile* referenceFile = addInputFile( filename, streamIndex ); - StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile.getStream( _streamTranscoders.size() ), _outputFile ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile ); _streamTranscoders.push_back( streamTranscoder ); _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); } @@ -142,20 +154,21 @@ void Transcoder::addRewrapStream( const std::string& filename, const size_t stre void Transcoder::addTranscodeStream( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profile ) { InputFile* referenceFile = addInputFile( filename, streamIndex ); + switch( referenceFile->getStreamType( streamIndex ) ) { case AVMEDIA_TYPE_VIDEO: { - StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile.getStream( _streamTranscoders.size() ), _outputFile, profile ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile ); _streamTranscoders.push_back( streamTranscoder ); - _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); + _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); break; } case AVMEDIA_TYPE_AUDIO: { - StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile.getStream( _streamTranscoders.size() ), _outputFile, profile ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile ); _streamTranscoders.push_back( streamTranscoder ); - _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); + _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); break; } case AVMEDIA_TYPE_DATA: @@ -173,14 +186,14 @@ void Transcoder::addDummyStream( Profile::ProfileDesc& profile ) if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio ) { _dummyAudio.push_back( new DummyAudio() ); - StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyAudio.back(), _outputFile.getStream( _streamTranscoders.size() ), _outputFile, profile ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyAudio.back(), _outputFile, profile ); _streamTranscoders.push_back( streamTranscoder ); } if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo ) { _dummyVideo.push_back( new DummyVideo() ); - StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyVideo.back(), _outputFile.getStream( _streamTranscoders.size() ), _outputFile, profile ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyVideo.back(), _outputFile, profile ); _streamTranscoders.push_back( streamTranscoder ); } } @@ -200,6 +213,8 @@ InputFile* Transcoder::addInputFile( const std::string& filename, const size_t s if( ! referenceFile ) { + if( _verbose ) + std::cout << "new InputFile for " << filename << std::endl; _inputFiles.push_back( new InputFile( filename ) ); referenceFile = _inputFiles.back(); } diff --git a/src/AvTranscoder/Transcoder/Transcoder.hpp b/src/AvTranscoder/Transcoder/Transcoder.hpp index 8bf530da..9566358c 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.hpp +++ b/src/AvTranscoder/Transcoder/Transcoder.hpp @@ -59,6 +59,8 @@ class Transcoder void process( ProgressListener& progress ); + void setVerbose( bool verbose = true ){ _verbose = verbose; } + private: void add( InputStreamDesc& streamDefinition ); void addRewrapStream( const std::string& filename, const size_t streamIndex ); @@ -77,6 +79,8 @@ class Transcoder std::vector< DummyAudio* > _dummyAudio; std::vector< DummyVideo* > _dummyVideo; Profile _profile; + + bool _verbose; }; } From 8c9c88e48a9c6df8f8ec4c1da35a99575f86938f Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 11:35:46 -0400 Subject: [PATCH 06/15] adding more debug tools (throw before get bad indexes) --- app/genericProcessor/genericProcessor.cpp | 27 +++++++++++----------- src/AvTranscoder/Transcoder/Transcoder.cpp | 23 ++++++++++++++---- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/app/genericProcessor/genericProcessor.cpp b/app/genericProcessor/genericProcessor.cpp index f3f1485c..7a6ab6dd 100644 --- a/app/genericProcessor/genericProcessor.cpp +++ b/app/genericProcessor/genericProcessor.cpp @@ -8,8 +8,9 @@ #include #include +bool verbose = false; -void parseConfigFile( const std::string& configFilename, avtranscoder::Transcoder::InputStreamsDesc& streams, avtranscoder::Profile& profile ) +void parseConfigFile( const std::string& configFilename, avtranscoder::Transcoder& transcoder, avtranscoder::Profile& profile ) { std::ifstream configFile( configFilename.c_str(), std::ifstream::in ); @@ -25,8 +26,9 @@ void parseConfigFile( const std::string& configFilename, avtranscoder::Transcode { std::string transcodeProfile; std::getline( is_line, transcodeProfile ); - std::cout << filename << " ( " << streamId << " ) : " << transcodeProfile << std::endl; - streams.push_back( avtranscoder::Transcoder::InputStreamDesc( atoi( streamId.c_str() ), filename, profile.getProfile( transcodeProfile ) ) ); + if( verbose ) + std::cout << filename << " ( " << streamId << " ) : " << transcodeProfile << std::endl; + transcoder.add( filename, atoi( streamId.c_str() ), transcodeProfile ); } } } @@ -42,8 +44,6 @@ int main( int argc, char** argv ) return( -1 ); } - bool verbose = false; - av_log_set_level( AV_LOG_FATAL ); if( verbose ) @@ -56,20 +56,18 @@ int main( int argc, char** argv ) avtranscoder::Profile profiles( true ); + if( verbose ) + std::cout << "output file: " << argv[2] << std::endl; + std::string inputConfigFile( argv[1] ); avtranscoder::OutputFile outputFile( argv[2] ); - avtranscoder::Transcoder::InputStreamsDesc streams; - - parseConfigFile( inputConfigFile, streams, profiles ); - avtranscoder::Transcoder transcoder( outputFile ); - transcoder.setVerbose( verbose ); - if( verbose ) - std::cout << "add streams to transcoder" << std::endl; - transcoder.add( streams ); + if( verbose ) + std::cout << "parse config file" << std::endl; + parseConfigFile( inputConfigFile, transcoder, profiles ); if( verbose ) std::cout << "start Transcode" << std::endl; @@ -79,8 +77,9 @@ int main( int argc, char** argv ) // video re-wrapping or transcoding if necessary transcoder.process( progress ); + std::cout << std::endl; if( verbose ) - std::cout << std::endl << "end ..." << std::endl; + std::cout << "end ..." << std::endl; } catch( std::exception& e ) { diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index bc59cb3c..de62da5c 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -36,6 +36,8 @@ Transcoder::~Transcoder() void Transcoder::add( const std::string& filename, const size_t streamIndex, const std::string& profileName ) { + // if( ! profile.size() ) // no profile, only wrap stream + Profile::ProfileDesc& transcodeProfile = _profile.getProfile( profileName ); InputStreamDesc streamDesc( streamIndex, filename, transcodeProfile ); add( streamDesc ); @@ -86,6 +88,7 @@ void Transcoder::process( ProgressListener& progress ) { size_t frame = 0; + std::vector< DataStream > dataStreams; dataStreams.reserve( _inputStreams.size() ); @@ -103,6 +106,11 @@ void Transcoder::process( ProgressListener& progress ) while( 1 ) { + if( ! _inputStreams.size() ) + { + throw std::runtime_error( "missing input streams in transcoder" ); + } + if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), _inputStreams.at( 0 )->getDuration() ) == eJobStatusCancel ) { break; @@ -122,6 +130,8 @@ void Transcoder::process( ProgressListener& progress ) void Transcoder::add( InputStreamDesc& streamDefinition ) { + if( _verbose ) + std::cout << "+ add stream" << std::endl; if( ! streamDefinition.filename.length() ) { if( _verbose ) @@ -130,11 +140,13 @@ void Transcoder::add( InputStreamDesc& streamDefinition ) return; } -// if( ! streamDefinition.transcodeProfile.length() ) - { - // addRewrapStream( streamDefinition.filename, streamDefinition.streamId ); - // return; - } + //if( ! streamDefinition.transcodeProfile.length() ) + // { + // if( _verbose ) + // std::cout << "add transcoding stream" << std::endl; + // addRewrapStream( streamDefinition.filename, streamDefinition.streamId ); + // return; + // } if( _verbose ) std::cout << "add transcoding stream" << std::endl; @@ -176,6 +188,7 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s case AVMEDIA_TYPE_ATTACHMENT: default: { + throw std::runtime_error( "unsupported media type in transcode setup" ); return; } } From ba0c7baf401d0c1aee868104b8f5cc7058b7ed0a Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 12:09:39 -0400 Subject: [PATCH 07/15] fix wrapping mode --- src/AvTranscoder/Transcoder/Transcoder.cpp | 77 ++++++++-------------- src/AvTranscoder/Transcoder/Transcoder.hpp | 28 ++------ 2 files changed, 34 insertions(+), 71 deletions(-) diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index de62da5c..7e80c680 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -36,29 +36,32 @@ Transcoder::~Transcoder() void Transcoder::add( const std::string& filename, const size_t streamIndex, const std::string& profileName ) { - // if( ! profile.size() ) // no profile, only wrap stream + if( profileName.length() == 0 ) // no profile, only re-wrap stream + { + if( _verbose ) + std::cout << "add re-wrap stream" << std::endl; + addRewrapStream( filename, streamIndex ); + return; + } Profile::ProfileDesc& transcodeProfile = _profile.getProfile( profileName ); - InputStreamDesc streamDesc( streamIndex, filename, transcodeProfile ); - add( streamDesc ); + add( filename, streamIndex, transcodeProfile ); } void Transcoder::add( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profileDesc ) { _profile.update( profileDesc ); - - InputStreamDesc streamDesc( streamIndex, filename, profileDesc ); - add( streamDesc ); -} - -void Transcoder::add( InputStreamsDesc& streamsDefinition ) -{ - for( InputStreamsDesc::iterator itStream = streamsDefinition.begin(); itStream != streamsDefinition.end(); ++itStream ) + if( ! filename.length() ) { if( _verbose ) - std::cout << "+ add stream" << std::endl; - add( *itStream ); + std::cout << "add encoding stream for dummy input" << std::endl; + addDummyStream( profileDesc ); + return; } + + if( _verbose ) + std::cout << "add transcoding stream" << std::endl; + addTranscodeStream( filename, streamIndex, profileDesc ); } bool Transcoder::processFrame() @@ -77,10 +80,10 @@ bool Transcoder::processFrame() { return false; } - for( size_t i = 0; i < _streamTranscoders.size(); ++i ) - { - _streamTranscoders.at( i )->processFrame(); - } + // for( size_t i = 0; i < _streamTranscoders.size(); ++i ) + // { + // _streamTranscoders.at( i )->processFrame(); + // } return true; } @@ -99,19 +102,21 @@ void Transcoder::process( ProgressListener& progress ) dataStreams.push_back( dataStream ); } + if( ! _inputStreams.size() ) + { + throw std::runtime_error( "missing input streams in transcoder" ); + } + if( _verbose ) std::cout << "begin transcoding" << std::endl; + _outputFile.beginWrap(); + double totalDuration = _inputStreams.at( 0 )->getDuration(); while( 1 ) { - if( ! _inputStreams.size() ) - { - throw std::runtime_error( "missing input streams in transcoder" ); - } - - if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), _inputStreams.at( 0 )->getDuration() ) == eJobStatusCancel ) + if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), totalDuration ) == eJobStatusCancel ) { break; } @@ -128,32 +133,6 @@ void Transcoder::process( ProgressListener& progress ) _outputFile.endWrap(); } -void Transcoder::add( InputStreamDesc& streamDefinition ) -{ - if( _verbose ) - std::cout << "+ add stream" << std::endl; - if( ! streamDefinition.filename.length() ) - { - if( _verbose ) - std::cout << "add encoding stream for dummy input" << std::endl; - addDummyStream( streamDefinition.transcodeProfile ); - return; - } - - //if( ! streamDefinition.transcodeProfile.length() ) - // { - // if( _verbose ) - // std::cout << "add transcoding stream" << std::endl; - // addRewrapStream( streamDefinition.filename, streamDefinition.streamId ); - // return; - // } - - if( _verbose ) - std::cout << "add transcoding stream" << std::endl; - addTranscodeStream( streamDefinition.filename, streamDefinition.streamId, streamDefinition.transcodeProfile ); - return; -} - void Transcoder::addRewrapStream( const std::string& filename, const size_t streamIndex ) { InputFile* referenceFile = addInputFile( filename, streamIndex ); diff --git a/src/AvTranscoder/Transcoder/Transcoder.hpp b/src/AvTranscoder/Transcoder/Transcoder.hpp index 9566358c..737c4228 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.hpp +++ b/src/AvTranscoder/Transcoder/Transcoder.hpp @@ -19,42 +19,24 @@ namespace avtranscoder class Transcoder { - public: - struct InputStreamDesc { - size_t streamId; - std::string filename; - Profile::ProfileDesc transcodeProfile; - - InputStreamDesc( const size_t& sId, const std::string& filename, Profile::ProfileDesc& profile ) - : streamId( sId ) - , filename( filename ) - , transcodeProfile( profile ) - { - } - }; - - typedef std::vector< InputStreamDesc > InputStreamsDesc; Transcoder( OutputFile& outputFile ); + ~Transcoder(); /** * @brief Add a stream and set a profile * @note If profile is empty, add a dummy stream. */ - void add( const std::string& filename, const size_t streamIndex, const std::string& profileName = "" ); + void add( const std::string& filename, const size_t streamIndex, const std::string& profileName ); + /** * @brief Add a stream and set a custom profile * @note Profile will be updated, be sure to pass unique profile name. */ void add( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profileDesc ); - /** - * @brief Add a list of streams. - */ - void add( InputStreamsDesc& streamsDefinition ); - bool processFrame(); void process( ProgressListener& progress ); @@ -62,9 +44,11 @@ class Transcoder void setVerbose( bool verbose = true ){ _verbose = verbose; } private: - void add( InputStreamDesc& streamDefinition ); + void addRewrapStream( const std::string& filename, const size_t streamIndex ); + void addTranscodeStream( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profile ); + void addDummyStream( Profile::ProfileDesc& profile ); InputFile* addInputFile( const std::string& filename, const size_t streamIndex ); From 25cccb7c30ae075f867ae574e9bd31d5dcc22ed4 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 12:13:04 -0400 Subject: [PATCH 08/15] remove some comments --- src/AvTranscoder/Transcoder/Transcoder.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index 7e80c680..32468830 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -80,10 +80,6 @@ bool Transcoder::processFrame() { return false; } - // for( size_t i = 0; i < _streamTranscoders.size(); ++i ) - // { - // _streamTranscoders.at( i )->processFrame(); - // } return true; } From 0d2985c23db6bf16b7802d0f00db160f08001c76 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Tue, 1 Jul 2014 12:13:17 -0400 Subject: [PATCH 09/15] set mono stream by default --- src/AvTranscoder/EssenceStream/OutputAudio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/EssenceStream/OutputAudio.cpp b/src/AvTranscoder/EssenceStream/OutputAudio.cpp index 24689bda..2d96bfe9 100644 --- a/src/AvTranscoder/EssenceStream/OutputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/OutputAudio.cpp @@ -169,7 +169,7 @@ bool OutputAudio::encodeFrame( DataStream& codedFrame ) void OutputAudio::setProfile( Profile::ProfileDesc& desc ) { _audioDesc.setAudioCodec( desc["codec"] ); - _audioDesc.setAudioParameters( 48000, 2, av_get_sample_fmt( desc["sample_fmt"].c_str() ) ); + _audioDesc.setAudioParameters( 48000, 1, av_get_sample_fmt( desc["sample_fmt"].c_str() ) ); setup(); } From 02d4cefa6bfadbc1b794bbf9c5c0393ef34b9fae Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 08:11:40 -0400 Subject: [PATCH 10/15] nothing --- src/AvTranscoder/EssenceStream/InputAudio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/EssenceStream/InputAudio.cpp b/src/AvTranscoder/EssenceStream/InputAudio.cpp index 8221be02..335808ca 100644 --- a/src/AvTranscoder/EssenceStream/InputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/InputAudio.cpp @@ -182,7 +182,7 @@ bool InputAudio::getNextFrame() if( ret < 0 ) { char err[250]; - av_strerror( ret, err, 250); + av_strerror( ret, err, 250 ); throw std::runtime_error( "an error occured during audio decoding" + std::string( err ) ); } From 26767921ba7198406c2c43a4c3d5994bb9da7163 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 08:11:51 -0400 Subject: [PATCH 11/15] adding default parameter to add stream without profile --- src/AvTranscoder/Transcoder/Transcoder.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/Transcoder/Transcoder.hpp b/src/AvTranscoder/Transcoder/Transcoder.hpp index 737c4228..000f0120 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.hpp +++ b/src/AvTranscoder/Transcoder/Transcoder.hpp @@ -29,7 +29,7 @@ class Transcoder * @brief Add a stream and set a profile * @note If profile is empty, add a dummy stream. */ - void add( const std::string& filename, const size_t streamIndex, const std::string& profileName ); + void add( const std::string& filename, const size_t streamIndex, const std::string& profileName = "" ); /** * @brief Add a stream and set a custom profile From b664bf3e3c91d4ee267160536ca7ce94a4f11e24 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 08:13:07 -0400 Subject: [PATCH 12/15] fix transcoder for dummy streams --- .../Transcoder/StreamTranscoder.cpp | 60 ++++++++++--------- src/AvTranscoder/Transcoder/Transcoder.cpp | 16 ++--- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp index 83e4f4c0..ab3e7de0 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp @@ -110,39 +110,36 @@ StreamTranscoder::StreamTranscoder( , _outputEssence( NULL ) , _transcodeStream( true ) { - // create an encoder case from a dummy - switch( _inputStream->getStreamType() ) + if( ! profile.count( Profile::avProfileType ) ) + throw std::runtime_error( "unable to found stream type (audio, video, etc.)" ); + + if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio ) { - case AVMEDIA_TYPE_VIDEO : - { - OutputVideo* outputVideo = new OutputVideo(); - _outputEssence = outputVideo; + OutputAudio* outputAudio = new OutputAudio(); - _outputEssence->setProfile( profile ); - _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); - _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); - _frameBuffer = _videoFrameBuffer; - - break; - } - case AVMEDIA_TYPE_AUDIO : - { - OutputAudio* outputAudio = new OutputAudio(); - _outputEssence = outputAudio; + _outputEssence = outputAudio; + _outputEssence->setProfile( profile ); - _outputEssence->setProfile( profile ); - _outputStream = &outputFile.addAudioStream( outputAudio->getAudioDesc() ); - _audioFrameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); - _frameBuffer = _audioFrameBuffer; - - break; - } - default: - { - throw std::runtime_error( "unupported stream type" ); - break; - } + _outputStream = &outputFile.addAudioStream( outputAudio->getAudioDesc() ); + _audioFrameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); + _frameBuffer = _audioFrameBuffer; + return; } + + if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo ) + { + OutputVideo* outputVideo = new OutputVideo(); + + _outputEssence = outputVideo; + _outputEssence->setProfile( profile ); + + _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); + _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); + _frameBuffer = _videoFrameBuffer; + return; + } + + throw std::runtime_error( "unupported stream type" ); } StreamTranscoder::~StreamTranscoder() @@ -182,19 +179,24 @@ bool StreamTranscoder::processTranscode() assert( _outputEssence != NULL ); assert( _frameBuffer != NULL ); + std::cout << "transcode" << std::endl; + DataStream dataStream; if( _inputEssence->readNextFrame( *_frameBuffer ) ) { + std::cout << "encode" << std::endl; _outputEssence->encodeFrame( *_frameBuffer, dataStream ); } else { + std::cout << "encode last frame" << std::endl; if( ! _outputEssence->encodeFrame( dataStream ) ) { return false; } } + std::cout << "wrap" << std::endl; _outputStream->wrap( dataStream ); return true; } diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index 32468830..8ce3b530 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -66,17 +66,17 @@ void Transcoder::add( const std::string& filename, const size_t streamIndex, Pro bool Transcoder::processFrame() { - for( size_t streamIndex = 0; streamIndex < _inputStreams.size(); ++streamIndex ) + if( _verbose ) + std::cout << "process frame" << std::endl; + for( size_t streamIndex = 0; streamIndex < _streamTranscoders.size(); ++streamIndex ) { - if( ( _streamTranscoders.size() > streamIndex ) && - ! _streamTranscoders.at( streamIndex )->processFrame() ) + if( ! _streamTranscoders.at( streamIndex )->processFrame() ) { - //_inputStreams.erase( _inputStreams.begin() + streamIndex ); - _inputStreams.clear(); + _streamTranscoders.clear(); } } - if( _inputStreams.size() == 0 ) + if( _streamTranscoders.size() == 0 ) { return false; } @@ -164,13 +164,15 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s default: { throw std::runtime_error( "unsupported media type in transcode setup" ); - return; } } } void Transcoder::addDummyStream( Profile::ProfileDesc& profile ) { + if( ! profile.count( Profile::avProfileType ) ) + throw std::runtime_error( "unable to found stream type (audio, video, etc.)" ); + if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio ) { _dummyAudio.push_back( new DummyAudio() ); From 194a95c5036ab35ab824cb5cb2bf76980306e51d Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 08:14:39 -0400 Subject: [PATCH 13/15] fix data size into frame to use dummy stream correctly --- src/AvTranscoder/EssenceStream/DummyAudio.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/AvTranscoder/EssenceStream/DummyAudio.cpp b/src/AvTranscoder/EssenceStream/DummyAudio.cpp index 59cbe8d9..e9e67717 100644 --- a/src/AvTranscoder/EssenceStream/DummyAudio.cpp +++ b/src/AvTranscoder/EssenceStream/DummyAudio.cpp @@ -33,6 +33,9 @@ bool DummyAudio::readNextFrame( Frame& frameBuffer ) { frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); + AudioFrame& audioFrameBuffer = static_cast( frameBuffer ); + audioFrameBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() ); + //av_samples_set_silence( data.getPtr(), offset, nb_samples, nb_channels, sample_fmt ); int fill_char = ( _frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 || @@ -59,6 +62,8 @@ bool DummyAudio::readNextFrame( std::vector& frameBuffer ) for( size_t channel = 0; channel < _frameDesc.getChannels(); ++channel ) { + AudioFrame& audioFrameBuffer = static_cast( frameBuffer.at( channel ) ); + audioFrameBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() ); frameBuffer.at( channel).getBuffer().resize( dataSizeOneChannel ); memset( frameBuffer.at( channel).getPtr(), fill_char, frameBuffer.at( channel).getSize() ); } From 4e36bc91af479b3cc39e08a1f64042c72ef4cc9c Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 08:15:06 -0400 Subject: [PATCH 14/15] get sample_rate and channels from audio profiles --- .../EssenceStream/OutputAudio.cpp | 4 ++- src/AvTranscoder/Profiles/Wave.hpp | 32 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/AvTranscoder/EssenceStream/OutputAudio.cpp b/src/AvTranscoder/EssenceStream/OutputAudio.cpp index 2d96bfe9..df2ad8a7 100644 --- a/src/AvTranscoder/EssenceStream/OutputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/OutputAudio.cpp @@ -169,7 +169,9 @@ bool OutputAudio::encodeFrame( DataStream& codedFrame ) void OutputAudio::setProfile( Profile::ProfileDesc& desc ) { _audioDesc.setAudioCodec( desc["codec"] ); - _audioDesc.setAudioParameters( 48000, 1, av_get_sample_fmt( desc["sample_fmt"].c_str() ) ); + size_t sample_rate = atoi( desc["sample_rate"].c_str() ); + size_t channels = atoi( desc["channels"].c_str() ); + _audioDesc.setAudioParameters( sample_rate, channels, av_get_sample_fmt( desc["sample_fmt"].c_str() ) ); setup(); } diff --git a/src/AvTranscoder/Profiles/Wave.hpp b/src/AvTranscoder/Profiles/Wave.hpp index 6cc5b63a..d770c235 100644 --- a/src/AvTranscoder/Profiles/Wave.hpp +++ b/src/AvTranscoder/Profiles/Wave.hpp @@ -6,26 +6,30 @@ namespace avtranscoder void loadWave( Profile::ProfilesDesc& profiles ) { - Profile::ProfileDesc wave24bits; + Profile::ProfileDesc wave24b48kMono; - wave24bits[ Profile::avProfileIdentificator ] = "wave24bits"; - wave24bits[ Profile::avProfileIdentificatorHuman ] = "Wave 24bits"; - wave24bits[ Profile::avProfileType ] = Profile::avProfileTypeAudio; + wave24b48kMono[ Profile::avProfileIdentificator ] = "wave24b48kMono"; + wave24b48kMono[ Profile::avProfileIdentificatorHuman ] = "Wave 24bits 48kHz mono"; + wave24b48kMono[ Profile::avProfileType ] = Profile::avProfileTypeAudio; - wave24bits[ "codec" ] = "pcm_s24le"; - wave24bits[ "sample_fmt" ] = "s32"; + wave24b48kMono[ "codec" ] = "pcm_s24le"; + wave24b48kMono[ "sample_fmt" ] = "s32"; + wave24b48kMono[ "sample_rate" ] = "48000"; + wave24b48kMono[ "channels" ] = "1"; - Profile::ProfileDesc wave16bits; + Profile::ProfileDesc wave16b48kMono; - wave16bits[ Profile::avProfileIdentificator ] = "wave16bits"; - wave16bits[ Profile::avProfileIdentificatorHuman ] = "Wave 16bits"; - wave16bits[ Profile::avProfileType ] = Profile::avProfileTypeAudio; + wave16b48kMono[ Profile::avProfileIdentificator ] = "wave16b48kMono"; + wave16b48kMono[ Profile::avProfileIdentificatorHuman ] = "Wave 16bits 48kHz mono"; + wave16b48kMono[ Profile::avProfileType ] = Profile::avProfileTypeAudio; - wave16bits[ "codec" ] = "pcm_s16le"; - wave16bits[ "sample_fmt" ] = "s16"; + wave16b48kMono[ "codec" ] = "pcm_s16le"; + wave16b48kMono[ "sample_fmt" ] = "s16"; + wave16b48kMono[ "sample_rate" ] = "48000"; + wave16b48kMono[ "channels" ] = "1"; - profiles.push_back( wave24bits ); - profiles.push_back( wave16bits ); + profiles.push_back( wave24b48kMono ); + profiles.push_back( wave16b48kMono ); } } From 3a0d455a085692df1afc5cd2d5c895eff5c1ea28 Mon Sep 17 00:00:00 2001 From: Marc-Antoine ARNAUD Date: Wed, 2 Jul 2014 09:21:02 -0400 Subject: [PATCH 15/15] adding build on TravisCI --- .travis.yml | 27 +++++++++++++++++++++++++++ tools/scons.travis.cfg | 12 ++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 .travis.yml create mode 100644 tools/scons.travis.cfg diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..1a502416 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +os: + - linux + +language: cpp + +compiler: + - gcc + - clang + +before_script: + - date -u + - uname -a + - lsb_release -a + - ln -s tools/scons.travis.cfg scons.cfg + - sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse" + - sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse" + - sudo apt-add-repository "deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse" + - sudo apt-get update -qq + - sudo apt-get install -qq gcc g++ scons swig swig2.0 + - sudo apt-get install -qq libavdevice-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavresample-dev python-dev freeglut3-dev doxygen + +script: + - scons + +after_failure: + - cat config.log + diff --git a/tools/scons.travis.cfg b/tools/scons.travis.cfg new file mode 100644 index 00000000..a6665c29 --- /dev/null +++ b/tools/scons.travis.cfg @@ -0,0 +1,12 @@ +[COMMON] + +[PYTHON] +inc=/usr/include/python2.7/ + +[JAVA] +inc=/usr/lib/jvm/java-7-openjdk-amd64/include;/usr/lib/jvm/java-7-openjdk-amd64/include/linux/ + +[LIBAV] +inc=/usr/include +libdir=/usr/lib/x86_64-linux-gnu/ +