void yuv420p_to_ppm(FILE * fpin, FILE * fpout, unsigned char *buff_image) { uint32_t pixel32; unsigned char *buffer, *src, *buffout; int depth = 24; int y=0, u=0, v=0; size_t i=0; int k=0; rgb_map_t rgb_map = { 0, 1, 2 }; //rewind(fpout); struct timeval tvstart; struct timeval tvfinish; unsigned char *pixels; char *header = (char *) malloc(strlen("P6\n%d %d 255\n") + 1); gettimeofday(&tvstart, NULL); buffer = (unsigned char *) malloc((g_win.width * g_win.height * depth)); //buffout = (unsigned char *) malloc((g_win.width * g_win.height * depth)); //buffout[0] = '\0'; // This should go into another function i = 0; size_t bytesread; read(g_fdin, buffer, g_win.width * g_win.height * depth); gettimeofday(&tvfinish, NULL); fprintf(stderr, "capture in:%ld ms\n", (tvfinish.tv_usec - tvstart.tv_usec)/1000); src = buffer; //sprintf(header, "P6\n%d %d 255\n", g_win.width, g_win.height); //memcpy(buffout, header, strlen(header)); //k = strlen(header); k =0; for (i = 0; i < g_win.width * g_win.height; i++) { if(i == 0) { src = buffer + (g_win.width*g_win.height); } y = buffer[i]; u = src[(i/2)%(g_win.width/2)]; v = src[(g_win.width*g_win.height)/4 + (i/2)%(g_win.width/2)]; if(i && (i%(g_win.width*4)) == 0) { src += g_win.width; } pixel32 = yuv2rgb(y, u, v); pixels = (unsigned char *)&pixel32; //buffout[++k] = pixels[rgb_map.r]; //buffout[++k] = pixels[rgb_map.g]; //buffout[++k] = pixels[rgb_map.b]; buff_image[++k] = pixels[rgb_map.r]; buff_image[++k] = pixels[rgb_map.g]; buff_image[++k] = pixels[rgb_map.b]; } //memcpy(buff_image, buffout, k); //fwrite (buffout , k,1 , fpout ); //fprintf(fpout, "%s", buffout); //free(header); //free(buffout); free(buffer); //rewind(fpout); gettimeofday(&tvfinish, NULL); fprintf(stderr, "image conversion in:%ld ms\n", (tvfinish.tv_usec - tvstart.tv_usec)/1000); }