Home | History | Annotate | Download | only in codec
      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