49 const auto positive_finite = [](
double value)
noexcept {
50 return value > 0.0 && std::isfinite(value);
52 const auto nonnegative_finite = [](
double value)
noexcept {
53 return value >= 0.0 && std::isfinite(value);
55 if (!positive_finite(contract.source_sample_rate)) {
59 if (!positive_finite(contract.host_sample_rate)) {
63 if (!positive_finite(contract.maximum_playback_ratio)) {
67 if (!nonnegative_finite(contract.certified_io_latency_seconds) ||
68 !nonnegative_finite(contract.scheduler_margin_seconds) ||
69 !nonnegative_finite(contract.decoder_latency_seconds)) {
74 const double latency_seconds = contract.certified_io_latency_seconds +
75 contract.scheduler_margin_seconds +
76 contract.decoder_latency_seconds;
77 if (!std::isfinite(latency_seconds)) {
82 const double latency_frames = std::ceil(
83 latency_seconds * contract.source_sample_rate * contract.maximum_playback_ratio);
84 const double block_frames = std::ceil(
85 static_cast<double>(contract.maximum_host_block_frames) *
86 contract.source_sample_rate / contract.host_sample_rate *
87 contract.maximum_playback_ratio);
88 constexpr double kMaxFrames =
89 static_cast<double>(std::numeric_limits<std::uint64_t>::max());
90 if (!std::isfinite(latency_frames) || latency_frames >= kMaxFrames ||
91 !std::isfinite(block_frames) || block_frames >= kMaxFrames) {
99 const auto add_checked = [](std::uint64_t left,
101 std::uint64_t& sum)
noexcept {
102 if (right > std::numeric_limits<std::uint64_t>::max() - left)
return false;
106 std::uint64_t required = 0;
108 !add_checked(required, contract.interpolation_guard_frames, required) ||
109 !add_checked(required, contract.loop_prefetch_guard_frames, required)) {
116 result.
sufficient = contract.configured_preload_frames >= required;
Definition analyzer_provider.hpp:12
@ InvalidHostSampleRate
Definition sample_heritage_runtime_state.hpp:103
SamplePreloadContractStatus
Definition sample_preload_contract.hpp:9
@ Overflow
Definition sample_preload_contract.hpp:15
@ InvalidHostSampleRate
Definition sample_preload_contract.hpp:12
@ Ok
Definition sample_preload_contract.hpp:10
@ InvalidSourceSampleRate
Definition sample_preload_contract.hpp:11
@ InvalidLatency
Definition sample_preload_contract.hpp:14
@ InvalidPlaybackRatio
Definition sample_preload_contract.hpp:13
@ Ok
Definition loop_types.hpp:34
SamplePreloadContractResult evaluate_sample_preload_contract(const SamplePreloadContract &contract) noexcept
Calculate the resident head required to cover a certified streaming service interval at the fastest s...
Definition sample_preload_contract.hpp:45
Definition sample_preload_contract.hpp:31
SamplePreloadContractStatus status
Definition sample_preload_contract.hpp:32
std::uint64_t block_guard_frames
Definition sample_preload_contract.hpp:34
std::uint64_t latency_guard_frames
Definition sample_preload_contract.hpp:33
bool valid() const noexcept
Definition sample_preload_contract.hpp:38
std::uint64_t required_preload_frames
Definition sample_preload_contract.hpp:35
bool sufficient
Definition sample_preload_contract.hpp:36
Definition sample_preload_contract.hpp:18
double scheduler_margin_seconds
Definition sample_preload_contract.hpp:23
double certified_io_latency_seconds
Definition sample_preload_contract.hpp:22
double maximum_playback_ratio
Definition sample_preload_contract.hpp:21
double decoder_latency_seconds
Definition sample_preload_contract.hpp:24
std::uint64_t loop_prefetch_guard_frames
Definition sample_preload_contract.hpp:27
std::uint64_t maximum_host_block_frames
Definition sample_preload_contract.hpp:25
std::uint64_t interpolation_guard_frames
Definition sample_preload_contract.hpp:26
std::uint64_t configured_preload_frames
Definition sample_preload_contract.hpp:28
double host_sample_rate
Definition sample_preload_contract.hpp:20
double source_sample_rate
Definition sample_preload_contract.hpp:19