diff --git a/src/AvTranscoder/CodedStream/AvInputStream.hpp b/src/AvTranscoder/CodedStream/AvInputStream.hpp index e68f7d57..66a13c96 100644 --- a/src/AvTranscoder/CodedStream/AvInputStream.hpp +++ b/src/AvTranscoder/CodedStream/AvInputStream.hpp @@ -3,7 +3,7 @@ #include "InputStream.hpp" -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/CodedStream/InputStream.hpp b/src/AvTranscoder/CodedStream/InputStream.hpp index 9c578f5b..e9d36d60 100644 --- a/src/AvTranscoder/CodedStream/InputStream.hpp +++ b/src/AvTranscoder/CodedStream/InputStream.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_CODED_STREAM_INPUT_STREAM_HPP_ #define _AV_TRANSCODER_CODED_STREAM_INPUT_STREAM_HPP_ -#include +#include #include #include diff --git a/src/AvTranscoder/CodedStream/OutputStream.hpp b/src/AvTranscoder/CodedStream/OutputStream.hpp index 8a733565..bd4bb6f4 100644 --- a/src/AvTranscoder/CodedStream/OutputStream.hpp +++ b/src/AvTranscoder/CodedStream/OutputStream.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_CODED_STREAM_OUTPUT_STREAM_HPP_ #define _AV_TRANSCODER_CODED_STREAM_OUTPUT_STREAM_HPP_ -#include +#include #include #include diff --git a/src/AvTranscoder/CodedStructures/AudioDesc.cpp b/src/AvTranscoder/CodedStructures/AudioDesc.cpp index 55ee1e86..5fa37221 100644 --- a/src/AvTranscoder/CodedStructures/AudioDesc.cpp +++ b/src/AvTranscoder/CodedStructures/AudioDesc.cpp @@ -53,6 +53,10 @@ const AVSampleFormat AudioDesc::getSampleFormat() const return m_codecContext->sample_fmt; } +void AudioDesc::setAudioParameters( const AudioFrameDesc& audioFrameDesc ) +{ + setAudioParameters( audioFrameDesc.getSampleRate(), audioFrameDesc.getChannels(), audioFrameDesc.getSampleFormat() ); +} void AudioDesc::setAudioParameters( const size_t sampleRate, const size_t channels, const AVSampleFormat sampleFormat ) { diff --git a/src/AvTranscoder/CodedStructures/AudioDesc.hpp b/src/AvTranscoder/CodedStructures/AudioDesc.hpp index 2a7c5b74..419129e3 100644 --- a/src/AvTranscoder/CodedStructures/AudioDesc.hpp +++ b/src/AvTranscoder/CodedStructures/AudioDesc.hpp @@ -24,6 +24,7 @@ class AvExport AudioDesc : public CodedDesc const size_t getChannels() const; const AVSampleFormat getSampleFormat() const; + void setAudioParameters( const AudioFrameDesc& audioFrameDesc ); void setAudioParameters( const size_t sampleRate, const size_t channels, const AVSampleFormat sampleFormat ); }; diff --git a/src/AvTranscoder/CodedStructures/DataStreamDesc.hpp b/src/AvTranscoder/CodedStructures/DataStream.hpp similarity index 100% rename from src/AvTranscoder/CodedStructures/DataStreamDesc.hpp rename to src/AvTranscoder/CodedStructures/DataStream.hpp diff --git a/src/AvTranscoder/EssenceStream/InputAudio.cpp b/src/AvTranscoder/EssenceStream/InputAudio.cpp index 0137d369..6c8fe96c 100644 --- a/src/AvTranscoder/EssenceStream/InputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/InputAudio.cpp @@ -143,9 +143,14 @@ bool InputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex const int output_align = 1; size_t decodedSize = av_samples_get_buffer_size(NULL, output_nbChannels, _frame->nb_samples, _codecContext->sample_fmt, output_align); - size_t nbChannels = _codecContext->channels; + size_t nbSubStreams = _codecContext->channels; size_t bytePerSample = av_get_bytes_per_sample( (AVSampleFormat)_frame->format ); + if( subStreamIndex > nbSubStreams - 1 ) + { + throw std::runtime_error( "The subStream doesn't exist"); + } + AudioFrame& audioBuffer = static_cast( frameBuffer ); audioBuffer.setNbSamples( _frame->nb_samples ); @@ -158,9 +163,8 @@ bool InputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex unsigned char* src = _frame->data[0]; unsigned char* dst = audioBuffer.getPtr(); - // @todo check little / big endian - // offset for little endian - src += ( nbChannels - 1 - subStreamIndex ) * bytePerSample; + // offset + src += ( nbSubStreams - 1 - subStreamIndex ) * bytePerSample; for( int sample = 0; sample < _frame->nb_samples; ++sample ) { @@ -169,7 +173,7 @@ bool InputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex // std::cout << "dst " << static_cast(dst) << std::endl; memcpy( dst, src, bytePerSample ); dst += bytePerSample; - src += bytePerSample * nbChannels; + src += bytePerSample * nbSubStreams; } } return true; diff --git a/src/AvTranscoder/EssenceStream/OutputAudio.cpp b/src/AvTranscoder/EssenceStream/OutputAudio.cpp index 41ce5f72..81edf80a 100644 --- a/src/AvTranscoder/EssenceStream/OutputAudio.cpp +++ b/src/AvTranscoder/EssenceStream/OutputAudio.cpp @@ -11,7 +11,6 @@ extern "C" { #include #include -#include namespace avtranscoder { @@ -177,28 +176,22 @@ bool OutputAudio::encodeFrame( DataStream& codedFrame ) void OutputAudio::setProfile( const Profile::ProfileDesc& desc, const AudioFrameDesc& frameDesc ) { if( ! desc.count( Profile::avProfileCodec ) || - ! desc.count( Profile::avProfileSampleFormat ) || - ! desc.count( Profile::avProfileSampleRate ) || - ! desc.count( Profile::avProfileChannel ) ) + ! desc.count( Profile::avProfileSampleFormat ) ) { throw std::runtime_error( "The profile " + desc.find( Profile::avProfileIdentificatorHuman )->second + " is invalid." ); } _audioDesc.setCodec( desc.find( Profile::avProfileCodec )->second ); - size_t sample_rate = std::strtoul( desc.find( Profile::avProfileSampleRate )->second.c_str(), NULL, 0 ); - size_t channels = std::strtoul( desc.find( Profile::avProfileChannel )->second.c_str(), NULL, 0 ); - _audioDesc.setAudioParameters( sample_rate, channels, av_get_sample_fmt( desc.find( Profile::avProfileSampleFormat )->second.c_str() ) ); - + _audioDesc.setAudioParameters( frameDesc ); + for( Profile::ProfileDesc::const_iterator it = desc.begin(); it != desc.end(); ++it ) { if( (*it).first == Profile::avProfileIdentificator || (*it).first == Profile::avProfileIdentificatorHuman || (*it).first == Profile::avProfileType || (*it).first == Profile::avProfileCodec || - (*it).first == Profile::avProfileSampleFormat || - (*it).first == Profile::avProfileSampleRate || - (*it).first == Profile::avProfileChannel ) + (*it).first == Profile::avProfileSampleFormat ) continue; try @@ -219,9 +212,7 @@ void OutputAudio::setProfile( const Profile::ProfileDesc& desc, const AudioFrame (*it).first == Profile::avProfileIdentificatorHuman || (*it).first == Profile::avProfileType || (*it).first == Profile::avProfileCodec || - (*it).first == Profile::avProfileSampleFormat || - (*it).first == Profile::avProfileSampleRate || - (*it).first == Profile::avProfileChannel ) + (*it).first == Profile::avProfileSampleFormat ) continue; try diff --git a/src/AvTranscoder/EssenceStream/OutputAudio.hpp b/src/AvTranscoder/EssenceStream/OutputAudio.hpp index 541e4c88..15b336f3 100644 --- a/src/AvTranscoder/EssenceStream/OutputAudio.hpp +++ b/src/AvTranscoder/EssenceStream/OutputAudio.hpp @@ -3,7 +3,7 @@ #include "OutputEssence.hpp" -#include +#include #include #include diff --git a/src/AvTranscoder/EssenceStream/OutputEssence.hpp b/src/AvTranscoder/EssenceStream/OutputEssence.hpp index c06a0e64..c3fff80b 100644 --- a/src/AvTranscoder/EssenceStream/OutputEssence.hpp +++ b/src/AvTranscoder/EssenceStream/OutputEssence.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_ESSENCE_STREAM_OUTPUT_ESSENCE_HPP_ #include -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/EssenceStream/OutputVideo.cpp b/src/AvTranscoder/EssenceStream/OutputVideo.cpp index d440e71d..d1c27243 100644 --- a/src/AvTranscoder/EssenceStream/OutputVideo.cpp +++ b/src/AvTranscoder/EssenceStream/OutputVideo.cpp @@ -181,7 +181,7 @@ bool OutputVideo::encodeFrame( DataStream& codedFrame ) #endif } -void OutputVideo::setProfile( const Profile::ProfileDesc& desc, const avtranscoder::VideoFrameDesc& videoFrameDesc ) +void OutputVideo::setProfile( const Profile::ProfileDesc& desc, const avtranscoder::VideoFrameDesc& frameDesc ) { if( ! desc.count( Profile::avProfileCodec ) || ! desc.count( Profile::avProfilePixelFormat ) || @@ -195,7 +195,7 @@ void OutputVideo::setProfile( const Profile::ProfileDesc& desc, const avtranscod const size_t frameRate = std::strtoul( desc.find( Profile::avProfileFrameRate )->second.c_str(), NULL, 0 ); _videoDesc.setTimeBase( 1, frameRate ); - _videoDesc.setImageParameters( videoFrameDesc ); + _videoDesc.setImageParameters( frameDesc ); for( Profile::ProfileDesc::const_iterator it = desc.begin(); it != desc.end(); ++it ) { diff --git a/src/AvTranscoder/EssenceStream/OutputVideo.hpp b/src/AvTranscoder/EssenceStream/OutputVideo.hpp index 065e30dc..18da2b1f 100644 --- a/src/AvTranscoder/EssenceStream/OutputVideo.hpp +++ b/src/AvTranscoder/EssenceStream/OutputVideo.hpp @@ -3,7 +3,7 @@ #include "OutputEssence.hpp" -#include +#include #include #include @@ -31,7 +31,7 @@ class AvExport OutputVideo : public OutputEssence */ bool encodeFrame( DataStream& codedFrame ); - void setProfile( const Profile::ProfileDesc& desc, const avtranscoder::VideoFrameDesc& videoFrameDesc ); + void setProfile( const Profile::ProfileDesc& desc, const avtranscoder::VideoFrameDesc& frameDesc ); VideoDesc& getVideoDesc() { return _videoDesc; } diff --git a/src/AvTranscoder/EssenceStructures/AudioFrame.hpp b/src/AvTranscoder/EssenceStructures/AudioFrame.hpp index 34b034ab..a6ac1038 100644 --- a/src/AvTranscoder/EssenceStructures/AudioFrame.hpp +++ b/src/AvTranscoder/EssenceStructures/AudioFrame.hpp @@ -1,9 +1,9 @@ #ifndef _AV_TRANSCODER_DATA_AUDIO_FRAME_HPP_ #define _AV_TRANSCODER_DATA_AUDIO_FRAME_HPP_ -#include - #include "Frame.hpp" +#include +#include namespace avtranscoder { @@ -21,12 +21,19 @@ class AvExport AudioFrameDesc void setSampleRate ( const size_t sampleRate ){ m_sampleRate = sampleRate; } void setChannels ( const size_t channels ){ m_channels = channels; } void setFps ( const size_t fps ){ m_fps = fps; } + void setSampleFormat( const std::string& sampleFormatName ){ m_sampleFormat = av_get_sample_fmt( sampleFormatName.c_str() ); } void setSampleFormat( const AVSampleFormat sampleFormat ){ m_sampleFormat = sampleFormat; } size_t getDataSize() const { return ( m_sampleRate / m_fps ) * m_channels * av_get_bytes_per_sample( m_sampleFormat ); } + + void setParameters( const Profile::ProfileDesc& desc ) + { + if( desc.find( Profile::avProfileSampleFormat ) != desc.end() ) + setSampleFormat( desc.find( Profile::avProfileSampleFormat )->second ); + } size_t getSampleRate() const { return m_sampleRate; } size_t getChannels () const { return m_channels; } diff --git a/src/AvTranscoder/EssenceStructures/VideoFrame.hpp b/src/AvTranscoder/EssenceStructures/VideoFrame.hpp index fe0e9bce..cfd582ed 100644 --- a/src/AvTranscoder/EssenceStructures/VideoFrame.hpp +++ b/src/AvTranscoder/EssenceStructures/VideoFrame.hpp @@ -1,6 +1,9 @@ #ifndef _AV_TRANSCODER_DATA_IMAGE_HPP_ #define _AV_TRANSCODER_DATA_IMAGE_HPP_ +#include "Pixel.hpp" +#include "Frame.hpp" +#include #include extern "C" { @@ -16,8 +19,6 @@ extern "C" { #include -#include "Pixel.hpp" -#include "Frame.hpp" namespace avtranscoder { @@ -47,6 +48,12 @@ class AvExport VideoFrameDesc void setPixel ( const Pixel pixel ) { m_pixel = pixel; } void setDar ( const size_t num, const size_t den ) { m_displayAspectRatio.num = num; m_displayAspectRatio.den = den; } void setDar ( const Ratio ratio ) { m_displayAspectRatio = ratio; } + + void setParameters( const Profile::ProfileDesc& desc ) + { + if( desc.find( Profile::avProfilePixelFormat ) != desc.end() ) + setPixel( Pixel( desc.find( Profile::avProfilePixelFormat )->second.c_str() ) ); + } size_t getWidth () const { return m_width; } size_t getHeight() const { return m_height; } diff --git a/src/AvTranscoder/File/InputFile.hpp b/src/AvTranscoder/File/InputFile.hpp index b44e0e40..42ec2920 100644 --- a/src/AvTranscoder/File/InputFile.hpp +++ b/src/AvTranscoder/File/InputFile.hpp @@ -3,7 +3,7 @@ #include -#include +#include #include #include diff --git a/src/AvTranscoder/File/OutputFile.hpp b/src/AvTranscoder/File/OutputFile.hpp index e0e07579..d2bfab17 100644 --- a/src/AvTranscoder/File/OutputFile.hpp +++ b/src/AvTranscoder/File/OutputFile.hpp @@ -3,7 +3,7 @@ #include -#include +#include #include #include diff --git a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp index 4a653e8b..3a8d8a03 100644 --- a/src/AvTranscoder/Transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/Transcoder/StreamTranscoder.cpp @@ -81,18 +81,13 @@ StreamTranscoder::StreamTranscoder( _outputEssence = outputVideo; - VideoFrameDesc outputVideoFrameDesc = _inputStream->getVideoDesc().getVideoFrameDesc(); - - outputVideoFrameDesc.setPixel( Pixel( profile.find( Profile::avProfilePixelFormat )->second.c_str() ) ); - - outputVideo->setProfile( profile, outputVideoFrameDesc ); + VideoFrameDesc outputFrameDesc = _inputStream->getVideoDesc().getVideoFrameDesc(); + outputFrameDesc.setParameters( profile ); + outputVideo->setProfile( profile, outputFrameDesc ); _outputStream = &outputFile.addVideoStream( outputVideo->getVideoDesc() ); _sourceBuffer = new VideoFrame( _inputStream->getVideoDesc().getVideoFrameDesc() ); - - // outputVideo->getVideoDesc().setImageParameters( _inputStream->getVideoDesc().getVideoFrameDesc().getWidth(), _inputStream->getVideoDesc().getVideoFrameDesc().getHeight(), av_get_pix_fmt( desc[ Profile::avProfilePixelFormat ].c_str() ) ); - _frameBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() ); _transform = new VideoEssenceTransform(); @@ -107,16 +102,23 @@ StreamTranscoder::StreamTranscoder( OutputAudio* outputAudio = new OutputAudio(); _outputEssence = outputAudio; - AudioFrameDesc audioFrameDesc( _inputStream->getAudioDesc().getFrameDesc() ); + AudioFrameDesc outputFrameDesc( _inputStream->getAudioDesc().getFrameDesc() ); + outputFrameDesc.setParameters( profile ); if( subStreamIndex > -1 ) - audioFrameDesc.setChannels( 1 ); - - outputAudio->setProfile( profile, audioFrameDesc ); + { + // @todo manage downmix ? + outputFrameDesc.setChannels( 1 ); + } + outputAudio->setProfile( profile, outputFrameDesc ); _outputStream = &outputFile.addAudioStream( outputAudio->getAudioDesc() ); - _sourceBuffer = new AudioFrame( audioFrameDesc ); + AudioFrameDesc inputFrameDesc( _inputStream->getAudioDesc().getFrameDesc() ); + if( subStreamIndex > -1 ) + inputFrameDesc.setChannels( 1 ); + + _sourceBuffer = new AudioFrame( inputFrameDesc ); _frameBuffer = new AudioFrame( outputAudio->getAudioDesc().getFrameDesc() ); _transform = new AudioEssenceTransform(); diff --git a/src/AvTranscoder/Transcoder/Transcoder.cpp b/src/AvTranscoder/Transcoder/Transcoder.cpp index b196dd63..b0714603 100644 --- a/src/AvTranscoder/Transcoder/Transcoder.cpp +++ b/src/AvTranscoder/Transcoder/Transcoder.cpp @@ -239,11 +239,6 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s switch( referenceFile->getStreamType( streamIndex ) ) { case AVMEDIA_TYPE_VIDEO: - { - _streamTranscoders.push_back( new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile ) ); - _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); - break; - } case AVMEDIA_TYPE_AUDIO: { _streamTranscoders.push_back( new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile ) ); @@ -267,11 +262,6 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s switch( referenceFile->getStreamType( streamIndex ) ) { case AVMEDIA_TYPE_VIDEO: - { - _streamTranscoders.push_back( new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile, subStreamIndex ) ); - _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); - break; - } case AVMEDIA_TYPE_AUDIO: { _streamTranscoders.push_back( new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, profile, subStreamIndex ) ); diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index c11d3372..6ad9ca58 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -11,6 +11,8 @@ %{ #include +#include + #include #include #include @@ -19,7 +21,7 @@ #include #include #include -#include +#include #include @@ -42,8 +44,6 @@ #include #include -#include - #include #include @@ -65,6 +65,8 @@ namespace std { %include +%include + %include %include %include @@ -73,7 +75,7 @@ namespace std { %include %include %include -%include +%include %include @@ -96,8 +98,6 @@ namespace std { %include %include -%include - %include %include