# Copyright (c) 2025 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("//build/config/components/idl_tool/idl.gni")
import("//foundation/multimedia/video_processing_engine/config.gni")

config("export_config") {
  include_dirs = [
    "$AIHDR_ENHANCER_DIR/include",
    "$INTERFACES_INNER_API_DIR",
    "$DFX_DIR/include",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/include",
    "$DETAIL_ENHANCER_DIR/include",
    "$AUTO_EFFECT_AISR_VIDEO_DIR/include",
    "$COLORSPACE_CONVERTER_DIR/include",
    "$METADATA_GENERATOR_DIR/include",
    "$INTERFACES_INNER_API_DIR/native/colorspace",
    "$COLORSPACE_CONVERTER_DISPLAY_DIR/include",
    "$VIDEO_REFRESHRATE_PREDICTION_DIR/include",
    "$ALGORITHM_DIR/common/include",
    "$CONTRAST_ENHANCER_DIR/include",
    "$METADATA_GENERATOR_VIDEO_DIR/include",
    "$ALGORITHM_EXTENSION_MANAGER_DIR/include",
    "$ALGORITHM_EXTENSION_SKIA_DIR/include",
  ]
}
config("video_process_config") {
  cflags = [
    "-std=c++17",
    "-fno-rtti",
    "-fno-exceptions",
    "-Wall",
    "-fno-common",
    "-fstack-protector-strong",
    "-Wshadow",
    "-FPIC",
    "-FS",
    "-O2",
    "-D_FORTIFY_SOURCE=2",
    "-Wformat=2",

    # "-Wfloat-equal",
    "-Wdate-time",
    "-Werror",
    "-Wextra",
    "-Wimplicit-fallthrough",
    "-Wsign-compare",
    "-Wunused-parameter",
  ]

  include_dirs = [
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR",
    "$FRAMEWORK_DIR",
    "$FRAMEWORK_DIR/common/include",
    "$AIHDR_ENHANCER_DIR/include",
    "$AIHDR_ENHANCER_VIDEO_DIR/include",
    "$ALGORITHM_DIR/common/include",
    "$ALGORITHM_DIR/extension_manager/include",
    "$COLORSPACE_CONVERTER_DIR/include",
    "$COLORSPACE_CONVERTER_DISPLAY_DIR/include",
    "$COLORSPACE_CONVERTER_VIDEO_DIR/include",
    "$CONTRAST_ENHANCER_DIR/include",
    "$METADATA_GENERATOR_DIR/include",
    "$METADATA_GENERATOR_VIDEO_DIR/include",
    "$DETAIL_ENHANCER_VIDEO_DIR/include",
    "$AUTO_EFFECT_AISR_VIDEO_DIR/include",
    "$VIDEO_REFRESHRATE_PREDICTION_DIR/include",
    "$DETAIL_ENHANCER_DIR/include",
    "$DFX_DIR/include",
    "$FRAMEWORK_DIR/plugin",
    "$FRAMEWORK_DIR/module",
    "$INTERFACES_INNER_API_DIR",
    "$INTERFACES_INNER_API_DIR/module",
    "$INTERFACES_DIR/plugin",
    "$SERVICES_DIR/include",
    "$SERVICES_DIR/utils/include",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/include",
    "${target_gen_dir}/../services/",
  ]
}

