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


