diff --git a/app/avTranscoder/avTranscoder.cpp b/app/avTranscoder/avTranscoder.cpp index 7c50f23e..32bc0d5e 100644 --- a/app/avTranscoder/avTranscoder.cpp +++ b/app/avTranscoder/avTranscoder.cpp @@ -64,7 +64,7 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename ) videoDesc.setTimeBase( 1, 25 ); // 25 fps - videoDesc.setImageParameters( sourceImage ); + videoDesc.setImageParameters( sourceImage.desc() ); //videoDesc.initCodecContext(); diff --git a/app/avplay/AvReader.hpp b/app/avplay/AvReader.hpp index ee3facbc..7dc2a398 100644 --- a/app/avplay/AvReader.hpp +++ b/app/avplay/AvReader.hpp @@ -16,7 +16,7 @@ class AvReader : public Reader { public: - AvReader( std::string filename ) + AvReader( const std::string& filename ) : m_inputFile( filename ) , m_inputStreamVideo( NULL ) , m_sourceImage( NULL ) @@ -38,11 +38,11 @@ class AvReader : public Reader pixel.setAlpha( false ); pixel.setPlanar( false ); - imageDescToDisplay.setWidth ( m_sourceImage->desc().getWidth() ); + imageDescToDisplay.setWidth( m_sourceImage->desc().getWidth() ); imageDescToDisplay.setHeight( m_sourceImage->desc().getHeight() ); - imageDescToDisplay.setDar ( m_sourceImage->desc().getDar() ); - - imageDescToDisplay.setPixel ( pixel.findPixel() ); + imageDescToDisplay.setDar( m_sourceImage->desc().getDar() ); + + imageDescToDisplay.setPixel( pixel.findPixel() ); m_imageToDisplay = new avtranscoder::Image( imageDescToDisplay ); } @@ -105,6 +105,7 @@ class AvReader : public Reader private: avtranscoder::InputFile m_inputFile; + avtranscoder::InputStreamVideo* m_inputStreamVideo; avtranscoder::Image* m_sourceImage; @@ -117,4 +118,4 @@ class AvReader : public Reader size_t m_videoStream; }; -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/AvInputStream.cpp b/src/AvTranscoder/AvInputStream.cpp index 1ee2c77a..b1ec7381 100644 --- a/src/AvTranscoder/AvInputStream.cpp +++ b/src/AvTranscoder/AvInputStream.cpp @@ -29,9 +29,9 @@ AvInputStream::AvInputStream( ) { } -AvInputStream::AvInputStream( InputFile* inputFile, const size_t streamIndex ) +AvInputStream::AvInputStream( InputFile& inputFile, const size_t streamIndex ) : InputStream( ) - , m_inputFile( inputFile ) + , m_inputFile( &inputFile ) , m_packetDuration( 0 ) , m_streamIndex( streamIndex ) , m_bufferized( false ) @@ -44,6 +44,9 @@ AvInputStream::~AvInputStream( ) bool AvInputStream::readNextPacket( DataStream& data ) { + if( ! m_bufferized ) + throw std::runtime_error( "Can't read packet on non-bufferized input stream." ); + if( m_streamCache.empty() ) m_inputFile->readNextPacket( m_streamIndex ); @@ -137,4 +140,4 @@ void AvInputStream::clearBuffering() m_streamCache.clear(); } -} \ No newline at end of file +} diff --git a/src/AvTranscoder/AvInputStream.hpp b/src/AvTranscoder/AvInputStream.hpp index 1411aaf3..d9cdcc44 100644 --- a/src/AvTranscoder/AvInputStream.hpp +++ b/src/AvTranscoder/AvInputStream.hpp @@ -13,7 +13,7 @@ class AvExport AvInputStream : public InputStream public: AvInputStream( ); - AvInputStream( InputFile* inputFile, const size_t streamIndex ); + AvInputStream( InputFile& inputFile, const size_t streamIndex ); ~AvInputStream( ); AvInputStream( const AvInputStream& inputStream ) diff --git a/src/AvTranscoder/DatasStructures/Image.hpp b/src/AvTranscoder/DatasStructures/Image.hpp index 0001cd49..43e2e512 100644 --- a/src/AvTranscoder/DatasStructures/Image.hpp +++ b/src/AvTranscoder/DatasStructures/Image.hpp @@ -24,8 +24,6 @@ extern "C" { namespace avtranscoder { -typedef std::vector< unsigned char > DataBuffer; - // struct ColorProperties // { // //EColorspace eColorspace; @@ -78,9 +76,14 @@ class AvExport ImageDesc bool m_topFieldFirst; }; +//template< template Alloc > +//class AvExport ImageBase class AvExport Image { public: +// typedef std::vector< unsigned char, Alloc > DataBuffer; + typedef std::vector< unsigned char> DataBuffer; + Image( const ImageDesc& ref ) : m_dataBuffer( ref.getDataSize(), 0 ) , m_imageDesc( ref ) @@ -99,6 +102,8 @@ class AvExport Image const ImageDesc m_imageDesc; }; +//typedef ImageBase Image; + } #endif diff --git a/src/AvTranscoder/DatasStructures/VideoDesc.cpp b/src/AvTranscoder/DatasStructures/VideoDesc.cpp index c9f24f67..785e321a 100644 --- a/src/AvTranscoder/DatasStructures/VideoDesc.cpp +++ b/src/AvTranscoder/DatasStructures/VideoDesc.cpp @@ -49,9 +49,9 @@ void VideoDesc::setVideoCodec( const AVCodecID codecId ) initCodecContext(); } -void VideoDesc::setImageParameters( const Image& image ) +void VideoDesc::setImageParameters( const ImageDesc& imageDesc ) { - setImageParameters( image.desc().getWidth(), image.desc().getHeight(), image.desc().getPixelDesc() ); + setImageParameters( imageDesc.getWidth(), imageDesc.getHeight(), imageDesc.getPixelDesc() ); } diff --git a/src/AvTranscoder/DatasStructures/VideoDesc.hpp b/src/AvTranscoder/DatasStructures/VideoDesc.hpp index 5fa9bdd6..be0515b6 100644 --- a/src/AvTranscoder/DatasStructures/VideoDesc.hpp +++ b/src/AvTranscoder/DatasStructures/VideoDesc.hpp @@ -30,7 +30,7 @@ class AvExport VideoDesc void setVideoCodec( const std::string& codecName ); void setVideoCodec( const AVCodecID codecId ); - void setImageParameters( const Image& image ); + void setImageParameters( const ImageDesc& imageDesc ); void setImageParameters( const size_t width, const size_t height, const Pixel& pixel ); void setImageParameters( const size_t width, const size_t height, const AVPixelFormat& pixel ); diff --git a/src/AvTranscoder/InputFile.cpp b/src/AvTranscoder/InputFile.cpp index 8da8a4cb..37cfc27a 100644 --- a/src/AvTranscoder/InputFile.cpp +++ b/src/AvTranscoder/InputFile.cpp @@ -49,7 +49,7 @@ InputFile::InputFile( const std::string& filename ) for( size_t streamIndex = 0; streamIndex < m_formatContext->nb_streams; ++streamIndex ) { - m_inputStreams.push_back( new AvInputStream( this, streamIndex ) ); + m_inputStreams.push_back( new AvInputStream( *this, streamIndex ) ); } } @@ -180,7 +180,7 @@ bool InputFile::readNextPacket( const size_t streamIndex ) void InputFile::seekAtFrame( const size_t frame ) { - uint64_t pos = frame / 25 * AV_TIME_BASE; + uint64_t pos = frame / 25 * AV_TIME_BASE; // WARNING: hardcoded fps if( (int)m_formatContext->start_time != AV_NOPTS_VALUE ) pos += m_formatContext->start_time; diff --git a/src/AvTranscoder/InputFile.hpp b/src/AvTranscoder/InputFile.hpp index 552474ab..d41eb56d 100644 --- a/src/AvTranscoder/InputFile.hpp +++ b/src/AvTranscoder/InputFile.hpp @@ -38,7 +38,7 @@ class AvExport InputFile AVMediaType getStreamType( size_t index ); - ::avtranscoder::AvInputStream& getStream( size_t index ); + AvInputStream& getStream( size_t index ); AVFormatContext& getFormatContext() const { return *m_formatContext; } @@ -46,6 +46,7 @@ class AvExport InputFile void seekAtFrame( const size_t frame ); + /// @brief Indicate that the stream should be bufferized void readStream( const size_t streamIndex, const bool readStream = true ); protected: diff --git a/src/AvTranscoder/InputStream.hpp b/src/AvTranscoder/InputStream.hpp index c8998ecc..ba220303 100644 --- a/src/AvTranscoder/InputStream.hpp +++ b/src/AvTranscoder/InputStream.hpp @@ -20,7 +20,7 @@ class InputStream virtual bool readNextPacket( DataStream& data ) = 0; - // Stream propeerties + // Stream properties virtual VideoDesc getVideoDesc() const = 0; virtual AudioDesc getAudioDesc() const = 0; @@ -30,8 +30,6 @@ class InputStream virtual void setBufferred( const bool bufferized ) = 0; virtual void clearBuffering() = 0; - -private: }; } diff --git a/src/AvTranscoder/InputStreamAudio.cpp b/src/AvTranscoder/InputStreamAudio.cpp index 3e27d4b5..e5228ad6 100644 --- a/src/AvTranscoder/InputStreamAudio.cpp +++ b/src/AvTranscoder/InputStreamAudio.cpp @@ -43,6 +43,8 @@ InputStreamAudio::InputStreamAudio( const InputStream& inputStream ) std::cout << "Audio codec Id : " << m_codecContext->codec_id << std::endl; std::cout << "Audio codec Id : " << m_codec->long_name << std::endl; + m_codecContext->channels = m_inputStream->getAudioDesc().getCodecContext()->channels; + int ret = avcodec_open2( m_codecContext, m_codec, NULL ); std::cout << "ret value : " << ret << std::endl; @@ -99,8 +101,7 @@ InputStreamAudio::~InputStreamAudio() bool InputStreamAudio::readNextFrame( AudioFrame& audioFrameBuffer ) { -/* - int got_frame = 0; + /*int got_frame = 0; while( ! got_frame ) { AVPacket packet; @@ -112,6 +113,10 @@ bool InputStreamAudio::readNextFrame( AudioFrame& audioFrameBuffer ) return false; } + packet.stream_index = m_selectedStream; + packet.data = audioFrameBuffer.getPtr(); + packet.size = audioFrameBuffer.getSize(); + int ret = avcodec_decode_audio4( m_codecContext, m_frame, &got_frame, &packet ); if( ret < 0 ) @@ -120,8 +125,8 @@ bool InputStreamAudio::readNextFrame( AudioFrame& audioFrameBuffer ) } av_free_packet( &packet ); - }*/ - + } +*/ //size_t unpadded_linesize = m_frame->nb_samples * av_get_bytes_per_sample( m_frame->format ); // size_t decodedSize = avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height ); diff --git a/src/AvTranscoder/InputStreamVideo.cpp b/src/AvTranscoder/InputStreamVideo.cpp index 96c1d49f..fdcd9aec 100644 --- a/src/AvTranscoder/InputStreamVideo.cpp +++ b/src/AvTranscoder/InputStreamVideo.cpp @@ -92,7 +92,6 @@ InputStreamVideo::~InputStreamVideo() bool InputStreamVideo::readNextFrame( Image& frameBuffer ) { - int got_frame = 0; while( ! got_frame ) diff --git a/src/AvTranscoder/InputStreamVideo.hpp b/src/AvTranscoder/InputStreamVideo.hpp index 0ff91aba..c83a2d4f 100644 --- a/src/AvTranscoder/InputStreamVideo.hpp +++ b/src/AvTranscoder/InputStreamVideo.hpp @@ -21,7 +21,7 @@ class AvExport InputStreamVideo public: InputStreamVideo( AvInputStream& inputStream ); ~InputStreamVideo(); - + bool readNextFrame( Image& frameBuffer ); void flushDecoder(); diff --git a/src/AvTranscoder/Transcoder.tcc b/src/AvTranscoder/Transcoder.tcc index b84ae0ee..631f80ad 100644 --- a/src/AvTranscoder/Transcoder.tcc +++ b/src/AvTranscoder/Transcoder.tcc @@ -1,3 +1,4 @@ + #include #include @@ -66,13 +67,13 @@ void Transcoder::add( const std::string& filename, const size_t streamIndex ) { case AVMEDIA_TYPE_VIDEO: { - _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); + _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); _outputFile.addVideoStream( _inputStreams.back()->getVideoDesc() ); break; } case AVMEDIA_TYPE_AUDIO: { - _inputStreams.push_back( &referenceFile->getStream( streamIndex ) ); + _inputStreams.push_back( & referenceFile->getStream( streamIndex ) ); _outputFile.addAudioStream( _inputStreams.back()->getAudioDesc() ); break; } diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index bcacb3e7..429e3a11 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -20,17 +20,18 @@ #include -#include -#include - #include #include #include #include +#include #include #include +#include +#include + #include %} @@ -59,15 +60,16 @@ namespace std { %include -%include -%include - %include %include %include %include +%include %include %include +%include +%include + %include