diff --git a/conanfile.txt b/conanfile.txt index 0392c5ef..251be41d 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -14,6 +14,8 @@ jsoncons/1.5.0 zstd/1.5.5 date/3.0.4 libarchive/3.7.4 +libjpeg-turbo/3.1.0 +libpng/1.6.47 [options] arrow/*:parquet=True diff --git a/pj_media/demos/CMakeLists.txt b/pj_media/demos/CMakeLists.txt index 54602a6e..2464ea4e 100644 --- a/pj_media/demos/CMakeLists.txt +++ b/pj_media/demos/CMakeLists.txt @@ -1,7 +1,7 @@ find_package(mcap REQUIRED) +find_package(libjpeg-turbo REQUIRED) find_package(PkgConfig QUIET) if(PkgConfig_FOUND) - pkg_check_modules(TURBOJPEG IMPORTED_TARGET libturbojpeg) pkg_check_modules(LIBAVCODEC IMPORTED_TARGET libavcodec) pkg_check_modules(LIBAVFORMAT IMPORTED_TARGET libavformat) pkg_check_modules(LIBAVUTIL IMPORTED_TARGET libavutil) @@ -12,7 +12,7 @@ add_executable(extract_frame extract_frame.cpp) target_compile_features(extract_frame PRIVATE cxx_std_20) target_compile_options(extract_frame PRIVATE ${PJ_WARNING_FLAGS}) target_link_libraries(extract_frame PRIVATE - pj_media_core pj_datastore mcap::mcap PkgConfig::TURBOJPEG + pj_media_core pj_datastore mcap::mcap libjpeg-turbo::libjpeg-turbo ) # --- Qt demo: MCAP image viewer with ObjectStore pipeline --- @@ -24,14 +24,14 @@ if(TARGET pj_media_qt) target_compile_options(mcap_image_viewer PRIVATE ${PJ_WARNING_FLAGS}) target_compile_definitions(mcap_image_viewer PRIVATE PJ_HAS_RHI_WIDGET) target_link_libraries(mcap_image_viewer PRIVATE - pj_media_qt pj_media_core pj_datastore mcap::mcap PkgConfig::TURBOJPEG + pj_media_qt pj_media_core pj_datastore mcap::mcap libjpeg-turbo::libjpeg-turbo ) # --- Qt demo: multi-channel viewer (color + depth side by side) --- add_executable(multi_channel_viewer multi_channel_viewer.cpp) target_compile_features(multi_channel_viewer PRIVATE cxx_std_20) target_compile_options(multi_channel_viewer PRIVATE ${PJ_WARNING_FLAGS}) target_link_libraries(multi_channel_viewer PRIVATE - pj_media_qt pj_media_core pj_datastore mcap::mcap PkgConfig::TURBOJPEG + pj_media_qt pj_media_core pj_datastore mcap::mcap libjpeg-turbo::libjpeg-turbo ) # --- Qt demo: simulated live stream (M13) --- @@ -39,7 +39,7 @@ if(TARGET pj_media_qt) target_compile_features(simulated_stream PRIVATE cxx_std_20) target_compile_options(simulated_stream PRIVATE ${PJ_WARNING_FLAGS}) target_link_libraries(simulated_stream PRIVATE - pj_media_qt pj_media_core pj_datastore PkgConfig::TURBOJPEG + pj_media_qt pj_media_core pj_datastore libjpeg-turbo::libjpeg-turbo ) # --- Qt demo: video stream (M18 — FFmpeg decode via ObjectStore) --- @@ -67,7 +67,7 @@ elseif(PJ_BUILD_DIALOG_ENGINE_QT) target_compile_features(mcap_image_viewer PRIVATE cxx_std_20) target_compile_options(mcap_image_viewer PRIVATE ${PJ_WARNING_FLAGS}) target_link_libraries(mcap_image_viewer PRIVATE - pj_media_core pj_datastore mcap::mcap PkgConfig::TURBOJPEG + pj_media_core pj_datastore mcap::mcap libjpeg-turbo::libjpeg-turbo Qt6::Widgets ) endif() diff --git a/pj_media/pj_media_core/CMakeLists.txt b/pj_media/pj_media_core/CMakeLists.txt index 2e6e5380..06c0e3e1 100644 --- a/pj_media/pj_media_core/CMakeLists.txt +++ b/pj_media/pj_media_core/CMakeLists.txt @@ -2,10 +2,10 @@ # pj_media_core — media decode/playback core, no Qt dependency # --------------------------------------------------------------------------- +find_package(libjpeg-turbo REQUIRED) +find_package(PNG REQUIRED) find_package(PkgConfig QUIET) if(PkgConfig_FOUND) - pkg_check_modules(TURBOJPEG IMPORTED_TARGET libturbojpeg) - pkg_check_modules(LIBPNG IMPORTED_TARGET libpng) pkg_check_modules(LIBAVCODEC IMPORTED_TARGET libavcodec) pkg_check_modules(LIBAVFORMAT IMPORTED_TARGET libavformat) pkg_check_modules(LIBAVUTIL IMPORTED_TARGET libavutil) @@ -37,9 +37,16 @@ target_compile_features(pj_media_core PUBLIC cxx_std_20) target_compile_options(pj_media_core PRIVATE ${PJ_WARNING_FLAGS} ${PJ_SANITIZER_FLAGS} ) +if(MSVC) + # libpng uses setjmp/longjmp for error handling, which MSVC warns + # about via C4611 (non-portable interaction with C++ destruction). + # The decoder paths that call setjmp here do not construct RAII + # objects in the longjmp scope, so the warning is safe to silence. + target_compile_options(pj_media_core PRIVATE /wd4611) +endif() target_link_libraries(pj_media_core PUBLIC pj_base pj_datastore - PRIVATE PkgConfig::TURBOJPEG PkgConfig::LIBPNG + PRIVATE libjpeg-turbo::libjpeg-turbo PNG::PNG ) if(LIBAVCODEC_FOUND AND LIBAVFORMAT_FOUND) @@ -67,7 +74,7 @@ if(PJ_BUILD_TESTS) foreach(test_src ${PJ_MEDIA_CORE_TESTS}) get_filename_component(test_name ${test_src} NAME_WE) add_executable(${test_name} ${test_src}) - target_link_libraries(${test_name} PRIVATE pj_media_core PkgConfig::TURBOJPEG PkgConfig::LIBPNG GTest::gtest_main) + target_link_libraries(${test_name} PRIVATE pj_media_core libjpeg-turbo::libjpeg-turbo PNG::PNG GTest::gtest_main) target_compile_options(${test_name} PRIVATE ${PJ_WARNING_FLAGS} ${PJ_SANITIZER_FLAGS}) add_test(NAME ${test_name} COMMAND ${test_name}) endforeach() @@ -76,7 +83,7 @@ if(PJ_BUILD_TESTS) add_executable(mcap_integration_test tests/mcap_integration_test.cpp) target_link_libraries(mcap_integration_test PRIVATE pj_media_core pj_datastore mcap::mcap nlohmann_json::nlohmann_json - PkgConfig::TURBOJPEG GTest::gtest_main + libjpeg-turbo::libjpeg-turbo GTest::gtest_main ) target_compile_options(mcap_integration_test PRIVATE ${PJ_WARNING_FLAGS} ${PJ_SANITIZER_FLAGS}) add_test(NAME mcap_integration_test COMMAND mcap_integration_test @@ -110,7 +117,7 @@ if(PJ_BUILD_TESTS) target_link_libraries(thumbnail_cache_test PRIVATE pj_media_core pj_datastore PkgConfig::LIBAVCODEC PkgConfig::LIBAVFORMAT PkgConfig::LIBAVUTIL PkgConfig::LIBSWSCALE - PkgConfig::TURBOJPEG + libjpeg-turbo::libjpeg-turbo GTest::gtest_main ) target_compile_options(thumbnail_cache_test PRIVATE ${PJ_WARNING_FLAGS} ${PJ_SANITIZER_FLAGS})