# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

declare_args() {
  # Whether or not to enable the ffmpeg_demuxer_test target. The target will
  # only work if ffmpeg 58.35.100 is installed on the build machine.
  #
  # TODO(b/239961799): Rework the test to run regardless of the installed
  # ffmpeg version.
  enable_ffmpeg_demuxer_test = false
}

ffmpeg_specialization_sources = [
  "ffmpeg_audio_decoder_impl.cc",
  "ffmpeg_audio_decoder_impl.h",
  "ffmpeg_common.h",
  "ffmpeg_demuxer_impl.cc",
  "ffmpeg_demuxer_impl.h",
  "ffmpeg_video_decoder_impl.cc",
  "ffmpeg_video_decoder_impl.h",
]

static_library("ffmpeg_dynamic_load") {
  sources = [
    "ffmpeg_dynamic_load_audio_decoder_impl.cc",
    "ffmpeg_dynamic_load_demuxer_impl.cc",
    "ffmpeg_dynamic_load_dispatch_impl.cc",
    "ffmpeg_dynamic_load_video_decoder_impl.cc",
  ]
  public_deps = [
    ":ffmpeg.57.107.100",
    ":ffmpeg.58.35.100",
    ":ffmpeg_dispatch_sources",
    ":libav.54.35.1",
    ":libav.56.1.0",
  ]
}

# TODO(b/208910380): ffmpeg_linked doesn't compile for linux locally.
_target_platform_name_parts = string_split(target_platform, "-")
_building_linux_platform = _target_platform_name_parts[0] == "linux"
if (!_building_linux_platform) {
  static_library("ffmpeg_linked") {
    check_includes = false
    sources = ffmpeg_specialization_sources + [
                "ffmpeg_linked_audio_decoder_impl.cc",
                "ffmpeg_linked_demuxer_impl.cc",
                "ffmpeg_linked_dispatch_impl.cc",
                "ffmpeg_linked_video_decoder_impl.cc",
              ]
    public_deps = [ ":ffmpeg_dispatch_sources" ]
  }
}

# We recompile the specialization sources for each different library version.
# Changing include_dirs changes where implementations in the sources look.
template("versioned_ffmpeg_library") {
  not_needed(invoker, "*")
  static_library(target_name) {
    check_includes = false
    sources = ffmpeg_specialization_sources
    public_deps = [ "//starboard/common" ]

    configs += [
      "//starboard/build/config:starboard_implementation",
      ":${target_name}_config",
    ]
  }

  config("${target_name}_config") {
    include_dirs = [ "//third_party/ffmpeg_includes/$target_name" ]
  }
}

versioned_ffmpeg_library("libav.54.35.1") {
}
versioned_ffmpeg_library("libav.56.1.0") {
}
versioned_ffmpeg_library("ffmpeg.57.107.100") {
}
versioned_ffmpeg_library("ffmpeg.58.35.100") {
}

static_library("ffmpeg_dispatch_sources") {
  check_includes = false
  sources = [
    "ffmpeg_audio_decoder.h",
    "ffmpeg_demuxer.cc",
    "ffmpeg_demuxer.h",
    "ffmpeg_dispatch.cc",
    "ffmpeg_dispatch.h",
    "ffmpeg_video_decoder.h",
  ]

  public_configs = [ "//starboard/build/config:starboard_implementation" ]
}

if (enable_ffmpeg_demuxer_test) {
  target(gtest_target_type, "ffmpeg_demuxer_test") {
    testonly = true
    configs += [ "//starboard/build/config:starboard_implementation" ]
    sources = ffmpeg_specialization_sources + [
                "ffmpeg_demuxer.h",
                "ffmpeg_demuxer.cc",
                "ffmpeg_demuxer_test.cc",
              ]

    # Build only against one specified version of the ffmpeg includes. That means
    # that this binary will only work well when run on a machine with the given
    # version of ffmpeg installed. This test binary actually should have
    # specializations for all supported ffmpeg versions, or it should only test
    # the behavior of the abstraction layer without testing implementation
    # details.
    include_dirs = [ "//third_party/ffmpeg_includes/ffmpeg.58.35.100" ]
    deps = [
      "//cobalt/test:run_all_unittests",
      "//starboard",
      "//starboard/common",
      "//testing/gmock",
      "//testing/gtest",
    ]
  }
}
