Navigation
Home
gpl
danovitschwebcam
1.2
compress.c








































compress.c
   
   #include <stdio.h>
   #include <unistd.h>
   #include <signal.h>
   #include <jpeglib.h>
   
   #include "compress.h"
   #include "capture.h"
   #include "webcam.h"
   
   
   
   char				*JPEGBuffer = NULL;
   int				JPEGSize = 0;
   int				BufSize;
   struct timeval			JPEGTime;
   
   struct jpeg_compress_struct	Compress;
   struct jpeg_error_mgr		Err;
   struct jpeg_destination_mgr	Dest;
   
   #define BlockSize		1024
   
   
   
   
   
   
   void Compress_InitDest(j_compress_ptr Info)
   {
   	printf("Compress got init...\n");
   	
   	if (JPEGBuffer!=NULL)
   		free(JPEGBuffer);
   	
   	JPEGBuffer=(char *)malloc(BlockSize);
   	BufSize=BlockSize;
   
   	if (JPEGBuffer==NULL)
   		ExitFatal("JPEGBuffer could not be allocated!");
   	
   	Dest.next_output_byte=JPEGBuffer;
   	Dest.free_in_buffer=BlockSize;
   }
   
   
   
   boolean Compress_EmptyOutput(j_compress_ptr Info)
   {
   	JPEGBuffer=(char *)realloc(JPEGBuffer,BufSize+BlockSize);
   	
   	if (JPEGBuffer==NULL)
   		ExitFatal("JPEGBuffer could not be reallocated!");
   	
   	Dest.next_output_byte=JPEGBuffer+BufSize;
   	Dest.free_in_buffer=BlockSize;
   	BufSize+=BlockSize;
   	
   	return TRUE;
   }
   
   
   
   void Compress_DestTerm(j_compress_ptr Info)
   {
   	JPEGSize=BufSize-Dest.free_in_buffer;
   	
   	printf("Compress_DestTerm...\n");
   }
   
   
   
   void Compress_Init(void)
   {
   	///Init compress structures
   	//
   	Compress.err=jpeg_std_error(&Err);
   	jpeg_create_compress(&Compress);
   	
   	Compress.image_width=ImageWidth;
   	Compress.image_height=ImageHeight;
   	Compress.input_components=3;
   	Compress.in_color_space=JCS_RGB;
   
   	jpeg_set_defaults(&Compress);
   	
   	///Init destination handler
   	//
   	Dest.init_destination=&Compress_InitDest;
   	Dest.empty_output_buffer=&Compress_EmptyOutput;
   	Dest.term_destination=&Compress_DestTerm;
   	
   	Compress.dest=&Dest;
   }
   
   
   
   void Compress_CreateJPEG(void)
   {
   	int		X,Y;
   	unsigned char	*FramePtr;
   	
   	unsigned char	Pixel[ImageWidth][3];
   	JSAMPROW	Row[1];
   	
   	
   	Row[0]=&Pixel[0][0];
   	
   	jpeg_start_compress(&Compress,TRUE);
   
   	for (Y=0; Y<ImageHeight; Y++)
   	{
   		FramePtr=(unsigned char *)(FrameBuffer+Y*ImageWidth*4);
   	
   		for (X=0; X<ImageWidth; X++)
   		{
   			Pixel[X][2]=*FramePtr++;
   			Pixel[X][1]=*FramePtr++;
   			Pixel[X][0]=*FramePtr++;
   			FramePtr++;
   		}
   		
   		jpeg_write_scanlines(&Compress,Row,1);
   	}
   	
   	jpeg_finish_compress(&Compress);
   }
   
   
   
   void Compress_Shutdown(void)
   {
   	jpeg_destroy_compress(&Compress);
   }
   
   
   
   

syntax highlighted by Code2HTML, v. 0.9.1


Email me with questions/comments : Daan <Danovitsch @ Vitsch . net>