0
点赞
收藏
分享

微信扫一扫

二、如何将YUV数据写成文件

诗尚凝寒 2022-04-25 阅读 115

一、概述

本文指的写YUV文件是将对应的yuv数据逐行拷贝从而得到完整的有效的yuv数据的本地文件
其中:

  1. 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);
举报

相关推荐

0 条评论