# 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") {
  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",
    "include/video_coding.h",
    "include/video_coding_defines.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_coding_utility",
    ":webrtc_h264",
    ":webrtc_i420",
    ":webrtc_stereo",
    ":webrtc_vp8",
    ":webrtc_vp9",
    "..:module_api",
    "..:module_api_public",
    "../..:webrtc_common",
    "../../api:optional",
    "../../api:video_frame_api_i420",
    "../../call:video_stream_api",
    "../../common_video",
    "../../rtc_base:rtc_base",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:rtc_task_queue",
    "../../rtc_base:sequenced_task_checker",
    "../../system_wrappers",
    "../pacing",
    "../rtp_rtcp:rtp_rtcp",
    "../utility:utility",
  ]
}

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_coding_utility",
    "../..:webrtc_common",
    "../../test:test_support",
  ]
}

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

rtc_source_set("video_coding_utility") {
  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 = [
    "..:module_api",
    "../..:webrtc_common",
    "../../api:optional",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video",
    "../../modules/rtp_rtcp:rtp_rtcp",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:rtc_task_queue",
    "../../rtc_base:sequenced_task_checker",
    "../../system_wrappers",
  ]
}

rtc_static_library("webrtc_h264") {
  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_coding_utility",
    "../../api:video_frame_api_i420",
    "../../api/video_codecs:video_codecs_api",
    "../../media:rtc_media_base",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
  ]

  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") {
  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_coding_utility",
    "../..:webrtc_common",
    "../../api:video_frame_api_i420",
    "../../common_video:common_video",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
  ]
}

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_coding_utility",
    "..:module_api",
    "../..:webrtc_common",
    "../../api:video_frame_api_i420",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video:common_video",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
  ]
}

rtc_static_library("webrtc_vp8") {
  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/screenshare_layers.h",
    "codecs/vp8/simulcast_rate_allocator.cc",
    "codecs/vp8/simulcast_rate_allocator.h",
    "codecs/vp8/temporal_layers.cc",
    "codecs/vp8/temporal_layers.h",
    "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_coding_utility",
    "..:module_api",
    "../..:webrtc_common",
    "../../api:optional",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:sequenced_task_checker",
    "../../system_wrappers",
  ]
  if (rtc_build_libvpx) {
    deps += [ rtc_libvpx_dir ]
  }
}

rtc_static_library("webrtc_vp9") {
  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_coding_utility",
    "..:module_api",
    "../../common_video",
    "../../rtc_base:rtc_base_approved",
    "../../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",
        "../../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_coding",
      ":webrtc_vp8",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../common_video:common_video",
      "../../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_coding",
      ":video_coding_utility",
      ":webrtc_vp8",
      "../..:webrtc_common",
      "../../api:video_frame_api_i420",
      "../../api/video_codecs:video_codecs_api",
      "../../common_video:common_video",
      "../../rtc_base:rtc_base_approved",
      "../../rtc_base:rtc_task_queue",
      "../../rtc_base:sequenced_task_checker",
      "../../system_wrappers: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_codecs_test_framework",
      ":video_coding",
      ":video_coding_utility",
      ":webrtc_h264",
      ":webrtc_stereo",
      ":webrtc_vp8",
      ":webrtc_vp9",
      "../..:webrtc_common",
      "../../api:mock_video_codec_factory",
      "../../api:optional",
      "../../api:video_frame_api",
      "../../api:video_frame_api_i420",
      "../../common_video",
      "../../media:rtc_audio_video",
      "../../media:rtc_media_base",
      "../../rtc_base:rtc_base_approved",
      "../../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_codecs_test_framework",
      ":video_coding",
      ":video_coding_utility",
      ":webrtc_h264",
      ":webrtc_vp8",
      ":webrtc_vp9",
      "..: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",
      "../../rtc_base:rtc_base_approved",
      "../../rtc_base:rtc_numerics",
      "../../rtc_base:rtc_task_queue",
      "../../system_wrappers:metrics_default",
      "../../system_wrappers:system_wrappers",
      "../../test:field_trial",
      "../../test:test_support",
      "../../test:video_test_common",
      "../../test:video_test_support",
      "../rtp_rtcp:rtp_rtcp",
      "//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" ]
    }
  }
}