# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/config.gni")
import("//build/config/arm.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//build/config/linux/pkg_config.gni")
import("//media/media_options.gni")
import("//testing/libfuzzer/fuzzer_test.gni")

config("base_config") {
  configs = [
    # This target uses the ALLOCATOR_SHIM define.
    "//base/allocator:allocator_shim_define",
    "//build/config:precompiled_headers",
    "//build/config/compiler:no_size_t_to_int_warning",
    "//media:media_config",
    "//media:media_dependent_config",
    "//media:media_implementation",
  ]
}

if (is_component_build) {
  link_target_type = "source_set"
} else {
  link_target_type = "static_library"
}
target(link_target_type, "base") {
  # This is part of the media component.
  visibility = [ "//media/*" ]
  sources = [
    "audio_block_fifo.cc",
    "audio_block_fifo.h",
    "audio_buffer.cc",
    "audio_buffer.h",
    "audio_buffer_converter.cc",
    "audio_buffer_converter.h",
    "audio_buffer_queue.cc",
    "audio_buffer_queue.h",
    "audio_capturer_source.h",
    "audio_codecs.cc",
    "audio_codecs.h",
    "audio_converter.cc",
    "audio_converter.h",
    "audio_decoder.cc",
    "audio_decoder.h",
    "audio_decoder_config.cc",
    "audio_decoder_config.h",
    "audio_discard_helper.cc",
    "audio_discard_helper.h",
    "audio_fifo.cc",
    "audio_fifo.h",
    "audio_hash.cc",
    "audio_hash.h",
    "audio_pull_fifo.cc",
    "audio_pull_fifo.h",
    "audio_push_fifo.cc",
    "audio_push_fifo.h",
    "audio_renderer.cc",
    "audio_renderer.h",
    "audio_renderer_mixer.cc",
    "audio_renderer_mixer.h",
    "audio_renderer_mixer_input.cc",
    "audio_renderer_mixer_input.h",
    "audio_renderer_mixer_pool.h",
    "audio_renderer_sink.h",
    "audio_shifter.cc",
    "audio_shifter.h",
    "audio_splicer.cc",
    "audio_splicer.h",
    "audio_timestamp_helper.cc",
    "audio_timestamp_helper.h",
    "bind_to_current_loop.h",
    "bit_reader.cc",
    "bit_reader.h",
    "bit_reader_core.cc",
    "bit_reader_core.h",
    "bitstream_buffer.cc",
    "bitstream_buffer.h",
    "buffering_state.h",
    "byte_queue.cc",
    "byte_queue.h",
    "cdm_callback_promise.cc",
    "cdm_callback_promise.h",
    "cdm_config.h",
    "cdm_context.cc",
    "cdm_context.h",
    "cdm_factory.cc",
    "cdm_factory.h",
    "cdm_initialized_promise.cc",
    "cdm_initialized_promise.h",
    "cdm_key_information.cc",
    "cdm_key_information.h",
    "cdm_promise.cc",
    "cdm_promise.h",
    "cdm_promise_adapter.cc",
    "cdm_promise_adapter.h",
    "channel_mixer.cc",
    "channel_mixer.h",
    "channel_mixing_matrix.cc",
    "channel_mixing_matrix.h",
    "container_names.cc",
    "container_names.h",
    "data_buffer.cc",
    "data_buffer.h",
    "data_source.cc",
    "data_source.h",
    "decode_status.cc",
    "decode_status.h",
    "decoder_buffer.cc",
    "decoder_buffer.h",
    "decoder_buffer_queue.cc",
    "decoder_buffer_queue.h",
    "decoder_factory.cc",
    "decoder_factory.h",
    "decrypt_config.cc",
    "decrypt_config.h",
    "decryptor.cc",
    "decryptor.h",
    "demuxer.cc",
    "demuxer.h",
    "demuxer_stream.cc",
    "demuxer_stream.h",
    "demuxer_stream_provider.cc",
    "demuxer_stream_provider.h",
    "djb2.cc",
    "djb2.h",
    "eme_constants.h",
    "encryption_scheme.cc",
    "encryption_scheme.h",
    "feedback_signal_accumulator.h",
    "hdr_metadata.cc",
    "hdr_metadata.h",
    "key_system_names.cc",
    "key_system_names.h",
    "key_system_properties.cc",
    "key_system_properties.h",
    "key_systems.cc",
    "key_systems.h",
    "loopback_audio_converter.cc",
    "loopback_audio_converter.h",
    "media.cc",
    "media.h",
    "media_client.cc",
    "media_client.h",
    "media_content_type.cc",
    "media_content_type.h",
    "media_keys.cc",
    "media_keys.h",
    "media_log.cc",
    "media_log.h",
    "media_log_event.h",
    "media_permission.cc",
    "media_permission.h",
    "media_resources.cc",
    "media_resources.h",
    "media_switches.cc",
    "media_switches.h",
    "media_track.cc",
    "media_track.h",
    "media_tracks.cc",
    "media_tracks.h",
    "media_url_demuxer.cc",
    "media_url_demuxer.h",
    "media_util.cc",
    "media_util.h",
    "mime_util.cc",
    "mime_util.h",
    "mime_util_internal.cc",
    "mime_util_internal.h",
    "moving_average.cc",
    "moving_average.h",
    "multi_channel_resampler.cc",
    "multi_channel_resampler.h",
    "null_video_sink.cc",
    "null_video_sink.h",
    "output_device_info.cc",
    "output_device_info.h",
    "pipeline.h",
    "pipeline_impl.cc",
    "pipeline_impl.h",
    "pipeline_metadata.h",
    "pipeline_status.h",
    "player_tracker.cc",
    "player_tracker.h",
    "ranges.cc",
    "ranges.h",
    "renderer.cc",
    "renderer.h",
    "renderer_client.h",
    "renderer_factory.cc",
    "renderer_factory.h",
    "sample_format.cc",
    "sample_format.h",
    "seekable_buffer.cc",
    "seekable_buffer.h",
    "serial_runner.cc",
    "serial_runner.h",
    "silent_sink_suspender.cc",
    "silent_sink_suspender.h",
    "simd/convert_rgb_to_yuv.h",
    "simd/convert_rgb_to_yuv_c.cc",
    "simd/convert_yuv_to_rgb.h",
    "simd/convert_yuv_to_rgb_c.cc",
    "simd/filter_yuv.h",
    "simd/filter_yuv_c.cc",
    "sinc_resampler.cc",
    "sinc_resampler.h",
    "stream_parser.cc",
    "stream_parser.h",
    "stream_parser_buffer.cc",
    "stream_parser_buffer.h",
    "subsample_entry.h",
    "surface_manager.h",
    "text_cue.cc",
    "text_cue.h",
    "text_ranges.cc",
    "text_ranges.h",
    "text_renderer.cc",
    "text_renderer.h",
    "text_track.h",
    "text_track_config.cc",
    "text_track_config.h",
    "time_delta_interpolator.cc",
    "time_delta_interpolator.h",
    "time_source.h",
    "timestamp_constants.h",
    "user_input_monitor.cc",
    "user_input_monitor.h",
    "video_capture_types.cc",
    "video_capture_types.h",
    "video_capturer_source.cc",
    "video_capturer_source.h",
    "video_codecs.cc",
    "video_codecs.h",
    "video_decoder.cc",
    "video_decoder.h",
    "video_decoder_config.cc",
    "video_decoder_config.h",
    "video_frame.cc",
    "video_frame.h",
    "video_frame_metadata.cc",
    "video_frame_metadata.h",
    "video_frame_pool.cc",
    "video_frame_pool.h",
    "video_renderer.cc",
    "video_renderer.h",
    "video_rotation.h",
    "video_types.cc",
    "video_types.h",
    "video_util.cc",
    "video_util.h",
    "wall_clock_time_source.cc",
    "wall_clock_time_source.h",
    "yuv_convert.cc",
    "yuv_convert.h",
  ]

  allow_circular_includes_from = []
  defines = []
  public_deps = []
  deps = [
    "//base/third_party/dynamic_annotations:dynamic_annotations",
    "//gpu",
    "//media:media_features",
    "//media:shared_memory_support",
    "//skia",
    "//third_party/libyuv",
    "//ui/events:events_base",
    "//url:url",
  ]
  libs = []
  configs += [ ":base_config" ]

  if (media_use_ffmpeg) {
    if (!is_android) {
      sources += [
        "audio_video_metadata_extractor.cc",
        "audio_video_metadata_extractor.h",
        "media_file_checker.cc",
        "media_file_checker.h",
      ]
      deps += [ "//media:filters_common" ]
    }

    deps += [ "//third_party/ffmpeg" ]
  }

  if (is_android) {
    public_deps = [
      "//media/base/android",
      "//media/base/android:media_jni_headers",
    ]
    allow_circular_includes_from += [ "//media/base/android" ]
  }

  if (is_linux && use_x11) {
    configs += [
      "//build/config/linux:x11",
      "//build/config/linux:xext",

      # TODO(ajwong): Why does xent get a separate thing in //build/config/linux:BUILD.gn
      #         "//build/config/linux:xdamage",
      #         "//build/config/linux:xfixes",
      #         "//build/config/linux:xtst",
    ]
    sources += [ "user_input_monitor_linux.cc" ]
    deps += [
      "//ui/events:events_base",
      "//ui/gfx/x",
    ]
  } else if (is_mac) {
    sources += [ "user_input_monitor_mac.cc" ]

    # Required by video_frame.cc.
    libs = [ "CoreVideo.framework" ]
  } else if (is_win) {
    sources += [ "user_input_monitor_win.cc" ]
  } else {
    defines += [ "DISABLE_USER_INPUT_MONITOR" ]
  }

  if (current_cpu == "x86" || current_cpu == "x64") {
    sources += [
      "simd/convert_rgb_to_yuv_sse2.cc",
      "simd/convert_rgb_to_yuv_ssse3.cc",
      "simd/convert_yuv_to_rgb_x86.cc",
      "simd/filter_yuv_sse2.cc",
    ]
    deps += [ ":media_yasm" ]
  }

  if (is_linux || is_win) {
    sources += [
      "keyboard_event_counter.cc",
      "keyboard_event_counter.h",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "fake_audio_render_callback.cc",
    "fake_audio_render_callback.h",
    "fake_audio_renderer_sink.cc",
    "fake_audio_renderer_sink.h",
    "fake_demuxer_stream.cc",
    "fake_demuxer_stream.h",
    "fake_media_resources.cc",
    "fake_media_resources.h",
    "fake_single_thread_task_runner.cc",
    "fake_single_thread_task_runner.h",
    "fake_text_track_stream.cc",
    "fake_text_track_stream.h",
    "gmock_callback_support.h",
    "mock_audio_renderer_sink.cc",
    "mock_audio_renderer_sink.h",
    "mock_demuxer_host.cc",
    "mock_demuxer_host.h",
    "mock_filters.cc",
    "mock_filters.h",
    "mock_media_log.cc",
    "mock_media_log.h",
    "test_data_util.cc",
    "test_data_util.h",
    "test_helpers.cc",
    "test_helpers.h",
    "test_random.h",
    "vector_math_testing.h",
  ]
  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//media",
    "//media:media_features",
    "//media:shared_memory_support",
    "//testing/gmock",
    "//ui/gfx:test_support",
  ]
}

