# Copyright (C) 2023-2026 Huawei Device Co., Ltd.
# 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.

import("//build/ohos.gni")
import("//foundation/multimedia/av_codec/config.gni")

config("av_codec_packege_include") {
  include_dirs = [
    "$av_codec_root_dir/frameworks/native/avcodec",
    "$av_codec_root_dir/frameworks/native/avcodeclist",
    "$av_codec_root_dir/frameworks/native/avdemuxer",
    "$av_codec_root_dir/frameworks/native/avmuxer",
    "$av_codec_root_dir/frameworks/native/avsource",
    "$av_codec_root_dir/interfaces/inner_api/native",
    "$av_codec_root_dir/interfaces/kits/c",
    "$av_codec_root_dir/interfaces",
    "$av_codec_root_dir/services/dfx/include",
    "$av_codec_root_dir/services/include",
    "$av_codec_root_dir/services/services/codec/client",
    "$av_codec_root_dir/services/services/codec/ipc",
    "$av_codec_root_dir/services/services/codeclist/client",
    "$av_codec_root_dir/services/services/codeclist/ipc",
    "$av_codec_root_dir/services/services/common",
    "$av_codec_root_dir/services/services/common/event_manager",
    "$av_codec_root_dir/services/services/demuxer/client",
    "$av_codec_root_dir/services/services/demuxer/ipc",
    "$av_codec_root_dir/services/services/muxer/client",
    "$av_codec_root_dir/services/services/muxer/ipc",
    "$av_codec_root_dir/services/services/sa_avcodec/client",
    "$av_codec_root_dir/services/services/sa_avcodec/ipc",
    "$av_codec_root_dir/services/services/source/client",
    "$av_codec_root_dir/services/services/source/ipc",
    "$av_codec_root_dir/services/engine/base/include",
    "$av_codec_root_dir/services/services/codec/server/audio",
    "$av_codec_root_dir/services/services/codec/server/post_processing",
    "$av_codec_root_dir/services/engine/codec/include/audio",
    "$av_codec_root_dir/services/engine/codeclist",
    "$av_codec_root_dir/services/engine/common/include",
    "$av_codec_root_dir/services/utils/include",
  ]
}

config("av_codec_client_local_config") {
  include_dirs = [
    "$av_codec_root_dir/services/services/factory",
    "$av_codec_root_dir/services/engine/factory",

    "$av_codec_root_dir/services/media_engine/modules/muxer",
    "$av_codec_root_dir/services/media_engine/modules/demuxer",
    "$av_codec_root_dir/services/engine/plugin/common",
    "$av_codec_root_dir/services/engine/plugin/core",
    "$av_codec_root_dir/services/engine/plugin/interface",
    "$av_codec_root_dir/services/engine/source/hst_releated",
    "$av_codec_root_dir/services/media_engine/modules",
  ]
}

config("av_codec_client_ipc_config") {
  include_dirs = [
    "$av_codec_root_dir/services/services/codec/client",
    "$av_codec_root_dir/services/services/codec/ipc",
    "$av_codec_root_dir/services/services/codeclist/client",
    "$av_codec_root_dir/services/services/codeclist/ipc",
    "$av_codec_root_dir/services/services/common",
    "$av_codec_root_dir/services/services/demuxer/client",
    "$av_codec_root_dir/services/services/demuxer/ipc",
    "$av_codec_root_dir/services/services/muxer/client",
    "$av_codec_root_dir/services/services/muxer/ipc",
    "$av_codec_root_dir/services/services/sa_avcodec/client",
    "$av_codec_root_dir/services/services/sa_avcodec/ipc",
    "$av_codec_root_dir/services/services/source/client",
    "$av_codec_root_dir/services/services/source/ipc",
  ]
}

