audio_encoder_opus.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_
  5. #define REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_
  6. #include "base/memory/raw_ptr.h"
  7. #include "remoting/codec/audio_encoder.h"
  8. #include <stdint.h>
  9. #include "remoting/proto/audio.pb.h"
  10. struct OpusEncoder;
  11. namespace media {
  12. class AudioBus;
  13. class MultiChannelResampler;
  14. } // namespace media
  15. namespace remoting {
  16. class AudioPacket;
  17. class AudioEncoderOpus : public AudioEncoder {
  18. public:
  19. AudioEncoderOpus();
  20. AudioEncoderOpus(const AudioEncoderOpus&) = delete;
  21. AudioEncoderOpus& operator=(const AudioEncoderOpus&) = delete;
  22. ~AudioEncoderOpus() override;
  23. // AudioEncoder interface.
  24. std::unique_ptr<AudioPacket> Encode(
  25. std::unique_ptr<AudioPacket> packet) override;
  26. int GetBitrate() override;
  27. private:
  28. void InitEncoder();
  29. void DestroyEncoder();
  30. bool ResetForPacket(AudioPacket* packet);
  31. void FetchBytesToResample(int resampler_frame_delay,
  32. media::AudioBus* audio_bus);
  33. int sampling_rate_;
  34. AudioPacket::Channels channels_;
  35. raw_ptr<OpusEncoder> encoder_;
  36. int frame_size_;
  37. std::unique_ptr<media::MultiChannelResampler> resampler_;
  38. std::unique_ptr<char[]> resample_buffer_;
  39. std::unique_ptr<media::AudioBus> resampler_bus_;
  40. // Used to pass packet to the FetchBytesToResampler() callback.
  41. const char* resampling_data_;
  42. int resampling_data_size_;
  43. int resampling_data_pos_;
  44. // Left-over unencoded samples from the previous AudioPacket.
  45. std::unique_ptr<int16_t[]> leftover_buffer_;
  46. int leftover_buffer_size_;
  47. int leftover_samples_;
  48. };
  49. } // namespace remoting
  50. #endif // REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_