# Copyright (c) 2014 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")

rtc_static_library("video_coding") {
  visibility = [ "*" ]
  sources = [
    "codec_database.cc",
    "codec_database.h",
    "codec_timer.cc",
    "codec_timer.h",
    "decoding_state.cc",
    "decoding_state.h",
    "encoded_frame.cc",
    "encoded_frame.h",
    "fec_rate_table.h",
    "frame_buffer.cc",
    "frame_buffer.h",
    "frame_buffer2.cc",
    "frame_buffer2.h",
    "frame_object.cc",
    "frame_object.h",
    "generic_decoder.cc",
    "generic_decoder.h",
    "generic_encoder.cc",
    "generic_encoder.h",
    "h264_sprop_parameter_sets.cc",
    "h264_sprop_parameter_sets.h",
    "h264_sps_pps_tracker.cc",
    "h264_sps_pps_tracker.h",
    "histogram.cc",
    "histogram.h",
    "include/video_codec_initializer.h",

    # TODO(bugs.webrtc.org/7620: remove these when downstream is updated).
    "include/video_codec_interface.h",
    "include/video_coding.h",
    "include/video_error_codes.h",
    "inter_frame_delay.cc",
    "inter_frame_delay.h",
    "internal_defines.h",
    "jitter_buffer.cc",
    "jitter_buffer.h",
    "jitter_buffer_common.h",
    "jitter_estimator.cc",
    "jitter_estimator.h",
    "media_opt_util.cc",
    "media_opt_util.h",
    "media_optimization.cc",
    "media_optimization.h",
    "nack_fec_tables.h",
    "nack_module.cc",
    "nack_module.h",
    "packet.cc",
    "packet.h",
    "packet_buffer.cc",
    "packet_buffer.h",
    "protection_bitrate_calculator.cc",
    "protection_bitrate_calculator.h",
    "qp_parser.cc",
    "qp_parser.h",
    "receiver.cc",
    "receiver.h",
    "rtp_frame_reference_finder.cc",
    "rtp_frame_reference_finder.h",
    "rtt_filter.cc",
    "rtt_filter.h",
    "session_info.cc",
    "session_info.h",
    "timestamp_map.cc",
    "timestamp_map.h",
    "timing.cc",
    "timing.h",
    "video_codec_initializer.cc",
    "video_coding_impl.cc",
    "video_coding_impl.h",
    "video_receiver.cc",
    "video_sender.cc",
  ]

  # TODO(jschuh): Bug 1348: fix this warning.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  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 = [
    ":codec_globals_headers",
    ":video_codec_interface",
    ":video_coding_utility",
    ":webrtc_h264",
    ":webrtc_i420",
    ":webrtc_stereo",
    ":webrtc_vp8",
    ":webrtc_vp8_helpers",
    ":webrtc_vp9",
    "..:module_api",
    "..:module_api_public",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../api:optional",
    "../../api:video_frame_api",
    "../../api:video_frame_api_i420",
    "../../api/video_codecs:video_codecs_api",
    "../../call:video_stream_api",
    "../../common_video",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:rtc_task_queue",
    "../../rtc_base:sequenced_task_checker",
    "../../rtc_base/experiments:alr_experiment",
    "../../system_wrappers",
    "../../system_wrappers:field_trial_api",
    "../../system_wrappers:metrics_api",
    "../rtp_rtcp:rtp_rtcp_format",
    "../utility:utility",
  ]
}

rtc_source_set("video_codec_interface") {
  sources = [
    "include/video_codec_interface.h",
    "include/video_coding_defines.h",
    "include/video_error_codes.h",
  ]
  deps = [
    "..:module_api",
    "../..:typedefs",
    "../..:webrtc_common",
    "../../api:video_frame_api",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video:common_video",
  ]
}

rtc_source_set("mock_headers") {
  testonly = true
  sources = [
    "codecs/interface/mock/mock_video_codec_interface.h",
    "include/mock/mock_video_codec_interface.h",
  ]
  deps = [
    ":video_codec_interface",
    ":video_coding_utility",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../test:test_support",
  ]
}

rtc_source_set("codec_globals_headers") {
  sources = [
    "codecs/h264/include/h264_globals.h",
    "codecs/interface/common_constants.h",
    "codecs/stereo/include/stereo_globals.h",
    "codecs/vp8/include/vp8_globals.h",
    "codecs/vp9/include/vp9_globals.h",
  ]
}

