Adding a payload type to AudioEncoder objects

The type is set in the Config struct and is provided in the EncodedInfo
output struct from each Encode() call. The audio_decoder_unittest is
updated to verify correct propagation of the payload type.

BUG=3926
R=kwiberg@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/27299004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7780 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/codecs/audio_encoder.h b/webrtc/modules/audio_coding/codecs/audio_encoder.h
index 6f68d5c..c0790a2 100644
--- a/webrtc/modules/audio_coding/codecs/audio_encoder.h
+++ b/webrtc/modules/audio_coding/codecs/audio_encoder.h
@@ -24,6 +24,7 @@
  public:
   struct EncodedInfo {
     uint32_t encoded_timestamp;
+    int payload_type;
   };
 
   virtual ~AudioEncoder() {}
diff --git a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
index ee8dfeb..7f0cc0d 100644
--- a/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
+++ b/webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
@@ -29,6 +29,7 @@
 
 AudioEncoderPcm::AudioEncoderPcm(const Config& config)
     : num_channels_(config.num_channels),
+      payload_type_(config.payload_type),
       num_10ms_frames_per_packet_(config.frame_size_ms / 10),
       full_frame_samples_(NumSamplesPerFrame(num_channels_,
                                              config.frame_size_ms,
@@ -73,6 +74,7 @@
   int16_t ret = EncodeCall(&speech_buffer_[0], full_frame_samples_, encoded);
   speech_buffer_.clear();
   info->encoded_timestamp = first_timestamp_in_buffer_;
+  info->payload_type = payload_type_;
   if (ret < 0)
     return false;
   *encoded_bytes = static_cast<size_t>(ret);
diff --git a/webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h b/webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h
index b3866f0..71a72c8 100644
--- a/webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h
+++ b/webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h
@@ -20,10 +20,14 @@
 class AudioEncoderPcm : public AudioEncoder {
  public:
   struct Config {
-    Config() : frame_size_ms(20), num_channels(1) {}
-
+   public:
     int frame_size_ms;
     int num_channels;
+    int payload_type;
+
+   protected:
+    explicit Config(int pt)
+        : frame_size_ms(20), num_channels(1), payload_type(pt) {}
   };
 
   explicit AudioEncoderPcm(const Config& config);
@@ -49,6 +53,7 @@
  private:
   static const int kSampleRateHz = 8000;
   const int num_channels_;
+  const int payload_type_;
   const int num_10ms_frames_per_packet_;
   const int16_t full_frame_samples_;
   std::vector<int16_t> speech_buffer_;
@@ -57,6 +62,10 @@
 
 class AudioEncoderPcmA : public AudioEncoderPcm {
  public:
+  struct Config : public AudioEncoderPcm::Config {
+    Config() : AudioEncoderPcm::Config(8) {}
+  };
+
   explicit AudioEncoderPcmA(const Config& config) : AudioEncoderPcm(config) {}
 
  protected:
@@ -67,6 +76,10 @@
 
 class AudioEncoderPcmU : public AudioEncoderPcm {
  public:
+  struct Config : public AudioEncoderPcm::Config {
+    Config() : AudioEncoderPcm::Config(0) {}
+  };
+
   explicit AudioEncoderPcmU(const Config& config) : AudioEncoderPcm(config) {}
 
  protected:
diff --git a/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc b/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
index ccc6c77..d64f830 100644
--- a/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
+++ b/webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
@@ -33,6 +33,7 @@
 
 AudioEncoderG722::AudioEncoderG722(const Config& config)
     : num_channels_(config.num_channels),
+      payload_type_(config.payload_type),
       num_10ms_frames_per_packet_(config.frame_size_ms / 10),
       num_10ms_frames_buffered_(0),
       first_timestamp_in_buffer_(0),
@@ -113,6 +114,7 @@
   }
   *encoded_bytes = samples_per_channel / 2 * num_channels_;
   info->encoded_timestamp = first_timestamp_in_buffer_;
+  info->payload_type = payload_type_;
   return true;
 }
 
diff --git a/webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h b/webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h
index 8e4de22..51cba7b 100644
--- a/webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h
+++ b/webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h
@@ -53,6 +53,7 @@
   };
 
   const int num_channels_;
+  const int payload_type_;
   const int num_10ms_frames_per_packet_;
   int num_10ms_frames_buffered_;
   uint32_t first_timestamp_in_buffer_;
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
index d7ca1a4..35261bc 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -36,7 +36,9 @@
 
 }  // namespace
 
-AudioEncoderOpus::Config::Config() : frame_size_ms(20), num_channels(1) {}
+AudioEncoderOpus::Config::Config()
+    : frame_size_ms(20), num_channels(1), payload_type(120) {
+}
 
 bool AudioEncoderOpus::Config::IsOk() const {
   if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
@@ -49,6 +51,7 @@
 AudioEncoderOpus::AudioEncoderOpus(const Config& config)
     : num_10ms_frames_per_packet_(DivExact(config.frame_size_ms, 10)),
       num_channels_(config.num_channels),
+      payload_type_(config.payload_type),
       samples_per_10ms_frame_(DivExact(kSampleRateHz, 100) * num_channels_) {
   CHECK(config.IsOk());
   input_buffer_.reserve(num_10ms_frames_per_packet_ * samples_per_10ms_frame_);
@@ -98,6 +101,7 @@
     return false;
   *encoded_bytes = r;
   info->encoded_timestamp = first_timestamp_in_buffer_;
+  info->payload_type = payload_type_;
   return true;
 }
 
diff --git a/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h b/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
index 2071c0f..3cbb25b 100644
--- a/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
+++ b/webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h
@@ -25,6 +25,7 @@
     bool IsOk() const;
     int frame_size_ms;
     int num_channels;
+    int payload_type;
   };
 
   explicit AudioEncoderOpus(const Config& config);
@@ -45,6 +46,7 @@
  private:
   const int num_10ms_frames_per_packet_;
   const int num_channels_;
+  const int payload_type_;
   const int samples_per_10ms_frame_;
   std::vector<int16_t> input_buffer_;
   OpusEncInst* inst_;
diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc
index 191e81a..bbcf9ed 100644
--- a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc
@@ -102,6 +102,7 @@
         data_length_(0),
         encoded_bytes_(0),
         channels_(1),
+        payload_type_(17),
         decoder_(NULL) {}
 
   virtual ~AudioDecoderTest() {}
@@ -153,6 +154,7 @@
           0, interleaved_input.get(), audio_encoder_->sample_rate_hz() / 100,
           data_length_ * 2, output, &enc_len_bytes, &encoded_info_));
     }
