[go: nahoru, domu]

Stop assuming the Media task runner is a thread.

Code generally assumes the Media task runner is a single thread. Issue
crbug.com/1144329 hints at there isn't a hard requirement that the Media
sequence is a thread, and additional motivation for changing has been
provided in crbug.com/1144329#c2 (power consumption).

This change should be NOP, but hoists build assumptions on Media being a
SingleThreadTaskRunner to being its super class, SequencedTaskRunner.

Future CLs will be landed to also fix runtime dependencies as the Media
thread switches to become sourced by CreateSequencedTaskRunner() inside
RenderThreadImpl.

Bug: 1144329
Change-Id: Id24ffd3c059a9e5da567861758500c171031fd36
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3928266
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Reviewed-by: Jordan Bayles <jophba@chromium.org>
Reviewed-by: Sean Topping <seantopping@chromium.org>
Commit-Queue: Markus Handell <handellm@google.com>
Reviewed-by: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1059135}
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc
index ae3bd59..6ef3ff4a 100644
--- a/chromecast/renderer/cast_content_renderer_client.cc
+++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -297,7 +297,7 @@
 CastContentRendererClient::OverrideDemuxerForUrl(
     content::RenderFrame* render_frame,
     const GURL& url,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+    scoped_refptr<base::SequencedTaskRunner> task_runner) {
   if (render_frame->GetRenderFrameMediaPlaybackOptions()
           .is_remoting_renderer_enabled() &&
       url.SchemeIs(::media::remoting::kRemotingScheme)) {
diff --git a/chromecast/renderer/cast_content_renderer_client.h b/chromecast/renderer/cast_content_renderer_client.h
index 42493fb..014aae33c 100644
--- a/chromecast/renderer/cast_content_renderer_client.h
+++ b/chromecast/renderer/cast_content_renderer_client.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
 #include "chromecast/chromecast_buildflags.h"
 #include "chromecast/common/mojom/application_media_capabilities.mojom.h"
@@ -65,7 +66,7 @@
   std::unique_ptr<::media::Demuxer> OverrideDemuxerForUrl(
       content::RenderFrame* render_frame,
       const GURL& url,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
+      scoped_refptr<base::SequencedTaskRunner> task_runner) override;
   bool IsIdleMediaSuspendEnabled() override;
   void SetRuntimeFeaturesDefaultsBeforeBlinkInitialization() override;
   std::unique_ptr<blink::WebSocketHandshakeThrottleProvider>
diff --git a/components/cast_streaming/renderer/frame_injecting_demuxer.cc b/components/cast_streaming/renderer/frame_injecting_demuxer.cc
index 7d51434b..5ff5ded 100644
--- a/components/cast_streaming/renderer/frame_injecting_demuxer.cc
+++ b/components/cast_streaming/renderer/frame_injecting_demuxer.cc
@@ -264,7 +264,7 @@
 
 FrameInjectingDemuxer::FrameInjectingDemuxer(
     DemuxerConnector* demuxer_connector,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner)
     : media_task_runner_(std::move(media_task_runner)),
       original_task_runner_(base::SequencedTaskRunnerHandle::Get()),
       demuxer_connector_(demuxer_connector),
@@ -287,7 +287,7 @@
     mojom::AudioStreamInitializationInfoPtr audio_stream_info,
     mojom::VideoStreamInitializationInfoPtr video_stream_info) {
   DVLOG(1) << __func__;
-  DCHECK(!media_task_runner_->BelongsToCurrentThread());
+  DCHECK(!media_task_runner_->RunsTasksInCurrentSequence());
 
   media_task_runner_->PostTask(
       FROM_HERE,
@@ -300,7 +300,7 @@
     mojom::AudioStreamInitializationInfoPtr audio_stream_info,
     mojom::VideoStreamInitializationInfoPtr video_stream_info) {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(initialized_cb_);
 
   if (!audio_stream_info && !video_stream_info) {
@@ -342,7 +342,7 @@
 
 std::vector<media::DemuxerStream*> FrameInjectingDemuxer::GetAllStreams() {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   std::vector<media::DemuxerStream*> streams;
   if (video_stream_)
@@ -360,7 +360,7 @@
     media::DemuxerHost* host,
     media::PipelineStatusCallback status_cb) {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   host_ = host;
 
   // Live streams have infinite duration.
@@ -375,7 +375,7 @@
 
 void FrameInjectingDemuxer::AbortPendingReads() {
   DVLOG(2) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_stream_)
     audio_stream_->AbortPendingRead();
@@ -397,7 +397,7 @@
 
 void FrameInjectingDemuxer::Stop() {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_stream_)
     audio_stream_.reset();
diff --git a/components/cast_streaming/renderer/frame_injecting_demuxer.h b/components/cast_streaming/renderer/frame_injecting_demuxer.h
index 2fdcee9..25f1ca9 100644
--- a/components/cast_streaming/renderer/frame_injecting_demuxer.h
+++ b/components/cast_streaming/renderer/frame_injecting_demuxer.h
@@ -11,10 +11,6 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace cast_streaming {
 
 class FrameInjectingAudioDemuxerStream;
@@ -32,7 +28,7 @@
  public:
   FrameInjectingDemuxer(
       DemuxerConnector* demuxer_connector,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner);
   ~FrameInjectingDemuxer() override;
 
   FrameInjectingDemuxer(const FrameInjectingDemuxer&) = delete;
@@ -77,7 +73,7 @@
   // OnStreamInitializationComplete().
   int pending_stream_initialization_callbacks_ = 0;
 
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   scoped_refptr<base::SequencedTaskRunner> original_task_runner_;
   media::DemuxerHost* host_ = nullptr;
   std::unique_ptr<FrameInjectingAudioDemuxerStream> audio_stream_;
diff --git a/components/cast_streaming/renderer/playback_command_forwarding_renderer.cc b/components/cast_streaming/renderer/playback_command_forwarding_renderer.cc
index b276199..da36781 100644
--- a/components/cast_streaming/renderer/playback_command_forwarding_renderer.cc
+++ b/components/cast_streaming/renderer/playback_command_forwarding_renderer.cc
@@ -27,7 +27,7 @@
   RendererCommandForwarder(
       PlaybackCommandForwardingRenderer* owning_renderer,
       mojo::PendingReceiver<media::mojom::Renderer> playback_controller,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+      scoped_refptr<base::SequencedTaskRunner> task_runner)
       : owning_renderer_(owning_renderer),
         playback_controller_(this, std::move(playback_controller)) {
     DCHECK(owning_renderer_);
@@ -81,7 +81,7 @@
 
 PlaybackCommandForwardingRenderer::PlaybackCommandForwardingRenderer(
     std::unique_ptr<media::Renderer> renderer,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
     mojo::PendingReceiver<media::mojom::Renderer> pending_renderer_controls)
     : real_renderer_(std::move(renderer)),
       pending_renderer_controls_(std::move(pending_renderer_controls)),
@@ -89,7 +89,6 @@
       weak_factory_(this) {
   DCHECK(real_renderer_);
   DCHECK(pending_renderer_controls_);
-
   InitializeSendTimestampUpdateCaller();
 }
 
@@ -126,11 +125,11 @@
 void PlaybackCommandForwardingRenderer::Flush(base::OnceClosure flush_cb) {}
 
 void PlaybackCommandForwardingRenderer::StartPlayingFrom(base::TimeDelta time) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 }
 
 void PlaybackCommandForwardingRenderer::SetPlaybackRate(double playback_rate) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 }
 
 void PlaybackCommandForwardingRenderer::SetVolume(float volume) {}
@@ -171,7 +170,7 @@
   // over the mojo pipe here
   DCHECK(!streams || streams.value().empty());
 
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(
@@ -190,7 +189,7 @@
 
 void PlaybackCommandForwardingRenderer::MojoRendererFlush(
     media::mojom::Renderer::FlushCallback callback) {
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(&PlaybackCommandForwardingRenderer::MojoRendererFlush,
@@ -203,7 +202,7 @@
 
 void PlaybackCommandForwardingRenderer::MojoRendererStartPlayingFrom(
     ::base::TimeDelta time) {
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(
@@ -217,7 +216,7 @@
 
 void PlaybackCommandForwardingRenderer::MojoRendererSetPlaybackRate(
     double playback_rate) {
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(
@@ -230,7 +229,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::MojoRendererSetVolume(float volume) {
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(
@@ -261,7 +260,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::OnEnded() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnEnded();
@@ -271,7 +270,7 @@
 
 void PlaybackCommandForwardingRenderer::OnStatisticsUpdate(
     const media::PipelineStatistics& stats) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnStatisticsUpdate(stats);
@@ -282,7 +281,7 @@
 void PlaybackCommandForwardingRenderer::OnBufferingStateChange(
     media::BufferingState state,
     media::BufferingStateChangeReason reason) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnBufferingStateChange(state, reason);
@@ -291,7 +290,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::OnWaiting(media::WaitingReason reason) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnWaiting(reason);
@@ -301,7 +300,7 @@
 
 void PlaybackCommandForwardingRenderer::OnAudioConfigChange(
     const media::AudioDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnAudioConfigChange(config);
@@ -311,7 +310,7 @@
 
 void PlaybackCommandForwardingRenderer::OnVideoConfigChange(
     const media::VideoDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnVideoConfigChange(config);
@@ -321,7 +320,7 @@
 
 void PlaybackCommandForwardingRenderer::OnVideoNaturalSizeChange(
     const gfx::Size& size) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnVideoNaturalSizeChange(size);
@@ -330,7 +329,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::OnVideoOpacityChange(bool opaque) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (remote_renderer_client_)
     remote_renderer_client_->OnVideoOpacityChange(opaque);
@@ -340,7 +339,7 @@
 
 void PlaybackCommandForwardingRenderer::OnVideoFrameRateChange(
     absl::optional<int> fps) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // media::mojom::RendererClient does not support this call.
   if (upstream_renderer_client_)
@@ -348,7 +347,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::SendTimestampUpdate() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (!remote_renderer_client_) {
     return;
@@ -362,7 +361,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::InitializeSendTimestampUpdateCaller() {
-  if (!task_runner_->BelongsToCurrentThread()) {
+  if (!task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&PlaybackCommandForwardingRenderer::
                                       InitializeSendTimestampUpdateCaller,
@@ -380,7 +379,7 @@
 }
 
 void PlaybackCommandForwardingRenderer::OnMojoDisconnect() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   OnError(media::PIPELINE_ERROR_DISCONNECTED);
   real_renderer_.reset();
diff --git a/components/cast_streaming/renderer/playback_command_forwarding_renderer.h b/components/cast_streaming/renderer/playback_command_forwarding_renderer.h
index eba2a17..c8d521cb 100644
--- a/components/cast_streaming/renderer/playback_command_forwarding_renderer.h
+++ b/components/cast_streaming/renderer/playback_command_forwarding_renderer.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/renderer.h"
 #include "media/base/renderer_client.h"
 #include "media/mojo/mojom/renderer.mojom.h"
@@ -29,7 +30,7 @@
   // playback commands to this instance.
   PlaybackCommandForwardingRenderer(
       std::unique_ptr<media::Renderer> renderer,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      scoped_refptr<base::SequencedTaskRunner> task_runner,
       mojo::PendingReceiver<media::mojom::Renderer> pending_rederer_controls);
   PlaybackCommandForwardingRenderer(const PlaybackCommandForwardingRenderer&) =
       delete;
@@ -125,7 +126,7 @@
   mojo::PendingReceiver<media::mojom::Renderer> pending_renderer_controls_;
 
   // Task runner on which all mojo callbacks will be run.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   // Created as part of OnRealRendererInitializationComplete().
   std::unique_ptr<media::mojom::Renderer> playback_controller_;
diff --git a/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.cc b/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.cc
index 4439fb3..36cb1de 100644
--- a/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.cc
+++ b/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.cc
@@ -26,7 +26,7 @@
 
 std::unique_ptr<media::Renderer>
 PlaybackCommandForwardingRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     media::AudioRendererSink* audio_renderer_sink,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.h b/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.h
index 9655acf..4b55d6e 100644
--- a/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.h
+++ b/components/cast_streaming/renderer/playback_command_forwarding_renderer_factory.h
@@ -69,7 +69,7 @@
   // Wraps |real_renderer_factory_->CreateRenderer()|'s results with a
   // PlaybackCommandForwardingRenderer instance.
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
diff --git a/components/cast_streaming/renderer/public/resource_provider.h b/components/cast_streaming/renderer/public/resource_provider.h
index 2556a71..87d1a5d 100644
--- a/components/cast_streaming/renderer/public/resource_provider.h
+++ b/components/cast_streaming/renderer/public/resource_provider.h
@@ -16,10 +16,6 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "url/gurl.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
 namespace media {
 class Demuxer;
 }  // namespace media
@@ -58,7 +54,7 @@
   // CastStreamingDemuxer instance in the case of a match.
   virtual std::unique_ptr<media::Demuxer> MaybeGetDemuxerOverride(
       const GURL& url,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) = 0;
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner) = 0;
 
   // Gets the receiver for this instance. To be used by the renderer-process
   // PlaybackCommandForwardingRenderer to receive playback commands from the
diff --git a/components/cast_streaming/renderer/resource_provider_impl.cc b/components/cast_streaming/renderer/resource_provider_impl.cc
index 6ee244b..d3ca1504 100644
--- a/components/cast_streaming/renderer/resource_provider_impl.cc
+++ b/components/cast_streaming/renderer/resource_provider_impl.cc
@@ -60,7 +60,7 @@
 
 std::unique_ptr<media::Demuxer> ResourceProviderImpl::MaybeGetDemuxerOverride(
     const GURL& url,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) {
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner) {
   // Do not create a FrameInjectingDemuxer if the Cast Streaming MessagePort
   // was not set in the browser process. This will manifest as an unbound
   // DemuxerConnector object in the renderer process.
diff --git a/components/cast_streaming/renderer/resource_provider_impl.h b/components/cast_streaming/renderer/resource_provider_impl.h
index 81a2bc5..dbbc8b81 100644
--- a/components/cast_streaming/renderer/resource_provider_impl.h
+++ b/components/cast_streaming/renderer/resource_provider_impl.h
@@ -12,6 +12,7 @@
 #include "base/callback_forward.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h"
 #include "components/cast_streaming/public/mojom/renderer_controller.mojom.h"
 #include "components/cast_streaming/renderer/demuxer_connector.h"
@@ -22,10 +23,6 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "url/gurl.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace media {
 class Demuxer;
 }  // namespace media
@@ -85,7 +82,7 @@
   ReceiverBinder<mojom::DemuxerConnector> GetDemuxerConnectorBinder() override;
   std::unique_ptr<media::Demuxer> MaybeGetDemuxerOverride(
       const GURL& url,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) override;
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner) override;
   mojo::PendingReceiver<media::mojom::Renderer> GetRendererCommandReceiver()
       override;
 
diff --git a/components/viz/common/gpu/context_cache_controller.cc b/components/viz/common/gpu/context_cache_controller.cc
index d9b92f6..0e9ce30 100644
--- a/components/viz/common/gpu/context_cache_controller.cc
+++ b/components/viz/common/gpu/context_cache_controller.cc
@@ -34,7 +34,7 @@
 
 ContextCacheController::ContextCacheController(
     gpu::ContextSupport* context_support,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+    scoped_refptr<base::SequencedTaskRunner> task_runner)
     : context_support_(context_support), task_runner_(std::move(task_runner)) {
   // The |weak_factory_| can only be used from a single thread. We
   // create/destroy this class and run callbacks on a single thread, but we
diff --git a/components/viz/common/gpu/context_cache_controller.h b/components/viz/common/gpu/context_cache_controller.h
index bb8971b..870ea40 100644
--- a/components/viz/common/gpu/context_cache_controller.h
+++ b/components/viz/common/gpu/context_cache_controller.h
@@ -11,6 +11,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "components/viz/common/viz_common_export.h"
 
@@ -48,9 +49,8 @@
   using ScopedVisibility = ScopedToken;
   using ScopedBusy = ScopedToken;
 
-  ContextCacheController(
-      gpu::ContextSupport* context_support,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+  ContextCacheController(gpu::ContextSupport* context_support,
+                         scoped_refptr<base::SequencedTaskRunner> task_runner);
   virtual ~ContextCacheController();
 
   void SetGrContext(GrDirectContext* gr_context);
@@ -88,7 +88,7 @@
   void InvalidatePendingIdleCallbacks();
 
   raw_ptr<gpu::ContextSupport> context_support_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
   raw_ptr<GrDirectContext> gr_context_ = nullptr;
 
   std::unique_ptr<ScopedVisibility> held_visibility_;
diff --git a/components/viz/common/gpu/raster_context_provider.h b/components/viz/common/gpu/raster_context_provider.h
index 5f9719ed..7d77948 100644
--- a/components/viz/common/gpu/raster_context_provider.h
+++ b/components/viz/common/gpu/raster_context_provider.h
@@ -69,6 +69,7 @@
   // from the same thread unless the function has some explicitly specified
   // rules for access on a different thread. See SetupLockOnMainThread(), which
   // can be used to provide access from multiple threads.
+  // TODO(crbug.com/1144329): rename method to indicate sequence affinity.
   virtual gpu::ContextResult BindToCurrentThread() = 0;
 
   // Adds/removes an observer to be called when the context is lost. AddObserver
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 76c44e9..52aec85 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -74,7 +74,7 @@
 std::unique_ptr<media::Demuxer> ContentRendererClient::OverrideDemuxerForUrl(
     RenderFrame* render_frame,
     const GURL& url,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+    scoped_refptr<base::SequencedTaskRunner> task_runner) {
   return nullptr;
 }
 
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index 69e9da01..72e0eb7 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -15,6 +15,7 @@
 #include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
@@ -180,7 +181,7 @@
   virtual std::unique_ptr<media::Demuxer> OverrideDemuxerForUrl(
       RenderFrame* render_frame,
       const GURL& url,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   // Allows the embedder to provide a WebSocketHandshakeThrottleProvider. If it
   // returns NULL then none will be used.
diff --git a/content/renderer/media/android/flinging_renderer_client.cc b/content/renderer/media/android/flinging_renderer_client.cc
index 75db1c5..b82184f 100644
--- a/content/renderer/media/android/flinging_renderer_client.cc
+++ b/content/renderer/media/android/flinging_renderer_client.cc
@@ -13,7 +13,7 @@
 
 FlingingRendererClient::FlingingRendererClient(
     ClientExtentionPendingReceiver client_extension_receiver,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     std::unique_ptr<media::MojoRenderer> mojo_renderer,
     media::RemotePlayStateChangeCB remote_play_state_change_cb)
     : MojoRendererWrapper(std::move(mojo_renderer)),
@@ -27,7 +27,7 @@
 void FlingingRendererClient::Initialize(media::MediaResource* media_resource,
                                         media::RendererClient* client,
                                         media::PipelineStatusCallback init_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   client_ = client;
 
@@ -39,7 +39,7 @@
 
 void FlingingRendererClient::OnRemotePlayStateChange(
     media::MediaStatus::State state) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   remote_play_state_change_cb_.Run(state);
 }
 
diff --git a/content/renderer/media/android/flinging_renderer_client.h b/content/renderer/media/android/flinging_renderer_client.h
index e304f60d..3ce4f2b 100644
--- a/content/renderer/media/android/flinging_renderer_client.h
+++ b/content/renderer/media/android/flinging_renderer_client.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "content/common/content_export.h"
 #include "media/base/media_resource.h"
@@ -34,7 +35,7 @@
 
   FlingingRendererClient(
       ClientExtentionPendingReceiver client_extension_receiver,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       std::unique_ptr<media::MojoRenderer> mojo_renderer,
       media::RemotePlayStateChangeCB remote_play_state_change_cb);
 
@@ -52,7 +53,7 @@
   void OnRemotePlayStateChange(media::MediaStatus::State state) override;
 
  private:
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   media::RendererClient* client_;
 
diff --git a/content/renderer/media/android/flinging_renderer_client_factory.cc b/content/renderer/media/android/flinging_renderer_client_factory.cc
index 57341ab..6298f1b 100644
--- a/content/renderer/media/android/flinging_renderer_client_factory.cc
+++ b/content/renderer/media/android/flinging_renderer_client_factory.cc
@@ -26,7 +26,7 @@
 FlingingRendererClientFactory::~FlingingRendererClientFactory() = default;
 
 std::unique_ptr<media::Renderer> FlingingRendererClientFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     media::AudioRendererSink* audio_renderer_sink,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/android/flinging_renderer_client_factory.h b/content/renderer/media/android/flinging_renderer_client_factory.h
index 596dc0d8..aead4dc 100644
--- a/content/renderer/media/android/flinging_renderer_client_factory.h
+++ b/content/renderer/media/android/flinging_renderer_client_factory.h
@@ -42,7 +42,7 @@
   void SetRemotePlayStateChangeCB(media::RemotePlayStateChangeCB callback);
 
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/android/media_player_renderer_client.cc b/content/renderer/media/android/media_player_renderer_client.cc
index 7ef2f6b..6b84a40 100644
--- a/content/renderer/media/android/media_player_renderer_client.cc
+++ b/content/renderer/media/android/media_player_renderer_client.cc
@@ -13,7 +13,7 @@
 MediaPlayerRendererClient::MediaPlayerRendererClient(
     mojo::PendingRemote<RendererExtention> renderer_extension_remote,
     mojo::PendingReceiver<ClientExtention> client_extension_receiver,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     std::unique_ptr<media::MojoRenderer> mojo_renderer,
     media::ScopedStreamTextureWrapper stream_texture_wrapper,
@@ -41,7 +41,7 @@
     media::MediaResource* media_resource,
     media::RendererClient* client,
     media::PipelineStatusCallback init_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!init_cb_);
 
   // Consume and bind the delayed PendingRemote and PendingReceiver now that we
@@ -70,7 +70,7 @@
 void MediaPlayerRendererClient::OnStreamTextureWrapperInitialized(
     media::MediaResource* media_resource,
     bool success) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (!success) {
     std::move(init_cb_).Run(
         media::PipelineStatus::Codes::PIPELINE_ERROR_INITIALIZATION_FAILED);
@@ -95,7 +95,7 @@
 
 void MediaPlayerRendererClient::OnRemoteRendererInitialized(
     media::PipelineStatus status) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!init_cb_.is_null());
 
   if (status == media::PIPELINE_OK) {
@@ -136,7 +136,7 @@
 }
 
 void MediaPlayerRendererClient::OnDurationChange(base::TimeDelta duration) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   media_resource_->ForwardDurationChangeToDemuxerHost(duration);
 }
diff --git a/content/renderer/media/android/media_player_renderer_client.h b/content/renderer/media/android/media_player_renderer_client.h
index 5a3d9622..8d91c0e 100644
--- a/content/renderer/media/android/media_player_renderer_client.h
+++ b/content/renderer/media/android/media_player_renderer_client.h
@@ -46,7 +46,7 @@
   MediaPlayerRendererClient(
       mojo::PendingRemote<RendererExtention> renderer_extension_remote,
       mojo::PendingReceiver<ClientExtention> client_extension_receiver,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       std::unique_ptr<media::MojoRenderer> mojo_renderer,
       media::ScopedStreamTextureWrapper stream_texture_wrapper,
@@ -92,8 +92,7 @@
 
   media::VideoRendererSink* sink_;
 
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
-
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   // Used by |stream_texture_wrapper_| to signal OnFrameAvailable() and to send
   // VideoFrames to |sink_| on the right thread.
   scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
diff --git a/content/renderer/media/android/media_player_renderer_client_factory.cc b/content/renderer/media/android/media_player_renderer_client_factory.cc
index 09447ba..898c4c0 100644
--- a/content/renderer/media/android/media_player_renderer_client_factory.cc
+++ b/content/renderer/media/android/media_player_renderer_client_factory.cc
@@ -23,7 +23,7 @@
 
 std::unique_ptr<media::Renderer>
 MediaPlayerRendererClientFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     media::AudioRendererSink* audio_renderer_sink,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/android/media_player_renderer_client_factory.h b/content/renderer/media/android/media_player_renderer_client_factory.h
index 7d6bb55..0f1b1c7 100644
--- a/content/renderer/media/android/media_player_renderer_client_factory.h
+++ b/content/renderer/media/android/media_player_renderer_client_factory.h
@@ -35,7 +35,7 @@
   ~MediaPlayerRendererClientFactory() override;
 
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/cast_renderer_client_factory.cc b/content/renderer/media/cast_renderer_client_factory.cc
index a13f879..9678eee9 100644
--- a/content/renderer/media/cast_renderer_client_factory.cc
+++ b/content/renderer/media/cast_renderer_client_factory.cc
@@ -19,7 +19,7 @@
 CastRendererClientFactory::~CastRendererClientFactory() = default;
 
 std::unique_ptr<media::Renderer> CastRendererClientFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     media::AudioRendererSink* audio_renderer_sink,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/cast_renderer_client_factory.h b/content/renderer/media/cast_renderer_client_factory.h
index 5ce0902..70f19f5 100644
--- a/content/renderer/media/cast_renderer_client_factory.h
+++ b/content/renderer/media/cast_renderer_client_factory.h
@@ -36,7 +36,7 @@
   ~CastRendererClientFactory() override;
 
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
index fc6f9b8..9c21a263 100644
--- a/content/renderer/media/media_factory.cc
+++ b/content/renderer/media/media_factory.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
@@ -332,7 +333,7 @@
     // this time and subsequently a media thread. To fail, the media thread must
     // be dead/dying (which only happens at ~RenderThreadImpl), in which case
     // the process is about to die anyways.
-    RenderThreadImpl::current()->GetMediaThreadTaskRunner()->DeleteSoon(
+    RenderThreadImpl::current()->GetMediaSequencedTaskRunner()->DeleteSoon(
         FROM_HERE, std::move(decoder_factory_));
   }
 }
@@ -474,8 +475,8 @@
                             media_log.get(), render_frame_)
           : nullptr;
 
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner =
-      render_thread->GetMediaThreadTaskRunner();
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner =
+      render_thread->GetMediaSequencedTaskRunner();
 
   if (!media_task_runner) {
     // If the media thread failed to start, we will receive a null task runner.
@@ -680,7 +681,7 @@
     auto dcomp_texture_creation_cb =
         base::BindRepeating(&DCOMPTextureWrapperImpl::Create,
                             render_thread->GetDCOMPTextureFactory(),
-                            render_thread->GetMediaThreadTaskRunner());
+                            render_thread->GetMediaSequencedTaskRunner());
 
     mojo::Remote<media::mojom::MediaFoundationRendererNotifier>
         media_foundation_renderer_notifier;
@@ -726,7 +727,7 @@
     auto remoting_renderer_factory =
         std::make_unique<media::remoting::RemotingRendererFactory>(
             std::move(remotee), std::move(default_factory_remoting),
-            render_thread->GetMediaThreadTaskRunner());
+            render_thread->GetMediaSequencedTaskRunner());
     auto is_remoting_media = base::BindRepeating(
         [](const GURL& url) -> bool {
           return url.SchemeIs(media::remoting::kRemotingScheme);
@@ -788,7 +789,7 @@
       render_frame_->GetTaskRunner(blink::TaskType::kInternalMedia),
       render_thread->GetIOTaskRunner(),
       GetOrCreateVideoFrameCompositorTaskRunner(render_frame_),
-      render_thread->GetMediaThreadTaskRunner(),
+      render_thread->GetMediaSequencedTaskRunner(),
       std::move(compositor_worker_task_runner),
       render_thread->GetGpuFactories(), sink_id,
       base::BindOnce(&blink::WebSurfaceLayerBridge::Create,
diff --git a/content/renderer/media/win/dcomp_texture_factory.cc b/content/renderer/media/win/dcomp_texture_factory.cc
index f43b5b5b..5b9f0ae 100644
--- a/content/renderer/media/win/dcomp_texture_factory.cc
+++ b/content/renderer/media/win/dcomp_texture_factory.cc
@@ -15,7 +15,7 @@
 // static
 scoped_refptr<DCOMPTextureFactory> DCOMPTextureFactory::Create(
     scoped_refptr<gpu::GpuChannelHost> channel,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) {
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner) {
   DVLOG(1) << __func__;
   return WrapRefCounted(
       new DCOMPTextureFactory(std::move(channel), media_task_runner));
@@ -23,7 +23,7 @@
 
 DCOMPTextureFactory::DCOMPTextureFactory(
     scoped_refptr<gpu::GpuChannelHost> channel,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner)
     : channel_(std::move(channel)), media_task_runner_(media_task_runner) {
   DVLOG_FUNC(1);
   DCHECK(channel_);
@@ -34,7 +34,7 @@
 std::unique_ptr<DCOMPTextureHost> DCOMPTextureFactory::CreateDCOMPTextureHost(
     DCOMPTextureHost::Listener* listener) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   int32_t route_id = channel_->GenerateRouteID();
   mojo::PendingAssociatedRemote<gpu::mojom::DCOMPTexture> remote;
@@ -58,7 +58,7 @@
 }
 
 gpu::SharedImageInterface* DCOMPTextureFactory::SharedImageInterface() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (!shared_image_interface_)
     shared_image_interface_ = channel_->CreateClientSharedImageInterface();
diff --git a/content/renderer/media/win/dcomp_texture_factory.h b/content/renderer/media/win/dcomp_texture_factory.h
index b1f33b4..5f5945c 100644
--- a/content/renderer/media/win/dcomp_texture_factory.h
+++ b/content/renderer/media/win/dcomp_texture_factory.h
@@ -10,7 +10,7 @@
 #include <memory>
 
 #include "base/memory/ref_counted.h"
-#include "base/task/single_thread_task_runner.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/unguessable_token.h"
 #include "cc/layers/video_frame_provider.h"
 #include "content/common/content_export.h"
@@ -39,7 +39,7 @@
  public:
   static scoped_refptr<DCOMPTextureFactory> Create(
       scoped_refptr<gpu::GpuChannelHost> channel,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner);
 
   // Create the DCOMPTextureHost object. This internally creates a
   // gpu::DCOMPTexture and returns its route_id. If this route_id is invalid
@@ -56,7 +56,7 @@
  protected:
   DCOMPTextureFactory(
       scoped_refptr<gpu::GpuChannelHost> channel,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner);
   DCOMPTextureFactory(const DCOMPTextureFactory&) = delete;
   DCOMPTextureFactory& operator=(const DCOMPTextureFactory&) = delete;
   virtual ~DCOMPTextureFactory();
@@ -65,7 +65,7 @@
   friend class base::RefCountedThreadSafe<DCOMPTextureFactory>;
 
   scoped_refptr<gpu::GpuChannelHost> channel_;
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   std::unique_ptr<gpu::ClientSharedImageInterface> shared_image_interface_;
 };
 
diff --git a/content/renderer/media/win/dcomp_texture_host.cc b/content/renderer/media/win/dcomp_texture_host.cc
index cc88e83..46c85e4 100644
--- a/content/renderer/media/win/dcomp_texture_host.cc
+++ b/content/renderer/media/win/dcomp_texture_host.cc
@@ -18,12 +18,12 @@
 DCOMPTextureHost::DCOMPTextureHost(
     scoped_refptr<gpu::GpuChannelHost> channel,
     int32_t route_id,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     mojo::PendingAssociatedRemote<gpu::mojom::DCOMPTexture> texture,
     Listener* listener)
     : channel_(std::move(channel)), route_id_(route_id), listener_(listener) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner->BelongsToCurrentThread());
+  DCHECK(media_task_runner->RunsTasksInCurrentSequence());
   DCHECK(channel_);
   DCHECK(route_id_);
   DCHECK(listener_);
diff --git a/content/renderer/media/win/dcomp_texture_host.h b/content/renderer/media/win/dcomp_texture_host.h
index 7ab566f0..7db6626 100644
--- a/content/renderer/media/win/dcomp_texture_host.h
+++ b/content/renderer/media/win/dcomp_texture_host.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "base/task/sequenced_task_runner.h"
 #include "base/unguessable_token.h"
 #include "base/win/windows_types.h"
 #include "gpu/ipc/common/gpu_channel.mojom.h"
@@ -42,7 +43,7 @@
   DCOMPTextureHost(
       scoped_refptr<gpu::GpuChannelHost> channel,
       int32_t route_id,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       mojo::PendingAssociatedRemote<gpu::mojom::DCOMPTexture> texture,
       Listener* listener);
   DCOMPTextureHost(const DCOMPTextureHost&) = delete;
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
index f7e5d63..23c67ff2 100644
--- a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
+++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
@@ -78,7 +78,7 @@
 // static
 std::unique_ptr<media::DCOMPTextureWrapper> DCOMPTextureWrapperImpl::Create(
     scoped_refptr<DCOMPTextureFactory> factory,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner) {
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner) {
   DVLOG(1) << __func__;
   // auto* impl = new DCOMPTextureWrapperImpl(factory, media_task_runner);
   return base::WrapUnique(
@@ -87,14 +87,14 @@
 
 DCOMPTextureWrapperImpl::DCOMPTextureWrapperImpl(
     scoped_refptr<DCOMPTextureFactory> factory,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner)
     : factory_(factory), media_task_runner_(media_task_runner) {
   DVLOG_FUNC(1);
 }
 
 DCOMPTextureWrapperImpl::~DCOMPTextureWrapperImpl() {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // We do not need any additional cleanup logic here as the
   // OnReleaseVideoFrame() callback handles cleaning up the shared image.
@@ -104,7 +104,7 @@
     const gfx::Size& output_size,
     OutputRectChangeCB output_rect_change_cb) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   output_size_ = output_size;
 
@@ -118,7 +118,7 @@
 
 void DCOMPTextureWrapperImpl::UpdateTextureSize(const gfx::Size& new_size) {
   DVLOG_FUNC(2);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // We would like to invoke SetTextureSize() which will let DCOMPTexture to
   // bind a mailbox to its SharedImage as early as possible. Let new_size of
@@ -134,7 +134,7 @@
     const base::UnguessableToken& token,
     SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   dcomp_texture_host_->SetDCOMPSurfaceHandle(
       token, std::move(set_dcomp_surface_handle_cb));
@@ -144,7 +144,7 @@
     const gfx::Size& natural_size,
     CreateVideoFrameCB create_video_frame_cb) {
   DVLOG_FUNC(2);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   natural_size_ = natural_size;
   if (mailbox_.IsZero()) {
@@ -190,7 +190,7 @@
     const gfx::Size& natural_size,
     gfx::GpuMemoryBufferHandle dx_handle,
     CreateDXVideoFrameCB create_video_frame_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   gpu::SharedImageInterface* sii = factory_->SharedImageInterface();
 
   uint32_t usage = gpu::SHARED_IMAGE_USAGE_RASTER |
@@ -234,14 +234,14 @@
 void DCOMPTextureWrapperImpl::OnDXVideoFrameDestruction(
     const gpu::SyncToken& sync_token,
     const gpu::Mailbox& image_mailbox) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   gpu::SharedImageInterface* sii = factory_->SharedImageInterface();
   sii->DestroySharedImage(sync_token, image_mailbox);
 }
 
 void DCOMPTextureWrapperImpl::OnSharedImageMailboxBound(gpu::Mailbox mailbox) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   mailbox_ = std::move(mailbox);
 
@@ -253,7 +253,7 @@
 
 void DCOMPTextureWrapperImpl::OnOutputRectChange(gfx::Rect output_rect) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   output_rect_change_cb_.Run(output_rect);
 }
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.h b/content/renderer/media/win/dcomp_texture_wrapper_impl.h
index 60d6a32..60e89d7 100644
--- a/content/renderer/media/win/dcomp_texture_wrapper_impl.h
+++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.h
@@ -5,7 +5,7 @@
 #ifndef CONTENT_RENDERER_MEDIA_WIN_DCOMP_TEXTURE_WRAPPER_IMPL_H_
 #define CONTENT_RENDERER_MEDIA_WIN_DCOMP_TEXTURE_WRAPPER_IMPL_H_
 
-#include "base/task/single_thread_task_runner.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/unguessable_token.h"
 #include "content/common/content_export.h"
 #include "content/renderer/media/win/dcomp_texture_factory.h"
@@ -38,7 +38,7 @@
  public:
   static std::unique_ptr<media::DCOMPTextureWrapper> Create(
       scoped_refptr<DCOMPTextureFactory> factory,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner);
 
   ~DCOMPTextureWrapperImpl() override;
 
@@ -61,7 +61,7 @@
  private:
   DCOMPTextureWrapperImpl(
       scoped_refptr<DCOMPTextureFactory> factory,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner);
   DCOMPTextureWrapperImpl(const DCOMPTextureWrapperImpl&) = delete;
   DCOMPTextureWrapperImpl& operator=(const DCOMPTextureWrapperImpl&) = delete;
 
@@ -73,7 +73,7 @@
                                  const gpu::Mailbox& image_mailbox);
 
   scoped_refptr<DCOMPTextureFactory> factory_;
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   gfx::Size natural_size_;  // Size of the video frames.
   gfx::Size output_size_;   // Size of the video output (on-screen size).
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index 09449e1..252b52c42 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -305,7 +305,7 @@
     : state_(UNINITIALIZED),
       host_(host),
       media_task_runner_(
-          RenderThreadImpl::current()->GetMediaThreadTaskRunner()),
+          RenderThreadImpl::current()->GetMediaSequencedTaskRunner()),
       context_provider_(
           RenderThreadImpl::current()->SharedMainThreadContextProvider()),
       texture_pool_size_(texture_pool_size),
diff --git a/content/renderer/pepper/video_decoder_shim.h b/content/renderer/pepper/video_decoder_shim.h
index 278d47a..7640b3e 100644
--- a/content/renderer/pepper/video_decoder_shim.h
+++ b/content/renderer/pepper/video_decoder_shim.h
@@ -14,14 +14,11 @@
 
 #include "base/containers/queue.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/video_decoder_config.h"
 #include "media/video/video_decode_accelerator.h"
 #include "ppapi/c/pp_codecs.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace viz {
 class ContextProviderCommandBuffer;
 }
@@ -81,7 +78,7 @@
   State state_;
 
   PepperVideoDecoderHost* host_;
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   scoped_refptr<viz::ContextProviderCommandBuffer> context_provider_;
 
   // The current decoded frame size.
diff --git a/content/renderer/pepper/video_encoder_shim.cc b/content/renderer/pepper/video_encoder_shim.cc
index 32dd49ae..16faa6f 100644
--- a/content/renderer/pepper/video_encoder_shim.cc
+++ b/content/renderer/pepper/video_encoder_shim.cc
@@ -363,7 +363,7 @@
 VideoEncoderShim::VideoEncoderShim(PepperVideoEncoderHost* host)
     : host_(host),
       media_task_runner_(
-          RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {
+          RenderThreadImpl::current()->GetMediaSequencedTaskRunner()) {
   encoder_impl_ = std::make_unique<EncoderImpl>(weak_ptr_factory_.GetWeakPtr());
 }
 
diff --git a/content/renderer/pepper/video_encoder_shim.h b/content/renderer/pepper/video_encoder_shim.h
index 9c2eebf..26ff364 100644
--- a/content/renderer/pepper/video_encoder_shim.h
+++ b/content/renderer/pepper/video_encoder_shim.h
@@ -12,13 +12,10 @@
 #include <vector>
 
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/bitrate.h"
 #include "media/video/video_encode_accelerator.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace gfx {
 class Size;
 }
@@ -71,7 +68,7 @@
   PepperVideoEncoderHost* host_;
 
   // Task doing the encoding.
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   base::WeakPtrFactory<VideoEncoderShim> weak_ptr_factory_{this};
 };
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 17b6280..0595073 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -993,7 +993,7 @@
     if (!gpu_factories_.back()->CheckContextProviderLostOnMainThread())
       return gpu_factories_.back().get();
 
-    GetMediaThreadTaskRunner()->PostTask(
+    GetMediaSequencedTaskRunner()->PostTask(
         FROM_HERE,
         base::BindOnce(&GpuVideoAcceleratorFactoriesImpl::DestroyContext,
                        base::Unretained(gpu_factories_.back().get())));
@@ -1078,7 +1078,7 @@
 
   gpu_factories_.push_back(GpuVideoAcceleratorFactoriesImpl::Create(
       std::move(gpu_channel_host), base::ThreadTaskRunnerHandle::Get(),
-      GetMediaThreadTaskRunner(), std::move(media_context_provider),
+      GetMediaSequencedTaskRunner(), std::move(media_context_provider),
       enable_video_gpu_memory_buffers, enable_media_stream_gpu_memory_buffers,
       enable_video_decode_accelerator, enable_video_encode_accelerator,
       std::move(interface_factory), std::move(vea_provider)));
@@ -1193,7 +1193,7 @@
       return nullptr;
     }
     dcomp_texture_factory_ = DCOMPTextureFactory::Create(
-        std::move(channel), GetMediaThreadTaskRunner());
+        std::move(channel), GetMediaSequencedTaskRunner());
   }
   return dcomp_texture_factory_;
 }
@@ -1582,8 +1582,8 @@
   }
 }
 
-scoped_refptr<base::SingleThreadTaskRunner>
-RenderThreadImpl::GetMediaThreadTaskRunner() {
+scoped_refptr<base::SequencedTaskRunner>
+RenderThreadImpl::GetMediaSequencedTaskRunner() {
   DCHECK(main_thread_runner()->BelongsToCurrentThread());
   if (!media_thread_) {
     media_thread_ = std::make_unique<base::Thread>("Media");
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index b2fb8e3..f0474c1 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -24,6 +24,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/observer_list.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "base/types/pass_key.h"
 #include "build/build_config.h"
@@ -282,10 +283,9 @@
   // has been lost.
   gpu::GpuChannelHost* GetGpuChannel();
 
-  // Returns a SingleThreadTaskRunner instance corresponding to the message loop
-  // of the thread on which media operations should be run. Must be called
-  // on the renderer's main thread.
-  scoped_refptr<base::SingleThreadTaskRunner> GetMediaThreadTaskRunner();
+  // Returns the sequence on which media operations should be run. Must be
+  // called on the renderer's main thread.
+  scoped_refptr<base::SequencedTaskRunner> GetMediaSequencedTaskRunner();
 
   // Creates a ContextProvider if yet created, and returns it to be used for
   // video frame compositing. The ContextProvider given as an argument is
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 4cedfbfa..ebf53c6a 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -25,6 +25,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/thread_restrictions.h"
@@ -972,13 +973,13 @@
   return render_thread->GetGpuFactories();
 }
 
-scoped_refptr<base::SingleThreadTaskRunner>
+scoped_refptr<base::SequencedTaskRunner>
 RendererBlinkPlatformImpl::MediaThreadTaskRunner() {
   auto* render_thread = RenderThreadImpl::current();
   if (!render_thread)
     return nullptr;
 
-  return render_thread->GetMediaThreadTaskRunner();
+  return render_thread->GetMediaSequencedTaskRunner();
 }
 
 base::WeakPtr<media::DecoderFactory>
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 78ffa14..ff010df 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -14,6 +14,7 @@
 #include "base/containers/id_map.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/thread_annotations.h"
 #include "base/threading/thread_checker.h"
@@ -213,7 +214,7 @@
       scoped_refptr<base::SingleThreadTaskRunner> owner_task_runner,
       bool is_on_worker) override;
   media::GpuVideoAcceleratorFactories* GetGpuFactories() override;
-  scoped_refptr<base::SingleThreadTaskRunner> MediaThreadTaskRunner() override;
+  scoped_refptr<base::SequencedTaskRunner> MediaThreadTaskRunner() override;
   base::WeakPtr<media::DecoderFactory> GetMediaDecoderFactory() override;
   void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override;
   gfx::ColorSpace GetRenderingColorSpace() const override;
diff --git a/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.cc b/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.cc
index 8dd915a..9094e722 100644
--- a/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.cc
+++ b/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.cc
@@ -32,7 +32,7 @@
 
 std::vector<std::unique_ptr<media::VideoDecoder>>
 WebEngineMediaRendererFactory::CreateVideoDecoders(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     media::RequestOverlayInfoCB request_overlay_info_cb,
     const gfx::ColorSpace& target_color_space,
     media::GpuVideoAcceleratorFactories* gpu_factories) {
@@ -44,7 +44,7 @@
 }
 
 std::unique_ptr<media::Renderer> WebEngineMediaRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     media::AudioRendererSink* audio_renderer_sink,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.h b/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.h
index f88dc815..9f858bc 100644
--- a/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.h
+++ b/fuchsia_web/webengine/renderer/web_engine_media_renderer_factory.h
@@ -39,7 +39,7 @@
 
   // RendererFactory interface.
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
@@ -48,7 +48,7 @@
 
  private:
   std::vector<std::unique_ptr<media::VideoDecoder>> CreateVideoDecoders(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       media::RequestOverlayInfoCB request_overlay_info_cb,
       const gfx::ColorSpace& target_color_space,
       media::GpuVideoAcceleratorFactories* gpu_factories);
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc
index 682ed9f..4cbf85b2d 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -47,7 +47,7 @@
     scoped_refptr<GpuChannelHost> channel,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
     int32_t stream_id,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
     base::SharedMemoryMapper* transfer_buffer_mapper)
     : channel_(std::move(channel)),
       gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h
index 80369c9..12f2fbfbb 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.h
+++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -25,6 +25,7 @@
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "gpu/command_buffer/client/gpu_control.h"
@@ -82,7 +83,7 @@
       scoped_refptr<GpuChannelHost> channel,
       GpuMemoryBufferManager* gpu_memory_buffer_manager,
       int32_t stream_id,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+      scoped_refptr<base::SequencedTaskRunner> task_runner,
       base::SharedMemoryMapper* transfer_buffer_mapper = nullptr);
 
   CommandBufferProxyImpl(const CommandBufferProxyImpl&) = delete;
@@ -289,7 +290,7 @@
   raw_ptr<base::HistogramBase> uma_histogram_ensure_work_visible_duration_ =
       nullptr;
 
-  scoped_refptr<base::SingleThreadTaskRunner> callback_thread_;
+  scoped_refptr<base::SequencedTaskRunner> callback_thread_;
 
   // Optional shared memory mapper to use when creating transfer buffers.
   // TODO(1321521) remove this member and instead let callers of
diff --git a/media/audio/null_audio_sink.cc b/media/audio/null_audio_sink.cc
index 337ce19..7baf208 100644
--- a/media/audio/null_audio_sink.cc
+++ b/media/audio/null_audio_sink.cc
@@ -16,7 +16,7 @@
 namespace media {
 
 NullAudioSink::NullAudioSink(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner)
     : initialized_(false),
       started_(false),
       playing_(false),
@@ -36,14 +36,14 @@
 }
 
 void NullAudioSink::Start() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(initialized_);
   DCHECK(!started_);
   started_ = true;
 }
 
 void NullAudioSink::Stop() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   started_ = false;
   // Stop may be called at any time, so we have to check before stopping.
   if (fake_worker_)
@@ -51,7 +51,7 @@
 }
 
 void NullAudioSink::Play() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(started_);
 
   if (playing_)
@@ -64,7 +64,7 @@
 }
 
 void NullAudioSink::Pause() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(started_);
 
   if (!playing_)
@@ -95,7 +95,7 @@
 }
 
 bool NullAudioSink::CurrentThreadIsRenderingThread() {
-  return task_runner_->BelongsToCurrentThread();
+  return task_runner_->RunsTasksInCurrentSequence();
 }
 
 void NullAudioSink::SwitchOutputDevice(const std::string& device_id,
@@ -105,7 +105,7 @@
 
 void NullAudioSink::CallRender(base::TimeTicks ideal_time,
                                base::TimeTicks now) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Since NullAudioSink is only used for cases where a real audio sink was not
   // available, provide "idealized" delay-timing arguments. This will drive the
diff --git a/media/audio/null_audio_sink.h b/media/audio/null_audio_sink.h
index dd037a3..5a950a1 100644
--- a/media/audio/null_audio_sink.h
+++ b/media/audio/null_audio_sink.h
@@ -9,13 +9,10 @@
 #include <string>
 
 #include "base/memory/raw_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "media/base/audio_renderer_sink.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace media {
 class AudioBus;
 class AudioHash;
@@ -24,7 +21,7 @@
 class MEDIA_EXPORT NullAudioSink : public SwitchableAudioRendererSink {
  public:
   explicit NullAudioSink(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
+      const scoped_refptr<base::SequencedTaskRunner>& task_runner);
 
   NullAudioSink(const NullAudioSink&) = delete;
   NullAudioSink& operator=(const NullAudioSink&) = delete;
@@ -66,7 +63,7 @@
   // Controls whether or not a running hash is computed for audio frames.
   std::unique_ptr<AudioHash> audio_hash_;
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
   std::unique_ptr<FakeAudioWorker> fake_worker_;
   base::TimeDelta fixed_data_delay_;
   std::unique_ptr<AudioBus> audio_bus_;
diff --git a/media/base/fake_audio_worker.cc b/media/base/fake_audio_worker.cc
index 291c2f82..000a5e0 100644
--- a/media/base/fake_audio_worker.cc
+++ b/media/base/fake_audio_worker.cc
@@ -12,6 +12,7 @@
 #include "base/check_op.h"
 #include "base/location.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/thread_annotations.h"
 #include "base/threading/thread_checker.h"
@@ -24,7 +25,7 @@
 class FakeAudioWorker::Worker
     : public base::RefCountedThreadSafe<FakeAudioWorker::Worker> {
  public:
-  Worker(const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
+  Worker(const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
          const AudioParameters& params);
 
   Worker(const Worker&) = delete;
@@ -49,7 +50,7 @@
   // the worker loop.
   void DoRead();
 
-  const scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
   const int sample_rate_;
   const int frames_per_read_;
 
@@ -61,11 +62,11 @@
   // Used to cancel any delayed tasks still inside the worker loop's queue.
   base::CancelableRepeatingClosure worker_task_cb_;
 
-  THREAD_CHECKER(thread_checker_);
+  SEQUENCE_CHECKER(sequence_checker_);
 };
 
 FakeAudioWorker::FakeAudioWorker(
-    const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
     const AudioParameters& params)
     : worker_(new Worker(worker_task_runner, params)) {}
 
@@ -94,14 +95,14 @@
 }
 
 FakeAudioWorker::Worker::Worker(
-    const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
     const AudioParameters& params)
     : worker_task_runner_(worker_task_runner),
       sample_rate_(params.sample_rate()),
       frames_per_read_(params.frames_per_buffer()) {
   // Worker can be constructed on any thread, but will DCHECK that its
   // Start/Stop methods are called from the same thread.
-  DETACH_FROM_THREAD(thread_checker_);
+  DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
 FakeAudioWorker::Worker::~Worker() {
@@ -114,7 +115,7 @@
 }
 
 void FakeAudioWorker::Worker::Start(FakeAudioWorker::Callback worker_cb) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(worker_cb);
   {
     base::AutoLock scoped_lock(worker_cb_lock_);
@@ -126,7 +127,7 @@
 }
 
 void FakeAudioWorker::Worker::DoStart() {
-  DCHECK(worker_task_runner_->BelongsToCurrentThread());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   first_read_time_ = base::TimeTicks::Now();
   frames_elapsed_ = 0;
   worker_task_cb_.Reset(base::BindRepeating(&Worker::DoRead, this));
@@ -134,7 +135,7 @@
 }
 
 void FakeAudioWorker::Worker::Stop() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   {
     base::AutoLock scoped_lock(worker_cb_lock_);
     if (!worker_cb_)
@@ -146,12 +147,12 @@
 }
 
 void FakeAudioWorker::Worker::DoCancel() {
-  DCHECK(worker_task_runner_->BelongsToCurrentThread());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   worker_task_cb_.Cancel();
 }
 
 void FakeAudioWorker::Worker::DoRead() {
-  DCHECK(worker_task_runner_->BelongsToCurrentThread());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
 
   const base::TimeTicks read_time =
       first_read_time_ +
diff --git a/media/base/fake_audio_worker.h b/media/base/fake_audio_worker.h
index 097bc0b..23ba43d 100644
--- a/media/base/fake_audio_worker.h
+++ b/media/base/fake_audio_worker.h
@@ -7,13 +7,13 @@
 
 #include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/media_export.h"
 
 namespace base {
-class SingleThreadTaskRunner;
 class TimeDelta;
 class TimeTicks;
-}
+}  // namespace base
 
 namespace media {
 class AudioParameters;
@@ -33,7 +33,7 @@
   // thread that invokes the Start/Stop methods.
   // |params| is used to determine the frequency of callbacks.
   FakeAudioWorker(
-      const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
       const AudioParameters& params);
 
   FakeAudioWorker(const FakeAudioWorker&) = delete;
diff --git a/media/base/media_url_demuxer.cc b/media/base/media_url_demuxer.cc
index 180887a19..5b3a58025 100644
--- a/media/base/media_url_demuxer.cc
+++ b/media/base/media_url_demuxer.cc
@@ -11,7 +11,7 @@
 namespace media {
 
 MediaUrlDemuxer::MediaUrlDemuxer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     const GURL& media_url,
     const net::SiteForCookies& site_for_cookies,
     const url::Origin& top_frame_origin,
@@ -44,7 +44,7 @@
 void MediaUrlDemuxer::ForwardDurationChangeToDemuxerHost(
     base::TimeDelta duration) {
   DCHECK(host_);
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   host_->SetDuration(duration);
 }
 
diff --git a/media/base/media_url_demuxer.h b/media/base/media_url_demuxer.h
index f4c721a..1be5a29 100644
--- a/media/base/media_url_demuxer.h
+++ b/media/base/media_url_demuxer.h
@@ -13,10 +13,6 @@
 #include "media/base/demuxer.h"
 #include "url/gurl.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
 namespace net {
 class SiteForCookies;
 }  // namespace net
@@ -36,13 +32,12 @@
 // MediaResource.
 class MEDIA_EXPORT MediaUrlDemuxer : public Demuxer {
  public:
-  MediaUrlDemuxer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const GURL& media_url,
-      const net::SiteForCookies& site_for_cookies,
-      const url::Origin& top_frame_origin,
-      bool allow_credentials,
-      bool is_hls);
+  MediaUrlDemuxer(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
+                  const GURL& media_url,
+                  const net::SiteForCookies& site_for_cookies,
+                  const url::Origin& top_frame_origin,
+                  bool allow_credentials,
+                  bool is_hls);
 
   MediaUrlDemuxer(const MediaUrlDemuxer&) = delete;
   MediaUrlDemuxer& operator=(const MediaUrlDemuxer&) = delete;
@@ -79,7 +74,7 @@
   MediaUrlParams params_;
   raw_ptr<DemuxerHost> host_;
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 };
 
 }  // namespace media
diff --git a/media/base/memory_dump_provider_proxy.cc b/media/base/memory_dump_provider_proxy.cc
index 8dcde76..e8b3b2b 100644
--- a/media/base/memory_dump_provider_proxy.cc
+++ b/media/base/memory_dump_provider_proxy.cc
@@ -12,11 +12,12 @@
 
 MemoryDumpProviderProxy::MemoryDumpProviderProxy(
     const char* name,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
     MemoryDumpCB dump_cb)
     : dump_cb_(std::move(dump_cb)) {
-  base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
-      this, name, std::move(task_runner));
+  base::trace_event::MemoryDumpManager::GetInstance()
+      ->RegisterDumpProviderWithSequencedTaskRunner(
+          this, name, std::move(task_runner), MemoryDumpProvider::Options());
 }
 
 MemoryDumpProviderProxy::~MemoryDumpProviderProxy() {
diff --git a/media/base/memory_dump_provider_proxy.h b/media/base/memory_dump_provider_proxy.h
index fa418aa..c67a09e 100644
--- a/media/base/memory_dump_provider_proxy.h
+++ b/media/base/memory_dump_provider_proxy.h
@@ -10,6 +10,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_piece.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "media/base/media_export.h"
@@ -23,10 +24,9 @@
 class MEDIA_EXPORT MemoryDumpProviderProxy final
     : public base::trace_event::MemoryDumpProvider {
  public:
-  MemoryDumpProviderProxy(
-      const char* name,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      MemoryDumpCB dump_cb);
+  MemoryDumpProviderProxy(const char* name,
+                          scoped_refptr<base::SequencedTaskRunner> task_runner,
+                          MemoryDumpCB dump_cb);
 
   MemoryDumpProviderProxy(const MemoryDumpProviderProxy&) = delete;
   MemoryDumpProviderProxy& operator=(const MemoryDumpProviderProxy&) = delete;
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index e2b22f02..63ea945 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -534,14 +534,14 @@
   ~MockRendererFactory() override;
 
   // Renderer implementation.
-  MOCK_METHOD6(CreateRenderer,
-               std::unique_ptr<Renderer>(
-                   const scoped_refptr<base::SingleThreadTaskRunner>&,
-                   const scoped_refptr<base::TaskRunner>&,
-                   AudioRendererSink*,
-                   VideoRendererSink*,
-                   RequestOverlayInfoCB,
-                   const gfx::ColorSpace&));
+  MOCK_METHOD6(
+      CreateRenderer,
+      std::unique_ptr<Renderer>(const scoped_refptr<base::SequencedTaskRunner>&,
+                                const scoped_refptr<base::TaskRunner>&,
+                                AudioRendererSink*,
+                                VideoRendererSink*,
+                                RequestOverlayInfoCB,
+                                const gfx::ColorSpace&));
 };
 
 class MockTimeSource : public TimeSource {
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 4f79aa74..7070e27 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -18,6 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
@@ -61,7 +62,7 @@
 class PipelineImpl::RendererWrapper final : public DemuxerHost,
                                             public RendererClient {
  public:
-  RendererWrapper(scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+  RendererWrapper(scoped_refptr<base::SequencedTaskRunner> media_task_runner,
                   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
                   MediaLog* media_log);
 
@@ -190,7 +191,7 @@
   // one by calling back to PipelineImpl. Fires |done_cb| with the result.
   void CreateRendererInternal(PipelineStatusCallback done_cb);
 
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
   const raw_ptr<MediaLog> media_log_;
 
@@ -248,7 +249,7 @@
 };
 
 PipelineImpl::RendererWrapper::RendererWrapper(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     MediaLog* media_log)
     : media_task_runner_(std::move(media_task_runner)),
@@ -264,7 +265,7 @@
       text_renderer_ended_(false) {}
 
 PipelineImpl::RendererWrapper::~RendererWrapper() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(state_ == kCreated || state_ == kStopped);
 }
 
@@ -279,7 +280,7 @@
     Demuxer* demuxer,
     std::unique_ptr<Renderer> default_renderer,
     base::WeakPtr<PipelineImpl> weak_pipeline) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(state_ == kCreated || state_ == kStopped)
       << "Received start in unexpected state: " << state_;
   DCHECK(!demuxer_);
@@ -325,7 +326,7 @@
 }
 
 void PipelineImpl::RendererWrapper::Stop() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(state_ != kStopping && state_ != kStopped);
 
   SetState(kStopping);
@@ -357,7 +358,7 @@
 }
 
 void PipelineImpl::RendererWrapper::Seek(base::TimeDelta time) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Suppress seeking if we're not fully started.
   if (state_ != kPlaying) {
@@ -398,7 +399,7 @@
 }
 
 void PipelineImpl::RendererWrapper::Suspend() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Suppress suspending if we're not playing.
   if (state_ != kPlaying) {
@@ -432,7 +433,7 @@
 void PipelineImpl::RendererWrapper::Resume(
     std::unique_ptr<Renderer> default_renderer,
     base::TimeDelta timestamp) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Suppress resuming if we're not suspended.
   if (state_ != kSuspended) {
@@ -475,7 +476,7 @@
 }
 
 void PipelineImpl::RendererWrapper::SetPlaybackRate(double playback_rate) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   playback_rate_ = playback_rate;
   if (state_ == kPlaying)
@@ -483,7 +484,7 @@
 }
 
 void PipelineImpl::RendererWrapper::SetVolume(float volume) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   volume_ = volume;
   if (shared_state_.renderer)
@@ -492,7 +493,7 @@
 
 void PipelineImpl::RendererWrapper::SetLatencyHint(
     absl::optional<base::TimeDelta> latency_hint) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (latency_hint_ == latency_hint)
     return;
@@ -503,7 +504,7 @@
 }
 
 void PipelineImpl::RendererWrapper::SetPreservesPitch(bool preserves_pitch) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (preserves_pitch_ == preserves_pitch)
     return;
@@ -515,7 +516,7 @@
 
 void PipelineImpl::RendererWrapper::SetWasPlayedWithUserActivation(
     bool was_played_with_user_activation) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   was_played_with_user_activation_ = was_played_with_user_activation;
   if (shared_state_.renderer) {
@@ -560,7 +561,7 @@
 
 void PipelineImpl::RendererWrapper::SetCdm(CdmContext* cdm_context,
                                            CdmAttachedCB cdm_attached_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(cdm_context);
 
   // If there's already a renderer, set the CDM on the renderer directly.
@@ -651,20 +652,20 @@
 }
 
 void PipelineImpl::RendererWrapper::OnError(PipelineStatus error) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(error_cb_);
   media_task_runner_->PostTask(FROM_HERE, base::BindOnce(error_cb_, error));
 }
 
 void PipelineImpl::RendererWrapper::OnFallback(PipelineStatus fallback) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   main_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&PipelineImpl::OnFallback, weak_pipeline_,
                                 std::move(fallback).AddHere()));
 }
 
 void PipelineImpl::RendererWrapper::OnEnded() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   media_log_->AddEvent<MediaLogEvent::kEnded>();
 
   if (state_ != kPlaying)
@@ -677,7 +678,7 @@
 
 // TODO(crbug/817089): Combine this functionality into renderer->GetMediaTime().
 base::TimeDelta PipelineImpl::RendererWrapper::GetCurrentTimestamp() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(demuxer_);
   DCHECK(shared_state_.renderer || state_ != kPlaying);
 
@@ -700,7 +701,7 @@
 void PipelineImpl::RendererWrapper::OnEnabledAudioTracksChanged(
     const std::vector<MediaTrack::Id>& enabled_track_ids,
     base::OnceClosure change_completed_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // If the pipeline has been created, but not started yet, we may still receive
   // track notifications from blink level (e.g. when video track gets deselected
@@ -741,7 +742,7 @@
 void PipelineImpl::RendererWrapper::OnSelectedVideoTrackChanged(
     absl::optional<MediaTrack::Id> selected_track_id,
     base::OnceClosure change_completed_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // See RenderWrapper::OnEnabledAudioTracksChanged.
   if (state_ == kCreated) {
@@ -779,7 +780,7 @@
 }
 
 void PipelineImpl::RendererWrapper::OnExternalVideoFrameRequest() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (!shared_state_.renderer) {
     return;
   }
@@ -791,7 +792,7 @@
     base::OnceClosure change_completed_cb,
     DemuxerStream::Type stream_type,
     const std::vector<DemuxerStream*>& streams) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (!shared_state_.renderer) {
     // This can happen if the pipeline has been suspended.
     std::move(change_completed_cb).Run();
@@ -817,7 +818,7 @@
 void PipelineImpl::RendererWrapper::OnStatisticsUpdate(
     const PipelineStatistics& stats) {
   DVLOG(3) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(shared_state_lock_);
   shared_state_.statistics.audio_bytes_decoded += stats.audio_bytes_decoded;
@@ -871,7 +872,7 @@
 void PipelineImpl::RendererWrapper::OnBufferingStateChange(
     BufferingState state,
     BufferingStateChangeReason reason) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DVLOG(2) << __func__ << "(" << state << ", " << reason << ") ";
 
   main_task_runner_->PostTask(
@@ -880,7 +881,7 @@
 }
 
 void PipelineImpl::RendererWrapper::OnWaiting(WaitingReason reason) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(
       FROM_HERE,
@@ -889,7 +890,7 @@
 
 void PipelineImpl::RendererWrapper::OnVideoNaturalSizeChange(
     const gfx::Size& size) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&PipelineImpl::OnVideoNaturalSizeChange,
@@ -897,7 +898,7 @@
 }
 
 void PipelineImpl::RendererWrapper::OnVideoOpacityChange(bool opaque) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&PipelineImpl::OnVideoOpacityChange,
@@ -906,7 +907,7 @@
 
 void PipelineImpl::RendererWrapper::OnVideoFrameRateChange(
     absl::optional<int> fps) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&PipelineImpl::OnVideoFrameRateChange,
@@ -915,7 +916,7 @@
 
 void PipelineImpl::RendererWrapper::OnAudioConfigChange(
     const AudioDecoderConfig& config) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(FROM_HERE,
                               base::BindOnce(&PipelineImpl::OnAudioConfigChange,
@@ -924,7 +925,7 @@
 
 void PipelineImpl::RendererWrapper::OnVideoConfigChange(
     const VideoDecoderConfig& config) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   main_task_runner_->PostTask(FROM_HERE,
                               base::BindOnce(&PipelineImpl::OnVideoConfigChange,
@@ -932,7 +933,7 @@
 }
 
 void PipelineImpl::RendererWrapper::OnPipelineError(PipelineStatus error) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!error.is_ok()) << "PIPELINE_OK isn't an error!";
 
   // Preserve existing abnormal status.
@@ -956,7 +957,7 @@
 void PipelineImpl::RendererWrapper::OnCdmAttached(CdmAttachedCB cdm_attached_cb,
                                                   CdmContext* cdm_context,
                                                   bool success) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (success)
     cdm_context_ = cdm_context;
@@ -964,7 +965,7 @@
 }
 
 void PipelineImpl::RendererWrapper::CheckPlaybackEnded() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (shared_state_.renderer && !renderer_ended_)
     return;
@@ -978,7 +979,7 @@
 }
 
 void PipelineImpl::RendererWrapper::SetState(State next_state) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DVLOG(1) << PipelineImpl::GetStateString(state_) << " -> "
            << PipelineImpl::GetStateString(next_state);
 
@@ -993,7 +994,7 @@
 void PipelineImpl::RendererWrapper::CompleteSeek(base::TimeDelta seek_time,
                                                  PipelineStatus status) {
   DVLOG(1) << __func__ << ": seek_time=" << seek_time << ", status=" << status;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(state_ == kStarting || state_ == kSeeking || state_ == kResuming);
 
   if (state_ == kStarting) {
@@ -1026,7 +1027,7 @@
 
 void PipelineImpl::RendererWrapper::CompleteSuspend(PipelineStatus status) {
   DVLOG(1) << __func__ << ": status=" << status;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(kSuspending, state_);
 
   DCHECK(pending_callbacks_);
@@ -1055,7 +1056,7 @@
 
 void PipelineImpl::RendererWrapper::InitializeDemuxer(
     PipelineStatusCallback done_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   demuxer_->Initialize(this, std::move(done_cb));
 }
@@ -1063,7 +1064,7 @@
 void PipelineImpl::RendererWrapper::CreateRenderer(
     PipelineStatusCallback done_cb) {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(state_ == kStarting || state_ == kResuming);
 
   if (HasEncryptedStream() && !cdm_context_) {
@@ -1080,7 +1081,7 @@
     PipelineStatusCallback done_cb,
     std::unique_ptr<Renderer> renderer) {
   DVLOG(1) << __func__ << ": renderer=" << renderer.get();
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (!renderer) {
     std::move(done_cb).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
@@ -1098,7 +1099,7 @@
 void PipelineImpl::RendererWrapper::InitializeRenderer(
     PipelineStatusCallback done_cb) {
   DVLOG(1) << __func__;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   switch (demuxer_->GetType()) {
     case MediaResource::Type::STREAM:
@@ -1138,7 +1139,7 @@
 }
 
 void PipelineImpl::RendererWrapper::DestroyRenderer() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Destroy the renderer outside the lock scope to avoid holding the lock
   // while renderer is being destroyed (in case Renderer destructor is costly).
@@ -1150,7 +1151,7 @@
 }
 
 void PipelineImpl::RendererWrapper::ReportMetadata(StartType start_type) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   PipelineMetadata metadata;
   std::vector<DemuxerStream*> streams;
@@ -1226,7 +1227,7 @@
 }
 
 PipelineImpl::PipelineImpl(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     CreateRendererCB create_renderer_cb,
     MediaLog* media_log)
@@ -1300,7 +1301,7 @@
     return;
   }
 
-  if (media_task_runner_->BelongsToCurrentThread()) {
+  if (media_task_runner_->RunsTasksInCurrentSequence()) {
     // This path is executed by unittests that share media and main threads.
     renderer_wrapper_->Stop();
   } else {
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
index 04d1fa6..61144d0 100644
--- a/media/base/pipeline_impl.h
+++ b/media/base/pipeline_impl.h
@@ -10,6 +10,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "media/base/media_export.h"
@@ -83,7 +84,7 @@
  public:
   // Constructs a pipeline that will execute media tasks on |media_task_runner|.
   // |create_renderer_cb|: to create renderers when starting and resuming.
-  PipelineImpl(scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+  PipelineImpl(scoped_refptr<base::SequencedTaskRunner> media_task_runner,
                scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
                CreateRendererCB create_renderer_cb,
                MediaLog* media_log);
@@ -181,7 +182,7 @@
   void OnSuspendDone();
 
   // Parameters passed in the constructor.
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   CreateRendererCB create_renderer_cb_;
   const raw_ptr<MediaLog> media_log_;
 
diff --git a/media/base/renderer_factory.h b/media/base/renderer_factory.h
index c3b417e4..c18e11f 100644
--- a/media/base/renderer_factory.h
+++ b/media/base/renderer_factory.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/memory/ref_counted.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/media_export.h"
 #include "media/base/media_resource.h"
 #include "media/base/overlay_info.h"
@@ -15,7 +16,6 @@
 #include "ui/gfx/color_space.h"
 
 namespace base {
-class SingleThreadTaskRunner;
 class TaskRunner;
 }
 
@@ -40,7 +40,7 @@
   // The created Renderer can use |audio_renderer_sink| to render audio and
   // |video_renderer_sink| to render video.
   virtual std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
diff --git a/media/base/renderer_factory_selector_unittest.cc b/media/base/renderer_factory_selector_unittest.cc
index 31b113b..fa30f76c0 100644
--- a/media/base/renderer_factory_selector_unittest.cc
+++ b/media/base/renderer_factory_selector_unittest.cc
@@ -18,7 +18,7 @@
     explicit FakeFactory(RendererType type) : type_(type) {}
 
     std::unique_ptr<Renderer> CreateRenderer(
-        const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+        const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
         const scoped_refptr<base::TaskRunner>& worker_task_runner,
         AudioRendererSink* audio_renderer_sink,
         VideoRendererSink* video_renderer_sink,
diff --git a/media/base/serial_runner.cc b/media/base/serial_runner.cc
index d43a34e..376afbc 100644
--- a/media/base/serial_runner.cc
+++ b/media/base/serial_runner.cc
@@ -8,6 +8,7 @@
 #include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 
 namespace media {
@@ -30,7 +31,7 @@
 
 // Runs |status_cb| with |last_status| on |task_runner|.
 static void RunOnTaskRunner(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     PipelineStatusCallback status_cb,
     PipelineStatus last_status) {
   // Force post to permit cancellation of a series in the scenario where all
@@ -67,7 +68,7 @@
 }
 
 SerialRunner::SerialRunner(Queue&& bound_fns, PipelineStatusCallback done_cb)
-    : task_runner_(base::ThreadTaskRunnerHandle::Get()),
+    : task_runner_(base::SequencedTaskRunnerHandle::Get()),
       bound_fns_(std::move(bound_fns)),
       done_cb_(std::move(done_cb)) {
   // Respect both cancellation and calling stack guarantees for |done_cb|
@@ -93,7 +94,7 @@
 }
 
 void SerialRunner::RunNextInSeries(PipelineStatus last_status) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(done_cb_);
 
   if (bound_fns_.empty() || last_status != PIPELINE_OK) {
diff --git a/media/base/serial_runner.h b/media/base/serial_runner.h
index 959816e..0cf3cef 100644
--- a/media/base/serial_runner.h
+++ b/media/base/serial_runner.h
@@ -14,10 +14,6 @@
 #include "media/base/media_export.h"
 #include "media/base/pipeline_status.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace media {
 
 // Runs a series of bound functions accepting Closures or
@@ -81,7 +77,7 @@
 
   void RunNextInSeries(PipelineStatus last_status);
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
   Queue bound_fns_;
   PipelineStatusCallback done_cb_;
 
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index 76661fc..af5a0fb 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -23,7 +23,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_runner_util.h"
 #include "base/task/thread_pool.h"
-#include "base/threading/thread_task_runner_handle.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
@@ -260,7 +260,7 @@
     std::unique_ptr<VideoDecoderConfig> video_config,
     MediaLog* media_log)
     : demuxer_(demuxer),
-      task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      task_runner_(base::SequencedTaskRunnerHandle::Get()),
       stream_(stream),
       start_time_(kNoTimestamp),
       audio_config_(audio_config.release()),
diff --git a/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc
index c529abc3..7eba4c8 100644
--- a/media/mojo/clients/mojo_renderer.cc
+++ b/media/mojo/clients/mojo_renderer.cc
@@ -22,7 +22,7 @@
 namespace media {
 
 MojoRenderer::MojoRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     std::unique_ptr<VideoOverlayFactory> video_overlay_factory,
     VideoRendererSink* video_renderer_sink,
     mojo::PendingRemote<mojom::Renderer> remote_renderer)
@@ -36,7 +36,7 @@
 
 MojoRenderer::~MojoRenderer() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   CancelPendingCallbacks();
 }
@@ -45,7 +45,7 @@
                               media::RendererClient* client,
                               PipelineStatusCallback init_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(media_resource);
 
   if (encountered_error_) {
@@ -71,7 +71,7 @@
 void MojoRenderer::InitializeRendererFromStreams(
     media::RendererClient* client) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Create mojom::DemuxerStream for each demuxer stream and bind its lifetime
   // to the pipe.
@@ -106,7 +106,7 @@
 
 void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) {
   DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   BindRemoteRendererIfNeeded();
 
@@ -128,7 +128,7 @@
 void MojoRenderer::SetCdm(CdmContext* cdm_context,
                           CdmAttachedCB cdm_attached_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(cdm_context);
   DCHECK(cdm_attached_cb);
   DCHECK(!cdm_attached_cb_);
@@ -162,7 +162,7 @@
 
 void MojoRenderer::Flush(base::OnceClosure flush_cb) {
   DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(remote_renderer_.is_bound());
   DCHECK(flush_cb);
   DCHECK(!flush_cb_);
@@ -185,7 +185,7 @@
 
 void MojoRenderer::StartPlayingFrom(base::TimeDelta time) {
   DVLOG(2) << __func__ << "(" << time << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(remote_renderer_.is_bound());
 
   {
@@ -199,7 +199,7 @@
 
 void MojoRenderer::SetPlaybackRate(double playback_rate) {
   DVLOG(2) << __func__ << "(" << playback_rate << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(remote_renderer_.is_bound());
 
   remote_renderer_->SetPlaybackRate(playback_rate);
@@ -212,7 +212,7 @@
 
 void MojoRenderer::SetVolume(float volume) {
   DVLOG(2) << __func__ << "(" << volume << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   volume_ = volume;
   if (remote_renderer_.is_bound())
@@ -229,7 +229,7 @@
                                 base::TimeTicks capture_time) {
   DVLOG(4) << __func__ << "(" << time << ", " << max_time << ", "
            << capture_time << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
   media_time_interpolator_.SetBounds(time, max_time, capture_time);
@@ -238,19 +238,19 @@
 void MojoRenderer::OnBufferingStateChange(BufferingState state,
                                           BufferingStateChangeReason reason) {
   DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnBufferingStateChange(state, reason);
 }
 
 void MojoRenderer::OnEnded() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnEnded();
 }
 
 void MojoRenderer::OnError(const PipelineStatus& status) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!init_cb_);
 
   encountered_error_ = true;
@@ -259,7 +259,7 @@
 
 void MojoRenderer::OnVideoNaturalSizeChange(const gfx::Size& size) {
   DVLOG(2) << __func__ << ": " << size.ToString();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (video_overlay_factory_) {
     video_renderer_sink_->PaintSingleFrame(
@@ -270,25 +270,25 @@
 
 void MojoRenderer::OnVideoOpacityChange(bool opaque) {
   DVLOG(2) << __func__ << ": " << opaque;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoOpacityChange(opaque);
 }
 
 void MojoRenderer::OnAudioConfigChange(const AudioDecoderConfig& config) {
   DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnAudioConfigChange(config);
 }
 
 void MojoRenderer::OnVideoConfigChange(const VideoDecoderConfig& config) {
   DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoConfigChange(config);
 }
 
 void MojoRenderer::OnStatisticsUpdate(const PipelineStatistics& stats) {
   DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (!client_) {
     pending_stats_ = stats;
     return;
@@ -298,13 +298,13 @@
 
 void MojoRenderer::OnWaiting(WaitingReason reason) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnWaiting(reason);
 }
 
 void MojoRenderer::OnConnectionError() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   encountered_error_ = true;
   CancelPendingCallbacks();
@@ -316,7 +316,7 @@
 void MojoRenderer::OnDemuxerStreamConnectionError(
     MojoDemuxerStreamImpl* stream) {
   DVLOG(1) << __func__ << ": stream=" << stream;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   for (auto& s : streams_) {
     if (s.get() == stream) {
@@ -329,7 +329,7 @@
 
 void MojoRenderer::BindRemoteRendererIfNeeded() {
   DVLOG(2) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // If |remote_renderer_| has already been bound, do nothing.
   // Note that after Bind() is called, |remote_renderer_| is always bound even
@@ -350,7 +350,7 @@
 
 void MojoRenderer::OnInitialized(media::RendererClient* client, bool success) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(init_cb_);
 
   // Only set |client_| after initialization succeeded. No client methods should
@@ -373,7 +373,7 @@
 
 void MojoRenderer::OnFlushed() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(flush_cb_);
 
   std::move(flush_cb_).Run();
@@ -381,7 +381,7 @@
 
 void MojoRenderer::OnCdmAttached(bool success) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(cdm_attached_cb_);
 
   std::move(cdm_attached_cb_).Run(success);
@@ -389,7 +389,7 @@
 
 void MojoRenderer::CancelPendingCallbacks() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (init_cb_)
     std::move(init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
diff --git a/media/mojo/clients/mojo_renderer.h b/media/mojo/clients/mojo_renderer.h
index 3e98c19..75ca4fd 100644
--- a/media/mojo/clients/mojo_renderer.h
+++ b/media/mojo/clients/mojo_renderer.h
@@ -22,10 +22,6 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace media {
 
 class MediaResource;
@@ -45,7 +41,7 @@
 // which can be called on any thread.
 class MojoRenderer : public Renderer, public mojom::RendererClient {
  public:
-  MojoRenderer(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+  MojoRenderer(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
                std::unique_ptr<VideoOverlayFactory> video_overlay_factory,
                VideoRendererSink* video_renderer_sink,
                mojo::PendingRemote<mojom::Renderer> remote_renderer);
@@ -112,7 +108,7 @@
 
   // |task_runner| on which all methods are invoked, except for GetMediaTime(),
   // which can be called on any thread.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   // Overlay factory used to create overlays for video frames rendered
   // by the remote renderer.
diff --git a/media/mojo/clients/mojo_renderer_factory.cc b/media/mojo/clients/mojo_renderer_factory.cc
index 443b787..cafc8ef 100644
--- a/media/mojo/clients/mojo_renderer_factory.cc
+++ b/media/mojo/clients/mojo_renderer_factory.cc
@@ -25,7 +25,7 @@
 MojoRendererFactory::~MojoRendererFactory() = default;
 
 std::unique_ptr<Renderer> MojoRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     AudioRendererSink* audio_renderer_sink,
     VideoRendererSink* video_renderer_sink,
@@ -52,7 +52,7 @@
         renderer_extension_receiver,
     mojo::PendingRemote<mojom::MediaFoundationRendererClientExtension>
         client_extension_remote,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     VideoRendererSink* video_renderer_sink) {
   DCHECK(interface_factory_);
   mojo::PendingRemote<mojom::Renderer> renderer_remote;
@@ -70,7 +70,7 @@
 
 #if BUILDFLAG(ENABLE_CAST_RENDERER)
 std::unique_ptr<MojoRenderer> MojoRendererFactory::CreateCastRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     VideoRendererSink* video_renderer_sink) {
   DCHECK(interface_factory_);
 
@@ -92,7 +92,7 @@
     const std::string& presentation_id,
     mojo::PendingRemote<mojom::FlingingRendererClientExtension>
         client_extension_remote,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     VideoRendererSink* video_renderer_sink) {
   DCHECK(interface_factory_);
   mojo::PendingRemote<mojom::Renderer> renderer_remote;
@@ -111,7 +111,7 @@
         renderer_extension_receiver,
     mojo::PendingRemote<mojom::MediaPlayerRendererClientExtension>
         client_extension_remote,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     VideoRendererSink* video_renderer_sink) {
   DCHECK(interface_factory_);
   mojo::PendingRemote<mojom::Renderer> renderer_remote;
diff --git a/media/mojo/clients/mojo_renderer_factory.h b/media/mojo/clients/mojo_renderer_factory.h
index e36799e..58e7b22a 100644
--- a/media/mojo/clients/mojo_renderer_factory.h
+++ b/media/mojo/clients/mojo_renderer_factory.h
@@ -41,7 +41,7 @@
   ~MojoRendererFactory() final;
 
   std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
@@ -55,13 +55,13 @@
           renderer_extension_receiver,
       mojo::PendingRemote<mojom::MediaFoundationRendererClientExtension>
           client_extension_remote,
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       VideoRendererSink* video_renderer_sink);
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(ENABLE_CAST_RENDERER)
   std::unique_ptr<MojoRenderer> CreateCastRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       VideoRendererSink* video_renderer_sink);
 #endif  // BUILDFLAG(ENABLE_CAST_RENDERER)
 
@@ -70,7 +70,7 @@
       const std::string& presentation_id,
       mojo::PendingRemote<mojom::FlingingRendererClientExtension>
           client_extenion_ptr,
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       VideoRendererSink* video_renderer_sink);
 
   std::unique_ptr<MojoRenderer> CreateMediaPlayerRenderer(
@@ -78,7 +78,7 @@
           renderer_extension_receiver,
       mojo::PendingRemote<mojom::MediaPlayerRendererClientExtension>
           client_extension_remote,
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       VideoRendererSink* video_renderer_sink);
 #endif  // defined (OS_ANDROID)
 
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.cc b/media/mojo/clients/win/media_foundation_renderer_client.cc
index b3d6f43..6342a70 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client.cc
+++ b/media/mojo/clients/win/media_foundation_renderer_client.cc
@@ -20,7 +20,7 @@
 namespace media {
 
 MediaFoundationRendererClient::MediaFoundationRendererClient(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     std::unique_ptr<MediaLog> media_log,
     std::unique_ptr<MojoRenderer> mojo_renderer,
     mojo::PendingRemote<RendererExtension> pending_renderer_extension,
@@ -55,7 +55,7 @@
                                                RendererClient* client,
                                                PipelineStatusCallback init_cb) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!init_cb_);
 
   // Consume and bind the delayed PendingRemote and PendingReceiver now that
@@ -145,7 +145,7 @@
     const base::UnguessableToken& frame_token,
     const gfx::Size& size,
     base::TimeDelta timestamp) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   auto video_frame = video_frame_pool_.find(frame_token);
@@ -187,7 +187,7 @@
 
 void MediaFoundationRendererClient::OnPaintComplete(
     const base::UnguessableToken& token) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   renderer_extension_->NotifyFrameReleased(token);
 }
 
@@ -221,7 +221,7 @@
 }
 
 void MediaFoundationRendererClient::StartPlayingFrom(base::TimeDelta time) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   SignalMediaPlayingStateChange(true);
   next_video_frame_.reset();
   mojo_renderer_->StartPlayingFrom(time);
@@ -306,7 +306,7 @@
 void MediaFoundationRendererClient::OnVideoNaturalSizeChange(
     const gfx::Size& size) {
   DVLOG_FUNC(1) << "size=" << size.ToString();
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   natural_size_ = size;
@@ -378,7 +378,7 @@
 void MediaFoundationRendererClient::OnRemoteRendererInitialized(
     PipelineStatus status) {
   DVLOG_FUNC(1) << "status=" << status;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!init_cb_.is_null());
 
   if (status != PIPELINE_OK) {
@@ -413,7 +413,7 @@
 
 void MediaFoundationRendererClient::OnOutputRectChange(gfx::Rect output_rect) {
   DVLOG_FUNC(1) << "output_rect=" << output_rect.ToString();
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   renderer_extension_->SetOutputRect(
@@ -426,7 +426,7 @@
     const gfx::Size& output_size,
     bool success) {
   DVLOG_FUNC(1) << "output_size=" << output_size.ToString();
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   if (!success) {
@@ -483,7 +483,7 @@
     const std::string& error) {
   DVLOG_FUNC(1);
   DCHECK(has_video_);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // The error should've already been handled in MediaFoundationRenderer.
   if (!token) {
@@ -499,7 +499,7 @@
 
 void MediaFoundationRendererClient::OnDCOMPSurfaceHandleSet(bool success) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   if (!success) {
@@ -514,7 +514,7 @@
     scoped_refptr<VideoFrame> video_frame,
     const gpu::Mailbox& mailbox) {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(has_video_);
 
   video_frame->metadata().allow_overlay = true;
@@ -542,7 +542,7 @@
 
 void MediaFoundationRendererClient::OnConnectionError() {
   DVLOG_FUNC(1);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   MEDIA_LOG(ERROR, media_log_) << "MediaFoundationRendererClient disconnected";
   MediaFoundationRenderer::ReportErrorReason(
       MediaFoundationRenderer::ErrorReason::kOnConnectionError);
@@ -570,7 +570,7 @@
 void MediaFoundationRendererClient::OnOverlayStateChanged(
     const gpu::Mailbox& mailbox,
     bool promoted) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   promoted_to_overlay_signal_ = promoted;
   MEDIA_LOG(INFO, media_log_)
       << "Overlay state signal, promoted = " << promoted;
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.h b/media/mojo/clients/win/media_foundation_renderer_client.h
index b2d0aea5..7d47baf 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client.h
+++ b/media/mojo/clients/win/media_foundation_renderer_client.h
@@ -58,7 +58,7 @@
   using ClientExtension = media::mojom::MediaFoundationRendererClientExtension;
 
   MediaFoundationRendererClient(
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       std::unique_ptr<MediaLog> media_log,
       std::unique_ptr<MojoRenderer> mojo_renderer,
       mojo::PendingRemote<RendererExtension> pending_renderer_extension,
@@ -143,7 +143,7 @@
   // This class is constructed on the main thread. Hence we store
   // PendingRemotes so we can bind the Remotes on the media task
   // runner during/after Initialize().
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   std::unique_ptr<MediaLog> media_log_;
   std::unique_ptr<MojoRenderer> mojo_renderer_;
   mojo::PendingRemote<RendererExtension> pending_renderer_extension_;
diff --git a/media/mojo/clients/win/media_foundation_renderer_client_factory.cc b/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
index 6d0862e..af7e619a 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
+++ b/media/mojo/clients/win/media_foundation_renderer_client_factory.cc
@@ -41,7 +41,7 @@
 
 std::unique_ptr<media::Renderer>
 MediaFoundationRendererClientFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& /*worker_task_runner*/,
     media::AudioRendererSink* /*audio_renderer_sink*/,
     media::VideoRendererSink* video_renderer_sink,
diff --git a/media/mojo/clients/win/media_foundation_renderer_client_factory.h b/media/mojo/clients/win/media_foundation_renderer_client_factory.h
index d57f64a..d1ba1e6 100644
--- a/media/mojo/clients/win/media_foundation_renderer_client_factory.h
+++ b/media/mojo/clients/win/media_foundation_renderer_client_factory.h
@@ -7,6 +7,7 @@
 
 #include "base/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "media/base/renderer_factory.h"
 #include "media/base/win/dcomp_texture_wrapper.h"
@@ -36,7 +37,7 @@
   ~MediaFoundationRendererClientFactory() override;
 
   std::unique_ptr<media::Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       media::AudioRendererSink* audio_renderer_sink,
       media::VideoRendererSink* video_renderer_sink,
diff --git a/media/remoting/courier_renderer.cc b/media/remoting/courier_renderer.cc
index 16f662ef..8cc6d60 100644
--- a/media/remoting/courier_renderer.cc
+++ b/media/remoting/courier_renderer.cc
@@ -79,7 +79,7 @@
 }  // namespace
 
 CourierRenderer::CourierRenderer(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     const base::WeakPtr<RendererController>& controller,
     VideoRendererSink* video_renderer_sink)
     : state_(STATE_UNINITIALIZED),
@@ -102,7 +102,7 @@
 }
 
 CourierRenderer::~CourierRenderer() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   DeregisterFromRpcMessaging();
   if (video_renderer_sink_) {
@@ -114,7 +114,7 @@
 void CourierRenderer::Initialize(MediaResource* media_resource,
                                  RendererClient* client,
                                  PipelineStatusCallback init_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(media_resource);
   DCHECK(client);
 
@@ -155,7 +155,7 @@
     absl::optional<base::TimeDelta> latency_hint) {}
 
 void CourierRenderer::Flush(base::OnceClosure flush_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!flush_cb_);
 
   if (state_ != STATE_PLAYING) {
@@ -200,7 +200,7 @@
 }
 
 void CourierRenderer::StartPlayingFrom(base::TimeDelta time) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ != STATE_PLAYING) {
     DCHECK_EQ(state_, STATE_ERROR);
@@ -222,7 +222,7 @@
 }
 
 void CourierRenderer::SetPlaybackRate(double playback_rate) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ != STATE_FLUSHING && state_ != STATE_PLAYING) {
     DCHECK_EQ(state_, STATE_ERROR);
@@ -240,7 +240,7 @@
 }
 
 void CourierRenderer::SetVolume(float volume) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   volume_ = volume;
   if (state_ != STATE_FLUSHING && state_ != STATE_PLAYING)
@@ -267,7 +267,7 @@
 
 // static
 void CourierRenderer::OnDataPipeCreatedOnMainThread(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     base::WeakPtr<CourierRenderer> self,
     openscreen::WeakPtr<RpcMessenger> rpc_messenger,
     mojo::PendingRemote<mojom::RemotingDataStreamSender> audio,
@@ -292,7 +292,7 @@
     mojo::ScopedDataPipeProducerHandle video_handle,
     int audio_rpc_handle,
     int video_rpc_handle) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ == STATE_ERROR)
     return;  // Abort because something went wrong in the meantime.
@@ -360,7 +360,7 @@
 
 // static
 void CourierRenderer::OnMessageReceivedOnMainThread(
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     base::WeakPtr<CourierRenderer> self,
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
   if (media_task_runner) {
@@ -374,7 +374,7 @@
 
 void CourierRenderer::OnReceivedRpc(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   switch (message->proc()) {
     case openscreen::cast::RpcMessage::RPC_ACQUIRE_RENDERER_DONE:
@@ -421,7 +421,7 @@
 
 void CourierRenderer::SendRpcToRemote(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(main_task_runner_);
   main_task_runner_->PostTask(FROM_HERE,
                               base::BindOnce(&RpcMessenger::SendMessageToRemote,
@@ -430,7 +430,7 @@
 
 void CourierRenderer::AcquireRendererDone(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
 
   remote_renderer_handle_ = message->integer_value();
@@ -462,7 +462,7 @@
 
 void CourierRenderer::InitializeCallback(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
 
   const bool success = message->boolean_value();
@@ -485,7 +485,7 @@
 }
 
 void CourierRenderer::FlushUntilCallback() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ != STATE_FLUSHING || !flush_cb_) {
     OnFatalError(PEERS_OUT_OF_SYNC);
@@ -503,7 +503,7 @@
 
 void CourierRenderer::OnTimeUpdate(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   // Shutdown remoting session if receiving malformed RPC message.
   if (!message->has_rendererclient_ontimeupdate_rpc()) {
@@ -532,7 +532,7 @@
 
 void CourierRenderer::OnBufferingStateChange(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   if (!message->has_rendererclient_onbufferingstatechange_rpc()) {
     OnFatalError(RPC_INVALID);
@@ -559,7 +559,7 @@
 
 void CourierRenderer::OnAudioConfigChange(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   // Shutdown remoting session if receiving malformed RPC message.
   if (!message->has_rendererclient_onaudioconfigchange_rpc()) {
@@ -581,7 +581,7 @@
 
 void CourierRenderer::OnVideoConfigChange(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   // Shutdown remoting session if receiving malformed RPC message.
   if (!message->has_rendererclient_onvideoconfigchange_rpc()) {
@@ -603,7 +603,7 @@
 
 void CourierRenderer::OnVideoNaturalSizeChange(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   // Shutdown remoting session if receiving malformed RPC message.
   if (!message->has_rendererclient_onvideonatualsizechange_rpc()) {
@@ -620,7 +620,7 @@
 
 void CourierRenderer::OnVideoOpacityChange(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   const bool opaque = message->boolean_value();
   client_->OnVideoOpacityChange(opaque);
@@ -628,7 +628,7 @@
 
 void CourierRenderer::OnStatisticsUpdate(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   // Shutdown remoting session if receiving malformed RPC message.
   if (!message->has_rendererclient_onstatisticsupdate_rpc()) {
@@ -648,7 +648,7 @@
 }
 
 void CourierRenderer::OnFatalError(StopTrigger stop_trigger) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK_NE(UNKNOWN_STOP_TRIGGER, stop_trigger);
 
   // If this is the first error, notify the controller. It is expected the
@@ -674,7 +674,7 @@
 }
 
 void CourierRenderer::OnMediaTimeUpdated() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (flush_cb_)
     return;  // Don't manage and check the queue when Flush() is on-going.
   if (receiver_is_blocked_on_local_demuxers_)
@@ -713,7 +713,7 @@
 
 void CourierRenderer::UpdateVideoStatsQueue(int video_frames_decoded,
                                             int video_frames_dropped) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (flush_cb_)
     return;  // Don't manage and check the queue when Flush() is on-going.
 
@@ -754,7 +754,7 @@
 }
 
 void CourierRenderer::ResetMeasurements() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   media_time_queue_.clear();
   video_stats_queue_.clear();
   sum_video_frames_dropped_ = 0;
@@ -770,7 +770,7 @@
 }
 
 void CourierRenderer::MeasureAndRecordDataRates() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Whenever media is first started or flushed/seeked, there is a "burst
   // bufferring" period as the remote device rapidly fills its buffer before
@@ -810,7 +810,7 @@
 }
 
 bool CourierRenderer::IsWaitingForDataFromDemuxers() const {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   return ((video_demuxer_stream_adapter_ &&
            video_demuxer_stream_adapter_->is_processing_read_request() &&
            !video_demuxer_stream_adapter_->is_data_pending()) ||
@@ -820,7 +820,7 @@
 }
 
 void CourierRenderer::RegisterForRpcMessaging() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   auto receive_callback = BindToCurrentLoop(base::BindRepeating(
       &CourierRenderer::OnReceivedRpc, weak_factory_.GetWeakPtr()));
 
@@ -836,7 +836,7 @@
 }
 
 void CourierRenderer::DeregisterFromRpcMessaging() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (rpc_messenger_) {
     main_task_runner_->PostTask(
         FROM_HERE,
diff --git a/media/remoting/courier_renderer.h b/media/remoting/courier_renderer.h
index 82ead88..b2cd3b9 100644
--- a/media/remoting/courier_renderer.h
+++ b/media/remoting/courier_renderer.h
@@ -47,7 +47,7 @@
   // The whole class except for constructor and GetMediaTime() runs on
   // |media_task_runner|. The constructor and GetMediaTime() run on render main
   // thread.
-  CourierRenderer(scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+  CourierRenderer(scoped_refptr<base::SequencedTaskRunner> media_task_runner,
                   const base::WeakPtr<RendererController>& controller,
                   VideoRendererSink* video_renderer_sink);
 
@@ -61,7 +61,7 @@
   // static in order to post task to media thread in order to avoid threading
   // race condition.
   static void OnDataPipeCreatedOnMainThread(
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       base::WeakPtr<CourierRenderer> self,
       openscreen::WeakPtr<openscreen::cast::RpcMessenger> rpc_messenger,
       mojo::PendingRemote<mojom::RemotingDataStreamSender> audio,
@@ -73,7 +73,7 @@
   // static in order to post task to media thread in order to avoid threading
   // race condition.
   static void OnMessageReceivedOnMainThread(
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       base::WeakPtr<CourierRenderer> self,
       std::unique_ptr<openscreen::cast::RpcMessage> message);
 
@@ -170,7 +170,7 @@
 
   State state_;
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   // Current renderer playback time information.
   base::TimeDelta current_media_time_;
diff --git a/media/remoting/courier_renderer_factory.cc b/media/remoting/courier_renderer_factory.cc
index 86d5941..7d497701 100644
--- a/media/remoting/courier_renderer_factory.cc
+++ b/media/remoting/courier_renderer_factory.cc
@@ -26,7 +26,7 @@
 CourierRendererFactory::~CourierRendererFactory() = default;
 
 std::unique_ptr<Renderer> CourierRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     AudioRendererSink* audio_renderer_sink,
     VideoRendererSink* video_renderer_sink,
diff --git a/media/remoting/courier_renderer_factory.h b/media/remoting/courier_renderer_factory.h
index 0b88436..8d6c391 100644
--- a/media/remoting/courier_renderer_factory.h
+++ b/media/remoting/courier_renderer_factory.h
@@ -23,7 +23,7 @@
   ~CourierRendererFactory() override;
 
   std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
diff --git a/media/remoting/demuxer_stream_adapter.cc b/media/remoting/demuxer_stream_adapter.cc
index 385b40c..8059fbd 100644
--- a/media/remoting/demuxer_stream_adapter.cc
+++ b/media/remoting/demuxer_stream_adapter.cc
@@ -9,6 +9,7 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "components/cast_streaming/public/remoting_proto_enum_utils.h"
 #include "components/cast_streaming/public/remoting_proto_utils.h"
@@ -47,7 +48,7 @@
 
 DemuxerStreamAdapter::DemuxerStreamAdapter(
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     const std::string& name,
     DemuxerStream* demuxer_stream,
     const openscreen::WeakPtr<RpcMessenger>& rpc_messenger,
@@ -74,7 +75,7 @@
       bytes_written_to_pipe_(0) {
   DCHECK(main_task_runner_);
   DCHECK(media_task_runner_);
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(demuxer_stream);
   DCHECK(!error_callback_.is_null());
 
@@ -87,19 +88,19 @@
 }
 
 DemuxerStreamAdapter::~DemuxerStreamAdapter() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DeregisterFromRpcMessaging();
 }
 
 int64_t DemuxerStreamAdapter::GetBytesWrittenAndReset() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   const int64_t current_count = bytes_written_to_pipe_;
   bytes_written_to_pipe_ = 0;
   return current_count;
 }
 
 absl::optional<uint32_t> DemuxerStreamAdapter::SignalFlush(bool flushing) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DEMUXER_VLOG(2) << "flushing=" << flushing;
 
   // Ignores if |pending_flush_| states is same.
@@ -124,7 +125,7 @@
 
 void DemuxerStreamAdapter::OnReceivedRpc(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   DCHECK(rpc_handle_ == message->handle());
 
@@ -147,7 +148,7 @@
 }
 
 void DemuxerStreamAdapter::Initialize(int remote_callback_handle) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!pending_flush_);
   DEMUXER_VLOG(2) << "Received RPC_DS_INITIALIZE with remote_callback_handle="
                   << remote_callback_handle;
@@ -208,7 +209,7 @@
 
 void DemuxerStreamAdapter::ReadUntil(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
   if (!message->has_demuxerstream_readuntil_rpc()) {
     DEMUXER_VLOG(1) << "Missing required DemuxerStreamReadUntil struct in RPC";
@@ -244,7 +245,7 @@
 }
 
 void DemuxerStreamAdapter::EnableBitstreamConverter() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DEMUXER_VLOG(2) << "Received RPC_DS_ENABLEBITSTREAMCONVERTER";
   bool is_command_sent = true;
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
@@ -268,7 +269,7 @@
 }
 
 void DemuxerStreamAdapter::RequestBuffer() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (!is_processing_read_request() || pending_flush_) {
     DEMUXER_VLOG(2) << "Skip actions since it's not in the reading state";
     return;
@@ -281,7 +282,7 @@
 void DemuxerStreamAdapter::OnNewBuffer(DemuxerStream::Status status,
                                        scoped_refptr<DecoderBuffer> input) {
   DEMUXER_VLOG(3) << "status=" << status;
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (!is_processing_read_request() || pending_flush_) {
     DEMUXER_VLOG(2) << "Skip actions since it's not in the reading state";
     return;
@@ -324,7 +325,7 @@
 }
 
 void DemuxerStreamAdapter::WriteFrame() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!pending_flush_);
   DCHECK(is_processing_read_request());
   DCHECK(!pending_frame_.empty());
@@ -366,7 +367,7 @@
 }
 
 void DemuxerStreamAdapter::SendReadAck() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DEMUXER_VLOG(3) << "last_count_=" << last_count_
                   << ", remote_read_callback_handle="
                   << read_until_callback_handle_
@@ -420,13 +421,13 @@
 }
 
 void DemuxerStreamAdapter::ResetPendingFrame() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   pending_frame_.clear();
   pending_frame_is_eos_ = false;
 }
 
 void DemuxerStreamAdapter::OnFatalError(StopTrigger stop_trigger) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   DEMUXER_VLOG(1) << __func__ << " with StopTrigger " << stop_trigger;
 
@@ -439,7 +440,7 @@
 }
 
 void DemuxerStreamAdapter::RegisterForRpcMessaging() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   auto receive_callback = BindToCurrentLoop(base::BindRepeating(
       &DemuxerStreamAdapter::OnReceivedRpc, weak_factory_.GetWeakPtr()));
   main_task_runner_->PostTask(
@@ -453,7 +454,7 @@
 }
 
 void DemuxerStreamAdapter::DeregisterFromRpcMessaging() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (rpc_messenger_) {
     main_task_runner_->PostTask(
         FROM_HERE,
diff --git a/media/remoting/demuxer_stream_adapter.h b/media/remoting/demuxer_stream_adapter.h
index 5f24a48..8f14e51 100644
--- a/media/remoting/demuxer_stream_adapter.h
+++ b/media/remoting/demuxer_stream_adapter.h
@@ -13,6 +13,7 @@
 #include "base/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/audio_decoder_config.h"
 #include "media/base/demuxer_stream.h"
 #include "media/base/video_decoder_config.h"
@@ -63,7 +64,7 @@
   //                   be shut down.
   DemuxerStreamAdapter(
       scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       const std::string& name,
       DemuxerStream* demuxer_stream,
       const openscreen::WeakPtr<openscreen::cast::RpcMessenger>& rpc_messenger,
@@ -139,7 +140,7 @@
   void DeregisterFromRpcMessaging();
 
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   // Name of demuxer stream. Debug only.
   const std::string name_;
diff --git a/media/remoting/receiver.cc b/media/remoting/receiver.cc
index 1fd9e8a..4d6ef12 100644
--- a/media/remoting/receiver.cc
+++ b/media/remoting/receiver.cc
@@ -36,7 +36,7 @@
     int rpc_handle,
     int remote_handle,
     ReceiverController* receiver_controller,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     std::unique_ptr<Renderer> renderer,
     base::OnceCallback<void(int)> acquire_renderer_done_cb)
     : rpc_handle_(rpc_handle),
@@ -120,7 +120,7 @@
 
 void Receiver::OnReceivedRpc(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message);
 
   cast_streaming::remoting::DispatchRendererRpcCall(message.get(), this);
@@ -156,7 +156,7 @@
   if (!rpc_initialize_received_ || !init_cb_)
     return;
 
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(renderer_);
   DCHECK(demuxer_);
   renderer_->Initialize(demuxer_, this,
@@ -165,7 +165,7 @@
 }
 
 void Receiver::OnRendererInitialized(PipelineStatus status) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(init_cb_);
   std::move(init_cb_).Run(status);
 
@@ -176,7 +176,7 @@
 }
 
 void Receiver::OnRpcSetPlaybackRate(double playback_rate) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
 
   renderer_->SetPlaybackRate(playback_rate);
 
@@ -193,7 +193,7 @@
 }
 
 void Receiver::OnRpcFlush(uint32_t audio_count, uint32_t video_count) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
 
   receiver_controller_->OnRendererFlush(audio_count, video_count);
 
@@ -209,7 +209,7 @@
 }
 
 void Receiver::OnRpcStartPlayingFrom(base::TimeDelta time) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
 
   renderer_->StartPlayingFrom(time);
   ScheduleMediaTimeUpdates();
@@ -225,7 +225,7 @@
 }
 
 void Receiver::OnRpcSetVolume(double volume) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   renderer_->SetVolume(volume);
 }
 
diff --git a/media/remoting/receiver.h b/media/remoting/receiver.h
index bbc9751a..c2a1da5 100644
--- a/media/remoting/receiver.h
+++ b/media/remoting/receiver.h
@@ -54,7 +54,7 @@
   Receiver(int rpc_handle,
            int remote_handle,
            ReceiverController* receiver_controller,
-           const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+           const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
            std::unique_ptr<Renderer> renderer,
            base::OnceCallback<void(int)> acquire_renderer_done_cb);
   ~Receiver() override;
@@ -140,7 +140,7 @@
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
 
   // Media tasks should run on media thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   // |renderer_| is the real renderer to render media.
   std::unique_ptr<Renderer> renderer_;
diff --git a/media/remoting/remoting_renderer_factory.cc b/media/remoting/remoting_renderer_factory.cc
index 90eaf3a..c3d5489 100644
--- a/media/remoting/remoting_renderer_factory.cc
+++ b/media/remoting/remoting_renderer_factory.cc
@@ -19,7 +19,7 @@
 RemotingRendererFactory::RemotingRendererFactory(
     mojo::PendingRemote<mojom::Remotee> remotee,
     std::unique_ptr<RendererFactory> renderer_factory,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner)
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner)
     : receiver_controller_(ReceiverController::GetInstance()),
       rpc_messenger_(receiver_controller_->rpc_messenger()),
       renderer_handle_(rpc_messenger_->GetUniqueHandle()),
@@ -49,7 +49,7 @@
 }
 
 std::unique_ptr<Renderer> RemotingRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     AudioRendererSink* audio_renderer_sink,
     VideoRendererSink* video_renderer_sink,
diff --git a/media/remoting/remoting_renderer_factory.h b/media/remoting/remoting_renderer_factory.h
index 9ddd45bd..142e470b0 100644
--- a/media/remoting/remoting_renderer_factory.h
+++ b/media/remoting/remoting_renderer_factory.h
@@ -6,6 +6,7 @@
 #define MEDIA_REMOTING_REMOTING_RENDERER_FACTORY_H_
 
 #include "base/memory/raw_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "media/base/renderer_factory.h"
 #include "media/mojo/mojom/remoting.mojom.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -22,12 +23,12 @@
   RemotingRendererFactory(
       mojo::PendingRemote<mojom::Remotee> remotee,
       std::unique_ptr<RendererFactory> renderer_factory,
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner);
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner);
   ~RemotingRendererFactory() override;
 
   // RendererFactory implementation
   std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
@@ -62,8 +63,7 @@
   std::unique_ptr<RendererFactory> real_renderer_factory_;
 
   // Used to instantiate |receiver_|.
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
-
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   base::WeakPtrFactory<RemotingRendererFactory> weak_factory_{this};
 };
 
diff --git a/media/remoting/stream_provider.cc b/media/remoting/stream_provider.cc
index f5b15218..7adb672 100644
--- a/media/remoting/stream_provider.cc
+++ b/media/remoting/stream_provider.cc
@@ -37,7 +37,7 @@
     RpcMessenger* rpc_messenger,
     Type type,
     int32_t handle,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     base::OnceCallback<void(MediaStream::UniquePtr)> callback) {
   MediaStream::UniquePtr stream(
       new MediaStream(rpc_messenger, type, handle, media_task_runner),
@@ -54,7 +54,7 @@
     RpcMessenger* rpc_messenger,
     Type type,
     int remote_handle,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner)
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner)
     : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
       media_task_runner_(media_task_runner),
       rpc_messenger_(rpc_messenger),
@@ -81,7 +81,7 @@
 }
 
 void StreamProvider::MediaStream::Destroy() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Invalid weak pointers to prevent |this| from receiving RPC calls on the
   // media thread.
@@ -107,7 +107,7 @@
 
 void StreamProvider::MediaStream::Initialize(
     base::OnceClosure init_done_callback) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(init_done_callback);
 
   if (init_done_callback_) {
@@ -126,7 +126,7 @@
 
 void StreamProvider::MediaStream::InitializeDataPipe(
     mojo::ScopedDataPipeConsumerHandle data_pipe) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   decoder_buffer_reader_ =
       std::make_unique<MojoDecoderBufferReader>(std::move(data_pipe));
@@ -135,7 +135,7 @@
 
 void StreamProvider::MediaStream::ReceiveFrame(uint32_t count,
                                                mojom::DecoderBufferPtr buffer) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(decoder_buffer_reader_);
 
   auto callback = BindToCurrentLoop(
@@ -145,7 +145,7 @@
 }
 
 void StreamProvider::MediaStream::FlushUntil(uint32_t count) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (count < current_frame_count_)
     return;
@@ -168,7 +168,7 @@
 
 void StreamProvider::MediaStream::OnReceivedRpc(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message->handle() == rpc_handle_);
 
   switch (message->proc()) {
@@ -185,7 +185,7 @@
 
 void StreamProvider::MediaStream::OnInitializeCallback(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   const openscreen::cast::DemuxerStreamInitializeCallback callback_message =
       message->demuxerstream_initializecb_rpc();
   if (callback_message.type() != type_) {
@@ -231,7 +231,7 @@
 }
 
 void StreamProvider::MediaStream::CompleteInitialize() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Initialization finished when received RPC_DS_INITIALIZE_CALLBACK and
   // |decoder_buffer_reader_| is created.
@@ -248,7 +248,7 @@
 
 void StreamProvider::MediaStream::OnReadUntilCallback(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (!read_until_sent_) {
     OnError("Unexpected ReadUntilCallback");
@@ -325,7 +325,7 @@
 }
 
 void StreamProvider::MediaStream::Read(ReadCB read_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(read_complete_callback_.is_null());
   DCHECK(read_cb);
 
@@ -346,7 +346,7 @@
 }
 
 void StreamProvider::MediaStream::CompleteRead(DemuxerStream::Status status) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   switch (status) {
     case DemuxerStream::kConfigChanged:
@@ -401,7 +401,7 @@
 void StreamProvider::MediaStream::AppendBuffer(
     uint32_t count,
     scoped_refptr<DecoderBuffer> buffer) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Drop flushed frame.
   if (count < current_frame_count_)
@@ -426,7 +426,7 @@
 
 StreamProvider::StreamProvider(
     ReceiverController* receiver_controller,
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner)
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner)
     : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
       media_task_runner_(media_task_runner),
       receiver_controller_(receiver_controller),
@@ -459,7 +459,7 @@
 
 void StreamProvider::Initialize(DemuxerHost* host,
                                 PipelineStatusCallback status_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   init_done_callback_ = std::move(status_cb);
   CompleteInitialize();
 }
@@ -514,7 +514,7 @@
 }
 
 void StreamProvider::Destroy() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (init_done_callback_)
     std::move(init_done_callback_).Run(PIPELINE_ERROR_ABORT);
@@ -544,7 +544,7 @@
 
 void StreamProvider::OnAcquireDemuxer(
     std::unique_ptr<openscreen::cast::RpcMessage> message) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(message->has_acquire_demuxer_rpc());
 
   int32_t audio_demuxer_handle =
@@ -578,7 +578,7 @@
 }
 
 void StreamProvider::OnAudioStreamCreated(MediaStream::UniquePtr stream) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   audio_stream_ = std::move(stream);
   audio_stream_->Initialize(base::BindOnce(
       &StreamProvider::OnAudioStreamInitialized, media_weak_this_));
@@ -586,7 +586,7 @@
 }
 
 void StreamProvider::OnVideoStreamCreated(MediaStream::UniquePtr stream) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   video_stream_ = std::move(stream);
   video_stream_->Initialize(base::BindOnce(
       &StreamProvider::OnVideoStreamInitialized, media_weak_this_));
@@ -594,7 +594,7 @@
 }
 
 void StreamProvider::InitializeDataPipe() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if ((has_audio_ && !audio_stream_) || (has_video_ && !video_stream_))
     return;
@@ -617,7 +617,7 @@
 }
 
 void StreamProvider::CompleteInitialize() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   // Haven't receive RpcAcquireRenderer message
   if (!has_audio_ && !has_video_)
diff --git a/media/remoting/stream_provider.h b/media/remoting/stream_provider.h
index 910e6ae..88c49664 100644
--- a/media/remoting/stream_provider.h
+++ b/media/remoting/stream_provider.h
@@ -10,6 +10,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/sequenced_task_runner_helpers.h"
 #include "base/task/single_thread_task_runner.h"
 #include "media/base/audio_decoder_config.h"
@@ -44,7 +45,7 @@
  public:
   StreamProvider(
       ReceiverController* receiver_controller,
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner);
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner);
 
   // Demuxer implementation.
   std::vector<DemuxerStream*> GetAllStreams() override;
@@ -87,7 +88,7 @@
         openscreen::cast::RpcMessenger* rpc_messenger,
         Type type,
         int32_t handle,
-        const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+        const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
         base::OnceCallback<void(MediaStream::UniquePtr)> callback);
 
     // In order to destroy members in the right thread, MediaStream has to use
@@ -98,7 +99,7 @@
         openscreen::cast::RpcMessenger* rpc_messenger,
         Type type,
         int32_t remote_handle,
-        const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner);
+        const scoped_refptr<base::SequencedTaskRunner>& media_task_runner);
 
     // DemuxerStream implementation.
     void Read(ReadCB read_cb) override;
@@ -170,7 +171,7 @@
     void OnError(const std::string& error);
 
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
     const raw_ptr<openscreen::cast::RpcMessenger> rpc_messenger_;
     const Type type_;
@@ -247,7 +248,7 @@
   void CompleteInitialize();
 
   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   const raw_ptr<ReceiverController> receiver_controller_;
   const raw_ptr<openscreen::cast::RpcMessenger> rpc_messenger_;
   MediaStream::UniquePtr audio_stream_;
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
index 65bab13c..9d8dcdb4 100644
--- a/media/renderers/audio_renderer_impl.cc
+++ b/media/renderers/audio_renderer_impl.cc
@@ -18,7 +18,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/ranges/algorithm.h"
-#include "base/task/single_thread_task_runner.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -43,7 +42,7 @@
 namespace media {
 
 AudioRendererImpl::AudioRendererImpl(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     AudioRendererSink* sink,
     const CreateAudioDecodersCB& create_audio_decoders_cb,
     MediaLog* media_log,
@@ -79,11 +78,10 @@
       speech_recognition_client_(speech_recognition_client) {
 #endif
   DCHECK(create_audio_decoders_cb_);
-
   // PowerObserver's must be added and removed from the same thread, but we
   // won't remove the observer until we're destructed on |task_runner_| so we
   // must post it here if we're on the wrong thread.
-  if (task_runner_->BelongsToCurrentThread()) {
+  if (task_runner_->RunsTasksInCurrentSequence()) {
     base::PowerMonitor::AddPowerSuspendObserver(this);
   } else {
     // Safe to post this without a WeakPtr because this class must be destructed
@@ -100,7 +98,7 @@
 
 AudioRendererImpl::~AudioRendererImpl() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   base::PowerMonitor::RemovePowerSuspendObserver(this);
 
   // If Render() is in progress, this call will wait for Render() to finish.
@@ -115,7 +113,7 @@
 
 void AudioRendererImpl::StartTicking() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
 
@@ -133,7 +131,7 @@
 
 void AudioRendererImpl::StartRendering_Locked() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, kPlaying);
   DCHECK(!sink_playing_);
   DCHECK_NE(playback_rate_, 0.0);
@@ -150,7 +148,7 @@
 
 void AudioRendererImpl::StopTicking() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
 
@@ -167,7 +165,7 @@
 }
 
 void AudioRendererImpl::StopRendering_Locked() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, kPlaying);
   DCHECK(sink_playing_);
   lock_.AssertAcquired();
@@ -185,7 +183,7 @@
 
 void AudioRendererImpl::SetMediaTime(base::TimeDelta time) {
   DVLOG(1) << __func__ << "(" << time << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
   DCHECK(!rendering_);
@@ -280,7 +278,7 @@
 
 void AudioRendererImpl::Flush(base::OnceClosure callback) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "AudioRendererImpl::Flush",
                                     TRACE_ID_LOCAL(this));
 
@@ -307,7 +305,7 @@
 }
 
 void AudioRendererImpl::DoFlush_Locked() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   DCHECK(!pending_read_);
@@ -319,7 +317,7 @@
 }
 
 void AudioRendererImpl::ResetDecoderDone() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   {
     base::AutoLock auto_lock(lock_);
 
@@ -342,7 +340,7 @@
 
 void AudioRendererImpl::StartPlaying() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
   DCHECK(!sink_playing_);
@@ -359,7 +357,7 @@
                                    RendererClient* client,
                                    PipelineStatusCallback init_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(client);
   DCHECK(stream);
   DCHECK_EQ(stream->type(), DemuxerStream::AUDIO);
@@ -405,7 +403,7 @@
     CdmContext* cdm_context,
     OutputDeviceInfo output_device_info) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(client_);
   DCHECK(stream);
   DCHECK_EQ(stream->type(), DemuxerStream::AUDIO);
@@ -640,7 +638,7 @@
 
 void AudioRendererImpl::OnAudioDecoderStreamInitialized(bool success) {
   DVLOG(1) << __func__ << ": " << success;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   base::AutoLock auto_lock(lock_);
 
   if (!success) {
@@ -729,22 +727,22 @@
 }
 
 void AudioRendererImpl::OnPlaybackError(PipelineStatus error) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnError(error);
 }
 
 void AudioRendererImpl::OnPlaybackEnded() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnEnded();
 }
 
 void AudioRendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnStatisticsUpdate(stats);
 }
 
 void AudioRendererImpl::OnBufferingStateChange(BufferingState buffering_state) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // "Underflow" is only possible when playing. This avoids noise like blaming
   // the decoder for an "underflow" that is really just a seek.
@@ -763,12 +761,12 @@
 }
 
 void AudioRendererImpl::OnWaiting(WaitingReason reason) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnWaiting(reason);
 }
 
 void AudioRendererImpl::SetVolume(float volume) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Only consider audio as unmuted if the volume is set to a non-zero value
   // when the state is kPlaying.
@@ -868,7 +866,7 @@
 void AudioRendererImpl::DecodedAudioReady(
     AudioDecoderStream::ReadResult result) {
   DVLOG(2) << __func__ << "(" << static_cast<int>(result.code()) << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
   DCHECK(state_ != kUninitialized);
@@ -1091,7 +1089,7 @@
 }
 
 void AudioRendererImpl::AttemptRead_Locked() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   if (!CanRead_Locked())
@@ -1127,7 +1125,7 @@
 
 void AudioRendererImpl::SetPlaybackRate(double playback_rate) {
   DVLOG(1) << __func__ << "(" << playback_rate << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_GE(playback_rate, 0);
   DCHECK(sink_);
 
@@ -1355,7 +1353,7 @@
 }
 
 void AudioRendererImpl::HandleAbortedReadOrDecodeError(PipelineStatus status) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   switch (state_) {
@@ -1394,7 +1392,7 @@
 }
 
 void AudioRendererImpl::OnConfigChange(const AudioDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(expecting_config_changes_);
   buffer_converter_->ResetTimestampState();
 
@@ -1453,7 +1451,7 @@
 
 void AudioRendererImpl::EnableSpeechRecognition() {
 #if !BUILDFLAG(IS_ANDROID)
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   transcribe_audio_callback_ = base::BindRepeating(
       &AudioRendererImpl::TranscribeAudio, weak_factory_.GetWeakPtr());
 #endif
@@ -1462,7 +1460,7 @@
 void AudioRendererImpl::TranscribeAudio(
     scoped_refptr<media::AudioBuffer> buffer) {
 #if !BUILDFLAG(IS_ANDROID)
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (speech_recognition_client_)
     speech_recognition_client_->AddAudio(std::move(buffer));
 #endif
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h
index 20ba1a2..8d8cb3e 100644
--- a/media/renderers/audio_renderer_impl.h
+++ b/media/renderers/audio_renderer_impl.h
@@ -27,6 +27,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/power_monitor/power_observer.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "media/base/audio_decoder.h"
@@ -42,7 +43,6 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace base {
-class SingleThreadTaskRunner;
 class TickClock;
 }  // namespace base
 
@@ -75,7 +75,7 @@
   //
   // |decoders| contains the AudioDecoders to use when initializing.
   AudioRendererImpl(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& task_runner,
       AudioRendererSink* sink,
       const CreateAudioDecodersCB& create_audio_decoders_cb,
       MediaLog* media_log,
@@ -240,7 +240,7 @@
   void EnableSpeechRecognition();
   void TranscribeAudio(scoped_refptr<media::AudioBuffer> buffer);
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   std::unique_ptr<AudioBufferConverter> buffer_converter_;
 
diff --git a/media/renderers/decrypting_renderer.cc b/media/renderers/decrypting_renderer.cc
index f79ad19e..2521e57 100644
--- a/media/renderers/decrypting_renderer.cc
+++ b/media/renderers/decrypting_renderer.cc
@@ -19,7 +19,7 @@
 DecryptingRenderer::DecryptingRenderer(
     std::unique_ptr<Renderer> renderer,
     MediaLog* media_log,
-    const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner)
+    const scoped_refptr<base::SequencedTaskRunner> media_task_runner)
     : renderer_(std::move(renderer)),
       media_log_(media_log),
       media_task_runner_(media_task_runner),
@@ -44,7 +44,7 @@
 void DecryptingRenderer::Initialize(MediaResource* media_resource,
                                     RendererClient* client,
                                     PipelineStatusCallback init_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(media_resource);
   DCHECK(client);
 
@@ -75,7 +75,7 @@
 
 void DecryptingRenderer::SetCdm(CdmContext* cdm_context,
                                 CdmAttachedCB cdm_attached_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (cdm_context_) {
     DVLOG(1) << "Switching CDM not supported.";
@@ -155,7 +155,7 @@
 }
 
 void DecryptingRenderer::CreateAndInitializeDecryptingMediaResource() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(init_cb_);
 
   decrypting_media_resource_ = std::make_unique<DecryptingMediaResource>(
@@ -168,7 +168,7 @@
 }
 
 void DecryptingRenderer::InitializeRenderer(bool success) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   if (!success) {
     std::move(init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
@@ -185,7 +185,7 @@
 }
 
 bool DecryptingRenderer::HasEncryptedStream() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   for (auto* stream : media_resource_->GetAllStreams()) {
     if ((stream->type() == DemuxerStream::AUDIO &&
@@ -204,7 +204,7 @@
 }
 
 void DecryptingRenderer::OnWaiting(WaitingReason reason) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   client_->OnWaiting(reason);
 }
 
diff --git a/media/renderers/decrypting_renderer.h b/media/renderers/decrypting_renderer.h
index ac1fee5..e900b1e 100644
--- a/media/renderers/decrypting_renderer.h
+++ b/media/renderers/decrypting_renderer.h
@@ -38,7 +38,7 @@
   DecryptingRenderer(
       std::unique_ptr<Renderer> renderer,
       MediaLog* media_log,
-      const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner);
+      const scoped_refptr<base::SequencedTaskRunner> media_task_runner);
 
   DecryptingRenderer(const DecryptingRenderer&) = delete;
   DecryptingRenderer& operator=(const DecryptingRenderer&) = delete;
@@ -83,8 +83,7 @@
 
   const std::unique_ptr<Renderer> renderer_;
   const raw_ptr<MediaLog> media_log_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
-
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   bool waiting_for_cdm_ = false;
   raw_ptr<CdmContext> cdm_context_ = nullptr;
   raw_ptr<RendererClient> client_;
diff --git a/media/renderers/decrypting_renderer_factory.cc b/media/renderers/decrypting_renderer_factory.cc
index 8b38603..e235efbd4 100644
--- a/media/renderers/decrypting_renderer_factory.cc
+++ b/media/renderers/decrypting_renderer_factory.cc
@@ -17,7 +17,7 @@
 DecryptingRendererFactory::~DecryptingRendererFactory() = default;
 
 std::unique_ptr<Renderer> DecryptingRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     AudioRendererSink* audio_renderer_sink,
     VideoRendererSink* video_renderer_sink,
diff --git a/media/renderers/decrypting_renderer_factory.h b/media/renderers/decrypting_renderer_factory.h
index c7a2eb0..9b44894 100644
--- a/media/renderers/decrypting_renderer_factory.h
+++ b/media/renderers/decrypting_renderer_factory.h
@@ -35,7 +35,7 @@
 
   // RendererFactory implementation.
   std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
diff --git a/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc
index 62ff51b..1d68575 100644
--- a/media/renderers/default_renderer_factory.cc
+++ b/media/renderers/default_renderer_factory.cc
@@ -51,7 +51,7 @@
 
 std::vector<std::unique_ptr<AudioDecoder>>
 DefaultRendererFactory::CreateAudioDecoders(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner) {
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner) {
   // Create our audio decoders and renderer.
   std::vector<std::unique_ptr<AudioDecoder>> audio_decoders;
 
@@ -62,7 +62,7 @@
 
 std::vector<std::unique_ptr<VideoDecoder>>
 DefaultRendererFactory::CreateVideoDecoders(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     RequestOverlayInfoCB request_overlay_info_cb,
     const gfx::ColorSpace& target_color_space,
     GpuVideoAcceleratorFactories* gpu_factories) {
@@ -77,7 +77,7 @@
 }
 
 std::unique_ptr<Renderer> DefaultRendererFactory::CreateRenderer(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     AudioRendererSink* audio_renderer_sink,
     VideoRendererSink* video_renderer_sink,
diff --git a/media/renderers/default_renderer_factory.h b/media/renderers/default_renderer_factory.h
index 552fef31..bf2ba60 100644
--- a/media/renderers/default_renderer_factory.h
+++ b/media/renderers/default_renderer_factory.h
@@ -10,6 +10,7 @@
 
 #include "base/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
 #include "media/base/media_export.h"
 #include "media/base/media_player_logging_id.h"
@@ -61,7 +62,7 @@
   ~DefaultRendererFactory() final;
 
   std::unique_ptr<Renderer> CreateRenderer(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       AudioRendererSink* audio_renderer_sink,
       VideoRendererSink* video_renderer_sink,
@@ -70,9 +71,9 @@
 
  private:
   std::vector<std::unique_ptr<AudioDecoder>> CreateAudioDecoders(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner);
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner);
   std::vector<std::unique_ptr<VideoDecoder>> CreateVideoDecoders(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       RequestOverlayInfoCB request_overlay_info_cb,
       const gfx::ColorSpace& target_color_space,
       GpuVideoAcceleratorFactories* gpu_factories);
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
index 52fa66e..8cff5e8 100644
--- a/media/renderers/renderer_impl.cc
+++ b/media/renderers/renderer_impl.cc
@@ -85,7 +85,7 @@
 };
 
 RendererImpl::RendererImpl(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
     std::unique_ptr<AudioRenderer> audio_renderer,
     std::unique_ptr<VideoRenderer> video_renderer)
     : state_(STATE_UNINITIALIZED),
@@ -114,7 +114,7 @@
 
 RendererImpl::~RendererImpl() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // RendererImpl is being destroyed, so invalidate weak pointers right away to
   // avoid getting callbacks which might try to access fields that has been
@@ -136,7 +136,7 @@
                               RendererClient* client,
                               PipelineStatusCallback init_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
   DCHECK(init_cb);
   DCHECK(client);
@@ -161,7 +161,7 @@
 void RendererImpl::SetCdm(CdmContext* cdm_context,
                           CdmAttachedCB cdm_attached_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(cdm_context);
   TRACE_EVENT0("media", "RendererImpl::SetCdm");
 
@@ -186,7 +186,7 @@
     absl::optional<base::TimeDelta> latency_hint) {
   DVLOG(1) << __func__;
   DCHECK(!latency_hint || (*latency_hint >= base::TimeDelta()));
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (video_renderer_)
     video_renderer_->SetLatencyHint(latency_hint);
@@ -197,7 +197,7 @@
 
 void RendererImpl::SetPreservesPitch(bool preserves_pitch) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_renderer_)
     audio_renderer_->SetPreservesPitch(preserves_pitch);
@@ -206,7 +206,7 @@
 void RendererImpl::SetWasPlayedWithUserActivation(
     bool was_played_with_user_activation) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_renderer_)
     audio_renderer_->SetWasPlayedWithUserActivation(
@@ -215,7 +215,7 @@
 
 void RendererImpl::Flush(base::OnceClosure flush_cb) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!flush_cb_);
   DCHECK(!(pending_audio_track_change_ || pending_video_track_change_));
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "RendererImpl::Flush",
@@ -242,7 +242,7 @@
 
 void RendererImpl::StartPlayingFrom(base::TimeDelta time) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT1("media", "RendererImpl::StartPlayingFrom", "time_us",
                time.InMicroseconds());
 
@@ -266,7 +266,7 @@
 
 void RendererImpl::SetPlaybackRate(double playback_rate) {
   DVLOG(1) << __func__ << "(" << playback_rate << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT1("media", "RendererImpl::SetPlaybackRate", "rate", playback_rate);
 
   // Playback rate changes are only carried out while playing.
@@ -288,7 +288,7 @@
 
 void RendererImpl::SetVolume(float volume) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_renderer_)
     audio_renderer_->SetVolume(volume);
@@ -310,7 +310,7 @@
 
 void RendererImpl::DisableUnderflowForTesting() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
 
   underflow_disabled_for_testing_ = true;
@@ -318,7 +318,7 @@
 
 void RendererImpl::EnableClocklessVideoPlaybackForTesting() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
   DCHECK(underflow_disabled_for_testing_)
       << "Underflow must be disabled for clockless video playback";
@@ -383,7 +383,7 @@
 
 void RendererImpl::InitializeAudioRenderer() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_INITIALIZING);
   DCHECK(init_cb_);
 
@@ -413,7 +413,7 @@
 
 void RendererImpl::OnAudioRendererInitializeDone(PipelineStatus status) {
   DVLOG(1) << __func__ << ": " << status;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // OnError() may be fired at any time by the renderers, even if they thought
   // they initialized successfully (due to delayed output device setup).
@@ -434,7 +434,7 @@
 
 void RendererImpl::InitializeVideoRenderer() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_INITIALIZING);
   DCHECK(init_cb_);
 
@@ -464,7 +464,7 @@
 
 void RendererImpl::OnVideoRendererInitializeDone(PipelineStatus status) {
   DVLOG(1) << __func__ << ": " << status;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // OnError() may be fired at any time by the renderers, even if they thought
   // they initialized successfully (due to delayed output device setup).
@@ -498,7 +498,7 @@
 
 void RendererImpl::FlushInternal() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_FLUSHING);
   DCHECK(flush_cb_);
 
@@ -511,7 +511,7 @@
 // TODO(tmathmeyer) Combine this functionality with track switching flushing.
 void RendererImpl::FlushAudioRenderer() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_FLUSHING);
   DCHECK(flush_cb_);
 
@@ -525,7 +525,7 @@
 
 void RendererImpl::OnAudioRendererFlushDone() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ == STATE_ERROR) {
     DCHECK(!flush_cb_);
@@ -547,7 +547,7 @@
 
 void RendererImpl::FlushVideoRenderer() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_FLUSHING);
   DCHECK(flush_cb_);
 
@@ -561,7 +561,7 @@
 
 void RendererImpl::OnVideoRendererFlushDone() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (state_ == STATE_ERROR) {
     DCHECK(!flush_cb_);
@@ -583,7 +583,7 @@
     base::TimeDelta time,
     base::OnceClosure reinitialize_completed_cb) {
   DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_NE(stream, current_audio_stream_);
 
   current_audio_stream_ = stream;
@@ -614,7 +614,7 @@
     base::TimeDelta time,
     base::OnceClosure reinitialize_completed_cb) {
   DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_NE(stream, current_video_stream_);
 
   current_video_stream_ = stream;
@@ -648,7 +648,7 @@
     base::TimeDelta time,
     base::OnceClosure restart_completed_cb) {
   DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(audio_renderer_);
   DCHECK_EQ(stream, current_audio_stream_);
   DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED ||
@@ -675,7 +675,7 @@
     base::TimeDelta time,
     base::OnceClosure restart_completed_cb) {
   DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(video_renderer_);
   DCHECK_EQ(stream, current_video_stream_);
   DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED ||
@@ -695,7 +695,7 @@
 }
 
 void RendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnStatisticsUpdate(stats);
 }
 
@@ -711,7 +711,7 @@
   DVLOG(1) << __func__ << " " << type_string << " "
            << BufferingStateToString(*buffering_state) << " -> "
            << BufferingStateToString(new_buffering_state, reason);
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT2("media", "RendererImpl::OnBufferingStateChange", "type",
                type_string, "state",
                BufferingStateToString(new_buffering_state, reason));
@@ -793,7 +793,7 @@
 }
 
 bool RendererImpl::WaitingForEnoughData() const {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (state_ != STATE_PLAYING)
     return false;
   if (audio_renderer_ && audio_buffering_state_ != BUFFERING_HAVE_ENOUGH)
@@ -805,7 +805,7 @@
 
 void RendererImpl::PausePlayback() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT0("media", "RendererImpl::PausePlayback");
 
   switch (state_) {
@@ -843,7 +843,7 @@
 
 void RendererImpl::StartPlayback() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(state_, STATE_PLAYING);
   DCHECK(!WaitingForEnoughData());
   TRACE_EVENT0("media", "RendererImpl::StartPlayback");
@@ -862,7 +862,7 @@
 void RendererImpl::OnRendererEnded(DemuxerStream::Type type) {
   const auto* type_string = DemuxerStream::GetTypeName(type);
   DVLOG(1) << __func__ << ": " << type_string;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK((type == DemuxerStream::AUDIO) || (type == DemuxerStream::VIDEO));
   TRACE_EVENT1("media", "RendererImpl::OnRendererEnded", "type", type_string);
 
@@ -883,7 +883,7 @@
 }
 
 bool RendererImpl::PlaybackHasEnded() const {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (audio_renderer_ && !audio_ended_)
     return false;
@@ -896,7 +896,7 @@
 
 void RendererImpl::RunEndedCallbackIfNeeded() {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (!PlaybackHasEnded())
     return;
@@ -913,7 +913,7 @@
 
 void RendererImpl::OnError(PipelineStatus error) {
   DVLOG(1) << __func__ << "(" << error << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(error != PIPELINE_OK) << "PIPELINE_OK isn't an error!";
   TRACE_EVENT1("media", "RendererImpl::OnError", "error",
                PipelineStatusToString(error));
@@ -940,32 +940,32 @@
 }
 
 void RendererImpl::OnWaiting(WaitingReason reason) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnWaiting(reason);
 }
 
 void RendererImpl::OnAudioConfigChange(const AudioDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnAudioConfigChange(config);
 }
 
 void RendererImpl::OnVideoConfigChange(const VideoDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoConfigChange(config);
 }
 
 void RendererImpl::OnVideoNaturalSizeChange(const gfx::Size& size) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoNaturalSizeChange(size);
 }
 
 void RendererImpl::OnVideoOpacityChange(bool opaque) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoOpacityChange(opaque);
 }
 
 void RendererImpl::OnVideoFrameRateChange(absl::optional<int> fps) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnVideoFrameRateChange(fps);
 }
 
@@ -983,7 +983,7 @@
 void RendererImpl::OnSelectedVideoTracksChanged(
     const std::vector<DemuxerStream*>& enabled_tracks,
     base::OnceClosure change_completed_cb) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT0("media", "RendererImpl::OnSelectedVideoTracksChanged");
 
   DCHECK_LT(enabled_tracks.size(), 2u);
@@ -1016,7 +1016,7 @@
 void RendererImpl::OnEnabledAudioTracksChanged(
     const std::vector<DemuxerStream*>& enabled_tracks,
     base::OnceClosure change_completed_cb) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT0("media", "RendererImpl::OnEnabledAudioTracksChanged");
 
   DCHECK_LT(enabled_tracks.size(), 2u);
diff --git a/media/renderers/renderer_impl.h b/media/renderers/renderer_impl.h
index 2f23bd8..5b4a573b 100644
--- a/media/renderers/renderer_impl.h
+++ b/media/renderers/renderer_impl.h
@@ -13,6 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/clock.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
@@ -28,10 +29,6 @@
 #include "media/base/waiting.h"
 #include "ui/gfx/geometry/size.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace media {
 
 class AudioRenderer;
@@ -46,7 +43,7 @@
   // provided. All methods except for GetMediaTime() run on the |task_runner|.
   // GetMediaTime() runs on the render main thread because it's part of JS sync
   // API.
-  RendererImpl(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+  RendererImpl(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
                std::unique_ptr<AudioRenderer> audio_renderer,
                std::unique_ptr<VideoRenderer> video_renderer);
 
@@ -213,7 +210,7 @@
   State state_;
 
   // Task runner used to execute pipeline tasks.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   raw_ptr<MediaResource> media_resource_;
   raw_ptr<RendererClient> client_;
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index a82fa782..4a0b32e 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -48,7 +48,7 @@
 }  // namespace
 
 VideoRendererImpl::VideoRendererImpl(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     VideoRendererSink* sink,
     const CreateVideoDecodersCB& create_video_decoders_cb,
     bool drop_frames,
@@ -82,7 +82,7 @@
 }
 
 VideoRendererImpl::~VideoRendererImpl() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (init_cb_)
     FinishInitialization(PIPELINE_ERROR_ABORT);
@@ -96,7 +96,7 @@
 
 void VideoRendererImpl::Flush(base::OnceClosure callback) {
   DVLOG(1) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   if (sink_started_)
     StopSink();
@@ -143,7 +143,7 @@
 
 void VideoRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) {
   DVLOG(1) << __func__ << "(" << timestamp.InMicroseconds() << ")";
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   base::AutoLock auto_lock(lock_);
   DCHECK_EQ(state_, kFlushed);
   DCHECK(!pending_read_);
@@ -163,7 +163,7 @@
     RendererClient* client,
     const TimeSource::WallClockTimeCB& wall_clock_time_cb,
     PipelineStatusCallback init_cb) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "VideoRendererImpl::Initialize",
                                     TRACE_ID_LOCAL(this));
 
@@ -293,7 +293,7 @@
 }
 
 void VideoRendererImpl::OnVideoDecoderStreamInitialized(bool success) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   base::AutoLock auto_lock(lock_);
   DCHECK_EQ(state_, kInitializing);
 
@@ -331,12 +331,12 @@
 }
 
 void VideoRendererImpl::OnPlaybackError(PipelineStatus error) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnError(error);
 }
 
 void VideoRendererImpl::OnPlaybackEnded() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   {
     // Send one last stats update so things like memory usage are correct.
     base::AutoLock auto_lock(lock_);
@@ -347,12 +347,12 @@
 }
 
 void VideoRendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnStatisticsUpdate(stats);
 }
 
 void VideoRendererImpl::OnBufferingStateChange(BufferingState buffering_state) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // "Underflow" is only possible when playing. This avoids noise like blaming
   // the decoder for an "underflow" that is really just a seek.
@@ -371,12 +371,12 @@
 }
 
 void VideoRendererImpl::OnWaiting(WaitingReason reason) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnWaiting(reason);
 }
 
 void VideoRendererImpl::OnConfigChange(const VideoDecoderConfig& config) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(config.IsValidConfig());
 
   // RendererClient only cares to know about config changes that differ from
@@ -388,7 +388,7 @@
 }
 
 void VideoRendererImpl::OnFallback(PipelineStatus status) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   client_->OnFallback(std::move(status).AddHere());
 }
 
@@ -398,7 +398,7 @@
 }
 
 void VideoRendererImpl::OnTimeProgressing() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // WARNING: Do not attempt to use |lock_| here as StartSink() may cause a
   // reentrant call.
@@ -424,7 +424,7 @@
 }
 
 void VideoRendererImpl::OnTimeStopped() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // WARNING: Do not attempt to use |lock_| here as StopSink() may cause a
   // reentrant call.
@@ -564,7 +564,7 @@
 }
 
 void VideoRendererImpl::FrameReady(VideoDecoderStream::ReadResult result) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   base::AutoLock auto_lock(lock_);
   DCHECK_EQ(state_, kPlaying);
   CHECK(pending_read_);
@@ -728,7 +728,7 @@
 
 void VideoRendererImpl::TransitionToHaveEnough_Locked() {
   DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING);
   lock_.AssertAcquired();
 
@@ -740,7 +740,7 @@
 
 void VideoRendererImpl::TransitionToHaveNothing() {
   DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   base::AutoLock auto_lock(lock_);
   TransitionToHaveNothing_Locked();
@@ -748,7 +748,7 @@
 
 void VideoRendererImpl::TransitionToHaveNothing_Locked() {
   DVLOG(3) << __func__;
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   if (buffering_state_ != BUFFERING_HAVE_ENOUGH || HaveEnoughData_Locked())
@@ -761,7 +761,7 @@
 }
 
 void VideoRendererImpl::AddReadyFrame_Locked(scoped_refptr<VideoFrame> frame) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
   DCHECK(!frame->metadata().end_of_stream);
 
@@ -774,7 +774,7 @@
 }
 
 void VideoRendererImpl::AttemptRead_Locked() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   if (pending_read_ || received_end_of_stream_)
@@ -801,7 +801,7 @@
 void VideoRendererImpl::OnVideoDecoderStreamResetDone() {
   // We don't need to acquire the |lock_| here, because we can only get here
   // when Flush is in progress, so rendering and video sink must be stopped.
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!sink_started_);
   DCHECK_EQ(kFlushing, state_);
   DCHECK(!received_end_of_stream_);
@@ -813,7 +813,7 @@
 }
 
 void VideoRendererImpl::UpdateStats_Locked(bool force_update) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   // No need to check for `stats_.video_frames_decoded_power_efficient` because
@@ -841,7 +841,7 @@
 }
 
 void VideoRendererImpl::ReportFrameRateIfNeeded_Locked() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   lock_.AssertAcquired();
 
   absl::optional<int> current_fps = fps_estimator_.ComputeFPS();
@@ -860,7 +860,7 @@
 }
 
 bool VideoRendererImpl::HaveReachedBufferingCap(size_t buffering_cap) const {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // When the display rate is less than the frame rate, the effective frames
   // queued may be much smaller than the actual number of frames queued.  Here
@@ -870,7 +870,7 @@
 }
 
 void VideoRendererImpl::StartSink() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_GT(algorithm_->frames_queued(), 0u);
   sink_started_ = true;
   was_background_rendering_ = false;
@@ -878,7 +878,7 @@
 }
 
 void VideoRendererImpl::StopSink() {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   sink_->Stop();
   algorithm_->set_time_stopped();
   sink_started_ = false;
@@ -1016,7 +1016,7 @@
 
 void VideoRendererImpl::CheckForMetadataChanges(VideoPixelFormat pixel_format,
                                                 const gfx::Size& natural_size) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Notify client of size and opacity changes if this is the first frame
   // or if those have changed from the last frame.
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h
index 7ef5004..d76c449 100644
--- a/media/renderers/video_renderer_impl.h
+++ b/media/renderers/video_renderer_impl.h
@@ -15,6 +15,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "media/base/decryptor.h"
@@ -35,7 +36,6 @@
 #include "media/video/gpu_memory_buffer_video_frame_pool.h"
 
 namespace base {
-class SingleThreadTaskRunner;
 class TickClock;
 }  // namespace base
 
@@ -56,7 +56,7 @@
   //
   // Setting |drop_frames_| to true causes the renderer to drop expired frames.
   VideoRendererImpl(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       VideoRendererSink* sink,
       const CreateVideoDecodersCB& create_video_decoders_cb,
       bool drop_frames,
@@ -209,7 +209,7 @@
   void AttemptReadAndCheckForMetadataChanges(VideoPixelFormat pixel_format,
                                              const gfx::Size& natural_size);
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   // Sink which calls into VideoRendererImpl via Render() for video frames.  Do
   // not call any methods on the sink while |lock_| is held or the two threads
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
index 098650d..b8506c4f 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -28,6 +28,7 @@
 #include "base/ranges/algorithm.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_byteorder.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
 #include "base/trace_event/memory_dump_manager.h"
@@ -79,7 +80,7 @@
   // video frame's planes.
   // |gpu_factories| is an interface to GPU related operation and can be
   // null if a GL context is not available.
-  PoolImpl(const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+  PoolImpl(const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
            const scoped_refptr<base::TaskRunner>& worker_task_runner,
            GpuVideoAcceleratorFactories* const gpu_factories)
       : media_task_runner_(media_task_runner),
@@ -249,7 +250,7 @@
       FrameResources* frame_resources);
 
   // Task runner associated to the GL context provided by |gpu_factories_|.
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   // Task runner used to asynchronously copy planes.
   const scoped_refptr<base::TaskRunner> worker_task_runner_;
 
@@ -718,7 +719,7 @@
 void GpuMemoryBufferVideoFramePool::PoolImpl::CreateHardwareFrame(
     scoped_refptr<VideoFrame> video_frame,
     FrameReadyCB frame_ready_cb) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   // Lazily initialize |output_format_| since VideoFrameOutputFormat() has to be
   // called on the media_thread while this object might be instantiated on any.
   const VideoPixelFormat pixel_format = video_frame->format();
@@ -855,7 +856,7 @@
 }
 
 void GpuMemoryBufferVideoFramePool::PoolImpl::Abort() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   // Abort any pending copy requests. If one is already in flight, we can't do
   // anything about it.
   if (frame_copy_requests_.size() <= 1u)
@@ -890,7 +891,7 @@
 }
 
 void GpuMemoryBufferVideoFramePool::PoolImpl::StartCopy() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!frame_copy_requests_.empty());
 
   while (!frame_copy_requests_.empty()) {
@@ -1088,7 +1089,7 @@
     bool copy_failed,
     scoped_refptr<VideoFrame> video_frame,
     FrameResources* frame_resources) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   if (copy_failed) {
     // Drop the resources if there was an error with them. If we're not in
     // shutdown we also need to remove the pool entry for them.
@@ -1135,7 +1136,7 @@
         const gfx::ColorSpace& color_space,
         base::TimeDelta timestamp,
         bool allow_i420_overlay) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   gpu::SharedImageInterface* sii = gpu_factories_->SharedImageInterface();
   if (!sii) {
     frame_resources->MarkUnused(tick_clock_->NowTicks());
@@ -1275,7 +1276,7 @@
 }
 
 void GpuMemoryBufferVideoFramePool::PoolImpl::Shutdown() {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
   // Clients don't care about copies once shutdown has started, so abort them.
   Abort();
 
@@ -1306,7 +1307,7 @@
     const gfx::Size& size,
     GpuVideoAcceleratorFactories::OutputFormat format,
     gfx::BufferUsage usage) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
 
   auto it = resources_pool_.begin();
   while (it != resources_pool_.end()) {
@@ -1379,7 +1380,7 @@
 void GpuMemoryBufferVideoFramePool::PoolImpl::MailboxHoldersReleased(
     FrameResources* frame_resources,
     const gpu::SyncToken& release_sync_token) {
-  if (!media_task_runner_->BelongsToCurrentThread()) {
+  if (!media_task_runner_->RunsTasksInCurrentSequence()) {
     media_task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&PoolImpl::MailboxHoldersReleased, this,
                                   frame_resources, release_sync_token));
@@ -1414,13 +1415,15 @@
 GpuMemoryBufferVideoFramePool::GpuMemoryBufferVideoFramePool() = default;
 
 GpuMemoryBufferVideoFramePool::GpuMemoryBufferVideoFramePool(
-    const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+    const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
     const scoped_refptr<base::TaskRunner>& worker_task_runner,
     GpuVideoAcceleratorFactories* gpu_factories)
     : pool_impl_(
           new PoolImpl(media_task_runner, worker_task_runner, gpu_factories)) {
-  base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
-      pool_impl_.get(), "GpuMemoryBufferVideoFramePool", media_task_runner);
+  base::trace_event::MemoryDumpManager::GetInstance()
+      ->RegisterDumpProviderWithSequencedTaskRunner(
+          pool_impl_.get(), "GpuMemoryBufferVideoFramePool", media_task_runner,
+          base::trace_event::MemoryDumpProvider::Options());
 }
 
 GpuMemoryBufferVideoFramePool::~GpuMemoryBufferVideoFramePool() {
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.h b/media/video/gpu_memory_buffer_video_frame_pool.h
index d7bfd31..c6378dd0 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.h
+++ b/media/video/gpu_memory_buffer_video_frame_pool.h
@@ -6,11 +6,11 @@
 #define MEDIA_VIDEO_GPU_MEMORY_BUFFER_VIDEO_FRAME_POOL_H_
 
 #include "base/memory/ref_counted.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/task_runner.h"
 #include "media/base/video_frame.h"
 
 namespace base {
-class SingleThreadTaskRunner;
 class TickClock;
 }
 
@@ -34,7 +34,7 @@
  public:
   GpuMemoryBufferVideoFramePool();
   GpuMemoryBufferVideoFramePool(
-      const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
+      const scoped_refptr<base::SequencedTaskRunner>& media_task_runner,
       const scoped_refptr<base::TaskRunner>& worker_task_runner,
       GpuVideoAcceleratorFactories* gpu_factories);
 
diff --git a/services/viz/public/cpp/gpu/context_provider_command_buffer.cc b/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
index e26a4dd..f81d3989 100644
--- a/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
+++ b/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
@@ -19,8 +19,10 @@
 #include "base/no_destructor.h"
 #include "base/observer_list.h"
 #include "base/strings/stringprintf.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/memory_dump_provider.h"
 #include "build/build_config.h"
 #include "components/viz/common/gpu/context_cache_controller.h"
 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
@@ -84,11 +86,11 @@
       buffer_mapper_(buffer_mapper) {
   DCHECK(main_thread_checker_.CalledOnValidThread());
   DCHECK(channel_);
-  context_thread_checker_.DetachFromThread();
+  context_sequence_checker_.DetachFromSequence();
 }
 
 ContextProviderCommandBuffer::~ContextProviderCommandBuffer() {
-  DCHECK(context_thread_checker_.CalledOnValidThread());
+  DCHECK(context_sequence_checker_.CalledOnValidSequence());
 
   if (bind_tried_ && bind_result_ == gpu::ContextResult::kSuccess) {
     // Clear the lock to avoid DCHECKs that the lock is being held during
@@ -125,8 +127,9 @@
 }
 
 gpu::ContextResult ContextProviderCommandBuffer::BindToCurrentThread() {
+  // TODO(crbug.com/1144329): rename method to indicate sequence affinity.
   // This is called on the thread the context will be used.
-  DCHECK(context_thread_checker_.CalledOnValidThread());
+  DCHECK(context_sequence_checker_.CalledOnValidSequence());
 
   if (bind_tried_)
     return bind_result_;
@@ -135,11 +138,9 @@
   // Any early-out should set this to a failure code and return it.
   bind_result_ = gpu::ContextResult::kSuccess;
 
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
-      default_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> task_runner = default_task_runner_;
   if (!task_runner)
-    task_runner = base::ThreadTaskRunnerHandle::Get();
-
+    task_runner = base::SequencedTaskRunnerHandle::Get();
   // This command buffer is a client-side proxy to the command buffer in the
   // GPU process.
   command_buffer_ = std::make_unique<gpu::CommandBufferProxyImpl>(
@@ -337,8 +338,10 @@
   shared_image_interface_ = channel_->CreateClientSharedImageInterface();
   DCHECK(shared_image_interface_);
 
-  base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
-      this, "ContextProviderCommandBuffer", std::move(task_runner));
+  base::trace_event::MemoryDumpManager::GetInstance()
+      ->RegisterDumpProviderWithSequencedTaskRunner(
+          this, "ContextProviderCommandBuffer", std::move(task_runner),
+          base::trace_event::MemoryDumpProvider::Options());
   return bind_result_;
 }
 
@@ -531,10 +534,10 @@
   helper_->OnMemoryDump(args, pmd);
 
   if (gr_context_) {
-    context_thread_checker_.DetachFromThread();
+    context_sequence_checker_.DetachFromSequence();
     gpu::raster::DumpGrMemoryStatistics(gr_context_->get(), pmd,
                                         gles2_impl_->ShareGroupTracingGUID());
-    context_thread_checker_.DetachFromThread();
+    context_sequence_checker_.DetachFromSequence();
   }
   return true;
 }
diff --git a/services/viz/public/cpp/gpu/context_provider_command_buffer.h b/services/viz/public/cpp/gpu/context_provider_command_buffer.h
index 22b9d09..0b888ac 100644
--- a/services/viz/public/cpp/gpu/context_provider_command_buffer.h
+++ b/services/viz/public/cpp/gpu/context_provider_command_buffer.h
@@ -15,6 +15,7 @@
 #include "base/memory/shared_memory_mapper.h"
 #include "base/observer_list.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/trace_event/memory_dump_provider.h"
@@ -128,13 +129,13 @@
     if (support_locking_) {
       context_lock_.AssertAcquired();
     } else {
-      DCHECK(context_thread_checker_.CalledOnValidThread());
+      DCHECK(context_sequence_checker_.CalledOnValidSequence());
     }
 #endif
   }
 
   base::ThreadChecker main_thread_checker_;
-  base::ThreadChecker context_thread_checker_;
+  base::SequenceChecker context_sequence_checker_;
 
   bool bind_tried_ = false;
   gpu::ContextResult bind_result_;
@@ -153,7 +154,7 @@
   scoped_refptr<gpu::GpuChannelHost> channel_;
   raw_ptr<gpu::GpuMemoryBufferManager, DanglingUntriaged>
       gpu_memory_buffer_manager_;
-  scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> default_task_runner_;
 
   // |shared_image_interface_| must be torn down after |command_buffer_| to
   // ensure any dependent commands in the command stream are flushed before the
diff --git a/third_party/blink/public/platform/media/web_media_player_builder.h b/third_party/blink/public/platform/media/web_media_player_builder.h
index bd5247c..a59f68d 100644
--- a/third_party/blink/public/platform/media/web_media_player_builder.h
+++ b/third_party/blink/public/platform/media/web_media_player_builder.h
@@ -22,6 +22,7 @@
 
 namespace base {
 class SingleThreadTaskRunner;
+class SequencedTaskRunner;
 class TaskRunner;
 }  // namespace base
 
@@ -78,7 +79,7 @@
       media::MediaPlayerLoggingID player_id,
       DeferLoadCB defer_load_cb,
       scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       scoped_refptr<base::TaskRunner> worker_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index bb829520..13ddc13 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -38,6 +38,7 @@
 
 #include "base/callback.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -345,7 +346,7 @@
 
   // Returns the task runner of the media thread.
   // This method should only be called on the main thread, or it crashes.
-  virtual scoped_refptr<base::SingleThreadTaskRunner> MediaThreadTaskRunner() {
+  virtual scoped_refptr<base::SequencedTaskRunner> MediaThreadTaskRunner() {
     return nullptr;
   }
 
diff --git a/third_party/blink/public/web/modules/mediastream/DEPS b/third_party/blink/public/web/modules/mediastream/DEPS
index 9238d9d4..a675dac 100644
--- a/third_party/blink/public/web/modules/mediastream/DEPS
+++ b/third_party/blink/public/web/modules/mediastream/DEPS
@@ -4,6 +4,7 @@
     "+base/logging.h",
     "+base/memory/weak_ptr.h",
     "+base/task/single_thread_task_runner.h",
+    "+base/task/sequenced_task_runner.h",
     "+base/synchronization/lock.h",
     "+base/token.h",
     "+base/threading/thread_checker.h",
diff --git a/third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h b/third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h
index f8c640d..a71efae 100644
--- a/third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h
+++ b/third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h
@@ -10,6 +10,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
@@ -82,7 +83,7 @@
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       scoped_refptr<base::TaskRunner> worker_task_runner,
       media::GpuVideoAcceleratorFactories* gpu_factories,
       const WebString& sink_id,
@@ -305,7 +306,7 @@
   const scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner_;
   const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
   const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
 
   const scoped_refptr<base::TaskRunner> worker_task_runner_;
   media::GpuVideoAcceleratorFactories* gpu_factories_;
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
index 01b3e059..2754276 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
@@ -13,6 +13,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -158,7 +159,7 @@
       void(scoped_refptr<media::VideoFrame> frame, bool is_copy)>;
   FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player,
                  RepaintCB enqueue_frame_cb,
-                 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+                 scoped_refptr<base::SequencedTaskRunner> media_task_runner,
                  scoped_refptr<base::TaskRunner> worker_task_runner,
                  media::GpuVideoAcceleratorFactories* gpu_factories)
       : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
@@ -325,7 +326,7 @@
 
   // Pool of GpuMemoryBuffers and resources used to create hardware frames.
   std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   const scoped_refptr<base::TaskRunner> worker_task_runner_;
 
   media::GpuVideoAcceleratorFactories* const gpu_factories_;
@@ -345,7 +346,7 @@
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::TaskRunner> worker_task_runner,
     media::GpuVideoAcceleratorFactories* gpu_factories,
     const WebString& sink_id,
diff --git a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc
index cea7063..a608580 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h"
 
 #include "base/synchronization/waitable_event.h"
+#include "base/task/sequenced_task_runner.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "media/base/wait_and_replace_sync_token_client.h"
@@ -39,7 +40,7 @@
 #endif
 
 void GetMediaTaskRunnerAndGpuFactoriesOnMainThread(
-    scoped_refptr<base::SingleThreadTaskRunner>* media_task_runner_out,
+    scoped_refptr<base::SequencedTaskRunner>* media_task_runner_out,
     media::GpuVideoAcceleratorFactories** gpu_factories_out,
     base::WaitableEvent* waitable_event) {
   DCHECK(IsMainThread());
diff --git a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h
index 94474aa..0a0e8e5b 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h
+++ b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h
@@ -64,7 +64,7 @@
 
   std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_;
   scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   scoped_refptr<media::VideoFrame> hardware_video_frame_;
 };
 
diff --git a/third_party/blink/renderer/platform/media/web_media_player_builder.cc b/third_party/blink/renderer/platform/media/web_media_player_builder.cc
index 9b3cd2e..7499445b 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_builder.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_builder.cc
@@ -41,7 +41,7 @@
     media::MediaPlayerLoggingID player_id,
     DeferLoadCB defer_load_cb,
     scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::TaskRunner> worker_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
index 9961397..8287f50 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -25,6 +25,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_runner_util.h"
 #include "base/task/thread_pool.h"
@@ -400,7 +401,7 @@
     media::MediaPlayerLoggingID player_id,
     WebMediaPlayerBuilder::DeferLoadCB defer_load_cb,
     scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink,
-    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    scoped_refptr<base::SequencedTaskRunner> media_task_runner,
     scoped_refptr<base::TaskRunner> worker_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h
index 31b94dd..86e80ef59 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.h
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -17,6 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/threading/thread.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
@@ -125,7 +126,7 @@
       media::MediaPlayerLoggingID player_id,
       WebMediaPlayerBuilder::DeferLoadCB defer_load_cb,
       scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink,
-      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      scoped_refptr<base::SequencedTaskRunner> media_task_runner,
       scoped_refptr<base::TaskRunner> worker_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner>
@@ -689,7 +690,7 @@
   // Task runner for posting tasks on Chrome's main thread. Also used
   // for DCHECKs so methods calls won't execute in the wrong thread.
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+  const scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
   const scoped_refptr<base::TaskRunner> worker_task_runner_;
 
   // This is the ID that is used within the internals of the media element