Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
nvbuf_utils.h
1
13#ifndef __NVBUF_UTILS_COMPAT_H__
14#define __NVBUF_UTILS_COMPAT_H__
15
16// Check if we have the original nvbuf_utils.h (JetPack 4.x)
17#if __has_include(<nvbuf_utils_orig.h>)
18 // Use original header if available
19 #include <nvbuf_utils_orig.h>
20#else
21 // JetPack 5.x: Use NvBufSurface API with compatibility mappings
22 #include <nvbufsurface.h>
23 #include <nvbufsurftransform.h>
24 #include <EGL/egl.h>
25 #include <EGL/eglext.h>
26 #include <cstring>
27 #include <sys/mman.h> // For msync() fallback with V4L2 mmap buffers
28
29 // ============================================================================
30 // Type Aliases - Map old types to new types
31 // ============================================================================
32
33 // Color formats - map old enum values to new ones
34 typedef NvBufSurfaceColorFormat NvBufferColorFormat;
35
36 #define NvBufferColorFormat_UYVY NVBUF_COLOR_FORMAT_UYVY
37 #define NvBufferColorFormat_YUYV NVBUF_COLOR_FORMAT_YUYV
38 #define NvBufferColorFormat_YUV420 NVBUF_COLOR_FORMAT_YUV420
39 #define NvBufferColorFormat_NV12 NVBUF_COLOR_FORMAT_NV12
40 #define NvBufferColorFormat_NV12_ER NVBUF_COLOR_FORMAT_NV12_ER
41 #define NvBufferColorFormat_ABGR32 NVBUF_COLOR_FORMAT_ABGR
42 #define NvBufferColorFormat_ARGB32 NVBUF_COLOR_FORMAT_ARGB
43 #define NvBufferColorFormat_RGBA NVBUF_COLOR_FORMAT_RGBA
44 #define NvBufferColorFormat_BGRA NVBUF_COLOR_FORMAT_BGRA
45 #define NvBufferColorFormat_Invalid NVBUF_COLOR_FORMAT_INVALID
46 #define NvBufferColorFormat_GRAY8 NVBUF_COLOR_FORMAT_GRAY8
47
48 // Layout - map old enum values to new ones
49 typedef NvBufSurfaceLayout NvBufferLayout;
50
51 #define NvBufferLayout_Pitch NVBUF_LAYOUT_PITCH
52 #define NvBufferLayout_BlockLinear NVBUF_LAYOUT_BLOCK_LINEAR
53
54 // Memory type / Payload type mapping
55 typedef NvBufSurfaceMemType NvBufferPayload;
56
57 #define NvBufferPayload_SurfArray NVBUF_MEM_SURFACE_ARRAY
58 #define NvBufferPayload_MemHandle NVBUF_MEM_HANDLE
59
60 // Tags for memory allocation
61 #define NvBufferTag_NONE NvBufSurfaceTag_NONE
62 #define NvBufferTag_CAMERA NvBufSurfaceTag_CAMERA
63 #define NvBufferTag_VIDEO_DEC NvBufSurfaceTag_VIDEO_DEC
64 #define NvBufferTag_VIDEO_ENC NvBufSurfaceTag_VIDEO_ENC
65 #define NvBufferTag_VIDEO_CONVERT NvBufSurfaceTag_VIDEO_CONVERT
66
67 // Memory mapping flags
68 typedef NvBufSurfaceMemMapFlags NvBufferMemMapFlags;
69
70 #define NvBufferMem_Read NVBUF_MAP_READ
71 #define NvBufferMem_Write NVBUF_MAP_WRITE
72 #define NvBufferMem_Read_Write NVBUF_MAP_READ_WRITE
73
74 // Transform flip modes
75 typedef NvBufSurfTransform_Flip NvBufferTransform_Flip;
76
77 #define NvBufferTransform_None NvBufSurfTransform_None
78 #define NvBufferTransform_Rotate90 NvBufSurfTransform_Rotate90
79 #define NvBufferTransform_Rotate180 NvBufSurfTransform_Rotate180
80 #define NvBufferTransform_Rotate270 NvBufSurfTransform_Rotate270
81 #define NvBufferTransform_FlipX NvBufSurfTransform_FlipX
82 #define NvBufferTransform_FlipY NvBufSurfTransform_FlipY
83
84 // Transform filter types
85 typedef NvBufSurfTransform_Inter NvBufferTransform_Filter;
86
87 #define NvBufferTransform_Filter_Nearest NvBufSurfTransformInter_Nearest
88 #define NvBufferTransform_Filter_Bilinear NvBufSurfTransformInter_Bilinear
89 #define NvBufferTransform_Filter_5_Tap NvBufSurfTransformInter_Algo1
90 #define NvBufferTransform_Filter_10_Tap NvBufSurfTransformInter_Algo2
91 #define NvBufferTransform_Filter_Smart NvBufSurfTransformInter_Algo3
92 #define NvBufferTransform_Filter_Nicest NvBufSurfTransformInter_Algo4
93
94 // Transform flags - map old enum values to new ones
95 // These are bit flags used in NvBufferTransformParams.transform_flag
96 #define NVBUFFER_TRANSFORM_FILTER NVBUFSURF_TRANSFORM_FILTER
97 #define NVBUFFER_TRANSFORM_CROP_SRC NVBUFSURF_TRANSFORM_CROP_SRC
98 #define NVBUFFER_TRANSFORM_CROP_DST NVBUFSURF_TRANSFORM_CROP_DST
99 #define NVBUFFER_TRANSFORM_FLIP NVBUFSURF_TRANSFORM_FLIP
100
101 // Rectangle type for transforms
102 typedef NvBufSurfTransformRect NvBufferRect;
103
104 // ============================================================================
105 // Structure Definitions - Compatibility structures
106 // ============================================================================
107
111 typedef struct {
112 uint32_t width;
113 uint32_t height;
114 NvBufferLayout layout;
115 NvBufferColorFormat colorFormat;
116 NvBufferPayload payloadType;
117 NvBufSurfaceTag nvbuf_tag;
119
123 typedef struct {
124 uint32_t width[NVBUF_MAX_PLANES];
125 uint32_t height[NVBUF_MAX_PLANES];
126 uint32_t pitch[NVBUF_MAX_PLANES];
127 uint32_t offset[NVBUF_MAX_PLANES];
128 uint32_t psize[NVBUF_MAX_PLANES];
129 NvBufferLayout layout[NVBUF_MAX_PLANES];
130 uint32_t num_planes;
132 uint32_t memsize;
133 NvBufferColorFormat pixel_format;
135
139 typedef struct {
140 NvBufferTransform_Flip transform_flip;
141 NvBufferTransform_Filter transform_filter;
142 NvBufferRect src_rect;
143 NvBufferRect dst_rect;
146
147 // ============================================================================
148 // Internal State Management
149 // ============================================================================
150
151 #include <map>
152 #include <mutex>
153
158 public:
160 static NvBufSurfaceManager inst;
161 return inst;
162 }
163
164 void registerSurface(int fd, NvBufSurface* surface) {
165 std::lock_guard<std::mutex> lock(mutex_);
166 fdToSurface_[fd] = surface;
167 }
168
169 NvBufSurface* getSurface(int fd) {
170 std::lock_guard<std::mutex> lock(mutex_);
171 auto it = fdToSurface_.find(fd);
172 if (it != fdToSurface_.end()) {
173 return it->second;
174 }
175 // Try to get surface from FD directly
176 NvBufSurface* surface = nullptr;
177 if (NvBufSurfaceFromFd(fd, (void**)&surface) == 0) {
178 fdToSurface_[fd] = surface;
179 return surface;
180 }
181 return nullptr;
182 }
183
184 void unregisterSurface(int fd) {
185 std::lock_guard<std::mutex> lock(mutex_);
186 fdToSurface_.erase(fd);
187 }
188
189 private:
191 std::map<int, NvBufSurface*> fdToSurface_;
192 std::mutex mutex_;
193 };
194
195 // ============================================================================
196 // Function Implementations - Inline compatibility functions
197 // ============================================================================
198
205 inline int NvBufferCreateEx(int* fd, NvBufferCreateParams* params) {
206 if (!fd || !params) return -1;
207
208 NvBufSurfaceCreateParams createParams = {0};
209 createParams.gpuId = 0;
210 createParams.width = params->width;
211 createParams.height = params->height;
212 createParams.size = 0; // Let the API calculate
213 createParams.isContiguous = true;
214 createParams.colorFormat = params->colorFormat;
215 createParams.layout = params->layout;
216 createParams.memType = params->payloadType;
217
218 NvBufSurface* surface = nullptr;
219 int ret = NvBufSurfaceCreate(&surface, 1, &createParams);
220 if (ret != 0 || surface == nullptr) {
221 return -1;
222 }
223
224 // Extract the DMA buffer FD from the surface
225 *fd = surface->surfaceList[0].bufferDesc;
226
227 // Register the surface for later lookups
229
230 return 0;
231 }
232
238 inline int NvBufferDestroy(int fd) {
239 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
240 if (surface) {
242 return NvBufSurfaceDestroy(surface);
243 }
244 return -1;
245 }
246
255 inline int NvBufferMemMap(int fd, uint32_t plane, NvBufferMemMapFlags memflag, void** ptr) {
256 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
257 if (!surface) return -1;
258
259 // For per-plane FDs, adjust plane index if necessary
260 uint32_t num_planes = surface->surfaceList[0].planeParams.num_planes;
261 uint32_t actual_plane = (plane < num_planes) ? plane : 0;
262
263 int ret = NvBufSurfaceMap(surface, 0, actual_plane, memflag);
264 if (ret != 0) return ret;
265
266 *ptr = surface->surfaceList[0].mappedAddr.addr[actual_plane];
267 return 0;
268 }
269
277 inline int NvBufferMemUnMap(int fd, uint32_t plane, void** ptr) {
278 (void)ptr; // Unused in new API
279 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
280 if (!surface) return -1;
281
282 // For per-plane FDs, adjust plane index if necessary
283 uint32_t num_planes = surface->surfaceList[0].planeParams.num_planes;
284 uint32_t actual_plane = (plane < num_planes) ? plane : 0;
285
286 return NvBufSurfaceUnMap(surface, 0, actual_plane);
287 }
288
301 inline int NvBufferMemSyncForCpu(int fd, uint32_t plane, void** ptr) {
302 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
303 if (!surface) {
304 // Not an NvBufSurface buffer (likely V4L2 mmap buffer)
305 // V4L2 driver typically handles cache coherency for mmap'd buffers
306 // Return success to maintain compatibility
307 return 0;
308 }
309
310 // For per-plane FDs (common in V4L2), each FD may represent a single plane
311 // If the requested plane index exceeds available planes, sync plane 0
312 uint32_t num_planes = surface->surfaceList[0].planeParams.num_planes;
313 uint32_t actual_plane = (plane < num_planes) ? plane : 0;
314
315 return NvBufSurfaceSyncForCpu(surface, 0, actual_plane);
316 }
317
330 inline int NvBufferMemSyncForDevice(int fd, uint32_t plane, void** ptr) {
331 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
332 if (!surface) {
333 // Not an NvBufSurface buffer (likely V4L2 mmap buffer)
334 // V4L2 driver typically handles cache coherency for mmap'd buffers
335 // Return success to maintain compatibility
336 return 0;
337 }
338
339 // For per-plane FDs (common in V4L2), each FD may represent a single plane
340 // If the requested plane index exceeds available planes, sync plane 0
341 uint32_t num_planes = surface->surfaceList[0].planeParams.num_planes;
342 uint32_t actual_plane = (plane < num_planes) ? plane : 0;
343
344 return NvBufSurfaceSyncForDevice(surface, 0, actual_plane);
345 }
346
353 inline int NvBufferGetParams(int fd, NvBufferParams* params) {
354 if (!params) return -1;
355
356 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
357 if (!surface) return -1;
358
359 NvBufSurfaceParams* surfParams = &surface->surfaceList[0];
360
361 memset(params, 0, sizeof(NvBufferParams));
362 params->num_planes = surfParams->planeParams.num_planes;
363 params->pixel_format = surfParams->colorFormat;
364 params->nv_buffer_size = surfParams->dataSize;
365 params->memsize = surfParams->dataSize;
366
367 for (uint32_t i = 0; i < params->num_planes && i < NVBUF_MAX_PLANES; i++) {
368 params->width[i] = surfParams->planeParams.width[i];
369 params->height[i] = surfParams->planeParams.height[i];
370 params->pitch[i] = surfParams->planeParams.pitch[i];
371 params->offset[i] = surfParams->planeParams.offset[i];
372 params->psize[i] = surfParams->planeParams.psize[i];
373 params->layout[i] = surfParams->layout; // Layout is surface-level in new API
374 }
375
376 return 0;
377 }
378
386 inline int NvBufferTransform(int src_fd, int dst_fd, NvBufferTransformParams* params) {
387 NvBufSurface* srcSurface = NvBufSurfaceManager::instance().getSurface(src_fd);
388 NvBufSurface* dstSurface = NvBufSurfaceManager::instance().getSurface(dst_fd);
389
390 if (!srcSurface || !dstSurface || !params) return -1;
391
392 NvBufSurfTransformParams transformParams = {0};
393 transformParams.transform_flag = params->transform_flag;
394 transformParams.transform_flip = params->transform_flip;
395 transformParams.transform_filter = params->transform_filter;
396 transformParams.src_rect = &params->src_rect;
397 transformParams.dst_rect = &params->dst_rect;
398
399 return NvBufSurfTransform(srcSurface, dstSurface, &transformParams);
400 }
401
402 // ============================================================================
403 // EGL Image Functions - JetPack 5.x compatibility
404 // ============================================================================
405
414 inline EGLImageKHR NvEGLImageFromFd(EGLDisplay eglDisplay, int fd) {
415 NvBufSurface* surface = NvBufSurfaceManager::instance().getSurface(fd);
416 if (!surface) {
417 // Try to get surface from FD directly
418 if (NvBufSurfaceFromFd(fd, (void**)&surface) != 0) {
419 return EGL_NO_IMAGE_KHR;
420 }
422 }
423
424 // Map EGL image for the surface
425 if (NvBufSurfaceMapEglImage(surface, 0) != 0) {
426 return EGL_NO_IMAGE_KHR;
427 }
428
429 return surface->surfaceList[0].mappedAddr.eglImage;
430 }
431
441 inline int NvDestroyEGLImage(EGLDisplay eglDisplay, EGLImageKHR eglImage) {
442 (void)eglDisplay; // Not used in new API - display is managed internally
443
444 // Find the surface that owns this EGL image and unmap it
445 // Note: This is a simplified implementation. In practice, we'd need to
446 // track which surface owns which EGL image, but for most use cases,
447 // the surface is destroyed along with the EGL image.
448
449 // For now, we rely on the caller to manage surface lifecycle properly
450 // The EGL image will be cleaned up when the surface is destroyed
451 (void)eglImage;
452 return 0;
453 }
454
455#endif // JetPack version check
456
457#endif // __NVBUF_UTILS_COMPAT_H__
Internal class to manage FD to NvBufSurface mapping.
Definition nvbuf_utils.h:157
NvBufSurface * getSurface(int fd)
Definition nvbuf_utils.h:169
std::mutex mutex_
Definition nvbuf_utils.h:192
static NvBufSurfaceManager & instance()
Definition nvbuf_utils.h:159
NvBufSurfaceManager()=default
std::map< int, NvBufSurface * > fdToSurface_
Definition nvbuf_utils.h:191
void registerSurface(int fd, NvBufSurface *surface)
Definition nvbuf_utils.h:164
void unregisterSurface(int fd)
Definition nvbuf_utils.h:184
Parameters for buffer creation (JetPack 4.x compatible)
Definition nvbuf_utils.h:111
NvBufferPayload payloadType
Definition nvbuf_utils.h:116
NvBufferColorFormat colorFormat
Definition nvbuf_utils.h:115
NvBufferLayout layout
Definition nvbuf_utils.h:114
uint32_t height
Definition nvbuf_utils.h:113
uint32_t width
Definition nvbuf_utils.h:112
NvBufSurfaceTag nvbuf_tag
Definition nvbuf_utils.h:117
Buffer parameters structure (JetPack 4.x compatible)
Definition nvbuf_utils.h:123
uint32_t nv_buffer_size
Definition nvbuf_utils.h:131
NvBufferColorFormat pixel_format
Definition nvbuf_utils.h:133
uint32_t psize[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:128
uint32_t pitch[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:126
uint32_t width[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:124
uint32_t memsize
Definition nvbuf_utils.h:132
uint32_t height[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:125
uint32_t offset[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:127
NvBufferLayout layout[NVBUF_MAX_PLANES]
Definition nvbuf_utils.h:129
uint32_t num_planes
Definition nvbuf_utils.h:130
Transform parameters structure (JetPack 4.x compatible)
Definition nvbuf_utils.h:139
NvBufferTransform_Filter transform_filter
Definition nvbuf_utils.h:141
NvBufferTransform_Flip transform_flip
Definition nvbuf_utils.h:140
uint32_t transform_flag
Definition nvbuf_utils.h:144
NvBufferRect src_rect
Definition nvbuf_utils.h:142
NvBufferRect dst_rect
Definition nvbuf_utils.h:143