]> git.sesse.net Git - nageru/blobdiff - nageru/ffmpeg_capture.h
Support SRT inputs.
[nageru] / nageru / ffmpeg_capture.h
index 843c83c254d4b9b5ac8cf46532c236cc269298c7..685191a1f28bf9f463773fccb9abe3858c46b86d 100644 (file)
@@ -57,6 +57,10 @@ class FFmpegCapture : public bmusb::CaptureInterface
 {
 public:
        FFmpegCapture(const std::string &filename, unsigned width, unsigned height);
+#ifdef HAVE_SRT
+       // Takes ownership of the SRT client socket.
+       FFmpegCapture(int srt_sock, const std::string &stream_id);
+#endif
        ~FFmpegCapture();
 
        void set_card_index(int card_index)
@@ -195,6 +199,11 @@ public:
                has_dequeue_callbacks = true;
        }
 
+       void set_card_disconnected_callback(bmusb::card_disconnected_callback_t callback)
+       {
+               card_disconnected_callback = callback;
+       }
+
        std::string get_description() const override
        {
                return description;
@@ -203,7 +212,7 @@ public:
        void configure_card() override;
        void start_bm_capture() override;
        void stop_dequeue_thread() override;
-       bool get_disconnected() const override { return false; }  // We never unplug.
+       bool get_disconnected() const override { return disconnected; }  // Only if play_once == true.
 
        std::map<uint32_t, bmusb::VideoMode> get_available_video_modes() const override;
        void set_video_mode(uint32_t video_mode_id) override {}  // Ignore.
@@ -249,11 +258,17 @@ 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);
+       static int interrupt_cb_thunk(void *opaque);
        int interrupt_cb();
 
+#ifdef HAVE_SRT
+       static int read_srt_thunk(void *opaque, uint8_t *buf, int buf_size);
+       int read_srt(uint8_t *buf, int buf_size);
+#endif
+
        mutable std::mutex filename_mu;
        std::string description, filename;
+       int srt_sock = -1;
        uint16_t timecode = 0;
        unsigned width, height;
        bmusb::PixelFormat pixel_format = bmusb::PixelFormat_8BitBGRA;
@@ -269,6 +284,10 @@ private:
        std::function<void()> dequeue_init_callback = nullptr;
        std::function<void()> dequeue_cleanup_callback = nullptr;
 
+       bmusb::card_disconnected_callback_t card_disconnected_callback = nullptr;
+       bool play_once = false;  // End thread after playing. Only for SRT, since the socket is ephemeral.
+       std::atomic<bool> disconnected{false};
+
        bmusb::FrameAllocator *video_frame_allocator = nullptr;
        bmusb::FrameAllocator *audio_frame_allocator = nullptr;
        std::unique_ptr<bmusb::FrameAllocator> owned_video_frame_allocator;