#include "theme.h"
#include "timebase.h"
#include "video_encoder.h"
+#include "ycbcr_interpretation.h"
class ALSAOutput;
class ChromaSubsampler;
been_at_safe_point_since_last_starvation = false;
}
+ void register_metrics(const std::vector<std::pair<std::string, std::string>> &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; }
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<int64_t> metric_input_queue_length_frames{0};
+ std::atomic<int64_t> metric_input_queue_safe_length_frames{1};
+ std::atomic<int64_t> metric_input_duped_frames{0};
};
class Mixer {
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
{
struct CaptureCard {
std::unique_ptr<bmusb::CaptureInterface> capture;
bool is_fake_capture;
+ CardType type;
std::unique_ptr<DeckLinkOutput> output;
// If this card is used for output (ie., output_card_index points to it),
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<int64_t> metric_input_dropped_frames_jitter{0};
+ std::atomic<int64_t> metric_input_dropped_frames_error{0};
+ std::atomic<int64_t> metric_input_resets{0};
+
+ std::atomic<int64_t> metric_input_has_signal_bool{-1};
+ std::atomic<int64_t> metric_input_is_connected_bool{-1};
+ std::atomic<int64_t> metric_input_interlaced_bool{-1};
+ std::atomic<int64_t> metric_input_width_pixels{-1};
+ std::atomic<int64_t> metric_input_height_pixels{-1};
+ std::atomic<int64_t> metric_input_frame_rate_nom{-1};
+ std::atomic<int64_t> metric_input_frame_rate_den{-1};
+ std::atomic<int64_t> metric_input_sample_rate_hz{-1};
};
CaptureCard cards[MAX_VIDEO_CARDS]; // Protected by <card_mutex>.
+ YCbCrInterpretation ycbcr_interpretation[MAX_VIDEO_CARDS]; // Protected by <card_mutex>.
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 {
std::vector<uint32_t> 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<int64_t> metric_frames_output_total{0};
+ std::atomic<int64_t> metric_frames_output_dropped{0};
+ std::atomic<double> metric_start_time_seconds{0.0 / 0.0};
+ std::atomic<int64_t> metrics_memory_used_bytes{0};
+ std::atomic<double> metrics_memory_locked_limit_bytes{0.0 / 0.0};
};
extern Mixer *global_mixer;