Skip to content

Commit 17529b7

Browse files
committed
Merge pull request #184 from cchampet/dev_mediaPropertiesAsJson
Get media properties as json
2 parents f477447 + adb18bc commit 17529b7

37 files changed

+417
-96
lines changed

app/avMeta/avMeta.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,56 @@
11
#include <AvTranscoder/file/InputFile.hpp>
2-
#include <AvTranscoder/mediaProperty/print.hpp>
2+
#include <AvTranscoder/properties/print.hpp>
33

44
#include <AvTranscoder/progress/NoDisplayProgress.hpp>
55

66
#include <iostream>
77

88
int main( int argc, char** argv )
99
{
10-
if( argc != 2 )
10+
bool toJson = false;
11+
12+
std::string help;
13+
help += "Usage\n";
14+
help += "\tavmeta INPUT_FILE [--json][--help]\n";
15+
help += "Command line options\n";
16+
help += "\t--json: print properties as json\n";
17+
18+
if( argc < 2 )
19+
{
20+
std::cout << help << std::endl;
21+
return( 1 );
22+
}
23+
24+
// List command line arguments
25+
std::vector< std::string > arguments;
26+
for( int argument = 1; argument < argc; ++argument )
27+
{
28+
arguments.push_back( argv[argument] );
29+
}
30+
for( size_t argument = 0; argument < arguments.size(); ++argument )
1131
{
12-
std::cout << "avmeta require a media filename" << std::endl;
13-
return( -1 );
32+
if( arguments.at( argument ) == "--help" )
33+
{
34+
std::cout << help << std::endl;
35+
return 0;
36+
}
37+
else if( arguments.at( argument ) == "--json" )
38+
{
39+
toJson = true;
40+
}
1441
}
1542

1643
avtranscoder::preloadCodecsAndFormats();
44+
avtranscoder::Logger::setLogLevel( AV_LOG_QUIET );
1745

1846
// analyse inputFile
1947
avtranscoder::InputFile input( argv[1] );
2048
avtranscoder::NoDisplayProgress p;
2149
input.analyse( p, avtranscoder::eAnalyseLevelFirstGop );
2250

2351
// display file properties
24-
std::cout << input;
52+
if( toJson )
53+
std::cout << input.getProperties().allPropertiesAsJson() << std::endl;
54+
else
55+
std::cout << input;
2556
}

appveyor.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ test_script:
2727
- tools/appveyor.python.nosetests.bat
2828

2929
on_failure:
30+
- type "C:\ProgramData\chocolatey\logs\chocolatey.log"
3031
- type "C:\projects\avtranscoder\build\CMakeFiles\CMakeOutput.log"
3132

3233
#on_success:

src/AvTranscoder/avTranscoder.i

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
%}
2323

2424
%include "AvTranscoder/progress/progress.i"
25-
%include "AvTranscoder/mediaProperty/mediaProperty.i"
25+
%include "AvTranscoder/properties/properties.i"
2626
%include "AvTranscoder/frame/frame.i"
2727
%include "AvTranscoder/profile/profile.i"
2828

src/AvTranscoder/file/InputFile.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#include "InputFile.hpp"
22

3-
#include <AvTranscoder/mediaProperty/util.hpp>
4-
#include <AvTranscoder/mediaProperty/VideoProperties.hpp>
5-
#include <AvTranscoder/mediaProperty/AudioProperties.hpp>
6-
#include <AvTranscoder/mediaProperty/DataProperties.hpp>
7-
#include <AvTranscoder/mediaProperty/SubtitleProperties.hpp>
8-
#include <AvTranscoder/mediaProperty/AttachementProperties.hpp>
9-
#include <AvTranscoder/mediaProperty/UnknownProperties.hpp>
3+
#include <AvTranscoder/properties/util.hpp>
4+
#include <AvTranscoder/properties/VideoProperties.hpp>
5+
#include <AvTranscoder/properties/AudioProperties.hpp>
6+
#include <AvTranscoder/properties/DataProperties.hpp>
7+
#include <AvTranscoder/properties/SubtitleProperties.hpp>
8+
#include <AvTranscoder/properties/AttachementProperties.hpp>
9+
#include <AvTranscoder/properties/UnknownProperties.hpp>
1010

