rdp / ffmpeg-windows-build-helpers

Helper script for cross compiling some media tools for windows, like customizable ffmpeg.exe (with or without non-free components, etc), and some other bonuses like mplayer, mp4box, mxf, etc.
GNU General Public License v3.0
1.08k stars 412 forks source link

Issue with x265 3.6 x86 asm optimization #736

Closed FQDianYan closed 4 months ago

FQDianYan commented 5 months ago

Hello there, i found an issue. when i use this script build ffmpeg n7.0 win64 with x265 version 3.6, I can't enable x86 asm optimization (like this picture). ffmpeg_7 0_x265_3 6_noasm when i use this script build ffmpeg n7.0 win64 with x265 version 3.5, I can enable x86 asm optimization (like this picture). ffmpeg_7 0_x265_3 5_asm

AnimMouse commented 5 months ago

Apparently x265 has changed the way of detecting the system architecture in version 3.6, causing the CPU architecture detection to fail.

Here is the gist of CMakeLists.txt as of version 3.5:

# System architecture detection
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
set(ARM_ALIASES armv6l armv7l aarch64)
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
list(FIND ARM_ALIASES "${SYSPROC}" ARMMATCH)
set(POWER_ALIASES ppc64 ppc64le)
list(FIND POWER_ALIASES "${SYSPROC}" POWERMATCH)
if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1")
    set(X86 1)
    add_definitions(-DX265_ARCH_X86=1)
    if(CMAKE_CXX_FLAGS STREQUAL "-m32")
        message(STATUS "Detected x86 target processor")
    elseif("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(X64 1)
        add_definitions(-DX86_64=1)
        message(STATUS "Detected x86_64 target processor")
    endif()
elseif(POWERMATCH GREATER "-1")
    message(STATUS "Detected POWER target processor")
    set(POWER 1)
    add_definitions(-DX265_ARCH_POWER=1)
    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(PPC64 1)
        add_definitions(-DPPC64=1)
        message(STATUS "Detected POWER PPC64 target processor")
    endif()
elseif(ARMMATCH GREATER "-1")
    if(CROSS_COMPILE_ARM)
        message(STATUS "Cross compiling for ARM arch")
    else()
        set(CROSS_COMPILE_ARM 0)
    endif()
    set(ARM 1)
    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        message(STATUS "Detected ARM64 target processor")
        set(ARM64 1)
        add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=1 -DHAVE_ARMV6=0)
    else()
        message(STATUS "Detected ARM target processor")
        add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=0 -DHAVE_ARMV6=1)
    endif()
else()
    message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
    message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
endif()

Here is the gist of CMakeLists.txt as of version 3.6:

# System architecture detection
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
    string(TOLOWER "${CMAKE_OSX_ARCHITECTURES}" SYSPROC)
else()
    string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC)
endif()
set(X86_ALIASES x86 i386 i686 x86_64 amd64)
set(ARM_ALIASES armv6l armv7l)
set(ARM64_ALIASES arm64 arm64e aarch64)
list(FIND X86_ALIASES "${SYSPROC}" X86MATCH)
list(FIND ARM_ALIASES "${SYSPROC}" ARMMATCH)
list(FIND ARM64_ALIASES "${SYSPROC}" ARM64MATCH)
set(POWER_ALIASES powerpc64 powerpc64le ppc64 ppc64le)
list(FIND POWER_ALIASES "${SYSPROC}" POWERMATCH)
if(X86MATCH GREATER "-1")
    set(X86 1)
    add_definitions(-DX265_ARCH_X86=1)
    if(CMAKE_CXX_FLAGS STREQUAL "-m32")
        message(STATUS "Detected x86 target processor")
    elseif("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(X64 1)
        add_definitions(-DX86_64=1)
        message(STATUS "Detected x86_64 target processor")
    endif()
elseif(POWERMATCH GREATER "-1")
    message(STATUS "Detected POWER target processor")
    set(POWER 1)
    add_definitions(-DX265_ARCH_POWER=1)
    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(PPC64 1)
        add_definitions(-DPPC64=1)
        message(STATUS "Detected POWER PPC64 target processor")
    endif()
elseif(ARMMATCH GREATER "-1")
    if(CROSS_COMPILE_ARM)
        message(STATUS "Cross compiling for ARM arch")
    else()
        set(CROSS_COMPILE_ARM 0)
    endif()
    message(STATUS "Detected ARM target processor")
    set(ARM 1)
    add_definitions(-DX265_ARCH_ARM=1 -DHAVE_ARMV6=1)
elseif(ARM64MATCH GREATER "-1")
    #if(CROSS_COMPILE_ARM64)
        #message(STATUS "Cross compiling for ARM64 arch")
    #else()
        #set(CROSS_COMPILE_ARM64 0)
    #endif()
    message(STATUS "Detected ARM64 target processor")
    set(ARM64 1)
    add_definitions(-DX265_ARCH_ARM64=1 -DHAVE_NEON)
else()
    message(STATUS "CMAKE_SYSTEM_PROCESSOR value `${CMAKE_SYSTEM_PROCESSOR}` is unknown")
    message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
endif()
rdp commented 5 months ago

Hmm what's the diff, wonder if this is an x265...thing? :)

On Wed, Apr 24, 2024 at 9:42 AM Anim Mouse @.***> wrote:

Apparently x265 has changed the way of detecting the system architecture in version 3.6, causing the CPU architecture detection to fail.

Here is the gist of CMakeLists.txt as of version 3.5 https://bitbucket.org/multicoreware/x265_git/src/3bd3dd731b4b4c3fbbe5e513c16bc6ae481a0ec5/source/CMakeLists.txt#lines-40 :

System architecture detection

string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC) set(X86_ALIASES x86 i386 i686 x86_64 amd64) set(ARM_ALIASES armv6l armv7l aarch64) list(FIND X86_ALIASES "${SYSPROC}" X86MATCH) list(FIND ARM_ALIASES "${SYSPROC}" ARMMATCH) set(POWER_ALIASES ppc64 ppc64le) list(FIND POWER_ALIASES "${SYSPROC}" POWERMATCH) if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1") set(X86 1) add_definitions(-DX265_ARCH_X86=1) if(CMAKE_CXX_FLAGS STREQUAL "-m32") message(STATUS "Detected x86 target processor") elseif("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) set(X64 1) add_definitions(-DX86_64=1) message(STATUS "Detected x86_64 target processor") endif() elseif(POWERMATCH GREATER "-1") message(STATUS "Detected POWER target processor") set(POWER 1) add_definitions(-DX265_ARCH_POWER=1) if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) set(PPC64 1) add_definitions(-DPPC64=1) message(STATUS "Detected POWER PPC64 target processor") endif() elseif(ARMMATCH GREATER "-1") if(CROSS_COMPILE_ARM) message(STATUS "Cross compiling for ARM arch") else() set(CROSS_COMPILE_ARM 0) endif() set(ARM 1) if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) message(STATUS "Detected ARM64 target processor") set(ARM64 1) add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=1 -DHAVE_ARMV6=0) else() message(STATUS "Detected ARM target processor") add_definitions(-DX265_ARCH_ARM=1 -DX265_ARCH_ARM64=0 -DHAVE_ARMV6=1) endif() else() message(STATUS "CMAKE_SYSTEM_PROCESSOR value ${CMAKE_SYSTEM_PROCESSOR} is unknown") message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}") endif()

