# codec

option(WITH_CURSOR_DUMP "Dump mouse cursor data to binary directory" OFF)
if(WITH_CURSOR_DUMP)
  add_compile_definitions(WITH_CURSOR_DUMP)
  add_compile_definitions(CURSOR_DUMP_DIR="${CMAKE_CURRENT_BINARY_DIR}")
endif()

set(CODEC_SRCS
    bulk.c
    bulk.h
    dsp.c
    color.c
    color.h
    audio.c
    planar.c
    bitmap.c
    interleaved.c
    progressive.c
    rfx_bitstream.h
    rfx_constants.h
    rfx_decode.c
    rfx_decode.h
    rfx_differential.h
    rfx_dwt.c
    rfx_dwt.h
    rfx_encode.c
    rfx_encode.h
    rfx_quantization.c
    rfx_quantization.h
    rfx_rlgr.c
    rfx_rlgr.h
    rfx_types.h
    rfx.c
    region.c
    nsc.c
    nsc_encode.c
    nsc_encode.h
    nsc_types.h
    ncrush.c
    xcrush.c
    mppc.c
    zgfx.c
    clear.c
    jpeg.c
    h264.c
    yuv.c
    video.c
)

if(WITH_GFX_AV1)
  include(WarnExperimental)
  warn_experimental("AV1 codec support for GFX channel" "-DWITH_GFX_AV1=OFF")
  list(APPEND CODEC_SRCS av1.c)
endif()

set(CODEC_SSE3_SRCS sse/rfx_sse2.c sse/rfx_sse2.h sse/nsc_sse2.c sse/nsc_sse2.h)

set(CODEC_NEON_SRCS neon/rfx_neon.c neon/rfx_neon.h neon/nsc_neon.c neon/nsc_neon.h)

# Append initializers
set(CODEC_LIBS "")
list(APPEND CODEC_SRCS ${CODEC_SSE3_SRCS})
list(APPEND CODEC_SRCS ${CODEC_NEON_SRCS})

include(CompilerDetect)
include(DetectIntrinsicSupport)

if(WITH_SIMD)
  set_simd_source_file_properties("sse3" ${CODEC_SSE3_SRCS})
  set_simd_source_file_properties("neon" ${CODEC_NEON_SRCS})
endif()

if(WITH_DSP_FFMPEG)
  set(CODEC_SRCS ${CODEC_SRCS} dsp_ffmpeg.c dsp_ffmpeg.h)
  include_directories(SYSTEM ${FFMPEG_INCLUDE_DIRS})
  list(APPEND CODEC_LIBS ${FFMPEG_LIBRARIES})
  freerdp_pc_add_requires_private("libavfilter;libavformat;libavcodec;libavutil;libswresample")
endif(WITH_DSP_FFMPEG)

if(WITH_SOXR)
  list(APPEND CODEC_LIBS ${SOXR_LIBRARIES})
  include_directories(SYSTEM ${SOXR_INCLUDE_DIR})
  freerdp_pc_add_requires_private("soxr")
endif(WITH_SOXR)

if(GSM_FOUND)
  list(APPEND CODEC_LIBS ${GSM_LIBRARIES})
  include_directories(SYSTEM ${GSM_INCLUDE_DIRS})
  freerdp_pc_add_library_private("gsm")
endif()

if(LAME_FOUND)
  list(APPEND CODEC_LIBS ${LAME_LIBRARIES})
  include_directories(SYSTEM ${LAME_INCLUDE_DIRS})
  freerdp_pc_add_requires_private("lame")
endif()

if(WITH_FDK_AAC)
  list(APPEND CODEC_SRCS dsp_fdk_impl.c dsp_fdk_impl.h dsp_fdk_aac.c dsp_fdk_aac.h)
  freerdp_pc_add_requires_private("fdk-aac")
endif()

if(FAAD2_FOUND)
  list(APPEND CODEC_LIBS ${FAAD2_LIBRARIES})
  include_directories(SYSTEM ${FAAD2_INCLUDE_DIRS})
  freerdp_pc_add_requires_private("faad2")
