Skip to content

Commit 58bef88

Browse files
committed
Add dynlink_nvcuvid
Signed-off-by: Joaquin Anton <janton@nvidia.com>
1 parent 5ddbb71 commit 58bef88

File tree

4 files changed

+357
-0
lines changed

4 files changed

+357
-0
lines changed

plugins/dali_video/src/nvidia/dali_video/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ endif()
6868
message(STATUS "DALI_LIB_DIR=${DALI_LIB_DIR}")
6969

7070
set(VIDEO_PLUGIN_SOURCES
71+
dynlink_nvcuvid/dynlink_nvcuvid_gen.cc # TODO(janton): remove
72+
dynlink_nvcuvid/dynlink_nvcuvid.cc # TODO(janton): remove
7173
loader/frames_decoder.cc
7274
loader/frames_decoder_gpu.cc
7375
loader/video_loader_decoder_cpu.cc
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) 2020-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
//
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+
#include <dlfcn.h>
16+
#include <stdio.h>
17+
#include <mutex>
18+
#include <string>
19+
#include <unordered_map>
20+
#include "dynlink_nvcuvid.h"
21+
22+
namespace {
23+
24+
static char __DriverLibName[] = "libnvcuvid.so";
25+
static char __DriverLibName1[] = "libnvcuvid.so.1";
26+
27+
using CUVIDDRIVER = void *;
28+
29+
CUVIDDRIVER loadNvcuvidLibrary() {
30+
CUVIDDRIVER ret = nullptr;
31+
32+
ret = dlopen(__DriverLibName, RTLD_NOW);
33+
34+
if (!ret) {
35+
ret = dlopen(__DriverLibName1, RTLD_NOW);
36+
37+
if (!ret) {
38+
fprintf(stderr, "dlopen libnvcuvid.so failed!. Please install GPU dirver");
39+
}
40+
}
41+
return ret;
42+
}
43+
44+
} // namespace
45+
46+
void *NvcuvidLoadSymbol(const char *name) {
47+
static CUVIDDRIVER nvcuvidDrvLib = loadNvcuvidLibrary();
48+
void *ret = nvcuvidDrvLib ? dlsym(nvcuvidDrvLib, name) : nullptr;
49+
return ret;
50+
}
51+
52+
bool cuvidInitChecked() {
53+
static CUVIDDRIVER nvcuvidDrvLib = loadNvcuvidLibrary();
54+
return nvcuvidDrvLib != nullptr;
55+
}
56+
57+
bool cuvidIsSymbolAvailable(const char *name) {
58+
static std::mutex symbol_mutex;
59+
static std::unordered_map<std::string, void*> symbol_map;
60+
std::lock_guard<std::mutex> lock(symbol_mutex);
61+
auto it = symbol_map.find(name);
62+
if (it == symbol_map.end()) {
63+
auto *ptr = NvcuvidLoadSymbol(name);
64+
symbol_map.insert({name, ptr});
65+
return ptr != nullptr;
66+
}
67+
return it->second != nullptr;
68+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) 2017-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
//
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+
#pragma once
16+
17+
#include <string>
18+
#include "dali/core/cuda_error.h"
19+
#include "nvcuvid.h"
20+
21+
#define NVCUVID_CALL(arg) CUDA_CALL(arg)
22+
#define NVCUVID_API_EXISTS(arg) (cuvidIsSymbolAvailable(#arg))
23+
24+
bool cuvidInitChecked(void);
25+
bool cuvidIsSymbolAvailable(const char *name);
Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
#include <cuda.h>
2+
#include "VideoCodecSDKUtils/Interface/cuviddec.h"
3+
#include "VideoCodecSDKUtils/Interface/nvcuvid.h"
4+
5+
void *NvcuvidLoadSymbol(const char *name);
6+
7+
#define LOAD_SYMBOL_FUNC Nvcuvid##LoadSymbol
8+
9+
#pragma GCC diagnostic ignored "-Wattributes"
10+
11+
12+
CUresult CUDAAPI cuvidGetDecoderCapsNotFound(CUVIDDECODECAPS *) {
13+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
14+
}
15+
16+
CUresult cuvidGetDecoderCaps(CUVIDDECODECAPS * pdc) {
17+
using FuncPtr = CUresult (CUDAAPI *)(CUVIDDECODECAPS *);
18+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetDecoderCaps")) ?
19+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetDecoderCaps")) :
20+
cuvidGetDecoderCapsNotFound;
21+
return func_ptr(pdc);
22+
}
23+
24+
CUresult CUDAAPI cuvidCreateDecoderNotFound(CUvideodecoder *, CUVIDDECODECREATEINFO *) {
25+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
26+
}
27+
28+
CUresult cuvidCreateDecoder(CUvideodecoder * phDecoder, CUVIDDECODECREATEINFO * pdci) {
29+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder *, CUVIDDECODECREATEINFO *);
30+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateDecoder")) ?
31+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateDecoder")) :
32+
cuvidCreateDecoderNotFound;
33+
return func_ptr(phDecoder, pdci);
34+
}
35+
36+
CUresult CUDAAPI cuvidDestroyDecoderNotFound(CUvideodecoder) {
37+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
38+
}
39+
40+
CUresult cuvidDestroyDecoder(CUvideodecoder hDecoder) {
41+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder);
42+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDestroyDecoder")) ?
43+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDestroyDecoder")) :
44+
cuvidDestroyDecoderNotFound;
45+
return func_ptr(hDecoder);
46+
}
47+
48+
CUresult CUDAAPI cuvidDecodePictureNotFound(CUvideodecoder, CUVIDPICPARAMS *) {
49+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
50+
}
51+
52+
CUresult cuvidDecodePicture(CUvideodecoder hDecoder, CUVIDPICPARAMS * pPicParams) {
53+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder, CUVIDPICPARAMS *);
54+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDecodePicture")) ?
55+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDecodePicture")) :
56+
cuvidDecodePictureNotFound;
57+
return func_ptr(hDecoder, pPicParams);
58+
}
59+
60+
CUresult CUDAAPI cuvidGetDecodeStatusNotFound(CUvideodecoder, int, CUVIDGETDECODESTATUS *) {
61+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
62+
}
63+
64+
CUresult cuvidGetDecodeStatus(CUvideodecoder hDecoder, int nPicIdx, CUVIDGETDECODESTATUS * pDecodeStatus) {
65+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder, int, CUVIDGETDECODESTATUS *);
66+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetDecodeStatus")) ?
67+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetDecodeStatus")) :
68+
cuvidGetDecodeStatusNotFound;
69+
return func_ptr(hDecoder, nPicIdx, pDecodeStatus);
70+
}
71+
72+
CUresult CUDAAPI cuvidReconfigureDecoderNotFound(CUvideodecoder, CUVIDRECONFIGUREDECODERINFO *) {
73+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
74+
}
75+
76+
CUresult cuvidReconfigureDecoder(CUvideodecoder hDecoder, CUVIDRECONFIGUREDECODERINFO * pDecReconfigParams) {
77+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder, CUVIDRECONFIGUREDECODERINFO *);
78+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidReconfigureDecoder")) ?
79+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidReconfigureDecoder")) :
80+
cuvidReconfigureDecoderNotFound;
81+
return func_ptr(hDecoder, pDecReconfigParams);
82+
}
83+
84+
CUresult CUDAAPI cuvidMapVideoFrame64NotFound(CUvideodecoder, int, unsigned long long *, unsigned int *, CUVIDPROCPARAMS *) {
85+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
86+
}
87+
88+
CUresult cuvidMapVideoFrame64(CUvideodecoder hDecoder, int nPicIdx, unsigned long long * pDevPtr, unsigned int * pPitch, CUVIDPROCPARAMS * pVPP) {
89+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder, int, unsigned long long *, unsigned int *, CUVIDPROCPARAMS *);
90+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidMapVideoFrame64")) ?
91+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidMapVideoFrame64")) :
92+
cuvidMapVideoFrame64NotFound;
93+
return func_ptr(hDecoder, nPicIdx, pDevPtr, pPitch, pVPP);
94+
}
95+
96+
CUresult CUDAAPI cuvidUnmapVideoFrame64NotFound(CUvideodecoder, unsigned long long) {
97+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
98+
}
99+
100+
CUresult cuvidUnmapVideoFrame64(CUvideodecoder hDecoder, unsigned long long DevPtr) {
101+
using FuncPtr = CUresult (CUDAAPI *)(CUvideodecoder, unsigned long long);
102+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidUnmapVideoFrame64")) ?
103+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidUnmapVideoFrame64")) :
104+
cuvidUnmapVideoFrame64NotFound;
105+
return func_ptr(hDecoder, DevPtr);
106+
}
107+
108+
CUresult CUDAAPI cuvidCtxLockCreateNotFound(CUvideoctxlock *, CUcontext) {
109+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
110+
}
111+
112+
CUresult cuvidCtxLockCreate(CUvideoctxlock * pLock, CUcontext ctx) {
113+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoctxlock *, CUcontext);
114+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLockCreate")) ?
115+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLockCreate")) :
116+
cuvidCtxLockCreateNotFound;
117+
return func_ptr(pLock, ctx);
118+
}
119+
120+
CUresult CUDAAPI cuvidCtxLockDestroyNotFound(CUvideoctxlock) {
121+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
122+
}
123+
124+
CUresult cuvidCtxLockDestroy(CUvideoctxlock lck) {
125+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoctxlock);
126+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLockDestroy")) ?
127+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLockDestroy")) :
128+
cuvidCtxLockDestroyNotFound;
129+
return func_ptr(lck);
130+
}
131+
132+
CUresult CUDAAPI cuvidCtxLockNotFound(CUvideoctxlock, unsigned int) {
133+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
134+
}
135+
136+
CUresult cuvidCtxLock(CUvideoctxlock lck, unsigned int reserved_flags) {
137+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoctxlock, unsigned int);
138+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLock")) ?
139+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxLock")) :
140+
cuvidCtxLockNotFound;
141+
return func_ptr(lck, reserved_flags);
142+
}
143+
144+
CUresult CUDAAPI cuvidCtxUnlockNotFound(CUvideoctxlock, unsigned int) {
145+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
146+
}
147+
148+
CUresult cuvidCtxUnlock(CUvideoctxlock lck, unsigned int reserved_flags) {
149+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoctxlock, unsigned int);
150+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxUnlock")) ?
151+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCtxUnlock")) :
152+
cuvidCtxUnlockNotFound;
153+
return func_ptr(lck, reserved_flags);
154+
}
155+
156+
CUresult CUDAAPI cuvidCreateVideoSourceNotFound(CUvideosource *, const char *, CUVIDSOURCEPARAMS *) {
157+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
158+
}
159+
160+
CUresult cuvidCreateVideoSource(CUvideosource * pObj, const char * pszFileName, CUVIDSOURCEPARAMS * pParams) {
161+
using FuncPtr = CUresult (CUDAAPI *)(CUvideosource *, const char *, CUVIDSOURCEPARAMS *);
162+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoSource")) ?
163+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoSource")) :
164+
cuvidCreateVideoSourceNotFound;
165+
return func_ptr(pObj, pszFileName, pParams);
166+
}
167+
168+
CUresult CUDAAPI cuvidCreateVideoSourceWNotFound(CUvideosource *, const wchar_t *, CUVIDSOURCEPARAMS *) {
169+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
170+
}
171+
172+
CUresult cuvidCreateVideoSourceW(CUvideosource * pObj, const wchar_t * pwszFileName, CUVIDSOURCEPARAMS * pParams) {
173+
using FuncPtr = CUresult (CUDAAPI *)(CUvideosource *, const wchar_t *, CUVIDSOURCEPARAMS *);
174+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoSourceW")) ?
175+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoSourceW")) :
176+
cuvidCreateVideoSourceWNotFound;
177+
return func_ptr(pObj, pwszFileName, pParams);
178+
}
179+
180+
CUresult CUDAAPI cuvidSetVideoSourceStateNotFound(CUvideosource, cudaVideoState) {
181+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
182+
}
183+
184+
CUresult cuvidSetVideoSourceState(CUvideosource obj, cudaVideoState state) {
185+
using FuncPtr = CUresult (CUDAAPI *)(CUvideosource, cudaVideoState);
186+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidSetVideoSourceState")) ?
187+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidSetVideoSourceState")) :
188+
cuvidSetVideoSourceStateNotFound;
189+
return func_ptr(obj, state);
190+
}
191+
192+
cudaVideoState CUDAAPI cuvidGetVideoSourceStateNotFound(CUvideosource) {
193+
return cudaVideoState_Error;
194+
}
195+
196+
cudaVideoState cuvidGetVideoSourceState(CUvideosource obj) {
197+
using FuncPtr = cudaVideoState (CUDAAPI *)(CUvideosource);
198+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetVideoSourceState")) ?
199+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetVideoSourceState")) :
200+
cuvidGetVideoSourceStateNotFound;
201+
return func_ptr(obj);
202+
}
203+
204+
CUresult CUDAAPI cuvidGetSourceVideoFormatNotFound(CUvideosource, CUVIDEOFORMAT *, unsigned int) {
205+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
206+
}
207+
208+
CUresult cuvidGetSourceVideoFormat(CUvideosource obj, CUVIDEOFORMAT * pvidfmt, unsigned int flags) {
209+
using FuncPtr = CUresult (CUDAAPI *)(CUvideosource, CUVIDEOFORMAT *, unsigned int);
210+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetSourceVideoFormat")) ?
211+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetSourceVideoFormat")) :
212+
cuvidGetSourceVideoFormatNotFound;
213+
return func_ptr(obj, pvidfmt, flags);
214+
}
215+
216+
CUresult CUDAAPI cuvidGetSourceAudioFormatNotFound(CUvideosource, CUAUDIOFORMAT *, unsigned int) {
217+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
218+
}
219+
220+
CUresult cuvidGetSourceAudioFormat(CUvideosource obj, CUAUDIOFORMAT * paudfmt, unsigned int flags) {
221+
using FuncPtr = CUresult (CUDAAPI *)(CUvideosource, CUAUDIOFORMAT *, unsigned int);
222+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetSourceAudioFormat")) ?
223+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidGetSourceAudioFormat")) :
224+
cuvidGetSourceAudioFormatNotFound;
225+
return func_ptr(obj, paudfmt, flags);
226+
}
227+
228+
CUresult CUDAAPI cuvidCreateVideoParserNotFound(CUvideoparser *, CUVIDPARSERPARAMS *) {
229+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
230+
}
231+
232+
CUresult cuvidCreateVideoParser(CUvideoparser * pObj, CUVIDPARSERPARAMS * pParams) {
233+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoparser *, CUVIDPARSERPARAMS *);
234+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoParser")) ?
235+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidCreateVideoParser")) :
236+
cuvidCreateVideoParserNotFound;
237+
return func_ptr(pObj, pParams);
238+
}
239+
240+
CUresult CUDAAPI cuvidParseVideoDataNotFound(CUvideoparser, CUVIDSOURCEDATAPACKET *) {
241+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
242+
}
243+
244+
CUresult cuvidParseVideoData(CUvideoparser obj, CUVIDSOURCEDATAPACKET * pPacket) {
245+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoparser, CUVIDSOURCEDATAPACKET *);
246+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidParseVideoData")) ?
247+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidParseVideoData")) :
248+
cuvidParseVideoDataNotFound;
249+
return func_ptr(obj, pPacket);
250+
}
251+
252+
CUresult CUDAAPI cuvidDestroyVideoParserNotFound(CUvideoparser) {
253+
return CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND;
254+
}
255+
256+
CUresult cuvidDestroyVideoParser(CUvideoparser obj) {
257+
using FuncPtr = CUresult (CUDAAPI *)(CUvideoparser);
258+
static auto func_ptr = reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDestroyVideoParser")) ?
259+
reinterpret_cast<FuncPtr>(LOAD_SYMBOL_FUNC("cuvidDestroyVideoParser")) :
260+
cuvidDestroyVideoParserNotFound;
261+
return func_ptr(obj);
262+
}

0 commit comments

Comments
 (0)