3588使用瑞芯微librga.so库进行格式转换YUYV到NV12的C语言示例代码
时间: 2024-04-01 14:35:08 浏览: 199
C++下纯代码NV12转换YUV420和YUV444内附实例,可以直接运行
以下是使用瑞芯微librga.so库进行格式转换YUYV到NV12的C语言示例代码:
```c
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <rga/RgaApi.h>
#define WIDTH 640
#define HEIGHT 480
int main()
{
int fd = open("/dev/fb0", O_RDWR);
if (fd < 0) {
perror("open");
return -1;
}
void *fb = mmap(NULL, WIDTH * HEIGHT * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fb == MAP_FAILED) {
perror("mmap");
return -1;
}
RgaSURF_FORMAT src_fmt = RK_FORMAT_YCbCr_422_SP;
RgaSURF_FORMAT dst_fmt = RK_FORMAT_YCbCr_420_SP;
RgaBuffer src_buf, dst_buf;
src_buf.virAddr = (unsigned char *)fb;
src_buf.phyAddr = 0;
src_buf.width = WIDTH;
src_buf.height = HEIGHT;
src_buf.format = src_fmt;
src_buf.stride = WIDTH * 2;
dst_buf.virAddr = malloc(WIDTH * HEIGHT * 3 / 2);
dst_buf.phyAddr = 0;
dst_buf.width = WIDTH;
dst_buf.height = HEIGHT;
dst_buf.format = dst_fmt;
dst_buf.stride = WIDTH;
RgaContext ctx;
RgaInit(&ctx);
RgaSetSrcBuffer(&ctx, &src_buf, NULL);
RgaSetDstBuffer(&ctx, &dst_buf, NULL);
RgaSetSrcFormat(&ctx, src_fmt);
RgaSetDstFormat(&ctx, dst_fmt);
RgaSetSrcCrop(&ctx, 0, 0, WIDTH, HEIGHT);
RgaSetDstCrop(&ctx, 0, 0, WIDTH, HEIGHT);
RgaSetRotation(&ctx, 0);
RgaExecute(&ctx);
memcpy(fb, dst_buf.virAddr, WIDTH * HEIGHT * 3 / 2);
munmap(fb, WIDTH * HEIGHT * 2);
close(fd);
RgaDeInit(&ctx);
free(dst_buf.virAddr);
return 0;
}
```
以上代码使用瑞芯微librga.so库,将/dev/fb0上的YUYV格式的视频数据转换为NV12格式,然后将转换后的数据复制回/dev/fb0。代码中使用RgaApi.h中的函数来进行格式转换,具体步骤包括初始化RGA、设置输入输出缓冲区、设置格式和裁剪、执行转换等。需要注意的是,代码中使用了/dev/fb0作为输入缓冲区,如果您的输入数据来源不同,需要相应地修改代码。
阅读全文