From 1dd2c40c0da9098b444ad53b0e3c23da808997fa Mon Sep 17 00:00:00 2001 From: malaterre Date: Mon, 31 Jan 2005 04:00:04 +0000 Subject: [PATCH] ENH: Pass 2 at cleaning the JPEG mess. Still some work to do, but things are getting done --- src/gdcmJPEGFragment.cxx | 29 ++---- src/gdcmJPEGFragment.h | 12 +-- src/gdcmJPEGFragmentsInfo.cxx | 25 +---- src/gdcmJPEGFragmentsInfo.h | 5 +- src/gdcmJpeg.cxx | 7 +- src/gdcmJpeg12.cxx | 6 +- src/gdcmJpeg16.cxx | 6 +- src/gdcmJpeg8.cxx | 6 +- src/gdcmPixelReadConvert.cxx | 10 +- src/gdcmjpeg/jmemsrc.c | 170 ---------------------------------- 10 files changed, 35 insertions(+), 241 deletions(-) delete mode 100644 src/gdcmjpeg/jmemsrc.c diff --git a/src/gdcmJPEGFragment.cxx b/src/gdcmJPEGFragment.cxx index 65b9e393..e3569967 100644 --- a/src/gdcmJPEGFragment.cxx +++ b/src/gdcmJPEGFragment.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJPEGFragment.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:25 $ - Version: $Revision: 1.10 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.11 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -38,8 +38,6 @@ JPEGFragment::JPEGFragment() Offset = 0; Length = 0; -// StateSuspension = 0; -// void *SampBuffer; pImage = 0; } @@ -73,27 +71,18 @@ void JPEGFragment::DecompressJPEGFramesFromFile(std::ifstream *fp, if ( nBits == 8 ) { - // JPEG Lossy : call to IJG 6b - if ( ! this->gdcm_read_JPEG_file8( fp, buffer, statesuspension) ) - { - //return false; - } + // JPEG Lossy : call to IJG 6b - 8 bits + ReadJPEGFile8( fp, buffer, statesuspension); } else if ( nBits <= 12 ) { - // Reading Fragment pixels - if ( ! this->gdcm_read_JPEG_file12 ( fp, buffer, statesuspension) ) - { - //return false; - } + // JPEG Lossy : call to IJG 6b - 8 bits + ReadJPEGFile12 ( fp, buffer, statesuspension); } else if ( nBits <= 16 ) { - // Reading Fragment pixels - if ( ! this->gdcm_read_JPEG_file16 ( fp, buffer, statesuspension) ) - { - //return false; - } + // JPEG Lossy : call to IJG 6b - 8 bits + ReadJPEGFile16 ( fp, buffer, statesuspension); //gdcmAssertMacro( IsJPEGLossless ); } else @@ -103,9 +92,7 @@ void JPEGFragment::DecompressJPEGFramesFromFile(std::ifstream *fp, // other JPEG lossy not supported gdcmErrorMacro( "Unknown jpeg lossy compression "); - //return false; } - } } // end namespace gdcm diff --git a/src/gdcmJPEGFragment.h b/src/gdcmJPEGFragment.h index b3e0cc3a..e6d74eb8 100644 --- a/src/gdcmJPEGFragment.h +++ b/src/gdcmJPEGFragment.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJPEGFragment.h,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:25 $ - Version: $Revision: 1.14 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.15 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -27,8 +27,6 @@ namespace gdcm { -#define JOCTET uint8_t - /** * \brief Utility class for summerizing the informations of a JPEG * fragment of an "Encapsulated JPEG Compressed Image". @@ -47,9 +45,9 @@ public: void Print( std::ostream &os = std::cout, std::string indent = "" ); void DecompressJPEGFramesFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int & statesuspension); - bool gdcm_read_JPEG_file8 (std::ifstream* fp, void* image_buffer, int & statesuspension ); - bool gdcm_read_JPEG_file12 (std::ifstream* fp, void* image_buffer, int & statesuspension ); - bool gdcm_read_JPEG_file16 (std::ifstream* fp, void* image_buffer, int & statesuspension ); + bool ReadJPEGFile8 (std::ifstream* fp, void* image_buffer, int & statesuspension ); + bool ReadJPEGFile12 (std::ifstream* fp, void* image_buffer, int & statesuspension ); + bool ReadJPEGFile16 (std::ifstream* fp, void* image_buffer, int & statesuspension ); void SetLength(uint32_t length) { Length = length; }; uint32_t GetLength() { return Length;}; diff --git a/src/gdcmJPEGFragmentsInfo.cxx b/src/gdcmJPEGFragmentsInfo.cxx index 489ab2fe..4e038ce1 100644 --- a/src/gdcmJPEGFragmentsInfo.cxx +++ b/src/gdcmJPEGFragmentsInfo.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJPEGFragmentsInfo.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:25 $ - Version: $Revision: 1.14 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.15 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -87,27 +87,6 @@ size_t JPEGFragmentsInfo::GetFragmentsLength() return totalLength; } -/** - * \brief Read the all the JPEG Fragment into the input buffer - */ -void JPEGFragmentsInfo::ReadAllFragments(std::ifstream *fp, JOCTET *buffer ) -{ - JOCTET *p = buffer; - - // Loop on the fragment[s] - JPEGFragmentsList::const_iterator it; - for( it = Fragments.begin(); - it != Fragments.end(); - ++it ) - { - fp->seekg( (*it)->GetOffset(), std::ios::beg); - size_t len = (*it)->GetLength(); - fp->read((char *)p,len); - p += len; - } - -} - // to avoid warnings void JPEGFragmentsInfo::DecompressJPEGFramesFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int , int ) { diff --git a/src/gdcmJPEGFragmentsInfo.h b/src/gdcmJPEGFragmentsInfo.h index da248099..8aac1693 100644 --- a/src/gdcmJPEGFragmentsInfo.h +++ b/src/gdcmJPEGFragmentsInfo.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJPEGFragmentsInfo.h,v $ Language: C++ - Date: $Date: 2005/01/30 17:30:57 $ - Version: $Revision: 1.16 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.17 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -44,7 +44,6 @@ public: ~JPEGFragmentsInfo(); void Print( std::ostream &os = std::cout, std::string const & indent = "" ); size_t GetFragmentsLength(); - void ReadAllFragments(std::ifstream *fp, JOCTET *buffer ); void DecompressJPEGFramesFromFile(std::ifstream *fp, uint8_t *buffer, int nBits, int numBytes, int length); diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index 2d79c5c8..66a6dca6 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:25 $ - Version: $Revision: 1.38 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.39 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -204,10 +204,11 @@ METHODDEF(void) my_error_exit (j_common_ptr cinfo) { * @param fp pointer to an already open file descriptor * 8 significant bits per pixel * @param image_buffer to receive uncompressed pixels + * @param statesuspension Suspension State basically it should be 3 otherwise more complex to handle * @return 1 on success, 0 on error */ void *SampBuffer; -bool JPEGFragment::gdcm_read_JPEG_file (std::ifstream* fp, void* image_buffer , int& statesuspension) +bool JPEGFragment::ReadJPEGFile (std::ifstream* fp, void* image_buffer , int& statesuspension) { pImage = (uint8_t*)image_buffer; // This struct contains the JPEG decompression parameters and pointers to diff --git a/src/gdcmJpeg12.cxx b/src/gdcmJpeg12.cxx index 03d25b84..b89b86d9 100644 --- a/src/gdcmJpeg12.cxx +++ b/src/gdcmJpeg12.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg12.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:26 $ - Version: $Revision: 1.31 $ + Date: $Date: 2005/01/31 04:00:04 $ + Version: $Revision: 1.32 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -26,7 +26,7 @@ extern "C" { } #define gdcm_write_JPEG_file gdcm_write_JPEG_file12 -#define gdcm_read_JPEG_file gdcm_read_JPEG_file12 +#define ReadJPEGFile ReadJPEGFile12 #define SampBuffer SampBuffer12 #include "gdcmJpeg.cxx" diff --git a/src/gdcmJpeg16.cxx b/src/gdcmJpeg16.cxx index 4adfddbb..8911708f 100644 --- a/src/gdcmJpeg16.cxx +++ b/src/gdcmJpeg16.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg16.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:26 $ - Version: $Revision: 1.10 $ + Date: $Date: 2005/01/31 04:00:05 $ + Version: $Revision: 1.11 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -26,7 +26,7 @@ extern "C" { } #define gdcm_write_JPEG_file gdcm_write_JPEG_file16 -#define gdcm_read_JPEG_file gdcm_read_JPEG_file16 +#define ReadJPEGFile ReadJPEGFile16 #define SampBuffer SampBuffer16 #include "gdcmJpeg.cxx" diff --git a/src/gdcmJpeg8.cxx b/src/gdcmJpeg8.cxx index 42ab8130..aef7ca8f 100644 --- a/src/gdcmJpeg8.cxx +++ b/src/gdcmJpeg8.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg8.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:26 $ - Version: $Revision: 1.16 $ + Date: $Date: 2005/01/31 04:00:05 $ + Version: $Revision: 1.17 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -26,7 +26,7 @@ extern "C" { } #define gdcm_write_JPEG_file gdcm_write_JPEG_file8 -#define gdcm_read_JPEG_file gdcm_read_JPEG_file8 +#define ReadJPEGFile ReadJPEGFile8 #define SampBuffer SampBuffer8 #include "gdcmJpeg.cxx" diff --git a/src/gdcmPixelReadConvert.cxx b/src/gdcmPixelReadConvert.cxx index 8c8bd2db..9338248a 100644 --- a/src/gdcmPixelReadConvert.cxx +++ b/src/gdcmPixelReadConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelReadConvert.cxx,v $ Language: C++ - Date: $Date: 2005/01/31 03:22:26 $ - Version: $Revision: 1.38 $ + Date: $Date: 2005/01/31 04:00:05 $ + Version: $Revision: 1.39 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -96,21 +96,21 @@ void PixelReadConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream *fp ) uint8_t b0, b1, b2; fp->read( (char*)&b0, 1); - if ( fp->fail() || fp->eof() )//Fp->gcount() == 1 + if ( fp->fail() || fp->eof() ) { throw FormatError( "PixelReadConvert::ReadAndDecompress12BitsTo16Bits()", "Unfound first block" ); } fp->read( (char*)&b1, 1 ); - if ( fp->fail() || fp->eof())//Fp->gcount() == 1 + if ( fp->fail() || fp->eof()) { throw FormatError( "PixelReadConvert::ReadAndDecompress12BitsTo16Bits()", "Unfound second block" ); } fp->read( (char*)&b2, 1 ); - if ( fp->fail() || fp->eof())//Fp->gcount() == 1 + if ( fp->fail() || fp->eof()) { throw FormatError( "PixelReadConvert::ReadAndDecompress12BitsTo16Bits()", "Unfound second block" ); diff --git a/src/gdcmjpeg/jmemsrc.c b/src/gdcmjpeg/jmemsrc.c deleted file mode 100644 index b208fbc5..00000000 --- a/src/gdcmjpeg/jmemsrc.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * jmemsrc.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains decompression data source routines for the case of - * reading JPEG data from a memory buffer that is preloaded with the entire - * JPEG file. This would not seem especially useful at first sight, but - * a number of people have asked for it. - * This is really just a stripped-down version of jdatasrc.c. Comparison - * of this code with jdatasrc.c may be helpful in seeing how to make - * custom source managers for other purposes. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jerror.h" - - -/* Expanded data source object for memory input */ - -/** - * \brief very low level C 'structure', used to decode jpeg file - * Should not appear in the Doxygen supplied documentation - */ -typedef struct { - struct jpeg_source_mgr pub; /* public fields */ - JOCTET eoi_buffer[2]; /* a place to put a dummy EOI */ -} my_source_mgr; - -typedef my_source_mgr * my_src_ptr; - - -/* - * Initialize source --- called by jpeg_read_header - * before any data is actually read. - */ - -METHODDEF(void) -init_source (j_decompress_ptr cinfo) -{ - /* No work, since jpeg_memory_src set up the buffer pointer and count. - * Indeed, if we want to read multiple JPEG images from one buffer, - * this *must* not do anything to the pointer. - */ - (void)cinfo; -} - - -/* - * Fill the input buffer --- called whenever buffer is emptied. - * - * In this application, this routine should never be called; if it is called, - * the decompressor has overrun the end of the input buffer, implying we - * supplied an incomplete or corrupt JPEG datastream. A simple error exit - * might be the most appropriate response. - * - * But what we choose to do in this code is to supply dummy EOI markers - * in order to force the decompressor to finish processing and supply - * some sort of output image, no matter how corrupted. - */ - -METHODDEF(boolean) -fill_input_buffer (j_decompress_ptr cinfo) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - WARNMS(cinfo, JWRN_JPEG_EOF); - - /* Create a fake EOI marker */ - src->eoi_buffer[0] = (JOCTET) 0xFF; - src->eoi_buffer[1] = (JOCTET) JPEG_EOI; - src->pub.next_input_byte = src->eoi_buffer; - src->pub.bytes_in_buffer = 2; - - return TRUE; -} - - -/* - * Skip data --- used to skip over a potentially large amount of - * uninteresting data (such as an APPn marker). - * - * If we overrun the end of the buffer, we let fill_input_buffer deal with - * it. An extremely large skip could cause some time-wasting here, but - * it really isn't supposed to happen ... and the decompressor will never - * skip more than 64K anyway. - */ - -METHODDEF(void) -skip_input_data (j_decompress_ptr cinfo, long num_bytes) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - if (num_bytes > 0) { - while (num_bytes > (long) src->pub.bytes_in_buffer) { - num_bytes -= (long) src->pub.bytes_in_buffer; - (void) fill_input_buffer(cinfo); - /* note we assume that fill_input_buffer will never return FALSE, - * so suspension need not be handled. - */ - } - src->pub.next_input_byte += (size_t) num_bytes; - src->pub.bytes_in_buffer -= (size_t) num_bytes; - } -} - - -/* - * An additional method that can be provided by data source modules is the - * resync_to_restart method for error recovery in the presence of RST markers. - * For the moment, this source module just uses the default resync method - * provided by the JPEG library. That method assumes that no backtracking - * is possible. - */ - - -/* - * Terminate source --- called by jpeg_finish_decompress - * after all data has been read. Often a no-op. - * - * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding - * application must deal with any cleanup that should happen even - * for error exit. - */ - -METHODDEF(void) -term_source (j_decompress_ptr cinfo) -{ - /* no work necessary here */ - (void)cinfo; -} - - -/* - * Prepare for input from a memory buffer. - */ - -GLOBAL(void) -jpeg_memory_src (j_decompress_ptr cinfo, const JOCTET * buffer, size_t bufsize) -{ - my_src_ptr src; - - /* The source object is made permanent so that a series of JPEG images - * can be read from a single buffer by calling jpeg_memory_src - * only before the first one. - * This makes it unsafe to use this manager and a different source - * manager serially with the same JPEG object. Caveat programmer. - */ - if (cinfo->src == NULL) { /* first time for this JPEG object? */ - cinfo->src = (struct jpeg_source_mgr *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_source_mgr)); - } - - src = (my_src_ptr) cinfo->src; - src->pub.init_source = init_source; - src->pub.fill_input_buffer = fill_input_buffer; - src->pub.skip_input_data = skip_input_data; - src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ - src->pub.term_source = term_source; - - src->pub.next_input_byte = buffer; - src->pub.bytes_in_buffer = bufsize; -} - - -- 2.45.2