Commit 7e687bc0 authored by Ricky Liang's avatar Ricky Liang Committed by Commit Bot

Add switch for enabling GpuMemoryBuffer-based video capture buffer

This CL adds a switch to selectively enable GpuMemoryBuffer-based video
capture buffer. Devices supporting GMB-based video capture buffers can
achieve zero-copy for camera preview and reduce the power consumption on
various use cases significantly.

Design doc: go/cros-camera:dd:zero-copy

      /etc/chrome_dev.conf on Nocturne, and verify everything works.

Bug: 982201
Test: Manually add "--video-capture-use-gpu-memory-buffer" into
Change-Id: I178e00b0400e01f32ff8605de60c6dc2364dd384
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1692155Reviewed-by: default avatarAchuith Bhandarkar <achuith@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Reviewed-by: default avatarChristian Fremerey <chfremer@chromium.org>
Reviewed-by: default avatarDan Sanders <sandersd@chromium.org>
Commit-Queue: Ricky Liang <jcliang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#698872}
parent cf88a217
...@@ -151,6 +151,7 @@ void DeriveCommandLine(const GURL& start_url, ...@@ -151,6 +151,7 @@ void DeriveCommandLine(const GURL& start_url,
::switches::kUserDataDir, ::switches::kUserDataDir,
::switches::kV, ::switches::kV,
::switches::kVModule, ::switches::kVModule,
::switches::kVideoCaptureUseGpuMemoryBuffer,
::switches::kEnableWebGLDraftExtensions, ::switches::kEnableWebGLDraftExtensions,
::switches::kDisableWebGLImageChromium, ::switches::kDisableWebGLImageChromium,
::switches::kEnableWebGLImageChromium, ::switches::kEnableWebGLImageChromium,
......
...@@ -8,10 +8,12 @@ ...@@ -8,10 +8,12 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "content/browser/renderer_host/media/service_launched_video_capture_device.h" #include "content/browser/renderer_host/media/service_launched_video_capture_device.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "media/base/media_switches.h"
#include "media/capture/video/video_capture_device.h" #include "media/capture/video/video_capture_device.h"
#include "media/capture/video/video_frame_receiver_on_task_runner.h" #include "media/capture/video/video_frame_receiver_on_task_runner.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
...@@ -136,6 +138,17 @@ void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAsync( ...@@ -136,6 +138,17 @@ void ServiceVideoCaptureDeviceLauncher::LaunchDeviceAsync(
new_params.power_line_frequency = new_params.power_line_frequency =
media::VideoCaptureDevice::GetPowerLineFrequency(params); media::VideoCaptureDevice::GetPowerLineFrequency(params);
// GpuMemoryBuffer-based VideoCapture buffer works only on the Chrome OS
// VideoCaptureDevice implementation. It's not supported by
// FakeVideoCaptureDevice.
// TODO: Support GpuMemoryBuffer in FakeVideoCaptureDevice (crbug.com/1006613)
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kVideoCaptureUseGpuMemoryBuffer) &&
!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUseFakeDeviceForMediaStream)) {
new_params.buffer_type = media::VideoCaptureBufferType::kGpuMemoryBuffer;
}
// Note that we set |force_reopen_with_new_settings| to true in order // Note that we set |force_reopen_with_new_settings| to true in order
// to avoid the situation that a requests to open (or reopen) a device // to avoid the situation that a requests to open (or reopen) a device
// that has just been closed with different settings ends up getting the old // that has just been closed with different settings ends up getting the old
......
...@@ -167,6 +167,10 @@ const char kOverrideEnabledCdmInterfaceVersion[] = ...@@ -167,6 +167,10 @@ const char kOverrideEnabledCdmInterfaceVersion[] =
const char kOverrideHardwareSecureCodecsForTesting[] = const char kOverrideHardwareSecureCodecsForTesting[] =
"override-hardware-secure-codecs-for-testing"; "override-hardware-secure-codecs-for-testing";
// Enables GpuMemoryBuffer-based buffer pool.
const char kVideoCaptureUseGpuMemoryBuffer[] =
"video-capture-use-gpu-memory-buffer";
namespace autoplay { namespace autoplay {
// Autoplay policy that requires a document user activation. // Autoplay policy that requires a document user activation.
......
...@@ -78,6 +78,8 @@ MEDIA_EXPORT extern const char kClearKeyCdmPathForTesting[]; ...@@ -78,6 +78,8 @@ MEDIA_EXPORT extern const char kClearKeyCdmPathForTesting[];
MEDIA_EXPORT extern const char kOverrideEnabledCdmInterfaceVersion[]; MEDIA_EXPORT extern const char kOverrideEnabledCdmInterfaceVersion[];
MEDIA_EXPORT extern const char kOverrideHardwareSecureCodecsForTesting[]; MEDIA_EXPORT extern const char kOverrideHardwareSecureCodecsForTesting[];
MEDIA_EXPORT extern const char kVideoCaptureUseGpuMemoryBuffer[];
namespace autoplay { namespace autoplay {
MEDIA_EXPORT extern const char kDocumentUserActivationRequiredPolicy[]; MEDIA_EXPORT extern const char kDocumentUserActivationRequiredPolicy[];
......
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
#include "services/video_capture/device_media_to_mojo_adapter.h" #include "services/video_capture/device_media_to_mojo_adapter.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h"
#include "base/logging.h" #include "base/logging.h"
#include "media/base/bind_to_current_loop.h" #include "media/base/bind_to_current_loop.h"
#include "media/base/media_switches.h"
#include "media/capture/video/video_capture_buffer_pool_impl.h" #include "media/capture/video/video_capture_buffer_pool_impl.h"
#include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h"
#include "media/capture/video/video_frame_receiver_on_task_runner.h" #include "media/capture/video/video_frame_receiver_on_task_runner.h"
...@@ -74,6 +76,8 @@ void DeviceMediaToMojoAdapter::Start( ...@@ -74,6 +76,8 @@ void DeviceMediaToMojoAdapter::Start(
if (requested_settings.buffer_type != if (requested_settings.buffer_type !=
media::VideoCaptureBufferType::kSharedMemory && media::VideoCaptureBufferType::kSharedMemory &&
requested_settings.buffer_type !=
media::VideoCaptureBufferType::kGpuMemoryBuffer &&
requested_settings.buffer_type != requested_settings.buffer_type !=
media::VideoCaptureBufferType::kSharedMemoryViaRawFileDescriptor) { media::VideoCaptureBufferType::kSharedMemoryViaRawFileDescriptor) {
// Buffer types other than shared memory are not supported. // Buffer types other than shared memory are not supported.
...@@ -170,7 +174,18 @@ int DeviceMediaToMojoAdapter::max_buffer_pool_buffer_count() { ...@@ -170,7 +174,18 @@ int DeviceMediaToMojoAdapter::max_buffer_pool_buffer_count() {
// The maximum number of video frame buffers in-flight at any one time. // The maximum number of video frame buffers in-flight at any one time.
// If all buffers are still in use by consumers when new frames are produced // If all buffers are still in use by consumers when new frames are produced
// those frames get dropped. // those frames get dropped.
static const int kMaxBufferCount = 3; static int kMaxBufferCount = 3;
#if defined(OS_CHROMEOS)
// On Chrome OS with MIPI cameras running on HAL v3, there can be three
// concurrent streams of camera pipeline depth ~6. We allow at most 24 buffers
// here to take into account the delay caused by the consumer (e.g. display or
// video encoder).
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kVideoCaptureUseGpuMemoryBuffer)) {
kMaxBufferCount = 24;
}
#endif
return kMaxBufferCount; return kMaxBufferCount;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment