| 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 |