if (defined(global_parts_info) &&
  defined(global_parts_info.multimedia_video_processing_engine_ext)) {
  ohos_prebuilt_shared_library("extream_vision_engine") {
      if (is_asan && use_hwasan) {
        source = "//binary/artifacts/display/AIPQ20/asan/libextream_vision_engine.so"
      } else {
        source = "//binary/artifacts/display/AIPQ20/libextream_vision_engine.so"
      }
      module_install_dir = "lib64/"
      output = "libextream_vision_engine.so"
      install_images = [ "system" ]
      subsystem_name = "multimedia"
      part_name = "video_processing_engine"
      install_enable = true
  }

  ohos_prebuilt_shared_library("ai_super_resolution") {
      if (is_asan && use_hwasan) {
        source = "//binary/artifacts/display/AIPQ20/asan/libdisplay_aipq_imagesr.so"
      } else {
        source = "//binary/artifacts/display/AIPQ20/libdisplay_aipq_imagesr.so"
      }
      module_install_dir = "lib64/"
      output = "libdisplay_aipq_imagesr.so"
      install_images = [ "system" ]
      subsystem_name = "multimedia"
      part_name = "video_processing_engine"
      install_enable = true
  }

  ohos_prebuilt_shared_library("aihdr_engine") {
      if (is_asan && use_hwasan) {
        source = "//binary/artifacts/display/AIPQ20/asan/libaihdr_engine.so"
      } else {
        source = "//binary/artifacts/display/AIPQ20/libaihdr_engine.so"
      }
      module_install_dir = "lib64/"
      output = "libaihdr_engine.so"
      install_images = [ "system" ]
      subsystem_name = "multimedia"
      part_name = "video_processing_engine"
      install_enable = true
  }
} else {
  group("extream_vision_engine") {
  }

  group("ai_super_resolution") {
  }

  group("aihdr_engine") {
  }
}

ohos_shared_library("videoprocessingengine") {
  branch_protector_ret = "pac_ret"

  install_enable = true

  sanitize = {
    boundary_sanitize = true
    cfi = true
    cfi_cross_dso = true
    integer_overflow = true
    ubsan = true
    debug = false
  }

  configs = [ ":video_process_config" ]
  public_configs = [ ":export_config" ]

  include_dirs = [
    "$DFX_DIR/include",
    "$METADATA_GENERATOR_DIR/include",
    "$METADATA_GENERATOR_VIDEO_DIR/include",
    "$VIDEO_REFRESHRATE_PREDICTION_DIR/include",
    "$ALGORITHM_DIR/common/include",
    "$ALGORITHM_DIR/extension_manager/include",
    "$COLORSPACE_CONVERTER_DIR/include",
    "$COLORSPACE_CONVERTER_VIDEO_DIR/include",
  ]

  sources = [
    "$AIHDR_ENHANCER_DIR/aihdr_enhancer_fwk.cpp",
    "$AIHDR_ENHANCER_VIDEO_DIR/aihdr_enhancer_video_impl.cpp",
    "$ALGORITHM_DIR/common/algorithm_common.cpp",
    "$ALGORITHM_DIR/common/algorithm_utils.cpp",
    "$ALGORITHM_DIR/common/algorithm_video.cpp",
    "$ALGORITHM_DIR/common/algorithm_video_common.cpp",
    "$ALGORITHM_DIR/common/algorithm_video_impl.cpp",
    "$ALGORITHM_DIR/common/frame_info.cpp",
    "$ALGORITHM_DIR/extension_manager/extension_manager.cpp",
    "$ALGORITHM_DIR/extension_manager/utils.cpp",
    "$COLORSPACE_CONVERTER_DIR/colorspace_converter_fwk.cpp",
    "$COLORSPACE_CONVERTER_VIDEO_DIR/colorspace_converter_video_impl.cpp",
    "$COLORSPACE_CONVERTER_DISPLAY_DIR/colorspace_converter_display_fwk.cpp",
    "$METADATA_GENERATOR_DIR/metadata_generator_fwk.cpp",
    "$METADATA_GENERATOR_VIDEO_DIR/metadata_generator_video_impl.cpp",
    "$DETAIL_ENHANCER_DIR/detail_enhancer_image_fwk.cpp",
    "$DETAIL_ENHANCER_VIDEO_DIR/detail_enhancer_video_fwk.cpp",
    "$DETAIL_ENHANCER_VIDEO_DIR/detail_enhancer_video_impl.cpp",
    "$AUTO_EFFECT_AISR_VIDEO_DIR/auto_effect_aisr_video.cpp",
    "$VIDEO_REFRESHRATE_PREDICTION_DIR/video_refreshrate_prediction_fwk.cpp",
    "$CONTRAST_ENHANCER_DIR/contrast_enhancer_image_fwk.cpp",
    "$DFX_DIR/vpe_trace.cpp",
    "$DFX_DIR/vpe_log.cpp",
    #client
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/src/video_processing_client.cpp",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/src/video_processing_load_callback.cpp",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/utils/surface_buffer_info.cpp",
    "${target_gen_dir}/../services/video_processing_service_manager_proxy.cpp",
    "${target_gen_dir}/../services/video_processing_service_manager_stub.cpp",
    "$ALGORITHM_COMMON_DIR/image_opencl_wrapper.cpp",
    "$ALGORITHM_COMMON_DIR/image_openclsetup.cpp"
  ]

  deps = [
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services:videoprocessingservice_interface",
    ":aihdr_engine",
    ":ai_super_resolution",
    ":extream_vision_engine",
  ]

  if (has_skia) {
    defines += [ "SKIA_ENABLE" ]
    deps += [ "//third_party/skia:skia_ohos" ]
    include_dirs += [ "$ALGORITHM_EXTENSION_SKIA_DIR/include" ]
    sources += [ "$ALGORITHM_EXTENSION_SKIA_DIR/skia_impl.cpp" ]
  }

  external_deps = [
    "c_utils:utils",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
    "graphic_2d:2d_graphics",
    "graphic_2d:EGL",
    "graphic_2d:GLESv3",
    "graphic_surface:surface",
    "graphic_surface:sync_fence",
    "hdf_core:libhdf_host",
    "hdf_core:libhdf_ipc_adapter",
    "hdf_core:libhdf_utils",
    "hdf_core:libhdi",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "image_framework:image_native",
    "init:libbegetutil",
    "ipc:ipc_single",
    "media_foundation:media_foundation",
    "safwk:system_ability_fwk",
    "samgr:samgr_proxy",
    "skia:skia_canvaskit",
    "opencl-headers:libcl",
    "bounds_checking_function:libsec_shared",
    "egl:libEGL",
    "opengles:libGLES",
  ]

  subsystem_name = "multimedia"
  part_name = "video_processing_engine"
}

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

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

