# Copyright (c) 2016 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("//build/config/linux/pkg_config.gni")
import("../webrtc.gni")

group("media") {
  public_deps = [
    ":rtc_media",
    ":rtc_media_base",
  ]
}

config("rtc_media_defines_config") {
  defines = [
    "HAVE_WEBRTC_VIDEO",
    "HAVE_WEBRTC_VOICE",
  ]
}

config("rtc_media_warnings_config") {
  # GN orders flags on a target before flags from configs. The default config
  # adds these flags so to cancel them out they need to come from a config and
  # cannot be on the target directly.
  if (!is_win) {
    cflags = [ "-Wno-deprecated-declarations" ]
  }
}

rtc_source_set("rtc_h264_profile_id") {
  sources = [
    "base/h264_profile_level_id.cc",
    "base/h264_profile_level_id.h",
  ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  deps = [
    "..:webrtc_common",
    "../api:optional",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_static_library("rtc_media_base") {
  # TODO(kjellander): Remove (bugs.webrtc.org/6828)
  # Enabling GN check triggers cyclic dependency error:
  #   :rtc_media_base ->
  #   ../pc:rtc_pc_base ->
  #   :rtc_data ->
  #   :rtc_media_base
  check_includes = false
  defines = []
  libs = []
  deps = []
  public_deps = []
  sources = [
    "base/adaptedvideotracksource.cc",
    "base/adaptedvideotracksource.h",
    "base/audiosource.h",
    "base/codec.cc",
    "base/codec.h",
    "base/cryptoparams.h",
    "base/device.h",
    "base/mediachannel.h",
    "base/mediaconstants.cc",
    "base/mediaconstants.h",
    "base/mediaengine.cc",
    "base/mediaengine.h",
    "base/rtpdataengine.cc",
    "base/rtpdataengine.h",
    "base/rtputils.cc",
    "base/rtputils.h",
    "base/streamparams.cc",
    "base/streamparams.h",
    "base/turnutils.cc",
    "base/turnutils.h",
    "base/videoadapter.cc",
    "base/videoadapter.h",
    "base/videobroadcaster.cc",
    "base/videobroadcaster.h",
    "base/videocapturer.cc",
    "base/videocapturer.h",
    "base/videocapturerfactory.h",
    "base/videocommon.cc",
    "base/videocommon.h",
    "base/videosourcebase.cc",
    "base/videosourcebase.h",

    # TODO(aleloi): add "base/videosinkinterface.h"
    "base/videosourceinterface.cc",

    # TODO(aleloi): add "base/videosourceinterface.h"
  ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  include_dirs = []
  if (rtc_build_libyuv) {
    deps += [ "$rtc_libyuv_dir" ]
    public_deps += [ "$rtc_libyuv_dir" ]
  } else {
    # Need to add a directory normally exported by libyuv.
    include_dirs += [ "$rtc_libyuv_dir/include" ]
  }

  deps += [
    "..:webrtc_common",
    "../api:libjingle_peerconnection_api",
    "../p2p",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
  ]

  public_deps += [ ":rtc_h264_profile_id" ]

  if (is_nacl) {
    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
  }
}

rtc_static_library("rtc_audio_video") {
  defines = []
  libs = []
  deps = []
  sources = [
    "engine/adm_helpers.cc",
    "engine/adm_helpers.h",
    "engine/apm_helpers.cc",
    "engine/apm_helpers.h",
    "engine/internaldecoderfactory.cc",
    "engine/internaldecoderfactory.h",
    "engine/internalencoderfactory.cc",
    "engine/internalencoderfactory.h",
    "engine/nullwebrtcvideoengine.h",
    "engine/payload_type_mapper.cc",
    "engine/payload_type_mapper.h",
    "engine/scopedvideodecoder.cc",
    "engine/scopedvideodecoder.h",
    "engine/scopedvideoencoder.cc",
    "engine/scopedvideoencoder.h",
    "engine/simulcast.cc",
    "engine/simulcast.h",
    "engine/simulcast_encoder_adapter.cc",
    "engine/simulcast_encoder_adapter.h",
    "engine/videodecodersoftwarefallbackwrapper.cc",
    "engine/videodecodersoftwarefallbackwrapper.h",
    "engine/videoencodersoftwarefallbackwrapper.cc",
    "engine/videoencodersoftwarefallbackwrapper.h",
    "engine/webrtccommon.h",
    "engine/webrtcmediaengine.cc",
    "engine/webrtcmediaengine.h",
    "engine/webrtcvideocapturer.cc",
    "engine/webrtcvideocapturer.h",
    "engine/webrtcvideocapturerfactory.cc",
    "engine/webrtcvideocapturerfactory.h",
    "engine/webrtcvideodecoderfactory.h",
    "engine/webrtcvideoencoderfactory.h",
    "engine/webrtcvideoengine.cc",
    "engine/webrtcvideoengine.h",
    "engine/webrtcvoe.h",
    "engine/webrtcvoiceengine.cc",
    "engine/webrtcvoiceengine.h",
  ]

  configs += [ ":rtc_media_warnings_config" ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  if (is_win) {
    cflags = [
      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
      "/wd4267",  # conversion from "size_t" to "int", possible loss of data.
      "/wd4389",  # signed/unsigned mismatch.
    ]
  }

  if (rtc_enable_intelligibility_enhancer) {
    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
  } else {
    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
  }

  if (rtc_opus_support_120ms_ptime) {
    defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
  } else {
    defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
  }

  include_dirs = []
  if (rtc_build_libyuv) {
    deps += [ "$rtc_libyuv_dir" ]
    public_deps = [
      "$rtc_libyuv_dir",
    ]
  } else {
    # Need to add a directory normally exported by libyuv.
    include_dirs += [ "$rtc_libyuv_dir/include" ]
  }

  public_configs = []
  if (build_with_chromium) {
    deps += [ "../modules/video_capture:video_capture" ]
  } else {
    public_configs += [ ":rtc_media_defines_config" ]
    deps += [ "../modules/video_capture:video_capture_internal_impl" ]
  }
  if (rtc_enable_protobuf) {
    deps += [ "../modules/audio_processing/aec_dump:aec_dump_impl" ]
  } else {
    deps += [ "../modules/audio_processing/aec_dump:null_aec_dump_factory" ]
  }
  deps += [
    ":rtc_media_base",
    "..:webrtc_common",
    "../api:call_api",
    "../api:libjingle_peerconnection_api",
    "../api:optional",
    "../api:transport_api",
    "../api:video_frame_api",
    "../api/audio_codecs:audio_codecs_api",
    "../api/audio_codecs:builtin_audio_decoder_factory",
    "../api/audio_codecs:builtin_audio_encoder_factory",
    "../api/video_codecs:video_codecs_api",
    "../call",
    "../call:video_stream_api",
    "../common_video:common_video",
    "../modules/audio_coding:rent_a_codec",
    "../modules/audio_device:audio_device",
    "../modules/audio_mixer:audio_mixer_impl",
    "../modules/audio_processing:audio_processing",
    "../modules/audio_processing/aec_dump",
    "../modules/video_capture:video_capture_module",
    "../modules/video_coding",
    "../modules/video_coding:webrtc_h264",
    "../modules/video_coding:webrtc_vp8",
    "../modules/video_coding:webrtc_vp9",
    "../p2p:rtc_p2p",
    "../pc:rtc_pc_base",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
    "../rtc_base:sequenced_task_checker",
    "../system_wrappers",
    "../video",
    "../voice_engine",
  ]
}

rtc_static_library("rtc_data") {
  defines = []
  deps = []

  if (rtc_enable_sctp) {
    sources = [
      "sctp/sctptransport.cc",
      "sctp/sctptransport.h",
      "sctp/sctptransportinternal.h",
    ]
  }

  configs += [ ":rtc_media_warnings_config" ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  if (is_win) {
    cflags = [
      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
      "/wd4267",  # conversion from "size_t" to "int", possible loss of data.
      "/wd4389",  # signed/unsigned mismatch.
    ]
  }

  if (rtc_enable_sctp && rtc_build_usrsctp) {
    include_dirs = [
      # TODO(jiayl): move this into the public_configs of
      # //third_party/usrsctp/BUILD.gn.
      "//third_party/usrsctp/usrsctplib",
    ]
    deps += [ "//third_party/usrsctp" ]
  }

  deps += [
    ":rtc_media_base",
    "..:webrtc_common",
    "../api:call_api",
    "../api:transport_api",
    "../p2p:rtc_p2p",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
    "../system_wrappers",
  ]
}

rtc_source_set("rtc_media") {
  public_deps = [
    ":rtc_audio_video",
    ":rtc_data",
  ]
}

if (rtc_include_tests) {
  config("rtc_unittest_main_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds -Wall, and this flag have to be after -Wall -- so they need to
    # come from a config and can"t be on the target directly.
    if (is_clang && is_ios) {
      cflags = [ "-Wno-unused-variable" ]
    }
  }

  rtc_source_set("rtc_media_tests_utils") {
    testonly = true

    include_dirs = []
    public_deps = []
    deps = [
      "../call:video_stream_api",
      "../modules/audio_coding:rent_a_codec",
      "../modules/audio_processing:audio_processing",
      "../modules/rtp_rtcp:rtp_rtcp",
      "../p2p:rtc_p2p",
    ]
    sources = [
      "base/fakemediaengine.h",
      "base/fakenetworkinterface.h",
      "base/fakertp.cc",
      "base/fakertp.h",
      "base/fakevideocapturer.h",
      "base/fakevideorenderer.h",
      "base/test/mock_mediachannel.h",
      "base/testutils.cc",
      "base/testutils.h",
      "engine/fakewebrtccall.cc",
      "engine/fakewebrtccall.h",
      "engine/fakewebrtcdeviceinfo.h",
      "engine/fakewebrtcvcmfactory.h",
      "engine/fakewebrtcvideocapturemodule.h",
      "engine/fakewebrtcvideoengine.h",
      "engine/fakewebrtcvoiceengine.h",
    ]

    configs += [ ":rtc_unittest_main_config" ]

    if (rtc_build_libyuv) {
      deps += [ "$rtc_libyuv_dir" ]
      public_deps += [ "$rtc_libyuv_dir" ]
    } else {
      # Need to add a directory normally exported by libyuv.
      include_dirs += [ "$rtc_libyuv_dir/include" ]
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    deps += [
      ":rtc_media",
      ":rtc_media_base",
      "..:webrtc_common",
      "../api:call_api",
      "../api:video_frame_api",
      "../api/video_codecs:video_codecs_api",
      "../call:call_interfaces",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../test:test_support",
      "//testing/gtest",
    ]
    public_deps += [ "//testing/gmock" ]
  }

  config("rtc_media_unittests_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds -Wall, and this flag have to be after -Wall -- so they need to
    # come from a config and can"t be on the target directly.
    # TODO(kjellander): Make the code compile without disabling these flags.
    # See https://bugs.webrtc.org/3307.
    if (is_clang && is_win) {
      cflags = [
        # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6266
        # for -Wno-sign-compare
        "-Wno-sign-compare",
      ]
    }
    if (!is_win) {
      cflags = [ "-Wno-sign-compare" ]
    }
  }

  rtc_media_unittests_resources = [
    "../../resources/media/captured-320x240-2s-48.frames",
    "../../resources/media/faces.1280x720_P420.yuv",
    "../../resources/media/faces_I420.jpg",
    "../../resources/media/faces_I422.jpg",
    "../../resources/media/faces_I444.jpg",
    "../../resources/media/faces_I411.jpg",
    "../../resources/media/faces_I400.jpg",
  ]

  if (is_ios) {
    bundle_data("rtc_media_unittests_bundle_data") {
      testonly = true
      sources = rtc_media_unittests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_test("rtc_media_unittests") {
    testonly = true

    defines = []
    deps = [
      "../pc:rtc_pc",
      "../test:field_trial",
    ]
    sources = [
      "base/codec_unittest.cc",
      "base/rtpdataengine_unittest.cc",
      "base/rtputils_unittest.cc",
      "base/streamparams_unittest.cc",
      "base/turnutils_unittest.cc",
      "base/videoadapter_unittest.cc",
      "base/videobroadcaster_unittest.cc",
      "base/videocapturer_unittest.cc",
      "base/videocommon_unittest.cc",
      "base/videoengine_unittest.h",
      "engine/apm_helpers_unittest.cc",
      "engine/internaldecoderfactory_unittest.cc",
      "engine/nullwebrtcvideoengine_unittest.cc",
      "engine/payload_type_mapper_unittest.cc",
      "engine/simulcast_encoder_adapter_unittest.cc",
      "engine/simulcast_unittest.cc",
      "engine/videodecodersoftwarefallbackwrapper_unittest.cc",
      "engine/videoencodersoftwarefallbackwrapper_unittest.cc",
      "engine/webrtcmediaengine_unittest.cc",
      "engine/webrtcvideocapturer_unittest.cc",
      "engine/webrtcvideoencoderfactory_unittest.cc",
      "engine/webrtcvideoengine_unittest.cc",
    ]

    # TODO(kthelgason): Reenable this test on iOS.
    # See bugs.webrtc.org/5569
    if (!is_ios) {
      sources += [ "engine/webrtcvoiceengine_unittest.cc" ]
    }

    if (rtc_enable_sctp) {
      sources += [ "sctp/sctptransport_unittest.cc" ]
    }

    configs += [ ":rtc_media_unittests_config" ]

    if (rtc_use_h264) {
      defines += [ "WEBRTC_USE_H264" ]
    }

    if (rtc_opus_support_120ms_ptime) {
      defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
    } else {
      defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
    }

    if (is_win) {
      cflags = [
        "/wd4245",  # conversion from int to size_t, signed/unsigned mismatch.
        "/wd4373",  # virtual function override.
        "/wd4389",  # signed/unsigned mismatch.
      ]
    }

    if (!build_with_chromium && is_clang) {
      suppressed_configs += [
        "//build/config/clang:extra_warnings",

        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
        "//build/config/clang:find_bad_constructs",
      ]
    }

    data = rtc_media_unittests_resources

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
      shard_timeout = 900
    }

    if (is_ios) {
      deps += [ ":rtc_media_unittests_bundle_data" ]
    }

    deps += [
      ":rtc_media",
      ":rtc_media_base",
      ":rtc_media_tests_utils",
      "../api:video_frame_api",
      "../api/audio_codecs:builtin_audio_decoder_factory",
      "../api/audio_codecs:builtin_audio_encoder_factory",
      "../api/video_codecs:video_codecs_api",
      "../audio",
      "../call:call_interfaces",
      "../common_video:common_video",
      "../logging:rtc_event_log_api",
      "../modules/audio_device:mock_audio_device",
      "../modules/audio_processing:audio_processing",
      "../modules/video_coding:simulcast_test_utility",
      "../modules/video_coding:video_coding_utility",
      "../modules/video_coding:webrtc_vp8",
      "../p2p:p2p_test_utils",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_main",
      "../rtc_base:rtc_base_tests_utils",
      "../system_wrappers:metrics_default",
      "../test:audio_codec_mocks",
      "../test:test_support",
      "../voice_engine:voice_engine",
    ]
  }
}
