一、概述
本文指的写YUV文件是将对应的yuv数据逐行拷贝从而得到完整的有效的yuv数据的本地文件
其中:
- Frame结构体:存储宽高、跨距、buf起始地址等信息;
二、应用层
char fileName[64];;
FILE *file = NULL;
int width = Frame->width;
int height = Frame->height;
int pitch = Frame->pitch;
int i = 0;
/*打开文件*/
sprintf(filename, "User_Space_W_%d_H_%d.yuv", width, height);
file = fopen(filename, "w");
if (NULL == file)
{
printf("Open yuv file failed!\n");
}
/*逐行写yuv420数据*/
for (i = 0; i < Frame->height; i++)
{
fwrite((char *)Frame->addr + i * Frame->width * 2, Frame->width * 2, 1, file);
}
fflush(file);
fclose(file);
file = NULL;
三、内核层
char fileName[64];;
FILE *pFile = NULL;
mm_segment_t oldfs;
int width = Frame->width;
int height = Frame->height;
int pitch = Frame->pitch;
int i = 0;
/*打开文件*/
sprintf(filename, "Kernel_Space_W_%d_H_%d.yuv", width, height);
oldfs = get_fs();
//set_fs(get_ds());
set_fs(KERNEL_DS); //内存寻址,需要在内核态中寻址
pFile = filp_open(filename, O_CREAT|O_WRONLY|O_TRUNC, 0);
if (IS_ERR(pFile))
{
printk("Open yuv file failed\n");
}
set_fs(KERNEL_DS);
/*逐行写yuv420数据*/
for (i = 0; i < Frame->height; i++)
{
pFile->f_op->write((char *)Frame->addr + i * Frame->width * 2, Frame->width * 2, &pFile->f_pos);
}
set_fs(old_fs);
filp_close(pFile, NULL);