Yuv422p 转Yuy2

来源:互联网 发布:苹果mac没有声音 音频 编辑:程序博客网 时间:2024/06/10 18:16

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 beginchar* pVyuv422p = pYuv422p+ nYuv422pSize/4*(2+1); // V begin   4:2:2 = v 即2:1:1 在3/4处char* pYuy2 = *ppYuy2; // out datafor(int i=0; i<nYuv422pSize/4; i++){// YpYuy2[i*4]   = pYyuv422p[i*2];// UpYuy2[i*4+1] = pUyuv422p[i];// YpYuy2[i*4+2] = pYyuv422p[i*2+1]; // VpYuy2[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

原创粉丝点击