diff --git a/app/avMeta/avMeta.cpp b/app/avMeta/avMeta.cpp index ed7cf320..9aa0d2d3 100644 --- a/app/avMeta/avMeta.cpp +++ b/app/avMeta/avMeta.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include @@ -7,13 +7,41 @@ int main( int argc, char** argv ) { - if( argc != 2 ) + bool toJson = false; + + std::string help; + help += "Usage\n"; + help += "\tavmeta INPUT_FILE [--json][--help]\n"; + help += "Command line options\n"; + help += "\t--json: print properties as json\n"; + + if( argc < 2 ) + { + std::cout << help << std::endl; + return( 1 ); + } + + // List command line arguments + std::vector< std::string > arguments; + for( int argument = 1; argument < argc; ++argument ) + { + arguments.push_back( argv[argument] ); + } + for( size_t argument = 0; argument < arguments.size(); ++argument ) { - std::cout << "avmeta require a media filename" << std::endl; - return( -1 ); + if( arguments.at( argument ) == "--help" ) + { + std::cout << help << std::endl; + return 0; + } + else if( arguments.at( argument ) == "--json" ) + { + toJson = true; + } } avtranscoder::preloadCodecsAndFormats(); + avtranscoder::Logger::setLogLevel( AV_LOG_QUIET ); // analyse inputFile avtranscoder::InputFile input( argv[1] ); @@ -21,5 +49,8 @@ int main( int argc, char** argv ) input.analyse( p, avtranscoder::eAnalyseLevelFirstGop ); // display file properties - std::cout << input; + if( toJson ) + std::cout << input.getProperties().allPropertiesAsJson() << std::endl; + else + std::cout << input; } diff --git a/appveyor.yml b/appveyor.yml index c28a79d1..7da1a14a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,6 +27,7 @@ test_script: - tools/appveyor.python.nosetests.bat on_failure: + - type "C:\ProgramData\chocolatey\logs\chocolatey.log" - type "C:\projects\avtranscoder\build\CMakeFiles\CMakeOutput.log" #on_success: diff --git a/src/AvTranscoder/avTranscoder.i b/src/AvTranscoder/avTranscoder.i index bb39d9c0..1ec80796 100644 --- a/src/AvTranscoder/avTranscoder.i +++ b/src/AvTranscoder/avTranscoder.i @@ -22,7 +22,7 @@ %} %include "AvTranscoder/progress/progress.i" -%include "AvTranscoder/mediaProperty/mediaProperty.i" +%include "AvTranscoder/properties/properties.i" %include "AvTranscoder/frame/frame.i" %include "AvTranscoder/profile/profile.i" diff --git a/src/AvTranscoder/file/InputFile.cpp b/src/AvTranscoder/file/InputFile.cpp index 38086a24..e49e838f 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 +#include extern "C" { #include diff --git a/src/AvTranscoder/file/InputFile.hpp b/src/AvTranscoder/file/InputFile.hpp index 1280ba21..5588d41a 100644 --- a/src/AvTranscoder/file/InputFile.hpp +++ b/src/AvTranscoder/file/InputFile.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/AvTranscoder/file/OutputFile.hpp b/src/AvTranscoder/file/OutputFile.hpp index a2b7c1a3..ccf97b62 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/properties/AttachementProperties.hpp similarity index 86% rename from src/AvTranscoder/mediaProperty/AttachementProperties.hpp rename to src/AvTranscoder/properties/AttachementProperties.hpp index 944c6a77..68fa724f 100644 --- a/src/AvTranscoder/mediaProperty/AttachementProperties.hpp +++ b/src/AvTranscoder/properties/AttachementProperties.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP #define _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.cpp b/src/AvTranscoder/properties/AudioProperties.cpp similarity index 97% rename from src/AvTranscoder/mediaProperty/AudioProperties.cpp rename to src/AvTranscoder/properties/AudioProperties.cpp index edd9e492..73a14631 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.cpp +++ b/src/AvTranscoder/properties/AudioProperties.cpp @@ -147,12 +147,12 @@ size_t AudioProperties::getTicksPerFrame() const return _codecContext->ticks_per_frame; } -PropertyVector AudioProperties::getPropertiesAsVector() const +PropertyVector AudioProperties::asVector() const { PropertyVector data; // Add properties of base class - PropertyVector basedProperty = StreamProperties::getPropertiesAsVector(); + PropertyVector basedProperty = StreamProperties::asVector(); data.insert( data.begin(), basedProperty.begin(), basedProperty.end() ); addProperty( data, "sampleFormatName", &AudioProperties::getSampleFormatName ); diff --git a/src/AvTranscoder/mediaProperty/AudioProperties.hpp b/src/AvTranscoder/properties/AudioProperties.hpp similarity index 83% rename from src/AvTranscoder/mediaProperty/AudioProperties.hpp rename to src/AvTranscoder/properties/AudioProperties.hpp index e6e8a1d4..878c2da2 100644 --- a/src/AvTranscoder/mediaProperty/AudioProperties.hpp +++ b/src/AvTranscoder/properties/AudioProperties.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP #define _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP -#include +#include #include @@ -30,7 +30,7 @@ class AvExport AudioProperties : public StreamProperties AVCodecContext& getAVCodecContext() { return *_codecContext; } #endif - PropertyVector getPropertiesAsVector() const; + PropertyVector asVector() const; private: #ifndef SWIG @@ -39,11 +39,11 @@ class AvExport AudioProperties : public StreamProperties { try { - detail::add( data, key, (this->*getter)() ); + detail::add( data, key, (this->*getter)() ); } catch( const std::exception& e ) { - detail::add( data, key, e.what() ); + detail::add( data, key, detail::propertyValueIfError ); } } #endif diff --git a/src/AvTranscoder/mediaProperty/DataProperties.cpp b/src/AvTranscoder/properties/DataProperties.cpp similarity index 100% rename from src/AvTranscoder/mediaProperty/DataProperties.cpp rename to src/AvTranscoder/properties/DataProperties.cpp diff --git a/src/AvTranscoder/mediaProperty/DataProperties.hpp b/src/AvTranscoder/properties/DataProperties.hpp similarity index 86% rename from src/AvTranscoder/mediaProperty/DataProperties.hpp rename to src/AvTranscoder/properties/DataProperties.hpp index 55c44d28..ec6bef8f 100644 --- a/src/AvTranscoder/mediaProperty/DataProperties.hpp +++ b/src/AvTranscoder/properties/DataProperties.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP #define _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/mediaProperty/FileProperties.cpp b/src/AvTranscoder/properties/FileProperties.cpp similarity index 74% rename from src/AvTranscoder/mediaProperty/FileProperties.cpp rename to src/AvTranscoder/properties/FileProperties.cpp index 96fe269a..007266c4 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.cpp +++ b/src/AvTranscoder/properties/FileProperties.cpp @@ -1,5 +1,6 @@ #include "FileProperties.hpp" +#include #include #include @@ -206,7 +207,7 @@ size_t FileProperties::getNbStreams() const return _avFormatContext->nb_streams; } -PropertyVector FileProperties::getPropertiesAsVector() const +PropertyVector FileProperties::asVector() const { PropertyVector data; @@ -235,6 +236,96 @@ PropertyVector FileProperties::getPropertiesAsVector() const return data; } +PropertyMap FileProperties::asMap() const +{ + PropertyMap dataMap; + + PropertyVector dataVector( asVector() ); + for( PropertyVector::const_iterator it = dataVector.begin(); + it != dataVector.end(); + ++it ) + { + dataMap.insert( std::make_pair( it->first, it->second ) ); + } + + return dataMap; +} + +std::string FileProperties::asJson() const +{ + json::JsonObjectStreamWriter writer; + PropertyMap properties = asMap(); + for(PropertyMap::iterator it = properties.begin(); it != properties.end(); ++it) + writer << std::make_pair(it->first.c_str(), it->second.c_str()); + return writer.build(); +} + +std::string FileProperties::allPropertiesAsJson() const +{ + json::JsonObjectStreamWriter writer; + { + // format + json::JsonArrayStreamWriter format; + format << asJson(); + writer << std::make_pair("format", format.build()); + } + { + // video streams + json::JsonArrayStreamWriter video; + for( std::vector< avtranscoder::VideoProperties >::const_iterator it = _videoStreams.begin(); it != _videoStreams.end(); ++it ) + { + video << it->asJson(); + } + writer << std::make_pair("video", video.build()); + } + { + // audio streams + json::JsonArrayStreamWriter audio; + for( std::vector< avtranscoder::AudioProperties >::const_iterator it = _audioStreams.begin(); it != _audioStreams.end(); ++it ) + { + audio << it->asJson(); + } + writer << std::make_pair("audio", audio.build()); + } + { + // data streams + json::JsonArrayStreamWriter data; + for( std::vector< avtranscoder::DataProperties >::const_iterator it = _dataStreams.begin(); it != _dataStreams.end(); ++it ) + { + data << it->asJson(); + } + writer << std::make_pair("data", data.build()); + } + { + // subtitle streams + json::JsonArrayStreamWriter subtitle; + for( std::vector< avtranscoder::SubtitleProperties >::const_iterator it = _subtitleStreams.begin(); it != _subtitleStreams.end(); ++it ) + { + subtitle << it->asJson(); + } + writer << std::make_pair("subtitle", subtitle.build()); + } + { + // attachement streams + json::JsonArrayStreamWriter attachement; + for( std::vector< avtranscoder::AttachementProperties >::const_iterator it = _attachementStreams.begin(); it != _attachementStreams.end(); ++it ) + { + attachement << it->asJson(); + } + writer << std::make_pair("attachement", attachement.build()); + } + { + // unknown streams + json::JsonArrayStreamWriter unknown; + for( std::vector< avtranscoder::UnknownProperties >::const_iterator it = _unknownStreams.begin(); it != _unknownStreams.end(); ++it ) + { + unknown << it->asJson(); + } + writer << std::make_pair("unknown", unknown.build()); + } + return writer.build(); +} + void FileProperties::clearStreamProperties() { _streams.clear(); diff --git a/src/AvTranscoder/mediaProperty/FileProperties.hpp b/src/AvTranscoder/properties/FileProperties.hpp similarity index 83% rename from src/AvTranscoder/mediaProperty/FileProperties.hpp rename to src/AvTranscoder/properties/FileProperties.hpp index 5646034d..edc681c0 100644 --- a/src/AvTranscoder/mediaProperty/FileProperties.hpp +++ b/src/AvTranscoder/properties/FileProperties.hpp @@ -2,17 +2,17 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP #include -#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -81,7 +81,10 @@ class AvExport FileProperties const AVFormatContext& getAVFormatContext() { return *_avFormatContext; } #endif - PropertyVector getPropertiesAsVector() const; ///< Return all file properties as a vector (name of property: value) + std::string allPropertiesAsJson() const; ///< Return all properties as a json format. + std::string asJson() const; ///< Return all format properties as a json format. + PropertyMap asMap() const; ///< Return format properties as a map (name of property, value) + PropertyVector asVector() const; ///< Return format properties as a vector (name of property: value) private: #ifndef SWIG @@ -94,7 +97,7 @@ class AvExport FileProperties } catch( const std::exception& e ) { - detail::add( data, key, e.what() ); + detail::add( data, key, detail::propertyValueIfError ); } } #endif diff --git a/src/AvTranscoder/properties/JsonWriter.cpp b/src/AvTranscoder/properties/JsonWriter.cpp new file mode 100644 index 00000000..bf637065 --- /dev/null +++ b/src/AvTranscoder/properties/JsonWriter.cpp @@ -0,0 +1,50 @@ +#include "JsonWriter.hpp" + +#include +#include + +namespace avtranscoder { +namespace json { + +std::string JsonStreamWriter::escapeJsonString(const std::string& input) +{ + std::ostringstream ss; + for (std::string::const_iterator iter = input.begin(); iter != input.end(); iter++) { + switch (*iter) { + case '\\': ss << "\\\\"; break; + default: ss << *iter; break; + } + } + return ss.str(); +} + +template<> +JsonObjectStreamWriter& JsonObjectStreamWriter::operator<<(const std::pair pair) +{ + std::string first(pair.first); + std::string second(pair.second); + addSep() << escapeJsonString(first).c_str() << ':' << escapeJsonString(second).c_str(); + return *this; +} + +template <> +JsonStreamWriter& JsonStreamWriter::operator<<(bool value) +{ + stream << (value ? "true" : "false"); + return *this; +} +template <> +JsonStreamWriter& JsonStreamWriter::operator<<(const char *string) +{ + stream << '"' << string << '"'; + return *this; +} +template <> +JsonStreamWriter& JsonStreamWriter::operator<<(JsonNull) +{ + stream << "null"; + return *this; +} + +} +} diff --git a/src/AvTranscoder/properties/JsonWriter.hpp b/src/AvTranscoder/properties/JsonWriter.hpp new file mode 100644 index 00000000..b41ed8f9 --- /dev/null +++ b/src/AvTranscoder/properties/JsonWriter.hpp @@ -0,0 +1,111 @@ +#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_JSONWRITER_HPP_ +#define _AV_TRANSCODER_MEDIA_PROPERTY_JSONWRITER_HPP_ + +#include + +#include +#include + +namespace avtranscoder { +namespace json { + +/** + * @brief To manage 'null' element in JSON + */ +struct JsonNull {}; + +/** + * @brief Based class to write element to a stream. + */ +class AvExport JsonStreamWriter +{ +public: + JsonStreamWriter() : first(true) {} + virtual ~JsonStreamWriter() {} + + virtual std::string build() { + finish(); + return stream.str(); + } + +protected: + friend class JsonObjectStreamWriter; + friend class JsonArrayStreamWriter; + std::ostringstream stream; + bool first; + + template + JsonStreamWriter& operator<<(T value) + { + stream << value; + return *this; + } + + JsonStreamWriter& addSep() + { + if (first) { + first = false; + } else { + stream << ','; + } + return *this; + } + + virtual std::ostream& finish() = 0; + + // Escape strings accordingly to the JSON standard + std::string escapeJsonString(const std::string& input); +}; + +// Write a boolean to the stream. +template <> JsonStreamWriter& JsonStreamWriter::operator<<(bool value); +// Write a string to the stream. +template <> JsonStreamWriter& JsonStreamWriter::operator<<(const char *string); +// Write null (empty value) to the stream. +template <> JsonStreamWriter& JsonStreamWriter::operator<<(JsonNull); + +/** + * @brief Write an object to a stream. + */ +class AvExport JsonObjectStreamWriter : public JsonStreamWriter +{ +public: + JsonObjectStreamWriter() { stream << '{'; } + + template + JsonObjectStreamWriter& operator<<(const std::pair pair) + { + addSep() << pair.first << ':' << pair.second; + return *this; + } + +protected: + virtual std::ostream& finish() { return stream << '}'; } +}; + +template<> +JsonObjectStreamWriter& JsonObjectStreamWriter::operator<<(const std::pair pair); + +/** + * @brief Write an array to a stream. + */ +class AvExport JsonArrayStreamWriter : public JsonStreamWriter +{ +public: + JsonArrayStreamWriter() { stream << '['; } + + template + JsonArrayStreamWriter& operator<<(T value) + { + addSep() << value; + return *this; + } + +protected: + virtual std::ostream& finish() { return stream << ']'; } +}; + +} +} + +#endif diff --git a/src/AvTranscoder/mediaProperty/PixelProperties.cpp b/src/AvTranscoder/properties/PixelProperties.cpp similarity index 97% rename from src/AvTranscoder/mediaProperty/PixelProperties.cpp rename to src/AvTranscoder/properties/PixelProperties.cpp index bce3f023..5f114ccb 100644 --- a/src/AvTranscoder/mediaProperty/PixelProperties.cpp +++ b/src/AvTranscoder/properties/PixelProperties.cpp @@ -238,7 +238,7 @@ std::vector PixelProperties::getChannels() const return channels; } -PropertyVector PixelProperties::getPropertiesAsVector() const +PropertyVector PixelProperties::asVector() const { PropertyVector data; @@ -306,7 +306,7 @@ PropertyVector PixelProperties::getPropertiesAsVector() const } catch( const std::exception& e ) { - detail::add( data, "subsampling", e.what() ); + detail::add( data, "subsampling", detail::propertyValueIfError ); } addProperty( data, "isBigEndian", &PixelProperties::isBigEndian ); @@ -336,7 +336,7 @@ PropertyVector PixelProperties::getPropertiesAsVector() const } catch( const std::exception& e ) { - detail::add( data, "channels", e.what() ); + detail::add( data, "channels", detail::propertyValueIfError ); } return data; diff --git a/src/AvTranscoder/mediaProperty/PixelProperties.hpp b/src/AvTranscoder/properties/PixelProperties.hpp similarity index 92% rename from src/AvTranscoder/mediaProperty/PixelProperties.hpp rename to src/AvTranscoder/properties/PixelProperties.hpp index b1137199..b9b4ad6e 100644 --- a/src/AvTranscoder/mediaProperty/PixelProperties.hpp +++ b/src/AvTranscoder/properties/PixelProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_FRAME_PIXEL_PROPERTIES_HPP_ #include -#include +#include extern "C" { #include @@ -80,7 +80,7 @@ class AvExport PixelProperties const AVPixFmtDescriptor* getAVPixFmtDescriptor() const { return _pixelDesc; } #endif - PropertyVector getPropertiesAsVector() const; ///< Return all pixel properties as a vector (name of property: value) + PropertyVector asVector() const; ///< Return all pixel properties as a vector (name of property: value) private: void init( const AVPixelFormat avPixelFormat ); @@ -95,7 +95,7 @@ class AvExport PixelProperties } catch( const std::exception& e ) { - detail::add( data, key, e.what() ); + detail::add( data, key, detail::propertyValueIfError ); } } #endif diff --git a/src/AvTranscoder/mediaProperty/StreamProperties.cpp b/src/AvTranscoder/properties/StreamProperties.cpp similarity index 87% rename from src/AvTranscoder/mediaProperty/StreamProperties.cpp rename to src/AvTranscoder/properties/StreamProperties.cpp index d41e0bb8..8dca48a4 100644 --- a/src/AvTranscoder/mediaProperty/StreamProperties.cpp +++ b/src/AvTranscoder/properties/StreamProperties.cpp @@ -1,5 +1,7 @@ #include "StreamProperties.hpp" +#include + #include namespace avtranscoder @@ -96,7 +98,7 @@ std::string StreamProperties::getCodecLongName() const return std::string( _codec->long_name ); } -PropertyVector StreamProperties::getPropertiesAsVector() const +PropertyVector StreamProperties::asVector() const { PropertyVector data; @@ -116,11 +118,11 @@ PropertyVector StreamProperties::getPropertiesAsVector() const return data; } -PropertyMap StreamProperties::getPropertiesAsMap() const +PropertyMap StreamProperties::asMap() const { PropertyMap dataMap; - PropertyVector dataVector( getPropertiesAsVector() ); + PropertyVector dataVector( asVector() ); for( PropertyVector::const_iterator it = dataVector.begin(); it != dataVector.end(); ++it ) @@ -131,4 +133,13 @@ PropertyMap StreamProperties::getPropertiesAsMap() const return dataMap; } +std::string StreamProperties::asJson() const +{ + json::JsonObjectStreamWriter writer; + PropertyMap properties = asMap(); + for(PropertyMap::iterator it = properties.begin(); it != properties.end(); ++it) + writer << std::make_pair(it->first.c_str(), it->second.c_str()); + return writer.build(); +} + } diff --git a/src/AvTranscoder/mediaProperty/StreamProperties.hpp b/src/AvTranscoder/properties/StreamProperties.hpp similarity index 80% rename from src/AvTranscoder/mediaProperty/StreamProperties.hpp rename to src/AvTranscoder/properties/StreamProperties.hpp index 675d14d7..e05dcaad 100644 --- a/src/AvTranscoder/mediaProperty/StreamProperties.hpp +++ b/src/AvTranscoder/properties/StreamProperties.hpp @@ -2,7 +2,7 @@ #define _AV_TRANSCODER_MEDIA_PROPERTY_STREAM_PROPERTIES_HPP #include -#include +#include #include namespace avtranscoder @@ -31,8 +31,9 @@ class AvExport StreamProperties const AVFormatContext& getAVFormatContext() const { return *_formatContext; } #endif - PropertyMap getPropertiesAsMap() const; ///< Return all properties as a map (name of property, value) - virtual PropertyVector getPropertiesAsVector() const; ///< Same data with a specific order + std::string asJson() const; ///< Return all properties as a json format. + PropertyMap asMap() const; ///< Return all properties as a map (name of property, value) + virtual PropertyVector asVector() const; ///< Same data with a specific order private: #ifndef SWIG @@ -45,7 +46,7 @@ class AvExport StreamProperties } catch( const std::exception& e ) { - detail::add( dataVector, key, e.what() ); + detail::add( dataVector, key, detail::propertyValueIfError ); } } #endif diff --git a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp b/src/AvTranscoder/properties/SubtitleProperties.hpp similarity index 86% rename from src/AvTranscoder/mediaProperty/SubtitleProperties.hpp rename to src/AvTranscoder/properties/SubtitleProperties.hpp index 98bb54ce..ebfc7f41 100644 --- a/src/AvTranscoder/mediaProperty/SubtitleProperties.hpp +++ b/src/AvTranscoder/properties/SubtitleProperties.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_MEDIA_PROPERTY_SUBTITLE_PROPERTIES_HPP #define _AV_TRANSCODER_MEDIA_PROPERTY_SUBTITLE_PROPERTIES_HPP -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp b/src/AvTranscoder/properties/UnknownProperties.hpp similarity index 85% rename from src/AvTranscoder/mediaProperty/UnknownProperties.hpp rename to src/AvTranscoder/properties/UnknownProperties.hpp index b396035f..5385fc4b 100644 --- a/src/AvTranscoder/mediaProperty/UnknownProperties.hpp +++ b/src/AvTranscoder/properties/UnknownProperties.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_MEDIA_PROPERTY_UNKNOWN_PROPERTIES_HPP #define _AV_TRANSCODER_MEDIA_PROPERTY_UNKNOWN_PROPERTIES_HPP -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.cpp b/src/AvTranscoder/properties/VideoProperties.cpp similarity index 98% rename from src/AvTranscoder/mediaProperty/VideoProperties.cpp rename to src/AvTranscoder/properties/VideoProperties.cpp index fa88f765..4751c33f 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.cpp +++ b/src/AvTranscoder/properties/VideoProperties.cpp @@ -547,12 +547,12 @@ void VideoProperties::analyseGopStructure( IProgress& progress ) } } -PropertyVector VideoProperties::getPropertiesAsVector() const +PropertyVector VideoProperties::asVector() const { PropertyVector data; // Add properties of base class - PropertyVector basedProperty = StreamProperties::getPropertiesAsVector(); + PropertyVector basedProperty = StreamProperties::asVector(); data.insert( data.begin(), basedProperty.begin(), basedProperty.end() ); addProperty( data, "profile", &VideoProperties::getProfile ); @@ -593,7 +593,7 @@ PropertyVector VideoProperties::getPropertiesAsVector() const addProperty( data, "referencesFrames", &VideoProperties::getReferencesFrames ); // Add properties of the pixel - PropertyVector pixelProperties = _pixelProperties.getPropertiesAsVector(); + PropertyVector pixelProperties = _pixelProperties.asVector(); data.insert( data.end(), pixelProperties.begin(), pixelProperties.end() ); return data; diff --git a/src/AvTranscoder/mediaProperty/VideoProperties.hpp b/src/AvTranscoder/properties/VideoProperties.hpp similarity index 95% rename from src/AvTranscoder/mediaProperty/VideoProperties.hpp rename to src/AvTranscoder/properties/VideoProperties.hpp index ee047f9f..407695b6 100644 --- a/src/AvTranscoder/mediaProperty/VideoProperties.hpp +++ b/src/AvTranscoder/properties/VideoProperties.hpp @@ -3,7 +3,7 @@ #include "PixelProperties.hpp" -#include +#include #include #include @@ -78,7 +78,7 @@ class AvExport VideoProperties : public StreamProperties const PixelProperties& getPixelProperties() const { return _pixelProperties; } #endif - PropertyVector getPropertiesAsVector() const; + PropertyVector asVector() const; private: /** @@ -97,7 +97,7 @@ class AvExport VideoProperties : public StreamProperties } catch( const std::exception& e ) { - detail::add( dataVector, key, e.what() ); + detail::add( dataVector, key, detail::propertyValueIfError ); } } #endif diff --git a/src/AvTranscoder/mediaProperty/print.cpp b/src/AvTranscoder/properties/print.cpp similarity index 88% rename from src/AvTranscoder/mediaProperty/print.cpp rename to src/AvTranscoder/properties/print.cpp index e344092d..799d2b0d 100644 --- a/src/AvTranscoder/mediaProperty/print.cpp +++ b/src/AvTranscoder/properties/print.cpp @@ -15,7 +15,7 @@ std::ostream& operator<<( std::ostream& flux, const FileProperties& fileProperti flux << std::left; flux << separator << " Wrapper " << separator << std::endl; - PropertyVector properties = fileProperties.getPropertiesAsVector(); + PropertyVector properties = fileProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -29,7 +29,7 @@ std::ostream& operator<<( std::ostream& flux, const StreamProperties& streamProp flux << std::left; flux << separator << " Stream " << separator << std::endl; - PropertyVector properties = streamProperties.getPropertiesAsVector(); + PropertyVector properties = streamProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -43,7 +43,7 @@ std::ostream& operator<<( std::ostream& flux, const VideoProperties& videoProper flux << std::left; flux << separator << " Video stream " << separator << std::endl; - PropertyVector properties = videoProperties.getPropertiesAsVector(); + PropertyVector properties = videoProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -57,7 +57,7 @@ std::ostream& operator<<( std::ostream& flux, const AudioProperties& audioProper flux << std::left; flux << separator << " Audio stream " << separator << std::endl; - PropertyVector properties = audioProperties.getPropertiesAsVector(); + PropertyVector properties = audioProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -70,7 +70,7 @@ std::ostream& operator<<( std::ostream& flux, const DataProperties& dataProperti { flux << separator << " Data stream " << separator << std::endl; - PropertyVector properties = dataProperties.getPropertiesAsVector(); + PropertyVector properties = dataProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -83,7 +83,7 @@ std::ostream& operator<<( std::ostream& flux, const SubtitleProperties& subtitle { flux << separator << " Subtitle stream " << separator << std::endl; - PropertyVector properties = subtitleProperties.getPropertiesAsVector(); + PropertyVector properties = subtitleProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -96,7 +96,7 @@ std::ostream& operator<<( std::ostream& flux, const AttachementProperties& attac { flux << separator << " Attachement stream " << separator << std::endl; - PropertyVector properties = attachementProperties.getPropertiesAsVector(); + PropertyVector properties = attachementProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; @@ -109,7 +109,7 @@ std::ostream& operator<<( std::ostream& flux, const UnknownProperties& unknownPr { flux << separator << " Unknown stream " << separator << std::endl; - PropertyVector properties = unknownProperties.getPropertiesAsVector(); + PropertyVector properties = unknownProperties.asVector(); for( PropertyVector::iterator it = properties.begin(); it != properties.end(); ++it ) { flux << std::setw( keyWidth ) << it->first << ": " << it->second << std::endl; diff --git a/src/AvTranscoder/mediaProperty/print.hpp b/src/AvTranscoder/properties/print.hpp similarity index 100% rename from src/AvTranscoder/mediaProperty/print.hpp rename to src/AvTranscoder/properties/print.hpp diff --git a/src/AvTranscoder/mediaProperty/mediaProperty.i b/src/AvTranscoder/properties/properties.i similarity index 59% rename from src/AvTranscoder/mediaProperty/mediaProperty.i rename to src/AvTranscoder/properties/properties.i index fea549f6..e80e70ce 100644 --- a/src/AvTranscoder/mediaProperty/mediaProperty.i +++ b/src/AvTranscoder/properties/properties.i @@ -1,14 +1,14 @@ %{ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace avtranscoder; %} @@ -46,13 +46,13 @@ namespace std { %template(ChannelVector) vector< avtranscoder::Channel >; } -%include -%include -%include -%include -%include -%include -%include -%include -%include -%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include diff --git a/src/AvTranscoder/mediaProperty/util.cpp b/src/AvTranscoder/properties/util.cpp similarity index 100% rename from src/AvTranscoder/mediaProperty/util.cpp rename to src/AvTranscoder/properties/util.cpp diff --git a/src/AvTranscoder/mediaProperty/util.hpp b/src/AvTranscoder/properties/util.hpp similarity index 91% rename from src/AvTranscoder/mediaProperty/util.hpp rename to src/AvTranscoder/properties/util.hpp index 69122fe6..35790561 100644 --- a/src/AvTranscoder/mediaProperty/util.hpp +++ b/src/AvTranscoder/properties/util.hpp @@ -25,6 +25,11 @@ typedef std::map< std::string, std::string > PropertyMap; namespace detail { +/** + * If cannot access the property, get this value. + */ +const std::string propertyValueIfError = "null"; + template void add( PropertyVector& propertyVector, const std::string& key, const T& value ) { diff --git a/src/AvTranscoder/reader/AudioReader.cpp b/src/AvTranscoder/reader/AudioReader.cpp index 2c8a081e..c80d4728 100644 --- a/src/AvTranscoder/reader/AudioReader.cpp +++ b/src/AvTranscoder/reader/AudioReader.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/reader/AudioReader.hpp b/src/AvTranscoder/reader/AudioReader.hpp index 9547b983..b3d9c7cf 100644 --- a/src/AvTranscoder/reader/AudioReader.hpp +++ b/src/AvTranscoder/reader/AudioReader.hpp @@ -4,7 +4,7 @@ #include "IReader.hpp" #include -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/reader/IReader.cpp b/src/AvTranscoder/reader/IReader.cpp index a83608b2..081c37b5 100644 --- a/src/AvTranscoder/reader/IReader.cpp +++ b/src/AvTranscoder/reader/IReader.cpp @@ -1,6 +1,6 @@ #include "IReader.hpp" -#include +#include #include diff --git a/src/AvTranscoder/reader/IReader.hpp b/src/AvTranscoder/reader/IReader.hpp index f9b3f088..527acf14 100644 --- a/src/AvTranscoder/reader/IReader.hpp +++ b/src/AvTranscoder/reader/IReader.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/AvTranscoder/reader/VideoReader.cpp b/src/AvTranscoder/reader/VideoReader.cpp index 3efa12fc..a57d308c 100644 --- a/src/AvTranscoder/reader/VideoReader.cpp +++ b/src/AvTranscoder/reader/VideoReader.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/reader/VideoReader.hpp b/src/AvTranscoder/reader/VideoReader.hpp index 02170e72..f95b0b98 100644 --- a/src/AvTranscoder/reader/VideoReader.hpp +++ b/src/AvTranscoder/reader/VideoReader.hpp @@ -4,8 +4,8 @@ #include "IReader.hpp" #include -#include -#include +#include +#include namespace avtranscoder { diff --git a/src/AvTranscoder/stream/IInputStream.hpp b/src/AvTranscoder/stream/IInputStream.hpp index b0d258ba..10e72d65 100644 --- a/src/AvTranscoder/stream/IInputStream.hpp +++ b/src/AvTranscoder/stream/IInputStream.hpp @@ -1,7 +1,7 @@ #ifndef _AV_TRANSCODER_CODED_STREAM_I_INPUT_STREAM_HPP_ #define _AV_TRANSCODER_CODED_STREAM_I_INPUT_STREAM_HPP_ -#include +#include #include #include diff --git a/test/pyTest/testProperties.py b/test/pyTest/testProperties.py index 3cc5cd19..5761ebee 100644 --- a/test/pyTest/testProperties.py +++ b/test/pyTest/testProperties.py @@ -2,11 +2,13 @@ # Check if environment is setup to run the tests if os.environ.get('AVTRANSCODER_TEST_AUDIO_WAVE_FILE') is None or \ - os.environ.get('AVTRANSCODER_TEST_VIDEO_MP4_FILE') is None: + os.environ.get('AVTRANSCODER_TEST_VIDEO_MP4_FILE') is None or \ + os.environ.get('AVTRANSCODER_TEST_VIDEO_MOV_FILE') is None: from nose.plugins.skip import SkipTest raise SkipTest("Need to define environment variables " "AVTRANSCODER_TEST_AUDIO_WAVE_FILE and " - "AVTRANSCODER_TEST_VIDEO_MP4_FILE") + "AVTRANSCODER_TEST_VIDEO_MP4_FILE and " + "AVTRANSCODER_TEST_VIDEO_MOV_FILE") from nose.tools import * @@ -38,6 +40,7 @@ def testAddMetadataDate(): assert_in( metadata_to_check, properties.getMetadatas() ) + def testAddImpossibleMetadata(): """ Can't add an impossible metadata to the outputFile. @@ -94,6 +97,7 @@ def testCheckVideoProperties(): assert_equals( round(videoStream.getDuration(), 2), expectedDuration ) assert_equals( videoStream.getFps(), expectedFps ) + def testCheckAudioProperties(): """ Check properties of an audio stream. @@ -122,4 +126,17 @@ def testCheckAudioProperties(): assert_equals( round(audioStream.getDuration(), 2), expectedDuration ) assert_equals( audioStream.getChannels(), expectedChannels ) assert_equals( audioStream.getChannelLayout(), expectedChannelLayout ) - assert_equals( audioStream.getSampleRate(), expectedSampleRate ) \ No newline at end of file + assert_equals( audioStream.getSampleRate(), expectedSampleRate ) + + +def testCheckFilePropertiesAsJson(): + """ + Check file properties as json. + """ + # get src file + inputFileName = os.environ['AVTRANSCODER_TEST_VIDEO_MOV_FILE'] + inputFile = av.InputFile( inputFileName ) + + import json + # json.loads method throws a ValueError if it is not a valid JSON. + json.loads(inputFile.getProperties().allPropertiesAsJson()) diff --git a/test/pyTest/testTranscoderRewrap.py b/test/pyTest/testTranscoderRewrap.py index f3d74339..732c1852 100644 --- a/test/pyTest/testTranscoderRewrap.py +++ b/test/pyTest/testTranscoderRewrap.py @@ -31,8 +31,8 @@ def checkStream(src_stream, dst_stream): """ Check the values of the given streams properties. """ - src_propertiesMap = src_stream.getPropertiesAsMap() - dst_propertiesMap = dst_stream.getPropertiesAsMap() + src_propertiesMap = src_stream.asMap() + dst_propertiesMap = dst_stream.asMap() for key in dst_propertiesMap: # skip metadata of stream if key in [x[0] for x in src_stream.getMetadatas()]: