X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=21b22552049d78c7ec9e7438648fccfcb7ed987e;hb=b85c1986b7ea63534899e2eb589f9e0888d5ccda;hp=e0f96cf16a922034f4ee64bd73cca361f08d963d;hpb=e50b38a01429d41b6681db8675dc8b8f64a20c36;p=nageru diff --git a/mixer.h b/mixer.h index e0f96cf..21b2255 100644 --- a/mixer.h +++ b/mixer.h @@ -49,7 +49,6 @@ class ResourcePool; namespace movit { class YCbCrInput; } -class QOpenGLContext; class QSurfaceFormat; // For any card that's not the master (where we pick out the frames as they @@ -388,13 +387,20 @@ public: cards[card_index].capture->set_audio_input(input); } + void change_x264_bitrate(unsigned rate_kbit) { + video_encoder->change_x264_bitrate(rate_kbit); + } + private: - void configure_card(unsigned card_index, const QSurfaceFormat &format, CaptureInterface *capture); + void configure_card(unsigned card_index, CaptureInterface *capture, bool is_fake_capture); void bm_frame(unsigned card_index, uint16_t timecode, FrameAllocator::Frame video_frame, size_t video_offset, VideoFormat video_format, FrameAllocator::Frame audio_frame, size_t audio_offset, AudioFormat audio_format); + void bm_hotplug_add(libusb_device *dev); + void bm_hotplug_remove(unsigned card_index); void place_rectangle(movit::Effect *resample_effect, movit::Effect *padding_effect, float x0, float y0, float x1, float y1); void thread_func(); + void handle_hotplugged_cards(); void schedule_audio_resampling_tasks(unsigned dropped_frames, int num_samples_per_frame, int length_per_frame); void render_one_frame(int64_t duration); void send_audio_level_callback(); @@ -426,12 +432,12 @@ private: std::mutex bmusb_mutex; bool has_bmusb_thread = false; struct CaptureCard { - CaptureInterface *capture; + CaptureInterface *capture = nullptr; + bool is_fake_capture; std::unique_ptr frame_allocator; // Stuff for the OpenGL context (for texture uploading). - QSurface *surface; - QOpenGLContext *context; + QSurface *surface = nullptr; struct NewFrame { RefCountedFrame frame; @@ -461,6 +467,11 @@ private: InputState input_state; + // Cards we have been noticed about being hotplugged, but haven't tried adding yet. + // Protected by its own mutex. + std::mutex hotplug_mutex; + std::vector hotplugged_cards; + class OutputChannel { public: ~OutputChannel();