config("vpe_capi_public_config") {
  include_dirs = [
    "$INTERFACES_CAPI_DIR",
    "$INTERFACES_INNER_API_DIR",
  ]
}

ohos_shared_library("image_processing") {
  stack_protector_ret = true
  install_enable = true

  sanitize = {
    boundary_sanitize = true
    cfi = true
    cfi_cross_dso = true
    integer_overflow = true
    ubsan = true
    debug = false
  }

  configs = [ ":vpe_capi_config" ]
  public_configs = [ ":vpe_capi_public_config" ]

  cflags = [
    "-ffunction-sections",
    "-fdata-sections",
    "-DIMAGE_COLORSPACE_FLAG",
  ]

  include_dirs = [
    #Interface
    "$INTERFACES_CAPI_DIR",
    "$INTERFACES_INNER_API_DIR",
    #Common
    "$DFX_DIR/include",
    "$ALGORITHM_COMMON_DIR/include",
    "$SERVICES_DIR/utils/include",
    #CAPI implementation
    "$CAPI_IMAGE_DIR/include",
    "$CAPI_IMAGE_DETAIL_ENHANCER_DIR/include",
    "$CAPI_COLORSPACE_CONVERTER_DIR/include",
    "$CAPI_METADATA_GENERATOR_DIR/include",
    "$DETAIL_ENHANCER_DIR/include",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/include",
    "${target_gen_dir}/../services/",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/framework/algorithm/common/include",
  ]

  sources = [
    "$CAPI_IMAGE_DIR/image_environment_native.cpp",
    "$CAPI_IMAGE_DIR/image_processing.cpp",
    "$CAPI_IMAGE_DIR/image_processing_factory.cpp",
    "$CAPI_IMAGE_DIR/image_processing_impl.cpp",
    "$CAPI_IMAGE_DIR/image_processing_native_base.cpp",
    "$CAPI_IMAGE_DIR/image_processing_utils.cpp",
    "$CAPI_IMAGE_DIR/image_processing_capi_capability.cpp",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/framework/algorithm/common/vpe_utils_common.cpp",
    "$CAPI_IMAGE_DETAIL_ENHANCER_DIR/detail_enhancer_image_native.cpp",
    "$CAPI_COLORSPACE_CONVERTER_DIR/colorspace_converter_image_native.cpp",
    "$CAPI_METADATA_GENERATOR_DIR/metadata_generator_image_native.cpp",
  ]

  defines = []

  deps = [
    ":videoprocessingengine",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services:videoprocessingservice_interface",
  ]

  external_deps = [
    "c_utils:utils",
    "drivers_interface_display:display_commontype_idl_headers",
    "graphic_surface:surface",
    "graphic_2d:2d_graphics",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "image_framework:image_native",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
    "ipc:ipc_single",
    "image_framework:pixelmap",
    "media_foundation:media_foundation",
    "safwk:system_ability_fwk",
    "samgr:samgr_proxy",
  ]

  innerapi_tags = [ "ndk" ]
  output_extension = "so"
  subsystem_name = "multimedia"
  part_name = "video_processing_engine"
}

