gain_staging_db = gain_db;
}
+ float get_gain_staging_db() const
+ {
+ std::unique_lock<std::mutex> lock(compressor_mutex);
+ return gain_staging_db;
+ }
+
void set_gain_staging_auto(bool enabled)
{
std::unique_lock<std::mutex> lock(compressor_mutex);
final_makeup_gain_auto = enabled;
}
+ bool get_final_makeup_gain_auto() const
+ {
+ std::unique_lock<std::mutex> lock(compressor_mutex);
+ return final_makeup_gain_auto;
+ }
+
void schedule_cut()
{
should_cut = true;
return cards[card_index].capture->get_description();
}
- std::map<uint32_t, VideoMode> get_available_video_modes(unsigned card_index) const {
+ std::map<uint32_t, bmusb::VideoMode> get_available_video_modes(unsigned card_index) const {
assert(card_index < num_cards);
return cards[card_index].capture->get_available_video_modes();
}
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();
std::mutex bmusb_mutex;
bool has_bmusb_thread = false;
struct CaptureCard {
- CaptureInterface *capture;
+ bmusb::CaptureInterface *capture = nullptr;
+ bool is_fake_capture;
std::unique_ptr<PBOFrameAllocator> frame_allocator;
// Stuff for the OpenGL context (for texture uploading).
- QSurface *surface;
+ QSurface *surface = nullptr;
struct NewFrame {
RefCountedFrame frame;
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<libusb_device *> hotplugged_cards;
+
class OutputChannel {
public:
~OutputChannel();