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