config("av_codec_client_public_config") {
  include_dirs = [
    "./",
    "$av_codec_root_dir/frameworks/native/avcodec",
    "$av_codec_root_dir/frameworks/native/avcodeclist",
    "$av_codec_root_dir/frameworks/native/avdemuxer",
    "$av_codec_root_dir/frameworks/native/avmuxer",
    "$av_codec_root_dir/frameworks/native/avsource",
    "$av_codec_root_dir/interfaces/kits/c",
    "$av_codec_root_dir/services/include",
    "$av_codec_root_dir/services/dfx/include",
    "$av_codec_root_dir/services/utils/include",
    "../../../services/services/common/adaptive_framerate_controller",
  ]

  defines = []
  defines += av_codec_defines

  if (target_cpu == "arm64" || is_emulator) {
    av_codec_plugin_path = "\"/system/lib64/media/av_codec_plugins\""
    av_codec_path = "\"/system/lib64\""
  } else {
    av_codec_plugin_path = "\"/system/lib/media/av_codec_plugins\""
    av_codec_path = "\"/system/lib\""
  }

  defines += [
    "AV_CODEC_PLUGIN_PATH=${av_codec_plugin_path}",
    "AV_CODEC_PLUGIN_FILE_TAIL=\".z.so\"",
    "AV_CODEC_PATH=${av_codec_path}",
  ]

  if (av_codec_client_support_codec) {
    defines += [ "CLIENT_SUPPORT_CODEC" ]
  } else {
    defines += [ "CLIENT_UNSUPPORT_CODEC" ]
  }

  if (av_codec_enable_special_codec) {
    defines += [ "AV_CODEC_AUDIO_SPECIAL_CAPACITY" ]
  }
}

config("av_codec_suspend_client_public_config") {
  include_dirs = [
    "./",
    "$av_codec_root_dir/frameworks/native/avcodec",
    "$av_codec_root_dir/services/dfx/include",
    "$av_codec_root_dir/services/include",
    "$av_codec_root_dir/services/utils/include/",
  ]

  defines = []

  if (target_cpu == "arm64" || is_emulator) {
    av_codec_plugin_path = "\"/system/lib64/media/av_codec_plugins\""
    av_codec_path = "\"/system/lib64\""
  } else {
    av_codec_plugin_path = "\"/system/lib/media/av_codec_plugins\""
    av_codec_path = "\"/system/lib\""
  }

  defines += [
    "AV_CODEC_PLUGIN_PATH=${av_codec_plugin_path}",
    "AV_CODEC_PLUGIN_FILE_TAIL=\".z.so\"",
    "AV_CODEC_PATH=${av_codec_path}",
  ]
}

config("av_codec_client_codec_config") {
  include_dirs = [
    "$av_codec_root_dir/interfaces/inner_api/native",
    "$av_codec_root_dir/interfaces/kits/c",
    "$av_codec_root_dir/services/dfx/include",
    "$av_codec_root_dir/services/drm_decryptor",
    "$av_codec_root_dir/services/utils/include/",
    "$av_codec_root_dir/services/engine/base/include/",
    "$av_codec_root_dir/services/engine/codec/include/audio/",
    "$av_codec_root_dir/services/engine/common/include/",
    "$av_codec_root_dir/services/media_engine/modules/media_codec/",
    "$av_codec_root_dir/services/media_engine/plugins/demuxer/common/",
    "$av_codec_root_dir/services/media_engine/plugins/ffmpeg_adapter/common/",
  ]
}

config("av_codec_client_compile_config") {
  cflags = [
    "-fno-exceptions",
    "-Wall",
    "-fno-common",
    "-fstack-protector-strong",
    "-Wshadow",
    "-FPIC",
    "-FS",
    "-O2",
    "-D_FORTIFY_SOURCE=2",
    "-Wformat=2",
    "-Wdate-time",
  ]

  cflags_cc = [
    "-std=c++17",
    "-fno-rtti",
  ]

  if (target_cpu == "arm") {
    cflags += [ "-DBINDER_IPC_32BIT" ]
  }
}

