OpenShot Library | libopenshot  0.3.2
ReaderBase.cpp
Go to the documentation of this file.
1 
9 // Copyright (c) 2008-2019 OpenShot Studios, LLC
10 //
11 // SPDX-License-Identifier: LGPL-3.0-or-later
12 
13 #include <iostream>
14 #include <iomanip>
15 #include <sstream>
16 
17 #include "ReaderBase.h"
18 #include "ClipBase.h"
19 #include "Frame.h"
20 
21 #include "Json.h"
22 
23 
24 using namespace openshot;
25 
28 {
29  // Initialize info struct
30  info.has_video = false;
31  info.has_audio = false;
32  info.has_single_image = false;
33  info.duration = 0.0;
34  info.file_size = 0;
35  info.height = 0;
36  info.width = 0;
37  info.pixel_format = -1;
38  info.fps = Fraction();
39  info.video_bit_rate = 0;
42  info.vcodec = "";
43  info.video_length = 0;
46  info.interlaced_frame = false;
47  info.top_field_first = true;
48  info.acodec = "";
49  info.audio_bit_rate = 0;
50  info.sample_rate = 0;
51  info.channels = 0;
55 
56  // Init parent clip
57  clip = NULL;
58 }
59 
60 // Display file information
61 void ReaderBase::DisplayInfo(std::ostream* out) {
62  *out << std::fixed << std::setprecision(2) << std::boolalpha;
63  *out << "----------------------------" << std::endl;
64  *out << "----- File Information -----" << std::endl;
65  *out << "----------------------------" << std::endl;
66  *out << "--> Has Video: " << info.has_video << std::endl;
67  *out << "--> Has Audio: " << info.has_audio << std::endl;
68  *out << "--> Has Single Image: " << info.has_single_image << std::endl;
69  *out << "--> Duration: " << info.duration << " Seconds" << std::endl;
70  *out << "--> File Size: " << double(info.file_size) / 1024 / 1024 << " MB" << std::endl;
71  *out << "----------------------------" << std::endl;
72  *out << "----- Video Attributes -----" << std::endl;
73  *out << "----------------------------" << std::endl;
74  *out << "--> Width: " << info.width << std::endl;
75  *out << "--> Height: " << info.height << std::endl;
76  *out << "--> Pixel Format: " << info.pixel_format << std::endl;
77  *out << "--> Frames Per Second: " << info.fps.ToDouble() << " (" << info.fps.num << "/" << info.fps.den << ")" << std::endl;
78  *out << "--> Video Bit Rate: " << info.video_bit_rate/1000 << " kb/s" << std::endl;
79  *out << "--> Pixel Ratio: " << info.pixel_ratio.ToDouble() << " (" << info.pixel_ratio.num << "/" << info.pixel_ratio.den << ")" << std::endl;
80  *out << "--> Display Aspect Ratio: " << info.display_ratio.ToDouble() << " (" << info.display_ratio.num << "/" << info.display_ratio.den << ")" << std::endl;
81  *out << "--> Video Codec: " << info.vcodec << std::endl;
82  *out << "--> Video Length: " << info.video_length << " Frames" << std::endl;
83  *out << "--> Video Stream Index: " << info.video_stream_index << std::endl;
84  *out << "--> Video Timebase: " << info.video_timebase.ToDouble() << " (" << info.video_timebase.num << "/" << info.video_timebase.den << ")" << std::endl;
85  *out << "--> Interlaced: " << info.interlaced_frame << std::endl;
86  *out << "--> Interlaced: Top Field First: " << info.top_field_first << std::endl;
87  *out << "----------------------------" << std::endl;
88  *out << "----- Audio Attributes -----" << std::endl;
89  *out << "----------------------------" << std::endl;
90  *out << "--> Audio Codec: " << info.acodec << std::endl;
91  *out << "--> Audio Bit Rate: " << info.audio_bit_rate/1000 << " kb/s" << std::endl;
92  *out << "--> Sample Rate: " << info.sample_rate << " Hz" << std::endl;
93  *out << "--> # of Channels: " << info.channels << std::endl;
94  *out << "--> Channel Layout: " << info.channel_layout << std::endl;
95  *out << "--> Audio Stream Index: " << info.audio_stream_index << std::endl;
96  *out << "--> Audio Timebase: " << info.audio_timebase.ToDouble() << " (" << info.audio_timebase.num << "/" << info.audio_timebase.den << ")" << std::endl;
97  *out << "----------------------------" << std::endl;
98  *out << "--------- Metadata ---------" << std::endl;
99  *out << "----------------------------" << std::endl;
100 
101  // Iterate through metadata
102  for (auto it : info.metadata)
103  *out << "--> " << it.first << ": " << it.second << std::endl;
104 }
105 
106 // Generate Json::Value for this object
107 Json::Value ReaderBase::JsonValue() const {
108 
109  // Create root json object
110  Json::Value root;
111  root["has_video"] = info.has_video;
112  root["has_audio"] = info.has_audio;
113  root["has_single_image"] = info.has_single_image;
114  root["duration"] = info.duration;
115  std::stringstream filesize_stream;
116  filesize_stream << info.file_size;
117  root["file_size"] = filesize_stream.str();
118  root["height"] = info.height;
119  root["width"] = info.width;
120  root["pixel_format"] = info.pixel_format;
121  root["fps"] = Json::Value(Json::objectValue);
122  root["fps"]["num"] = info.fps.num;
123  root["fps"]["den"] = info.fps.den;
124  root["video_bit_rate"] = info.video_bit_rate;
125  root["pixel_ratio"] = Json::Value(Json::objectValue);
126  root["pixel_ratio"]["num"] = info.pixel_ratio.num;
127  root["pixel_ratio"]["den"] = info.pixel_ratio.den;
128  root["display_ratio"] = Json::Value(Json::objectValue);
129  root["display_ratio"]["num"] = info.display_ratio.num;
130  root["display_ratio"]["den"] = info.display_ratio.den;
131  root["vcodec"] = info.vcodec;
132  std::stringstream video_length_stream;
133  video_length_stream << info.video_length;
134  root["video_length"] = video_length_stream.str();
135  root["video_stream_index"] = info.video_stream_index;
136  root["video_timebase"] = Json::Value(Json::objectValue);
137  root["video_timebase"]["num"] = info.video_timebase.num;
138  root["video_timebase"]["den"] = info.video_timebase.den;
139  root["interlaced_frame"] = info.interlaced_frame;
140  root["top_field_first"] = info.top_field_first;
141  root["acodec"] = info.acodec;
142  root["audio_bit_rate"] = info.audio_bit_rate;
143  root["sample_rate"] = info.sample_rate;
144  root["channels"] = info.channels;
145  root["channel_layout"] = info.channel_layout;
146  root["audio_stream_index"] = info.audio_stream_index;
147  root["audio_timebase"] = Json::Value(Json::objectValue);
148  root["audio_timebase"]["num"] = info.audio_timebase.num;
149  root["audio_timebase"]["den"] = info.audio_timebase.den;
150 
151  // Append metadata map
152  root["metadata"] = Json::Value(Json::objectValue);
153 
154  for (const auto it : info.metadata)
155  root["metadata"][it.first] = it.second;
156 
157  // return JsonValue
158  return root;
159 }
160 
161 // Load Json::Value into this object
162 void ReaderBase::SetJsonValue(const Json::Value root) {
163 
164  // Set data from Json (if key is found)
165  if (!root["has_video"].isNull())
166  info.has_video = root["has_video"].asBool();
167  if (!root["has_audio"].isNull())
168  info.has_audio = root["has_audio"].asBool();
169  if (!root["has_single_image"].isNull())
170  info.has_single_image = root["has_single_image"].asBool();
171  if (!root["duration"].isNull())
172  info.duration = root["duration"].asDouble();
173  if (!root["file_size"].isNull())
174  info.file_size = std::stoll(root["file_size"].asString());
175  if (!root["height"].isNull())
176  info.height = root["height"].asInt();
177  if (!root["width"].isNull())
178  info.width = root["width"].asInt();
179  if (!root["pixel_format"].isNull())
180  info.pixel_format = root["pixel_format"].asInt();
181  if (!root["fps"].isNull() && root["fps"].isObject()) {
182  if (!root["fps"]["num"].isNull())
183  info.fps.num = root["fps"]["num"].asInt();
184  if (!root["fps"]["den"].isNull())
185  info.fps.den = root["fps"]["den"].asInt();
186  }
187  if (!root["video_bit_rate"].isNull())
188  info.video_bit_rate = root["video_bit_rate"].asInt();
189  if (!root["pixel_ratio"].isNull() && root["pixel_ratio"].isObject()) {
190  if (!root["pixel_ratio"]["num"].isNull())
191  info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
192  if (!root["pixel_ratio"]["den"].isNull())
193  info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
194  }
195  if (!root["display_ratio"].isNull() && root["display_ratio"].isObject()) {
196  if (!root["display_ratio"]["num"].isNull())
197  info.display_ratio.num = root["display_ratio"]["num"].asInt();
198  if (!root["display_ratio"]["den"].isNull())
199  info.display_ratio.den = root["display_ratio"]["den"].asInt();
200  }
201  if (!root["vcodec"].isNull())
202  info.vcodec = root["vcodec"].asString();
203  if (!root["video_length"].isNull())
204  info.video_length = std::stoll(root["video_length"].asString());
205  if (!root["video_stream_index"].isNull())
206  info.video_stream_index = root["video_stream_index"].asInt();
207  if (!root["video_timebase"].isNull() && root["video_timebase"].isObject()) {
208  if (!root["video_timebase"]["num"].isNull())
209  info.video_timebase.num = root["video_timebase"]["num"].asInt();
210  if (!root["video_timebase"]["den"].isNull())
211  info.video_timebase.den = root["video_timebase"]["den"].asInt();
212  }
213  if (!root["interlaced_frame"].isNull())
214  info.interlaced_frame = root["interlaced_frame"].asBool();
215  if (!root["top_field_first"].isNull())
216  info.top_field_first = root["top_field_first"].asBool();
217  if (!root["acodec"].isNull())
218  info.acodec = root["acodec"].asString();
219 
220  if (!root["audio_bit_rate"].isNull())
221  info.audio_bit_rate = root["audio_bit_rate"].asInt();
222  if (!root["sample_rate"].isNull())
223  info.sample_rate = root["sample_rate"].asInt();
224  if (!root["channels"].isNull())
225  info.channels = root["channels"].asInt();
226  if (!root["channel_layout"].isNull())
227  info.channel_layout = (ChannelLayout) root["channel_layout"].asInt();
228  if (!root["audio_stream_index"].isNull())
229  info.audio_stream_index = root["audio_stream_index"].asInt();
230  if (!root["audio_timebase"].isNull() && root["audio_timebase"].isObject()) {
231  if (!root["audio_timebase"]["num"].isNull())
232  info.audio_timebase.num = root["audio_timebase"]["num"].asInt();
233  if (!root["audio_timebase"]["den"].isNull())
234  info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
235  }
236  if (!root["metadata"].isNull() && root["metadata"].isObject()) {
237  for( Json::Value::const_iterator itr = root["metadata"].begin() ; itr != root["metadata"].end() ; itr++ ) {
238  std::string key = itr.key().asString();
239  info.metadata[key] = root["metadata"][key].asString();
240  }
241  }
242 }
243 
246  return clip;
247 }
248 
251  clip = new_clip;
252 }
Header file for ClipBase class.
Header file for Frame class.
Header file for JSON class.
Header file for ReaderBase class.
This abstract class is the base class, used by all clips in libopenshot.
Definition: ClipBase.h:33
This class represents a fraction.
Definition: Fraction.h:30
int num
Numerator for the fraction.
Definition: Fraction.h:32
double ToDouble() const
Return this fraction as a double (i.e. 1/2 = 0.5)
Definition: Fraction.cpp:40
int den
Denominator for the fraction.
Definition: Fraction.h:33
openshot::ReaderInfo info
Information about the current media file.
Definition: ReaderBase.h:88
virtual void SetJsonValue(const Json::Value root)=0
Load Json::Value into this object.
Definition: ReaderBase.cpp:162
virtual Json::Value JsonValue() const =0
Generate Json::Value for this object.
Definition: ReaderBase.cpp:107
void DisplayInfo(std::ostream *out=&std::cout)
Display file information in the standard output stream (stdout)
Definition: ReaderBase.cpp:61
openshot::ClipBase * clip
Pointer to the parent clip instance (if any)
Definition: ReaderBase.h:80
openshot::ClipBase * ParentClip()
Parent clip object of this reader (which can be unparented and NULL)
Definition: ReaderBase.cpp:245
ReaderBase()
Constructor for the base reader, where many things are initialized.
Definition: ReaderBase.cpp:27
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:29
ChannelLayout
This enumeration determines the audio channel layout (such as stereo, mono, 5 point surround,...
int audio_bit_rate
The bit rate of the audio stream (in bytes)
Definition: ReaderBase.h:59
int video_bit_rate
The bit rate of the video stream (in bytes)
Definition: ReaderBase.h:49
bool has_single_image
Determines if this file only contains a single image.
Definition: ReaderBase.h:42
float duration
Length of time (in seconds)
Definition: ReaderBase.h:43
openshot::Fraction audio_timebase
The audio timebase determines how long each audio packet should be played.
Definition: ReaderBase.h:64
int width
The width of the video (in pixesl)
Definition: ReaderBase.h:46
int channels
The number of audio channels used in the audio stream.
Definition: ReaderBase.h:61
openshot::Fraction fps
Frames per second, as a fraction (i.e. 24/1 = 24 fps)
Definition: ReaderBase.h:48
openshot::Fraction display_ratio
The ratio of width to height of the video stream (i.e. 640x480 has a ratio of 4/3)
Definition: ReaderBase.h:51
int height
The height of the video (in pixels)
Definition: ReaderBase.h:45
int pixel_format
The pixel format (i.e. YUV420P, RGB24, etc...)
Definition: ReaderBase.h:47
int64_t video_length
The number of frames in the video stream.
Definition: ReaderBase.h:53
std::string acodec
The name of the audio codec used to encode / decode the video stream.
Definition: ReaderBase.h:58
std::map< std::string, std::string > metadata
An optional map/dictionary of metadata for this reader.
Definition: ReaderBase.h:65
std::string vcodec
The name of the video codec used to encode / decode the video stream.
Definition: ReaderBase.h:52
openshot::Fraction pixel_ratio
The pixel ratio of the video stream as a fraction (i.e. some pixels are not square)
Definition: ReaderBase.h:50
openshot::ChannelLayout channel_layout
The channel layout (mono, stereo, 5 point surround, etc...)
Definition: ReaderBase.h:62
bool has_video
Determines if this file has a video stream.
Definition: ReaderBase.h:40
bool has_audio
Determines if this file has an audio stream.
Definition: ReaderBase.h:41
openshot::Fraction video_timebase
The video timebase determines how long each frame stays on the screen.
Definition: ReaderBase.h:55
int video_stream_index
The index of the video stream.
Definition: ReaderBase.h:54
int sample_rate
The number of audio samples per second (44100 is a common sample rate)
Definition: ReaderBase.h:60
int audio_stream_index
The index of the audio stream.
Definition: ReaderBase.h:63
int64_t file_size
Size of file (in bytes)
Definition: ReaderBase.h:44