]> git.sesse.net Git - nageru/blobdiff - futatabi/frame_on_disk.h
Cache computed flow between textures.
[nageru] / futatabi / frame_on_disk.h
index 184385792528130df7e3ba16637385c0c14a35db..7807c52b4a69cdb2a08819bb10636f9e59bdc44e 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _FRAME_ON_DISK_H
 #define _FRAME_ON_DISK_H 1
 
+#include <algorithm>
 #include <mutex>
 #include <string>
 #include <vector>
@@ -19,6 +20,14 @@ struct FrameOnDisk {
 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
@@ -26,6 +35,7 @@ extern std::vector<std::string> frame_filenames;  // Under frame_mu.
 // for a single .frames file.)
 class FrameReader {
 public:
+       FrameReader();
        ~FrameReader();
        std::string read_frame(FrameOnDisk frame);
 
@@ -34,4 +44,19 @@ private:
        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)