OpenShot Library | libopenshot 0.3.3
Loading...
Searching...
No Matches
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
24using 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();
42 info.vcodec = "";
46 info.interlaced_frame = false;
47 info.top_field_first = true;
48 info.acodec = "";
50 info.sample_rate = 0;
51 info.channels = 0;
55
56 // Init parent clip
57 clip = NULL;
58}
59
60// Display file information
61void 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
107Json::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
162void 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
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.
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,...
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