summaryrefslogtreecommitdiff
path: root/chromium/content/renderer/media
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/renderer/media')
-rw-r--r--chromium/content/renderer/media/android/media_player_renderer_client.cc6
-rw-r--r--chromium/content/renderer/media/android/media_player_renderer_client.h2
-rw-r--r--chromium/content/renderer/media/android/stream_texture_wrapper_impl.cc13
-rw-r--r--chromium/content/renderer/media/audio/audio_device_factory.cc11
-rw-r--r--chromium/content/renderer/media/audio/audio_renderer_mixer_manager.cc30
-rw-r--r--chromium/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc6
-rw-r--r--chromium/content/renderer/media/batching_media_log.cc3
-rw-r--r--chromium/content/renderer/media/batching_media_log_unittest.cc12
-rw-r--r--chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc76
-rw-r--r--chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h35
-rw-r--r--chromium/content/renderer/media/media_factory.cc92
-rw-r--r--chromium/content/renderer/media/media_factory.h12
-rw-r--r--chromium/content/renderer/media/renderer_webmediaplayer_delegate.cc5
-rw-r--r--chromium/content/renderer/media/renderer_webmediaplayer_delegate.h1
14 files changed, 221 insertions, 83 deletions
diff --git a/chromium/content/renderer/media/android/media_player_renderer_client.cc b/chromium/content/renderer/media/android/media_player_renderer_client.cc
index fc95fdf46cc..c5675501e37 100644
--- a/chromium/content/renderer/media/android/media_player_renderer_client.cc
+++ b/chromium/content/renderer/media/android/media_player_renderer_client.cc
@@ -67,12 +67,6 @@ void MediaPlayerRendererClient::Initialize(
weak_factory_.GetWeakPtr(), media_resource));
}
-void MediaPlayerRendererClient::SetCdm(media::CdmContext* cdm_context,
- media::CdmAttachedCB cdm_attached_cb) {
- // MediaPlayerRenderer does not support encrypted media.
- NOTREACHED();
-}
-
void MediaPlayerRendererClient::OnStreamTextureWrapperInitialized(
media::MediaResource* media_resource,
bool success) {
diff --git a/chromium/content/renderer/media/android/media_player_renderer_client.h b/chromium/content/renderer/media/android/media_player_renderer_client.h
index 19754f24de4..9bc67210d5e 100644
--- a/chromium/content/renderer/media/android/media_player_renderer_client.h
+++ b/chromium/content/renderer/media/android/media_player_renderer_client.h
@@ -61,8 +61,6 @@ class CONTENT_EXPORT MediaPlayerRendererClient
void Initialize(media::MediaResource* media_resource,
media::RendererClient* client,
media::PipelineStatusCallback init_cb) override;
- void SetCdm(media::CdmContext* cdm_context,
- media::CdmAttachedCB cdm_attached_cb) override;
// media::mojom::MediaPlayerRendererClientExtension implementation
void OnDurationChange(base::TimeDelta duration) override;
diff --git a/chromium/content/renderer/media/android/stream_texture_wrapper_impl.cc b/chromium/content/renderer/media/android/stream_texture_wrapper_impl.cc
index a02c70aac50..35119cfd491 100644
--- a/chromium/content/renderer/media/android/stream_texture_wrapper_impl.cc
+++ b/chromium/content/renderer/media/android/stream_texture_wrapper_impl.cc
@@ -7,9 +7,11 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/logging.h"
#include "cc/layers/video_frame_provider.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
+#include "gpu/command_buffer/common/shared_image_usage.h"
#include "media/base/bind_to_current_loop.h"
namespace {
@@ -62,6 +64,11 @@ void StreamTextureWrapperImpl::CreateVideoFrame(
gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = {
gpu::MailboxHolder(mailbox, gpu::SyncToken(), GL_TEXTURE_EXTERNAL_OES)};
+ gpu::SharedImageInterface* sii = factory_->SharedImageInterface();
+ sii->NotifyMailboxAdded(mailbox, gpu::SHARED_IMAGE_USAGE_DISPLAY |
+ gpu::SHARED_IMAGE_USAGE_GLES2 |
+ gpu::SHARED_IMAGE_USAGE_RASTER);
+
// The pixel format doesn't matter here as long as it's valid for texture
// frames. But SkiaRenderer wants to ensure that the format of the resource
// used here which will eventually create a promise image must match the
@@ -78,10 +85,8 @@ void StreamTextureWrapperImpl::CreateVideoFrame(
coded_size, visible_rect, visible_rect.size(), base::TimeDelta());
new_frame->set_ycbcr_info(ycbcr_info);
- if (enable_texture_copy_) {
- new_frame->metadata()->SetBoolean(media::VideoFrameMetadata::COPY_REQUIRED,
- true);
- }
+ if (enable_texture_copy_)
+ new_frame->metadata()->copy_required = true;
SetCurrentFrameInternal(new_frame);
}
diff --git a/chromium/content/renderer/media/audio/audio_device_factory.cc b/chromium/content/renderer/media/audio/audio_device_factory.cc
index 2a5d45c9e1f..39b0a2b400a 100644
--- a/chromium/content/renderer/media/audio/audio_device_factory.cc
+++ b/chromium/content/renderer/media/audio/audio_device_factory.cc
@@ -43,16 +43,16 @@ namespace {
// In this case we will time out, to avoid renderer hang forever waiting for
// device authorization (http://crbug/615589). This will result in "no audio".
// There are also cases when authorization takes too long on Mac and Linux.
-constexpr int64_t kMaxAuthorizationTimeoutMs = 10000;
+constexpr base::TimeDelta kMaxAuthorizationTimeout =
+ base::TimeDelta::FromSeconds(10);
#else
-constexpr int64_t kMaxAuthorizationTimeoutMs = 0; // No timeout.
+constexpr base::TimeDelta kMaxAuthorizationTimeout; // No timeout.
#endif
base::TimeDelta GetDefaultAuthTimeout() {
// Set authorization request timeout at 80% of renderer hung timeout,
// but no more than kMaxAuthorizationTimeout.
- return base::TimeDelta::FromMilliseconds(
- std::min(kHungRendererDelayMs * 8 / 10, kMaxAuthorizationTimeoutMs));
+ return std::min(kHungRendererDelay * 8 / 10, kMaxAuthorizationTimeout);
}
scoped_refptr<media::AudioOutputDevice> NewOutputDevice(
@@ -181,7 +181,8 @@ AudioDeviceFactory::NewAudioCapturerSource(
return base::MakeRefCounted<media::AudioInputDevice>(
AudioInputIPCFactory::get()->CreateAudioInputIPC(render_frame_id, params),
- media::AudioInputDevice::Purpose::kUserInput);
+ media::AudioInputDevice::Purpose::kUserInput,
+ media::AudioInputDevice::DeadStreamDetection::kEnabled);
}
// static
diff --git a/chromium/content/renderer/media/audio/audio_renderer_mixer_manager.cc b/chromium/content/renderer/media/audio/audio_renderer_mixer_manager.cc
index a5301686b4c..2518e7f289e 100644
--- a/chromium/content/renderer/media/audio/audio_renderer_mixer_manager.cc
+++ b/chromium/content/renderer/media/audio/audio_renderer_mixer_manager.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
@@ -98,30 +99,6 @@ media::AudioParameters GetMixerOutputParams(
return params;
}
-void LogMixerUmaHistogram(media::AudioLatency::LatencyType latency, int value) {
- switch (latency) {
- case media::AudioLatency::LATENCY_EXACT_MS:
- UMA_HISTOGRAM_CUSTOM_COUNTS(
- "Media.Audio.Render.AudioInputsPerMixer.LatencyExact", value, 1, 20,
- 21);
- return;
- case media::AudioLatency::LATENCY_INTERACTIVE:
- UMA_HISTOGRAM_CUSTOM_COUNTS(
- "Media.Audio.Render.AudioInputsPerMixer.LatencyInteractive", value, 1,
- 20, 21);
- return;
- case media::AudioLatency::LATENCY_RTC:
- UMA_HISTOGRAM_CUSTOM_COUNTS(
- "Media.Audio.Render.AudioInputsPerMixer.LatencyRtc", value, 1, 20,
- 21);
- return;
- case media::AudioLatency::LATENCY_PLAYBACK:
- return;
- default:
- NOTREACHED();
- }
-}
-
} // namespace
namespace content {
@@ -193,9 +170,8 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
const media::AudioParameters& mixer_output_params =
GetMixerOutputParams(input_params, sink_info.output_params(), latency);
- media::AudioRendererMixer* mixer = new media::AudioRendererMixer(
- mixer_output_params, std::move(sink),
- base::BindRepeating(&LogMixerUmaHistogram, latency));
+ media::AudioRendererMixer* mixer =
+ new media::AudioRendererMixer(mixer_output_params, std::move(sink));
mixers_[key] = {mixer, 1};
DVLOG(1) << __func__ << " mixer: " << mixer << " latency: " << latency
<< "\n input: " << input_params.AsHumanReadableString()
diff --git a/chromium/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc b/chromium/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc
index 02e2a9a54f2..3fa811c782a 100644
--- a/chromium/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc
+++ b/chromium/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc
@@ -34,10 +34,8 @@ class AudioRendererSinkCacheImpl::FrameObserver : public RenderFrameObserver {
private:
// content::RenderFrameObserver implementation:
- void DidCommitProvisionalLoad(bool is_same_document_navigation,
- ui::PageTransition transition) override {
- if (!is_same_document_navigation)
- DropFrameCache();
+ void DidCommitProvisionalLoad(ui::PageTransition transition) override {
+ DropFrameCache();
}
void OnDestruct() override {
diff --git a/chromium/content/renderer/media/batching_media_log.cc b/chromium/content/renderer/media/batching_media_log.cc
index a1a101687cc..76ebdf6f7a1 100644
--- a/chromium/content/renderer/media/batching_media_log.cc
+++ b/chromium/content/renderer/media/batching_media_log.cc
@@ -117,7 +117,8 @@ void BatchingMediaLog::AddLogRecordLocked(
case media::MediaLogRecord::Type::kMessage:
queued_media_events_.push_back(*event);
if (event->params.HasKey(media::MediaLogMessageLevelToString(
- media::MediaLogMessageLevel::kERROR))) {
+ media::MediaLogMessageLevel::kERROR)) &&
+ !cached_media_error_for_message_) {
cached_media_error_for_message_ = std::move(event);
}
break;
diff --git a/chromium/content/renderer/media/batching_media_log_unittest.cc b/chromium/content/renderer/media/batching_media_log_unittest.cc
index ccd285a3c04..feae6558a93 100644
--- a/chromium/content/renderer/media/batching_media_log_unittest.cc
+++ b/chromium/content/renderer/media/batching_media_log_unittest.cc
@@ -68,6 +68,10 @@ class BatchingMediaLogTest : public testing::Test {
return return_events;
}
+ void AddMessage(media::MediaLogMessageLevel level, std::string message) {
+ log_.AddMessage(level, message);
+ }
+
private:
friend class TestEventHandler;
void AddEventsForTesting(std::vector<media::MediaLogRecord> events) {
@@ -157,4 +161,12 @@ TEST_F(BatchingMediaLogTest, DurationChanged) {
EXPECT_EQ(media::MediaLogRecord::Type::kMediaEventTriggered, events[2].type);
}
+TEST_F(BatchingMediaLogTest, OnlyKeepsFirstErrorStringMessage) {
+ AddMessage(media::MediaLogMessageLevel::kERROR, "first error");
+ AddMessage(media::MediaLogMessageLevel::kERROR, "second error");
+ log_.NotifyError(media::DEMUXER_ERROR_DETECTED_HLS);
+
+ ASSERT_EQ(log_.GetErrorMessage(), "DEMUXER_ERROR_DETECTED_HLS: first error");
+}
+
} // namespace content
diff --git a/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc b/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
index 77baecdaad4..a411ffbaafb 100644
--- a/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
+++ b/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
@@ -25,6 +25,7 @@
#include "gpu/ipc/client/command_buffer_proxy_impl.h"
#include "gpu/ipc/client/gpu_channel_host.h"
#include "gpu/ipc/common/gpu_memory_buffer_support.h"
+#include "media/base/bind_to_current_loop.h"
#include "media/gpu/gpu_video_accelerator_util.h"
#include "media/gpu/ipc/common/media_messages.h"
#include "media/mojo/buildflags.h"
@@ -52,6 +53,26 @@ void RecordContextProviderPhaseUmaEnum(const ContextProviderPhase phase) {
} // namespace
+GpuVideoAcceleratorFactoriesImpl::Notifier::Notifier() = default;
+GpuVideoAcceleratorFactoriesImpl::Notifier::~Notifier() = default;
+
+void GpuVideoAcceleratorFactoriesImpl::Notifier::Register(
+ base::OnceClosure callback) {
+ if (is_notified_) {
+ std::move(callback).Run();
+ return;
+ }
+ callbacks_.push_back(std::move(callback));
+}
+
+void GpuVideoAcceleratorFactoriesImpl::Notifier::Notify() {
+ DCHECK(!is_notified_);
+ is_notified_ = true;
+ for (auto& callback : callbacks_)
+ std::move(callback).Run();
+ callbacks_.clear();
+}
+
// static
std::unique_ptr<GpuVideoAcceleratorFactoriesImpl>
GpuVideoAcceleratorFactoriesImpl::Create(
@@ -124,6 +145,8 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner(
if (context_provider_->BindToCurrentThread() !=
gpu::ContextResult::kSuccess) {
+ OnDecoderSupportFailed();
+ OnEncoderSupportFailed();
OnContextLost();
return;
}
@@ -140,10 +163,15 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner(
.video_encode_accelerator_supported_profiles);
}
+ vea_provider_.set_disconnect_handler(base::BindOnce(
+ &GpuVideoAcceleratorFactoriesImpl::OnEncoderSupportFailed,
+ base::Unretained(this)));
vea_provider_->GetVideoEncodeAcceleratorSupportedProfiles(
base::BindOnce(&GpuVideoAcceleratorFactoriesImpl::
OnGetVideoEncodeAcceleratorSupportedProfiles,
base::Unretained(this)));
+ } else {
+ OnEncoderSupportFailed();
}
#if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
@@ -154,17 +182,56 @@ void GpuVideoAcceleratorFactoriesImpl::BindOnTaskRunner(
// kAlternate, for example.
interface_factory_->CreateVideoDecoder(
video_decoder_.BindNewPipeAndPassReceiver());
+ video_decoder_.set_disconnect_handler(
+ base::BindOnce(&GpuVideoAcceleratorFactoriesImpl::OnDecoderSupportFailed,
+ base::Unretained(this)));
video_decoder_->GetSupportedConfigs(base::BindOnce(
&GpuVideoAcceleratorFactoriesImpl::OnSupportedDecoderConfigs,
base::Unretained(this)));
+#else
+ OnDecoderSupportFailed();
#endif // BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
}
+bool GpuVideoAcceleratorFactoriesImpl::IsDecoderSupportKnown() {
+ base::AutoLock lock(supported_profiles_lock_);
+ return decoder_support_notifier_.is_notified();
+}
+
+void GpuVideoAcceleratorFactoriesImpl::NotifyDecoderSupportKnown(
+ base::OnceClosure callback) {
+ base::AutoLock lock(supported_profiles_lock_);
+ decoder_support_notifier_.Register(
+ media::BindToCurrentLoop(std::move(callback)));
+}
+
void GpuVideoAcceleratorFactoriesImpl::OnSupportedDecoderConfigs(
const media::SupportedVideoDecoderConfigMap& supported_configs) {
base::AutoLock lock(supported_profiles_lock_);
+ video_decoder_.reset();
supported_decoder_configs_ = supported_configs;
+ decoder_support_notifier_.Notify();
+}
+
+void GpuVideoAcceleratorFactoriesImpl::OnDecoderSupportFailed() {
+ base::AutoLock lock(supported_profiles_lock_);
video_decoder_.reset();
+ if (decoder_support_notifier_.is_notified())
+ return;
+ supported_decoder_configs_ = media::SupportedVideoDecoderConfigMap();
+ decoder_support_notifier_.Notify();
+}
+
+bool GpuVideoAcceleratorFactoriesImpl::IsEncoderSupportKnown() {
+ base::AutoLock lock(supported_profiles_lock_);
+ return encoder_support_notifier_.is_notified();
+}
+
+void GpuVideoAcceleratorFactoriesImpl::NotifyEncoderSupportKnown(
+ base::OnceClosure callback) {
+ base::AutoLock lock(supported_profiles_lock_);
+ encoder_support_notifier_.Register(
+ media::BindToCurrentLoop(std::move(callback)));
}
void GpuVideoAcceleratorFactoriesImpl::
@@ -173,6 +240,15 @@ void GpuVideoAcceleratorFactoriesImpl::
supported_profiles) {
base::AutoLock lock(supported_profiles_lock_);
supported_vea_profiles_ = supported_profiles;
+ encoder_support_notifier_.Notify();
+}
+
+void GpuVideoAcceleratorFactoriesImpl::OnEncoderSupportFailed() {
+ base::AutoLock lock(supported_profiles_lock_);
+ if (encoder_support_notifier_.is_notified())
+ return;
+ supported_vea_profiles_ = media::VideoEncodeAccelerator::SupportedProfiles();
+ encoder_support_notifier_.Notify();
}
bool GpuVideoAcceleratorFactoriesImpl::CheckContextLost() {
diff --git a/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h b/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
index c15269de003..4bc4f75cc36 100644
--- a/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
+++ b/chromium/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
@@ -76,13 +76,19 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
bool IsGpuVideoAcceleratorEnabled() override;
base::UnguessableToken GetChannelToken() override;
int32_t GetCommandBufferRouteId() override;
+ Supported IsDecoderConfigSupported(
+ media::VideoDecoderImplementation implementation,
+ const media::VideoDecoderConfig& config) override;
+ bool IsDecoderSupportKnown() override;
+ void NotifyDecoderSupportKnown(base::OnceClosure callback) override;
std::unique_ptr<media::VideoDecoder> CreateVideoDecoder(
media::MediaLog* media_log,
media::VideoDecoderImplementation implementation,
media::RequestOverlayInfoCB request_overlay_info_cb) override;
- Supported IsDecoderConfigSupported(
- media::VideoDecoderImplementation implementation,
- const media::VideoDecoderConfig& config) override;
+ base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
+ GetVideoEncodeAcceleratorSupportedProfiles() override;
+ bool IsEncoderSupportKnown() override;
+ void NotifyEncoderSupportKnown(base::OnceClosure callback) override;
std::unique_ptr<media::VideoEncodeAccelerator> CreateVideoEncodeAccelerator()
override;
@@ -113,9 +119,6 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
base::UnsafeSharedMemoryRegion CreateSharedMemoryRegion(size_t size) override;
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
- base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
- GetVideoEncodeAcceleratorSupportedProfiles() override;
-
viz::RasterContextProvider* GetMediaContextProvider() override;
void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override;
@@ -128,6 +131,21 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
~GpuVideoAcceleratorFactoriesImpl() override;
private:
+ class Notifier {
+ public:
+ Notifier();
+ ~Notifier();
+
+ void Register(base::OnceClosure callback);
+ void Notify();
+
+ bool is_notified() { return is_notified_; }
+
+ private:
+ bool is_notified_ = false;
+ std::vector<base::OnceClosure> callbacks_;
+ };
+
GpuVideoAcceleratorFactoriesImpl(
scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
const scoped_refptr<base::SingleThreadTaskRunner>&
@@ -154,9 +172,12 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
void OnSupportedDecoderConfigs(
const media::SupportedVideoDecoderConfigMap& supported_configs);
+ void OnDecoderSupportFailed();
+
void OnGetVideoEncodeAcceleratorSupportedProfiles(
const media::VideoEncodeAccelerator::SupportedProfiles&
supported_profiles);
+ void OnEncoderSupportFailed();
const scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
@@ -197,9 +218,11 @@ class CONTENT_EXPORT GpuVideoAcceleratorFactoriesImpl
// are no supported configs.
base::Optional<media::SupportedVideoDecoderConfigMap>
supported_decoder_configs_ GUARDED_BY(supported_profiles_lock_);
+ Notifier decoder_support_notifier_ GUARDED_BY(supported_profiles_lock_);
base::Optional<media::VideoEncodeAccelerator::SupportedProfiles>
supported_vea_profiles_ GUARDED_BY(supported_profiles_lock_);
+ Notifier encoder_support_notifier_ GUARDED_BY(supported_profiles_lock_);
// For sending requests to allocate shared memory in the Browser process.
scoped_refptr<ThreadSafeSender> thread_safe_sender_;
diff --git a/chromium/content/renderer/media/media_factory.cc b/chromium/content/renderer/media/media_factory.cc
index a1c33d76de6..9ef13848286 100644
--- a/chromium/content/renderer/media/media_factory.cc
+++ b/chromium/content/renderer/media/media_factory.cc
@@ -18,6 +18,7 @@
#include "cc/trees/layer_tree_settings.h"
#include "content/public/common/content_client.h"
#include "content/public/renderer/content_renderer_client.h"
+#include "content/public/renderer/render_frame_media_playback_options.h"
#include "content/renderer/media/audio/audio_device_factory.h"
#include "content/renderer/media/batching_media_log.h"
#include "content/renderer/media/inspector_media_event_handler.h"
@@ -61,6 +62,7 @@
#include "url/origin.h"
#if defined(OS_ANDROID)
+#include "components/viz/common/features.h"
#include "content/renderer/media/android/flinging_renderer_client_factory.h"
#include "content/renderer/media/android/media_player_renderer_client_factory.h"
#include "content/renderer/media/android/stream_texture_wrapper_impl.h"
@@ -91,10 +93,18 @@
#endif
#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+// Enable remoting sender
#include "media/remoting/courier_renderer_factory.h" // nogncheck
#include "media/remoting/renderer_controller.h" // nogncheck
#endif
+#if BUILDFLAG(IS_CHROMECAST)
+// Enable remoting receiver
+#include "media/remoting/receiver_controller.h" // nogncheck
+#include "media/remoting/remoting_constants.h" // nogncheck
+#include "media/remoting/remoting_renderer_factory.h" // nogncheck
+#endif
+
namespace {
class FrameFetchContext : public media::ResourceFetchContext {
public:
@@ -157,6 +167,26 @@ void LogRoughness(media::MediaLog* media_log,
media_log->SetProperty<media::MediaLogProperty::kFramerate>(fps);
}
+std::unique_ptr<media::DefaultRendererFactory> CreateDefaultRendererFactory(
+ media::MediaLog* media_log,
+ media::DecoderFactory* decoder_factory,
+ content::RenderThreadImpl* render_thread,
+ content::RenderFrameImpl* render_frame) {
+#if defined(OS_ANDROID)
+ auto default_factory = std::make_unique<media::DefaultRendererFactory>(
+ media_log, decoder_factory,
+ base::BindRepeating(&content::RenderThreadImpl::GetGpuFactories,
+ base::Unretained(render_thread)));
+#else
+ auto default_factory = std::make_unique<media::DefaultRendererFactory>(
+ media_log, decoder_factory,
+ base::BindRepeating(&content::RenderThreadImpl::GetGpuFactories,
+ base::Unretained(render_thread)),
+ render_frame->CreateSpeechRecognitionClient(base::OnceClosure()));
+#endif
+ return default_factory;
+}
+
} // namespace
namespace content {
@@ -165,7 +195,8 @@ namespace content {
blink::WebMediaPlayer::SurfaceLayerMode
MediaFactory::GetVideoSurfaceLayerMode() {
#if defined(OS_ANDROID)
- if (base::FeatureList::IsEnabled(media::kDisableSurfaceLayerForVideo))
+ if (base::FeatureList::IsEnabled(media::kDisableSurfaceLayerForVideo) &&
+ !features::IsUsingVizForWebView())
return blink::WebMediaPlayer::SurfaceLayerMode::kNever;
#endif // OS_ANDROID
@@ -327,9 +358,7 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
const WebPreferences webkit_preferences =
render_frame_->GetWebkitPreferences();
bool embedded_media_experience_enabled = false;
- bool use_media_player_renderer = false;
#if defined(OS_ANDROID)
- use_media_player_renderer = UseMediaPlayerRenderer(url);
embedded_media_experience_enabled =
webkit_preferences.embedded_media_experience_enabled;
#endif // defined(OS_ANDROID)
@@ -360,9 +389,7 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
base::WeakPtr<media::MediaObserver> media_observer;
auto factory_selector = CreateRendererFactorySelector(
- media_log.get(), use_media_player_renderer,
- render_frame_->GetRenderFrameMediaPlaybackOptions()
- .is_mojo_renderer_enabled(),
+ media_log.get(), url, render_frame_->GetRenderFrameMediaPlaybackOptions(),
GetDecoderFactory(),
std::make_unique<media::RemotePlaybackClientWrapperImpl>(client),
&media_observer);
@@ -446,8 +473,6 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
.is_background_video_playback_enabled,
render_frame_->GetRenderFrameMediaPlaybackOptions()
.is_background_video_track_optimization_supported,
- render_frame_->GetRenderFrameMediaPlaybackOptions()
- .is_remoting_renderer_enabled(),
GetContentClient()->renderer()->OverrideDemuxerForUrl(
render_frame_, url, media_task_runner),
std::move(power_status_helper)));
@@ -475,8 +500,8 @@ blink::WebEncryptedMediaClient* MediaFactory::EncryptedMediaClient() {
std::unique_ptr<media::RendererFactorySelector>
MediaFactory::CreateRendererFactorySelector(
media::MediaLog* media_log,
- bool use_media_player,
- bool enable_mojo_renderer,
+ blink::WebURL url,
+ const RenderFrameMediaPlaybackOptions& renderer_media_playback_options,
media::DecoderFactory* decoder_factory,
std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper,
base::WeakPtr<media::MediaObserver>* out_media_observer) {
@@ -489,6 +514,11 @@ MediaFactory::CreateRendererFactorySelector(
auto factory_selector = std::make_unique<media::RendererFactorySelector>();
bool use_default_renderer_factory = true;
+ bool use_media_player_renderer = false;
+
+#if defined(OS_ANDROID)
+ use_media_player_renderer = UseMediaPlayerRenderer(url);
+#endif // defined(OS_ANDROID)
#if defined(OS_ANDROID)
DCHECK(interface_broker_);
@@ -503,7 +533,7 @@ MediaFactory::CreateRendererFactorySelector(
render_thread->GetStreamTexureFactory(),
render_frame_->GetTaskRunner(blink::TaskType::kInternalMedia)));
- if (use_media_player) {
+ if (use_media_player_renderer) {
factory_selector->AddBaseFactory(FactoryType::kMediaPlayer,
std::move(media_player_factory));
use_default_renderer_factory = false;
@@ -534,8 +564,8 @@ MediaFactory::CreateRendererFactorySelector(
#endif // defined(OS_ANDROID)
#if BUILDFLAG(ENABLE_MOJO_RENDERER)
- DCHECK(!use_media_player);
- if (enable_mojo_renderer) {
+ DCHECK(!use_media_player_renderer);
+ if (renderer_media_playback_options.is_mojo_renderer_enabled()) {
use_default_renderer_factory = false;
#if BUILDFLAG(ENABLE_CAST_RENDERER)
factory_selector->AddBaseFactory(
@@ -565,18 +595,9 @@ MediaFactory::CreateRendererFactorySelector(
#endif // defined(OS_FUCHSIA)
if (use_default_renderer_factory) {
-#if defined(OS_ANDROID)
- auto default_factory = std::make_unique<media::DefaultRendererFactory>(
- media_log, decoder_factory,
- base::BindRepeating(&RenderThreadImpl::GetGpuFactories,
- base::Unretained(render_thread)));
-#else
- auto default_factory = std::make_unique<media::DefaultRendererFactory>(
- media_log, decoder_factory,
- base::BindRepeating(&RenderThreadImpl::GetGpuFactories,
- base::Unretained(render_thread)),
- render_frame_->CreateSpeechRecognitionClient());
-#endif
+ DCHECK(!use_media_player_renderer);
+ auto default_factory = CreateDefaultRendererFactory(
+ media_log, decoder_factory, render_thread, render_frame_);
factory_selector->AddBaseFactory(FactoryType::kDefault,
std::move(default_factory));
}
@@ -606,6 +627,27 @@ MediaFactory::CreateRendererFactorySelector(
FactoryType::kCourier, std::move(courier_factory), is_remoting_cb);
#endif
+#if BUILDFLAG(IS_CHROMECAST)
+ if (renderer_media_playback_options.is_remoting_renderer_enabled()) {
+ auto default_factory = CreateDefaultRendererFactory(
+ media_log, decoder_factory, render_thread, render_frame_);
+ mojo::PendingRemote<media::mojom::Remotee> remotee;
+ interface_broker_->GetInterface(remotee.InitWithNewPipeAndPassReceiver());
+ auto remoting_renderer_factory =
+ std::make_unique<media::remoting::RemotingRendererFactory>(
+ std::move(remotee), std::move(default_factory),
+ render_thread->GetMediaThreadTaskRunner());
+ auto is_remoting_media = base::BindRepeating(
+ [](const GURL& url) -> bool {
+ return url.SchemeIs(media::remoting::kRemotingScheme);
+ },
+ url);
+ factory_selector->AddConditionalFactory(
+ FactoryType::kRemoting, std::move(remoting_renderer_factory),
+ is_remoting_media);
+ }
+#endif // BUILDFLAG(IS_CHROMECAST)
+
return factory_selector;
}
diff --git a/chromium/content/renderer/media/media_factory.h b/chromium/content/renderer/media/media_factory.h
index 508690707a4..731e7619ced 100644
--- a/chromium/content/renderer/media/media_factory.h
+++ b/chromium/content/renderer/media/media_factory.h
@@ -9,6 +9,7 @@
#include "base/memory/weak_ptr.h"
#include "build/buildflag.h"
+#include "build/chromecast_buildflags.h"
#include "components/viz/common/surfaces/surface_id.h"
#include "media/base/renderer_factory_selector.h"
#include "media/base/routing_token_callback.h"
@@ -18,7 +19,6 @@
#include "media/mojo/buildflags.h"
#include "media/mojo/clients/mojo_renderer_factory.h"
#include "media/mojo/mojom/interface_factory.mojom.h"
-#include "media/mojo/mojom/remoting.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/platform/web_media_player_source.h"
#include "third_party/blink/public/platform/web_security_origin.h"
@@ -26,6 +26,11 @@
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/web/web_media_inspector.h"
+#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
+// Needed by remoting sender.
+#include "media/mojo/mojom/remoting.mojom.h"
+#endif // BUILDFLAG(ENABLE_MEDIA_REMOTING)
+
namespace blink {
class BrowserInterfaceBrokerProxy;
class WebContentDecryptionModule;
@@ -55,6 +60,7 @@ namespace content {
class RenderFrameImpl;
class MediaInterfaceFactory;
+struct RenderFrameMediaPlaybackOptions;
// Assist to RenderFrameImpl in creating various media clients.
class MediaFactory {
@@ -113,8 +119,8 @@ class MediaFactory {
private:
std::unique_ptr<media::RendererFactorySelector> CreateRendererFactorySelector(
media::MediaLog* media_log,
- bool use_media_player,
- bool enable_mojo_renderer,
+ blink::WebURL url,
+ const RenderFrameMediaPlaybackOptions& renderer_media_playback_options,
media::DecoderFactory* decoder_factory,
std::unique_ptr<media::RemotePlaybackClientWrapper> client_wrapper,
base::WeakPtr<media::MediaObserver>* out_media_observer);
diff --git a/chromium/content/renderer/media/renderer_webmediaplayer_delegate.cc b/chromium/content/renderer/media/renderer_webmediaplayer_delegate.cc
index ae04d071938..00b74f52fe3 100644
--- a/chromium/content/renderer/media/renderer_webmediaplayer_delegate.cc
+++ b/chromium/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -207,6 +207,11 @@ void RendererWebMediaPlayerDelegate::DidPictureInPictureAvailabilityChange(
routing_id(), delegate_id, available));
}
+void RendererWebMediaPlayerDelegate::DidBufferUnderflow(int player_id) {
+ Send(new MediaPlayerDelegateHostMsg_OnBufferUnderflow(routing_id(),
+ player_id));
+}
+
void RendererWebMediaPlayerDelegate::WasHidden() {
RecordAction(base::UserMetricsAction("Media.Hidden"));
diff --git a/chromium/content/renderer/media/renderer_webmediaplayer_delegate.h b/chromium/content/renderer/media/renderer_webmediaplayer_delegate.h
index 2b4181601d6..a2ae5b93c63 100644
--- a/chromium/content/renderer/media/renderer_webmediaplayer_delegate.h
+++ b/chromium/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -70,6 +70,7 @@ class CONTENT_EXPORT RendererWebMediaPlayerDelegate
const media_session::MediaPosition& position) override;
void DidPictureInPictureAvailabilityChange(int delegate_id,
bool available) override;
+ void DidBufferUnderflow(int player_id) override;
// content::RenderFrameObserver overrides.
void WasHidden() override;