33 lines
1.3 KiB
C++
33 lines
1.3 KiB
C++
#include "fgc/CameraStall.h"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace fgc {
|
|
|
|
long long firstFrameLimitMs(double exposure_us) {
|
|
const long long exposure_ms = exposure_us > 0 ? static_cast<long long>(exposure_us / 1000) : 0;
|
|
return std::max<long long>(30000, 3 * exposure_ms + 5000);
|
|
}
|
|
|
|
StallAction onNoFirstFrame(long long waited_ms, double exposure_us, int failed_restarts) {
|
|
if (waited_ms < firstFrameLimitMs(exposure_us)) return StallAction::Wait;
|
|
return failed_restarts >= kRestartsBeforeReset ? StallAction::Reset : StallAction::Restart;
|
|
}
|
|
|
|
long long staleFrameLimitMs(double exposure_us, double frame_period_ms) {
|
|
const double exposure_ms = exposure_us > 0 ? exposure_us / 1000 : 0;
|
|
const double slowest = std::max(exposure_ms, frame_period_ms > 0 ? frame_period_ms : 0);
|
|
return std::max<long long>(2000, static_cast<long long>(2 * slowest) + 1000);
|
|
}
|
|
|
|
StallAction onStaleFrame(long long since_newest_ms, double exposure_us, double frame_period_ms) {
|
|
return since_newest_ms < staleFrameLimitMs(exposure_us, frame_period_ms) ? StallAction::Wait
|
|
: StallAction::Restart;
|
|
}
|
|
|
|
StallAction onRestartFailed(int failed_restarts) {
|
|
return failed_restarts >= kRestartsBeforeReset ? StallAction::Reset : StallAction::Restart;
|
|
}
|
|
|
|
} // namespace fgc
|