timing refactor
This commit is contained in:
@@ -107,6 +107,8 @@ void TestHelpers()
|
||||
|
||||
const double duration = FrameDurationMillisecondsFromRateString("50");
|
||||
Expect(duration > 19.9 && duration < 20.1, "frame duration parses numeric rate");
|
||||
const double deckLinkDuration = FrameDurationMillisecondsFromDisplayMode(bmdModeHD1080p5994, 0.0);
|
||||
Expect(deckLinkDuration > 16.6833 && deckLinkDuration < 16.6834, "DeckLink 59.94 display mode duration is exact");
|
||||
|
||||
const std::filesystem::path configPath = FindConfigFile();
|
||||
Expect(!configPath.empty(), "default config is discoverable from test working directory");
|
||||
|
||||
@@ -57,32 +57,29 @@ void TestAcquirePublishesAndSchedules()
|
||||
Expect(metrics.scheduledFrames == 1, "scheduled metric is counted");
|
||||
}
|
||||
|
||||
void TestAcquireDropsOldestCompletedUnscheduled()
|
||||
void TestAcquirePreservesCompletedFrames()
|
||||
{
|
||||
SystemFrameExchange exchange(MakeConfig(2));
|
||||
|
||||
SystemFrame first;
|
||||
SystemFrame second;
|
||||
SystemFrame third;
|
||||
Expect(exchange.AcquireForRender(first), "first frame can be acquired");
|
||||
Expect(exchange.AcquireForRender(first), "first preserving frame can be acquired");
|
||||
first.frameIndex = 1;
|
||||
Expect(exchange.PublishCompleted(first), "first frame can be completed");
|
||||
Expect(exchange.AcquireForRender(second), "second frame can be acquired");
|
||||
Expect(exchange.PublishCompleted(first), "first preserving frame can be completed");
|
||||
Expect(exchange.AcquireForRender(second), "second preserving frame can be acquired");
|
||||
second.frameIndex = 2;
|
||||
Expect(exchange.PublishCompleted(second), "second frame can be completed");
|
||||
Expect(exchange.PublishCompleted(second), "second preserving frame can be completed");
|
||||
|
||||
Expect(exchange.AcquireForRender(third), "third acquire drops the oldest completed frame");
|
||||
Expect(third.index == first.index, "oldest completed slot is reused");
|
||||
Expect(!exchange.AcquireForRender(third), "render acquire refuses to drop completed frames");
|
||||
|
||||
SystemFrame scheduled;
|
||||
Expect(exchange.ConsumeCompletedForSchedule(scheduled), "remaining completed frame can be scheduled");
|
||||
Expect(scheduled.index == second.index, "newer completed frame survives drop");
|
||||
Expect(scheduled.frameIndex == 2, "newer frame index survives drop");
|
||||
Expect(exchange.ConsumeCompletedForSchedule(scheduled), "oldest completed frame survives acquire miss");
|
||||
Expect(scheduled.frameIndex == 1, "preserving acquire keeps FIFO output continuity");
|
||||
|
||||
SystemFrameExchangeMetrics metrics = exchange.Metrics();
|
||||
Expect(metrics.completedDrops == 1, "drop metric is counted");
|
||||
Expect(metrics.renderingCount == 1, "reused slot is rendering");
|
||||
Expect(metrics.scheduledCount == 1, "consumed slot is scheduled");
|
||||
Expect(metrics.completedDrops == 0, "preserving acquire does not count completed drops");
|
||||
Expect(metrics.acquireMisses == 1, "preserving acquire miss is counted");
|
||||
}
|
||||
|
||||
void TestScheduledFramesAreNotDropped()
|
||||
@@ -179,7 +176,7 @@ void TestStableCompletedDepthTimesOut()
|
||||
int main()
|
||||
{
|
||||
TestAcquirePublishesAndSchedules();
|
||||
TestAcquireDropsOldestCompletedUnscheduled();
|
||||
TestAcquirePreservesCompletedFrames();
|
||||
TestScheduledFramesAreNotDropped();
|
||||
TestGenerationValidationRejectsStaleFrames();
|
||||
TestPixelFormatAwareSizing();
|
||||
|
||||
@@ -41,28 +41,6 @@ std::vector<unsigned char> MakeFrame(unsigned char value)
|
||||
return std::vector<unsigned char>(16, value);
|
||||
}
|
||||
|
||||
void TestAcquireLatestDropsOlderReadyFrames()
|
||||
{
|
||||
InputFrameMailbox mailbox(MakeConfig(3));
|
||||
const std::vector<unsigned char> frame1 = MakeFrame(1);
|
||||
const std::vector<unsigned char> frame2 = MakeFrame(2);
|
||||
const std::vector<unsigned char> frame3 = MakeFrame(3);
|
||||
|
||||
Expect(mailbox.SubmitFrame(frame1.data(), 8, 1), "first input frame submits");
|
||||
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "second input frame submits");
|
||||
Expect(mailbox.SubmitFrame(frame3.data(), 8, 3), "third input frame submits");
|
||||
|
||||
InputFrame latest;
|
||||
Expect(mailbox.TryAcquireLatest(latest), "latest input frame can be acquired");
|
||||
Expect(latest.frameIndex == 3, "mailbox returns newest frame");
|
||||
Expect(latest.bytes != nullptr && static_cast<const unsigned char*>(latest.bytes)[0] == 3, "latest frame bytes match newest frame");
|
||||
Expect(mailbox.Release(latest), "latest input frame can be released");
|
||||
|
||||
const InputFrameMailboxMetrics metrics = mailbox.Metrics();
|
||||
Expect(metrics.droppedReadyFrames == 2, "older ready input frames are dropped after latest acquire");
|
||||
Expect(metrics.freeCount == 3, "all slots are free after release");
|
||||
}
|
||||
|
||||
void TestSubmitDropsOldestWhenFull()
|
||||
{
|
||||
InputFrameMailbox mailbox(MakeConfig(2));
|
||||
@@ -74,10 +52,10 @@ void TestSubmitDropsOldestWhenFull()
|
||||
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "second frame submits into full test");
|
||||
Expect(mailbox.SubmitFrame(frame3.data(), 8, 3), "third frame submits by dropping oldest ready frame");
|
||||
|
||||
InputFrame latest;
|
||||
Expect(mailbox.TryAcquireLatest(latest), "latest frame available after drop");
|
||||
Expect(latest.frameIndex == 3, "newest frame survived full mailbox");
|
||||
Expect(mailbox.Release(latest), "newest frame releases");
|
||||
InputFrame oldest;
|
||||
Expect(mailbox.TryAcquireOldest(oldest), "oldest frame available after drop");
|
||||
Expect(oldest.frameIndex == 2, "bounded mailbox keeps FIFO order after trimming oldest overflow");
|
||||
Expect(mailbox.Release(oldest), "oldest frame releases");
|
||||
|
||||
const InputFrameMailboxMetrics metrics = mailbox.Metrics();
|
||||
Expect(metrics.droppedReadyFrames >= 1, "full mailbox records ready drop");
|
||||
@@ -92,7 +70,7 @@ void TestReadingFrameIsProtected()
|
||||
|
||||
Expect(mailbox.SubmitFrame(frame1.data(), 8, 1), "protected frame submits");
|
||||
InputFrame acquired;
|
||||
Expect(mailbox.TryAcquireLatest(acquired), "protected frame acquired");
|
||||
Expect(mailbox.TryAcquireOldest(acquired), "protected frame acquired");
|
||||
Expect(!mailbox.SubmitFrame(frame2.data(), 8, 2), "producer cannot overwrite frame currently being read");
|
||||
Expect(mailbox.Release(acquired), "protected frame releases");
|
||||
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "producer can submit after release");
|
||||
@@ -143,7 +121,6 @@ void TestMaxReadyFramesKeepsConfiguredInputBuffer()
|
||||
|
||||
int main()
|
||||
{
|
||||
TestAcquireLatestDropsOlderReadyFrames();
|
||||
TestSubmitDropsOldestWhenFull();
|
||||
TestReadingFrameIsProtected();
|
||||
TestAcquireOldestConsumesFifoWithoutDroppingReadyFrames();
|
||||
|
||||
@@ -70,6 +70,19 @@ void TestDefaultPolicyReportsLagWithoutSkippingScheduleTime()
|
||||
Expect(scheduler.NextScheduleTime().streamTime == 1000, "default recovery keeps stream time continuous");
|
||||
}
|
||||
|
||||
void TestScheduleCursorCanAlignToPlaybackClock()
|
||||
{
|
||||
VideoPlayoutScheduler scheduler;
|
||||
scheduler.Configure(1000, 50000);
|
||||
|
||||
(void)scheduler.NextScheduleTime();
|
||||
scheduler.AlignNextScheduleTimeToPlayback(10000, 4);
|
||||
Expect(scheduler.NextScheduleTime().streamTime == 14000, "schedule cursor skips stale stream time after underfeed");
|
||||
|
||||
scheduler.AlignNextScheduleTimeToPlayback(11000, 1);
|
||||
Expect(scheduler.NextScheduleTime().streamTime == 15000, "schedule cursor does not move backward");
|
||||
}
|
||||
|
||||
void TestMeasuredRecoveryIsCappedByPolicy()
|
||||
{
|
||||
VideoPlayoutPolicy policy;
|
||||
@@ -133,6 +146,7 @@ int main()
|
||||
TestScheduleAdvancesFromZero();
|
||||
TestLateAndDroppedRecoveryUsesMeasuredPressure();
|
||||
TestDefaultPolicyReportsLagWithoutSkippingScheduleTime();
|
||||
TestScheduleCursorCanAlignToPlaybackClock();
|
||||
TestMeasuredRecoveryIsCappedByPolicy();
|
||||
TestCleanCompletionTracksCompletedIndexAndClearsStreaks();
|
||||
TestPolicyNormalization();
|
||||
|
||||
Reference in New Issue
Block a user