diff --git a/CMakeLists.txt b/CMakeLists.txt index 9809a793..1c030df0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,7 +177,7 @@ find_package(rocjpeg 1.0.0 QUIET) find_package(pybind11 REQUIRED) find_package(DLPACK REQUIRED) find_package(FFmpeg QUIET) -set(ROCPYDECODE_USE_FFMPEG ${FFMPEG_FOUND}) +set(ROCPYDECODE_USE_FFMPEG FALSE) set(ROCPYDECODE_DEPENDENCY_READY FALSE) set(ROCPYJPEG_DEPENDENCY_READY FALSE) @@ -220,14 +220,25 @@ if(rocdecode_FOUND) set(include ${include_base}) set(sources ${sources_base}) + set(ROCDECODE_FFMPEG_UTILS_DIR "${ROCM_PATH}/share/rocdecode/utils/ffmpegvideodecode") + file(GLOB ROCDECODE_FFMPEG_UTILS_SOURCES "${ROCDECODE_FFMPEG_UTILS_DIR}/*.cpp") + if(FFMPEG_FOUND + AND EXISTS "${ROCDECODE_FFMPEG_UTILS_DIR}/ffmpeg_video_dec.h" + AND ROCDECODE_FFMPEG_UTILS_SOURCES) + set(ROCPYDECODE_USE_FFMPEG TRUE) + endif() + if(ROCPYDECODE_USE_FFMPEG) # Demux + CPU backend (FFmpeg-dependent) - file(GLOB sources_ffmpeg src/rocdecode/roc_pyvideodemuxer.cpp src/rocdecode/roc_pyvideodecodecpu.cpp src/rocdecode/roc_pydecode_test.cpp ${ROCM_PATH}/share/rocdecode/utils/ffmpegvideodecode/*.cpp) - file(GLOB include_ffmpeg ${ROCM_PATH}/share/rocdecode/utils/ffmpegvideodecode/*.h) + file(GLOB sources_ffmpeg src/rocdecode/roc_pyvideodemuxer.cpp src/rocdecode/roc_pyvideodecodecpu.cpp src/rocdecode/roc_pydecode_test.cpp ${ROCDECODE_FFMPEG_UTILS_SOURCES}) + file(GLOB include_ffmpeg ${ROCDECODE_FFMPEG_UTILS_DIR}/*.h) list(APPEND include ${include_ffmpeg}) list(APPEND sources ${sources_ffmpeg}) include_directories(${AVUTIL_INCLUDE_DIR} ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR}) set(LINK_LIBRARY_LIST ${LINK_LIBRARY_LIST} ${FFMPEG_LIBRARIES}) + elseif(FFMPEG_FOUND) + message(STATUS "FFmpeg found, but rocDecode FFmpeg utilities were not found under ${ROCDECODE_FFMPEG_UTILS_DIR}; building rocPyDecode without demux/CPU backend (GPU decode only).") + set(ROCPYDECODE_HOST_LIBRARY_FOUND FALSE) else() message(STATUS "FFmpeg not found; building rocPyDecode without demux/CPU backend (GPU decode only).") set(ROCPYDECODE_HOST_LIBRARY_FOUND FALSE) @@ -435,16 +446,16 @@ endif() if(ROCPYDECODE_DEPENDENCY_READY) set(ROCDECODE_VIDEO_DIR "${ROCM_PATH}/share/rocdecode/video") if(IS_DIRECTORY "${ROCDECODE_VIDEO_DIR}") - file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/data/videos") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/data/videos") file(GLOB ROCDECODE_VIDEO_FILES "${ROCDECODE_VIDEO_DIR}/*") foreach(VID_FILE IN LISTS ROCDECODE_VIDEO_FILES) get_filename_component(VID_NAME "${VID_FILE}" NAME) - set(VID_LINK "${CMAKE_SOURCE_DIR}/data/videos/${VID_NAME}") + set(VID_LINK "${CMAKE_BINARY_DIR}/data/videos/${VID_NAME}") if(NOT EXISTS "${VID_LINK}") execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${VID_FILE}" "${VID_LINK}") endif() endforeach() - message("-- ${BoldBlue}Ensured rocdecode sample videos are linked into ${CMAKE_SOURCE_DIR}/data/videos${ColourReset}") + message("-- ${BoldBlue}Ensured rocdecode sample videos are linked into ${CMAKE_BINARY_DIR}/data/videos${ColourReset}") endif() endif() diff --git a/docker/rocpydecode-with-therock.dockerfile b/docker/rocpydecode-with-therock.dockerfile new file mode 100644 index 00000000..52991d90 --- /dev/null +++ b/docker/rocpydecode-with-therock.dockerfile @@ -0,0 +1,72 @@ +FROM ubuntu:24.04 + +ARG DEBIAN_FRONTEND=noninteractive +ARG ROCM_SERIES=10.1 +ARG GPU_TARGET=gfx1250 +ARG ROCM_BUILD=20260821-32431166035 +ARG ROCM_PACKAGE_VERSION=10.1.0~20260821-32431166035 +ARG ALLOW_UNSIGNED_ROCM_REPOSITORY=false + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + gnupg \ + wget \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /etc/apt/keyrings \ + && wget -qO- https://repo.amd.com/rocm/packages-multi-arch/gpg/rocm.gpg \ + | gpg --dearmor -o /etc/apt/keyrings/amdrocm.gpg + +RUN if [ "${ALLOW_UNSIGNED_ROCM_REPOSITORY}" = "true" ]; then \ + repository_options="trusted=yes"; \ + elif [ "${ALLOW_UNSIGNED_ROCM_REPOSITORY}" = "false" ]; then \ + repository_options="signed-by=/etc/apt/keyrings/amdrocm.gpg"; \ + else \ + echo "ALLOW_UNSIGNED_ROCM_REPOSITORY must be true or false" >&2; \ + exit 2; \ + fi \ + && echo "deb [${repository_options}] https://rocm.nightlies.amd.com/packages-multi-arch/deb/${ROCM_BUILD} stable main" \ + > /etc/apt/sources.list.d/rocm-nightly.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + "amdrocm-core-sdk${ROCM_SERIES}-${GPU_TARGET}=${ROCM_PACKAGE_VERSION}" \ + "amdrocm-decode-dev${ROCM_SERIES}=${ROCM_PACKAGE_VERSION}" \ + "amdrocm-decode-test${ROCM_SERIES}=${ROCM_PACKAGE_VERSION}" \ + "amdrocm-jpeg-dev${ROCM_SERIES}=${ROCM_PACKAGE_VERSION}" \ + "amdrocm-jpeg-test${ROCM_SERIES}=${ROCM_PACKAGE_VERSION}" \ + build-essential \ + cmake \ + git \ + libavcodec-dev \ + libavformat-dev \ + libavutil-dev \ + libdlpack-dev \ + libnuma-dev \ + libswscale-dev \ + ninja-build \ + pkg-config \ + python3.12 \ + python3.12-dev \ + python3.12-venv \ + && rm -rf /var/lib/apt/lists/* + +RUN python3.12 -m venv /opt/venv \ + && /opt/venv/bin/python -m pip install --no-cache-dir --upgrade pip setuptools wheel \ + && /opt/venv/bin/python -m pip install --no-cache-dir numpy pybind11 pytest + +ENV VIRTUAL_ENV=/opt/venv +ENV ROCM_PATH=/opt/rocm +ENV ROCM_HOME=/opt/rocm +ENV PATH=/opt/venv/bin:/opt/rocm/bin:/opt/rocm/lib/llvm/bin:${PATH} +ENV CMAKE_PREFIX_PATH=/opt/rocm/lib/cmake:/opt/venv/lib/python3.12/site-packages/pybind11/share/cmake/pybind11 +ENV LD_LIBRARY_PATH=/opt/rocm/lib + +RUN hipconfig --full \ + && test -d /opt/rocm/share/rocdecode/utils \ + && test -d /opt/rocm/share/rocdecode/test \ + && test -d /opt/rocm/share/rocdecode/video \ + && test -d /opt/rocm/share/rocjpeg/images + +WORKDIR /workspace/EssamWork/ROCPYDECODE + +CMD ["bash"] diff --git a/samples/rocdecode/videodecoderaw.py b/samples/rocdecode/videodecoderaw.py index 5033ecb4..8b95eb7b 100644 --- a/samples/rocdecode/videodecoderaw.py +++ b/samples/rocdecode/videodecoderaw.py @@ -138,20 +138,37 @@ def feed_packet(buf, is_eos=False): return False data = memoryview(Path(input_path).read_bytes()) - sps = pps = None + vps = sps = pps = None for nal in _annexb_slices(data): # nal header byte after start code sc_len = 4 if nal[:4] == b"\x00\x00\x00\x01" else 3 - nal_type = nal[sc_len] & 0x1F - if nal_type == 7: # SPS - sps = bytes(nal) - continue - if nal_type == 8: # PPS - pps = bytes(nal) - continue - if nal_type in (1, 5): # non-IDR / IDR slice -> frame - # prepend latest SPS/PPS so each frame is self-contained + if codec == dectypes.rocDecVideoCodec_HEVC: + nal_type = (nal[sc_len] >> 1) & 0x3F + if nal_type == 32: # VPS + vps = bytes(nal) + continue + if nal_type == 33: # SPS + sps = bytes(nal) + continue + if nal_type == 34: # PPS + pps = bytes(nal) + continue + is_slice = nal_type <= 31 + else: + nal_type = nal[sc_len] & 0x1F + if nal_type == 7: # SPS + sps = bytes(nal) + continue + if nal_type == 8: # PPS + pps = bytes(nal) + continue + is_slice = nal_type in (1, 5) # non-IDR / IDR slice + + if is_slice: + # Prepend the latest parameter sets so each frame is self-contained. parts = [] + if vps: + parts.append(vps) if sps: parts.append(sps) if pps: @@ -173,7 +190,7 @@ def feed_packet(buf, is_eos=False): f"({fps:.2f} fps)." ) else: - print("info: No frames decoded.") + raise RuntimeError("No frames decoded.") def main(): diff --git a/src/common/roc_pybuffer.cpp b/src/common/roc_pybuffer.cpp index 7d55ca3d..b7c1474b 100644 --- a/src/common/roc_pybuffer.cpp +++ b/src/common/roc_pybuffer.cpp @@ -123,7 +123,8 @@ const DLTensor &BufferInterface::dlTensor() const { } void BufferInterface::ExportToPython(py::module &m) { - py::class_>(m, "BufferInterface", py::dynamic_attr()) + py::class_>( + m, "BufferInterface", py::module_local(), py::dynamic_attr()) .def_property_readonly("shape", &BufferInterface::shape, "Get the shape of the buffer as an array") .def_property_readonly("strides", &BufferInterface::strides, "Get the strides of the buffer") .def_property_readonly("dtype", &BufferInterface::dtype, "Get the data type of the buffer") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6d204469..8642c97b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -73,9 +73,9 @@ set(ROCPYJPEG_LIB_DIR "${ROCM_PATH}/lib") set(ROCPYJPEG_PY_DIR "${ROCM_PATH}/lib/pyRocJpegDecode") # In-tree build locations (match pybind target layout) -set(ROCPYDECODE_BUILD_LIB_DIR "${CMAKE_BINARY_DIR}/rocpydecode/lib") +set(ROCPYDECODE_BUILD_LIB_DIR "${CMAKE_BINARY_DIR}/rocpydecode_${PY_VERSION_SUFFIX}/lib") set(ROCPYDECODE_BUILD_PY_DIR "${CMAKE_BINARY_DIR}/rocpydecode_${PY_VERSION_SUFFIX}/pyRocVideoDecode") -set(ROCPYJPEG_BUILD_LIB_DIR "${CMAKE_BINARY_DIR}/rocpyjpegdecode/lib") +set(ROCPYJPEG_BUILD_LIB_DIR "${CMAKE_BINARY_DIR}/rocpyjpegdecode_${PY_VERSION_SUFFIX}/lib") set(ROCPYJPEG_BUILD_PY_DIR "${CMAKE_BINARY_DIR}/rocpyjpegdecode_${PY_VERSION_SUFFIX}/pyRocJpegDecode") # check installed or build-tree pybind bindings @@ -92,12 +92,19 @@ if(VIDEO_DECODE_BINDINGS_INSTALLED) endif() endif() if(NOT VIDEO_DECODE_BINDINGS_INSTALLED) - file(GLOB ROCPYDECODE_PYMODULES "${ROCPYDECODE_BUILD_LIB_DIR}/rocpydecode*.so" "${ROCPYDECODE_BUILD_LIB_DIR}/rocpydecode*.pyd") - if(ROCPYDECODE_PYMODULES AND EXISTS "${ROCPYDECODE_BUILD_PY_DIR}") + if(TARGET "rocpydecode_${PY_VERSION_SUFFIX}") set(VIDEO_DECODE_BINDINGS_INSTALLED ON) set(ROCPYDECODE_LIB_DIR "${ROCPYDECODE_BUILD_LIB_DIR}") set(ROCPYDECODE_PY_DIR "${ROCPYDECODE_BUILD_PY_DIR}") - message("-- ${White}${PROJECT_NAME}: using in-tree rocPyDecode build outputs at ${ROCPYDECODE_LIB_DIR}${ColourReset}") + message("-- ${White}${PROJECT_NAME}: using in-tree rocPyDecode target outputs at ${ROCPYDECODE_LIB_DIR}${ColourReset}") + else() + file(GLOB ROCPYDECODE_PYMODULES "${ROCPYDECODE_BUILD_LIB_DIR}/rocpydecode*.so" "${ROCPYDECODE_BUILD_LIB_DIR}/rocpydecode*.pyd") + if(ROCPYDECODE_PYMODULES AND EXISTS "${ROCPYDECODE_BUILD_PY_DIR}") + set(VIDEO_DECODE_BINDINGS_INSTALLED ON) + set(ROCPYDECODE_LIB_DIR "${ROCPYDECODE_BUILD_LIB_DIR}") + set(ROCPYDECODE_PY_DIR "${ROCPYDECODE_BUILD_PY_DIR}") + message("-- ${White}${PROJECT_NAME}: using in-tree rocPyDecode build outputs at ${ROCPYDECODE_LIB_DIR}${ColourReset}") + endif() endif() endif() @@ -114,12 +121,19 @@ if(JPEG_DECODE_PYBIND_SCRIPTS) endif() endif() if(NOT JPEG_DECODE_PYBIND_SCRIPTS) - file(GLOB ROCPYJPEG_PYMODULES "${ROCPYJPEG_BUILD_LIB_DIR}/rocpyjpegdecode*.so" "${ROCPYJPEG_BUILD_LIB_DIR}/rocpyjpegdecode*.pyd") - if(ROCPYJPEG_PYMODULES AND EXISTS "${ROCPYJPEG_BUILD_PY_DIR}") + if(TARGET "rocpyjpegdecode_${PY_VERSION_SUFFIX}") set(JPEG_DECODE_PYBIND_SCRIPTS ON) set(ROCPYJPEG_LIB_DIR "${ROCPYJPEG_BUILD_LIB_DIR}") set(ROCPYJPEG_PY_DIR "${ROCPYJPEG_BUILD_PY_DIR}") - message("-- ${White}${PROJECT_NAME}: using in-tree rocPyJPEG build outputs at ${ROCPYJPEG_LIB_DIR}${ColourReset}") + message("-- ${White}${PROJECT_NAME}: using in-tree rocPyJPEG target outputs at ${ROCPYJPEG_LIB_DIR}${ColourReset}") + else() + file(GLOB ROCPYJPEG_PYMODULES "${ROCPYJPEG_BUILD_LIB_DIR}/rocpyjpegdecode*.so" "${ROCPYJPEG_BUILD_LIB_DIR}/rocpyjpegdecode*.pyd") + if(ROCPYJPEG_PYMODULES AND EXISTS "${ROCPYJPEG_BUILD_PY_DIR}") + set(JPEG_DECODE_PYBIND_SCRIPTS ON) + set(ROCPYJPEG_LIB_DIR "${ROCPYJPEG_BUILD_LIB_DIR}") + set(ROCPYJPEG_PY_DIR "${ROCPYJPEG_BUILD_PY_DIR}") + message("-- ${White}${PROJECT_NAME}: using in-tree rocPyJPEG build outputs at ${ROCPYJPEG_LIB_DIR}${ColourReset}") + endif() endif() endif() @@ -152,6 +166,22 @@ endif() find_package(rocdecode 1.0.0 QUIET) find_package(rocjpeg 1.0.0 QUIET) find_library(rocdecode_HOST_LIBRARY NAMES rocdecodehost rocdecode-host PATHS ${ROCM_PATH}/lib) + +# When configured from the installed test package, reproduce the same FFmpeg +# capability check used by the parent project. The bindings require both the +# system FFmpeg development files and rocDecode's optional FFmpeg utilities. +if(NOT DEFINED ROCPYDECODE_USE_FFMPEG) + find_package(FFmpeg QUIET) + set(ROCDECODE_FFMPEG_UTILS_DIR "${ROCM_PATH}/share/rocdecode/utils/ffmpegvideodecode") + file(GLOB ROCDECODE_FFMPEG_UTILS_SOURCES "${ROCDECODE_FFMPEG_UTILS_DIR}/*.cpp") + set(ROCPYDECODE_USE_FFMPEG FALSE) + if(FFMPEG_FOUND + AND EXISTS "${ROCDECODE_FFMPEG_UTILS_DIR}/ffmpeg_video_dec.h" + AND ROCDECODE_FFMPEG_UTILS_SOURCES) + set(ROCPYDECODE_USE_FFMPEG TRUE) + endif() +endif() + set(RUN_ROCPYDECODE_TESTS OFF) set(RUN_ROCPYJPEG_TESTS OFF) set(RUN_ROCPYDECODE_HOST_TESTS OFF) @@ -181,6 +211,16 @@ endif() message("-- ${White}${PROJECT_NAME}: summary RUN_ROCPYDECODE_TESTS=${RUN_ROCPYDECODE_TESTS} RUN_ROCPYDECODE_HOST_TESTS=${RUN_ROCPYDECODE_HOST_TESTS} RUN_ROCPYJPEG_TESTS=${RUN_ROCPYJPEG_TESTS}${ColourReset}") +if(RUN_ROCPYDECODE_TESTS AND RUN_ROCPYJPEG_TESTS) + add_test(NAME rocpydecode_test_module_coexistence + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/module_coexistence_test.py + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TEST rocpydecode_test_module_coexistence PROPERTY ENVIRONMENT + "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:${ROCPYJPEG_PYTHONPATH}:$ENV{PYTHONPATH}" + "LD_LIBRARY_PATH=${ROCM_PATH}/lib:$ENV{LD_LIBRARY_PATH}") +endif() + if(NOT VIDEO_DECODE_BINDINGS_INSTALLED) message("-- ${Yellow}NOTE: ${PROJECT_NAME} requires the video decode bindings to be built (build tree or installed) before running CTests${ColourReset}") endif() @@ -230,7 +270,7 @@ if(RUN_ROCPYDECODE_TESTS) ) set_property(TEST rocpydecode_test_demuxer PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") else() - message("-- ${Yellow}${PROJECT_NAME}: FFmpeg not available; skipping decoder/demuxer/CPU sample tests.${ColourReset}") + message("-- ${Yellow}${PROJECT_NAME}: FFmpeg-backed bindings unavailable; skipping decoder/demuxer/CPU sample tests.${ColourReset}") endif() # 4 - types test add_test(NAME rocpydecode_test_types @@ -320,36 +360,50 @@ if(RUN_ROCPYDECODE_TESTS) set_property(TEST video_decode_python_ffmpeg PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") endif() endif() - # 14 - video_decode_raw_python (Annex-B raw bitstream) - add_test(NAME video_decode_raw_python - COMMAND ${Python3_EXECUTABLE} ${ROCPYDECODE_SAMPLE_DIR}/videodecoderaw.py - -i ${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H264.264 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - set_property(TEST video_decode_raw_python PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") - # 15 - video_decode_raw_python_h265 (Annex-B raw HEVC bitstream) - add_test(NAME video_decode_raw_python_h265 - COMMAND ${Python3_EXECUTABLE} ${ROCPYDECODE_SAMPLE_DIR}/videodecoderaw.py - -i ${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H265.265 - --codec h265 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - set_property(TEST video_decode_raw_python_h265 PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") + set(ROCPYDECODE_RAW_H264 "${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H264.264") + if(EXISTS "${ROCPYDECODE_RAW_H264}") + # 14 - video_decode_raw_python (Annex-B raw bitstream) + add_test(NAME video_decode_raw_python + COMMAND ${Python3_EXECUTABLE} ${ROCPYDECODE_SAMPLE_DIR}/videodecoderaw.py + -i ${ROCPYDECODE_RAW_H264} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TEST video_decode_raw_python PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") + endif() + + set(ROCPYDECODE_RAW_H265 "${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H265.265") + if(EXISTS "${ROCPYDECODE_RAW_H265}") + # 15 - video_decode_raw_python_h265 (Annex-B raw HEVC bitstream) + add_test(NAME video_decode_raw_python_h265 + COMMAND ${Python3_EXECUTABLE} ${ROCPYDECODE_SAMPLE_DIR}/videodecoderaw.py + -i ${ROCPYDECODE_RAW_H265} + --codec h265 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TEST video_decode_raw_python_h265 PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") + endif() + # 16 - all_other_decoder_apis test - add_test(NAME all_other_decoder_apis - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/decoder_api_test.py - -i ${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H264.mp4 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - set_property(TEST all_other_decoder_apis PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") + if(ROCPYDECODE_USE_FFMPEG AND RUN_ROCPYDECODE_HOST_TESTS) + add_test(NAME all_other_decoder_apis + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/decoder_api_test.py + -i ${ROCM_PATH}/share/rocdecode/video/AMD_driving_virtual_20-H264.mp4 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + set_property(TEST all_other_decoder_apis PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYDECODE_PYTHONPATH}:$PYTHONPATH") + endif() endif() if(RUN_ROCPYJPEG_TESTS) + set(ROCPYJPEG_IMAGE_DIR "${ROCM_PATH}/share/rocjpeg/images") + set(ROCPYJPEG_SINGLE_IMAGE "${ROCPYJPEG_IMAGE_DIR}/mug_420.jpg") + file(GLOB ROCPYJPEG_SAMPLE_IMAGES "${ROCPYJPEG_IMAGE_DIR}/*.jpg" "${ROCPYJPEG_IMAGE_DIR}/*.jpeg") + # 17 - jpeg_decode_single_file_test - if(TORCH_PYTHON_RESULT EQUAL 0) + if(TORCH_PYTHON_RESULT EQUAL 0 AND EXISTS "${ROCPYJPEG_SINGLE_IMAGE}") add_test(NAME jpeg_decode_python COMMAND ${Python3_EXECUTABLE} ${ROCPYJPEG_SAMPLE_DIR}/jpegdecode.py - -i ${ROCM_PATH}/share/rocjpeg/images/mug_420.jpg + -i ${ROCPYJPEG_SINGLE_IMAGE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) if(USING_THE_ROCK) set_property(TEST jpeg_decode_python PROPERTY ENVIRONMENT @@ -360,16 +414,18 @@ if(RUN_ROCPYJPEG_TESTS) endif() endif(TORCH_PYTHON_RESULT EQUAL 0) # 18 - jpegdecodebatched_test - add_test(NAME jpeg_decode_batched_python - COMMAND ${Python3_EXECUTABLE} ${ROCPYJPEG_SAMPLE_DIR}/jpegdecodebatched.py - -i ${ROCM_PATH}/share/rocjpeg/images/ - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - if(USING_THE_ROCK) - set_property(TEST jpeg_decode_batched_python PROPERTY ENVIRONMENT - "PYTHONPATH=${ROCPYJPEG_PYTHONPATH}:$ENV{PYTHONPATH}" - "LD_LIBRARY_PATH=${ROCM_PATH}/lib:$ENV{LD_LIBRARY_PATH}") - else() - set_property(TEST jpeg_decode_batched_python PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYJPEG_PYTHONPATH}:$PYTHONPATH") + if(ROCPYJPEG_SAMPLE_IMAGES) + add_test(NAME jpeg_decode_batched_python + COMMAND ${Python3_EXECUTABLE} ${ROCPYJPEG_SAMPLE_DIR}/jpegdecodebatched.py + -i ${ROCPYJPEG_IMAGE_DIR}/ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + if(USING_THE_ROCK) + set_property(TEST jpeg_decode_batched_python PROPERTY ENVIRONMENT + "PYTHONPATH=${ROCPYJPEG_PYTHONPATH}:$ENV{PYTHONPATH}" + "LD_LIBRARY_PATH=${ROCM_PATH}/lib:$ENV{LD_LIBRARY_PATH}") + else() + set_property(TEST jpeg_decode_batched_python PROPERTY ENVIRONMENT "PYTHONPATH=${ROCPYJPEG_PYTHONPATH}:$PYTHONPATH") + endif() endif() endif() diff --git a/tests/module_coexistence_test.py b/tests/module_coexistence_test.py new file mode 100644 index 00000000..19ed21b8 --- /dev/null +++ b/tests/module_coexistence_test.py @@ -0,0 +1,27 @@ +# Copyright (c) 2026 Advanced Micro Devices, Inc. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import rocpydecode +import rocpyjpegdecode + + +assert hasattr(rocpydecode, "BufferInterface") +assert hasattr(rocpyjpegdecode, "BufferInterface") +print("rocPyDecode and rocPyJPEG module coexistence: PASS")