• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
ConfigConfig32     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 {
ConfigConfig74     Config() : AudioEncoderPcm::Config(8) {}
75   };
76 
AudioEncoderPcmA(const Config & config)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 {
ConfigConfig96     Config() : AudioEncoderPcm::Config(0) {}
97   };
98 
AudioEncoderPcmU(const Config & config)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