X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=nageru%2Fffmpeg_capture.h;h=685191a1f28bf9f463773fccb9abe3858c46b86d;hp=843c83c254d4b9b5ac8cf46532c236cc269298c7;hb=4df45e479ddbc8e2247be8aab7f2bab5ddaa1b74;hpb=f4dc4d6d393026a5507be1f04a9149f6b8c2322c diff --git a/nageru/ffmpeg_capture.h b/nageru/ffmpeg_capture.h index 843c83c..685191a 100644 --- a/nageru/ffmpeg_capture.h +++ b/nageru/ffmpeg_capture.h @@ -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 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 dequeue_init_callback = nullptr; std::function 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 disconnected{false}; + bmusb::FrameAllocator *video_frame_allocator = nullptr; bmusb::FrameAllocator *audio_frame_allocator = nullptr; std::unique_ptr owned_video_frame_allocator;