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 5 #ifndef REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_ 6 #define REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_ 7 8 #include "remoting/codec/audio_encoder.h" 9 10 #include "remoting/proto/audio.pb.h" 11 12 struct OpusEncoder; 13 14 namespace media { 15 class AudioBus; 16 class MultiChannelResampler; 17 } // namespace media 18 19 namespace remoting { 20 21 class AudioPacket; 22 23 class AudioEncoderOpus : public AudioEncoder { 24 public: 25 AudioEncoderOpus(); 26 virtual ~AudioEncoderOpus(); 27 28 // AudioEncoder interface. 29 virtual scoped_ptr<AudioPacket> Encode( 30 scoped_ptr<AudioPacket> packet) OVERRIDE; 31 32 private: 33 void InitEncoder(); 34 void DestroyEncoder(); 35 bool ResetForPacket(AudioPacket* packet); 36 37 void FetchBytesToResample(int resampler_frame_delay, 38 media::AudioBus* audio_bus); 39 40 int sampling_rate_; 41 AudioPacket::Channels channels_; 42 OpusEncoder* encoder_; 43 44 int frame_size_; 45 scoped_ptr<media::MultiChannelResampler> resampler_; 46 scoped_ptr<char[]> resample_buffer_; 47 scoped_ptr<media::AudioBus> resampler_bus_; 48 49 // Used to pass packet to the FetchBytesToResampler() callback. 50 const char* resampling_data_; 51 int resampling_data_size_; 52 int resampling_data_pos_; 53 54 // Left-over unencoded samples from the previous AudioPacket. 55 scoped_ptr<int16[]> leftover_buffer_; 56 int leftover_buffer_size_; 57 int leftover_samples_; 58 59 DISALLOW_COPY_AND_ASSIGN(AudioEncoderOpus); 60 }; 61 62 } // namespace remoting 63 64 #endif // REMOTING_CODEC_AUDIO_ENCODER_OPUS_H_ 65