X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=84ef32db0efac732975c1a5e7d86e94c0db13d4e;hb=fb2aaebcd1a1e5b9ba23a714fa7fc39788f670ab;hp=c4f9e6bfebb2470fc41ddd12d4bec89665f346d6;hpb=dc508afd3b72b3c4212753c9a3e90f14d21f460e;p=nageru diff --git a/mixer.h b/mixer.h index c4f9e6b..84ef32d 100644 --- a/mixer.h +++ b/mixer.h @@ -23,6 +23,8 @@ #include #include +#include + #include "audio_mixer.h" #include "bmusb/bmusb.h" #include "defs.h" @@ -139,10 +141,17 @@ public: return output_channel[output].get_display_frame(frame); } + // NOTE: Callbacks will be called with a mutex held, so you should probably + // not do real work in them. typedef std::function new_frame_ready_callback_t; - void set_frame_ready_callback(Output output, new_frame_ready_callback_t callback) + void add_frame_ready_callback(Output output, void *key, new_frame_ready_callback_t callback) + { + output_channel[output].add_frame_ready_callback(key, callback); + } + + void remove_frame_ready_callback(Output output, void *key) { - output_channel[output].set_frame_ready_callback(callback); + output_channel[output].remove_frame_ready_callback(key); } // TODO: Should this really be per-channel? Shouldn't it just be called for e.g. the live output? @@ -209,6 +218,11 @@ public: return theme->set_signal_mapping(signal, card); } + void get_input_ycbcr_interpretation(unsigned card_index, bool *ycbcr_coefficients_auto, + movit::YCbCrLumaCoefficients *ycbcr_coefficients, bool *full_range); + void set_input_ycbcr_interpretation(unsigned card_index, bool ycbcr_coefficients_auto, + movit::YCbCrLumaCoefficients ycbcr_coefficients, bool full_range); + bool get_supports_set_wb(unsigned channel) const { return theme->get_supports_set_wb(channel); @@ -336,7 +350,8 @@ private: enum class CardType { LIVE_CARD, - FAKE_CAPTURE + FAKE_CAPTURE, + FFMPEG_INPUT }; void configure_card(unsigned card_index, bmusb::CaptureInterface *capture, CardType card_type, DeckLinkOutput *output); void set_output_card_internal(int card_index); // Should only be called from the mixer thread. @@ -359,7 +374,7 @@ private: void trim_queue(CaptureCard *card, unsigned card_index); HTTPD httpd; - unsigned num_cards; + unsigned num_cards, num_video_inputs; QSurface *mixer_surface, *h264_encoder_surface, *decklink_output_surface; std::unique_ptr resource_pool; @@ -431,6 +446,10 @@ private: QueueLengthPolicy queue_length_policy; // Refers to the "new_frames" queue. int last_timecode = -1; // Unwrapped. + + bool ycbcr_coefficients_auto = true; + movit::YCbCrLumaCoefficients ycbcr_coefficients = movit::YCBCR_REC_709; + bool full_range = false; }; CaptureCard cards[MAX_VIDEO_CARDS]; // Protected by . AudioMixer audio_mixer; // Same as global_audio_mixer (see audio_mixer.h). @@ -456,7 +475,8 @@ private: ~OutputChannel(); void output_frame(DisplayFrame frame); bool get_display_frame(DisplayFrame *frame); - void set_frame_ready_callback(new_frame_ready_callback_t callback); + void add_frame_ready_callback(void *key, new_frame_ready_callback_t callback); + void remove_frame_ready_callback(void *key); void set_transition_names_updated_callback(transition_names_updated_callback_t callback); void set_name_updated_callback(name_updated_callback_t callback); void set_color_updated_callback(color_updated_callback_t callback); @@ -469,7 +489,7 @@ private: std::mutex frame_mutex; DisplayFrame current_frame, ready_frame; // protected by bool has_current_frame = false, has_ready_frame = false; // protected by - new_frame_ready_callback_t new_frame_ready_callback; + std::map new_frame_ready_callbacks; // protected by transition_names_updated_callback_t transition_names_updated_callback; name_updated_callback_t name_updated_callback; color_updated_callback_t color_updated_callback;