n2d_error_t create_n2d_buffer_from_phyaddr_continuous_memory(n2d_buffer_t *n2d_buffer,-
n2d_buffer_format_t format, n2d_uintptr_t phys_addr, int width, int height){-
n2d_error_t error = N2D_SUCCESS;-
n2d_user_memory_desc_t n2d_buffer_mem_desc;-
memset(n2d_buffer, 0, sizeof(n2d_buffer_t));-
n2d_buffer->width = width;-
n2d_buffer->height = height;-
n2d_buffer->format = format; // N2D_NV12 or N2D_UYVY-
n2d_buffer->orientation = N2D_0;-
n2d_buffer->srcType = N2D_SOURCE_DEFAULT;-
n2d_buffer->tiling = N2D_LINEAR;-
n2d_buffer->cacheMode = N2D_CACHE_128;-
n2d_buffer->alignedh = n2d_buffer->height;-
if (format == N2D_NV12) {-
float bpp = gcmALIGN(16, 8) * 1.0f / 8;-
n2d_buffer->alignedw = gcmALIGN(n2d_buffer->width, 64);-
n2d_buffer->stride = gcmALIGN(gcmFLOAT2INT(n2d_buffer->alignedw * bpp), 64);-
n2d_buffer_mem_desc.size = n2d_buffer->stride * n2d_buffer->alignedh * 3 / 2;-
}-
else if (format == N2D_UYVY) {-
float bpp = gcmALIGN(16, 8) * 1.0f / 8;-
n2d_buffer->alignedw = gcmALIGN(n2d_buffer->width, 4);-
n2d_buffer->stride = gcmALIGN(gcmFLOAT2INT(n2d_buffer->alignedw * bpp), 4);-
n2d_buffer_mem_desc.size = n2d_buffer->stride * n2d_buffer->alignedh * 2;-
}-
n2d_uintptr_t n2d_buffer_handle;-
n2d_buffer_mem_desc.flag = N2D_WRAP_FROM_USERMEMORY;-
n2d_buffer_mem_desc.logical = 0; // MUST BE ZERO!!!-
n2d_buffer_mem_desc.physical = phys_addr;-
error = n2d_wrap(&n2d_buffer_mem_desc, &n2d_buffer_handle);-
if (N2D_IS_ERROR(error)){-
return error;-
}-
n2d_buffer->handle = n2d_buffer_handle;-
error = n2d_map(n2d_buffer);-
if (N2D_IS_ERROR(error)){-
return error;-
}-
return N2D_SUCCESS;-
}
n2d_error_t create_n2d_buffer_from_hbm_graphic(n2d_buffer_t *n2d_buffer, hb_mem_graphic_buf_t *hbm_buffer, n2d_buffer_format_t format){ n2d_error_t error = N2D_SUCCESS; error = create_n2d_buffer_from_phyaddr_continuous_memory(n2d_buffer, format, (n2d_uintptr_t)hbm_buffer->phys_addr[0], hbm_buffer->width, hbm_buffer->height); return error; }
gpu_process_2(hbn_vnode_image_t* src_img, cv::Mat& bgr_mat, n2d_buffer_format_t format, n2d_orientation_t orient)-
{-
// 使用gpu对src_img转换至RGB-
n2d_error_t error = N2D_SUCCESS;-
int ret;-
n2d_buffer_t src = {0};-
n2d_buffer_t dst = {0};-
int src_width = src_img->buffer.width;-
int src_height = src_img->buffer.height;-
hb_mem_graphic_buf_t hbn_mem_src;-
memset(&hbn_mem_src, 0, sizeof(hb_mem_graphic_buf_t));-
int64_t flags = HB_MEM_USAGE_CPU_READ_OFTEN | HB_MEM_USAGE_CPU_WRITE_OFTEN-
| HB_MEM_USAGE_CACHED |HB_MEM_USAGE_GRAPHIC_CONTIGUOUS_BUF;-
int32_t hb_mem_format;-
if (format == N2D_NV12) hb_mem_format = MEM_PIX_FMT_NV12;-
else if (format == N2D_UYVY) hb_mem_format = MEM_PIX_FMT_UYVY422;-
ret = hb_mem_alloc_graph_buf(src_width, src_height, hb_mem_format, flags, 0, 0, &hbn_mem_src);-
if(ret != 0){-
printf(“hb_mem_alloc_graph_buf failed :%d\n”, ret);-
goto on_error;-
}-
if (format == N2D_NV12){-
memcpy(hbn_mem_src.virt_addr[0], src_img->buffer.virt_addr[0], src_width * src_height);-
memcpy(hbn_mem_src.virt_addr[0] + src_width * src_height, src_img->buffer.virt_addr[1], src_width * src_height * 0.5);-
}-
else if (format == N2D_UYVY) {-
memcpy(hbn_mem_src.virt_addr[0], src_img->buffer.virt_addr[0], src_width * src_height * 2);-
}-
error = create_n2d_buffer_from_hbm_graphic(&src, &hbn_mem_src, format);-
if (N2D_IS_ERROR(error)){-
printf(“create_n2d_bufffailed! error=%d.\n”, error);-
goto on_free_src_hbm;-
}-
error = n2d_util_allocate_buffer(-
src_width,-
src_height,-
N2D_RGB888,-
N2D_0,-
N2D_LINEAR,-
N2D_TSC_DISABLE,-
&dst);-
dst.orientation = orient;-
if (N2D_IS_ERROR(error))-
{-
printf(“blit error, error=%d.\n”, error);-
goto free_src;-
}-
error = n2d_blit(&dst, N2D_NULL, &src, N2D_NULL, N2D_BLEND_NONE);-
if (N2D_IS_ERROR(error))-
{-
printf(“blit error, error=%d.\n”, error);-
goto free_dst;-
}-
error = n2d_commit();-
if (N2D_IS_ERROR(error))-
{-
printf(“commit error=%d.\n”, error);-
goto free_dst;-
}-
bgr_mat = cv::Mat(dst.height, dst.width, CV_8UC3); // 分配内存-
memcpy(bgr_mat.data, dst.memory, dst.height * dst.width * 3); // 拷贝数据-
free_dst:-
n2d_free(&dst);-
free_src:-
n2d_free(&src);-
on_free_src_hbm:-
hb_mem_free_buf(hbn_mem_src.fd[0]);-
on_error:-
return 0;-
}
我用gpu_process_2函数把采集到的hbn_vnode_image_t的uyuv和nv12图片用gpu转成RGB图像并用opencv显示,发现nv12图像能正常显示,uyuv的会花屏,是什么原因呢??有没有什么gpu的调试手段?-