• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2019 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 MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_IMPL_H_
12 #define MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_IMPL_H_
13 
14 #include <memory>
15 #include <utility>
16 #include <vector>
17 
18 #include "absl/types/optional.h"
19 #include "api/audio_codecs/audio_encoder.h"
20 #include "api/audio_codecs/audio_format.h"
21 #include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
22 #include "api/units/time_delta.h"
23 #include "modules/audio_coding/codecs/opus/opus_interface.h"
24 #include "rtc_base/constructor_magic.h"
25 
26 namespace webrtc {
27 
28 class RtcEventLog;
29 
30 class AudioEncoderMultiChannelOpusImpl final : public AudioEncoder {
31  public:
32   AudioEncoderMultiChannelOpusImpl(
33       const AudioEncoderMultiChannelOpusConfig& config,
34       int payload_type);
35   ~AudioEncoderMultiChannelOpusImpl() override;
36 
37   // Static interface for use by BuiltinAudioEncoderFactory.
GetPayloadName()38   static constexpr const char* GetPayloadName() { return "multiopus"; }
39   static absl::optional<AudioCodecInfo> QueryAudioEncoder(
40       const SdpAudioFormat& format);
41 
42   int SampleRateHz() const override;
43   size_t NumChannels() const override;
44   size_t Num10MsFramesInNextPacket() const override;
45   size_t Max10MsFramesInAPacket() const override;
46   int GetTargetBitrate() const override;
47 
48   void Reset() override;
49   absl::optional<std::pair<TimeDelta, TimeDelta>> GetFrameLengthRange()
50       const override;
51 
52  protected:
53   EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
54                          rtc::ArrayView<const int16_t> audio,
55                          rtc::Buffer* encoded) override;
56 
57  private:
58   static absl::optional<AudioEncoderMultiChannelOpusConfig> SdpToConfig(
59       const SdpAudioFormat& format);
60   static AudioCodecInfo QueryAudioEncoder(
61       const AudioEncoderMultiChannelOpusConfig& config);
62   static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
63       const AudioEncoderMultiChannelOpusConfig&,
64       int payload_type);
65 
66   size_t Num10msFramesPerPacket() const;
67   size_t SamplesPer10msFrame() const;
68   size_t SufficientOutputBufferSize() const;
69   bool RecreateEncoderInstance(
70       const AudioEncoderMultiChannelOpusConfig& config);
71   void SetFrameLength(int frame_length_ms);
72   void SetNumChannelsToEncode(size_t num_channels_to_encode);
73   void SetProjectedPacketLossRate(float fraction);
74 
75   AudioEncoderMultiChannelOpusConfig config_;
76   const int payload_type_;
77   std::vector<int16_t> input_buffer_;
78   OpusEncInst* inst_;
79   uint32_t first_timestamp_in_buffer_;
80   size_t num_channels_to_encode_;
81   int next_frame_length_ms_;
82 
83   friend struct AudioEncoderMultiChannelOpus;
84   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderMultiChannelOpusImpl);
85 };
86 
87 }  // namespace webrtc
88 
89 #endif  // MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_IMPL_H_
90