]> git.sesse.net Git - nageru/blobdiff - mixer.cpp
Make it possible to choose the DeckLink output video mode through the GUI.
[nageru] / mixer.cpp
index b28da27e90f3781180dab3068b433135b739a1f2..f82650ea906948667f242e2b0941e0bba32aaed4 100644 (file)
--- a/mixer.cpp
+++ b/mixer.cpp
@@ -297,7 +297,8 @@ void Mixer::set_output_card_internal(int card_index)
                configure_card(card_index, fake_capture, /*is_fake_capture=*/true, card->output.release());
                card->queue_length_policy.reset(card_index);
                card->capture->start_bm_capture();
-               card->output->start_output(bmdModeHD720p5994, pts_int);  // FIXME
+               desired_output_video_mode = output_video_mode = card->output->pick_video_mode(desired_output_video_mode);
+               card->output->start_output(desired_output_video_mode, pts_int);
        }
        output_card_index = card_index;
 }
@@ -597,6 +598,13 @@ void Mixer::thread_func()
                if (desired_output_card_index != output_card_index) {
                        set_output_card_internal(desired_output_card_index);
                }
+               if (output_card_index != -1 &&
+                   desired_output_video_mode != output_video_mode) {
+                       DeckLinkOutput *output = cards[output_card_index].output.get();
+                       output->end_output();
+                       desired_output_video_mode = output_video_mode = output->pick_video_mode(desired_output_video_mode);
+                       output->start_output(desired_output_video_mode, pts_int);
+               }
 
                CaptureCard::NewFrame new_frames[MAX_VIDEO_CARDS];
                bool has_new_frame[MAX_VIDEO_CARDS] = { false };
@@ -1034,6 +1042,13 @@ void Mixer::start_mode_scanning(unsigned card_index)
        last_mode_scan_change[card_index] = steady_clock::now();
 }
 
+map<uint32_t, bmusb::VideoMode> Mixer::get_available_output_video_modes() const
+{
+       assert(desired_output_card_index != -1);
+       unique_lock<mutex> lock(card_mutex);
+       return cards[desired_output_card_index].output->get_available_video_modes();
+}
+
 Mixer::OutputChannel::~OutputChannel()
 {
        if (has_current_frame) {