diff options
Diffstat (limited to 'chromium/content/browser/media')
53 files changed, 540 insertions, 1855 deletions
diff --git a/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.cc b/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.cc index c5b995e3372..c17156446cd 100644 --- a/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.cc +++ b/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.cc @@ -5,6 +5,7 @@ #include "content/browser/media/android/browser_gpu_video_accelerator_factories.h" #include "base/bind.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "content/browser/browser_main_loop.h" #include "content/public/browser/android/gpu_video_accelerator_factories_provider.h" #include "content/public/common/gpu_stream_constants.h" @@ -102,10 +103,21 @@ media::GpuVideoAcceleratorFactories::Supported BrowserGpuVideoAcceleratorFactories::IsDecoderConfigSupported( media::VideoDecoderImplementation implementation, const media::VideoDecoderConfig& config) { - // TODO(sandersd): Add a cache here too? + // Tell the caller to just try it, there are no other decoders to fall back on + // anyway. return media::GpuVideoAcceleratorFactories::Supported::kTrue; } +bool BrowserGpuVideoAcceleratorFactories::IsDecoderSupportKnown() { + return true; +} + +void BrowserGpuVideoAcceleratorFactories::NotifyDecoderSupportKnown( + base::OnceClosure callback) { + base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(callback)); +} + std::unique_ptr<media::VideoDecoder> BrowserGpuVideoAcceleratorFactories::CreateVideoDecoder( media::MediaLog* media_log, @@ -171,6 +183,16 @@ BrowserGpuVideoAcceleratorFactories:: return media::VideoEncodeAccelerator::SupportedProfiles(); } +bool BrowserGpuVideoAcceleratorFactories::IsEncoderSupportKnown() { + return true; +} + +void BrowserGpuVideoAcceleratorFactories::NotifyEncoderSupportKnown( + base::OnceClosure callback) { + base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(callback)); +} + viz::RasterContextProvider* BrowserGpuVideoAcceleratorFactories::GetMediaContextProvider() { return context_provider_.get(); diff --git a/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.h b/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.h index b7d89119ce3..c85710fcb3f 100644 --- a/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.h +++ b/chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.h @@ -31,10 +31,16 @@ class BrowserGpuVideoAcceleratorFactories Supported IsDecoderConfigSupported( media::VideoDecoderImplementation implementation, const media::VideoDecoderConfig& config) override; + bool IsDecoderSupportKnown() override; + void NotifyDecoderSupportKnown(base::OnceClosure) override; std::unique_ptr<media::VideoDecoder> CreateVideoDecoder( media::MediaLog* media_log, media::VideoDecoderImplementation implementation, media::RequestOverlayInfoCB request_overlay_info_cb) override; + base::Optional<media::VideoEncodeAccelerator::SupportedProfiles> + GetVideoEncodeAcceleratorSupportedProfiles() override; + bool IsEncoderSupportKnown() override; + void NotifyEncoderSupportKnown(base::OnceClosure) override; std::unique_ptr<media::VideoEncodeAccelerator> CreateVideoEncodeAccelerator() override; std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer( @@ -50,8 +56,6 @@ class BrowserGpuVideoAcceleratorFactories gpu::GpuMemoryBufferManager* GpuMemoryBufferManager() override; 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; diff --git a/chromium/content/browser/media/android/media_player_renderer.cc b/chromium/content/browser/media/android/media_player_renderer.cc index e5fe440cc7b..3ffdc49559d 100644 --- a/chromium/content/browser/media/android/media_player_renderer.cc +++ b/chromium/content/browser/media/android/media_player_renderer.cc @@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" -#include "base/task/post_task.h" #include "content/browser/android/scoped_surface_request_manager.h" #include "content/browser/media/android/media_player_renderer_web_contents_observer.h" #include "content/browser/media/android/media_resource_getter_impl.h" @@ -94,8 +93,8 @@ void MediaPlayerRenderer::Initialize(media::MediaResource* media_resource, return; } - base::PostDelayedTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, base::BindOnce(&MediaPlayerRenderer::CreateMediaPlayer, weak_factory_.GetWeakPtr(), media_resource->GetMediaUrlParams(), std::move(init_cb)), @@ -130,11 +129,6 @@ void MediaPlayerRenderer::CreateMediaPlayer( std::move(init_cb).Run(media::PIPELINE_OK); } -void MediaPlayerRenderer::SetCdm(media::CdmContext* cdm_context, - media::CdmAttachedCB cdm_attached_cb) { - NOTREACHED(); -} - void MediaPlayerRenderer::SetLatencyHint( base::Optional<base::TimeDelta> latency_hint) {} diff --git a/chromium/content/browser/media/android/media_player_renderer.h b/chromium/content/browser/media/android/media_player_renderer.h index 517e82e5675..c61ec6d8d99 100644 --- a/chromium/content/browser/media/android/media_player_renderer.h +++ b/chromium/content/browser/media/android/media_player_renderer.h @@ -59,8 +59,6 @@ class CONTENT_EXPORT MediaPlayerRenderer 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; void SetLatencyHint(base::Optional<base::TimeDelta> latency_hint) override; void Flush(base::OnceClosure flush_cb) override; void StartPlayingFrom(base::TimeDelta time) override; diff --git a/chromium/content/browser/media/android/media_resource_getter_impl.cc b/chromium/content/browser/media/android/media_resource_getter_impl.cc index b9124937651..16648592df1 100644 --- a/chromium/content/browser/media/android/media_resource_getter_impl.cc +++ b/chromium/content/browser/media/android/media_resource_getter_impl.cc @@ -8,7 +8,6 @@ #include "base/macros.h" #include "base/path_service.h" #include "base/single_thread_task_runner.h" -#include "base/task/post_task.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/file_system/browser_file_system_helper.h" #include "content/browser/frame_host/render_frame_host_impl.h" @@ -69,16 +68,16 @@ GetRestrictedCookieManagerForContext( void ReturnResultOnUIThread( base::OnceCallback<void(const std::string&)> callback, const std::string& result) { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void ReturnResultOnUIThreadAndClosePipe( mojo::Remote<network::mojom::RestrictedCookieManager> pipe, base::OnceCallback<void(const std::string&)> callback, const std::string& result) { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void OnSyncGetPlatformPathDone( diff --git a/chromium/content/browser/media/audio_input_stream_broker.cc b/chromium/content/browser/media/audio_input_stream_broker.cc index 45429d6995e..32bdf7e4e63 100644 --- a/chromium/content/browser/media/audio_input_stream_broker.cc +++ b/chromium/content/browser/media/audio_input_stream_broker.cc @@ -13,7 +13,6 @@ #include "base/memory/read_only_shared_memory_region.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/task/post_task.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "content/browser/browser_main_loop.h" @@ -37,8 +36,8 @@ enum KeyboardMicAction { kRegister, kDeregister }; void UpdateKeyboardMicRegistration(KeyboardMicAction action) { if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&UpdateKeyboardMicRegistration, action)); + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&UpdateKeyboardMicRegistration, action)); return; } BrowserMainLoop* browser_main_loop = BrowserMainLoop::GetInstance(); @@ -127,9 +126,6 @@ AudioInputStreamBroker::~AudioInputStreamBroker() { TRACE_EVENT_NESTABLE_ASYNC_END1("audio", "AudioInputStreamBroker", this, "disconnect reason", static_cast<uint32_t>(disconnect_reason_)); - - UMA_HISTOGRAM_ENUMERATION("Media.Audio.Capture.StreamBrokerDisconnectReason", - disconnect_reason_); } void AudioInputStreamBroker::CreateStream( diff --git a/chromium/content/browser/media/audio_stream_broker.cc b/chromium/content/browser/media/audio_stream_broker.cc index bfe35ab87d2..e4d9ad92144 100644 --- a/chromium/content/browser/media/audio_stream_broker.cc +++ b/chromium/content/browser/media/audio_stream_broker.cc @@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/task/post_task.h" #include "content/browser/media/audio_input_stream_broker.h" #include "content/browser/media/audio_loopback_stream_broker.h" #include "content/browser/media/audio_output_stream_broker.h" @@ -93,8 +92,8 @@ void AudioStreamBroker::NotifyProcessHostOfStartedStream( if (auto* process_host = RenderProcessHost::FromID(id)) process_host->OnMediaStreamAdded(); }; - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(impl, render_process_id)); + GetUIThreadTaskRunner({})->PostTask(FROM_HERE, + base::BindOnce(impl, render_process_id)); } // static @@ -104,8 +103,8 @@ void AudioStreamBroker::NotifyProcessHostOfStoppedStream( if (auto* process_host = RenderProcessHost::FromID(id)) process_host->OnMediaStreamRemoved(); }; - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(impl, render_process_id)); + GetUIThreadTaskRunner({})->PostTask(FROM_HERE, + base::BindOnce(impl, render_process_id)); } AudioStreamBrokerFactory::AudioStreamBrokerFactory() {} diff --git a/chromium/content/browser/media/audio_stream_monitor.cc b/chromium/content/browser/media/audio_stream_monitor.cc index 7d9a14019e6..a17ef3923d4 100644 --- a/chromium/content/browser/media/audio_stream_monitor.cc +++ b/chromium/content/browser/media/audio_stream_monitor.cc @@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/stl_util.h" -#include "base/task/post_task.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_task_traits.h" @@ -84,8 +83,8 @@ void AudioStreamMonitor::RenderProcessGone(int render_process_id) { void AudioStreamMonitor::StartMonitoringStream(int render_process_id, int render_frame_id, int stream_id) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](const StreamID& sid) { if (AudioStreamMonitor* monitor = GetMonitorForRenderFrame( @@ -100,8 +99,8 @@ void AudioStreamMonitor::StartMonitoringStream(int render_process_id, void AudioStreamMonitor::StopMonitoringStream(int render_process_id, int render_frame_id, int stream_id) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](const StreamID& sid) { if (AudioStreamMonitor* monitor = GetMonitorForRenderFrame( @@ -117,8 +116,8 @@ void AudioStreamMonitor::UpdateStreamAudibleState(int render_process_id, int render_frame_id, int stream_id, bool is_audible) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](const StreamID& sid, bool is_audible) { if (AudioStreamMonitor* monitor = GetMonitorForRenderFrame( diff --git a/chromium/content/browser/media/capture/audio_mirroring_manager.cc b/chromium/content/browser/media/capture/audio_mirroring_manager.cc index eff29c39c7e..03b80f3ff70 100644 --- a/chromium/content/browser/media/capture/audio_mirroring_manager.cc +++ b/chromium/content/browser/media/capture/audio_mirroring_manager.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/logging.h" #include "base/stl_util.h" namespace content { diff --git a/chromium/content/browser/media/capture/audio_mirroring_manager_unittest.cc b/chromium/content/browser/media/capture/audio_mirroring_manager_unittest.cc index f21c8c4e7a3..307def9004a 100644 --- a/chromium/content/browser/media/capture/audio_mirroring_manager_unittest.cc +++ b/chromium/content/browser/media/capture/audio_mirroring_manager_unittest.cc @@ -12,7 +12,6 @@ #include "base/bind_helpers.h" #include "base/macros.h" #include "base/synchronization/waitable_event.h" -#include "base/task/post_task.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/test/browser_task_environment.h" @@ -80,8 +79,8 @@ class MockMirroringDestination render_process_id_, render_frame_id_)) != candidates.end()) { result.insert(GlobalFrameRoutingId(render_process_id_, render_frame_id_)); } - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(std::move(*results_callback), + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(*results_callback), std::move(result), is_duplication_)); } diff --git a/chromium/content/browser/media/capture/aura_window_video_capture_device.cc b/chromium/content/browser/media/capture/aura_window_video_capture_device.cc index a3d33bf2636..7ab685a0a7a 100644 --- a/chromium/content/browser/media/capture/aura_window_video_capture_device.cc +++ b/chromium/content/browser/media/capture/aura_window_video_capture_device.cc @@ -12,7 +12,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/media/capture/mouse_cursor_overlay_controller.h" #include "content/public/browser/browser_task_traits.h" @@ -26,7 +25,7 @@ #include "ui/aura/window_occlusion_tracker.h" #if defined(OS_CHROMEOS) -#include "content/browser/media/capture/lame_window_capturer_chromeos.h" +#include "content/browser/media/capture/slow_window_capturer_chromeos.h" #endif namespace content { @@ -48,8 +47,8 @@ class AuraWindowVideoCaptureDevice::WindowTracker DCHECK(device_task_runner_); DCHECK(cursor_controller_); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&WindowTracker::ResolveTarget, AsWeakPtr(), source_id)); } @@ -82,7 +81,7 @@ class AuraWindowVideoCaptureDevice::WindowTracker target_window_ = DesktopMediaID::GetNativeWindowById(source_id); if (target_window_ && #if defined(OS_CHROMEOS) - // See class comments for LameWindowCapturerChromeOS. + // See class comments for SlowWindowCapturerChromeOS. (source_id.type == DesktopMediaID::TYPE_WINDOW || target_window_->GetFrameSinkId().is_valid()) && #else @@ -159,8 +158,8 @@ AuraWindowVideoCaptureDevice::~AuraWindowVideoCaptureDevice() = default; #if defined(OS_CHROMEOS) void AuraWindowVideoCaptureDevice::CreateCapturer( mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](base::WeakPtr<WindowTracker> tracker_ptr, mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> @@ -176,7 +175,7 @@ void AuraWindowVideoCaptureDevice::CreateCapturer( VLOG(1) << "AuraWindowVideoCaptureDevice is using the LAME " "capturer. :("; mojo::MakeSelfOwnedReceiver( - std::make_unique<LameWindowCapturerChromeOS>( + std::make_unique<SlowWindowCapturerChromeOS>( tracker->target_window()), std::move(receiver)); } else { diff --git a/chromium/content/browser/media/capture/aura_window_video_capture_device_browsertest.cc b/chromium/content/browser/media/capture/aura_window_video_capture_device_browsertest.cc index 9cbeed4d268..01c39effc56 100644 --- a/chromium/content/browser/media/capture/aura_window_video_capture_device_browsertest.cc +++ b/chromium/content/browser/media/capture/aura_window_video_capture_device_browsertest.cc @@ -8,7 +8,6 @@ #include "base/macros.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "cc/test/pixel_test_utils.h" #include "components/viz/common/features.h" @@ -162,8 +161,8 @@ class AuraWindowVideoCaptureDeviceBrowserTest // Wait for at least the minimum capture period before checking for more // captured frames. base::RunLoop run_loop; - base::PostDelayedTask(FROM_HERE, {BrowserThread::UI}, - run_loop.QuitClosure(), GetMinCapturePeriod()); + GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), GetMinCapturePeriod()); run_loop.Run(); } } @@ -222,11 +221,12 @@ IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, RunUntilIdle(); } +// Disabled (crbug.com/1096988) // Tests that the device starts, captures a frame, and then gracefully // errors-out because the target window is destroyed before the device is // stopped. IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, - ErrorsOutWhenWindowIsDestroyed) { + DISABLED_ErrorsOutWhenWindowIsDestroyed) { NavigateToInitialDocument(); AllocateAndStartAndWaitForFirstFrame(); @@ -244,11 +244,12 @@ IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, StopAndDeAllocate(); } +// Disabled (crbug.com/1096988) // Tests that the device stops delivering frames while suspended. When resumed, // any content changes that occurred during the suspend should cause a new frame // to be delivered, to ensure the client is up-to-date. IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, - SuspendsAndResumes) { + DISABLED_SuspendsAndResumes) { NavigateToInitialDocument(); AllocateAndStartAndWaitForFirstFrame(); @@ -265,8 +266,8 @@ IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, // frames were queued because the device should be suspended. ChangePageContentColor(SK_ColorGREEN); base::RunLoop run_loop; - base::PostDelayedTask(FROM_HERE, {BrowserThread::UI}, run_loop.QuitClosure(), - base::TimeDelta::FromSeconds(5)); + GetUIThreadTaskRunner({})->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), + base::TimeDelta::FromSeconds(5)); run_loop.Run(); EXPECT_FALSE(HasCapturedFramesInQueue()); @@ -278,10 +279,11 @@ IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, StopAndDeAllocate(); } +// Disabled (crbug.com/1096988) // Tests that the device delivers refresh frames when asked, while the source // content is not changing. IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, - DeliversRefreshFramesUponRequest) { + DISABLED_DeliversRefreshFramesUponRequest) { NavigateToInitialDocument(); AllocateAndStartAndWaitForFirstFrame(); @@ -301,10 +303,11 @@ IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, } #if defined(OS_CHROMEOS) +// Disabled (crbug.com/1096988) // On ChromeOS, another window may occlude a window that is being captured. // Make sure the visibility is set to visible during capture if it's occluded. IN_PROC_BROWSER_TEST_F(AuraWindowVideoCaptureDeviceBrowserTest, - CapturesOccludedWindows) { + DISABLED_CapturesOccludedWindows) { NavigateToInitialDocument(); AllocateAndStartAndWaitForFirstFrame(); @@ -356,11 +359,12 @@ INSTANTIATE_TEST_SUITE_P( true /* fixed aspect ratio */))); #endif // defined(OS_CHROMEOS) +// Disabled (crbug.com/1096988) // Tests that the device successfully captures a series of content changes, // whether the browser is running with software compositing or GPU-accelerated // compositing. IN_PROC_BROWSER_TEST_P(AuraWindowVideoCaptureDeviceBrowserTestP, - CapturesContentChanges) { + DISABLED_CapturesContentChanges) { SCOPED_TRACE(testing::Message() << "Test parameters: " << (IsSoftwareCompositingTest() ? "Software Compositing" diff --git a/chromium/content/browser/media/capture/desktop_capture_device.cc b/chromium/content/browser/media/capture/desktop_capture_device.cc index 3385690f9b9..ddbd972ff04 100644 --- a/chromium/content/browser/media/capture/desktop_capture_device.cc +++ b/chromium/content/browser/media/capture/desktop_capture_device.cc @@ -20,7 +20,6 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/lock.h" -#include "base/task/post_task.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" #include "base/time/tick_clock.h" @@ -478,8 +477,8 @@ void DesktopCaptureDevice::Core::RequestWakeLock() { // TODO(https://crbug.com/823869): Fix DesktopCaptureDeviceTest and remove // this conditional. if (BrowserThread::IsThreadInitialized(BrowserThread::UI)) { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&BindWakeLockProvider, std::move(receiver))); + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&BindWakeLockProvider, std::move(receiver))); } wake_lock_provider->GetWakeLockWithoutContext( diff --git a/chromium/content/browser/media/capture/desktop_streams_registry_impl.cc b/chromium/content/browser/media/capture/desktop_streams_registry_impl.cc index b8ce040a132..e345bbadc2f 100644 --- a/chromium/content/browser/media/capture/desktop_streams_registry_impl.cc +++ b/chromium/content/browser/media/capture/desktop_streams_registry_impl.cc @@ -10,7 +10,6 @@ #include "base/macros.h" #include "base/no_destructor.h" #include "base/stl_util.h" -#include "base/task/post_task.h" #include "base/time/time.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -67,8 +66,8 @@ std::string DesktopStreamsRegistryImpl::RegisterStream( stream.extension_name = extension_name; stream.type = type; - base::PostDelayedTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, base::BindOnce(&DesktopStreamsRegistryImpl::CleanupStream, base::Unretained(this), id), base::TimeDelta::FromSeconds(kApprovedStreamTimeToLiveSeconds)); diff --git a/chromium/content/browser/media/capture/fake_video_capture_stack.cc b/chromium/content/browser/media/capture/fake_video_capture_stack.cc index 161351d1036..1c43d52483b 100644 --- a/chromium/content/browser/media/capture/fake_video_capture_stack.cc +++ b/chromium/content/browser/media/capture/fake_video_capture_stack.cc @@ -66,7 +66,7 @@ class FakeVideoCaptureStack::Receiver : public media::VideoFrameReceiver { const_cast<uint8_t*>(static_cast<const uint8_t*>(mapping.memory())), mapping.size(), frame_info->timestamp); CHECK(frame); - frame->metadata()->MergeInternalValuesFrom(frame_info->metadata); + frame->set_metadata(frame_info->metadata); if (frame_info->color_space.has_value()) frame->set_color_space(frame_info->color_space.value()); // This destruction observer will unmap the shared memory when the diff --git a/chromium/content/browser/media/capture/frame_sink_video_capture_device.cc b/chromium/content/browser/media/capture/frame_sink_video_capture_device.cc index 549e6563c0d..11c02abc610 100644 --- a/chromium/content/browser/media/capture/frame_sink_video_capture_device.cc +++ b/chromium/content/browser/media/capture/frame_sink_video_capture_device.cc @@ -15,7 +15,6 @@ #include "base/memory/weak_ptr.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "components/viz/host/host_frame_sink_manager.h" @@ -115,8 +114,8 @@ void FrameSinkVideoCaptureDevice::AllocateAndStartWithReceiver( capturer_->ChangeTarget(target_); } - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MouseCursorOverlayController::Start, cursor_controller_->GetWeakPtr(), capturer_->CreateOverlay(kMouseCursorStackingIndex), @@ -171,8 +170,8 @@ void FrameSinkVideoCaptureDevice::StopAndDeAllocate() { wake_lock_.reset(); } - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&MouseCursorOverlayController::Stop, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MouseCursorOverlayController::Stop, cursor_controller_->GetWeakPtr())); MaybeStopConsuming(); @@ -232,12 +231,8 @@ void FrameSinkVideoCaptureDevice::OnFrameCaptured( } const BufferId buffer_id = static_cast<BufferId>(index); - // Set the INTERACTIVE_CONTENT frame metadata. - media::VideoFrameMetadata modified_metadata; - modified_metadata.MergeInternalValuesFrom(info->metadata); - modified_metadata.SetBoolean(media::VideoFrameMetadata::INTERACTIVE_CONTENT, - cursor_controller_->IsUserInteractingWithView()); - info->metadata = modified_metadata.GetInternalValues().Clone(); + info->metadata.interactive_content = + cursor_controller_->IsUserInteractingWithView(); // Pass the video frame to the VideoFrameReceiver. This is done by first // passing the shared memory buffer handle and then notifying it that a new @@ -271,8 +266,8 @@ void FrameSinkVideoCaptureDevice::OnLog(const std::string& message) { if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { receiver_->OnLog(message); } else { - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&media::VideoFrameReceiver::OnLog, base::Unretained(receiver_.get()), message)); } @@ -314,8 +309,8 @@ void FrameSinkVideoCaptureDevice::CreateCapturerViaGlobalManager( mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) { // Send the receiver to UI thread because that's where HostFrameSinkManager // lives. - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) { @@ -379,8 +374,8 @@ void FrameSinkVideoCaptureDevice::RequestWakeLock() { mojo::Remote<device::mojom::WakeLockProvider> wake_lock_provider; auto receiver = wake_lock_provider.BindNewPipeAndPassReceiver(); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&BindWakeLockProvider, std::move(receiver))); + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&BindWakeLockProvider, std::move(receiver))); wake_lock_provider->GetWakeLockWithoutContext( device::mojom::WakeLockType::kPreventDisplaySleep, device::mojom::WakeLockReason::kOther, "screen capture", diff --git a/chromium/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc b/chromium/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc index ae3fe08166e..3fb27b6ff88 100644 --- a/chromium/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc +++ b/chromium/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc @@ -11,8 +11,8 @@ #include "base/containers/flat_map.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/shared_memory_mapping.h" -#include "base/task/post_task.h" #include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_utils.h" #include "media/base/video_frame.h" @@ -55,7 +55,7 @@ namespace { // Convenience macro to post a task to run on the device thread. #define POST_DEVICE_TASK(closure) \ - base::PostTask(FROM_HERE, {BrowserThread::IO}, closure) + GetIOThreadTaskRunner({})->PostTask(FROM_HERE, closure) // Convenience macro to block the test procedure until all pending tasks have // run on the device thread. @@ -273,8 +273,8 @@ class FrameSinkVideoCaptureDeviceForTest : public FrameSinkVideoCaptureDevice { protected: void CreateCapturer(mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) final { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](MockFrameSinkVideoCapturer* capturer, mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> @@ -384,9 +384,8 @@ class FrameSinkVideoCaptureDeviceTest : public testing::Test { device->OnFrameCaptured( std::move(data), media::mojom::VideoFrameInfo::New( - kMinCapturePeriod * frame_number, - base::Value(base::Value::Type::DICTIONARY), kFormat, - kResolution, gfx::Rect(kResolution), + kMinCapturePeriod * frame_number, media::VideoFrameMetadata(), + kFormat, kResolution, gfx::Rect(kResolution), gfx::ColorSpace::CreateREC709(), nullptr), gfx::Rect(kResolution), std::move(callbacks_remote)); }, diff --git a/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc b/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc index 4c6d8bf832e..f6f805f7240 100644 --- a/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc +++ b/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc @@ -16,17 +16,6 @@ namespace content { -namespace { - -ui::Cursor CreateDefaultPointerCursor() { - ui::Cursor cursor(ui::mojom::CursorType::kPointer); - std::unique_ptr<ui::CursorLoader> loader(ui::CursorLoader::Create()); - loader->SetPlatformCursor(&cursor); - return cursor; -} - -} // namespace - class MouseCursorOverlayController::Observer : public ui::EventHandler, public aura::WindowObserver { public: @@ -167,7 +156,7 @@ gfx::NativeCursor MouseCursorOverlayController::GetCurrentCursorOrDefault() } } - return CreateDefaultPointerCursor(); + return ui::mojom::CursorType::kPointer; } gfx::RectF MouseCursorOverlayController::ComputeRelativeBoundsForOverlay( @@ -212,13 +201,9 @@ void MouseCursorOverlayController::DisconnectFromToolkitForTesting() { observer_->StopTracking(); - // The default cursor is ui::mojom::CursorType::kNone. Make it kPointer so - // the tests have a non-empty cursor bitmap to work with. - auto* const window = Observer::GetTargetWindow(observer_); - CHECK(window); - auto* const host = window->GetHost(); - CHECK(host); - host->SetCursor(CreateDefaultPointerCursor()); + // Note: Not overriding the mouse cursor since the default is already + // ui::mojom::CursorType::kPointer, which provides the tests a bitmap they can + // work with. } // static diff --git a/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc b/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc index 3273303ed79..29e11332bd9 100644 --- a/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc +++ b/chromium/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc @@ -6,7 +6,6 @@ #include "base/macros.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" @@ -64,8 +63,7 @@ class MouseCursorOverlayControllerBrowserTest : public ContentBrowserTest { auto overlay_ptr = std::make_unique<FakeOverlay>(); FakeOverlay* const overlay = overlay_ptr.get(); DCHECK_CURRENTLY_ON(BrowserThread::UI); - controller_.Start(std::move(overlay_ptr), - base::CreateSingleThreadTaskRunner({BrowserThread::UI})); + controller_.Start(std::move(overlay_ptr), GetUIThreadTaskRunner({})); return overlay; } diff --git a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos.cc b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos.cc index 95497843db9..29946034b5e 100644 --- a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos.cc +++ b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/media/capture/lame_capture_overlay_chromeos.h" +#include "content/browser/media/capture/slow_capture_overlay_chromeos.h" #include <algorithm> #include <cmath> @@ -10,7 +10,7 @@ #include "base/bind.h" #include "base/numerics/ranges.h" #include "base/numerics/safe_conversions.h" -#include "content/browser/media/capture/lame_window_capturer_chromeos.h" +#include "content/browser/media/capture/slow_window_capturer_chromeos.h" #include "media/base/video_frame.h" #include "skia/ext/image_operations.h" #include "third_party/skia/include/core/SkColor.h" @@ -19,9 +19,9 @@ namespace content { -LameCaptureOverlayChromeOS::Owner::~Owner() = default; +SlowCaptureOverlayChromeOS::Owner::~Owner() = default; -LameCaptureOverlayChromeOS::LameCaptureOverlayChromeOS( +SlowCaptureOverlayChromeOS::SlowCaptureOverlayChromeOS( Owner* owner, mojo::PendingReceiver<viz::mojom::FrameSinkVideoCaptureOverlay> receiver) : receiver_(this, std::move(receiver)) { @@ -31,11 +31,11 @@ LameCaptureOverlayChromeOS::LameCaptureOverlayChromeOS( } } -LameCaptureOverlayChromeOS::~LameCaptureOverlayChromeOS() { +SlowCaptureOverlayChromeOS::~SlowCaptureOverlayChromeOS() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } -void LameCaptureOverlayChromeOS::SetImageAndBounds(const SkBitmap& image, +void SlowCaptureOverlayChromeOS::SetImageAndBounds(const SkBitmap& image, const gfx::RectF& bounds) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -44,7 +44,7 @@ void LameCaptureOverlayChromeOS::SetImageAndBounds(const SkBitmap& image, cached_scaled_image_.reset(); } -void LameCaptureOverlayChromeOS::SetBounds(const gfx::RectF& bounds) { +void SlowCaptureOverlayChromeOS::SetBounds(const gfx::RectF& bounds) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (bounds != bounds_) { @@ -89,8 +89,8 @@ inline int alpha_blend(int alpha, int src, int dst) { } // namespace -LameCaptureOverlayChromeOS::OnceRenderer -LameCaptureOverlayChromeOS::MakeRenderer(const gfx::Rect& region_in_frame) { +SlowCaptureOverlayChromeOS::OnceRenderer +SlowCaptureOverlayChromeOS::MakeRenderer(const gfx::Rect& region_in_frame) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (bounds_.IsEmpty() || image_.drawsNothing()) { @@ -122,7 +122,7 @@ LameCaptureOverlayChromeOS::MakeRenderer(const gfx::Rect& region_in_frame) { // The following binds all state required to render the overlay on a // VideoFrame at a later time. This callback does not require - // LameCaptureOverlayChromeOS to outlive it. + // SlowCaptureOverlayChromeOS to outlive it. return base::BindOnce( [](const SkBitmap& image, const gfx::Point& position, const gfx::Rect& rect, media::VideoFrame* frame) { diff --git a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos.h b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos.h index fc912f0fd8a..1a00e0f99a4 100644 --- a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos.h +++ b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_LAME_CAPTURE_OVERLAY_CHROMEOS_H_ -#define CONTENT_BROWSER_MEDIA_CAPTURE_LAME_CAPTURE_OVERLAY_CHROMEOS_H_ +#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_CAPTURE_OVERLAY_CHROMEOS_H_ +#define CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_CAPTURE_OVERLAY_CHROMEOS_H_ #include "base/callback.h" #include "base/macros.h" @@ -23,7 +23,7 @@ namespace content { // A minimal FrameSinkVideoCaptureOverlay implementation for aura::Window video // capture on ChromeOS (i.e., not desktop capture, and not WebContents capture). -// See class comments for LameWindowCapturerChromeOS for further details on why +// See class comments for SlowWindowCapturerChromeOS for further details on why // this exists and why this placeholder is needed for now. // // The implementation here is a hodgepodge of code borrowed from @@ -35,16 +35,16 @@ namespace content { // renderer. // // TODO(crbug/806366): The goal is to remove this code by 2019. -class CONTENT_EXPORT LameCaptureOverlayChromeOS +class CONTENT_EXPORT SlowCaptureOverlayChromeOS : public viz::mojom::FrameSinkVideoCaptureOverlay { public: - // Implemented by LameWindowCapturerChromeOS. + // Implemented by SlowWindowCapturerChromeOS. class CONTENT_EXPORT Owner { public: // Called to notify that the |overlay| has lost its mojo binding. The owner // will usually delete it during this method call. virtual void OnOverlayConnectionLost( - LameCaptureOverlayChromeOS* overlay) = 0; + SlowCaptureOverlayChromeOS* overlay) = 0; protected: virtual ~Owner(); @@ -53,10 +53,10 @@ class CONTENT_EXPORT LameCaptureOverlayChromeOS // A OnceCallback that, when run, renders the overlay on a VideoFrame. using OnceRenderer = base::OnceCallback<void(media::VideoFrame*)>; - LameCaptureOverlayChromeOS( + SlowCaptureOverlayChromeOS( Owner* owner, mojo::PendingReceiver<viz::mojom::FrameSinkVideoCaptureOverlay> receiver); - ~LameCaptureOverlayChromeOS() final; + ~SlowCaptureOverlayChromeOS() final; // viz::mojom::FrameSinkVideoCaptureOverlay implementation. void SetImageAndBounds(const SkBitmap& image, const gfx::RectF& bounds) final; @@ -81,9 +81,9 @@ class CONTENT_EXPORT LameCaptureOverlayChromeOS // bitmap size changes. SkBitmap cached_scaled_image_; - DISALLOW_COPY_AND_ASSIGN(LameCaptureOverlayChromeOS); + DISALLOW_COPY_AND_ASSIGN(SlowCaptureOverlayChromeOS); }; } // namespace content -#endif // CONTENT_BROWSER_MEDIA_CAPTURE_LAME_CAPTURE_OVERLAY_CHROMEOS_H_ +#endif // CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_CAPTURE_OVERLAY_CHROMEOS_H_ diff --git a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos_unittest.cc b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos_unittest.cc index 6c29a34c3f4..b3808834a1a 100644 --- a/chromium/content/browser/media/capture/lame_capture_overlay_chromeos_unittest.cc +++ b/chromium/content/browser/media/capture/slow_capture_overlay_chromeos_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/media/capture/lame_capture_overlay_chromeos.h" +#include "content/browser/media/capture/slow_capture_overlay_chromeos.h" #include <stdint.h> @@ -27,7 +27,7 @@ constexpr gfx::Size kFrameSize = gfx::Size(320, 200); constexpr gfx::Rect kContentRegion = gfx::Rect(kFrameSize); constexpr gfx::RectF kSpanOfEntireFrame = gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f); -class LameCaptureOverlayChromeOSTest : public testing::Test { +class SlowCaptureOverlayChromeOSTest : public testing::Test { public: void RunUntilIdle() { env_.RunUntilIdle(); } @@ -68,9 +68,9 @@ class LameCaptureOverlayChromeOSTest : public testing::Test { base::test::TaskEnvironment env_; }; -TEST_F(LameCaptureOverlayChromeOSTest, UnsetImageNotRenderedOnFrame) { +TEST_F(SlowCaptureOverlayChromeOSTest, UnsetImageNotRenderedOnFrame) { mojo::Remote<viz::mojom::FrameSinkVideoCaptureOverlay> overlay_remote; - LameCaptureOverlayChromeOS overlay( + SlowCaptureOverlayChromeOS overlay( nullptr, overlay_remote.BindNewPipeAndPassReceiver()); // Bounds set, but no image. → Should not render anything. @@ -82,9 +82,9 @@ TEST_F(LameCaptureOverlayChromeOSTest, UnsetImageNotRenderedOnFrame) { EXPECT_TRUE(overlay.MakeRenderer(kContentRegion)); } -TEST_F(LameCaptureOverlayChromeOSTest, HiddenImageNotRenderedOnFrame) { +TEST_F(SlowCaptureOverlayChromeOSTest, HiddenImageNotRenderedOnFrame) { mojo::Remote<viz::mojom::FrameSinkVideoCaptureOverlay> overlay_remote; - LameCaptureOverlayChromeOS overlay( + SlowCaptureOverlayChromeOS overlay( nullptr, overlay_remote.BindNewPipeAndPassReceiver()); // Both image and bounds set. → Should render something. @@ -96,9 +96,9 @@ TEST_F(LameCaptureOverlayChromeOSTest, HiddenImageNotRenderedOnFrame) { EXPECT_FALSE(overlay.MakeRenderer(kContentRegion)); } -TEST_F(LameCaptureOverlayChromeOSTest, OutOfBoundsOverlayNotRenderedOnFrame) { +TEST_F(SlowCaptureOverlayChromeOSTest, OutOfBoundsOverlayNotRenderedOnFrame) { mojo::Remote<viz::mojom::FrameSinkVideoCaptureOverlay> overlay_remote; - LameCaptureOverlayChromeOS overlay( + SlowCaptureOverlayChromeOS overlay( nullptr, overlay_remote.BindNewPipeAndPassReceiver()); // Both image and bounds set. → Should render something. @@ -110,9 +110,9 @@ TEST_F(LameCaptureOverlayChromeOSTest, OutOfBoundsOverlayNotRenderedOnFrame) { EXPECT_FALSE(overlay.MakeRenderer(kContentRegion)); } -TEST_F(LameCaptureOverlayChromeOSTest, ImageRenderedOnFrame) { +TEST_F(SlowCaptureOverlayChromeOSTest, ImageRenderedOnFrame) { mojo::Remote<viz::mojom::FrameSinkVideoCaptureOverlay> overlay_remote; - LameCaptureOverlayChromeOS overlay( + SlowCaptureOverlayChromeOS overlay( nullptr, overlay_remote.BindNewPipeAndPassReceiver()); // Create blank black frame. No non-zero pixels should be present. @@ -156,16 +156,16 @@ TEST_F(LameCaptureOverlayChromeOSTest, ImageRenderedOnFrame) { } } -TEST_F(LameCaptureOverlayChromeOSTest, ReportsLostMojoConnection) { - class MockOwner : public LameCaptureOverlayChromeOS::Owner { +TEST_F(SlowCaptureOverlayChromeOSTest, ReportsLostMojoConnection) { + class MockOwner : public SlowCaptureOverlayChromeOS::Owner { public: ~MockOwner() final = default; MOCK_METHOD1(OnOverlayConnectionLost, - void(LameCaptureOverlayChromeOS* overlay)); + void(SlowCaptureOverlayChromeOS* overlay)); } mock_owner; mojo::Remote<viz::mojom::FrameSinkVideoCaptureOverlay> overlay_remote; - LameCaptureOverlayChromeOS overlay( + SlowCaptureOverlayChromeOS overlay( &mock_owner, overlay_remote.BindNewPipeAndPassReceiver()); ASSERT_TRUE(overlay_remote); RunUntilIdle(); // Propagate mojo tasks. diff --git a/chromium/content/browser/media/capture/lame_window_capturer_chromeos.cc b/chromium/content/browser/media/capture/slow_window_capturer_chromeos.cc index 1a7536a42c7..25982224ef9 100644 --- a/chromium/content/browser/media/capture/lame_window_capturer_chromeos.cc +++ b/chromium/content/browser/media/capture/slow_window_capturer_chromeos.cc @@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/media/capture/lame_window_capturer_chromeos.h" +#include "content/browser/media/capture/slow_window_capturer_chromeos.h" #include <algorithm> #include "base/bind.h" #include "base/bind_helpers.h" #include "base/location.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/frame_sinks/copy_output_result.h" #include "media/base/limits.h" @@ -31,22 +32,22 @@ gfx::Size AdjustSizeForI420Format(const gfx::Size& raw_size) { } // namespace // static -constexpr base::TimeDelta LameWindowCapturerChromeOS::kAbsoluteMinCapturePeriod; +constexpr base::TimeDelta SlowWindowCapturerChromeOS::kAbsoluteMinCapturePeriod; -LameWindowCapturerChromeOS::LameWindowCapturerChromeOS(aura::Window* target) +SlowWindowCapturerChromeOS::SlowWindowCapturerChromeOS(aura::Window* target) : target_(target), copy_request_source_(base::UnguessableToken::Create()) { if (target_) { target_->AddObserver(this); } } -LameWindowCapturerChromeOS::~LameWindowCapturerChromeOS() { +SlowWindowCapturerChromeOS::~SlowWindowCapturerChromeOS() { if (target_) { target_->RemoveObserver(this); } } -void LameWindowCapturerChromeOS::SetFormat(media::VideoPixelFormat format, +void SlowWindowCapturerChromeOS::SetFormat(media::VideoPixelFormat format, const gfx::ColorSpace& color_space) { if (format != media::PIXEL_FORMAT_I420) { LOG(DFATAL) << "Invalid pixel format: Only I420 is supported."; @@ -57,7 +58,7 @@ void LameWindowCapturerChromeOS::SetFormat(media::VideoPixelFormat format, } } -void LameWindowCapturerChromeOS::SetMinCapturePeriod( +void SlowWindowCapturerChromeOS::SetMinCapturePeriod( base::TimeDelta min_capture_period) { capture_period_ = std::max(min_capture_period, kAbsoluteMinCapturePeriod); @@ -65,14 +66,14 @@ void LameWindowCapturerChromeOS::SetMinCapturePeriod( // re-start with the new capture period. if (timer_.IsRunning()) { timer_.Start(FROM_HERE, capture_period_, this, - &LameWindowCapturerChromeOS::CaptureNextFrame); + &SlowWindowCapturerChromeOS::CaptureNextFrame); } } -void LameWindowCapturerChromeOS::SetMinSizeChangePeriod( +void SlowWindowCapturerChromeOS::SetMinSizeChangePeriod( base::TimeDelta min_period) {} -void LameWindowCapturerChromeOS::SetResolutionConstraints( +void SlowWindowCapturerChromeOS::SetResolutionConstraints( const gfx::Size& min_size, const gfx::Size& max_size, bool use_fixed_aspect_ratio) { @@ -95,17 +96,17 @@ void LameWindowCapturerChromeOS::SetResolutionConstraints( in_flight_count_ = 0; } -void LameWindowCapturerChromeOS::SetAutoThrottlingEnabled(bool enabled) { +void SlowWindowCapturerChromeOS::SetAutoThrottlingEnabled(bool enabled) { NOTIMPLEMENTED(); } -void LameWindowCapturerChromeOS::ChangeTarget( +void SlowWindowCapturerChromeOS::ChangeTarget( const base::Optional<viz::FrameSinkId>& frame_sink_id) { - // The LameWindowCapturerChromeOS does not capture from compositor frame + // The SlowWindowCapturerChromeOS does not capture from compositor frame // sinks. } -void LameWindowCapturerChromeOS::Start( +void SlowWindowCapturerChromeOS::Start( mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumer> consumer) { DCHECK(consumer); @@ -115,13 +116,13 @@ void LameWindowCapturerChromeOS::Start( // In the future, if the connection to the consumer is lost before a call to // Stop(), make that call on its behalf. consumer_.set_disconnect_handler(base::BindOnce( - &LameWindowCapturerChromeOS::Stop, base::Unretained(this))); + &SlowWindowCapturerChromeOS::Stop, base::Unretained(this))); timer_.Start(FROM_HERE, capture_period_, this, - &LameWindowCapturerChromeOS::CaptureNextFrame); + &SlowWindowCapturerChromeOS::CaptureNextFrame); } -void LameWindowCapturerChromeOS::Stop() { +void SlowWindowCapturerChromeOS::Stop() { // Stop the timer, cancel any in-flight frames, and clear the buffer pool. timer_.Stop(); weak_factory_.InvalidateWeakPtrs(); @@ -134,24 +135,24 @@ void LameWindowCapturerChromeOS::Stop() { } } -void LameWindowCapturerChromeOS::RequestRefreshFrame() { - // This is ignored because the LameWindowCapturerChromeOS captures frames +void SlowWindowCapturerChromeOS::RequestRefreshFrame() { + // This is ignored because the SlowWindowCapturerChromeOS captures frames // continuously. } -void LameWindowCapturerChromeOS::CreateOverlay( +void SlowWindowCapturerChromeOS::CreateOverlay( int32_t stacking_index, mojo::PendingReceiver<viz::mojom::FrameSinkVideoCaptureOverlay> receiver) { - // LameWindowCapturerChromeOS only supports one overlay at a time. If one + // SlowWindowCapturerChromeOS only supports one overlay at a time. If one // already exists, the following will cause it to be dropped. overlay_ = - std::make_unique<LameCaptureOverlayChromeOS>(this, std::move(receiver)); + std::make_unique<SlowCaptureOverlayChromeOS>(this, std::move(receiver)); } -class LameWindowCapturerChromeOS::InFlightFrame +class SlowWindowCapturerChromeOS::InFlightFrame : public viz::mojom::FrameSinkVideoConsumerFrameCallbacks { public: - InFlightFrame(base::WeakPtr<LameWindowCapturerChromeOS> capturer, + InFlightFrame(base::WeakPtr<SlowWindowCapturerChromeOS> capturer, base::MappedReadOnlyRegion buffer) : capturer_(std::move(capturer)), buffer_(std::move(buffer)) {} @@ -169,7 +170,7 @@ class LameWindowCapturerChromeOS::InFlightFrame const gfx::Rect& content_rect() const { return content_rect_; } void set_content_rect(const gfx::Rect& rect) { content_rect_ = rect; } - void set_overlay_renderer(LameCaptureOverlayChromeOS::OnceRenderer renderer) { + void set_overlay_renderer(SlowCaptureOverlayChromeOS::OnceRenderer renderer) { overlay_renderer_ = std::move(renderer); } void RenderOptionalOverlay() { @@ -199,23 +200,23 @@ class LameWindowCapturerChromeOS::InFlightFrame void ProvideFeedback(double utilization) final {} private: - base::WeakPtr<LameWindowCapturerChromeOS> capturer_; + base::WeakPtr<SlowWindowCapturerChromeOS> capturer_; base::MappedReadOnlyRegion buffer_; scoped_refptr<VideoFrame> video_frame_; gfx::Rect content_rect_; - LameCaptureOverlayChromeOS::OnceRenderer overlay_renderer_; + SlowCaptureOverlayChromeOS::OnceRenderer overlay_renderer_; DISALLOW_COPY_AND_ASSIGN(InFlightFrame); }; -void LameWindowCapturerChromeOS::OnOverlayConnectionLost( - LameCaptureOverlayChromeOS* overlay) { +void SlowWindowCapturerChromeOS::OnOverlayConnectionLost( + SlowCaptureOverlayChromeOS* overlay) { if (overlay_.get() == overlay) { overlay_.reset(); } } -void LameWindowCapturerChromeOS::CaptureNextFrame() { +void SlowWindowCapturerChromeOS::CaptureNextFrame() { // If the maximum frame in-flight count has been reached, skip this frame. if (in_flight_count_ >= kMaxFramesInFlight) { return; @@ -260,11 +261,10 @@ void LameWindowCapturerChromeOS::CaptureNextFrame() { auto* const frame = in_flight_frame->video_frame(); DCHECK(frame); VideoFrameMetadata* const metadata = frame->metadata(); - metadata->SetTimeTicks(VideoFrameMetadata::CAPTURE_BEGIN_TIME, begin_time); - metadata->SetTimeDelta(VideoFrameMetadata::FRAME_DURATION, capture_period_); - metadata->SetDouble(VideoFrameMetadata::FRAME_RATE, - 1.0 / capture_period_.InSecondsF()); - metadata->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME, begin_time); + metadata->capture_begin_time = begin_time; + metadata->frame_duration = capture_period_; + metadata->frame_rate = 1.0 / capture_period_.InSecondsF(); + metadata->reference_time = begin_time; frame->set_color_space(gfx::ColorSpace::CreateREC709()); // Compute the region of the VideoFrame that will contain the content. If @@ -292,7 +292,7 @@ void LameWindowCapturerChromeOS::CaptureNextFrame() { auto request = std::make_unique<viz::CopyOutputRequest>( // Note: As of this writing, I420_PLANES is not supported external to VIZ. viz::CopyOutputRequest::ResultFormat::RGBA_BITMAP, - base::BindOnce(&LameWindowCapturerChromeOS::DidCopyFrame, + base::BindOnce(&SlowWindowCapturerChromeOS::DidCopyFrame, weak_factory_.GetWeakPtr(), std::move(in_flight_frame))); request->set_source(copy_request_source_); request->set_area(gfx::Rect(source_size)); @@ -300,10 +300,12 @@ void LameWindowCapturerChromeOS::CaptureNextFrame() { gfx::Vector2d(source_size.width(), source_size.height()), gfx::Vector2d(content_rect.width(), content_rect.height())); request->set_result_selection(gfx::Rect(content_rect.size())); + request->set_result_task_runner( + base::SequencedTaskRunnerHandle::Get()); target_->layer()->RequestCopyOfOutput(std::move(request)); } -void LameWindowCapturerChromeOS::DidCopyFrame( +void SlowWindowCapturerChromeOS::DidCopyFrame( std::unique_ptr<InFlightFrame> in_flight_frame, std::unique_ptr<viz::CopyOutputResult> result) { // Populate the VideoFrame from the CopyOutputResult. @@ -337,12 +339,11 @@ void LameWindowCapturerChromeOS::DidCopyFrame( DeliverFrame(std::move(in_flight_frame)); } -void LameWindowCapturerChromeOS::DeliverFrame( +void SlowWindowCapturerChromeOS::DeliverFrame( std::unique_ptr<InFlightFrame> in_flight_frame) { auto* const frame = in_flight_frame->video_frame(); DCHECK(frame); - frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_END_TIME, - base::TimeTicks::Now()); + frame->metadata()->capture_end_time = base::TimeTicks::Now(); // Clone the buffer handle for the consumer. base::ReadOnlySharedMemoryRegion handle = @@ -355,7 +356,7 @@ void LameWindowCapturerChromeOS::DeliverFrame( // the consumer. media::mojom::VideoFrameInfoPtr info = media::mojom::VideoFrameInfo::New(); info->timestamp = frame->timestamp(); - info->metadata = frame->metadata()->GetInternalValues().Clone(); + info->metadata = *(frame->metadata()); info->pixel_format = frame->format(); info->coded_size = frame->coded_size(); info->visible_rect = frame->visible_rect(); @@ -376,7 +377,7 @@ void LameWindowCapturerChromeOS::DeliverFrame( std::move(callbacks)); } -void LameWindowCapturerChromeOS::OnWindowDestroying(aura::Window* window) { +void SlowWindowCapturerChromeOS::OnWindowDestroying(aura::Window* window) { if (window == target_) { target_->RemoveObserver(this); target_ = nullptr; diff --git a/chromium/content/browser/media/capture/lame_window_capturer_chromeos.h b/chromium/content/browser/media/capture/slow_window_capturer_chromeos.h index 98b83068b47..ab68a779148 100644 --- a/chromium/content/browser/media/capture/lame_window_capturer_chromeos.h +++ b/chromium/content/browser/media/capture/slow_window_capturer_chromeos.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_LAME_WINDOW_CAPTURER_CHROMEOS_H_ -#define CONTENT_BROWSER_MEDIA_CAPTURE_LAME_WINDOW_CAPTURER_CHROMEOS_H_ +#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_WINDOW_CAPTURER_CHROMEOS_H_ +#define CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_WINDOW_CAPTURER_CHROMEOS_H_ #include <memory> #include <utility> @@ -15,7 +15,7 @@ #include "base/time/time.h" #include "base/timer/timer.h" #include "base/unguessable_token.h" -#include "content/browser/media/capture/lame_capture_overlay_chromeos.h" +#include "content/browser/media/capture/slow_capture_overlay_chromeos.h" #include "media/base/video_frame.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -50,12 +50,12 @@ namespace content { // running. // // TODO(crbug/806366): The goal is to remove this code by 2019. -class LameWindowCapturerChromeOS : public viz::mojom::FrameSinkVideoCapturer, - public LameCaptureOverlayChromeOS::Owner, +class SlowWindowCapturerChromeOS : public viz::mojom::FrameSinkVideoCapturer, + public SlowCaptureOverlayChromeOS::Owner, public aura::WindowObserver { public: - explicit LameWindowCapturerChromeOS(aura::Window* target); - ~LameWindowCapturerChromeOS() final; + explicit SlowWindowCapturerChromeOS(aura::Window* target); + ~SlowWindowCapturerChromeOS() final; // viz::mojom::FrameSinkVideoCapturer implementation. void SetFormat(media::VideoPixelFormat format, @@ -83,8 +83,8 @@ class LameWindowCapturerChromeOS : public viz::mojom::FrameSinkVideoCapturer, // returns the buffer back to the pool. class InFlightFrame; - // LameWindowCapturerChromeOS::Owner implementation. - void OnOverlayConnectionLost(LameCaptureOverlayChromeOS* overlay) final; + // SlowWindowCapturerChromeOS::Owner implementation. + void OnOverlayConnectionLost(SlowCaptureOverlayChromeOS* overlay) final; // Initiates capture of the next frame. This is called periodically by the // |timer_|. @@ -134,11 +134,11 @@ class LameWindowCapturerChromeOS : public viz::mojom::FrameSinkVideoCapturer, const base::UnguessableToken copy_request_source_; // An optional overlay to be rendered over each captured video frame. - std::unique_ptr<LameCaptureOverlayChromeOS> overlay_; + std::unique_ptr<SlowCaptureOverlayChromeOS> overlay_; // Used for cancelling any outstanding activities' results, once Stop() is // called and there is no longer a consumer to receive another frame. - base::WeakPtrFactory<LameWindowCapturerChromeOS> weak_factory_{this}; + base::WeakPtrFactory<SlowWindowCapturerChromeOS> weak_factory_{this}; // Enforce a very low maximum frame rate (5 FPS), due to the lack of // design optimizations. See top-level class comments. @@ -148,9 +148,9 @@ class LameWindowCapturerChromeOS : public viz::mojom::FrameSinkVideoCapturer, // The maximum number of frames in-flight at any one time. static constexpr int kMaxFramesInFlight = 3; - DISALLOW_COPY_AND_ASSIGN(LameWindowCapturerChromeOS); + DISALLOW_COPY_AND_ASSIGN(SlowWindowCapturerChromeOS); }; } // namespace content -#endif // CONTENT_BROWSER_MEDIA_CAPTURE_LAME_WINDOW_CAPTURER_CHROMEOS_H_ +#endif // CONTENT_BROWSER_MEDIA_CAPTURE_SLOW_WINDOW_CAPTURER_CHROMEOS_H_ diff --git a/chromium/content/browser/media/capture/web_contents_audio_muter.cc b/chromium/content/browser/media/capture/web_contents_audio_muter.cc index 9b6c5b702e8..fbf4b24f470 100644 --- a/chromium/content/browser/media/capture/web_contents_audio_muter.cc +++ b/chromium/content/browser/media/capture/web_contents_audio_muter.cc @@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/macros.h" -#include "base/task/post_task.h" #include "base/time/time.h" #include "content/browser/media/capture/audio_mirroring_manager.h" #include "content/public/browser/browser_task_traits.h" @@ -93,8 +92,8 @@ class WebContentsAudioMuter::MuteDestination void QueryForMatches(const std::set<GlobalFrameRoutingId>& candidates, MatchesCallback results_callback) override { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MuteDestination::QueryForMatchesOnUIThread, this, candidates, media::BindToCurrentLoop(std::move(results_callback)))); @@ -148,8 +147,8 @@ void WebContentsAudioMuter::StartMuting() { if (is_muting_) return; is_muting_ = true; - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&AudioMirroringManager::StartMirroring, base::Unretained(AudioMirroringManager::GetInstance()), base::RetainedRef(destination_))); @@ -160,8 +159,8 @@ void WebContentsAudioMuter::StopMuting() { if (!is_muting_) return; is_muting_ = false; - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&AudioMirroringManager::StopMirroring, base::Unretained(AudioMirroringManager::GetInstance()), base::RetainedRef(destination_))); diff --git a/chromium/content/browser/media/capture/web_contents_tracker.cc b/chromium/content/browser/media/capture/web_contents_tracker.cc index 38247fcae46..f51484edbba 100644 --- a/chromium/content/browser/media/capture/web_contents_tracker.cc +++ b/chromium/content/browser/media/capture/web_contents_tracker.cc @@ -5,7 +5,6 @@ #include "content/browser/media/capture/web_contents_tracker.h" #include "base/bind.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -34,8 +33,8 @@ void WebContentsTracker::Start(int render_process_id, if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { StartObservingWebContents(render_process_id, main_render_frame_id); } else { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&WebContentsTracker::StartObservingWebContents, this, render_process_id, main_render_frame_id)); } @@ -50,8 +49,8 @@ void WebContentsTracker::Stop() { if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { WebContentsObserver::Observe(nullptr); } else { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&WebContentsTracker::Observe, this, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&WebContentsTracker::Observe, this, static_cast<WebContents*>(nullptr))); } } diff --git a/chromium/content/browser/media/capture/web_contents_video_capture_device.cc b/chromium/content/browser/media/capture/web_contents_video_capture_device.cc index 20db3e37aee..3224837a807 100644 --- a/chromium/content/browser/media/capture/web_contents_video_capture_device.cc +++ b/chromium/content/browser/media/capture/web_contents_video_capture_device.cc @@ -11,7 +11,6 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/media/capture/mouse_cursor_overlay_controller.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" @@ -45,8 +44,8 @@ class WebContentsVideoCaptureDevice::FrameTracker DCHECK(device_task_runner_); DCHECK(cursor_controller_); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce( [](base::WeakPtr<FrameTracker> self, int process_id, int frame_id) { if (self) { @@ -236,16 +235,16 @@ WebContentsVideoCaptureDevice::Create(const std::string& device_id) { } void WebContentsVideoCaptureDevice::WillStart() { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&FrameTracker::WillStartCapturingWebContents, tracker_->AsWeakPtr(), capture_params().SuggestConstraints().max_frame_size)); } void WebContentsVideoCaptureDevice::DidStop() { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&FrameTracker::DidStopCapturingWebContents, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&FrameTracker::DidStopCapturingWebContents, tracker_->AsWeakPtr())); } diff --git a/chromium/content/browser/media/capture/web_contents_video_capture_device.h b/chromium/content/browser/media/capture/web_contents_video_capture_device.h index 4d6d1175c09..a90723e141a 100644 --- a/chromium/content/browser/media/capture/web_contents_video_capture_device.h +++ b/chromium/content/browser/media/capture/web_contents_video_capture_device.h @@ -8,7 +8,6 @@ #include <memory> #include <string> -#include "base/logging.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/browser/media/capture/frame_sink_video_capture_device.h" diff --git a/chromium/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc b/chromium/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc index 2c651c8b050..03310777203 100644 --- a/chromium/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc +++ b/chromium/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc @@ -8,7 +8,6 @@ #include "base/macros.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "cc/test/pixel_test_utils.h" #include "components/viz/common/features.h" @@ -145,8 +144,8 @@ class WebContentsVideoCaptureDeviceBrowserTest // Wait for at least the minimum capture period before checking for more // captured frames. base::RunLoop run_loop; - base::PostDelayedTask(FROM_HERE, {BrowserThread::UI}, - run_loop.QuitClosure(), GetMinCapturePeriod()); + GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), GetMinCapturePeriod()); run_loop.Run(); } } @@ -320,8 +319,8 @@ IN_PROC_BROWSER_TEST_F(WebContentsVideoCaptureDeviceBrowserTest, // frames were queued because the device should be suspended. ChangePageContentColor(SK_ColorGREEN); base::RunLoop run_loop; - base::PostDelayedTask(FROM_HERE, {BrowserThread::UI}, run_loop.QuitClosure(), - base::TimeDelta::FromSeconds(5)); + GetUIThreadTaskRunner({})->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), + base::TimeDelta::FromSeconds(5)); run_loop.Run(); EXPECT_FALSE(HasCapturedFramesInQueue()); diff --git a/chromium/content/browser/media/cdm_file_impl.cc b/chromium/content/browser/media/cdm_file_impl.cc index 3b3193b4a8d..8b5055e7bd1 100644 --- a/chromium/content/browser/media/cdm_file_impl.cc +++ b/chromium/content/browser/media/cdm_file_impl.cc @@ -13,7 +13,6 @@ #include "base/metrics/histogram_functions.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" -#include "base/task/post_task.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "media/base/bind_to_current_loop.h" @@ -454,8 +453,7 @@ void CdmFileImpl::Read(ReadCallback callback) { // the IO thread. Use of base::Unretained() is OK as the reader is owned by // |this|, and if |this| is destructed it will destroy the file reader on the // IO thread. - file_reader_ = base::SequenceBound<FileReader>( - base::CreateSequencedTaskRunner({BrowserThread::IO})); + file_reader_ = base::SequenceBound<FileReader>(GetIOThreadTaskRunner({})); file_reader_.Post(FROM_HERE, &FileReader::Read, file_system_context_, CreateFileSystemURL(file_name_), std::move(read_done_cb)); } @@ -602,8 +600,7 @@ void CdmFileImpl::OnTempFileIsEmpty(scoped_refptr<net::IOBuffer> buffer, // on the IO thread to write |buffer| into the temporary file. Use of // base::Unretained() is OK as |file_writer_| is owned by |this|, and if // |this| is destructed it will destroy |file_writer_| on the IO thread. - file_writer_ = base::SequenceBound<FileWriter>( - base::CreateSequencedTaskRunner({BrowserThread::IO})); + file_writer_ = base::SequenceBound<FileWriter>(GetIOThreadTaskRunner({})); file_writer_.Post(FROM_HERE, &FileWriter::Write, file_system_context_, CreateFileSystemURL(temp_file_name_), std::move(buffer), bytes_to_write, std::move(write_done_cb)); diff --git a/chromium/content/browser/media/flinging_renderer.cc b/chromium/content/browser/media/flinging_renderer.cc index 5cd9b9e286b..f98e2f5d85c 100644 --- a/chromium/content/browser/media/flinging_renderer.cc +++ b/chromium/content/browser/media/flinging_renderer.cc @@ -72,12 +72,6 @@ void FlingingRenderer::Initialize(media::MediaResource* media_resource, std::move(init_cb).Run(media::PIPELINE_OK); } -void FlingingRenderer::SetCdm(media::CdmContext* cdm_context, - media::CdmAttachedCB cdm_attached_cb) { - // The flinging renderer does not support playing encrypted content. - NOTREACHED(); -} - void FlingingRenderer::SetLatencyHint( base::Optional<base::TimeDelta> latency_hint) {} diff --git a/chromium/content/browser/media/flinging_renderer.h b/chromium/content/browser/media/flinging_renderer.h index 803458ca725..5eba7df4315 100644 --- a/chromium/content/browser/media/flinging_renderer.h +++ b/chromium/content/browser/media/flinging_renderer.h @@ -47,8 +47,6 @@ class CONTENT_EXPORT FlingingRenderer : public media::Renderer, 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; void SetLatencyHint(base::Optional<base::TimeDelta> latency_hint) override; void Flush(base::OnceClosure flush_cb) override; void StartPlayingFrom(base::TimeDelta time) override; diff --git a/chromium/content/browser/media/forwarding_audio_stream_factory.cc b/chromium/content/browser/media/forwarding_audio_stream_factory.cc index e711cf4165b..2e33951eac0 100644 --- a/chromium/content/browser/media/forwarding_audio_stream_factory.cc +++ b/chromium/content/browser/media/forwarding_audio_stream_factory.cc @@ -11,7 +11,6 @@ #include "base/location.h" #include "base/no_destructor.h" #include "base/stl_util.h" -#include "base/task/post_task.h" #include "base/trace_event/trace_event.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/audio_service.h" @@ -177,8 +176,8 @@ void ForwardingAudioStreamFactory::Core::AddLoopbackSink( AudioStreamBroker::LoopbackSink* sink) { DCHECK_CURRENTLY_ON(BrowserThread::IO); loopback_sinks_.insert(sink); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&ForwardingAudioStreamFactory::LoopbackStreamStarted, owner_)); } @@ -187,8 +186,8 @@ void ForwardingAudioStreamFactory::Core::RemoveLoopbackSink( AudioStreamBroker::LoopbackSink* sink) { DCHECK_CURRENTLY_ON(BrowserThread::IO); loopback_sinks_.erase(sink); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&ForwardingAudioStreamFactory::LoopbackStreamStopped, owner_)); } @@ -236,8 +235,8 @@ ForwardingAudioStreamFactory::~ForwardingAudioStreamFactory() { // as it doesn't post in case it is already executed on the right thread. That // causes issues in unit tests where the UI thread and the IO thread are the // same. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce([](std::unique_ptr<Core>) {}, std::move(core_))); } @@ -258,8 +257,8 @@ void ForwardingAudioStreamFactory::SetMuted(bool muted) { // Unretained is safe since the destruction of |core_| will be posted to the // IO thread later. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&Core::SetMuted, base::Unretained(core_.get()), muted)); } } @@ -276,8 +275,8 @@ void ForwardingAudioStreamFactory::FrameDeleted( // Unretained is safe since the destruction of |core_| will be posted to the // IO thread later. - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&Core::CleanupStreamsBelongingTo, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&Core::CleanupStreamsBelongingTo, base::Unretained(core_.get()), render_frame_host->GetProcess()->GetID(), render_frame_host->GetRoutingID())); @@ -337,8 +336,8 @@ audio::mojom::StreamFactory* ForwardingAudioStreamFactory::Core::GetFactory() { TRACE_EVENT_INSTANT1( "audio", "ForwardingAudioStreamFactory: Binding new factory", TRACE_EVENT_SCOPE_THREAD, "group", group_id_.GetLowForSerialization()); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&BindStreamFactoryFromUIThread, remote_factory_.BindNewPipeAndPassReceiver())); // Unretained is safe because |this| owns |remote_factory_|. diff --git a/chromium/content/browser/media/in_process_audio_loopback_stream_creator.cc b/chromium/content/browser/media/in_process_audio_loopback_stream_creator.cc index a90f9325606..2257a7c5ee5 100644 --- a/chromium/content/browser/media/in_process_audio_loopback_stream_creator.cc +++ b/chromium/content/browser/media/in_process_audio_loopback_stream_creator.cc @@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/check_op.h" #include "base/location.h" -#include "base/task/post_task.h" #include "content/browser/browser_main_loop.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/media/renderer_audio_input_stream_factory.mojom.h" @@ -116,8 +115,8 @@ void InProcessAudioLoopbackStreamCreator::CreateLoopbackStream( // Deletion of factory_.core() is posted to the IO thread when |factory_| is // destroyed, so Unretained is safe below. if (loopback_source) { - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&CreateLoopbackStreamHelper, factory_.core(), + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&CreateLoopbackStreamHelper, factory_.core(), static_cast<WebContentsImpl*>(loopback_source) ->GetAudioStreamFactory() ->core(), @@ -125,8 +124,8 @@ void InProcessAudioLoopbackStreamCreator::CreateLoopbackStream( return; } // A null |frame_of_source_web_contents| requests system-wide loopback. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&CreateSystemWideLoopbackStreamHelper, factory_.core(), params, total_segments, std::move(client))); } diff --git a/chromium/content/browser/media/media_browsertest.cc b/chromium/content/browser/media/media_browsertest.cc index a29d792d29b..df13b63bd37 100644 --- a/chromium/content/browser/media/media_browsertest.cc +++ b/chromium/content/browser/media/media_browsertest.cc @@ -167,6 +167,26 @@ class MediaTest : public testing::WithParamInterface<bool>, } }; +#if defined(OS_ANDROID) +class AndroidPlayerMediaTest : public MediaTest { + private: + void SetUpCommandLine(base::CommandLine* command_line) override { + MediaTest::SetUpCommandLine(command_line); + command_line->AppendSwitch(switches::kDisableAcceleratedVideoDecode); + } +}; + +// TODO(crbug.com/1094571): Flaky. +IN_PROC_BROWSER_TEST_P(AndroidPlayerMediaTest, DISABLED_VideoBearMp4) { + PlayVideo("bear.mp4", GetParam()); +} + +INSTANTIATE_TEST_SUITE_P(File, + AndroidPlayerMediaTest, + ::testing::Values(false)); +INSTANTIATE_TEST_SUITE_P(Http, AndroidPlayerMediaTest, ::testing::Values(true)); +#endif // defined(OS_ANDROID) + // Android doesn't support Theora. #if !defined(OS_ANDROID) IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearTheora) { diff --git a/chromium/content/browser/media/media_canplaytype_browsertest.cc b/chromium/content/browser/media/media_canplaytype_browsertest.cc index 3e8d10e6f50..22ea057c43c 100644 --- a/chromium/content/browser/media/media_canplaytype_browsertest.cc +++ b/chromium/content/browser/media/media_canplaytype_browsertest.cc @@ -22,1572 +22,161 @@ #include "base/android/build_info.h" #endif -const char kProbably[] = "probably"; -const char kMaybe[] = "maybe"; -const char kNot[] = ""; - -#if BUILDFLAG(USE_PROPRIETARY_CODECS) -const char* kPropProbably = kProbably; -const char* kPropMaybe = kMaybe; -#else -const char* kPropProbably = kNot; -const char* kPropMaybe = kNot; -#endif // USE_PROPRIETARY_CODECS - -#if !defined(OS_ANDROID) -const char* kOggVideoProbably = kProbably; -const char* kOggVideoMaybe = kMaybe; -const char* kTheoraProbably = kProbably; -const char* kHlsProbably = kNot; -const char* kHlsMaybe = kNot; -#else -const char* kOggVideoProbably = kNot; -const char* kOggVideoMaybe = kNot; -const char* kTheoraProbably = kNot; -const char* kHlsProbably = kPropProbably; -const char* kHlsMaybe = kPropMaybe; -#endif // !OS_ANDROID - -// Chrome doesn't support HEVC. -const char* kHevcSupported = kNot; - -#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) -const char* kMp2tsMaybe = kPropMaybe; -const char* kMp2tsProbably = kPropProbably; -#else -const char* kMp2tsMaybe = kNot; -const char* kMp2tsProbably = kNot; -#endif - -// High 10-bit profile is only available when we can use ffmpeg to decode H.264. -// Even though FFmpeg is used on Android, we only use platform decoders for -// H.264 -#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) -const char* kHi10pProbably = kPropProbably; -#else -const char* kHi10pProbably = kPropMaybe; -#endif - namespace content { class MediaCanPlayTypeTest : public MediaBrowserTest { public: - MediaCanPlayTypeTest() : url_("about:blank") {} + MediaCanPlayTypeTest() = default; void SetUpOnMainThread() override { - EXPECT_TRUE(NavigateToURL(shell(), url_)); + EXPECT_TRUE( + NavigateToURL(shell(), GetTestUrl("media", "canplaytype_test.html"))); } - std::string CanPlay(const std::string& type) { - std::string command("document.createElement('video').canPlayType("); - command.append(type); - command.append(")"); - - std::string result; - EXPECT_TRUE(ExecuteScriptAndExtractString( + void ExecuteTest(const std::string& command) { + bool result; + EXPECT_TRUE(ExecuteScriptAndExtractBool( shell(), "window.domAutomationController.send(" + command + ");", &result)); - return result; - } - - void TestMPEGUnacceptableCombinations(const std::string& mime) { - // AVC codecs must be followed by valid 6-digit hexadecimal number. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.12345\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1234567\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.1234567\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.number\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.number\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.12345.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123456.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.123456.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123456.7\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.123456.7\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x23456\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1x3456\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12x456\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123x56\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1234x6\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345x\"'")); - - // Old-style avc1 codecs must be followed by two dot-separated decimal - // numbers (H.264 profile and level) - // Invalid formats - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1..\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x66.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66x.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.x30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30x\"'")); - // Invalid level values - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.300\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.-1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.x\"'")); - // Invalid profile values - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.0.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.65.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.67.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.76.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.78.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.99.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.101.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.300.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.-1.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x.30\"'")); - // Old-style avc1 codec ids are supported only for video/mp2t container. - if (mime != "video/mp2t") { - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.13\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.77.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.100.40\"'")); - } - // Old-style codec ids are not supported for avc3 codec strings. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.66.13\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.77.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.100.40\"'")); - - // AAC codecs must be followed by one or two valid hexadecimal numbers. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.no\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.0k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.0k.0k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.4.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.0k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2k\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2.0\"'")); - - // Unlike just "avc1", just "mp4a" is not supported. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.\"'")); - - // Other names for the codecs are not supported. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"h264\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"h.264\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"H264\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"H.264\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"aac\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AAC\"'")); - - // Codecs must not end with a dot. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.\"'")); - - // A simple substring match is not sufficient. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"lavc1337\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\";mp4a+\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\";mp4a.40+\"'")); - - // Codecs not belonging to MPEG container. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, 1\"'")); - - // Remove all but "audio/mpeg" when https://crbug.com/592889 is fixed. - if (mime != "audio/mpeg" && mime != "audio/mp4" && mime != "video/mp4" && - mime != "video/mp2t" && - !base::EndsWith(mime, "mpegurl", base::CompareCase::SENSITIVE)) { - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp3\"'")); - } - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, vorbis\"'")); - - if (mime != "audio/mp4" && mime != "video/mp4") { - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, opus\"'")); - } - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8.0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp08\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40.02\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.02\"'")); - - // Codecs are case sensitive. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1.4d401e\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3.64001f\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A.40.02\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1, MP4\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3, MP4\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\", AVC1.4D401E, MP4.40.2\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\", AVC3.64001F, MP4.40.2\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\", AVC1.4D401E, MP4.40.02\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\", AVC3.64001F, MP4.40.02\"'")); - - // Unknown codecs. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc4\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1x\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3x\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4ax\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-4\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-4\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a4\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a7\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5.1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6.1\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"unknown\"'")); - - // Don't allow incomplete/ambiguous codec ids for HEVC. - // Codec string must have info about codec level/profile, as described in - // ISO/IEC FDIS 14496-15 section E.3, for example "hev1.1.6.L93.B0" - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1\"'")); - - // Invalid codecs that look like something similar to HEVC/H.265 - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1x\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1x\"'")); - // First component of codec id must be "hev1" or "hvc1" (case-sensitive) - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hevc.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev0.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc0.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev2.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc2.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEVC.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEV0.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HVC0.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEV2.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HVC2.1.6.L93.B0\"'")); - - // Trailing dot is not allowed. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0.\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0.\"'")); - // Invalid general_profile_space/general_profile_idc - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.x.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.x.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.d1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.d1.6.L93.B0\"'")); - // Invalid general_profile_compatibility_flags - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.x.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.x.L93.B0\"'")); - // Invalid general_tier_flag - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.x.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.x.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.Lx.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.Lx.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.Hx.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.Hx.B0\"'")); - // Invalid constraint flags - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.x\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.x\"'")); - } - - void TestOGGUnacceptableCombinations(const std::string& mime) { - // Codecs not belonging to OGG container. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, 1\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp08\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09.00.10.08\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp3\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); - - // Codecs are case sensitive. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"Theora\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"Opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"Vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"Theora, Opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"Theora, Vorbis\"'")); - - // Unknown codecs. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"unknown\"'")); - } - - void TestWEBMUnacceptableCombinations(const std::string& mime) { - // Codecs not belonging to WEBM container. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8.0, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp08\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp3\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8.0, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0, mp4a.40\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); - - // Codecs are case sensitive. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"VP8, Vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"VP8.0, Opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"VP9, Vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"VP9.0, Opus\"'")); - - // Unknown codec. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"unknown\"'")); - } - - void TestWAVUnacceptableCombinations(const std::string& mime) { - // Codecs not belonging to WAV container. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8.0, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp08\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09.00.10.08\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, 1\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, 1\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, 1\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp3\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); - - // Unknown codec. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"unknown\"'")); - } - - void TestHLSCombinations(const std::string& mime) { - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "'")); - - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc1\"'")); - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc3\"'")); - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc1, mp4a.40\"'")); - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc3, mp4a.40\"'")); - - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc1.42101E\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc1.42701E\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc1.42F01E\"'")); - - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc3.42E01E\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc3.42801E\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"avc3.42C01E\"'")); - - // Android, is the only platform that supports these types, and its HLS - // implementations uses platform codecs, which do not include MPEG-2 AAC. - // See https://crbug.com/544268. - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.68\"'")); - - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kHlsProbably, - CanPlay("'" + mime + "; codecs=\"avc1.42E01E, mp4a.40.2\"'")); - EXPECT_EQ(kHlsProbably, - CanPlay("'" + mime + "; codecs=\"avc1.42E01E, mp4a.40.02\"'")); - EXPECT_EQ(kHlsProbably, - CanPlay("'" + mime + "; codecs=\"avc3.42E01E, mp4a.40.5\"'")); - EXPECT_EQ(kHlsProbably, - CanPlay("'" + mime + "; codecs=\"avc3.42E01E, mp4a.40.05\"'")); - EXPECT_EQ(kHlsProbably, - CanPlay("'" + mime + "; codecs=\"avc3.42E01E, mp4a.40.29\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,mp4a.40.5\"'")); - EXPECT_EQ(kNot, - CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09.00.10.08\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"flac\"'")); - - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); - - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc1, mp4a.40.2\"'")); - EXPECT_EQ(kHlsMaybe, - CanPlay("'" + mime + "; codecs=\"avc1, mp4a.40.02\"'")); - EXPECT_EQ(kHlsMaybe, CanPlay("'" + mime + "; codecs=\"avc3, mp4a.40.2\"'")); - EXPECT_EQ(kHlsMaybe, - CanPlay("'" + mime + "; codecs=\"avc3, mp4a.40.02\"'")); - EXPECT_EQ(kHlsMaybe, - CanPlay("'" + mime + "; codecs=\"avc1.42E01E, mp4a.40\"'")); - EXPECT_EQ(kHlsMaybe, - CanPlay("'" + mime + "; codecs=\"avc3.42E01E, mp4a.40\"'")); - - TestMPEGUnacceptableCombinations(mime); - // This result is incorrect. See https://crbug.com/592889. - EXPECT_EQ(kHlsProbably, CanPlay("'" + mime + "; codecs=\"mp3\"'")); + EXPECT_TRUE(result); } private: - GURL url_; DISALLOW_COPY_AND_ASSIGN(MediaCanPlayTypeTest); }; -#if BUILDFLAG(ENABLE_AV1_DECODER) IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_av1) { - // Fully qualified codec strings are required. These tests are not exhaustive - // since codec string parsing is exhaustively tested elsewhere. - EXPECT_EQ(kNot, CanPlay("'video/webm; codecs=\"av1\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"av1\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"av01.0.04M.08\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"av01.0.04M.08\"'")); -} +#if BUILDFLAG(ENABLE_AV1_DECODER) + ExecuteTest("testAv1Variants(true)"); #else -// AV1 is enabled by default. However, on platforms where it is not built, such -// as ARM-based devices, av1 must be unsupported. -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_av1_unsupported) { - EXPECT_EQ(kNot, CanPlay("'video/webm; codecs=\"av01.0.04M.08\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"av01.0.04M.08\"'")); + ExecuteTest("testAv1Variants(false)"); +#endif } -#endif // BUILDFLAG(ENABLE_AV1_DECODER) IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_wav) { - EXPECT_EQ(kMaybe, CanPlay("'audio/wav'")); - EXPECT_EQ(kProbably, CanPlay("'audio/wav; codecs=\"1\"'")); - - TestWAVUnacceptableCombinations("audio/wav"); - - EXPECT_EQ(kMaybe, CanPlay("'audio/x-wav'")); - EXPECT_EQ(kProbably, CanPlay("'audio/x-wav; codecs=\"1\"'")); - - TestWAVUnacceptableCombinations("audio/x-wav"); + ExecuteTest("testWavVariants()"); } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_webm) { - EXPECT_EQ(kMaybe, CanPlay("'video/webm'")); - - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8, vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0, vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8, opus\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0, opus\"'")); - - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9.0\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9, vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9.0, vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9, opus\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp9.0, opus\"'")); - - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8, vp9\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0, vp9.0\"'")); - - TestWEBMUnacceptableCombinations("video/webm"); - - EXPECT_EQ(kMaybe, CanPlay("'audio/webm'")); - EXPECT_EQ(kProbably, CanPlay("'audio/webm; codecs=\"vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/webm; codecs=\"opus\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/webm; codecs=\"opus, vorbis\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0, opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0, vorbis\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0, opus\"'")); - - TestWEBMUnacceptableCombinations("audio/webm"); + ExecuteTest("testWebmVariants()"); } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_ogg) { - EXPECT_EQ(kOggVideoMaybe, CanPlay("'video/ogg'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"theora\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"theora, flac\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"theora, opus\"'")); - EXPECT_EQ(kOggVideoProbably, - CanPlay("'video/ogg; codecs=\"theora, vorbis\"'")); - EXPECT_EQ(kOggVideoProbably, - CanPlay("'video/ogg; codecs=\"flac, opus, vorbis\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"vp8\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"vp8.0\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"vp8, opus\"'")); - EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"vp8, vorbis\"'")); - - TestOGGUnacceptableCombinations("video/ogg"); - - EXPECT_EQ(kMaybe, CanPlay("'audio/ogg'")); - EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"flac\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"opus\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"vorbis\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"flac, vorbis, opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora, flac\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora, opus\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora, vorbis\"'")); - - TestOGGUnacceptableCombinations("audio/ogg"); - - EXPECT_EQ(kMaybe, CanPlay("'application/ogg'")); - EXPECT_EQ(kProbably, CanPlay("'application/ogg; codecs=\"flac\"'")); - EXPECT_EQ(kProbably, CanPlay("'application/ogg; codecs=\"opus\"'")); - EXPECT_EQ(kProbably, CanPlay("'application/ogg; codecs=\"vorbis\"'")); - EXPECT_EQ(kProbably, - CanPlay("'application/ogg; codecs=\"flac, opus, vorbis\"'")); - EXPECT_EQ(kTheoraProbably, CanPlay("'application/ogg; codecs=\"theora\"'")); - EXPECT_EQ(kTheoraProbably, - CanPlay("'application/ogg; codecs=\"theora, flac\"'")); - EXPECT_EQ(kTheoraProbably, - CanPlay("'application/ogg; codecs=\"theora, opus\"'")); - EXPECT_EQ(kTheoraProbably, - CanPlay("'application/ogg; codecs=\"theora, vorbis\"'")); - - TestOGGUnacceptableCombinations("application/ogg"); +#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) + ExecuteTest("testOggVariants(true)"); // has_theora_support=true +#else + ExecuteTest("testOggVariants(false)"); // has_theora_support=false +#endif } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_flac) { - EXPECT_EQ(kProbably, CanPlay("'audio/flac'")); - EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"flac\"'")); - - // See CodecSupportTest_mp4 for more flac combos. - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"flac\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"flac\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/flac'")); - EXPECT_EQ(kNot, CanPlay("'video/x-flac'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-flac'")); - EXPECT_EQ(kNot, CanPlay("'application/x-flac'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"flac\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/webm; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"avc3\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/flac; codecs=\"mp4a.40.02\"'")); + ExecuteTest("testFlacVariants()"); } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp3) { - EXPECT_EQ(kNot, CanPlay("'video/mp3'")); - EXPECT_EQ(kNot, CanPlay("'video/mpeg'")); - EXPECT_EQ(kNot, CanPlay("'video/x-mp3'")); - - // audio/mpeg without a codecs parameter (RFC 3003 compliant) - EXPECT_EQ(kProbably, CanPlay("'audio/mpeg'")); - - // audio/mpeg with mp3 in codecs parameter. (Not RFC compliant, but - // very common in the wild so it is a defacto standard). - EXPECT_EQ(kProbably, CanPlay("'audio/mpeg; codecs=\"mp3\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc3\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.68\"'")); - // The next two results are wrong due to https://crbug.com/592889. - EXPECT_EQ(kProbably, CanPlay("'audio/mpeg; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/mpeg; codecs=\"mp4a.6B\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"flac\"'")); - - TestMPEGUnacceptableCombinations("audio/mpeg"); - - // audio/mp3 does not allow any codecs parameter - EXPECT_EQ(kProbably, CanPlay("'audio/mp3'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc3\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.6B\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"flac\"'")); - - TestMPEGUnacceptableCombinations("audio/mp3"); - EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp3\"'")); - - // audio/x-mp3 does not allow any codecs parameter - EXPECT_EQ(kProbably, CanPlay("'audio/x-mp3'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc3\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.6B\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.40.02\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"flac\"'")); - - TestMPEGUnacceptableCombinations("audio/x-mp3"); - EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp3\"'")); + ExecuteTest("testMp3Variants()"); } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) { - EXPECT_EQ(kMaybe, CanPlay("'video/mp4'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, avc3\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, flac\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, flac\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, opus\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, opus\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42101E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42701E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42F01E\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42801E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42C01E\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.5\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.05\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.29\"'")); - - // AC3 and EAC3 (aka Dolby Digital Plus, DD+) audio codecs. These are not - // supported by Chrome by default. - // TODO(servolk): Strictly speaking only mp4a.A5 and mp4a.A6 codec ids are - // valid according to RFC 6381 section 3.3, 3.4. Lower-case oti (mp4a.a5 and - // mp4a.a6) should be rejected. But we used to allow those in older versions - // of Chromecast firmware and some apps (notably MPL) depend on those codec - // types being supported, so they should be allowed for now (crbug.com/564960) - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.A6\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40.2\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40.02\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40.2\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40.02\"'")); - EXPECT_EQ(kPropMaybe, - CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, - CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40\"'")); - - EXPECT_EQ(kHevcSupported, CanPlay("'video/mp4; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kHevcSupported, CanPlay("'video/mp4; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kHevcSupported, - CanPlay("'video/mp4; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); - EXPECT_EQ(kHevcSupported, - CanPlay("'video/mp4; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); - - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"vp09.00.10.08\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"flac\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc1.4D401E, flac\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc3.64001F, flac\"'")); - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"opus\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc1.4D401E, opus\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/mp4; codecs=\"avc3.64001F, opus\"'")); - - TestMPEGUnacceptableCombinations("video/mp4"); - // This result is incorrect. See https://crbug.com/592889. - EXPECT_EQ(kProbably, CanPlay("'video/mp4; codecs=\"mp3\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, avc3\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42101E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42701E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42F01E\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42801E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42C01E\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.5\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.05\"'")); - EXPECT_EQ(kPropProbably, - CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.29\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40.2\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40.02\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40.2\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40.02\"'")); - EXPECT_EQ(kPropMaybe, - CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40\"'")); - EXPECT_EQ(kPropMaybe, - CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, - CanPlay("'video/x-m4v; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); - EXPECT_EQ(kNot, - CanPlay("'video/x-m4v; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"vp09.00.10.08\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.A6\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"opus\"'")); - - TestMPEGUnacceptableCombinations("video/x-m4v"); - - EXPECT_EQ(kMaybe, CanPlay("'audio/mp4'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'audio/mp4; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.5\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.05\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.29\"'")); - - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"flac\"'")); - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"opus\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1, mp4a.40\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3, mp4a.40\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hev1.1.6.L93.B0,mp4a.40.5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"vp09.00.10.08\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.A6\"'")); - - TestMPEGUnacceptableCombinations("audio/mp4"); - // This result is incorrect. See https://crbug.com/592889. - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"mp3\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'audio/x-m4a'")); - - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.6B\"'")); - - EXPECT_EQ(kPropMaybe, CanPlay("'audio/x-m4a; codecs=\"mp4a.40\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.5\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.05\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.29\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1, mp4a\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3, mp4a\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3.64001F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"hev1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"hvc1.1.6.L93.B0\"'")); - EXPECT_EQ(kNot, - CanPlay("'audio/x-m4a; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); - EXPECT_EQ(kNot, - CanPlay("'audio/x-m4a; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"vp09.00.10.08\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.a6\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.A6\"'")); - - EXPECT_EQ(kNot, CanPlay("'video/x-m4a; codecs=\"flac\"'")); - EXPECT_EQ(kNot, CanPlay("'video/x-m4a; codecs=\"opus\"'")); - - TestMPEGUnacceptableCombinations("audio/x-m4a"); -} - -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc1Variants) { - // avc1 without extensions results in "maybe" for compatibility. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1\"'")); - - // A valid-looking 6-digit hexadecimal number will result in at least "maybe". - // But the first hex byte after the dot must be a valid profile_idc and the - // lower two bits of the second byte/4th digit must be zero. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42AC23\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42ACDF\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42acdf\"'")); - - // Invalid profile 0x12. - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.123456\"'")); - // Valid profile/level, but reserved bits are set to 1 (4th digit after dot). - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.42011E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.42021E\"'")); - - // Both upper and lower case hexadecimal digits are accepted. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42e01e\"'")); - - // From a YouTube DASH MSE test manifest. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d401f\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d401e\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d4015\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.640028\"'")); - - // - // Baseline Profile (66 == 0x42). - // The first two digits after the dot must be 42. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42401E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42801E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.42G01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.42000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E0FF\"'")); - - // - // Main Profile (77 == 0x4D). - // The first two digits after the dot must be 4D. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4DE00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.4DG01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.4D000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.4DE0FF\"'")); - - // - // High Profile (100 == 0x64). - // The first two digits after the dot must be 64. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64E00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.64G01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.64000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.64E0FF\"'")); - - // - // High 10-bit Profile (110 == 0x6E). - // The first two digits after the dot must be 6E. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kHi10pProbably, CanPlay("'video/mp4; codecs=\"avc1.6E001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.6E400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.6E800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.6EE00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.6EG01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.6E000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.6EE0FF\"'")); - - // - // Other profiles are not known to be supported. - // - - // Extended Profile (88 == 0x58). - // Without any constraint flags. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.58001E\"'")); - // With constraint_set0_flag==1 indicating compatibility with baseline - // profile. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.58801E\"'")); - // With constraint_set1_flag==1 indicating compatibility with main profile. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.58401E\"'")); - // With constraint_set2_flag==1 indicating compatibility with extended - // profile, the result is 'maybe' the same as for straight extended profile. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.58201E\"'")); +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + ExecuteTest("testMp4Variants(true)"); // has_proprietary_codecs=true +#else + ExecuteTest("testMp4Variants(false)"); // has_proprietary_codecs=false +#endif } -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc3Variants) { - // avc3 without extensions results in "maybe" for compatibility. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3\"'")); - - // A valid-looking 6-digit hexadecimal number will result in at least "maybe". - // But the first hex byte after the dot must be a valid profile_idc and the - // lower two bits of the second byte/4th digit must be zero. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.42AC23\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.42ACDF\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.42acdf\"'")); - - // Invalid profile 0x12. - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.123456\"'")); - // Valid profile/level, but reserved bits are set to 1 (4th digit after dot). - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.42011E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.42021E\"'")); - - // Both upper and lower case hexadecimal digits are accepted. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42e01e\"'")); - - // From a YouTube DASH MSE test manifest. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d401f\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d401e\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d4015\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.640028\"'")); - - // - // Baseline Profile (66 == 0x42). - // The first two digits after the dot must be 42. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.42G01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.42000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.42E0FF\"'")); - - // - // Main Profile (77 == 0x4D). - // The first two digits after the dot must be 4D. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4DE00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.4DG01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.4D000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.4DE0FF\"'")); - - // - // High Profile (100 == 0x64). - // The first two digits after the dot must be 64. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64E00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.64G01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.64000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.64E0FF\"'")); - - // - // High 10-bit Profile (110 == 0x6E). - // The first two digits after the dot must be 6E. The third and fourth digits - // contain constraint_set_flags and must be valid hex. The last two digits - // should be any valid H.264 level. If the level value is invalid the result - // will be kMaybe. - // - EXPECT_EQ(kHi10pProbably, CanPlay("'video/mp4; codecs=\"avc3.6E001E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.6E400A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.6E800A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.6EE00A\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.6EG01E\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.6E000G\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.6EE0FF\"'")); - - // - // Other profiles are not known to be supported. - // - - // Extended Profile (88 == 0x58). - // Without any constraint flags. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.58001E\"'")); - // With constraint_set0_flag==1 indicating compatibility with baseline - // profile. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.58801E\"'")); - // With constraint_set1_flag==1 indicating compatibility with main profile. - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.58401E\"'")); - // With constraint_set2_flag==1 indicating compatibility with extended - // profile, the result is 'maybe' the same as for straight extended profile. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.58201E\"'")); +IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AvcVariants) { +#if BUILDFLAG(USE_PROPRIETARY_CODECS) +// High 10-bit profile is only available when we can use ffmpeg to decode H.264. +// Even though FFmpeg is used on Android, we only use platform decoders for +// H.264 +#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) + ExecuteTest("testAvcVariants(true, true)"); // has_proprietary_codecs=true, + // has_software_avc=true +#else + ExecuteTest("testAvcVariants(true, false)"); // has_proprietary_codecs=true, + // has_software_avc=false +#endif +#else + ExecuteTest( + "testAvcVariants(false, false)"); // has_proprietary_codecs=false, + // has_software_avc=false +#endif } -// Tests AVC levels using AVC1 Baseline (0x42E0zz). -// Other supported values for the first four hexadecimal digits should behave -// the same way but are not tested. -// For each full level, the following are tested: -// * The hexadecimal value before it is not supported. -// * The hexadecimal value for the main level and all sub-levels are supported. -// * The hexadecimal value after the last sub-level it is not supported. -// * Decimal representations of the levels are not supported. - IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AvcLevels) { - // Level 0 is not supported. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E000\"'")); - - // Levels 1 (0x0A), 1.1 (0x0B), 1.2 (0x0C), 1.3 (0x0D). - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E009\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00A\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00B\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00C\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00D\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E00E\"'")); - // Verify that decimal representations of levels are not supported. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E001\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E010\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E011\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E012\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E013\"'")); - - // Levels 2 (0x14), 2.1 (0x15), 2.2 (0x16) - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E013\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E014\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E015\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E016\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E017\"'")); - // Verify that decimal representations of levels are not supported. - // However, 20 is level 3.2. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E002\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E020\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E021\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E022\"'")); - - // Levels 3 (0x1e), 3.1 (0x1F), 3.2 (0x20) - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E01D\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01F\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E020\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E021\"'")); - // Verify that decimal representations of levels are not supported. - // However, 32 is level 5. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E003\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E030\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E031\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E032\"'")); - - // Levels 4 (0x28), 4.1 (0x29), 4.2 (0x2A) - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E027\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E028\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E029\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E02A\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E02B\"'")); - // Verify that decimal representations of levels are not supported. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E004\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E040\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E041\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E042\"'")); - - // Levels 5 (0x32), 5.1 (0x33), 5.2 (0x34). - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E031\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E032\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E033\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E034\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E035\"'")); - // Verify that decimal representations of levels are not supported. - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E005\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E050\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E051\"'")); - EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E052\"'")); +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + ExecuteTest("testAvcLevels(true)"); // has_proprietary_codecs=true +#else + ExecuteTest("testAvcLevels(false)"); // has_proprietary_codecs=false +#endif } -// All values that return positive results are tested. There are also -// negative tests for values around or that could potentially be confused with -// (e.g. case, truncation, hex <-> deciemal conversion) those values that return -// positive results. IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mp4aVariants) { - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.60\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.61\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.62\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.63\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.65\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.65\"'")); - // MPEG2 AAC Main, LC, and SSR are supported. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.68\"'")); - // MP3. - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6A\"'")); - // MP3. - EXPECT_EQ(kProbably, CanPlay("'audio/mp4; codecs=\"mp4a.6B\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6b\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6C\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6D\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6E\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6F\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.76\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.39\"'")); - - // mp4a.40 without further extension is ambiguous and results in "maybe". - EXPECT_EQ(kPropMaybe, CanPlay("'audio/mp4; codecs=\"mp4a.40\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.0\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1\"'")); - // MPEG4 AAC LC. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.3\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.4\"'")); - // MPEG4 AAC SBR v1. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.6\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.7\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.8\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.9\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.10\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.20\"'")); - // MPEG4 AAC SBR PS v2. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.29\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.30\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.40\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.50\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.290\"'")); - // Check conversions of decimal 29 to hex and hex 29 to decimal. - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1d\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1D\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.41\"'")); - - // Allow leading zeros in aud-oti for specific MPEG4 AAC strings. - // See http://crbug.com/440607. - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.00\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.01\"'")); - // MPEG4 AAC LC. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.02\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.03\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.04\"'")); - // MPEG4 AAC SBR v1. - EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.05\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.029\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.41\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.41.2\"'")); - - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.400.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.040.2\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4.5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.400.5\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.040.5\"'")); - -// xHE-AAC support is currently only available on P+. +#if BUILDFLAG(USE_PROPRIETARY_CODECS) #if defined(OS_ANDROID) - const char* kXHE_AACProbably = - base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_P - ? kProbably - : kNot; + // xHE-AAC support is currently only available on P+. + if (base::android::BuildInfo::GetInstance()->sdk_int() >= + base::android::SDK_VERSION_P) { + ExecuteTest( + "testMp4aVariants(true, true)"); // has_proprietary_codecs=true, + // has_xhe_aac_support=true + return; + } +#endif + ExecuteTest("testMp4aVariants(true, false)"); // has_proprietary_codecs=true, + // has_xhe_aac_support=false #else - const char* kXHE_AACProbably = kNot; + ExecuteTest( + "testMp4aVariants(false, false)"); // has_proprietary_codecs=false, + // has_xhe_aac_support=false #endif - EXPECT_EQ(kXHE_AACProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.42\"'")); - EXPECT_EQ(kXHE_AACProbably, CanPlay("'video/mp4; codecs=\"mp4a.40.42\"'")); } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_HLS) { - TestHLSCombinations("application/vnd.apple.mpegurl"); - TestHLSCombinations("application/x-mpegurl"); - TestHLSCombinations("audio/mpegurl"); - TestHLSCombinations("audio/x-mpegurl"); +#if defined(OS_ANDROID) + ExecuteTest("testHls(true)"); // has_hls_support=true +#else + ExecuteTest("testHls(false)"); // has_hls_support=false +#endif } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AAC_ADTS) { - EXPECT_EQ(kPropProbably, CanPlay("'audio/aac'")); - - // audio/aac doesn't support the codecs parameter. - EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"1\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"aac\"'")); - EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"mp4a.40.2\"'")); +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + ExecuteTest("testAacAdts(true)"); // has_proprietary_codecs=true +#else + ExecuteTest("testAacAdts(false)"); // has_proprietary_codecs=false +#endif } IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mpeg2Ts) { - EXPECT_EQ(kMp2tsMaybe, CanPlay("'video/mp2t'")); - - // video/mp2t must support standard RFC 6381 compliant H.264 / AAC codec ids. - // H.264 baseline, main, high profiles - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.42E01E\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.4D401E\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.640028\"'")); - - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.66\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.67\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.68\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.69\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.6B\"'")); - - // AAC LC audio - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.40.2\"'")); - // H.264 + AAC audio combinations - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.42E01E,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.4D401E,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.40.2\"'")); - // H.264 + AC3/EAC3 audio combinations - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,ac-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,ec-3\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.A5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.A6\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.a5\"'")); - EXPECT_EQ(kNot, CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.a6\"'")); - - TestMPEGUnacceptableCombinations("video/mp2t"); - // This result is incorrect. See https://crbug.com/592889. - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp3\"'")); -} - -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, - CodecSupportTest_Mpeg2Ts_LegacyAvc1_codec_ids) { - // Old-style avc1/H.264 codec ids that are still being used by some HLS - // streaming apps for backward compatibility. - // H.264 baseline profile - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.10\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.13\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.20\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.22\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.30\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.32\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.40\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.42\"'")); - // H.264 main profile - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.10\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.13\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.20\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.22\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.30\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.32\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.40\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.42\"'")); - // H.264 high profile - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.10\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.13\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.20\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.22\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.30\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.32\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.40\"'")); - EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.42\"'")); - - // H.264 + AAC audio combinations - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.66.10,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.66.30,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.77.10,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.77.30,mp4a.40.2\"'")); - EXPECT_EQ(kMp2tsProbably, - CanPlay("'video/mp2t; codecs=\"avc1.100.40,mp4a.40.2\"'")); -} - -IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mpeg2TsAudio) { - // audio/mp2t is currently not supported (see also crbug.com/556837). - EXPECT_EQ(kNot, CanPlay("'audio/mp2t; codecs=\"mp4a.40.2\"'")); +// TODO(crbug.com/1091962): This is actually wrong. We don't support mpeg2ts in +// src=, only MSE playbacks, so this should actually indicate no support when +// querying canPlayType(). +#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) && \ + BUILDFLAG(USE_PROPRIETARY_CODECS) + ExecuteTest("testMp2tsVariants(true)"); // has_mp2ts_support=true +#else + ExecuteTest("testMp2tsVariants(false)"); // has_mp2ts_support=false +#endif } // See more complete codec string testing in media/base/video_codecs_unittest.cc IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_NewVp9Variants) { - const std::string kSupportedMimeTypes[] = {"video/webm", "video/mp4"}; - for (const auto& mime_type : kSupportedMimeTypes) { // Profile 2 and 3 support is currently disabled on Android prior to P and MIPS. #if (defined(ARCH_CPU_ARM_FAMILY) && !defined(OS_WIN)) || \ defined(ARCH_CPU_MIPS_FAMILY) #if defined(OS_ANDROID) - const char* kVP9Profile2And3Probably = - base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_P - ? kProbably - : kNot; -#else - const char* kVP9Profile2And3Probably = kNot; + if (base::android::BuildInfo::GetInstance()->sdk_int() >= + base::android::SDK_VERSION_P) { + ExecuteTest("testNewVp9Variants(true)"); // has_profile_2_3_support=true + return; + } #endif + ExecuteTest("testNewVp9Variants(false)"); // has_profile_2_3_support=false #else - const char* kVP9Profile2And3Probably = kProbably; + ExecuteTest("testNewVp9Variants(true)"); // has_profile_2_3_support=true #endif - - // E.g. "'video/webm; " - std::string prefix = "'" + mime_type + "; "; - - // Malformed codecs string never allowed. - EXPECT_EQ(kNot, CanPlay(prefix + "codecs=\"vp09.00.-1.08\"'")); - - // Test a few valid strings. - EXPECT_EQ(kProbably, CanPlay(prefix + "codecs=\"vp09.00.10.08\"'")); - EXPECT_EQ(kProbably, - CanPlay(prefix + "codecs=\"vp09.00.10.08.00.01.01.01.00\"'")); - EXPECT_EQ(kProbably, - CanPlay(prefix + "codecs=\"vp09.00.10.08.01.02.02.02.00\"'")); - - // Profiles 0 and 1 are always supported supported. Profiles 2 and 3 are - // only supported on certain architectures. - EXPECT_EQ(kProbably, CanPlay(prefix + "codecs=\"vp09.01.10.08\"'")); - EXPECT_EQ(kVP9Profile2And3Probably, - CanPlay(prefix + "codecs=\"vp09.02.10.08\"'")); - EXPECT_EQ(kVP9Profile2And3Probably, - CanPlay(prefix + "codecs=\"vp09.03.10.08\"'")); - } } } // namespace content diff --git a/chromium/content/browser/media/media_devices_permission_checker.cc b/chromium/content/browser/media/media_devices_permission_checker.cc index f3fcd754c7e..b45cc594ef7 100644 --- a/chromium/content/browser/media/media_devices_permission_checker.cc +++ b/chromium/content/browser/media/media_devices_permission_checker.cc @@ -9,13 +9,14 @@ #include "base/bind.h" #include "base/command_line.h" -#include "base/task/post_task.h" #include "content/browser/frame_host/render_frame_host_delegate.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/permission_controller.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "third_party/blink/public/common/mediastream/media_devices.h" #include "url/gurl.h" @@ -117,8 +118,8 @@ void MediaDevicesPermissionChecker::CheckPermission( return; } - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&CheckSinglePermissionOnUIThread, device_type, render_process_id, render_frame_id), std::move(callback)); @@ -137,11 +138,44 @@ void MediaDevicesPermissionChecker::CheckPermissions( return; } - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&DoCheckPermissionsOnUIThread, requested, render_process_id, render_frame_id), std::move(callback)); } +// static +bool MediaDevicesPermissionChecker::HasPanTiltZoomPermissionGrantedOnUIThread( + int render_process_id, + int render_frame_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + // TODO(crbug.com/934063): Remove when MediaCapturePanTilt Blink feature is + // enabled by default. + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableExperimentalWebPlatformFeatures)) { + return false; + } + RenderFrameHostImpl* frame_host = + RenderFrameHostImpl::FromID(render_process_id, render_frame_id); + + if (!frame_host) + return false; + + auto* web_contents = WebContents::FromRenderFrameHost(frame_host); + if (!web_contents) + return false; + + auto* permission_controller = BrowserContext::GetPermissionController( + web_contents->GetBrowserContext()); + DCHECK(permission_controller); + + const GURL& origin = web_contents->GetLastCommittedURL(); + blink::mojom::PermissionStatus status = + permission_controller->GetPermissionStatusForFrame( + PermissionType::CAMERA_PAN_TILT_ZOOM, frame_host, origin); + + return status == blink::mojom::PermissionStatus::GRANTED; +} + } // namespace content diff --git a/chromium/content/browser/media/media_devices_permission_checker.h b/chromium/content/browser/media/media_devices_permission_checker.h index 8c6df4ac953..38efb45eb43 100644 --- a/chromium/content/browser/media/media_devices_permission_checker.h +++ b/chromium/content/browser/media/media_devices_permission_checker.h @@ -57,6 +57,12 @@ class CONTENT_EXPORT MediaDevicesPermissionChecker { base::OnceCallback<void(const MediaDevicesManager::BoolDeviceTypes&)> callback) const; + // Returns true if the origin associated to a render frame identified by + // |render_process_id| and |render_frame_id| is allowed to control camera + // movement (pan, tilt, and zoom). Otherwise, returns false. + static bool HasPanTiltZoomPermissionGrantedOnUIThread(int render_process_id, + int render_frame_id); + private: const bool use_override_; const bool override_value_; diff --git a/chromium/content/browser/media/media_devices_util.cc b/chromium/content/browser/media/media_devices_util.cc index 9dbed075f7b..cb1397c7588 100644 --- a/chromium/content/browser/media/media_devices_util.cc +++ b/chromium/content/browser/media/media_devices_util.cc @@ -11,7 +11,6 @@ #include "base/command_line.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" -#include "base/task/post_task.h" #include "content/browser/frame_host/render_frame_host_delegate.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -122,8 +121,8 @@ void GetDefaultMediaDeviceID( } } - base::PostTaskAndReplyWithResult( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&GetDefaultMediaDeviceIDOnUIThread, device_type, render_process_id, render_frame_id), std::move(callback)); diff --git a/chromium/content/browser/media/media_interface_proxy.cc b/chromium/content/browser/media/media_interface_proxy.cc index b9328271479..3cdadf8926f 100644 --- a/chromium/content/browser/media/media_interface_proxy.cc +++ b/chromium/content/browser/media/media_interface_proxy.cc @@ -35,6 +35,7 @@ #endif #if BUILDFLAG(ENABLE_LIBRARY_CDMS) +#include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "base/threading/sequence_local_storage_slot.h" #include "base/time/time.h" @@ -42,6 +43,7 @@ #include "content/browser/media/key_system_support_impl.h" #include "content/public/common/cdm_info.h" #include "media/base/key_system_names.h" +#include "media/base/media_switches.h" #include "media/mojo/mojom/cdm_service.mojom.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #if defined(OS_MACOSX) @@ -72,6 +74,15 @@ bool IsValidCdmDisplayName(const std::string& cdm_name) { return cdm_name.size() <= kMaxCdmNameSize && base::IsStringASCII(cdm_name); } +// CdmService is keyed on CDM type, user profile and site URL. Note that site +// is not normal URL nor origin. See chrome/browser/site_isolation for details. +using CdmServiceKey = std::tuple<base::Token, const BrowserContext*, GURL>; + +std::ostream& operator<<(std::ostream& os, const CdmServiceKey& key) { + return os << "{" << std::get<0>(key).ToString() << ", " << std::get<1>(key) + << ", " << std::get<2>(key) << "}"; +} + // A map hosts all media::mojom::CdmService remotes, each of which corresponds // to one CDM process. There should be only one instance of this class stored in // base::SequenceLocalStorageSlot. See below. @@ -86,19 +97,19 @@ class CdmServiceMap { // Gets or creates a media::mojom::CdmService remote. The returned remote // might not be bound, e.g. if it's newly created. - auto& GetOrCreateRemote(const base::Token& guid) { - auto& remote = remotes_[guid]; + auto& GetOrCreateRemote(const CdmServiceKey& key) { + auto& remote = remotes_[key]; max_remote_count_ = std::max(max_remote_count_, remotes_.size()); return remote; } - void EraseRemote(const base::Token& guid) { - DCHECK(remotes_.count(guid)); - remotes_.erase(guid); + void EraseRemote(const CdmServiceKey& key) { + DCHECK(remotes_.count(key)); + remotes_.erase(key); } private: - std::map<base::Token, mojo::Remote<media::mojom::CdmService>> remotes_; + std::map<CdmServiceKey, mojo::Remote<media::mojom::CdmService>> remotes_; size_t max_remote_count_ = 0; }; @@ -111,26 +122,40 @@ CdmServiceMap& GetCdmServiceMap() { return slot->GetOrCreateValue(); } -// Erases the CDM service instance for the CDM identified by |guid|. -void EraseCdmServiceForGuid(const base::Token& guid) { - GetCdmServiceMap().EraseRemote(guid); +// Erases the CDM service instance for the CDM identified by |key|. +void EraseCdmService(const CdmServiceKey& key) { + DVLOG(2) << __func__ << ": key=" << key; + GetCdmServiceMap().EraseRemote(key); } // Gets an instance of the CDM service for the CDM identified by |guid|. // Instances are started lazily as needed. -media::mojom::CdmService& GetCdmServiceForGuid(const base::Token& guid, - const std::string& cdm_name) { - auto& remote = GetCdmServiceMap().GetOrCreateRemote(guid); +media::mojom::CdmService& GetCdmService(const base::Token& guid, + BrowserContext* browser_context, + const GURL& site, + const std::string& cdm_name) { + CdmServiceKey key; + std::string display_name = cdm_name; + + if (base::FeatureList::IsEnabled(media::kCdmProcessSiteIsolation)) { + key = {guid, browser_context, site}; + auto site_display_name = + GetContentClient()->browser()->GetSiteDisplayNameForCdmProcess( + browser_context, site); + display_name += " (" + site_display_name + ")"; + } else { + key = {guid, nullptr, GURL()}; + } + DVLOG(2) << __func__ << ": key=" << key; + + auto& remote = GetCdmServiceMap().GetOrCreateRemote(key); if (!remote) { ServiceProcessHost::Launch( remote.BindNewPipeAndPassReceiver(), - ServiceProcessHost::Options() - .WithDisplayName(cdm_name) - .Pass()); - remote.set_disconnect_handler( - base::BindOnce(&EraseCdmServiceForGuid, guid)); + ServiceProcessHost::Options().WithDisplayName(display_name).Pass()); + remote.set_disconnect_handler(base::BindOnce(&EraseCdmService, key)); remote.set_idle_handler(kCdmServiceIdleTimeout, - base::BindRepeating(EraseCdmServiceForGuid, guid)); + base::BindRepeating(EraseCdmService, key)); } return *remote.get(); @@ -241,11 +266,10 @@ class FrameInterfaceFactoryImpl : public media::mojom::FrameInterfaceFactory { void CreateProvisionFetcher( mojo::PendingReceiver<media::mojom::ProvisionFetcher> receiver) override { #if BUILDFLAG(ENABLE_MOJO_CDM) - ProvisionFetcherImpl::Create( - BrowserContext::GetDefaultStoragePartition( - render_frame_host_->GetProcess()->GetBrowserContext()) - ->GetURLLoaderFactoryForBrowserProcess(), - std::move(receiver)); + ProvisionFetcherImpl::Create(BrowserContext::GetDefaultStoragePartition( + render_frame_host_->GetBrowserContext()) + ->GetURLLoaderFactoryForBrowserProcess(), + std::move(receiver)); #endif } @@ -262,6 +286,11 @@ class FrameInterfaceFactoryImpl : public media::mojom::FrameInterfaceFactory { #endif } + void GetCdmOrigin(GetCdmOriginCallback callback) override { + return std::move(callback).Run( + render_frame_host_->GetLastCommittedOrigin()); + } + void BindEmbedderReceiver(mojo::GenericPendingReceiver receiver) override { GetContentClient()->browser()->BindMediaServiceReceiver( render_frame_host_, std::move(receiver)); @@ -275,15 +304,10 @@ class FrameInterfaceFactoryImpl : public media::mojom::FrameInterfaceFactory { } // namespace -MediaInterfaceProxy::MediaInterfaceProxy( - RenderFrameHost* render_frame_host, - mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver, - base::OnceClosure error_handler) - : render_frame_host_(render_frame_host), - receiver_(this, std::move(receiver)) { +MediaInterfaceProxy::MediaInterfaceProxy(RenderFrameHost* render_frame_host) + : render_frame_host_(render_frame_host) { DVLOG(1) << __func__; DCHECK(render_frame_host_); - DCHECK(!error_handler.is_null()); auto frame_factory_getter = base::BindRepeating(&MediaInterfaceProxy::GetFrameServices, @@ -293,8 +317,6 @@ MediaInterfaceProxy::MediaInterfaceProxy( secondary_interface_factory_ = std::make_unique<MediaInterfaceFactoryHolder>( base::BindRepeating(&GetSecondaryMediaService), frame_factory_getter); - receiver_.set_disconnect_handler(std::move(error_handler)); - // |cdm_factory_map_| will be lazily connected in GetCdmFactory(). } @@ -303,6 +325,11 @@ MediaInterfaceProxy::~MediaInterfaceProxy() { DCHECK(thread_checker_.CalledOnValidThread()); } +void MediaInterfaceProxy::Bind( + mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver) { + receivers_.Add(this, std::move(receiver)); +} + void MediaInterfaceProxy::CreateAudioDecoder( mojo::PendingReceiver<media::mojom::AudioDecoder> receiver) { DCHECK(thread_checker_.CalledOnValidThread()); @@ -456,12 +483,13 @@ media::mojom::CdmFactory* MediaInterfaceProxy::ConnectToCdmService( const base::FilePath& cdm_path, const std::string& cdm_file_system_id, const std::string& cdm_name) { - DVLOG(1) << __func__ << ": cdm_guid = " << cdm_guid.ToString(); + DVLOG(1) << __func__ << ": cdm_name = " << cdm_name; DCHECK(!cdm_factory_map_.count(cdm_guid)); - media::mojom::CdmService& cdm_service = - GetCdmServiceForGuid(cdm_guid, cdm_name); + auto* browser_context = render_frame_host_->GetBrowserContext(); + auto& site = render_frame_host_->GetSiteInstance()->GetSiteURL(); + auto& cdm_service = GetCdmService(cdm_guid, browser_context, site, cdm_name); #if defined(OS_MACOSX) // LoadCdm() should always be called before CreateInterfaceFactory(). diff --git a/chromium/content/browser/media/media_interface_proxy.h b/chromium/content/browser/media/media_interface_proxy.h index ba9650c751b..713841be717 100644 --- a/chromium/content/browser/media/media_interface_proxy.h +++ b/chromium/content/browser/media/media_interface_proxy.h @@ -23,6 +23,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" #include "services/service_manager/public/mojom/interface_provider.mojom.h" @@ -40,15 +41,11 @@ class RenderFrameHost; // CDM types. class MediaInterfaceProxy : public media::mojom::InterfaceFactory { public: - // Constructs MediaInterfaceProxy and bind |this| to the |request|. When - // connection error happens on the client interface, |error_handler| will be - // called, which could destroy |this|. - MediaInterfaceProxy( - RenderFrameHost* render_frame_host, - mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver, - base::OnceClosure error_handler); + MediaInterfaceProxy(RenderFrameHost* render_frame_host); ~MediaInterfaceProxy() final; + void Bind(mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver); + // media::mojom::InterfaceFactory implementation. void CreateAudioDecoder( mojo::PendingReceiver<media::mojom::AudioDecoder> receiver) final; @@ -112,9 +109,6 @@ class MediaInterfaceProxy : public media::mojom::InterfaceFactory { // Safe to hold a raw pointer since |this| is owned by RenderFrameHostImpl. RenderFrameHost* const render_frame_host_; - // Receiver for incoming InterfaceFactoryRequest from the the RenderFrameImpl. - mojo::Receiver<InterfaceFactory> receiver_; - mojo::UniqueReceiverSet<media::mojom::FrameInterfaceFactory> frame_factories_; // InterfacePtr to the remote InterfaceFactory implementation in the Media @@ -130,14 +124,19 @@ class MediaInterfaceProxy : public media::mojom::InterfaceFactory { #if BUILDFLAG(ENABLE_LIBRARY_CDMS) // CDM GUID to CDM InterfaceFactory Remotes mapping, where the - // InterfaceFactory instances live in the standalone CDM Service instances. - // These map entries effectively own the corresponding service processes. + // InterfaceFactory instances live in the standalone CdmService instances. + // These map entries effectively own the corresponding CDM processes. + // Only using the GUID to identify the CdmFactory is sufficient because the + // BrowserContext and Site URL should never change. std::map<base::Token, mojo::Remote<media::mojom::CdmFactory>> cdm_factory_map_; #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) base::ThreadChecker thread_checker_; + // Receivers for incoming interface requests from the the RenderFrameImpl. + mojo::ReceiverSet<media::mojom::InterfaceFactory> receivers_; + DISALLOW_COPY_AND_ASSIGN(MediaInterfaceProxy); }; diff --git a/chromium/content/browser/media/media_internals.cc b/chromium/content/browser/media/media_internals.cc index d6b0abc3d2a..ed148d0f58d 100644 --- a/chromium/content/browser/media/media_internals.cc +++ b/chromium/content/browser/media/media_internals.cc @@ -20,7 +20,6 @@ #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/media/session/media_session_impl.h" #include "content/browser/renderer_host/media/media_stream_manager.h" @@ -291,8 +290,8 @@ void MediaInternals::AudioLogImpl::SendWebContentsTitleHelper( int render_frame_id) { // Page title information can only be retrieved from the UI thread. if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&SendWebContentsTitleHelper, cache_key, std::move(dict), render_process_id, render_frame_id)); return; @@ -618,8 +617,8 @@ MediaInternals::CreateAudioLogImpl( void MediaInternals::SendUpdate(const base::string16& update) { // SendUpdate() may be called from any thread, but must run on the UI thread. if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&MediaInternals::SendUpdate, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaInternals::SendUpdate, base::Unretained(this), update)); return; } diff --git a/chromium/content/browser/media/media_internals_audio_focus_helper.cc b/chromium/content/browser/media/media_internals_audio_focus_helper.cc index 6e2935fd65d..7a50ec4be9e 100644 --- a/chromium/content/browser/media/media_internals_audio_focus_helper.cc +++ b/chromium/content/browser/media/media_internals_audio_focus_helper.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/containers/adapters.h" -#include "base/task/post_task.h" #include "base/values.h" #include "content/browser/media/media_internals.h" #include "content/public/browser/browser_task_traits.h" @@ -70,8 +69,8 @@ void MediaInternalsAudioFocusHelper::OnFocusGained( media_session::mojom::AudioFocusRequestStatePtr session) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaInternalsAudioFocusHelper::SendAudioFocusState, base::Unretained(this))); } @@ -80,8 +79,8 @@ void MediaInternalsAudioFocusHelper::OnFocusLost( media_session::mojom::AudioFocusRequestStatePtr session) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::PostTask( - FROM_HERE, {BrowserThread::UI}, + GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaInternalsAudioFocusHelper::SendAudioFocusState, base::Unretained(this))); } diff --git a/chromium/content/browser/media/media_internals_proxy.cc b/chromium/content/browser/media/media_internals_proxy.cc index 9e9dda6b908..e8afdd4dafd 100644 --- a/chromium/content/browser/media/media_internals_proxy.cc +++ b/chromium/content/browser/media/media_internals_proxy.cc @@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/task/post_task.h" #include "build/build_config.h" #include "content/browser/media/media_internals.h" #include "content/browser/media/media_internals_handler.h" @@ -46,8 +45,8 @@ void MediaInternalsProxy::GetEverything() { #endif // Ask MediaInternals for its data on IO thread. - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MediaInternalsProxy::GetEverythingOnIOThread, this)); } diff --git a/chromium/content/browser/media/media_service.cc b/chromium/content/browser/media/media_service.cc index 2b3ebcaa99d..c0cd3a64764 100644 --- a/chromium/content/browser/media/media_service.cc +++ b/chromium/content/browser/media/media_service.cc @@ -5,7 +5,6 @@ #include "content/public/browser/media_service.h" #include "base/no_destructor.h" -#include "base/task/post_task.h" #include "base/threading/sequence_local_storage_slot.h" #include "base/time/time.h" #include "content/public/browser/browser_task_traits.h" @@ -61,8 +60,8 @@ media::mojom::MediaService& GetMediaService() { remote.reset_on_disconnect(); #if BUILDFLAG(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) - base::PostTask( - FROM_HERE, {BrowserThread::IO}, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&BindReceiverInGpuProcess, std::move(receiver))); #elif BUILDFLAG(ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS) static base::NoDestructor<std::unique_ptr<media::MediaService>> service; @@ -72,7 +71,6 @@ media::mojom::MediaService& GetMediaService() { std::move(receiver), ServiceProcessHost::Options() .WithDisplayName("Media Service") - .WithSandboxType(service_manager::SANDBOX_TYPE_UTILITY) .Pass()); remote.reset_on_idle_timeout(kIdleTimeout); #endif diff --git a/chromium/content/browser/media/media_web_contents_observer.cc b/chromium/content/browser/media/media_web_contents_observer.cc index 16ebbfb9ddb..60a6176cfe4 100644 --- a/chromium/content/browser/media/media_web_contents_observer.cc +++ b/chromium/content/browser/media/media_web_contents_observer.cc @@ -145,6 +145,8 @@ bool MediaWebContentsObserver::OnMessageReceived( IPC_MESSAGE_HANDLER( MediaPlayerDelegateHostMsg_OnPictureInPictureAvailabilityChanged, OnPictureInPictureAvailabilityChanged) + IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnBufferUnderflow, + OnBufferUnderflow) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -314,6 +316,13 @@ void MediaWebContentsObserver::ClearWakeLocks( } } +void MediaWebContentsObserver::OnBufferUnderflow( + RenderFrameHost* render_frame_host, + int delegate_id) { + const MediaPlayerId id(render_frame_host, delegate_id); + web_contents_impl()->MediaBufferUnderflow(id); +} + device::mojom::WakeLock* MediaWebContentsObserver::GetAudioWakeLock() { // Here is a lazy binding, and will not reconnect after connection error. if (!audio_wake_lock_) { diff --git a/chromium/content/browser/media/media_web_contents_observer.h b/chromium/content/browser/media/media_web_contents_observer.h index 36b7d7a78e8..dd165346537 100644 --- a/chromium/content/browser/media/media_web_contents_observer.h +++ b/chromium/content/browser/media/media_web_contents_observer.h @@ -140,6 +140,7 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { void OnPictureInPictureAvailabilityChanged(RenderFrameHost* render_frame_host, int delegate_id, bool available); + void OnBufferUnderflow(RenderFrameHost* render_frame_host, int delegate_id); // Clear |render_frame_host|'s tracking entry for its WakeLocks. void ClearWakeLocks(RenderFrameHost* render_frame_host); diff --git a/chromium/content/browser/media/midi_host.cc b/chromium/content/browser/media/midi_host.cc index 52fe35aca98..60ff8b24523 100644 --- a/chromium/content/browser/media/midi_host.cc +++ b/chromium/content/browser/media/midi_host.cc @@ -236,8 +236,8 @@ void MidiHost::SendData(uint32_t port, template <typename Method, typename... Params> void MidiHost::CallClient(Method method, Params... params) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { - base::PostTask(FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&MidiHost::CallClient<Method, Params...>, + GetIOThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MidiHost::CallClient<Method, Params...>, AsWeakPtr(), method, std::move(params)...)); return; } diff --git a/chromium/content/browser/media/session/media_session_android.cc b/chromium/content/browser/media/session/media_session_android.cc index 0df088b19cd..87c39dfcd09 100644 --- a/chromium/content/browser/media/session/media_session_android.cc +++ b/chromium/content/browser/media/session/media_session_android.cc @@ -38,9 +38,14 @@ MediaSessionAndroid::MediaSessionAndroid(MediaSessionImpl* session) Java_MediaSessionImpl_create(env, reinterpret_cast<intptr_t>(this)); j_media_session_ = JavaObjectWeakGlobalRef(env, j_media_session); - WebContentsAndroid* contents_android = GetWebContentsAndroid(); - if (contents_android) - contents_android->SetMediaSession(j_media_session); + WebContentsImpl* contents = + static_cast<WebContentsImpl*>(media_session_->web_contents()); + if (contents) { + web_contents_android_ = contents->GetWebContentsAndroid(); + DCHECK(web_contents_android_); + web_contents_android_->SetMediaSession(j_media_session); + web_contents_android_->AddDestructionObserver(this); + } session->AddObserver(observer_receiver_.BindNewPipeAndPassRemote()); } @@ -55,9 +60,10 @@ MediaSessionAndroid::~MediaSessionAndroid() { j_media_session_.reset(); - WebContentsAndroid* contents_android = GetWebContentsAndroid(); - if (contents_android) - contents_android->SetMediaSession(nullptr); + if (web_contents_android_) { + web_contents_android_->SetMediaSession(nullptr); + web_contents_android_->RemoveDestructionObserver(this); + } } // static @@ -71,7 +77,7 @@ ScopedJavaLocalRef<jobject> JNI_MediaSessionImpl_GetMediaSessionFromWebContents( MediaSessionImpl* session = MediaSessionImpl::Get(contents); DCHECK(session); return MediaSessionAndroid::JavaObjectGetter::GetJavaObject( - session->session_android()); + session->GetMediaSessionAndroid()); } void MediaSessionAndroid::MediaSessionInfoChanged( @@ -173,6 +179,14 @@ void MediaSessionAndroid::MediaSessionPositionChanged( } } +// The Java MediaSession is kept alive by the Java WebContents and will be +// cleared when the WebContents is destroyed, so we destroy the corresponding +// MediaSessionAndroid to ensure mediaSessionDestroyed is called. +void MediaSessionAndroid::WebContentsAndroidDestroyed( + WebContentsAndroid* web_contents_android) { + media_session_->ClearMediaSessionAndroid(); // Deletes |this|. +} + void MediaSessionAndroid::Resume( JNIEnv* env, const base::android::JavaParamRef<jobject>& j_obj) { @@ -228,14 +242,6 @@ void MediaSessionAndroid::RequestSystemAudioFocus( media_session::mojom::AudioFocusType::kGain); } -WebContentsAndroid* MediaSessionAndroid::GetWebContentsAndroid() { - WebContentsImpl* contents = - static_cast<WebContentsImpl*>(media_session_->web_contents()); - if (!contents) - return nullptr; - return contents->GetWebContentsAndroid(); -} - ScopedJavaLocalRef<jobject> MediaSessionAndroid::GetJavaObject() { JNIEnv* env = base::android::AttachCurrentThread(); return j_media_session_.get(env); diff --git a/chromium/content/browser/media/session/media_session_android.h b/chromium/content/browser/media/session/media_session_android.h index 2c7c2d95f84..b7fd9bdede6 100644 --- a/chromium/content/browser/media/session/media_session_android.h +++ b/chromium/content/browser/media/session/media_session_android.h @@ -11,20 +11,21 @@ #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" +#include "content/browser/web_contents/web_contents_android.h" #include "mojo/public/cpp/bindings/receiver.h" #include "services/media_session/public/mojom/media_session.mojom.h" namespace content { class MediaSessionImpl; -class WebContentsAndroid; // This class is interlayer between native MediaSession and Java // MediaSession. This class is owned by the native MediaSession and will // teardown Java MediaSession when the native MediaSession is destroyed. // Java MediaSessionObservers are also proxied via this class. class MediaSessionAndroid final - : public media_session::mojom::MediaSessionObserver { + : public media_session::mojom::MediaSessionObserver, + public WebContentsAndroid::DestructionObserver { public: // Helper class for calling GetJavaObject() in a static method, in order to // avoid leaking the Java object outside. @@ -48,6 +49,12 @@ class MediaSessionAndroid final void MediaSessionPositionChanged( const base::Optional<media_session::MediaPosition>& position) override; + // WebContentsAndroid::DestructionObserver overrides: + // TODO(crbug.com/1091229): Remove this when we correctly support media + // sessions in portals. + void WebContentsAndroidDestroyed( + WebContentsAndroid* web_contents_android) override; + // MediaSession method wrappers. void Resume(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_obj); void Suspend(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_obj); @@ -66,13 +73,14 @@ class MediaSessionAndroid final const base::android::JavaParamRef<jobject>& j_obj); private: - WebContentsAndroid* GetWebContentsAndroid(); - base::android::ScopedJavaLocalRef<jobject> GetJavaObject(); // The linked Java object. The strong reference is hold by Java WebContensImpl // to avoid introducing a new GC root. JavaObjectWeakGlobalRef j_media_session_; + // WebContentsAndroid corresponding to the Java WebContentsImpl that holds a + // strong reference to |j_media_session_|. + WebContentsAndroid* web_contents_android_; MediaSessionImpl* const media_session_; diff --git a/chromium/content/browser/media/session/media_session_impl.cc b/chromium/content/browser/media/session/media_session_impl.cc index e26a08c2b86..a364a0497c7 100644 --- a/chromium/content/browser/media/session/media_session_impl.cc +++ b/chromium/content/browser/media/session/media_session_impl.cc @@ -225,6 +225,22 @@ MediaSessionImpl::~MediaSessionImpl() { DCHECK(audio_focus_state_ == State::INACTIVE); } +#if defined(OS_ANDROID) +void MediaSessionImpl::ClearMediaSessionAndroid() { + session_android_.reset(); +} + +MediaSessionAndroid* MediaSessionImpl::GetMediaSessionAndroid() { + // |session_android_| can be null if a portal is activated, the java + // WebContents is destroyed and ClearMediaSessionAndroid is called. + // TODO(crbug.com/1091229): Remove this when we correctly support media + // sessions in portals. + if (!session_android_) + session_android_ = std::make_unique<MediaSessionAndroid>(this); + return session_android_.get(); +} +#endif + void MediaSessionImpl::WebContentsDestroyed() { // This should only work for tests. In production, all the players should have // already been removed before WebContents is destroyed. @@ -280,6 +296,7 @@ void MediaSessionImpl::TitleWasSet(NavigationEntry* entry) { } void MediaSessionImpl::DidUpdateFaviconURL( + RenderFrameHost* rfh, const std::vector<blink::mojom::FaviconURLPtr>& candidates) { std::vector<media_session::MediaImage> icons; @@ -831,7 +848,6 @@ MediaSessionImpl::MediaSessionImpl(WebContents* web_contents) #if defined(OS_ANDROID) session_android_.reset(new MediaSessionAndroid(this)); #endif // defined(OS_ANDROID) - if (web_contents && web_contents->GetMainFrame() && web_contents->GetMainFrame()->GetView()) { focused_ = web_contents->GetMainFrame()->GetView()->HasFocus(); @@ -845,7 +861,8 @@ void MediaSessionImpl::Initialize() { delegate_->MediaSessionInfoChanged(GetMediaSessionInfoSync()); DCHECK(web_contents()); - DidUpdateFaviconURL(web_contents()->GetFaviconURLs()); + DidUpdateFaviconURL(web_contents()->GetMainFrame(), + web_contents()->GetFaviconURLs()); } AudioFocusDelegate::AudioFocusResult MediaSessionImpl::RequestSystemAudioFocus( diff --git a/chromium/content/browser/media/session/media_session_impl.h b/chromium/content/browser/media/session/media_session_impl.h index 6ec74d5a2e1..a4c9bfed80a 100644 --- a/chromium/content/browser/media/session/media_session_impl.h +++ b/chromium/content/browser/media/session/media_session_impl.h @@ -85,11 +85,8 @@ class MediaSessionImpl : public MediaSession, ~MediaSessionImpl() override; #if defined(OS_ANDROID) - static MediaSession* FromJavaMediaSession( - const base::android::JavaRef<jobject>& j_media_session); - MediaSessionAndroid* session_android() const { - return session_android_.get(); - } + void ClearMediaSessionAndroid(); + MediaSessionAndroid* GetMediaSessionAndroid(); #endif // defined(OS_ANDROID) void NotifyMediaSessionMetadataChange(); @@ -139,6 +136,7 @@ class MediaSessionImpl : public MediaSession, void OnWebContentsLostFocus(RenderWidgetHost*) override; void TitleWasSet(NavigationEntry* entry) override; void DidUpdateFaviconURL( + RenderFrameHost* rfh, const std::vector<blink::mojom::FaviconURLPtr>& candidates) override; void MediaPictureInPictureChanged(bool is_picture_in_picture) override; diff --git a/chromium/content/browser/media/session/media_session_impl_browsertest.cc b/chromium/content/browser/media/session/media_session_impl_browsertest.cc index 77161c71d44..255ea2f601e 100644 --- a/chromium/content/browser/media/session/media_session_impl_browsertest.cc +++ b/chromium/content/browser/media/session/media_session_impl_browsertest.cc @@ -2514,7 +2514,8 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UpdateFaviconURL) { GURL("https://www.example.org/favicon6.png"), blink::mojom::FaviconIconType::kTouchIcon, std::vector<gfx::Size>())); - media_session_->DidUpdateFaviconURL(favicons); + media_session_->DidUpdateFaviconURL(shell()->web_contents()->GetMainFrame(), + favicons); { std::vector<media_session::MediaImage> expected_images; @@ -2542,6 +2543,7 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UpdateFaviconURL) { { media_session::test::MockMediaSessionMojoObserver observer(*media_session_); media_session_->DidUpdateFaviconURL( + shell()->web_contents()->GetMainFrame(), std::vector<blink::mojom::FaviconURLPtr>()); observer.WaitForExpectedImagesOfType( media_session::mojom::MediaSessionImageType::kSourceIcon, @@ -2556,7 +2558,8 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, GURL("https://www.example.org/favicon1.png"), blink::mojom::FaviconIconType::kFavicon, std::vector<gfx::Size>())); - media_session_->DidUpdateFaviconURL(favicons); + media_session_->DidUpdateFaviconURL(shell()->web_contents()->GetMainFrame(), + favicons); { std::vector<media_session::MediaImage> expected_images; @@ -2607,6 +2610,7 @@ class FaviconWaiter : public WebContentsObserver { : WebContentsObserver(web_contents) {} void DidUpdateFaviconURL( + RenderFrameHost* render_frame_host, const std::vector<blink::mojom::FaviconURLPtr>& candidates) override { received_favicon_ = true; run_loop_.Quit(); |