summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc102
1 files changed, 97 insertions, 5 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc b/chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc
index 742b9d0cc98..8a772fda9b0 100644
--- a/chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc
+++ b/chromium/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc
@@ -12,10 +12,12 @@
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/memory/read_only_shared_memory_region.h"
+#include "base/test/bind_test_util.h"
#include "base/test/simple_test_tick_clock.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "cc/layers/video_frame_provider.h"
+#include "cc/metrics/video_playback_roughness_reporter.h"
#include "cc/test/layer_test_common.h"
#include "cc/trees/layer_tree_settings.h"
#include "cc/trees/task_runner_provider.h"
@@ -37,6 +39,7 @@
using testing::_;
using testing::AnyNumber;
+using testing::Invoke;
using testing::Return;
using testing::StrictMock;
@@ -169,11 +172,13 @@ class VideoFrameSubmitterTest : public testing::Test {
task_environment_.RunUntilIdle();
}
- void MakeSubmitter() {
+ void MakeSubmitter() { MakeSubmitter(base::DoNothing()); }
+
+ void MakeSubmitter(cc::PlaybackRoughnessReportingCallback reporting_cb) {
resource_provider_ = new StrictMock<MockVideoFrameResourceProvider>(
context_provider_.get(), nullptr);
submitter_ = std::make_unique<VideoFrameSubmitter>(
- base::DoNothing(),
+ base::DoNothing(), reporting_cb,
base::WrapUnique<MockVideoFrameResourceProvider>(resource_provider_));
submitter_->Initialize(video_frame_provider_.get());
@@ -307,8 +312,8 @@ TEST_F(VideoFrameSubmitterTest, StopRenderingSkipsUpdateCurrentFrame) {
// No frames should be produced after StopRendering().
EXPECT_CALL(*sink_, DidNotProduceFrame(_));
- begin_frame_source_->CreateBeginFrameArgs(BEGINFRAME_FROM_HERE,
- now_src_.get());
+ args = begin_frame_source_->CreateBeginFrameArgs(BEGINFRAME_FROM_HERE,
+ now_src_.get());
submitter_->OnBeginFrame(args, {});
task_environment_.RunUntilIdle();
}
@@ -498,6 +503,8 @@ TEST_F(VideoFrameSubmitterTest, RotationInformationPassedToResourceProvider) {
EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _));
EXPECT_CALL(*resource_provider_, ReleaseFrameResources());
+ args = begin_frame_source_->CreateBeginFrameArgs(BEGINFRAME_FROM_HERE,
+ now_src_.get());
submitter_->OnBeginFrame(args, {});
task_environment_.RunUntilIdle();
}
@@ -640,6 +647,27 @@ TEST_F(VideoFrameSubmitterTest, RecreateCompositorFrameSinkAfterContextLost) {
task_environment_.RunUntilIdle();
}
+// Test that after context is lost, the CompositorFrameSink is recreated but the
+// SurfaceEmbedder isn't even with software compositing.
+TEST_F(VideoFrameSubmitterTest,
+ RecreateCompositorFrameSinkAfterContextLostSoftwareCompositing) {
+ MockEmbeddedFrameSinkProvider mock_embedded_frame_sink_provider;
+ mojo::Receiver<mojom::blink::EmbeddedFrameSinkProvider>
+ embedded_frame_sink_provider_binding(&mock_embedded_frame_sink_provider);
+ auto override =
+ mock_embedded_frame_sink_provider.CreateScopedOverrideMojoInterface(
+ &embedded_frame_sink_provider_binding);
+
+ EXPECT_CALL(*resource_provider_, Initialize(_, _));
+ EXPECT_CALL(mock_embedded_frame_sink_provider, ConnectToEmbedder(_, _))
+ .Times(0);
+ EXPECT_CALL(mock_embedded_frame_sink_provider, CreateCompositorFrameSink_(_))
+ .Times(1);
+ submitter_->OnContextLost();
+ OnReceivedContextProvider(false, nullptr);
+ task_environment_.RunUntilIdle();
+}
+
// This test simulates a race condition in which the |video_frame_provider_| is
// destroyed before OnReceivedContextProvider returns.
TEST_F(VideoFrameSubmitterTest, StopUsingProviderDuringContextLost) {
@@ -662,7 +690,7 @@ TEST_F(VideoFrameSubmitterTest, StopUsingProviderDuringContextLost) {
}
// Test the behaviour of the ChildLocalSurfaceIdAllocator instance. It checks
-// that the LocalSurfaceId is propoerly set at creation and updated when the
+// that the LocalSurfaceId is properly set at creation and updated when the
// video frames change.
TEST_F(VideoFrameSubmitterTest, FrameSizeChangeUpdatesLocalSurfaceId) {
{
@@ -893,6 +921,8 @@ TEST_F(VideoFrameSubmitterTest, NoDuplicateFramesOnBeginFrame) {
.WillOnce(Return(true));
EXPECT_CALL(*video_frame_provider_, GetCurrentFrame()).WillOnce(Return(vf));
EXPECT_CALL(*sink_, DidNotProduceFrame(_));
+ args = begin_frame_source_->CreateBeginFrameArgs(BEGINFRAME_FROM_HERE,
+ now_src_.get());
submitter_->OnBeginFrame(args, {});
task_environment_.RunUntilIdle();
}
@@ -928,4 +958,66 @@ TEST_F(VideoFrameSubmitterTest, ZeroSizedFramesAreNotSubmitted) {
task_environment_.RunUntilIdle();
}
+// Check that given enough frames with wallclock duration and enough
+// presentation feedback data, VideoFrameSubmitter will call the video roughness
+// reporting callback.
+TEST_F(VideoFrameSubmitterTest, ProcessTimingDetails) {
+ int fps = 24;
+ int reports = 0;
+ base::TimeDelta frame_duration = base::TimeDelta::FromSecondsD(1.0 / fps);
+ int frames_to_run =
+ (fps / 2) *
+ (cc::VideoPlaybackRoughnessReporter::kMinWindowsBeforeSubmit + 1);
+ WTF::HashMap<uint32_t, viz::mojom::blink::FrameTimingDetailsPtr>
+ timing_details;
+
+ MakeSubmitter(
+ base::BindLambdaForTesting([&](int frames, base::TimeDelta duration,
+ double roughness) { reports++; }));
+ EXPECT_CALL(*sink_, SetNeedsBeginFrame(true));
+ submitter_->StartRendering();
+ task_environment_.RunUntilIdle();
+ EXPECT_TRUE(IsRendering());
+
+ auto sink_submit = [&](const viz::LocalSurfaceId&,
+ viz::CompositorFrame* frame) {
+ auto token = frame->metadata.frame_token;
+ viz::mojom::blink::FrameTimingDetailsPtr details =
+ viz::mojom::blink::FrameTimingDetails::New();
+ details->presentation_feedback =
+ gfx::mojom::blink::PresentationFeedback::New();
+ details->presentation_feedback->timestamp =
+ base::TimeTicks() + frame_duration * token;
+ timing_details.clear();
+ timing_details.Set(token, std::move(details));
+ };
+
+ EXPECT_CALL(*video_frame_provider_, UpdateCurrentFrame)
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(*video_frame_provider_, PutCurrentFrame).Times(AnyNumber());
+ EXPECT_CALL(*sink_, DoSubmitCompositorFrame)
+ .WillRepeatedly(Invoke(sink_submit));
+ EXPECT_CALL(*resource_provider_, AppendQuads).Times(AnyNumber());
+ EXPECT_CALL(*resource_provider_, PrepareSendToParent).Times(AnyNumber());
+ EXPECT_CALL(*resource_provider_, ReleaseFrameResources).Times(AnyNumber());
+
+ for (int i = 0; i < frames_to_run; i++) {
+ auto frame = media::VideoFrame::CreateFrame(
+ media::PIXEL_FORMAT_YV12, gfx::Size(8, 8), gfx::Rect(gfx::Size(8, 8)),
+ gfx::Size(8, 8), i * frame_duration);
+ frame->metadata()->SetTimeDelta(
+ media::VideoFrameMetadata::WALLCLOCK_FRAME_DURATION, frame_duration);
+ EXPECT_CALL(*video_frame_provider_, GetCurrentFrame())
+ .WillRepeatedly(Return(frame));
+
+ auto args = begin_frame_source_->CreateBeginFrameArgs(BEGINFRAME_FROM_HERE,
+ now_src_.get());
+ submitter_->OnBeginFrame(args, std::move(timing_details));
+ task_environment_.RunUntilIdle();
+ AckSubmittedFrame();
+ }
+ submitter_->StopRendering();
+ EXPECT_EQ(reports, 1);
+}
+
} // namespace blink