diff options
Diffstat (limited to 'chromium/content/renderer/media')
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; |