ohos_shared_library("av_codec_client") {
  branch_protector_ret = "pac_ret"
  install_enable = true
  public_configs = [
    ":av_codec_client_local_config",
    ":av_codec_client_ipc_config",
    ":av_codec_client_public_config",
    ":av_codec_packege_include",
    ":av_codec_client_codec_config",
  ]

  sanitize = av_codec_sanitize

  configs = [
    ":av_codec_packege_include",
    ":av_codec_client_compile_config",
    "$av_codec_root_dir/services/media_engine/modules:av_codec_media_engine_modules_config",
  ]

  sources = [
    "$av_codec_root_dir/frameworks/native/avcodec/avcodec_monitor.cpp",
    "$av_codec_root_dir/frameworks/native/avcodec/avcodec_suspend.cpp",
    "$av_codec_root_dir/frameworks/native/common/avcodec_errors.cpp",
    "$av_codec_root_dir/services/dfx/avcodec_dfx_component.cpp",
    "$av_codec_root_dir/services/services/sa_avcodec/client/avcodec_client.cpp",
    "$av_codec_root_dir/services/services/sa_avcodec/ipc/avcodec_listener_stub.cpp",
    "$av_codec_root_dir/services/services/sa_avcodec/ipc/avcodec_service_proxy.cpp",
  ]
  if (av_codec_support_codec) {
    sources += [
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_audio_codec_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_audio_codec_inner_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_audio_decoder_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_audio_encoder_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_video_decoder_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avcodec/avcodec_video_encoder_impl.cpp",
      "$av_codec_root_dir/services/services/codec/client/buffer_converter.cpp",
      "$av_codec_root_dir/services/services/codec/client/codec_buffer_circular.cpp",
      "$av_codec_root_dir/services/services/codec/client/codec_client.cpp",
      "$av_codec_root_dir/services/services/codec/ipc/codec_listener_stub.cpp",
      "$av_codec_root_dir/services/services/codec/ipc/codec_service_proxy.cpp",
    ]
  }
  if (av_codec_support_codeclist) {
    sources += [
      "$av_codec_root_dir/frameworks/native/avcodeclist/avcodec_info.cpp",
      "$av_codec_root_dir/frameworks/native/avcodeclist/avcodeclist_impl.cpp",
      "$av_codec_root_dir/services/services/codeclist/client/codeclist_client.cpp",
      "$av_codec_root_dir/services/services/codeclist/ipc/codeclist_service_proxy.cpp",
      "$av_codec_root_dir/services/services/sa_avcodec/ipc/codeclist_parcel.cpp",
    ]
  }
  if (av_codec_client_support_codec) {
    sources += [
      "$av_codec_root_dir/services/drm_decryptor/codec_drm_decrypt.cpp",
      "$av_codec_root_dir/services/engine/codeclist/audio_codeclist_info.cpp",
      "$av_codec_root_dir/services/engine/codeclist/codec_ability_singleton.cpp",
      "$av_codec_root_dir/services/engine/codeclist/codeclist_builder.cpp",
      "$av_codec_root_dir/services/engine/codeclist/codeclist_core.cpp",
      "$av_codec_root_dir/services/engine/codeclist/codeclist_dump.cpp",
      "$av_codec_root_dir/services/media_engine/plugins/ffmpeg_adapter/common/hdi_codec.cpp",
      "$av_codec_root_dir/services/services/codec/server/audio/audio_codec_factory.cpp",
      "$av_codec_root_dir/services/services/codec/server/audio/audio_codec_server.cpp",
    ]
  }
  if (av_codec_support_demuxer) {
    include_dirs = [
      "$av_codec_root_dir/services/media_engine/modules",
      "$av_codec_root_dir/services/media_engine/plugins",
    ]

    if (target_cpu == "arm64" || is_emulator) {
      av_codec_plugin_path = "\"/system/lib64/media/av_codec_plugins\""
    } else {
      av_codec_plugin_path = "\"/system/lib/media/av_codec_plugins\""
    }

    if (target_cpu == "arm64" || is_emulator) {
      oh_file_plugin_path = "\"/system/lib64/media/histreamer_plugins\""
    } else {
      oh_file_plugin_path = "\"/system/lib/media/histreamer_plugins\""
    }

    defines = []
    defines += av_codec_defines
    defines += [
      "AV_CODEC_PLUGIN_PATH=${av_codec_plugin_path}",
      "AV_CODEC_PLUGIN_FILE_TAIL=\".z.so\"",
      "OH_FILE_PLUGIN_PATH=${oh_file_plugin_path}",
    ]
    sources += [
      "$av_codec_root_dir/frameworks/native/avdemuxer/avdemuxer_impl.cpp",
      "$av_codec_root_dir/frameworks/native/avsource/avsource_impl.cpp",
    ]
  }
  if (av_codec_support_muxer) {
    sources +=
        [ "$av_codec_root_dir/frameworks/native/avmuxer/avmuxer_impl.cpp" ]
  }
  deps = [
    "$av_codec_root_dir/services/dfx:av_codec_service_dfx",
    "$av_codec_root_dir/services/media_engine/modules:av_codec_media_engine_modules",
    "$av_codec_root_dir/services/services/sa_avcodec/client:statistics_event_ipc",
    "$av_codec_root_dir/frameworks/native/avcodec/pre_processing/fast_kits_interface:fast_image_loader",
    "$av_codec_root_dir/frameworks/native/avcodec/pre_processing/frame_drop:frame_drop",
    "$av_codec_root_dir/frameworks/native/avcodec/pre_processing/cpu_image_processor:cpu_image_processor",
  ]

  if (av_codec_client_support_codec) {
    deps += [ "$av_codec_root_dir/services/engine/codec/audio:av_codec_audio_ffmpeg_codec" ]
  }

  if (av_codec_support_codeclist) {
    deps += [ "$av_codec_root_dir/services/engine:av_codec_engine_package" ]
  }

  deps += [ "$av_codec_root_dir/services/media_engine/modules:av_codec_media_engine_modules" ]

  public_external_deps = [
    "media_foundation:media_foundation",
    "ffmpeg:libohosffmpeg",
  ]

  external_deps = [
    "bounds_checking_function:libsec_static",
    "bundle_framework:appexecfwk_base",
    "bundle_framework:appexecfwk_core",
    "c_utils:utils",
    "drivers_interface_codec:libcodec_proxy_4.0",
    "graphic_surface:surface",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "ipc:ipc_single",
    "qos_manager:qos",
    "samgr:samgr_proxy",
    "ffmpeg:libohosffmpeg",
  ]

  if (av_codec_support_drm) {
    external_deps += [ "drm_framework:drm_framework" ]
  }

  innerapi_tags = [
    "platformsdk",
    "sasdk",
  ]

  subsystem_name = "multimedia"
  part_name = "av_codec"
}

