]> git.sesse.net Git - nageru/blobdiff - futatabi/video_stream.h
Support exporting interpolated singletrack video. Probably tickles leaks in Player...
[nageru] / futatabi / video_stream.h
index 736a20fe275ca7acacf9bd6be1e79377877840ac..d522ab1e8f5a98f9494004599b9c1aa2a74a76c0 100644 (file)
@@ -5,14 +5,16 @@
 #include <stdint.h>
 
 extern "C" {
+#include <libavformat/avformat.h>
 #include <libavformat/avio.h>
 }
 
 #include "frame_on_disk.h"
 #include "jpeg_frame_view.h"
-#include "ref_counted_gl_sync.h"
+#include "shared/ref_counted_gl_sync.h"
 #include "queue_spot_holder.h"
 
+#include <atomic>
 #include <chrono>
 #include <condition_variable>
 #include <deque>
@@ -34,7 +36,7 @@ class YCbCrConverter;
 
 class VideoStream {
 public:
-       VideoStream();
+       VideoStream(AVFormatContext *file_avctx);  // nullptr if output to stream.
        ~VideoStream();
        void start();
        void stop();
@@ -66,6 +68,7 @@ private:
 
        void encode_thread_func();
        std::thread encode_thread;
+       std::atomic<bool> should_quit{false};
 
        static int write_packet2_thunk(void *opaque, uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
        int write_packet2(uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time);
@@ -129,9 +132,11 @@ private:
        std::deque<QueuedFrame> frame_queue;  // Under <queue_lock>.
        std::condition_variable queue_changed;
 
-       std::unique_ptr<Mux> stream_mux;  // To HTTP.
-       std::string stream_mux_header;
+       AVFormatContext *avctx;
+       std::unique_ptr<Mux> mux;  // To HTTP, or to file.
+       std::string stream_mux_header;  // Only used in HTTP.
        bool seen_sync_markers = false;
+       bool output_fast_forward;
 
        std::unique_ptr<YCbCrConverter> ycbcr_converter;
        std::unique_ptr<YCbCrConverter> ycbcr_semiplanar_converter;