MSE: Modernize base::Bind usage for StreamParser callbacks

Since upcoming changeType() work will refactor some of the current code
that creates and passes callbacks to StreamParser::Init(), this CL
modernizes related base::Bind and base::Callback usage to either
base::Bind{Once,Repeating} and base::{Once,Repeating}Callback.

Note that the encrypted media init data callback is the same underlying
type in StreamParser as in Demuxer, so this CL also modernizes the
binding for the Demuxer version of that type.

base::Bind count in //media: before=1425, after=1384

BUG=714018,751838,605134

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: Ie8c3ef44a836c5bfa3f34ff300da760dd7f552c1
Reviewed-on: https://chromium-review.googlesource.com/1099935
Reviewed-by: Xiaohan Wang <xhwang@chromium.org>
Commit-Queue: Matthew Wolenetz <wolenetz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567507}
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 238db08..a21f29f 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -578,7 +578,7 @@
   // StreamParser interface
   MOCK_METHOD8(
       Init,
-      void(const InitCB& init_cb,
+      void(InitCB init_cb,
            const NewConfigCB& config_cb,
            const NewBuffersCB& new_buffers_cb,
            bool ignore_text_track,
diff --git a/media/base/stream_parser.h b/media/base/stream_parser.h
index 5e56bd0..3eaf979 100644
--- a/media/base/stream_parser.h
+++ b/media/base/stream_parser.h
@@ -73,7 +73,7 @@
 
   // Indicates completion of parser initialization.
   //   params - Stream parameters.
-  typedef base::Callback<void(const InitParameters& params)> InitCB;
+  typedef base::OnceCallback<void(const InitParameters& params)> InitCB;
 
   // Indicates when new stream configurations have been parsed.
   // First parameter - An object containing information about media tracks as
@@ -84,8 +84,8 @@
   // Return value - True if the new configurations are accepted.
   //                False if the new configurations are not supported
   //                and indicates that a parsing error should be signalled.
-  typedef base::Callback<bool(std::unique_ptr<MediaTracks>,
-                              const TextTrackConfigMap&)>
+  typedef base::RepeatingCallback<bool(std::unique_ptr<MediaTracks>,
+                                       const TextTrackConfigMap&)>
       NewConfigCB;
 
   // New stream buffers have been parsed.
@@ -93,19 +93,20 @@
   // Return value - True indicates that the buffers are accepted.
   //                False if something was wrong with the buffers and a parsing
   //                error should be signalled.
-  typedef base::Callback<bool(const BufferQueueMap&)> NewBuffersCB;
+  typedef base::RepeatingCallback<bool(const BufferQueueMap&)> NewBuffersCB;
 
   // Signals the beginning of a new media segment.
-  typedef base::Callback<void()> NewMediaSegmentCB;
+  typedef base::RepeatingCallback<void()> NewMediaSegmentCB;
 
   // Signals the end of a media segment.
-  typedef base::Callback<void()> EndMediaSegmentCB;
+  typedef base::RepeatingCallback<void()> EndMediaSegmentCB;
 
   // A new potentially encrypted stream has been parsed.
   // First parameter - The type of the initialization data associated with the
   //                   stream.
   // Second parameter - The initialization data associated with the stream.
-  typedef base::Callback<void(EmeInitDataType, const std::vector<uint8_t>&)>
+  typedef base::RepeatingCallback<void(EmeInitDataType,
+                                       const std::vector<uint8_t>&)>
       EncryptedMediaInitDataCB;
 
   StreamParser();
@@ -117,7 +118,7 @@
   // start time, and duration. If |ignore_text_track| is true, then no text
   // buffers should be passed later by the parser to |new_buffers_cb|.
   virtual void Init(
-      const InitCB& init_cb,
+      InitCB init_cb,
       const NewConfigCB& config_cb,
       const NewBuffersCB& new_buffers_cb,
       bool ignore_text_track,
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index 13238ef..a25c888 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -669,9 +669,10 @@
   if (codecs == "" && (type == "audio/mpeg" || type == "audio/mp3"))
     expected_sbs_codecs = "mp3";
 
-  source_state->Init(
-      base::Bind(&ChunkDemuxer::OnSourceInitDone, base::Unretained(this), id),
-      expected_sbs_codecs, encrypted_media_init_data_cb_, new_text_track_cb);
+  source_state->Init(base::BindOnce(&ChunkDemuxer::OnSourceInitDone,
+                                    base::Unretained(this), id),
+                     expected_sbs_codecs, encrypted_media_init_data_cb_,
+                     new_text_track_cb);
 
   // TODO(wolenetz): Change to DCHECKs once less verification in release build
   // is needed. See https://crbug.com/786975.
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 9716ff3..57ed245 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -208,8 +208,9 @@
         base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this));
     base::Closure progress_cb =
         base::Bind(&ChunkDemuxerTest::OnProgress, base::Unretained(this));
-    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind(
-        &ChunkDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this));
+    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
+        base::BindRepeating(&ChunkDemuxerTest::OnEncryptedMediaInitData,
+                            base::Unretained(this));
     EXPECT_MEDIA_LOG(
         BufferingByPtsDts(buffering_api_ == BufferingApi::kNewByPts));
     demuxer_.reset(new ChunkDemuxer(open_cb, progress_cb,
diff --git a/media/filters/demuxer_perftest.cc b/media/filters/demuxer_perftest.cc
index 8a11be0a..d1582ab 100644
--- a/media/filters/demuxer_perftest.cc
+++ b/media/filters/demuxer_perftest.cc
@@ -182,7 +182,7 @@
     ASSERT_TRUE(data_source.Initialize(file_path));
 
     Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
-        base::Bind(&OnEncryptedMediaInitData);
+        base::BindRepeating(&OnEncryptedMediaInitData);
     Demuxer::MediaTracksUpdatedCB tracks_updated_cb =
         base::Bind(&OnMediaTracksUpdated);
     FFmpegDemuxer demuxer(base::ThreadTaskRunnerHandle::Get(), &data_source,
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
index 8f04c57..24abaff1 100644
--- a/media/filters/ffmpeg_demuxer_unittest.cc
+++ b/media/filters/ffmpeg_demuxer_unittest.cc
@@ -297,8 +297,9 @@
 
     CreateDataSource(name);
 
-    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind(
-        &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this));
+    Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
+        base::BindRepeating(&FFmpegDemuxerTest::OnEncryptedMediaInitData,
+                            base::Unretained(this));
 
     Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind(
         &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this));
diff --git a/media/filters/source_buffer_state.cc b/media/filters/source_buffer_state.cc
index f6aaed53..9e57f7f1 100644
--- a/media/filters/source_buffer_state.cc
+++ b/media/filters/source_buffer_state.cc
@@ -147,12 +147,12 @@
 }
 
 void SourceBufferState::Init(
-    const StreamParser::InitCB& init_cb,
+    StreamParser::InitCB init_cb,
     const std::string& expected_codecs,
     const StreamParser::EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
     const NewTextTrackCB& new_text_track_cb) {
   DCHECK_EQ(state_, UNINITIALIZED);
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
   new_text_track_cb_ = new_text_track_cb;
 
@@ -177,16 +177,19 @@
 
   state_ = PENDING_PARSER_CONFIG;
   stream_parser_->Init(
-      base::Bind(&SourceBufferState::OnSourceInitDone, base::Unretained(this)),
-      base::Bind(&SourceBufferState::OnNewConfigs, base::Unretained(this),
-                 expected_codecs),
-      base::Bind(&SourceBufferState::OnNewBuffers, base::Unretained(this)),
+      base::BindOnce(&SourceBufferState::OnSourceInitDone,
+                     base::Unretained(this)),
+      base::BindRepeating(&SourceBufferState::OnNewConfigs,
+                          base::Unretained(this), expected_codecs),
+      base::BindRepeating(&SourceBufferState::OnNewBuffers,
+                          base::Unretained(this)),
       new_text_track_cb_.is_null(),
-      base::Bind(&SourceBufferState::OnEncryptedMediaInitData,
-                 base::Unretained(this)),
-      base::Bind(&SourceBufferState::OnNewMediaSegment, base::Unretained(this)),
-      base::Bind(&SourceBufferState::OnEndOfMediaSegment,
-                 base::Unretained(this)),
+      base::BindRepeating(&SourceBufferState::OnEncryptedMediaInitData,
+                          base::Unretained(this)),
+      base::BindRepeating(&SourceBufferState::OnNewMediaSegment,
+                          base::Unretained(this)),
+      base::BindRepeating(&SourceBufferState::OnEndOfMediaSegment,
+                          base::Unretained(this)),
       media_log_);
 }
 
@@ -934,7 +937,7 @@
     const StreamParser::InitParameters& params) {
   DCHECK_EQ(state_, PENDING_PARSER_INIT);
   state_ = PARSER_INITIALIZED;
-  base::ResetAndReturn(&init_cb_).Run(params);
+  std::move(init_cb_).Run(params);
 }
 
 }  // namespace media
