DriveWorks SDK Reference
5.10.90 Release
For Test and Development only

Image Streamer

This tutorial demonstrates how to stream an image from host (CPU) memory, to device (CUDA) memory.

The ImageStreamer module is accessed through a handle:

#define DW_NULL_HANDLE
Definition: Types.h:83
struct dwImageStreamerObject * dwImageStreamerHandle_t
Definition: ImageStreamer.h:61

Creating an Image

To create an image for streaming:

// the image is going to be format interleaved RGB and type UINT_8
cpuProp.type = DW_IMAGE_CPU;
cpuProp.width = imageWidth;
cpuProp.height = imageHeight;
cpuProp.format = DW_IMAGE_FORMAT_RGB_UINT8;
cpuProp.memoryLayout = DW_IMAGE_MEMORY_TYPE_DEFAULT; // not necessary to specify if init with {}
//Create an image with these properties
dwImage_create(&rgbCPU, cpuProp, m_context);
dwImageType type
Specifies the type of image.
Definition: Image.h:392
struct dwImageObject * dwImageHandle_t
Definition: Image.h:102
DW_API_PUBLIC dwStatus dwImage_create(dwImageHandle_t *const image, dwImageProperties properties, dwContextHandle_t const ctx)
Creates and allocates resources for a dwImageHandle_t based on the properties passed as input.
@ DW_IMAGE_CPU
Definition: Image.h:91
@ DW_IMAGE_MEMORY_TYPE_DEFAULT
the default memory layout for a given image type, can be either pitch or block
Definition: Image.h:196
@ DW_IMAGE_FORMAT_RGB_UINT8
Not backed by NvSci.
Definition: Image.h:136
Defines the properties of the image.
Definition: Image.h:390

Initializing the ImageStreamer Module

Once an image is creating for streaming, an ImageStreamer must be initialized to stream the CPU image to CUDA.
In the following example, the dwImageStreamerHandle_t handle initializes the ImageCapture module to stream
an image with cpuProp image properties to type dwImageCUDA:

// streamer from CPU to CUDA
dwImageStreamer_initialize(streamerCPU2CUDA, &cpuProp, DW_IMAGE_CUDA, dwContext);
@ DW_IMAGE_CUDA
Definition: Image.h:92
DW_API_PUBLIC dwStatus dwImageStreamer_initialize(dwImageStreamerHandle_t *streamer, const dwImageProperties *from, dwImageType to, dwContextHandle_t ctx)
Creates and initializes the image streamer capable of moving images between different API types.

Streaming the Image

To stream the image:

dwImageStreamer_producerSend(rgbCPU,streamerCPU2CUDA);
dwImageStreamer_consumerReceive(&rgbCUDA,streamerCPU2CUDA);
DW_API_PUBLIC dwStatus dwImageStreamer_consumerReceive(dwImageHandle_t *image, dwTime_t const timeoutUs, dwImageStreamerHandle_t const streamer)
Receive a pointer to a dwImageHandle_t from the streamer, acting as a consumer.
DW_API_PUBLIC dwStatus dwImageStreamer_producerSend(dwImageHandle_t image, dwImageStreamerHandle_t const streamer)
Sends an image through the streamer acting as the producer.

Returning the Images

An image must be returned once streaming to CUDA memory is complete:

dwImageStreamer_consumerReturn(rgbCUDA,streamerCPU2CUDA);
dwImageStreamer_producerReturn(rgbCPU,streamerCPU2CUDA);
DW_API_PUBLIC dwStatus dwImageStreamer_consumerReturn(dwImageHandle_t *image, dwImageStreamerHandle_t const streamer)
Return the received image back to the producer.
DW_API_PUBLIC dwStatus dwImageStreamer_producerReturn(dwImageHandle_t *const image, dwTime_t const timeoutUs, dwImageStreamerHandle_t const streamer)
The producer streamer waits for the image sent to be returned by the consumer.

Releasing the Handle

To release the handle:

dwImageStreamer_release(streamerCPU2CUDA);
DW_API_PUBLIC dwStatus dwImageStreamer_release(dwImageStreamerHandle_t streamer)
Releases the image streamer.

To see a full demonstration of this workflow, please refer to Simple Image Streamer Sample.