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() {
return nullptr;
}
media::VideoEncodeAccelerator::SupportedProfiles
base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
BrowserGpuVideoAcceleratorFactories::
GetVideoEncodeAcceleratorSupportedProfiles() {
return media::VideoEncodeAccelerator::SupportedProfiles();
......
......@@ -50,7 +50,7 @@ class BrowserGpuVideoAcceleratorFactories
gpu::GpuMemoryBufferManager* GpuMemoryBufferManager() override;
base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override;
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
media::VideoEncodeAccelerator::SupportedProfiles
base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override;
scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override;
void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override;
......
......@@ -44,7 +44,8 @@ GetSupportedVideoEncodeAcceleratorProfiles() {
RenderThreadImpl::current()->GetGpuFactories();
if (!gpu_factories || !gpu_factories->IsGpuVideoAcceleratorEnabled())
return media::VideoEncodeAccelerator::SupportedProfiles();
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles();
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
#endif // defined(OS_ANDROID)
}
......
......@@ -130,10 +130,21 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner(
context_provider_->AddObserver(this);
if (video_accelerator_enabled_) {
{
// TODO(crbug.com/709631): This should be removed.
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)
// Note: This is a bit of a hack, since we don't specify the implementation
......@@ -408,11 +419,10 @@ GpuVideoAcceleratorFactoriesImpl::GetTaskRunner() {
return task_runner_;
}
media::VideoEncodeAccelerator::SupportedProfiles
base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GpuVideoAcceleratorFactoriesImpl::GetVideoEncodeAcceleratorSupportedProfiles() {
base::AutoLock lock(supported_profiles_lock_);
return supported_vea_profiles_.value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
return supported_vea_profiles_;
}
scoped_refptr<viz::ContextProvider>
......
......@@ -113,7 +113,7 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override;
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
media::VideoEncodeAccelerator::SupportedProfiles
base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override;
scoped_refptr<viz::ContextProvider> GetMediaContextProvider() override;
......
......@@ -14,6 +14,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/optional.h"
#include "base/unguessable_token.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/mailbox.h"
......@@ -140,7 +141,9 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories {
virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() = 0;
// 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;
virtual scoped_refptr<viz::ContextProvider> GetMediaContextProvider() = 0;
......
......@@ -45,8 +45,6 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
MOCK_METHOD0(DoCreateVideoEncodeAccelerator, VideoEncodeAccelerator*());
MOCK_METHOD0(GetTaskRunner, scoped_refptr<base::SingleThreadTaskRunner>());
MOCK_METHOD0(GetVideoEncodeAcceleratorSupportedProfiles,
VideoEncodeAccelerator::SupportedProfiles());
MOCK_METHOD0(GetMediaContextProvider, scoped_refptr<viz::ContextProvider>());
MOCK_METHOD1(SetRenderingColorSpace, void(const gfx::ColorSpace&));
......@@ -82,6 +80,10 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
std::unique_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator()
override;
base::Optional<VideoEncodeAccelerator::SupportedProfiles>
GetVideoEncodeAcceleratorSupportedProfiles() override {
return VideoEncodeAccelerator::SupportedProfiles();
}
const std::vector<gfx::GpuMemoryBuffer*>& created_memory_buffers() {
return created_memory_buffers_;
......
......@@ -98,7 +98,8 @@ media::VideoEncodeAccelerator::SupportedProfiles GetVEASupportedProfiles() {
DVLOG(2) << "Couldn't initialize GpuVideoAcceleratorFactories";
return media::VideoEncodeAccelerator::SupportedProfiles();
}
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles();
return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
}
VideoTrackRecorderImpl::CodecEnumerator* GetCodecEnumerator() {
......
......@@ -416,7 +416,9 @@ void RTCVideoEncoder::Impl::CreateAndInitializeVEA(
// Check that |profile| supports |input_visible_size|.
if (base::FeatureList::IsEnabled(features::kWebRtcUseMinMaxVEADimensions)) {
const auto vea_supported_profiles =
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
media::VideoEncodeAccelerator::SupportedProfiles());
for (const auto vea_profile : vea_supported_profiles) {
if (vea_profile.profile == profile &&
(input_visible_size.width() > vea_profile.max_resolution.width() ||
......
......@@ -106,9 +106,10 @@ bool IsSameFormat(const webrtc::SdpVideoFormat& format1,
RTCVideoEncoderFactory::RTCVideoEncoderFactory(
media::GpuVideoAcceleratorFactories* gpu_factories)
: gpu_factories_(gpu_factories) {
const media::VideoEncodeAccelerator::SupportedProfiles& profiles =
gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
for (const auto& profile : profiles) {
auto profiles = gpu_factories_->GetVideoEncodeAcceleratorSupportedProfiles();
if (!profiles)
return;
for (const auto& profile : *profiles) {
base::Optional<webrtc::SdpVideoFormat> format = VEAToWebRTCFormat(profile);
if (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