From 3315facbebdc1d83c15bf021e082de0d58dbacc1 Mon Sep 17 00:00:00 2001 From: malaterre Date: Mon, 30 May 2005 01:30:39 +0000 Subject: [PATCH] ENH: Adding support for multiple fragments of jpeg2000... this is SO ugly... --- src/gdcmJpeg2000.cxx | 14 +++++-------- src/gdcmPixelReadConvert.cxx | 39 +++++++++++++++++++++++++++--------- src/gdcmPixelReadConvert.h | 6 +++--- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/gdcmJpeg2000.cxx b/src/gdcmJpeg2000.cxx index aa73b48a..74f83d20 100644 --- a/src/gdcmJpeg2000.cxx +++ b/src/gdcmJpeg2000.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg2000.cxx,v $ Language: C++ - Date: $Date: 2005/05/22 18:38:52 $ - Version: $Revision: 1.20 $ + Date: $Date: 2005/05/30 01:30:39 $ + Version: $Revision: 1.21 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -34,15 +34,11 @@ namespace gdcm * @warning : not yet made */ -bool gdcm_read_JPEG2000_file (std::ifstream* fp, void* raw, size_t inputlength) +bool gdcm_read_JPEG2000_file (void* raw, char *inputdata, size_t inputlength) { jas_init(); //important... - // FIXME this is really ugly but it seems I have to load the complete - // jpeg2000 stream to use jasper: - uint8_t *inputdata = new uint8_t[inputlength]; - //fp is already 'seek' to proper pos - fp->read((char*)inputdata, inputlength); - jas_stream_t *jasStream = jas_stream_memopen((char *)inputdata, inputlength); + jas_stream_t *jasStream = + jas_stream_memopen((char *)inputdata, inputlength); int fmtid; if ((fmtid = jas_image_getfmt(jasStream)) < 0) diff --git a/src/gdcmPixelReadConvert.cxx b/src/gdcmPixelReadConvert.cxx index 66d41820..d30ba995 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/05/30 00:24:10 $ - Version: $Revision: 1.62 $ + Date: $Date: 2005/05/30 01:30:39 $ + Version: $Revision: 1.63 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -16,11 +16,11 @@ =========================================================================*/ +#include "gdcmPixelReadConvert.h" #include "gdcmDebug.h" #include "gdcmFile.h" #include "gdcmGlobal.h" #include "gdcmTS.h" -#include "gdcmPixelReadConvert.h" #include "gdcmDocEntry.h" #include "gdcmRLEFramesInfo.h" #include "gdcmJPEGFragmentsInfo.h" @@ -32,7 +32,8 @@ namespace gdcm { //bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t lenght); -bool gdcm_read_JPEG2000_file (std::ifstream* fp, void* raw, size_t inputlength); +bool gdcm_read_JPEG2000_file (void* raw, + char *inputdata, size_t inputlength); //----------------------------------------------------------------------------- #define str2num(str, typeNum) *((typeNum *)(str)) @@ -397,11 +398,31 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp ) { if ( IsJPEG2000 ) { - // I don't think we'll ever be able to deal with multiple fragments - assert( JPEGInfo->GetFragmentCount() == 1 ); - fp->seekg( JPEGInfo->GetFirstFragment()->GetOffset(), std::ios::beg); - if ( ! gdcm_read_JPEG2000_file( fp,Raw, - JPEGInfo->GetFirstFragment()->GetLength() ) ) + // FIXME this is really ugly but it seems I have to load the complete + // jpeg2000 stream to use jasper: + // I don't think we'll ever be able to deal with multiple fragments properly + + unsigned long inputlength = 0; + JPEGFragment *jpegfrag = JPEGInfo->GetFirstFragment(); + while( jpegfrag ) + { + inputlength += jpegfrag->GetLength(); + jpegfrag = JPEGInfo->GetNextFragment(); + } + gdcmAssertMacro( inputlength != 0); + uint8_t *inputdata = new uint8_t[inputlength]; + char *pinputdata = (char*)inputdata; + jpegfrag = JPEGInfo->GetFirstFragment(); + while( jpegfrag ) + { + fp->seekg( jpegfrag->GetOffset(), std::ios::beg); + fp->read(pinputdata, jpegfrag->GetLength()); + pinputdata += jpegfrag->GetLength(); + jpegfrag = JPEGInfo->GetNextFragment(); + } + // Warning the inputdata buffer is delete in the function + if ( ! gdcm_read_JPEG2000_file( Raw, + (char*)inputdata, inputlength ) ) { return true; } diff --git a/src/gdcmPixelReadConvert.h b/src/gdcmPixelReadConvert.h index 79226b20..07cc6e0b 100644 --- a/src/gdcmPixelReadConvert.h +++ b/src/gdcmPixelReadConvert.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelReadConvert.h,v $ Language: C++ - Date: $Date: 2005/04/22 13:37:57 $ - Version: $Revision: 1.20 $ + Date: $Date: 2005/05/30 01:30:39 $ + Version: $Revision: 1.21 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -20,9 +20,9 @@ #ifndef GDCMPIXELREADCONVERT_H #define GDCMPIXELREADCONVERT_H -#include "gdcmCommon.h" #include "gdcmBase.h" #include "gdcmException.h" +#include namespace gdcm { -- 2.48.1