ohos_shared_library("video_processing") {
  stack_protector_ret = true
  install_enable = true

  sanitize = {
    boundary_sanitize = true
    cfi = true
    cfi_cross_dso = true
    integer_overflow = true
    ubsan = true
    debug = false
  }

  configs = [ ":vpe_capi_config" ]
  public_configs = [ ":vpe_capi_public_config" ]

  include_dirs = [
    #Interface
    "$INTERFACES_CAPI_DIR",
    "$INTERFACES_INNER_API_DIR",
    #Common
    "$DFX_DIR/include",
    "$ALGORITHM_COMMON_DIR/include",
    "$SERVICES_DIR/utils/include",
    #CAPI implementation
    "$CAPI_VIDEO_DIR/include",
    "$CAPI_VIDEO_DIR/aihdr_enhancer/include",
    "$CAPI_VIDEO_DETAIL_ENHANCER_DIR/include",
    "$AUTO_EFFECT_AISR_VIDEO_DIR/include",
    "$CAPI_VIDEO_COLORSPACE_CONVERTER_DIR/include/",
    "$CAPI_VIDEO_METADATA_GENERATOR_DIR/include/",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services/include",
    "${target_gen_dir}/../services/", 
  ]

  sources = [
    #CAPI common
    "$CAPI_VIDEO_DIR/video_environment_native.cpp",
    "$CAPI_VIDEO_DIR/video_processing_callback_impl.cpp",
    "$CAPI_VIDEO_DIR/video_processing_callback_native.cpp",
    "$CAPI_VIDEO_DIR/video_processing.cpp",
    "$CAPI_VIDEO_DIR/video_processing_capi_capability.cpp",
    "$CAPI_VIDEO_DIR/video_processing_factory.cpp",
    "$CAPI_VIDEO_DIR/video_processing_impl.cpp",
    "$CAPI_VIDEO_DIR/video_processing_native_base.cpp",
    "$CAPI_VIDEO_DIR/video_processing_utils.cpp",
    #CAPI - features
    #CAPI - detail enhancement
    "$CAPI_VIDEO_DETAIL_ENHANCER_DIR/detail_enhancer_video_native.cpp",
    "$CAPI_VIDEO_COLORSPACE_CONVERTER_DIR/colorSpace_converter_video_native.cpp",
    "$CAPI_VIDEO_METADATA_GENERATOR_DIR/metadata_generator_video_native.cpp",
    "$CAPI_VIDEO_DIR/aihdr_enhancer/aihdr_enhancer_video_native.cpp"
  ]

  defines = []

  deps = [
    ":videoprocessingengine",
    "$VIDEO_PROCESSING_ENGINE_ROOT_DIR/services:videoprocessingservice_interface",
  ]

  external_deps = [
    "c_utils:utils",
    "graphic_surface:surface",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "ipc:ipc_single",
    "media_foundation:media_foundation",
    "media_foundation:native_media_core",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
    "graphic_2d:libgraphic_utils",
    "graphic_2d:librender_service_client",
    "ipc:ipc_single",
    "safwk:system_ability_fwk",
    "samgr:samgr_proxy",
  ]

  innerapi_tags = [ "ndk" ]
  output_extension = "so"
  subsystem_name = "multimedia"
  part_name = "video_processing_engine"
}

