#ifndef _FRAME_ON_DISK_H
#define _FRAME_ON_DISK_H 1
+#include <algorithm>
#include <mutex>
#include <string>
#include <vector>
extern std::vector<FrameOnDisk> frames[MAX_STREAMS]; // Under frame_mu.
extern std::vector<std::string> frame_filenames; // Under frame_mu.
+static bool inline operator==(const FrameOnDisk &a, const FrameOnDisk &b)
+{
+ return a.pts == b.pts &&
+ a.offset == b.offset &&
+ a.filename_idx == b.filename_idx &&
+ a.size == b.size;
+}
+
// A helper class to read frames from disk. It caches the file descriptor
// so that the kernel has a better chance of doing readahead when it sees
// the sequential reads. (For this reason, each display has a private
// for a single .frames file.)
class FrameReader {
public:
+ FrameReader();
~FrameReader();
std::string read_frame(FrameOnDisk frame);
int last_filename_idx = -1;
};
+// Utility functions for dealing with binary search.
+inline std::vector<FrameOnDisk>::iterator
+find_last_frame_before(std::vector<FrameOnDisk> &frames, int64_t pts_origin)
+{
+ return std::lower_bound(frames.begin(), frames.end(), pts_origin,
+ [](const FrameOnDisk &frame, int64_t pts) { return frame.pts < pts; });
+}
+
+inline std::vector<FrameOnDisk>::iterator
+find_first_frame_at_or_after(std::vector<FrameOnDisk> &frames, int64_t pts_origin)
+{
+ return std::upper_bound(frames.begin(), frames.end(), pts_origin - 1,
+ [](int64_t pts, const FrameOnDisk &frame) { return pts < frame.pts; });
+}
+
#endif // !defined(_FRAME_ON_DISK_H)