OpenShot Library | libopenshot  0.5.0
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 
16 #include "ReaderBase.h"
17 #include "ClipBase.h"
18 #include "Frame.h"
19 
20 #include "Json.h"
21 
22 
23 using namespace openshot;
24 
27 {
28  // Initialize info struct
29  info.has_video = false;
30  info.has_audio = false;
31  info.has_single_image = false;
32  info.duration = 0.0;
33  info.file_size = 0;
34  info.height = 0;
35  info.width = 0;
36  info.pixel_format = -1;
37  info.fps = Fraction();
38  info.video_bit_rate = 0;
41  info.vcodec = "";
42  info.video_length = 0;
45  info.interlaced_frame = false;
46  info.top_field_first = true;
47  info.acodec = "";
48  info.audio_bit_rate = 0;
49  info.sample_rate = 0;
50  info.channels = 0;
54 
55  // Init parent clip
56  clip = NULL;
57 }
58 
59 // Display file information
60 void ReaderBase::DisplayInfo(std::ostream* out) {
61  *out << std::fixed << std::setprecision(2) << std::boolalpha;
62  *out << "----------------------------" << std::endl;
63  *out << "----- File Information -----" << std::endl;
64  *out << "----------------------------" << std::endl;
65  *out << "--> Has Video: " << info.has_video << std::endl;
66  *out << "--> Has Audio: " << info.has_audio << std::endl;
67  *out << "--> Has Single Image: " << info.has_single_image << std::endl;
68  *out << "--> Duration: " << info.duration << " Seconds" << std::endl;
69  *out << "--> File Size: " << double(info.file_size) / 1024 / 1024 << " MB" << std::endl;
70  *out << "----------------------------" << std::endl;
71  *out << "----- Video Attributes -----" << std::endl;
72  *out << "----------------------------" << std::endl;
73  *out << "--> Width: " << info.width << std::endl;
74  *out << "--> Height: " << info.height << std::endl;
75  *out << "--> Pixel Format: " << info.pixel_format << std::endl;
76  *out << "--> Frames Per Second: " << info.fps.ToDouble() << " (" << info.fps.num << "/" << info.fps.den << ")" << std::endl;
77  *out << "--> Video Bit Rate: " << info.video_bit_rate/1000 << " kb/s" << std::endl;
78  *out << "--> Pixel Ratio: " << info.pixel_ratio.ToDouble() << " (" << info.pixel_ratio.num << "/" << info.pixel_ratio.den << ")" << std::endl;
79  *out << "--> Display Aspect Ratio: " << info.display_ratio.ToDouble() << " (" << info.display_ratio.num << "/" << info.display_ratio.den << ")" << std::endl;
80  *out << "--> Video Codec: " << info.vcodec << std::endl;
81  *out << "--> Video Length: " << info.video_length << " Frames" << std::endl;
82  *out << "--> Video Stream Index: " << info.video_stream_index << std::endl;
83  *out << "--> Video Timebase: " << info.video_timebase.ToDouble() << " (" << info.video_timebase.num << "/" << info.video_timebase.den << ")" << std::endl;
84  *out << "--> Interlaced: " << info.interlaced_frame << std::endl;
85  *out << "--> Interlaced: Top Field First: " << info.top_field_first << std::endl;
86  *out << "----------------------------" << std::endl;
87  *out << "----- Audio Attributes -----" << std::endl;
88  *out << "----------------------------" << std::endl;
89  *out << "--> Audio Codec: " << info.acodec << std::endl;
90  *out << "--> Audio Bit Rate: " << info.audio_bit_rate/1000 << " kb/s" << std::endl;
91  *out << "--> Sample Rate: " << info.sample_rate << " Hz" << std::endl;
92  *out << "--> # of Channels: " << info.channels << std::endl;
93  *out << "--> Channel Layout: " << info.channel_layout << std::endl;
94  *out << "--> Audio Stream Index: " << info.audio_stream_index << std::endl;
95  *out << "--> Audio Timebase: " << info.audio_timebase.ToDouble() << " (" << info.audio_timebase.num << "/" << info.audio_timebase.den << ")" << std::endl;
96  *out << "----------------------------" << std::endl;
97  *out << "--------- Metadata ---------" << std::endl;
98  *out << "----------------------------" << std::endl;
99 
100  // Iterate through metadata
101  for (auto it : info.metadata)
102  *out << "--> " << it.first << ": " << it.second << std::endl;
103 }
104 
105 // Generate Json::Value for this object
106 Json::Value ReaderBase::JsonValue() const {
107 
108  // Create root json object
109  Json::Value root;
110  root["has_video"] = info.has_video;
111  root["has_audio"] = info.has_audio;
112  root["has_single_image"] = info.has_single_image;
113  root["duration"] = info.duration;
114  root["file_size"] = static_cast<Json::Value::Int64>(info.file_size); // direct 64-bit int
115  root["height"] = info.height;
116  root["width"] = info.width;
117  root["pixel_format"] = info.pixel_format;
118  root["fps"] = Json::Value(Json::objectValue);
119  root["fps"]["num"] = info.fps.num;
120  root["fps"]["den"] = info.fps.den;
121  root["video_bit_rate"] = info.video_bit_rate;
122  root["pixel_ratio"] = Json::Value(Json::objectValue);
123  root["pixel_ratio"]["num"] = info.pixel_ratio.num;
124  root["pixel_ratio"]["den"] = info.pixel_ratio.den;
125  root["display_ratio"] = Json::Value(Json::objectValue);
126  root["display_ratio"]["num"] = info.display_ratio.num;
127  root["display_ratio"]["den"] = info.display_ratio.den;
128  root["vcodec"] = info.vcodec;
129  root["video_length"] = static_cast<Json::Value::Int64>(info.video_length);
130  root["video_stream_index"] = info.video_stream_index;
131  root["video_timebase"] = Json::Value(Json::objectValue);
132  root["video_timebase"]["num"] = info.video_timebase.num;
133  root["video_timebase"]["den"] = info.video_timebase.den;
134  root["interlaced_frame"] = info.interlaced_frame;
135  root["top_field_first"] = info.top_field_first;
136  root["acodec"] = info.acodec;
137  root["audio_bit_rate"] = info.audio_bit_rate;
138  root["sample_rate"] = info.sample_rate;
139  root["channels"] = info.channels;
140  root["channel_layout"] = info.channel_layout;
141  root["audio_stream_index"] = info.audio_stream_index;
142  root["audio_timebase"] = Json::Value(Json::objectValue);
143  root["audio_timebase"]["num"] = info.audio_timebase.num;
144  root["audio_timebase"]["den"] = info.audio_timebase.den;
145 
146  // Append metadata map
147  root["metadata"] = Json::Value(Json::objectValue);
148 
149  for (const auto it : info.metadata)
150  root["metadata"][it.first] = it.second;
151 
152  // return JsonValue
153  return root;
154 }
155 
156 // Load Json::Value into this object
157 void ReaderBase::SetJsonValue(const Json::Value root) {
158 
159  // Set data from Json (if key is found)
160  if (!root["has_video"].isNull())
161  info.has_video = root["has_video"].asBool();
162  if (!root["has_audio"].isNull())
163  info.has_audio = root["has_audio"].asBool();
164  if (!root["has_single_image"].isNull())
165  info.has_single_image = root["has_single_image"].asBool();
166  if (!root["duration"].isNull())
167  info.duration = root["duration"].asDouble();
168  if (!root["file_size"].isNull())
169  info.file_size = std::stoll(root["file_size"].asString());
170  if (!root["height"].isNull())
171  info.height = root["height"].asInt();
172  if (!root["width"].isNull())
173  info.width = root["width"].asInt();
174  if (!root["pixel_format"].isNull())
175  info.pixel_format = root["pixel_format"].asInt();
176  if (!root["fps"].isNull() && root["fps"].isObject()) {
177  if (!root["fps"]["num"].isNull())
178  info.fps.num = root["fps"]["num"].asInt();
179  if (!root["fps"]["den"].isNull())
180  info.fps.den = root["fps"]["den"].asInt();
181  }
182  if (!root["video_bit_rate"].isNull())
183  info.video_bit_rate = root["video_bit_rate"].asInt();
184  if (!root["pixel_ratio"].isNull() && root["pixel_ratio"].isObject()) {
185  if (!root["pixel_ratio"]["num"].isNull())
186  info.pixel_ratio.num = root["pixel_ratio"]["num"].asInt();
187  if (!root["pixel_ratio"]["den"].isNull())
188  info.pixel_ratio.den = root["pixel_ratio"]["den"].asInt();
189  }
190  if (!root["display_ratio"].isNull() && root["display_ratio"].isObject()) {
191  if (!root["display_ratio"]["num"].isNull())
192  info.display_ratio.num = root["display_ratio"]["num"].asInt();
193  if (!root["display_ratio"]["den"].isNull())
194  info.display_ratio.den = root["display_ratio"]["den"].asInt();
195  }
196  if (!root["vcodec"].isNull())
197  info.vcodec = root["vcodec"].asString();
198  if (!root["video_length"].isNull())
199  info.video_length = std::stoll(root["video_length"].asString());
200  if (!root["video_stream_index"].isNull())
201  info.video_stream_index = root["video_stream_index"].asInt();
202  if (!root["video_timebase"].isNull() && root["video_timebase"].isObject()) {
203  if (!root["video_timebase"]["num"].isNull())
204  info.video_timebase.num = root["video_timebase"]["num"].asInt();
205  if (!root["video_timebase"]["den"].isNull())
206  info.video_timebase.den = root["video_timebase"]["den"].asInt();
207  }
208  if (!root["interlaced_frame"].isNull())
209  info.interlaced_frame = root["interlaced_frame"].asBool();
210  if (!root["top_field_first"].isNull())
211  info.top_field_first = root["top_field_first"].asBool();
212  if (!root["acodec"].isNull())
213  info.acodec = root["acodec"].asString();
214 
215  if (!root["audio_bit_rate"].isNull())
216  info.audio_bit_rate = root["audio_bit_rate"].asInt();
217  if (!root["sample_rate"].isNull())
218  info.sample_rate = root["sample_rate"].asInt();
219  if (!root["channels"].isNull())
220  info.channels = root["channels"].asInt();
221  if (!root["channel_layout"].isNull())
222  info.channel_layout = (ChannelLayout) root["channel_layout"].asInt();
223  if (!root["audio_stream_index"].isNull())
224  info.audio_stream_index = root["audio_stream_index"].asInt();
225  if (!root["audio_timebase"].isNull() && root["audio_timebase"].isObject()) {
226  if (!root["audio_timebase"]["num"].isNull())
227  info.audio_timebase.num = root["audio_timebase"]["num"].asInt();
228  if (!root["audio_timebase"]["den"].isNull())
229  info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
230  }
231  if (!root["metadata"].isNull() && root["metadata"].isObject()) {
232  for( Json::Value::const_iterator itr = root["metadata"].begin() ; itr != root["metadata"].end() ; itr++ ) {
233  std::string key = itr.key().asString();
234  info.metadata[key] = root["metadata"][key].asString();
235  }
236  }
237 }
238 
241  return clip;
242 }
243 
246  clip = new_clip;
247 }
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:32
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:157
virtual Json::Value JsonValue() const =0
Generate Json::Value for this object.
Definition: ReaderBase.cpp:106
void DisplayInfo(std::ostream *out=&std::cout)
Display file information in the standard output stream (stdout)
Definition: ReaderBase.cpp:60
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:240
ReaderBase()
Constructor for the base reader, where many things are initialized.
Definition: ReaderBase.cpp:26
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