diff --git a/media/filters/source_buffer_state.h b/media/filters/source_buffer_state.h
index 630febef..3c5986f 100644
--- a/media/filters/source_buffer_state.h
+++ b/media/filters/source_buffer_state.h
@@ -44,7 +44,7 @@
 
   ~SourceBufferState();
 
-  void Init(const StreamParser::InitCB& init_cb,
+  void Init(StreamParser::InitCB init_cb,
             const std::string& expected_codecs,
             const StreamParser::EncryptedMediaInitDataCB&
                 encrypted_media_init_data_cb,
diff --git a/media/filters/source_buffer_state_unittest.cc b/media/filters/source_buffer_state_unittest.cc
index caa4dd2..8448fef 100644
--- a/media/filters/source_buffer_state_unittest.cc
+++ b/media/filters/source_buffer_state_unittest.cc
@@ -78,13 +78,20 @@
   std::unique_ptr<SourceBufferState> CreateAndInitSourceBufferState(
       const std::string& expected_codecs) {
     std::unique_ptr<SourceBufferState> sbs = CreateSourceBufferState();
+    // Instead of using SaveArg<> to update |new_config_cb_| when mocked Init is
+    // called, we use a lambda because SaveArg<> doesn't work if any of the
+    // mocked method's arguments are move-only type.
     EXPECT_CALL(*mock_stream_parser_, Init(_, _, _, _, _, _, _, _))
-        .WillOnce(SaveArg<1>(&new_config_cb_));
-    sbs->Init(base::Bind(&SourceBufferStateTest::SourceInitDone,
-                         base::Unretained(this)),
+        .WillOnce([&](auto init_cb, auto config_cb, auto new_buffers_cb,
+                      auto ignore_text_track, auto encrypted_media_init_data_cb,
+                      auto new_segment_cb, auto end_of_segment_cb,
+                      auto media_log) { new_config_cb_ = config_cb; });
+    sbs->Init(base::BindOnce(&SourceBufferStateTest::SourceInitDone,
+                             base::Unretained(this)),
               expected_codecs,
-              base::Bind(&SourceBufferStateTest::StreamParserEncryptedInitData,
-                         base::Unretained(this)),
+              base::BindRepeating(
+                  &SourceBufferStateTest::StreamParserEncryptedInitData,
+                  base::Unretained(this)),
               base::Bind(&SourceBufferStateTest::StreamParserNewTextTrack,
                          base::Unretained(this)));
 
diff --git a/media/formats/common/stream_parser_test_base.cc b/media/formats/common/stream_parser_test_base.cc
index 9845570..24cc64cb 100644
--- a/media/formats/common/stream_parser_test_base.cc
+++ b/media/formats/common/stream_parser_test_base.cc
@@ -37,13 +37,18 @@
     std::unique_ptr<StreamParser> stream_parser)
     : parser_(std::move(stream_parser)) {
   parser_->Init(
-      base::Bind(&StreamParserTestBase::OnInitDone, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewConfig, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewBuffers, base::Unretained(this)),
+      base::BindOnce(&StreamParserTestBase::OnInitDone, base::Unretained(this)),
+      base::BindRepeating(&StreamParserTestBase::OnNewConfig,
+                          base::Unretained(this)),
+      base::BindRepeating(&StreamParserTestBase::OnNewBuffers,
+                          base::Unretained(this)),
       true,
-      base::Bind(&StreamParserTestBase::OnKeyNeeded, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnNewSegment, base::Unretained(this)),
-      base::Bind(&StreamParserTestBase::OnEndOfSegment, base::Unretained(this)),
+      base::BindRepeating(&StreamParserTestBase::OnKeyNeeded,
+                          base::Unretained(this)),
+      base::BindRepeating(&StreamParserTestBase::OnNewSegment,
+                          base::Unretained(this)),
+      base::BindRepeating(&StreamParserTestBase::OnEndOfSegment,
+                          base::Unretained(this)),
       &media_log_);
 }
 
diff --git a/media/formats/mp2t/mp2t_stream_parser.cc b/media/formats/mp2t/mp2t_stream_parser.cc
index ddb3ae3..b9c4b73 100644
--- a/media/formats/mp2t/mp2t_stream_parser.cc
+++ b/media/formats/mp2t/mp2t_stream_parser.cc
@@ -204,7 +204,7 @@
 }
 
 void Mp2tStreamParser::Init(
-    const InitCB& init_cb,
+    InitCB init_cb,
     const NewConfigCB& config_cb,
     const NewBuffersCB& new_buffers_cb,
     bool /* ignore_text_tracks */,
@@ -221,7 +221,7 @@
   DCHECK(!new_segment_cb.is_null());
   DCHECK(!end_of_segment_cb.is_null());
 
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   config_cb_ = config_cb;
   new_buffers_cb_ = new_buffers_cb;
   encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
@@ -703,7 +703,7 @@
       queue_with_config.audio_config.IsValidConfig() ? 1 : 0;
   params.detected_video_track_count =
       queue_with_config.video_config.IsValidConfig() ? 1 : 0;
-  base::ResetAndReturn(&init_cb_).Run(params);
+  std::move(init_cb_).Run(params);
   is_initialized_ = true;
 
   return true;
diff --git a/media/formats/mp2t/mp2t_stream_parser.h b/media/formats/mp2t/mp2t_stream_parser.h
index 0c22595..994150c 100644
--- a/media/formats/mp2t/mp2t_stream_parser.h
+++ b/media/formats/mp2t/mp2t_stream_parser.h
@@ -40,7 +40,7 @@
   ~Mp2tStreamParser() override;
 
   // StreamParser implementation.
-  void Init(const InitCB& init_cb,
+  void Init(InitCB init_cb,
             const NewConfigCB& config_cb,
             const NewBuffersCB& new_buffers_cb,
             bool ignore_text_tracks,
diff --git a/media/formats/mp2t/mp2t_stream_parser_unittest.cc b/media/formats/mp2t/mp2t_stream_parser_unittest.cc
index 1b80fe7..f3189e9 100644
--- a/media/formats/mp2t/mp2t_stream_parser_unittest.cc
+++ b/media/formats/mp2t/mp2t_stream_parser_unittest.cc
@@ -355,14 +355,18 @@
 
   void InitializeParser() {
     parser_->Init(
-        base::Bind(&Mp2tStreamParserTest::OnInit, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewConfig, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewBuffers, base::Unretained(this)),
+        base::BindOnce(&Mp2tStreamParserTest::OnInit, base::Unretained(this)),
+        base::BindRepeating(&Mp2tStreamParserTest::OnNewConfig,
+                            base::Unretained(this)),
+        base::BindRepeating(&Mp2tStreamParserTest::OnNewBuffers,
+                            base::Unretained(this)),
         true,
-        base::Bind(&Mp2tStreamParserTest::OnKeyNeeded, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnNewSegment, base::Unretained(this)),
-        base::Bind(&Mp2tStreamParserTest::OnEndOfSegment,
-                   base::Unretained(this)),
+        base::BindRepeating(&Mp2tStreamParserTest::OnKeyNeeded,
+                            base::Unretained(this)),
+        base::BindRepeating(&Mp2tStreamParserTest::OnNewSegment,
+                            base::Unretained(this)),
+        base::BindRepeating(&Mp2tStreamParserTest::OnEndOfSegment,
+                            base::Unretained(this)),
         &media_log_);
   }
 
diff --git a/media/formats/mp4/mp4_stream_parser.cc b/media/formats/mp4/mp4_stream_parser.cc
index 3326bb6..dc7645a 100644
--- a/media/formats/mp4/mp4_stream_parser.cc
+++ b/media/formats/mp4/mp4_stream_parser.cc
@@ -96,7 +96,7 @@
 MP4StreamParser::~MP4StreamParser() = default;
 
 void MP4StreamParser::Init(
-    const InitCB& init_cb,
+    InitCB init_cb,
     const NewConfigCB& config_cb,
     const NewBuffersCB& new_buffers_cb,
     bool /* ignore_text_tracks */,
@@ -114,7 +114,7 @@
   DCHECK(!end_of_segment_cb.is_null());
 
   ChangeState(kParsingBoxes);
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   config_cb_ = config_cb;
   new_buffers_cb_ = new_buffers_cb;
   encrypted_media_init_data_cb_ = encrypted_media_init_data_cb;
@@ -632,7 +632,7 @@
     params.detected_audio_track_count = detected_audio_track_count;
     params.detected_video_track_count = detected_video_track_count;
     params.detected_text_track_count = detected_text_track_count;
-    base::ResetAndReturn(&init_cb_).Run(params);
+    std::move(init_cb_).Run(params);
   }
 
   return true;
diff --git a/media/formats/mp4/mp4_stream_parser.h b/media/formats/mp4/mp4_stream_parser.h
index 340149c..45ee6f9 100644
--- a/media/formats/mp4/mp4_stream_parser.h
+++ b/media/formats/mp4/mp4_stream_parser.h
@@ -39,7 +39,7 @@
                   bool has_flac);
   ~MP4StreamParser() override;
 
-  void Init(const InitCB& init_cb,
+  void Init(InitCB init_cb,
             const NewConfigCB& config_cb,
             const NewBuffersCB& new_buffers_cb,
             bool ignore_text_tracks,
diff --git a/media/formats/mp4/mp4_stream_parser_unittest.cc b/media/formats/mp4/mp4_stream_parser_unittest.cc
index 74bb9d9..5ce3fd8 100644
--- a/media/formats/mp4/mp4_stream_parser_unittest.cc
+++ b/media/formats/mp4/mp4_stream_parser_unittest.cc
@@ -185,15 +185,20 @@
 
   void InitializeParserWithInitParametersExpectations(
       StreamParser::InitParameters params) {
-    parser_->Init(
-        base::Bind(&MP4StreamParserTest::InitF, base::Unretained(this), params),
-        base::Bind(&MP4StreamParserTest::NewConfigF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::NewBuffersF, base::Unretained(this)),
-        true,
-        base::Bind(&MP4StreamParserTest::KeyNeededF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::NewSegmentF, base::Unretained(this)),
-        base::Bind(&MP4StreamParserTest::EndOfSegmentF, base::Unretained(this)),
-        &media_log_);
+    parser_->Init(base::BindOnce(&MP4StreamParserTest::InitF,
+                                 base::Unretained(this), params),
+                  base::BindRepeating(&MP4StreamParserTest::NewConfigF,
+                                      base::Unretained(this)),
+                  base::BindRepeating(&MP4StreamParserTest::NewBuffersF,
+                                      base::Unretained(this)),
+                  true,
+                  base::BindRepeating(&MP4StreamParserTest::KeyNeededF,
+                                      base::Unretained(this)),
+                  base::BindRepeating(&MP4StreamParserTest::NewSegmentF,
+                                      base::Unretained(this)),
+                  base::BindRepeating(&MP4StreamParserTest::EndOfSegmentF,
+                                      base::Unretained(this)),
+                  &media_log_);
   }
 
   StreamParser::InitParameters GetDefaultInitParametersExpectations() {
diff --git a/media/formats/mpeg/mpeg_audio_stream_parser_base.cc b/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
index d5f8b54a..5d79104 100644
--- a/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
+++ b/media/formats/mpeg/mpeg_audio_stream_parser_base.cc
@@ -62,7 +62,7 @@
 MPEGAudioStreamParserBase::~MPEGAudioStreamParserBase() = default;
 
 void MPEGAudioStreamParserBase::Init(
-    const InitCB& init_cb,
+    InitCB init_cb,
     const NewConfigCB& config_cb,
     const NewBuffersCB& new_buffers_cb,
     bool ignore_text_tracks,
@@ -72,7 +72,7 @@
     MediaLog* media_log) {
   DVLOG(1) << __func__;
   DCHECK_EQ(state_, UNINITIALIZED);
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   config_cb_ = config_cb;
   new_buffers_cb_ = new_buffers_cb;
   new_segment_cb_ = new_segment_cb;
@@ -233,7 +233,7 @@
     if (!init_cb_.is_null()) {
       InitParameters params(kInfiniteDuration);
       params.detected_audio_track_count = 1;
-      base::ResetAndReturn(&init_cb_).Run(params);
+      std::move(init_cb_).Run(params);
     }
   }
 
diff --git a/media/formats/mpeg/mpeg_audio_stream_parser_base.h b/media/formats/mpeg/mpeg_audio_stream_parser_base.h
index 0271b41..42495dc 100644
--- a/media/formats/mpeg/mpeg_audio_stream_parser_base.h
+++ b/media/formats/mpeg/mpeg_audio_stream_parser_base.h
@@ -34,7 +34,7 @@
   ~MPEGAudioStreamParserBase() override;
 
   // StreamParser implementation.
-  void Init(const InitCB& init_cb,
+  void Init(InitCB init_cb,
             const NewConfigCB& config_cb,
             const NewBuffersCB& new_buffers_cb,
             bool ignore_text_tracks,
diff --git a/media/formats/webm/webm_stream_parser.cc b/media/formats/webm/webm_stream_parser.cc
index 7886a50d..ee899fe 100644
--- a/media/formats/webm/webm_stream_parser.cc
+++ b/media/formats/webm/webm_stream_parser.cc
@@ -30,7 +30,7 @@
 WebMStreamParser::~WebMStreamParser() = default;
 
 void WebMStreamParser::Init(
-    const InitCB& init_cb,
+    InitCB init_cb,
     const NewConfigCB& config_cb,
     const NewBuffersCB& new_buffers_cb,
     bool ignore_text_tracks,
@@ -48,7 +48,7 @@
   DCHECK(!end_of_segment_cb.is_null());
 
   ChangeState(kParsingHeaders);
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   config_cb_ = config_cb;
   new_buffers_cb_ = new_buffers_cb;
   ignore_text_tracks_ = ignore_text_tracks;
@@ -253,7 +253,7 @@
         tracks_parser.detected_video_track_count();
     params.detected_text_track_count =
         tracks_parser.detected_text_track_count();
-    base::ResetAndReturn(&init_cb_).Run(params);
+    std::move(init_cb_).Run(params);
   }
 
   return bytes_parsed;
diff --git a/media/formats/webm/webm_stream_parser.h b/media/formats/webm/webm_stream_parser.h
index 496dfb7..dc0b916 100644
--- a/media/formats/webm/webm_stream_parser.h
+++ b/media/formats/webm/webm_stream_parser.h
@@ -28,7 +28,7 @@
   ~WebMStreamParser() override;
 
   // StreamParser implementation.
-  void Init(const InitCB& init_cb,
+  void Init(InitCB init_cb,
             const NewConfigCB& config_cb,
             const NewBuffersCB& new_buffers_cb,
             bool ignore_text_tracks,
diff --git a/media/formats/webm/webm_stream_parser_unittest.cc b/media/formats/webm/webm_stream_parser_unittest.cc
index cfc3d6fc..c6180d62 100644
--- a/media/formats/webm/webm_stream_parser_unittest.cc
+++ b/media/formats/webm/webm_stream_parser_unittest.cc
@@ -41,18 +41,19 @@
     EXPECT_CALL(*this, NewBuffersCB(_))
         .Times(testing::AnyNumber())
         .WillRepeatedly(testing::Return(true));
-    parser_->Init(
-        base::Bind(&WebMStreamParserTest::InitF, base::Unretained(this),
-                   expected_params),
-        base::Bind(&WebMStreamParserTest::NewConfigCB, base::Unretained(this)),
-        base::Bind(&WebMStreamParserTest::NewBuffersCB, base::Unretained(this)),
-        false,  // don't ignore_text_track
-        encrypted_media_init_data_cb,
-        base::Bind(&WebMStreamParserTest::NewMediaSegmentCB,
-                   base::Unretained(this)),
-        base::Bind(&WebMStreamParserTest::EndMediaSegmentCB,
-                   base::Unretained(this)),
-        &media_log_);
+    parser_->Init(base::BindOnce(&WebMStreamParserTest::InitF,
+                                 base::Unretained(this), expected_params),
+                  base::BindRepeating(&WebMStreamParserTest::NewConfigCB,
+                                      base::Unretained(this)),
+                  base::BindRepeating(&WebMStreamParserTest::NewBuffersCB,
+                                      base::Unretained(this)),
+                  false,  // don't ignore_text_track
+                  encrypted_media_init_data_cb,
+                  base::BindRepeating(&WebMStreamParserTest::NewMediaSegmentCB,
+                                      base::Unretained(this)),
+                  base::BindRepeating(&WebMStreamParserTest::EndMediaSegmentCB,
+                                      base::Unretained(this)),
+                  &media_log_);
     bool result = parser_->Parse(buffer->data(), buffer->data_size());
     EXPECT_TRUE(result);
   }
diff --git a/media/test/mock_media_source.cc b/media/test/mock_media_source.cc
index bbb25ca6..6f32f3b 100644
--- a/media/test/mock_media_source.cc
+++ b/media/test/mock_media_source.cc
@@ -23,8 +23,8 @@
       chunk_demuxer_(new ChunkDemuxer(
           base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)),
           base::DoNothing(),
-          base::Bind(&MockMediaSource::OnEncryptedMediaInitData,
-                     base::Unretained(this)),
+          base::BindRepeating(&MockMediaSource::OnEncryptedMediaInitData,
+                              base::Unretained(this)),
           &media_log_)),
       owned_chunk_demuxer_(chunk_demuxer_) {
   file_data_ = ReadTestDataFile(filename);
@@ -46,8 +46,8 @@
       chunk_demuxer_(new ChunkDemuxer(
           base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)),
           base::DoNothing(),
-          base::Bind(&MockMediaSource::OnEncryptedMediaInitData,
-                     base::Unretained(this)),
+          base::BindRepeating(&MockMediaSource::OnEncryptedMediaInitData,
+                              base::Unretained(this)),
           &media_log_)),
       owned_chunk_demuxer_(chunk_demuxer_) {
   if (initial_append_size_ == kAppendWholeFile)
diff --git a/media/test/pipeline_integration_fuzzertest.cc b/media/test/pipeline_integration_fuzzertest.cc
index 7148e4b..e02a71b 100644
--- a/media/test/pipeline_integration_fuzzertest.cc
+++ b/media/test/pipeline_integration_fuzzertest.cc
@@ -141,7 +141,7 @@
  public:
   ProgressivePipelineIntegrationFuzzerTest() {
     set_encrypted_media_init_data_cb(
-        base::Bind(&OnEncryptedMediaInitData, this));
+        base::BindRepeating(&OnEncryptedMediaInitData, this));
     set_audio_play_delay_cb(
         BindToCurrentLoop(base::BindRepeating(&OnAudioPlayDelay, this)));
   }
@@ -165,7 +165,7 @@
  public:
   MediaSourcePipelineIntegrationFuzzerTest() {
     set_encrypted_media_init_data_cb(
-        base::Bind(&OnEncryptedMediaInitData, this));
+        base::BindRepeating(&OnEncryptedMediaInitData, this));
     set_audio_play_delay_cb(
         BindToCurrentLoop(base::BindRepeating(&OnAudioPlayDelay, this)));
   }
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc
index 017fb44..3f9119d 100644
--- a/media/test/pipeline_integration_test.cc
+++ b/media/test/pipeline_integration_test.cc
@@ -1123,8 +1123,8 @@
 TEST_F(PipelineIntegrationTest, MAYBE_EME(BasicPlaybackEncrypted)) {
   FakeEncryptedMedia encrypted_media(new KeyProvidingApp());
   set_encrypted_media_init_data_cb(
-      base::Bind(&FakeEncryptedMedia::OnEncryptedMediaInitData,
-                 base::Unretained(&encrypted_media)));
+      base::BindRepeating(&FakeEncryptedMedia::OnEncryptedMediaInitData,
+                          base::Unretained(&encrypted_media)));
 
   ASSERT_EQ(PIPELINE_OK, Start("bear-320x240-av_enc-av.webm",
                                encrypted_media.GetCdmContext()));
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc
index af0c3e3..ef0a914d 100644
--- a/media/test/pipeline_integration_test_base.cc
+++ b/media/test/pipeline_integration_test_base.cc
@@ -440,8 +440,9 @@
 #if BUILDFLAG(ENABLE_FFMPEG)
   demuxer_ = std::unique_ptr<Demuxer>(new FFmpegDemuxer(
       scoped_task_environment_.GetMainThreadTaskRunner(), data_source_.get(),
-      base::Bind(&PipelineIntegrationTestBase::DemuxerEncryptedMediaInitDataCB,
-                 base::Unretained(this)),
+      base::BindRepeating(
+          &PipelineIntegrationTestBase::DemuxerEncryptedMediaInitDataCB,
+          base::Unretained(this)),
       base::Bind(&PipelineIntegrationTestBase::DemuxerMediaTracksUpdatedCB,
                  base::Unretained(this)),
       &media_log_));