diff --git a/app/genericProcessor/genericProcessor.cpp b/app/genericProcessor/genericProcessor.cpp index 381c10e4..95591013 100644 --- a/app/genericProcessor/genericProcessor.cpp +++ b/app/genericProcessor/genericProcessor.cpp @@ -114,7 +114,6 @@ int main( int argc, char** argv ) // set verbose of all stream transcoder.setVerbose( verbose ); transcoder.setProcessMethod( avtranscoder::eProcessMethodLongest ); - //transcoder.setOutputFps( 12 ); transcoder.init(); if( verbose ) diff --git a/app/presetChecker/presetChecker.cpp b/app/presetChecker/presetChecker.cpp index e3ca2ac7..d987f3b7 100644 --- a/app/presetChecker/presetChecker.cpp +++ b/app/presetChecker/presetChecker.cpp @@ -34,7 +34,7 @@ int main( int argc, char** argv ) if( profile.find( avtranscoder::constants::avProfileType )->second == avtranscoder::constants::avProfileTypeAudio ) { avtranscoder::AvOutputAudio outputAudio; - outputAudio.setProfile( profile, outputAudio.getAudioCodec().getFrameDesc() ); + outputAudio.setProfile( profile, outputAudio.getAudioCodec().getAudioFrameDesc() ); } } catch( ... ) diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 5768f912..64ec6df6 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include #include @@ -59,6 +61,7 @@ namespace std { %template(ChannelVector) vector< avtranscoder::Channel >; %template(ProfileMap) map< string, string >; %template(ProfilesVector) vector< map< string, string > >; +%template(DataBuffer) std::vector< unsigned char >; } %include "AvTranscoder/progress/progress.i" @@ -90,6 +93,8 @@ namespace std { %include %include %include +%include +%include %include %include diff --git a/src/AvTranscoder/codec/AudioCodec.cpp b/src/AvTranscoder/codec/AudioCodec.cpp index b96bbdaf..ba94746e 100644 --- a/src/AvTranscoder/codec/AudioCodec.cpp +++ b/src/AvTranscoder/codec/AudioCodec.cpp @@ -20,7 +20,7 @@ AudioCodec::AudioCodec( const ICodec& codec ) { } -AudioFrameDesc AudioCodec::getFrameDesc() const +AudioFrameDesc AudioCodec::getAudioFrameDesc() const { assert( _codecContext != NULL ); AudioFrameDesc audioFrameDesc; @@ -33,24 +33,6 @@ AudioFrameDesc AudioCodec::getFrameDesc() const return audioFrameDesc; } -const size_t AudioCodec::getSampleRate() const -{ - assert( _codecContext != NULL ); - return _codecContext->sample_rate; -} - -const size_t AudioCodec::getChannels() const -{ - assert( _codecContext != NULL ); - return _codecContext->channels; -} - -const AVSampleFormat AudioCodec::getAVSampleFormat() const -{ - assert( _codecContext != NULL ); - return _codecContext->sample_fmt; -} - void AudioCodec::setAudioParameters( const AudioFrameDesc& audioFrameDesc ) { setAudioParameters( audioFrameDesc.getSampleRate(), audioFrameDesc.getChannels(), audioFrameDesc.getAVSampleFormat() ); diff --git a/src/AvTranscoder/codec/AudioCodec.hpp b/src/AvTranscoder/codec/AudioCodec.hpp index 5d86e1aa..75c0734c 100644 --- a/src/AvTranscoder/codec/AudioCodec.hpp +++ b/src/AvTranscoder/codec/AudioCodec.hpp @@ -14,11 +14,8 @@ class AvExport AudioCodec : public ICodec AudioCodec( const ECodecType type, const AVCodecID codecId ); AudioCodec( const ICodec& codec ); - AudioFrameDesc getFrameDesc() const; - const size_t getSampleRate() const; - const size_t getChannels() const; - const AVSampleFormat getAVSampleFormat() const; - + AudioFrameDesc getAudioFrameDesc() const; + void setAudioParameters( const AudioFrameDesc& audioFrameDesc ); void setAudioParameters( const size_t sampleRate, const size_t channels, const AVSampleFormat sampleFormat ); }; diff --git a/src/AvTranscoder/codec/VideoCodec.cpp b/src/AvTranscoder/codec/VideoCodec.cpp index faae1076..f29b581b 100644 --- a/src/AvTranscoder/codec/VideoCodec.cpp +++ b/src/AvTranscoder/codec/VideoCodec.cpp @@ -23,14 +23,16 @@ VideoCodec::VideoCodec( const ICodec& codec ) VideoFrameDesc VideoCodec::getVideoFrameDesc() const { assert( _codecContext != NULL ); - VideoFrameDesc VideoFrameDesc; + + VideoFrameDesc videoFrameDesc; + videoFrameDesc.setWidth ( _codecContext->width ); + videoFrameDesc.setHeight( _codecContext->height ); + videoFrameDesc.setDar( _codecContext->width, _codecContext->height ); + Pixel pixel( _codecContext->pix_fmt ); + videoFrameDesc.setPixel( pixel ); - VideoFrameDesc.setWidth ( _codecContext->width ); - VideoFrameDesc.setHeight( _codecContext->height ); - VideoFrameDesc.setPixel ( pixel ); - VideoFrameDesc.setDar ( _codecContext->height, _codecContext->width ); - return VideoFrameDesc; + return videoFrameDesc; } std::pair< size_t, size_t > VideoCodec::getTimeBase() const diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index 3f143b7f..1e6c15e0 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -17,7 +17,6 @@ AvInputStream::AvInputStream( InputFile& inputFile, const size_t streamIndex ) : IInputStream( ) , _inputFile( &inputFile ) , _codec( NULL ) - , _packetDuration( 0 ) , _streamIndex( streamIndex ) , _bufferized( false ) { @@ -98,7 +97,6 @@ void AvInputStream::addPacket( AVPacket& packet ) //std::cout << "add packet for stream " << _streamIndex << std::endl; CodedData data; _streamCache.push_back( data ); - _packetDuration = packet.duration; if( ! _bufferized ) return; @@ -166,11 +164,6 @@ double AvInputStream::getDuration() const return 1.0 * _inputFile->getFormatContext().duration / AV_TIME_BASE; } -double AvInputStream::getPacketDuration() const -{ - return _packetDuration * av_q2d( _inputFile->getFormatContext().streams[_streamIndex]->time_base ); -} - void AvInputStream::clearBuffering() { _streamCache.clear(); diff --git a/src/AvTranscoder/codedStream/AvInputStream.hpp b/src/AvTranscoder/codedStream/AvInputStream.hpp index e13ebbdf..a34ce6d8 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.hpp +++ b/src/AvTranscoder/codedStream/AvInputStream.hpp @@ -30,7 +30,6 @@ class AvExport AvInputStream : public IInputStream AVMediaType getStreamType() const; double getDuration() const; - double getPacketDuration() const; void addPacket( AVPacket& packet ); @@ -43,14 +42,13 @@ class AvExport AvInputStream : public IInputStream AVStream* getAVStream() const; private: - InputFile* _inputFile; - std::vector _streamCache; - + InputFile* _inputFile; ///< Has link (no ownership) ICodec* _codec; ///< Has ownership - int _packetDuration; - size_t _streamIndex; - bool _bufferized; + std::vector _streamCache; + + size_t _streamIndex; ///< Index of the stream in the input file + bool _bufferized; ///< If the stream is bufferized }; } diff --git a/src/AvTranscoder/codedStream/AvOutputStream.hpp b/src/AvTranscoder/codedStream/AvOutputStream.hpp index 499c50ba..7d717131 100644 --- a/src/AvTranscoder/codedStream/AvOutputStream.hpp +++ b/src/AvTranscoder/codedStream/AvOutputStream.hpp @@ -18,9 +18,9 @@ class AvExport AvOutputStream : public IOutputStream bool wrap( const CodedData& data ); private: - OutputFile* _outputFile; + OutputFile* _outputFile; ///< Has link (no ownership) - size_t _streamIndex; + size_t _streamIndex; ///< Index of the stream in the output file }; } diff --git a/src/AvTranscoder/codedStream/IInputStream.hpp b/src/AvTranscoder/codedStream/IInputStream.hpp index 1557b0e7..4f9ae9a1 100644 --- a/src/AvTranscoder/codedStream/IInputStream.hpp +++ b/src/AvTranscoder/codedStream/IInputStream.hpp @@ -26,7 +26,6 @@ class IInputStream virtual AVMediaType getStreamType() const = 0; virtual double getDuration() const = 0; - virtual double getPacketDuration() const = 0; virtual void setBufferred( const bool bufferized ) = 0; diff --git a/src/AvTranscoder/essenceStream/AvInputAudio.cpp b/src/AvTranscoder/essenceStream/AvInputAudio.cpp index 0187f20e..e369d88d 100644 --- a/src/AvTranscoder/essenceStream/AvInputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvInputAudio.cpp @@ -20,9 +20,9 @@ namespace avtranscoder AvInputAudio::AvInputAudio( AvInputStream& inputStream ) : IInputEssence() , _inputStream ( &inputStream ) - , _codec( eCodecTypeDecoder, inputStream.getAudioCodec().getCodecId() ) + , _codec( &inputStream.getAudioCodec() ) , _frame ( NULL ) - , _selectedStream( -1 ) + , _selectedStream( inputStream.getStreamIndex() ) { } @@ -46,10 +46,10 @@ AvInputAudio::~AvInputAudio() void AvInputAudio::setup() { - AVCodecContext* avCodecContext = _codec.getAVCodecContext(); - AVCodec* avCodec = _codec.getAVCodec(); + AVCodecContext* avCodecContext = _codec->getAVCodecContext(); + AVCodec* avCodec = _codec->getAVCodec(); - avCodecContext->channels = _inputStream->getAudioCodec().getChannels(); + avCodecContext->channels = _inputStream->getAudioCodec().getAudioFrameDesc().getChannels(); int ret = avcodec_open2( avCodecContext, avCodec, NULL ); @@ -82,10 +82,10 @@ void AvInputAudio::setup() bool AvInputAudio::readNextFrame( Frame& frameBuffer ) { - if( ! getNextFrame() ) + if( ! decodeNextFrame() ) return false; - AVCodecContext* avCodecContext = _codec.getAVCodecContext(); + AVCodecContext* avCodecContext = _codec->getAVCodecContext(); size_t decodedSize = av_samples_get_buffer_size( NULL, avCodecContext->channels, @@ -116,14 +116,14 @@ bool AvInputAudio::readNextFrame( Frame& frameBuffer ) bool AvInputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ) { - if( ! getNextFrame() ) + if( ! decodeNextFrame() ) return false; const int output_nbChannels = 1; const int output_align = 1; - size_t decodedSize = av_samples_get_buffer_size(NULL, output_nbChannels, _frame->nb_samples, _codec.getAVCodecContext()->sample_fmt, output_align); + size_t decodedSize = av_samples_get_buffer_size(NULL, output_nbChannels, _frame->nb_samples, _codec->getAVCodecContext()->sample_fmt, output_align); - size_t nbSubStreams = _codec.getAVCodecContext()->channels; + size_t nbSubStreams = _codec->getAVCodecContext()->channels; size_t bytePerSample = av_get_bytes_per_sample( (AVSampleFormat)_frame->format ); if( subStreamIndex > nbSubStreams - 1 ) @@ -156,7 +156,7 @@ bool AvInputAudio::readNextFrame( Frame& frameBuffer, const size_t subStreamInde return true; } -bool AvInputAudio::getNextFrame() +bool AvInputAudio::decodeNextFrame() { int got_frame = 0; while( ! got_frame ) @@ -172,7 +172,7 @@ bool AvInputAudio::getNextFrame() packet.data = data.getPtr(); packet.size = data.getSize(); - int ret = avcodec_decode_audio4( _codec.getAVCodecContext(), _frame, &got_frame, &packet ); + int ret = avcodec_decode_audio4( _codec->getAVCodecContext(), _frame, &got_frame, &packet ); if( ret < 0 ) { diff --git a/src/AvTranscoder/essenceStream/AvInputAudio.hpp b/src/AvTranscoder/essenceStream/AvInputAudio.hpp index 394fbf0d..26b0fc9c 100644 --- a/src/AvTranscoder/essenceStream/AvInputAudio.hpp +++ b/src/AvTranscoder/essenceStream/AvInputAudio.hpp @@ -23,13 +23,13 @@ class AvExport AvInputAudio : public IInputEssence bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ); private: - bool getNextFrame(); + bool decodeNextFrame(); - AvInputStream* _inputStream; - AudioCodec _codec; - AVFrame* _frame; + AvInputStream* _inputStream; ///< Stream from which we read next frames + const AudioCodec* _codec; ///< Audio decoder. Has link (no ownership) + AVFrame* _frame; ///< Libav object to store decoded data - int _selectedStream; + int _selectedStream; ///< Index of the selected stream in the input file }; } diff --git a/src/AvTranscoder/essenceStream/AvInputVideo.cpp b/src/AvTranscoder/essenceStream/AvInputVideo.cpp index 3f39849e..47ac316e 100644 --- a/src/AvTranscoder/essenceStream/AvInputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvInputVideo.cpp @@ -20,9 +20,9 @@ namespace avtranscoder AvInputVideo::AvInputVideo( AvInputStream& inputStream ) : IInputEssence() , _inputStream ( &inputStream ) - , _codec( eCodecTypeDecoder, inputStream.getVideoCodec().getCodecId() ) + , _codec( &inputStream.getVideoCodec() ) , _frame ( NULL ) - , _selectedStream( -1 ) + , _selectedStream( inputStream.getStreamIndex() ) { } @@ -45,8 +45,8 @@ AvInputVideo::~AvInputVideo() void AvInputVideo::setup() { - AVCodecContext* avCodecContext = _codec.getAVCodecContext(); - AVCodec* avCodec = _codec.getAVCodec(); + AVCodecContext* avCodecContext = _codec->getAVCodecContext(); + AVCodec* avCodec = _codec->getAVCodec(); // if( avCodec->capabilities & CODEC_CAP_TRUNCATED ) // avCodecContext->flags |= CODEC_FLAG_TRUNCATED; @@ -77,12 +77,36 @@ void AvInputVideo::setup() bool AvInputVideo::readNextFrame( Frame& frameBuffer ) { - int got_frame = 0; + if( ! decodeNextFrame() ) + return false; + + VideoFrame& imageBuffer = static_cast( frameBuffer ); + + size_t decodedSize = avpicture_get_size( (AVPixelFormat)_frame->format, _frame->width, _frame->height ); + if( ! decodedSize ) + return false; + + if( imageBuffer.getBuffer().size() != decodedSize ) + imageBuffer.getBuffer().resize( decodedSize ); + + // Copy pixel data from an AVPicture into one contiguous buffer. + avpicture_layout( (AVPicture*)_frame, (AVPixelFormat)_frame->format, _frame->width, _frame->height, &imageBuffer.getBuffer()[0], frameBuffer.getBuffer().size() ); + + return true; +} + +bool AvInputVideo::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ) +{ + return false; +} +bool AvInputVideo::decodeNextFrame() +{ + int got_frame = 0; while( ! got_frame ) { CodedData data; - if( ! _inputStream->readNextPacket( data ) ) + if( ! _inputStream->readNextPacket( data ) ) // error or end of file return false; AVPacket packet; @@ -92,7 +116,7 @@ bool AvInputVideo::readNextFrame( Frame& frameBuffer ) packet.data = data.getPtr(); packet.size = data.getSize(); - int ret = avcodec_decode_video2( _codec.getAVCodecContext(), _frame, &got_frame, &packet ); + int ret = avcodec_decode_video2( _codec->getAVCodecContext(), _frame, &got_frame, &packet ); if( ret < 0 ) { @@ -104,32 +128,17 @@ bool AvInputVideo::readNextFrame( Frame& frameBuffer ) av_free_packet( &packet ); } - - VideoFrame& imageBuffer = static_cast( frameBuffer ); - - size_t decodedSize = avpicture_get_size( (AVPixelFormat)_frame->format, _frame->width, _frame->height ); - if( imageBuffer.getBuffer().size() != decodedSize ) - imageBuffer.getBuffer().resize( decodedSize ); - - // Copy pixel data from an AVPicture into one contiguous buffer. - avpicture_layout( (AVPicture*)_frame, (AVPixelFormat)_frame->format, _frame->width, _frame->height, &imageBuffer.getBuffer()[0], frameBuffer.getBuffer().size() ); - return true; } -bool AvInputVideo::readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ) -{ - return false; -} - void AvInputVideo::flushDecoder() { - avcodec_flush_buffers( _codec.getAVCodecContext() ); + avcodec_flush_buffers( _codec->getAVCodecContext() ); } void AvInputVideo::setProfile( const ProfileLoader::Profile& profile ) { - Context codecContext( _codec.getAVCodecContext() ); + Context codecContext( _codec->getAVCodecContext() ); for( ProfileLoader::Profile::const_iterator it = profile.begin(); it != profile.end(); ++it ) { diff --git a/src/AvTranscoder/essenceStream/AvInputVideo.hpp b/src/AvTranscoder/essenceStream/AvInputVideo.hpp index 91fd66bb..8089723f 100644 --- a/src/AvTranscoder/essenceStream/AvInputVideo.hpp +++ b/src/AvTranscoder/essenceStream/AvInputVideo.hpp @@ -28,11 +28,13 @@ class AvExport AvInputVideo : public IInputEssence void setProfile( const ProfileLoader::Profile& profile ); private: - AvInputStream* _inputStream; - VideoCodec _codec; - AVFrame* _frame; + bool decodeNextFrame(); - int _selectedStream; + AvInputStream* _inputStream; ///< Stream from which we read next frames + const VideoCodec* _codec; ///< Video decoder. Has link (no ownership) + AVFrame* _frame; ///< Libav object to store decoded data + + int _selectedStream; ///< Index of the selected stream in the input file }; } diff --git a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp index 128e3e22..fe082379 100644 --- a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp @@ -103,25 +103,7 @@ bool AvOutputVideo::encodeFrame( const Frame& sourceFrame, Frame& codedFrame ) memcpy( codedFrame.getPtr(), packet.data, packet.size ); } #endif -/* - std::string imgType = ""; - switch( codecContext->coded_frame->pict_type ) - { - case AV_PICTURE_TYPE_NONE : imgType = "None"; break; - case AV_PICTURE_TYPE_I : imgType = "I"; break; - case AV_PICTURE_TYPE_P : imgType = "P"; break; - case AV_PICTURE_TYPE_B : imgType = "B"; break; - case AV_PICTURE_TYPE_S : imgType = "S"; break; - case AV_PICTURE_TYPE_SI : imgType = "SI"; break; - case AV_PICTURE_TYPE_SP : imgType = "SP"; break; - case AV_PICTURE_TYPE_BI : imgType = "BI"; break; - } - std::clog << "\tframe " << codecContext->coded_frame->display_picture_number; - std::clog << " coded @ " << codecContext->coded_frame->coded_picture_number; - std::clog << " type : " << imgType; - std::clog << " quality : " << codecContext->coded_frame->quality << std::endl; -*/ av_free_packet( &packet ); #if LIBAVCODEC_VERSION_MAJOR > 54 av_frame_free( &frame ); diff --git a/src/AvTranscoder/essenceStream/GeneratorAudio.cpp b/src/AvTranscoder/essenceStream/GeneratorAudio.cpp index bd13ef4d..e2a6be2b 100644 --- a/src/AvTranscoder/essenceStream/GeneratorAudio.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorAudio.cpp @@ -5,25 +5,15 @@ namespace avtranscoder GeneratorAudio::GeneratorAudio( ) : IInputEssence( ) - , _codec( NULL ) , _inputFrame( NULL ) , _frameDesc() { } -void GeneratorAudio::setAudioCodec( const AudioCodec& codec ) +void GeneratorAudio::setAudioFrameDesc( const AudioFrameDesc& frameDesc ) { - _frameDesc.setFps ( 25.0 ); - _codec = &codec; - - _frameDesc.setSampleRate( _codec->getAVCodecContext()->sample_rate ); - _frameDesc.setChannels( _codec->getAVCodecContext()->channels ); - _frameDesc.setSampleFormat( _codec->getAVCodecContext()->sample_fmt ); -} - -const AudioCodec& GeneratorAudio::getAudioCodec() -{ - return *_codec; + _frameDesc = frameDesc; + _frameDesc.setFps( 25. ); } void GeneratorAudio::setFrame( Frame& inputFrame ) diff --git a/src/AvTranscoder/essenceStream/GeneratorAudio.hpp b/src/AvTranscoder/essenceStream/GeneratorAudio.hpp index 0c8e80d1..2f14c946 100644 --- a/src/AvTranscoder/essenceStream/GeneratorAudio.hpp +++ b/src/AvTranscoder/essenceStream/GeneratorAudio.hpp @@ -12,9 +12,8 @@ class AvExport GeneratorAudio : public IInputEssence public: GeneratorAudio( ); - void setAudioCodec( const AudioCodec& codec ); - - const AudioCodec& getAudioCodec(); + AudioFrameDesc& getAudioFrameDesc() { return _frameDesc; } + void setAudioFrameDesc( const AudioFrameDesc& frameDesc ); void setup() {} @@ -24,8 +23,7 @@ class AvExport GeneratorAudio : public IInputEssence bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ); private: - const AudioCodec* _codec; - Frame* _inputFrame; + Frame* _inputFrame; ///< Has link (no ownership) AudioFrameDesc _frameDesc; }; diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp index e1a37861..30e8ed3e 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp @@ -7,22 +7,14 @@ namespace avtranscoder GeneratorVideo::GeneratorVideo( ) : IInputEssence( ) - , _codec( NULL ) , _inputFrame( NULL ) - , _videoFrameDesc() - , _numberOfView( 1 ) + , _frameDesc() { } -void GeneratorVideo::setVideoCodec( const VideoCodec& codec ) +void GeneratorVideo::setVideoFrameDesc( const VideoFrameDesc& frameDesc ) { - _codec = &codec; - _videoFrameDesc = _codec->getVideoFrameDesc(); -} - -const VideoCodec& GeneratorVideo::getVideoCodec() -{ - return *_codec; + _frameDesc = frameDesc; } void GeneratorVideo::setFrame( Frame& inputFrame ) @@ -32,30 +24,32 @@ void GeneratorVideo::setFrame( Frame& inputFrame ) bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) { + // Generate black image if( ! _inputFrame ) { // @todo support PAL (0 to 255) and NTFS (16 to 235) int fillChar = 0; - if( frameBuffer.getSize() != _videoFrameDesc.getDataSize() ) - frameBuffer.getBuffer().resize( _videoFrameDesc.getDataSize() ); + if( frameBuffer.getSize() != _frameDesc.getDataSize() ) + frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); - VideoFrameDesc desc( _codec->getVideoFrameDesc() ); + VideoFrameDesc desc( _frameDesc ); Pixel rgbPixel; rgbPixel.setColorComponents( eComponentRgb ); rgbPixel.setPlanar( false ); desc.setPixel( rgbPixel ); VideoFrame intermediateBuffer( desc ); - intermediateBuffer.getBuffer().resize( _videoFrameDesc.getDataSize() ); - memset( intermediateBuffer.getPtr(), fillChar, _videoFrameDesc.getDataSize() ); + intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() ); + memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() ); VideoTransform videoEssenceTransform; videoEssenceTransform.convert( intermediateBuffer, frameBuffer ); return true; } - + + // Take image from _inputFrame if( frameBuffer.getSize() != _inputFrame->getSize() ) frameBuffer.getBuffer().resize( _inputFrame->getSize() ); std::memcpy( frameBuffer.getPtr(), _inputFrame->getPtr(), _inputFrame->getSize() ); diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.hpp b/src/AvTranscoder/essenceStream/GeneratorVideo.hpp index 54a206ab..f32513bf 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.hpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.hpp @@ -12,10 +12,8 @@ class AvExport GeneratorVideo : public IInputEssence public: GeneratorVideo( ); - // Stream properties - void setVideoCodec( const VideoCodec& codec ); - - const VideoCodec& getVideoCodec(); + VideoFrameDesc& getVideoFrameDesc() { return _frameDesc; } + void setVideoFrameDesc( const VideoFrameDesc& frameDesc ); void setup() {} @@ -25,11 +23,8 @@ class AvExport GeneratorVideo : public IInputEssence bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ); private: - const VideoCodec* _codec; - Frame* _inputFrame; - VideoFrameDesc _videoFrameDesc; - - size_t _numberOfView; + Frame* _inputFrame; ///< Has link (no ownership) + VideoFrameDesc _frameDesc; }; } diff --git a/src/AvTranscoder/essenceStream/IInputEssence.hpp b/src/AvTranscoder/essenceStream/IInputEssence.hpp index 33f7968a..8e232dc0 100644 --- a/src/AvTranscoder/essenceStream/IInputEssence.hpp +++ b/src/AvTranscoder/essenceStream/IInputEssence.hpp @@ -31,6 +31,13 @@ class AvExport IInputEssence * @return status of decoding */ virtual bool readNextFrame( Frame& frameBuffer, const size_t subStreamIndex ) = 0; + + /** + * Set the next frame of the input stream + * @note Not yet implemented for AvInputVideo and AvInputAudio + * @param inputFrame: the new next frame + */ + virtual void setFrame( Frame& inputFrame ) {} }; } diff --git a/src/AvTranscoder/frame/VideoFrame.hpp b/src/AvTranscoder/frame/VideoFrame.hpp index 169dc3ee..4423d41f 100644 --- a/src/AvTranscoder/frame/VideoFrame.hpp +++ b/src/AvTranscoder/frame/VideoFrame.hpp @@ -40,7 +40,7 @@ class AvExport VideoFrameDesc void setWidth ( const size_t width ) { _width = width; } void setHeight( const size_t height ) { _height = height; } - void setPixel ( const Pixel pixel ) { _pixel = pixel; } + void setPixel( const Pixel& pixel ) { _pixel = pixel; } void setDar( const size_t num, const size_t den ) { _displayAspectRatio.num = num; _displayAspectRatio.den = den; } void setDar( const Rational ratio ) { _displayAspectRatio = ratio; } diff --git a/src/AvTranscoder/option/Context.hpp b/src/AvTranscoder/option/Context.hpp index b804943c..b7e43e8d 100644 --- a/src/AvTranscoder/option/Context.hpp +++ b/src/AvTranscoder/option/Context.hpp @@ -11,6 +11,9 @@ namespace avtranscoder { +typedef std::vector