# Copyright 2019 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/driver_package.gni")
import("//build/test/test_package.gni")

# These targets only compile for arm64.
if (target_cpu == "arm64") {
  source_set("lib") {
    sources = [
      "binding.cc",
      "codec_adapter_h264.cc",
      "codec_adapter_h264.h",
      "device_ctx.cc",
      "device_ctx.h",
      "internal_buffer.cc",
      "internal_buffer.h",
      "local_codec_factory.cc",
      "local_codec_factory.h",
      "macros.h",
      "memory_barriers.h",
      "registers.h",
      "scoped_canvas.cc",
      "scoped_canvas.h",
    ]

    public_deps = [
      "//sdk/banjo/ddk.protocol.amlogiccanvas",
      "//sdk/banjo/ddk.protocol.composite",
      "//sdk/banjo/ddk.protocol.platform.device",
      "//sdk/banjo/ddk.protocol.sysmem",
      "//sdk/fidl/fuchsia.hardware.mediacodec:fuchsia.hardware.mediacodec_c",
      "//sdk/fidl/fuchsia.mediacodec",
      "//sdk/lib/fidl/cpp",
      "//src/devices/bus/lib/device-protocol-pdev",
      "//src/devices/bus/lib/device-protocol-platform-device",
      "//src/devices/lib/driver",
      "//src/media/codec/codecs:output_sink",
      "//src/media/lib/codec_impl",
      "//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/fit",
      "//zircon/public/lib/hwreg",
      "//zircon/public/lib/mmio",
      "//zircon/public/lib/sync",
      "//zircon/public/lib/zx",
      "//zircon/system/ulib/fidl-utils",
    ]
  }

  driver_module("amlogic_encoder_driver") {
    output_name = "amlogic_video_encoder"
    deps = [ ":lib" ]

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

  driver_package("amlogic_encoder") {
    # internal access is needed to get firmware from prebuilt path
    if (internal_access && target_cpu == "arm64") {
      libraries = [
        {
          source = rebase_path(
                  "//prebuilt/media/firmware/amlogic_encoder/h264_enc.bin")
          name = "firmware/h264_enc.bin"
        },
      ]
      deps = [ ":amlogic_encoder_driver" ]
      drivers = [
        {
          name = "amlogic_video_encoder.so"
        },
      ]
    }
  }

  executable("amlogic_encoder_unittests") {
    testonly = true
    sources = [ "test/device_test.cc" ]
    deps = [
      ":lib",
      "//src/devices/testing/fake-bti",
      "//src/devices/testing/fake_ddk",
      "//src/devices/testing/mock-mmio-reg",
      "//zircon/public/lib/zxtest",
    ]
  }

  test_package("amlogic_encoder_tests") {
    deps = [ ":amlogic_encoder_unittests" ]
    tests = [
      {
        name = "amlogic_encoder_unittests"
        environments = basic_envs
      },
    ]
  }

  group("tests") {
    testonly = true
    deps = [ ":amlogic_encoder_tests" ]
  }
}