Here is the gist of CMakeLists.txt as of version 3.6 https://bitbucket.org/multicoreware/x265_git/src/6612208ba5d1994cd4698024440c42d2c5b32170/source/CMakeLists.txt#lines-40 :

System architecture detection

if (APPLE AND CMAKE_OSX_ARCHITECTURES) string(TOLOWER "${CMAKE_OSX_ARCHITECTURES}" SYSPROC) else() string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" SYSPROC) endif() set(X86_ALIASES x86 i386 i686 x86_64 amd64) set(ARM_ALIASES armv6l armv7l) set(ARM64_ALIASES arm64 arm64e aarch64) list(FIND X86_ALIASES "${SYSPROC}" X86MATCH) list(FIND ARM_ALIASES "${SYSPROC}" ARMMATCH) list(FIND ARM64_ALIASES "${SYSPROC}" ARM64MATCH) set(POWER_ALIASES powerpc64 powerpc64le ppc64 ppc64le) list(FIND POWER_ALIASES "${SYSPROC}" POWERMATCH) if(X86MATCH GREATER "-1") set(X86 1) add_definitions(-DX265_ARCH_X86=1) if(CMAKE_CXX_FLAGS STREQUAL "-m32") message(STATUS "Detected x86 target processor") elseif("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) set(X64 1) add_definitions(-DX86_64=1) message(STATUS "Detected x86_64 target processor") endif() elseif(POWERMATCH GREATER "-1") message(STATUS "Detected POWER target processor") set(POWER 1) add_definitions(-DX265_ARCH_POWER=1) if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8) set(PPC64 1) add_definitions(-DPPC64=1) message(STATUS "Detected POWER PPC64 target processor") endif() elseif(ARMMATCH GREATER "-1") if(CROSS_COMPILE_ARM) message(STATUS "Cross compiling for ARM arch") else() set(CROSS_COMPILE_ARM 0) endif() message(STATUS "Detected ARM target processor") set(ARM 1) add_definitions(-DX265_ARCH_ARM=1 -DHAVE_ARMV6=1) elseif(ARM64MATCH GREATER "-1")

if(CROSS_COMPILE_ARM64)

    #message(STATUS "Cross compiling for ARM64 arch")
#else()
    #set(CROSS_COMPILE_ARM64 0)
#endif()
message(STATUS "Detected ARM64 target processor")
set(ARM64 1)
add_definitions(-DX265_ARCH_ARM64=1 -DHAVE_NEON)

else() message(STATUS "CMAKE_SYSTEM_PROCESSOR value ${CMAKE_SYSTEM_PROCESSOR} is unknown") message(STATUS "Please add this value near ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}") endif()

— Reply to this email directly, view it on GitHub https://github.com/rdp/ffmpeg-windows-build-helpers/issues/736#issuecomment-2075256453, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAADBUDL263HGNV6J6BH7HDY67HETAVCNFSM6AAAAABGUT5GOCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDANZVGI2TMNBVGM . You are receiving this because you are subscribed to this thread.Message ID: @.***>

AnimMouse commented 5 months ago

I think one of the notable difference is this line where if("${SYSPROC}" STREQUAL "" OR X86MATCH GREATER "-1") becomes if(X86MATCH GREATER "-1"), removing the ${SYSPROC} variable there.

@rdp Should we default to version 3.5? BtbN/FFmpeg-Builds is still using version 3.5 that is why they still have x86 ASM optimization, if they started to switch to version 3.6, I think this bug will probably be fixed by them.