endif()

if(FAAC_FOUND)
  list(APPEND CODEC_LIBS ${FAAC_LIBRARIES})
  include_directories(SYSTEM ${FAAC_INCLUDE_DIRS})
  freerdp_pc_add_requires_private("faac")
endif()

if(WITH_AOM AND AOM_FOUND)
  add_compile_definitions(WITH_LIBAOM)
  list(APPEND CODEC_LIBS ${AOM_LIBRARIES})
  include_directories(SYSTEM ${AOM_INCLUDE_DIRS})
  freerdp_pc_add_requires_private("aom")
endif()

if(WITH_YUV AND YUV_FOUND)
  add_compile_definitions(WITH_LIBYUV)
  list(APPEND CODEC_LIBS ${YUV_LIBRARIES})
  include_directories(SYSTEM ${YUV_INCLUDE_DIRS})
  freerdp_pc_add_requires_private("yuv")
endif()

if(WITH_OPENH264)
  set(CODEC_SRCS ${CODEC_SRCS} h264_openh264.c)
  include_directories(SYSTEM ${OPENH264_INCLUDE_DIR})
  if(NOT WITH_OPENH264_LOADING)
    list(APPEND CODEC_LIBS ${OPENH264_LIBRARIES})
    freerdp_pc_add_requires_private("openh264")
  endif(NOT WITH_OPENH264_LOADING)
endif()

if(WITH_SWSCALE)
  if(WITH_SWSCALE_LOADING)
    set(CODEC_SRCS ${CODEC_SRCS} image_ffmpeg.c image_ffmpeg.h)
  else()
    include_directories(SYSTEM ${SWSCALE_INCLUDE_DIRS})
  endif(WITH_SWSCALE_LOADING)
endif()

if(WITH_DSP_EXPERIMENTAL)
  include(WarnExperimental)
  warn_experimental("Experimental encoders/decoders for audio channels" "-DWITH_DSP_EXPERIMENTAL=OFF")
endif()

if(WITH_VIDEO_FFMPEG)
  if(WITH_VAAPI)
    include(WarnExperimental)
    warn_experimental("VAAPI encoder/decoder support for FFMPEG" "-DWITH_VAAPI=OFF")
  endif()

  if(WITH_VIDEOTOOLBOX)
    include(WarnExperimental)
    warn_experimental("VideoToolbox H264 decoding support for FFMPEG" "-DWITH_VIDEOTOOLBOX=OFF")
  endif()

  set(CODEC_SRCS ${CODEC_SRCS} h264_ffmpeg.c)
  include_directories(SYSTEM ${FFMPEG_INCLUDE_DIRS})
  list(APPEND CODEC_LIBS ${FFMPEG_LIBRARIES})
  freerdp_pc_add_requires_private("libavfilter;libavformat;libavcodec;libavutil")
endif()

if(WIN32 AND WITH_MEDIA_FOUNDATION)
  include(WarnExperimental)
  warn_experimental("Experimental encoders/decoders for H264" "-DWITH_MEDIA_FOUNDATION=OFF")
  set(CODEC_SRCS ${CODEC_SRCS} h264_mf.c)
endif()

if(ANDROID AND WITH_MEDIACODEC)
  include(WarnExperimental)
  warn_experimental("Experimental encoders/decoders for H264" "-DWITH_MEDIACODEC=OFF")
  list(APPEND CODEC_SRCS h264_mediacodec.c)

  find_library(MEDIACODEC mediandk REQUIRED)
  list(APPEND CODEC_LIBS ${MEDIACODEC})
endif()

add_library(freerdp-codecs OBJECT ${CODEC_SRCS})
freerdp_library_add(${CODEC_LIBS})
freerdp_object_library_add(freerdp-codecs)

if(BUILD_TESTING_INTERNAL OR BUILD_TESTING)
  add_subdirectory(test)
endif()
