I am trying to use the NvBufferTransform function to copy data from a source buffer to a destination buffer. Below is a small example of how I’m using it. At the end of the program I print the value of the first byte of memory in each buffer. I expect them to both be 10, but only the source buffer is 10 while the destination buffer is 0, so it seems like the data wasn’t copied. Am I using the NvBufferTransform function incorrectly?
Also, I am using a Xavier NX running R32.6.1.
#include <Argus/Argus.h>
#include <EGLStream/EGLStream.h>
#include <EGLStream/NV/ImageNativeBuffer.h>
#include <nvbuf_utils.h>
#include <NvEglRenderer.h>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <fstream>
#include <iostream>
int main(){
int ret = 0;
void* pdata1 = NULL;
void* pdata2 = NULL;
int width = 1000;
int height = 800;
// create two buffers
NvBufferCreateParams input_params = {0};
input_params.payloadType = NvBufferPayload_SurfArray;
input_params.width = width;
input_params.height = height;
input_params.layout = NvBufferLayout_Pitch;
input_params.colorFormat = NvBufferColorFormat_ABGR32;
input_params.nvbuf_tag = NvBufferTag_NONE;
int dmabuf_fd1, dmabuf_fd2;
ret = NvBufferCreateEx(&dmabuf_fd1, &input_params);
if(ret)
std::cout << "Failed to create NvBuffer" << std::endl;;
ret = NvBufferCreateEx(&dmabuf_fd2, &input_params);
if(ret)
std::cout << "Failed to create NvBuffer" << std::endl;
// get buffer params
NvBufferParams params1;
ret = NvBufferGetParams(dmabuf_fd1, ¶ms1);
if(ret)
std::cout << "NvBufferGetParams failed " << std::endl;
NvBufferParams params2;
ret = NvBufferGetParams(dmabuf_fd2, ¶ms2);
if(ret)
std::cout << "NvBufferGetParams failed " << ret << std::endl;
// initialize transform params
NvBufferRect rect;
rect.top = 0;
rect.left = 0;
rect.width = width;
rect.height = height;
NvBufferRect rect2;
rect2.top = 0;
rect2.left = 0;
rect2.width = width;
rect2.height = height;
NvBufferTransformParams transform_params{0};
transform_params.transform_flag = NVBUFFER_TRANSFORM_FLIP;
transform_params.transform_flip = NvBufferTransform_None;
transform_params.transform_filter = NvBufferTransform_Filter_Nearest;
transform_params.src_rect = rect;
transform_params.dst_rect = rect2;
// memmap and sync the buffers
ret = NvBufferMemMap(dmabuf_fd1, 0, NvBufferMem_Read_Write, &pdata1);
if(ret)
std::cout << "NvBufferMemMap failed" << std::endl;
ret = NvBufferMemSyncForCpu(dmabuf_fd1, 0, &pdata1);
if(ret)
std::cout << "NvBufferMemSyncForCpu failed" << std::endl;
ret = NvBufferMemMap(dmabuf_fd2, 0, NvBufferMem_Read_Write, &pdata2);
if(ret)
std::cout << "NvBufferMemMap failed" << std::endl;
ret = NvBufferMemSyncForCpu(dmabuf_fd2, 0, &pdata2);
if(ret)
std::cout << "NvBufferMemSyncForCpu failed" << std::endl;
// set the value of the first byte of buffer 1
std::memset(pdata1, 10, 1);
// transform
ret = NvBufferTransform(dmabuf_fd1, dmabuf_fd2, &transform_params);
if(ret)
std::cout << "NvBufferTransform failed" << std::endl;
// print the original value and the copied value
std::cout << "pdata1[0] = " << (int)(((uint8_t*)pdata1)[0]) << std::endl;
std::cout << "pdata2[0] = " << (int)(((uint8_t*)pdata2)[0]) << std::endl;
}