Migrate remaining webrtc usage of TaskQueueBase to absl::AnyInvocable

Bug: webrtc:14245
Change-Id: I8de2c23da5fbdfc0b1efbbe07fb6e8de744424a3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/268191
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37565}
diff --git a/api/metronome/test/BUILD.gn b/api/metronome/test/BUILD.gn
index 160b45c..0ea13b3 100644
--- a/api/metronome/test/BUILD.gn
+++ b/api/metronome/test/BUILD.gn
@@ -18,7 +18,6 @@
     "..:metronome",
     "../..:priority",
     "../..:sequence_checker",
-    "../../../api/task_queue:to_queued_task",
     "../../../rtc_base:macromagic",
     "../../../rtc_base:rtc_event",
     "../../../rtc_base:rtc_task_queue",
diff --git a/api/metronome/test/fake_metronome.cc b/api/metronome/test/fake_metronome.cc
index 7813a3d..cb471b9 100644
--- a/api/metronome/test/fake_metronome.cc
+++ b/api/metronome/test/fake_metronome.cc
@@ -13,7 +13,6 @@
 #include "api/priority.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/task_queue_factory.h"
-#include "api/task_queue/to_queued_task.h"
 #include "api/units/time_delta.h"
 #include "rtc_base/event.h"
 #include "rtc_base/task_utils/repeating_task.h"
@@ -41,8 +40,7 @@
 
 void ForcedTickMetronome::Tick() {
   for (auto* listener : listeners_) {
-    listener->OnTickTaskQueue()->PostTask(
-        ToQueuedTask([listener] { listener->OnTick(); }));
+    listener->OnTickTaskQueue()->PostTask([listener] { listener->OnTick(); });
   }
 }
 
@@ -66,7 +64,7 @@
         return TimeDelta::PlusInfinity();
       for (auto* listener : listeners_) {
         listener->OnTickTaskQueue()->PostTask(
-            ToQueuedTask([listener] { listener->OnTick(); }));
+            [listener] { listener->OnTick(); });
       }
       return tick_period_;
     });
diff --git a/api/task_queue/test/BUILD.gn b/api/task_queue/test/BUILD.gn
index fa82dd0..25f7ed0 100644
--- a/api/task_queue/test/BUILD.gn
+++ b/api/task_queue/test/BUILD.gn
@@ -13,6 +13,8 @@
   sources = [ "mock_task_queue_base.h" ]
   deps = [
     "../../../api/task_queue:task_queue",
+    "../../../api/units:time_delta",
     "../../../test:test_support",
   ]
+  absl_deps = [ "//third_party/abseil-cpp/absl/functional:any_invocable" ]
 }
diff --git a/api/task_queue/test/mock_task_queue_base.h b/api/task_queue/test/mock_task_queue_base.h
index 68c5c05..2e99be7 100644
--- a/api/task_queue/test/mock_task_queue_base.h
+++ b/api/task_queue/test/mock_task_queue_base.h
@@ -11,20 +11,25 @@
 #ifndef API_TASK_QUEUE_TEST_MOCK_TASK_QUEUE_BASE_H_
 #define API_TASK_QUEUE_TEST_MOCK_TASK_QUEUE_BASE_H_
 
-#include <memory>
-
+#include "absl/functional/any_invocable.h"
 #include "api/task_queue/task_queue_base.h"
+#include "api/units/time_delta.h"
 #include "test/gmock.h"
 
 namespace webrtc {
 
 class MockTaskQueueBase : public TaskQueueBase {
  public:
-  MOCK_METHOD0(Delete, void());
-  MOCK_METHOD1(PostTask, void(std::unique_ptr<QueuedTask>));
-  MOCK_METHOD2(PostDelayedTask, void(std::unique_ptr<QueuedTask>, uint32_t));
-  MOCK_METHOD2(PostDelayedHighPrecisionTask,
-               void(std::unique_ptr<QueuedTask>, uint32_t));
+  MOCK_METHOD(void, Delete, (), (override));
+  MOCK_METHOD(void, PostTask, (absl::AnyInvocable<void() &&>), (override));
+  MOCK_METHOD(void,
+              PostDelayedTask,
+              (absl::AnyInvocable<void() &&>, TimeDelta),
+              (override));
+  MOCK_METHOD(void,
+              PostDelayedHighPrecisionTask,
+              (absl::AnyInvocable<void() &&>, TimeDelta),
+              (override));
 };
 
 }  // namespace webrtc
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index 3efd00a..86cf7e8 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -62,7 +62,6 @@
     "../api/rtc_event_log",
     "../api/task_queue",
     "../api/task_queue:pending_task_safety_flag",
-    "../api/task_queue:to_queued_task",
     "../api/transport/rtp:rtp_source",
     "../call:audio_sender_interface",
     "../call:bitrate_allocator",
