46 JP2Encoder::JP2Encoder(
const QString &jp2file,
const unsigned int nsamps,
47 const unsigned int nlines,
const unsigned int nbands,
52 p_sampleDimension = nsamps;
53 p_lineDimension = nlines;
54 p_bandDimension = nbands;
56 if(p_sampleDimension == 0 || p_lineDimension == 0 || p_bandDimension == 0) {
57 string msg =
"Invalid sample/line/band dimensions specified for output file";
61 if(type == Isis::SignedWord) {
66 else if(type == Isis::UnsignedWord) {
71 else if(type == Isis::UnsignedByte) {
77 string msg =
"Invalid pixel type specified for output file";
84 p_resolutionLevels = 1;
86 (p_sampleDimension > p_lineDimension) ? p_lineDimension : p_sampleDimension;
87 while(mindim > 64 && p_resolutionLevels < 32) {
93 p_precinctSize.resize(p_resolutionLevels, 256);
99 p_progressionOrder =
"PCRL";
100 p_codeBlockSize = 64;
101 p_tileSizeWidth = p_sampleDimension;
102 p_tileSizeHeight = p_lineDimension;
106 kdu_customize_errors(Kakadu_Error);
108 std::string msg =
"JPEG2000 has not been enabled with this build of ISIS3";
118 void JP2Encoder::OpenFile() {
121 JP2_Stream =
new jp2_family_tgt();
122 JP2_Stream->open(p_jp2File.toLatin1().data());
125 JP2_Boxes =
new jp2_target();
126 JP2_Boxes->open(JP2_Stream);
136 siz_params *codestream_parameters =
new siz_params();
137 codestream_parameters->set(Sdims, 0, 0, (
int)p_lineDimension);
138 codestream_parameters->set(Sdims, 0, 1, (
int)p_sampleDimension);
139 codestream_parameters->set(Sprecision, 0, 0, (
int)p_pixelBits);
140 codestream_parameters->set(Stiles, 0, 0, (
int)p_tileSizeHeight);
141 codestream_parameters->set(Stiles, 0, 1, (
int)p_tileSizeWidth);
142 codestream_parameters->set(Ssigned, 0, 0, p_signedData);
143 codestream_parameters->set(Scomponents, 0, 0, (
int)p_bandDimension);
144 ostringstream levels;
145 levels <<
"Clevels=" << (p_resolutionLevels - 1);
146 codestream_parameters->parse_string(levels.str().c_str());
147 codestream_parameters->parse_string(
"Creversible=yes");
148 string progression =
"Corder=" + p_progressionOrder;
149 codestream_parameters->parse_string(progression.c_str());
160 int p_flushLines = 0;
161 long long line_bytes = (
long long)p_sampleDimension * p_pixelBytes;
162 if(INCREMENTAL_FLUSH_BYTES < (p_lineDimension * line_bytes)) {
163 p_flushLines = p_tileSizeHeight;
164 while((p_flushLines * line_bytes) > INCREMENTAL_FLUSH_BYTES) {
165 p_flushLines -= 1024;
166 if(p_flushLines < 0) p_flushLines = 0;
170 TLM_segments = (int)(((
double)p_tileSizeHeight / (double)p_flushLines) + 0.5);
171 if(!TLM_segments) TLM_segments = 1;
177 ostringstream segments;
178 segments <<
"ORGgen_tlm=" << TLM_segments;
179 codestream_parameters->parse_string(segments.str().c_str());
182 codestream_parameters->parse_string(
"ORGgen_plt=yes");
185 codestream_parameters->finalize_all();
188 JPEG2000_Codestream =
new kdu_codestream();
189 JPEG2000_Codestream->create(codestream_parameters, JP2_Boxes);
194 codestream_parameters = JPEG2000_Codestream->access_siz();
195 codestream_parameters->parse_string(levels.str().c_str());
196 codestream_parameters->parse_string(
"Creversible=yes");
197 codestream_parameters->parse_string(progression.c_str());
198 codestream_parameters->parse_string(segments.str().c_str());
199 codestream_parameters->parse_string(
"ORGgen_plt=yes");
204 sizes <<
"Cprecincts=";
205 for(
unsigned int i = 0; i < p_precinctSize.size(); i++) {
206 if(i != 0) sizes <<
",";
207 sizes <<
"{" << p_precinctSize[i] <<
"," << p_precinctSize[i] <<
"}";
209 codestream_parameters->parse_string(sizes.str().c_str());
214 size <<
"Cblk={" << p_codeBlockSize <<
"," << p_codeBlockSize <<
"}";
215 codestream_parameters->parse_string(size.str().c_str());
217 codestream_parameters->finalize_all();
220 jp2_dimensions dimensions = JP2_Boxes->access_dimensions();
221 dimensions.init(codestream_parameters);
222 dimensions.finalize_compatibility(codestream_parameters);
225 jp2_colour colour = JP2_Boxes->access_colour();
226 colour.init((p_bandDimension >= 3) ? JP2_sRGB_SPACE : JP2_sLUM_SPACE);
229 JP2_Boxes->write_header();
233 JP2_Boxes->open_codestream();
237 kdu_params *COD = JPEG2000_Codestream->access_siz()->access_cluster(COD_params);
238 if(!(COD->get(Clayers, 0, 0, layers) && (layers > 0)))
239 COD->set(Clayers, 0, 0, layers = 1);
240 kdu_long *layer_sizes =
new kdu_long[layers];
241 memset(layer_sizes, 0,
sizeof(kdu_long)*layers);
244 p_compressor.start(*JPEG2000_Codestream, layers, layer_sizes, NULL, 0,
false,
248 p_stripeHeights =
new int[p_bandDimension];
249 p_maxStripeHeights =
new int[p_bandDimension];
250 p_precisions =
new int[p_bandDimension];
251 p_isSigned =
new bool[p_bandDimension];
252 p_compressor.get_recommended_stripe_heights(MIN_STRIPE_HEIGHT,
253 MAX_STRIPE_HEIGHT, p_stripeHeights, p_maxStripeHeights);
254 for(
unsigned int i = 0; i < p_bandDimension; i++) {
255 p_precisions[i] = p_pixelBits;
256 p_isSigned[i] = p_signedData;
257 p_stripeHeights[i] = 1;
270 void JP2Encoder::Write(
unsigned char **inbuf) {
272 p_writeStripes = p_compressor.push_stripe(inbuf, p_stripeHeights, NULL, NULL,
273 p_precisions, p_flushLines);
285 void JP2Encoder::Write(
short int **inbuf) {
287 p_writeStripes = p_compressor.push_stripe(inbuf, p_stripeHeights, NULL, NULL,
288 p_precisions, p_isSigned, p_flushLines);
296 JP2Encoder::~JP2Encoder() {
298 p_compressor.finish();
299 JPEG2000_Codestream->destroy();
302 delete [] p_stripeHeights;
303 delete [] p_maxStripeHeights;
304 delete [] p_precisions;
305 delete [] p_isSigned;
Kakadu error messaging class.
PixelType
Enumerations for Isis Pixel Types.
#define _FILEINFO_
Macro for the filename and line number.