最近做TI DM365的solution, 发现出来的画面有抖动,于是就想抓RAW data出来看看是sensor有问题还是encode出了问题,sensor出来的数据是RGB的,通过Previewer后就变成了YUV420SP, 抓了RAW data出来之后用YUVtools一看,整个画面都是灰色的,感觉只有Y值work了,UV都没了,于是又去网上download其他的YUV tools, 结果还是一样,后来发现一般的YUV tools只支持普通的YUV420格式,即YUV420P, 于是去找解析YUV420SP的tool, 发现还不太好找,于是就自己写了一个转换工具,将YUV420SP的转成YUV420P的格式,转了之后用YUV tools 一看,颜色全对了。
下面就是源码:
/*
YYYYYYYYYYYYY YYYYYYYYYYYYY
YYYYYYYYYYYYY --> YYYYYYYYYYYYY
YYYYYYYYYYYYY YYYYYYYYYYYYY
YYYYYYYYYYYYY YYYYYYYYYYYYY
CbCrCbCr CbCbCbCb
CbCrCbCr CrCrCrCr
YYYYYYYY... --> YYYYYYYY...
CbCrCbCr.... --> CbCb..... CrCr......
*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/stat.h>
-
- int main(int argc, char* argv[])
- {
- int i;
- int idx;
- int width;
- int height;
- int pixels;
- int frame_no;
- FILE *inputfp = NULL;
- FILE *outputfp = NULL;
- unsigned char *pBuffer;
- struct stat state;
-
- if (argc != 5)
- {
- fprintf(stderr, "Usage : %s <input file name> \
- <output file name> <width> <height>\n",argv[0]);
- return -1;
- }
-
- width = atoi(argv[3]);
- height = atoi(argv[4]);
-
- if(width <= 0 || height <= 0)
- {
- fprintf(stderr, "parameter error [width = %d, height=%d]\n",width, height);
- return -1;
- }
-
- if (stat(argv[1], &state) < 0)
- {
- fprintf(stderr, "Faile to stat %s\n",argv[1]);
- return -1;
- }
- frame_no = (state.st_size/((width*height/2)*3));
-
- inputfp = fopen(argv[1], "rb");
- if (!inputfp)
- {
- fprintf(stderr, "fopen failed for input file[%s]\n",argv[1]);
- return -1;
- }
-
- outputfp = fopen(argv[2], "wb");
- if (!outputfp)
- {
- fprintf(stderr, "fopen failed for output file[%s]\n",argv[2]);
- return -1;
- }
-
- pixels = width * height;
- pBuffer = (unsigned char *)malloc(pixels);
-
- for (i=0; i<frame_no; i++)
- {
-
- fread (pBuffer, pixels, sizeof(unsigned char), inputfp);
-
-
- fwrite(pBuffer, pixels, sizeof(unsigned char), outputfp);
-
-
- fread (pBuffer, (pixels/2), sizeof(unsigned char), inputfp);
-
-
- for(idx = 0; idx < (pixels/2); idx+=2)
- {
- fwrite((pBuffer + idx), 1, sizeof(unsigned char), outputfp);
- }
-
-
- for(idx = 1; idx < (pixels/2); idx+=2)
- {
- fwrite((pBuffer + idx), 1, sizeof(unsigned char), outputfp);
- }
- }
-
- free(pBuffer);
- fclose(inputfp);
- fclose(outputfp);
- return 0;
- }
(leesphone) |