Improvement
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
namespace
|
||||
{
|
||||
int gFailures = 0;
|
||||
int gReleasedFrames = 0;
|
||||
|
||||
void Expect(bool condition, const char* message)
|
||||
{
|
||||
@@ -23,6 +24,22 @@ RenderOutputFrame MakeFrame(uint64_t index)
|
||||
return frame;
|
||||
}
|
||||
|
||||
void CountReleasedFrame(VideoIOOutputFrame& frame)
|
||||
{
|
||||
if (frame.nativeFrame != nullptr)
|
||||
{
|
||||
++gReleasedFrames;
|
||||
frame.nativeFrame = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
RenderOutputFrame MakeOwnedFrame(uint64_t index)
|
||||
{
|
||||
RenderOutputFrame frame = MakeFrame(index);
|
||||
frame.releaseFrame = CountReleasedFrame;
|
||||
return frame;
|
||||
}
|
||||
|
||||
void TestQueuePreservesOrdering()
|
||||
{
|
||||
VideoPlayoutPolicy policy;
|
||||
@@ -58,6 +75,25 @@ void TestBoundedQueueDropsOldestFrame()
|
||||
Expect(frame.frameIndex == 2, "oldest frame was dropped when queue overflowed");
|
||||
}
|
||||
|
||||
void TestOverflowReleasesDroppedFrame()
|
||||
{
|
||||
gReleasedFrames = 0;
|
||||
VideoPlayoutPolicy policy;
|
||||
policy.targetReadyFrames = 1;
|
||||
policy.maxReadyFrames = 1;
|
||||
RenderOutputQueue queue(policy);
|
||||
|
||||
queue.Push(MakeOwnedFrame(1));
|
||||
queue.Push(MakeOwnedFrame(2));
|
||||
|
||||
Expect(gReleasedFrames == 1, "overflow releases dropped ready frame");
|
||||
|
||||
RenderOutputFrame frame;
|
||||
Expect(queue.TryPop(frame), "newest owned frame remains queued");
|
||||
Expect(frame.frameIndex == 2, "overflow keeps newest owned frame");
|
||||
Expect(gReleasedFrames == 1, "pop transfers ownership without releasing");
|
||||
}
|
||||
|
||||
void TestUnderrunIsCounted()
|
||||
{
|
||||
RenderOutputQueue queue;
|
||||
@@ -90,14 +126,53 @@ void TestConfigureShrinksDepthToNewCapacity()
|
||||
Expect(queue.TryPop(frame), "trimmed queue still has newest frame");
|
||||
Expect(frame.frameIndex == 3, "configure keeps newest ready frame");
|
||||
}
|
||||
|
||||
void TestConfigureReleasesTrimmedFrames()
|
||||
{
|
||||
gReleasedFrames = 0;
|
||||
VideoPlayoutPolicy policy;
|
||||
policy.maxReadyFrames = 3;
|
||||
RenderOutputQueue queue(policy);
|
||||
queue.Push(MakeOwnedFrame(1));
|
||||
queue.Push(MakeOwnedFrame(2));
|
||||
queue.Push(MakeOwnedFrame(3));
|
||||
|
||||
VideoPlayoutPolicy smallerPolicy;
|
||||
smallerPolicy.targetReadyFrames = 1;
|
||||
smallerPolicy.maxReadyFrames = 1;
|
||||
queue.Configure(smallerPolicy);
|
||||
|
||||
Expect(gReleasedFrames == 2, "configure releases trimmed ready frames");
|
||||
|
||||
RenderOutputFrame frame;
|
||||
Expect(queue.TryPop(frame), "trimmed owned queue still has newest frame");
|
||||
Expect(frame.frameIndex == 3, "configure keeps newest owned frame after release");
|
||||
}
|
||||
|
||||
void TestClearReleasesQueuedFrames()
|
||||
{
|
||||
gReleasedFrames = 0;
|
||||
RenderOutputQueue queue;
|
||||
queue.Push(MakeOwnedFrame(1));
|
||||
queue.Push(MakeOwnedFrame(2));
|
||||
|
||||
queue.Clear();
|
||||
|
||||
RenderOutputQueueMetrics metrics = queue.GetMetrics();
|
||||
Expect(metrics.depth == 0, "clear empties ready queue");
|
||||
Expect(gReleasedFrames == 2, "clear releases queued ready frames");
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
TestQueuePreservesOrdering();
|
||||
TestBoundedQueueDropsOldestFrame();
|
||||
TestOverflowReleasesDroppedFrame();
|
||||
TestUnderrunIsCounted();
|
||||
TestConfigureShrinksDepthToNewCapacity();
|
||||
TestConfigureReleasesTrimmedFrames();
|
||||
TestClearReleasesQueuedFrames();
|
||||
|
||||
if (gFailures != 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user