diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 2e3f922a63f..71dd50ae338 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -153,6 +153,7 @@ if(NOT WIN32 OR ENABLE_MSYS2) include(cmake/opus.cmake) include(cmake/vpx.cmake) include(cmake/x264.cmake) + include(cmake/x265.cmake) include(cmake/aom.cmake) include(cmake/ffmpeg.cmake) include(cmake/fftw.cmake) diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index 587b01269c0..e8477ab93ee 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -107,6 +107,7 @@ download_source(FLAC) download_source(VPX) download_source(OPUS) download_source(X264) +download_source(X265) download_source(OPENJPEG) download_source(FFMPEG) download_source(FFTW) diff --git a/build_files/build_environment/cmake/ffmpeg.cmake b/build_files/build_environment/cmake/ffmpeg.cmake index e7785c44ed2..dacda9fd3d1 100644 --- a/build_files/build_environment/cmake/ffmpeg.cmake +++ b/build_files/build_environment/cmake/ffmpeg.cmake @@ -20,7 +20,8 @@ set(FFMPEG_CFLAGS "\ -I${temp_LIBDIR}/vpx/include \ -I${temp_LIBDIR}/x264/include \ -I${temp_LIBDIR}/zlib/include \ --I${temp_LIBDIR}/aom/include" +-I${temp_LIBDIR}/aom/include \ +-I${temp_LIBDIR}/x265/include" ) set(FFMPEG_LDFLAGS "\ ${LIBDIR_FLAG}${temp_LIBDIR}/lame/lib \ @@ -31,6 +32,7 @@ ${LIBDIR_FLAG}${temp_LIBDIR}/theora/lib \ ${LIBDIR_FLAG}${temp_LIBDIR}/opus/lib \ ${LIBDIR_FLAG}${temp_LIBDIR}/vpx/lib \ ${LIBDIR_FLAG}${temp_LIBDIR}/x264/lib \ +${LIBDIR_FLAG}${temp_LIBDIR}/x265/lib \ ${LIBDIR_FLAG}${temp_LIBDIR}/zlib/lib \ ${LIBDIR_FLAG}${temp_LIBDIR}/aom/lib" ) @@ -81,7 +83,8 @@ ${temp_LIBDIR}/vpx/lib/pkgconfig:\ ${temp_LIBDIR}/theora/lib/pkgconfig:\ ${temp_LIBDIR}/openjpeg/lib/pkgconfig:\ ${temp_LIBDIR}/opus/lib/pkgconfig:\ -${temp_LIBDIR}/aom/lib/pkgconfig:" +${temp_LIBDIR}/aom/lib/pkgconfig:\ +${temp_LIBDIR}/x265/lib/pkgconfig:" ) endif() @@ -180,6 +183,7 @@ ExternalProject_Add(external_ffmpeg --enable-libmp3lame --disable-librtmp --enable-libx264 + --enable-libx265 --enable-libaom --disable-libopencore-amrnb --disable-libopencore-amrwb @@ -230,6 +234,7 @@ add_dependencies( external_ffmpeg external_zlib external_x264 + external_x265 external_opus external_vpx external_theora diff --git a/build_files/build_environment/cmake/setup_msys2.cmake b/build_files/build_environment/cmake/setup_msys2.cmake index 7a0ce17c489..23b5976a102 100644 --- a/build_files/build_environment/cmake/setup_msys2.cmake +++ b/build_files/build_environment/cmake/setup_msys2.cmake @@ -118,6 +118,7 @@ if((NOT EXISTS "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") AND (EXISTS "${D "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe" ) endif() +set(NASM_PATH "${DOWNLOAD_DIR}/msys2/msys64/usr/bin/nasm.exe") message("Checking for perl") # download perl for libvpx diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 5db1b241c37..a6e3d00fddc 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -351,6 +351,13 @@ set(X264_HASH_TYPE SHA256) set(X264_FILE x264-${X264_VERSION}.tar.gz) set(X264_HOMEPAGE https://www.videolan.org/developers/x264.html) +set(X265_VERSION 3cf6c1e53037eb9e198860365712e1bafb22f7c6) +set(X265_URI https://bitbucket.org/multicoreware/x265_git/get/${X265_VERSION}.tar.gz) +set(X265_HASH 40d12016192cdc740132cb00dd6cc80ead094ff91a1a897181256def2011342e) +set(X265_HASH_TYPE SHA256) +set(X265_FILE x265-${X265_VERSION}.tar.gz) +set(X265_HOMEPAGE https://www.videolan.org/developers/x265.html) + set(OPENJPEG_VERSION 2.5.0) set(OPENJPEG_SHORT_VERSION 2.5) set(OPENJPEG_URI https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/x265.cmake b/build_files/build_environment/cmake/x265.cmake new file mode 100644 index 00000000000..f3fcca7caa7 --- /dev/null +++ b/build_files/build_environment/cmake/x265.cmake @@ -0,0 +1,167 @@ +# SPDX-FileCopyrightText: 2024 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +if(WIN32) + set(LIB_PREFIX "") + set(LIB_SUFFIX "-static") +else() + set(LIB_PREFIX "lib") + set(LIB_SUFFIX "") +endif() + +if(BLENDER_PLATFORM_WINDOWS_ARM) + set(X265_WINDOWS_ARM64_ARGS + -DCMAKE_C_COMPILER=${LIBDIR}/llvm/bin/clang-cl.exe + -DCMAKE_CXX_COMPILER=${LIBDIR}/llvm/bin/clang-cl.exe + -DCMAKE_C_FLAGS_INIT="--target=arm64-pc-windows-msvc" + -DCMAKE_CXX_FLAGS_INIT="--target=arm64-pc-windows-msvc" + -DCMAKE_CXX_STANDARD=11 + ) + + set(X265_12_PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/x265_12/src/external_x265_12 < ${PATCH_DIR}/x265_windows_arm.diff) + set(X265_10_PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/x265_10/src/external_x265_10 < ${PATCH_DIR}/x265_windows_arm.diff) + set(X265_PATCH_COMMAND COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/x265/src/external_x265 < ${PATCH_DIR}/x265_windows_arm.diff) +else() + set(X265_WINDOWS_ARM64_ARGS) + set(X265_12_PATCH_COMMAND) + set(X265_10_PATCH_COMMAND) + set(X265_PATCH_COMMAND) +endif() + +# 12 bit build flags +set(X265_12_EXTRA_ARGS + -DHIGH_BIT_DEPTH=ON + -DEXPORT_C_API=OFF + -DENABLE_SHARED=OFF + -DENABLE_CLI=OFF + -DMAIN12=ON +) + +# 10 bit build flags +set(X265_10_EXTRA_ARGS + -DHIGH_BIT_DEPTH=ON + -DEXPORT_C_API=OFF + -DENABLE_SHARED=OFF + -DENABLE_CLI=OFF +) + +# 8 bit build flags +set(X265_EXTRA_ARGS + -DENABLE_SHARED=OFF + -DEXTRA_LIB=${LIBDIR}/x265_12/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT}^^${LIBDIR}/x265_10/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} + -DLINKED_10BIT=ON + -DLINKED_12BIT=ON +) + +if(UNIX) + list(APPEND X265_EXTRA_ARGS + -DCMAKE_STATIC_LIBRARY_SUFFIX_C=_unmerged${LIB_SUFFIX}${LIBEXT} + -DCMAKE_STATIC_LIBRARY_SUFFIX_CXX=_unmerged${LIB_SUFFIX}${LIBEXT} + ) +endif() + +if(WIN32) + list(APPEND X265_EXTRA_ARGS -DNASM_EXECUTABLE=${NASM_PATH}) + list(APPEND X265_10_EXTRA_ARGS -DNASM_EXECUTABLE=${NASM_PATH}) + list(APPEND X265_12_EXTRA_ARGS -DNASM_EXECUTABLE=${NASM_PATH}) +endif() + +ExternalProject_Add(external_x265_12 + URL file://${PACKAGE_DIR}/${X265_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${X265_HASH_TYPE}=${X265_HASH} + PREFIX ${BUILD_DIR}/x265_12 + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} + SOURCE_SUBDIR source + PATCH_COMMAND ${X265_12_PATCH_COMMAND} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/x265_12 ${DEFAULT_CMAKE_FLAGS} ${X265_WINDOWS_ARM64_ARGS} ${X265_12_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/x265_12 +) + +ExternalProject_Add(external_x265_10 + URL file://${PACKAGE_DIR}/${X265_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${X265_HASH_TYPE}=${X265_HASH} + PREFIX ${BUILD_DIR}/x265_10 + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} + SOURCE_SUBDIR source + PATCH_COMMAND ${X265_10_PATCH_COMMAND} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/x265_10 ${DEFAULT_CMAKE_FLAGS} ${X265_WINDOWS_ARM64_ARGS} ${X265_10_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/x265_10 +) + +ExternalProject_Add(external_x265 + URL file://${PACKAGE_DIR}/${X265_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${X265_HASH_TYPE}=${X265_HASH} + PREFIX ${BUILD_DIR}/x265 + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} + SOURCE_SUBDIR source + PATCH_COMMAND ${X265_PATCH_COMMAND} + LIST_SEPARATOR ^^ + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/x265 ${DEFAULT_CMAKE_FLAGS} ${X265_WINDOWS_ARM64_ARGS} ${X265_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/x265 +) + +add_dependencies( + external_x265 + external_x265_12 + external_x265_10 +) + +if(BUILD_MODE STREQUAL Release AND WIN32) + ExternalProject_Add_Step(external_x265 after_install + COMMAND "${CMAKE_AR}" + /OUT:${LIBDIR}/x265/lib/x265.lib + ${LIBDIR}/x265/lib/${LIB_PREFIX}x265${LIB_SUFFIX}.lib + ${LIBDIR}/x265_10/lib/${LIB_PREFIX}x265${LIB_SUFFIX}.lib + ${LIBDIR}/x265_12/lib/${LIB_PREFIX}x265${LIB_SUFFIX}.lib + DEPENDEES install + ) +endif() + +if(UNIX) + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + # Write a script and the STDIN for CMAKE_AR. + # This is needed because `ar` requires STDIN instead of command line arguments, sigh! + set(_ar_stdin "${BUILD_DIR}/x265/tmp/x265_ar_script.stdin") + set(_ar_cmake "${BUILD_DIR}/x265/tmp/x265_ar_script.cmake") + file(WRITE ${_ar_stdin} "\ +CREATE ${LIBDIR}/x265/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} +ADDLIB ${LIBDIR}/x265/lib/${LIB_PREFIX}x265${LIB_SUFFIX}_unmerged${LIBEXT} +ADDLIB ${LIBDIR}/x265_10/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} +ADDLIB ${LIBDIR}/x265_12/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} +SAVE +END +") + file(WRITE ${_ar_cmake} "\ +set(ARG_AR $\{CMAKE_ARGV0\}) +set(ARG_AR_INPUT $\{CMAKE_ARGV1\}) +execute_process( + COMMAND $\{ARG_AR\} -M + INPUT_FILE $\{ARG_AR_INPUT\} +) +") + + ExternalProject_Add_Step(external_x265 after_install + COMMAND ${CMAKE_COMMAND} -P ${_ar_cmake} -- ${CMAKE_AR} ${_ar_stdin} + DEPENDEES install + ) + unset(_ar_stdin) + unset(_ar_cmake) + else() + ExternalProject_Add_Step(external_x265 after_install + COMMAND libtool -static -o + ${LIBDIR}/x265/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} + ${LIBDIR}/x265/lib/${LIB_PREFIX}x265${LIB_SUFFIX}_unmerged${LIBEXT} + ${LIBDIR}/x265_10/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} + ${LIBDIR}/x265_12/lib/${LIB_PREFIX}x265${LIB_SUFFIX}${LIBEXT} + DEPENDEES install + ) + endif() +endif() + +unset(LIB_PREFIX) +unset(LIB_SUFFIX) diff --git a/build_files/build_environment/patches/ffmpeg.diff b/build_files/build_environment/patches/ffmpeg.diff index 5d8cb7d7f7f..49cb76fc279 100644 --- a/build_files/build_environment/patches/ffmpeg.diff +++ b/build_files/build_environment/patches/ffmpeg.diff @@ -1,17 +1,17 @@ --- a/configure 2018-08-27 13:46:41.071106150 +0200 +++ b/configure 2018-08-27 13:46:28.162765762 +0200 -@@ -6655,7 +6655,7 @@ +@@ -6768,7 +6768,7 @@ require_pkg_config libopencv opencv opencv/cxcore.h cvCreateImageHeader; } enabled libopenh264 && require_pkg_config libopenh264 openh264 wels/codec_api.h WelsGetCodecVersion enabled libopenjpeg && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version || - { require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } } + { require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version "-DOPJ_STATIC $pthreads_extralibs $libm_extralibs" && add_cppflags "-DOPJ_STATIC $pthreads_extralibs $libm_extralibs"; } } enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++" - enabled libopenvino && require libopenvino c_api/ie_c_api.h ie_c_api_version -linference_engine_c_api - enabled libopus && { -@@ -6696,8 +6696,8 @@ - enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit + enabled libopenvino && { { check_pkg_config libopenvino openvino openvino/c/openvino.h ov_core_create && enable openvino2; } || + { check_pkg_config libopenvino openvino c_api/ie_c_api.h ie_c_api_version || +@@ -6812,8 +6812,8 @@ enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init + enabled libvmaf && check_pkg_config libvmaf_cuda "libvmaf >= 2.0.0" libvmaf_cuda.h vmaf_cuda_state_init enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc -enabled libvorbis && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init && - require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init @@ -20,3 +20,12 @@ enabled libvpx && { enabled libvpx_vp8_decoder && { +@@ -6845,7 +6845,7 @@ + [ "$toolchain" != "msvc" ] || + require_cpp_condition libx264 x264.h "X264_BUILD >= 158"; } && + check_cpp_condition libx262 x264.h "X264_MPEG2" +-enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get && ++enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get "$pthreads_extralibs" && + require_cpp_condition libx265 x265.h "X265_BUILD >= 89" + enabled libxavs && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" + enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get diff --git a/build_files/build_environment/patches/ffmpeg_windows.diff b/build_files/build_environment/patches/ffmpeg_windows.diff index 1c1c5820125..adb992235c9 100644 --- a/build_files/build_environment/patches/ffmpeg_windows.diff +++ b/build_files/build_environment/patches/ffmpeg_windows.diff @@ -1,6 +1,5 @@ -diff -Naur ffmpeg-clean/configure ffmpeg-dirty/configure ---- ffmpeg-clean/configure 2023-02-27 20:43:45.000000000 +0000 -+++ ffmpeg-dirty/configure 2023-05-25 09:49:24.949566500 +0100 +--- ffmpeg-6.1.1\configure 2023-12-30 16:07:26 -0700 ++++ external_ffmpeg\configure 2024-03-18 13:17:59 -0600 @@ -6675,7 +6675,7 @@ enabled jni && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; } enabled ladspa && require_headers "ladspa.h dlfcn.h" @@ -43,7 +42,7 @@ diff -Naur ffmpeg-clean/configure ffmpeg-dirty/configure enabled libvpx && { enabled libvpx_vp8_decoder && { -@@ -6840,7 +6839,7 @@ +@@ -6840,12 +6839,12 @@ enabled libwebp && { enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } @@ -52,3 +51,9 @@ diff -Naur ffmpeg-clean/configure ffmpeg-dirty/configure require_cpp_condition libx264 x264.h "X264_BUILD >= 122" && { [ "$toolchain" != "msvc" ] || require_cpp_condition libx264 x264.h "X264_BUILD >= 158"; } && + check_cpp_condition libx262 x264.h "X264_MPEG2" +-enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get && ++enabled libx265 && require libx265 "x265.h" x265_api_get -lx265 && + require_cpp_condition libx265 x265.h "X265_BUILD >= 89" + enabled libxavs && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" + enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get diff --git a/build_files/build_environment/patches/x265_windows_arm.diff b/build_files/build_environment/patches/x265_windows_arm.diff new file mode 100644 index 00000000000..048049cabd6 --- /dev/null +++ b/build_files/build_environment/patches/x265_windows_arm.diff @@ -0,0 +1,26 @@ +diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt +index c74db2179..bb8fb3c29 100755 +--- a/source/CMakeLists.txt ++++ b/source/CMakeLists.txt +@@ -378,7 +378,7 @@ if(GCC) + endif() + endif() + endif(ENABLE_AGGRESSIVE_CHECKS) +- execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION) ++ #execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION) + endif(GCC) + + find_package(Nasm) +diff --git a/source/dynamicHDR10/CMakeLists.txt b/source/dynamicHDR10/CMakeLists.txt +index 22fb79d44..ad0f3a7a8 100644 +--- a/source/dynamicHDR10/CMakeLists.txt ++++ b/source/dynamicHDR10/CMakeLists.txt +@@ -140,7 +140,7 @@ if(GCC) + endif() + endif() + endif(ENABLE_AGGRESSIVE_CHECKS) +- execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION) ++ #execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION) + endif(GCC) + + # Build options