// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_RENDERER_MEDIA_RECORDER_AUDIO_TRACK_OPUS_ENCODER_H_
#define CONTENT_RENDERER_MEDIA_RECORDER_AUDIO_TRACK_OPUS_ENCODER_H_

#include <memory>

#include "base/macros.h"
#include "base/time/time.h"
#include "content/renderer/media_recorder/audio_track_encoder.h"
#include "media/base/audio_bus.h"
#include "media/base/audio_converter.h"
#include "media/base/audio_fifo.h"
#include "media/base/audio_parameters.h"
#include "third_party/opus/src/include/opus.h"

namespace content {

// Class encapsulating Opus-related encoding details. It contains an
// AudioConverter to adapt incoming data to the format Opus likes to have.
class AudioTrackOpusEncoder : public AudioTrackEncoder,
                              public media::AudioConverter::InputCallback {
 public:
  AudioTrackOpusEncoder(OnEncodedAudioCB on_encoded_audio_cb,
                        int32_t bits_per_second);

  void OnSetFormat(const media::AudioParameters& params) override;
  void EncodeAudio(std::unique_ptr<media::AudioBus> input_bus,
                   base::TimeTicks capture_time) override;

 private:
  ~AudioTrackOpusEncoder() override;

  bool is_initialized() const { return !!opus_encoder_; }

  void DestroyExistingOpusEncoder();

  // media::AudioConverted::InputCallback implementation.
  double ProvideInput(media::AudioBus* audio_bus,
                      uint32_t frames_delayed) override;

  // Target bitrate for Opus. If 0, Opus provide automatic bitrate is used.
  const int32_t bits_per_second_;

  // Output parameters after audio conversion. This differs from the input
  // parameters only in sample_rate() and frames_per_buffer(): output should be
  // 48ksamples/s and 2880, respectively.
  media::AudioParameters converted_params_;

  // Sample rate adapter from the input audio to what OpusEncoder desires.
  std::unique_ptr<media::AudioConverter> converter_;

  // Buffer for holding the original input audio before it goes to the
  // converter.
  std::unique_ptr<media::AudioFifo> fifo_;

  // Buffer for passing AudioBus data from the converter to the encoder.
  std::unique_ptr<float[]> buffer_;

  OpusEncoder* opus_encoder_;

  DISALLOW_COPY_AND_ASSIGN(AudioTrackOpusEncoder);
};

}  // namespace content

#endif  // CONTENT_RENDERER_MEDIA_RECORDER_AUDIO_TRACK_OPUS_ENCODER_H_
