TimestampScaler no longer depends on NetEqDecoder to figure out scaling.

This is still a tiny lie, since it checks for kCodecArbitrary to avoid
scaling a codec with an external decoder, because of missing information
in that case. The main point is still true, though. Once the next CL is
in, removing NetEqDecoder usage completely in DecoderDatabase, another
workaround will be in place for external decoders until we can fully
deprecate them.

BUG=webrtc:5805

Review-Url: https://codereview.webrtc.org/2270063006
Cr-Commit-Position: refs/heads/master@{#13952}
diff --git a/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc b/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
index b228e01..1f28639 100644
--- a/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
+++ b/webrtc/modules/audio_coding/neteq/timestamp_scaler.cc
@@ -11,7 +11,6 @@
 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
 
 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/defines.h"
 #include "webrtc/system_wrappers/include/logging.h"
 
 namespace webrtc {
@@ -43,39 +42,25 @@
     // Payload type is unknown. Do not scale.
     return external_timestamp;
   }
-  switch (info->codec_type) {
-    case NetEqDecoder::kDecoderG722:
-    case NetEqDecoder::kDecoderG722_2ch: {
-      // Use timestamp scaling with factor 2 (two output samples per RTP
-      // timestamp).
-      numerator_ = 2;
-      denominator_ = 1;
-      break;
-    }
-    case NetEqDecoder::kDecoderAVT:
-    case NetEqDecoder::kDecoderCNGnb:
-    case NetEqDecoder::kDecoderCNGwb:
-    case NetEqDecoder::kDecoderCNGswb32kHz:
-    case NetEqDecoder::kDecoderCNGswb48kHz: {
-      // Do not change the timestamp scaling settings for DTMF or CNG.
-      break;
-    }
-    default: {
-      // Do not use timestamp scaling for any other codec.
-      numerator_ = 1;
-      denominator_ = 1;
-      break;
+  if (!(info->IsComfortNoise() || info->IsDtmf())) {
+    // Do not change the timestamp scaling settings for DTMF or CNG.
+    numerator_ = info->SampleRateHz();
+    if (info->codec_type == NetEqDecoder::kDecoderArbitrary) {
+      // We have no format mapping for "arbitrary" external codecs, so we cannot
+      // support timestamp scaling of them.
+      denominator_ = numerator_;
+    } else {
+      denominator_ = info->GetFormat().clockrate_hz;
     }
   }
-
-  if (!(numerator_ == 1 && denominator_ == 1)) {
+  if (numerator_ != denominator_) {
     // We have a scale factor != 1.
     if (!first_packet_received_) {
       external_ref_ = external_timestamp;
       internal_ref_ = external_timestamp;
       first_packet_received_ = true;
     }
-    int64_t external_diff = external_timestamp - external_ref_;
+    const int64_t external_diff = int64_t{external_timestamp} - external_ref_;
     assert(denominator_ > 0);  // Should not be possible.
     external_ref_ = external_timestamp;
     internal_ref_ += (external_diff * numerator_) / denominator_;
@@ -88,11 +73,11 @@
 
 
 uint32_t TimestampScaler::ToExternal(uint32_t internal_timestamp) const {
-  if (!first_packet_received_ || (numerator_ == 1 && denominator_ == 1)) {
+  if (!first_packet_received_ || (numerator_ == denominator_)) {
     // Not initialized, or scale factor is 1.
     return internal_timestamp;
   } else {
-    int64_t internal_diff = internal_timestamp - internal_ref_;
+    const int64_t internal_diff = int64_t{internal_timestamp} - internal_ref_;
     assert(numerator_ > 0);  // Should not be possible.
     // Do not update references in this method.
     // Switch |denominator_| and |numerator_| to convert the other way.