X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fframe_on_disk.cpp;h=f9a5639259be7a153777feb4ca76bded039d6185;hb=refs%2Fheads%2Fmaster;hp=971cafd5d9c7d8b89ee5a208fa6c91a2539803e7;hpb=9ffd4f03f314cc6e0254449593def95c9bc203d6;p=nageru diff --git a/futatabi/frame_on_disk.cpp b/futatabi/frame_on_disk.cpp index 971cafd..f9a5639 100644 --- a/futatabi/frame_on_disk.cpp +++ b/futatabi/frame_on_disk.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -47,8 +48,30 @@ FrameReader::~FrameReader() } } -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) { @@ -76,17 +99,12 @@ string FrameReader::read_frame(FrameOnDisk frame) ++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"); - abort(); - } - - 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(); @@ -95,5 +113,5 @@ string FrameReader::read_frame(FrameOnDisk frame) metric_frame_read_bytes += frame.size; ++metric_frame_read_frames; - return str; + return ret; }