summaryrefslogtreecommitdiff
path: root/chromium/content/browser/media
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/media')
-rw-r--r--chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.cc24
-rw-r--r--chromium/content/browser/media/android/browser_gpu_video_accelerator_factories.h8
-rw-r--r--chromium/content/browser/media/android/media_player_renderer.cc10
-rw-r--r--chromium/content/browser/media/android/media_player_renderer.h2
-rw-r--r--chromium/content/browser/media/android/media_resource_getter_impl.cc9
-rw-r--r--chromium/content/browser/media/audio_input_stream_broker.cc8
-rw-r--r--chromium/content/browser/media/audio_stream_broker.cc9
-rw-r--r--chromium/content/browser/media/audio_stream_monitor.cc13
-rw-r--r--chromium/content/browser/media/capture/audio_mirroring_manager.cc1
-rw-r--r--chromium/content/browser/media/capture/audio_mirroring_manager_unittest.cc5
-rw-r--r--chromium/content/browser/media/capture/aura_window_video_capture_device.cc15
-rw-r--r--chromium/content/browser/media/capture/aura_window_video_capture_device_browsertest.cc24
-rw-r--r--chromium/content/browser/media/capture/desktop_capture_device.cc5
-rw-r--r--chromium/content/browser/media/capture/desktop_streams_registry_impl.cc5
-rw-r--r--chromium/content/browser/media/capture/fake_video_capture_stack.cc2
-rw-r--r--chromium/content/browser/media/capture/frame_sink_video_capture_device.cc29
-rw-r--r--chromium/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc13
-rw-r--r--chromium/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc23
-rw-r--r--chromium/content/browser/media/capture/mouse_cursor_overlay_controller_browsertest.cc4
-rw-r--r--chromium/content/browser/media/capture/slow_capture_overlay_chromeos.cc (renamed from chromium/content/browser/media/capture/lame_capture_overlay_chromeos.cc)20
-rw-r--r--chromium/content/browser/media/capture/slow_capture_overlay_chromeos.h (renamed from chromium/content/browser/media/capture/lame_capture_overlay_chromeos.h)20
-rw-r--r--chromium/content/browser/media/capture/slow_capture_overlay_chromeos_unittest.cc (renamed from chromium/content/browser/media/capture/lame_capture_overlay_chromeos_unittest.cc)28
-rw-r--r--chromium/content/browser/media/capture/slow_window_capturer_chromeos.cc (renamed from chromium/content/browser/media/capture/lame_window_capturer_chromeos.cc)83
-rw-r--r--chromium/content/browser/media/capture/slow_window_capturer_chromeos.h (renamed from chromium/content/browser/media/capture/lame_window_capturer_chromeos.h)26
-rw-r--r--chromium/content/browser/media/capture/web_contents_audio_muter.cc13
-rw-r--r--chromium/content/browser/media/capture/web_contents_tracker.cc9
-rw-r--r--chromium/content/browser/media/capture/web_contents_video_capture_device.cc13
-rw-r--r--chromium/content/browser/media/capture/web_contents_video_capture_device.h1
-rw-r--r--chromium/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc9
-rw-r--r--chromium/content/browser/media/cdm_file_impl.cc7
-rw-r--r--chromium/content/browser/media/flinging_renderer.cc6
-rw-r--r--chromium/content/browser/media/flinging_renderer.h2
-rw-r--r--chromium/content/browser/media/forwarding_audio_stream_factory.cc25
-rw-r--r--chromium/content/browser/media/in_process_audio_loopback_stream_creator.cc9
-rw-r--r--chromium/content/browser/media/media_browsertest.cc20
-rw-r--r--chromium/content/browser/media/media_canplaytype_browsertest.cc1587
-rw-r--r--chromium/content/browser/media/media_devices_permission_checker.cc44
-rw-r--r--chromium/content/browser/media/media_devices_permission_checker.h6
-rw-r--r--chromium/content/browser/media/media_devices_util.cc5
-rw-r--r--chromium/content/browser/media/media_interface_proxy.cc98
-rw-r--r--chromium/content/browser/media/media_interface_proxy.h23
-rw-r--r--chromium/content/browser/media/media_internals.cc9
-rw-r--r--chromium/content/browser/media/media_internals_audio_focus_helper.cc9
-rw-r--r--chromium/content/browser/media/media_internals_proxy.cc5
-rw-r--r--chromium/content/browser/media/media_service.cc6
-rw-r--r--chromium/content/browser/media/media_web_contents_observer.cc9
-rw-r--r--chromium/content/browser/media/media_web_contents_observer.h1
-rw-r--r--chromium/content/browser/media/midi_host.cc4
-rw-r--r--chromium/content/browser/media/session/media_session_android.cc36
-rw-r--r--chromium/content/browser/media/session/media_session_android.h16
-rw-r--r--chromium/content/browser/media/session/media_session_impl.cc21
-rw-r--r--chromium/content/browser/media/session/media_session_impl.h8
-rw-r--r--chromium/content/browser/media/session/media_session_impl_browsertest.cc8
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();