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

本文详细介绍了如何在应用层和内核层分别实现YUV数据的写入到本地文件的过程。在应用层,通过打开文件、逐行写入YUV420数据并关闭文件来完成。而在内核层,利用内核态的寻址方式,通过filp_open、write及filp_close函数进行文件操作。
摘要由CSDN通过智能技术生成

一、概述

本文指的写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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值