# Copyright 2018 The Fuchsia 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/cipd.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/package.gni")
import("//build/test/test_package.gni")

declare_args() {
  amlogic_decoder_tests = false

  # Path to the amlogic decoder firmware file. Overrides the default in the build.
  amlogic_decoder_firmware_path = ""
}

# These targets only compile for arm64.
if (target_cpu == "arm64") {
  driver_module("amlogic_decoder") {
    output_name = "amlogic_video_decoder"

    deps = [
      ":sources",
      ":test_support",
    ]

    sources = [ "tests/test_support_disabled.cc" ]

    configs -= [ "//build/config/fuchsia:no_cpp_standard_library" ]
    configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
  }

  # This version of the driver runs tests on startup.
  driver_module("amlogic_decoder_test") {
    output_name = "amlogic_video_decoder_test"

    testonly = true

    deps = [
      ":sources",
      ":tests",
    ]

    configs -= [ "//build/config/fuchsia:no_cpp_standard_library" ]
    configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
  }

  config("sources_include_config") {
    include_dirs = [ "." ]
    if (amlogic_decoder_tests) {
      include_dirs += [ "./tests/integration/test_data_headers" ]
    }
  }

  source_set("test_support") {
    deps = [
      "//src/devices:driver",
      "//zircon/public/lib/ddk",
    ]
    sources = [ "tests/test_support.h" ]
  }

  source_set("sources") {
    sources = [
      # Driver structure:
      "device_ctx.cc",
      "device_ctx.h",
      "driver_ctx.cc",
      "driver_ctx.h",

      # HW driving:
      "amlogic-video.cc",
      "amlogic-video.h",
      "binding.c",
      "decoder_core.h",
      "firmware_blob.cc",
      "firmware_blob.h",
      "h264_decoder.cc",
      "h264_decoder.h",
      "hevcdec.cc",
      "hevcdec.h",
      "internal_buffer.cc",
      "internal_buffer.h",
      "macros.h",
      "mpeg12_decoder.cc",
      "mpeg12_decoder.h",
      "parser.cc",
      "parser.h",
      "pts_manager.cc",
      "pts_manager.h",
      "registers.h",
      "secmem_client_session.cc",
      "secmem_client_session.h",
      "teec_context.cc",
      "teec_context.h",
      "third_party/vp9_adapt_probs/vp9_coefficient_adaptation.c",
      "vdec1.cc",
      "vdec1.h",
      "video_decoder.h",
      "video_firmware_session.cc",
      "video_firmware_session.h",
      "video_frame.cc",
      "video_frame.h",
      "vp9_decoder.cc",
      "vp9_decoder.h",
      "vp9_utils.cc",
      "vp9_utils.h",
      "watchdog.cc",
      "watchdog.h",

      # CodecFactory+Codec interface handling:
      "codec_adapter_h264.cc",
      "codec_adapter_h264.h",
      "codec_adapter_mpeg2.cc",
      "codec_adapter_mpeg2.h",
      "codec_adapter_vp9.cc",
      "codec_adapter_vp9.h",
      "device_fidl.cc",
      "device_fidl.h",
      "local_codec_factory.cc",
      "local_codec_factory.h",
    ]
    public_deps = [
      "//src/devices:driver",
      "//zircon/public/lib/async-cpp",
      "//zircon/public/lib/async-loop-cpp",
      "//zircon/public/lib/async-loop-default",
      "//zircon/public/lib/ddk",
      "//zircon/public/lib/ddktl",
      "//zircon/public/lib/device-protocol-platform-device",
      "//zircon/public/lib/fbl",
      "//zircon/public/lib/hwreg",
      "//zircon/public/lib/mmio",
      "//zircon/public/lib/tee-client-api",
      "//zircon/public/lib/zx",
      "//zircon/system/banjo/ddk.protocol.amlogiccanvas",
      "//zircon/system/banjo/ddk.protocol.composite",
      "//zircon/system/banjo/ddk.protocol.sysmem",
      "//zircon/system/banjo/ddk.protocol.tee",
    ]
    deps = [
      ":test_support",
      "third_party/libvpx",
      "//sdk/fidl/fuchsia.mediacodec",
      "//sdk/lib/fidl/cpp",
      "//src/media/lib/codec_impl",
      "//zircon/system/fidl/fuchsia-hardware-mediacodec:fuchsia-hardware-mediacodec_c",
    ]
    public_configs = [ ":sources_include_config" ]
    cflags = []
  }

  source_set("tests") {
    testonly = true
    deps = [
      ":sources",
      ":test_support",
      "//sdk/fidl/fuchsia.mediacodec",
      "//src/media/lib/codec_impl",
      "//third_party/boringssl:crypto",
      "//third_party/googletest:gtest",
    ]
    sources = [
      "tests/integration/test_h264.cc",
      "tests/integration/test_mpeg2.cc",
      "tests/integration/test_parser.cc",
      "tests/integration/test_vp9.cc",
      "tests/integration/video_frame_helpers.cc",
      "tests/integration/video_frame_helpers.h",
      "tests/test_support.cc",
      "tests/unit_tests/test_binding.cc",
      "tests/unit_tests/test_vp9.cc",
    ]
  }

  copy("test_files") {
    sources = [
      "//garnet/test_data/media/third_party/chromium_media_test_data/bear.h264",
      "//garnet/test_data/media/third_party/chromium_media_test_data/test-25fps.h264",
      "//garnet/test_data/media/third_party/chromium_media_test_data/test-25fps.vp9",
      "//garnet/test_data/media/third_party/chromium_media_test_data/test-25fps.vp9_2",
      "//garnet/test_data/media/third_party/chromium_media_test_data_downstream/bear.mpeg2",
    ]
    outputs = [ "$root_out_dir/firmware/video_test_data/{{source_file_part}}" ]
  }

  package("amlogic_video_decoder") {
    deprecated_system_image = true

    # internal access is needed to get the firmware from the default path
    if (target_cpu == "arm64" &&
        (internal_access || amlogic_decoder_firmware_path != "")) {
      if (amlogic_decoder_tests) {
        testonly = true
      }

      if (amlogic_decoder_firmware_path == "") {
        amlogic_decoder_firmware_path = "firmware/video_ucode.bin"
      }
      libraries = [
        {
          source = rebase_path(amlogic_decoder_firmware_path)
          name = "firmware/amlogic_video_ucode.bin"
        },
      ]

      deps = []
      if (amlogic_decoder_tests) {
        deps += [
          ":amlogic_decoder_test",
          ":test_files($shlib_toolchain)",
        ]
        drivers = [
          {
            name = "amlogic_video_decoder_test.so"
          },
        ]

        # The test data is stored as a firmware file, because that's the only way
        # that a file can be read from a driver.
        libraries += [
          {
            name = "firmware/video_test_data/bear.mpeg2"
          },
          {
            name = "firmware/video_test_data/bear.h264"
          },
          {
            name = "firmware/video_test_data/test-25fps.h264"
          },
          {
            name = "firmware/video_test_data/test-25fps.vp9"
          },
          {
            name = "firmware/video_test_data/test-25fps.vp9_2"
          },
        ]
      } else {
        deps += [ ":amlogic_decoder" ]
        drivers = [
          {
            name = "amlogic_video_decoder.so"
          },
        ]
      }
    } else {
      assert(!amlogic_decoder_tests, "amlogic decoder not built")
    }
  }

  # This causes both versions of the driver to be built, so compile
  # errors in tests are hit on the CQ.
  group("amlogic_video_decoder_test_build") {
    testonly = true

    if (target_cpu == "arm64") {
      deps = [
        ":amlogic_decoder",
        ":amlogic_decoder_test",
        ":test_amlogic_codec_factory_package",
      ]
    }
  }

  #
  # Manual tests
  #

  executable("test_amlogic_codec_factory") {
    testonly = true
    sources = [ "tests/manual/test_amlogic_codec_factory.cc" ]
    deps = [
      "//sdk/fidl/fuchsia.mediacodec",
      "//sdk/lib/sys/cpp",
      "//zircon/public/lib/async-loop-cpp",
      "//zircon/public/lib/async-loop-default",
    ]
  }

  test_package("test_amlogic_codec_factory_package") {
    if (target_cpu == "arm64") {
      deps = [ ":test_amlogic_codec_factory" ]
      tests = [
        {
          name = "test_amlogic_codec_factory"
          environments = [ astro_env ]

          # Manual only test; comment out to use `fx run-test`
          disabled = true
        },
      ]
    }
  }
}
