Commit c60ad96f authored by Hirokazu Honda's avatar Hirokazu Honda Committed by Commit Bot

GpuVAFactories: Initialize VEA supported profiles by cached info of GpuInfo

crrev.com/c/2035481 delays filling VEA supported profiles in
GpuVideoAcceleratorFactoriesImpl because it queries GPU process
the supported profiles, instead of referring cached info of
GpuInfo instance.

If getVEASupportedProfiles() is called in flight, the function
reports as if the HW encoders support no profile. The issue due
to this timing problem happens in fact on some CrOS devices.

This CL mitigates the timing issue by setting the initialized
VEA supported profiles to ones based on cached info of GpuInfo
instance.

Besides, this clarifies a caller of getVEASupportedProfiles()
that the function returns nullopt if the factory hasn't got
the results from GPU process.

Bug: b:147404923
Test: webrtc.RTCPeerConnection.* on soraka and kukui
Change-Id: Ie6867cb6f79934f66cf8550e2d41ec54671a5487
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2035461
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: default avatarDan Sanders <sandersd@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742619}
parent 7938829e
...@@ -164,7 +164,7 @@ BrowserGpuVideoAcceleratorFactories::GetTaskRunner() { ...@@ -164,7 +164,7 @@ BrowserGpuVideoAcceleratorFactories::GetTaskRunner() {
return nullptr; return nullptr;
} }
media::VideoEncodeAccelerator::SupportedProfiles base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
BrowserGpuVideoAcceleratorFactories:: BrowserGpuVideoAcceleratorFactories::
GetVideoEncodeAcceleratorSupportedProfiles() { GetVideoEncodeAcceleratorSupportedProfiles() {
return media::VideoEncodeAccelerator::SupportedProfiles(); return media::VideoEncodeAccelerator::SupportedProfiles();
......
...@@ -50,7 +50,7 @@ class BrowserGpuVideoAcceleratorFactories ...@@ -50,7 +50,7 @@ class BrowserGpuVideoAcceleratorFactories
gpu::GpuMemoryBufferManager* GpuMemoryBufferManager() override; gpu::GpuMemoryBufferManager* GpuMemoryBufferManager() override;
base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override; base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override;
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override; scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
media::VideoEncodeAccelerator::SupportedProfiles base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override; GetVideoEncodeAcceleratorSupportedProfiles() override;
scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override; scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override;
void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override; void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override;
......
...@@ -44,7 +44,8 @@ GetSupportedVideoEncodeAcceleratorProfiles() { ...@@ -44,7 +44,8 @@ GetSupportedVideoEncodeAcceleratorProfiles() {
RenderThreadImpl::current()->GetGpuFactories(); RenderThreadImpl::current()->GetGpuFactories();
if (!gpu_factories || !gpu_factories->IsGpuVideoAcceleratorEnabled()) if (!gpu_factories || !gpu_factories->IsGpuVideoAcceleratorEnabled())
return media::VideoEncodeAccelerator::SupportedProfiles(); return media::VideoEncodeAccelerator::SupportedProfiles();
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles(); return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
#endif // defined(OS_ANDROID) #endif // defined(OS_ANDROID)
} }
......
...@@ -130,10 +130,21 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner( ...@@ -130,10 +130,21 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner(
context_provider_->AddObserver(this); context_provider_->AddObserver(this);
vea_provider_->GetVideoEncodeAcceleratorSupportedProfiles( if (video_accelerator_enabled_) {
base::BindOnce(&GpuVideoAcceleratorFactoriesImpl:: {
OnGetVideoEncodeAcceleratorSupportedProfiles, // TODO(crbug.com/709631): This should be removed.
base::Unretained(this))); base::AutoLock lock(supported_profiles_lock_);
supported_vea_profiles_ =
media::GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles(
gpu_channel_host_->gpu_info()
.video_encode_accelerator_supported_profiles);
}
vea_provider_->GetVideoEncodeAcceleratorSupportedProfiles(
base::BindOnce(&GpuVideoAcceleratorFactoriesImpl::
OnGetVideoEncodeAcceleratorSupportedProfiles,
base::Unretained(this)));
}
#if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER) #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
// Note: This is a bit of a hack, since we don't specify the implementation // Note: This is a bit of a hack, since we don't specify the implementation
...@@ -408,11 +419,10 @@ GpuVideoAcceleratorFactoriesImpl::GetTaskRunner() { ...@@ -408,11 +419,10 @@ GpuVideoAcceleratorFactoriesImpl::GetTaskRunner() {
return task_runner_; return task_runner_;
} }
media::VideoEncodeAccelerator::SupportedProfiles base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GpuVideoAcceleratorFactoriesImpl::GetVideoEncodeAcceleratorSupportedProfiles() { GpuVideoAcceleratorFactoriesImpl::GetVideoEncodeAcceleratorSupportedProfiles() {
base::AutoLock lock(supported_profiles_lock_); base::AutoLock lock(supported_profiles_lock_);
return supported_vea_profiles_.value_or( return supported_vea_profiles_;
media::VideoEncodeAccelerator::SupportedProfiles());
} }
scoped_refptr<viz::ContextProvider> scoped_refptr<viz::ContextProvider>
......
...@@ -113,7 +113,7 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl ...@@ -113,7 +113,7 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override; base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override;
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override; scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
media::VideoEncodeAccelerator::SupportedProfiles base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override; GetVideoEncodeAcceleratorSupportedProfiles() override;
scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override; scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/unsafe_shared_memory_region.h" #include "base/memory/unsafe_shared_memory_region.h"
#include "base/optional.h"
#include "base/unguessable_token.h" #include "base/unguessable_token.h"
#include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/mailbox.h"
...@@ -140,7 +141,9 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories { ...@@ -140,7 +141,9 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories {
virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() = 0; virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() = 0;
// Returns the supported codec profiles of video encode accelerator. // Returns the supported codec profiles of video encode accelerator.
virtual VideoEncodeAccelerator::SupportedProfiles // Returns nullopt if GpuVideoAcceleratorFactories don't know the VEA
// supported profiles.
virtual base::Optional<VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() = 0; GetVideoEncodeAcceleratorSupportedProfiles() = 0;
virtual scoped_refptr<viz::ContextProvider> GetMediaContextProvider() = 0; virtual scoped_refptr<viz::ContextProvider> GetMediaContextProvider() = 0;
......
...@@ -45,8 +45,6 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { ...@@ -45,8 +45,6 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
MOCK_METHOD0(DoCreateVideoEncodeAccelerator, VideoEncodeAccelerator*()); MOCK_METHOD0(DoCreateVideoEncodeAccelerator, VideoEncodeAccelerator*());
MOCK_METHOD0(GetTaskRunner, scoped_refptr<base::SingleThreadTaskRunner>()); MOCK_METHOD0(GetTaskRunner, scoped_refptr<base::SingleThreadTaskRunner>());
MOCK_METHOD0(GetVideoEncodeAcceleratorSupportedProfiles,
VideoEncodeAccelerator::SupportedProfiles());
MOCK_METHOD0(GetMediaContextProvider, scoped_refptr<viz::ContextProvider>()); MOCK_METHOD0(GetMediaContextProvider, scoped_refptr<viz::ContextProvider>());
MOCK_METHOD1(SetRenderingColorSpace, void(const gfx::ColorSpace&)); MOCK_METHOD1(SetRenderingColorSpace, void(const gfx::ColorSpace&));
...@@ -82,6 +80,10 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { ...@@ -82,6 +80,10 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
std::unique_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator() std::unique_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator()
override; override;
base::Optional<VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override {
return VideoEncodeAccelerator::SupportedProfiles();
}
const std::vector<gfx::GpuMemoryBuffer*>& created_memory_buffers() { const std::vector<gfx::GpuMemoryBuffer*>& created_memory_buffers() {
return created_memory_buffers_; return created_memory_buffers_;
......
...@@ -98,7 +98,8 @@ media::VideoEncodeAccelerator::SupportedProfiles GetVEASupportedProfiles() { ...@@ -98,7 +98,8 @@ media::VideoEncodeAccelerator::SupportedProfiles GetVEASupportedProfiles() {
DVLOG(2) << "Couldn't initialize GpuVideoAcceleratorFactories"; DVLOG(2) << "Couldn't initialize GpuVideoAcceleratorFactories";
return media::VideoEncodeAccelerator::SupportedProfiles(); return media::VideoEncodeAccelerator::SupportedProfiles();
} }
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles(); return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
} }
VideoTrackRecorderImpl::CodecEnumerator* GetCodecEnumerator() { VideoTrackRecorderImpl::CodecEnumerator* GetCodecEnumerator() {
......
...@@ -416,7 +416,9 @@ void RTCVideoEncoder::Impl::CreateAndInitializeVEA( ...@@ -416,7 +416,9 @@ void RTCVideoEncoder::Impl::CreateAndInitializeVEA(
// Check that |profile| supports |input_visible_size|. // Check that |profile| supports |input_visible_size|.
if (base::FeatureList::IsEnabled(features::kWebRtcUseMinMaxVEADimensions)) { if (base::FeatureList::IsEnabled(features::kWebRtcUseMinMaxVEADimensions)) {
const auto vea_supported_profiles = const auto vea_supported_profiles =
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles(); gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
for (const auto vea_profile : vea_supported_profiles) { for (const auto vea_profile : vea_supported_profiles) {
if (vea_profile.profile == profile && if (vea_profile.profile == profile &&
(input_visible_size.width() > vea_profile.max_resolution.width() || (input_visible_size.width() > vea_profile.max_resolution.width() ||
......
...@@ -106,9 +106,10 @@ bool IsSameFormat(const webrtc::SdpVideoFormat& format1, ...@@ -106,9 +106,10 @@ bool IsSameFormat(const webrtc::SdpVideoFormat& format1,
RTCVideoEncoderFactory::RTCVideoEncoderFactory( RTCVideoEncoderFactory::RTCVideoEncoderFactory(
media::GpuVideoAcceleratorFactories* gpu_factories) media::GpuVideoAcceleratorFactories* gpu_factories)
: gpu_factories_(gpu_factories) { : gpu_factories_(gpu_factories) {
const media::VideoEncodeAccelerator::SupportedProfiles& profiles = auto profiles = gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles(); if (!profiles)
for (const auto& profile : profiles) { return;
for (const auto& profile : *profiles) {
base::Optional<webrtc::SdpVideoFormat> format = VEAToWebRTCFormat(profile); base::Optional<webrtc::SdpVideoFormat> format = VEAToWebRTCFormat(profile);
if (format) { if (format) {
supported_formats_.push_back(std::move(*format)); supported_formats_.push_back(std::move(*format));
......
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