From 304a28bc707193cbaf00015a2a15913841583c4c Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 17:17:21 +0100 Subject: [PATCH 01/64] mediaProperty: refactore * Rename printMediaProperty.hpp to print.hpp * Rename StreamProperty.hpp to Properties.hpp --- app/avMeta/avMeta.cpp | 2 +- app/avplay/AvReader.hpp | 2 +- src/AvTranscoder/file/InputFile.cpp | 12 ++++++------ ...tStreamProperty.hpp => AttachementProperties.hpp} | 0 .../{AudioStreamProperty.hpp => AudioProperties.hpp} | 0 .../{DataStreamProperty.hpp => DataProperties.hpp} | 0 ...itleStreamProperty.hpp => SubtitleProperties.hpp} | 0 ...knownStreamProperty.hpp => UnknownProperties.hpp} | 0 .../{VideoStreamProperty.hpp => VideoProperties.hpp} | 0 .../{printMediaProperty.hpp => print.hpp} | 0 10 files changed, 8 insertions(+), 8 deletions(-) rename src/AvTranscoder/mediaProperty/{AttachementStreamProperty.hpp => AttachementProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{AudioStreamProperty.hpp => AudioProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{DataStreamProperty.hpp => DataProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{SubtitleStreamProperty.hpp => SubtitleProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{UnknownStreamProperty.hpp => UnknownProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{VideoStreamProperty.hpp => VideoProperties.hpp} (100%) rename src/AvTranscoder/mediaProperty/{printMediaProperty.hpp => print.hpp} (100%) diff --git a/app/avMeta/avMeta.cpp b/app/avMeta/avMeta.cpp index d74e4ae9..a65c3782 100644 --- a/app/avMeta/avMeta.cpp +++ b/app/avMeta/avMeta.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include diff --git a/app/avplay/AvReader.hpp b/app/avplay/AvReader.hpp index 5cda2c80..4dc7c1c0 100644 --- a/app/avplay/AvReader.hpp +++ b/app/avplay/AvReader.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 79c50753..07bc0c99 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -1,12 +1,12 @@ #include "InputFile.hpp" #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include extern "C" { diff --git a/src/AvTranscoder/mediaProperty/AttachementStreamProperty.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/AttachementStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/AttachementProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/AudioStreamProperty.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/AudioStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/AudioProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/DataStreamProperty.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/DataStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/DataProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/SubtitleStreamProperty.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/SubtitleStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/SubtitleProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/UnknownStreamProperty.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/UnknownStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/UnknownProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/VideoStreamProperty.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/VideoStreamProperty.hpp rename to src/AvTranscoder/mediaProperty/VideoProperties.hpp diff --git a/src/AvTranscoder/mediaProperty/printMediaProperty.hpp b/src/AvTranscoder/mediaProperty/print.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/printMediaProperty.hpp rename to src/AvTranscoder/mediaProperty/print.hpp From bfd52eb42cbfefafdb1321e78ce54465612c2476 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 17:49:47 +0100 Subject: [PATCH 02/64] mediaProperties: use wrapper classes instead of structs of copies * Add files Properties (cpp) --- app/avTranscoder/avTranscoder.cpp | 2 +- app/avplay/AvReader.hpp | 8 +- src/AvTranscoder/avTranscoder.i | 4 + src/AvTranscoder/file/InputFile.cpp | 49 +- src/AvTranscoder/file/InputFile.hpp | 10 +- .../mediaProperty/AttachementProperties.cpp | 30 + .../mediaProperty/AttachementProperties.hpp | 36 +- .../mediaProperty/AudioProperties.cpp | 134 +++++ .../mediaProperty/AudioProperties.hpp | 100 ++-- .../mediaProperty/DataProperties.cpp | 90 +++ .../mediaProperty/DataProperties.hpp | 84 +-- .../mediaProperty/FileProperties.cpp | 48 ++ .../mediaProperty/FileProperties.hpp | 81 +++ .../mediaProperty/SubtitleProperties.cpp | 30 + .../mediaProperty/SubtitleProperties.hpp | 35 +- .../mediaProperty/UnknownProperties.cpp | 30 + .../mediaProperty/UnknownProperties.hpp | 35 +- .../mediaProperty/VideoProperties.cpp | 517 ++++++++++++++++++ .../mediaProperty/VideoProperties.hpp | 434 ++++----------- .../mediaProperty/mediaProperty.cpp | 186 +------ .../mediaProperty/mediaProperty.hpp | 186 +------ src/AvTranscoder/mediaProperty/print.hpp | 28 +- src/AvTranscoder/transcoder/Transcoder.cpp | 8 +- 23 files changed, 1281 insertions(+), 884 deletions(-) create mode 100644 src/AvTranscoder/mediaProperty/AttachementProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/AudioProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/DataProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/FileProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/FileProperties.hpp create mode 100644 src/AvTranscoder/mediaProperty/SubtitleProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/UnknownProperties.cpp create mode 100644 src/AvTranscoder/mediaProperty/VideoProperties.cpp diff --git a/app/avTranscoder/avTranscoder.cpp b/app/avTranscoder/avTranscoder.cpp index 218a3ccd..e1001e58 100644 --- a/app/avTranscoder/avTranscoder.cpp +++ b/app/avTranscoder/avTranscoder.cpp @@ -28,7 +28,7 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename ) InputFile input( inputfilename ); input.analyse( p ); - input.readStream( input.getProperties().videoStreams.at( 0 ).streamId ); + input.readStream( input.getProperties().getVideoProperties().at( 0 ).getStreamId() ); // init video decoders AvInputVideo inputVideo( input.getStream( 0 ) ); diff --git a/app/avplay/AvReader.hpp b/app/avplay/AvReader.hpp index 4dc7c1c0..60fbd0cd 100644 --- a/app/avplay/AvReader.hpp +++ b/app/avplay/AvReader.hpp @@ -23,7 +23,7 @@ class AvReader : public Reader avtranscoder::ConsoleProgress p; _inputFile.analyse( p ); - _videoStream = _inputFile.getProperties().videoStreams.at(0).streamId; + _videoStream = _inputFile.getProperties().getVideoProperties().at(0).getStreamId(); _inputFile.readStream( _videoStream ); @@ -58,17 +58,17 @@ class AvReader : public Reader size_t getWidth() { - return _inputFile.getProperties().videoStreams.at(0).width; + return _inputFile.getProperties().getVideoProperties().at(0).getWidth(); }; size_t getHeight() { - return _inputFile.getProperties().videoStreams.at(0).height; + return _inputFile.getProperties().getVideoProperties().at(0).getHeight(); } size_t getComponents() { - return _inputFile.getProperties().videoStreams.at(0).componentsCount; + return _inputFile.getProperties().getVideoProperties().at(0).getComponentsCount(); } size_t getBitDepth() diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 5768f912..2e84c315 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -46,6 +47,8 @@ #include #include + +using namespace avtranscoder; %} namespace std { @@ -76,6 +79,7 @@ namespace std { %include %include +%include %include %include diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 07bc0c99..597ae938 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -1,6 +1,7 @@ #include "InputFile.hpp" #include +#include #include #include #include @@ -8,7 +9,6 @@ #include #include - extern "C" { #include #include @@ -24,7 +24,8 @@ namespace avtranscoder InputFile::InputFile( const std::string& filename ) : _formatContext ( NULL ) - , _filename ( filename ) + , _properties( NULL ) + , _filename( filename ) { av_register_all(); if( avformat_open_input( &_formatContext, _filename.c_str(), NULL, NULL ) < 0 ) @@ -42,6 +43,10 @@ InputFile::InputFile( const std::string& filename ) throw std::runtime_error( "unable to find stream informations" ); } + // Initialize FileProperties + _properties = FileProperties( _formatContext ); + + // Create streams for( size_t streamIndex = 0; streamIndex < _formatContext->nb_streams; ++streamIndex ) { _inputStreams.push_back( new AvInputStream( *this, streamIndex ) ); @@ -68,56 +73,38 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level ) seekAtFrame( 0 ); - _properties.filename = _formatContext->filename; - _properties.formatName = _formatContext->iformat->name; - _properties.formatLongName = _formatContext->iformat->long_name; - _properties.streamsCount = _formatContext->nb_streams; - _properties.programsCount = _formatContext->nb_programs; - _properties.startTime = 1.0 * (unsigned int)_formatContext->start_time / AV_TIME_BASE; - _properties.duration = 1.0 * _formatContext->duration / AV_TIME_BASE; - _properties.bitRate = _formatContext->bit_rate; - _properties.packetSize = _formatContext->packet_size; - - detail::fillMetadataDictionnary( _formatContext->metadata, _properties.metadatas ); - for( size_t streamId = 0; streamId < _formatContext->nb_streams; streamId++ ) { switch( _formatContext->streams[streamId]->codec->codec_type ) { case AVMEDIA_TYPE_VIDEO: { - _properties.videoStreams.push_back( videoStreamInfo( _formatContext, streamId, progress, level ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.videoStreams.back().metadatas ); + _properties.getVideoProperties().push_back( VideoProperties( _formatContext, streamId, progress ) ); break; } case AVMEDIA_TYPE_AUDIO: { - _properties.audioStreams.push_back( audioStreamInfo( _formatContext, streamId ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.audioStreams.back().metadatas ); + _properties.getAudioProperties().push_back( AudioProperties( _formatContext, streamId ) ); break; } case AVMEDIA_TYPE_DATA: { - _properties.dataStreams.push_back( dataStreamInfo( _formatContext, streamId ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.dataStreams.back().metadatas ); + _properties.getDataProperties().push_back( DataProperties( _formatContext, streamId ) ); break; } case AVMEDIA_TYPE_SUBTITLE: { - _properties.subtitleStreams.push_back( subtitleStreamInfo( _formatContext, streamId ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.subtitleStreams.back().metadatas ); + _properties.getSubtitleProperties().push_back( SubtitleProperties( _formatContext, streamId ) ); break; } case AVMEDIA_TYPE_ATTACHMENT: { - _properties.attachementStreams.push_back( attachementStreamInfo( _formatContext, streamId ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.attachementStreams.back().metadatas ); + _properties.getAttachementProperties().push_back( AttachementProperties( _formatContext, streamId ) ); break; } case AVMEDIA_TYPE_UNKNOWN: { - _properties.unknownStreams.push_back( unknownStreamInfo( _formatContext, streamId ) ); - detail::fillMetadataDictionnary( _formatContext->streams[streamId]->metadata, _properties.unknownStreams.back().metadatas ); + _properties.getUnknownPropertiesProperties().push_back( UnknownProperties( _formatContext, streamId ) ); break; } case AVMEDIA_TYPE_NB: @@ -132,13 +119,11 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level ) return *this; } -Properties InputFile::analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level ) +FileProperties InputFile::analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level ) { InputFile file( filename ); file.analyse( progress, level ); - Properties properties; - file.getProperties( properties ); - return properties; + return file.getProperties(); } AVMediaType InputFile::getStreamType( size_t index ) @@ -229,9 +214,9 @@ void InputFile::setProfile( const ProfileLoader::Profile& profile ) } catch( std::exception& e ) { - std::cout << "[InputFile] warning - can't set option " << (*it).first << " to " << (*it).second << ": " << e.what() << std::endl; + std::cout << "[InputFile] warning: " << e.what() << std::endl; } } } -} +} \ No newline at end of file diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index a0542a09..2c6c0ce8 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -8,7 +8,7 @@ #include -#include +#include #include @@ -57,9 +57,9 @@ class AvExport InputFile * @note require to launch analyse() before to fill the property struture * @return structure of media metadatas **/ - const Properties& getProperties() const { return _properties; } + const FileProperties& getProperties() const { return _properties; } - void getProperties( Properties& properties ) const { properties = _properties; } + void getProperties( FileProperties& properties ) const { properties = _properties; } /** * @brief Get media file properties using static method. @@ -67,7 +67,7 @@ class AvExport InputFile * @param progress callback to get analysis progression * @return structure of media metadatas **/ - static Properties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); + static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); /** * @brief Get stream type: video, audio, subtitle, etc. @@ -125,7 +125,7 @@ class AvExport InputFile protected: AVFormatContext* _formatContext; - Properties _properties; + FileProperties _properties; std::string _filename; std::vector _inputStreams; }; diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp new file mode 100644 index 00000000..24026639 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp @@ -0,0 +1,30 @@ +#include "AttachementProperties.hpp" + +namespace avtranscoder +{ + +AttachementProperties::AttachementProperties() + : _formatContext( NULL ) + , _streamId( 0 ) +{} + +AttachementProperties::AttachementProperties( const AVFormatContext* formatContext, const size_t index ) + : _formatContext( formatContext ) + , _streamId( index ) +{} + +MetadatasMap AttachementProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "streamId", _streamId ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index 93de0ae5..f622dfef 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -1,18 +1,36 @@ -#ifndef _AV_TRANSCODER_ATTACHEMENT_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_ATTACHEMENT_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP -class AVFormatContext; +#include +#include + +extern "C" { +#include +} namespace avtranscoder { -AttachementProperties attachementStreamInfo( const AVFormatContext* formatContext, const size_t index ) +class AvExport AttachementProperties { - AttachementProperties ap; - ap.streamId = index; - return ap; -} +public: + AttachementProperties(); + AttachementProperties( const AVFormatContext* formatContext, const size_t index ); + + size_t getStreamId() const { return _streamId; } + MetadatasMap& getMetadatas() { return _metadatas; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + + MetadatasMap getDataMap() const; + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + + size_t _streamId; + MetadatasMap _metadatas; +}; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp new file mode 100644 index 00000000..233f6ea8 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -0,0 +1,134 @@ +#include "AudioProperties.hpp" + +extern "C" { +#include +#include +#include +#include +#include +} + +namespace avtranscoder +{ + +AudioProperties::AudioProperties() + : _formatContext( NULL ) + , _codecContext( NULL ) + , _streamId( 0 ) +{} + +AudioProperties::AudioProperties( const AVFormatContext* formatContext, const size_t index ) + : _formatContext( formatContext ) + , _codecContext( formatContext->streams[index]->codec ) + , _streamId( index ) +{} + +std::string AudioProperties::getCodecName() const +{ + AVCodec* codec = avcodec_find_decoder( _codecContext->codec_id ); + if( codec != NULL ) + return std::string( codec->name ); + else + return "unknown codec"; +} + +std::string AudioProperties::getCodecLongName() const +{ + AVCodec* codec = avcodec_find_decoder( _codecContext->codec_id ); + if( codec != NULL ) + return std::string( codec->long_name ); + return "unknown codec"; +} + +std::string AudioProperties::getSampleFormatName() const +{ + const char* fmtName = av_get_sample_fmt_name( _codecContext->sample_fmt ); + if( fmtName ) + return std::string( fmtName ); + return "unknown sample format"; +} + +std::string AudioProperties::getSampleFormatLongName() const +{ + switch( _codecContext->sample_fmt ) + { + case AV_SAMPLE_FMT_NONE: + return "none"; + case AV_SAMPLE_FMT_U8: + return "unsigned 8 bits"; + case AV_SAMPLE_FMT_S16: + return "signed 16 bits"; + case AV_SAMPLE_FMT_S32: + return "signed 32 bits"; + case AV_SAMPLE_FMT_FLT: + return "float"; + case AV_SAMPLE_FMT_DBL: + return "double"; + case AV_SAMPLE_FMT_U8P: + return "unsigned 8 bits, planar"; + case AV_SAMPLE_FMT_S16P: + return "signed 16 bits, planar"; + case AV_SAMPLE_FMT_S32P: + return "signed 32 bits, planar"; + case AV_SAMPLE_FMT_FLTP: + return "float, planar"; + case AV_SAMPLE_FMT_DBLP: + return "double, planar"; + case AV_SAMPLE_FMT_NB: + return "Number of sample formats."; + } + return "unknown sample format"; +} + +std::string AudioProperties::getChannelLayout() const +{ + char buf1[1024]; + av_get_channel_layout_string( buf1, sizeof( buf1 ), -1, _codecContext->channel_layout ); + return std::string( buf1 ); +} + +std::string AudioProperties::getChannelName() const +{ + const char* channelName = av_get_channel_name( _codecContext->channel_layout ); + if( channelName ) + return std::string( channelName ); + return "unknown channel name"; +} + +std::string AudioProperties::getChannelDescription() const +{ +#ifdef FF_RESAMPLE_LIBRARY + const char* channelDescription = av_get_channel_description( _codecContext->channel_layout ); + if( channelDescription ) + return std::string( channelDescription ); + return "unknown channel description"; +#endif + return "can't access channel description"; +} + +MetadatasMap AudioProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "stream id", getStreamId() ); + detail::add( dataMap, "codec id", getCodecId() ); + detail::add( dataMap, "codec name", getCodecName() ); + detail::add( dataMap, "codec long name", getCodecLongName() ); + detail::add( dataMap, "sample format name", getSampleFormatName() ); + detail::add( dataMap, "sample format long name", getSampleFormatLongName() ); + detail::add( dataMap, "sample rate", getSampleRate() ); + detail::add( dataMap, "bit rate", getBitRate() ); + detail::add( dataMap, "channels", getChannels() ); + detail::add( dataMap, "channel layout", getChannelLayout() ); + detail::add( dataMap, "channel name", getChannelName() ); + detail::add( dataMap, "channel description", getChannelDescription() ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index 7b651cfa..bb440025 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -1,71 +1,53 @@ -#ifndef _AV_TRANSCODER_AUDIO_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_AUDIO_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP + +#include +#include extern "C" { -#include #include -#include -#include -#include +#include } +#include + +class AVFormatContext; + namespace avtranscoder { -avtranscoder::AudioProperties audioStreamInfo( const AVFormatContext* formatContext, const size_t index ) +class AvExport AudioProperties { - AudioProperties ap; - AVCodecContext* codec_context = formatContext->streams[index]->codec; - - ap.codecId = codec_context->codec_id; - ap.sampleRate = codec_context->sample_rate; - ap.channels = codec_context->channels; - ap.bit_rate = codec_context->bit_rate; - ap.streamId = index; - - AVCodec* codec = avcodec_find_decoder( codec_context->codec_id ); - if( codec != NULL ) - { - ap.codecName = codec->name; - ap.codecLongName = codec->long_name; - } - - char buf1[1024]; - av_get_channel_layout_string( buf1, sizeof( buf1 ), -1, codec_context->channel_layout ); - - ap.channelLayout = std::string( buf1 ); - - const char* channelName = av_get_channel_name( codec_context->channel_layout ); - if( channelName ) - ap.channelName = std::string( channelName ); -#ifdef FF_RESAMPLE_LIBRARY - const char* channelDescription = av_get_channel_description( codec_context->channel_layout ); - if( channelDescription ) - ap.channelDescription = std::string( channelDescription ); -#endif - const char* fmtName = av_get_sample_fmt_name( codec_context->sample_fmt ); - if( fmtName ) - ap.sampleFormatName = std::string( fmtName ); - - std::string sampleFormat = ""; - switch( codec_context->sample_fmt ) - { - case AV_SAMPLE_FMT_NONE : ap.sampleFormatLongName = "none"; break; - case AV_SAMPLE_FMT_U8 : ap.sampleFormatLongName = "unsigned 8 bits"; break; - case AV_SAMPLE_FMT_S16 : ap.sampleFormatLongName = "signed 16 bits"; break; - case AV_SAMPLE_FMT_S32 : ap.sampleFormatLongName = "signed 32 bits"; break; - case AV_SAMPLE_FMT_FLT : ap.sampleFormatLongName = "float"; break; - case AV_SAMPLE_FMT_DBL : ap.sampleFormatLongName = "double"; break; - case AV_SAMPLE_FMT_U8P : ap.sampleFormatLongName = "unsigned 8 bits, planar"; break; - case AV_SAMPLE_FMT_S16P : ap.sampleFormatLongName = "signed 16 bits, planar"; break; - case AV_SAMPLE_FMT_S32P : ap.sampleFormatLongName = "signed 32 bits, planar"; break; - case AV_SAMPLE_FMT_FLTP : ap.sampleFormatLongName = "float, planar"; break; - case AV_SAMPLE_FMT_DBLP : ap.sampleFormatLongName = "double, planar"; break; - case AV_SAMPLE_FMT_NB : ap.sampleFormatLongName = "Number of sample formats."; break; - } - - return ap; -} +public: + AudioProperties(); + AudioProperties( const AVFormatContext* formatContext, const size_t index ); + + std::string getCodecName() const; + std::string getCodecLongName() const; + std::string getSampleFormatName() const; + std::string getSampleFormatLongName() const; + std::string getChannelLayout() const; + std::string getChannelName() const; + std::string getChannelDescription() const; + size_t getStreamId() const { return _streamId; } + size_t getCodecId() const { return _codecContext->codec_id; } + size_t getSampleRate() const { return _codecContext->sample_rate; } + size_t getChannels() const { return _codecContext->channels; } + size_t getBitRate() const { return _codecContext->bit_rate; } + MetadatasMap& getMetadatas() { return _metadatas; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + AVCodecContext& getAVCodecContext() { return *_codecContext; } + + MetadatasMap getDataMap() const; + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + AVCodecContext* _codecContext; ///< Has link (no ownership) + + size_t _streamId; + MetadatasMap _metadatas; +}; } diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/mediaProperty/DataProperties.cpp new file mode 100644 index 00000000..7370501a --- /dev/null +++ b/src/AvTranscoder/mediaProperty/DataProperties.cpp @@ -0,0 +1,90 @@ +#include "DataProperties.hpp" + +extern "C" { +#include +#include +#include +} + +#include +#include + +namespace avtranscoder +{ + +DataProperties::DataProperties() + : _formatContext( NULL ) + , _streamId( 0 ) +{} + +DataProperties::DataProperties( const AVFormatContext* formatContext, const size_t index ) + : _formatContext( formatContext ) + , _streamId( index ) +{ + //detectAncillaryData( _formatContext, _streamId ); +} + +MetadatasMap DataProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "streamId", _streamId ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +void DataProperties::detectAncillaryData() +{ + AVPacket pkt; + av_init_packet( &pkt ); + + bool detection = false; + + while( ! av_read_frame( const_cast( _formatContext ), &pkt ) ) + { + if( pkt.stream_index == (int)_streamId ) + { + std::cout << "start detect packet" << std::endl; + size_t offset = 0; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; + + + unsigned short numberOfLines = (unsigned int) ( pkt.data[0] << 8 ) + pkt.data[1]; + + std::cout << "[data] number of lines " << numberOfLines << std::endl; + + detection = true; + } + + av_free_packet( &pkt ); + + if( detection ) + break; + } +} + +} diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index 6669ad99..eadaf1e9 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -1,81 +1,39 @@ -#ifndef _AV_TRANSCODER_DATA_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_DATA_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP + +#include +#include extern "C" { -#include #include -#include -#include } -#include - namespace avtranscoder { -void detectAncillaryData( AVFormatContext* formatContext, const int index ) +class AvExport DataProperties { - AVPacket pkt; - av_init_packet( &pkt ); - - bool detection = false; - - while( ! av_read_frame( formatContext, &pkt ) ) - { - if( pkt.stream_index == index ) - { - std::cout << "start detect packet" << std::endl; - size_t offset = 0; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - std::cout << offset << " - " << (int) pkt.data[ offset ] << " | " << std::bitset<8>( pkt.data[ offset ] ) << std::endl; offset++; - - - unsigned short numberOfLines = (unsigned int) ( pkt.data[0] << 8 ) + pkt.data[1]; +public: + DataProperties(); + DataProperties( const AVFormatContext* formatContext, const size_t index ); - std::cout << "[data] number of lines " << numberOfLines << std::endl; + size_t getStreamId() const { return _streamId; } + MetadatasMap& getMetadatas() { return _metadatas; } - detection = true; - } + const AVFormatContext& getAVFormatContext() { return *_formatContext; } - av_free_packet( &pkt ); + MetadatasMap getDataMap() const; - if( detection ) - break; - } -} - -DataProperties dataStreamInfo( AVFormatContext* formatContext, const size_t index ) -{ - DataProperties dp; - dp.streamId = index; +private: + void detectAncillaryData(); - // AVCodecContext* codec_context = formatContext->streams[index]->codec; - - // dp.codecId = codec_context->codec_id; +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) - //detectAncillaryData( formatContext, index ); - - return dp; -} + size_t _streamId; + MetadatasMap _metadatas; +}; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/mediaProperty/FileProperties.cpp new file mode 100644 index 00000000..23158ac1 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/FileProperties.cpp @@ -0,0 +1,48 @@ +#include "FileProperties.hpp" + +namespace avtranscoder +{ + +FileProperties::FileProperties( const AVFormatContext* formatContext ) + : _formatContext( formatContext ) + , _videoStreams() + , _audioStreams() + , _dataStreams() + , _subtitleStreams() + , _attachementStreams() + , _unknownStreams() +{ + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->metadata, _metadatas ); +} + + +MetadatasMap FileProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "filename", getFilename() ); + detail::add( dataMap, "format name", getFormatName() ); + detail::add( dataMap, "format long name", getFormatLongName() ); + + detail::add( dataMap, "start time", getStartTime() ); + detail::add( dataMap, "duration", getDuration() ); + detail::add( dataMap, "bitrate", getBitRate() ); + detail::add( dataMap, "number of streams", getNbStreams() ); + detail::add( dataMap, "number of programs", getProgramsCount() ); + detail::add( dataMap, "number of video streams", getNbVideoStreams() ); + detail::add( dataMap, "number of audio streams", getNbAudioStreams() ); + detail::add( dataMap, "number of data streams", getNbDataStreams() ); + detail::add( dataMap, "number of subtitle streams", getNbSubtitleStreams() ); + detail::add( dataMap, "number of attachement streams", getNbAttachementStreams() ); + detail::add( dataMap, "number of unknown streams", getNbUnknownStreams() ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp new file mode 100644 index 00000000..22e36ec5 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -0,0 +1,81 @@ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP + +#include +#include + +#include +#include +#include +#include +#include +#include + +extern "C" { +#include +} + +#include +#include + +namespace avtranscoder +{ + +class AvExport FileProperties +{ +public: + FileProperties( const AVFormatContext* formatContext ); + + std::string getFilename() const { return _formatContext->filename; } + std::string getFormatName() const { return _formatContext->iformat->name; } + std::string getFormatLongName() const { return _formatContext->iformat->long_name; } + + size_t getProgramsCount() const { return _formatContext->nb_programs; } + double getStartTime() const { return 1.0 * (unsigned int)_formatContext->start_time / AV_TIME_BASE; } + double getDuration() const { return 1.0 * _formatContext->duration / AV_TIME_BASE; } + size_t getBitRate() const { return _formatContext->bit_rate; } + size_t getPacketSize() const { return _formatContext->packet_size; } + + MetadatasMap& getMetadatas() { return _metadatas; } + + size_t getNbStreams() const { return _formatContext->nb_streams; } + size_t getNbVideoStreams() const { return _videoStreams.size(); } + size_t getNbAudioStreams() const { return _audioStreams.size(); } + size_t getNbDataStreams() const { return _dataStreams.size(); } + size_t getNbSubtitleStreams() const { return _subtitleStreams.size(); } + size_t getNbAttachementStreams() const { return _attachementStreams.size(); } + size_t getNbUnknownStreams() const { return _unknownStreams.size(); } + + std::vector< VideoProperties >& getVideoProperties() { return _videoStreams; } + const std::vector< VideoProperties >& getVideoProperties() const { return _videoStreams; } + std::vector< AudioProperties >& getAudioProperties() { return _audioStreams; } + const std::vector< AudioProperties >& getAudioProperties() const { return _audioStreams; } + std::vector< DataProperties >& getDataProperties() { return _dataStreams; } + const std::vector< DataProperties >& getDataProperties() const { return _dataStreams; } + std::vector< SubtitleProperties >& getSubtitleProperties() { return _subtitleStreams; } + const std::vector< SubtitleProperties >& getSubtitleProperties() const { return _subtitleStreams; } + std::vector< AttachementProperties >& getAttachementProperties() { return _attachementStreams; } + const std::vector< AttachementProperties >& getAttachementProperties() const { return _attachementStreams; } + std::vector< UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; } + const std::vector< UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + + MetadatasMap getDataMap() const; + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + + std::vector< VideoProperties > _videoStreams; ///< Array of properties per video stream + std::vector< AudioProperties > _audioStreams; ///< Array of properties per audio stream + std::vector< DataProperties > _dataStreams; ///< Array of properties per data stream + std::vector< SubtitleProperties > _subtitleStreams; ///< Array of properties per subtitle stream + std::vector< AttachementProperties > _attachementStreams; ///< Array of properties per attachement stream + std::vector< UnknownProperties > _unknownStreams; ///< Array of properties per unknown stream + + MetadatasMap _metadatas; +}; + +} + +#endif diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp new file mode 100644 index 00000000..fc9157e2 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp @@ -0,0 +1,30 @@ +#include "SubtitleProperties.hpp" + +namespace avtranscoder +{ + +SubtitleProperties::SubtitleProperties() + : _formatContext( NULL ) + , _streamId( 0 ) +{} + +SubtitleProperties::SubtitleProperties( const AVFormatContext* formatContext, const size_t index ) + : _formatContext( formatContext ) + , _streamId( index ) +{} + +MetadatasMap SubtitleProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "streamId", _streamId ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index 9253a319..7e806bd7 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -1,19 +1,36 @@ -#ifndef _AV_TRANSCODER_SUBTITLE_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_SUBTITLE_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_SUBTITLE_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_SUBTITLE_PROPERTIES_HPP -class AVFormatContext; +#include +#include + +extern "C" { +#include +} namespace avtranscoder { -SubtitleProperties subtitleStreamInfo( const AVFormatContext* formatContext, const size_t index ) +class AvExport SubtitleProperties { - SubtitleProperties sp; - sp.streamId = index; +public: + SubtitleProperties(); + SubtitleProperties( const AVFormatContext* formatContext, const size_t index ); - return sp; -} + size_t getStreamId() const { return _streamId; } + MetadatasMap& getMetadatas() { return _metadatas; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + + MetadatasMap getDataMap() const; + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + + size_t _streamId; + MetadatasMap _metadatas; +}; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp new file mode 100644 index 00000000..0d115d5f --- /dev/null +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp @@ -0,0 +1,30 @@ +#include "UnknownProperties.hpp" + +namespace avtranscoder +{ + +UnknownProperties::UnknownProperties() + : _formatContext( NULL ) + , _streamId( 0 ) +{} + +UnknownProperties::UnknownProperties( const AVFormatContext* formatContext, const size_t index ) + : _formatContext( formatContext ) + , _streamId( index ) +{} + +MetadatasMap UnknownProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "streamId", _streamId ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index 3d2b21e4..1efe55f6 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -1,19 +1,36 @@ -#ifndef _AV_TRANSCODER_UNKNOWN_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_UNKNOWN_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_UNKNOWN_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_UNKNOWN_PROPERTIES_HPP -class AVFormatContext; +#include +#include + +extern "C" { +#include +} namespace avtranscoder { -UnknownProperties unknownStreamInfo( const AVFormatContext* formatContext, const size_t index ) +class AvExport UnknownProperties { - UnknownProperties up; - up.streamId = index; +public: + UnknownProperties(); + UnknownProperties( const AVFormatContext* formatContext, const size_t index ); - return up; -} + size_t getStreamId() const { return _streamId; } + MetadatasMap& getMetadatas() { return _metadatas; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + + MetadatasMap getDataMap() const; + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + + size_t _streamId; + MetadatasMap _metadatas; +}; } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp new file mode 100644 index 00000000..e8323dfe --- /dev/null +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -0,0 +1,517 @@ +#include "VideoProperties.hpp" + +#include + +extern "C" { +#include +} + +#include +#include +#include + +#ifdef _MSC_VER +#include +#define isnan _isnan +#define isinf(x) (!_finite(x)) +#endif + +namespace avtranscoder +{ + +VideoProperties::VideoProperties() + : _formatContext( NULL ) + , _codecContext( NULL ) + , _pixFmt( NULL ) + , _streamId( 0 ) + , _isInterlaced( false ) + , _isTopFieldFirst( false ) + , _gopStructure() +{} + +VideoProperties::VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress ) + : _formatContext( formatContext ) + , _codecContext( formatContext->streams[index]->codec ) + , _pixFmt( NULL ) + , _streamId( index ) + , _isInterlaced( false ) + , _isTopFieldFirst( false ) + , _gopStructure() +{ + // Skip decoding for selected frames + _codecContext->skip_frame = AVDISCARD_NONE; + + // Get pixel format +#if LIBAVUTIL_VERSION_MAJOR > 51 + _pixFmt = av_pix_fmt_desc_get( _codecContext->pix_fmt ); +#else + _pixFmt = NULL; + if( _codecContext->pix_fmt >= 0 && _codecContext->pix_fmt < PIX_FMT_NB ) + _pixFmt = &av_pix_fmt_descriptors[ _codecContext->pix_fmt ]; +#endif + + // Analyse GOP + //if( level == eAnalyseLevelFull ) + analyseGopStructure( progress ); +} + +std::string VideoProperties::getCodecName() const +{ + AVCodec* codec = NULL; + if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + { + if( codec->capabilities & CODEC_CAP_TRUNCATED ) + _codecContext->flags|= CODEC_FLAG_TRUNCATED; + + return std::string( codec->name ); + } + return "unknown codec"; +} + +std::string VideoProperties::getCodecLongName() const +{ + AVCodec* codec = NULL; + if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + { + if( codec->capabilities & CODEC_CAP_TRUNCATED ) + _codecContext->flags|= CODEC_FLAG_TRUNCATED; + + return std::string( codec->long_name ); + } + return "unknown codec"; +} + +std::string VideoProperties::getProfileName() const +{ + AVCodec* codec = NULL; + if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + { + if( codec->capabilities & CODEC_CAP_TRUNCATED ) + _codecContext->flags|= CODEC_FLAG_TRUNCATED; + + if( _codecContext->profile != -99 ) + { + const char* profile; + if( ( profile = av_get_profile_name( codec, _codecContext->profile ) ) != NULL ) + return std::string( profile ); + } + } + return "unknown profile"; +} + +std::string VideoProperties::getColorTransfert() const +{ + switch( _codecContext->color_trc ) + { + case AVCOL_TRC_BT709: + return "Rec 709 / ITU-R BT1361"; + case AVCOL_TRC_UNSPECIFIED: + return "unspecified"; + case AVCOL_TRC_GAMMA22: + return "Gamma 2.2"; + case AVCOL_TRC_GAMMA28: + return "Gamma 2.8"; +#if LIBAVCODEC_VERSION_MAJOR > 53 + case AVCOL_TRC_SMPTE240M: + return "Smpte 240M"; +#endif +#if LIBAVCODEC_VERSION_MAJOR > 54 +#ifdef AVCOL_TRC_SMPTE170M + case AVCOL_TRC_SMPTE170M: + return "Rec 601 / ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC"; +#endif +#ifdef AVCOL_TRC_LINEAR + case AVCOL_TRC_LINEAR: + return "Linear transfer characteristics"; +#endif +#ifdef AVCOL_TRC_LOG + case AVCOL_TRC_LOG: + return "Logarithmic transfer characteristic (100:1 range)"; +#endif +#ifdef AVCOL_TRC_LOG_SQRT + case AVCOL_TRC_LOG_SQRT: + return "Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range)"; +#endif +#ifdef AVCOL_TRC_IEC61966_2_4 + case AVCOL_TRC_IEC61966_2_4: + return "IEC 61966-2-4"; +#endif +#ifdef AVCOL_TRC_BT1361_ECG + case AVCOL_TRC_BT1361_ECG: + return "ITU-R BT1361 Extended Colour Gamut"; +#endif +#ifdef AVCOL_TRC_IEC61966_2_1 + case AVCOL_TRC_IEC61966_2_1: + return "IEC 61966-2-1 (sRGB or sYCC)"; +#endif +#ifdef AVCOL_TRC_BT2020_10 + case AVCOL_TRC_BT2020_10: + return "ITU-R BT2020 for 10 bit system"; +#endif +#ifdef AVCOL_TRC_BT2020_12 + case AVCOL_TRC_BT2020_12: + return "ITU-R BT2020 for 12 bit system"; +#endif +#endif + case AVCOL_TRC_NB: + return "Not ABI"; + default: + return ""; + } +} + +std::string VideoProperties::getColorspace() const +{ + switch( _codecContext->colorspace ) + { + case AVCOL_SPC_RGB: + return "RGB"; + case AVCOL_SPC_BT709: + return "Rec 709"; + case AVCOL_SPC_UNSPECIFIED: + return "unspecified"; + case AVCOL_SPC_FCC: + return "Four CC"; + case AVCOL_SPC_BT470BG: + return "BT470 (PAL - 625)"; + case AVCOL_SPC_SMPTE170M: + return "Smpte 170M (NTSC)"; + case AVCOL_SPC_SMPTE240M: + return "Smpte 240M"; +#if LIBAVCODEC_VERSION_MAJOR > 53 + case AVCOL_SPC_YCOCG: + return "Y Co Cg"; +//#else +// case AVCOL_SPC_YCGCO: +// return "Y Cg Co"; +#endif +#if LIBAVCODEC_VERSION_MAJOR > 54 +#ifdef AVCOL_TRC_BT2020_12 + case AVCOL_SPC_BT2020_NCL: + return "ITU-R BT2020 non-constant luminance system"; +#endif +#ifdef AVCOL_TRC_BT2020_CL + case AVCOL_SPC_BT2020_CL: + return "ITU-R BT2020 constant luminance system"; +#endif +#endif + case AVCOL_SPC_NB: + return "Not ABI"; + default: + return ""; + } +} + +std::string VideoProperties::getColorRange() const +{ + switch( _codecContext->color_range ) + { + case AVCOL_RANGE_UNSPECIFIED: + return "unspecified"; + case AVCOL_RANGE_MPEG: + return "Head"; + case AVCOL_RANGE_JPEG: + return "Full"; + case AVCOL_RANGE_NB: + return "Not ABI"; + default: + return ""; + } +} + +std::string VideoProperties::getColorPrimaries() const +{ + switch( _codecContext->color_primaries ) + { + case AVCOL_PRI_BT709: + return "Rec 709"; + case AVCOL_PRI_UNSPECIFIED: + return "unspecified"; + case AVCOL_PRI_BT470M: + return "BT 470M"; + case AVCOL_PRI_BT470BG: + return "Rec 601 (PAL & SECAM)"; + case AVCOL_PRI_SMPTE170M: + return "Rec 601 (NTSC)"; + case AVCOL_PRI_SMPTE240M: + return "Smpte 240 (NTSC)"; + case AVCOL_PRI_FILM: + return "Film"; +#if LIBAVCODEC_VERSION_MAJOR > 54 +#ifdef AVCOL_TRC_BT2020_CL + case AVCOL_PRI_BT2020: + return "ITU-R BT2020"; +#endif +#endif + case AVCOL_PRI_NB: + return "Not ABI"; + default: + return ""; + } +} + +std::string VideoProperties::getChromaSampleLocation() const +{ + switch( _codecContext->chroma_sample_location ) + { + case AVCHROMA_LOC_UNSPECIFIED: + return "unspecified"; + case AVCHROMA_LOC_LEFT: + return "left (mpeg2/4, h264 default)"; + case AVCHROMA_LOC_CENTER: + return "center (mpeg1, jpeg, h263)"; + case AVCHROMA_LOC_TOPLEFT: + return "top left"; + case AVCHROMA_LOC_TOP: + return "top"; + case AVCHROMA_LOC_BOTTOMLEFT: + return "bottom left"; + case AVCHROMA_LOC_BOTTOM: + return "bottom"; + case AVCHROMA_LOC_NB: + return "Not ABI"; + default: + return ""; + } +} + +std::string VideoProperties::getFieldOrder() const +{ + switch( _codecContext->field_order ) + { + case AV_FIELD_UNKNOWN: + return "unknown"; + case AV_FIELD_PROGRESSIVE: + return "progressive"; + case AV_FIELD_TT: + return "top top"; + case AV_FIELD_BB: + return "bottom bottom"; + case AV_FIELD_TB: + return "top bottom"; + case AV_FIELD_BT: + return "bottom top"; + default: + return ""; + } +} + +std::string VideoProperties::getEndianess() const +{ + return ( _pixFmt->flags & PIX_FMT_BE ) ? "big" : "little"; +} + +std::string VideoProperties::getStartTimecodeString() const +{ + int64_t stratTimeCode = getStartTimecode(); + std::ostringstream os; + os << std::setfill( '0' ); + os << std::setw(2) << ( stratTimeCode >> 19 & 0x1f ) << ":"; // 5-bit hours + os << std::setw(2) << ( stratTimeCode >> 13 & 0x3f ) << ":"; // 6-bit minutes + os << std::setw(2) << ( stratTimeCode >> 6 & 0x3f ) ; // 6-bit seconds + os << ( stratTimeCode & 1 << 24 ? ';' : ':' ); // 1-bit drop flag + os << std::setw(2) << ( stratTimeCode & 0x3f ); // 6-bit frames + return os.str(); +} + + +Rational VideoProperties::getTimeBase() const +{ + Rational timeBase; + timeBase.num = _codecContext->time_base.num; + timeBase.den = _codecContext->time_base.den; + return timeBase; +} + +Rational VideoProperties::getSar() const +{ + Rational sar; + sar.num = _codecContext->sample_aspect_ratio.num; + sar.den = _codecContext->sample_aspect_ratio.den; + return sar; +} + +Rational VideoProperties::getDar() const +{ + int darNum, darDen; + av_reduce( &darNum, &darDen, + _codecContext->width * getSar().num, + _codecContext->height * getSar().den, + 1024 * 1024); + + Rational dar; + dar.num = darNum; + dar.den = darDen; + return dar; +} + +double VideoProperties::getFps() const +{ + Rational timeBase = getTimeBase(); + double fps = 1.0 * timeBase.den / ( timeBase.num * getTicksPerFrame() ); + if( isinf( fps ) ) + fps = 0.0; + return fps; +} + +bool VideoProperties::isPseudoPaletted() const +{ +#if LIBAVCODEC_VERSION_MAJOR > 53 + return (bool) _pixFmt->flags & PIX_FMT_PSEUDOPAL; +#else + return false; +#endif +} + +bool VideoProperties::hasAlpha() const +{ +#if LIBAVCODEC_VERSION_MAJOR > 53 + return (bool) _pixFmt->flags & PIX_FMT_ALPHA; +#else + return false; +#endif +} + +void VideoProperties::analyseGopStructure( IProgress& progress ) +{ + AVCodec* codec = NULL; + if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + { + if( codec->capabilities & CODEC_CAP_TRUNCATED ) + _codecContext->flags|= CODEC_FLAG_TRUNCATED; + + if( _codecContext->width && _codecContext->height ) + { + AVPacket pkt; + +#if LIBAVCODEC_VERSION_MAJOR > 54 + AVFrame* frame = av_frame_alloc(); +#else + AVFrame* frame = avcodec_alloc_frame(); +#endif + + av_init_packet( &pkt ); + avcodec_open2( _codecContext, codec, NULL ); + + int count = 0; + int gotFrame = 0; + bool stopAnalyse = false; + + while( ! av_read_frame( const_cast( _formatContext ), &pkt ) ) + { + if( pkt.stream_index == (int)_streamId ) + { + avcodec_decode_video2( _codecContext, frame, &gotFrame, &pkt ); + if( gotFrame ) + { + _gopStructure.push_back( std::make_pair( av_get_picture_type_char( frame->pict_type ), frame->key_frame ) ); + _isInterlaced = frame->interlaced_frame; + _isTopFieldFirst = frame->top_field_first; + ++count; + if( progress.progress( count, _codecContext->gop_size ) == eJobStatusCancel ) + stopAnalyse = true; + } + } + + av_free_packet( &pkt ); + + if( _codecContext->gop_size == count ) + { + stopAnalyse = true; + } + + if( stopAnalyse ) + break; + } +#if LIBAVCODEC_VERSION_MAJOR > 54 + av_frame_free( &frame ); +#else +#if LIBAVCODEC_VERSION_MAJOR > 53 + avcodec_free_frame( &frame ); +#else + av_free( frame ); +#endif +#endif + } + } +} + +std::vector VideoProperties::getChannels() const +{ + std::vector channels; + for( size_t channel = 0; channel < (size_t)_pixFmt->nb_components; ++channel ) + { + Channel c; + c.id = channel; + c.chromaHeight = (size_t)_pixFmt->comp[channel].plane; + c.bitStep = (size_t)_pixFmt->comp[channel].step_minus1; + channels.push_back( c ); + } + return channels; +} + +MetadatasMap VideoProperties::getDataMap() const +{ + MetadatasMap dataMap; + + detail::add( dataMap, "stream id", getStreamId() ); + detail::add( dataMap, "codec id", getCodecId() ); + detail::add( dataMap, "codec name", getCodecName() ); + detail::add( dataMap, "codec long name", getCodecLongName() ); + detail::add( dataMap, "profile", getProfile() ); + detail::add( dataMap, "profile name", getProfileName() ); + detail::add( dataMap, "level", getLevel() ); + detail::add( dataMap, "start timecode", getStartTimecode() ); + detail::add( dataMap, "width", getWidth() ); + detail::add( dataMap, "height", getHeight() ); + detail::add( dataMap, "pixel aspect ratio", getSar().num / getSar().den ); + detail::add( dataMap, "display aspect ratio", getDar().num / getDar().den ); + detail::add( dataMap, "dtgActiveFormat", getDtgActiveFormat() ); + detail::add( dataMap, "components count", getComponentsCount() ); + detail::add( dataMap, "pixel type", getPixelName() ); + detail::add( dataMap, "bit wise acked", isBitWisePacked() ); + detail::add( dataMap, "rgb pixel", isRgbPixelData() ); + detail::add( dataMap, "as alpha", hasAlpha() ); + detail::add( dataMap, "chroma width", getChromaWidth() ); + detail::add( dataMap, "chroma height", getChromaHeight() ); + detail::add( dataMap, "endianess", getEndianess() ); + detail::add( dataMap, "color transfert", getColorTransfert() ); + detail::add( dataMap, "colorspace", getColorspace() ); + detail::add( dataMap, "color range", getColorRange() ); + detail::add( dataMap, "color primaries", getColorPrimaries() ); + detail::add( dataMap, "indexed colors", isIndexedColors() ); + detail::add( dataMap, "pseudo paletted", isPseudoPaletted() ); + detail::add( dataMap, "chroma sample location", getChromaSampleLocation() ); + detail::add( dataMap, "interlaced ", isInterlaced() ); + detail::add( dataMap, "top field first", isTopFieldFirst() ); + detail::add( dataMap, "field order", getFieldOrder() ); + detail::add( dataMap, "timeBase", getTimeBase().num / getTimeBase().den ); + detail::add( dataMap, "fps", getFps() ); + detail::add( dataMap, "ticksPerFrame", getTicksPerFrame() ); + detail::add( dataMap, "bit rate", getBitRate() ); + detail::add( dataMap, "max bit rate", getMaxBitRate() ); + detail::add( dataMap, "min bit rate", getMinBitRate() ); + detail::add( dataMap, "gop size", getGopSize() ); + + std::string gop; + NoDisplayProgress progress; + std::vector< std::pair< char, bool > > gopStructure = getGopStructure(); + for( size_t frameIndex = 0; frameIndex < gopStructure.size(); ++frameIndex ) + { + gop += gopStructure.at( frameIndex ).first; + gop += ( gopStructure.at( frameIndex ).second ? "*" : " " ); + } + detail::add( dataMap, "gop", gop ); + + detail::add( dataMap, "has B frames", hasBFrames() ); + detail::add( dataMap, "references frames", getReferencesFrames() ); + + for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) + { + detail::add( dataMap, _metadatas.at( metadataIndex ).first, _metadatas.at( metadataIndex ).second ); + } + + return dataMap; +} + +} diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index da3f0778..7a7bb2b8 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -1,343 +1,125 @@ -#ifndef _AV_TRANSCODER_VIDEO_STREAM_PROPERTIES_HPP_ -#define _AV_TRANSCODER_VIDEO_STREAM_PROPERTIES_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_VIDEO_PROPERTIES_HPP +#define _AV_TRANSCODER_MEDIA_PROPERTY_VIDEO_PROPERTIES_HPP + +#include +#include +#include extern "C" { #include #include -#include #include } -#include -#include -#include - -#ifdef _MSC_VER -#include -#define isnan _isnan -#define isinf(x) (!_finite(x)) -#endif +#include +#include +#include namespace avtranscoder { -namespace details -{ - -void getGopProperties( - VideoProperties& vp, - AVFormatContext* formatContext, - AVCodecContext* codecContext, - AVCodec* codec, - const int videoStreamIndex, - IProgress& progress - ) -{ - AVPacket pkt; - -#if LIBAVCODEC_VERSION_MAJOR > 54 - AVFrame* frame = av_frame_alloc(); -#else - AVFrame* frame = avcodec_alloc_frame(); -#endif - - av_init_packet( &pkt ); - avcodec_open2( codecContext, codec, NULL ); - - int count = 0; - int gotFrame = 0; - bool stopAnalyse = false; - - while( ! av_read_frame( formatContext, &pkt ) ) - { - if( pkt.stream_index == videoStreamIndex ) - { - // std::cout << "decode frame" << std::endl; - avcodec_decode_video2( codecContext, frame, &gotFrame, &pkt ); - if( gotFrame ) - { - // std::cout << "inteleaved " << frame->interlaced_frame << std::endl; - vp.gopStructure.push_back( std::pair( av_get_picture_type_char( frame->pict_type ), frame->key_frame ) ); - vp.isInterlaced = frame->interlaced_frame; - vp.topFieldFirst = frame->top_field_first; - ++count; - if( progress.progress( count, codecContext->gop_size ) == eJobStatusCancel ) - stopAnalyse = true; - } - } - - av_free_packet( &pkt ); - - if( codecContext->gop_size == count ) - { - stopAnalyse = true; - } - - if( stopAnalyse ) - break; - } -#if LIBAVCODEC_VERSION_MAJOR > 54 - av_frame_free( &frame ); -#else - #if LIBAVCODEC_VERSION_MAJOR > 53 - avcodec_free_frame( &frame ); - #else - av_free( frame ); - #endif -#endif -} - -} - -std::string makeTimecodeMpegToString( uint32_t tc25bit ) +struct AvExport Channel { - std::ostringstream os; - os << std::setfill( '0' ); - os << std::setw(2) << ( tc25bit >> 19 & 0x1f ) << ":"; // 5-bit hours - os << std::setw(2) << ( tc25bit >> 13 & 0x3f ) << ":"; // 6-bit minutes - os << std::setw(2) << ( tc25bit >> 6 & 0x3f ) ; // 6-bit seconds - os << ( tc25bit & 1 << 24 ? ';' : ':' ); // 1-bit drop flag - os << std::setw(2) << ( tc25bit & 0x3f ); // 6-bit frames - return os.str(); -} - + size_t id; + size_t chromaHeight; + size_t bitStep; +}; -VideoProperties videoStreamInfo( - AVFormatContext* formatContext, - const size_t videoStreamIndex, - IProgress& progress, - const InputFile::EAnalyseLevel level - ) +class AvExport VideoProperties { - VideoProperties vp; - AVCodecContext* codec_context = formatContext->streams[videoStreamIndex]->codec; - - codec_context->skip_frame = AVDISCARD_NONE; - - vp.streamId = videoStreamIndex; - - vp.codecId = codec_context->codec_id; - vp.bitRate = codec_context->bit_rate; - vp.maxBitRate = codec_context->rc_max_rate; - vp.minBitRate = codec_context->rc_min_rate; - vp.isInterlaced = false; - vp.topFieldFirst = false; - - vp.ticksPerFrame = codec_context->ticks_per_frame, - vp.width = codec_context->width, - vp.height = codec_context->height, - vp.gopSize = codec_context->gop_size, - vp.dtgActiveFormat = codec_context->dtg_active_format, - vp.referencesFrames = codec_context->refs, - vp.profile = codec_context->profile, - vp.level = codec_context->level; - - vp.timeBase.num = codec_context->time_base.num; - vp.timeBase.den = codec_context->time_base.den; - vp.sar.num = codec_context->sample_aspect_ratio.num; - vp.sar.den = codec_context->sample_aspect_ratio.den; - - vp.startTimecode = makeTimecodeMpegToString( codec_context->timecode_frame_start ); - - int darNum, darDen; - av_reduce( &darNum, &darDen, - codec_context->width * codec_context->sample_aspect_ratio.num, - codec_context->height * codec_context->sample_aspect_ratio.den, - 1024 * 1024); - vp.dar.num = darNum; - vp.dar.den = darDen; - - vp.fps = 1.0 * codec_context->time_base.den / ( codec_context->time_base.num * codec_context->ticks_per_frame ); - - if( isinf( vp.fps ) ) - vp.fps = 0.0; - - vp.hasBFrames = (bool) codec_context->has_b_frames; - - - vp.colorspace = ""; - vp.colorTransfert = ""; - vp.colorRange = ""; - vp.colorPrimaries = ""; - vp.chromaSampleLocation = ""; - vp.fieldOrder = ""; - - switch( codec_context->color_trc ) - { - case AVCOL_TRC_BT709: vp.colorTransfert = "Rec 709 / ITU-R BT1361"; break; - case AVCOL_TRC_UNSPECIFIED: vp.colorTransfert = "unspecified"; break; - case AVCOL_TRC_GAMMA22: vp.colorTransfert = "Gamma 2.2"; break; - case AVCOL_TRC_GAMMA28: vp.colorTransfert = "Gamma 2.8"; break; -#if LIBAVCODEC_VERSION_MAJOR > 53 - case AVCOL_TRC_SMPTE240M: vp.colorTransfert = "Smpte 240M"; break; -#endif -#if LIBAVCODEC_VERSION_MAJOR > 54 - #ifdef AVCOL_TRC_SMPTE170M - case AVCOL_TRC_SMPTE170M: vp.colorTransfert = "Rec 601 / ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC"; break; - #endif - #ifdef AVCOL_TRC_LINEAR - case AVCOL_TRC_LINEAR: vp.colorTransfert = "Linear transfer characteristics"; break; - #endif - #ifdef AVCOL_TRC_LOG - case AVCOL_TRC_LOG: vp.colorTransfert = "Logarithmic transfer characteristic (100:1 range)"; break; - #endif - #ifdef AVCOL_TRC_LOG_SQRT - case AVCOL_TRC_LOG_SQRT: vp.colorTransfert = "Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range)"; break; - #endif - #ifdef AVCOL_TRC_IEC61966_2_4 - case AVCOL_TRC_IEC61966_2_4: vp.colorTransfert = "IEC 61966-2-4"; break; - #endif - #ifdef AVCOL_TRC_BT1361_ECG - case AVCOL_TRC_BT1361_ECG: vp.colorTransfert = "ITU-R BT1361 Extended Colour Gamut"; break; - #endif - #ifdef AVCOL_TRC_IEC61966_2_1 - case AVCOL_TRC_IEC61966_2_1: vp.colorTransfert = "IEC 61966-2-1 (sRGB or sYCC)"; break; - #endif - #ifdef AVCOL_TRC_BT2020_10 - case AVCOL_TRC_BT2020_10: vp.colorTransfert = "ITU-R BT2020 for 10 bit system"; break; - #endif - #ifdef AVCOL_TRC_BT2020_12 - case AVCOL_TRC_BT2020_12: vp.colorTransfert = "ITU-R BT2020 for 12 bit system"; break; - #endif -#endif - case AVCOL_TRC_NB: vp.colorTransfert = "Not ABI"; break; - default: break; - } - switch( codec_context->colorspace ) - { - case AVCOL_SPC_RGB: vp.colorspace = "RGB"; break; - case AVCOL_SPC_BT709: vp.colorspace = "Rec 709"; break; - case AVCOL_SPC_UNSPECIFIED: vp.colorspace = "unspecified"; break; - case AVCOL_SPC_FCC: vp.colorspace = "Four CC"; break; - case AVCOL_SPC_BT470BG: vp.colorspace = "BT470 (PAL - 625)"; break; - case AVCOL_SPC_SMPTE170M: vp.colorspace = "Smpte 170M (NTSC)"; break; - case AVCOL_SPC_SMPTE240M: vp.colorspace = "Smpte 240M"; break; -#if LIBAVCODEC_VERSION_MAJOR > 53 - case AVCOL_SPC_YCOCG: vp.colorspace = "Y Co Cg"; break; -//#else -// case AVCOL_SPC_YCGCO: vp.colorspace = "Y Cg Co"; break; -#endif -#if LIBAVCODEC_VERSION_MAJOR > 54 - #ifdef AVCOL_TRC_BT2020_12 - case AVCOL_SPC_BT2020_NCL: vp.colorspace = "ITU-R BT2020 non-constant luminance system"; break; - #endif - #ifdef AVCOL_TRC_BT2020_CL - case AVCOL_SPC_BT2020_CL: vp.colorspace = "ITU-R BT2020 constant luminance system"; break; - #endif -#endif - case AVCOL_SPC_NB: vp.colorspace = "Not ABI"; break; - default: break; - } - switch( codec_context->color_range ) - { - case AVCOL_RANGE_UNSPECIFIED: vp.colorRange = "unspecified"; break; - case AVCOL_RANGE_MPEG: vp.colorRange = "Head"; break; - case AVCOL_RANGE_JPEG: vp.colorRange = "Full"; break; - case AVCOL_RANGE_NB: vp.colorRange = "Not ABI"; break; - default: break; - } - switch( codec_context->color_primaries ) - { - case AVCOL_PRI_BT709: vp.colorPrimaries = "Rec 709"; break; - case AVCOL_PRI_UNSPECIFIED: vp.colorPrimaries = "unspecified"; break; - case AVCOL_PRI_BT470M: vp.colorPrimaries = "BT 470M"; break; - case AVCOL_PRI_BT470BG: vp.colorPrimaries = "Rec 601 (PAL & SECAM)"; break; - case AVCOL_PRI_SMPTE170M: vp.colorPrimaries = "Rec 601 (NTSC)"; break; - case AVCOL_PRI_SMPTE240M: vp.colorPrimaries = "Smpte 240 (NTSC)"; break; - case AVCOL_PRI_FILM: vp.colorPrimaries = "Film"; break; -#if LIBAVCODEC_VERSION_MAJOR > 54 - #ifdef AVCOL_TRC_BT2020_CL - case AVCOL_PRI_BT2020: vp.colorPrimaries = "ITU-R BT2020"; break; - #endif -#endif - case AVCOL_PRI_NB: vp.colorPrimaries = "Not ABI"; break; - default: break; - } - switch( codec_context->chroma_sample_location ) - { - case AVCHROMA_LOC_UNSPECIFIED: vp.chromaSampleLocation = "unspecified"; break; - case AVCHROMA_LOC_LEFT: vp.chromaSampleLocation = "left (mpeg2/4, h264 default)"; break; - case AVCHROMA_LOC_CENTER: vp.chromaSampleLocation = "center (mpeg1, jpeg, h263)"; break; - case AVCHROMA_LOC_TOPLEFT: vp.chromaSampleLocation = "top left"; break; - case AVCHROMA_LOC_TOP: vp.chromaSampleLocation = "top"; break; - case AVCHROMA_LOC_BOTTOMLEFT: vp.chromaSampleLocation = "bottom left"; break; - case AVCHROMA_LOC_BOTTOM: vp.chromaSampleLocation = "bottom"; break; - case AVCHROMA_LOC_NB: vp.chromaSampleLocation = "Not ABI"; break; - default: break; - } - switch( codec_context->field_order ) - { - case AV_FIELD_UNKNOWN: vp.fieldOrder = "unknown"; break; - case AV_FIELD_PROGRESSIVE: vp.fieldOrder = "progressive"; break; - case AV_FIELD_TT: vp.fieldOrder = "top top"; break; - case AV_FIELD_BB: vp.fieldOrder = "bottom bottom"; break; - case AV_FIELD_TB: vp.fieldOrder = "top bottom"; break; - case AV_FIELD_BT: vp.fieldOrder = "bottom top"; break; - default: break; - } -#if LIBAVUTIL_VERSION_MAJOR > 51 - const AVPixFmtDescriptor* pixFmt = av_pix_fmt_desc_get( codec_context->pix_fmt ); -#else - const AVPixFmtDescriptor* pixFmt = NULL; - if( codec_context->pix_fmt >= 0 && codec_context->pix_fmt < PIX_FMT_NB ) - pixFmt = &av_pix_fmt_descriptors[ codec_context->pix_fmt ]; -#endif - - if( pixFmt != NULL ) - { - vp.pixelName = pixFmt->name; - vp.componentsCount = pixFmt->nb_components; - vp.chromaWidth = pixFmt->log2_chroma_w; - vp.chromaHeight = pixFmt->log2_chroma_h; - vp.endianess = ( pixFmt->flags & PIX_FMT_BE ) ? "big" : "little"; - vp.indexedColors = (bool) pixFmt->flags & PIX_FMT_PAL; - vp.bitWisePacked = (bool) pixFmt->flags & PIX_FMT_BITSTREAM; - vp.hardwareAcceleration = (bool) pixFmt->flags & PIX_FMT_HWACCEL; - vp.notFirstPlane = (bool) pixFmt->flags & PIX_FMT_PLANAR; - vp.rgbPixelData = (bool) pixFmt->flags & PIX_FMT_RGB; -#if LIBAVCODEC_VERSION_MAJOR > 53 - vp.pseudoPaletted = (bool) pixFmt->flags & PIX_FMT_PSEUDOPAL; - vp.asAlpha = (bool) pixFmt->flags & PIX_FMT_ALPHA; -#else -#endif - - for( size_t channel = 0; channel < (size_t)pixFmt->nb_components; ++channel ) - { - Channel c; - c.id = channel; - c.chromaHeight = (size_t)pixFmt->comp[channel].plane; - c.bitStep = (size_t)pixFmt->comp[channel].step_minus1; - vp.channels.push_back( c ); - } - } - - AVCodec* codec = NULL; - if( ( codec = avcodec_find_decoder( codec_context->codec_id ) ) != NULL ) - { - if( codec->capabilities & CODEC_CAP_TRUNCATED ) - codec_context->flags|= CODEC_FLAG_TRUNCATED; - - vp.codecName = codec->name; - vp.codecLongName = codec->long_name; - - if( codec_context->profile != -99 ) - { - const char* profile; - if( ( profile = av_get_profile_name( codec, codec_context->profile ) ) != NULL ) - vp.profileName = profile; - } - - // std::cout << "pass here " << codec_context->width << "x" << codec_context->height<< std::endl; - - if( codec_context->width && codec_context->height )// && level != InputFile::eAnalyseLevelFast ) - { - // std::cout << "full analysis" << std::endl; - details::getGopProperties( vp, formatContext, codec_context, codec, videoStreamIndex, progress ); - } - } - - return vp; -} +public: + VideoProperties(); + VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress ); + + std::string getCodecName() const; + std::string getCodecLongName() const; + std::string getProfileName() const; + std::string getColorTransfert() const; + std::string getColorspace() const; + std::string getColorRange() const; + std::string getColorPrimaries() const; + std::string getChromaSampleLocation() const; + std::string getFieldOrder() const; + + std::string getPixelName() const { return _pixFmt->name; } + std::string getEndianess() const; + + int64_t getStartTimecode() const { return _codecContext->timecode_frame_start; } + std::string getStartTimecodeString() const; + + Rational getTimeBase() const; + Rational getSar() const; // sample/pixel aspect ratio + Rational getDar() const; // display aspect ratio + + size_t getStreamId() const { return _streamId; } + size_t getCodecId() const { return _codecContext->codec_id; } + size_t getBitRate() const { return _codecContext->bit_rate; } + size_t getMaxBitRate() const { return _codecContext->rc_max_rate; } + size_t getMinBitRate() const { return _codecContext->rc_min_rate; } + size_t getTicksPerFrame() const { return _codecContext->ticks_per_frame; } + size_t getWidth() const { return _codecContext->width; } + size_t getHeight() const { return _codecContext->height; } + size_t getGopSize() const { return _codecContext->gop_size; } + size_t getDtgActiveFormat() const { return _codecContext->dtg_active_format; } + size_t getReferencesFrames() const { return _codecContext->refs; } + int getProfile() const { return _codecContext->profile; } + int getLevel() const { return _codecContext->level; } + size_t getComponentsCount() const { return _pixFmt->nb_components; } + size_t getChromaWidth() const { return _pixFmt->log2_chroma_w; } + size_t getChromaHeight() const { return _pixFmt->log2_chroma_h; } + + double getFps() const; + + bool hasBFrames() const { return (bool) _codecContext->has_b_frames; } + bool isIndexedColors() const { return (bool) _pixFmt->flags & PIX_FMT_PAL; } + bool isBitWisePacked() const { return (bool) _pixFmt->flags & PIX_FMT_BITSTREAM; } + bool isHardwareAccelerated() const { return (bool) _pixFmt->flags & PIX_FMT_HWACCEL; } + bool isPlanar() const { return (bool) _pixFmt->flags & PIX_FMT_PLANAR; } + bool isRgbPixelData() const { return (bool) _pixFmt->flags & PIX_FMT_RGB; } + bool isPseudoPaletted() const; + bool hasAlpha() const; + + //@{ + // Warning: Can acces these data when analyse first gop + // Construct the VideoProperties with level = eAnalyseLevelFull + // @see EAnalyseLevel + // @see analyseGopStructure + bool isInterlaced() const { return _isInterlaced; } + bool isTopFieldFirst() const { return _isTopFieldFirst; } + std::vector< std::pair< char, bool > > getGopStructure() const { return _gopStructure; } + //@} + + std::vector getChannels() const; + + MetadatasMap& getMetadatas() { return _metadatas; } + + const AVFormatContext& getAVFormatContext() { return *_formatContext; } + AVCodecContext& getAVCodecContext() { return *_codecContext; } + const AVPixFmtDescriptor& getAVPixFmtDescriptor() { return *_pixFmt; } + + MetadatasMap getDataMap() const; ///< Warning: the method calls analyseGopStructure, which can modify state of the object + +private: + /** + * @brief frame type / is key frame + * @param progress: callback to get analysis progression + */ + void analyseGopStructure( IProgress& progress ); + +private: + const AVFormatContext* _formatContext; ///< Has link (no ownership) + AVCodecContext* _codecContext; ///< Has link (no ownership) + const AVPixFmtDescriptor* _pixFmt; ///< Has link (no ownership) + + size_t _streamId; + //@{ + // Can acces these data when analyse first gop + bool _isInterlaced; + bool _isTopFieldFirst; + std::vector< std::pair< char, bool > > _gopStructure; + //@} + MetadatasMap _metadatas; +}; } diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.cpp b/src/AvTranscoder/mediaProperty/mediaProperty.cpp index 1b950179..0d06db48 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.cpp +++ b/src/AvTranscoder/mediaProperty/mediaProperty.cpp @@ -4,27 +4,16 @@ extern "C" { #include } -#include -#include - namespace avtranscoder { namespace detail { -template -void add( MetadatasMap& dataMap, const std::string& key, const T& value ) -{ - std::stringstream ss; - ss << value; - add( dataMap, key, ss.str() ); -} - template<> void add( MetadatasMap& dataMap, const std::string& key, const std::string& value ) { - dataMap.push_back( std::pair( key, value ) ); + dataMap.push_back( std::make_pair( key, value ) ); } template<> @@ -38,181 +27,10 @@ void fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadat AVDictionaryEntry* tag = NULL; while( ( tag = av_dict_get( avdictionnary, "", tag, AV_DICT_IGNORE_SUFFIX ) ) ) { - metadata.push_back( std::pair( tag->key, tag->value ) ); + metadata.push_back( std::make_pair( tag->key, tag->value ) ); } } } -MetadatasMap VideoProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "stream id", streamId ); - detail::add( dataMap, "codec id", codecId ); - detail::add( dataMap, "codec name", codecName ); - detail::add( dataMap, "codec long name", codecLongName ); - detail::add( dataMap, "profile", profile ); - detail::add( dataMap, "profile name", profileName ); - detail::add( dataMap, "level", level ); - detail::add( dataMap, "start timecode", startTimecode ); - detail::add( dataMap, "width", width ); - detail::add( dataMap, "height", height ); - detail::add( dataMap, "pixel aspect ratio", sar.num / sar.den ); - detail::add( dataMap, "display aspect ratio", dar.num / dar.den ); - detail::add( dataMap, "dtgActiveFormat", dtgActiveFormat ); - detail::add( dataMap, "components count", componentsCount ); - detail::add( dataMap, "pixel type", pixelName ); - detail::add( dataMap, "bit wise acked", bitWisePacked ); - detail::add( dataMap, "rgb pixel", rgbPixelData ); - detail::add( dataMap, "as alpha", asAlpha ); - detail::add( dataMap, "chroma width", chromaWidth ); - detail::add( dataMap, "chroma height", chromaHeight ); - detail::add( dataMap, "endianess", endianess ); - detail::add( dataMap, "color transfert", colorTransfert ); - detail::add( dataMap, "colorspace", colorspace ); - detail::add( dataMap, "color range", colorRange ); - detail::add( dataMap, "color primaries", colorPrimaries ); - detail::add( dataMap, "indexed colors", indexedColors ); - detail::add( dataMap, "pseudo paletted", pseudoPaletted ); - detail::add( dataMap, "chroma sample location", chromaSampleLocation); - detail::add( dataMap, "interlaced ", isInterlaced ); - detail::add( dataMap, "top field first", topFieldFirst ); - detail::add( dataMap, "field order", fieldOrder); - detail::add( dataMap, "timeBase", timeBase.num / timeBase.den ); - detail::add( dataMap, "fps", fps ); - detail::add( dataMap, "ticksPerFrame", ticksPerFrame ); - detail::add( dataMap, "bit rate", bitRate ); - detail::add( dataMap, "max bit rate", maxBitRate ); - detail::add( dataMap, "min bit rate", minBitRate ); - detail::add( dataMap, "gop size", gopSize ); - - std::string gop; - for( size_t frameIndex = 0; frameIndex < gopStructure.size(); ++frameIndex ) - { - gop += gopStructure.at( frameIndex ).first; - gop += ( gopStructure.at( frameIndex ).second ? "*" : " " ); - } - detail::add( dataMap, "gop", gop ); - - detail::add( dataMap, "has B frames", hasBFrames ); - detail::add( dataMap, "references frames", referencesFrames ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap AudioProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "stream id", streamId ); - detail::add( dataMap, "codec id", codecId ); - detail::add( dataMap, "codec name", codecName ); - detail::add( dataMap, "codec long name", codecLongName ); - detail::add( dataMap, "sample format name", sampleFormatName ); - detail::add( dataMap, "sample format long name", sampleFormatLongName ); - detail::add( dataMap, "sample rate", sampleRate ); - detail::add( dataMap, "bit rate", bit_rate ); - detail::add( dataMap, "channels", channels ); - detail::add( dataMap, "channel layout", channelLayout ); - detail::add( dataMap, "channel name", channelName ); - detail::add( dataMap, "channel description", channelDescription ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap DataProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "streamId", streamId ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap SubtitleProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "streamId", streamId ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap AttachementProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "streamId", streamId ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap UnknownProperties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "streamId", streamId ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - -MetadatasMap Properties::getDataMap() const -{ - MetadatasMap dataMap; - - detail::add( dataMap, "filename", filename ); - detail::add( dataMap, "format name", formatName ); - detail::add( dataMap, "format long name", formatLongName ); - - detail::add( dataMap, "start time", startTime ); - detail::add( dataMap, "duration", duration ); - detail::add( dataMap, "bitrate", bitRate ); - detail::add( dataMap, "number of streams", streamsCount ); - detail::add( dataMap, "number of programs", programsCount ); - detail::add( dataMap, "number of video streams", videoStreams.size() ); - detail::add( dataMap, "number of audio streams", audioStreams.size() ); - detail::add( dataMap, "number of data streams", dataStreams.size() ); - detail::add( dataMap, "number of subtitle streams", subtitleStreams.size() ); - detail::add( dataMap, "number of attachement streams", attachementStreams.size() ); - detail::add( dataMap, "number of unknown streams", unknownStreams.size() ); - - for( size_t metadataIndex = 0; metadataIndex < metadatas.size(); ++metadataIndex ) - { - detail::add( dataMap, metadatas.at( metadataIndex ).first, metadatas.at( metadataIndex ).second ); - } - - return dataMap; -} - } diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.hpp b/src/AvTranscoder/mediaProperty/mediaProperty.hpp index 89e89013..34e7e034 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.hpp +++ b/src/AvTranscoder/mediaProperty/mediaProperty.hpp @@ -1,11 +1,12 @@ -#ifndef _AV_TRANSCODER_MEDIA_HPP_ -#define _AV_TRANSCODER_MEDIA_HPP_ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_UTIL_HPP_ +#define _AV_TRANSCODER_MEDIA_PROPERTY_UTIL_HPP_ #include -#include #include -#include +#include +#include +#include namespace avtranscoder { @@ -17,173 +18,28 @@ typedef std::vector< std::pair > MetadatasMap; namespace detail { - /** - * @brief Fill metadata parameter with the given AVDictionary. - */ - void AvExport fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadata ); -} - -struct AvExport Channel -{ - size_t id; - size_t chromaHeight; - size_t bitStep; -}; - -struct AvExport VideoProperties -{ - VideoProperties() - { - timeBase.num = 0; - timeBase.den = 0; - sar.num = 0; - sar.den = 0; - dar.num = 0; - dar.den = 0; - } - -public: - std::string codecName; - std::string codecLongName; - std::string profileName; - std::string colorTransfert; - std::string colorspace; - std::string colorRange; - std::string colorPrimaries; - std::string chromaSampleLocation; - std::string fieldOrder; - - std::string pixelName; - std::string endianess; - - std::string startTimecode; - - Rational timeBase; - Rational sar; // sample/pixel aspect ratio - Rational dar; // display aspect ratio - - size_t streamId; - size_t codecId; - size_t bitRate; - size_t maxBitRate; - size_t minBitRate; - size_t ticksPerFrame; - size_t width; - size_t height; - size_t gopSize; - size_t dtgActiveFormat; - size_t referencesFrames; - int profile; - int level; - size_t componentsCount; - size_t chromaWidth; - size_t chromaHeight; - - double fps; - - bool hasBFrames; - bool indexedColors; - bool bitWisePacked; - bool hardwareAcceleration; - bool notFirstPlane; - bool rgbPixelData; - bool pseudoPaletted; - bool asAlpha; - bool isInterlaced; - bool topFieldFirst; - - // ( frame type / is key frame ) - std::vector< std::pair< char, bool > > gopStructure; - std::vector channels; - - MetadatasMap metadatas; - -public: - MetadatasMap getDataMap() const; -}; - -struct AvExport AudioProperties -{ - std::string codecName; - std::string codecLongName; - std::string sampleFormatName; - std::string sampleFormatLongName; - std::string channelLayout; - std::string channelName; - std::string channelDescription; - size_t streamId; - size_t codecId; - size_t sampleRate; - size_t channels; - size_t bit_rate; - - MetadatasMap metadatas; - -public: - MetadatasMap getDataMap() const; -}; - -struct AvExport DataProperties -{ - size_t streamId; - MetadatasMap metadatas; - -public: - MetadatasMap getDataMap() const; -}; - -struct AvExport SubtitleProperties -{ - size_t streamId; - MetadatasMap metadatas; - -public: - MetadatasMap getDataMap() const; -}; - -struct AvExport AttachementProperties -{ - size_t streamId; - MetadatasMap metadatas; - -public: - MetadatasMap getDataMap() const; -}; -struct AvExport UnknownProperties +template +void add( MetadatasMap& dataMap, const std::string& key, const T& value ) { - size_t streamId; - MetadatasMap metadatas; + std::stringstream ss; + ss << value; + add( dataMap, key, ss.str() ); +} -public: - MetadatasMap getDataMap() const; -}; +template<> +void add( MetadatasMap& dataMap, const std::string& key, const std::string& value ); -struct AvExport Properties -{ - std::string filename; - std::string formatName; - std::string formatLongName; - size_t streamsCount; - size_t programsCount; - double startTime; - double duration; - size_t bitRate; - size_t packetSize; - - std::vector< VideoProperties > videoStreams; - std::vector< AudioProperties > audioStreams; - std::vector< DataProperties > dataStreams; - std::vector< SubtitleProperties > subtitleStreams; - std::vector< AttachementProperties > attachementStreams; - std::vector< UnknownProperties > unknownStreams; +template<> +void add( MetadatasMap& dataMap, const std::string& key, const bool& value ); - MetadatasMap metadatas; +/** + * @brief Fill metadata parameter with the given AVDictionary. + */ +void AvExport fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadata ); -public: - MetadatasMap getDataMap() const; -}; +} } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/mediaProperty/print.hpp b/src/AvTranscoder/mediaProperty/print.hpp index a2a69c80..92ce2561 100644 --- a/src/AvTranscoder/mediaProperty/print.hpp +++ b/src/AvTranscoder/mediaProperty/print.hpp @@ -14,7 +14,7 @@ namespace avtranscoder static const size_t keyWidth = 32; static const std::string separator = "===================="; -std::ostream& operator<<( std::ostream& flux, const Properties& properties ) +std::ostream& operator<<( std::ostream& flux, const FileProperties& properties ) { flux << std::left; flux << separator << " Wrapper " << separator << std::endl; @@ -114,39 +114,39 @@ std::ostream& operator<<( std::ostream& flux, const InputFile& input ) flux << input.getProperties(); // video streams - for( size_t videoStreamIndex = 0; videoStreamIndex < input.getProperties().videoStreams.size(); ++videoStreamIndex ) + for( size_t videoStreamIndex = 0; videoStreamIndex < input.getProperties().getNbVideoStreams(); ++videoStreamIndex ) { - flux << input.getProperties().videoStreams.at( videoStreamIndex ); + flux << input.getProperties().getVideoProperties().at( videoStreamIndex ); } // audio streams - for( size_t audioStreamIndex = 0; audioStreamIndex < input.getProperties().audioStreams.size(); ++audioStreamIndex ) + for( size_t audioStreamIndex = 0; audioStreamIndex < input.getProperties().getNbAudioStreams(); ++audioStreamIndex ) { - flux << input.getProperties().audioStreams.at( audioStreamIndex ); + flux << input.getProperties().getAudioProperties().at( audioStreamIndex ); } // data streams - for( size_t dataStreamIndex = 0; dataStreamIndex < input.getProperties().dataStreams.size(); ++dataStreamIndex ) + for( size_t dataStreamIndex = 0; dataStreamIndex < input.getProperties().getNbDataStreams(); ++dataStreamIndex ) { - flux << input.getProperties().dataStreams.at( dataStreamIndex ); + flux << input.getProperties().getDataProperties().at( dataStreamIndex ); } // subtitle streams - for( size_t subtitleStreamIndex = 0; subtitleStreamIndex < input.getProperties().subtitleStreams.size(); ++subtitleStreamIndex ) + for( size_t subtitleStreamIndex = 0; subtitleStreamIndex < input.getProperties().getNbSubtitleStreams(); ++subtitleStreamIndex ) { - flux << input.getProperties().subtitleStreams.at( subtitleStreamIndex ); + flux << input.getProperties().getSubtitleProperties().at( subtitleStreamIndex ); } // attachement streams - for( size_t attachementStreamIndex = 0; attachementStreamIndex < input.getProperties().attachementStreams.size(); ++attachementStreamIndex ) + for( size_t attachementStreamIndex = 0; attachementStreamIndex < input.getProperties().getNbAttachementStreams(); ++attachementStreamIndex ) { - flux << input.getProperties().attachementStreams.at( attachementStreamIndex ); + flux << input.getProperties().getAttachementProperties().at( attachementStreamIndex ); } // unknown streams - for( size_t unknownStreamIndex = 0; unknownStreamIndex < input.getProperties().unknownStreams.size(); ++unknownStreamIndex ) + for( size_t unknownStreamIndex = 0; unknownStreamIndex < input.getProperties().getNbUnknownStreams(); ++unknownStreamIndex ) { - flux << input.getProperties().unknownStreams.at( unknownStreamIndex ); + flux << input.getProperties().getUnknownPropertiesProperties().at( unknownStreamIndex ); } return flux; @@ -154,4 +154,4 @@ std::ostream& operator<<( std::ostream& flux, const InputFile& input ) } -#endif \ No newline at end of file +#endif diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 2ee022a6..acf30709 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -384,16 +384,16 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s // Create profile as input configuration NoDisplayProgress progress; referenceFile->analyse( progress, InputFile::eAnalyseLevelFast ); - AudioProperties audioProperties = referenceFile->getProperties().audioStreams.at( streamIndex ); + AudioProperties audioProperties = referenceFile->getProperties().getAudioProperties().at( streamIndex ); ProfileLoader::Profile profile; profile[ constants::avProfileIdentificator ] = "presetRewrap"; profile[ constants::avProfileIdentificatorHuman ] = "Preset rewrap"; profile[ constants::avProfileType ] = avtranscoder::constants::avProfileTypeAudio; - profile[ constants::avProfileCodec ] = audioProperties.codecName; - profile[ constants::avProfileSampleFormat ] = audioProperties.sampleFormatName; + profile[ constants::avProfileCodec ] = audioProperties.getCodecName(); + profile[ constants::avProfileSampleFormat ] = audioProperties.getSampleFormatName(); std::stringstream ss; - ss << audioProperties.sampleRate; + ss << audioProperties.getSampleRate(); profile[ constants::avProfileSampleRate ] = ss.str(); profile[ constants::avProfileChannel ] = "1"; From b3a5e90d15bddec0569daa63d5b382bb2efad621 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 17:52:38 +0100 Subject: [PATCH 03/64] mediaProperty: rename file mediaProperty to util --- src/AvTranscoder/avTranscoder.i | 4 ++-- src/AvTranscoder/file/InputFile.cpp | 2 +- src/AvTranscoder/file/OutputFile.hpp | 2 +- src/AvTranscoder/mediaProperty/AttachementProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/AudioProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/DataProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/FileProperties.hpp | 3 +-- src/AvTranscoder/mediaProperty/SubtitleProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/UnknownProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/VideoProperties.hpp | 2 +- .../mediaProperty/{mediaProperty.cpp => util.cpp} | 2 +- .../mediaProperty/{mediaProperty.hpp => util.hpp} | 0 12 files changed, 12 insertions(+), 13 deletions(-) rename src/AvTranscoder/mediaProperty/{mediaProperty.cpp => util.cpp} (95%) rename src/AvTranscoder/mediaProperty/{mediaProperty.hpp => util.hpp} (100%) diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 2e84c315..e166248a 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include @@ -78,7 +78,7 @@ namespace std { %include %include -%include +%include %include %include diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 597ae938..e640d67f 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -1,7 +1,7 @@ #include "InputFile.hpp" #include -#include +#include #include #include #include diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index e94c5f40..21119d34 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/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index f622dfef..5bd144f2 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP #include -#include +#include extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index bb440025..e8eb73ab 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP #include -#include +#include extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index eadaf1e9..dec05520 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP #include -#include +#include extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 22e36ec5..86405991 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -2,8 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP #include -#include - +#include #include #include #include diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index 7e806bd7..717ccb95 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_SUBTITLE_PROPERTIES_HPP #include -#include +#include extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index 1efe55f6..b6c39711 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_UNKNOWN_PROPERTIES_HPP #include -#include +#include extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 7a7bb2b8..ec776974 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_VIDEO_PROPERTIES_HPP #include -#include +#include #include extern "C" { diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.cpp b/src/AvTranscoder/mediaProperty/util.cpp similarity index 95% rename from src/AvTranscoder/mediaProperty/mediaProperty.cpp rename to src/AvTranscoder/mediaProperty/util.cpp index 0d06db48..6b4ab4dc 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.cpp +++ b/src/AvTranscoder/mediaProperty/util.cpp @@ -1,4 +1,4 @@ -#include "mediaProperty.hpp" +#include "util.hpp" extern "C" { #include diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.hpp b/src/AvTranscoder/mediaProperty/util.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/mediaProperty.hpp rename to src/AvTranscoder/mediaProperty/util.hpp From 2704ddb16de43eedb168ca18c07af8cddcff2ad8 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 13:26:03 +0100 Subject: [PATCH 04/64] mediaProperty: add swig interface file --- src/AvTranscoder/avTranscoder.i | 9 +------- .../mediaProperty/mediaProperty.i | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 src/AvTranscoder/mediaProperty/mediaProperty.i diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index e166248a..dfd2b34e 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -25,9 +25,6 @@ #include #include -#include -#include - #include #include @@ -47,8 +44,6 @@ #include #include - -using namespace avtranscoder; %} namespace std { @@ -65,6 +60,7 @@ namespace std { } %include "AvTranscoder/progress/progress.i" +%include "AvTranscoder/mediaProperty/mediaProperty.i" %include @@ -78,9 +74,6 @@ namespace std { %include %include -%include -%include - %include %include diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i new file mode 100644 index 00000000..8719a2f0 --- /dev/null +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -0,0 +1,23 @@ +%{ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace avtranscoder; +%} + +%include +%include +%include +%include +%include +%include +%include +%include + From f0942929ae93035042e54cee12acbf3c52998a10 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 18:02:23 +0100 Subject: [PATCH 05/64] swig: move template about mediaProperty in the corresponding interface --- src/AvTranscoder/avTranscoder.i | 7 ------- src/AvTranscoder/mediaProperty/mediaProperty.i | 11 ++++++++++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index dfd2b34e..ea402a74 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -48,13 +48,6 @@ namespace std { %template(IntPair) pair< size_t, size_t >; -%template(VideoVector) vector< avtranscoder::VideoProperties >; -%template(AudioVector) vector< avtranscoder::AudioProperties >; -%template(MetadataPair) pair< string, string >; -%template(MetadatasVector) vector< pair< string, string > >; -%template(GopPair) pair< char, bool >; -%template(GopVector) vector< pair< char, bool > >; -%template(ChannelVector) vector< avtranscoder::Channel >; %template(ProfileMap) map< string, string >; %template(ProfilesVector) vector< map< string, string > >; } diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i index 8719a2f0..0a377472 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -12,6 +12,16 @@ using namespace avtranscoder; %} +namespace std { +%template(VideoVector) vector< avtranscoder::VideoProperties >; +%template(AudioVector) vector< avtranscoder::AudioProperties >; +%template(MetadataPair) pair< string, string >; +%template(MetadatasVector) vector< pair< string, string > >; +%template(GopPair) pair< char, bool >; +%template(GopVector) vector< pair< char, bool > >; +%template(ChannelVector) vector< avtranscoder::Channel >; +} + %include %include %include @@ -20,4 +30,3 @@ using namespace avtranscoder; %include %include %include - From 006894832217f388943f1555c26b4b100b0c1467 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 18:05:53 +0100 Subject: [PATCH 06/64] swig: add templates to mediaProperty interface --- src/AvTranscoder/mediaProperty/mediaProperty.i | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i index 0a377472..41c628a5 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -13,12 +13,19 @@ using namespace avtranscoder; %} namespace std { -%template(VideoVector) vector< avtranscoder::VideoProperties >; -%template(AudioVector) vector< avtranscoder::AudioProperties >; +%template(VideoVector) vector< avtranscoder::VideoProperties >; +%template(AudioVector) vector< avtranscoder::AudioProperties >; +%template(DataVector) vector< avtranscoder::DataProperties >; +%template(SubtitleVector) vector< avtranscoder::SubtitleProperties >; +%template(AttachementVector) vector< avtranscoder::AttachementProperties >; +%template(UnknownVector) vector< avtranscoder::UnknownProperties >; + %template(MetadataPair) pair< string, string >; %template(MetadatasVector) vector< pair< string, string > >; + %template(GopPair) pair< char, bool >; %template(GopVector) vector< pair< char, bool > >; + %template(ChannelVector) vector< avtranscoder::Channel >; } From d59701cd57b540c3a7afd9f727f94fd44170ba28 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 18:28:46 +0100 Subject: [PATCH 07/64] file: add file util.hpp * util contains enum EAnalyseLevel. * Use level of analyse when create VideoProperties while input file analysis. --- app/avMeta/avMeta.cpp | 2 +- src/AvTranscoder/file/InputFile.cpp | 2 +- src/AvTranscoder/file/InputFile.hpp | 8 ++------ src/AvTranscoder/file/util.hpp | 19 +++++++++++++++++++ .../mediaProperty/VideoProperties.cpp | 7 +++---- .../mediaProperty/VideoProperties.hpp | 3 ++- src/AvTranscoder/transcoder/Transcoder.cpp | 3 ++- 7 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 src/AvTranscoder/file/util.hpp diff --git a/app/avMeta/avMeta.cpp b/app/avMeta/avMeta.cpp index a65c3782..481aea2f 100644 --- a/app/avMeta/avMeta.cpp +++ b/app/avMeta/avMeta.cpp @@ -16,7 +16,7 @@ int main( int argc, char** argv ) avtranscoder::NoDisplayProgress p; avtranscoder::InputFile input( argv[1] ); - input.analyse( p, avtranscoder::InputFile::eAnalyseLevelFull ); + input.analyse( p, avtranscoder::eAnalyseLevelFull ); // a simply metadata display std::cout << input; diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index e640d67f..031ceb44 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -79,7 +79,7 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level ) { case AVMEDIA_TYPE_VIDEO: { - _properties.getVideoProperties().push_back( VideoProperties( _formatContext, streamId, progress ) ); + _properties.getVideoProperties().push_back( VideoProperties( _formatContext, streamId, progress, level ) ); break; } case AVMEDIA_TYPE_AUDIO: diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 2c6c0ce8..869dfa7c 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -3,6 +3,8 @@ #include +#include + #include #include @@ -34,12 +36,6 @@ class AvExport InputFile virtual ~InputFile(); - enum EAnalyseLevel - { - eAnalyseLevelFast = 0, - eAnalyseLevelFull = 0, - }; - /** * @return Return the resource to access **/ diff --git a/src/AvTranscoder/file/util.hpp b/src/AvTranscoder/file/util.hpp new file mode 100644 index 00000000..7ff39c7d --- /dev/null +++ b/src/AvTranscoder/file/util.hpp @@ -0,0 +1,19 @@ +#ifndef _AV_TRANSCODER_FILE_UTIL_HPP_ +#define _AV_TRANSCODER_FILE_UTIL_HPP_ + +namespace avtranscoder +{ + +/** + * @brief Level of file analysis. + */ +enum EAnalyseLevel +{ + eAnalyseLevelFast = 0, + eAnalyseLevelFull = 0, +}; + +} + +#endif + diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index e8323dfe..7df9a033 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -29,7 +29,7 @@ VideoProperties::VideoProperties() , _gopStructure() {} -VideoProperties::VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress ) +VideoProperties::VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level ) : _formatContext( formatContext ) , _codecContext( formatContext->streams[index]->codec ) , _pixFmt( NULL ) @@ -50,9 +50,8 @@ VideoProperties::VideoProperties( const AVFormatContext* formatContext, const si _pixFmt = &av_pix_fmt_descriptors[ _codecContext->pix_fmt ]; #endif - // Analyse GOP - //if( level == eAnalyseLevelFull ) - analyseGopStructure( progress ); + if( level == eAnalyseLevelFull ) + analyseGopStructure( progress ); } std::string VideoProperties::getCodecName() const diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index ec776974..1dcbdd0b 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -3,6 +3,7 @@ #include #include +#include #include extern "C" { @@ -29,7 +30,7 @@ class AvExport VideoProperties { public: VideoProperties(); - VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress ); + VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); std::string getCodecName() const; std::string getCodecLongName() const; diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index acf30709..7b601b1e 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -1,5 +1,6 @@ #include "Transcoder.hpp" +#include #include #include @@ -383,7 +384,7 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s // Create profile as input configuration NoDisplayProgress progress; - referenceFile->analyse( progress, InputFile::eAnalyseLevelFast ); + referenceFile->analyse( progress, eAnalyseLevelFast ); AudioProperties audioProperties = referenceFile->getProperties().getAudioProperties().at( streamIndex ); ProfileLoader::Profile profile; From 08460e72c3fe63f04a107fcc7a014f6c58e9c5b8 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 18:33:14 +0100 Subject: [PATCH 08/64] EAnalyseLevel: rename enum values * Rename eAnalyseLevelFast to eAnalyseLevelHeader * Rename eAnalyseLevelFast to eAnalyseLevelFirstGop --- app/avMeta/avMeta.cpp | 2 +- src/AvTranscoder/file/InputFile.hpp | 4 ++-- src/AvTranscoder/file/util.hpp | 5 +++-- src/AvTranscoder/mediaProperty/VideoProperties.cpp | 2 +- src/AvTranscoder/mediaProperty/VideoProperties.hpp | 2 +- src/AvTranscoder/transcoder/Transcoder.cpp | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/avMeta/avMeta.cpp b/app/avMeta/avMeta.cpp index 481aea2f..ce466112 100644 --- a/app/avMeta/avMeta.cpp +++ b/app/avMeta/avMeta.cpp @@ -16,7 +16,7 @@ int main( int argc, char** argv ) avtranscoder::NoDisplayProgress p; avtranscoder::InputFile input( argv[1] ); - input.analyse( p, avtranscoder::eAnalyseLevelFull ); + input.analyse( p, avtranscoder::eAnalyseLevelFirstGop ); // a simply metadata display std::cout << input; diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 869dfa7c..6283f977 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -46,7 +46,7 @@ class AvExport InputFile * call this function before getProperties(). * @param progress callback to get analysis progression **/ - InputFile& analyse( IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); + InputFile& analyse( IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); /** * @brief Return media properties on the current InputFile. @@ -63,7 +63,7 @@ class AvExport InputFile * @param progress callback to get analysis progression * @return structure of media metadatas **/ - static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); + static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); /** * @brief Get stream type: video, audio, subtitle, etc. diff --git a/src/AvTranscoder/file/util.hpp b/src/AvTranscoder/file/util.hpp index 7ff39c7d..95dcaea4 100644 --- a/src/AvTranscoder/file/util.hpp +++ b/src/AvTranscoder/file/util.hpp @@ -9,8 +9,9 @@ namespace avtranscoder */ enum EAnalyseLevel { - eAnalyseLevelFast = 0, - eAnalyseLevelFull = 0, + eAnalyseLevelHeader = 0, + eAnalyseLevelFirstGop = 1, + //eAnalyseLevelFull = 2, }; } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 7df9a033..0adc3bbc 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -50,7 +50,7 @@ VideoProperties::VideoProperties( const AVFormatContext* formatContext, const si _pixFmt = &av_pix_fmt_descriptors[ _codecContext->pix_fmt ]; #endif - if( level == eAnalyseLevelFull ) + if( level == eAnalyseLevelFirstGop ) analyseGopStructure( progress ); } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 1dcbdd0b..77382f42 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -30,7 +30,7 @@ class AvExport VideoProperties { public: VideoProperties(); - VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFull ); + VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); std::string getCodecName() const; std::string getCodecLongName() const; diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 7b601b1e..d51e7d25 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -384,7 +384,7 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s // Create profile as input configuration NoDisplayProgress progress; - referenceFile->analyse( progress, eAnalyseLevelFast ); + referenceFile->analyse( progress, eAnalyseLevelHeader ); AudioProperties audioProperties = referenceFile->getProperties().getAudioProperties().at( streamIndex ); ProfileLoader::Profile profile; From 7157c0a43834818bca9cc90ce18182cc2c93e88b Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 18:43:59 +0100 Subject: [PATCH 09/64] Swig: add file interface --- src/AvTranscoder/avTranscoder.i | 7 +------ src/AvTranscoder/file/file.i | 8 ++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 src/AvTranscoder/file/file.i diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index ea402a74..8b1de900 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -39,9 +39,6 @@ #include #include -#include -#include - #include #include %} @@ -54,6 +51,7 @@ namespace std { %include "AvTranscoder/progress/progress.i" %include "AvTranscoder/mediaProperty/mediaProperty.i" +%include "AvTranscoder/file/file.i" %include @@ -81,8 +79,5 @@ namespace std { %include %include -%include -%include - %include %include diff --git a/src/AvTranscoder/file/file.i b/src/AvTranscoder/file/file.i new file mode 100644 index 00000000..be1e652c --- /dev/null +++ b/src/AvTranscoder/file/file.i @@ -0,0 +1,8 @@ +%{ +#include +#include +%} + +%include +%include + From 9cb1b2d3d680aaa7a1067681db39a66a6aa9e699 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:19:15 +0100 Subject: [PATCH 10/64] InputFile: refactore analyse Split properties nstantiation into 2 lines: better for debugging with breakpoint and easier to read. --- src/AvTranscoder/file/InputFile.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 031ceb44..e957c473 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -79,32 +79,38 @@ InputFile& InputFile::analyse( IProgress& progress, const EAnalyseLevel level ) { case AVMEDIA_TYPE_VIDEO: { - _properties.getVideoProperties().push_back( VideoProperties( _formatContext, streamId, progress, level ) ); + VideoProperties properties( _formatContext, streamId, progress, level ); + _properties.getVideoProperties().push_back( properties ); break; } case AVMEDIA_TYPE_AUDIO: { - _properties.getAudioProperties().push_back( AudioProperties( _formatContext, streamId ) ); + AudioProperties properties( _formatContext, streamId ); + _properties.getAudioProperties().push_back( properties ); break; } case AVMEDIA_TYPE_DATA: { - _properties.getDataProperties().push_back( DataProperties( _formatContext, streamId ) ); + DataProperties properties( _formatContext, streamId ); + _properties.getDataProperties().push_back( properties ); break; } case AVMEDIA_TYPE_SUBTITLE: { - _properties.getSubtitleProperties().push_back( SubtitleProperties( _formatContext, streamId ) ); + SubtitleProperties properties( _formatContext, streamId ); + _properties.getSubtitleProperties().push_back( properties ); break; } case AVMEDIA_TYPE_ATTACHMENT: { - _properties.getAttachementProperties().push_back( AttachementProperties( _formatContext, streamId ) ); + AttachementProperties properties( _formatContext, streamId ); + _properties.getAttachementProperties().push_back( properties ); break; } case AVMEDIA_TYPE_UNKNOWN: { - _properties.getUnknownPropertiesProperties().push_back( UnknownProperties( _formatContext, streamId ) ); + UnknownProperties properties( _formatContext, streamId ); + _properties.getUnknownPropertiesProperties().push_back( properties ); break; } case AVMEDIA_TYPE_NB: From 2918b40fbd853faa401c71942c0403d61a2384a9 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:38:04 +0100 Subject: [PATCH 11/64] mediaProperty: remove default constructors of Properties Need to add directives in SWIG interface to explicitly remove vector's methods which need the default constructor. --- .../mediaProperty/AttachementProperties.cpp | 5 ----- .../mediaProperty/AttachementProperties.hpp | 1 - .../mediaProperty/AudioProperties.cpp | 6 ------ .../mediaProperty/AudioProperties.hpp | 1 - .../mediaProperty/DataProperties.cpp | 5 ----- .../mediaProperty/DataProperties.hpp | 1 - .../mediaProperty/SubtitleProperties.cpp | 5 ----- .../mediaProperty/SubtitleProperties.hpp | 1 - .../mediaProperty/UnknownProperties.cpp | 5 ----- .../mediaProperty/UnknownProperties.hpp | 1 - .../mediaProperty/VideoProperties.cpp | 10 ---------- .../mediaProperty/VideoProperties.hpp | 1 - src/AvTranscoder/mediaProperty/mediaProperty.i | 16 ++++++++++++++++ 13 files changed, 16 insertions(+), 42 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp index 24026639..1a261077 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp @@ -3,11 +3,6 @@ namespace avtranscoder { -AttachementProperties::AttachementProperties() - : _formatContext( NULL ) - , _streamId( 0 ) -{} - AttachementProperties::AttachementProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index 5bd144f2..9e5755ef 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -14,7 +14,6 @@ namespace avtranscoder class AvExport AttachementProperties { public: - AttachementProperties(); AttachementProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 233f6ea8..28d279d5 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -11,12 +11,6 @@ extern "C" { namespace avtranscoder { -AudioProperties::AudioProperties() - : _formatContext( NULL ) - , _codecContext( NULL ) - , _streamId( 0 ) -{} - AudioProperties::AudioProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _codecContext( formatContext->streams[index]->codec ) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index e8eb73ab..376edfbb 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -19,7 +19,6 @@ namespace avtranscoder class AvExport AudioProperties { public: - AudioProperties(); AudioProperties( const AVFormatContext* formatContext, const size_t index ); std::string getCodecName() const; diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/mediaProperty/DataProperties.cpp index 7370501a..5bf3fd49 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.cpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.cpp @@ -12,11 +12,6 @@ extern "C" { namespace avtranscoder { -DataProperties::DataProperties() - : _formatContext( NULL ) - , _streamId( 0 ) -{} - DataProperties::DataProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index dec05520..658f84a6 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -14,7 +14,6 @@ namespace avtranscoder class AvExport DataProperties { public: - DataProperties(); DataProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp index fc9157e2..dc592648 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp @@ -3,11 +3,6 @@ namespace avtranscoder { -SubtitleProperties::SubtitleProperties() - : _formatContext( NULL ) - , _streamId( 0 ) -{} - SubtitleProperties::SubtitleProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index 717ccb95..b08f69c8 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -14,7 +14,6 @@ namespace avtranscoder class AvExport SubtitleProperties { public: - SubtitleProperties(); SubtitleProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp index 0d115d5f..064f0cc7 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp @@ -3,11 +3,6 @@ namespace avtranscoder { -UnknownProperties::UnknownProperties() - : _formatContext( NULL ) - , _streamId( 0 ) -{} - UnknownProperties::UnknownProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index b6c39711..3e07a357 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -14,7 +14,6 @@ namespace avtranscoder class AvExport UnknownProperties { public: - UnknownProperties(); UnknownProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 0adc3bbc..123351cc 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -19,16 +19,6 @@ extern "C" { namespace avtranscoder { -VideoProperties::VideoProperties() - : _formatContext( NULL ) - , _codecContext( NULL ) - , _pixFmt( NULL ) - , _streamId( 0 ) - , _isInterlaced( false ) - , _isTopFieldFirst( false ) - , _gopStructure() -{} - VideoProperties::VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level ) : _formatContext( formatContext ) , _codecContext( formatContext->streams[index]->codec ) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 77382f42..8bb1eb1d 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -29,7 +29,6 @@ struct AvExport Channel class AvExport VideoProperties { public: - VideoProperties(); VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); std::string getCodecName() const; diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i index 41c628a5..071d2f82 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -13,6 +13,22 @@ using namespace avtranscoder; %} namespace std { + +// Allow vector of object with no default constructor +%ignore vector< avtranscoder::VideoProperties >::vector(size_type); +%ignore vector< avtranscoder::VideoProperties >::resize; +%ignore vector< avtranscoder::AudioProperties >::vector(size_type); +%ignore vector< avtranscoder::AudioProperties >::resize; +%ignore vector< avtranscoder::DataProperties >::vector(size_type); +%ignore vector< avtranscoder::DataProperties >::resize; +%ignore vector< avtranscoder::SubtitleProperties >::vector(size_type); +%ignore vector< avtranscoder::SubtitleProperties >::resize; +%ignore vector< avtranscoder::AttachementProperties >::vector(size_type); +%ignore vector< avtranscoder::AttachementProperties >::resize; +%ignore vector< avtranscoder::UnknownProperties >::vector(size_type); +%ignore vector< avtranscoder::UnknownProperties >::resize; + +// Create instantiations of a template classes %template(VideoVector) vector< avtranscoder::VideoProperties >; %template(AudioVector) vector< avtranscoder::AudioProperties >; %template(DataVector) vector< avtranscoder::DataProperties >; From 8df49bd40da8e5cac188ecce1549a3b9eb808b50 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:46:09 +0100 Subject: [PATCH 12/64] AudioProperties: get AVCodec attribute This removes multi call to avcodec_find_decoder(). --- .../mediaProperty/AudioProperties.cpp | 16 +++++++++------- .../mediaProperty/AudioProperties.hpp | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 28d279d5..90c18974 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -14,23 +14,25 @@ namespace avtranscoder AudioProperties::AudioProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _codecContext( formatContext->streams[index]->codec ) + , _codec( NULL ) , _streamId( index ) -{} +{ + if( _formatContext && _codecContext ) + _codec = avcodec_find_decoder( _codecContext->codec_id ); +} std::string AudioProperties::getCodecName() const { - AVCodec* codec = avcodec_find_decoder( _codecContext->codec_id ); - if( codec != NULL ) - return std::string( codec->name ); + if( _codec && _codec->name ) + return std::string( _codec->name ); else return "unknown codec"; } std::string AudioProperties::getCodecLongName() const { - AVCodec* codec = avcodec_find_decoder( _codecContext->codec_id ); - if( codec != NULL ) - return std::string( codec->long_name ); + if( _codec && _codec->long_name ) + return std::string( _codec->long_name ); return "unknown codec"; } diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index 376edfbb..bc2165f3 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -43,6 +43,7 @@ class AvExport AudioProperties private: const AVFormatContext* _formatContext; ///< Has link (no ownership) AVCodecContext* _codecContext; ///< Has link (no ownership) + AVCodec* _codec; ///< Has link (no ownership) size_t _streamId; MetadatasMap _metadatas; From 129a8d17a399dde1df352507dbd0fde93ae2ec30 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:47:50 +0100 Subject: [PATCH 13/64] AudioProperties: check formatContext/codecContext/codec pointers --- .../mediaProperty/AudioProperties.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 90c18974..37399709 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -13,10 +13,13 @@ namespace avtranscoder AudioProperties::AudioProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) - , _codecContext( formatContext->streams[index]->codec ) + , _codecContext( NULL ) , _codec( NULL ) , _streamId( index ) { + if( _formatContext ) + _codecContext = formatContext->streams[index]->codec; + if( _formatContext && _codecContext ) _codec = avcodec_find_decoder( _codecContext->codec_id ); } @@ -38,6 +41,9 @@ std::string AudioProperties::getCodecLongName() const std::string AudioProperties::getSampleFormatName() const { + if( ! _codecContext ) + return "unknown codec context"; + const char* fmtName = av_get_sample_fmt_name( _codecContext->sample_fmt ); if( fmtName ) return std::string( fmtName ); @@ -46,6 +52,9 @@ std::string AudioProperties::getSampleFormatName() const std::string AudioProperties::getSampleFormatLongName() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->sample_fmt ) { case AV_SAMPLE_FMT_NONE: @@ -78,6 +87,9 @@ std::string AudioProperties::getSampleFormatLongName() const std::string AudioProperties::getChannelLayout() const { + if( ! _codecContext ) + return "unknown codec context"; + char buf1[1024]; av_get_channel_layout_string( buf1, sizeof( buf1 ), -1, _codecContext->channel_layout ); return std::string( buf1 ); @@ -85,6 +97,9 @@ std::string AudioProperties::getChannelLayout() const std::string AudioProperties::getChannelName() const { + if( ! _codecContext ) + return "unknown codec context"; + const char* channelName = av_get_channel_name( _codecContext->channel_layout ); if( channelName ) return std::string( channelName ); @@ -93,6 +108,9 @@ std::string AudioProperties::getChannelName() const std::string AudioProperties::getChannelDescription() const { + if( ! _codecContext ) + return "unknown codec context"; + #ifdef FF_RESAMPLE_LIBRARY const char* channelDescription = av_get_channel_description( _codecContext->channel_layout ); if( channelDescription ) From 104451ed7fb1b364767b31d4cddc195a7499a1b5 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:50:41 +0100 Subject: [PATCH 14/64] AudioProperties: clean format result of getSampleFormatLongName * small case. * without point. --- src/AvTranscoder/mediaProperty/AudioProperties.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 37399709..95233df0 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -80,7 +80,7 @@ std::string AudioProperties::getSampleFormatLongName() const case AV_SAMPLE_FMT_DBLP: return "double, planar"; case AV_SAMPLE_FMT_NB: - return "Number of sample formats."; + return "number of sample formats"; } return "unknown sample format"; } From 9fe135976af2747ad8da504e5de355f946d664e2 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 14:51:18 +0100 Subject: [PATCH 15/64] AudioProperties: clean getChannelDescription Clean preprocessor instructions. --- src/AvTranscoder/mediaProperty/AudioProperties.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 95233df0..2bf90066 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -116,8 +116,9 @@ std::string AudioProperties::getChannelDescription() const if( channelDescription ) return std::string( channelDescription ); return "unknown channel description"; -#endif +#else return "can't access channel description"; +#endif } MetadatasMap AudioProperties::getDataMap() const From e967cdc0332493a6c2b332f110dae9ff120b21de Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 15:05:16 +0100 Subject: [PATCH 16/64] VideoProperties: get AVCodec attribute This removes multi call to avcodec_find_decoder(). --- .../mediaProperty/VideoProperties.cpp | 39 +++++++++++-------- .../mediaProperty/VideoProperties.hpp | 1 + 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 123351cc..679f42a4 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -21,13 +21,20 @@ namespace avtranscoder VideoProperties::VideoProperties( const AVFormatContext* formatContext, const size_t index, IProgress& progress, const EAnalyseLevel level ) : _formatContext( formatContext ) - , _codecContext( formatContext->streams[index]->codec ) + , _codecContext( NULL ) + , _codec( NULL ) , _pixFmt( NULL ) , _streamId( index ) , _isInterlaced( false ) , _isTopFieldFirst( false ) , _gopStructure() { + if( _formatContext ) + _codecContext = formatContext->streams[index]->codec; + + if( _formatContext && _codecContext ) + _codec = avcodec_find_decoder( _codecContext->codec_id ); + // Skip decoding for selected frames _codecContext->skip_frame = AVDISCARD_NONE; @@ -46,42 +53,41 @@ VideoProperties::VideoProperties( const AVFormatContext* formatContext, const si std::string VideoProperties::getCodecName() const { - AVCodec* codec = NULL; - if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + if( _codecContext && _codec ) { - if( codec->capabilities & CODEC_CAP_TRUNCATED ) + if( _codec->capabilities & CODEC_CAP_TRUNCATED ) _codecContext->flags|= CODEC_FLAG_TRUNCATED; - return std::string( codec->name ); + if( _codec->name ) + return std::string( _codec->name ); } return "unknown codec"; } std::string VideoProperties::getCodecLongName() const { - AVCodec* codec = NULL; - if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + if( _codecContext && _codec ) { - if( codec->capabilities & CODEC_CAP_TRUNCATED ) + if( _codec->capabilities & CODEC_CAP_TRUNCATED ) _codecContext->flags|= CODEC_FLAG_TRUNCATED; - return std::string( codec->long_name ); + if( _codec->long_name ) + return std::string( _codec->long_name ); } return "unknown codec"; } std::string VideoProperties::getProfileName() const { - AVCodec* codec = NULL; - if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + if( _codecContext && _codec ) { - if( codec->capabilities & CODEC_CAP_TRUNCATED ) + if( _codec->capabilities & CODEC_CAP_TRUNCATED ) _codecContext->flags|= CODEC_FLAG_TRUNCATED; if( _codecContext->profile != -99 ) { const char* profile; - if( ( profile = av_get_profile_name( codec, _codecContext->profile ) ) != NULL ) + if( ( profile = av_get_profile_name( _codec, _codecContext->profile ) ) != NULL ) return std::string( profile ); } } @@ -363,10 +369,9 @@ bool VideoProperties::hasAlpha() const void VideoProperties::analyseGopStructure( IProgress& progress ) { - AVCodec* codec = NULL; - if( ( codec = avcodec_find_decoder( _codecContext->codec_id ) ) != NULL ) + if( _formatContext && _codecContext && _codec ) { - if( codec->capabilities & CODEC_CAP_TRUNCATED ) + if( _codec->capabilities & CODEC_CAP_TRUNCATED ) _codecContext->flags|= CODEC_FLAG_TRUNCATED; if( _codecContext->width && _codecContext->height ) @@ -380,7 +385,7 @@ void VideoProperties::analyseGopStructure( IProgress& progress ) #endif av_init_packet( &pkt ); - avcodec_open2( _codecContext, codec, NULL ); + avcodec_open2( _codecContext, _codec, NULL ); int count = 0; int gotFrame = 0; diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 8bb1eb1d..626efafb 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -109,6 +109,7 @@ class AvExport VideoProperties private: const AVFormatContext* _formatContext; ///< Has link (no ownership) AVCodecContext* _codecContext; ///< Has link (no ownership) + AVCodec* _codec; ///< Has link (no ownership) const AVPixFmtDescriptor* _pixFmt; ///< Has link (no ownership) size_t _streamId; From 86b2d8ab508e281f14b67e7bec8e5fe8d17c64dc Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 15:28:50 +0100 Subject: [PATCH 17/64] VideoProperties: check formatContext/codecContext/codec pointers * If can't acces the data: * return an error (a particular string for example). * or throw a runtime exception if no way to return an error. --- .../mediaProperty/VideoProperties.cpp | 238 +++++++++++++++++- .../mediaProperty/VideoProperties.hpp | 46 ++-- 2 files changed, 253 insertions(+), 31 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 679f42a4..e94d295a 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -6,6 +6,7 @@ extern "C" { #include } +#include #include #include #include @@ -42,7 +43,6 @@ VideoProperties::VideoProperties( const AVFormatContext* formatContext, const si #if LIBAVUTIL_VERSION_MAJOR > 51 _pixFmt = av_pix_fmt_desc_get( _codecContext->pix_fmt ); #else - _pixFmt = NULL; if( _codecContext->pix_fmt >= 0 && _codecContext->pix_fmt < PIX_FMT_NB ) _pixFmt = &av_pix_fmt_descriptors[ _codecContext->pix_fmt ]; #endif @@ -96,6 +96,9 @@ std::string VideoProperties::getProfileName() const std::string VideoProperties::getColorTransfert() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->color_trc ) { case AVCOL_TRC_BT709: @@ -157,6 +160,9 @@ std::string VideoProperties::getColorTransfert() const std::string VideoProperties::getColorspace() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->colorspace ) { case AVCOL_SPC_RGB: @@ -199,6 +205,9 @@ std::string VideoProperties::getColorspace() const std::string VideoProperties::getColorRange() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->color_range ) { case AVCOL_RANGE_UNSPECIFIED: @@ -216,6 +225,9 @@ std::string VideoProperties::getColorRange() const std::string VideoProperties::getColorPrimaries() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->color_primaries ) { case AVCOL_PRI_BT709: @@ -247,6 +259,9 @@ std::string VideoProperties::getColorPrimaries() const std::string VideoProperties::getChromaSampleLocation() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->chroma_sample_location ) { case AVCHROMA_LOC_UNSPECIFIED: @@ -272,6 +287,9 @@ std::string VideoProperties::getChromaSampleLocation() const std::string VideoProperties::getFieldOrder() const { + if( ! _codecContext ) + return "unknown codec context"; + switch( _codecContext->field_order ) { case AV_FIELD_UNKNOWN: @@ -291,9 +309,27 @@ std::string VideoProperties::getFieldOrder() const } } +std::string VideoProperties::getPixelName() const +{ + if( _pixFmt && _pixFmt->name ) + return std::string( _pixFmt->name ); + return "unknown pixel name"; +} + std::string VideoProperties::getEndianess() const { - return ( _pixFmt->flags & PIX_FMT_BE ) ? "big" : "little"; + if( _pixFmt ) + return ( _pixFmt->flags & PIX_FMT_BE ) ? "big" : "little"; + return "unknown pixel format"; +} + + +int64_t VideoProperties::getStartTimecode() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->timecode_frame_start; } std::string VideoProperties::getStartTimecodeString() const @@ -312,6 +348,9 @@ std::string VideoProperties::getStartTimecodeString() const Rational VideoProperties::getTimeBase() const { + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + Rational timeBase; timeBase.num = _codecContext->time_base.num; timeBase.den = _codecContext->time_base.den; @@ -320,6 +359,9 @@ Rational VideoProperties::getTimeBase() const Rational VideoProperties::getSar() const { + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + Rational sar; sar.num = _codecContext->sample_aspect_ratio.num; sar.den = _codecContext->sample_aspect_ratio.den; @@ -328,6 +370,9 @@ Rational VideoProperties::getSar() const Rational VideoProperties::getDar() const { + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + int darNum, darDen; av_reduce( &darNum, &darDen, _codecContext->width * getSar().num, @@ -340,6 +385,126 @@ Rational VideoProperties::getDar() const return dar; } +size_t VideoProperties::getCodecId() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->codec_id; +} + +size_t VideoProperties::getBitRate() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->bit_rate; +} + +size_t VideoProperties::getMaxBitRate() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->rc_max_rate; +} + +size_t VideoProperties::getMinBitRate() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->rc_min_rate; +} + +size_t VideoProperties::getTicksPerFrame() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->ticks_per_frame; +} + +size_t VideoProperties::getWidth() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->width; +} + +size_t VideoProperties::getHeight() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->height; +} + +size_t VideoProperties::getGopSize() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->gop_size; +} + +size_t VideoProperties::getDtgActiveFormat() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->dtg_active_format; +} + +size_t VideoProperties::getReferencesFrames() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->refs; +} + +int VideoProperties::getProfile() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->profile; +} + +int VideoProperties::getLevel() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return _codecContext->level; +} + +size_t VideoProperties::getComponentsCount() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return _pixFmt->nb_components; +} + +size_t VideoProperties::getChromaWidth() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return _pixFmt->log2_chroma_w; +} + +size_t VideoProperties::getChromaHeight() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return _pixFmt->log2_chroma_h; +} + double VideoProperties::getFps() const { Rational timeBase = getTimeBase(); @@ -349,8 +514,59 @@ double VideoProperties::getFps() const return fps; } +bool VideoProperties::hasBFrames() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + + return (bool) _codecContext->has_b_frames; +} + +bool VideoProperties::isIndexedColors() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return (bool) _pixFmt->flags & PIX_FMT_PAL; +} + +bool VideoProperties::isBitWisePacked() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return (bool) _pixFmt->flags & PIX_FMT_BITSTREAM; +} + +bool VideoProperties::isHardwareAccelerated() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return (bool) _pixFmt->flags & PIX_FMT_HWACCEL; +} + +bool VideoProperties::isPlanar() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return (bool) _pixFmt->flags & PIX_FMT_PLANAR; +} + +bool VideoProperties::isRgbPixelData() const +{ + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + + return (bool) _pixFmt->flags & PIX_FMT_RGB; +} + bool VideoProperties::isPseudoPaletted() const { + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + #if LIBAVCODEC_VERSION_MAJOR > 53 return (bool) _pixFmt->flags & PIX_FMT_PSEUDOPAL; #else @@ -360,6 +576,9 @@ bool VideoProperties::isPseudoPaletted() const bool VideoProperties::hasAlpha() const { + if( ! _pixFmt ) + throw std::runtime_error( "unknown pixel format" ); + #if LIBAVCODEC_VERSION_MAJOR > 53 return (bool) _pixFmt->flags & PIX_FMT_ALPHA; #else @@ -433,13 +652,16 @@ void VideoProperties::analyseGopStructure( IProgress& progress ) std::vector VideoProperties::getChannels() const { std::vector channels; - for( size_t channel = 0; channel < (size_t)_pixFmt->nb_components; ++channel ) + if( _pixFmt ) { - Channel c; - c.id = channel; - c.chromaHeight = (size_t)_pixFmt->comp[channel].plane; - c.bitStep = (size_t)_pixFmt->comp[channel].step_minus1; - channels.push_back( c ); + for( size_t channel = 0; channel < (size_t)_pixFmt->nb_components; ++channel ) + { + Channel c; + c.id = channel; + c.chromaHeight = (size_t)_pixFmt->comp[channel].plane; + c.bitStep = (size_t)_pixFmt->comp[channel].step_minus1; + channels.push_back( c ); + } } return channels; } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 626efafb..f5143d45 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -41,10 +41,10 @@ class AvExport VideoProperties std::string getChromaSampleLocation() const; std::string getFieldOrder() const; - std::string getPixelName() const { return _pixFmt->name; } + std::string getPixelName() const; std::string getEndianess() const; - int64_t getStartTimecode() const { return _codecContext->timecode_frame_start; } + int64_t getStartTimecode() const; std::string getStartTimecodeString() const; Rational getTimeBase() const; @@ -52,30 +52,30 @@ class AvExport VideoProperties Rational getDar() const; // display aspect ratio size_t getStreamId() const { return _streamId; } - size_t getCodecId() const { return _codecContext->codec_id; } - size_t getBitRate() const { return _codecContext->bit_rate; } - size_t getMaxBitRate() const { return _codecContext->rc_max_rate; } - size_t getMinBitRate() const { return _codecContext->rc_min_rate; } - size_t getTicksPerFrame() const { return _codecContext->ticks_per_frame; } - size_t getWidth() const { return _codecContext->width; } - size_t getHeight() const { return _codecContext->height; } - size_t getGopSize() const { return _codecContext->gop_size; } - size_t getDtgActiveFormat() const { return _codecContext->dtg_active_format; } - size_t getReferencesFrames() const { return _codecContext->refs; } - int getProfile() const { return _codecContext->profile; } - int getLevel() const { return _codecContext->level; } - size_t getComponentsCount() const { return _pixFmt->nb_components; } - size_t getChromaWidth() const { return _pixFmt->log2_chroma_w; } - size_t getChromaHeight() const { return _pixFmt->log2_chroma_h; } + size_t getCodecId() const; + size_t getBitRate() const; + size_t getMaxBitRate() const; + size_t getMinBitRate() const; + size_t getTicksPerFrame() const; + size_t getWidth() const; + size_t getHeight() const; + size_t getGopSize() const; + size_t getDtgActiveFormat() const; + size_t getReferencesFrames() const; + int getProfile() const; + int getLevel() const; + size_t getComponentsCount() const; + size_t getChromaWidth() const; + size_t getChromaHeight() const; double getFps() const; - bool hasBFrames() const { return (bool) _codecContext->has_b_frames; } - bool isIndexedColors() const { return (bool) _pixFmt->flags & PIX_FMT_PAL; } - bool isBitWisePacked() const { return (bool) _pixFmt->flags & PIX_FMT_BITSTREAM; } - bool isHardwareAccelerated() const { return (bool) _pixFmt->flags & PIX_FMT_HWACCEL; } - bool isPlanar() const { return (bool) _pixFmt->flags & PIX_FMT_PLANAR; } - bool isRgbPixelData() const { return (bool) _pixFmt->flags & PIX_FMT_RGB; } + bool hasBFrames() const; + bool isIndexedColors() const; + bool isBitWisePacked() const; + bool isHardwareAccelerated() const; + bool isPlanar() const; + bool isRgbPixelData() const; bool isPseudoPaletted() const; bool hasAlpha() const; From 2200f088a533a2d4d7c1bd12d02f7fb3d2e92c6e Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 15:46:00 +0100 Subject: [PATCH 18/64] VideoProperties: use class initialiser list for Rational Avoid to call default constructor and set each attributes. --- .../mediaProperty/VideoProperties.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index e94d295a..bf7d13d7 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -351,9 +351,10 @@ Rational VideoProperties::getTimeBase() const if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - Rational timeBase; - timeBase.num = _codecContext->time_base.num; - timeBase.den = _codecContext->time_base.den; + Rational timeBase = { + _codecContext->time_base.num, + _codecContext->time_base.den, + }; return timeBase; } @@ -362,9 +363,10 @@ Rational VideoProperties::getSar() const if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - Rational sar; - sar.num = _codecContext->sample_aspect_ratio.num; - sar.den = _codecContext->sample_aspect_ratio.den; + Rational sar = { + _codecContext->sample_aspect_ratio.num, + _codecContext->sample_aspect_ratio.den, + }; return sar; } @@ -379,9 +381,10 @@ Rational VideoProperties::getDar() const _codecContext->height * getSar().den, 1024 * 1024); - Rational dar; - dar.num = darNum; - dar.den = darDen; + Rational dar = { + darNum, + darDen, + }; return dar; } From 7e165509804db14371286a2968407f47797eeb25 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 17:40:57 +0100 Subject: [PATCH 19/64] mediaProperty: clean output formatting of getDataMap * Camel case. * No spaces. --- .../mediaProperty/AudioProperties.cpp | 22 +++---- .../mediaProperty/FileProperties.cpp | 22 +++---- .../mediaProperty/VideoProperties.cpp | 58 +++++++++---------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 2bf90066..284a850b 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -125,18 +125,18 @@ MetadatasMap AudioProperties::getDataMap() const { MetadatasMap dataMap; - detail::add( dataMap, "stream id", getStreamId() ); - detail::add( dataMap, "codec id", getCodecId() ); - detail::add( dataMap, "codec name", getCodecName() ); - detail::add( dataMap, "codec long name", getCodecLongName() ); - detail::add( dataMap, "sample format name", getSampleFormatName() ); - detail::add( dataMap, "sample format long name", getSampleFormatLongName() ); - detail::add( dataMap, "sample rate", getSampleRate() ); - detail::add( dataMap, "bit rate", getBitRate() ); + detail::add( dataMap, "streamId", getStreamId() ); + detail::add( dataMap, "codecId", getCodecId() ); + detail::add( dataMap, "codecName", getCodecName() ); + detail::add( dataMap, "codecLongName", getCodecLongName() ); + detail::add( dataMap, "sampleFormatName", getSampleFormatName() ); + detail::add( dataMap, "sampleFormatLongName", getSampleFormatLongName() ); + detail::add( dataMap, "sampleRate", getSampleRate() ); + detail::add( dataMap, "bitRate", getBitRate() ); detail::add( dataMap, "channels", getChannels() ); - detail::add( dataMap, "channel layout", getChannelLayout() ); - detail::add( dataMap, "channel name", getChannelName() ); - detail::add( dataMap, "channel description", getChannelDescription() ); + detail::add( dataMap, "channelLayout", getChannelLayout() ); + detail::add( dataMap, "channelName", getChannelName() ); + detail::add( dataMap, "channelDescription", getChannelDescription() ); for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) { diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/mediaProperty/FileProperties.cpp index 23158ac1..4636ca91 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.cpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.cpp @@ -22,20 +22,20 @@ MetadatasMap FileProperties::getDataMap() const MetadatasMap dataMap; detail::add( dataMap, "filename", getFilename() ); - detail::add( dataMap, "format name", getFormatName() ); - detail::add( dataMap, "format long name", getFormatLongName() ); + detail::add( dataMap, "formatName", getFormatName() ); + detail::add( dataMap, "formatLongName", getFormatLongName() ); - detail::add( dataMap, "start time", getStartTime() ); + detail::add( dataMap, "startTime", getStartTime() ); detail::add( dataMap, "duration", getDuration() ); detail::add( dataMap, "bitrate", getBitRate() ); - detail::add( dataMap, "number of streams", getNbStreams() ); - detail::add( dataMap, "number of programs", getProgramsCount() ); - detail::add( dataMap, "number of video streams", getNbVideoStreams() ); - detail::add( dataMap, "number of audio streams", getNbAudioStreams() ); - detail::add( dataMap, "number of data streams", getNbDataStreams() ); - detail::add( dataMap, "number of subtitle streams", getNbSubtitleStreams() ); - detail::add( dataMap, "number of attachement streams", getNbAttachementStreams() ); - detail::add( dataMap, "number of unknown streams", getNbUnknownStreams() ); + detail::add( dataMap, "numberOfStreams", getNbStreams() ); + detail::add( dataMap, "numberOfPrograms", getProgramsCount() ); + detail::add( dataMap, "numberOfVideoStreams", getNbVideoStreams() ); + detail::add( dataMap, "numberOfAudioStreams", getNbAudioStreams() ); + detail::add( dataMap, "numberOfDataStreams", getNbDataStreams() ); + detail::add( dataMap, "numberOfSubtitleStreams", getNbSubtitleStreams() ); + detail::add( dataMap, "numberOfAttachementStreams", getNbAttachementStreams() ); + detail::add( dataMap, "numberOfUnknownStreams", getNbUnknownStreams() ); for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) { diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index bf7d13d7..59033fab 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -673,44 +673,44 @@ MetadatasMap VideoProperties::getDataMap() const { MetadatasMap dataMap; - detail::add( dataMap, "stream id", getStreamId() ); - detail::add( dataMap, "codec id", getCodecId() ); - detail::add( dataMap, "codec name", getCodecName() ); - detail::add( dataMap, "codec long name", getCodecLongName() ); + detail::add( dataMap, "streamId", getStreamId() ); + detail::add( dataMap, "codecId", getCodecId() ); + detail::add( dataMap, "codecName", getCodecName() ); + detail::add( dataMap, "codecLongName", getCodecLongName() ); detail::add( dataMap, "profile", getProfile() ); - detail::add( dataMap, "profile name", getProfileName() ); + detail::add( dataMap, "profileName", getProfileName() ); detail::add( dataMap, "level", getLevel() ); - detail::add( dataMap, "start timecode", getStartTimecode() ); + detail::add( dataMap, "startTimecode", getStartTimecode() ); detail::add( dataMap, "width", getWidth() ); detail::add( dataMap, "height", getHeight() ); - detail::add( dataMap, "pixel aspect ratio", getSar().num / getSar().den ); - detail::add( dataMap, "display aspect ratio", getDar().num / getDar().den ); + detail::add( dataMap, "pixelAspectRatio", getSar().num / getSar().den ); + detail::add( dataMap, "displayAspectRatio", getDar().num / getDar().den ); detail::add( dataMap, "dtgActiveFormat", getDtgActiveFormat() ); - detail::add( dataMap, "components count", getComponentsCount() ); - detail::add( dataMap, "pixel type", getPixelName() ); - detail::add( dataMap, "bit wise acked", isBitWisePacked() ); - detail::add( dataMap, "rgb pixel", isRgbPixelData() ); - detail::add( dataMap, "as alpha", hasAlpha() ); - detail::add( dataMap, "chroma width", getChromaWidth() ); - detail::add( dataMap, "chroma height", getChromaHeight() ); + detail::add( dataMap, "componentsCount", getComponentsCount() ); + detail::add( dataMap, "pixelType", getPixelName() ); + detail::add( dataMap, "bitWiseAcked", isBitWisePacked() ); + detail::add( dataMap, "rgbPixel", isRgbPixelData() ); + detail::add( dataMap, "asAlpha", hasAlpha() ); + detail::add( dataMap, "chromaWidth", getChromaWidth() ); + detail::add( dataMap, "chromaHeight", getChromaHeight() ); detail::add( dataMap, "endianess", getEndianess() ); - detail::add( dataMap, "color transfert", getColorTransfert() ); + detail::add( dataMap, "colorTransfert", getColorTransfert() ); detail::add( dataMap, "colorspace", getColorspace() ); - detail::add( dataMap, "color range", getColorRange() ); - detail::add( dataMap, "color primaries", getColorPrimaries() ); - detail::add( dataMap, "indexed colors", isIndexedColors() ); - detail::add( dataMap, "pseudo paletted", isPseudoPaletted() ); - detail::add( dataMap, "chroma sample location", getChromaSampleLocation() ); + detail::add( dataMap, "colorRange", getColorRange() ); + detail::add( dataMap, "colorPrimaries", getColorPrimaries() ); + detail::add( dataMap, "indexedColors", isIndexedColors() ); + detail::add( dataMap, "pseudoPaletted", isPseudoPaletted() ); + detail::add( dataMap, "chromaSampleLocation", getChromaSampleLocation() ); detail::add( dataMap, "interlaced ", isInterlaced() ); - detail::add( dataMap, "top field first", isTopFieldFirst() ); - detail::add( dataMap, "field order", getFieldOrder() ); + detail::add( dataMap, "topFieldFirst", isTopFieldFirst() ); + detail::add( dataMap, "fieldOrder", getFieldOrder() ); detail::add( dataMap, "timeBase", getTimeBase().num / getTimeBase().den ); detail::add( dataMap, "fps", getFps() ); detail::add( dataMap, "ticksPerFrame", getTicksPerFrame() ); - detail::add( dataMap, "bit rate", getBitRate() ); - detail::add( dataMap, "max bit rate", getMaxBitRate() ); - detail::add( dataMap, "min bit rate", getMinBitRate() ); - detail::add( dataMap, "gop size", getGopSize() ); + detail::add( dataMap, "bitRate", getBitRate() ); + detail::add( dataMap, "maxBitRate", getMaxBitRate() ); + detail::add( dataMap, "minBitRate", getMinBitRate() ); + detail::add( dataMap, "gopSize", getGopSize() ); std::string gop; NoDisplayProgress progress; @@ -722,8 +722,8 @@ MetadatasMap VideoProperties::getDataMap() const } detail::add( dataMap, "gop", gop ); - detail::add( dataMap, "has B frames", hasBFrames() ); - detail::add( dataMap, "references frames", getReferencesFrames() ); + detail::add( dataMap, "hasBFrames", hasBFrames() ); + detail::add( dataMap, "referencesFrames", getReferencesFrames() ); for( size_t metadataIndex = 0; metadataIndex < _metadatas.size(); ++metadataIndex ) { From 802004d163c560df08fa112b8d64fc5da96cc8f4 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 17 Nov 2014 18:52:10 +0100 Subject: [PATCH 20/64] mediaProperty: fillMetadataDictionnary in constructor --- src/AvTranscoder/mediaProperty/AttachementProperties.cpp | 5 ++++- src/AvTranscoder/mediaProperty/AudioProperties.cpp | 3 +++ src/AvTranscoder/mediaProperty/DataProperties.cpp | 3 +++ src/AvTranscoder/mediaProperty/SubtitleProperties.cpp | 5 ++++- src/AvTranscoder/mediaProperty/UnknownProperties.cpp | 5 ++++- src/AvTranscoder/mediaProperty/VideoProperties.cpp | 3 +++ 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp index 1a261077..0250d986 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp @@ -6,7 +6,10 @@ namespace avtranscoder AttachementProperties::AttachementProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) -{} +{ + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); +} MetadatasMap AttachementProperties::getDataMap() const { diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 284a850b..751183d9 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -22,6 +22,9 @@ AudioProperties::AudioProperties( const AVFormatContext* formatContext, const si if( _formatContext && _codecContext ) _codec = avcodec_find_decoder( _codecContext->codec_id ); + + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } std::string AudioProperties::getCodecName() const diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/mediaProperty/DataProperties.cpp index 5bf3fd49..6043c44f 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.cpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.cpp @@ -17,6 +17,9 @@ DataProperties::DataProperties( const AVFormatContext* formatContext, const size , _streamId( index ) { //detectAncillaryData( _formatContext, _streamId ); + + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } MetadatasMap DataProperties::getDataMap() const diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp index dc592648..8dd124ca 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp @@ -6,7 +6,10 @@ namespace avtranscoder SubtitleProperties::SubtitleProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) -{} +{ + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); +} MetadatasMap SubtitleProperties::getDataMap() const { diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp index 064f0cc7..386838a3 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp @@ -6,7 +6,10 @@ namespace avtranscoder UnknownProperties::UnknownProperties( const AVFormatContext* formatContext, const size_t index ) : _formatContext( formatContext ) , _streamId( index ) -{} +{ + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); +} MetadatasMap UnknownProperties::getDataMap() const { diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 59033fab..84f04a4e 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -35,6 +35,9 @@ VideoProperties::VideoProperties( const AVFormatContext* formatContext, const si if( _formatContext && _codecContext ) _codec = avcodec_find_decoder( _codecContext->codec_id ); + + if( formatContext ) + detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); // Skip decoding for selected frames _codecContext->skip_frame = AVDISCARD_NONE; From 3561f67edbb677d45a0d5bccd8bcc6cac33b45e1 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Tue, 18 Nov 2014 11:20:10 +0100 Subject: [PATCH 21/64] SWIG file interface: add EAnalyseLevel enum to binding --- src/AvTranscoder/file/file.i | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AvTranscoder/file/file.i b/src/AvTranscoder/file/file.i index be1e652c..a0c3ee0e 100644 --- a/src/AvTranscoder/file/file.i +++ b/src/AvTranscoder/file/file.i @@ -1,8 +1,9 @@ %{ +#include #include #include %} +%include %include %include - From dd174c0801cc88e54115bea6a56981680b8719a2 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Tue, 18 Nov 2014 11:20:25 +0100 Subject: [PATCH 22/64] SWIG: clean interfaces --- src/AvTranscoder/avTranscoder.i | 2 +- src/AvTranscoder/mediaProperty/mediaProperty.i | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 8b1de900..4865f8bc 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -43,7 +43,7 @@ #include %} -namespace std { +namespace std { %template(IntPair) pair< size_t, size_t >; %template(ProfileMap) map< string, string >; %template(ProfilesVector) vector< map< string, string > >; diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i index 071d2f82..2d6fa5fd 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -1,5 +1,4 @@ %{ -#include #include #include #include @@ -13,7 +12,6 @@ using namespace avtranscoder; %} namespace std { - // Allow vector of object with no default constructor %ignore vector< avtranscoder::VideoProperties >::vector(size_type); %ignore vector< avtranscoder::VideoProperties >::resize; From 557e08753598f372f8c753fe1be71f2b59848720 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Tue, 18 Nov 2014 11:26:21 +0100 Subject: [PATCH 23/64] pyTests: fit to new way to get media properties Fix FileProperties for binding: need to add 'avtranscoder' namespace when return vector of properties (Video, Audio, ...). This enables SWIG to understand that results of these functions are templates it has already instanciated in the interface. --- .../mediaProperty/FileProperties.hpp | 24 +-- test/pyTest/testProperties.py | 8 +- test/pyTest/testTranscoderRewrap.py | 194 +++++++++--------- test/pyTest/testTranscoderTranscode.py | 56 ++--- 4 files changed, 141 insertions(+), 141 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 86405991..4e87b51f 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -45,18 +45,18 @@ class AvExport FileProperties size_t getNbAttachementStreams() const { return _attachementStreams.size(); } size_t getNbUnknownStreams() const { return _unknownStreams.size(); } - std::vector< VideoProperties >& getVideoProperties() { return _videoStreams; } - const std::vector< VideoProperties >& getVideoProperties() const { return _videoStreams; } - std::vector< AudioProperties >& getAudioProperties() { return _audioStreams; } - const std::vector< AudioProperties >& getAudioProperties() const { return _audioStreams; } - std::vector< DataProperties >& getDataProperties() { return _dataStreams; } - const std::vector< DataProperties >& getDataProperties() const { return _dataStreams; } - std::vector< SubtitleProperties >& getSubtitleProperties() { return _subtitleStreams; } - const std::vector< SubtitleProperties >& getSubtitleProperties() const { return _subtitleStreams; } - std::vector< AttachementProperties >& getAttachementProperties() { return _attachementStreams; } - const std::vector< AttachementProperties >& getAttachementProperties() const { return _attachementStreams; } - std::vector< UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; } - const std::vector< UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } + std::vector< avtranscoder::VideoProperties >& getVideoProperties() { return _videoStreams; } + const std::vector< avtranscoder::VideoProperties >& getVideoProperties() const { return _videoStreams; } + std::vector< avtranscoder::AudioProperties >& getAudioProperties() { return _audioStreams; } + const std::vector< avtranscoder::AudioProperties >& getAudioProperties() const { return _audioStreams; } + std::vector< avtranscoder::DataProperties >& getDataProperties() { return _dataStreams; } + const std::vector< avtranscoder::DataProperties >& getDataProperties() const { return _dataStreams; } + std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() { return _subtitleStreams; } + const std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() const { return _subtitleStreams; } + std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() { return _attachementStreams; } + const std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() const { return _attachementStreams; } + std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; } + const std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } const AVFormatContext& getAVFormatContext() { return *_formatContext; } diff --git a/test/pyTest/testProperties.py b/test/pyTest/testProperties.py index 8a380f04..fcabb081 100644 --- a/test/pyTest/testProperties.py +++ b/test/pyTest/testProperties.py @@ -25,10 +25,10 @@ def testAddMetadataDate(): transcoder.process( progress ) inputFile = av.InputFile( outputFileName ) - inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + inputFile.analyse( progress, av.eAnalyseLevelHeader ) properties = inputFile.getProperties() - assert_in( metadata_to_check, properties.metadatas ) + assert_in( metadata_to_check, properties.getMetadatas() ) def testAddImpossibleMetadata(): """ @@ -50,7 +50,7 @@ def testAddImpossibleMetadata(): transcoder.process( progress ) inputFile = av.InputFile( outputFileName ) - inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + inputFile.analyse( progress, av.eAnalyseLevelHeader ) properties = inputFile.getProperties() - assert_not_in( metadata_to_check, properties.metadatas ) + assert_not_in( metadata_to_check, properties.getMetadatas() ) diff --git a/test/pyTest/testTranscoderRewrap.py b/test/pyTest/testTranscoderRewrap.py index c904e4b9..d15ed35a 100644 --- a/test/pyTest/testTranscoderRewrap.py +++ b/test/pyTest/testTranscoderRewrap.py @@ -21,43 +21,43 @@ def testRewrapAudioStream(): # get src file of wrap src_inputFile = av.InputFile( inputFileName ) - src_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + src_inputFile.analyse( progress ) src_properties = src_inputFile.getProperties() - src_audioStream = src_properties.audioStreams[0] + src_audioStream = src_properties.getAudioProperties()[0] # get dst file of wrap dst_inputFile = av.InputFile( outputFileName ) - dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + dst_inputFile.analyse( progress, av.eAnalyseLevelHeader ) dst_properties = dst_inputFile.getProperties() - dst_audioStream = dst_properties.audioStreams[0] + dst_audioStream = dst_properties.getAudioProperties()[0] # check format - assert_equals( src_properties.formatName, dst_properties.formatName ) - assert_equals( src_properties.formatLongName, dst_properties.formatLongName ) - assert_equals( src_properties.startTime, dst_properties.startTime ) - assert_equals( src_properties.duration, dst_properties.duration ) + assert_equals( src_properties.getFormatName(), dst_properties.getFormatName() ) + assert_equals( src_properties.getFormatLongName(), dst_properties.getFormatLongName() ) + assert_equals( src_properties.getStartTime(), dst_properties.getStartTime() ) + assert_equals( src_properties.getDuration(), dst_properties.getDuration() ) deltaBitRateAudio = 10 - assert_almost_equals( src_properties.bitRate, dst_properties.bitRate, delta=deltaBitRateAudio ) - assert_equals( src_properties.packetSize, dst_properties.packetSize ) + assert_almost_equals( src_properties.getBitRate(), dst_properties.getBitRate(), delta=deltaBitRateAudio ) + assert_equals( src_properties.getPacketSize(), dst_properties.getPacketSize() ) # check audio stream - assert_equals( src_audioStream.codecName, dst_audioStream.codecName ) - assert_equals( src_audioStream.codecLongName, dst_audioStream.codecLongName ) - assert_equals( src_audioStream.sampleFormatName, dst_audioStream.sampleFormatName ) - assert_equals( src_audioStream.sampleFormatLongName, dst_audioStream.sampleFormatLongName ) - # assert_equals( src_audioStream.channelLayout, dst_audioStream.channelLayout ) # '5.1' != '0 channels' - assert_equals( src_audioStream.channelName, dst_audioStream.channelName ) - assert_equals( src_audioStream.channelDescription, dst_audioStream.channelDescription ) - assert_equals( src_audioStream.streamId, dst_audioStream.streamId ) - assert_equals( src_audioStream.codecId, dst_audioStream.codecId ) - assert_equals( src_audioStream.sampleRate, dst_audioStream.sampleRate ) - assert_equals( src_audioStream.channels, dst_audioStream.channels ) - assert_equals( src_audioStream.bit_rate, dst_audioStream.bit_rate ) - - assert_equals( len( src_audioStream.metadatas ), len( dst_audioStream.metadatas ) ) - for metadata in range( 0, len( src_audioStream.metadatas ) ): - src_metadata = src_audioStream.metadatas[metadata] - dst_metadata = dst_audioStream.metadatas[metadata] + assert_equals( src_audioStream.getCodecName(), dst_audioStream.getCodecName() ) + assert_equals( src_audioStream.getCodecLongName(), dst_audioStream.getCodecLongName() ) + assert_equals( src_audioStream.getSampleFormatName(), dst_audioStream.getSampleFormatName() ) + assert_equals( src_audioStream.getSampleFormatLongName(), dst_audioStream.getSampleFormatLongName() ) + # assert_equals( src_audioStream.getChannelLayout(), dst_audioStream.getChannelLayout() ) # '5.1' != '0 channels' + assert_equals( src_audioStream.getChannelName(), dst_audioStream.getChannelName() ) + assert_equals( src_audioStream.getChannelDescription(), dst_audioStream.getChannelDescription() ) + assert_equals( src_audioStream.getStreamId(), dst_audioStream.getStreamId() ) + assert_equals( src_audioStream.getCodecId(), dst_audioStream.getCodecId() ) + assert_equals( src_audioStream.getSampleRate(), dst_audioStream.getSampleRate() ) + assert_equals( src_audioStream.getChannels(), dst_audioStream.getChannels() ) + assert_equals( src_audioStream.getBitRate(), dst_audioStream.getBitRate() ) + + assert_equals( len( src_audioStream.getMetadatas() ), len( dst_audioStream.getMetadatas() ) ) + for metadata in range( 0, len( src_audioStream.getMetadatas() ) ): + src_metadata = src_audioStream.getMetadatas()[metadata] + dst_metadata = dst_audioStream.getMetadatas()[metadata] assert_equals( src_metadata, dst_metadata ) @@ -78,93 +78,93 @@ def testRewrapVideoStream(): # get src file of wrap src_inputFile = av.InputFile( inputFileName ) - src_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFull ) - src_properties = src_inputFile.getProperties() - src_videoStream = src_properties.videoStreams[0] + src_inputFile.analyse( progress ) + src_properties = src_inputFile.getProperties() + src_videoStream = src_properties.getVideoProperties()[0] # get dst file of wrap dst_inputFile = av.InputFile( outputFileName ) - dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + dst_inputFile.analyse( progress ) dst_properties = dst_inputFile.getProperties() - dst_videoStream = dst_properties.videoStreams[0] + dst_videoStream = dst_properties.getVideoProperties()[0] # check format - assert_equals( src_properties.formatName, dst_properties.formatName ) - assert_equals( src_properties.formatLongName, dst_properties.formatLongName ) - assert_equals( src_properties.startTime, dst_properties.startTime ) - assert_equals( src_properties.duration, dst_properties.duration ) + assert_equals( src_properties.getFormatName(), dst_properties.getFormatName() ) + assert_equals( src_properties.getFormatLongName(), dst_properties.getFormatLongName() ) + assert_equals( src_properties.getStartTime(), dst_properties.getStartTime() ) + assert_equals( src_properties.getDuration(), dst_properties.getDuration() ) deltaBitRateVideo = 500000 - assert_almost_equals( src_properties.bitRate, dst_properties.bitRate, delta=deltaBitRateVideo ) - assert_equals( src_properties.packetSize, dst_properties.packetSize ) + assert_almost_equals( src_properties.getBitRate(), dst_properties.getBitRate(), delta=deltaBitRateVideo ) + assert_equals( src_properties.getPacketSize(), dst_properties.getPacketSize() ) # check video stream - assert_equals( src_videoStream.codecName, dst_videoStream.codecName ) - assert_equals( src_videoStream.codecLongName, dst_videoStream.codecLongName ) - assert_equals( src_videoStream.profileName, dst_videoStream.profileName ) - assert_equals( src_videoStream.colorTransfert, dst_videoStream.colorTransfert ) - assert_equals( src_videoStream.colorspace, dst_videoStream.colorspace ) - assert_equals( src_videoStream.colorRange, dst_videoStream.colorRange ) - assert_equals( src_videoStream.colorPrimaries, dst_videoStream.colorPrimaries ) - assert_equals( src_videoStream.chromaSampleLocation, dst_videoStream.chromaSampleLocation ) - assert_equals( src_videoStream.fieldOrder, dst_videoStream.fieldOrder ) - assert_equals( src_videoStream.pixelName, dst_videoStream.pixelName ) - assert_equals( src_videoStream.endianess, dst_videoStream.endianess ) - assert_equals( src_videoStream.startTimecode, dst_videoStream.startTimecode ) - - assert_equals( src_videoStream.timeBase.num, dst_videoStream.timeBase.num ) - assert_equals( src_videoStream.timeBase.den, dst_videoStream.timeBase.den ) - assert_equals( src_videoStream.sar.num, dst_videoStream.sar.num ) - assert_equals( src_videoStream.sar.den, dst_videoStream.sar.den ) - assert_equals( src_videoStream.dar.num, dst_videoStream.dar.num ) - assert_equals( src_videoStream.dar.den, dst_videoStream.dar.den ) + assert_equals( src_videoStream.getCodecName(), dst_videoStream.getCodecName() ) + assert_equals( src_videoStream.getCodecLongName(), dst_videoStream.getCodecLongName() ) + assert_equals( src_videoStream.getProfileName(), dst_videoStream.getProfileName() ) + assert_equals( src_videoStream.getColorTransfert(), dst_videoStream.getColorTransfert() ) + assert_equals( src_videoStream.getColorspace(), dst_videoStream.getColorspace() ) + assert_equals( src_videoStream.getColorRange(), dst_videoStream.getColorRange() ) + assert_equals( src_videoStream.getColorPrimaries(), dst_videoStream.getColorPrimaries() ) + assert_equals( src_videoStream.getChromaSampleLocation(), dst_videoStream.getChromaSampleLocation() ) + assert_equals( src_videoStream.getFieldOrder(), dst_videoStream.getFieldOrder() ) + assert_equals( src_videoStream.getPixelName(), dst_videoStream.getPixelName() ) + assert_equals( src_videoStream.getEndianess(), dst_videoStream.getEndianess() ) + assert_equals( src_videoStream.getStartTimecodeString(), dst_videoStream.getStartTimecodeString() ) + + assert_equals( src_videoStream.getTimeBase().num, dst_videoStream.getTimeBase().num ) + assert_equals( src_videoStream.getTimeBase().den, dst_videoStream.getTimeBase().den ) + assert_equals( src_videoStream.getSar().num, dst_videoStream.getSar().num ) + assert_equals( src_videoStream.getSar().den, dst_videoStream.getSar().den ) + assert_equals( src_videoStream.getDar().num, dst_videoStream.getDar().num ) + assert_equals( src_videoStream.getDar().den, dst_videoStream.getDar().den ) - assert_equals( src_videoStream.streamId, dst_videoStream.streamId ) - assert_equals( src_videoStream.codecId, dst_videoStream.codecId ) - assert_equals( src_videoStream.bitRate, dst_videoStream.bitRate ) - assert_equals( src_videoStream.maxBitRate, dst_videoStream.maxBitRate ) - assert_equals( src_videoStream.minBitRate, dst_videoStream.minBitRate ) - assert_equals( src_videoStream.ticksPerFrame, dst_videoStream.ticksPerFrame ) - assert_equals( src_videoStream.width, dst_videoStream.width ) - assert_equals( src_videoStream.height, dst_videoStream.height ) - assert_equals( src_videoStream.gopSize, dst_videoStream.gopSize ) - assert_equals( src_videoStream.dtgActiveFormat, dst_videoStream.dtgActiveFormat ) - assert_equals( src_videoStream.referencesFrames, dst_videoStream.referencesFrames ) - assert_equals( src_videoStream.profile, dst_videoStream.profile ) - assert_equals( src_videoStream.level, dst_videoStream.level ) - assert_equals( src_videoStream.componentsCount, dst_videoStream.componentsCount ) - assert_equals( src_videoStream.chromaWidth, dst_videoStream.chromaWidth ) - assert_equals( src_videoStream.chromaHeight, dst_videoStream.chromaHeight ) - assert_equals( src_videoStream.fps, dst_videoStream.fps ) - assert_equals( src_videoStream.hasBFrames, dst_videoStream.hasBFrames ) - assert_equals( src_videoStream.indexedColors, dst_videoStream.indexedColors ) - assert_equals( src_videoStream.bitWisePacked, dst_videoStream.bitWisePacked ) - assert_equals( src_videoStream.hardwareAcceleration, dst_videoStream.hardwareAcceleration ) - assert_equals( src_videoStream.notFirstPlane, dst_videoStream.notFirstPlane ) - assert_equals( src_videoStream.rgbPixelData, dst_videoStream.rgbPixelData ) - assert_equals( src_videoStream.pseudoPaletted, dst_videoStream.pseudoPaletted ) - assert_equals( src_videoStream.asAlpha, dst_videoStream.asAlpha ) - assert_equals( src_videoStream.isInterlaced, dst_videoStream.isInterlaced ) - assert_equals( src_videoStream.topFieldFirst, dst_videoStream.topFieldFirst ) - - assert_equals( len( src_videoStream.gopStructure ), len( dst_videoStream.gopStructure ) ) - for gop in range( 0, len( src_videoStream.gopStructure ) ): - src_gop = src_videoStream.gopStructure[gop] - dst_gop = dst_videoStream.gopStructure[gop] + assert_equals( src_videoStream.getStreamId(), dst_videoStream.getStreamId() ) + assert_equals( src_videoStream.getCodecId(), dst_videoStream.getCodecId() ) + assert_equals( src_videoStream.getBitRate(), dst_videoStream.getBitRate() ) + assert_equals( src_videoStream.getMaxBitRate(), dst_videoStream.getMaxBitRate() ) + assert_equals( src_videoStream.getMinBitRate(), dst_videoStream.getMinBitRate() ) + assert_equals( src_videoStream.getTicksPerFrame(), dst_videoStream.getTicksPerFrame() ) + assert_equals( src_videoStream.getWidth(), dst_videoStream.getWidth() ) + assert_equals( src_videoStream.getHeight(), dst_videoStream.getHeight() ) + assert_equals( src_videoStream.getGopSize(), dst_videoStream.getGopSize() ) + assert_equals( src_videoStream.getDtgActiveFormat(), dst_videoStream.getDtgActiveFormat() ) + assert_equals( src_videoStream.getReferencesFrames(), dst_videoStream.getReferencesFrames() ) + assert_equals( src_videoStream.getProfile(), dst_videoStream.getProfile() ) + assert_equals( src_videoStream.getLevel(), dst_videoStream.getLevel() ) + assert_equals( src_videoStream.getComponentsCount(), dst_videoStream.getComponentsCount() ) + assert_equals( src_videoStream.getChromaWidth(), dst_videoStream.getChromaWidth() ) + assert_equals( src_videoStream.getChromaHeight(), dst_videoStream.getChromaHeight() ) + assert_equals( src_videoStream.getFps(), dst_videoStream.getFps() ) + assert_equals( src_videoStream.hasBFrames(), dst_videoStream.hasBFrames() ) + assert_equals( src_videoStream.isIndexedColors(), dst_videoStream.isIndexedColors() ) + assert_equals( src_videoStream.isBitWisePacked(), dst_videoStream.isBitWisePacked() ) + assert_equals( src_videoStream.isHardwareAccelerated(), dst_videoStream.isHardwareAccelerated() ) + assert_equals( src_videoStream.isPlanar(), dst_videoStream.isPlanar() ) + assert_equals( src_videoStream.isRgbPixelData(), dst_videoStream.isRgbPixelData() ) + assert_equals( src_videoStream.isPseudoPaletted(), dst_videoStream.isPseudoPaletted() ) + assert_equals( src_videoStream.hasAlpha(), dst_videoStream.hasAlpha() ) + assert_equals( src_videoStream.isInterlaced(), dst_videoStream.isInterlaced() ) + assert_equals( src_videoStream.isTopFieldFirst(), dst_videoStream.isTopFieldFirst() ) + + assert_equals( len( src_videoStream.getGopStructure() ), len( dst_videoStream.getGopStructure() ) ) + for gop in range( 0, len( src_videoStream.getGopStructure() ) ): + src_gop = src_videoStream.getGopStructure()[gop] + dst_gop = dst_videoStream.getGopStructure()[gop] assert_equals( src_gop, dst_gop ) - assert_equals( len( src_videoStream.channels ), len( dst_videoStream.channels ) ) - for channel in range( 0, len( src_videoStream.channels ) ): - src_channel = src_videoStream.channels[channel] - dst_channel = dst_videoStream.channels[channel] + assert_equals( len( src_videoStream.getChannels() ), len( dst_videoStream.getChannels() ) ) + for channel in range( 0, len( src_videoStream.getChannels() ) ): + src_channel = src_videoStream.getChannels()[channel] + dst_channel = dst_videoStream.getChannels()[channel] assert_equals( src_channel.id, dst_channel.id ) assert_equals( src_channel.chromaHeight, dst_channel.chromaHeight ) assert_equals( src_channel.bitStep, dst_channel.bitStep ) - assert_equals( len( src_videoStream.metadatas ), len( dst_videoStream.metadatas ) ) - for metadata in range( 0, len( src_videoStream.metadatas ) ): - src_metadata = src_videoStream.metadatas[metadata] - dst_metadata = dst_videoStream.metadatas[metadata] + assert_equals( len( src_videoStream.getMetadatas() ), len( dst_videoStream.getMetadatas() ) ) + for metadata in range( 0, len( src_videoStream.getMetadatas() ) ): + src_metadata = src_videoStream.getMetadatas()[metadata] + dst_metadata = dst_videoStream.getMetadatas()[metadata] assert_equals( src_metadata, dst_metadata ) diff --git a/test/pyTest/testTranscoderTranscode.py b/test/pyTest/testTranscoderTranscode.py index c025f7e4..8c2f5523 100644 --- a/test/pyTest/testTranscoderTranscode.py +++ b/test/pyTest/testTranscoderTranscode.py @@ -23,17 +23,17 @@ def testTranscodeWave24b48kmono(): # get dst file of transcode dst_inputFile = av.InputFile( outputFileName ) - dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + dst_inputFile.analyse( progress, av.eAnalyseLevelHeader ) dst_properties = dst_inputFile.getProperties() - dst_audioStream = dst_properties.audioStreams[0] + dst_audioStream = dst_properties.getAudioProperties()[0] - assert_equals( "pcm_s24le", dst_audioStream.codecName ) - assert_equals( "PCM signed 24-bit little-endian", dst_audioStream.codecLongName ) - assert_equals( "s32", dst_audioStream.sampleFormatName ) - assert_equals( "signed 32 bits", dst_audioStream.sampleFormatLongName ) - assert_equals( 48000, dst_audioStream.sampleRate ) - # assert_equals( "1 channels", dst_audioStream.channelLayout ) # '1 channels' != '0 channels' - assert_equals( 1, dst_audioStream.channels ) + assert_equals( "pcm_s24le", dst_audioStream.getCodecName() ) + assert_equals( "PCM signed 24-bit little-endian", dst_audioStream.getCodecLongName() ) + assert_equals( "s32", dst_audioStream.getSampleFormatName() ) + assert_equals( "signed 32 bits", dst_audioStream.getSampleFormatLongName() ) + assert_equals( 48000, dst_audioStream.getSampleRate() ) + # assert_equals( "1 channels", dst_audioStream.getChannelLayout() ) # '1 channels' != '0 channels' + assert_equals( 1, dst_audioStream.getChannels() ) def testTranscodeWave16b48kmono(): """ @@ -53,17 +53,17 @@ def testTranscodeWave16b48kmono(): # get dst file of transcode dst_inputFile = av.InputFile( outputFileName ) - dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) + dst_inputFile.analyse( progress, av.eAnalyseLevelHeader ) dst_properties = dst_inputFile.getProperties() - dst_audioStream = dst_properties.audioStreams[0] + dst_audioStream = dst_properties.getAudioProperties()[0] - assert_equals( "pcm_s16le", dst_audioStream.codecName ) - assert_equals( "PCM signed 16-bit little-endian", dst_audioStream.codecLongName ) - assert_equals( "s16", dst_audioStream.sampleFormatName ) - assert_equals( "signed 16 bits", dst_audioStream.sampleFormatLongName ) - assert_equals( 48000, dst_audioStream.sampleRate ) - # assert_equals( "1 channels", dst_audioStream.channelLayout ) # '1 channels' != '0 channels' - assert_equals( 1, dst_audioStream.channels ) + assert_equals( "pcm_s16le", dst_audioStream.getCodecName() ) + assert_equals( "PCM signed 16-bit little-endian", dst_audioStream.getCodecLongName() ) + assert_equals( "s16", dst_audioStream.getSampleFormatName() ) + assert_equals( "signed 16 bits", dst_audioStream.getSampleFormatLongName() ) + assert_equals( 48000, dst_audioStream.getSampleRate() ) + # assert_equals( "1 channels", dst_audioStream.getChannelLayout() ) # '1 channels' != '0 channels' + assert_equals( 1, dst_audioStream.getChannels() ) # def testTranscodeDnxhd120(): # """ @@ -83,9 +83,9 @@ def testTranscodeWave16b48kmono(): # # get dst file of transcode # dst_inputFile = av.InputFile( outputFileName ) -# dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) +# dst_inputFile.analyse( progress, av.eAnalyseLevelFast ) # dst_properties = dst_inputFile.getProperties() -# dst_videoStream = dst_properties.videoStreams[0] +# dst_videoStream = dst_properties.getVideoProperties()[0] # assert_equals( "dnxhd", dst_videoStream.codecName ) # assert_equals( "VC3/DNxHD", dst_videoStream.codecLongName ) @@ -112,9 +112,9 @@ def testTranscodeWave16b48kmono(): # # get dst file of transcode # dst_inputFile = av.InputFile( outputFileName ) -# dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) +# dst_inputFile.analyse( progress, av.eAnalyseLevelFast ) # dst_properties = dst_inputFile.getProperties() -# dst_videoStream = dst_properties.videoStreams[0] +# dst_videoStream = dst_properties.getVideoProperties()[0] # assert_equals( "dnxhd", dst_videoStream.codecName ) # assert_equals( "VC3/DNxHD", dst_videoStream.codecLongName ) @@ -141,9 +141,9 @@ def testTranscodeWave16b48kmono(): # # get dst file of transcode # dst_inputFile = av.InputFile( outputFileName ) -# dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) +# dst_inputFile.analyse( progress, av.eAnalyseLevelFast ) # dst_properties = dst_inputFile.getProperties() -# dst_videoStream = dst_properties.videoStreams[0] +# dst_videoStream = dst_properties.getVideoProperties()[0] # assert_equals( "dnxhd", dst_videoStream.codecName ) # assert_equals( "VC3/DNxHD", dst_videoStream.codecLongName ) @@ -170,9 +170,9 @@ def testTranscodeWave16b48kmono(): # # get dst file of transcode # dst_inputFile = av.InputFile( outputFileName ) -# dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) +# dst_inputFile.analyse( progress, av.eAnalyseLevelFast ) # dst_properties = dst_inputFile.getProperties() -# dst_videoStream = dst_properties.videoStreams[0] +# dst_videoStream = dst_properties.getVideoProperties()[0] # assert_equals( "mpeg2video", dst_videoStream.codecName ) # assert_equals( "MPEG-2 video", dst_videoStream.codecLongName ) @@ -219,9 +219,9 @@ def testTranscodeWave16b48kmono(): # # get dst file of transcode # dst_inputFile = av.InputFile( outputFileName ) -# dst_inputFile.analyse( progress, av.InputFile.eAnalyseLevelFast ) +# dst_inputFile.analyse( progress, av.eAnalyseLevelFast ) # dst_properties = dst_inputFile.getProperties() -# dst_videoStream = dst_properties.videoStreams[0] +# dst_videoStream = dst_properties.getVideoProperties()[0] # assert_equals( "mpeg2video", dst_videoStream.codecName ) # assert_equals( "yuv420p", dst_videoStream.pixelName ) From bb16cbbc6368647f0687aa126913126cb9792e45 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 24 Nov 2014 19:46:16 +0100 Subject: [PATCH 24/64] AudioTransform: suppress warning --- src/AvTranscoder/transform/AudioTransform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/transform/AudioTransform.cpp b/src/AvTranscoder/transform/AudioTransform.cpp index ebc6c5bd..125dc45d 100644 --- a/src/AvTranscoder/transform/AudioTransform.cpp +++ b/src/AvTranscoder/transform/AudioTransform.cpp @@ -99,7 +99,7 @@ void AudioTransform::convert( const Frame& srcFrame, Frame& dstFrame ) throw std::runtime_error( "unable to convert audio samples" ); } - int nbOutputSamples = nbOutputSamplesPerChannel * static_cast( dstFrame ).desc().getChannels(); + size_t nbOutputSamples = nbOutputSamplesPerChannel * static_cast( dstFrame ).desc().getChannels(); if( dstFrame.getSize() != nbOutputSamples ) dstFrame.getBuffer().resize( nbOutputSamples, 0 ); From d3fcd7d63fb34de5064ec01fa01f31a37d7b7d7d Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Mon, 24 Nov 2014 19:49:24 +0100 Subject: [PATCH 25/64] StreamTranscoder: refactore processTranscode --- .../transcoder/StreamTranscoder.cpp | 71 ++----------------- .../transcoder/StreamTranscoder.hpp | 3 +- 2 files changed, 7 insertions(+), 67 deletions(-) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index 388e487e..a881db5a 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -319,7 +319,7 @@ bool StreamTranscoder::processRewrap() return true; } -bool StreamTranscoder::processTranscode() +bool StreamTranscoder::processTranscode( const int subStreamIndex ) { assert( _inputEssence != NULL ); assert( _currentEssence != NULL ); @@ -341,72 +341,13 @@ bool StreamTranscoder::processTranscode() _offsetPassed = true; } - if( _currentEssence->readNextFrame( *_sourceBuffer ) ) - { - if( _verbose ) - std::cout << "convert (" << _sourceBuffer->getSize() << " bytes)" << std::endl; - _transform->convert( *_sourceBuffer, *_frameBuffer ); - if( _verbose ) - std::cout << "encode (" << _frameBuffer->getSize() << " bytes)" << std::endl; - _outputEssence->encodeFrame( *_frameBuffer, data ); - } + bool decodingStatus = false; + if( subStreamIndex == -1 ) + decodingStatus = _currentEssence->readNextFrame( *_sourceBuffer ); else - { - if( _verbose ) - std::cout << "encode last frame(s)" << std::endl; - if( ! _outputEssence->encodeFrame( data ) ) - { - if( _infinityStream ) - { - switchToGeneratorEssence(); - return processTranscode(); - } - return false; - } - } - - if( _verbose ) - std::cout << "wrap (" << data.getSize() << " bytes)" << std::endl; - - IOutputStream::EWrappingStatus wrappingStatus = _outputStream->wrap( data ); - - switch( wrappingStatus ) - { - case IOutputStream::eWrappingSuccess: - return true; - case IOutputStream::eWrappingWaitingForData: - // the wrapper needs more data to write the current packet - return processTranscode(); - case IOutputStream::eWrappingError: - return false; - } - - return true; -} - -bool StreamTranscoder::processTranscode( const int subStreamIndex ) -{ - assert( _inputEssence != NULL ); - assert( _currentEssence != NULL ); - assert( _outputEssence != NULL ); - assert( _sourceBuffer != NULL ); - assert( _frameBuffer != NULL ); - assert( _transform != NULL ); - - CodedData data; - if( _verbose ) - std::cout << "transcode a frame " << std::endl; - - if( _offset && - _frameProcessed > _offset && - ! _offsetPassed && - _takeFromGenerator ) - { - switchToInputEssence(); - _offsetPassed = true; - } + decodingStatus = _currentEssence->readNextFrame( *_sourceBuffer, subStreamIndex ); - if( _currentEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) ) + if( decodingStatus ) { if( _verbose ) std::cout << "convert (" << _sourceBuffer->getSize() << " bytes)" << std::endl; diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.hpp b/src/AvTranscoder/transcoder/StreamTranscoder.hpp index 6a1222a5..e5d40ff8 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.hpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.hpp @@ -76,8 +76,7 @@ class AvExport StreamTranscoder private: bool processRewrap(); - bool processTranscode(); - bool processTranscode( const int subStreamIndex ); + bool processTranscode( const int subStreamIndex = -1 ); ///< By default transcode all channels private: IInputStream* _inputStream; From 76caaba08e94a498a0e4cd2c2b4c2986db13fc0b Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 14:06:43 +0100 Subject: [PATCH 26/64] Transcoder: fix audio stream setting when demuxing without specified output profile --- src/AvTranscoder/transcoder/Transcoder.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 7159000a..c0f4fcdc 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -393,16 +393,26 @@ void Transcoder::addTranscodeStream( const std::string& filename, const size_t s // Create profile as input configuration NoDisplayProgress progress; referenceFile->analyse( progress, eAnalyseLevelHeader ); - AudioProperties audioProperties = referenceFile->getProperties().getAudioProperties().at( streamIndex ); + + const AudioProperties* audioProperties = NULL; + for( size_t i = 0; i < referenceFile->getProperties().getAudioProperties().size(); i++ ) + { + if( referenceFile->getProperties().getAudioProperties().at( i ).getStreamId() == streamIndex ) + { + audioProperties = &referenceFile->getProperties().getAudioProperties().at( i ); + } + } + if( audioProperties == NULL ) + throw std::runtime_error( "cannot set audio stream properties" ); ProfileLoader::Profile profile; profile[ constants::avProfileIdentificator ] = "presetRewrap"; profile[ constants::avProfileIdentificatorHuman ] = "Preset rewrap"; profile[ constants::avProfileType ] = avtranscoder::constants::avProfileTypeAudio; - profile[ constants::avProfileCodec ] = audioProperties.getCodecName(); - profile[ constants::avProfileSampleFormat ] = audioProperties.getSampleFormatName(); + profile[ constants::avProfileCodec ] = audioProperties->getCodecName(); + profile[ constants::avProfileSampleFormat ] = audioProperties->getSampleFormatName(); std::stringstream ss; - ss << audioProperties.getSampleRate(); + ss << audioProperties->getSampleRate(); profile[ constants::avProfileSampleRate ] = ss.str(); profile[ constants::avProfileChannel ] = "1"; From 6c3ea36599524c744ab6c768165f9ebb0197ddd8 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 14:08:49 +0100 Subject: [PATCH 27/64] AvInputStream: remove audio codec block_align setting No need to set it, FFmpeg do it for us --- src/AvTranscoder/codedStream/AvInputStream.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index 1e6c15e0..e1440f06 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -35,13 +35,6 @@ AvInputStream::AvInputStream( InputFile& inputFile, const size_t streamIndex ) } case AVMEDIA_TYPE_AUDIO: { - double outputFps = 25; - size_t bytePerSample = av_get_bytes_per_sample( context->sample_fmt ); - - context->block_align = 1.0 * context->sample_rate * context->channels * bytePerSample / outputFps; - // std::cout << "channels " << context->channel_layout << std::endl; - // std::cout << "audio buffer read size " << context->block_align << std::endl; - AudioCodec* audioCodec = new AudioCodec( eCodecTypeDecoder, context->codec_id ); audioCodec->setAudioParameters( context->sample_rate, context->channels, context->sample_fmt ); From 0011865368b76d1f9f198b80ee17f37d781157a2 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 28 Nov 2014 10:28:48 +0100 Subject: [PATCH 28/64] Pixel: add support of pixel formats 4:4:0, 4:1:1 and 4:1:0 --- src/AvTranscoder/frame/Pixel.cpp | 50 +++++++++++++++++++++++++------- src/AvTranscoder/frame/Pixel.hpp | 5 +++- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/AvTranscoder/frame/Pixel.cpp b/src/AvTranscoder/frame/Pixel.cpp index 145140fc..9bb7ba4a 100644 --- a/src/AvTranscoder/frame/Pixel.cpp +++ b/src/AvTranscoder/frame/Pixel.cpp @@ -87,16 +87,31 @@ void Pixel::init( const AVPixelFormat avPixelFormat ) setSubsampling( eSubsamplingNone ); - if( ( pix_desc->log2_chroma_w == true ) && - ( pix_desc->log2_chroma_h == false ) ) + if( ( pix_desc->log2_chroma_w == 0 ) && + ( pix_desc->log2_chroma_h == 1 ) ) + { + setSubsampling( eSubsampling440 ); + } + else if( ( pix_desc->log2_chroma_w == 1 ) && + ( pix_desc->log2_chroma_h == 0 ) ) { setSubsampling( eSubsampling422 ); } - if( ( pix_desc->log2_chroma_w == true ) && - ( pix_desc->log2_chroma_h == true ) ) + else if( ( pix_desc->log2_chroma_w == 1 ) && + ( pix_desc->log2_chroma_h == 1 ) ) { setSubsampling( eSubsampling420 ); } + else if( ( pix_desc->log2_chroma_w == 3 ) && + ( pix_desc->log2_chroma_h == 0 ) ) + { + setSubsampling( eSubsampling411 ); + } + else if( ( pix_desc->log2_chroma_w == 2 ) && + ( pix_desc->log2_chroma_h == 2 ) ) + { + setSubsampling( eSubsampling410 ); + } } bool Pixel::asCorrectColorComponents( const AVPixFmtDescriptor* pix_desc, const EComponentType componentType ) const @@ -114,18 +129,33 @@ bool Pixel::asCorrectSubsampling( const AVPixFmtDescriptor* pix_desc, const ESub { case eSubsamplingNone : { - return ( pix_desc->log2_chroma_w == false ) && - ( pix_desc->log2_chroma_h == false ); + return ( pix_desc->log2_chroma_w == 0 ) && + ( pix_desc->log2_chroma_h == 0 ); + } + case eSubsampling440 : + { + return ( pix_desc->log2_chroma_w == 0 ) && + ( pix_desc->log2_chroma_h == 1 ); } case eSubsampling422 : { - return ( pix_desc->log2_chroma_w == true ) && - ( pix_desc->log2_chroma_h == false ); + return ( pix_desc->log2_chroma_w == 1 ) && + ( pix_desc->log2_chroma_h == 0 ); } case eSubsampling420 : { - return ( pix_desc->log2_chroma_w == true ) && - ( pix_desc->log2_chroma_h == true ); + return ( pix_desc->log2_chroma_w == 1 ) && + ( pix_desc->log2_chroma_h == 1 ); + } + case eSubsampling411: + { + return ( pix_desc->log2_chroma_w == 3 ) && + ( pix_desc->log2_chroma_h == 0 ); + } + case eSubsampling410 : + { + return ( pix_desc->log2_chroma_w == 2 ) && + ( pix_desc->log2_chroma_h == 2 ); } } return false; diff --git a/src/AvTranscoder/frame/Pixel.hpp b/src/AvTranscoder/frame/Pixel.hpp index c5f9aaf2..28a09f62 100644 --- a/src/AvTranscoder/frame/Pixel.hpp +++ b/src/AvTranscoder/frame/Pixel.hpp @@ -23,8 +23,11 @@ enum EComponentType enum ESubsamplingType { eSubsamplingNone = 0, // 4:4:4 + eSubsampling440, // 4:4:0 eSubsampling422, // 4:2:2 - eSubsampling420 // 4:2:0 + eSubsampling420, // 4:2:0 + eSubsampling411, // 4:1:1 + eSubsampling410 // 4:1:0 }; class AvExport Pixel From 6e5f0445b4f6f22f934334cd48570d11fa3724d8 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 28 Nov 2014 10:29:39 +0100 Subject: [PATCH 29/64] Pixel: clean constructor from an AVPixelFormat --- src/AvTranscoder/frame/Pixel.cpp | 8 -------- src/AvTranscoder/frame/Pixel.hpp | 1 - 2 files changed, 9 deletions(-) diff --git a/src/AvTranscoder/frame/Pixel.cpp b/src/AvTranscoder/frame/Pixel.cpp index 9bb7ba4a..76696f9b 100644 --- a/src/AvTranscoder/frame/Pixel.cpp +++ b/src/AvTranscoder/frame/Pixel.cpp @@ -18,20 +18,12 @@ Pixel::Pixel( const std::string& avPixelFormat ) } Pixel::Pixel( const AVPixelFormat avPixelFormat ) - : _pixelSize ( 24 ) - , _components ( 3 ) - , _componentType ( eComponentYuv ) - , _subsamplingType ( eSubsamplingNone ) - , _endianess ( false ) - , _withAlpha ( false ) - , _planar ( true ) { init( avPixelFormat ); } AVPixelFormat Pixel::findPixel() const { - //av_register_all(); #if LIBAVUTIL_VERSION_MAJOR > 51 const AVPixFmtDescriptor *pix_desc = NULL; while( ( pix_desc = av_pix_fmt_desc_next( pix_desc ) ) ) diff --git a/src/AvTranscoder/frame/Pixel.hpp b/src/AvTranscoder/frame/Pixel.hpp index 28a09f62..206c8e38 100644 --- a/src/AvTranscoder/frame/Pixel.hpp +++ b/src/AvTranscoder/frame/Pixel.hpp @@ -44,7 +44,6 @@ class AvExport Pixel { } Pixel( const std::string& avPixelFormat ); - Pixel( const AVPixelFormat avPixelFormat ); void setBitsPerPixel ( const size_t pixelSize ) { _pixelSize = pixelSize; } From 6edc6020bd854eeaf0518c5d6d12c064a630ba8e Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 28 Nov 2014 15:08:29 +0100 Subject: [PATCH 30/64] Profile: update value of constants avProfileIdentificator --- src/AvTranscoder/ProfileLoader.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AvTranscoder/ProfileLoader.hpp b/src/AvTranscoder/ProfileLoader.hpp index ed18cecf..d4d08bdf 100644 --- a/src/AvTranscoder/ProfileLoader.hpp +++ b/src/AvTranscoder/ProfileLoader.hpp @@ -13,8 +13,8 @@ namespace avtranscoder namespace constants { - const std::string avProfileIdentificator = "avProfile"; - const std::string avProfileIdentificatorHuman = "avProfileLong"; + const std::string avProfileIdentificator = "avProfileName"; + const std::string avProfileIdentificatorHuman = "avProfileLongName"; const std::string avProfileType = "avProfileType"; const std::string avProfileTypeFormat = "avProfileTypeFormat"; const std::string avProfileTypeVideo = "avProfileTypeVideo"; From c8b1e6ebcfdb0d9949b10ceff1c7403c680bce8d Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 28 Nov 2014 15:07:09 +0100 Subject: [PATCH 31/64] Update README Add sections: * What you need to know * How to use --- README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f7294798..7a681c3a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,48 @@ # avTranscoder -C++ API for LibAV / FFMpeg +C++ API for Libav / FFmpeg -Based on LibAV/FFMpeg libraries to support various video formats, avTranscoder provides the high level API to re-wrap or transcode media easily. +Based on Libav/FFmpeg libraries to support various video and audio formats, avTranscoder provides the high level API to re-wrap or transcode media easily. -You can also use its Java & Python bindings for simpler integration in your own projects. +#### What you need to know +* C++ library +* Java and Python bindings generated with SWIG +* multiplateform (Linux, MAC, Windows) +* your call to be based on Libav, FFmpeg, or your custom fork of one of these librairies + +#### How to use +Check out applications contained in the project to see examples of how to use the library in C++, Java or Python. + +To encode, avTranscoder manipulates profiles. +A profile is a text file which discribes, with a set of key-value, what we want as output for the format, the video, or the audio. +You can create your own profiles and export a variable called ```AVPROFILES``` to indicate the path to them. + +The minimum format profile is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeFormat +format=formatName +``` + +The minimum video profile is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeVideo +codec=codecName +pix_fmt=pixelFormat +r=frameRate +``` + +The minimum audio profile is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeAudio +codec=codecName +sample_fmt=sampleFormat +``` #### Continuous Integration @@ -26,8 +64,16 @@ You can also use its Java & Python bindings for simpler integration in your own Python tests using nosetests. Create environment variables to use your files in tests. -* AVTRANSCODER_TEST_AUDIO_FILE -* AVTRANSCODER_TEST_VIDEO_FILE +* ```AVTRANSCODER_TEST_AUDIO_FILE``` +* ```AVTRANSCODER_TEST_VIDEO_FILE``` + +Note: for continuous integration, we launch tests with media files contained in ```avTranscoder-data``` repository. + +Launch the tests: +``` +cd test/pyTest +nosetests +``` #### Packaging From 01e578e7e3fafc63f630197d5f81904c76b84003 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 14:43:17 +0100 Subject: [PATCH 32/64] mediaProperty: skip unnecessary functions for SWIG --- src/AvTranscoder/mediaProperty/AttachementProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/AudioProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/DataProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/FileProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/SubtitleProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/UnknownProperties.hpp | 2 ++ src/AvTranscoder/mediaProperty/VideoProperties.hpp | 2 ++ 7 files changed, 14 insertions(+) diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index 9e5755ef..6b7791f2 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -19,7 +19,9 @@ class AvExport AttachementProperties size_t getStreamId() const { return _streamId; } MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index bc2165f3..9740dfe7 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -35,8 +35,10 @@ class AvExport AudioProperties size_t getBitRate() const { return _codecContext->bit_rate; } MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } AVCodecContext& getAVCodecContext() { return *_codecContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index 658f84a6..0deb37ac 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -19,7 +19,9 @@ class AvExport DataProperties size_t getStreamId() const { return _streamId; } MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 4e87b51f..4c7cc078 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -58,7 +58,9 @@ class AvExport FileProperties std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; } const std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index b08f69c8..49a3c565 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -19,7 +19,9 @@ class AvExport SubtitleProperties size_t getStreamId() const { return _streamId; } MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index 3e07a357..05fe457f 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -19,7 +19,9 @@ class AvExport UnknownProperties size_t getStreamId() const { return _streamId; } MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } +#endif MetadatasMap getDataMap() const; diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index f5143d45..ba95dd22 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -93,9 +93,11 @@ class AvExport VideoProperties MetadatasMap& getMetadatas() { return _metadatas; } +#ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } AVCodecContext& getAVCodecContext() { return *_codecContext; } const AVPixFmtDescriptor& getAVPixFmtDescriptor() { return *_pixFmt; } +#endif MetadatasMap getDataMap() const; ///< Warning: the method calls analyseGopStructure, which can modify state of the object From 53d90bc1a627978b7e9360d60b23b592e705830f Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 14:48:03 +0100 Subject: [PATCH 33/64] Progress: into OutputFile, add getProgressDuration method to compute progress --- src/AvTranscoder/file/OutputFile.cpp | 9 +++++++++ src/AvTranscoder/file/OutputFile.hpp | 1 + 2 files changed, 10 insertions(+) diff --git a/src/AvTranscoder/file/OutputFile.cpp b/src/AvTranscoder/file/OutputFile.cpp index 617c1867..a6bc229b 100644 --- a/src/AvTranscoder/file/OutputFile.cpp +++ b/src/AvTranscoder/file/OutputFile.cpp @@ -291,4 +291,13 @@ void OutputFile::setProfile( const ProfileLoader::Profile& profile ) } } +double OutputFile::getProgressDuration() +{ + AVStream* firstOutputStream = _formatContext->streams[0]; + if( firstOutputStream == NULL ) + throw std::runtime_error( "at least one stream must be set to get the progress duration" ); + double duration = av_q2d( firstOutputStream->time_base ) * firstOutputStream->cur_dts; + return duration; +} + } diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index 52163e4c..3a531535 100644 --- a/src/AvTranscoder/file/OutputFile.hpp +++ b/src/AvTranscoder/file/OutputFile.hpp @@ -110,6 +110,7 @@ class AvExport OutputFile virtual void setVerbose( bool verbose = false ){ _verbose = verbose; } AVFormatContext& getFormatContext() { return *_formatContext; } + double getProgressDuration(); private: std::vector _outputStreams; From 31d7a0cbe5ff34ef8038654d0d62b1110fd17095 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 14:49:55 +0100 Subject: [PATCH 34/64] Progress: update Transcoder progress computing --- src/AvTranscoder/transcoder/Transcoder.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index c0f4fcdc..5e9df8f7 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -317,10 +317,7 @@ void Transcoder::process( IProgress& progress ) if( ! frameProcessed ) break; - AVStream* firstOutputStream = _outputFile.getFormatContext().streams[0]; - double duration = av_q2d( firstOutputStream->time_base ) * firstOutputStream->cur_dts; - - if( progress.progress( duration, totalDuration ) == eJobStatusCancel ) + if( progress.progress( _outputFile.getProgressDuration(), totalDuration ) == eJobStatusCancel ) { break; } From 6eb4b0a67e9c5a3848e381d136366a403e066eea Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 14:51:53 +0100 Subject: [PATCH 35/64] Progress: into OutputFile, remove unused getFormatContext method Do not return FFmpeg dependant objects any more --- src/AvTranscoder/file/OutputFile.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index 3a531535..28f83912 100644 --- a/src/AvTranscoder/file/OutputFile.hpp +++ b/src/AvTranscoder/file/OutputFile.hpp @@ -109,7 +109,6 @@ class AvExport OutputFile virtual void setVerbose( bool verbose = false ){ _verbose = verbose; } - AVFormatContext& getFormatContext() { return *_formatContext; } double getProgressDuration(); private: From 9c432e8d3da8cf00f4210bebc22da729967fb68a Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 14:59:44 +0100 Subject: [PATCH 36/64] mediaProperty: check if access of properties is possible Throw exception if it's not possible and we can't return any value. --- .../mediaProperty/AudioProperties.cpp | 30 +++++++++ .../mediaProperty/AudioProperties.hpp | 8 +-- .../mediaProperty/FileProperties.cpp | 64 +++++++++++++++++++ .../mediaProperty/FileProperties.hpp | 18 +++--- 4 files changed, 107 insertions(+), 13 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 751183d9..b00d7a95 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -1,5 +1,7 @@ #include "AudioProperties.hpp" +#include + extern "C" { #include #include @@ -124,6 +126,34 @@ std::string AudioProperties::getChannelDescription() const #endif } +size_t AudioProperties::getCodecId() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + return _codecContext->codec_id; +} + +size_t AudioProperties::getSampleRate() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + return _codecContext->sample_rate; +} + +size_t AudioProperties::getChannels() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + return _codecContext->channels; +} + +size_t AudioProperties::getBitRate() const +{ + if( ! _codecContext ) + throw std::runtime_error( "unknown codec context" ); + return _codecContext->bit_rate; +} + MetadatasMap AudioProperties::getDataMap() const { MetadatasMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index 9740dfe7..036b8e94 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -29,10 +29,10 @@ class AvExport AudioProperties std::string getChannelName() const; std::string getChannelDescription() const; size_t getStreamId() const { return _streamId; } - size_t getCodecId() const { return _codecContext->codec_id; } - size_t getSampleRate() const { return _codecContext->sample_rate; } - size_t getChannels() const { return _codecContext->channels; } - size_t getBitRate() const { return _codecContext->bit_rate; } + size_t getCodecId() const; + size_t getSampleRate() const; + size_t getChannels() const; + size_t getBitRate() const; MetadatasMap& getMetadatas() { return _metadatas; } #ifndef SWIG diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/mediaProperty/FileProperties.cpp index 4636ca91..60400982 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.cpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.cpp @@ -1,5 +1,7 @@ #include "FileProperties.hpp" +#include + namespace avtranscoder { @@ -16,6 +18,68 @@ FileProperties::FileProperties( const AVFormatContext* formatContext ) detail::fillMetadataDictionnary( _formatContext->metadata, _metadatas ); } +std::string FileProperties::getFilename() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->filename; +} + +std::string FileProperties::getFormatName() const +{ + if( ! _formatContext || ! _formatContext->iformat ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->iformat->name; +} + +std::string FileProperties::getFormatLongName() const +{ + if( ! _formatContext || ! _formatContext->iformat ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->iformat->long_name; +} + +size_t FileProperties::getProgramsCount() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->nb_programs; +} + +double FileProperties::getStartTime() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return 1.0 * (unsigned int)_formatContext->start_time / AV_TIME_BASE; +} + +double FileProperties::getDuration() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return 1.0 * _formatContext->duration / AV_TIME_BASE; +} + +size_t FileProperties::getBitRate() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->bit_rate; +} + +size_t FileProperties::getPacketSize() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->packet_size; +} + +size_t FileProperties::getNbStreams() const +{ + if( ! _formatContext ) + throw std::runtime_error( "unknown format context" ); + return _formatContext->nb_streams; +} MetadatasMap FileProperties::getDataMap() const { diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 4c7cc078..5e5dec7c 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -25,19 +25,19 @@ class AvExport FileProperties public: FileProperties( const AVFormatContext* formatContext ); - std::string getFilename() const { return _formatContext->filename; } - std::string getFormatName() const { return _formatContext->iformat->name; } - std::string getFormatLongName() const { return _formatContext->iformat->long_name; } + std::string getFilename() const; + std::string getFormatName() const; + std::string getFormatLongName() const; - size_t getProgramsCount() const { return _formatContext->nb_programs; } - double getStartTime() const { return 1.0 * (unsigned int)_formatContext->start_time / AV_TIME_BASE; } - double getDuration() const { return 1.0 * _formatContext->duration / AV_TIME_BASE; } - size_t getBitRate() const { return _formatContext->bit_rate; } - size_t getPacketSize() const { return _formatContext->packet_size; } + size_t getProgramsCount() const; + double getStartTime() const; + double getDuration() const; + size_t getBitRate() const; + size_t getPacketSize() const; MetadatasMap& getMetadatas() { return _metadatas; } - size_t getNbStreams() const { return _formatContext->nb_streams; } + size_t getNbStreams() const; size_t getNbVideoStreams() const { return _videoStreams.size(); } size_t getNbAudioStreams() const { return _audioStreams.size(); } size_t getNbDataStreams() const { return _dataStreams.size(); } From ec7852c045ab67440ab1478dc0df414ae1a5c22f Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 14:59:59 +0100 Subject: [PATCH 37/64] VideoProperties: clean --- .../mediaProperty/VideoProperties.cpp | 24 ------------------- .../mediaProperty/VideoProperties.hpp | 2 +- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 84f04a4e..5408e55c 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -7,9 +7,7 @@ extern "C" { } #include -#include #include -#include #ifdef _MSC_VER #include @@ -331,7 +329,6 @@ int64_t VideoProperties::getStartTimecode() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->timecode_frame_start; } @@ -395,7 +392,6 @@ size_t VideoProperties::getCodecId() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->codec_id; } @@ -403,7 +399,6 @@ size_t VideoProperties::getBitRate() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->bit_rate; } @@ -411,7 +406,6 @@ size_t VideoProperties::getMaxBitRate() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->rc_max_rate; } @@ -419,7 +413,6 @@ size_t VideoProperties::getMinBitRate() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->rc_min_rate; } @@ -427,7 +420,6 @@ size_t VideoProperties::getTicksPerFrame() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->ticks_per_frame; } @@ -435,7 +427,6 @@ size_t VideoProperties::getWidth() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->width; } @@ -443,7 +434,6 @@ size_t VideoProperties::getHeight() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->height; } @@ -451,7 +441,6 @@ size_t VideoProperties::getGopSize() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->gop_size; } @@ -459,7 +448,6 @@ size_t VideoProperties::getDtgActiveFormat() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->dtg_active_format; } @@ -467,7 +455,6 @@ size_t VideoProperties::getReferencesFrames() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->refs; } @@ -475,7 +462,6 @@ int VideoProperties::getProfile() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->profile; } @@ -483,7 +469,6 @@ int VideoProperties::getLevel() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return _codecContext->level; } @@ -491,7 +476,6 @@ size_t VideoProperties::getComponentsCount() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return _pixFmt->nb_components; } @@ -499,7 +483,6 @@ size_t VideoProperties::getChromaWidth() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return _pixFmt->log2_chroma_w; } @@ -507,7 +490,6 @@ size_t VideoProperties::getChromaHeight() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return _pixFmt->log2_chroma_h; } @@ -524,7 +506,6 @@ bool VideoProperties::hasBFrames() const { if( ! _codecContext ) throw std::runtime_error( "unknown codec context" ); - return (bool) _codecContext->has_b_frames; } @@ -532,7 +513,6 @@ bool VideoProperties::isIndexedColors() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return (bool) _pixFmt->flags & PIX_FMT_PAL; } @@ -540,7 +520,6 @@ bool VideoProperties::isBitWisePacked() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return (bool) _pixFmt->flags & PIX_FMT_BITSTREAM; } @@ -548,7 +527,6 @@ bool VideoProperties::isHardwareAccelerated() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return (bool) _pixFmt->flags & PIX_FMT_HWACCEL; } @@ -556,7 +534,6 @@ bool VideoProperties::isPlanar() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return (bool) _pixFmt->flags & PIX_FMT_PLANAR; } @@ -564,7 +541,6 @@ bool VideoProperties::isRgbPixelData() const { if( ! _pixFmt ) throw std::runtime_error( "unknown pixel format" ); - return (bool) _pixFmt->flags & PIX_FMT_RGB; } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index ba95dd22..3c7da89e 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -99,7 +99,7 @@ class AvExport VideoProperties const AVPixFmtDescriptor& getAVPixFmtDescriptor() { return *_pixFmt; } #endif - MetadatasMap getDataMap() const; ///< Warning: the method calls analyseGopStructure, which can modify state of the object + MetadatasMap getDataMap() const; private: /** From 8efd1f10b161e7606ec422f3f7822e1ed8c15dc1 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 15:37:07 +0100 Subject: [PATCH 38/64] OutputFile: make getProgressDuration method virtual --- src/AvTranscoder/file/OutputFile.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index 28f83912..db6fb278 100644 --- a/src/AvTranscoder/file/OutputFile.hpp +++ b/src/AvTranscoder/file/OutputFile.hpp @@ -109,7 +109,7 @@ class AvExport OutputFile virtual void setVerbose( bool verbose = false ){ _verbose = verbose; } - double getProgressDuration(); + virtual double getProgressDuration(); private: std::vector _outputStreams; From 51cf36ef12de6e2c169c025a0031b124ccda5a6a Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 15:54:16 +0100 Subject: [PATCH 39/64] Transcoder: call init in process method * No need to expect the user to call init() before process(). * Note: the init() method can be called several times with no side effects. * Update pyTest. --- src/AvTranscoder/transcoder/StreamTranscoder.cpp | 2 +- src/AvTranscoder/transcoder/Transcoder.cpp | 3 ++- src/AvTranscoder/transcoder/Transcoder.hpp | 4 +++- test/pyTest/testTranscoderAdd.py | 1 - test/pyTest/testTranscoderTranscode.py | 7 ------- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index a881db5a..41fa3e00 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -259,7 +259,7 @@ StreamTranscoder::~StreamTranscoder() void StreamTranscoder::init() { - // rewrap + // rewrap case: no need to take care of the latency of codec if( ! _inputEssence ) return; diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 5e9df8f7..0c8e8c42 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -282,9 +282,10 @@ void Transcoder::process( IProgress& progress ) { throw std::runtime_error( "missing input streams in transcoder" ); } - + if( _verbose ) std::cout << "begin transcoding" << std::endl; + init(); _outputFile.beginWrap(); diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index fcd34c96..1059b147 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -112,7 +112,9 @@ class AvExport Transcoder /** * @brief Process all the streams, and ended the process depending on the transcode politic. - * @param progress + * @note The function manages all process: init(), beginWrap(), processFrame()s, and endWrap(). + * @param progress: choose a progress, or create your own in C++ or in bindings by inherit IProgress class. + * @see IProgress */ void process( IProgress& progress ); diff --git a/test/pyTest/testTranscoderAdd.py b/test/pyTest/testTranscoderAdd.py index ea5a6f91..ebb2304c 100644 --- a/test/pyTest/testTranscoderAdd.py +++ b/test/pyTest/testTranscoderAdd.py @@ -25,6 +25,5 @@ def testAddStreamTranscoder(): # process progress = av.NoDisplayProgress() - transcoder.init() transcoder.process( progress ) diff --git a/test/pyTest/testTranscoderTranscode.py b/test/pyTest/testTranscoderTranscode.py index 72f969fa..e593e3fa 100644 --- a/test/pyTest/testTranscoderTranscode.py +++ b/test/pyTest/testTranscoderTranscode.py @@ -17,7 +17,6 @@ def testTranscodeWave24b48kmono(): transcoder.add( inputFileName, 0, "wave24b48kmono" ) - transcoder.init() progress = av.ConsoleProgress() transcoder.process( progress ) @@ -47,7 +46,6 @@ def testTranscodeWave16b48kmono(): transcoder.add( inputFileName, 0, "wave16b48kmono" ) - transcoder.init() progress = av.ConsoleProgress() transcoder.process( progress ) @@ -77,7 +75,6 @@ def testTranscodeWave16b48kmono(): # transcoder.add( inputFileName, 0, "dnxhd120" ) -# transcoder.init() # progress = av.ConsoleProgress() # transcoder.process( progress ) @@ -106,7 +103,6 @@ def testTranscodeWave16b48kmono(): # transcoder.add( inputFileName, 0, "dnxhd185" ) -# transcoder.init() # progress = av.ConsoleProgress() # transcoder.process( progress ) @@ -135,7 +131,6 @@ def testTranscodeWave16b48kmono(): # transcoder.add( inputFileName, 0, "dnxhd185x" ) -# transcoder.init() # progress = av.ConsoleProgress() # transcoder.process( progress ) @@ -164,7 +159,6 @@ def testTranscodeWave16b48kmono(): # transcoder.add( inputFileName, 0, "xdcamhd422" ) -# transcoder.init() # progress = av.ConsoleProgress() # transcoder.process( progress ) @@ -213,7 +207,6 @@ def testTranscodeWave16b48kmono(): # transcoder.add( inputFileName, 0, customProfile ) -# transcoder.init() # progress = av.ConsoleProgress() # transcoder.process( progress ) From cfb36695441fe3b5e43a9a2692d0e62b4a2e5c2a Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 16:05:41 +0100 Subject: [PATCH 40/64] Transcoder: add private method getTotalDurationFromProcessMethod In order to simplify process method. --- src/AvTranscoder/transcoder/Transcoder.cpp | 32 +++++++++++----------- src/AvTranscoder/transcoder/Transcoder.hpp | 6 ++++ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 0c8e8c42..ffe8198f 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -289,22 +289,7 @@ void Transcoder::process( IProgress& progress ) _outputFile.beginWrap(); - double totalDuration = std::numeric_limits::max(); - switch( _eProcessMethod ) - { - case eProcessMethodShortest : - totalDuration = getMinTotalDuration(); - break; - case eProcessMethodLongest : - totalDuration = getMaxTotalDuration(); - break; - case eProcessMethodBasedOnStream : - totalDuration = getStreamDuration( _mainStreamIndex ); - break; - case eProcessMethodInfinity : - totalDuration = std::numeric_limits::max(); - break; - } + double totalDuration = getTotalDurationFromProcessMethod(); if( _verbose ) av_log_set_level( AV_LOG_DEBUG ); @@ -529,4 +514,19 @@ double Transcoder::getMaxTotalDuration() const return maxTotalDuration; } +double Transcoder::getTotalDurationFromProcessMethod() const +{ + switch( _eProcessMethod ) + { + case eProcessMethodShortest : + return getMinTotalDuration(); + case eProcessMethodLongest : + return getMaxTotalDuration(); + case eProcessMethodBasedOnStream : + return getStreamDuration( _mainStreamIndex ); + case eProcessMethodInfinity : + return std::numeric_limits::max(); + } +} + } diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index 1059b147..c2008255 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -166,6 +166,12 @@ class AvExport Transcoder */ double getMaxTotalDuration() const; + /** + * @brief Get the duration of the output program + * @note Depends on the streams, the process method, and the main stream index. + */ + double getTotalDurationFromProcessMethod() const; + private: OutputFile& _outputFile; ///< The output media file after process. std::vector< InputFile* > _inputFiles; ///< The list of input files which contain added streams. From 50222f3cbbaaa245042c96128e66279cd9053858 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 16:08:38 +0100 Subject: [PATCH 41/64] Transcoder: refactore process * Clean indentation. * Avoid while( 1 ). * Suppress warning of getTotalDurationFromProcessMethod: add default case in switch. --- src/AvTranscoder/transcoder/Transcoder.cpp | 26 +++++++++------------- src/AvTranscoder/transcoder/Transcoder.hpp | 2 -- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index ffe8198f..cd9b5f2f 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -252,19 +252,17 @@ void Transcoder::init() bool Transcoder::processFrame() { if( _streamTranscoders.size() == 0 ) - { return false; - } if( _verbose ) std::cout << "process frame" << std::endl; + for( size_t streamIndex = 0; streamIndex < _streamTranscoders.size(); ++streamIndex ) { if( _verbose ) std::cout << "process stream " << streamIndex << "/" << _streamTranscoders.size() - 1 << std::endl; bool streamProcessStatus = _streamTranscoders.at( streamIndex )->processFrame(); - if( ! streamProcessStatus ) { _streamTranscoders.clear(); @@ -276,12 +274,8 @@ bool Transcoder::processFrame() void Transcoder::process( IProgress& progress ) { - size_t frame = 0; - - if( ! _streamTranscoders.size() ) - { + if( _streamTranscoders.size() == 0 ) throw std::runtime_error( "missing input streams in transcoder" ); - } if( _verbose ) std::cout << "begin transcoding" << std::endl; @@ -289,24 +283,22 @@ void Transcoder::process( IProgress& progress ) _outputFile.beginWrap(); - double totalDuration = getTotalDurationFromProcessMethod(); - if( _verbose ) av_log_set_level( AV_LOG_DEBUG ); - while( 1 ) + double totalDuration = getTotalDurationFromProcessMethod(); + + size_t frame = 0; + bool frameProcessed = true; + while( frameProcessed ) { if( _verbose ) std::cout << "process frame " << frame << std::endl; - bool frameProcessed = processFrame(); - if( ! frameProcessed ) - break; + frameProcessed = processFrame(); if( progress.progress( _outputFile.getProgressDuration(), totalDuration ) == eJobStatusCancel ) - { break; - } ++frame; } @@ -526,6 +518,8 @@ double Transcoder::getTotalDurationFromProcessMethod() const return getStreamDuration( _mainStreamIndex ); case eProcessMethodInfinity : return std::numeric_limits::max(); + default: + return getMaxTotalDuration(); } } diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index c2008255..923a8f86 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -43,7 +43,6 @@ enum EProcessMethod class AvExport Transcoder { public: - Transcoder( OutputFile& outputFile ); ~Transcoder(); @@ -139,7 +138,6 @@ class AvExport Transcoder void setVerbose( bool verbose = true ); private: - void addRewrapStream( const std::string& filename, const size_t streamIndex ); void addTranscodeStream( const std::string& filename, const size_t streamIndex, const size_t subStreamIndex, const size_t offset ); ///< Get profile from input From 3088120e83818302313c1b1b5d0995048fdf949b Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 16:45:53 +0100 Subject: [PATCH 42/64] Transcoder: add private method manageInfinityStreamFromProcessMethod Can call setProcessMethod before adding the streams. --- src/AvTranscoder/transcoder/Transcoder.cpp | 61 ++++++++++++---------- src/AvTranscoder/transcoder/Transcoder.hpp | 6 ++- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index cd9b5f2f..6f373ecf 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -277,6 +277,8 @@ void Transcoder::process( IProgress& progress ) if( _streamTranscoders.size() == 0 ) throw std::runtime_error( "missing input streams in transcoder" ); + manageInfinityStreamFromProcessMethod(); + if( _verbose ) std::cout << "begin transcoding" << std::endl; init(); @@ -313,34 +315,6 @@ void Transcoder::setProcessMethod( const EProcessMethod eProcessMethod, const si { _eProcessMethod = eProcessMethod; _mainStreamIndex = indexBasedStream; - - for( size_t i = 0; i < _streamTranscoders.size(); ++i ) - { - switch( _eProcessMethod ) - { - case eProcessMethodShortest : - if( _streamTranscoders.at( i )->getDuration() == getMinTotalDuration() ) - _streamTranscoders.at( i )->setInfinityStream( false ); - else - _streamTranscoders.at( i )->setInfinityStream( true ); - break; - case eProcessMethodLongest : - if( _streamTranscoders.at( i )->getDuration() == getMaxTotalDuration() ) - _streamTranscoders.at( i )->setInfinityStream( false ); - else - _streamTranscoders.at( i )->setInfinityStream( true ); - break; - case eProcessMethodBasedOnStream : - if( i != _mainStreamIndex ) - _streamTranscoders.at( i )->setInfinityStream( true ); - else - _streamTranscoders.at( i )->setInfinityStream( false ); - break; - case eProcessMethodInfinity : - _streamTranscoders.at( i )->setInfinityStream( true ); - break; - } - } } void Transcoder::setVerbose( bool verbose ) @@ -523,4 +497,35 @@ double Transcoder::getTotalDurationFromProcessMethod() const } } +void Transcoder::manageInfinityStreamFromProcessMethod() +{ + for( size_t i = 0; i < _streamTranscoders.size(); ++i ) + { + switch( _eProcessMethod ) + { + case eProcessMethodShortest : + if( _streamTranscoders.at( i )->getDuration() == getMinTotalDuration() ) + _streamTranscoders.at( i )->setInfinityStream( false ); + else + _streamTranscoders.at( i )->setInfinityStream( true ); + break; + case eProcessMethodLongest : + if( _streamTranscoders.at( i )->getDuration() == getMaxTotalDuration() ) + _streamTranscoders.at( i )->setInfinityStream( false ); + else + _streamTranscoders.at( i )->setInfinityStream( true ); + break; + case eProcessMethodBasedOnStream : + if( i != _mainStreamIndex ) + _streamTranscoders.at( i )->setInfinityStream( true ); + else + _streamTranscoders.at( i )->setInfinityStream( false ); + break; + case eProcessMethodInfinity : + _streamTranscoders.at( i )->setInfinityStream( true ); + break; + } + } +} + } diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index 923a8f86..e6e54e11 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -125,7 +125,6 @@ class AvExport Transcoder /** * @brief Set the transcodage politic. - * @note Call it after adding the streams. * @note By default eProcessMethodLongest. * @param indexBasedStream: in case of process method eProcessMethodBasedOnStream, stop transcode at the end of the indicated stream. */ @@ -170,6 +169,11 @@ class AvExport Transcoder */ double getTotalDurationFromProcessMethod() const; + /** + * @brief Set for each StreamTranscoder if it is an infinity stream (switch to generator at the end of the stream). + */ + void manageInfinityStreamFromProcessMethod(); + private: OutputFile& _outputFile; ///< The output media file after process. std::vector< InputFile* > _inputFiles; ///< The list of input files which contain added streams. From d6d95454ddd3367e355d64c3308af1d1976821e2 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 16:46:56 +0100 Subject: [PATCH 43/64] genericProcessor: clean * Remove comment. * No need to call init(). --- app/genericProcessor/genericProcessor.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/genericProcessor/genericProcessor.cpp b/app/genericProcessor/genericProcessor.cpp index 95591013..db03b50e 100644 --- a/app/genericProcessor/genericProcessor.cpp +++ b/app/genericProcessor/genericProcessor.cpp @@ -114,14 +114,11 @@ int main( int argc, char** argv ) // set verbose of all stream transcoder.setVerbose( verbose ); transcoder.setProcessMethod( avtranscoder::eProcessMethodLongest ); - transcoder.init(); if( verbose ) std::cout << "start Transcode" << std::endl; avtranscoder::ConsoleProgress progress; - - // video re-wrapping or transcoding if necessary transcoder.process( progress ); std::cout << std::endl; From 4be8bceec20f2a206f7870feed2a08ae949b8140 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 17:05:16 +0100 Subject: [PATCH 44/64] Transcoder: manage FFmpeg log level * Set it to AV_LOG_QUIET in Transcoder constructor. * Set it to AV_LOG_DEBUG if setVerbose of Transcoder to true. --- src/AvTranscoder/transcoder/Transcoder.cpp | 11 ++++++++--- src/AvTranscoder/transcoder/Transcoder.hpp | 6 +++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 6f373ecf..2791bbd2 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -22,7 +22,11 @@ Transcoder::Transcoder( OutputFile& outputFile ) , _mainStreamIndex( 0 ) , _verbose( false ) { + // Initialize the OutputFile _outputFile.setup(); + + // Print no output from ffmpeg + av_log_set_level( AV_LOG_QUIET ); } Transcoder::~Transcoder() @@ -285,9 +289,6 @@ void Transcoder::process( IProgress& progress ) _outputFile.beginWrap(); - if( _verbose ) - av_log_set_level( AV_LOG_DEBUG ); - double totalDuration = getTotalDurationFromProcessMethod(); size_t frame = 0; @@ -325,6 +326,10 @@ void Transcoder::setVerbose( bool verbose ) (*it)->setVerbose( _verbose ); } _outputFile.setVerbose( _verbose ); + + // Print stuff which is only useful for ffmpeg developers. + if( _verbose ) + av_log_set_level( AV_LOG_DEBUG ); } void Transcoder::addRewrapStream( const std::string& filename, const size_t streamIndex ) diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index e6e54e11..ea50ddce 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -43,6 +43,9 @@ enum EProcessMethod class AvExport Transcoder { public: + /** + * @note Set FFmpeg log level to quite. + */ Transcoder( OutputFile& outputFile ); ~Transcoder(); @@ -131,8 +134,9 @@ class AvExport Transcoder void setProcessMethod( const EProcessMethod eProcessMethod, const size_t indexBasedStream = 0 ); /** - * @brief Set verbose mode for the Transcoder and its streams. + * @brief Set verbose mode for the Transcoder, its streams, and its output file. * @note If you call it before adding the streams, no verbose mode will be set for the new streams. + * @note set av log level to AV_LOG_DEBUG */ void setVerbose( bool verbose = true ); From 342608247c76d809a99bfde52616e0b4bcaf9403 Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 19:10:27 +0100 Subject: [PATCH 45/64] InputFile: into readNextPacket, return expected data (instead of caching it) --- src/AvTranscoder/file/InputFile.cpp | 16 +++++++++++----- src/AvTranscoder/file/InputFile.hpp | 11 ++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index e957c473..1c15b859 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -144,7 +144,7 @@ AvInputStream& InputFile::getStream( size_t index ) return *_inputStreams.at( index ); } -bool InputFile::readNextPacket( const size_t streamIndex ) +bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex ) { AVPacket packet; av_init_packet( &packet ); @@ -157,15 +157,21 @@ bool InputFile::readNextPacket( const size_t streamIndex ) return false; } - // send packet to stream buffer - _inputStreams.at( packet.stream_index )->addPacket( packet ); - - // We only read one stream and skip others + // if the packet stream is the expected one + // copy and return the packet data if( packet.stream_index == (int)streamIndex ) { + data.getBuffer().resize( packet.size ); + if( packet.size != 0 ) + memcpy( data.getPtr(), packet.data, packet.size ); av_free_packet( &packet ); return true; } + // else add the packet data to the stream cache + else + { + _inputStreams.at( packet.stream_index )->addPacket( packet ); + } // do not delete these 2 lines // need to skip packet, delete this one and re-init for reading the next one diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 6283f977..291000ee 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -86,16 +86,17 @@ class AvExport InputFile AVFormatContext& getFormatContext() const { return *_formatContext; } /** - * @brief Read the next packet for the specified stream - * @note For performances, each readed stream needs to be bufferized using the readStream() method. - * @return if next packet was succefully readed + * @brief Read the next packet of the specified stream + * @param data: data of next packet read + * @note For performances, each read stream needs to be bufferized using the readStream() method. + * @return if next packet was succefully read **/ - bool readNextPacket( const size_t streamIndex ); + bool readNextPacket( CodedData& data, const size_t streamIndex ); /** * @brief Seek input stream at specified frame * @note clean also buffers in each InputStream - * @return if next packet was succefully readed + * @return if next packet was succefully read **/ void seekAtFrame( const size_t frame ); From 6f99c61547716674bb411e8640fb127acaa2a7de Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Wed, 3 Dec 2014 19:13:04 +0100 Subject: [PATCH 46/64] AvInputStream: extract data from file only if the stream cache is empty --- .../codedStream/AvInputStream.cpp | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index e1440f06..1a1c3e25 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -72,43 +72,32 @@ bool AvInputStream::readNextPacket( CodedData& data ) if( ! _bufferized ) throw std::runtime_error( "Can't read packet on non-bufferized input stream." ); - if( _streamCache.empty() ) - _inputFile->readNextPacket( _streamIndex ); - - if( _streamCache.empty() ) - return false; - - _streamCache.front().getBuffer().swap( data.getBuffer() ); - - _streamCache.erase( _streamCache.begin() ); + // if packet is already cached + if( ! _streamCache.empty() ) + { + _streamCache.front().getBuffer().swap( data.getBuffer() ); + _streamCache.erase( _streamCache.begin() ); + } + // else read next packet + else + { + return _inputFile->readNextPacket( data, _streamIndex ) && _streamCache.empty(); + } return true; } void AvInputStream::addPacket( AVPacket& packet ) { - //std::cout << "add packet for stream " << _streamIndex << std::endl; - CodedData data; - _streamCache.push_back( data ); - + // Do not cache data if the stream is declared as unused in process if( ! _bufferized ) return; - // is it possible to remove this copy ? - // using : av_packet_unref ? + CodedData data; + _streamCache.push_back( data ); _streamCache.back().getBuffer().resize( packet.size ); if( packet.size != 0 ) memcpy( _streamCache.back().getPtr(), packet.data, packet.size ); - - // std::vector tmpData( 0,0 ); - // &tmpData[0] = packet.data; - // tmpData.size( packet.size ); - - // remove reference on packet because it's passed to CodedData - // packet.data = NULL; - // packet.size = 0; - - // std::cout << this << " buffer size " << _streamCache.size() << std::endl; } VideoCodec& AvInputStream::getVideoCodec() From 34084cd77133fa6707f5dc6be8bcc63e871504e8 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 19:13:31 +0100 Subject: [PATCH 47/64] Clean use of av_strerror * Use macro AV_ERROR_MAX_STRING_SIZE. * Get size of errbuf with sizeof array. --- src/AvTranscoder/essenceStream/AvInputAudio.cpp | 14 ++++++-------- src/AvTranscoder/essenceStream/AvInputVideo.cpp | 5 ++--- src/AvTranscoder/essenceStream/AvOutputAudio.cpp | 14 ++++++-------- src/AvTranscoder/essenceStream/AvOutputVideo.cpp | 4 ++-- src/AvTranscoder/file/OutputFile.cpp | 12 ++++++------ src/AvTranscoder/option/Option.cpp | 14 +++++++------- 6 files changed, 29 insertions(+), 34 deletions(-) diff --git a/src/AvTranscoder/essenceStream/AvInputAudio.cpp b/src/AvTranscoder/essenceStream/AvInputAudio.cpp index e369d88d..92b0bbf1 100644 --- a/src/AvTranscoder/essenceStream/AvInputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvInputAudio.cpp @@ -59,13 +59,13 @@ void AvInputAudio::setup() msg += avCodec->long_name; msg += " ("; msg += avCodec->name; - msg += ")"; + msg += ") "; avcodec_close( avCodecContext ); - char err[250]; + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); + msg += err; - av_strerror( ret, err, 250 ); - std::cout << err << std::endl; throw std::runtime_error( msg ); } @@ -173,12 +173,10 @@ bool AvInputAudio::decodeNextFrame() packet.size = data.getSize(); int ret = avcodec_decode_audio4( _codec->getAVCodecContext(), _frame, &got_frame, &packet ); - if( ret < 0 ) { - char err[250]; - av_strerror( ret, err, 250 ); - + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); throw std::runtime_error( "an error occured during audio decoding" + std::string( err ) ); } diff --git a/src/AvTranscoder/essenceStream/AvInputVideo.cpp b/src/AvTranscoder/essenceStream/AvInputVideo.cpp index 224b4dc8..50677416 100644 --- a/src/AvTranscoder/essenceStream/AvInputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvInputVideo.cpp @@ -119,9 +119,8 @@ bool AvInputVideo::decodeNextFrame() int ret = avcodec_decode_video2( _codec->getAVCodecContext(), _frame, &got_frame, &packet ); if( ret < 0 ) { - char err[250]; - av_strerror( ret, err, 250); - + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); throw std::runtime_error( "an error occured during video decoding - " + std::string(err) ); } av_free_packet( &packet ); diff --git a/src/AvTranscoder/essenceStream/AvOutputAudio.cpp b/src/AvTranscoder/essenceStream/AvOutputAudio.cpp index 1f1100ce..56b0b273 100644 --- a/src/AvTranscoder/essenceStream/AvOutputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputAudio.cpp @@ -34,8 +34,8 @@ void AvOutputAudio::setup() int ret = avcodec_open2( codecContext, _codec.getAVCodec(), NULL ); if( ret < 0 ) { - char err[250]; - av_strerror( ret, err, 250); + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); std::string msg = "could not open audio encoder: "; msg += err; throw std::runtime_error( msg ); @@ -69,18 +69,16 @@ bool AvOutputAudio::encodeFrame( const Frame& sourceFrame, Frame& codedFrame ) int buffer_size = av_samples_get_buffer_size( NULL, codecContext->channels, frame->nb_samples, codecContext->sample_fmt, 0 ); if( buffer_size < 0 ) { - char err[250]; - av_strerror( buffer_size, err, 250 ); - + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( buffer_size, err, sizeof(err) ); throw std::runtime_error( "EncodeFrame error: buffer size < 0 - " + std::string(err) ); } int retvalue = avcodec_fill_audio_frame( frame, codecContext->channels, codecContext->sample_fmt, sourceAudioFrame.getPtr(), buffer_size, 0 ); if( retvalue < 0 ) { - char err[250]; - av_strerror( retvalue, err, 250); - + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( retvalue, err, sizeof(err) ); throw std::runtime_error( "EncodeFrame error: avcodec fill audio frame - " + std::string( err ) ); } diff --git a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp index fe082379..3ec8fde1 100644 --- a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp @@ -35,8 +35,8 @@ void AvOutputVideo::setup( ) int ret = avcodec_open2( codecContext, _codec.getAVCodec(), NULL ); if( ret < 0 ) { - char err[250]; - av_strerror( ret, err, 250); + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); std::string msg = "could not open video encoder: "; msg += err; throw std::runtime_error( msg ); diff --git a/src/AvTranscoder/file/OutputFile.cpp b/src/AvTranscoder/file/OutputFile.cpp index a6bc229b..5d67d71a 100644 --- a/src/AvTranscoder/file/OutputFile.cpp +++ b/src/AvTranscoder/file/OutputFile.cpp @@ -136,8 +136,8 @@ bool OutputFile::beginWrap( ) int ret = avformat_write_header( _formatContext, NULL ); if( ret != 0 ) { - char err[250]; - av_strerror( ret, err, 250); + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); std::string msg = "could not write header: "; msg += err; throw std::runtime_error( msg ); @@ -170,8 +170,8 @@ IOutputStream::EWrappingStatus OutputFile::wrap( const CodedData& data, const si if( ret != 0 ) { - char err[250]; - av_strerror( ret, err, 250); + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); std::string msg = "error when writting packet in stream: "; msg += err; // throw std::runtime_error( msg ); @@ -229,8 +229,8 @@ void OutputFile::addMetadata( const std::string& key, const std::string& value ) int ret = av_dict_set( &_formatContext->metadata, key.c_str(), value.c_str(), 0 ); if( ret < 0 ) { - char err[250]; - av_strerror( ret, err, 250 ); + char err[AV_ERROR_MAX_STRING_SIZE]; + av_strerror( ret, err, sizeof(err) ); std::cout << err << std::endl; } } diff --git a/src/AvTranscoder/option/Option.cpp b/src/AvTranscoder/option/Option.cpp index eccceb3c..afc94799 100644 --- a/src/AvTranscoder/option/Option.cpp +++ b/src/AvTranscoder/option/Option.cpp @@ -98,7 +98,7 @@ void Option::setFlag( const std::string& flag, const bool enable ) if( error ) { char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "unknown key " + getName() + ": " + err ); } @@ -111,7 +111,7 @@ void Option::setFlag( const std::string& flag, const bool enable ) if( error ) { char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + flag + ": " + err ); } } @@ -122,7 +122,7 @@ void Option::setBool( const bool value ) if( error ) { char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + ( value ? "true" : "false" ) + ": " + err ); } } @@ -135,7 +135,7 @@ void Option::setInt( const int value ) std::ostringstream os; os << value; char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + os.str() + ": " + err ); } } @@ -151,7 +151,7 @@ void Option::setRatio( const int num, const int den ) std::ostringstream os; os << num << "/" << den; char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + os.str() + ": " + err ); } } @@ -164,7 +164,7 @@ void Option::setDouble( const double value ) std::ostringstream os; os << value; char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + os.str() + ": " + err ); } } @@ -175,7 +175,7 @@ void Option::setString( const std::string& value ) if( error ) { char err[AV_ERROR_MAX_STRING_SIZE]; - av_strerror( error, err, AV_ERROR_MAX_STRING_SIZE ); + av_strerror( error, err, sizeof(err) ); throw std::runtime_error( "setting " + getName() + " parameter to " + value + ": " + err ); } } From 8d48d710389cac70d25cdef629c5897e0515c8f5 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 15:26:11 +0100 Subject: [PATCH 48/64] mediaProperty: rename type MetadatasMap to PropertiesMap This type is not only used for metadatas, so the new name avoid confusion. --- src/AvTranscoder/file/OutputFile.cpp | 4 +-- src/AvTranscoder/file/OutputFile.hpp | 2 +- .../mediaProperty/AttachementProperties.cpp | 4 +-- .../mediaProperty/AttachementProperties.hpp | 6 ++-- .../mediaProperty/AudioProperties.cpp | 4 +-- .../mediaProperty/AudioProperties.hpp | 6 ++-- .../mediaProperty/DataProperties.cpp | 4 +-- .../mediaProperty/DataProperties.hpp | 6 ++-- .../mediaProperty/FileProperties.cpp | 4 +-- .../mediaProperty/FileProperties.hpp | 6 ++-- .../mediaProperty/SubtitleProperties.cpp | 4 +-- .../mediaProperty/SubtitleProperties.hpp | 6 ++-- .../mediaProperty/UnknownProperties.cpp | 4 +-- .../mediaProperty/UnknownProperties.hpp | 6 ++-- .../mediaProperty/VideoProperties.cpp | 4 +-- .../mediaProperty/VideoProperties.hpp | 6 ++-- .../mediaProperty/mediaProperty.i | 4 +-- src/AvTranscoder/mediaProperty/print.hpp | 30 +++++++++---------- src/AvTranscoder/mediaProperty/util.cpp | 10 +++---- src/AvTranscoder/mediaProperty/util.hpp | 14 ++++----- 20 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/AvTranscoder/file/OutputFile.cpp b/src/AvTranscoder/file/OutputFile.cpp index 617c1867..ed49db83 100644 --- a/src/AvTranscoder/file/OutputFile.cpp +++ b/src/AvTranscoder/file/OutputFile.cpp @@ -216,9 +216,9 @@ bool OutputFile::endWrap( ) return true; } -void OutputFile::addMetadata( const MetadatasMap& dataMap ) +void OutputFile::addMetadata( const PropertiesMap& dataMap ) { - for( MetadatasMap::const_iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + for( PropertiesMap::const_iterator it = dataMap.begin(); it != dataMap.end(); ++it ) { addMetadata( it->first, it->second ); } diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index 52163e4c..97b2ab41 100644 --- a/src/AvTranscoder/file/OutputFile.hpp +++ b/src/AvTranscoder/file/OutputFile.hpp @@ -104,7 +104,7 @@ class AvExport OutputFile * @brief Add metadata to the output file. * @note Depending on the format, you are not sure to find your metadata after the transcode. */ - virtual void addMetadata( const MetadatasMap& dataMap ); + virtual void addMetadata( const PropertiesMap& dataMap ); virtual void addMetadata( const std::string& key, const std::string& value ); virtual void setVerbose( bool verbose = false ){ _verbose = verbose; } diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp index 0250d986..e150c90e 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp @@ -11,9 +11,9 @@ AttachementProperties::AttachementProperties( const AVFormatContext* formatConte detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -MetadatasMap AttachementProperties::getDataMap() const +PropertiesMap AttachementProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", _streamId ); diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index 6b7791f2..c1d09264 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -17,19 +17,19 @@ class AvExport AttachementProperties AttachementProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: const AVFormatContext* _formatContext; ///< Has link (no ownership) size_t _streamId; - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index b00d7a95..0fc43d2b 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -154,9 +154,9 @@ size_t AudioProperties::getBitRate() const return _codecContext->bit_rate; } -MetadatasMap AudioProperties::getDataMap() const +PropertiesMap AudioProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", getStreamId() ); detail::add( dataMap, "codecId", getCodecId() ); diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index 036b8e94..f003a607 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -33,14 +33,14 @@ class AvExport AudioProperties size_t getSampleRate() const; size_t getChannels() const; size_t getBitRate() const; - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } AVCodecContext& getAVCodecContext() { return *_codecContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: const AVFormatContext* _formatContext; ///< Has link (no ownership) @@ -48,7 +48,7 @@ class AvExport AudioProperties AVCodec* _codec; ///< Has link (no ownership) size_t _streamId; - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/mediaProperty/DataProperties.cpp index 6043c44f..ba294125 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.cpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.cpp @@ -22,9 +22,9 @@ DataProperties::DataProperties( const AVFormatContext* formatContext, const size detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -MetadatasMap DataProperties::getDataMap() const +PropertiesMap DataProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", _streamId ); diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index 0deb37ac..e11df6db 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -17,13 +17,13 @@ class AvExport DataProperties DataProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: void detectAncillaryData(); @@ -32,7 +32,7 @@ class AvExport DataProperties const AVFormatContext* _formatContext; ///< Has link (no ownership) size_t _streamId; - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/mediaProperty/FileProperties.cpp index 60400982..1132ecae 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.cpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.cpp @@ -81,9 +81,9 @@ size_t FileProperties::getNbStreams() const return _formatContext->nb_streams; } -MetadatasMap FileProperties::getDataMap() const +PropertiesMap FileProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "filename", getFilename() ); detail::add( dataMap, "formatName", getFormatName() ); diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 5e5dec7c..b05a0195 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -35,7 +35,7 @@ class AvExport FileProperties size_t getBitRate() const; size_t getPacketSize() const; - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } size_t getNbStreams() const; size_t getNbVideoStreams() const { return _videoStreams.size(); } @@ -62,7 +62,7 @@ class AvExport FileProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: const AVFormatContext* _formatContext; ///< Has link (no ownership) @@ -74,7 +74,7 @@ class AvExport FileProperties std::vector< AttachementProperties > _attachementStreams; ///< Array of properties per attachement stream std::vector< UnknownProperties > _unknownStreams; ///< Array of properties per unknown stream - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp index 8dd124ca..3d2a202a 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp @@ -11,9 +11,9 @@ SubtitleProperties::SubtitleProperties( const AVFormatContext* formatContext, co detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -MetadatasMap SubtitleProperties::getDataMap() const +PropertiesMap SubtitleProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", _streamId ); diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index 49a3c565..2569a6f9 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -17,19 +17,19 @@ class AvExport SubtitleProperties SubtitleProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: const AVFormatContext* _formatContext; ///< Has link (no ownership) size_t _streamId; - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp index 386838a3..75663656 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp @@ -11,9 +11,9 @@ UnknownProperties::UnknownProperties( const AVFormatContext* formatContext, cons detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -MetadatasMap UnknownProperties::getDataMap() const +PropertiesMap UnknownProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", _streamId ); diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index 05fe457f..340eaa0c 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -17,19 +17,19 @@ class AvExport UnknownProperties UnknownProperties( const AVFormatContext* formatContext, const size_t index ); size_t getStreamId() const { return _streamId; } - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: const AVFormatContext* _formatContext; ///< Has link (no ownership) size_t _streamId; - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index 5408e55c..b996ba5f 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -648,9 +648,9 @@ std::vector VideoProperties::getChannels() const return channels; } -MetadatasMap VideoProperties::getDataMap() const +PropertiesMap VideoProperties::getDataMap() const { - MetadatasMap dataMap; + PropertiesMap dataMap; detail::add( dataMap, "streamId", getStreamId() ); detail::add( dataMap, "codecId", getCodecId() ); diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 3c7da89e..3e57c4ae 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -91,7 +91,7 @@ class AvExport VideoProperties std::vector getChannels() const; - MetadatasMap& getMetadatas() { return _metadatas; } + PropertiesMap& getMetadatas() { return _metadatas; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } @@ -99,7 +99,7 @@ class AvExport VideoProperties const AVPixFmtDescriptor& getAVPixFmtDescriptor() { return *_pixFmt; } #endif - MetadatasMap getDataMap() const; + PropertiesMap getDataMap() const; private: /** @@ -121,7 +121,7 @@ class AvExport VideoProperties bool _isTopFieldFirst; std::vector< std::pair< char, bool > > _gopStructure; //@} - MetadatasMap _metadatas; + PropertiesMap _metadatas; }; } diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/mediaProperty/mediaProperty.i index 2d6fa5fd..502c3579 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/mediaProperty/mediaProperty.i @@ -34,8 +34,8 @@ namespace std { %template(AttachementVector) vector< avtranscoder::AttachementProperties >; %template(UnknownVector) vector< avtranscoder::UnknownProperties >; -%template(MetadataPair) pair< string, string >; -%template(MetadatasVector) vector< pair< string, string > >; +%template(PropertyPair) pair< string, string >; +%template(PropertyVector) vector< pair< string, string > >; %template(GopPair) pair< char, bool >; %template(GopVector) vector< pair< char, bool > >; diff --git a/src/AvTranscoder/mediaProperty/print.hpp b/src/AvTranscoder/mediaProperty/print.hpp index 92ce2561..724ad7b9 100644 --- a/src/AvTranscoder/mediaProperty/print.hpp +++ b/src/AvTranscoder/mediaProperty/print.hpp @@ -14,13 +14,13 @@ namespace avtranscoder static const size_t keyWidth = 32; static const std::string separator = "===================="; -std::ostream& operator<<( std::ostream& flux, const FileProperties& properties ) +std::ostream& operator<<( std::ostream& flux, const FileProperties& fileProperties ) { flux << std::left; flux << separator << " Wrapper " << separator << std::endl; - MetadatasMap dataMap = properties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = fileProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -33,8 +33,8 @@ std::ostream& operator<<( std::ostream& flux, const VideoProperties& videoProper flux << std::left; flux << separator << " Video stream " << separator << std::endl; - MetadatasMap dataMap = videoProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = videoProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -47,8 +47,8 @@ std::ostream& operator<<( std::ostream& flux, const AudioProperties& audioProper flux << std::left; flux << separator << " Audio stream " << separator << std::endl; - MetadatasMap dataMap = audioProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = audioProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -60,8 +60,8 @@ std::ostream& operator<<( std::ostream& flux, const DataProperties& dataProperti { flux << separator << " Data stream " << separator << std::endl; - MetadatasMap dataMap = dataProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = dataProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -73,8 +73,8 @@ std::ostream& operator<<( std::ostream& flux, const SubtitleProperties& subtitle { flux << separator << " Subtitle stream " << separator << std::endl; - MetadatasMap dataMap = subtitleProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = subtitleProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -86,8 +86,8 @@ std::ostream& operator<<( std::ostream& flux, const AttachementProperties& attac { flux << separator << " Attachement stream " << separator << std::endl; - MetadatasMap dataMap = attachementProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = attachementProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } @@ -99,8 +99,8 @@ std::ostream& operator<<( std::ostream& flux, const UnknownProperties& unknownPr { flux << separator << " Unknown stream " << separator << std::endl; - MetadatasMap dataMap = unknownProperties.getDataMap(); - for( MetadatasMap::iterator it = dataMap.begin(); it != dataMap.end(); ++it ) + PropertiesMap properties = unknownProperties.getDataMap(); + for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; } diff --git a/src/AvTranscoder/mediaProperty/util.cpp b/src/AvTranscoder/mediaProperty/util.cpp index 6b4ab4dc..8aff1a47 100644 --- a/src/AvTranscoder/mediaProperty/util.cpp +++ b/src/AvTranscoder/mediaProperty/util.cpp @@ -11,18 +11,18 @@ namespace detail { template<> -void add( MetadatasMap& dataMap, const std::string& key, const std::string& value ) +void add( PropertiesMap& propertiesMap, const std::string& key, const std::string& value ) { - dataMap.push_back( std::make_pair( key, value ) ); + propertiesMap.push_back( std::make_pair( key, value ) ); } template<> -void add( MetadatasMap& dataMap, const std::string& key, const bool& value ) +void add( PropertiesMap& propertiesMap, const std::string& key, const bool& value ) { - add( dataMap, key, value ? "True" : "False" ); + add( propertiesMap, key, value ? "True" : "False" ); } -void fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadata ) +void fillMetadataDictionnary( AVDictionary* avdictionnary, PropertiesMap& metadata ) { AVDictionaryEntry* tag = NULL; while( ( tag = av_dict_get( avdictionnary, "", tag, AV_DICT_IGNORE_SUFFIX ) ) ) diff --git a/src/AvTranscoder/mediaProperty/util.hpp b/src/AvTranscoder/mediaProperty/util.hpp index 34e7e034..c63618c1 100644 --- a/src/AvTranscoder/mediaProperty/util.hpp +++ b/src/AvTranscoder/mediaProperty/util.hpp @@ -12,31 +12,31 @@ namespace avtranscoder { /** - * @brief Can get all data of Properties structures by getDataMap(), which return a MetadatasMap. + * @brief PropertyMap is a vector of pair, because the order of properties matters to us. */ -typedef std::vector< std::pair > MetadatasMap; +typedef std::vector< std::pair > PropertiesMap; namespace detail { template -void add( MetadatasMap& dataMap, const std::string& key, const T& value ) +void add( PropertiesMap& propertiesMap, const std::string& key, const T& value ) { std::stringstream ss; ss << value; - add( dataMap, key, ss.str() ); + add( propertiesMap, key, ss.str() ); } template<> -void add( MetadatasMap& dataMap, const std::string& key, const std::string& value ); +void add( PropertiesMap& propertiesMap, const std::string& key, const std::string& value ); template<> -void add( MetadatasMap& dataMap, const std::string& key, const bool& value ); +void add( PropertiesMap& propertiesMap, const std::string& key, const bool& value ); /** * @brief Fill metadata parameter with the given AVDictionary. */ -void AvExport fillMetadataDictionnary( AVDictionary* avdictionnary, MetadatasMap& metadata ); +void AvExport fillMetadataDictionnary( AVDictionary* avdictionnary, PropertiesMap& metadata ); } From 6f0532f9ec637538e7879a856dddafd18c39f828 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 15:31:15 +0100 Subject: [PATCH 49/64] mediaProperty: rename getDataMap to getPropertiesAsMap --- .../mediaProperty/AttachementProperties.cpp | 2 +- .../mediaProperty/AttachementProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/AudioProperties.cpp | 2 +- src/AvTranscoder/mediaProperty/AudioProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/DataProperties.cpp | 2 +- src/AvTranscoder/mediaProperty/DataProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/FileProperties.cpp | 2 +- src/AvTranscoder/mediaProperty/FileProperties.hpp | 2 +- .../mediaProperty/SubtitleProperties.cpp | 2 +- .../mediaProperty/SubtitleProperties.hpp | 2 +- .../mediaProperty/UnknownProperties.cpp | 2 +- .../mediaProperty/UnknownProperties.hpp | 2 +- src/AvTranscoder/mediaProperty/VideoProperties.cpp | 2 +- src/AvTranscoder/mediaProperty/VideoProperties.hpp | 3 +-- src/AvTranscoder/mediaProperty/print.hpp | 14 +++++++------- 15 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp index e150c90e..3745b2da 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.cpp @@ -11,7 +11,7 @@ AttachementProperties::AttachementProperties( const AVFormatContext* formatConte detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -PropertiesMap AttachementProperties::getDataMap() const +PropertiesMap AttachementProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp index c1d09264..3b63aca2 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AttachementProperties.hpp @@ -23,7 +23,7 @@ class AvExport AttachementProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all attachement properties as a map (name of property: value) private: const AVFormatContext* _formatContext; ///< Has link (no ownership) diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/mediaProperty/AudioProperties.cpp index 0fc43d2b..83e83c57 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.cpp @@ -154,7 +154,7 @@ size_t AudioProperties::getBitRate() const return _codecContext->bit_rate; } -PropertiesMap AudioProperties::getDataMap() const +PropertiesMap AudioProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/mediaProperty/AudioProperties.hpp index f003a607..7d209d55 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/mediaProperty/AudioProperties.hpp @@ -40,7 +40,7 @@ class AvExport AudioProperties AVCodecContext& getAVCodecContext() { return *_codecContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all audio properties as a map (name of property: value) private: const AVFormatContext* _formatContext; ///< Has link (no ownership) diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/mediaProperty/DataProperties.cpp index ba294125..24f32578 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.cpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.cpp @@ -22,7 +22,7 @@ DataProperties::DataProperties( const AVFormatContext* formatContext, const size detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -PropertiesMap DataProperties::getDataMap() const +PropertiesMap DataProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/mediaProperty/DataProperties.hpp index e11df6db..337f7ad9 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/mediaProperty/DataProperties.hpp @@ -23,7 +23,7 @@ class AvExport DataProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all data properties as a map (name of property: value) private: void detectAncillaryData(); diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/mediaProperty/FileProperties.cpp index 1132ecae..39221883 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.cpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.cpp @@ -81,7 +81,7 @@ size_t FileProperties::getNbStreams() const return _formatContext->nb_streams; } -PropertiesMap FileProperties::getDataMap() const +PropertiesMap FileProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index b05a0195..70708ca5 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -62,7 +62,7 @@ class AvExport FileProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all file properties as a map (name of property: value) private: const AVFormatContext* _formatContext; ///< Has link (no ownership) diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp index 3d2a202a..28dcb324 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.cpp @@ -11,7 +11,7 @@ SubtitleProperties::SubtitleProperties( const AVFormatContext* formatContext, co detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -PropertiesMap SubtitleProperties::getDataMap() const +PropertiesMap SubtitleProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp index 2569a6f9..b0430e86 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp @@ -23,7 +23,7 @@ class AvExport SubtitleProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all subtitle properties as a map (name of property: value) private: const AVFormatContext* _formatContext; ///< Has link (no ownership) diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp index 75663656..14d449e3 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.cpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.cpp @@ -11,7 +11,7 @@ UnknownProperties::UnknownProperties( const AVFormatContext* formatContext, cons detail::fillMetadataDictionnary( _formatContext->streams[index]->metadata, _metadatas ); } -PropertiesMap UnknownProperties::getDataMap() const +PropertiesMap UnknownProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp index 340eaa0c..ebb42717 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/mediaProperty/UnknownProperties.hpp @@ -23,7 +23,7 @@ class AvExport UnknownProperties const AVFormatContext& getAVFormatContext() { return *_formatContext; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return unknown properties as a map (name of property: value) private: const AVFormatContext* _formatContext; ///< Has link (no ownership) diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/mediaProperty/VideoProperties.cpp index b996ba5f..0ea701d2 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.cpp @@ -648,7 +648,7 @@ std::vector VideoProperties::getChannels() const return channels; } -PropertiesMap VideoProperties::getDataMap() const +PropertiesMap VideoProperties::getPropertiesAsMap() const { PropertiesMap dataMap; diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/mediaProperty/VideoProperties.hpp index 3e57c4ae..f38322b9 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/mediaProperty/VideoProperties.hpp @@ -81,7 +81,6 @@ class AvExport VideoProperties //@{ // Warning: Can acces these data when analyse first gop - // Construct the VideoProperties with level = eAnalyseLevelFull // @see EAnalyseLevel // @see analyseGopStructure bool isInterlaced() const { return _isInterlaced; } @@ -99,7 +98,7 @@ class AvExport VideoProperties const AVPixFmtDescriptor& getAVPixFmtDescriptor() { return *_pixFmt; } #endif - PropertiesMap getDataMap() const; + PropertiesMap getPropertiesAsMap() const; ///< Return all video properties as a map (name of property: value) private: /** diff --git a/src/AvTranscoder/mediaProperty/print.hpp b/src/AvTranscoder/mediaProperty/print.hpp index 724ad7b9..f9c96324 100644 --- a/src/AvTranscoder/mediaProperty/print.hpp +++ b/src/AvTranscoder/mediaProperty/print.hpp @@ -19,7 +19,7 @@ std::ostream& operator<<( std::ostream& flux, const FileProperties& fileProperti flux << std::left; flux << separator << " Wrapper " << separator << std::endl; - PropertiesMap properties = fileProperties.getDataMap(); + PropertiesMap properties = fileProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -33,7 +33,7 @@ std::ostream& operator<<( std::ostream& flux, const VideoProperties& videoProper flux << std::left; flux << separator << " Video stream " << separator << std::endl; - PropertiesMap properties = videoProperties.getDataMap(); + PropertiesMap properties = videoProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -47,7 +47,7 @@ std::ostream& operator<<( std::ostream& flux, const AudioProperties& audioProper flux << std::left; flux << separator << " Audio stream " << separator << std::endl; - PropertiesMap properties = audioProperties.getDataMap(); + PropertiesMap properties = audioProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -60,7 +60,7 @@ std::ostream& operator<<( std::ostream& flux, const DataProperties& dataProperti { flux << separator << " Data stream " << separator << std::endl; - PropertiesMap properties = dataProperties.getDataMap(); + PropertiesMap properties = dataProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -73,7 +73,7 @@ std::ostream& operator<<( std::ostream& flux, const SubtitleProperties& subtitle { flux << separator << " Subtitle stream " << separator << std::endl; - PropertiesMap properties = subtitleProperties.getDataMap(); + PropertiesMap properties = subtitleProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -86,7 +86,7 @@ std::ostream& operator<<( std::ostream& flux, const AttachementProperties& attac { flux << separator << " Attachement stream " << separator << std::endl; - PropertiesMap properties = attachementProperties.getDataMap(); + PropertiesMap properties = attachementProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -99,7 +99,7 @@ std::ostream& operator<<( std::ostream& flux, const UnknownProperties& unknownPr { flux << separator << " Unknown stream " << separator << std::endl; - PropertiesMap properties = unknownProperties.getDataMap(); + PropertiesMap properties = unknownProperties.getPropertiesAsMap(); for( PropertiesMap::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; From f5a1b3f0d8339dda1f8e97372eedc3f9f8d755fd Mon Sep 17 00:00:00 2001 From: Valentin Noel Date: Thu, 4 Dec 2014 16:13:46 +0100 Subject: [PATCH 50/64] AvInputStream: use std::queue instead of std::vector for stream cache --- src/AvTranscoder/codedStream/AvInputStream.cpp | 6 +++--- src/AvTranscoder/codedStream/AvInputStream.hpp | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index 1a1c3e25..b7fc9fd2 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -76,7 +76,7 @@ bool AvInputStream::readNextPacket( CodedData& data ) if( ! _streamCache.empty() ) { _streamCache.front().getBuffer().swap( data.getBuffer() ); - _streamCache.erase( _streamCache.begin() ); + _streamCache.pop(); } // else read next packet else @@ -94,7 +94,7 @@ void AvInputStream::addPacket( AVPacket& packet ) return; CodedData data; - _streamCache.push_back( data ); + _streamCache.push( data ); _streamCache.back().getBuffer().resize( packet.size ); if( packet.size != 0 ) memcpy( _streamCache.back().getPtr(), packet.data, packet.size ); @@ -148,7 +148,7 @@ double AvInputStream::getDuration() const void AvInputStream::clearBuffering() { - _streamCache.clear(); + _streamCache = std::queue(); } AVStream* AvInputStream::getAVStream() const diff --git a/src/AvTranscoder/codedStream/AvInputStream.hpp b/src/AvTranscoder/codedStream/AvInputStream.hpp index a34ce6d8..4fa2ca9e 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.hpp +++ b/src/AvTranscoder/codedStream/AvInputStream.hpp @@ -3,6 +3,8 @@ #include "IInputStream.hpp" +#include + struct AVStream; namespace avtranscoder @@ -45,7 +47,7 @@ class AvExport AvInputStream : public IInputStream InputFile* _inputFile; ///< Has link (no ownership) ICodec* _codec; ///< Has ownership - std::vector _streamCache; + std::queue _streamCache; size_t _streamIndex; ///< Index of the stream in the input file bool _bufferized; ///< If the stream is bufferized From da3e09cd6af95c2fb73166190984e6ed3b5db1bb Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 19:28:01 +0100 Subject: [PATCH 51/64] InputFile: refactore readNextPacket --- src/AvTranscoder/file/InputFile.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 1c15b859..0244252a 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -147,9 +147,10 @@ AvInputStream& InputFile::getStream( size_t index ) bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex ) { AVPacket packet; - av_init_packet( &packet ); - while( 1 ) + bool nextPacketFound = false; + while( ! nextPacketFound ) { + av_init_packet( &packet ); int ret = av_read_frame( _formatContext, &packet ); if( ret < 0 ) // error or end of file { @@ -164,20 +165,16 @@ bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex ) data.getBuffer().resize( packet.size ); if( packet.size != 0 ) memcpy( data.getPtr(), packet.data, packet.size ); - av_free_packet( &packet ); - return true; + nextPacketFound = true; } // else add the packet data to the stream cache else { _inputStreams.at( packet.stream_index )->addPacket( packet ); } - - // do not delete these 2 lines - // need to skip packet, delete this one and re-init for reading the next one av_free_packet( &packet ); - av_init_packet( &packet ); } + return true; } void InputFile::seekAtFrame( const size_t frame ) From 3d5937f74e662cb0a94dfe6392d046e6c203656c Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 09:58:25 +0100 Subject: [PATCH 52/64] Transcoder/StreamTranscoder: rename init to preProcessCodecLatency * init does not mean anything. * pyTest testTranscoderDummy: remove uncessary call of preprocessCodecLatency. --- src/AvTranscoder/transcoder/StreamTranscoder.cpp | 2 +- src/AvTranscoder/transcoder/StreamTranscoder.hpp | 4 ++-- src/AvTranscoder/transcoder/Transcoder.cpp | 6 +++--- src/AvTranscoder/transcoder/Transcoder.hpp | 4 ++-- test/pyTest/testSetFrame.py | 4 ++-- test/pyTest/testTranscoderDummy.py | 4 ---- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.cpp b/src/AvTranscoder/transcoder/StreamTranscoder.cpp index 41fa3e00..034d8138 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.cpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.cpp @@ -257,7 +257,7 @@ StreamTranscoder::~StreamTranscoder() delete _inputEssence; } -void StreamTranscoder::init() +void StreamTranscoder::preProcessCodecLatency() { // rewrap case: no need to take care of the latency of codec if( ! _inputEssence ) diff --git a/src/AvTranscoder/transcoder/StreamTranscoder.hpp b/src/AvTranscoder/transcoder/StreamTranscoder.hpp index e5d40ff8..2567f37f 100644 --- a/src/AvTranscoder/transcoder/StreamTranscoder.hpp +++ b/src/AvTranscoder/transcoder/StreamTranscoder.hpp @@ -41,11 +41,11 @@ class AvExport StreamTranscoder ~StreamTranscoder(); /** - * @brief Init before encoding to pre-process frames necessary to delete the latency. + * @brief Pre-process codec latency. * @note This can be called several times with no side effects. * @note Can take a little bit of time. */ - void init(); + void preProcessCodecLatency(); /** * @brief process a single frame for the current stream diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 2791bbd2..0bbb5bec 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -243,13 +243,13 @@ void Transcoder::add( StreamTranscoder& stream ) _streamTranscoders.push_back( &stream ); } -void Transcoder::init() +void Transcoder::preProcessCodecLatency() { for( size_t streamIndex = 0; streamIndex < _streamTranscoders.size(); ++streamIndex ) { if( _verbose ) std::cout << "init stream " << streamIndex << std::endl; - _streamTranscoders.at( streamIndex )->init(); + _streamTranscoders.at( streamIndex )->preProcessCodecLatency(); } } @@ -285,7 +285,7 @@ void Transcoder::process( IProgress& progress ) if( _verbose ) std::cout << "begin transcoding" << std::endl; - init(); + preProcessCodecLatency(); _outputFile.beginWrap(); diff --git a/src/AvTranscoder/transcoder/Transcoder.hpp b/src/AvTranscoder/transcoder/Transcoder.hpp index ea50ddce..acc65f33 100644 --- a/src/AvTranscoder/transcoder/Transcoder.hpp +++ b/src/AvTranscoder/transcoder/Transcoder.hpp @@ -100,11 +100,11 @@ class AvExport Transcoder void add( StreamTranscoder& streamTranscoder); /** - * @brief Initialize all streams added, by ensure process necessary frames in case of latency. + * @brief Initialize all added streams, processing codec latency. * @note This can be called several times with no side effects. * @note Can take a little bit of time. */ - void init(); + void preProcessCodecLatency(); /** * @brief Process the next frame of all streams. diff --git a/test/pyTest/testSetFrame.py b/test/pyTest/testSetFrame.py index 241cdf22..a488fb58 100644 --- a/test/pyTest/testSetFrame.py +++ b/test/pyTest/testSetFrame.py @@ -35,7 +35,7 @@ def testSetVideoFrame(): videoEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence() # start process - transcoder.init() + transcoder.preProcessCodecLatency() ouputFile.beginWrap() # process 255 frames @@ -88,7 +88,7 @@ def testSetAudioFrame(): audioEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence() # start process - transcoder.init() + transcoder.preProcessCodecLatency() ouputFile.beginWrap() # process 255 frames diff --git a/test/pyTest/testTranscoderDummy.py b/test/pyTest/testTranscoderDummy.py index cdc145f4..6964c824 100644 --- a/test/pyTest/testTranscoderDummy.py +++ b/test/pyTest/testTranscoderDummy.py @@ -90,8 +90,6 @@ def testTranscodeDummyAudio(): audioCodec.setAudioParameters( audioDesc ) transcoder.add( "", 0, "wave24b48kmono", audioCodec ) - transcoder.init() - ouputFile.beginWrap() transcoder.processFrame() ouputFile.endWrap() @@ -116,8 +114,6 @@ def testTranscodeDummyVideo(): videoCodec.setImageParameters( imageDesc ) transcoder.add( "", 0, "dnxhd120", videoCodec ) - transcoder.init() - ouputFile.beginWrap() transcoder.processFrame() ouputFile.endWrap() From 7db51363775bf2f6088da5a120bc9a1d55edaaff Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 10:18:25 +0100 Subject: [PATCH 53/64] Transcoder: fix preProcessCodecLatency Need to call it after beginWrap. --- src/AvTranscoder/transcoder/Transcoder.cpp | 5 +++-- test/pyTest/testSetFrame.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 0bbb5bec..0a20f12d 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -285,10 +285,11 @@ void Transcoder::process( IProgress& progress ) if( _verbose ) std::cout << "begin transcoding" << std::endl; - preProcessCodecLatency(); - + _outputFile.beginWrap(); + preProcessCodecLatency(); + double totalDuration = getTotalDurationFromProcessMethod(); size_t frame = 0; diff --git a/test/pyTest/testSetFrame.py b/test/pyTest/testSetFrame.py index a488fb58..744a85c7 100644 --- a/test/pyTest/testSetFrame.py +++ b/test/pyTest/testSetFrame.py @@ -35,8 +35,8 @@ def testSetVideoFrame(): videoEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence() # start process - transcoder.preProcessCodecLatency() ouputFile.beginWrap() + transcoder.preProcessCodecLatency() # process 255 frames for i in range(0,255): @@ -88,8 +88,8 @@ def testSetAudioFrame(): audioEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence() # start process - transcoder.preProcessCodecLatency() ouputFile.beginWrap() + transcoder.preProcessCodecLatency() # process 255 frames for i in range(0,255): From e9cac6bcebde561555b214140094ea15b6ddc48e Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 10:35:55 +0100 Subject: [PATCH 54/64] OutputFile: check if at least one stream exists when getProgressDuration --- src/AvTranscoder/file/OutputFile.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/AvTranscoder/file/OutputFile.cpp b/src/AvTranscoder/file/OutputFile.cpp index b3efd712..d143b6ff 100644 --- a/src/AvTranscoder/file/OutputFile.cpp +++ b/src/AvTranscoder/file/OutputFile.cpp @@ -293,11 +293,10 @@ void OutputFile::setProfile( const ProfileLoader::Profile& profile ) double OutputFile::getProgressDuration() { - AVStream* firstOutputStream = _formatContext->streams[0]; - if( firstOutputStream == NULL ) + if( _formatContext->nb_streams == 0 ) throw std::runtime_error( "at least one stream must be set to get the progress duration" ); - double duration = av_q2d( firstOutputStream->time_base ) * firstOutputStream->cur_dts; - return duration; + AVStream* firstOutputStream = _formatContext->streams[0]; + return av_q2d( firstOutputStream->time_base ) * firstOutputStream->cur_dts; } } From 37a5b3f9a452fafa37e5766136fffc2d6359fcee Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 3 Dec 2014 19:53:34 +0100 Subject: [PATCH 55/64] InputFile / AvInputStream: rename functions about buffer * AvInputStream * Rename setBufferred to activate. * Rename getBufferred to isActivated. * InputFile * Rename readStream to activateStream. * Rename getReadStream to isStreamActivated. * Update apps and pyTest. --- app/avTranscoder/avTranscoder.cpp | 2 +- app/avplay/AvReader.hpp | 2 +- src/AvTranscoder/codedStream/AvInputStream.cpp | 12 +++++++----- src/AvTranscoder/codedStream/AvInputStream.hpp | 8 ++++---- src/AvTranscoder/codedStream/IInputStream.hpp | 3 ++- src/AvTranscoder/file/InputFile.cpp | 8 ++++---- src/AvTranscoder/file/InputFile.hpp | 13 +++++-------- src/AvTranscoder/transcoder/Transcoder.cpp | 4 ++-- test/pyTest/testTranscoderAdd.py | 7 +++---- 9 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/avTranscoder/avTranscoder.cpp b/app/avTranscoder/avTranscoder.cpp index e1001e58..781894d7 100644 --- a/app/avTranscoder/avTranscoder.cpp +++ b/app/avTranscoder/avTranscoder.cpp @@ -28,7 +28,7 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename ) InputFile input( inputfilename ); input.analyse( p ); - input.readStream( input.getProperties().getVideoProperties().at( 0 ).getStreamId() ); + input.activateStream( input.getProperties().getVideoProperties().at( 0 ).getStreamId() ); // init video decoders AvInputVideo inputVideo( input.getStream( 0 ) ); diff --git a/app/avplay/AvReader.hpp b/app/avplay/AvReader.hpp index 60fbd0cd..b3d1ef2f 100644 --- a/app/avplay/AvReader.hpp +++ b/app/avplay/AvReader.hpp @@ -25,7 +25,7 @@ class AvReader : public Reader _inputFile.analyse( p ); _videoStream = _inputFile.getProperties().getVideoProperties().at(0).getStreamId(); - _inputFile.readStream( _videoStream ); + _inputFile.activateStream( _videoStream ); _inputVideo = new avtranscoder::AvInputVideo( _inputFile.getStream( _videoStream ) ); diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index b7fc9fd2..e2eba4b9 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -17,8 +17,9 @@ AvInputStream::AvInputStream( InputFile& inputFile, const size_t streamIndex ) : IInputStream( ) , _inputFile( &inputFile ) , _codec( NULL ) + , _streamCache() , _streamIndex( streamIndex ) - , _bufferized( false ) + , _isActivated( false ) { AVCodecContext* context = _inputFile->getFormatContext().streams[_streamIndex]->codec; @@ -57,8 +58,9 @@ AvInputStream::AvInputStream( const AvInputStream& inputStream ) : IInputStream( ) , _inputFile( inputStream._inputFile ) , _codec( inputStream._codec ) + , _streamCache() , _streamIndex( inputStream._streamIndex ) - , _bufferized( inputStream._bufferized ) + , _isActivated( inputStream._isActivated ) { } @@ -69,8 +71,8 @@ AvInputStream::~AvInputStream( ) bool AvInputStream::readNextPacket( CodedData& data ) { - if( ! _bufferized ) - throw std::runtime_error( "Can't read packet on non-bufferized input stream." ); + if( ! _isActivated ) + throw std::runtime_error( "Can't read packet on non-activated input stream." ); // if packet is already cached if( ! _streamCache.empty() ) @@ -90,7 +92,7 @@ bool AvInputStream::readNextPacket( CodedData& data ) void AvInputStream::addPacket( AVPacket& packet ) { // Do not cache data if the stream is declared as unused in process - if( ! _bufferized ) + if( ! _isActivated ) return; CodedData data; diff --git a/src/AvTranscoder/codedStream/AvInputStream.hpp b/src/AvTranscoder/codedStream/AvInputStream.hpp index 4fa2ca9e..88aed087 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.hpp +++ b/src/AvTranscoder/codedStream/AvInputStream.hpp @@ -35,8 +35,8 @@ class AvExport AvInputStream : public IInputStream void addPacket( AVPacket& packet ); - void setBufferred( const bool bufferized ){ _bufferized = bufferized; }; - bool getBufferred() const { return _bufferized; }; + void activate( const bool activate = true ){ _isActivated = activate; }; + bool isActivated() const { return _isActivated; }; void clearBuffering(); @@ -47,10 +47,10 @@ class AvExport AvInputStream : public IInputStream InputFile* _inputFile; ///< Has link (no ownership) ICodec* _codec; ///< Has ownership - std::queue _streamCache; + std::queue _streamCache; ///< Cache of packet data already read and corresponding to this stream size_t _streamIndex; ///< Index of the stream in the input file - bool _bufferized; ///< If the stream is bufferized + bool _isActivated; ///< If the stream is activated, data read from it will be buffered }; } diff --git a/src/AvTranscoder/codedStream/IInputStream.hpp b/src/AvTranscoder/codedStream/IInputStream.hpp index 4f9ae9a1..13074fa1 100644 --- a/src/AvTranscoder/codedStream/IInputStream.hpp +++ b/src/AvTranscoder/codedStream/IInputStream.hpp @@ -27,7 +27,8 @@ class IInputStream virtual double getDuration() const = 0; - virtual void setBufferred( const bool bufferized ) = 0; + virtual void activate( const bool activate = true ) = 0; + virtual bool isActivated() const = 0; virtual void clearBuffering() = 0; diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 0244252a..cfb88d3a 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -195,14 +195,14 @@ void InputFile::seekAtFrame( const size_t frame ) } } -void InputFile::readStream( const size_t streamIndex, bool readStream ) +void InputFile::activateStream( const size_t streamIndex, bool activate ) { - _inputStreams.at( streamIndex )->setBufferred( readStream ); + _inputStreams.at( streamIndex )->activate( activate ); } -bool InputFile::getReadStream( const size_t streamIndex ) +bool InputFile::isStreamActivated( const size_t streamIndex ) { - return _inputStreams.at( streamIndex )->getBufferred(); + return _inputStreams.at( streamIndex )->isActivated(); } void InputFile::setProfile( const ProfileLoader::Profile& profile ) diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 291000ee..00dafa3c 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -101,18 +101,15 @@ class AvExport InputFile void seekAtFrame( const size_t frame ); /** - * @brief Indicate that the stream should be bufferized - * @param streamIndex index of the stream need to be read - * @param readStream specify if the stream need to be buffurized + * @brief Activate the indicated stream + * @note Activate a stream results in buffered its data when processing **/ - void readStream( const size_t streamIndex, const bool readStream = true ); + void activateStream( const size_t streamIndex, const bool activate = true ); /** - * @brief Indicate that the stream will be bufferized during the read - * @param streamIndex specify stream index - * @return the reading status of the streamIndex + * @brief Indicate that the stream is activated **/ - bool getReadStream( const size_t streamIndex ); + bool isStreamActivated( const size_t streamIndex ); /** * @brief Set the format of the input file diff --git a/src/AvTranscoder/transcoder/Transcoder.cpp b/src/AvTranscoder/transcoder/Transcoder.cpp index 2791bbd2..f05b037f 100644 --- a/src/AvTranscoder/transcoder/Transcoder.cpp +++ b/src/AvTranscoder/transcoder/Transcoder.cpp @@ -438,7 +438,7 @@ InputFile* Transcoder::addInputFile( const std::string& filename, const size_t s for( std::vector< InputFile* >::iterator it = _inputFiles.begin(); it != _inputFiles.end(); ++it ) { if( ( (*it)->getFilename() == filename ) && - ( ! (*it)->getReadStream( streamIndex ) ) ) + ( ! (*it)->isStreamActivated( streamIndex ) ) ) { referenceFile = (*it); break; @@ -453,7 +453,7 @@ InputFile* Transcoder::addInputFile( const std::string& filename, const size_t s referenceFile = _inputFiles.back(); } - referenceFile->readStream( streamIndex ); + referenceFile->activateStream( streamIndex ); return referenceFile; } diff --git a/test/pyTest/testTranscoderAdd.py b/test/pyTest/testTranscoderAdd.py index ebb2304c..5018a451 100644 --- a/test/pyTest/testTranscoderAdd.py +++ b/test/pyTest/testTranscoderAdd.py @@ -11,15 +11,14 @@ def testAddStreamTranscoder(): """ # input inputFile = av.InputFile( os.environ['AVTRANSCODER_TEST_AUDIO_FILE'] ) - inputIndex = 0 - inputStream = inputFile.getStream( inputIndex ) - inputStream.setBufferred( True ) + inputIndex = 0 + inputFile.activateStream( inputIndex ) # output outputFileName = "testAddStreamTranscoder.avi" ouputFile = av.OutputFile( outputFileName ) - streamTranscoder = av.StreamTranscoder( inputStream, ouputFile ) + streamTranscoder = av.StreamTranscoder( inputFile.getStream( inputIndex ), ouputFile ) transcoder = av.Transcoder( ouputFile ) transcoder.add( streamTranscoder) From 692a8da3355f8fcc775e7b7d4d20bd37bac8e12a Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Thu, 4 Dec 2014 14:16:43 +0100 Subject: [PATCH 56/64] FileProperties: remove SWIG warnings Avoid warning messages when SWIG has access of these overload functions (const). --- src/AvTranscoder/mediaProperty/FileProperties.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/mediaProperty/FileProperties.hpp index 70708ca5..c9ce8ce4 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/mediaProperty/FileProperties.hpp @@ -46,20 +46,20 @@ class AvExport FileProperties size_t getNbUnknownStreams() const { return _unknownStreams.size(); } std::vector< avtranscoder::VideoProperties >& getVideoProperties() { return _videoStreams; } - const std::vector< avtranscoder::VideoProperties >& getVideoProperties() const { return _videoStreams; } std::vector< avtranscoder::AudioProperties >& getAudioProperties() { return _audioStreams; } - const std::vector< avtranscoder::AudioProperties >& getAudioProperties() const { return _audioStreams; } std::vector< avtranscoder::DataProperties >& getDataProperties() { return _dataStreams; } - const std::vector< avtranscoder::DataProperties >& getDataProperties() const { return _dataStreams; } std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() { return _subtitleStreams; } - const std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() const { return _subtitleStreams; } std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() { return _attachementStreams; } - const std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() const { return _attachementStreams; } std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() { return _unknownStreams; } - const std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } #ifndef SWIG const AVFormatContext& getAVFormatContext() { return *_formatContext; } + const std::vector< avtranscoder::VideoProperties >& getVideoProperties() const { return _videoStreams; } + const std::vector< avtranscoder::AudioProperties >& getAudioProperties() const { return _audioStreams; } + const std::vector< avtranscoder::DataProperties >& getDataProperties() const { return _dataStreams; } + const std::vector< avtranscoder::SubtitleProperties >& getSubtitleProperties() const { return _subtitleStreams; } + const std::vector< avtranscoder::AttachementProperties >& getAttachementProperties() const { return _attachementStreams; } + const std::vector< avtranscoder::UnknownProperties >& getUnknownPropertiesProperties() const { return _unknownStreams; } #endif PropertiesMap getPropertiesAsMap() const; ///< Return all file properties as a map (name of property: value) From a1ba17eaf759811aaab9ec4fed7459724ebdcaf0 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Thu, 4 Dec 2014 19:05:12 +0100 Subject: [PATCH 57/64] GeneratorVideo: set type of data to char --- src/AvTranscoder/essenceStream/GeneratorVideo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp index 30e8ed3e..172efe34 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp @@ -28,7 +28,7 @@ bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) if( ! _inputFrame ) { // @todo support PAL (0 to 255) and NTFS (16 to 235) - int fillChar = 0; + char fillChar = 0; if( frameBuffer.getSize() != _frameDesc.getDataSize() ) frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); From bb71d488909b75870ee9b68431660a1946522c75 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Thu, 4 Dec 2014 19:27:03 +0100 Subject: [PATCH 58/64] Pixel: fix init from AVPixelFormat Correctly set BigEndian, Alpha, and Planar flags. --- src/AvTranscoder/frame/Pixel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AvTranscoder/frame/Pixel.cpp b/src/AvTranscoder/frame/Pixel.cpp index 76696f9b..ec2b6a73 100644 --- a/src/AvTranscoder/frame/Pixel.cpp +++ b/src/AvTranscoder/frame/Pixel.cpp @@ -64,10 +64,10 @@ void Pixel::init( const AVPixelFormat avPixelFormat ) } setBitsPerPixel ( av_get_bits_per_pixel( pix_desc ) ); - setBigEndian ( pix_desc->flags & PIX_FMT_BE ); + setBigEndian ( ( pix_desc->flags & PIX_FMT_BE ) == PIX_FMT_BE ); setComponents ( pix_desc->nb_components ); - setAlpha ( pix_desc->flags & PIX_FMT_ALPHA ); - setPlanar ( ( pix_desc->flags & PIX_FMT_PLANAR ) != 0 ); + setAlpha ( ( pix_desc->flags & PIX_FMT_ALPHA ) == PIX_FMT_ALPHA ); + setPlanar ( ( pix_desc->flags & PIX_FMT_PLANAR ) == PIX_FMT_PLANAR ); if( pix_desc->nb_components == 1 ) setColorComponents( eComponentGray ); From 546d790eefe841c0a007934e8f85dd16ed326961 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 09:44:39 +0100 Subject: [PATCH 59/64] VideoTransform: fix fill plane data pointers * Error for subsampling YUV420 in init when fill in cumulSrcOffset. * Use FFmpeg function av_image_fill_pointers instead of manage it in our code. * Remove unecessary _srcOffsets and _dstOffsets. --- src/AvTranscoder/transform/VideoTransform.cpp | 55 +++++-------------- src/AvTranscoder/transform/VideoTransform.hpp | 2 - 2 files changed, 13 insertions(+), 44 deletions(-) diff --git a/src/AvTranscoder/transform/VideoTransform.cpp b/src/AvTranscoder/transform/VideoTransform.cpp index 5d097652..0db14fc5 100644 --- a/src/AvTranscoder/transform/VideoTransform.cpp +++ b/src/AvTranscoder/transform/VideoTransform.cpp @@ -28,8 +28,6 @@ VideoTransform::VideoTransform() , _dstData ( (uint8_t)MAX_SWS_PLANE, NULL ) , _srcLineSize ( MAX_SWS_PLANE, 0 ) , _dstLineSize ( MAX_SWS_PLANE, 0 ) - , _srcOffsets ( MAX_SWS_PLANE, 0 ) - , _dstOffsets ( MAX_SWS_PLANE, 0 ) , _isInit ( false ) , _verbose( false ) { @@ -50,16 +48,19 @@ bool VideoTransform::init( const Frame& srcFrame, const Frame& dstFrame ) throw std::runtime_error( "unable to create color convert context" ); } - av_image_fill_linesizes( &_srcLineSize[0], src.desc().getPixelDesc().findPixel(), src.desc().getWidth() ); - av_image_fill_linesizes( &_dstLineSize[0], dst.desc().getPixelDesc().findPixel(), dst.desc().getWidth() ); + const AVPixelFormat srcPixelFormat = src.desc().getPixelDesc().findPixel(); + const AVPixelFormat dstPixelFormat = dst.desc().getPixelDesc().findPixel(); + + av_image_fill_linesizes( &_srcLineSize[0], srcPixelFormat, src.desc().getWidth() ); + av_image_fill_linesizes( &_dstLineSize[0], dstPixelFormat, dst.desc().getWidth() ); if( _verbose ) { std::clog << "video conversion from "; const char* pixFmt; - pixFmt = av_get_pix_fmt_name( src.desc().getPixelDesc().findPixel() ); + pixFmt = av_get_pix_fmt_name( srcPixelFormat ); std::clog << ( pixFmt != NULL ? pixFmt : "None" ) << " to "; - pixFmt = av_get_pix_fmt_name( dst.desc().getPixelDesc().findPixel() ); + pixFmt = av_get_pix_fmt_name( dstPixelFormat ); std::clog << ( pixFmt != NULL ? pixFmt : "None" ) << std::endl; std::clog << "source, width = " << src.desc().getWidth() << std::endl; @@ -81,25 +82,6 @@ bool VideoTransform::init( const Frame& srcFrame, const Frame& dstFrame ) std::clog << "[3] = " << _dstLineSize[3] << std::endl; } - size_t cumulSrcOffset = 0; - size_t cumulDstOffset = 0; - - for( size_t plane = 0; plane < MAX_SWS_PLANE; ++plane ) - { -#ifdef FFALIGN - _srcLineSize.at( plane ) = FFALIGN( _srcLineSize.at( plane ), 16 ); - _dstLineSize.at( plane ) = FFALIGN( _dstLineSize.at( plane ), 16 ); -#else - _srcLineSize.at( plane ) = _srcLineSize.at( plane ); - _dstLineSize.at( plane ) = _dstLineSize.at( plane ); -#endif - _srcOffsets.at( plane ) = cumulSrcOffset; - _dstOffsets.at( plane ) = cumulDstOffset; - - cumulSrcOffset += _srcLineSize.at( plane ) * src.desc().getHeight(); - cumulDstOffset += _dstLineSize.at( plane ) * dst.desc().getHeight(); - } - return true; } @@ -118,11 +100,12 @@ void VideoTransform::convert( const Frame& srcFrame, Frame& dstFrame ) if( ! _isInit ) _isInit = init( srcFrame, dstFrame ); - for( size_t plane = 0; plane < MAX_SWS_PLANE; ++plane ) - { - _srcData.at( plane ) = (uint8_t*) src.getPtr() + _srcOffsets.at( plane ); - _dstData.at( plane ) = (uint8_t*) dst.getPtr() + _dstOffsets.at( plane ); - } + const AVPixelFormat srcPixelFormat = src.desc().getPixelDesc().findPixel(); + const AVPixelFormat dstPixelFormat = dst.desc().getPixelDesc().findPixel(); + + // Fill plane data pointers + av_image_fill_pointers(&_srcData[0], srcPixelFormat, src.desc().getHeight(), (uint8_t*) src.getPtr(), &_srcLineSize[0]); + av_image_fill_pointers(&_dstData[0], dstPixelFormat, dst.desc().getHeight(), (uint8_t*) dst.getPtr(), &_dstLineSize[0]); if( ! _imageConvertContext ) { @@ -131,24 +114,12 @@ void VideoTransform::convert( const Frame& srcFrame, Frame& dstFrame ) if( _verbose ) { - std::clog << "source, offset:" << std::endl; - std::clog << "[0] = " << &_srcOffsets[0] << std::endl; - std::clog << "[1] = " << &_srcOffsets[1] << std::endl; - std::clog << "[2] = " << &_srcOffsets[2] << std::endl; - std::clog << "[3] = " << &_srcOffsets[3] << std::endl; - std::clog << "source, slice:" << std::endl; std::clog << "[0] = " << &_srcData[0] << std::endl; std::clog << "[1] = " << &_srcData[1] << std::endl; std::clog << "[2] = " << &_srcData[2] << std::endl; std::clog << "[3] = " << &_srcData[3] << std::endl; - std::clog << "destination, offset:" << std::endl; - std::clog << "[0] = " << &_dstOffsets[0] << std::endl; - std::clog << "[1] = " << &_dstOffsets[1] << std::endl; - std::clog << "[2] = " << &_dstOffsets[2] << std::endl; - std::clog << "[3] = " << &_dstOffsets[3] << std::endl; - std::clog << "destination, slice:" << std::endl; std::clog << "[0] = " << &_dstData[0] << std::endl; std::clog << "[1] = " << &_dstData[1] << std::endl; diff --git a/src/AvTranscoder/transform/VideoTransform.hpp b/src/AvTranscoder/transform/VideoTransform.hpp index 9ec5851c..9ca5e07d 100644 --- a/src/AvTranscoder/transform/VideoTransform.hpp +++ b/src/AvTranscoder/transform/VideoTransform.hpp @@ -30,8 +30,6 @@ class AvExport VideoTransform : public ITransform std::vector _dstData; std::vector _srcLineSize; std::vector _dstLineSize; - std::vector _srcOffsets; - std::vector _dstOffsets; bool _isInit; From 1bce5699c8c87047642ed5aa8f5d69885c4aee59 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Thu, 4 Dec 2014 19:22:03 +0100 Subject: [PATCH 60/64] Add SWIG interface for frame classes --- src/AvTranscoder/avTranscoder.i | 11 +---------- src/AvTranscoder/frame/frame.i | 13 +++++++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 src/AvTranscoder/frame/frame.i diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index 8ae01290..23e0c360 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -15,11 +15,6 @@ %{ #include -#include -#include -#include -#include - #include #include #include @@ -54,14 +49,10 @@ namespace std { %include "AvTranscoder/progress/progress.i" %include "AvTranscoder/mediaProperty/mediaProperty.i" +%include "AvTranscoder/frame/frame.i" %include -%include -%include -%include -%include - %include %include %include diff --git a/src/AvTranscoder/frame/frame.i b/src/AvTranscoder/frame/frame.i new file mode 100644 index 00000000..f8ce9205 --- /dev/null +++ b/src/AvTranscoder/frame/frame.i @@ -0,0 +1,13 @@ +%apply char * { unsigned char * }; + +%{ +#include +#include +#include +#include +%} + +%include +%include +%include +%include From f937ddac9fbab30d9b804127ad38ff5c7d7399d7 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 12:10:09 +0100 Subject: [PATCH 61/64] AvInputAudio: clean readNextFrame --- src/AvTranscoder/essenceStream/AvInputAudio.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/AvTranscoder/essenceStream/AvInputAudio.cpp b/src/AvTranscoder/essenceStream/AvInputAudio.cpp index 92b0bbf1..00a08013 100644 --- a/src/AvTranscoder/essenceStream/AvInputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvInputAudio.cpp @@ -87,10 +87,7 @@ bool AvInputAudio::readNextFrame( Frame& frameBuffer ) AVCodecContext* avCodecContext = _codec->getAVCodecContext(); - size_t decodedSize = av_samples_get_buffer_size( - NULL, avCodecContext->channels, - _frame->nb_samples, - avCodecContext->sample_fmt, 1 ); + size_t decodedSize = av_samples_get_buffer_size( NULL, avCodecContext->channels, _frame->nb_samples, avCodecContext->sample_fmt, 1 ); AudioFrame& audioBuffer = static_cast( frameBuffer ); @@ -105,10 +102,7 @@ bool AvInputAudio::readNextFrame( Frame& frameBuffer ) unsigned char* const src = _frame->data[0]; unsigned char* dst = audioBuffer.getPtr(); - av_samples_copy( - &dst, &src, 0, - 0, _frame->nb_samples, avCodecContext->channels, - avCodecContext->sample_fmt ); + av_samples_copy( &dst, &src, 0, 0, _frame->nb_samples, avCodecContext->channels, avCodecContext->sample_fmt ); } return true; From a855ce95744e4ca7b733795651660b2ed50d8ee9 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 14:51:49 +0100 Subject: [PATCH 62/64] InputFile: clean * Clean documentation. * Move static method. * Remove unecessary getProperties with parameter. --- src/AvTranscoder/file/InputFile.hpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 00dafa3c..9ac80f9d 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -55,16 +55,6 @@ class AvExport InputFile **/ const FileProperties& getProperties() const { return _properties; } - void getProperties( FileProperties& properties ) const { properties = _properties; } - - /** - * @brief Get media file properties using static method. - * @param filename input filename - * @param progress callback to get analysis progression - * @return structure of media metadatas - **/ - static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); - /** * @brief Get stream type: video, audio, subtitle, etc. * @param index stream index @@ -88,15 +78,14 @@ class AvExport InputFile /** * @brief Read the next packet of the specified stream * @param data: data of next packet read - * @note For performances, each read stream needs to be bufferized using the readStream() method. - * @return if next packet was succefully read + * @return if next packet was read succefully **/ bool readNextPacket( CodedData& data, const size_t streamIndex ); /** * @brief Seek input stream at specified frame * @note clean also buffers in each InputStream - * @return if next packet was succefully read + * @return if next packet was read succefully **/ void seekAtFrame( const size_t frame ); @@ -117,6 +106,15 @@ class AvExport InputFile */ virtual void setProfile( const ProfileLoader::Profile& profile ); +public: + /** + * @brief Get media file properties using static method. + * @param filename input filename + * @param progress callback to get analysis progression + * @return structure of media metadatas + **/ + static FileProperties analyseFile( const std::string& filename, IProgress& progress, const EAnalyseLevel level = eAnalyseLevelFirstGop ); + protected: AVFormatContext* _formatContext; FileProperties _properties; From 0bdd3910c29615081113aaa42064b0daf6a1e660 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 15:18:02 +0100 Subject: [PATCH 63/64] Frame: add function copyData --- src/AvTranscoder/codedStream/AvInputStream.cpp | 4 +--- src/AvTranscoder/essenceStream/AvOutputAudio.cpp | 12 ++++-------- src/AvTranscoder/essenceStream/AvOutputVideo.cpp | 12 ++++-------- src/AvTranscoder/essenceStream/GeneratorAudio.cpp | 13 ++++++------- src/AvTranscoder/essenceStream/GeneratorVideo.cpp | 13 ++++--------- src/AvTranscoder/file/InputFile.cpp | 4 +--- src/AvTranscoder/frame/Frame.hpp | 13 +++++++++++-- 7 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/AvTranscoder/codedStream/AvInputStream.cpp b/src/AvTranscoder/codedStream/AvInputStream.cpp index e2eba4b9..9e7a3fad 100644 --- a/src/AvTranscoder/codedStream/AvInputStream.cpp +++ b/src/AvTranscoder/codedStream/AvInputStream.cpp @@ -97,9 +97,7 @@ void AvInputStream::addPacket( AVPacket& packet ) CodedData data; _streamCache.push( data ); - _streamCache.back().getBuffer().resize( packet.size ); - if( packet.size != 0 ) - memcpy( _streamCache.back().getPtr(), packet.data, packet.size ); + _streamCache.back().copyData( packet.data, packet.size ); } VideoCodec& AvInputStream::getVideoCodec() diff --git a/src/AvTranscoder/essenceStream/AvOutputAudio.cpp b/src/AvTranscoder/essenceStream/AvOutputAudio.cpp index 56b0b273..0cfe67ce 100644 --- a/src/AvTranscoder/essenceStream/AvOutputAudio.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputAudio.cpp @@ -106,15 +106,13 @@ bool AvOutputAudio::encodeFrame( const Frame& sourceFrame, Frame& codedFrame ) int ret = avcodec_encode_audio2( codecContext, &packet, frame, &gotPacket ); if( ret == 0 && gotPacket == 1 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } #else int ret = avcodec_encode_audio( codecContext, packet.data, packet.size, frame ); if( ret > 0 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } #endif @@ -150,8 +148,7 @@ bool AvOutputAudio::encodeFrame( Frame& codedFrame ) int ret = avcodec_encode_audio2( codecContext, &packet, NULL, &gotPacket ); if( ret == 0 && gotPacket == 1 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } av_free_packet( &packet ); return ret == 0 && gotPacket == 1; @@ -160,8 +157,7 @@ bool AvOutputAudio::encodeFrame( Frame& codedFrame ) int ret = avcodec_encode_audio( codecContext, packet.data, packet.size, NULL ); if( ret > 0 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } av_free_packet( &packet ); return ret == 0; diff --git a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp index 3ec8fde1..1444d3e2 100644 --- a/src/AvTranscoder/essenceStream/AvOutputVideo.cpp +++ b/src/AvTranscoder/essenceStream/AvOutputVideo.cpp @@ -92,15 +92,13 @@ bool AvOutputVideo::encodeFrame( const Frame& sourceFrame, Frame& codedFrame ) int ret = avcodec_encode_video2( codecContext, &packet, frame, &gotPacket ); if( ret == 0 && gotPacket == 1 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } #else int ret = avcodec_encode_video( codecContext, packet.data, packet.size, frame ); if( ret > 0 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } #endif @@ -135,8 +133,7 @@ bool AvOutputVideo::encodeFrame( Frame& codedFrame ) int ret = avcodec_encode_video2( codecContext, &packet, NULL, &gotPacket ); if( ret == 0 && gotPacket == 1 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } av_free_packet( &packet ); return ret == 0 && gotPacket == 1; @@ -145,8 +142,7 @@ bool AvOutputVideo::encodeFrame( Frame& codedFrame ) int ret = avcodec_encode_video( codecContext, packet.data, packet.size, NULL ); if( ret > 0 ) { - codedFrame.getBuffer().resize( packet.size ); - memcpy( codedFrame.getPtr(), packet.data, packet.size ); + codedFrame.copyData( packet.data, packet.size ); } av_free_packet( &packet ); return ret == 0; diff --git a/src/AvTranscoder/essenceStream/GeneratorAudio.cpp b/src/AvTranscoder/essenceStream/GeneratorAudio.cpp index e2a6be2b..7c34a852 100644 --- a/src/AvTranscoder/essenceStream/GeneratorAudio.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorAudio.cpp @@ -23,8 +23,6 @@ void GeneratorAudio::setFrame( Frame& inputFrame ) bool GeneratorAudio::readNextFrame( Frame& frameBuffer ) { - frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); - if( ! _inputFrame ) { AudioFrame& audioFrameBuffer = static_cast( frameBuffer ); @@ -36,13 +34,14 @@ bool GeneratorAudio::readNextFrame( Frame& frameBuffer ) _frameDesc.getAVSampleFormat() == AV_SAMPLE_FMT_U8P ) ? 0x80 : 0x00; + if( frameBuffer.getSize() != _frameDesc.getDataSize() ) + frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); memset( frameBuffer.getPtr(), fill_char, frameBuffer.getSize() ); - return true; } - - if( frameBuffer.getSize() != _inputFrame->getSize() ) - frameBuffer.getBuffer().resize( _inputFrame->getSize() ); - std::memcpy( frameBuffer.getPtr(), _inputFrame->getPtr(), _inputFrame->getSize() ); + else + { + frameBuffer.copyData( _inputFrame->getPtr(), _inputFrame->getSize() ); + } return true; } diff --git a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp index 172efe34..b9de5f3a 100644 --- a/src/AvTranscoder/essenceStream/GeneratorVideo.cpp +++ b/src/AvTranscoder/essenceStream/GeneratorVideo.cpp @@ -30,9 +30,6 @@ bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) // @todo support PAL (0 to 255) and NTFS (16 to 235) char fillChar = 0; - if( frameBuffer.getSize() != _frameDesc.getDataSize() ) - frameBuffer.getBuffer().resize( _frameDesc.getDataSize() ); - VideoFrameDesc desc( _frameDesc ); Pixel rgbPixel; rgbPixel.setColorComponents( eComponentRgb ); @@ -45,14 +42,12 @@ bool GeneratorVideo::readNextFrame( Frame& frameBuffer ) 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() ); + else + { + frameBuffer.copyData( _inputFrame->getPtr(), _inputFrame->getSize() ); + } return true; } diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index cfb88d3a..e8885dfa 100644 --- a/src/AvTranscoder/file/InputFile.cpp +++ b/src/AvTranscoder/file/InputFile.cpp @@ -162,9 +162,7 @@ bool InputFile::readNextPacket( CodedData& data, const size_t streamIndex ) // copy and return the packet data if( packet.stream_index == (int)streamIndex ) { - data.getBuffer().resize( packet.size ); - if( packet.size != 0 ) - memcpy( data.getPtr(), packet.data, packet.size ); + data.copyData( packet.data, packet.size ); nextPacketFound = true; } // else add the packet data to the stream cache diff --git a/src/AvTranscoder/frame/Frame.hpp b/src/AvTranscoder/frame/Frame.hpp index c0da63fd..d04ebf9a 100644 --- a/src/AvTranscoder/frame/Frame.hpp +++ b/src/AvTranscoder/frame/Frame.hpp @@ -14,16 +14,25 @@ class AvExport Frame { public: Frame(){}; - + ~Frame(){}; + void copyData(unsigned char* buffer, const size_t size) + { + _dataBuffer.resize( size ); + if ( size != 0 ) + memcpy( getPtr(), buffer, size ); + } + DataBuffer& getBuffer() { return _dataBuffer; } unsigned char* getPtr() { return &_dataBuffer[0]; } + #ifndef SWIG const unsigned char* getPtr() const { return &_dataBuffer[0]; } #endif + size_t getSize() const { return _dataBuffer.size(); } - + protected: DataBuffer _dataBuffer; }; From c223d84a7d3ea7b0e25eacf5e5a069c76c4b0063 Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Fri, 5 Dec 2014 15:48:51 +0100 Subject: [PATCH 64/64] Up to v0.4.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce0dc4a0..a9d0cb21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(AvTranscoder) # Set AvTranscoder versions set(AVTRANSCODER_VERSION_MAJOR "0") -set(AVTRANSCODER_VERSION_MINOR "3") +set(AVTRANSCODER_VERSION_MINOR "4") set(AVTRANSCODER_VERSION_MICRO "0") set(AVTRANSCODER_VERSION ${AVTRANSCODER_VERSION_MAJOR}.${AVTRANSCODER_VERSION_MINOR}.${AVTRANSCODER_VERSION_MICRO})