Hi,
It make me confused,because all sample do not create NvBuffer before NvBufferGetParams .I have called the NvBufferCreate when initialization
initDma() {
m_pNvbuff = new nv_buffer[V4L2_BUFFER_LENGHT];
NvBufferCreateParams input_params = {0};
input_params.payloadType = NvBufferPayload_SurfArray;
input_params.width = m_dwWidth;
input_params.height = m_dwHeight;
input_params.layout = NvBufferLayout_Pitch;
/* Create buffer and provide it with camera */
for (unsigned int index = 0; index < V4L2_BUFFER_LENGHT; index++) {
int fd;
// NvBufferParams params = {0};
input_params.colorFormat = get_nvbuff_color_fmt(V4L2_VIDEO_FORMAT);
input_params.nvbuf_tag = NvBufferTag_CAMERA;
if (-1 == NvBufferCreateEx(&fd, &input_params)) {
LIBCAMERA_ERROR(
"NvBufferCreateEx failed,devname=%s,errno: %d, %s\n",
m_strDevName.c_str(), errno, strerror(errno));
return false;
}
m_pNvbuff[index].dmabuff_fd = fd;
if (-1 == NvBufferMemMap(m_pNvbuff[index].dmabuff_fd, 0,
NvBufferMem_Read_Write,
(void **)&m_pNvbuff[index].start)) {
LIBCAMERA_ERROR("NvBufferMemMap failed,devname=%s,errno: %d, %s\n",
m_strDevName.c_str(), errno, strerror(errno));
return false;
}
}
bool bRet = true;
struct v4l2_requestbuffers req;
memset(&req, 0, sizeof(struct v4l2_requestbuffers));
req.count =V4L2_BUFFER_LENGHT;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_DMABUF;
if (-1 == xioctl(m_videoFd, VIDIOC_REQBUFS, &req)) {
LIBCAMERA_ERROR(
"xioctl VIDIOC_REQBUFS failed,devname=%s,errno: %d, %s\n",
m_strDevName.c_str(), errno, strerror(errno));
return false;
}
for (unsigned int index = 0; index < V4L2_BUFFER_LENGHT; index++) {
struct v4l2_buffer buf;
/* Query camera v4l2 buf length */
memset(&buf, 0, sizeof buf);
buf.index = index;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_DMABUF;
if (ioctl(m_videoFd, VIDIOC_QUERYBUF, &buf) < 0) {
bRet = false;
LIBCAMERA_ERROR(
"xioctl VIDIOC_QUERYBUF failed,devname=%s,errno: %d, %s\n",
m_strDevName.c_str(), errno, strerror(errno));
break;
}
buf.m.fd = (unsigned long)m_pNvbuff[index].dmabuff_fd;
if (buf.length != m_pNvbuff[index].size) {
// LIBCAMERA_ERROR("Camera v4l2 buf length is not
// expected,devname=%s,errno: %d, %s\n", m_strDevName.c_str(),
// errno, strerror(errno));
m_pNvbuff[index].size = buf.length;
}
}
if (bRet == false) {
if (m_pNvbuff != NULL) {
for (unsigned i = 0; i < V4L2_BUFFER_LENGHT; i++) {
if (m_pNvbuff[i].dmabuff_fd) {
NvBufferDestroy(m_pNvbuff[i].dmabuff_fd);
}
}
delete[] m_pNvbuff;
m_pNvbuff = NULL;
}
}
return bRet;
}
and capture the camera with
case IO_METHOD_DMA:
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_DMABUF;
if (-1 == xioctl(m_videoFd, VIDIOC_DQBUF, &buf)) {
bRet = false;
LIBCAMERA_ERROR(
"xioctl VIDIOC_DQBUF failed,dev=%s,error:%d:%s\n",
m_strDevName.c_str(), errno, strerror(errno));
return -1;
}
NvBufferMemSyncForDevice(m_pNvbuff[buf.index].dmabuff_fd, 0,
(void **)&m_pNvbuff[buf.index].start);
srcData = m_pNvbuff[buf.index].start;
srcDatalen = m_pNvbuff[buf.index].size;
break;