/* sff2jpeg - convert sff group 3 fax files to jpeg. Copyright (C) 2002,2003 Matthias Kramm This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "jpeg.h" #define OUTBUFFER_SIZE 0x8000 static FILE*fi; static JOCTET * buffer; static unsigned char*dest; static int len; static int destlen; static unsigned char*data; static int pos; static int size; static void file_init_destination(j_compress_ptr cinfo) { struct jpeg_destination_mgr*dmgr = (struct jpeg_destination_mgr*)(cinfo->dest); buffer = (JOCTET*)malloc(OUTBUFFER_SIZE); if(!buffer) { perror("malloc"); printf("Out of memory!\n"); exit(1); } dmgr->next_output_byte = buffer; dmgr->free_in_buffer = OUTBUFFER_SIZE; } static boolean file_empty_output_buffer(j_compress_ptr cinfo) { struct jpeg_destination_mgr*dmgr = (struct jpeg_destination_mgr*)(cinfo->dest); if(fi) fwrite(buffer, OUTBUFFER_SIZE, 1, fi); dmgr->next_output_byte = buffer; dmgr->free_in_buffer = OUTBUFFER_SIZE; return 1; } static void file_term_destination(j_compress_ptr cinfo) { struct jpeg_destination_mgr*dmgr = (struct jpeg_destination_mgr*)(cinfo->dest); if(fi) fwrite(buffer, OUTBUFFER_SIZE-dmgr->free_in_buffer, 1, fi); free(buffer); buffer = 0; dmgr->free_in_buffer = 0; } static void mem_init_destination(j_compress_ptr cinfo) { struct jpeg_destination_mgr*dmgr = (struct jpeg_destination_mgr*)(cinfo->dest); dmgr->next_output_byte = dest; dmgr->free_in_buffer = destlen; } static boolean mem_empty_output_buffer(j_compress_ptr cinfo) { printf("jpeg mem overflow!\n"); exit(1); } static void mem_term_destination(j_compress_ptr cinfo) { struct jpeg_destination_mgr*dmgr = (struct jpeg_destination_mgr*)(cinfo->dest); len = destlen - dmgr->free_in_buffer; dmgr->free_in_buffer = 0; } int mkjpeg(unsigned char*data, int width, int height, int quality, char*filename) { struct jpeg_destination_mgr mgr; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; int t; if(filename) fi = fopen(filename, "wb"); else fi = 0; memset(&cinfo, 0, sizeof(cinfo)); memset(&jerr, 0, sizeof(jerr)); memset(&mgr, 0, sizeof(mgr)); cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); mgr.init_destination = file_init_destination; mgr.empty_output_buffer = file_empty_output_buffer; mgr.term_destination = file_term_destination; cinfo.dest = &mgr; // init compression cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo,quality,TRUE); //jpeg_write_tables(&cinfo); //jpeg_suppress_tables(&cinfo, TRUE); jpeg_start_compress(&cinfo, FALSE); for(t=0;tsrc; mgr->next_input_byte = data; mgr->bytes_in_buffer = size; //printf("init %d\n", size - mgr->bytes_in_buffer); } boolean mem_fill_input_buffer (j_decompress_ptr cinfo) { struct jpeg_source_mgr* mgr = cinfo->src; printf("fill %d\n", size - mgr->bytes_in_buffer); return 0; } void mem_skip_input_data (j_decompress_ptr cinfo, long num_bytes) { struct jpeg_source_mgr* mgr = cinfo->src; printf("skip %d +%d\n", size - mgr->bytes_in_buffer, num_bytes); if(num_bytes<=0) return; mgr->next_input_byte += num_bytes; mgr->bytes_in_buffer -= num_bytes; } boolean mem_resync_to_restart (j_decompress_ptr cinfo, int desired) { struct jpeg_source_mgr* mgr = cinfo->src; printf("resync %d\n", size - mgr->bytes_in_buffer); mgr->next_input_byte = data; mgr->bytes_in_buffer = size; return 1; } void mem_term_source (j_decompress_ptr cinfo) { struct jpeg_source_mgr* mgr = cinfo->src; //printf("term %d\n", size - mgr->bytes_in_buffer); } int jpeg2pic(unsigned char*_data, int _size, unsigned char*dest, int width, int height) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; struct jpeg_source_mgr mgr; int y,x; data = _data; size = _size; jpeg_create_decompress(&cinfo); mgr.next_input_byte = data; mgr.bytes_in_buffer = size; mgr.init_source =mem_init_source ; mgr.fill_input_buffer =mem_fill_input_buffer ; mgr.skip_input_data =mem_skip_input_data ; mgr.resync_to_restart =mem_resync_to_restart ; mgr.term_source =mem_term_source ; cinfo.err = jpeg_std_error(&jerr); cinfo.src = &mgr; jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); for(y=0;y