NXP MCU 技术论坛
直播中

张鹏

7年用户 1172经验值
私信 关注
[问答]

IMX8MQ中有使用VPU进行色彩空间转换和缩放的示例吗?

IMX8MQ中有使用VPU进行色彩空间转换和缩放的示例吗?

回帖(1)

张艳

2024-1-4 16:53:01
可以通过i.MX8M官方提供的VPU示例代码来实现色彩空间转换和缩放,具体步骤如下:

1.下载官方VPU示例代码。

2.打开example_dec_disp.c文件,在start_playback函数中找到如下代码段:

struct buf_request_t
{
    int buf_size;
    int num_buffers;
};

struct buf_request_t request = {0};

switch (g_dec_output_format)
{
    case V4L2_PIX_FMT_YUV420M:
    case V4L2_PIX_FMT_YUYV:
    case V4L2_PIX_FMT_RGB32:
    request.buf_size = VPU_BUFFER_SIZE(1920*1080*4);
    request.num_buffers = MAX_INPUT_BUF_NUM;
    break;
    default:
        break;
}

将V4L2_PIX_FMT_RGB32改为需要的输出格式,例如V4L2_PIX_FMT_BGR24。

3.在start_playback函数中添加以下代码:

struct buf_request_t req_m2m_scale = {0};
int vu_fd;

switch (g_dec_output_format)
{
    case V4L2_PIX_FMT_RGB565:
    case V4L2_PIX_FMT_RGB666:
    case V4L2_PIX_FMT_RGB32:
    vu_fd = imx_vpu_v4l2_open(VIDEO_NODE_VU);
    if (vu_fd < 0)
    {
        printf("Failed to open VPU!n");
        return -1;
    }

    if (imx_vpu_v4l2_ioctl(vu_fd, VIDIOC_REQBUFS, (void *)&req_m2m_scale) < 0)
    {
        printf("Failed to request buffers for M2M scale!n");
        return -1;
    }

    if (imx_vpu_m2m_scale_open(g_dec_output_format, req_m2m_scale.num_buffers, req_m2m_scale.buf_size) < 0)
    {
        printf("Failed to open M2M scale!n");
        return -1;
    }

    break;
    default:
        break;
}

这段代码实现了打开VPU,请求M2M缩放缓冲区,以及打开M2M缩放。

4.在display_buffer函数中,添加以下代码:

struct v4l2_buffer buffer;
int frame_id;
struct v4l2_pix_format m2m_format;

switch (g_dec_output_format)
{
    case V4L2_PIX_FMT_RGB565:
    case V4L2_PIX_FMT_RGB666:
    case V4L2_PIX_FMT_RGB32:
    memset(&m2m_format, 0, sizeof(struct v4l2_pix_format));

    m2m_format.width = g_dec_width;
    m2m_format.height = g_dec_height;
    m2m_format.pixelformat = g_dec_output_format;

    if (imx_vpu_m2m_scale_process(buffer.m.userptr, g_dec_width * g_dec_height * 4, &m2m_format) < 0)
    {
        printf("Failed to process M2M scale!n");
        return -1;
    }

    break;
    default:
        break;
}

这段代码实现了对输出数据进行缩放。

5.编译并运行示例代码即可完成色彩空间转换和缩放。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分