Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: media/video/gpu_memory_buffer_video_frame_pool.cc

Issue 1869303004: media: Implement zero-copy video playback for VP8. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: optimize only VP8 Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/renderers/default_renderer_factory.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/renderers/default_renderer_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698