/*
 *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_CODEC_MANAGER_H_
#define WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_CODEC_MANAGER_H_

#include "webrtc/base/constructormagic.h"
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/modules/audio_coding/main/acm2/codec_owner.h"
#include "webrtc/modules/audio_coding/main/include/audio_coding_module_typedefs.h"
#include "webrtc/common_types.h"

namespace webrtc {

class AudioDecoder;
class AudioEncoder;

namespace acm2 {

class CodecManager final {
 public:
  CodecManager();
  ~CodecManager();

  int RegisterEncoder(const CodecInst& send_codec);

  void RegisterEncoder(AudioEncoder* external_speech_encoder);

  int GetCodecInst(CodecInst* current_codec) const;

  bool SetCopyRed(bool enable);

  int SetVAD(bool enable, ACMVADMode mode);

  void VAD(bool* dtx_enabled, bool* vad_enabled, ACMVADMode* mode) const;

  int SetCodecFEC(bool enable_codec_fec);

  // Returns a pointer to AudioDecoder of the given codec. For iSAC, encoding
  // and decoding have to be performed on a shared codec instance. By calling
  // this method, we get the codec instance that ACM owns.
  // If |codec| does not share an instance between encoder and decoder, returns
  // null.
  AudioDecoder* GetAudioDecoder(const CodecInst& codec);

  bool stereo_send() const { return stereo_send_; }

  bool red_enabled() const { return red_enabled_; }

  bool codec_fec_enabled() const { return codec_fec_enabled_; }

  AudioEncoder* CurrentEncoder() { return codec_owner_.Encoder(); }
  const AudioEncoder* CurrentEncoder() const { return codec_owner_.Encoder(); }

  bool CurrentEncoderIsOpus() const { return encoder_is_opus_; }

 private:
  int CngPayloadType(int sample_rate_hz) const;

  int RedPayloadType(int sample_rate_hz) const;

  rtc::ThreadChecker thread_checker_;
  uint8_t cng_nb_pltype_;
  uint8_t cng_wb_pltype_;
  uint8_t cng_swb_pltype_;
  uint8_t cng_fb_pltype_;
  uint8_t red_nb_pltype_;
  bool stereo_send_;
  bool dtx_enabled_;
  ACMVADMode vad_mode_;
  CodecInst send_codec_inst_;
  bool red_enabled_;
  bool codec_fec_enabled_;
  CodecOwner codec_owner_;
  bool encoder_is_opus_;

  RTC_DISALLOW_COPY_AND_ASSIGN(CodecManager);
};

}  // namespace acm2
}  // namespace webrtc
#endif  // WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_CODEC_MANAGER_H_
