Home | History | Annotate | Download | only in g711
      1 /*
      2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
     12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
     13 
     14 #include <vector>
     15 
     16 #include "webrtc/base/scoped_ptr.h"
     17 #include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
     18 
     19 namespace webrtc {
     20 
     21 class AudioEncoderPcm : public AudioEncoder {
     22  public:
     23   struct Config {
     24    public:
     25     bool IsOk() const;
     26 
     27     int frame_size_ms;
     28     size_t num_channels;
     29     int payload_type;
     30 
     31    protected:
     32     explicit Config(int pt)
     33         : frame_size_ms(20), num_channels(1), payload_type(pt) {}
     34   };
     35 
     36   ~AudioEncoderPcm() override;
     37 
     38   size_t MaxEncodedBytes() const override;
     39   int SampleRateHz() const override;
     40   size_t NumChannels() const override;
     41   size_t Num10MsFramesInNextPacket() const override;
     42   size_t Max10MsFramesInAPacket() const override;
     43   int GetTargetBitrate() const override;
     44   EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
     45                              rtc::ArrayView<const int16_t> audio,
     46                              size_t max_encoded_bytes,
     47                              uint8_t* encoded) override;
     48   void Reset() override;
     49 
     50  protected:
     51   AudioEncoderPcm(const Config& config, int sample_rate_hz);
     52 
     53   virtual size_t EncodeCall(const int16_t* audio,
     54                             size_t input_len,
     55                             uint8_t* encoded) = 0;
     56 
     57   virtual size_t BytesPerSample() const = 0;
     58 
     59  private:
     60   const int sample_rate_hz_;
     61   const size_t num_channels_;
     62   const int payload_type_;
     63   const size_t num_10ms_frames_per_packet_;
     64   const size_t full_frame_samples_;
     65   std::vector<int16_t> speech_buffer_;
     66   uint32_t first_timestamp_in_buffer_;
     67 };
     68 
     69 struct CodecInst;
     70 
     71 class AudioEncoderPcmA final : public AudioEncoderPcm {
     72  public:
     73   struct Config : public AudioEncoderPcm::Config {
     74     Config() : AudioEncoderPcm::Config(8) {}
     75   };
     76 
     77   explicit AudioEncoderPcmA(const Config& config)
     78       : AudioEncoderPcm(config, kSampleRateHz) {}
     79   explicit AudioEncoderPcmA(const CodecInst& codec_inst);
     80 
     81  protected:
     82   size_t EncodeCall(const int16_t* audio,
     83                     size_t input_len,
     84                     uint8_t* encoded) override;
     85 
     86   size_t BytesPerSample() const override;
     87 
     88  private:
     89   static const int kSampleRateHz = 8000;
     90   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA);
     91 };
     92 
     93 class AudioEncoderPcmU final : public AudioEncoderPcm {
     94  public:
     95   struct Config : public AudioEncoderPcm::Config {
     96     Config() : AudioEncoderPcm::Config(0) {}
     97   };
     98 
     99   explicit AudioEncoderPcmU(const Config& config)
    100       : AudioEncoderPcm(config, kSampleRateHz) {}
    101   explicit AudioEncoderPcmU(const CodecInst& codec_inst);
    102 
    103  protected:
    104   size_t EncodeCall(const int16_t* audio,
    105                     size_t input_len,
    106                     uint8_t* encoded) override;
    107 
    108   size_t BytesPerSample() const override;
    109 
    110  private:
    111   static const int kSampleRateHz = 8000;
    112   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU);
    113 };
    114 
    115 }  // namespace webrtc
    116 
    117 #endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
    118