Yuv422p 转Yuy2

planar的YUV格式转packed的YUV格式

其他的YUV间格式转换,可以根据原理实现。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <io.h>


/*
Yuv422p 转换Yuy2,
pYuv422p     : Yuv422p 数据缓冲区
nYuv422pSize   Yuv422p 数据长度
ppYuy2    :Yuy2数据输出缓冲区
nYuy2Size :nYuy2Size 缓冲区大小
返回值:Yuy2数据长度
*/
int Yuv422pToYuy2(char* pYuv422p, int nYuv422pSize,char** ppYuy2,int* pYuy2Size ){

	if(NULL == pYuv422p || 0 == nYuv422pSize || NULL ==ppYuy2 || NULL==pYuy2Size){
		// 参数错误
		return -1;
	}
	int nYuy2Lenght = 0;
	if(*pYuy2Size < nYuv422pSize)
	{
		if(NULL != *ppYuy2){
			free(*ppYuy2);
			*ppYuy2 = NULL;
		}
		*ppYuy2 = (char*)malloc(nYuv422pSize);
		*pYuy2Size = nYuv422pSize;
		nYuy2Lenght = nYuv422pSize;
	}else{
		nYuy2Lenght = nYuv422pSize;
	}

	char* pYyuv422p = pYuv422p; // Y begin 
	char* pUyuv422p = pYuv422p+ nYuv422pSize/2;  // U begin
	char* pVyuv422p = pYuv422p+ nYuv422pSize/4*(2+1); // V begin   4:2:2 = v 即2:1:1 在3/4处
	char* pYuy2 = *ppYuy2; // out data

	for(int i=0; i<nYuv422pSize/4; i++){
		// Y
		pYuy2[i*4]   = pYyuv422p[i*2];
		// U
		pYuy2[i*4+1] = pUyuv422p[i];
		// Y
		pYuy2[i*4+2] = pYyuv422p[i*2+1]; 
		// V
		pYuy2[i*4+3] = pVyuv422p[i];
	}
	return nYuy2Lenght;
}

int GetFileSize(char* pFilePathName)
{
	int iresult;
	struct _stat buf;
	iresult = _stat(pFilePathName,&buf);
	if(iresult == 0)
	{
		return buf.st_size;
	}
	return 0;
}

// 


int main (int argc ,char* argv[] ){

	int yuvLen = GetFileSize("picture640.yuv");
	char* pYuv422p= (char*) malloc (yuvLen);

	FILE* pfRead = fopen("picture640.yuv","rb");

	fread(pYuv422p,yuvLen,1,pfRead);
	fclose(pfRead);
	pfRead = NULL;

	char* m_pYuy2 = NULL;
	int   m_nYuy2Size = 0;

	int nYuy2Len  = Yuv422pToYuy2(pYuv422p,yuvLen,&m_pYuy2,&m_nYuy2Size );

	
	FILE* pfWrite = fopen("picture640-yuy2.yuv","wb");
	fwrite(m_pYuy2,yuvLen,1,pfWrite);
	fclose(pfWrite);

	if(NULL != m_pYuy2){
		free(m_pYuy2);
		m_pYuy2=NULL;
	}
	if(NULL != pYuv422p){
		free(pYuv422p);
		pYuv422p = NULL;
	} 

	return 0;
}

测试软件pYUV.exe


参考文献 http://www.cnblogs.com/samaritan/p/YUV.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值