Skip to content

Get media properties as json #184

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Dec 7, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6fae365
Added JsonWriter classes
Nov 25, 2015
21659f1
StreamProperties: added getPropertiesAsJson method
Nov 25, 2015
f27165d
FileProperties: added getPropertiesAsMap method
Nov 25, 2015
0aa6a58
FileProperties: added getPropertiesAsJson method
Nov 25, 2015
603c97e
mediaProperty: use a default value if cannot access a property
Nov 25, 2015
9e77733
avMeta: added help
Nov 25, 2015
8a720b6
avMeta: added --json option to print properties as json
Nov 25, 2015
327f41b
avMeta: set log level to QUIET
Nov 25, 2015
15b3de8
FileProperties: update doc of getPropertiesAsMap/AsVector methods
Nov 25, 2015
6a63e4b
Moved JsonWriter class to mediaProperty folder
Nov 25, 2015
ffab1fc
pyTest: added test to check file properties as json
Nov 25, 2015
8642888
JsonWriter: improved documentation
Dec 3, 2015
f5ef5d1
FileProperty: use const propertyValueIfError when cannot access a pro…
Dec 3, 2015
8c33526
mediaProperty: rename 'getPropertiesAsVector/Map/Json' methods to 'as…
Dec 3, 2015
788ce25
FileProperties: added allPropertiesAsJson method
Dec 3, 2015
21d16c4
Rename 'mediaProperty' folder to 'properties'
Dec 3, 2015
03e0ea3
Merge branch 'develop' of https://github.com/avTranscoder/avTranscode…
Dec 3, 2015
94f541d
pyTest: get all properties as json when testCheckFilePropertiesAsJson
Dec 3, 2015
5bbb898
pyTest: fix how to check env before launching the testProperties
Dec 3, 2015
184a183
properties: fix json validity on Windows
Dec 3, 2015
5335692
JsonWriter: fix compilation with gcc
Dec 4, 2015
adb18bc
Appveyor: check chocolatey log on failure
Dec 7, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 36 additions & 5 deletions app/avMeta/avMeta.cpp
Original file line number Diff line number Diff line change
@@ -1,25 +1,56 @@
#include <AvTranscoder/file/InputFile.hpp>
#include <AvTranscoder/mediaProperty/print.hpp>
#include <AvTranscoder/properties/print.hpp>

#include <AvTranscoder/progress/NoDisplayProgress.hpp>

#include <iostream>

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] );
avtranscoder::NoDisplayProgress p;
input.analyse( p, avtranscoder::eAnalyseLevelFirstGop );

// display file properties
std::cout << input;
if( toJson )
std::cout << input.getProperties().allPropertiesAsJson() << std::endl;
else
std::cout << input;
}
1 change: 1 addition & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion src/AvTranscoder/avTranscoder.i
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
14 changes: 7 additions & 7 deletions src/AvTranscoder/file/InputFile.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
#include "InputFile.hpp"

#include <AvTranscoder/mediaProperty/util.hpp>
#include <AvTranscoder/mediaProperty/VideoProperties.hpp>
#include <AvTranscoder/mediaProperty/AudioProperties.hpp>
#include <AvTranscoder/mediaProperty/DataProperties.hpp>
#include <AvTranscoder/mediaProperty/SubtitleProperties.hpp>
#include <AvTranscoder/mediaProperty/AttachementProperties.hpp>
#include <AvTranscoder/mediaProperty/UnknownProperties.hpp>
#include <AvTranscoder/properties/util.hpp>
#include <AvTranscoder/properties/VideoProperties.hpp>
#include <AvTranscoder/properties/AudioProperties.hpp>
#include <AvTranscoder/properties/DataProperties.hpp>
#include <AvTranscoder/properties/SubtitleProperties.hpp>
#include <AvTranscoder/properties/AttachementProperties.hpp>
#include <AvTranscoder/properties/UnknownProperties.hpp>

extern "C" {
#include <libavcodec/avcodec.h>
Expand Down
2 changes: 1 addition & 1 deletion src/AvTranscoder/file/InputFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <AvTranscoder/file/util.hpp>
#include <AvTranscoder/file/FormatContext.hpp>
#include <AvTranscoder/stream/InputStream.hpp>
#include <AvTranscoder/mediaProperty/FileProperties.hpp>
#include <AvTranscoder/properties/FileProperties.hpp>
#include <AvTranscoder/progress/IProgress.hpp>
#include <AvTranscoder/profile/ProfileLoader.hpp>

Expand Down
2 changes: 1 addition & 1 deletion src/AvTranscoder/file/OutputFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <AvTranscoder/file/IOutputFile.hpp>

#include <AvTranscoder/mediaProperty/util.hpp>
#include <AvTranscoder/properties/util.hpp>
#include <AvTranscoder/file/FormatContext.hpp>

#include <vector>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP
#define _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP

#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
#include <AvTranscoder/properties/StreamProperties.hpp>

namespace avtranscoder
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP
#define _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP

#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
#include <AvTranscoder/properties/StreamProperties.hpp>

#include <string>

Expand Down Expand Up @@ -30,7 +30,7 @@ class AvExport AudioProperties : public StreamProperties
AVCodecContext& getAVCodecContext() { return *_codecContext; }
#endif

PropertyVector getPropertiesAsVector() const;
PropertyVector asVector() const;

private:
#ifndef SWIG
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP
#define _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP

#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
#include <AvTranscoder/properties/StreamProperties.hpp>

namespace avtranscoder
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "FileProperties.hpp"

#include <AvTranscoder/properties/JsonWriter.hpp>
#include <AvTranscoder/progress/NoDisplayProgress.hpp>

#include <stdexcept>
Expand Down Expand Up @@ -206,7 +207,7 @@ size_t FileProperties::getNbStreams() const
return _avFormatContext->nb_streams;
}

PropertyVector FileProperties::getPropertiesAsVector() const
PropertyVector FileProperties::asVector() const
{
PropertyVector data;

Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
#define _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP

#include <AvTranscoder/common.hpp>
#include <AvTranscoder/mediaProperty/util.hpp>
#include <AvTranscoder/properties/util.hpp>
#include <AvTranscoder/file/FormatContext.hpp>
#include <AvTranscoder/progress/IProgress.hpp>

#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
#include <AvTranscoder/mediaProperty/VideoProperties.hpp>
#include <AvTranscoder/mediaProperty/AudioProperties.hpp>
#include <AvTranscoder/mediaProperty/DataProperties.hpp>
#include <AvTranscoder/mediaProperty/SubtitleProperties.hpp>
#include <AvTranscoder/mediaProperty/AttachementProperties.hpp>
#include <AvTranscoder/mediaProperty/UnknownProperties.hpp>
#include <AvTranscoder/properties/StreamProperties.hpp>
#include <AvTranscoder/properties/VideoProperties.hpp>
#include <AvTranscoder/properties/AudioProperties.hpp>
#include <AvTranscoder/properties/DataProperties.hpp>
#include <AvTranscoder/properties/SubtitleProperties.hpp>
#include <AvTranscoder/properties/AttachementProperties.hpp>
#include <AvTranscoder/properties/UnknownProperties.hpp>

#include <string>
#include <vector>
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
50 changes: 50 additions & 0 deletions src/AvTranscoder/properties/JsonWriter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include "JsonWriter.hpp"

#include <string>
#include <sstream>

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<const char *, const char*> 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;
}

}
}
Loading