+    EXPECT_EQ(payload_type_, encoded_info_.payload_type);
     return static_cast<int>(enc_len_bytes);
   }
 
@@ -262,6 +264,7 @@
   size_t data_length_;
   size_t encoded_bytes_;
   size_t channels_;
+  const int payload_type_;
   AudioEncoder::EncodedInfo encoded_info_;
   AudioDecoder* decoder_;
   scoped_ptr<AudioEncoder> audio_encoder_;
@@ -275,6 +278,7 @@
     decoder_ = new AudioDecoderPcmU;
     AudioEncoderPcmU::Config config;
     config.frame_size_ms = static_cast<int>(frame_size_ / 8);
+    config.payload_type = payload_type_;
     audio_encoder_.reset(new AudioEncoderPcmU(config));
   }
 };
@@ -287,6 +291,7 @@
     decoder_ = new AudioDecoderPcmA;
     AudioEncoderPcmA::Config config;
     config.frame_size_ms = static_cast<int>(frame_size_ / 8);
+    config.payload_type = payload_type_;
     audio_encoder_.reset(new AudioEncoderPcmA(config));
   }
 };
@@ -485,6 +490,7 @@
     assert(decoder_);
     AudioEncoderG722::Config config;
     config.frame_size_ms = 10;
+    config.payload_type = payload_type_;
     config.num_channels = 1;
     audio_encoder_.reset(new AudioEncoderG722(config));
   }
@@ -501,6 +507,7 @@
     assert(decoder_);
     AudioEncoderG722::Config config;
     config.frame_size_ms = 10;
+    config.payload_type = payload_type_;
     config.num_channels = 2;
     audio_encoder_.reset(new AudioEncoderG722(config));
   }
@@ -586,6 +593,7 @@
     decoder_ = new AudioDecoderOpus(1);
     AudioEncoderOpus::Config config;
     config.frame_size_ms = static_cast<int>(frame_size_) / 48;
+    config.payload_type = payload_type_;
     audio_encoder_.reset(new AudioEncoderOpus(config));
   }
 };
@@ -599,6 +607,7 @@
     AudioEncoderOpus::Config config;
     config.frame_size_ms = static_cast<int>(frame_size_) / 48;
     config.num_channels = 2;
+    config.payload_type = payload_type_;
     audio_encoder_.reset(new AudioEncoderOpus(config));
   }
 };