diff --git a/.github/workflows/MediaInfoLib_Checks.yml b/.github/workflows/MediaInfoLib_Checks.yml index edb52ad45c..3c12072011 100644 --- a/.github/workflows/MediaInfoLib_Checks.yml +++ b/.github/workflows/MediaInfoLib_Checks.yml @@ -67,11 +67,15 @@ jobs: run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo apt-get update -y - sudo apt-get install -y libxml2-utils zlib1g-dev libcurl4-gnutls-dev libmms-dev ${{ matrix.environement == 'cmake-dll' && 'g++-mingw-w64-x86-64' || '' }} + sudo apt-get install -y libbrotli-dev libxml2-utils zlib1g-dev libcurl4-gnutls-dev libmms-dev ${{ matrix.environement == 'cmake-dll' && 'g++-mingw-w64-x86-64' || '' }} fi if [ "$RUNNER_OS" == "macOS" ]; then brew install libtool automake fi + - name: brotli + if: ${{ (runner.os == 'Windows') || matrix.environement == 'cmake-dll' }} + run: | + git -C .. clone --depth=1 https://github.com/MediaArea/brotli.git - name: zlib if: ${{ (runner.os == 'Windows') || matrix.environement == 'cmake-dll' }} run: | @@ -130,6 +134,12 @@ jobs: architecture: [ Win32, x64, ARM64 ] fail-fast: false steps: + - name: Checkout brotli + uses: actions/checkout@v6 + with: + repository: cjee21/brotli #!! TO CHANGE !! + ref: MSVC #!! TO REMOVE !! + path: brotli - name: Checkout zlib uses: actions/checkout@v6 with: diff --git a/Project/CMake/CMakeLists.txt b/Project/CMake/CMakeLists.txt index 74b50c2413..8756a1dc81 100644 --- a/Project/CMake/CMakeLists.txt +++ b/Project/CMake/CMakeLists.txt @@ -16,9 +16,11 @@ endif() set(MediaInfoLib_SOVERSION 0) if (NOT WIN32) + option(BUILD_BROTLI "Build bundled Brotli" OFF) option(BUILD_ZLIB "Build bundled zlib" OFF) option(BUILD_ZENLIB "Build bundled ZenLib" OFF) else() + option(BUILD_BROTLI "Build bundled Brotli" ON) option(BUILD_ZLIB "Build bundled zlib" ON) option(BUILD_ZENLIB "Build bundled ZenLib" ON) endif() @@ -82,6 +84,22 @@ else() set(ZLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../../zlib ${CMAKE_CURRENT_BINARY_DIR}/zlib) endif() +if (NOT BUILD_BROTLI) + find_package(Brotli REQUIRED) +else() + set(_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS OFF) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../../brotli ${CMAKE_CURRENT_BINARY_DIR}/brotli) + set(BUILD_SHARED_LIBS ${_BUILD_SHARED_LIBS}) + set(BROTLI_LIBRARIES brotlicommon brotlidec) + unset(_BUILD_SHARED_LIBS) + if(UNIX AND BUILD_SHARED_LIBS) + target_compile_options(brotlicommon PRIVATE -fPIC) + target_compile_options(brotlidec PRIVATE -fPIC) + endif() + set(BROTLI_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../../brotli ${CMAKE_CURRENT_BINARY_DIR}/brotli) +endif() + if(VCPKG_TARGET_TRIPLET) set(MediaInfoLib_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/mediainfolib") elseif(MSVC) @@ -244,6 +262,7 @@ set(MediaInfoLib_SRCS ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Ico.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_GainMap.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Jpeg.cpp + ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_JpegXL.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Pcx.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Png.cpp ${MediaInfoLib_SOURCES_PATH}/MediaInfo/Image/File_Psd.cpp @@ -448,7 +467,7 @@ if(BUILD_ZENLIB) target_include_directories(mediainfo PRIVATE ${ZLIB_INCLUDE_DIRS}) endif() -target_link_libraries(mediainfo ${ZenLib_LIBRARY} ${ZLIB_LIBRARIES}) +target_link_libraries(mediainfo ${ZenLib_LIBRARY} ${ZLIB_LIBRARIES} ${BROTLI_LIBRARIES}) if(MSVC AND BUILD_SHARED_LIBS) install(FILES $ DESTINATION ${BIN_INSTALL_DIR} OPTIONAL) @@ -467,6 +486,10 @@ endif() include(EnableLatestCXX) enable_latest_cxx(mediainfo) +if (BUILD_BROTLI) + install(TARGETS brotlicommon brotlidec EXPORT mediainfo-export) +endif() + install(TARGETS mediainfo EXPORT mediainfo-export RUNTIME DESTINATION ${BIN_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} diff --git a/Project/CMake/MediaInfoSetupOptions.cmake b/Project/CMake/MediaInfoSetupOptions.cmake index 834e3e642f..22ea17b6bd 100644 --- a/Project/CMake/MediaInfoSetupOptions.cmake +++ b/Project/CMake/MediaInfoSetupOptions.cmake @@ -114,6 +114,7 @@ set(MEDIAINFO_FEATURE_LIST IVF JNI JPEG + JPEGXL JSON KATE LA diff --git a/Project/CMake/cmake/modules/FindBrotli.cmake b/Project/CMake/cmake/modules/FindBrotli.cmake new file mode 100644 index 0000000000..6d2298f5a0 --- /dev/null +++ b/Project/CMake/cmake/modules/FindBrotli.cmake @@ -0,0 +1,22 @@ +# Try to find the Brotli library +# Adapted from https://github.com/curl/curl/blob/master/CMake/FindBrotli.cmake + +find_path(BROTLI_INCLUDE_DIR "brotli/decode.h") +find_library(BROTLICOMMON_LIBRARY NAMES "brotlicommon") +find_library(BROTLIDEC_LIBRARY NAMES "brotlidec") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Brotli + REQUIRED_VARS + BROTLI_INCLUDE_DIR + BROTLIDEC_LIBRARY + BROTLICOMMON_LIBRARY +) + +if(BROTLI_FOUND) + set(BROTLI_INCLUDE_DIRS ${BROTLI_INCLUDE_DIR}) + set(BROTLI_LIBRARIES ${BROTLIDEC_LIBRARY} ${BROTLICOMMON_LIBRARY}) + include_directories(${BROTLI_INCLUDE_DIRS}) +endif() + +mark_as_advanced(BROTLI_INCLUDE_DIR BROTLIDEC_LIBRARY BROTLICOMMON_LIBRARY) diff --git a/Project/GNU/Library/Makefile.am b/Project/GNU/Library/Makefile.am index e6abcd92ae..811b1f05e4 100644 --- a/Project/GNU/Library/Makefile.am +++ b/Project/GNU/Library/Makefile.am @@ -117,6 +117,7 @@ lib@MediaInfoLib_LibName@_la_SOURCES = \ ../../../Source/MediaInfo/Image/File_Ico.cpp \ ../../../Source/MediaInfo/Image/File_GainMap.cpp \ ../../../Source/MediaInfo/Image/File_Jpeg.cpp \ + ../../../Source/MediaInfo/Image/File_JpegXL.cpp \ ../../../Source/MediaInfo/Image/File_Pcx.cpp \ ../../../Source/MediaInfo/Image/File_Png.cpp \ ../../../Source/MediaInfo/Image/File_Psd.cpp \ diff --git a/Project/GNU/Library/configure.ac b/Project/GNU/Library/configure.ac index fb7137024e..02f957bb73 100644 --- a/Project/GNU/Library/configure.ac +++ b/Project/GNU/Library/configure.ac @@ -128,6 +128,7 @@ AC_ARG_ENABLE(exr, AC_HELP_STRING([--disable-exr], [Disable Image - EXR] AC_ARG_ENABLE(gif, AC_HELP_STRING([--disable-gif], [Disable Image - GIF]), MediaInfoGif=$enableval, MediaInfoGif=depend) AC_ARG_ENABLE(ico, AC_HELP_STRING([--disable-ico], [Disable Image - ICO]), MediaInfoIco=$enableval, MediaInfoIco=depend) AC_ARG_ENABLE(jpeg, AC_HELP_STRING([--disable-jpeg], [Disable Image - JPEG]), MediaInfoJpeg=$enableval, MediaInfoJpeg=depend) +AC_ARG_ENABLE(jpegxl, AC_HELP_STRING([--disable-jpegxl], [Disable Image - JPEGXL]), MediaInfoJpegXL=$enableval, MediaInfoJpegXL=depend) AC_ARG_ENABLE(pcx, AC_HELP_STRING([--disable-pcx], [Disable Image - PCX]), MediaInfoPcx=$enableval, MediaInfoPcx=depend) AC_ARG_ENABLE(png, AC_HELP_STRING([--disable-png], [Disable Image - PNG]), MediaInfoPng=$enableval, MediaInfoPng=depend) AC_ARG_ENABLE(psd, AC_HELP_STRING([--disable-psd], [Disable Image - PSD]), MediaInfoPsd=$enableval, MediaInfoPsd=depend) @@ -309,6 +310,7 @@ if test "$MediaInfoExr" = "no"; then AC_DEFINE(MEDIAINFO_EXR_NO) fi; if if test "$MediaInfoGif" = "no"; then AC_DEFINE(MEDIAINFO_GIF_NO) fi; if test "$MediaInfoGif" = "yes"; then AC_DEFINE(MEDIAINFO_GIF_YES) fi if test "$MediaInfoIco" = "no"; then AC_DEFINE(MEDIAINFO_ICO_NO) fi; if test "$MediaInfoIco" = "yes"; then AC_DEFINE(MEDIAINFO_ICO_YES) fi if test "$MediaInfoJpeg" = "no"; then AC_DEFINE(MEDIAINFO_JPEG_NO) fi; if test "$MediaInfoJpeg" = "yes"; then AC_DEFINE(MEDIAINFO_JPEG_YES) fi +if test "$MediaInfoJpegXL" = "no"; then AC_DEFINE(MEDIAINFO_JPEGXL_NO) fi; if test "$MediaInfoJpegXL" = "yes"; then AC_DEFINE(MEDIAINFO_JPEGXL_YES) fi if test "$MediaInfoPcx" = "no"; then AC_DEFINE(MEDIAINFO_PCX_NO) fi; if test "$MediaInfoPcx" = "yes"; then AC_DEFINE(MEDIAINFO_PCX_YES) fi if test "$MediaInfoPng" = "no"; then AC_DEFINE(MEDIAINFO_PNG_NO) fi; if test "$MediaInfoPng" = "yes"; then AC_DEFINE(MEDIAINFO_PNG_YES) fi if test "$MediaInfoPsd" = "no"; then AC_DEFINE(MEDIAINFO_PSD_NO) fi; if test "$MediaInfoPsd" = "yes"; then AC_DEFINE(MEDIAINFO_PSD_YES) fi @@ -421,6 +423,24 @@ dnl ######################################################################### dnl ### Needed libs dnl ######################################################################### +dnl ------------------------------------------------------------------------- +dnl brotli +dnl + +PKG_CHECK_MODULES([BROTLI], [libbrotlidec libbrotlicommon], [ + with_brotli="system" + + LIBS="$LIBS $BROTLI_LIBS" + CFLAGS="$CFLAGS $BROTLI_CFLAGS" + CPPFLAGS="$CPPFLAGS $BROTLI_CFLAGS" + + MediaInfoLib_LIBS="$MediaInfoLib_LIBS $BROTLI_LIBS" + MediaInfoLib_LIBS_Static="$MediaInfoLib_LIBS_Static $BROTLI_LIBS" +], [ + with_brotli="no" + AC_MSG_ERROR([brotli is not found, please install development package of brotli (libbrotli-dev or brotli)]) +]) + dnl ------------------------------------------------------------------------- dnl zlib dnl @@ -1010,6 +1030,7 @@ echo " Using ZenLib? $with_zenlib" echo " Using graphviz? $using_graphviz" echo " Using libcurl? $using_libcurl" echo " Using libmms? $using_libmms" +echo " Using brotli? $with_brotli" echo " Using zlib? $with_zlib" echo " Using aes? $using_libaes" echo " Using md5? $using_libmd5" @@ -1085,6 +1106,7 @@ Mcho "Exr " "$MediaInfoDpx" Mcho "Gif " "$MediaInfoGif" Mcho "Ico " "$MediaInfoIco" Mcho "Jpeg " "$MediaInfoJpeg" +Mcho "JpegXL " "$MediaInfoJpegXL" Mcho "Pcx " "$MediaInfoPcx" Mcho "Png " "$MediaInfoPng" Mcho "Psd " "$MediaInfoPsd" diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj b/Project/MSVC2022/Library/MediaInfoLib.vcxproj index 5989e70970..32d4faf2e5 100644 --- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj +++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj @@ -178,7 +178,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -194,7 +194,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -210,7 +210,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -226,7 +226,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -242,7 +242,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -262,7 +262,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -281,7 +281,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -299,7 +299,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -319,7 +319,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -339,7 +339,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -567,6 +567,7 @@ + @@ -918,6 +919,7 @@ + @@ -1038,6 +1040,12 @@ + + {a2c733d0-0511-3374-ab76-169fafc276bc} + + + {abd0c651-f2d8-3560-9313-6df99d388406} + {0da1da7d-f393-4e7c-a7ce-cb5c6a67bc94} diff --git a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters index 8d0be67880..12856ee094 100644 --- a/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters +++ b/Project/MSVC2022/Library/MediaInfoLib.vcxproj.filters @@ -314,6 +314,9 @@ Source Files\Image + + Source Files\Image + Source Files\Image @@ -1069,6 +1072,9 @@ Header Files\Image + + Header Files\Image + Header Files\Image diff --git a/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj b/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj index e7cb5e81ef..cd0bf8284a 100644 --- a/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj +++ b/Project/MSVC2022/Library/MediaInfoLib_UWP.vcxproj @@ -372,6 +372,7 @@ + @@ -656,6 +657,7 @@ + diff --git a/Project/MSVC2022/MediaInfoLib.sln b/Project/MSVC2022/MediaInfoLib.sln index 7ad62abf05..252d74c2b4 100644 --- a/Project/MSVC2022/MediaInfoLib.sln +++ b/Project/MSVC2022/MediaInfoLib.sln @@ -27,6 +27,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FieldsDescription", "Fields EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PreRelease", "PreRelease\PreRelease.vcxproj", "{98740C20-8A19-4190-A29B-7DFA0497F545}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "brotlidec", "..\..\..\brotli\Project\MSVC2022\brotlidec.vcxproj", "{ABD0C651-F2D8-3560-9313-6DF99D388406}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "brotlicommon", "..\..\..\brotli\Project\MSVC2022\brotlicommon.vcxproj", "{A2C733D0-0511-3374-AB76-169FAFC276BC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM @@ -217,6 +221,45 @@ Global {98740C20-8A19-4190-A29B-7DFA0497F545}.Release|Win32.Build.0 = Release|Win32 {98740C20-8A19-4190-A29B-7DFA0497F545}.Release|x64.ActiveCfg = Release|x64 {98740C20-8A19-4190-A29B-7DFA0497F545}.Release|x64.Build.0 = Release|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|ARM.ActiveCfg = Debug|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|ARM64.Build.0 = Debug|ARM64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|ARM64EC.Build.0 = Debug|ARM64EC + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|Win32.ActiveCfg = Debug|Win32 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|Win32.Build.0 = Debug|Win32 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|x64.ActiveCfg = Debug|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Debug|x64.Build.0 = Debug|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM.ActiveCfg = Release|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM.Build.0 = Release|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM64.ActiveCfg = Release|ARM64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM64.Build.0 = Release|ARM64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|ARM64EC.Build.0 = Release|ARM64EC + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|Win32.ActiveCfg = Release|Win32 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|Win32.Build.0 = Release|Win32 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|x64.ActiveCfg = Release|x64 + {ABD0C651-F2D8-3560-9313-6DF99D388406}.Release|x64.Build.0 = Release|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM.ActiveCfg = Debug|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM.Build.0 = Debug|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM64.Build.0 = Debug|ARM64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|ARM64EC.Build.0 = Debug|ARM64EC + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|Win32.ActiveCfg = Debug|Win32 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|Win32.Build.0 = Debug|Win32 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|x64.ActiveCfg = Debug|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Debug|x64.Build.0 = Debug|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM.ActiveCfg = Release|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM.Build.0 = Release|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM64.ActiveCfg = Release|ARM64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM64.Build.0 = Release|ARM64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|ARM64EC.Build.0 = Release|ARM64EC + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|Win32.ActiveCfg = Release|Win32 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|Win32.Build.0 = Release|Win32 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|x64.ActiveCfg = Release|x64 + {A2C733D0-0511-3374-AB76-169FAFC276BC}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -224,6 +267,8 @@ Global GlobalSection(NestedProjects) = preSolution {0DA1DA7D-F393-4E7C-A7CE-CB5C6A67BC94} = {F696A30D-66C6-46A8-B1BC-04B13BF14290} {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} = {F696A30D-66C6-46A8-B1BC-04B13BF14290} + {ABD0C651-F2D8-3560-9313-6DF99D388406} = {F696A30D-66C6-46A8-B1BC-04B13BF14290} + {A2C733D0-0511-3374-AB76-169FAFC276BC} = {F696A30D-66C6-46A8-B1BC-04B13BF14290} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AD381A17-8F9C-4BA4-B2B3-B288F1B9286E} diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj b/Project/MSVC2026/Library/MediaInfoLib.vcxproj index 2524b285fa..0121bb865f 100644 --- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj +++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj @@ -178,7 +178,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -194,7 +194,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -210,7 +210,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -226,7 +226,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL Use @@ -242,7 +242,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -262,7 +262,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -281,7 +281,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -299,7 +299,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -319,7 +319,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MultiThreadedDLL MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) true @@ -339,7 +339,7 @@ - ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;%(AdditionalIncludeDirectories) + ../../../Source;../../../Source/ThirdParty/aes-gladman;../../../Source/ThirdParty/hmac-gladman;../../../Source/ThirdParty/sha1-gladman;../../../Source/ThirdParty/sha2-gladman;../../../Source/ThirdParty/tinyxml2;../../../Source/ThirdParty/md5;../../../Source/ThirdParty/base64;../../../Source/ThirdParty;../../../../ZenLib/Source;../../../../ZLib;../../../../curl/include;../../../../brotli/c/include;%(AdditionalIncludeDirectories) MEDIAINFO_LIBCURL_DLL_RUNTIME;MEDIAINFO_GRAPHVIZ_DLL_RUNTIME;FMT_UNICODE=0;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -567,6 +567,7 @@ + @@ -918,6 +919,7 @@ + @@ -1038,6 +1040,12 @@ + + {a2c733d0-0511-3374-ab76-169fafc276bc} + + + {abd0c651-f2d8-3560-9313-6df99d388406} + {0da1da7d-f393-4e7c-a7ce-cb5c6a67bc94} diff --git a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters index 1711604313..12ef649b9e 100644 --- a/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters +++ b/Project/MSVC2026/Library/MediaInfoLib.vcxproj.filters @@ -314,6 +314,9 @@ Source Files\Image + + Source Files\Image + Source Files\Image @@ -1069,6 +1072,9 @@ Header Files\Image + + Header Files\Image + Header Files\Image diff --git a/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj b/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj index 07659e2c99..a0ffc7f06b 100644 --- a/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj +++ b/Project/MSVC2026/Library/MediaInfoLib_UWP.vcxproj @@ -372,6 +372,7 @@ + @@ -656,6 +657,7 @@ + diff --git a/Project/MSVC2026/MediaInfoLib.slnx b/Project/MSVC2026/MediaInfoLib.slnx index 603f110839..00f27726b1 100644 --- a/Project/MSVC2026/MediaInfoLib.slnx +++ b/Project/MSVC2026/MediaInfoLib.slnx @@ -7,6 +7,14 @@ + + + + + + + + diff --git a/Project/Qt/MediaInfoLib.pro b/Project/Qt/MediaInfoLib.pro index 3accf1f567..38b36cecff 100644 --- a/Project/Qt/MediaInfoLib.pro +++ b/Project/Qt/MediaInfoLib.pro @@ -132,6 +132,7 @@ HEADERS += \ ../../Source/MediaInfo/Image/File_Ico.h \ ../../Source/MediaInfo/Image/File_GainMap.h \ ../../Source/MediaInfo/Image/File_Jpeg.h \ + ../../Source/MediaInfo/Image/File_JpegXL.h \ ../../Source/MediaInfo/Image/File_Pcx.h \ ../../Source/MediaInfo/Image/File_Png.h \ ../../Source/MediaInfo/Image/File_Psd.h \ @@ -378,6 +379,7 @@ SOURCES += \ ../../Source/MediaInfo/Image/File_Ico.cpp \ ../../Source/MediaInfo/Image/File_GainMap.cpp \ ../../Source/MediaInfo/Image/File_Jpeg.cpp \ + ../../Source/MediaInfo/Image/File_JpegXL.cpp \ ../../Source/MediaInfo/Image/File_Pcx.cpp \ ../../Source/MediaInfo/Image/File_Png.cpp \ ../../Source/MediaInfo/Image/File_Psd.cpp \ diff --git a/Source/MediaInfo/File__Analyze.cpp b/Source/MediaInfo/File__Analyze.cpp index cc8da61f18..f0ff162838 100644 --- a/Source/MediaInfo/File__Analyze.cpp +++ b/Source/MediaInfo/File__Analyze.cpp @@ -3149,7 +3149,7 @@ void File__Analyze::Element_Begin(const char* Name) Element[Element_Level].TraceNode.Pos=File_Offset+Buffer_Offset+Element_Offset; //TODO: change this, used in Element_End0() if (BS_Size) { - int64u BS_BitOffset=BS_Size-BS->Remain(); + int64u BS_BitOffset=BS_Size-(BS->Remain() ? BS->Remain() : BT->Remain()); Element[Element_Level].TraceNode.Pos+=BS_BitOffset>>3; //Including Bits to Bytes } Element[Element_Level].TraceNode.Size=Element[Element_Level].Next-(File_Offset+Buffer_Offset+Element_Offset+BS->OffsetBeforeLastCall_Get()); diff --git a/Source/MediaInfo/File__Analyze.h b/Source/MediaInfo/File__Analyze.h index f9c47d83f5..7b83557f92 100644 --- a/Source/MediaInfo/File__Analyze.h +++ b/Source/MediaInfo/File__Analyze.h @@ -500,7 +500,7 @@ public : node->Pos = File_Offset+Buffer_Offset+Element_Offset; if (BS_Size) { - int64u BS_BitOffset = BS_Size-BS->Remain(); + int64u BS_BitOffset = BS_Size-(BS->Remain() ? BS->Remain() : BT->Remain()); if (GenericOption != (int8u)-1) BS_BitOffset -= GenericOption; node->Pos += BS_BitOffset>>3; //Including Bits to Bytes diff --git a/Source/MediaInfo/File__Analyze_Buffer.cpp b/Source/MediaInfo/File__Analyze_Buffer.cpp index 8ae9a2b8ba..077f69e580 100644 --- a/Source/MediaInfo/File__Analyze_Buffer.cpp +++ b/Source/MediaInfo/File__Analyze_Buffer.cpp @@ -2548,8 +2548,8 @@ void File__Analyze::Get_T1(size_t Bits, int8u &Info, const char* Name) Info=BT->Get1(Bits); if (Trace_Activated) { + Param(Name, Info, Bits); Param_Info(__T("(")+Ztring::ToZtring(Bits)+__T(" bits)")); - Param(Name, Info); } } @@ -2558,7 +2558,11 @@ void File__Analyze::Get_T2(size_t Bits, int16u &Info, const char* Name) { INTEGRITY_INT(Bits<=BT->Remain(), "Size is wrong", BT->Offset_Get()) Info=BT->Get2(Bits); - if (Trace_Activated) Param(Name, Info); + if (Trace_Activated) + { + Param(Name, Info, Bits); + Param_Info(__T("(") + Ztring::ToZtring(Bits) + __T(" bits)")); + } } //--------------------------------------------------------------------------- @@ -2566,7 +2570,11 @@ void File__Analyze::Get_T4(size_t Bits, int32u &Info, const char* Name) { INTEGRITY_INT(Bits<=BT->Remain(), "Size is wrong", BT->Offset_Get()) Info=BT->Get4(Bits); - if (Trace_Activated) Param(Name, Info); + if (Trace_Activated) + { + Param(Name, Info, Bits); + Param_Info(__T("(") + Ztring::ToZtring(Bits) + __T(" bits)")); + } } //--------------------------------------------------------------------------- @@ -2574,7 +2582,11 @@ void File__Analyze::Get_T8(size_t Bits, int64u &Info, const char* Name) { INTEGRITY_INT(Bits<=BT->Remain(), "Size is wrong", BT->Offset_Get()) Info=BT->Get8(Bits); - if (Trace_Activated) Param(Name, Info); + if (Trace_Activated) + { + Param(Name, Info, Bits); + Param_Info(__T("(") + Ztring::ToZtring(Bits) + __T(" bits)")); + } } //--------------------------------------------------------------------------- diff --git a/Source/MediaInfo/File__MultipleParsing.cpp b/Source/MediaInfo/File__MultipleParsing.cpp index 7721aec5e3..67c9e6de31 100644 --- a/Source/MediaInfo/File__MultipleParsing.cpp +++ b/Source/MediaInfo/File__MultipleParsing.cpp @@ -353,6 +353,9 @@ #if defined(MEDIAINFO_JPEG_YES) #include "MediaInfo/Image/File_Jpeg.h" #endif +#if defined(MEDIAINFO_JPEGXL_YES) + #include "MediaInfo/Image/File_JpegXL.h" +#endif #if defined(MEDIAINFO_PCX_YES) #include "MediaInfo/Image/File_Pcx.h" #endif @@ -795,6 +798,9 @@ File__MultipleParsing::File__MultipleParsing() #if defined(MEDIAINFO_JPEG_YES) Parser.push_back(new File_Jpeg()); #endif + #if defined(MEDIAINFO_JPEGXL_YES) + Parser.push_back(new File_JpegXL()); + #endif #if defined(MEDIAINFO_PCX_YES) Parser.push_back(new File_Pcx()); #endif diff --git a/Source/MediaInfo/Image/File_JpegXL.cpp b/Source/MediaInfo/Image/File_JpegXL.cpp new file mode 100644 index 0000000000..940f151cda --- /dev/null +++ b/Source/MediaInfo/Image/File_JpegXL.cpp @@ -0,0 +1,306 @@ +/* Copyright (c) MediaArea.net SARL. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the License.html file in the root of the source tree. + */ + +//--------------------------------------------------------------------------- +// Pre-compilation +#include "MediaInfo/PreComp.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/Setup.h" +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#if defined(MEDIAINFO_JPEGXL_YES) +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/Image/File_JpegXL.h" +#include "MediaInfo/MediaInfo_Config_MediaInfo.h" +//--------------------------------------------------------------------------- + +namespace MediaInfoLib +{ + +//*************************************************************************** +// Constants +//*************************************************************************** + +//--------------------------------------------------------------------------- + +//*************************************************************************** +// Constructor/Destructor +//*************************************************************************** + +//--------------------------------------------------------------------------- +File_JpegXL::File_JpegXL() +{ +} + +//*************************************************************************** +// File Header +//*************************************************************************** + +//--------------------------------------------------------------------------- +void File_JpegXL::FileHeader_Parse() +{ + int16u signature; + Get_B2(signature, "signature"); + if (signature != 0xFF0A) { + Reject(); + return; + } + BS_Begin_LE(); + Element_Begin1("size"); + int32u width, height; + bool div8; + Get_TB(div8, "div8"); + if (div8) { + int8u h_div8; + Get_T1(5, h_div8, "h_div8"); + h_div8 += 1; + height = h_div8 * 8; + } + else { + Get_U32(B(9, 1), B(13, 1), B(18, 1), B(30, 1), height, "height"); + } + int8u ratio; + Get_T1(3, ratio, "ratio"); + if (ratio) { + switch (ratio) { + case 1: width = height; break; + case 2: width = height * 6 / 5; break; + case 3: width = height * 4 / 3; break; + case 4: width = height * 3 / 2; break; + case 5: width = height * 16 / 9; break; + case 6: width = height * 5 / 4; break; + case 7: width = height * 2; break; + } + } + if (div8 && !ratio) { + int8u w_div8; + Get_T1(5, w_div8, "w_div8"); + w_div8 += 1; + width = w_div8 * 8; + } + else { + Get_U32(B(9, 1), B(13, 1), B(18, 1), B(30, 1), width, "width"); + } + Element_End0(); + Element_Begin1("metadata"); + bool all_default, extra_fields{}; + int8u orientation; + bool float_sample{ false }, xyb_encoded{ true }; + int32u bits_per_sample{ 8 }, colour_space{ 0 }; + Get_TB(all_default, "all_default"); + if (!all_default) + Get_TB(extra_fields, "extra_fields"); + if (extra_fields) { + Get_T1(3, orientation, "orientation"); + orientation += 1; + TEST_SB_SKIP( "have_intr_size"); + Element_Begin1("intrinsic_size"); + int32u width, height; + bool div8; + Get_TB(div8, "div8"); + if (div8) { + int8u h_div8; + Get_T1(5, h_div8, "h_div8"); + h_div8 += 1; + height = h_div8 * 8; + } + else { + Get_U32(B(9, 1), B(13, 1), B(18, 1), B(30, 1), height, "height"); + } + int8u ratio; + Get_T1(3, ratio, "ratio"); + if (ratio) { + switch (ratio) { + case 1: width = height; break; + case 2: width = height * 6 / 5; break; + case 3: width = height * 4 / 3; break; + case 4: width = height * 3 / 2; break; + case 5: width = height * 16 / 9; break; + case 6: width = height * 5 / 4; break; + case 7: width = height * 2; break; + } + } + if (div8 && !ratio) { + int8u w_div8; + Get_T1(5, w_div8, "w_div8"); + w_div8 += 1; + width = w_div8 * 8; + } + if (!div8 && !ratio) { + Get_U32(B(9, 1), B(13, 1), B(18, 1), B(30, 1), width, "width"); + } + Element_End0(); + TEST_SB_END(); + TEST_SB_SKIP( "have_preview"); + Element_Begin1("preview"); + int32u width, height; + bool div8; + Get_TB(div8, "div8"); + if (div8) { + int32u h_div8; + Get_U32(V(16), V(32), B(5, 1), B(9, 33), h_div8, "h_div8"); + height = h_div8 * 8; + } + else { + Get_U32(B(6, 1), B(8, 65), B(10, 321), B(12, 1345), height, "height"); + } + int8u ratio; + Get_T1(3, ratio, "ratio"); + if (ratio) { + switch (ratio) { + case 1: width = height; break; + case 2: width = height * 6 / 5; break; + case 3: width = height * 4 / 3; break; + case 4: width = height * 3 / 2; break; + case 5: width = height * 16 / 9; break; + case 6: width = height * 5 / 4; break; + case 7: width = height * 2; break; + } + } + if (div8 && !ratio) { + int32u w_div8; + Get_U32(V(16), V(32), B(5, 1), B(9, 33), w_div8, "w_div8"); + width = w_div8 * 8; + } + if (!div8 && !ratio) { + Get_U32(B(6, 1), B(8, 65), B(10, 321), B(12, 1345), width, "width"); + } + Element_End0(); + TEST_SB_END(); + TEST_SB_SKIP( "have_animation"); + Element_Begin1("animation"); + int32u tps_numerator, tps_denominator, num_loops; + Get_U32(V(100), V(1000), B(10, 1), B(30, 1), tps_numerator, "tps_numerator"); + Get_U32(V(1), V(1001), B(8, 1), B(10, 1), tps_denominator, "tps_denominator"); + Get_U32(V(0), B(3, 0), B(16, 0), B(32, 0), num_loops, "num_loops"); + Skip_TB( "have_timecodes"); + Element_End0(); + TEST_SB_END(); + } + if (!all_default) { + Element_Begin1("bit_depth"); + Get_TB(float_sample, "float_sample"); + if (!float_sample) + Get_U32(V(8), V(10), V(12), B(6, 1), bits_per_sample, "bits_per_sample"); + else { + Get_U32(V(32), V(16), V(24), B(6, 1), bits_per_sample, "bits_per_sample"); + Skip_T1(4, "exp_bits"); + } + Element_End0(); + Skip_TB( "modular_16bit_buffers"); + int32u num_extra; + Get_U32(V(0), V(1), B(4, 2), B(12, 1), num_extra, "num_extra"); + for (int32u i = 0; i < num_extra; ++i) { + Element_Begin1("ex_info"); + bool d_alpha; + Get_TB(d_alpha, "d_alpha"); + if (!d_alpha) { + int32u type; + bool float_sample_i; + int32u bits_per_sample_i; + Get_Enum(type, "type"); + Element_Begin1("bit_depth"); + Get_TB(float_sample_i, "float_sample"); + if (!float_sample_i) + Get_U32(V(8), V(10), V(12), B(6, 1), bits_per_sample_i, "bits_per_sample"); + else { + Get_U32(V(32), V(16), V(24), B(6, 1), bits_per_sample_i, "bits_per_sample"); + Skip_T1(4, "exp_bits"); + } + Element_End0(); + int32u temp; + Get_U32(V(0), V(3), V(4), B(3, 1), temp, "dim_shift"); + Get_U32(V(0), B(4), B(5, 16), B(10, 48), temp, "name_len"); + Skip_BT(static_cast(temp) * 8, "name"); + switch (type) { + case 0: + Skip_TB( "alpha_associated"); + break; + case 2: + Skip_T2(16, "red"); + Skip_T2(16, "green"); + Skip_T2(16, "blue"); + Skip_T2(16, "solidity"); + break; + case 5: + Get_U32(V(1), B(2), B(4, 3), B(8, 19), temp, "cfa_channel"); + break; + } + } + Element_End0(); + } + Get_TB(xyb_encoded, "xyb_encoded"); + Element_Begin1("colour_encoding"); + Get_TB(all_default, "all_default"); + if (!all_default) { + Skip_TB( "want_icc"); + Get_Enum(colour_space, "colour_space"); + Param_Info1(colour_space == 0 ? "RGB" : colour_space == 1 ? "Y" : colour_space == 2 ? "XYB" : ""); + } + Element_End0(); + } + Element_End0(); + BS_End_LE(); + + FILLING_BEGIN(); + Accept(); + Stream_Prepare(Stream_Image); + Fill(Stream_Image, 0, Image_Format, "JPEG XL"); + Fill(Stream_Image, 0, Image_Width, width); + Fill(Stream_Image, 0, Image_Height, height); + Fill(Stream_Image, 0, Image_BitDepth, bits_per_sample); + Fill(Stream_Image, 0, Image_ColorSpace, xyb_encoded ? "XYB" : colour_space == 0 ? "RGB" : colour_space == 1 ? "Y" : colour_space == 2 ? "XYB" : ""); + Finish(); + FILLING_END(); +} + +//*************************************************************************** +// Helpers +//*************************************************************************** + +#define INTEGRITY(TOVIDATE, ERRORTEXT, OFFSET) \ +if (!(TOVIDATE)) \ +{ \ + Trusted_IsNot(ERRORTEXT); \ + return; \ +} \ + +//--------------------------------------------------------------------------- +void File_JpegXL::Get_U32(U32Dist d0, U32Dist d1, U32Dist d2, U32Dist d3, int32u& Info, const char* Name) +{ + Info = 0; + U32Dist dist[]{ d0, d1, d2, d3 }; + INTEGRITY(2 <= BT->Remain(), "Size is wrong", BT->Offset_Get()) + int8u distribution = BT->Get(2); + INTEGRITY(dist[distribution].bits <= BT->Remain(), "Size is wrong", BT->Offset_Get()) + Info = BT->Get4(dist[distribution].bits); + Info += dist[distribution].offset; + #if MEDIAINFO_TRACE + if (Trace_Activated) + { + Param(Name, Info, dist[distribution].bits + 2); + Param_Info(__T("(") + Ztring::ToZtring(dist[distribution].bits + 2) + __T(" bits)")); + } + #endif +} + +//--------------------------------------------------------------------------- +void File_JpegXL::Get_Enum(int32u& Info, const char* Name) +{ + Get_U32(V(0), V(1), B(4, 2), B(6, 18), Info, Name); +} + +} //NameSpace + +#endif diff --git a/Source/MediaInfo/Image/File_JpegXL.h b/Source/MediaInfo/Image/File_JpegXL.h new file mode 100644 index 0000000000..e3449d0a1a --- /dev/null +++ b/Source/MediaInfo/Image/File_JpegXL.h @@ -0,0 +1,52 @@ +/* Copyright (c) MediaArea.net SARL. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the License.html file in the root of the source tree. + */ + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// Information about JPEG XL files +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//--------------------------------------------------------------------------- +#ifndef MediaInfo_File_JpegXLH +#define MediaInfo_File_JpegXLH +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +#include "MediaInfo/File__Analyze.h" +//--------------------------------------------------------------------------- + +namespace MediaInfoLib +{ + +//*************************************************************************** +// Class File_JpegXL +//*************************************************************************** + +class File_JpegXL : public File__Analyze +{ +public : + //Constructor/Destructor + File_JpegXL(); + + //File Header + void FileHeader_Parse() override; + +private : + //Helpers + struct U32Dist { + int8u bits; + int32u offset; + }; + inline U32Dist V(int32u v) { return { 0, v }; } + inline U32Dist B(int8u bits, int32u offset = 0) { return { bits, offset }; } + void Get_U32(U32Dist d0, U32Dist d1, U32Dist d2, U32Dist d3, int32u& Info, const char* Name); + void Get_Enum(int32u& Info, const char* Name); +}; + +} //NameSpace + +#endif diff --git a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp index d9b5c1a253..d1366237b2 100644 --- a/Source/MediaInfo/MediaInfo_Config_Automatic.cpp +++ b/Source/MediaInfo/MediaInfo_Config_Automatic.cpp @@ -1535,6 +1535,7 @@ void MediaInfo_Config_Format (InfoMap &Info) "JNG;;;I;Jng;JPEG Network Graphic;jng;;;Lossy\n" "JPEG;;;I;Jpeg;;h3d jpeg jpg jpe jps mpo;image/jpeg;;Lossy\n" "JPEG 2000;;;I;Jpeg;;jp2 jph j2c j2k jhc;image/jp2;http://www.morgan-multimedia.com/JPEG 2000/\n" + "JPEG XL;;;I;JpegXL;;jxl;image/jxl;https://jpeg.org/jpegxl/\n" "LZ77;;;I\n" "MNG;;;I;Mng;Multiple-Image Network Graphic;mng;;;Lossless\n" "NEF;;;I;Tiff;Nikon Electronic Format;nef;image/x-nikon-nef;http://www.nikon.com/\n" diff --git a/Source/MediaInfo/MediaInfo_File.cpp b/Source/MediaInfo/MediaInfo_File.cpp index a4332a546c..cf766907c8 100644 --- a/Source/MediaInfo/MediaInfo_File.cpp +++ b/Source/MediaInfo/MediaInfo_File.cpp @@ -382,6 +382,9 @@ #if defined(MEDIAINFO_JPEG_YES) #include "MediaInfo/Image/File_Jpeg.h" #endif +#if defined(MEDIAINFO_JPEGXL_YES) + #include "MediaInfo/Image/File_JpegXL.h" +#endif #if defined(MEDIAINFO_PCX_YES) #include "MediaInfo/Image/File_Pcx.h" #endif @@ -813,6 +816,9 @@ static File__Analyze* SelectFromExtension(const String& Parser) #if defined(MEDIAINFO_JPEG_YES) if (Parser==__T("Jpeg")) return new File_Jpeg(); #endif + #if defined(MEDIAINFO_JPEGXL_YES) + if (Parser==__T("Jpeg")) return new File_JpegXL(); + #endif #if defined(MEDIAINFO_PCX_YES) if (Parser==__T("PCX")) return new File_Pcx(); #endif @@ -1236,6 +1242,9 @@ int MediaInfo_Internal::ListFormats(const String &File_Name) #if defined(MEDIAINFO_JPEG_YES) SAFE_DELETE(Info); Info=new File_Jpeg(); if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1; #endif + #if defined(MEDIAINFO_JPEGXL_YES) + SAFE_DELETE(Info); Info=new File_JpegXL(); if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1; + #endif #if defined(MEDIAINFO_PCX_YES) SAFE_DELETE(Info); Info=new File_Pcx(); if (((Reader_File*)Reader)->Format_Test_PerParser(this, File_Name)>0) return 1; #endif @@ -1334,7 +1343,7 @@ bool MediaInfo_Internal::LibraryIsModified () || defined(MEDIAINFO_AV1_NO) || defined(MEDIAINFO_AV2_NO) || defined(MEDIAINFO_AVC_NO) || defined(MEDIAINFO_AVS3V_NO) || defined(MEDIAINFO_AVSV_NO) || defined(MEDIAINFO_HEVC_NO) || defined(MEDIAINFO_MPEG4V_NO) || defined(MEDIAINFO_MPEGV_NO) || defined(MEDIAINFO_FLIC_NO) || defined(MEDIAINFO_THEORA_NO) || defined(MEDIAINFO_Y4M_NO) \ || defined(MEDIAINFO_AC3_NO) || defined(MEDIAINFO_AC4_NO) || defined(MEDIAINFO_ADIF_NO) || defined(MEDIAINFO_ADTS_NO) || defined(MEDIAINFO_SMPTEST0337_NO) || defined(MEDIAINFO_AMR_NO) || defined(MEDIAINFO_DTS_NO) || defined(MEDIAINFO_DOLBYE_NO) || defined(MEDIAINFO_FLAC_NO) || defined(MEDIAINFO_IAMF_NO) || defined(MEDIAINFO_APE_NO) || defined(MEDIAINFO_MPC_NO) || defined(MEDIAINFO_MPCSV8_NO) || defined(MEDIAINFO_MPEGA_NO) || defined(MEDIAINFO_OPENMG_NO) || defined(MEDIAINFO_TWINVQ_NO) || defined(MEDIAINFO_XM_NO) || defined(MEDIAINFO_MOD_NO) || defined(MEDIAINFO_S3M_NO) || defined(MEDIAINFO_IT_NO) || defined(MEDIAINFO_SPEEX_NO) || defined(MEDIAINFO_TAK_NO) || defined(MEDIAINFO_PS2A_NO) \ || defined(MEDIAINFO_CMML_NO) || defined(MEDIAINFO_KATE_NO) || defined(MEDIAINFO_PGS_NO) || defined(MEDIAINFO_OTHERTEXT_NO) \ - || defined(MEDIAINFO_ARRIRAW_NO) || defined(MEDIAINFO_BMP_NO) || defined(MEDIAINFO_DDS_NO) || defined(MEDIAINFO_DPX_NO) || defined(MEDIAINFO_EXR_NO) || defined(MEDIAINFO_GIF_NO) || defined(MEDIAINFO_ICO_NO) || defined(MEDIAINFO_JPEG_NO) || defined(MEDIAINFO_PNG_NO) || defined(MEDIAINFO_TGA_NO) || defined(MEDIAINFO_TIFF_NO) || defined(MEDIAINFO_WEBP_NO) \ + || defined(MEDIAINFO_ARRIRAW_NO) || defined(MEDIAINFO_BMP_NO) || defined(MEDIAINFO_DDS_NO) || defined(MEDIAINFO_DPX_NO) || defined(MEDIAINFO_EXR_NO) || defined(MEDIAINFO_GIF_NO) || defined(MEDIAINFO_ICO_NO) || defined(MEDIAINFO_JPEG_NO) || defined(MEDIAINFO_JPEGXL_NO) || defined(MEDIAINFO_PNG_NO) || defined(MEDIAINFO_TGA_NO) || defined(MEDIAINFO_TIFF_NO) || defined(MEDIAINFO_WEBP_NO) \ || defined(MEDIAINFO_7Z_NO) || defined(MEDIAINFO_ZIP_NO) || defined(MEDIAINFO_RAR_NO) || defined(MEDIAINFO_ACE_NO) || defined(MEDIAINFO_ELF_NO) || defined(MEDIAINFO_MACHO_NO) || defined(MEDIAINFO_MZ_NO) \ || defined(MEDIAINFO_OTHER_NO) || defined(MEDIAINFO_DUMMY_NO) return true; diff --git a/Source/MediaInfo/Multiple/File_Mpeg4.h b/Source/MediaInfo/Multiple/File_Mpeg4.h index 7336607cf5..5068251dd1 100644 --- a/Source/MediaInfo/Multiple/File_Mpeg4.h +++ b/Source/MediaInfo/Multiple/File_Mpeg4.h @@ -76,16 +76,23 @@ private : //Elements void bloc(); + void brob(); void cdat(); + void Exif(); void cdt2() {cdat();} void free(); void ftyp(); + void hrgm(); void idat(); void idsc(); + void jbrd(); void jp2c(); void jp2h(); void jp2h_colr(); void jp2h_ihdr(); + void JXL_(); + void jxlc(); + void jxlp(); void jp2h_ricc() {jp2h_colr(); } void mdat(); void mdat_xxxx(); @@ -420,6 +427,7 @@ private : void uuid(); void uuid_C2PA(); void wide(); + void xml_(); //Helpers Ztring Language_Get(int16u Language); diff --git a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp index 6828aeaf43..b6d402519f 100644 --- a/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp +++ b/Source/MediaInfo/Multiple/File_Mpeg4_Elements.cpp @@ -156,6 +156,9 @@ using namespace std; #if defined(MEDIAINFO_JPEG_YES) #include "MediaInfo/Image/File_Jpeg.h" #endif +#if defined(MEDIAINFO_JPEGXL_YES) + #include "MediaInfo/Image/File_JpegXL.h" +#endif #if defined(MEDIAINFO_DTSUHD_YES) #include "MediaInfo/Audio/File_DtsUhd.h" #endif @@ -167,6 +170,7 @@ using namespace std; #include "ThirdParty/base64/base64.h" #define FMT_UNICODE 0 #include "ThirdParty/fmt/format.h" +#include #include #include #include @@ -709,8 +713,10 @@ std::string File_Mpeg4_sv3d_Mesh_index_type(int8u Value) namespace Elements { const int64u bloc=0x626C6F63; + const int64u brob=0x62726F62; const int64u cdat=0x63646174; const int64u cdt2=0x63647432; + const int64u Exif=0x45786966; const int64u free=0x66726565; const int64u ftyp=0x66747970; const int64u ftyp_qt=0x71742020; @@ -721,13 +727,18 @@ namespace Elements const int64u ftyp_dash=0x64617368; const int64u ftyp_isom=0x69736F6D; const int64u ftyp_caqv=0x63617176; + const int64u hrgm=0x6872676D; const int64u idat=0x69646174; const int64u idsc=0x69647363; + const int64u jbrd=0x6A627264; const int64u jp2c=0x6A703263; const int64u jp2h=0x6A703268; const int64u jp2h_colr=0x636F6C72; const int64u jp2h_ihdr=0x69686472; const int64u jp2h_ricc=0x72696363; + const int64u JXL_=0x4A584C20; + const int64u jxlc=0x6A786C63; + const int64u jxlp=0x6A786C70; const int64u mdat=0x6D646174; const int64u meta=0x6D657461; const int64u meta_grpl=0x6772706C; @@ -1095,6 +1106,7 @@ namespace Elements const int64u sidx=0x73696478; const int64u uuid=0x75756964; const int64u wide=0x77696465; + const int64u xml_=0x786D6C20; } //--------------------------------------------------------------------------- @@ -1136,12 +1148,16 @@ void File_Mpeg4::Data_Parse() //Parsing DATA_BEGIN ATOM(bloc) + ATOM(brob) ATOM(cdat) ATOM(cdt2) + ATOM(Exif) LIST_SKIP(free) ATOM(ftyp) + ATOM(hrgm) ATOM(idat) ATOM(idsc) + ATOM(jbrd) ATOM(jp2c) LIST(jp2h) ATOM_BEGIN @@ -1149,6 +1165,9 @@ void File_Mpeg4::Data_Parse() ATOM(jp2h_ihdr) ATOM(jp2h_ricc) ATOM_END + ATOM(JXL_) + ATOM(jxlc) + ATOM(jxlp) LIST(mdat) ATOM_DEFAULT_ALONE(mdat_xxxx) LIST(meta) @@ -1601,6 +1620,7 @@ void File_Mpeg4::Data_Parse() ATOM(sidx) ATOM(uuid) LIST_SKIP(wide) + ATOM(xml_) DATA_END #pragma warning(pop) @@ -1724,6 +1744,52 @@ void File_Mpeg4::bloc() Skip_XX(512, "Reserved"); } +//------------------------------------------------------------------------- +void File_Mpeg4::brob() +{ + Element_Name("Brotli-compressed box"); + + int32u type; + Get_C4(type, "payload box type"); + Element_Info1(Ztring::ToZtring_From_CC4(type)); + + std::vector decoded_buffer(Element_Size * 6); + const auto encoded_size{ Element_Size - 4 }; + const auto encoded_buffer{ Buffer + Buffer_Offset + Element_Offset }; + auto decoded_size{ decoded_buffer.size() }; + BrotliDecoderResult br_result = BrotliDecoderDecompress(encoded_size, encoded_buffer, &decoded_size, decoded_buffer.data()); + + if (br_result != BROTLI_DECODER_RESULT_SUCCESS) { + Skip_XX(Element_Size - 4, "compressed data"); + return; + } + + auto buffer_save{ Buffer }; + auto buffer_offset_save{ Buffer_Offset }; + auto buffer_size_save{ Buffer_Size }; + auto element_offset_save{ Element_Offset }; + auto element_size_save{ Element_Size }; + Buffer = decoded_buffer.data(); + Buffer_Offset = 0; + Buffer_Size = decoded_buffer.size(); + Element_Offset = 0; + Element_Size = decoded_size; + + switch (type) { + case Elements::Exif: Exif(); break; + case 0x584D4C20: // XML + case Elements::xml_: xml_(); break; + default: Skip_XX(Element_Size, "Data"); break; + } + Element_Name("Brotli-compressed box"); // restore element name + + Buffer = buffer_save; + Buffer_Offset = buffer_offset_save; + Buffer_Size = buffer_size_save; + Element_Offset = element_offset_save; + Element_Size = element_size_save; +} + //--------------------------------------------------------------------------- void File_Mpeg4::cdat() { @@ -1762,6 +1828,29 @@ void File_Mpeg4::cdat() } } +//--------------------------------------------------------------------------- +void File_Mpeg4::Exif() +{ + Element_Name("Exif box"); + + //Parsing + #if defined(MEDIAINFO_EXIF_YES) + File_Exif MI{}; + MI.FromHeif = true; + Open_Buffer_Init(&MI); + Open_Buffer_Continue(&MI); + Open_Buffer_Finalize(&MI); + Merge(MI, Stream_General, 0, 0, false); + Merge(MI, Stream_Image, 0, 0, false); + size_t Count = MI.Count_Get(Stream_Image); + for (size_t i = 1; i < Count; ++i) { + Merge(MI, Stream_Image, i, StreamPos_Last + 1, false); + } + #else + Skip_UTF8(Element_Size - Element_Offset, "EXIF Tags"); + #endif +} + //--------------------------------------------------------------------------- void File_Mpeg4::free() { @@ -1856,6 +1945,13 @@ void File_Mpeg4::ftyp() FILLING_END(); } +//--------------------------------------------------------------------------- +void File_Mpeg4::hrgm() +{ + Element_Name("HDR Gain Map"); + Skip_XX(Element_Size, "Data"); +} + //--------------------------------------------------------------------------- void File_Mpeg4::idat() { @@ -1888,6 +1984,16 @@ void File_Mpeg4::idsc() FILLING_END(); } +//--------------------------------------------------------------------------- +void File_Mpeg4::jbrd() +{ + Element_Name("JPEG Bitstream Reconstruction Data box"); + + FILLING_BEGIN(); + Fill(Stream_Image, 0, Image_Format_Settings, "Lossless JPEG Reconstruction"); + FILLING_END(); +} + //--------------------------------------------------------------------------- void File_Mpeg4::jp2c() { @@ -2023,6 +2129,50 @@ void File_Mpeg4::jp2h_ihdr() FILLING_END() } +//--------------------------------------------------------------------------- +void File_Mpeg4::JXL_() +{ + Element_Name("JPEG XL Signature box"); + int32u signature; + Get_B4(signature, "Signature"); + FILLING_BEGIN_PRECISE() + if (signature == 0x0D0A870A) + Fill(Stream_General, 0, General_Format, "JPEG XL"); + FILLING_END() +} + +//--------------------------------------------------------------------------- +void File_Mpeg4::jxlc() +{ + Element_Name("JPEG XL Codestream box"); + + #ifdef MEDIAINFO_JPEGXL_YES + File_JpegXL MI; + Open_Buffer_Init(&MI); + Open_Buffer_Continue(&MI); + Open_Buffer_Finalize(&MI); + Merge(MI, Stream_Image, 0, 0); + #endif +} + +//--------------------------------------------------------------------------- +void File_Mpeg4::jxlp() +{ + Element_Name("JPEG XL Partial Codestream box"); + + int32u index; + Get_B4(index, "index"); + if (index == 0) { // TODO: Concat all jxlp into one codestream + #ifdef MEDIAINFO_JPEGXL_YES + File_JpegXL MI; + Open_Buffer_Init(&MI); + Open_Buffer_Continue(&MI); + Open_Buffer_Finalize(&MI); + Merge(MI, Stream_Image, 0, 0); + #endif + } +} + //--------------------------------------------------------------------------- void File_Mpeg4::mdat() { @@ -11400,6 +11550,25 @@ void File_Mpeg4::wide() Skip_XX(Element_Size, "Free"); } +//--------------------------------------------------------------------------- +void File_Mpeg4::xml_() +{ + Element_Name("XML box"); + + //Parsing + #if defined(MEDIAINFO_XMP_YES) + File_Xmp MI{}; + Open_Buffer_Init(&MI); + auto Element_Offset_Sav = Element_Offset; + Open_Buffer_Continue(&MI); + Element_Offset = Element_Offset_Sav; + Open_Buffer_Finalize(&MI); + Element_Show(); //TODO: why is it needed? + Merge(MI, Stream_General, 0, 0, false); + #endif + Skip_UTF8(Element_Size - Element_Offset, "XMP metadata"); +} + //*************************************************************************** // C++ //*************************************************************************** diff --git a/Source/MediaInfo/Setup.h b/Source/MediaInfo/Setup.h index d875f37d3b..2ff02ce3ae 100644 --- a/Source/MediaInfo/Setup.h +++ b/Source/MediaInfo/Setup.h @@ -939,6 +939,9 @@ #if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_JPEG_NO) && !defined(MEDIAINFO_JPEG_YES) #define MEDIAINFO_JPEG_YES #endif +#if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_JPEGXL_NO) && !defined(MEDIAINFO_JPEGXL_YES) + #define MEDIAINFO_JPEGXL_YES +#endif #if !defined(MEDIAINFO_IMAGE_NO) && !defined(MEDIAINFO_PCX_NO) && !defined(MEDIAINFO_PCX_YES) #define MEDIAINFO_PCX_YES #endif diff --git a/Source/MediaInfo/Tag/File_Exif.cpp b/Source/MediaInfo/Tag/File_Exif.cpp index f644b1aafc..7e4ccc707e 100644 --- a/Source/MediaInfo/Tag/File_Exif.cpp +++ b/Source/MediaInfo/Tag/File_Exif.cpp @@ -1993,15 +1993,15 @@ void File_Exif::FileHeader_Parse() //HEIF if (FromHeif) { - int32u Size; - Get_B4 (Size, "Exif header length"); + int32u exif_tiff_header_offset; + Get_B4 (exif_tiff_header_offset, "exif_tiff_header_offset"); string Identifier; - Get_String(Size, Identifier, "Identifier"); - if (!(Size == 0 || (Size == 6 && !strncmp(Identifier.c_str(), "Exif\0", 6)))) { + Get_String(exif_tiff_header_offset, Identifier, "Identifier"); + if (!(exif_tiff_header_offset == 0 || (exif_tiff_header_offset == 6 && !strncmp(Identifier.c_str(), "Exif\0", 6)))) { Reject(); return; } - OffsetFromContainer = static_cast(4) + Size; + OffsetFromContainer = static_cast(4) + exif_tiff_header_offset; } //Exif Makernotes diff --git a/Source/Resource/Text/DataBase/Format.csv b/Source/Resource/Text/DataBase/Format.csv index dfbe480b31..275b317b11 100644 --- a/Source/Resource/Text/DataBase/Format.csv +++ b/Source/Resource/Text/DataBase/Format.csv @@ -142,6 +142,7 @@ ICO;;;I;Ico;;ico;image/vnd.microsoft.icon;;Lossless JNG;;;I;Jng;JPEG Network Graphic;jng;;;Lossy JPEG;;;I;Jpeg;;h3d jpeg jpg jpe jps mpo;image/jpeg;;Lossy JPEG 2000;;;I;Jpeg;;jp2 jph j2c j2k jhc;image/jp2;http://www.morgan-multimedia.com/JPEG 2000/; +JPEG XL;;;I;JpegXL;;jxl;image/jxl;https://jpeg.org/jpegxl/; LZ77;;;I;;;;;; MNG;;;I;Mng;Multiple-Image Network Graphic;mng;;;Lossless NEF;;;I;Tiff;Nikon Electronic Format;nef;image/x-nikon-nef;http://www.nikon.com/;