ohos_shared_library("detailEnhancer") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    cfi_vcall_icall_only = true
    debug = false
  }

  defines = [ "IMAGE_COLORSPACE_FLAG" ]

  include_dirs = [
    "$DFX_DIR/include",
    "//foundation/multimedia/video_processing_engine/interfaces/kits/js",
    "//foundation/multimedia/video_processing_engine/interfaces/inner_api",
    "//foundation/multimedia/video_processing_engine/framework/capi/image_processing/include/",
  ]
  sources = [
    "//foundation/multimedia/video_processing_engine/framework/capi/image_processing/detail_enhance_napi.cpp",
  ]

  deps = [
    ":videoprocessingengine",
  ]

  cflags = VIDEO_PROCESSING_ENGINE_CFLAGS
  external_deps = [
    "c_utils:utils",
    "graphic_surface:surface",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "ipc:ipc_napi",
    "media_foundation:native_media_core",
    "napi:ace_napi",
    "image_framework:image_utils",
    "image_framework:image_native",
    "image_framework:pixelmap",
    "image_framework:image",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
  ]

  output_name = "libdetailenhancer_napi"
  subsystem_name = "multimedia"
  relative_install_dir = "module/multimedia"
  part_name = "video_processing_engine"
}

ohos_shared_library("videoprocessingenginenapi") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    cfi_vcall_icall_only = true
    debug = false
  }

  defines = [ "IMAGE_COLORSPACE_FLAG" ]

  include_dirs = [
    "$DFX_DIR/include",
    "$INTERFACES_DIR/kits/js",
    "$INTERFACES_INNER_API_DIR",
    "$CAPI_DIR/image_processing/include/",
    "$ALGORITHM_COMMON_DIR/include/",
    "$INTERFACES_CAPI_DIR",
  ]
  sources = [
    "$CAPI_DIR/image_processing/detail_enhance_napi_formal.cpp",
    "$INTERFACES_DIR/kits/js/native_module_ohos_imageprocessing.cpp",
  ]

  deps = [
    ":videoprocessingengine",
  ]

  cflags = VIDEO_PROCESSING_ENGINE_CFLAGS
  external_deps = [
    "c_utils:utils",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
    "graphic_surface:surface",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "image_framework:image_utils",
    "image_framework:image_native",
    "image_framework:pixelmap",
    "image_framework:image",
    "ipc:ipc_napi",
    "media_foundation:native_media_core",
    "media_foundation:media_foundation",
    "napi:ace_napi",
  ]

  output_name = "libvideoprocessingengine_napi"
  subsystem_name = "multimedia"
  relative_install_dir = "module/multimedia"
  part_name = "video_processing_engine"
}

ohos_shared_library("videoprocessing_napi") {
  branch_protector_ret = "pac_ret"
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    cfi_vcall_icall_only = true
    debug = false
  }
 
  defines = [ ]
 
  include_dirs = [
    "$DFX_DIR/include",
    "$INTERFACES_DIR/kits/js",
    "$INTERFACES_INNER_API_DIR",
    "$ALGORITHM_COMMON_DIR/include/",
    "$INTERFACES_CAPI_DIR",
    "$SERVICES_DIR/utils/include",
  ]
  sources = [
    "$INTERFACES_DIR/kits/js/native_module_ohos_video_processing.cpp",
    "$INTERFACES_DIR/kits/js/video_processor_napi.cpp",
  ]
 
  deps = [
    ":videoprocessingengine",
  ]
 
  cflags = VIDEO_PROCESSING_ENGINE_CFLAGS
  external_deps = [
    "c_utils:utils",
    "drivers_interface_display:libdisplay_commontype_proxy_2.1",
    "hilog:libhilog",
    "hitrace:hitrace_meter",
    "ipc:ipc_napi",
    "media_foundation:native_media_core",
    "media_foundation:media_foundation",
    "napi:ace_napi",
  ]
 
  subsystem_name = "multimedia"
  relative_install_dir = "module/multimedia"
  part_name = "video_processing_engine"
}