1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/mojo/mojom/video_frame_metadata_mojom_traits.h"
7 #include "base/functional/callback_helpers.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/test/task_environment.h"
10 #include "build/build_config.h"
11 #include "media/mojo/mojom/traits_test_service.mojom.h"
12 #include "mojo/public/cpp/bindings/receiver_set.h"
13 #include "mojo/public/cpp/bindings/remote.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/gfx/geometry/rect.h"
21 class VideoFrameMetadataStructTraitsTest
22 : public testing::Test,
23 public mojom::VideoFrameMetadataTraitsTestService {
25 VideoFrameMetadataStructTraitsTest() = default;
27 VideoFrameMetadataStructTraitsTest(
28 const VideoFrameMetadataStructTraitsTest&) = delete;
29 VideoFrameMetadataStructTraitsTest& operator=(
30 const VideoFrameMetadataStructTraitsTest&) = delete;
33 mojo::Remote<mojom::VideoFrameMetadataTraitsTestService>
34 GetTraitsTestRemote() {
35 mojo::Remote<mojom::VideoFrameMetadataTraitsTestService> remote;
36 traits_test_receivers_.Add(this, remote.BindNewPipeAndPassReceiver());
40 bool RoundTrip(const VideoFrameMetadata& in, VideoFrameMetadata* out) {
41 mojo::Remote<mojom::VideoFrameMetadataTraitsTestService> remote =
42 GetTraitsTestRemote();
43 return remote->EchoVideoFrameMetadata(in, out);
47 void EchoVideoFrameMetadata(
48 const VideoFrameMetadata& vfm,
49 EchoVideoFrameMetadataCallback callback) override {
50 std::move(callback).Run(vfm);
53 base::test::TaskEnvironment task_environment_;
54 mojo::ReceiverSet<VideoFrameMetadataTraitsTestService> traits_test_receivers_;
59 TEST_F(VideoFrameMetadataStructTraitsTest, EmptyMetadata) {
60 VideoFrameMetadata metadata_in;
61 VideoFrameMetadata metadata_out;
63 ASSERT_TRUE(RoundTrip(metadata_in, &metadata_out));
65 EXPECT_FALSE(metadata_out.capture_counter.has_value());
66 EXPECT_FALSE(metadata_out.capture_update_rect.has_value());
67 EXPECT_FALSE(metadata_out.transformation.has_value());
68 EXPECT_FALSE(metadata_out.allow_overlay);
69 EXPECT_FALSE(metadata_out.copy_required);
70 EXPECT_FALSE(metadata_out.end_of_stream);
71 EXPECT_FALSE(metadata_out.texture_owner);
72 EXPECT_FALSE(metadata_out.wants_promotion_hint);
73 EXPECT_FALSE(metadata_out.protected_video);
74 EXPECT_FALSE(metadata_out.hw_protected);
75 EXPECT_FALSE(metadata_out.is_webgpu_compatible);
76 EXPECT_FALSE(metadata_out.power_efficient);
77 EXPECT_FALSE(metadata_out.read_lock_fences_enabled);
78 EXPECT_FALSE(metadata_out.interactive_content);
79 EXPECT_FALSE(metadata_out.overlay_plane_id.has_value());
80 EXPECT_FALSE(metadata_out.device_scale_factor.has_value());
81 EXPECT_FALSE(metadata_out.page_scale_factor.has_value());
82 EXPECT_FALSE(metadata_out.root_scroll_offset_x.has_value());
83 EXPECT_FALSE(metadata_out.root_scroll_offset_y.has_value());
84 EXPECT_FALSE(metadata_out.top_controls_visible_height.has_value());
85 EXPECT_FALSE(metadata_out.frame_rate.has_value());
86 EXPECT_FALSE(metadata_out.rtp_timestamp.has_value());
87 EXPECT_FALSE(metadata_out.receive_time.has_value());
88 EXPECT_FALSE(metadata_out.capture_begin_time.has_value());
89 EXPECT_FALSE(metadata_out.capture_end_time.has_value());
90 EXPECT_FALSE(metadata_out.decode_begin_time.has_value());
91 EXPECT_FALSE(metadata_out.decode_end_time.has_value());
92 EXPECT_FALSE(metadata_out.reference_time.has_value());
93 EXPECT_FALSE(metadata_out.processing_time.has_value());
94 EXPECT_FALSE(metadata_out.frame_duration.has_value());
95 EXPECT_FALSE(metadata_out.wallclock_frame_duration.has_value());
98 TEST_F(VideoFrameMetadataStructTraitsTest, ValidMetadata) {
99 // Assign a non-default, distinct (when possible), value to all fields, and
100 // make sure values are preserved across serialization.
101 VideoFrameMetadata metadata_in;
104 metadata_in.capture_counter = 123;
107 metadata_in.capture_update_rect = gfx::Rect(12, 34, 360, 480);
109 // VideoTransformation
110 metadata_in.transformation = VideoTransformation(VIDEO_ROTATION_90, true);
113 metadata_in.allow_overlay = true;
114 metadata_in.copy_required = true;
115 metadata_in.end_of_stream = true;
116 metadata_in.texture_owner = true;
117 metadata_in.wants_promotion_hint = true;
118 metadata_in.protected_video = true;
119 metadata_in.hw_protected = true;
120 metadata_in.is_webgpu_compatible = true;
121 metadata_in.power_efficient = true;
122 metadata_in.read_lock_fences_enabled = true;
123 metadata_in.interactive_content = true;
125 // base::UnguessableTokens
126 metadata_in.overlay_plane_id = base::UnguessableToken::Create();
129 metadata_in.device_scale_factor = 2.0;
130 metadata_in.page_scale_factor = 2.1;
131 metadata_in.root_scroll_offset_x = 100.2;
132 metadata_in.root_scroll_offset_y = 200.1;
133 metadata_in.top_controls_visible_height = 25.5;
134 metadata_in.frame_rate = 29.94;
135 metadata_in.rtp_timestamp = 1.0;
138 base::TimeTicks now = base::TimeTicks::Now();
139 metadata_in.receive_time = now + base::Milliseconds(10);
140 metadata_in.capture_begin_time = now + base::Milliseconds(20);
141 metadata_in.capture_end_time = now + base::Milliseconds(30);
142 metadata_in.decode_begin_time = now + base::Milliseconds(40);
143 metadata_in.decode_end_time = now + base::Milliseconds(50);
144 metadata_in.reference_time = now + base::Milliseconds(60);
147 metadata_in.processing_time = base::Milliseconds(500);
148 metadata_in.frame_duration = base::Milliseconds(16);
149 metadata_in.wallclock_frame_duration = base::Milliseconds(17);
151 VideoFrameMetadata metadata_out;
153 ASSERT_TRUE(RoundTrip(metadata_in, &metadata_out));
155 EXPECT_EQ(metadata_in.capture_counter, metadata_out.capture_counter);
156 EXPECT_EQ(metadata_in.capture_update_rect, metadata_out.capture_update_rect);
157 EXPECT_EQ(metadata_in.transformation, metadata_out.transformation);
158 EXPECT_EQ(metadata_in.allow_overlay, metadata_out.allow_overlay);
159 EXPECT_EQ(metadata_in.copy_required, metadata_out.copy_required);
160 EXPECT_EQ(metadata_in.end_of_stream, metadata_out.end_of_stream);
161 EXPECT_EQ(metadata_in.texture_owner, metadata_out.texture_owner);
162 EXPECT_EQ(metadata_in.wants_promotion_hint,
163 metadata_out.wants_promotion_hint);
164 EXPECT_EQ(metadata_in.protected_video, metadata_out.protected_video);
165 EXPECT_EQ(metadata_in.hw_protected, metadata_out.hw_protected);
166 EXPECT_EQ(metadata_in.is_webgpu_compatible,
167 metadata_out.is_webgpu_compatible);
168 EXPECT_EQ(metadata_in.power_efficient, metadata_out.power_efficient);
169 EXPECT_EQ(metadata_in.read_lock_fences_enabled,
170 metadata_out.read_lock_fences_enabled);
171 EXPECT_EQ(metadata_in.interactive_content, metadata_out.interactive_content);
172 EXPECT_EQ(metadata_in.overlay_plane_id, metadata_out.overlay_plane_id);
173 EXPECT_EQ(metadata_in.device_scale_factor, metadata_out.device_scale_factor);
174 EXPECT_EQ(metadata_in.page_scale_factor, metadata_out.page_scale_factor);
175 EXPECT_EQ(metadata_in.root_scroll_offset_x,
176 metadata_out.root_scroll_offset_x);
177 EXPECT_EQ(metadata_in.root_scroll_offset_y,
178 metadata_out.root_scroll_offset_y);
179 EXPECT_EQ(metadata_in.top_controls_visible_height,
180 metadata_out.top_controls_visible_height);
181 EXPECT_EQ(metadata_in.frame_rate, metadata_out.frame_rate);
182 EXPECT_EQ(metadata_in.rtp_timestamp, metadata_out.rtp_timestamp);
183 EXPECT_EQ(metadata_in.receive_time, metadata_out.receive_time);
184 EXPECT_EQ(metadata_in.capture_begin_time, metadata_out.capture_begin_time);
185 EXPECT_EQ(metadata_in.capture_end_time, metadata_out.capture_end_time);
186 EXPECT_EQ(metadata_in.decode_begin_time, metadata_out.decode_begin_time);
187 EXPECT_EQ(metadata_in.decode_end_time, metadata_out.decode_end_time);
188 EXPECT_EQ(metadata_in.reference_time, metadata_out.reference_time);
189 EXPECT_EQ(metadata_in.processing_time, metadata_out.processing_time);
190 EXPECT_EQ(metadata_in.frame_duration, metadata_out.frame_duration);
191 EXPECT_EQ(metadata_in.wallclock_frame_duration,
192 metadata_out.wallclock_frame_duration);