📄 yuv2ppm.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 + -