source_set("unittests") {
  testonly = true
  sources = [
    "audio_block_fifo_unittest.cc",
    "audio_buffer_converter_unittest.cc",
    "audio_buffer_queue_unittest.cc",
    "audio_buffer_unittest.cc",
    "audio_bus_unittest.cc",
    "audio_converter_unittest.cc",
    "audio_discard_helper_unittest.cc",
    "audio_fifo_unittest.cc",
    "audio_hash_unittest.cc",
    "audio_latency_unittest.cc",
    "audio_parameters_unittest.cc",
    "audio_point_unittest.cc",
    "audio_pull_fifo_unittest.cc",
    "audio_push_fifo_unittest.cc",
    "audio_renderer_mixer_input_unittest.cc",
    "audio_renderer_mixer_unittest.cc",
    "audio_sample_types_unittest.cc",
    "audio_shifter_unittest.cc",
    "audio_splicer_unittest.cc",
    "audio_timestamp_helper_unittest.cc",
    "bind_to_current_loop_unittest.cc",
    "bit_reader_unittest.cc",
    "callback_holder.h",
    "callback_holder_unittest.cc",
    "channel_mixer_unittest.cc",
    "channel_mixing_matrix_unittest.cc",
    "container_names_unittest.cc",
    "data_buffer_unittest.cc",
    "decoder_buffer_queue_unittest.cc",
    "decoder_buffer_unittest.cc",
    "djb2_unittest.cc",
    "fake_demuxer_stream_unittest.cc",
    "feedback_signal_accumulator_unittest.cc",
    "gmock_callback_support_unittest.cc",
    "key_systems_unittest.cc",
    "media_url_demuxer_unittest.cc",
    "mime_util_unittest.cc",
    "moving_average_unittest.cc",
    "multi_channel_resampler_unittest.cc",
    "null_video_sink_unittest.cc",
    "pipeline_impl_unittest.cc",
    "ranges_unittest.cc",
    "run_all_unittests.cc",
    "seekable_buffer_unittest.cc",
    "serial_runner_unittest.cc",
    "silent_sink_suspender_unittest.cc",
    "sinc_resampler_unittest.cc",
    "stream_parser_unittest.cc",
    "text_ranges_unittest.cc",
    "text_renderer_unittest.cc",
    "time_delta_interpolator_unittest.cc",
    "user_input_monitor_unittest.cc",
    "vector_math_unittest.cc",
    "video_codecs_unittest.cc",
    "video_decoder_config_unittest.cc",
    "video_frame_pool_unittest.cc",
    "video_frame_unittest.cc",
    "video_util_unittest.cc",
    "wall_clock_time_source_unittest.cc",
    "yuv_convert_unittest.cc",
  ]
  configs += [
    "//build/config/compiler:no_size_t_to_int_warning",
    "//media:media_config",
  ]
  deps = [
    ":test_support",
    "//base/test:test_support",
    "//gpu/command_buffer/common",
    "//media",
    "//media/base/android:anywhere_unittests",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
  ]

  # Even if FFmpeg is enabled on Android we don't want these.
  # TODO(watk): Refactor tests that could be made to run on Android.
  if (media_use_ffmpeg && !is_android) {
    sources += [
      "audio_video_metadata_extractor_unittest.cc",
      "media_file_checker_unittest.cc",
    ]
  }

  if (is_android) {
    deps += [ "//ui/gl" ]
  }

  if (current_cpu == "x86" || current_cpu == "x64") {
    sources += [ "simd/convert_rgb_to_yuv_unittest.cc" ]
  }
}

