OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/video_layer_impl.h" | 5 #include "cc/layers/video_layer_impl.h" |
6 | 6 |
7 #include "cc/layers/video_frame_provider_client_impl.h" | 7 #include "cc/layers/video_frame_provider_client_impl.h" |
8 #include "cc/output/context_provider.h" | 8 #include "cc/output/context_provider.h" |
9 #include "cc/output/output_surface.h" | 9 #include "cc/output/output_surface.h" |
10 #include "cc/quads/draw_quad.h" | 10 #include "cc/quads/draw_quad.h" |
11 #include "cc/quads/yuv_video_draw_quad.h" | 11 #include "cc/quads/yuv_video_draw_quad.h" |
12 #include "cc/test/fake_video_frame_provider.h" | 12 #include "cc/test/fake_video_frame_provider.h" |
13 #include "cc/test/layer_test_common.h" | 13 #include "cc/test/layer_test_common.h" |
14 #include "cc/trees/single_thread_proxy.h" | 14 #include "cc/trees/single_thread_proxy.h" |
15 #include "media/base/video_frame.h" | 15 #include "media/base/video_frame.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 | 17 |
18 namespace cc { | 18 namespace cc { |
19 namespace { | 19 namespace { |
20 | 20 |
21 // NOTE: We cannot use DebugScopedSetImplThreadAndMainThreadBlocked in these | 21 // NOTE: We cannot use DebugScopedSetImplThreadAndMainThreadBlocked in these |
22 // tests because it gets destroyed before the VideoLayerImpl is destroyed. This | 22 // tests because it gets destroyed before the VideoLayerImpl is destroyed. This |
23 // causes a DCHECK in VideoLayerImpl's destructor to fail. | 23 // causes a DCHECK in VideoLayerImpl's destructor to fail. |
24 static void DebugSetImplThreadAndMainThreadBlocked(Proxy* proxy) { | 24 static void DebugSetImplThreadAndMainThreadBlocked( |
| 25 TaskRunnerProvider* task_runner_provider) { |
25 #if DCHECK_IS_ON() | 26 #if DCHECK_IS_ON() |
26 proxy->SetCurrentThreadIsImplThread(true); | 27 task_runner_provider->SetCurrentThreadIsImplThread(true); |
27 proxy->SetMainThreadBlocked(true); | 28 task_runner_provider->SetMainThreadBlocked(true); |
28 #endif | 29 #endif |
29 } | 30 } |
30 | 31 |
31 TEST(VideoLayerImplTest, Occlusion) { | 32 TEST(VideoLayerImplTest, Occlusion) { |
32 gfx::Size layer_size(1000, 1000); | 33 gfx::Size layer_size(1000, 1000); |
33 gfx::Size viewport_size(1000, 1000); | 34 gfx::Size viewport_size(1000, 1000); |
34 | 35 |
35 LayerTestCommon::LayerImplTest impl; | 36 LayerTestCommon::LayerImplTest impl; |
36 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 37 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
37 | 38 |
38 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 39 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
39 media::PIXEL_FORMAT_YV12, gfx::Size(10, 10), gfx::Rect(10, 10), | 40 media::PIXEL_FORMAT_YV12, gfx::Size(10, 10), gfx::Rect(10, 10), |
40 gfx::Size(10, 10), base::TimeDelta()); | 41 gfx::Size(10, 10), base::TimeDelta()); |
41 FakeVideoFrameProvider provider; | 42 FakeVideoFrameProvider provider; |
42 provider.set_frame(video_frame); | 43 provider.set_frame(video_frame); |
43 | 44 |
44 VideoLayerImpl* video_layer_impl = | 45 VideoLayerImpl* video_layer_impl = |
45 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); | 46 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); |
46 video_layer_impl->SetBounds(layer_size); | 47 video_layer_impl->SetBounds(layer_size); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 EXPECT_EQ(1u, partially_occluded_count); | 81 EXPECT_EQ(1u, partially_occluded_count); |
81 } | 82 } |
82 } | 83 } |
83 | 84 |
84 TEST(VideoLayerImplTest, OccludesOtherLayers) { | 85 TEST(VideoLayerImplTest, OccludesOtherLayers) { |
85 gfx::Size layer_size(1000, 1000); | 86 gfx::Size layer_size(1000, 1000); |
86 gfx::Rect visible(layer_size); | 87 gfx::Rect visible(layer_size); |
87 | 88 |
88 LayerTestCommon::LayerImplTest impl; | 89 LayerTestCommon::LayerImplTest impl; |
89 impl.host_impl()->SetViewportSize(layer_size); | 90 impl.host_impl()->SetViewportSize(layer_size); |
90 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 91 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
91 auto active_tree = impl.host_impl()->active_tree(); | 92 auto active_tree = impl.host_impl()->active_tree(); |
92 | 93 |
93 // Create a video layer with no frame on top of another layer. | 94 // Create a video layer with no frame on top of another layer. |
94 scoped_ptr<LayerImpl> layer_impl = LayerImpl::Create(active_tree, 3); | 95 scoped_ptr<LayerImpl> layer_impl = LayerImpl::Create(active_tree, 3); |
95 layer_impl->SetHasRenderSurface(true); | 96 layer_impl->SetHasRenderSurface(true); |
96 layer_impl->SetBounds(layer_size); | 97 layer_impl->SetBounds(layer_size); |
97 layer_impl->SetDrawsContent(true); | 98 layer_impl->SetDrawsContent(true); |
98 const auto& draw_properties = layer_impl->draw_properties(); | 99 const auto& draw_properties = layer_impl->draw_properties(); |
99 | 100 |
100 FakeVideoFrameProvider provider; | 101 FakeVideoFrameProvider provider; |
(...skipping 19 matching lines...) Expand all Loading... |
120 provider.set_frame(video_frame); | 121 provider.set_frame(video_frame); |
121 active_tree->set_needs_update_draw_properties(); | 122 active_tree->set_needs_update_draw_properties(); |
122 active_tree->UpdateDrawProperties(false); | 123 active_tree->UpdateDrawProperties(false); |
123 | 124 |
124 // We have a frame now, so the video occludes the layer below it. | 125 // We have a frame now, so the video occludes the layer below it. |
125 EXPECT_TRUE(draw_properties.occlusion_in_content_space.IsOccluded(visible)); | 126 EXPECT_TRUE(draw_properties.occlusion_in_content_space.IsOccluded(visible)); |
126 } | 127 } |
127 | 128 |
128 TEST(VideoLayerImplTest, DidBecomeActiveShouldSetActiveVideoLayer) { | 129 TEST(VideoLayerImplTest, DidBecomeActiveShouldSetActiveVideoLayer) { |
129 LayerTestCommon::LayerImplTest impl; | 130 LayerTestCommon::LayerImplTest impl; |
130 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 131 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
131 | 132 |
132 FakeVideoFrameProvider provider; | 133 FakeVideoFrameProvider provider; |
133 VideoLayerImpl* video_layer_impl = | 134 VideoLayerImpl* video_layer_impl = |
134 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); | 135 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); |
135 | 136 |
136 VideoFrameProviderClientImpl* client = | 137 VideoFrameProviderClientImpl* client = |
137 static_cast<VideoFrameProviderClientImpl*>(provider.client()); | 138 static_cast<VideoFrameProviderClientImpl*>(provider.client()); |
138 ASSERT_TRUE(client); | 139 ASSERT_TRUE(client); |
139 | 140 |
140 EXPECT_FALSE(client->ActiveVideoLayer()); | 141 EXPECT_FALSE(client->ActiveVideoLayer()); |
141 video_layer_impl->DidBecomeActive(); | 142 video_layer_impl->DidBecomeActive(); |
142 EXPECT_EQ(video_layer_impl, client->ActiveVideoLayer()); | 143 EXPECT_EQ(video_layer_impl, client->ActiveVideoLayer()); |
143 } | 144 } |
144 | 145 |
145 TEST(VideoLayerImplTest, Rotated0) { | 146 TEST(VideoLayerImplTest, Rotated0) { |
146 gfx::Size layer_size(100, 50); | 147 gfx::Size layer_size(100, 50); |
147 gfx::Size viewport_size(1000, 500); | 148 gfx::Size viewport_size(1000, 500); |
148 | 149 |
149 LayerTestCommon::LayerImplTest impl; | 150 LayerTestCommon::LayerImplTest impl; |
150 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 151 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
151 | 152 |
152 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 153 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
153 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), | 154 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), |
154 gfx::Size(20, 10), base::TimeDelta()); | 155 gfx::Size(20, 10), base::TimeDelta()); |
155 FakeVideoFrameProvider provider; | 156 FakeVideoFrameProvider provider; |
156 provider.set_frame(video_frame); | 157 provider.set_frame(video_frame); |
157 | 158 |
158 VideoLayerImpl* video_layer_impl = | 159 VideoLayerImpl* video_layer_impl = |
159 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); | 160 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0); |
160 video_layer_impl->SetBounds(layer_size); | 161 video_layer_impl->SetBounds(layer_size); |
(...skipping 15 matching lines...) Expand all Loading... |
176 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); | 177 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); |
177 EXPECT_EQ(gfx::Point3F(0, 50, 0), p1); | 178 EXPECT_EQ(gfx::Point3F(0, 50, 0), p1); |
178 EXPECT_EQ(gfx::Point3F(100, 0, 0), p2); | 179 EXPECT_EQ(gfx::Point3F(100, 0, 0), p2); |
179 } | 180 } |
180 | 181 |
181 TEST(VideoLayerImplTest, Rotated90) { | 182 TEST(VideoLayerImplTest, Rotated90) { |
182 gfx::Size layer_size(100, 50); | 183 gfx::Size layer_size(100, 50); |
183 gfx::Size viewport_size(1000, 500); | 184 gfx::Size viewport_size(1000, 500); |
184 | 185 |
185 LayerTestCommon::LayerImplTest impl; | 186 LayerTestCommon::LayerImplTest impl; |
186 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 187 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
187 | 188 |
188 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 189 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
189 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), | 190 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), |
190 gfx::Size(20, 10), base::TimeDelta()); | 191 gfx::Size(20, 10), base::TimeDelta()); |
191 FakeVideoFrameProvider provider; | 192 FakeVideoFrameProvider provider; |
192 provider.set_frame(video_frame); | 193 provider.set_frame(video_frame); |
193 | 194 |
194 VideoLayerImpl* video_layer_impl = | 195 VideoLayerImpl* video_layer_impl = |
195 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_90); | 196 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_90); |
196 video_layer_impl->SetBounds(layer_size); | 197 video_layer_impl->SetBounds(layer_size); |
(...skipping 15 matching lines...) Expand all Loading... |
212 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); | 213 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); |
213 EXPECT_EQ(gfx::Point3F(0, 0, 0), p1); | 214 EXPECT_EQ(gfx::Point3F(0, 0, 0), p1); |
214 EXPECT_EQ(gfx::Point3F(100, 50, 0), p2); | 215 EXPECT_EQ(gfx::Point3F(100, 50, 0), p2); |
215 } | 216 } |
216 | 217 |
217 TEST(VideoLayerImplTest, Rotated180) { | 218 TEST(VideoLayerImplTest, Rotated180) { |
218 gfx::Size layer_size(100, 50); | 219 gfx::Size layer_size(100, 50); |
219 gfx::Size viewport_size(1000, 500); | 220 gfx::Size viewport_size(1000, 500); |
220 | 221 |
221 LayerTestCommon::LayerImplTest impl; | 222 LayerTestCommon::LayerImplTest impl; |
222 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 223 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
223 | 224 |
224 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 225 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
225 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), | 226 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), |
226 gfx::Size(20, 10), base::TimeDelta()); | 227 gfx::Size(20, 10), base::TimeDelta()); |
227 FakeVideoFrameProvider provider; | 228 FakeVideoFrameProvider provider; |
228 provider.set_frame(video_frame); | 229 provider.set_frame(video_frame); |
229 | 230 |
230 VideoLayerImpl* video_layer_impl = | 231 VideoLayerImpl* video_layer_impl = |
231 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_180); | 232 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_180); |
232 video_layer_impl->SetBounds(layer_size); | 233 video_layer_impl->SetBounds(layer_size); |
(...skipping 15 matching lines...) Expand all Loading... |
248 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); | 249 ->shared_quad_state->quad_to_target_transform.TransformPoint(&p2); |
249 EXPECT_EQ(gfx::Point3F(100, 0, 0), p1); | 250 EXPECT_EQ(gfx::Point3F(100, 0, 0), p1); |
250 EXPECT_EQ(gfx::Point3F(0, 50, 0), p2); | 251 EXPECT_EQ(gfx::Point3F(0, 50, 0), p2); |
251 } | 252 } |
252 | 253 |
253 TEST(VideoLayerImplTest, Rotated270) { | 254 TEST(VideoLayerImplTest, Rotated270) { |
254 gfx::Size layer_size(100, 50); | 255 gfx::Size layer_size(100, 50); |
255 gfx::Size viewport_size(1000, 500); | 256 gfx::Size viewport_size(1000, 500); |
256 | 257 |
257 LayerTestCommon::LayerImplTest impl; | 258 LayerTestCommon::LayerImplTest impl; |
258 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 259 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
259 | 260 |
260 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 261 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
261 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), | 262 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), |
262 gfx::Size(20, 10), base::TimeDelta()); | 263 gfx::Size(20, 10), base::TimeDelta()); |
263 FakeVideoFrameProvider provider; | 264 FakeVideoFrameProvider provider; |
264 provider.set_frame(video_frame); | 265 provider.set_frame(video_frame); |
265 | 266 |
266 VideoLayerImpl* video_layer_impl = | 267 VideoLayerImpl* video_layer_impl = |
267 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_270); | 268 impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_270); |
268 video_layer_impl->SetBounds(layer_size); | 269 video_layer_impl->SetBounds(layer_size); |
(...skipping 18 matching lines...) Expand all Loading... |
287 } | 288 } |
288 | 289 |
289 void EmptyCallback(unsigned sync_point) { | 290 void EmptyCallback(unsigned sync_point) { |
290 } | 291 } |
291 | 292 |
292 TEST(VideoLayerImplTest, SoftwareVideoFrameGeneratesYUVQuad) { | 293 TEST(VideoLayerImplTest, SoftwareVideoFrameGeneratesYUVQuad) { |
293 gfx::Size layer_size(1000, 1000); | 294 gfx::Size layer_size(1000, 1000); |
294 gfx::Size viewport_size(1000, 1000); | 295 gfx::Size viewport_size(1000, 1000); |
295 | 296 |
296 LayerTestCommon::LayerImplTest impl; | 297 LayerTestCommon::LayerImplTest impl; |
297 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 298 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
298 | 299 |
299 gpu::MailboxHolder mailbox_holder; | 300 gpu::MailboxHolder mailbox_holder; |
300 mailbox_holder.mailbox.name[0] = 1; | 301 mailbox_holder.mailbox.name[0] = 1; |
301 | 302 |
302 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( | 303 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
303 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), | 304 media::PIXEL_FORMAT_YV12, gfx::Size(20, 10), gfx::Rect(20, 10), |
304 gfx::Size(20, 10), base::TimeDelta()); | 305 gfx::Size(20, 10), base::TimeDelta()); |
305 | 306 |
306 FakeVideoFrameProvider provider; | 307 FakeVideoFrameProvider provider; |
307 provider.set_frame(video_frame); | 308 provider.set_frame(video_frame); |
(...skipping 16 matching lines...) Expand all Loading... |
324 (yuv_draw_quad->ya_tex_size.height() + 1) / 2); | 325 (yuv_draw_quad->ya_tex_size.height() + 1) / 2); |
325 EXPECT_EQ(yuv_draw_quad->uv_tex_size.width(), | 326 EXPECT_EQ(yuv_draw_quad->uv_tex_size.width(), |
326 (yuv_draw_quad->ya_tex_size.width() + 1) / 2); | 327 (yuv_draw_quad->ya_tex_size.width() + 1) / 2); |
327 } | 328 } |
328 | 329 |
329 TEST(VideoLayerImplTest, NativeYUVFrameGeneratesYUVQuad) { | 330 TEST(VideoLayerImplTest, NativeYUVFrameGeneratesYUVQuad) { |
330 gfx::Size layer_size(1000, 1000); | 331 gfx::Size layer_size(1000, 1000); |
331 gfx::Size viewport_size(1000, 1000); | 332 gfx::Size viewport_size(1000, 1000); |
332 | 333 |
333 LayerTestCommon::LayerImplTest impl; | 334 LayerTestCommon::LayerImplTest impl; |
334 DebugSetImplThreadAndMainThreadBlocked(impl.proxy()); | 335 DebugSetImplThreadAndMainThreadBlocked(impl.task_runner_provider()); |
335 | 336 |
336 gpu::MailboxHolder mailbox_holder; | 337 gpu::MailboxHolder mailbox_holder; |
337 mailbox_holder.mailbox.name[0] = 1; | 338 mailbox_holder.mailbox.name[0] = 1; |
338 | 339 |
339 scoped_refptr<media::VideoFrame> video_frame = | 340 scoped_refptr<media::VideoFrame> video_frame = |
340 media::VideoFrame::WrapYUV420NativeTextures( | 341 media::VideoFrame::WrapYUV420NativeTextures( |
341 mailbox_holder, mailbox_holder, mailbox_holder, | 342 mailbox_holder, mailbox_holder, mailbox_holder, |
342 base::Bind(EmptyCallback), gfx::Size(10, 10), gfx::Rect(10, 10), | 343 base::Bind(EmptyCallback), gfx::Size(10, 10), gfx::Rect(10, 10), |
343 gfx::Size(10, 10), base::TimeDelta()); | 344 gfx::Size(10, 10), base::TimeDelta()); |
344 video_frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY, | 345 video_frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY, |
(...skipping 16 matching lines...) Expand all Loading... |
361 const YUVVideoDrawQuad* yuv_draw_quad = | 362 const YUVVideoDrawQuad* yuv_draw_quad = |
362 static_cast<const YUVVideoDrawQuad*>(draw_quad); | 363 static_cast<const YUVVideoDrawQuad*>(draw_quad); |
363 EXPECT_EQ(yuv_draw_quad->uv_tex_size.height(), | 364 EXPECT_EQ(yuv_draw_quad->uv_tex_size.height(), |
364 (yuv_draw_quad->ya_tex_size.height() + 1) / 2); | 365 (yuv_draw_quad->ya_tex_size.height() + 1) / 2); |
365 EXPECT_EQ(yuv_draw_quad->uv_tex_size.width(), | 366 EXPECT_EQ(yuv_draw_quad->uv_tex_size.width(), |
366 (yuv_draw_quad->ya_tex_size.width() + 1) / 2); | 367 (yuv_draw_quad->ya_tex_size.width() + 1) / 2); |
367 } | 368 } |
368 | 369 |
369 } // namespace | 370 } // namespace |
370 } // namespace cc | 371 } // namespace cc |
OLD | NEW |