@@ -168,6 +167,7 @@
       "../api/crypto:frame_decryptor_interface",
       "../api/rtc_event_log",
       "../api/task_queue:default_task_queue_factory",
+      "../api/task_queue/test:mock_task_queue_base",
       "../api/units:time_delta",
       "../call:mock_bitrate_allocator",
       "../call:mock_call_interfaces",
@@ -324,7 +324,7 @@
         "../test:test_support",
         "//testing/gtest",
       ]
-
+      absl_deps = [ "//third_party/abseil-cpp/absl/functional:any_invocable" ]
       data = [ "//resources/voice_engine/audio_dtx16.wav" ]
     }
   }
diff --git a/audio/audio_state_unittest.cc b/audio/audio_state_unittest.cc
index 824a2ee..4426a78 100644
--- a/audio/audio_state_unittest.cc
+++ b/audio/audio_state_unittest.cc
@@ -14,6 +14,7 @@
 #include <utility>
 #include <vector>
 
+#include "api/task_queue/test/mock_task_queue_base.h"
 #include "call/test/mock_audio_send_stream.h"
 #include "modules/audio_device/include/mock_audio_device.h"
 #include "modules/audio_mixer/audio_mixer_impl.h"
@@ -34,18 +35,14 @@
 constexpr int kNumberOfChannels = 1;
 
 struct FakeAsyncAudioProcessingHelper {
-  class FakeTaskQueue : public StrictMock<TaskQueueBase> {
+  class FakeTaskQueue : public StrictMock<MockTaskQueueBase> {
    public:
     FakeTaskQueue() = default;
 
     void Delete() override { delete this; }
-    void PostTask(std::unique_ptr<QueuedTask> task) override {
-      std::move(task)->Run();
+    void PostTask(absl::AnyInvocable<void() &&> task) override {
+      std::move(task)();
     }
-    MOCK_METHOD(void,
-                PostDelayedTask,
-                (std::unique_ptr<QueuedTask> task, uint32_t milliseconds),
-                (override));
   };
 
   class FakeTaskQueueFactory : public TaskQueueFactory {
diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc
index 6b8d1c1..c1225b1 100644
--- a/audio/channel_receive.cc
+++ b/audio/channel_receive.cc
@@ -23,7 +23,6 @@
 #include "api/sequence_checker.h"
 #include "api/task_queue/pending_task_safety_flag.h"
 #include "api/task_queue/task_queue_base.h"
-#include "api/task_queue/to_queued_task.h"
 #include "audio/audio_level.h"
 #include "audio/channel_receive_frame_transformer_delegate.h"
 #include "audio/channel_send.h"
@@ -482,7 +481,7 @@
   ++audio_frame_interval_count_;
   if (audio_frame_interval_count_ >= kHistogramReportingInterval) {
     audio_frame_interval_count_ = 0;
-    worker_thread_->PostTask(ToQueuedTask(worker_safety_, [this]() {
+    worker_thread_->PostTask(SafeTask(worker_safety_.flag(), [this]() {
       RTC_DCHECK_RUN_ON(&worker_thread_checker_);
       RTC_HISTOGRAM_COUNTS_1000("WebRTC.Audio.TargetJitterBufferDelayMs",
                                 acm_receiver_.TargetDelayMs());
diff --git a/audio/channel_receive_frame_transformer_delegate.cc b/audio/channel_receive_frame_transformer_delegate.cc
index 085721e..0f742e5 100644
--- a/audio/channel_receive_frame_transformer_delegate.cc
+++ b/audio/channel_receive_frame_transformer_delegate.cc
@@ -12,7 +12,6 @@
 
 #include <utility>
 
-#include "api/task_queue/to_queued_task.h"
 #include "rtc_base/buffer.h"
 
 namespace webrtc {
@@ -80,10 +79,10 @@
 void ChannelReceiveFrameTransformerDelegate::OnTransformedFrame(
     std::unique_ptr<TransformableFrameInterface> frame) {
   rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate(this);
-  channel_receive_thread_->PostTask(ToQueuedTask(
+  channel_receive_thread_->PostTask(
       [delegate = std::move(delegate), frame = std::move(frame)]() mutable {
         delegate->ReceiveFrame(std::move(frame));
-      }));
+      });
 }
 
 void ChannelReceiveFrameTransformerDelegate::ReceiveFrame(
diff --git a/audio/test/audio_bwe_integration_test.cc b/audio/test/audio_bwe_integration_test.cc
index 23b8183..1d1ecdd 100644
--- a/audio/test/audio_bwe_integration_test.cc
+++ b/audio/test/audio_bwe_integration_test.cc
@@ -12,7 +12,7 @@
 
 #include <memory>
 
-#include "api/task_queue/queued_task.h"
+#include "absl/functional/any_invocable.h"
 #include "api/task_queue/task_queue_base.h"
 #include "call/fake_network_pipe.h"
 #include "call/simulated_network.h"
@@ -84,21 +84,15 @@
   SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraProcessTimeMs);
 }
 
-class StatsPollTask : public QueuedTask {
- public:
-  explicit StatsPollTask(Call* sender_call) : sender_call_(sender_call) {}
-
- private:
-  bool Run() override {
-    RTC_CHECK(sender_call_);
-    Call::Stats call_stats = sender_call_->GetStats();
+absl::AnyInvocable<void() &&> StatsPollTask(Call* sender_call) {
+  RTC_CHECK(sender_call);
+  return [sender_call] {
+    Call::Stats call_stats = sender_call->GetStats();
     EXPECT_GT(call_stats.send_bandwidth_bps, 25000);
-    TaskQueueBase::Current()->PostDelayedTask(std::unique_ptr<QueuedTask>(this),
-                                              100);
-    return false;
-  }
-  Call* sender_call_;
-};
+    TaskQueueBase::Current()->PostDelayedTask(StatsPollTask(sender_call),
+                                              TimeDelta::Millis(100));
+  };
+}
 
 class NoBandwidthDropAfterDtx : public AudioBweTest {
  public:
@@ -144,8 +138,8 @@
   }
 
   void PerformTest() override {
-    stats_poller_.PostDelayedTask(std::make_unique<StatsPollTask>(sender_call_),
-                                  100);
+    stats_poller_.PostDelayedTask(StatsPollTask(sender_call_),
+                                  TimeDelta::Millis(100));
     sender_call_->OnAudioTransportOverheadChanged(0);
     AudioBweTest::PerformTest();
   }
diff --git a/audio/voip/test/BUILD.gn b/audio/voip/test/BUILD.gn
index d2ae985..e89f2b0 100644
--- a/audio/voip/test/BUILD.gn
+++ b/audio/voip/test/BUILD.gn
@@ -15,6 +15,7 @@
     sources = [ "mock_task_queue.h" ]
     deps = [
       "../../../api/task_queue:task_queue",
+      "../../../api/task_queue/test:mock_task_queue_base",
       "../../../test:test_support",
     ]
   }
@@ -56,6 +57,7 @@
       "../../../test:mock_transport",
       "../../../test:test_support",
     ]
+    absl_deps = [ "//third_party/abseil-cpp/absl/functional:any_invocable" ]
   }
 
   rtc_library("audio_ingress_unittests") {
diff --git a/audio/voip/test/audio_channel_unittest.cc b/audio/voip/test/audio_channel_unittest.cc
index a4f518c..8955810 100644
--- a/audio/voip/test/audio_channel_unittest.cc
+++ b/audio/voip/test/audio_channel_unittest.cc
@@ -9,6 +9,8 @@
  */
 
 #include "audio/voip/audio_channel.h"
+
+#include "absl/functional/any_invocable.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "api/call/transport.h"
@@ -49,7 +51,7 @@
     // By default, run the queued task immediately.
     ON_CALL(task_queue_, PostTask)
         .WillByDefault(
-            Invoke([&](std::unique_ptr<QueuedTask> task) { task->Run(); }));
+            [](absl::AnyInvocable<void() &&> task) { std::move(task)(); });
   }
 
   void SetUp() override { audio_channel_ = CreateAudioChannel(kLocalSsrc); }
diff --git a/audio/voip/test/mock_task_queue.h b/audio/voip/test/mock_task_queue.h
index c3553a2..547b0d3 100644
--- a/audio/voip/test/mock_task_queue.h
+++ b/audio/voip/test/mock_task_queue.h
@@ -14,13 +14,14 @@
 #include <memory>
 
 #include "api/task_queue/task_queue_factory.h"
+#include "api/task_queue/test/mock_task_queue_base.h"
 #include "test/gmock.h"
 
 namespace webrtc {
 
 // MockTaskQueue enables immediate task run from global TaskQueueBase.
 // It's necessary for some tests depending on TaskQueueBase internally.
-class MockTaskQueue : public TaskQueueBase {
+class MockTaskQueue : public MockTaskQueueBase {
  public:
   MockTaskQueue() : current_(this) {}
 
@@ -28,12 +29,6 @@
   // hold onto current global TaskQueueBase throughout the testing.
   void Delete() override {}
 
-  MOCK_METHOD(void, PostTask, (std::unique_ptr<QueuedTask>), (override));
-  MOCK_METHOD(void,
-              PostDelayedTask,
-              (std::unique_ptr<QueuedTask>, uint32_t),
-              (override));
-
  private:
   CurrentTaskQueueSetter current_;
 };
diff --git a/call/adaptation/BUILD.gn b/call/adaptation/BUILD.gn
index 1aa4da7..c195232 100644
--- a/call/adaptation/BUILD.gn
+++ b/call/adaptation/BUILD.gn
@@ -39,7 +39,6 @@
     "../../api:sequence_checker",
     "../../api/adaptation:resource_adaptation_api",
     "../../api/task_queue:task_queue",
-    "../../api/task_queue:to_queued_task",
     "../../api/video:video_adaptation",
     "../../api/video:video_frame",
     "../../api/video:video_stream_encoder",
@@ -121,7 +120,6 @@
       "../../api:sequence_checker",
       "../../api/adaptation:resource_adaptation_api",
       "../../api/task_queue:task_queue",
-      "../../api/task_queue:to_queued_task",
       "../../api/video:video_stream_encoder",
       "../../test:test_support",
     ]
diff --git a/call/adaptation/resource_adaptation_processor.cc b/call/adaptation/resource_adaptation_processor.cc
index 54a683b..f4d1bf3 100644
--- a/call/adaptation/resource_adaptation_processor.cc
+++ b/call/adaptation/resource_adaptation_processor.cc
@@ -17,7 +17,6 @@
 #include "absl/algorithm/container.h"
 #include "absl/strings/string_view.h"
 #include "api/sequence_checker.h"
-#include "api/task_queue/to_queued_task.h"
 #include "api/video/video_adaptation_counters.h"
 #include "call/adaptation/video_stream_adapter.h"
 #include "rtc_base/logging.h"
diff --git a/common_video/incoming_video_stream.cc b/common_video/incoming_video_stream.cc
index 6279f83..5f41ac2 100644
--- a/common_video/incoming_video_stream.cc
+++ b/common_video/incoming_video_stream.cc
@@ -14,6 +14,7 @@
 #include <utility>
 
 #include "absl/types/optional.h"
+#include "api/units/time_delta.h"
 #include "common_video/video_render_frames.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/trace_event.h"
@@ -58,7 +59,7 @@
   if (render_buffers_.HasPendingFrames()) {
     uint32_t wait_time = render_buffers_.TimeToNextFrameRelease();
     incoming_render_queue_.PostDelayedHighPrecisionTask(
-        ToQueuedTask([this]() { Dequeue(); }), wait_time);
+        [this]() { Dequeue(); }, TimeDelta::Millis(wait_time));
   }
 }
 
diff --git a/logging/BUILD.gn b/logging/BUILD.gn
index 8905c4a..2507e7e 100644
--- a/logging/BUILD.gn
+++ b/logging/BUILD.gn
@@ -367,6 +367,7 @@
       "../api:sequence_checker",
       "../api/rtc_event_log",
       "../api/task_queue",
+      "../api/units:time_delta",
       "../rtc_base:checks",
       "../rtc_base:logging",
       "../rtc_base:macromagic",
diff --git a/logging/rtc_event_log/rtc_event_log_impl.cc b/logging/rtc_event_log/rtc_event_log_impl.cc
index 444dd48..a48bbde 100644
--- a/logging/rtc_event_log/rtc_event_log_impl.cc
+++ b/logging/rtc_event_log/rtc_event_log_impl.cc
@@ -18,8 +18,8 @@
 
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
-#include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
+#include "api/units/time_delta.h"
 #include "logging/rtc_event_log/encoder/rtc_event_log_encoder_legacy.h"
 #include "logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.h"
 #include "rtc_base/checks.h"
@@ -182,7 +182,8 @@
     const int64_t time_since_output_ms = now_ms - last_output_ms_;
     const uint32_t delay = rtc::SafeClamp(
         *output_period_ms_ - time_since_output_ms, 0, *output_period_ms_);
-    task_queue_->PostDelayedTask(ToQueuedTask(std::move(output_task)), delay);
+    task_queue_->PostDelayedTask(std::move(output_task),
+                                 TimeDelta::Millis(delay));
   }
 }
 
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 2d38313..8e810b7 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -65,7 +65,6 @@
     "../api/crypto:frame_encryptor_interface",
     "../api/crypto:options",
     "../api/task_queue:pending_task_safety_flag",
-    "../api/task_queue:to_queued_task",
     "../api/transport:datagram_transport_interface",
     "../api/transport:stun_types",
     "../api/transport/rtp:rtp_source",
@@ -278,7 +277,6 @@
     "../api/audio_codecs:audio_codecs_api",
     "../api/task_queue",
     "../api/task_queue:pending_task_safety_flag",
-    "../api/task_queue:to_queued_task",
     "../api/transport:bitrate_settings",
     "../api/transport:field_trial_based_config",
     "../api/transport/rtp:rtp_source",
@@ -422,7 +420,6 @@
       "../api:array_view",
       "../api/task_queue:pending_task_safety_flag",
       "../api/task_queue:task_queue",
-      "../api/task_queue:to_queued_task",
       "../media:rtc_media_base",
       "../net/dcsctp/public:factory",
       "../net/dcsctp/public:socket",
diff --git a/media/base/media_channel.cc b/media/base/media_channel.cc
index c3b2480..e01bfb1 100644
--- a/media/base/media_channel.cc
+++ b/media/base/media_channel.cc
@@ -10,7 +10,6 @@
 
 #include "media/base/media_channel.h"
 
-#include "api/task_queue/to_queued_task.h"
 #include "media/base/rtp_utils.h"
 
 namespace cricket {
@@ -18,8 +17,8 @@
 using webrtc::FrameEncryptorInterface;
 using webrtc::FrameTransformerInterface;
 using webrtc::PendingTaskSafetyFlag;
+using webrtc::SafeTask;
 using webrtc::TaskQueueBase;
-using webrtc::ToQueuedTask;
 using webrtc::VideoTrackInterface;
 
 VideoOptions::VideoOptions()
@@ -126,7 +125,7 @@
     // This is currently the common path as the derived channel classes
     // get called on the worker thread. There are still some tests though
     // that call directly on the network thread.
-    network_thread_->PostTask(ToQueuedTask(
+    network_thread_->PostTask(SafeTask(
         network_safety_, [this, new_dscp]() { SetPreferredDscp(new_dscp); }));
     return;
   }
@@ -190,7 +189,7 @@
   if (network_thread_->IsCurrent()) {
     send();
   } else {
-    network_thread_->PostTask(ToQueuedTask(network_safety_, std::move(send)));
+    network_thread_->PostTask(SafeTask(network_safety_, std::move(send)));
   }
 }
 
@@ -207,7 +206,7 @@
   if (network_thread_->IsCurrent()) {
     send();
   } else {
-    network_thread_->PostTask(ToQueuedTask(network_safety_, std::move(send)));
+    network_thread_->PostTask(SafeTask(network_safety_, std::move(send)));
   }
 }
 
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 22796ad..199d005 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -920,7 +920,7 @@
 void WebRtcVideoChannel::RequestEncoderFallback() {
   if (!worker_thread_->IsCurrent()) {
     worker_thread_->PostTask(
-        ToQueuedTask(task_safety_, [this] { RequestEncoderFallback(); }));
+        SafeTask(task_safety_.flag(), [this] { RequestEncoderFallback(); }));
     return;
   }
 
@@ -942,7 +942,7 @@
     bool allow_default_fallback) {
   if (!worker_thread_->IsCurrent()) {
     worker_thread_->PostTask(
-        ToQueuedTask(task_safety_, [this, format, allow_default_fallback] {
+        SafeTask(task_safety_.flag(), [this, format, allow_default_fallback] {
           RequestEncoderSwitch(format, allow_default_fallback);
         }));
     return;
@@ -1724,7 +1724,7 @@
   // to a common implementation and provide a callback on the worker thread
   // for the exception case (DELIVERY_UNKNOWN_SSRC) and how retry is attempted.
   worker_thread_->PostTask(
-      ToQueuedTask(task_safety_, [this, packet, packet_time_us] {
+      SafeTask(task_safety_.flag(), [this, packet, packet_time_us] {
         RTC_DCHECK_RUN_ON(&thread_checker_);
         const webrtc::PacketReceiver::DeliveryStatus delivery_result =
             call_->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, packet,
@@ -1877,8 +1877,8 @@
     absl::string_view transport_name,
     const rtc::NetworkRoute& network_route) {
   RTC_DCHECK_RUN_ON(&network_thread_checker_);
-  worker_thread_->PostTask(ToQueuedTask(
-      task_safety_,
+  worker_thread_->PostTask(SafeTask(
+      task_safety_.flag(),
       [this, name = std::string(transport_name), route = network_route] {
         RTC_DCHECK_RUN_ON(&thread_checker_);
         webrtc::RtpTransportControllerSendInterface* transport =
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 8511b03..db8ec69 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -25,7 +25,6 @@
 #include "api/call/audio_sink.h"
 #include "api/field_trials_view.h"
 #include "api/task_queue/pending_task_safety_flag.h"
-#include "api/task_queue/to_queued_task.h"
 #include "media/base/audio_source.h"
 #include "media/base/media_constants.h"
 #include "media/base/stream_params.h"
@@ -2152,8 +2151,8 @@
   // consistency it would be good to move the interaction with call_->Receiver()
   // to a common implementation and provide a callback on the worker thread
   // for the exception case (DELIVERY_UNKNOWN_SSRC) and how retry is attempted.
-  worker_thread_->PostTask(ToQueuedTask(task_safety_, [this, packet,
-                                                       packet_time_us] {
+  worker_thread_->PostTask(SafeTask(task_safety_.flag(), [this, packet,
+                                                          packet_time_us] {
     RTC_DCHECK_RUN_ON(worker_thread_);
 
     webrtc::PacketReceiver::DeliveryStatus delivery_result =
@@ -2232,8 +2231,8 @@
 
   call_->OnAudioTransportOverheadChanged(network_route.packet_overhead);
 
-  worker_thread_->PostTask(ToQueuedTask(
-      task_safety_,
+  worker_thread_->PostTask(SafeTask(
+      task_safety_.flag(),
       [this, name = std::string(transport_name), route = network_route] {
         RTC_DCHECK_RUN_ON(worker_thread_);
         call_->GetTransportControllerSend()->OnNetworkRouteChanged(name, route);
diff --git a/modules/audio_device/audio_device_buffer.cc b/modules/audio_device/audio_device_buffer.cc
index c7c31b7..8cc11de 100644
--- a/modules/audio_device/audio_device_buffer.cc
+++ b/modules/audio_device/audio_device_buffer.cc
@@ -477,10 +477,8 @@
 
   // Keep posting new (delayed) tasks until state is changed to kLogStop.
   task_queue_.PostDelayedTask(
-      ToQueuedTask([this] {
-        AudioDeviceBuffer::LogStats(AudioDeviceBuffer::LOG_ACTIVE);
-      }),
-      time_to_wait_ms);
+      [this] { AudioDeviceBuffer::LogStats(AudioDeviceBuffer::LOG_ACTIVE); },
+      TimeDelta::Millis(time_to_wait_ms));
 }
 
 void AudioDeviceBuffer::ResetRecStats() {
diff --git a/net/dcsctp/socket/BUILD.gn b/net/dcsctp/socket/BUILD.gn
index 3278a30..39254e2 100644
--- a/net/dcsctp/socket/BUILD.gn
+++ b/net/dcsctp/socket/BUILD.gn
@@ -229,7 +229,6 @@
       "../../../api:create_network_emulation_manager",
       "../../../api:network_emulation_manager_api",
       "../../../api/task_queue:task_queue",
-      "../../../api/task_queue:to_queued_task",
       "../../../api/units:time_delta",
       "../../../call:simulated_network",
       "../../../rtc_base:checks",
diff --git a/net/dcsctp/timer/task_queue_timeout_test.cc b/net/dcsctp/timer/task_queue_timeout_test.cc
index da01ecf..f360ba7 100644
--- a/net/dcsctp/timer/task_queue_timeout_test.cc
+++ b/net/dcsctp/timer/task_queue_timeout_test.cc
@@ -11,7 +11,6 @@
 
 #include <memory>
 
-#include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/test/mock_task_queue_base.h"
 #include "rtc_base/gunit.h"
diff --git a/pc/proxy.h b/pc/proxy.h
index 89a7f51..3877a6f 100644
--- a/pc/proxy.h
+++ b/pc/proxy.h
@@ -66,7 +66,6 @@
 #include <utility>
 
 #include "api/scoped_refptr.h"
-#include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "rtc_base/event.h"
 #include "rtc_base/location.h"
diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc
index 478f714..f79ad4e 100644
--- a/pc/rtc_stats_collector.cc
+++ b/pc/rtc_stats_collector.cc
@@ -31,7 +31,6 @@
 #include "api/sequence_checker.h"
 #include "api/stats/rtc_stats.h"
 #include "api/stats/rtcstats_objects.h"
-#include "api/task_queue/queued_task.h"
 #include "api/units/time_delta.h"
 #include "api/video/video_content_type.h"
 #include "common_video/include/quality_limitation_reason.h"
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 546a6d6..c183f5f 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -601,7 +601,6 @@
   deps = [
     ":macromagic",
     "../api/task_queue",
-    "../api/task_queue:to_queued_task",
     "system:rtc_export",
   ]
   absl_deps = [
diff --git a/rtc_base/task_queue.cc b/rtc_base/task_queue.cc
index 0b54178..7c972ed 100644
--- a/rtc_base/task_queue.cc
+++ b/rtc_base/task_queue.cc
@@ -29,26 +29,4 @@
   return impl_->IsCurrent();
 }
 
-void TaskQueue::PostTask(std::unique_ptr<webrtc::QueuedTask> task) {
-  impl_->PostTask(std::move(task));
-}
-
-void TaskQueue::PostDelayedTask(std::unique_ptr<webrtc::QueuedTask> task,
-                                uint32_t milliseconds) {
-  impl_->PostDelayedTask(std::move(task), milliseconds);
-}
-
-void TaskQueue::PostDelayedHighPrecisionTask(
-    std::unique_ptr<webrtc::QueuedTask> task,
-    uint32_t milliseconds) {
-  impl_->PostDelayedHighPrecisionTask(std::move(task), milliseconds);
-}
-
-void TaskQueue::PostDelayedTaskWithPrecision(
-    webrtc::TaskQueueBase::DelayPrecision precision,
-    std::unique_ptr<webrtc::QueuedTask> task,
-    uint32_t milliseconds) {
-  impl_->PostDelayedTaskWithPrecision(precision, std::move(task), milliseconds);
-}
-
 }  // namespace rtc
diff --git a/rtc_base/task_queue.h b/rtc_base/task_queue.h
index b2a08f8..d0c0551 100644
--- a/rtc_base/task_queue.h
+++ b/rtc_base/task_queue.h
@@ -21,7 +21,6 @@
 #include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/task_queue/task_queue_factory.h"
-#include "api/task_queue/to_queued_task.h"
 #include "rtc_base/system/rtc_export.h"
 #include "rtc_base/thread_annotations.h"
 
@@ -93,22 +92,17 @@
   webrtc::TaskQueueBase* Get() { return impl_; }
 
   // TODO(tommi): For better debuggability, implement RTC_FROM_HERE.
-
-  // Ownership of the task is passed to PostTask.
-  void PostTask(std::unique_ptr<webrtc::QueuedTask> task);
-  // See webrtc::TaskQueueBase for precision expectations.
-  void PostDelayedTask(std::unique_ptr<webrtc::QueuedTask> task,
-                       uint32_t milliseconds);
-  void PostDelayedHighPrecisionTask(std::unique_ptr<webrtc::QueuedTask> task,
-                                    uint32_t milliseconds);
-  void PostDelayedTaskWithPrecision(
-      webrtc::TaskQueueBase::DelayPrecision precision,
-      std::unique_ptr<webrtc::QueuedTask> task,
-      uint32_t milliseconds);
-
   void PostTask(absl::AnyInvocable<void() &&> task) {
     impl_->PostTask(std::move(task));
   }
+  void PostDelayedTask(absl::AnyInvocable<void() &&> task,
+                       webrtc::TimeDelta delay) {
+    impl_->PostDelayedTask(std::move(task), delay);
+  }
+  void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
+                                    webrtc::TimeDelta delay) {
+    impl_->PostDelayedHighPrecisionTask(std::move(task), delay);
+  }
 
  private:
   webrtc::TaskQueueBase* const impl_;
diff --git a/rtc_base/task_queue_unittest.cc b/rtc_base/task_queue_unittest.cc
index bd07a40..693cd4b 100644
--- a/rtc_base/task_queue_unittest.cc
+++ b/rtc_base/task_queue_unittest.cc
@@ -16,11 +16,13 @@
 #endif
 
 #include <stdint.h>
+
 #include <memory>
 #include <utility>
 #include <vector>
 
 #include "absl/memory/memory.h"
+#include "api/units/time_delta.h"
 #include "rtc_base/event.h"
 #include "rtc_base/task_queue_for_test.h"
 #include "rtc_base/time_utils.h"
@@ -29,6 +31,7 @@
 namespace rtc {
 
 namespace {
+using ::webrtc::TimeDelta;
 // Noop on all platforms except Windows, where it turns on high precision
 // multimedia timers which increases the precision of TimeMillis() while in
 // scope.
@@ -66,9 +69,8 @@
   webrtc::TaskQueueForTest queue(kQueueName, TaskQueue::Priority::HIGH);
 
   uint32_t start = Time();
-  queue.PostDelayedTask(
-      webrtc::ToQueuedTask([&event, &queue] { CheckCurrent(&event, &queue); }),
-      3);
+  queue.PostDelayedTask([&event, &queue] { CheckCurrent(&event, &queue); },
+                        TimeDelta::Millis(3));
   EXPECT_TRUE(event.Wait(1000));
   uint32_t end = TimeMillis();
   // These tests are a little relaxed due to how "powerful" our test bots can
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index bd14a9f..5f21ffe 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1563,7 +1563,6 @@
           "../api:field_trials_view",
           "../api:sequence_checker",
           "../api/task_queue:pending_task_safety_flag",
-          "../api/task_queue:to_queued_task",
           "../rtc_base",
           "../rtc_base:logging",
           "../rtc_base:macromagic",
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index e35e4e3..f082bd3 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -583,7 +583,6 @@
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
       "../../api/task_queue:pending_task_safety_flag",
-      "../../api/task_queue:to_queued_task",
       "../../rtc_base",
       "../../rtc_base:checks",
       "../../rtc_base:ip_address",
@@ -675,7 +674,6 @@
       "../../api:media_stream_interface",
       "../../api:sequence_checker",
       "../../api/task_queue",
-      "../../api/task_queue:to_queued_task",
       "../../api/video:encoded_image",
       "../../api/video:render_resolution",
       "../../api/video:video_frame",
diff --git a/sdk/android/src/jni/android_network_monitor.cc b/sdk/android/src/jni/android_network_monitor.cc
index 8b2e6c5..539d414 100644
--- a/sdk/android/src/jni/android_network_monitor.cc
+++ b/sdk/android/src/jni/android_network_monitor.cc
@@ -19,7 +19,6 @@
 #endif
 
 #include "api/sequence_checker.h"
-#include "api/task_queue/to_queued_task.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/ip_address.h"
 #include "rtc_base/logging.h"
@@ -631,7 +630,7 @@
 void AndroidNetworkMonitor::NotifyConnectionTypeChanged(
     JNIEnv* env,
     const JavaRef<jobject>& j_caller) {
-  network_thread_->PostTask(ToQueuedTask(safety_flag_, [this] {
+  network_thread_->PostTask(SafeTask(safety_flag_, [this] {
     RTC_LOG(LS_INFO)
         << "Android network monitor detected connection type change.";
     InvokeNetworksChangedCallback();
@@ -654,8 +653,8 @@
     const JavaRef<jobject>& j_network_info) {
   NetworkInformation network_info =
       GetNetworkInformationFromJava(env, j_network_info);
-  network_thread_->PostTask(ToQueuedTask(
-      safety_flag_, [this, network_info = std::move(network_info)] {
+  network_thread_->PostTask(
+      SafeTask(safety_flag_, [this, network_info = std::move(network_info)] {
         OnNetworkConnected_n(network_info);
       }));
 }
@@ -664,7 +663,7 @@
     JNIEnv* env,
     const JavaRef<jobject>& j_caller,
     jlong network_handle) {
-  network_thread_->PostTask(ToQueuedTask(safety_flag_, [this, network_handle] {
+  network_thread_->PostTask(SafeTask(safety_flag_, [this, network_handle] {
     OnNetworkDisconnected_n(static_cast<NetworkHandle>(network_handle));
   }));
 }
@@ -678,9 +677,9 @@
   rtc::NetworkPreference preference =
       static_cast<rtc::NetworkPreference>(jpreference);
 
-  network_thread_->PostTask(ToQueuedTask(
-      safety_flag_,
-      [this, type, preference] { OnNetworkPreference_n(type, preference); }));
+  network_thread_->PostTask(SafeTask(safety_flag_, [this, type, preference] {
+    OnNetworkPreference_n(type, preference);
+  }));
 }
 
 }  // namespace jni
diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc
index bd40d77..c23ab1e 100644
--- a/sdk/android/src/jni/video_encoder_wrapper.cc
+++ b/sdk/android/src/jni/video_encoder_wrapper.cc
@@ -12,7 +12,6 @@
 
 #include <utility>
 
-#include "api/task_queue/to_queued_task.h"
 #include "common_video/h264/h264_common.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "modules/video_coding/include/video_error_codes.h"
diff --git a/sdk/objc/native/src/objc_network_monitor.mm b/sdk/objc/native/src/objc_network_monitor.mm
index 3afa2e6..535548c 100644
--- a/sdk/objc/native/src/objc_network_monitor.mm
+++ b/sdk/objc/native/src/objc_network_monitor.mm
@@ -11,8 +11,6 @@
 #include "sdk/objc/native/src/objc_network_monitor.h"
 #include "absl/strings/string_view.h"
 
-#include "api/task_queue/to_queued_task.h"
-
 #include <algorithm>
 
 #include "rtc_base/logging.h"
@@ -87,7 +85,7 @@
 void ObjCNetworkMonitor::OnPathUpdate(
     std::map<std::string, rtc::AdapterType, rtc::AbslStringViewCmp> adapter_type_by_name) {
   RTC_DCHECK(network_monitor_ != nil);
-  thread_->PostTask(ToQueuedTask(safety_flag_, [this, adapter_type_by_name] {
+  thread_->PostTask(SafeTask(safety_flag_, [this, adapter_type_by_name] {
     RTC_DCHECK_RUN_ON(thread_);
     adapter_type_by_name_ = adapter_type_by_name;
     InvokeNetworksChangedCallback();
diff --git a/video/video_stream_decoder_impl.cc b/video/video_stream_decoder_impl.cc
index 91be5a0..fdc79eb 100644
--- a/video/video_stream_decoder_impl.cc
+++ b/video/video_stream_decoder_impl.cc
@@ -12,7 +12,6 @@
 
 #include <memory>
 
-#include "api/task_queue/queued_task.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/mod_ops.h"
 #include "rtc_base/time_utils.h"
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index 23dc28a..91e5fb7 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -22,7 +22,6 @@
 #include "absl/types/optional.h"
 #include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/video/encoded_image.h"
 #include "api/video/i420_buffer.h"