OpenShot Library | libopenshot 0.5.0
Loading...
Searching...
No Matches
ReaderBase.cpp
Go to the documentation of this file.
1
8
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
23using 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;
39 info.pixel_ratio = Fraction();
40 info.display_ratio = Fraction();
41 info.vcodec = "";
42 info.video_length = 0;
43 info.video_stream_index = -1;
44 info.video_timebase = Fraction();
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;
51 info.channel_layout = LAYOUT_MONO;
52 info.audio_stream_index = -1;
53 info.audio_timebase = Fraction();
54
55 // Init parent clip
56 clip = NULL;
57}
58
59// Display file information
60void 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
106Json::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
157void 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
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
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.
virtual Json::Value JsonValue() const =0
Generate Json::Value for this object.
void DisplayInfo(std::ostream *out=&std::cout)
Display file information in the standard output stream (stdout).
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).
ReaderBase()
Constructor for the base reader, where many things are initialized.
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,...