From 304a28bc707193cbaf00015a2a15913841583c4c Mon Sep 17 00:00:00 2001 From: Clement Champetier Date: Wed, 12 Nov 2014 17:17:21 +0100 Subject: [PATCH 01/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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/23] 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 )