Jetson'da Zero-Copy GStreamer: NVMM DMA Buffer
NVMM Nedir?
NVMM (NVIDIA Memory Manager), Jetson SoC'un ISP, encoder (NVENC), decoder (NVDEC) ve GPU birimleri arasında veriyi CPU belleğine kopyalamadan iletmesini sağlayan paylaşımlı DMA bellek mekanizmasıdır. NVMM olmadan her nvvidconv çağrısı, GPU DRAM → CPU DRAM → GPU DRAM döngüsü oluşturur.
CPU kopyası olmadan: ~2ms dönüşüm, CPU yükü <%5 CPU kopyasıyla: ~18ms dönüşüm, CPU yükü %30-40
Temel Kural
NVMM pipeline'ı kesintisiz çalışabilmesi için tüm element'lerin memory:NVMM desteklemesi gerekir. Zincirde tek bir CPU-side element bu avantajı yok eder.
NVMM destekli element'ler:
nvarguscamerasrc— ISP çıkışı direkt NVMMnvv4l2decoder— NVDEC çıkışı NVMMnvvidconv— NVMM → NVMM (veya NVMM → CPU)nvv4l2h264enc,nvv4l2h265enc— NVENC, NVMM input alırnvinfer— TensorRT inference, NVMM inputnvdrmvideosink,nveglglessink— NVMM doğrudan display
Pipeline Örnekleri
Doğru: Tam Zero-Copy
gst-launch-1.0 \
nvarguscamerasrc sensor-id=0 ! \
'video/x-raw(memory:NVMM), format=NV12, width=1920, height=1080, framerate=30/1' ! \
nvv4l2h264enc maxperf-enable=true insert-sps-pps=true ! \
rtph264pay config-interval=-1 pt=96 ! \
udpsink host=192.168.1.100 port=5000 sync=false
Yanlış: CPU Kopyası Yaratır
# nvvidconv'dan sonra memory:NVMM eksik — CPU kopyası zorunlu hale gelir
gst-launch-1.0 \
nvarguscamerasrc ! \
nvvidconv ! \
'video/x-raw, format=BGRx' ! \
x264enc ! ...
appsink ile NVMM Buffer Erişimi
OpenCV veya custom ML inference için buffer'a CPU erişimi gerekiyorsa:
#include <nvbufsurface.h>
GstSample *sample = gst_app_sink_pull_sample(GST_APP_SINK(appsink));
GstBuffer *buf = gst_sample_get_buffer(sample);
GstMapInfo map;
gst_buffer_map(buf, &map, GST_MAP_READ);
NvBufSurface *surf = (NvBufSurface *)map.data;
NvBufSurfaceMap(surf, 0, 0, NVBUF_MAP_READ);
// surf->surfaceList[0].mappedAddr.addr[0] — Y plane
// surf->surfaceList[0].mappedAddr.addr[1] — UV plane
NvBufSurfaceSyncForCpu(surf, 0, 0);
// ... işlem ...
NvBufSurfaceUnMap(surf, 0, 0);
gst_buffer_unmap(buf, &map);
gst_sample_unref(sample);
Hata Ayıklama: NVMM Kırılma Noktalarını Bul
# GST_DEBUG ile element kararlarını izle
GST_DEBUG="nvvidconv:5,nvv4l2h264enc:5" gst-launch-1.0 [pipeline]
# "Could not negotiate" mesajı NVMM uyumsuzluğuna işaret eder
# "Allocating new buffer" satırları CPU kopyasının göstergesidir
Sık Yapılan Hatalar
| Hata | Sebep | Çözüm |
|---|---|---|
Could not negotiate |
Caps'te memory:NVMM eksik |
Açık caps ekle |
| Yüksek CPU, düşük GPU | CPU-side element pipeline'da | Element'i NVMM desteklisiyle değiştir |
nvvidconv format hatası |
NV12 yerine BGRx isteniyor | format=NV12 ile kısıtla |
| Yavaş ilk frame | NVMM buffer pool ısınma | nvarguscamerasrc wbmode=0 ile AE kapat |