source_set("perftests") {
  testonly = true
  sources = [
    "audio_bus_perftest.cc",
    "audio_converter_perftest.cc",
    "run_all_perftests.cc",
    "sinc_resampler_perftest.cc",
    "vector_math_perftest.cc",
    "yuv_convert_perftest.cc",
  ]
  configs += [ "//media:media_config" ]
  deps = [
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//media",
    "//testing/gmock",
    "//testing/gtest",
    "//testing/perf",
    "//third_party/libyuv",
  ]

  if (media_use_ffmpeg) {
    sources += [ "demuxer_perftest.cc" ]
  }
}

if (current_cpu == "x86" || current_cpu == "x64") {
  import("//third_party/yasm/yasm_assemble.gni")
  yasm_assemble("media_yasm") {
    sources = [
      "simd/convert_rgb_to_yuv_ssse3.asm",
      "simd/convert_yuv_to_rgb_sse.asm",
      "simd/convert_yuva_to_argb_mmx.asm",
      "simd/empty_register_state_mmx.asm",
      "simd/linear_scale_yuv_to_rgb_mmx.asm",
      "simd/linear_scale_yuv_to_rgb_sse.asm",
      "simd/scale_yuv_to_rgb_mmx.asm",
      "simd/scale_yuv_to_rgb_sse.asm",
    ]

    yasm_flags = [
      "-DCHROMIUM",

      # In addition to the same path as source asm, let yasm %include
      # search path be relative to src/ per Chromium policy.
      "-I",
      rebase_path("..", root_build_dir),
    ]

    if (is_component_build) {
      yasm_flags += [ "-DEXPORT_SYMBOLS" ]
    }

    inputs = [
      "//third_party/x86inc/x86inc.asm",
      "simd/convert_rgb_to_yuv_ssse3.inc",
      "simd/convert_yuv_to_rgb_mmx.inc",
      "simd/convert_yuva_to_argb_mmx.inc",
      "simd/linear_scale_yuv_to_rgb_mmx.inc",
      "simd/media_export.asm",
      "simd/scale_yuv_to_rgb_mmx.inc",
    ]

    if (current_cpu == "x86") {
      yasm_flags += [ "-DARCH_X86_32" ]
    } else if (current_cpu == "x64") {
      yasm_flags += [ "-DARCH_X86_64" ]
      sources += [
        "simd/linear_scale_yuv_to_rgb_mmx_x64.asm",
        "simd/scale_yuv_to_rgb_sse2_x64.asm",
      ]
    }

    if (is_mac || is_ios) {
      yasm_flags += [
        "-DPREFIX",
        "-DMACHO",
      ]
    } else {
      if (is_posix) {
        yasm_flags += [ "-DELF" ]
        if (current_cpu == "x64") {
          # TODO(ajwong): Why isn't this true in mac?
          yasm_flags += [ "-DPIC" ]
        }
      }
    }
  }
}

fuzzer_test("media_bit_reader_fuzzer") {
  sources = [
    "bit_reader_fuzzertest.cc",
  ]
  deps = [
    ":test_support",
    "//base",
    "//media",
  ]
}

fuzzer_test("media_container_names_fuzzer") {
  sources = [
    "container_names_fuzzertest.cc",
  ]
  deps = [
    "//base",
    "//media",
  ]
}
