diff --git a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
index 0855dd6..b54fc0b 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc
@@ -209,20 +209,6 @@
 #endif
 };
 
-// Get codec information from database.
-// TODO(tlegrand): replace memcpy with a pointer to the data base memory.
-int ACMCodecDB::Codec(int codec_id, CodecInst* codec_inst) {
-  // Error check to see that codec_id is not out of bounds.
-  if (static_cast<size_t>(codec_id) >= RentACodec::NumberOfCodecs()) {
-    return -1;
-  }
-
-  // Copy database information for the codec to the output.
-  memcpy(codec_inst, &database_[codec_id], sizeof(CodecInst));
-
-  return 0;
-}
-
 // Enumerator for error codes when asking for codec database id.
 enum {
   kInvalidCodec = -10,
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.h b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.h
index e462e45..28f6874 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.h
+++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.h
@@ -27,7 +27,7 @@
 
 // TODO(tlegrand): replace class ACMCodecDB with a namespace.
 class ACMCodecDB {
- public:
+ private:
   // kMaxNumCodecs - Maximum number of codecs that can be activated in one
   //                 build.
   // kMaxNumPacketSize - Maximum number of allowed packet sizes for one codec.
@@ -51,17 +51,6 @@
     int channel_support;
   };
 
-  // Gets codec information from database at the position in database given by
-  // [codec_id].
-  // Input:
-  //   [codec_id] - number that specifies at what position in the database to
-  //                get the information.
-  // Output:
-  //   [codec_inst] - filled with information about the codec.
-  // Return:
-  //   0 if successful, otherwise -1.
-  static int Codec(int codec_id, CodecInst* codec_inst);
-
   // Returns codec id from database, given the information received in the input
   // [codec_inst].
   // Input:
@@ -74,7 +63,6 @@
   static int CodecId(const char* payload_name, int frequency, int channels);
   static int ReceiverCodecNumber(const CodecInst& codec_inst);
 
- private:
   // Databases with information about the supported codecs
   // database_ - stored information about all codecs: payload type, name,
   //             sampling frequency, packet size in samples, default channel
diff --git a/webrtc/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc b/webrtc/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc
index 6434483..dae24a3 100644
--- a/webrtc/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc
+++ b/webrtc/modules/audio_coding/main/acm2/acm_receiver_unittest_oldapi.cc
@@ -88,8 +88,8 @@
   void TearDown() override {}
 
   void InsertOnePacketOfSilence(int codec_id) {
-    CodecInst codec;
-    ACMCodecDB::Codec(codec_id, &codec);
+    CodecInst codec =
+        *RentACodec::CodecInstById(*RentACodec::CodecIdFromIndex(codec_id));
     if (timestamp_ == 0) {  // This is the first time inserting audio.
       ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
     } else {
diff --git a/webrtc/modules/audio_coding/main/acm2/codec_manager.cc b/webrtc/modules/audio_coding/main/acm2/codec_manager.cc
index 4d24505..40a5473 100644
--- a/webrtc/modules/audio_coding/main/acm2/codec_manager.cc
+++ b/webrtc/modules/audio_coding/main/acm2/codec_manager.cc
@@ -39,8 +39,8 @@
     return -1;
   }
 
-  int codec_id = ACMCodecDB::CodecNumber(send_codec);
-  if (codec_id < 0) {
+  auto maybe_codec_id = RentACodec::CodecIdByInst(send_codec);
+  if (!maybe_codec_id) {
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id,
                  "Invalid codec setting for the send codec.");
     return -1;
@@ -53,14 +53,8 @@
     return -1;
   }
 
-  const rtc::Maybe<bool> supported_num_channels = [codec_id, &send_codec] {
-    auto cid = RentACodec::CodecIdFromIndex(codec_id);
-    return cid ? RentACodec::IsSupportedNumChannels(*cid, send_codec.channels)
-               : rtc::Maybe<bool>();
-  }();
-  if (!supported_num_channels)
-    return -1;
-  if (!*supported_num_channels) {
+  if (!RentACodec::IsSupportedNumChannels(*maybe_codec_id, send_codec.channels)
+           .value_or(false)) {
     WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id,
                  "%d number of channels not supportedn for %s.",
                  send_codec.channels, send_codec.plname);
@@ -82,7 +76,7 @@
       return -1;
     }
   }
-  return codec_id;
+  return RentACodec::CodecIndexFromId(*maybe_codec_id).value_or(-1);
 }
 
 bool IsIsac(const CodecInst& codec) {
@@ -251,9 +245,10 @@
   // Check if the codec is already registered as send codec.
   bool new_codec = true;
   if (codec_owner_.Encoder()) {
-    int new_codec_id = ACMCodecDB::CodecNumber(send_codec_inst_);
-    RTC_DCHECK_GE(new_codec_id, 0);
-    new_codec = new_codec_id != codec_id;
+    auto new_codec_id = RentACodec::CodecIdByInst(send_codec_inst_);
+    RTC_DCHECK(new_codec_id);
+    auto old_codec_id = RentACodec::CodecIdFromIndex(codec_id);
+    new_codec = !old_codec_id || *new_codec_id != *old_codec_id;
   }
 
   if (RedPayloadType(send_codec.plfreq) == -1) {
diff --git a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc
index 76dc7bb..2a6c37f 100644
--- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc
+++ b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc
@@ -29,6 +29,11 @@
   return mi ? rtc::Maybe<CodecInst>(Database()[*mi]) : rtc::Maybe<CodecInst>();
 }
 
+rtc::Maybe<RentACodec::CodecId> RentACodec::CodecIdByInst(
+    const CodecInst& codec_inst) {
+  return CodecIdFromIndex(ACMCodecDB::CodecNumber(codec_inst));
+}
+
 rtc::Maybe<CodecInst> RentACodec::CodecInstByParams(const char* payload_name,
                                                     int sampling_freq_hz,
                                                     int channels) {
diff --git a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.h b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.h
index 98052e7..2c85bcf 100644
--- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.h
+++ b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.h
@@ -148,6 +148,7 @@
                                              int sampling_freq_hz,
                                              int channels);
   static rtc::Maybe<CodecInst> CodecInstById(CodecId codec_id);
+  static rtc::Maybe<CodecId> CodecIdByInst(const CodecInst& codec_inst);
   static rtc::Maybe<CodecInst> CodecInstByParams(const char* payload_name,
                                                  int sampling_freq_hz,
                                                  int channels);
