24 : path(path), chunk_size(24 * 3), is_open(false), version(chunk_version), local_reader(NULL)
27 if (!does_folder_exist(path))
29 throw InvalidFile(
"Chunk folder could not be opened.", path);
32 previous_location.number = 0;
33 previous_location.frame = 0;
41bool ChunkReader::does_folder_exist(std::string
path)
43 QDir dir(
path.c_str());
48void ChunkReader::load_json()
51 std::string json_path = QDir::cleanPath(QString(
path.c_str()) + QDir::separator() +
"info.json").toStdString();
52 std::stringstream json_string;
55 std::ifstream myfile (json_path.c_str());
56 std::string line =
"";
61 getline (myfile, line);
69 Json::CharReaderBuilder rbuilder;
72 bool success = Json::parseFromStream(rbuilder, json_string, &root, &errors);
75 throw InvalidJSON(
"Chunk folder could not be opened.", path);
81 info.has_video = root[
"has_video"].asBool();
82 info.has_audio = root[
"has_audio"].asBool();
83 info.duration = root[
"duration"].asDouble();
84 info.file_size = std::stoll(root[
"file_size"].asString());
85 info.height = root[
"height"].asInt();
86 info.width = root[
"width"].asInt();
87 info.pixel_format = root[
"pixel_format"].asInt();
88 info.fps.num = root[
"fps"][
"num"].asInt();
89 info.fps.den = root[
"fps"][
"den"].asInt();
90 info.video_bit_rate = root[
"video_bit_rate"].asUInt();
91 info.pixel_ratio.num = root[
"pixel_ratio"][
"num"].asInt();
92 info.pixel_ratio.den = root[
"pixel_ratio"][
"den"].asInt();
93 info.display_ratio.num = root[
"display_ratio"][
"num"].asInt();
94 info.display_ratio.den = root[
"display_ratio"][
"den"].asInt();
95 info.vcodec = root[
"vcodec"].asString();
96 info.video_length = std::stoll(root[
"video_length"].asString());
97 info.video_stream_index = root[
"video_stream_index"].asInt();
98 info.video_timebase.num = root[
"video_timebase"][
"num"].asInt();
99 info.video_timebase.den = root[
"video_timebase"][
"den"].asInt();
100 info.interlaced_frame = root[
"interlaced_frame"].asBool();
101 info.top_field_first = root[
"top_field_first"].asBool();
102 info.acodec = root[
"acodec"].asString();
103 info.audio_bit_rate = root[
"audio_bit_rate"].asUInt();
104 info.sample_rate = root[
"sample_rate"].asUInt();
105 info.channels = root[
"channels"].asInt();
106 info.audio_stream_index = root[
"audio_stream_index"].asInt();
107 info.audio_timebase.num = root[
"audio_timebase"][
"num"].asInt();
108 info.audio_timebase.den = root[
"audio_timebase"][
"den"].asInt();
111 catch (
const std::exception& e)
114 throw InvalidJSON(
"JSON could not be parsed (or is invalid).", path);
119ChunkLocation ChunkReader::find_chunk_frame(int64_t requested_frame)
122 int64_t chunk_number = (requested_frame / chunk_size) + 1;
125 int64_t start_frame_of_chunk = (chunk_number - 1) * chunk_size;
126 int64_t chunk_frame_number = (requested_frame - start_frame_of_chunk) + 1;
129 ChunkLocation location = {chunk_number, chunk_frame_number};
160std::string ChunkReader::get_chunk_path(int64_t chunk_number, std::string folder, std::string extension)
163 std::stringstream chunk_count_string;
164 chunk_count_string << chunk_number;
165 QString padded_count =
"%1";
166 padded_count = padded_count.arg(chunk_count_string.str().c_str(), 6,
'0');
167 if (folder.length() != 0 && extension.length() != 0)
169 return QDir::cleanPath(QString(
path.c_str()) + QDir::separator() + folder.c_str() + QDir::separator() + padded_count + extension.c_str()).toStdString();
171 else if (folder.length() == 0 && extension.length() != 0)
173 return QDir::cleanPath(QString(
path.c_str()) + QDir::separator() + padded_count + extension.c_str()).toStdString();
175 else if (folder.length() != 0 && extension.length() == 0)
177 return QDir::cleanPath(QString(
path.c_str()) + QDir::separator() + folder.c_str()).toStdString();
189 if (previous_location.number != location.
number)
192 std::string folder_name =
"";
196 folder_name =
"thumb";
199 folder_name =
"preview";
202 folder_name =
"final";
207 std::string chunk_video_path = get_chunk_path(location.
number, folder_name,
".webm");
213 local_reader->Close();
221 local_reader->Open();
230 previous_location = location;
234 last_frame = local_reader->GetFrame(location.
frame);
237 last_frame->number = requested_frame;
255 root[
"type"] =
"ChunkReader";
257 std::stringstream chunk_size_stream;
258 chunk_size_stream << chunk_size;
259 root[
"chunk_size"] = chunk_size_stream.str();
260 root[
"chunk_version"] = version;
275 catch (
const std::exception& e)
278 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
289 if (!root[
"path"].isNull())
290 path = root[
"path"].asString();
291 if (!root[
"chunk_size"].isNull())
292 chunk_size = std::stoll(root[
"chunk_size"].asString());
293 if (!root[
"chunk_version"].isNull())
Header file for ChunkReader class.
Header file for all Exception classes.
Header file for FFmpegReader class.
Exception when a required chunk is missing.
std::string Json() const override
Generate JSON string of this object.
void Close() override
Close the reader.
void Open() override
Open the reader. This is required before you can access frames or data from the reader.
Json::Value JsonValue() const override
Generate Json::Value for this object.
ChunkReader(std::string path, ChunkVersion chunk_version)
Constructor for ChunkReader. This automatically opens the chunk file or folder and loads frame 1,...
std::shared_ptr< openshot::Frame > GetFrame(int64_t requested_frame) override
Get an openshot::Frame object for a specific frame number of this reader.
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
void SetJson(const std::string value) override
Load JSON string into this object.
This class uses the FFmpeg libraries, to open video files and audio files, and return openshot::Frame...
Exception for files that can not be found or opened.
Exception for invalid JSON.
openshot::ReaderInfo info
Information about the current media file.
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.
This namespace is the default namespace for all code in the openshot library.
ChunkVersion
This enumeration allows the user to choose which version of the chunk they would like (low,...
@ THUMBNAIL
The lowest quality stream contained in this chunk file.
@ FINAL
The highest quality stream contained in this chunk file.
@ PREVIEW
The medium quality stream contained in this chunk file.
const Json::Value stringToJson(const std::string value)
This struct holds the location of a frame within a chunk.
int64_t number
The chunk number.
int64_t frame
The frame number.