#include <string>
#include <thread>
+#include <movit/effect.h>
#include <movit/ycbcr.h>
extern "C" {
{
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)
return has_last_subtitle;
}
+ // Same.
+ movit::RGBTriplet get_last_neutral_color() const
+ {
+ return last_neutral_color;
+ }
+
void set_dequeue_thread_callbacks(std::function<void()> init, std::function<void()> cleanup) override
{
dequeue_init_callback = init;
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;
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.
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;
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;
// Subtitles (no decoding done, really).
bool has_last_subtitle = false;
std::string last_subtitle;
+
+ movit::RGBTriplet last_neutral_color{1.0f, 1.0f, 1.0f};
};
#endif // !defined(_FFMPEG_CAPTURE_H)