#include <atomic>
#include <chrono>
+#include <assert.h>
#include <fcntl.h>
#include <mutex>
#include <unistd.h>
}
}
-string FrameReader::read_frame(FrameOnDisk frame)
+namespace {
+
+string read_string(int fd, size_t size, off_t offset)
{
+ string str;
+ str.resize(size);
+ size_t str_offset = 0;
+ while (str_offset < size) {
+ int ret = pread(fd, &str[str_offset], size - str_offset, offset + str_offset);
+ if (ret <= 0) {
+ perror("pread");
+ abort();
+ }
+
+ str_offset += ret;
+ }
+ return str;
+}
+
+} // namespace
+
+FrameReader::Frame FrameReader::read_frame(FrameOnDisk frame, bool read_video, bool read_audio)
+{
+ assert(read_video || read_audio);
steady_clock::time_point start = steady_clock::now();
if (int(frame.filename_idx) != last_filename_idx) {
fd = open(filename.c_str(), O_RDONLY);
if (fd == -1) {
perror(filename.c_str());
- exit(1);
+ abort();
}
// We want readahead. (Ignore errors.)
++metric_frame_opened_files;
}
- string str;
- str.resize(frame.size);
- off_t offset = 0;
- while (offset < frame.size) {
- int ret = pread(fd, &str[offset], frame.size - offset, frame.offset + offset);
- if (ret <= 0) {
- perror("pread");
- exit(1);
- }
-
- offset += ret;
+ Frame ret;
+ if (read_video) {
+ ret.video = read_string(fd, frame.size, frame.offset);
+ }
+ if (read_audio) {
+ ret.audio = read_string(fd, frame.audio_size, frame.offset + frame.size);
}
steady_clock::time_point stop = steady_clock::now();
metric_frame_read_bytes += frame.size;
++metric_frame_read_frames;
- return str;
+ return ret;
}