- int iX,iY;
- int lbInc=0;
- unsigned int mask;
-
- int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
-
- jpg->ValCurByte=jpg->lSos.SuccessiveAp;
- jpg->PosCurBit=9;
-
- if (jpg->lSof.precision==8)
- mask=0xFF;
- if (jpg->lSof.precision==12)
- mask=0xFFF;
- if (jpg->lSof.precision==16)
- mask=0xFFFF;
-
- jpg->DataImg=(int*)malloc(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg));
- memset( jpg->DataImg,0,(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg)));
-
- if (!jpg->RestartInterval)
- {
- for(iX=0;iX<jpg->lSof.Wimg;iX++) // lit première ligne
- {
- lbInc+=1;
- if (lbInc>1)
- lPredicted= jpg->DataImg[lbInc-1];
- jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
- if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
- if ( jpg->DataImg[lbInc]<0)
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
- }
-
- for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
- {
- lbInc+=1;
- if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
- lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg]; // se base % premier é ligne d'avant
- jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
- if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
- if ( jpg->DataImg[lbInc]<0)
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
- for(iX=1;iX<jpg->lSof.Wimg;iX++)
- {
- lbInc+=1;
- if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
- if (jpg->lSos.SpectralSelStart==7) // si spectral
- lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
- else
- lPredicted= jpg->DataImg[lbInc-1]; // se base%pixel juste avant
- jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
- if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
- if ( jpg->DataImg[lbInc]<0)
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
- }
- }
- }
- else // il y a un define interval
- {
- while(1)
- {
- jpg->MarkerFound=0;
- lPredicted=(1<<(jpg->lSof.precision - 1 - jpg->lSos.Sospttrans));
- for (iY=0;iY<jpg->RestartInterval;iY++)
- {
- jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
- if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
- if ( jpg->DataImg[lbInc]<0)
- jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
- lbInc+=1;
- if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) return 1;
-
- if (jpg->lSos.SpectralSelStart==7) // si spectral
- lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
- else
- lPredicted= jpg->DataImg[lbInc-1];
- }
- while (!jpg->MarkerFound)
- {
- ClbJpegReadBit(jpg); // skip bits restant avant restart marker
- }
- }
- }
- return 1;
+ pImage = (uint8_t*)image_buffer;
+ // This struct contains the JPEG decompression parameters and pointers to
+ // working space (which is allocated as needed by the JPEG library).
+
+ static struct jpeg_decompress_struct cinfo;
+
+ // -------------- inside, we found :
+ // JDIMENSION image_width; // input image width
+ // JDIMENSION image_height; // input image height
+ // int input_components; // nb of color components in input image
+ // J_COLOR_SPACE in_color_space; // colorspace of input image
+ // double input_gamma; // image gamma of input image
+
+ // We use our private extension JPEG error handler.
+ // Note that this struct must live as long as the main JPEG parameter
+ // struct, to avoid dangling-pointer problems.
+
+ struct my_error_mgr jerr;
+
+ JSAMPARRAY buffer;// Output row buffer
+
+ // rappel :
+ // ------
+ // typedef unsigned char JSAMPLE;
+ // typedef JSAMPLE FAR *JSAMPROW;/* ptr to one image row of pixel samples. */
+ // typedef JSAMPROW *JSAMPARRAY;/* ptr to some rows (a 2-D sample array) */
+ // typedef JSAMPARRAY *JSAMPIMAGE;/* a 3-D sample array: top index is color */
+
+ int row_stride;// physical row width in output buffer
+
+ // We set up the normal JPEG error routines, then override error_exit.
+
+ cinfo.err = jpeg_std_error(&jerr.pub);
+ // for any jpeg error call my_error_exit
+ jerr.pub.error_exit = my_error_exit;
+ // for any output message call my_output_message
+ jerr.pub.output_message = my_output_message;
+
+ // Establish the setjmp return context for my_error_exit to use.
+ if (setjmp(jerr.setjmp_buffer))
+ {
+ // If we get here, the JPEG code has signaled an error.
+ // We need to clean up the JPEG object, close the input file, and return.
+
+ gdcmErrorMacro( "Serious Problem !" );
+ jpeg_destroy_decompress(&cinfo);
+ return 0;
+ }
+ // Now we can initialize the JPEG decompression object.
+ if( statesuspension == 0 )
+ {
+ jpeg_create_decompress(&cinfo);
+ jpeg_stdio_src(&cinfo, fp, this, 1);
+ }
+ else
+ {
+ jpeg_stdio_src(&cinfo, fp, this, 0);
+ }
+ // Step 3: read file parameters with jpeg_read_header()
+
+ if( statesuspension < 2 )
+ {
+ if( jpeg_read_header(&cinfo, TRUE) == JPEG_SUSPENDED )
+ {
+ // Suspension in jpeg_read_header
+ statesuspension = 2;
+ }
+
+ // Step 4: set parameters for decompression
+ // prevent the library from performing any color space conversion
+ if( cinfo.process == JPROC_LOSSLESS )
+ {
+ cinfo.jpeg_color_space = JCS_UNKNOWN;
+ cinfo.out_color_space = JCS_UNKNOWN;
+ }
+ }
+
+ // Step 5: Start decompressor
+ if(statesuspension < 3 )
+ {
+ if( jpeg_start_decompress(&cinfo) == FALSE )
+ {
+ // Suspension: jpeg_start_decompress
+ statesuspension = 3;
+ }
+
+ // JSAMPLEs per row in output buffer
+ row_stride = cinfo.output_width * cinfo.output_components*2;
+
+ // Make a one-row-high sample array that will go away when done with image
+ buffer = (*cinfo.mem->alloc_sarray)
+ ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
+
+ // Step 6: while (scan lines remain to be read)
+
+ // Save the buffer in case of suspension to be able to reuse it later:
+ SampBuffer = buffer;
+ }
+ else
+ {
+ // Suspension: re-use the buffer:
+ buffer = (JSAMPARRAY)SampBuffer;
+ }
+ int bufsize = cinfo.output_width * cinfo.output_components;
+ size_t rowsize = bufsize * sizeof(JSAMPLE);
+
+ while (cinfo.output_scanline < cinfo.output_height)
+ {
+ if( jpeg_read_scanlines(&cinfo, buffer, 1) == 0 )
+ {
+ // Suspension in jpeg_read_scanlines
+ statesuspension = 3;
+ return true;
+ }
+// The ijg has no notion of big endian, therefore always swap the jpeg stream
+#if defined(GDCM_WORDS_BIGENDIAN) && (CMAKE_BITS_IN_JSAMPLE != 8)
+ uint16_t *buffer16 = (uint16_t*)*buffer;
+ uint16_t *pimage16 = (uint16_t*)pImage;
+ for(unsigned int i=0;i<rowsize/2;i++)
+ pimage16[i] = (buffer16[i] >> 8) | (buffer16[i] << 8 );
+#else
+ memcpy( pImage, *buffer,rowsize);
+#endif //GDCM_WORDS_BIGENDIAN
+ pImage+=rowsize;
+ }
+
+ // Step 7: Finish decompression
+ if( jpeg_finish_decompress(&cinfo) == FALSE )
+ {
+ // Suspension: jpeg_finish_decompress
+ statesuspension = 4;
+ }
+
+ // Step 8: Release JPEG decompression object
+ jpeg_destroy_decompress(&cinfo);
+
+ // At this point you may want to check to see whether any corrupt-data
+ // warnings occurred (test whether jerr.pub.num_warnings is nonzero).
+
+ return true;