/* * * compress.c - part of Danovitsch Webcam * * Copyright (C) 2001, 2003 by Daan Vreeken * * Published under the terms of the GNU Public License 2.0 * (or any later version) * */ #include #include #include #include #include "compress.h" #include "capture.h" #include "webcam.h" int JPEGQuality; 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); jpeg_set_quality(&Compress,JPEGQuality,TRUE); ///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