]> git.sesse.net Git - nageru/blobdiff - futatabi/frame_on_disk.cpp
Make multitrack export include audio.
[nageru] / futatabi / frame_on_disk.cpp
index 971cafd5d9c7d8b89ee5a208fa6c91a2539803e7..6bdaf23a25569edb97d691a26ec1f3949dc792b1 100644 (file)
@@ -47,7 +47,28 @@ 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_audio)
 {
        steady_clock::time_point start = steady_clock::now();
 
@@ -76,17 +97,10 @@ 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;
+       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 +109,5 @@ string FrameReader::read_frame(FrameOnDisk frame)
        metric_frame_read_bytes += frame.size;
        ++metric_frame_read_frames;
 
-       return str;
+       return ret;
 }