[M120 Migration][MM] Framerate calculation
[platform/framework/web/chromium-efl.git] / media / mojo / mojom / video_frame_metadata_mojom_traits_unittest.cc
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.
4
5 #include "media/mojo/mojom/video_frame_metadata_mojom_traits.h"
6
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"
16
17 namespace media {
18
19 namespace {
20
21 class VideoFrameMetadataStructTraitsTest
22     : public testing::Test,
23       public mojom::VideoFrameMetadataTraitsTestService {
24  public:
25   VideoFrameMetadataStructTraitsTest() = default;
26
27   VideoFrameMetadataStructTraitsTest(
28       const VideoFrameMetadataStructTraitsTest&) = delete;
29   VideoFrameMetadataStructTraitsTest& operator=(
30       const VideoFrameMetadataStructTraitsTest&) = delete;
31
32  protected:
33   mojo::Remote<mojom::VideoFrameMetadataTraitsTestService>
34   GetTraitsTestRemote() {
35     mojo::Remote<mojom::VideoFrameMetadataTraitsTestService> remote;
36     traits_test_receivers_.Add(this, remote.BindNewPipeAndPassReceiver());
37     return remote;
38   }
39
40   bool RoundTrip(const VideoFrameMetadata& in, VideoFrameMetadata* out) {
41     mojo::Remote<mojom::VideoFrameMetadataTraitsTestService> remote =
42         GetTraitsTestRemote();
43     return remote->EchoVideoFrameMetadata(in, out);
44   }
45
46  private:
47   void EchoVideoFrameMetadata(
48       const VideoFrameMetadata& vfm,
49       EchoVideoFrameMetadataCallback callback) override {
50     std::move(callback).Run(vfm);
51   }
52
53   base::test::TaskEnvironment task_environment_;
54   mojo::ReceiverSet<VideoFrameMetadataTraitsTestService> traits_test_receivers_;
55 };
56
57 }  // namespace
58
59 TEST_F(VideoFrameMetadataStructTraitsTest, EmptyMetadata) {
60   VideoFrameMetadata metadata_in;
61   VideoFrameMetadata metadata_out;
62
63   ASSERT_TRUE(RoundTrip(metadata_in, &metadata_out));
64
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());
96 }
97
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;
102
103   // ints
104   metadata_in.capture_counter = 123;
105
106   // gfx::Rects
107   metadata_in.capture_update_rect = gfx::Rect(12, 34, 360, 480);
108
109   // VideoTransformation
110   metadata_in.transformation = VideoTransformation(VIDEO_ROTATION_90, true);
111
112   // bools
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;
124
125   // base::UnguessableTokens
126   metadata_in.overlay_plane_id = base::UnguessableToken::Create();
127
128   // doubles
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;
136
137   // base::TimeTicks
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);
145
146   // base::TimeDeltas
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);
150
151   VideoFrameMetadata metadata_out;
152
153   ASSERT_TRUE(RoundTrip(metadata_in, &metadata_out));
154
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);
193 }
194
195 }  // namespace media