OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "media/video/gpu_memory_buffer_video_frame_pool.h" | 5 #include "media/video/gpu_memory_buffer_video_frame_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <list> | 8 #include <list> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/trace_event/memory_dump_provider.h" | 12 #include "base/trace_event/memory_dump_provider.h" |
13 #include "gpu/GLES2/gl2extchromium.h" | 13 #include "gpu/GLES2/gl2extchromium.h" |
14 #include "media/base/bind_to_current_loop.h" | 14 #include "media/base/bind_to_current_loop.h" |
15 #include "media/renderers/gpu_video_accelerator_factories.h" | 15 #include "media/renderers/gpu_video_accelerator_factories.h" |
16 #include "ui/gfx/buffer_format_util.h" | 16 #include "ui/gfx/buffer_format_util.h" |
17 | 17 |
18 namespace media { | 18 namespace media { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 // Return the GpuMemoryBuffer format to use for a specific VideoPixelFormat | 22 // Return the GpuMemoryBuffer format to use for a specific VideoPixelFormat |
23 // and plane. | 23 // and plane. |
24 gfx::BufferFormat GpuMemoryBufferFormat(VideoPixelFormat format, size_t plane) { | 24 gfx::BufferFormat GpuMemoryBufferFormat(VideoPixelFormat format, size_t plane) { |
25 switch (format) { | 25 switch (format) { |
26 case PIXEL_FORMAT_I420: | 26 case PIXEL_FORMAT_I420: |
27 case PIXEL_FORMAT_YV12: | 27 case PIXEL_FORMAT_YV12: |
28 DCHECK_LE(plane, 2u); | 28 DCHECK_LE(plane, 2u); |
29 return gfx::BufferFormat::R_8; | 29 return gfx::BufferFormat::R_8; |
| 30 case PIXEL_FORMAT_YV12A: |
| 31 DCHECK_LE(plane, 3u); |
| 32 return gfx::BufferFormat::R_8; |
30 case PIXEL_FORMAT_NV12: | 33 case PIXEL_FORMAT_NV12: |
31 DCHECK_LE(plane, 1u); | 34 DCHECK_LE(plane, 1u); |
32 return gfx::BufferFormat::YUV_420_BIPLANAR; | 35 return gfx::BufferFormat::YUV_420_BIPLANAR; |
33 case PIXEL_FORMAT_UYVY: | 36 case PIXEL_FORMAT_UYVY: |
34 DCHECK_EQ(0u, plane); | 37 DCHECK_EQ(0u, plane); |
35 return gfx::BufferFormat::UYVY_422; | 38 return gfx::BufferFormat::UYVY_422; |
36 default: | 39 default: |
37 NOTREACHED(); | 40 NOTREACHED(); |
38 return gfx::BufferFormat::BGRA_8888; | 41 return gfx::BufferFormat::BGRA_8888; |
39 } | 42 } |
40 } | 43 } |
41 | 44 |
42 unsigned ImageInternalFormat(VideoPixelFormat format, size_t plane) { | 45 unsigned ImageInternalFormat(VideoPixelFormat format, size_t plane) { |
43 switch (format) { | 46 switch (format) { |
44 case PIXEL_FORMAT_I420: | 47 case PIXEL_FORMAT_I420: |
45 case PIXEL_FORMAT_YV12: | 48 case PIXEL_FORMAT_YV12: |
46 DCHECK_LE(plane, 2u); | 49 DCHECK_LE(plane, 2u); |
47 return GL_RED_EXT; | 50 return GL_RED_EXT; |
| 51 case PIXEL_FORMAT_YV12A: |
| 52 DCHECK_LE(plane, 3u); |
| 53 return GL_RED_EXT; |
48 case PIXEL_FORMAT_NV12: | 54 case PIXEL_FORMAT_NV12: |
49 // TODO(dshwang): support ChromeOS using GL_RG_EXT. crbug.com/356871 | 55 // TODO(dshwang): support ChromeOS using GL_RG_EXT. crbug.com/356871 |
50 DCHECK_LE(plane, 1u); | 56 DCHECK_LE(plane, 1u); |
51 return GL_RGB_YCBCR_420V_CHROMIUM; | 57 return GL_RGB_YCBCR_420V_CHROMIUM; |
52 case PIXEL_FORMAT_UYVY: | 58 case PIXEL_FORMAT_UYVY: |
53 DCHECK_EQ(0u, plane); | 59 DCHECK_EQ(0u, plane); |
54 return GL_RGB_YCBCR_422_CHROMIUM; | 60 return GL_RGB_YCBCR_422_CHROMIUM; |
55 default: | 61 default: |
56 NOTREACHED(); | 62 NOTREACHED(); |
57 return 0; | 63 return 0; |
(...skipping 12 matching lines...) Expand all Loading... |
70 | 76 |
71 inline size_t RoundUp(size_t value, size_t alignment) { | 77 inline size_t RoundUp(size_t value, size_t alignment) { |
72 DCHECK(IsPowerOfTwo(alignment)); | 78 DCHECK(IsPowerOfTwo(alignment)); |
73 return ((value + (alignment - 1)) & ~(alignment - 1)); | 79 return ((value + (alignment - 1)) & ~(alignment - 1)); |
74 } | 80 } |
75 | 81 |
76 gfx::Size CodedSize(const gfx::Size& size, VideoPixelFormat format) { | 82 gfx::Size CodedSize(const gfx::Size& size, VideoPixelFormat format) { |
77 switch (format) { | 83 switch (format) { |
78 case PIXEL_FORMAT_I420: | 84 case PIXEL_FORMAT_I420: |
79 case PIXEL_FORMAT_YV12: | 85 case PIXEL_FORMAT_YV12: |
| 86 case PIXEL_FORMAT_YV12A: |
80 case PIXEL_FORMAT_NV12: | 87 case PIXEL_FORMAT_NV12: |
81 return gfx::Size(RoundUp(size.width(), 2), RoundUp(size.height(), 2)); | 88 return gfx::Size(RoundUp(size.width(), 2), RoundUp(size.height(), 2)); |
82 case PIXEL_FORMAT_UYVY: | 89 case PIXEL_FORMAT_UYVY: |
83 return gfx::Size(RoundUp(size.width(), 2), size.height()); | 90 return gfx::Size(RoundUp(size.width(), 2), size.height()); |
84 default: | 91 default: |
85 NOTREACHED(); | 92 NOTREACHED(); |
86 } | 93 } |
87 return gfx::Size(); | 94 return gfx::Size(); |
88 } | 95 } |
89 | 96 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 // Create the VideoFrame backed by native textures. | 349 // Create the VideoFrame backed by native textures. |
343 switch (format) { | 350 switch (format) { |
344 case PIXEL_FORMAT_I420: | 351 case PIXEL_FORMAT_I420: |
345 case PIXEL_FORMAT_YV12: | 352 case PIXEL_FORMAT_YV12: |
346 released_video_frame_ = VideoFrame::WrapYUV420NativeTextures( | 353 released_video_frame_ = VideoFrame::WrapYUV420NativeTextures( |
347 mailbox_holders[VideoFrame::kYPlane], | 354 mailbox_holders[VideoFrame::kYPlane], |
348 mailbox_holders[VideoFrame::kUPlane], | 355 mailbox_holders[VideoFrame::kUPlane], |
349 mailbox_holders[VideoFrame::kVPlane], release_video_frame_callback, | 356 mailbox_holders[VideoFrame::kVPlane], release_video_frame_callback, |
350 coded_size, visible_rect_, natural_size_, timestamp_); | 357 coded_size, visible_rect_, natural_size_, timestamp_); |
351 break; | 358 break; |
| 359 case PIXEL_FORMAT_YV12A: |
| 360 released_video_frame_ = VideoFrame::WrapYV12ANativeTextures( |
| 361 mailbox_holders[VideoFrame::kYPlane], |
| 362 mailbox_holders[VideoFrame::kUPlane], |
| 363 mailbox_holders[VideoFrame::kVPlane], |
| 364 mailbox_holders[VideoFrame::kAPlane], release_video_frame_callback, |
| 365 coded_size, visible_rect_, natural_size_, timestamp_); |
| 366 break; |
352 case PIXEL_FORMAT_NV12: | 367 case PIXEL_FORMAT_NV12: |
353 case PIXEL_FORMAT_UYVY: | 368 case PIXEL_FORMAT_UYVY: |
354 released_video_frame_ = VideoFrame::WrapNativeTexture( | 369 released_video_frame_ = VideoFrame::WrapNativeTexture( |
355 format, mailbox_holders[VideoFrame::kYPlane], | 370 format, mailbox_holders[VideoFrame::kYPlane], |
356 release_video_frame_callback, coded_size, visible_rect_, | 371 release_video_frame_callback, coded_size, visible_rect_, |
357 natural_size_, timestamp_); | 372 natural_size_, timestamp_); |
358 released_video_frame_->metadata()->SetBoolean( | 373 released_video_frame_->metadata()->SetBoolean( |
359 VideoFrameMetadata::ALLOW_OVERLAY, true); | 374 VideoFrameMetadata::ALLOW_OVERLAY, true); |
360 break; | 375 break; |
361 default: | 376 default: |
(...skipping 15 matching lines...) Expand all Loading... |
377 const gpu::SyncToken& release_sync_token) { | 392 const gpu::SyncToken& release_sync_token) { |
378 frame_resources_return_cb.Run(frame_resources, release_sync_token); | 393 frame_resources_return_cb.Run(frame_resources, release_sync_token); |
379 } | 394 } |
380 | 395 |
381 uint8_t* data(size_t plane) const override { | 396 uint8_t* data(size_t plane) const override { |
382 DCHECK(!released_video_frame_); | 397 DCHECK(!released_video_frame_); |
383 DCHECK(IsValidPlane(plane, frame_resources_->format())); | 398 DCHECK(IsValidPlane(plane, frame_resources_->format())); |
384 switch (frame_resources_->format()) { | 399 switch (frame_resources_->format()) { |
385 case PIXEL_FORMAT_I420: | 400 case PIXEL_FORMAT_I420: |
386 case PIXEL_FORMAT_YV12: | 401 case PIXEL_FORMAT_YV12: |
| 402 case PIXEL_FORMAT_YV12A: |
387 case PIXEL_FORMAT_UYVY: | 403 case PIXEL_FORMAT_UYVY: |
388 return static_cast<uint8_t*>( | 404 return static_cast<uint8_t*>( |
389 frame_resources_->GetPlaneResource(plane).gpu_memory_buffer->memory( | 405 frame_resources_->GetPlaneResource(plane).gpu_memory_buffer->memory( |
390 0)); | 406 0)); |
391 case PIXEL_FORMAT_NV12: | 407 case PIXEL_FORMAT_NV12: |
392 return static_cast<uint8_t*>( | 408 return static_cast<uint8_t*>( |
393 frame_resources_->GetPlaneResource(0).gpu_memory_buffer->memory( | 409 frame_resources_->GetPlaneResource(0).gpu_memory_buffer->memory( |
394 plane)); | 410 plane)); |
395 default: | 411 default: |
396 NOTREACHED(); | 412 NOTREACHED(); |
397 return 0; | 413 return 0; |
398 } | 414 } |
399 } | 415 } |
400 | 416 |
401 int stride(size_t plane) const override { | 417 int stride(size_t plane) const override { |
402 DCHECK(!released_video_frame_); | 418 DCHECK(!released_video_frame_); |
403 DCHECK(IsValidPlane(plane, frame_resources_->format())); | 419 DCHECK(IsValidPlane(plane, frame_resources_->format())); |
404 switch (frame_resources_->format()) { | 420 switch (frame_resources_->format()) { |
405 case PIXEL_FORMAT_I420: | 421 case PIXEL_FORMAT_I420: |
406 case PIXEL_FORMAT_YV12: | 422 case PIXEL_FORMAT_YV12: |
| 423 case PIXEL_FORMAT_YV12A: |
407 case PIXEL_FORMAT_UYVY: | 424 case PIXEL_FORMAT_UYVY: |
408 return frame_resources_->GetPlaneResource(plane) | 425 return frame_resources_->GetPlaneResource(plane) |
409 .gpu_memory_buffer->stride(0); | 426 .gpu_memory_buffer->stride(0); |
410 case PIXEL_FORMAT_NV12: | 427 case PIXEL_FORMAT_NV12: |
411 return frame_resources_->GetPlaneResource(0).gpu_memory_buffer->stride( | 428 return frame_resources_->GetPlaneResource(0).gpu_memory_buffer->stride( |
412 plane); | 429 plane); |
413 default: | 430 default: |
414 NOTREACHED(); | 431 NOTREACHED(); |
415 return 0; | 432 return 0; |
416 } | 433 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 FrameResources::Create(gpu_factories_, format, size); | 577 FrameResources::Create(gpu_factories_, format, size); |
561 resources_pool_.push_back(frame_resources); | 578 resources_pool_.push_back(frame_resources); |
562 return frame_resources; | 579 return frame_resources; |
563 } | 580 } |
564 | 581 |
565 static bool IsSupported(VideoPixelFormat format) { | 582 static bool IsSupported(VideoPixelFormat format) { |
566 switch (format) { | 583 switch (format) { |
567 // TODO(dshwang): support more format. crbug.com/356871 | 584 // TODO(dshwang): support more format. crbug.com/356871 |
568 case PIXEL_FORMAT_I420: | 585 case PIXEL_FORMAT_I420: |
569 case PIXEL_FORMAT_YV12: | 586 case PIXEL_FORMAT_YV12: |
| 587 case PIXEL_FORMAT_YV12A: |
570 case PIXEL_FORMAT_NV12: | 588 case PIXEL_FORMAT_NV12: |
571 case PIXEL_FORMAT_UYVY: | 589 case PIXEL_FORMAT_UYVY: |
572 return true; | 590 return true; |
573 default: | 591 default: |
574 return false; | 592 return false; |
575 } | 593 } |
576 } | 594 } |
577 | 595 |
578 // Task runner associated to the GL context provided by |gpu_factories_|. | 596 // Task runner associated to the GL context provided by |gpu_factories_|. |
579 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; | 597 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; |
(...skipping 26 matching lines...) Expand all Loading... |
606 } | 624 } |
607 | 625 |
608 // static | 626 // static |
609 size_t GpuMemoryBufferVideoFramePool::PlanesPerCopy(VideoPixelFormat format, | 627 size_t GpuMemoryBufferVideoFramePool::PlanesPerCopy(VideoPixelFormat format, |
610 size_t plane) { | 628 size_t plane) { |
611 return gfx::NumberOfPlanesForBufferFormat( | 629 return gfx::NumberOfPlanesForBufferFormat( |
612 GpuMemoryBufferFormat(format, plane)); | 630 GpuMemoryBufferFormat(format, plane)); |
613 } | 631 } |
614 | 632 |
615 } // namespace media | 633 } // namespace media |
OLD | NEW |