1111
extern "C" {
1212
#include <libavcodec/avcodec.h>

src/AvTranscoder/file/InputFile.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <AvTranscoder/file/util.hpp>
66
#include <AvTranscoder/file/FormatContext.hpp>
77
#include <AvTranscoder/stream/InputStream.hpp>
8-
#include <AvTranscoder/mediaProperty/FileProperties.hpp>
8+
#include <AvTranscoder/properties/FileProperties.hpp>
99
#include <AvTranscoder/progress/IProgress.hpp>
1010
#include <AvTranscoder/profile/ProfileLoader.hpp>
1111

src/AvTranscoder/file/OutputFile.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include <AvTranscoder/file/IOutputFile.hpp>
55

6-
#include <AvTranscoder/mediaProperty/util.hpp>
6+
#include <AvTranscoder/properties/util.hpp>
77
#include <AvTranscoder/file/FormatContext.hpp>
88

99
#include <vector>

src/AvTranscoder/mediaProperty/AttachementProperties.hpp renamed to src/AvTranscoder/properties/AttachementProperties.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP
22
#define _AV_TRANSCODER_MEDIA_PROPERTY_ATTACHEMENT_PROPERTIES_HPP
33

4-
#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
4+
#include <AvTranscoder/properties/StreamProperties.hpp>
55

66
namespace avtranscoder
77
{

src/AvTranscoder/mediaProperty/AudioProperties.cpp renamed to src/AvTranscoder/properties/AudioProperties.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,12 @@ size_t AudioProperties::getTicksPerFrame() const
147147
return _codecContext->ticks_per_frame;
148148
}
149149

150-
PropertyVector AudioProperties::getPropertiesAsVector() const
150+
PropertyVector AudioProperties::asVector() const
151151
{
152152
PropertyVector data;
153153

154154
// Add properties of base class
155-
PropertyVector basedProperty = StreamProperties::getPropertiesAsVector();
155+
PropertyVector basedProperty = StreamProperties::asVector();
156156
data.insert( data.begin(), basedProperty.begin(), basedProperty.end() );
157157

158158
addProperty( data, "sampleFormatName", &AudioProperties::getSampleFormatName );

src/AvTranscoder/mediaProperty/AudioProperties.hpp renamed to src/AvTranscoder/properties/AudioProperties.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP
22
#define _AV_TRANSCODER_MEDIA_PROPERTY_AUDIO_PROPERTIES_HPP
33

4-
#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
4+
#include <AvTranscoder/properties/StreamProperties.hpp>
55

66
#include <string>
77

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

33-
PropertyVector getPropertiesAsVector() const;
33+
PropertyVector asVector() const;
3434

3535
private:
3636
#ifndef SWIG
@@ -39,11 +39,11 @@ class AvExport AudioProperties : public StreamProperties
3939
{
4040
try
4141
{
42-
detail::add( data, key, (this->*getter)() );
42+
detail::add( data, key, (this->*getter)() );
4343
}
4444
catch( const std::exception& e )
4545
{
46-
detail::add( data, key, e.what() );
46+
detail::add( data, key, detail::propertyValueIfError );
4747
}
4848
}
4949
#endif

src/AvTranscoder/mediaProperty/DataProperties.hpp renamed to src/AvTranscoder/properties/DataProperties.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP
22
#define _AV_TRANSCODER_MEDIA_PROPERTY_DATA_PROPERTIES_HPP
33

4-
#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
4+
#include <AvTranscoder/properties/StreamProperties.hpp>
55

66
namespace avtranscoder
77
{

src/AvTranscoder/mediaProperty/FileProperties.cpp renamed to src/AvTranscoder/properties/FileProperties.cpp

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "FileProperties.hpp"
22

3+
#include <AvTranscoder/properties/JsonWriter.hpp>
34
#include <AvTranscoder/progress/NoDisplayProgress.hpp>
45

56
#include <stdexcept>
@@ -206,7 +207,7 @@ size_t FileProperties::getNbStreams() const
206207
return _avFormatContext->nb_streams;
207208
}
208209

209-
PropertyVector FileProperties::getPropertiesAsVector() const
210+
PropertyVector FileProperties::asVector() const
210211
{
211212
PropertyVector data;
212213

@@ -235,6 +236,96 @@ PropertyVector FileProperties::getPropertiesAsVector() const
235236
return data;
236237
}
237238

239+
PropertyMap FileProperties::asMap() const
240+
{
241+
PropertyMap dataMap;
242+
243+
PropertyVector dataVector( asVector() );
244+
for( PropertyVector::const_iterator it = dataVector.begin();
245+
it != dataVector.end();
246+
++it )
247+
{
248+
dataMap.insert( std::make_pair( it->first, it->second ) );
249+
}
250+
251+
return dataMap;
252+
}
253+
254+
std::string FileProperties::asJson() const
255+
{
256+
json::JsonObjectStreamWriter writer;
257+
PropertyMap properties = asMap();
258+
for(PropertyMap::iterator it = properties.begin(); it != properties.end(); ++it)
259+
writer << std::make_pair(it->first.c_str(), it->second.c_str());
260+
return writer.build();
261+
}
262+
263+
std::string FileProperties::allPropertiesAsJson() const
264+
{
265+
json::JsonObjectStreamWriter writer;
266+
{
267+
// format
268+
json::JsonArrayStreamWriter format;
269+
format << asJson();
270+
writer << std::make_pair("format", format.build());
271+
}
272+
{
273+
// video streams
274+
json::JsonArrayStreamWriter video;
275+
for( std::vector< avtranscoder::VideoProperties >::const_iterator it = _videoStreams.begin(); it != _videoStreams.end(); ++it )
276+
{
277+
video << it->asJson();
278+
}
279+
writer << std::make_pair("video", video.build());
280+
}
281+
{
282+
// audio streams
283+
json::JsonArrayStreamWriter audio;
284+
for( std::vector< avtranscoder::AudioProperties >::const_iterator it = _audioStreams.begin(); it != _audioStreams.end(); ++it )
285+
{
286+
audio << it->asJson();
287+
}
288+
writer << std::make_pair("audio", audio.build());
289+
}
290+
{
291+
// data streams
292+
json::JsonArrayStreamWriter data;
293+
for( std::vector< avtranscoder::DataProperties >::const_iterator it = _dataStreams.begin(); it != _dataStreams.end(); ++it )
294+
{
295+
data << it->asJson();
296+
}
297+
writer << std::make_pair("data", data.build());
298+
}
299+
{
300+
// subtitle streams
301+
json::JsonArrayStreamWriter subtitle;
302+
for( std::vector< avtranscoder::SubtitleProperties >::const_iterator it = _subtitleStreams.begin(); it != _subtitleStreams.end(); ++it )
303+
{
304+
subtitle << it->asJson();
305+
}
306+
writer << std::make_pair("subtitle", subtitle.build());
307+
}
308+
{
309+
// attachement streams
310+
json::JsonArrayStreamWriter attachement;
311+
for( std::vector< avtranscoder::AttachementProperties >::const_iterator it = _attachementStreams.begin(); it != _attachementStreams.end(); ++it )
312+
{
313+
attachement << it->asJson();
314+
}
315+
writer << std::make_pair("attachement", attachement.build());
316+
}
317+
{
318+
// unknown streams
319+
json::JsonArrayStreamWriter unknown;
320+
for( std::vector< avtranscoder::UnknownProperties >::const_iterator it = _unknownStreams.begin(); it != _unknownStreams.end(); ++it )
321+
{
322+
unknown << it->asJson();
323+
}
324+
writer << std::make_pair("unknown", unknown.build());
325+
}
326+
return writer.build();
327+
}
328+
238329
void FileProperties::clearStreamProperties()
239330
{
240331
_streams.clear();

src/AvTranscoder/mediaProperty/FileProperties.hpp renamed to src/AvTranscoder/properties/FileProperties.hpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
#define _AV_TRANSCODER_MEDIA_PROPERTY_FILE_PROPERTIES_HPP
33

44
#include <AvTranscoder/common.hpp>
5-
#include <AvTranscoder/mediaProperty/util.hpp>
5+
#include <AvTranscoder/properties/util.hpp>
66
#include <AvTranscoder/file/FormatContext.hpp>
77
#include <AvTranscoder/progress/IProgress.hpp>
88

9-
#include <AvTranscoder/mediaProperty/StreamProperties.hpp>
10-
#include <AvTranscoder/mediaProperty/VideoProperties.hpp>
11-
#include <AvTranscoder/mediaProperty/AudioProperties.hpp>
12-
#include <AvTranscoder/mediaProperty/DataProperties.hpp>
13-
#include <AvTranscoder/mediaProperty/SubtitleProperties.hpp>
14-
#include <AvTranscoder/mediaProperty/AttachementProperties.hpp>
15-
#include <AvTranscoder/mediaProperty/UnknownProperties.hpp>
9+
#include <AvTranscoder/properties/StreamProperties.hpp>
10+
#include <AvTranscoder/properties/VideoProperties.hpp>
11+
#include <AvTranscoder/properties/AudioProperties.hpp>
12+
#include <AvTranscoder/properties/DataProperties.hpp>
13+
#include <AvTranscoder/properties/SubtitleProperties.hpp>
14+
#include <AvTranscoder/properties/AttachementProperties.hpp>
15+
#include <AvTranscoder/properties/UnknownProperties.hpp>
1616

1717
#include <string>
1818
#include <vector>
@@ -81,7 +81,10 @@ class AvExport FileProperties
8181
const AVFormatContext& getAVFormatContext() { return *_avFormatContext; }
8282
#endif
8383

84-
PropertyVector getPropertiesAsVector() const; ///< Return all file properties as a vector (name of property: value)
84+
std::string allPropertiesAsJson() const; ///< Return all properties as a json format.
85+
std::string asJson() const; ///< Return all format properties as a json format.
86+
PropertyMap asMap() const; ///< Return format properties as a map (name of property, value)
87+
PropertyVector asVector() const; ///< Return format properties as a vector (name of property: value)
8588

8689
private:
8790
#ifndef SWIG
@@ -94,7 +97,7 @@ class AvExport FileProperties
9497
}
9598
catch( const std::exception& e )
9699
{
97-
detail::add( data, key, e.what() );
100+
detail::add( data, key, detail::propertyValueIfError );
98101
}
99102
}
100103
#endif
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include "JsonWriter.hpp"
2+
3+
#include <string>
4+
#include <sstream>
5+
6+
namespace avtranscoder {
7+
namespace json {
8+
9+
std::string JsonStreamWriter::escapeJsonString(const std::string& input)
10+
{
11+
std::ostringstream ss;
12+
for (std::string::const_iterator iter = input.begin(); iter != input.end(); iter++) {
13+
switch (*iter) {
14+
case '\\': ss << "\\\\"; break;
15+
default: ss << *iter; break;
16+
}
17+
}
18+
return ss.str();
19+
}
20+
21+
template<>
22+
JsonObjectStreamWriter& JsonObjectStreamWriter::operator<<(const std::pair<const char *, const char*> pair)
23+
{
24+
std::string first(pair.first);
25+
std::string second(pair.second);
26+
addSep() << escapeJsonString(first).c_str() << ':' << escapeJsonString(second).c_str();
27+
return *this;
28+
}
29+
30+
template <>
31+
JsonStreamWriter& JsonStreamWriter::operator<<(bool value)
32+
{
33+
stream << (value ? "true" : "false");
34+
return *this;
35+
}
36+
template <>
37+
JsonStreamWriter& JsonStreamWriter::operator<<(const char *string)
38+
{
39+
stream << '"' << string << '"';
40+
return *this;
41+
}
42+
template <>
43+
JsonStreamWriter& JsonStreamWriter::operator<<(JsonNull)
44+
{
45+
stream << "null";
46+
return *this;
47+
}
48+
49+
}
50+
}

0 commit comments

Comments
 (0)