00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "vil_jpeg_compressor.h"
00014 #include "vil_jpeg_destination_mgr.h"
00015 #include <vil/vil_stream.h>
00016 #include <vcl_iostream.h>
00017
00018 vil_jpeg_compressor::vil_jpeg_compressor(vil_stream *s)
00019 : stream(s)
00020 , ready(false), quality(75)
00021 {
00022 stream->ref();
00023
00024
00025 jobj.err = jpeg_std_error(&jerr);
00026
00027
00028 jobj.next_scanline = 0;
00029
00030
00031 jpeg_create_compress(&jobj);
00032
00033
00034 vil_jpeg_stream_dst_set(&jobj, stream);
00035 }
00036
00037 bool vil_jpeg_compressor::write_scanline(unsigned line, JSAMPLE const *scanline)
00038 {
00039 if (!ready) {
00040
00041 vil_jpeg_stream_dst_rewind(&jobj, stream);
00042
00043
00044 jobj.next_scanline = 0;
00045
00046
00047 switch (jobj.input_components) {
00048 case 1:
00049 jobj.in_color_space = JCS_GRAYSCALE;
00050 break;
00051 case 3:
00052 jobj.in_color_space = JCS_RGB;
00053 break;
00054 default:
00055 vcl_cerr << __FILE__ " : urgh!\n";
00056 return false;
00057 }
00058
00059 jpeg_set_defaults(&jobj);
00060 jpeg_set_quality(&jobj, quality, TRUE);
00061
00062
00063 bool write_all_tables = true;
00064 jpeg_start_compress (&jobj, write_all_tables);
00065
00066
00067 ready = true;
00068 }
00069
00070
00071 if (line != jobj.next_scanline) {
00072 vcl_cerr << "scanlines must be written in order\n";
00073 return false;
00074 }
00075
00076
00077 { JSAMPLE *tmp = const_cast<JSAMPLE*>(scanline);
00078 jpeg_write_scanlines(&jobj, &tmp, 1); }
00079
00080
00081 if (line == jobj.image_height - 1) {
00082 jpeg_finish_compress(&jobj);
00083 ready = false;
00084 }
00085
00086 return true;
00087 }
00088
00089 vil_jpeg_compressor::~vil_jpeg_compressor()
00090 {
00091
00092 if (ready)
00093 jpeg_finish_compress(&jobj);
00094
00095
00096 jpeg_destroy_compress(&jobj);
00097
00098
00099 stream->unref();
00100 stream = 0;
00101 }
00102
00103 void vil_jpeg_compressor::set_quality(int q)
00104 {
00105 quality = q;
00106 }
00107
00108 int vil_jpeg_compressor::get_quality()
00109 {
00110 return quality;
00111 }