X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=8504d5eb4bb9d6a56d8b68dd2ab04464b0bcecfd;hb=96cb6414f85e0ef4d660b7bd56267303e80fcd05;hp=84ef32db0efac732975c1a5e7d86e94c0db13d4e;hpb=14dc6f7ef9dd76cba75ffe7499d9a81d66c7b152;p=nageru diff --git a/mixer.h b/mixer.h index 84ef32d..8504d5e 100644 --- a/mixer.h +++ b/mixer.h @@ -37,6 +37,7 @@ #include "theme.h" #include "timebase.h" #include "video_encoder.h" +#include "ycbcr_interpretation.h" class ALSAOutput; class ChromaSubsampler; @@ -87,6 +88,8 @@ public: been_at_safe_point_since_last_starvation = false; } + void register_metrics(const std::vector> &labels); + void update_policy(unsigned queue_length); // Call before picking out a frame, so 0 means starvation. unsigned get_safe_queue_length() const { return safe_queue_length; } @@ -95,6 +98,11 @@ private: unsigned safe_queue_length = 1; // Called N in the comments. Can never go below 1. unsigned frames_with_at_least_one = 0; bool been_at_safe_point_since_last_starvation = false; + + // Metrics. + std::atomic metric_input_queue_length_frames{0}; + std::atomic metric_input_queue_safe_length_frames{1}; + std::atomic metric_input_duped_frames{0}; }; class Mixer { @@ -218,10 +226,8 @@ 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); + YCbCrInterpretation get_input_ycbcr_interpretation(unsigned card_index) const; + void set_input_ycbcr_interpretation(unsigned card_index, const YCbCrInterpretation &interpretation); bool get_supports_set_wb(unsigned channel) const { @@ -416,6 +422,7 @@ private: struct CaptureCard { std::unique_ptr capture; bool is_fake_capture; + CardType type; std::unique_ptr output; // If this card is used for output (ie., output_card_index points to it), @@ -447,11 +454,22 @@ private: int last_timecode = -1; // Unwrapped. - bool ycbcr_coefficients_auto = true; - movit::YCbCrLumaCoefficients ycbcr_coefficients = movit::YCBCR_REC_709; - bool full_range = false; + // Metrics. + std::atomic metric_input_dropped_frames_jitter{0}; + std::atomic metric_input_dropped_frames_error{0}; + std::atomic metric_input_resets{0}; + + std::atomic metric_input_has_signal_bool{-1}; + std::atomic metric_input_is_connected_bool{-1}; + std::atomic metric_input_interlaced_bool{-1}; + std::atomic metric_input_width_pixels{-1}; + std::atomic metric_input_height_pixels{-1}; + std::atomic metric_input_frame_rate_nom{-1}; + std::atomic metric_input_frame_rate_den{-1}; + std::atomic metric_input_sample_rate_hz{-1}; }; CaptureCard cards[MAX_VIDEO_CARDS]; // Protected by . + YCbCrInterpretation ycbcr_interpretation[MAX_VIDEO_CARDS]; // Protected by . AudioMixer audio_mixer; // Same as global_audio_mixer (see audio_mixer.h). bool input_card_is_master_clock(unsigned card_index, unsigned master_card_index) const; struct OutputFrameInfo { @@ -521,6 +539,13 @@ private: std::vector mode_scanlist[MAX_VIDEO_CARDS]; unsigned mode_scanlist_index[MAX_VIDEO_CARDS]{ 0 }; std::chrono::steady_clock::time_point last_mode_scan_change[MAX_VIDEO_CARDS]; + + // Metrics. + std::atomic metric_frames_output_total{0}; + std::atomic metric_frames_output_dropped{0}; + std::atomic metric_start_time_seconds{0.0 / 0.0}; + std::atomic metrics_memory_used_bytes{0}; + std::atomic metrics_memory_locked_limit_bytes{0.0 / 0.0}; }; extern Mixer *global_mixer;