X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fframe_on_disk.h;h=360bd23ce1222271cfef1f82df5006de0b141a60;hb=e0cb348ca42ae7057f8f5acee92a23e7eb26075f;hp=7807c52b4a69cdb2a08819bb10636f9e59bdc44e;hpb=94a228f7473325130704e96c82937b690703615b;p=nageru diff --git a/futatabi/frame_on_disk.h b/futatabi/frame_on_disk.h index 7807c52..360bd23 100644 --- a/futatabi/frame_on_disk.h +++ b/futatabi/frame_on_disk.h @@ -1,21 +1,22 @@ #ifndef _FRAME_ON_DISK_H #define _FRAME_ON_DISK_H 1 +#include "defs.h" + #include #include +#include #include #include -#include - -#include "defs.h" - extern std::mutex frame_mu; struct FrameOnDisk { - int64_t pts = -1; // -1 means empty. - off_t offset; - unsigned filename_idx; - uint32_t size; // Not using size_t saves a few bytes; we can have so many frames. + int64_t pts = -1; // -1 means empty. + off_t offset; + unsigned filename_idx; + uint32_t size; // Not using size_t saves a few bytes; we can have so many frames. TODO: Not anymore due to audio_size. + uint32_t audio_size; + // Unfortunately, 32 bits wasted in padding here. }; extern std::vector frames[MAX_STREAMS]; // Under frame_mu. extern std::vector frame_filenames; // Under frame_mu. @@ -25,7 +26,8 @@ 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.size == b.size && + a.audio_size == b.audio_size; } // A helper class to read frames from disk. It caches the file descriptor @@ -33,11 +35,18 @@ static bool inline operator==(const FrameOnDisk &a, const FrameOnDisk &b) // the sequential reads. (For this reason, each display has a private // FrameReader. Thus, we can easily keep multiple open file descriptors around // for a single .frames file.) +// +// Thread-compatible, but not thread-safe. class FrameReader { public: FrameReader(); ~FrameReader(); - std::string read_frame(FrameOnDisk frame); + + struct Frame { + std::string video; + std::string audio; + }; + Frame read_frame(FrameOnDisk frame, bool read_audio); private: int fd = -1; @@ -49,14 +58,14 @@ inline std::vector::iterator find_last_frame_before(std::vector &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; }); + [](const FrameOnDisk &frame, int64_t pts) { return frame.pts < pts; }); } inline std::vector::iterator find_first_frame_at_or_after(std::vector &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; }); + [](int64_t pts, const FrameOnDisk &frame) { return pts < frame.pts; }); } #endif // !defined(_FRAME_ON_DISK_H)