# Copyright 2019 The Chromium OS 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("//common-mk/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":mps_main",
    ":rtanalytics_main",
  ]
  if (use.test) {
    deps += [ ":media_perception_service_test" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [ "protobuf" ]
}

proto_library("media_perception_protos") {
  proto_in_dir = "proto/"
  proto_out_dir = "include/media_perception"
  sources = [
    "${proto_in_dir}/common.proto",
    "${proto_in_dir}/device_management.proto",
    "${proto_in_dir}/frame_perception.proto",
    "${proto_in_dir}/hotword_detection.proto",
    "${proto_in_dir}/huddly.proto",
    "${proto_in_dir}/media_perception_mojom.proto",
    "${proto_in_dir}/occupancy_trigger.proto",
    "${proto_in_dir}/perception_interface.proto",
    "${proto_in_dir}/pipeline.proto",
    "${proto_in_dir}/presence_perception.proto",
  ]
}

generate_mojom_bindings("media_perception_mojo_bindings") {
  sources = [
    "mojom/appearances.mojom",
    "mojom/buffer_types.mojom",
    "mojom/color_space.mojom",
    "mojom/common.mojom",
    "mojom/constants.mojom",
    "mojom/device.mojom",
    "mojom/device_factory.mojom",
    "mojom/device_management.mojom",
    "mojom/devices_changed_observer.mojom",
    "mojom/frame_perception.mojom",
    "mojom/geometry.mojom",
    "mojom/hotword_detection.mojom",
    "mojom/image_capture.mojom",
    "mojom/mailbox.mojom",
    "mojom/mailbox_holder.mojom",
    "mojom/media_perception.mojom",
    "mojom/media_perception_service.mojom",
    "mojom/media_types.mojom",
    "mojom/native_handle_types.mojom",
    "mojom/occupancy_trigger.mojom",
    "mojom/one_touch_autozoom.mojom",
    "mojom/pipeline.mojom",
    "mojom/presence_perception.mojom",
    "mojom/producer.mojom",
    "mojom/scoped_access_permission.mojom",
    "mojom/shared_memory.mojom",
    "mojom/software_autozoom.mojom",
    "mojom/sync_token.mojom",
    "mojom/time.mojom",
    "mojom/unguessable_token.mojom",
    "mojom/values.mojom",
    "mojom/video_capture_types.mojom",
    "mojom/video_frame_handler.mojom",
    "mojom/video_source.mojom",
    "mojom/video_source_provider.mojom",
    "mojom/virtual_device.mojom",
    "mojom/vulkan_ycbcr_info.mojom",
  ]
}

static_library("media_perception_service_lib") {
  all_dependent_pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmojo",
  ]
  sources = [
    "audio_receiver.cc",
    "chrome_audio_service_client_impl.cc",
    "cras_client_impl.cc",
    "cros_dbus_service.cc",
    "media_perception_controller_impl.cc",
    "media_perception_impl.cc",
    "media_perception_service_impl.cc",
    "mojo_connector.cc",
    "output_manager.cc",
    "producer_impl.cc",
    "proto_mojom_conversion.cc",
    "video_capture_service_client_impl.cc",
    "video_frame_handler_impl.cc",
  ]
  pkg_deps = [
    "dbus-1",
    "libcras",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":media_perception_mojo_bindings",
    ":media_perception_protos",
  ]
}

executable("rtanalytics_main") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  libs = [
    "rtanalytics",
    "dl",
  ]

  # librtanalytics.so is imported to the build directory by mri_package ebuild.
  lib_dirs = [ root_build_dir ]
  deps = [ ":media_perception_service_lib" ]
}

executable("mps_main") {
  sources = [ "mps_main.cc" ]
  configs += [ ":target_defaults" ]
  libs = [
    "rtanalytics",
    "dl",
  ]

  # librtanalytics.so is imported to the build directory by mri_package ebuild.
  lib_dirs = [ root_build_dir ]
  deps = [ ":media_perception_service_lib" ]
}

if (use.test) {
  executable("media_perception_service_test") {
    sources = [
      "fake_chrome_audio_service_client.cc",
      "fake_rtanalytics.cc",
      "fake_video_capture_service_client.cc",
      "media_perception_impl_test.cc",
      "output_manager_test.cc",
      "proto_mojom_conversion_test.cc",
      "testrunner.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [ ":media_perception_service_lib" ]
  }
}