rtc_source_set("video_coding_utility") {
  visibility = [ "*" ]
  sources = [
    "codecs/interface/video_codec_interface.h",
    "codecs/interface/video_error_codes.h",
    "utility/default_video_bitrate_allocator.cc",
    "utility/default_video_bitrate_allocator.h",
    "utility/frame_dropper.cc",
    "utility/frame_dropper.h",
    "utility/ivf_file_writer.cc",
    "utility/ivf_file_writer.h",
    "utility/moving_average.cc",
    "utility/moving_average.h",
    "utility/quality_scaler.cc",
    "utility/quality_scaler.h",
    "utility/vp8_header_parser.cc",
    "utility/vp8_header_parser.h",
    "utility/vp9_uncompressed_header_parser.cc",
    "utility/vp9_uncompressed_header_parser.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 = [
    ":video_codec_interface",
    "..:module_api",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../api:optional",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video",
    "../../modules/rtp_rtcp",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:rtc_task_queue",
    "../../rtc_base:sequenced_task_checker",
    "../../system_wrappers",
    "../rtp_rtcp:rtp_rtcp_format",
  ]
}

rtc_static_library("webrtc_h264") {
  visibility = [ "*" ]
  sources = [
    "codecs/h264/h264.cc",
    "codecs/h264/include/h264.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" ]
  }

  defines = []
  deps = [
    ":video_codec_interface",
    ":video_coding_utility",
    "../../api:video_frame_api_i420",
    "../../api/video_codecs:video_codecs_api",
    "../../media:rtc_h264_profile_id",
    "../../media:rtc_media_base",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base",
    "../../system_wrappers:metrics_api",
  ]

  if (rtc_use_h264) {
    defines += [ "WEBRTC_USE_H264" ]
    if (rtc_initialize_ffmpeg) {
      defines += [ "WEBRTC_INITIALIZE_FFMPEG" ]
    }
    sources += [
      "codecs/h264/h264_decoder_impl.cc",
      "codecs/h264/h264_decoder_impl.h",
      "codecs/h264/h264_encoder_impl.cc",
      "codecs/h264/h264_encoder_impl.h",
    ]
    deps += [
      "../../common_video",
      "../../media:rtc_media_base",
      "//third_party/ffmpeg:ffmpeg",
      "//third_party/openh264:encoder",
    ]
  }
}

rtc_static_library("webrtc_i420") {
  visibility = [ "*" ]
  sources = [
    "codecs/i420/i420.cc",
    "codecs/i420/include/i420.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 = [
    ":video_codec_interface",
    ":video_coding_utility",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../api:video_frame_api_i420",
    "../../common_video:common_video",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
    "//third_party/libyuv",
  ]
}

rtc_static_library("webrtc_stereo") {
  sources = [
    "codecs/stereo/include/stereo_decoder_adapter.h",
    "codecs/stereo/include/stereo_encoder_adapter.h",
    "codecs/stereo/stereo_decoder_adapter.cc",
    "codecs/stereo/stereo_encoder_adapter.cc",
  ]

  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 = [
    ":video_codec_interface",
    ":video_coding_utility",
    "..:module_api",
    "../..:webrtc_common",
    "../../api:video_frame_api",
    "../../api:video_frame_api_i420",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video:common_video",
    "../../rtc_base:rtc_base",
    "../../system_wrappers",
  ]
}

# This target includes VP8 files that may be used for any VP8 codec, internal SW or external HW.
rtc_source_set("webrtc_vp8_helpers") {
  sources = [
    "codecs/vp8/include/vp8_common_types.h",
    "codecs/vp8/screenshare_layers.h",
    "codecs/vp8/simulcast_rate_allocator.h",
    "codecs/vp8/temporal_layers.h",
  ]

  deps = [
    ":video_coding_utility",
    "..:module_api",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
    "../../system_wrappers:field_trial_api",
    "../../system_wrappers:metrics_api",
  ]
}

# This target includes the internal SW codec.
rtc_static_library("webrtc_vp8") {
  visibility = [ "*" ]
  sources = [
    "codecs/vp8/default_temporal_layers.cc",
    "codecs/vp8/default_temporal_layers.h",
    "codecs/vp8/include/vp8.h",
    "codecs/vp8/include/vp8_common_types.h",
    "codecs/vp8/screenshare_layers.cc",
    "codecs/vp8/simulcast_rate_allocator.cc",
    "codecs/vp8/temporal_layers.cc",
    "codecs/vp8/vp8_impl.cc",
    "codecs/vp8/vp8_impl.h",
  ]

  # TODO(jschuh): Bug 1348: fix this warning.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  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 = [
    ":video_codec_interface",
    ":video_coding_utility",
    ":webrtc_vp8_helpers",
    "..:module_api",
    "../..:webrtc_common",
    "../../:typedefs",
    "../../api:optional",
    "../../api:video_frame_api",
    "../../common_video",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../system_wrappers",
    "../../system_wrappers:field_trial_api",
    "../../system_wrappers:metrics_api",
    "//third_party/libyuv",
  ]
  if (rtc_build_libvpx) {
    deps += [ rtc_libvpx_dir ]
  }
}

