]> git.sesse.net Git - nageru/blobdiff - ffmpeg_capture.h
Simple audio inputs are on cards, not signals.
[nageru] / ffmpeg_capture.h
index f718c70a23ff4dccceb7df40877f389e44815266..336f6bd253ae25945843d672eae7c1bda915091b 100644 (file)
@@ -17,7 +17,6 @@
 // changes parameters midway, which is allowed in some formats.
 //
 // You can get out the audio either as decoded or in raw form (Kaeru uses this).
-// However, the rest of Nageru can't really use the audio for anything yet.
 
 #include <assert.h>
 #include <stdint.h>
@@ -78,6 +77,12 @@ public:
                producer_thread_should_quit.wakeup();
        }
 
+       // Will stop the stream even if it's hung on blocking I/O.
+       void disconnect()
+       {
+               should_interrupt = true;
+       }
+
        // CaptureInterface.
        void set_video_frame_allocator(bmusb::FrameAllocator *allocator) override
        {
@@ -207,6 +212,9 @@ private:
        bmusb::VideoFormat construct_video_format(const AVFrame *frame, AVRational video_timebase);
        UniqueFrame make_video_frame(const AVFrame *frame, const std::string &pathname, bool *error);
 
+       static int interrupt_cb_thunk(void *unique);
+       int interrupt_cb();
+
        std::string description, filename;
        uint16_t timecode = 0;
        unsigned width, height;
@@ -215,6 +223,8 @@ private:
        bool running = false;
        int card_index = -1;
        double rate = 1.0;
+       std::atomic<bool> should_interrupt{false};
+       bool last_frame_was_connected = true;
 
        bool has_dequeue_callbacks = false;
        std::function<void()> dequeue_init_callback = nullptr;
@@ -236,7 +246,7 @@ private:
        std::thread producer_thread;
 
        int64_t pts_origin, last_pts;
-       std::chrono::steady_clock::time_point start, next_frame_start;
+       std::chrono::steady_clock::time_point start, next_frame_start, last_frame;
 
        std::mutex queue_mu;
        struct QueuedCommand {