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/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() ); diff --git a/app/genericProcessor/genericProcessor.cpp b/app/genericProcessor/genericProcessor.cpp index 10a19701..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 ) +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, transcodeProfile ) ); + if( verbose ) + std::cout << filename << " ( " << streamId << " ) : " << transcodeProfile << std::endl; + transcoder.add( filename, atoi( streamId.c_str() ), transcodeProfile ); } } } @@ -44,33 +46,48 @@ int main( int argc, char** argv ) 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; - std::string inputConfigFile( argv[1] ); - avtranscoder::OutputFile outputFile( argv[2] ); + avtranscoder::Profile profiles( true ); - avtranscoder::Transcoder::InputStreamsDesc streams; + if( verbose ) + std::cout << "output file: " << argv[2] << std::endl; - parseConfigFile( inputConfigFile, streams ); + std::string inputConfigFile( argv[1] ); + avtranscoder::OutputFile outputFile( argv[2] ); avtranscoder::Transcoder transcoder( outputFile ); + transcoder.setVerbose( verbose ); - transcoder.add( streams ); + if( verbose ) + std::cout << "parse config file" << std::endl; + parseConfigFile( inputConfigFile, transcoder, profiles ); - 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; + std::cout << std::endl; + if( verbose ) + std::cout << "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; } } diff --git a/src/AvTranscoder/CodedStream/AvInputStream.hpp b/src/AvTranscoder/CodedStream/AvInputStream.hpp index bfc43ea4..611e4dac 100644 --- a/src/AvTranscoder/CodedStream/AvInputStream.hpp +++ b/src/AvTranscoder/CodedStream/AvInputStream.hpp @@ -40,6 +40,7 @@ class AvExport AvInputStream : public InputStream void addPacket( AVPacket& packet ); void setBufferred( const bool bufferized ){ _bufferized = bufferized; }; + bool getBufferred() const { return _bufferized; }; void clearBuffering(); 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/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..e9e67717 --- /dev/null +++ b/src/AvTranscoder/EssenceStream/DummyAudio.cpp @@ -0,0 +1,74 @@ +#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() ); + + 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 || + _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 ) + { + 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() ); + } + + 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..335808ca 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 ) @@ -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 ) ); } 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..4e814d82 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 ) +{ + return false; +} + 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(); diff --git a/src/AvTranscoder/EssenceStream/OutputAudio.cpp b/src/AvTranscoder/EssenceStream/OutputAudio.cpp index 24689bda..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, 2, 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/File/InputFile.cpp b/src/AvTranscoder/File/InputFile.cpp index 3cdae10f..60f8f9a9 100644 --- a/src/AvTranscoder/File/InputFile.cpp +++ b/src/AvTranscoder/File/InputFile.cpp @@ -209,4 +209,9 @@ void InputFile::readStream( const size_t streamIndex, bool readStream ) _inputStreams.at( streamIndex )->setBufferred( readStream ); } +bool InputFile::getReadStream( const size_t streamIndex ) +{ + return _inputStreams.at( streamIndex )->getBufferred(); +} + } diff --git a/src/AvTranscoder/File/InputFile.hpp b/src/AvTranscoder/File/InputFile.hpp index f661078a..01e39102 100644 --- a/src/AvTranscoder/File/InputFile.hpp +++ b/src/AvTranscoder/File/InputFile.hpp @@ -108,6 +108,13 @@ class AvExport InputFile **/ void readStream( const size_t streamIndex, const bool readStream = true ); + /** + * @brief Indicate that the stream will be bufferized during the read + * @param streamIndex specify stream index + * @return the reading status of the streamIndex + **/ + bool getReadStream( const size_t streamIndex ); + protected: AVFormatContext* _formatContext; Properties _properties; 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/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 ); } } diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp index 66cef761..ab3e7de0 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp @@ -3,55 +3,70 @@ #include +#include + namespace avtranscoder { -StreamTranscoder::StreamTranscoder( InputStream& stream, OutputFile& outputFile, const size_t& streamId ) - : _stream( &stream ) +StreamTranscoder::StreamTranscoder( + InputStream& inputStream, + OutputFile& outputFile + ) + : _inputStream( &inputStream ) + , _outputStream( NULL ) , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) , _inputEssence( NULL ) , _outputEssence( NULL ) - , _outputFile( &outputFile ) - , _streamIndex( streamId ) , _transcodeStream( false ) { + // create a re-wrapping case + switch( _inputStream->getStreamType() ) + { + case AVMEDIA_TYPE_VIDEO : + { + _outputStream = &outputFile.addVideoStream( _inputStream->getVideoDesc() ); + break; + } + case AVMEDIA_TYPE_AUDIO : + { + _outputStream = &outputFile.addAudioStream( _inputStream->getAudioDesc() ); + break; + } + default: + break; + } } -StreamTranscoder::~StreamTranscoder() -{ - if( _frameBuffer ) - delete _frameBuffer; - if( _inputEssence ) - delete _inputEssence; - if( _outputEssence ) - delete _outputEssence; -} - -void StreamTranscoder::init( const Profile::ProfileDesc& profileDesc ) +StreamTranscoder::StreamTranscoder( + InputStream& inputStream, + OutputFile& outputFile, + Profile::ProfileDesc& profile + ) + : _inputStream( &inputStream ) + , _outputStream( NULL ) + , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) + , _inputEssence( NULL ) + , _outputEssence( NULL ) + , _transcodeStream( true ) { - const std::string profileName = profileDesc.find( Profile::avProfileIdentificator )->second; - _transcodeStream = profileName.size(); - - switch( _stream->getStreamType() ) + // create a transcode case + 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( profileName.empty() ) - { - _outputFile->addVideoStream( _stream->getVideoDesc() ); - break; - } - OutputVideo* outputVideo = new OutputVideo(); - _outputEssence = outputVideo; - Profile::ProfileDesc prof = profileDesc; - _outputEssence->setProfile( prof ); - _outputFile->addVideoStream( outputVideo->getVideoDesc() ); + _outputEssence = outputVideo; + _outputEssence->setProfile( profile ); + + _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); _videoFrameBuffer = new Image( outputVideo->getVideoDesc().getImageDesc() ); _frameBuffer = _videoFrameBuffer; @@ -59,55 +74,130 @@ void StreamTranscoder::init( const Profile::ProfileDesc& profileDesc ) } 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( profileName.empty() ) - { - _outputFile->addAudioStream( _stream->getAudioDesc() ); - break; - } OutputAudio* outputAudio = new OutputAudio(); + _outputEssence = outputAudio; + _outputEssence->setProfile( profile ); - Profile::ProfileDesc prof = profileDesc; - _outputEssence->setProfile( prof ); - _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, + OutputFile& outputFile, + Profile::ProfileDesc& profile + ) + : _inputStream( NULL ) + , _outputStream( NULL ) + , _frameBuffer( NULL ) + , _videoFrameBuffer( NULL ) + , _audioFrameBuffer( NULL ) + , _inputEssence( &inputEssence ) + , _outputEssence( NULL ) + , _transcodeStream( true ) +{ + 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 ) + { + OutputAudio* outputAudio = new OutputAudio(); + + _outputEssence = outputAudio; + _outputEssence->setProfile( profile ); + + _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() +{ + if( _frameBuffer ) + delete _frameBuffer; + if( _inputEssence ) + delete _inputEssence; + if( _outputEssence ) + delete _outputEssence; +} + + bool StreamTranscoder::processFrame() { - DataStream dataStream; - if( ! _transcodeStream ) + if( _transcodeStream ) { - if( ! _stream->readNextPacket( dataStream ) ) - return false; - _outputFile->wrap( dataStream, _streamIndex ); - return true; + return processTranscode(); } + return processRewrap(); +} - // std::cout << "encode & wrap" << _streamIndex << std::endl; +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 ); + std::cout << "transcode" << std::endl; + + DataStream dataStream; if( _inputEssence->readNextFrame( *_frameBuffer ) ) { + std::cout << "encode" << std::endl; _outputEssence->encodeFrame( *_frameBuffer, dataStream ); } - else if( ! _outputEssence->encodeFrame( dataStream ) ) + else { - return false; + std::cout << "encode last frame" << std::endl; + if( ! _outputEssence->encodeFrame( dataStream ) ) + { + return false; + } } - _outputFile->wrap( dataStream, _streamIndex ); + std::cout << "wrap" << std::endl; + _outputStream->wrap( dataStream ); return true; } diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp index a96dda7f..996816e9 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.hpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.hpp @@ -19,27 +19,45 @@ namespace avtranscoder class StreamTranscoder { public: - StreamTranscoder( InputStream& stream, OutputFile& outputFile, const size_t& streamId ); - ~StreamTranscoder(); + /** + * @brief rewrap stream + **/ + StreamTranscoder( InputStream& inputStream, OutputFile& outputFile ); + + /** + * @brief transcode stream + **/ + StreamTranscoder( InputStream& inputStream, OutputFile& outputFile, Profile::ProfileDesc& profile ); - void init( const Profile::ProfileDesc& profileDesc ); + /** + * @brief encode from dummy stream + **/ + StreamTranscoder( InputEssence& inputEssence, OutputFile& outputFile, Profile::ProfileDesc& profile ); + + ~StreamTranscoder(); + /** + * @brief process a single frame for the current stream + * @return the process status result + */ bool processFrame(); bool isTranscodeStream() const { return _transcodeStream; } private: - InputStream* _stream; + bool processRewrap(); + bool processTranscode(); - Frame* _frameBuffer; - Image* _videoFrameBuffer; - AudioFrame* _audioFrameBuffer; +private: + InputStream* _inputStream; + OutputStream* _outputStream; + + Frame* _frameBuffer; + Image* _videoFrameBuffer; + AudioFrame* _audioFrameBuffer; InputEssence* _inputEssence; OutputEssence* _outputEssence; - OutputFile* _outputFile; - - size_t _streamIndex; bool _transcodeStream; @@ -49,4 +67,3 @@ class StreamTranscoder } #endif - diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index 290ed659..8ce3b530 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -1,6 +1,5 @@ #include "Transcoder.hpp" -#include "StreamTranscoder.hpp" #include @@ -10,6 +9,7 @@ namespace avtranscoder Transcoder::Transcoder( OutputFile& outputFile ) : _outputFile( outputFile ) , _profile( true ) + , _verbose( false ) { _outputFile.setup(); } @@ -20,12 +20,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); @@ -34,94 +36,126 @@ Transcoder::~Transcoder() void Transcoder::add( const std::string& filename, const size_t streamIndex, const std::string& profileName ) { - InputStreamDesc streamDesc( streamIndex, filename, profileName ); - add( streamDesc ); -} + if( profileName.length() == 0 ) // no profile, only re-wrap stream + { + if( _verbose ) + std::cout << "add re-wrap stream" << std::endl; + addRewrapStream( filename, streamIndex ); + return; + } -void Transcoder::add( const std::string& filename, const size_t streamIndex, const Profile::ProfileDesc& profileDesc ) -{ - _profile.update( profileDesc ); - - InputStreamDesc streamDesc( streamIndex, filename, profileDesc ); - add( streamDesc ); + Profile::ProfileDesc& transcodeProfile = _profile.getProfile( profileName ); + add( filename, streamIndex, transcodeProfile ); } -void Transcoder::add( const InputStreamsDesc& streamDefs ) +void Transcoder::add( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profileDesc ) { - for( size_t streamDest = 0; streamDest < streamDefs.size(); ++streamDest ) + _profile.update( profileDesc ); + if( ! filename.length() ) { - add( streamDefs.at( streamDest ) ); + if( _verbose ) + std::cout << "add encoding stream for dummy input" << std::endl; + addDummyStream( profileDesc ); + return; } - if( _inputStreams.size() != _streamTranscoders.size() ) - throw std::runtime_error( "_inputStreams and _streamTranscoders must have the same number of streams" ); + + if( _verbose ) + std::cout << "add transcoding stream" << std::endl; + addTranscodeStream( filename, streamIndex, profileDesc ); } -void Transcoder::add( const InputStreamDesc& streamDefinition ) +bool Transcoder::processFrame() { - const std::string filename( streamDefinition.filename ); - const size_t streamIndex = streamDefinition.streamId; - const Profile::ProfileDesc profileDesc = streamDefinition.transcodeProfile; - - if( ! filename.length() ) + if( _verbose ) + std::cout << "process frame" << std::endl; + for( size_t streamIndex = 0; streamIndex < _streamTranscoders.size(); ++streamIndex ) { - try - { - // be sure the first inputStream is an AvInputStream created from an audio file - dynamic_cast( _inputStreams.at( 0 ) ); - } - catch( std::exception& e) + if( ! _streamTranscoders.at( streamIndex )->processFrame() ) { - throw std::runtime_error( "dummy stream can't be the first audio channel" ); + _streamTranscoders.clear(); } + } - _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 ); + if( _streamTranscoders.size() == 0 ) + { + return false; + } + return true; +} - return; +void Transcoder::process( ProgressListener& progress ) +{ + size_t frame = 0; + + + std::vector< DataStream > dataStreams; + + dataStreams.reserve( _inputStreams.size() ); + + for( size_t streamIndex = 0; streamIndex < _inputStreams.size(); ++streamIndex ) + { + DataStream dataStream; + dataStreams.push_back( dataStream ); } - InputFile* referenceFile = NULL; + if( ! _inputStreams.size() ) + { + throw std::runtime_error( "missing input streams in transcoder" ); + } + + if( _verbose ) + std::cout << "begin transcoding" << std::endl; + + _outputFile.beginWrap(); - for( std::vector< InputFile* >::iterator it = _inputFiles.begin(); it != _inputFiles.end(); ++it ) + double totalDuration = _inputStreams.at( 0 )->getDuration(); + + while( 1 ) { - if( (*it)->getFilename() == filename ) + if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), totalDuration ) == eJobStatusCancel ) { - referenceFile = (*it); break; } - } - if( ! referenceFile ) - { - _inputFiles.push_back( new InputFile( filename ) ); - referenceFile = _inputFiles.back(); + if( ! processFrame() ) + break; + + ++frame; } - referenceFile->readStream( streamIndex ); + if( _verbose ) + std::cout << "end of transcoding" << std::endl; + + _outputFile.endWrap(); +} + +void Transcoder::addRewrapStream( const std::string& filename, const size_t streamIndex ) +{ + InputFile* referenceFile = addInputFile( filename, streamIndex ); + + StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile ); + _streamTranscoders.push_back( streamTranscoder ); + _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); +} + +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, _streamTranscoders.size() ); - streamTranscoder->init( profileDesc ); + 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, _streamTranscoders.size() ); - streamTranscoder->init( profileDesc ); + 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: @@ -129,81 +163,55 @@ void Transcoder::add( const InputStreamDesc& streamDefinition ) case AVMEDIA_TYPE_ATTACHMENT: default: { - return; + throw std::runtime_error( "unsupported media type in transcode setup" ); } } - return; } - -bool Transcoder::processFrame() +void Transcoder::addDummyStream( Profile::ProfileDesc& profile ) { - for( size_t streamIndex = 0; streamIndex < _inputStreams.size(); ++streamIndex ) - { - if( ( _streamTranscoders.size() > streamIndex ) && - ! _streamTranscoders.at( streamIndex )->processFrame() ) - { - //_inputStreams.erase( _inputStreams.begin() + streamIndex ); - _inputStreams.clear(); - } - } + if( ! profile.count( Profile::avProfileType ) ) + throw std::runtime_error( "unable to found stream type (audio, video, etc.)" ); - if( _inputStreams.size() == 0 ) + if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio ) { - return false; + _dummyAudio.push_back( new DummyAudio() ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyAudio.back(), _outputFile, profile ); + _streamTranscoders.push_back( streamTranscoder ); } - for( size_t i = 0; i < _streamTranscoders.size(); ++i ) + + if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo ) { - _streamTranscoders.at( i )->processFrame(); + _dummyVideo.push_back( new DummyVideo() ); + StreamTranscoder* streamTranscoder = new StreamTranscoder( *_dummyVideo.back(), _outputFile, profile ); + _streamTranscoders.push_back( streamTranscoder ); } - return true; } - -void Transcoder::process( ProgressListener& progress ) +InputFile* Transcoder::addInputFile( const std::string& filename, const size_t streamIndex ) { - size_t frame = 0; - - std::vector< DataStream > dataStreams; - - dataStreams.reserve( _inputStreams.size() ); - - for( size_t streamIndex = 0; streamIndex < _inputStreams.size(); ++streamIndex ) - { - DataStream dataStream; - dataStreams.push_back( dataStream ); - } - - _outputFile.beginWrap(); - + InputFile* referenceFile = NULL; - while( 1 ) + for( std::vector< InputFile* >::iterator it = _inputFiles.begin(); it != _inputFiles.end(); ++it ) { - if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), _inputStreams.at( 0 )->getDuration() ) == eJobStatusCancel ) + if( (*it)->getFilename() == filename ) { + referenceFile = (*it); break; } - - if( ! processFrame() ) - break; - - ++frame; } - _outputFile.endWrap(); -} - -bool Transcoder::getStreamsNextPacket( std::vector< DataStream >& dataStreams ) -{ - for( size_t i = 0; i < _inputStreams.size(); ++i ) + if( ! referenceFile ) { - bool ret = _inputStreams.at( i )->readNextPacket( dataStreams.at( i ) ); - if( ! ret || ( dataStreams.at( i ).getBuffer().size() == 0 ) ) - { - return false; - } + if( _verbose ) + std::cout << "new InputFile for " << filename << std::endl; + _inputFiles.push_back( new InputFile( filename ) ); + referenceFile = _inputFiles.back(); } - return true; + + referenceFile->readStream( streamIndex ); + + return referenceFile; } } diff --git a/src/AvTranscoder/Transcoder/Transcoder.hpp b/src/AvTranscoder/Transcoder/Transcoder.hpp index c9c63391..000f0120 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.hpp +++ b/src/AvTranscoder/Transcoder/Transcoder.hpp @@ -4,58 +4,25 @@ #include #include #include +#include +#include #include -#include #include +#include "StreamTranscoder.hpp" + #include #include namespace avtranscoder { -class StreamTranscoder; - class Transcoder { - public: - struct InputStreamDesc { - size_t streamId; - std::string filename; - Profile::ProfileDesc transcodeProfile; - - InputStreamDesc( const size_t& sId, const std::string& filename, const Profile::ProfileDesc& profile ) - : streamId( sId ) - , filename( filename ) - , transcodeProfile( profile ) - { - } - - InputStreamDesc( const size_t& sId, const std::string& filename, const std::string& profileName ) - : streamId( sId ) - , filename( filename ) - { - try - { - Profile p( true ); - transcodeProfile = p.getProfile( profileName ); - } - // if the profile doesn't exist - catch( std::exception& e ) - { - Profile::ProfileDesc emptyDesc; - emptyDesc[ Profile::avProfileIdentificator ] = ""; - emptyDesc[ Profile::avProfileIdentificatorHuman ] = ""; - - transcodeProfile = emptyDesc; - } - } - }; - - typedef std::vector< InputStreamDesc > InputStreamsDesc; Transcoder( OutputFile& outputFile ); + ~Transcoder(); /** @@ -63,24 +30,28 @@ class Transcoder * @note If profile is empty, add a dummy stream. */ void add( const std::string& filename, const size_t streamIndex, const std::string& profileName = "" ); + /** - * @brief Add a srteam and set a custom profile + * @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, const Profile::ProfileDesc& profileDesc ); - /** - * @brief Add a list of streams. - */ - void add( const InputStreamsDesc& streamDefs ); + void add( const std::string& filename, const size_t streamIndex, Profile::ProfileDesc& profileDesc ); bool processFrame(); void process( ProgressListener& progress ); + void setVerbose( bool verbose = true ){ _verbose = verbose; } + private: - void add( const InputStreamDesc& streamDefinition ); - - bool getStreamsNextPacket( std::vector< DataStream >& dataStreams ); + + 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 ); private: OutputFile& _outputFile; @@ -89,11 +60,13 @@ class Transcoder std::vector< InputStream* > _inputStreams; std::vector< StreamTranscoder* > _streamTranscoders; - std::vector< DummyInputStream* > _dummyInputStreams; - + std::vector< DummyAudio* > _dummyAudio; + std::vector< DummyVideo* > _dummyVideo; Profile _profile; + + bool _verbose; }; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 8397d156..ccf6e5a1 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -40,9 +40,12 @@ #include #include +#include + #include #include + %} %include "AvTranscoder/ProgressListener.i" @@ -89,5 +92,8 @@ namespace std { %include %include +%include + %include %include + 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/ +