rtc_static_library("webrtc_vp9") {
  visibility = [ "*" ]
  if (rtc_libvpx_build_vp9) {
    sources = [
      "codecs/vp9/include/vp9.h",
      "codecs/vp9/screenshare_layers.cc",
      "codecs/vp9/screenshare_layers.h",
      "codecs/vp9/vp9_frame_buffer_pool.cc",
      "codecs/vp9/vp9_frame_buffer_pool.h",
      "codecs/vp9/vp9_impl.cc",
      "codecs/vp9/vp9_impl.h",
    ]
  } else {
    sources = [
      "codecs/vp9/vp9_noop.cc",
    ]
  }

  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 = [
    ":video_codec_interface",
    ":video_coding_utility",
    "..:module_api",
    "../../common_video",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base",
    "../../system_wrappers",
  ]
  if (rtc_build_libvpx) {
    deps += [ rtc_libvpx_dir ]
  }
}

if (rtc_include_tests) {
  if (is_ios || is_mac) {
    rtc_static_library("codec_test_objc") {
      sources = [
        "codecs/test/objc_codec_h264_test.h",
        "codecs/test/objc_codec_h264_test.mm",
      ]
      deps = [
        "../../api:video_frame_api",
        "../../api/video_codecs:video_codecs_api",
        "../../media:rtc_audio_video",
        "../../modules:module_api",
        "../../rtc_base:rtc_base_approved",
        "../../sdk:common_objc",
        "../../sdk:peerconnection_objc",
        "../../sdk:peerconnectionfactory_objc",
        "../../sdk:videotoolbox_objc",
        "../../sdk:videotracksource_objc",
      ]

      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" ]
      }
    }
  }

  rtc_source_set("simulcast_test_utility") {
    testonly = true
    sources = [
      "codecs/vp8/simulcast_test_utility.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 = [
      ":mock_headers",
      ":video_codec_interface",
      ":video_coding",
      ":webrtc_vp8",
      ":webrtc_vp8_helpers",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../common_video:common_video",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../test:test_support",
    ]
  }

  rtc_source_set("video_codecs_test_framework") {
    testonly = true
    sources = [
      "codecs/test/mock/mock_packet_manipulator.h",
      "codecs/test/packet_manipulator.cc",
      "codecs/test/packet_manipulator.h",
      "codecs/test/stats.cc",
      "codecs/test/stats.h",
      "codecs/test/test_config.cc",
      "codecs/test/test_config.h",
      "codecs/test/video_codec_test.cc",
      "codecs/test/video_codec_test.h",
      "codecs/test/videoprocessor.cc",
      "codecs/test/videoprocessor.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 = [
      ":codec_globals_headers",
      ":video_codec_interface",
      ":video_coding",
      ":video_coding_utility",
      ":webrtc_vp8",
      ":webrtc_vp8_helpers",
      "../..:webrtc_common",
      "../../:typedefs",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../api/video_codecs:video_codecs_api",
      "../../common_video:common_video",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../rtc_base:rtc_task_queue",
      "../../rtc_base:sequenced_task_checker",
      "../../system_wrappers",
      "../../test:test_support",
      "../../test:video_test_common",
      "../../test:video_test_support",
    ]
  }

  video_coding_modules_tests_resources = [
    "../../resources/foreman_128x96.yuv",
    "../../resources/foreman_160x120.yuv",
    "../../resources/foreman_176x144.yuv",
    "../../resources/foreman_320x240.yuv",
  ]

  if (is_ios || is_mac) {
    bundle_data("video_coding_modules_tests_resources_bundle_data") {
      testonly = true
      sources = video_coding_modules_tests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_source_set("video_coding_modules_tests") {
    testonly = true

    sources = [
      "codecs/h264/test/h264_impl_unittest.cc",
      "codecs/stereo/test/stereo_adapter_unittest.cc",
      "codecs/test/videoprocessor_integrationtest.cc",
      "codecs/test/videoprocessor_integrationtest.h",
      "codecs/test/videoprocessor_integrationtest_libvpx.cc",
      "codecs/test/videoprocessor_integrationtest_openh264.cc",
      "codecs/test/videoprocessor_integrationtest_parameterized.cc",
      "codecs/vp8/test/vp8_impl_unittest.cc",
      "codecs/vp9/test/vp9_impl_unittest.cc",
    ]

    deps = [
      ":video_codec_interface",
      ":video_codecs_test_framework",
      ":video_coding",
      ":video_coding_utility",
      ":webrtc_h264",
      ":webrtc_stereo",
      ":webrtc_vp8",
      ":webrtc_vp8_helpers",
      ":webrtc_vp9",
      "../..:webrtc_common",
      "../../api:mock_video_codec_factory",
      "../../api:optional",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../api/video_codecs:video_codecs_api",
      "../../common_video",
      "../../media:rtc_audio_video",
      "../../media:rtc_h264_profile_id",
      "../../media:rtc_internal_video_codecs",
      "../../media:rtc_media_base",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base",
      "../../rtc_base:rtc_base_tests_utils",
      "../../system_wrappers",
      "../../test:field_trial",
      "../../test:test_support",
      "../../test:video_test_common",
      "../../test:video_test_support",
      "../video_capture",
    ]

    data = video_coding_modules_tests_resources

    if (is_android) {
      sources += [
        "codecs/test/android_test_initializer.cc",
        "codecs/test/android_test_initializer.h",
        "codecs/test/videoprocessor_integrationtest_mediacodec.cc",
      ]

      deps += [
        "../../sdk/android:libjingle_peerconnection_jni",
        "//base",
      ]
    }

    if (is_ios || is_mac) {
      sources +=
          [ "codecs/test/videoprocessor_integrationtest_videotoolbox.cc" ]

      deps += [
        ":codec_test_objc",
        ":video_coding_modules_tests_resources_bundle_data",
        "../../media:rtc_media_base",
        "../../sdk:videotoolbox_objc",
      ]
    }

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

    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" ]
    }
  }

  rtc_source_set("video_coding_unittests") {
    testonly = true

    sources = [
      "codecs/test/packet_manipulator_unittest.cc",
      "codecs/test/stats_unittest.cc",
      "codecs/test/test_config_unittest.cc",
      "codecs/test/videoprocessor_unittest.cc",
      "codecs/vp8/default_temporal_layers_unittest.cc",
      "codecs/vp8/screenshare_layers_unittest.cc",
      "codecs/vp8/simulcast_unittest.cc",
      "decoding_state_unittest.cc",
      "frame_buffer2_unittest.cc",
      "generic_encoder_unittest.cc",
      "h264_sprop_parameter_sets_unittest.cc",
      "h264_sps_pps_tracker_unittest.cc",
      "histogram_unittest.cc",
      "include/mock/mock_vcm_callbacks.h",
      "jitter_buffer_unittest.cc",
      "jitter_estimator_tests.cc",
      "nack_module_unittest.cc",
      "protection_bitrate_calculator_unittest.cc",
      "receiver_unittest.cc",
      "rtp_frame_reference_finder_unittest.cc",
      "session_info_unittest.cc",
      "test/stream_generator.cc",
      "test/stream_generator.h",
      "test/test_util.h",
      "timing_unittest.cc",
      "utility/default_video_bitrate_allocator_unittest.cc",
      "utility/frame_dropper_unittest.cc",
      "utility/ivf_file_writer_unittest.cc",
      "utility/mock/mock_frame_dropper.h",
      "utility/moving_average_unittest.cc",
      "utility/quality_scaler_unittest.cc",
      "utility/simulcast_rate_allocator_unittest.cc",
      "video_codec_initializer_unittest.cc",
      "video_packet_buffer_unittest.cc",
      "video_receiver_unittest.cc",
      "video_sender_unittest.cc",
    ]
    if (rtc_libvpx_build_vp9) {
      sources += [ "codecs/vp9/vp9_screenshare_layers_unittest.cc" ]
    }
    if (rtc_use_h264) {
      sources += [ "codecs/h264/h264_encoder_impl_unittest.cc" ]
    }
    deps = [
      ":mock_headers",
      ":simulcast_test_utility",
      ":video_codec_interface",
      ":video_codecs_test_framework",
      ":video_coding",
      ":video_coding_utility",
      ":webrtc_h264",
      ":webrtc_vp8",
      ":webrtc_vp8_helpers",
      ":webrtc_vp9",
      "..:module_api",
      "../..:webrtc_common",
      "../../:typedefs",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../api/video_codecs:video_codecs_api",
      "../../common_video:common_video",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base",
      "../../rtc_base:rtc_base_approved",
      "../../rtc_base:rtc_numerics",
      "../../rtc_base:rtc_task_queue",
      "../../system_wrappers",
      "../../system_wrappers:field_trial_api",
      "../../system_wrappers:metrics_api",
      "../../system_wrappers:metrics_default",
      "../../test:field_trial",
      "../../test:test_support",
      "../../test:video_test_common",
      "../../test:video_test_support",
      "../rtp_rtcp:rtp_rtcp_format",
      "//testing/gmock",
    ]
    if (rtc_build_libvpx) {
      deps += [ rtc_libvpx_dir ]
    }
    if (is_win) {
      cflags = [
        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
        "/wd4373",  # virtual function override.
      ]
    }

    # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
    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" ]
    }
  }
}
