airockchip / librga

Apache License 2.0
291 stars 53 forks source link

src has not fd and address for render #23

Closed lawaarch closed 1 year ago

lawaarch commented 1 year ago

我又来了,我看开发文档,MppBuffer 主要用于描述供硬件使用的内存块, 重要参数:ptr 表示内存块的起始虚拟地址。size 表示内存块的大小。fd 表示内存块的用户态空间文件句柄。 又看RGA示例做法和开发手册: IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size); IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size); 我调用之后程序总是报标题错误,麻烦大佬解答一下。感谢

Cerf-Yu commented 1 year ago
  1. 调用importbuffer_fd获取到rga_buffer_handle后,需要使用wrapbuffer_handle将获取到的rga内存句柄封装到rga_buffer_t中,之后src、dst通道均完成上述操作后,再调用实际的操作接口(imcopy、improcess等)。
  2. 标题日志说明并没有配置可用的fd、虚拟地址、物理地址、rga_buffer_handle,所以拦截报错了。
  3. 另外需要注意有使用rga_buffer_handle的话,所有的输入输出通道都需要使用rga_buffer_handle
lawaarch commented 1 year ago

rga_buffer_t src_img, dst_img; rga_buffer_handle_t src_handle, dst_handle;

memset(&src_img, 0, sizeof(src_img));
memset(&dst_img, 0, sizeof(dst_img));

width = mpp_frame_get_width(decoder->frame);
height = mpp_frame_get_height(decoder->frame);
h_stride = mpp_frame_get_hor_stride(decoder->frame);
v_stride = mpp_frame_get_ver_stride(decoder->frame);
fmt = mpp_frame_get_fmt(decoder->frame);
buffer = mpp_frame_get_buffer(decoder->frame);

RK_U32 buf_size = mpp_frame_get_buf_size(decoder->frame);
printf("w x h: %dx%d h_stride:%d v_stride:%d buf_size:%d\n",
       width, height, h_stride, v_stride, buf_size);

base = (RK_U8 *)mpp_buffer_get_ptr(buffer);
int fd=mpp_buffer_get_fd(buffer);

/*--------------RGA----------------*/
src_handle = importbuffer_fd(fd, buf_size);
dst_handle = importbuffer_virtualaddr(yuv_buff, buf_size);
if (src_handle == 0 || dst_handle == 0) {
    printf("importbuffer failed!\n");
    return -1;
}

src_img = wrapbuffer_handle(src_handle, width, height, fmt);
dst_img = wrapbuffer_handle(dst_handle, width, height, fmt);

ret = imcheck(src_img, dst_img, {}, {});
if (IM_STATUS_NOERROR != ret) 
{
    printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));
    return -1;
}

ret = imcopy(src_img, dst_img);
if (ret == IM_STATUS_SUCCESS) 
{
    printf("%s running success!\n", "rga_copy_demo");
} else 
{
    printf("%s running failed, %s\n", "rga_copy_demo", imStrError((IM_STATUS)ret));
    return -1;
}

主要代码 都是按照例程来的,最大的不同是fd/ptr从MPPbuffer中获取的。

lawaarch commented 1 year ago
  1. 调用importbuffer_fd获取到rga_buffer_handle后,需要使用wrapbuffer_handle将获取到的rga内存句柄封装到rga_buffer_t中,之后src、dst通道均完成上述操作后,再调用实际的操作接口(imcopy、improcess等)。
  2. 标题日志说明并没有配置可用的fd、虚拟地址、物理地址、rga_buffer_handle,所以拦截报错了。
  3. 另外需要注意有使用rga_buffer_handle的话,所有的输入输出通道都需要使用rga_buffer_handle

大佬啊 求回复

Cerf-Yu commented 1 year ago

获取到的fd、size,以及importbuffer_fd后得到的handle都是有值的么?这个流程对应的dmesg日志中是否有其他的报错?

lawaarch commented 1 year ago

获取到的fd、size,以及importbuffer_fd后得到的handle都是有值的么?这个流程对应的dmesg日志中是否有其他的报错?

librga fail to get driver version! Compatibility mode will be enabled.

22 im2d_rga_impl rga_version_below_minimun_range_user_driver(310): The driver may be compatible, but it is best to update the driver to version 1.2.4. You can try to update the SDK or update the /kernel/drivers/video/rockchip/rga3 directory individually. current version: librga 1.9.0, driver . rgaapi version 1.9.0[0]

fd=10,size=4177920,src_handle=-1 547:src has not fd and address for render

dmesg [ 1600.519183] rga2: unknown ioctl cmd! [ 1600.519439] rga2: unknown ioctl cmd! [ 1600.519510] rga2: unknown ioctl cmd!

目前是这个错误

Cerf-Yu commented 1 year ago

看起来你的RGA环境似乎有问题,尝试按照faq文档里的说明更新rga_driver到对应的版本,你当前使用的librga是1.9.0的建议更新到1.2.4以上的multi-rga驱动,此后确认引用的头文件版本也是librga 1.9.0的版本后,再运行问题场景看看。

lawaarch commented 1 year ago

看起来你的RGA环境似乎有问题,尝试按照faq文档里的说明更新rga_driver到对应的版本,你当前使用的librga是1.9.0的建议更新到1.2.4以上的multi-rga驱动,此后确认引用的头文件版本也是librga 1.9.0的版本后,再运行问题场景看看。

大佬,我还有一个问题,将驱动程序源代码,拷贝到哪个路径下继续模块化编译。还是说有更简单的办法。 我说的哪里有不对的望指正。

Cerf-Yu commented 1 year ago

更新包下面readme里面都有写更新路径,正常的RGA驱动都是buildin的需要重新编译kernel,如果要改成ko的形式需要自行修改kernel config。