# Copyright (c) 2017 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.

import("../../webrtc.gni")
if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

rtc_library("audio_codecs_api") {
  visibility = [ "*" ]
  sources = [
    "audio_codec_pair_id.cc",
    "audio_codec_pair_id.h",
    "audio_decoder.cc",
    "audio_decoder.h",
    "audio_decoder_factory.h",
    "audio_decoder_factory_template.h",
    "audio_encoder.cc",
    "audio_encoder.h",
    "audio_encoder_factory.h",
    "audio_encoder_factory_template.h",
    "audio_format.cc",
    "audio_format.h",
  ]
  deps = [
    "..:array_view",
    "..:bitrate_allocation",
    "..:scoped_refptr",
    "../../rtc_base:checks",
    "../../rtc_base:deprecation",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:sanitizer",
    "../../rtc_base/system:rtc_export",
    "../units:time_delta",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_library("builtin_audio_decoder_factory") {
  visibility = [ "*" ]
  allow_poison = [ "audio_codecs" ]
  sources = [
    "builtin_audio_decoder_factory.cc",
    "builtin_audio_decoder_factory.h",
  ]
  deps = [
    ":audio_codecs_api",
    "..:scoped_refptr",
    "../../rtc_base:rtc_base_approved",
    "L16:audio_decoder_L16",
    "g711:audio_decoder_g711",
    "g722:audio_decoder_g722",
    "isac:audio_decoder_isac",
  ]
  defines = []
  if (rtc_include_ilbc) {
    deps += [ "ilbc:audio_decoder_ilbc" ]
    defines += [ "WEBRTC_USE_BUILTIN_ILBC=1" ]
  } else {
    defines += [ "WEBRTC_USE_BUILTIN_ILBC=0" ]
  }
  if (rtc_include_opus) {
    deps += [
      "opus:audio_decoder_multiopus",
      "opus:audio_decoder_opus",
    ]
    defines += [ "WEBRTC_USE_BUILTIN_OPUS=1" ]
  } else {
    defines += [ "WEBRTC_USE_BUILTIN_OPUS=0" ]
  }
}

rtc_library("builtin_audio_encoder_factory") {
  visibility = [ "*" ]
  allow_poison = [ "audio_codecs" ]
  sources = [
    "builtin_audio_encoder_factory.cc",
    "builtin_audio_encoder_factory.h",
  ]
  deps = [
    ":audio_codecs_api",
    "..:scoped_refptr",
    "../../rtc_base:rtc_base_approved",
    "L16:audio_encoder_L16",
    "g711:audio_encoder_g711",
    "g722:audio_encoder_g722",
    "isac:audio_encoder_isac",
  ]
  defines = []
  if (rtc_include_ilbc) {
    deps += [ "ilbc:audio_encoder_ilbc" ]
    defines += [ "WEBRTC_USE_BUILTIN_ILBC=1" ]
  } else {
    defines += [ "WEBRTC_USE_BUILTIN_ILBC=0" ]
  }
  if (rtc_include_opus) {
    deps += [
      "opus:audio_encoder_multiopus",
      "opus:audio_encoder_opus",
    ]
    defines += [ "WEBRTC_USE_BUILTIN_OPUS=1" ]
  } else {
    defines += [ "WEBRTC_USE_BUILTIN_OPUS=0" ]
  }
}

rtc_library("opus_audio_decoder_factory") {
  visibility = [ "*" ]
  allow_poison = [ "audio_codecs" ]
  sources = [
    "opus_audio_decoder_factory.cc",
    "opus_audio_decoder_factory.h",
  ]
  deps = [
    ":audio_codecs_api",
    "..:scoped_refptr",
    "../../rtc_base:rtc_base_approved",
    "opus:audio_decoder_multiopus",
    "opus:audio_decoder_opus",
  ]
}

rtc_library("opus_audio_encoder_factory") {
  visibility = [ "*" ]
  allow_poison = [ "audio_codecs" ]
  sources = [
    "opus_audio_encoder_factory.cc",
    "opus_audio_encoder_factory.h",
  ]
  deps = [
    ":audio_codecs_api",
    "..:scoped_refptr",
    "../../rtc_base:rtc_base_approved",
    "opus:audio_encoder_multiopus",
    "opus:audio_encoder_opus",
  ]
}
