⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuv2ppm.c

📁 linux yuv2ppm code
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#define TEST_WIDTH	320#define TEST_HEIGHT	240#define YUV2RGB(y, u, v, r, g, b)\r = y + ((v*1436) >>10);\g = y - ((u*352 + v*731) >> 10);\b = y + ((u*1814) >> 10);\r = r < 0 ? 0 : r;\g = g < 0 ? 0 : g;\b = b < 0 ? 0 : b;\r = r > 255 ? 255 : r;\g = g > 255 ? 255 : g;\b = b > 255 ? 255 : bunsigned short yuv2rgbLUT[64][64][64];void createLUT(){	//&(yuv2rgbLUT[0][0][0]) = (unsigned short *)malloc( 64*64*64*2);//6bit yuv array map to 16bit rgb	{		int yy = 0;		int uu = 0;		int vv = 0;		int y;		int u;		int v;		int r;		int g;		int b;		unsigned short rgb=0;				for( yy = 0; yy < 64 ; yy++ )		{			for( uu = 0; uu < 64 ; uu++ )			{				for( vv = 0; vv < 64 ; vv++ )				{					y = (yy<<2)&0xFC;					u = (uu<<2)&0xFC;					v = (vv<<2)&0xFC;										r = y + (((v-128)*1436) >>10);					g = y - (((u-128)*352 + (v-128)*731) >> 10);					b = y + (((u-128)*1814) >> 10);					r = r < 0 ? 0 : r;					g = g < 0 ? 0 : g;					b = b < 0 ? 0 : b;					r = r > 255 ? 255 : r;					g = g > 255 ? 255 : g;					b = b > 255 ? 255 : b;    				r = r&0xf8;    				g = g&0xfc;    				b = b&0xf8;  					    				rgb = (r | ( (g>>5) & 0x07 )) << 8;    				rgb |=  ((g  << 3)&0xe0 ) | ( b>>3 );					//yuv2rgbLUT[yy][uu][vv] = ((((r | ( (g>>5) & 0x07 )) << 8) | ( (g  << 3)&0xe0 ) | ( b>>3 )) & 0xFFFF);					yuv2rgbLUT[yy][uu][vv] = rgb;					//printf("yuv2rgbLUT[%d][%d][%d]=%x\n",yy,uu,vv,rgb);				}						}							}	} 	//	{//		FILE *fLUT;//		fLUT = fopen("testlut","wb");//		fwrite(&yuv2rgbLUT,1,64*64*64*2,fLUT);//		fclose(fLUT);//	}}void releaseLUT(){//	if(yuv2rgbLUT!=0)//		free(yuv2rgbLUT);//	yuv2rgbLUT=0;}#if 0void yuv2rgb( unsigned char *yuv, unsigned char *rgb ){    int i = ( TEST_WIDTH* TEST_HEIGHT -1 );    int j = ( TEST_WIDTH* TEST_HEIGHT << 1)-1;     int u;    int y0;    int v;    int y1;       unsigned short * p = (unsigned short *)rgb;    while(i > 0 && j > 0)    {    	u = (yuv[j--] >> 2);    	y0 = (yuv[j--] >> 2);    	v = (yuv[j--] >> 2);    	y1 = (yuv[j--] >> 2);			p[i--] = yuv2rgbLUT[y1][u][v];		p[i--] = yuv2rgbLUT[y0][u][v];		    }}#elsevoid yuv2rgb( unsigned char *yuv, unsigned char *rgb ){    int i = ( TEST_WIDTH* TEST_HEIGHT << 1 ) - 1;    int j = ( TEST_WIDTH* TEST_HEIGHT << 1 ) - 1;        int u,y0,v,y1,r,g,b;        while(i>0)    {        u /*y1*/ = ( unsigned char )yuv[i--] - 128;        y0 /*v*/ = ( unsigned char )yuv[i--];        v /*y0*/ = ( unsigned char )yuv[i--] - 128;        y1 /*u*/ = ( unsigned char )yuv[i--];        //    	u = u >> 2;//    	y0 = y0 >> 2;//    	v = v >> 2;//    	y1 = y1 >> 2;            YUV2RGB (y1, u, v, r, g, b);    r = r&0xf8;    g = g&0xfc;    b = b&0xf8;         rgb[j--] =  r | ( (g>>5) & 0x07 );     rgb[j--] = ( (g  << 3)&0xe0 ) | ( b>>3 );    YUV2RGB (y0, u, v, r, g, b);    r = r&0xf8;    g = g&0xfc;    b = b&0xf8;        rgb[j--] =  r | ( (g>>5) & 0x07 );     rgb[j--] = ( (g  << 3)&0xe0 ) | ( b>>3 );    }}#endifintmain                            (int                    argc,                                 char **                argv){	struct timeval tpstart,tpend; float timeuse;     		    int len;    unsigned short yuv[TEST_WIDTH*TEST_HEIGHT];    unsigned short rgb[TEST_WIDTH*TEST_HEIGHT];        FILE *fYUV;    FILE *fPPM;    int w, h;    w=TEST_WIDTH;    h=TEST_HEIGHT;        createLUT();        memset((char *)yuv,sizeof(yuv),0);	sprintf((char *)yuv,"%s%s",argv[1],".ppm");    fYUV=fopen(argv[1], "rb");    fPPM = fopen((char*)yuv,"wb");	        fprintf(fPPM, "P6\n%d %d\n255\n", w, h);           memset((char *)yuv,sizeof(yuv),0);           printf("read %s size %d bytes\n",argv[1],fread(yuv, 2, TEST_WIDTH*TEST_HEIGHT, fYUV)*2);gettimeofday(&tpstart,NULL);         yuv2rgb((unsigned char *)yuv,(unsigned char *)rgb);gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000; printf("yuv2rgb Used Time:%f\n",timeuse);         {        int i;        for (i=0; i<TEST_WIDTH*TEST_HEIGHT; i++)        {            unsigned char r, g, b;        #ifdef BYTESWAP            rgb[i]=((rgb[i] & 0xff00) >> 8) + ((rgb[i] & 0x00ff) << 8);        #endif            r=(rgb[i] & 0xF800) >> 8;            g=(rgb[i] & 0x07E0) >> 3;            b=(rgb[i] & 0x001F) << 3;            //printf("%c%c%c", r, g, b);            fwrite(&r,1,1,fPPM);            fwrite(&g,1,1,fPPM);            fwrite(&b,1,1,fPPM);        }    }        releaseLUT();    if(fYUV)    fclose(fYUV);       if(fPPM)     fclose(fPPM);        //return(0);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -