Public feed #533176

Miscellany

public text v1 · immutable
Raw Edit
·published 2007-06-03 11:21 UTC
rendered paste body


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);
	
}