Skip to content

Commit c3ddaaf

Browse files
committed
fix: Update nvImageCodec API compatibility and complete cuslide2 plugin build)
1 parent baaa54e commit c3ddaaf

File tree

3 files changed

+273
-6
lines changed

3 files changed

+273
-6
lines changed

cpp/cmake/deps/nvimgcodec.cmake

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
#
2+
# Copyright (c) 2020-2025, NVIDIA CORPORATION.
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#
15+
16+
if (NOT TARGET deps::nvimgcodec)
17+
# Option to automatically install nvImageCodec via conda
18+
option(AUTO_INSTALL_NVIMGCODEC "Automatically install nvImageCodec via conda" ON)
19+
set(NVIMGCODEC_VERSION "0.6.0" CACHE STRING "nvImageCodec version to install")
20+
21+
# Automatic installation logic
22+
if(AUTO_INSTALL_NVIMGCODEC)
23+
message(STATUS "Configuring automatic nvImageCodec installation...")
24+
25+
# Try to find micromamba or conda in various locations
26+
find_program(MICROMAMBA_EXECUTABLE
27+
NAMES micromamba
28+
PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../../../bin
29+
${CMAKE_CURRENT_SOURCE_DIR}/../../bin
30+
${CMAKE_CURRENT_SOURCE_DIR}/bin
31+
$ENV{HOME}/micromamba/bin
32+
$ENV{HOME}/.local/bin
33+
/usr/local/bin
34+
/opt/conda/bin
35+
/opt/miniconda/bin
36+
DOC "Path to micromamba executable"
37+
)
38+
39+
find_program(CONDA_EXECUTABLE
40+
NAMES conda mamba
41+
PATHS $ENV{HOME}/miniconda3/bin
42+
$ENV{HOME}/anaconda3/bin
43+
/opt/conda/bin
44+
/opt/miniconda/bin
45+
/usr/local/bin
46+
DOC "Path to conda/mamba executable"
47+
)
48+
49+
# Determine which conda tool to use
50+
set(CONDA_CMD "")
51+
set(CONDA_TYPE "")
52+
if(MICROMAMBA_EXECUTABLE)
53+
set(CONDA_CMD ${MICROMAMBA_EXECUTABLE})
54+
set(CONDA_TYPE "micromamba")
55+
message(STATUS "Found micromamba: ${MICROMAMBA_EXECUTABLE}")
56+
elseif(CONDA_EXECUTABLE)
57+
set(CONDA_CMD ${CONDA_EXECUTABLE})
58+
set(CONDA_TYPE "conda")
59+
message(STATUS "Found conda/mamba: ${CONDA_EXECUTABLE}")
60+
endif()
61+
62+
if(CONDA_CMD)
63+
# Check if nvImageCodec is already installed
64+
message(STATUS "Checking for existing nvImageCodec installation...")
65+
execute_process(
66+
COMMAND ${CONDA_CMD} list libnvimgcodec-dev
67+
RESULT_VARIABLE NVIMGCODEC_CHECK_RESULT
68+
OUTPUT_VARIABLE NVIMGCODEC_CHECK_OUTPUT
69+
ERROR_QUIET
70+
)
71+
72+
# Parse version from output if installed
73+
set(NVIMGCODEC_INSTALLED_VERSION "")
74+
if(NVIMGCODEC_CHECK_RESULT EQUAL 0)
75+
string(REGEX MATCH "libnvimgcodec-dev[ ]+([0-9]+\\.[0-9]+\\.[0-9]+)"
76+
VERSION_MATCH "${NVIMGCODEC_CHECK_OUTPUT}")
77+
if(CMAKE_MATCH_1)
78+
set(NVIMGCODEC_INSTALLED_VERSION ${CMAKE_MATCH_1})
79+
endif()
80+
endif()
81+
82+
# Install or upgrade if needed
83+
set(NEED_INSTALL FALSE)
84+
if(NOT NVIMGCODEC_CHECK_RESULT EQUAL 0)
85+
message(STATUS "nvImageCodec not found - installing version ${NVIMGCODEC_VERSION}")
86+
set(NEED_INSTALL TRUE)
87+
elseif(NVIMGCODEC_INSTALLED_VERSION AND NVIMGCODEC_INSTALLED_VERSION VERSION_LESS NVIMGCODEC_VERSION)
88+
message(STATUS "nvImageCodec ${NVIMGCODEC_INSTALLED_VERSION} found - upgrading to ${NVIMGCODEC_VERSION}")
89+
set(NEED_INSTALL TRUE)
90+
else()
91+
message(STATUS "nvImageCodec ${NVIMGCODEC_INSTALLED_VERSION} already installed (>= ${NVIMGCODEC_VERSION})")
92+
endif()
93+
94+
if(NEED_INSTALL)
95+
# Install nvImageCodec with specific version
96+
message(STATUS "Installing nvImageCodec ${NVIMGCODEC_VERSION} via ${CONDA_TYPE}...")
97+
execute_process(
98+
COMMAND ${CONDA_CMD} install
99+
libnvimgcodec-dev=${NVIMGCODEC_VERSION}
100+
libnvimgcodec0=${NVIMGCODEC_VERSION}
101+
-c conda-forge -y
102+
RESULT_VARIABLE CONDA_INSTALL_RESULT
103+
OUTPUT_VARIABLE CONDA_INSTALL_OUTPUT
104+
ERROR_VARIABLE CONDA_INSTALL_ERROR
105+
TIMEOUT 300 # 5 minute timeout
106+
)
107+
108+
if(CONDA_INSTALL_RESULT EQUAL 0)
109+
message(STATUS "✓ Successfully installed nvImageCodec ${NVIMGCODEC_VERSION}")
110+
else()
111+
message(WARNING "✗ Failed to install nvImageCodec via ${CONDA_TYPE}")
112+
message(WARNING "Error: ${CONDA_INSTALL_ERROR}")
113+
114+
# Try alternative installation without version constraint
115+
message(STATUS "Attempting installation without version constraint...")
116+
execute_process(
117+
COMMAND ${CONDA_CMD} install libnvimgcodec-dev libnvimgcodec0 -c conda-forge -y
118+
RESULT_VARIABLE CONDA_FALLBACK_RESULT
119+
OUTPUT_QUIET
120+
ERROR_QUIET
121+
)
122+
123+
if(CONDA_FALLBACK_RESULT EQUAL 0)
124+
message(STATUS "✓ Fallback installation successful")
125+
else()
126+
message(WARNING "✗ Fallback installation also failed")
127+
endif()
128+
endif()
129+
endif()
130+
else()
131+
message(STATUS "No conda/micromamba found - skipping automatic installation")
132+
endif()
133+
endif()
134+
135+
# First try to find it as a package
136+
find_package(nvimgcodec QUIET)
137+
138+
if(nvimgcodec_FOUND)
139+
# Use the found package
140+
add_library(deps::nvimgcodec INTERFACE IMPORTED GLOBAL)
141+
target_link_libraries(deps::nvimgcodec INTERFACE nvimgcodec::nvimgcodec)
142+
message(STATUS "✓ nvImageCodec found via find_package")
143+
else()
144+
# Manual detection in various environments
145+
set(NVIMGCODEC_LIB_PATH "")
146+
set(NVIMGCODEC_INCLUDE_PATH "")
147+
148+
# Try conda environment detection (both Python packages and native packages)
149+
if(DEFINED ENV{CONDA_BUILD})
150+
# Conda build environment
151+
set(NVIMGCODEC_LIB_PATH "$ENV{PREFIX}/lib/libnvimgcodec.so.0")
152+
set(NVIMGCODEC_INCLUDE_PATH "$ENV{PREFIX}/include/")
153+
if(NOT EXISTS "${NVIMGCODEC_LIB_PATH}")
154+
set(NVIMGCODEC_LIB_PATH "$ENV{PREFIX}/lib/libnvimgcodec.so")
155+
endif()
156+
elseif(DEFINED ENV{CONDA_PREFIX})
157+
# Active conda environment - try native package first
158+
set(CONDA_NATIVE_ROOT "$ENV{CONDA_PREFIX}")
159+
if(EXISTS "${CONDA_NATIVE_ROOT}/include/nvimgcodec.h")
160+
set(NVIMGCODEC_INCLUDE_PATH "${CONDA_NATIVE_ROOT}/include/")
161+
if(EXISTS "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so.0")
162+
set(NVIMGCODEC_LIB_PATH "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so.0")
163+
elseif(EXISTS "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so")
164+
set(NVIMGCODEC_LIB_PATH "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so")
165+
endif()
166+
else()
167+
# Fallback: try Python site-packages in conda environment
168+
foreach(PY_VER "3.13" "3.12" "3.11" "3.10" "3.9")
169+
set(CONDA_PYTHON_ROOT "$ENV{CONDA_PREFIX}/lib/python${PY_VER}/site-packages/nvidia/nvimgcodec")
170+
if(EXISTS "${CONDA_PYTHON_ROOT}/include/nvimgcodec.h")
171+
set(NVIMGCODEC_INCLUDE_PATH "${CONDA_PYTHON_ROOT}/include/")
172+
if(EXISTS "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
173+
set(NVIMGCODEC_LIB_PATH "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
174+
elseif(EXISTS "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so")
175+
set(NVIMGCODEC_LIB_PATH "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so")
176+
endif()
177+
break()
178+
endif()
179+
endforeach()
180+
endif()
181+
else()
182+
# Try Python site-packages detection
183+
find_package(Python3 COMPONENTS Interpreter)
184+
if(Python3_FOUND)
185+
execute_process(
186+
COMMAND ${Python3_EXECUTABLE} -c "import site; print(site.getsitepackages()[0])"
187+
OUTPUT_VARIABLE PYTHON_SITE_PACKAGES
188+
OUTPUT_STRIP_TRAILING_WHITESPACE
189+
ERROR_QUIET
190+
)
191+
192+
if(PYTHON_SITE_PACKAGES)
193+
set(NVIMGCODEC_PYTHON_ROOT "${PYTHON_SITE_PACKAGES}/nvidia/nvimgcodec")
194+
if(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/include/nvimgcodec.h")
195+
set(NVIMGCODEC_INCLUDE_PATH "${NVIMGCODEC_PYTHON_ROOT}/include/")
196+
if(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
197+
set(NVIMGCODEC_LIB_PATH "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
198+
elseif(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so")
199+
set(NVIMGCODEC_LIB_PATH "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so")
200+
endif()
201+
endif()
202+
endif()
203+
endif()
204+
205+
# System-wide installation fallback
206+
if(NOT NVIMGCODEC_LIB_PATH)
207+
if(EXISTS /usr/lib/x86_64-linux-gnu/libnvimgcodec.so.0)
208+
set(NVIMGCODEC_LIB_PATH /usr/lib/x86_64-linux-gnu/libnvimgcodec.so.0)
209+
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
210+
elseif(EXISTS /usr/lib/aarch64-linux-gnu/libnvimgcodec.so.0)
211+
set(NVIMGCODEC_LIB_PATH /usr/lib/aarch64-linux-gnu/libnvimgcodec.so.0)
212+
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
213+
elseif(EXISTS /usr/lib64/libnvimgcodec.so.0) # CentOS (x86_64)
214+
set(NVIMGCODEC_LIB_PATH /usr/lib64/libnvimgcodec.so.0)
215+
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
216+
endif()
217+
endif()
218+
endif()
219+
220+
# Create the target if we found the library
221+
if(NVIMGCODEC_LIB_PATH AND EXISTS "${NVIMGCODEC_LIB_PATH}")
222+
add_library(deps::nvimgcodec SHARED IMPORTED GLOBAL)
223+
set_target_properties(deps::nvimgcodec PROPERTIES
224+
IMPORTED_LOCATION "${NVIMGCODEC_LIB_PATH}"
225+
INTERFACE_INCLUDE_DIRECTORIES "${NVIMGCODEC_INCLUDE_PATH}"
226+
)
227+
message(STATUS "✓ nvImageCodec found:")
228+
message(STATUS " Library: ${NVIMGCODEC_LIB_PATH}")
229+
message(STATUS " Headers: ${NVIMGCODEC_INCLUDE_PATH}")
230+
else()
231+
# Create a dummy target to prevent build failures
232+
add_library(deps::nvimgcodec INTERFACE IMPORTED GLOBAL)
233+
message(STATUS "✗ nvImageCodec not found - GPU acceleration disabled")
234+
message(STATUS "To enable nvImageCodec support:")
235+
message(STATUS " Option 1 (conda): micromamba install libnvimgcodec-dev -c conda-forge")
236+
message(STATUS " Option 2 (pip): pip install nvidia-nvimgcodec-cu12[all]")
237+
message(STATUS " Option 3 (cmake): cmake -DAUTO_INSTALL_NVIMGCODEC=ON ..")
238+
endif()
239+
endif()
240+
endif()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#
2+
# Copyright (c) 2020, NVIDIA CORPORATION.
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#
15+
16+
@PACKAGE_INIT@
17+
18+
# Find dependent libraries
19+
# ...
20+
include(CMakeFindDependencyMacro)
21+
#find_dependency(Boost x.x.x REQUIRED)
22+
23+
if(NOT TARGET cuslide2::cuslide2)
24+
include(${CMAKE_CURRENT_LIST_DIR}/cucim.kit.cuslide2-targets.cmake)
25+
endif()

cpp/plugins/cucim.kit.cuslide2/src/cuslide/nvimgcodec/nvimgcodec_decoder.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ class NvImageCodecManager
5858
throw std::runtime_error("Failed to create nvImageCodec instance");
5959
}
6060

61-
// Create decoder
62-
nvimgcodecDecoderCreateInfo_t decoder_info{};
63-
decoder_info.struct_type = NVIMGCODEC_STRUCTURE_TYPE_DECODER_CREATE_INFO;
64-
decoder_info.struct_size = sizeof(nvimgcodecDecoderCreateInfo_t);
65-
decoder_info.struct_next = nullptr;
61+
// Create decoder with default execution parameters
62+
nvimgcodecExecutionParams_t exec_params{};
63+
exec_params.struct_type = NVIMGCODEC_STRUCTURE_TYPE_EXECUTION_PARAMS;
64+
exec_params.struct_size = sizeof(nvimgcodecExecutionParams_t);
65+
exec_params.struct_next = nullptr;
66+
exec_params.device_id = NVIMGCODEC_DEVICE_CURRENT;
67+
exec_params.max_num_cpu_threads = 0; // Use default
6668

67-
if (nvimgcodecDecoderCreate(instance_, &decoder_, &decoder_info) != NVIMGCODEC_STATUS_SUCCESS)
69+
if (nvimgcodecDecoderCreate(instance_, &decoder_, &exec_params, nullptr) != NVIMGCODEC_STATUS_SUCCESS)
6870
{
6971
nvimgcodecInstanceDestroy(instance_);
7072
throw std::runtime_error("Failed to create nvImageCodec decoder");

0 commit comments

Comments
 (0)