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
12struct OpusEncoder;
13
14namespace media {
15class AudioBus;
16class MultiChannelResampler;
17}  // namespace media
18
19namespace remoting {
20
21class AudioPacket;
22
23class 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