X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=560827ae26a96b80ca0150131d551bb758043fb1;hb=21bd3592c1a692463abd321047c2c612f91cc2ad;hp=e0f96cf16a922034f4ee64bd73cca361f08d963d;hpb=e50b38a01429d41b6681db8675dc8b8f64a20c36;p=nageru diff --git a/mixer.h b/mixer.h index e0f96cf..560827a 100644 --- a/mixer.h +++ b/mixer.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,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 @@ -302,6 +302,12 @@ public: gain_staging_db = gain_db; } + float get_gain_staging_db() const + { + std::unique_lock lock(compressor_mutex); + return gain_staging_db; + } + void set_gain_staging_auto(bool enabled) { std::unique_lock lock(compressor_mutex); @@ -327,6 +333,12 @@ public: final_makeup_gain_auto = enabled; } + bool get_final_makeup_gain_auto() const + { + std::unique_lock lock(compressor_mutex); + return final_makeup_gain_auto; + } + void schedule_cut() { should_cut = true; @@ -341,7 +353,7 @@ public: return cards[card_index].capture->get_description(); } - std::map get_available_video_modes(unsigned card_index) const { + std::map get_available_video_modes(unsigned card_index) const { assert(card_index < num_cards); return cards[card_index].capture->get_available_video_modes(); } @@ -388,13 +400,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, bmusb::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); + bmusb::FrameAllocator::Frame video_frame, size_t video_offset, bmusb::VideoFormat video_format, + bmusb::FrameAllocator::Frame audio_frame, size_t audio_offset, bmusb::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 +445,12 @@ private: std::mutex bmusb_mutex; bool has_bmusb_thread = false; struct CaptureCard { - CaptureInterface *capture; + bmusb::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 +480,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(); @@ -538,7 +562,7 @@ private: bool is_mode_scanning[MAX_CARDS]{ false }; std::vector mode_scanlist[MAX_CARDS]; unsigned mode_scanlist_index[MAX_CARDS]{ 0 }; - timespec last_mode_scan_change[MAX_CARDS]; + std::chrono::steady_clock::time_point last_mode_scan_change[MAX_CARDS]; }; extern Mixer *global_mixer;