ohos_shared_library("av_codec_suspend_client") {
  branch_protector_ret = "pac_ret"
  install_enable = true
  public_configs = [
    ":av_codec_client_local_config",
    ":av_codec_client_ipc_config",
    ":av_codec_suspend_client_public_config",
    ":av_codec_packege_include",
    ":av_codec_client_codec_config",
  ]

  sanitize = av_codec_sanitize

  configs = [
    ":av_codec_packege_include",
    ":av_codec_client_compile_config",
    "$av_codec_root_dir/services/media_engine/modules:av_codec_media_engine_modules_config",
  ]

  sources = [
    "$av_codec_root_dir/frameworks/native/avcodec/avcodec_suspend.cpp",
    "$av_codec_root_dir/frameworks/native/common/avcodec_errors.cpp",
    "$av_codec_root_dir/services/dfx/avcodec_dfx_component.cpp",
    "$av_codec_root_dir/services/services/sa_avcodec/client/avcodec_client.cpp",
    "$av_codec_root_dir/services/services/sa_avcodec/ipc/avcodec_listener_stub.cpp",
  ]

  deps = [ "$av_codec_root_dir/services/dfx:av_codec_service_dfx" ]

  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "ipc:ipc_single",
    "media_foundation:media_foundation",
    "samgr:samgr_proxy",
  ]

  innerapi_tags = [
    "platformsdk",
    "sasdk",
  ]

  subsystem_name = "multimedia"
  part_name = "av_codec"
}