|
使用RGA硬件处理图像后导致v4l2缓冲区内的buf数据被改变
程序流程:
首先使用V4l2获取USB摄像头的MJPEG数据流,然后把获取到的数据Buf传入到RKMPP进行硬件解码,输出格式为YUV格式,最后通过RGA进行一个颜色转换,输出格式为RGB888的格式,最后通过Qt框架显示到Qt界面中
问题:
我的程序中有个拍照的功能,拍照获取的数据帧是在拿到V4l2获取到的MJPEG数据和RKMPP解码前,然后保存为jpg格式。
在保存为jpg图像后发现一个问题,如果把使用RGA颜色转换这个步骤注释掉不使用这个功能,拍出来的照片大概是1M左右,如果我使用了RGA进行颜色转换,保存的图像大小大概是几百kb,这很明显是图像数据丢失了一部分。我很不理解为什么RGA处理的流程在拍照后面,也会影响前面的数据帧...
使用硬件:TB-RK3588SD
rootfs: buildroot
rkmpp版本:mpp version: 05b80939 author: Yandong Lin 2024-09-11(这个mpp是我直接从rockchip-rkmpp的github上面拉下来的...版本估计就是最新)
rga版本:rga_api version 1.10.1_[0]
kernel:5.10.66
以下是RGA硬件颜色空间转换的代码
- if (task)
- {
- mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &frame);
- MppBuffer buffer = NULL;
- if (frame)
- {
- RK_U32 width = 0;
- RK_U32 height = 0;
- char *base = NULL;
- width = mpp_frame_get_width(frame);
- height = mpp_frame_get_height(frame);
- buffer = mpp_frame_get_buffer(frame);
- base = (char*)mpp_buffer_get_ptr(buffer);
- int src_format;
- int dst_format;
- char *dst_buf;
- int src_buf_size, dst_buf_size;
- 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));
- int src_width = MPP_ALIGN(width,16);
- int src_height = MPP_ALIGN(height,16);
- src_format = RK_FORMAT_YCbCr_420_SP;
- int dst_width = 640;
- int dst_height = 480;
- dst_format = RK_FORMAT_RGB_888;
- src_buf_size = src_width * src_height * get_bpp_from_format(src_format);
- dst_buf_size = dst_width * dst_height * get_bpp_from_format(dst_format);
- dst_buf = (char *)malloc(dst_buf_size);
- src_handle = importbuffer_virtualaddr(base, src_buf_size);
- dst_handle = importbuffer_virtualaddr(dst_buf, dst_buf_size);
- if (src_handle == 0 || dst_handle == 0) {
- printf("importbuffer failed!\n");
- }
- src_img = wrapbuffer_handle(src_handle, src_width, src_height, src_format);
- dst_img = wrapbuffer_handle(dst_handle, dst_width, dst_height, dst_format);
- ret = imcheck(src_img, dst_img, {}, {});
- if (IM_STATUS_NOERROR != ret) {
- printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));
- return;
- }
- ret = imcvtcolor(src_img, dst_img,RK_FORMAT_YCbCr_420_SP,RK_FORMAT_RGB_888);
下面两张图象就是未使用RGA颜色转换和使用了RGA颜色转换后的图像大小区别,一个900多kb,一个只是它的一半
希望能得到官方的回复,谢谢
|
|