OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <GLES3/gl3.h> | 5 #include <GLES3/gl3.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/memory/aligned_memory.h" | 9 #include "base/memory/aligned_memory.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "ui/gfx/geometry/rect_f.h" | 26 #include "ui/gfx/geometry/rect_f.h" |
27 | 27 |
28 using media::VideoFrame; | 28 using media::VideoFrame; |
29 | 29 |
30 namespace media { | 30 namespace media { |
31 | 31 |
32 static const int kWidth = 320; | 32 static const int kWidth = 320; |
33 static const int kHeight = 240; | 33 static const int kHeight = 240; |
34 static const gfx::RectF kNaturalRect(kWidth, kHeight); | 34 static const gfx::RectF kNaturalRect(kWidth, kHeight); |
35 | 35 |
36 // Helper for filling a |canvas| with a solid |color|. | |
37 void FillCanvas(cc::PaintCanvas* canvas, SkColor color) { | |
38 canvas->clear(color); | |
39 } | |
40 | |
41 // Helper for returning the color of a solid |canvas|. | |
42 SkColor GetColorAt(cc::PaintCanvas* canvas, int x, int y) { | |
43 SkBitmap bitmap; | |
44 if (!bitmap.tryAllocN32Pixels(1, 1)) | |
45 return 0; | |
46 if (!canvas->readPixels(&bitmap, x, y)) | |
47 return 0; | |
48 return bitmap.getColor(0, 0); | |
49 } | |
50 | |
51 SkColor GetColor(cc::PaintCanvas* canvas) { | |
52 return GetColorAt(canvas, 0, 0); | |
53 } | |
54 | |
55 // Generate frame pixels to provided |external_memory| and wrap it as frame. | 36 // Generate frame pixels to provided |external_memory| and wrap it as frame. |
56 scoped_refptr<VideoFrame> CreateTestY16Frame(const gfx::Size& coded_size, | 37 scoped_refptr<VideoFrame> CreateTestY16Frame(const gfx::Size& coded_size, |
57 const gfx::Rect& visible_rect, | 38 const gfx::Rect& visible_rect, |
58 void* external_memory, | 39 void* external_memory, |
59 base::TimeDelta timestamp) { | 40 base::TimeDelta timestamp) { |
60 const int offset_x = visible_rect.x(); | 41 const int offset_x = visible_rect.x(); |
61 const int offset_y = visible_rect.y(); | 42 const int offset_y = visible_rect.y(); |
62 const int stride = coded_size.width(); | 43 const int stride = coded_size.width(); |
63 const size_t byte_size = stride * coded_size.height() * 2; | 44 const size_t byte_size = stride * coded_size.height() * 2; |
64 | 45 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 cc::PaintCanvas* canvas); | 89 cc::PaintCanvas* canvas); |
109 | 90 |
110 // Getters for various frame sizes. | 91 // Getters for various frame sizes. |
111 scoped_refptr<VideoFrame> natural_frame() { return natural_frame_; } | 92 scoped_refptr<VideoFrame> natural_frame() { return natural_frame_; } |
112 scoped_refptr<VideoFrame> larger_frame() { return larger_frame_; } | 93 scoped_refptr<VideoFrame> larger_frame() { return larger_frame_; } |
113 scoped_refptr<VideoFrame> smaller_frame() { return smaller_frame_; } | 94 scoped_refptr<VideoFrame> smaller_frame() { return smaller_frame_; } |
114 scoped_refptr<VideoFrame> cropped_frame() { return cropped_frame_; } | 95 scoped_refptr<VideoFrame> cropped_frame() { return cropped_frame_; } |
115 | 96 |
116 // Standard canvas. | 97 // Standard canvas. |
117 cc::PaintCanvas* target_canvas() { return &target_canvas_; } | 98 cc::PaintCanvas* target_canvas() { return &target_canvas_; } |
| 99 SkBitmap* bitmap() { return &bitmap_; } |
118 | 100 |
119 protected: | 101 protected: |
120 SkCanvasVideoRenderer renderer_; | 102 SkCanvasVideoRenderer renderer_; |
121 | 103 |
122 scoped_refptr<VideoFrame> natural_frame_; | 104 scoped_refptr<VideoFrame> natural_frame_; |
123 scoped_refptr<VideoFrame> larger_frame_; | 105 scoped_refptr<VideoFrame> larger_frame_; |
124 scoped_refptr<VideoFrame> smaller_frame_; | 106 scoped_refptr<VideoFrame> smaller_frame_; |
125 scoped_refptr<VideoFrame> cropped_frame_; | 107 scoped_refptr<VideoFrame> cropped_frame_; |
126 | 108 |
| 109 SkBitmap bitmap_; |
127 cc::SkiaPaintCanvas target_canvas_; | 110 cc::SkiaPaintCanvas target_canvas_; |
128 base::MessageLoop message_loop_; | 111 base::MessageLoop message_loop_; |
129 | 112 |
130 DISALLOW_COPY_AND_ASSIGN(SkCanvasVideoRendererTest); | 113 DISALLOW_COPY_AND_ASSIGN(SkCanvasVideoRendererTest); |
131 }; | 114 }; |
132 | 115 |
133 static SkBitmap AllocBitmap(int width, int height) { | 116 static SkBitmap AllocBitmap(int width, int height) { |
134 SkBitmap bitmap; | 117 SkBitmap bitmap; |
135 bitmap.allocPixels(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType)); | 118 bitmap.allocPixels(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType)); |
136 bitmap.eraseColor(0); | 119 bitmap.eraseColor(0); |
137 return bitmap; | 120 return bitmap; |
138 } | 121 } |
139 | 122 |
140 SkCanvasVideoRendererTest::SkCanvasVideoRendererTest() | 123 SkCanvasVideoRendererTest::SkCanvasVideoRendererTest() |
141 : natural_frame_(VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight))), | 124 : natural_frame_(VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight))), |
142 larger_frame_( | 125 larger_frame_( |
143 VideoFrame::CreateBlackFrame(gfx::Size(kWidth * 2, kHeight * 2))), | 126 VideoFrame::CreateBlackFrame(gfx::Size(kWidth * 2, kHeight * 2))), |
144 smaller_frame_( | 127 smaller_frame_( |
145 VideoFrame::CreateBlackFrame(gfx::Size(kWidth / 2, kHeight / 2))), | 128 VideoFrame::CreateBlackFrame(gfx::Size(kWidth / 2, kHeight / 2))), |
146 cropped_frame_( | 129 cropped_frame_( |
147 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, | 130 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, |
148 gfx::Size(16, 16), | 131 gfx::Size(16, 16), |
149 gfx::Rect(6, 6, 8, 6), | 132 gfx::Rect(6, 6, 8, 6), |
150 gfx::Size(8, 6), | 133 gfx::Size(8, 6), |
151 base::TimeDelta::FromMilliseconds(4))), | 134 base::TimeDelta::FromMilliseconds(4))), |
152 target_canvas_(AllocBitmap(kWidth, kHeight)) { | 135 bitmap_(AllocBitmap(kWidth, kHeight)), |
| 136 target_canvas_(bitmap_) { |
153 // Give each frame a unique timestamp. | 137 // Give each frame a unique timestamp. |
154 natural_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(1)); | 138 natural_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(1)); |
155 larger_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(2)); | 139 larger_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(2)); |
156 smaller_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(3)); | 140 smaller_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(3)); |
157 | 141 |
158 // Make sure the cropped video frame's aspect ratio matches the output device. | 142 // Make sure the cropped video frame's aspect ratio matches the output device. |
159 // Update cropped_frame_'s crop dimensions if this is not the case. | 143 // Update cropped_frame_'s crop dimensions if this is not the case. |
160 EXPECT_EQ(cropped_frame()->visible_rect().width() * kHeight, | 144 EXPECT_EQ(cropped_frame()->visible_rect().width() * kHeight, |
161 cropped_frame()->visible_rect().height() * kWidth); | 145 cropped_frame()->visible_rect().height() * kWidth); |
162 | 146 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 } | 263 } |
280 | 264 |
281 void SkCanvasVideoRendererTest::Copy( | 265 void SkCanvasVideoRendererTest::Copy( |
282 const scoped_refptr<VideoFrame>& video_frame, | 266 const scoped_refptr<VideoFrame>& video_frame, |
283 cc::PaintCanvas* canvas) { | 267 cc::PaintCanvas* canvas) { |
284 renderer_.Copy(video_frame, canvas, Context3D()); | 268 renderer_.Copy(video_frame, canvas, Context3D()); |
285 } | 269 } |
286 | 270 |
287 TEST_F(SkCanvasVideoRendererTest, NoFrame) { | 271 TEST_F(SkCanvasVideoRendererTest, NoFrame) { |
288 // Test that black gets painted over canvas. | 272 // Test that black gets painted over canvas. |
289 FillCanvas(target_canvas(), SK_ColorRED); | 273 target_canvas()->clear(SK_ColorRED); |
290 PaintWithoutFrame(target_canvas()); | 274 PaintWithoutFrame(target_canvas()); |
291 EXPECT_EQ(SK_ColorBLACK, GetColor(target_canvas())); | 275 EXPECT_EQ(SK_ColorBLACK, bitmap()->getColor(0, 0)); |
292 } | 276 } |
293 | 277 |
294 TEST_F(SkCanvasVideoRendererTest, TransparentFrame) { | 278 TEST_F(SkCanvasVideoRendererTest, TransparentFrame) { |
295 FillCanvas(target_canvas(), SK_ColorRED); | 279 target_canvas()->clear(SK_ColorRED); |
296 PaintRotated( | 280 PaintRotated( |
297 VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), | 281 VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), |
298 target_canvas(), kNaturalRect, kNone, SkBlendMode::kSrcOver, | 282 target_canvas(), kNaturalRect, kNone, SkBlendMode::kSrcOver, |
299 VIDEO_ROTATION_0); | 283 VIDEO_ROTATION_0); |
300 EXPECT_EQ(static_cast<SkColor>(SK_ColorRED), GetColor(target_canvas())); | 284 EXPECT_EQ(static_cast<SkColor>(SK_ColorRED), bitmap()->getColor(0, 0)); |
301 } | 285 } |
302 | 286 |
303 TEST_F(SkCanvasVideoRendererTest, TransparentFrameSrcMode) { | 287 TEST_F(SkCanvasVideoRendererTest, TransparentFrameSrcMode) { |
304 FillCanvas(target_canvas(), SK_ColorRED); | 288 target_canvas()->clear(SK_ColorRED); |
305 // SRC mode completely overwrites the buffer. | 289 // SRC mode completely overwrites the buffer. |
306 PaintRotated( | 290 PaintRotated( |
307 VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), | 291 VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), |
308 target_canvas(), kNaturalRect, kNone, SkBlendMode::kSrc, | 292 target_canvas(), kNaturalRect, kNone, SkBlendMode::kSrc, |
309 VIDEO_ROTATION_0); | 293 VIDEO_ROTATION_0); |
310 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), | 294 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), |
311 GetColor(target_canvas())); | 295 bitmap()->getColor(0, 0)); |
312 } | 296 } |
313 | 297 |
314 TEST_F(SkCanvasVideoRendererTest, CopyTransparentFrame) { | 298 TEST_F(SkCanvasVideoRendererTest, CopyTransparentFrame) { |
315 FillCanvas(target_canvas(), SK_ColorRED); | 299 target_canvas()->clear(SK_ColorRED); |
316 Copy(VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), | 300 Copy(VideoFrame::CreateTransparentFrame(gfx::Size(kWidth, kHeight)).get(), |
317 target_canvas()); | 301 target_canvas()); |
318 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), | 302 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), |
319 GetColor(target_canvas())); | 303 bitmap()->getColor(0, 0)); |
320 } | 304 } |
321 | 305 |
322 TEST_F(SkCanvasVideoRendererTest, Natural) { | 306 TEST_F(SkCanvasVideoRendererTest, Natural) { |
323 Paint(natural_frame(), target_canvas(), kRed); | 307 Paint(natural_frame(), target_canvas(), kRed); |
324 EXPECT_EQ(SK_ColorRED, GetColor(target_canvas())); | 308 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(0, 0)); |
325 } | 309 } |
326 | 310 |
327 TEST_F(SkCanvasVideoRendererTest, Larger) { | 311 TEST_F(SkCanvasVideoRendererTest, Larger) { |
328 Paint(natural_frame(), target_canvas(), kRed); | 312 Paint(natural_frame(), target_canvas(), kRed); |
329 EXPECT_EQ(SK_ColorRED, GetColor(target_canvas())); | 313 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(0, 0)); |
330 | 314 |
331 Paint(larger_frame(), target_canvas(), kBlue); | 315 Paint(larger_frame(), target_canvas(), kBlue); |
332 EXPECT_EQ(SK_ColorBLUE, GetColor(target_canvas())); | 316 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(0, 0)); |
333 } | 317 } |
334 | 318 |
335 TEST_F(SkCanvasVideoRendererTest, Smaller) { | 319 TEST_F(SkCanvasVideoRendererTest, Smaller) { |
336 Paint(natural_frame(), target_canvas(), kRed); | 320 Paint(natural_frame(), target_canvas(), kRed); |
337 EXPECT_EQ(SK_ColorRED, GetColor(target_canvas())); | 321 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(0, 0)); |
338 | 322 |
339 Paint(smaller_frame(), target_canvas(), kBlue); | 323 Paint(smaller_frame(), target_canvas(), kBlue); |
340 EXPECT_EQ(SK_ColorBLUE, GetColor(target_canvas())); | 324 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(0, 0)); |
341 } | 325 } |
342 | 326 |
343 TEST_F(SkCanvasVideoRendererTest, NoTimestamp) { | 327 TEST_F(SkCanvasVideoRendererTest, NoTimestamp) { |
344 VideoFrame* video_frame = natural_frame().get(); | 328 VideoFrame* video_frame = natural_frame().get(); |
345 video_frame->set_timestamp(media::kNoTimestamp); | 329 video_frame->set_timestamp(media::kNoTimestamp); |
346 Paint(video_frame, target_canvas(), kRed); | 330 Paint(video_frame, target_canvas(), kRed); |
347 EXPECT_EQ(SK_ColorRED, GetColor(target_canvas())); | 331 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(0, 0)); |
348 } | 332 } |
349 | 333 |
350 TEST_F(SkCanvasVideoRendererTest, CroppedFrame) { | 334 TEST_F(SkCanvasVideoRendererTest, CroppedFrame) { |
351 Paint(cropped_frame(), target_canvas(), kNone); | 335 Paint(cropped_frame(), target_canvas(), kNone); |
352 // Check the corners. | 336 // Check the corners. |
353 EXPECT_EQ(SK_ColorBLACK, GetColorAt(target_canvas(), 0, 0)); | 337 EXPECT_EQ(SK_ColorBLACK, bitmap()->getColor(0, 0)); |
354 EXPECT_EQ(SK_ColorRED, GetColorAt(target_canvas(), kWidth - 1, 0)); | 338 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(kWidth - 1, 0)); |
355 EXPECT_EQ(SK_ColorGREEN, GetColorAt(target_canvas(), 0, kHeight - 1)); | 339 EXPECT_EQ(SK_ColorGREEN, bitmap()->getColor(0, kHeight - 1)); |
356 EXPECT_EQ(SK_ColorBLUE, GetColorAt(target_canvas(), kWidth - 1, kHeight - 1)); | 340 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(kWidth - 1, kHeight - 1)); |
357 // Check the interior along the border between color regions. Note that we're | 341 // Check the interior along the border between color regions. Note that we're |
358 // bilinearly upscaling, so we'll need to take care to pick sample points that | 342 // bilinearly upscaling, so we'll need to take care to pick sample points that |
359 // are just outside the "zone of resampling". | 343 // are just outside the "zone of resampling". |
360 EXPECT_EQ(SK_ColorBLACK, GetColorAt(target_canvas(), kWidth * 1 / 8 - 1, | 344 EXPECT_EQ(SK_ColorBLACK, |
361 kHeight * 1 / 6 - 1)); | 345 bitmap()->getColor(kWidth * 1 / 8 - 1, kHeight * 1 / 6 - 1)); |
362 EXPECT_EQ(SK_ColorRED, | 346 EXPECT_EQ(SK_ColorRED, |
363 GetColorAt(target_canvas(), kWidth * 3 / 8, kHeight * 1 / 6 - 1)); | 347 bitmap()->getColor(kWidth * 3 / 8, kHeight * 1 / 6 - 1)); |
364 EXPECT_EQ(SK_ColorGREEN, | 348 EXPECT_EQ(SK_ColorGREEN, |
365 GetColorAt(target_canvas(), kWidth * 1 / 8 - 1, kHeight * 3 / 6)); | 349 bitmap()->getColor(kWidth * 1 / 8 - 1, kHeight * 3 / 6)); |
366 EXPECT_EQ(SK_ColorBLUE, | 350 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(kWidth * 3 / 8, kHeight * 3 / 6)); |
367 GetColorAt(target_canvas(), kWidth * 3 / 8, kHeight * 3 / 6)); | |
368 } | 351 } |
369 | 352 |
370 TEST_F(SkCanvasVideoRendererTest, CroppedFrame_NoScaling) { | 353 TEST_F(SkCanvasVideoRendererTest, CroppedFrame_NoScaling) { |
371 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 354 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
| 355 cc::SkiaPaintCanvas canvas(bitmap); |
372 const gfx::Rect crop_rect = cropped_frame()->visible_rect(); | 356 const gfx::Rect crop_rect = cropped_frame()->visible_rect(); |
373 | 357 |
374 // Force painting to a non-zero position on the destination bitmap, to check | 358 // Force painting to a non-zero position on the destination bitmap, to check |
375 // if the coordinates are calculated properly. | 359 // if the coordinates are calculated properly. |
376 const int offset_x = 10; | 360 const int offset_x = 10; |
377 const int offset_y = 15; | 361 const int offset_y = 15; |
378 canvas.translate(offset_x, offset_y); | 362 canvas.translate(offset_x, offset_y); |
379 | 363 |
380 // Create a destination canvas with dimensions and scale which would not | 364 // Create a destination canvas with dimensions and scale which would not |
381 // cause scaling. | 365 // cause scaling. |
382 canvas.scale(static_cast<SkScalar>(crop_rect.width()) / kWidth, | 366 canvas.scale(static_cast<SkScalar>(crop_rect.width()) / kWidth, |
383 static_cast<SkScalar>(crop_rect.height()) / kHeight); | 367 static_cast<SkScalar>(crop_rect.height()) / kHeight); |
384 | 368 |
385 Paint(cropped_frame(), &canvas, kNone); | 369 Paint(cropped_frame(), &canvas, kNone); |
386 | 370 |
387 // Check the corners. | 371 // Check the corners. |
388 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, offset_x, offset_y)); | 372 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(offset_x, offset_y)); |
389 EXPECT_EQ(SK_ColorRED, | 373 EXPECT_EQ(SK_ColorRED, |
390 GetColorAt(&canvas, offset_x + crop_rect.width() - 1, offset_y)); | 374 bitmap.getColor(offset_x + crop_rect.width() - 1, offset_y)); |
391 EXPECT_EQ(SK_ColorGREEN, | 375 EXPECT_EQ(SK_ColorGREEN, |
392 GetColorAt(&canvas, offset_x, offset_y + crop_rect.height() - 1)); | 376 bitmap.getColor(offset_x, offset_y + crop_rect.height() - 1)); |
393 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, offset_x + crop_rect.width() - 1, | 377 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(offset_x + crop_rect.width() - 1, |
394 offset_y + crop_rect.height() - 1)); | 378 offset_y + crop_rect.height() - 1)); |
395 } | 379 } |
396 | 380 |
397 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_90) { | 381 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_90) { |
398 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 382 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
| 383 cc::SkiaPaintCanvas canvas(bitmap); |
399 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, | 384 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, |
400 SkBlendMode::kSrcOver, VIDEO_ROTATION_90); | 385 SkBlendMode::kSrcOver, VIDEO_ROTATION_90); |
401 // Check the corners. | 386 // Check the corners. |
402 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, 0, 0)); | 387 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0)); |
403 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth - 1, 0)); | 388 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth - 1, 0)); |
404 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 389 EXPECT_EQ(SK_ColorRED, bitmap.getColor(kWidth - 1, kHeight - 1)); |
405 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, 0, kHeight - 1)); | 390 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, kHeight - 1)); |
406 } | 391 } |
407 | 392 |
408 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_180) { | 393 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_180) { |
409 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 394 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
| 395 cc::SkiaPaintCanvas canvas(bitmap); |
410 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, | 396 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, |
411 SkBlendMode::kSrcOver, VIDEO_ROTATION_180); | 397 SkBlendMode::kSrcOver, VIDEO_ROTATION_180); |
412 // Check the corners. | 398 // Check the corners. |
413 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, 0, 0)); | 399 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 0)); |
414 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth - 1, 0)); | 400 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth - 1, 0)); |
415 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 401 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth - 1, kHeight - 1)); |
416 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, 0, kHeight - 1)); | 402 EXPECT_EQ(SK_ColorRED, bitmap.getColor(0, kHeight - 1)); |
417 } | 403 } |
418 | 404 |
419 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_270) { | 405 TEST_F(SkCanvasVideoRendererTest, Video_Rotation_270) { |
420 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 406 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
| 407 cc::SkiaPaintCanvas canvas(bitmap); |
421 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, | 408 PaintRotated(cropped_frame(), &canvas, kNaturalRect, kNone, |
422 SkBlendMode::kSrcOver, VIDEO_ROTATION_270); | 409 SkBlendMode::kSrcOver, VIDEO_ROTATION_270); |
423 // Check the corners. | 410 // Check the corners. |
424 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, 0, 0)); | 411 EXPECT_EQ(SK_ColorRED, bitmap.getColor(0, 0)); |
425 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, kWidth - 1, 0)); | 412 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(kWidth - 1, 0)); |
426 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 413 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth - 1, kHeight - 1)); |
427 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, 0, kHeight - 1)); | 414 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(0, kHeight - 1)); |
428 } | 415 } |
429 | 416 |
430 TEST_F(SkCanvasVideoRendererTest, Video_Translate) { | 417 TEST_F(SkCanvasVideoRendererTest, Video_Translate) { |
431 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 418 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
432 FillCanvas(&canvas, SK_ColorMAGENTA); | 419 cc::SkiaPaintCanvas canvas(bitmap); |
| 420 canvas.clear(SK_ColorMAGENTA); |
433 | 421 |
434 PaintRotated(cropped_frame(), &canvas, | 422 PaintRotated(cropped_frame(), &canvas, |
435 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 423 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), |
436 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_0); | 424 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_0); |
437 // Check the corners of quadrant 2 and 4. | 425 // Check the corners of quadrant 2 and 4. |
438 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, 0)); | 426 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, 0)); |
439 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, (kWidth / 2) - 1, 0)); | 427 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor((kWidth / 2) - 1, 0)); |
440 EXPECT_EQ(SK_ColorMAGENTA, | 428 EXPECT_EQ(SK_ColorMAGENTA, |
441 GetColorAt(&canvas, (kWidth / 2) - 1, (kHeight / 2) - 1)); | 429 bitmap.getColor((kWidth / 2) - 1, (kHeight / 2) - 1)); |
442 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, (kHeight / 2) - 1)); | 430 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, (kHeight / 2) - 1)); |
443 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth / 2, kHeight / 2)); | 431 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth / 2, kHeight / 2)); |
444 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, kWidth - 1, kHeight / 2)); | 432 EXPECT_EQ(SK_ColorRED, bitmap.getColor(kWidth - 1, kHeight / 2)); |
445 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 433 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(kWidth - 1, kHeight - 1)); |
446 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth / 2, kHeight - 1)); | 434 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth / 2, kHeight - 1)); |
447 } | 435 } |
448 | 436 |
449 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_90) { | 437 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_90) { |
450 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 438 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
451 FillCanvas(&canvas, SK_ColorMAGENTA); | 439 cc::SkiaPaintCanvas canvas(bitmap); |
| 440 canvas.clear(SK_ColorMAGENTA); |
452 | 441 |
453 PaintRotated(cropped_frame(), &canvas, | 442 PaintRotated(cropped_frame(), &canvas, |
454 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 443 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), |
455 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_90); | 444 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_90); |
456 // Check the corners of quadrant 2 and 4. | 445 // Check the corners of quadrant 2 and 4. |
457 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, 0)); | 446 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, 0)); |
458 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, (kWidth / 2) - 1, 0)); | 447 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor((kWidth / 2) - 1, 0)); |
459 EXPECT_EQ(SK_ColorMAGENTA, | 448 EXPECT_EQ(SK_ColorMAGENTA, |
460 GetColorAt(&canvas, (kWidth / 2) - 1, (kHeight / 2) - 1)); | 449 bitmap.getColor((kWidth / 2) - 1, (kHeight / 2) - 1)); |
461 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, (kHeight / 2) - 1)); | 450 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, (kHeight / 2) - 1)); |
462 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth / 2, kHeight / 2)); | 451 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth / 2, kHeight / 2)); |
463 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth - 1, kHeight / 2)); | 452 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth - 1, kHeight / 2)); |
464 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 453 EXPECT_EQ(SK_ColorRED, bitmap.getColor(kWidth - 1, kHeight - 1)); |
465 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, kWidth / 2, kHeight - 1)); | 454 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(kWidth / 2, kHeight - 1)); |
466 } | 455 } |
467 | 456 |
468 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_180) { | 457 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_180) { |
469 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 458 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
470 FillCanvas(&canvas, SK_ColorMAGENTA); | 459 cc::SkiaPaintCanvas canvas(bitmap); |
| 460 canvas.clear(SK_ColorMAGENTA); |
471 | 461 |
472 PaintRotated(cropped_frame(), &canvas, | 462 PaintRotated(cropped_frame(), &canvas, |
473 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 463 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), |
474 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_180); | 464 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_180); |
475 // Check the corners of quadrant 2 and 4. | 465 // Check the corners of quadrant 2 and 4. |
476 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, 0)); | 466 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, 0)); |
477 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, (kWidth / 2) - 1, 0)); | 467 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor((kWidth / 2) - 1, 0)); |
478 EXPECT_EQ(SK_ColorMAGENTA, | 468 EXPECT_EQ(SK_ColorMAGENTA, |
479 GetColorAt(&canvas, (kWidth / 2) - 1, (kHeight / 2) - 1)); | 469 bitmap.getColor((kWidth / 2) - 1, (kHeight / 2) - 1)); |
480 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, (kHeight / 2) - 1)); | 470 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, (kHeight / 2) - 1)); |
481 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, kWidth / 2, kHeight / 2)); | 471 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(kWidth / 2, kHeight / 2)); |
482 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth - 1, kHeight / 2)); | 472 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth - 1, kHeight / 2)); |
483 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 473 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth - 1, kHeight - 1)); |
484 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, kWidth / 2, kHeight - 1)); | 474 EXPECT_EQ(SK_ColorRED, bitmap.getColor(kWidth / 2, kHeight - 1)); |
485 } | 475 } |
486 | 476 |
487 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_270) { | 477 TEST_F(SkCanvasVideoRendererTest, Video_Translate_Rotation_270) { |
488 cc::SkiaPaintCanvas canvas(AllocBitmap(kWidth, kHeight)); | 478 SkBitmap bitmap = AllocBitmap(kWidth, kHeight); |
489 FillCanvas(&canvas, SK_ColorMAGENTA); | 479 cc::SkiaPaintCanvas canvas(bitmap); |
| 480 canvas.clear(SK_ColorMAGENTA); |
490 | 481 |
491 PaintRotated(cropped_frame(), &canvas, | 482 PaintRotated(cropped_frame(), &canvas, |
492 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 483 gfx::RectF(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), |
493 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_270); | 484 kNone, SkBlendMode::kSrcOver, VIDEO_ROTATION_270); |
494 // Check the corners of quadrant 2 and 4. | 485 // Check the corners of quadrant 2 and 4. |
495 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, 0)); | 486 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, 0)); |
496 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, (kWidth / 2) - 1, 0)); | 487 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor((kWidth / 2) - 1, 0)); |
497 EXPECT_EQ(SK_ColorMAGENTA, | 488 EXPECT_EQ(SK_ColorMAGENTA, |
498 GetColorAt(&canvas, (kWidth / 2) - 1, (kHeight / 2) - 1)); | 489 bitmap.getColor((kWidth / 2) - 1, (kHeight / 2) - 1)); |
499 EXPECT_EQ(SK_ColorMAGENTA, GetColorAt(&canvas, 0, (kHeight / 2) - 1)); | 490 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, (kHeight / 2) - 1)); |
500 EXPECT_EQ(SK_ColorRED, GetColorAt(&canvas, kWidth / 2, kHeight / 2)); | 491 EXPECT_EQ(SK_ColorRED, bitmap.getColor(kWidth / 2, kHeight / 2)); |
501 EXPECT_EQ(SK_ColorBLUE, GetColorAt(&canvas, kWidth - 1, kHeight / 2)); | 492 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(kWidth - 1, kHeight / 2)); |
502 EXPECT_EQ(SK_ColorGREEN, GetColorAt(&canvas, kWidth - 1, kHeight - 1)); | 493 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(kWidth - 1, kHeight - 1)); |
503 EXPECT_EQ(SK_ColorBLACK, GetColorAt(&canvas, kWidth / 2, kHeight - 1)); | 494 EXPECT_EQ(SK_ColorBLACK, bitmap.getColor(kWidth / 2, kHeight - 1)); |
504 } | 495 } |
505 | 496 |
506 TEST_F(SkCanvasVideoRendererTest, HighBits) { | 497 TEST_F(SkCanvasVideoRendererTest, HighBits) { |
507 // Copy cropped_frame into a highbit frame. | 498 // Copy cropped_frame into a highbit frame. |
508 scoped_refptr<VideoFrame> frame(VideoFrame::CreateFrame( | 499 scoped_refptr<VideoFrame> frame(VideoFrame::CreateFrame( |
509 PIXEL_FORMAT_YUV420P10, cropped_frame()->coded_size(), | 500 PIXEL_FORMAT_YUV420P10, cropped_frame()->coded_size(), |
510 cropped_frame()->visible_rect(), cropped_frame()->natural_size(), | 501 cropped_frame()->visible_rect(), cropped_frame()->natural_size(), |
511 cropped_frame()->timestamp())); | 502 cropped_frame()->timestamp())); |
512 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane; ++plane) { | 503 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane; ++plane) { |
513 int width = cropped_frame()->row_bytes(plane); | 504 int width = cropped_frame()->row_bytes(plane); |
514 uint16_t* dst = reinterpret_cast<uint16_t*>(frame->data(plane)); | 505 uint16_t* dst = reinterpret_cast<uint16_t*>(frame->data(plane)); |
515 uint8_t* src = cropped_frame()->data(plane); | 506 uint8_t* src = cropped_frame()->data(plane); |
516 for (int row = 0; row < cropped_frame()->rows(plane); row++) { | 507 for (int row = 0; row < cropped_frame()->rows(plane); row++) { |
517 for (int col = 0; col < width; col++) { | 508 for (int col = 0; col < width; col++) { |
518 dst[col] = src[col] << 2; | 509 dst[col] = src[col] << 2; |
519 } | 510 } |
520 src += cropped_frame()->stride(plane); | 511 src += cropped_frame()->stride(plane); |
521 dst += frame->stride(plane) / 2; | 512 dst += frame->stride(plane) / 2; |
522 } | 513 } |
523 } | 514 } |
524 | 515 |
525 Paint(frame, target_canvas(), kNone); | 516 Paint(frame, target_canvas(), kNone); |
526 // Check the corners. | 517 // Check the corners. |
527 EXPECT_EQ(SK_ColorBLACK, GetColorAt(target_canvas(), 0, 0)); | 518 EXPECT_EQ(SK_ColorBLACK, bitmap()->getColor(0, 0)); |
528 EXPECT_EQ(SK_ColorRED, GetColorAt(target_canvas(), kWidth - 1, 0)); | 519 EXPECT_EQ(SK_ColorRED, bitmap()->getColor(kWidth - 1, 0)); |
529 EXPECT_EQ(SK_ColorGREEN, GetColorAt(target_canvas(), 0, kHeight - 1)); | 520 EXPECT_EQ(SK_ColorGREEN, bitmap()->getColor(0, kHeight - 1)); |
530 EXPECT_EQ(SK_ColorBLUE, GetColorAt(target_canvas(), kWidth - 1, kHeight - 1)); | 521 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(kWidth - 1, kHeight - 1)); |
531 // Check the interior along the border between color regions. Note that we're | 522 // Check the interior along the border between color regions. Note that we're |
532 // bilinearly upscaling, so we'll need to take care to pick sample points that | 523 // bilinearly upscaling, so we'll need to take care to pick sample points that |
533 // are just outside the "zone of resampling". | 524 // are just outside the "zone of resampling". |
534 EXPECT_EQ(SK_ColorBLACK, GetColorAt(target_canvas(), kWidth * 1 / 8 - 1, | 525 EXPECT_EQ(SK_ColorBLACK, |
535 kHeight * 1 / 6 - 1)); | 526 bitmap()->getColor(kWidth * 1 / 8 - 1, kHeight * 1 / 6 - 1)); |
536 EXPECT_EQ(SK_ColorRED, | 527 EXPECT_EQ(SK_ColorRED, |
537 GetColorAt(target_canvas(), kWidth * 3 / 8, kHeight * 1 / 6 - 1)); | 528 bitmap()->getColor(kWidth * 3 / 8, kHeight * 1 / 6 - 1)); |
538 EXPECT_EQ(SK_ColorGREEN, | 529 EXPECT_EQ(SK_ColorGREEN, |
539 GetColorAt(target_canvas(), kWidth * 1 / 8 - 1, kHeight * 3 / 6)); | 530 bitmap()->getColor(kWidth * 1 / 8 - 1, kHeight * 3 / 6)); |
540 EXPECT_EQ(SK_ColorBLUE, | 531 EXPECT_EQ(SK_ColorBLUE, bitmap()->getColor(kWidth * 3 / 8, kHeight * 3 / 6)); |
541 GetColorAt(target_canvas(), kWidth * 3 / 8, kHeight * 3 / 6)); | |
542 } | 532 } |
543 | 533 |
544 TEST_F(SkCanvasVideoRendererTest, Y16) { | 534 TEST_F(SkCanvasVideoRendererTest, Y16) { |
545 SkBitmap bitmap; | 535 SkBitmap bitmap; |
546 bitmap.allocPixels(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType)); | 536 bitmap.allocPixels(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType)); |
547 | 537 |
548 // |offset_x| and |offset_y| define visible rect's offset to coded rect. | 538 // |offset_x| and |offset_y| define visible rect's offset to coded rect. |
549 const int offset_x = 3; | 539 const int offset_x = 3; |
550 const int offset_y = 5; | 540 const int offset_y = 5; |
551 const int stride = bitmap.width() + offset_x; | 541 const int stride = bitmap.width() + offset_x; |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 EXPECT_EQ(expected_value, data[(i + j * width)]); | 793 EXPECT_EQ(expected_value, data[(i + j * width)]); |
804 } | 794 } |
805 } | 795 } |
806 }); | 796 }); |
807 SkCanvasVideoRenderer::TexSubImage2D(GL_TEXTURE_2D, &gles2, video_frame.get(), | 797 SkCanvasVideoRenderer::TexSubImage2D(GL_TEXTURE_2D, &gles2, video_frame.get(), |
808 0, GL_RED, GL_FLOAT, 2 /*xoffset*/, | 798 0, GL_RED, GL_FLOAT, 2 /*xoffset*/, |
809 1 /*yoffset*/, false /*flip_y*/, true); | 799 1 /*yoffset*/, false /*flip_y*/, true); |
810 } | 800 } |
811 | 801 |
812 } // namespace media | 802 } // namespace media |
OLD | NEW |