From 04530e8606acf3f15a9d1f85e3c804941b6554a6 Mon Sep 17 00:00:00 2001 From: jpr Date: Tue, 21 Aug 2007 12:51:09 +0000 Subject: [PATCH] On the way to unification with ITK version --- src/gdcmDocument.cxx | 12 +- src/gdcmFileHelper.cxx | 72 +++--- src/gdcmFileHelper.h | 40 ++-- src/gdcmJpeg.cxx | 7 +- src/gdcmMpeg.cxx | 399 ++++++++++++++-------------------- src/gdcmPixelWriteConvert.cxx | 17 +- src/gdcmValidator.cxx | 24 +- 7 files changed, 253 insertions(+), 318 deletions(-) diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index d018e681..3c63f3e8 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2007/07/27 21:21:48 $ - Version: $Revision: 1.366 $ + Date: $Date: 2007/08/21 12:51:09 $ + Version: $Revision: 1.367 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -2255,10 +2255,10 @@ DocEntry *Document::ReadNextDocEntry() // attributes have to be LO (Long String) and the VM shall be equal to 1 realVR = "LO"; - // Seems not to be true - // Still in gdcmtk, David Clunnie disagrees, Marco Eichelberg says it's OK ... - // We let it for a while? - //(We should check length==4, for more security, but we don't have it yet !) + // Seems not to be true + // Still in gdcmtk, David Clunnie disagrees, Marco Eichelberg says it's OK ... + // We let it for a while? + //(We should check length==4, for more security, but we don't have it yet !) else if ( CurrentElem == 0x0001) realVR = "UL"; // Private Group Length To End } diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index 2f54d3ed..8f0acf34 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -4,8 +4,8 @@ Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2007/07/26 08:36:49 $ - Version: $Revision: 1.119 $ + Date: $Date: 2007/08/21 12:51:09 $ + Version: $Revision: 1.120 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -736,7 +736,6 @@ bool FileHelper::Write(std::string const &fileName) { if (e->GetVR() == " ") { - SetWriteTypeToDcmImplVR(); SetWriteFileTypeToImplicitVR(); flag = true; @@ -810,7 +809,7 @@ bool FileHelper::Write(std::string const &fileName) } bool check = CheckWriteIntegrity(); // verifies length - if (WriteType == JPEG || WriteType == JPEG2000) + if (WriteType == JPEG || WriteType == JPEG2000) check = true; if (check) @@ -910,13 +909,13 @@ void FileHelper::SetWriteToRaw() photInt->SetString("PALETTE COLOR "); } else - { + { if (GetPhotometricInterpretation() == 2) photInt->SetString("MONOCHROME2 "); // 0 = Black else photInt->SetString("MONOCHROME1 "); // 0 = White ! } - + PixelWriteConverter->SetReadData(PixelReadConverter->GetRaw(), PixelReadConverter->GetRawSize()); @@ -930,17 +929,18 @@ void FileHelper::SetWriteToRaw() { vr = "OW"; } - + DataEntry *pixel = CopyDataEntry(GetFile()->GetGrPixel(),GetFile()->GetNumPixel(),vr); pixel->SetFlag(DataEntry::FLAG_PIXELDATA); pixel->SetBinArea(PixelWriteConverter->GetData(),false); - pixel->SetLength(PixelWriteConverter->GetDataSize()); - + pixel->SetLength( + static_cast< uint32_t >(PixelWriteConverter->GetDataSize()) ); + if (!FileInternal->HasLUT() && GetPhotometricInterpretation() == 1) { ConvertFixGreyLevels( pixel->GetBinArea(), pixel->GetLength() ); - } + } Archive->Push(photInt); Archive->Push(pixel); @@ -1175,10 +1175,10 @@ void FileHelper::SetWriteToLibido() if ( oldRow && oldCol ) { std::string rows, columns; - + DataEntry *newRow=DataEntry::New(0x0028, 0x0010, "US"); DataEntry *newCol=DataEntry::New(0x0028, 0x0011, "US"); - + newRow->Copy(oldCol); newCol->Copy(oldRow); @@ -1310,7 +1310,7 @@ We have to deal with 4 *very* different cases : CREATED_IMAGE -4) user modified/added some tags *without processing* the pixels (anonymization...) UNMODIFIED_PIXELS_IMAGE --Probabely some more to be added. +-Probabely some more to be added. gdcm::FileHelper::CheckMandatoryElements() deals automatically with these cases. @@ -1484,10 +1484,10 @@ void FileHelper::CheckMandatoryElements() // 'Media Storage SOP Class UID' --> [Secondary Capture Image Storage] CopyMandatoryEntry(0x0002,0x0002,"1.2.840.10008.5.1.4.1.1.7","UI"); } - - // 'Media Storage SOP Instance UID' + + // 'Media Storage SOP Instance UID' CopyMandatoryEntry(0x0002,0x0003,sop,"UI"); - + // 'Implementation Class UID' // FIXME : in all examples we have, 0x0002,0x0012 is not so long : // seems to be Root UID + 4 digits (?) @@ -1503,9 +1503,9 @@ void FileHelper::CheckMandatoryElements() if ( ContentType != USER_OWN_IMAGE) // when it's not a user made image { - + gdcmDebugMacro( "USER_OWN_IMAGE (1)"); - // If 'SOP Class UID' exists ('true DICOM' image) + // If 'SOP Class UID' exists ('true DICOM' image) // we create the 'Source Image Sequence' SeqEntry // to hold informations about the Source Image @@ -1569,10 +1569,10 @@ void FileHelper::CheckMandatoryElements() Archive->Push(0x0028,0x0017); Archive->Push(0x0028,0x0198); // very old versions Archive->Push(0x0028,0x0199); - + // Replace deprecated 0028 0012 US Planes // by new 0028 0008 IS Number of Frames - + ///\todo : find if there is a rule! DataEntry *e_0028_0012 = FileInternal->GetDataEntry(0x0028, 0x0012); if ( e_0028_0012 ) @@ -1593,8 +1593,8 @@ void FileHelper::CheckMandatoryElements() std::ostringstream s; // check 'Bits Allocated' vs decent values int nbBitsAllocated = FileInternal->GetBitsAllocated(); - if ( nbBitsAllocated == 0 || nbBitsAllocated > 32 - || ( nbBitsAllocated > 8 && nbBitsAllocated <16) ) + if ( (nbBitsAllocated == 0 || nbBitsAllocated > 32) + || ( nbBitsAllocated > 8 && nbBitsAllocated <16) ) { CopyMandatoryEntry(0x0028,0x0100,"16","US"); gdcmWarningMacro("(0028,0100) changed from " @@ -1628,7 +1628,7 @@ void FileHelper::CheckMandatoryElements() } // check Pixel Representation (default it as 0 -unsigned-) - + DataEntry *e_0028_0103 = FileInternal->GetDataEntry(0x0028, 0x0103); if ( !e_0028_0103 ) { @@ -1657,7 +1657,7 @@ void FileHelper::CheckMandatoryElements() // --> This one is the *legal* one ! if ( ContentType != USER_OWN_IMAGE) // we write it only when we are *sure* the image comes from - // an imager (see also 0008,0x0064) + // an imager (see also 0008,0x0064) CheckMandatoryEntry(0x0018,0x1164,pixelSpacing,"DS"); /* @@ -1665,7 +1665,7 @@ void FileHelper::CheckMandatoryElements() // See page 73 of ACR-NEMA_300-1988.pdf ! -// 0020,0020 : Patient Orientation : +// 0020,0020 : Patient Orientation : Patient direction of the first row and column of the images. The first entry id the direction of the raws, given by the direction of the last pixel in the first row from the first pixel in tha row. @@ -1683,11 +1683,11 @@ equipment coordinate axes x,y,z, followed by direction cosines of the C axis of the image system with respect to the same axes //0020,0050 Location -An image location reference, standard for the modality (such as CT bed -position), used to indicate position. Calculation of position for other purposes +An image location reference, standard for the modality (such as CT bed position), +used to indicate position. Calculation of position for other purposes is only from (0020,0030) and (0020,0035) */ - + /* // if imagePositionPatient not found, default it with imagePositionRet, if any // if imageOrientationPatient not found, default it with imageOrientationRet, if any @@ -1696,7 +1696,7 @@ is only from (0020,0030) and (0020,0035) std::string imageOrientationRet = FileInternal->GetEntryString(0x0020,0x0035); std::string imagePositionPatient = FileInternal->GetEntryString(0x0020,0x0032); std::string imageOrientationPatient = FileInternal->GetEntryString(0x0020,0x0037); - + if( imagePositionPatient == GDCM_UNFOUND && imageOrientationPatient == GDCM_UNFOUND && imagePositionRet != GDCM_UNFOUND && imageOrientationRet != GDCM_UNFOUND) { @@ -1707,7 +1707,7 @@ is only from (0020,0030) and (0020,0035) } */ - // Samples Per Pixel (type 1) : default to grayscale + // Samples Per Pixel (type 1) : default to grayscale CheckMandatoryEntry(0x0028,0x0002,"1","US"); // --- Check UID-related Entries --- @@ -1719,11 +1719,11 @@ is only from (0020,0030) and (0020,0035) if ( ContentType == USER_OWN_IMAGE) { - gdcmDebugMacro( "USER_OWN_IMAGE (2)"); + gdcmDebugMacro( "USER_OWN_IMAGE (2)"); // Conversion Type. // Other possible values are : // See PS 3.3, Page 408 - + // DV = Digitized Video // DI = Digital Interface // DF = Digitized Film @@ -1732,7 +1732,7 @@ is only from (0020,0030) and (0020,0035) // SI = Scanned Image // DRW = Drawing // SYN = Synthetic Image - + CheckMandatoryEntry(0x0008,0x0064,"SYN","CS"); // Why not? } /* @@ -1742,7 +1742,7 @@ is only from (0020,0030) and (0020,0035) } */ - + // ---- The user will never have to take any action on the following ---- // new value for 'SOP Instance UID' @@ -1840,7 +1840,7 @@ is only from (0020,0030) and (0020,0035) /* // Deal with element 0x0000 (group length) of each group. // First stage : get all the different Groups - + GroupHT grHT; DocEntry *d = FileInternal->GetFirstEntry(); while(d) @@ -1875,7 +1875,7 @@ void FileHelper::CheckMandatoryEntry(uint16_t group,uint16_t elem,std::string va } } -/// \todo : what is it used for ? (FileHelper::SetMandatoryEntry) +/// \todo : what is it used for ? (FileHelper::SetMandatoryEntry) void FileHelper::SetMandatoryEntry(uint16_t group,uint16_t elem,std::string value,const VRKey &vr) { //DataEntry *entry = DataEntry::New(Global::GetDicts()->GetDefaultPubDict()->GetEntry(group,elem)); diff --git a/src/gdcmFileHelper.h b/src/gdcmFileHelper.h index 3ff0b306..1e3165b2 100644 --- a/src/gdcmFileHelper.h +++ b/src/gdcmFileHelper.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFileHelper.h,v $ Language: C++ - Date: $Date: 2007/07/27 21:21:48 $ - Version: $Revision: 1.50 $ + Date: $Date: 2007/08/21 12:51:09 $ + Version: $Revision: 1.51 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -56,7 +56,7 @@ public: static FileHelper *New() {return new FileHelper();} /// \brief Constructs a FileHelper with a RefCounter from a fileHelper static FileHelper *New(File *header) {return new FileHelper(header);} - + void Print(std::ostream &os = std::cout, std::string const &indent = ""); /// Accessor to \ref File @@ -119,7 +119,7 @@ public: /// (as opposed to 'Grey pixels + Palettes color') void SetWriteModeToRGB() { SetWriteMode(WMODE_RGB); } /// \brief Sets the Write Mode ( ) - void SetWriteMode(FileMode mode) { WriteMode = mode; } + void SetWriteMode(FileMode mode) { WriteMode = mode; } /// \brief Gets the Write Mode ( ) FileMode GetWriteMode() { return WriteMode; } @@ -133,26 +133,26 @@ public: void SetWriteTypeToAcr() { SetWriteType(ACR); } /// \brief Tells the writer we want to write as LibIDO void SetWriteTypeToAcrLibido() { SetWriteType(ACR_LIBIDO); } - /// \brief Tells the writer we want to write as JPEG + /// \brief Tells the writer we want to write as JPEG void SetWriteTypeToJPEG() { SetWriteType(JPEG); } /// \brief Tells the writer we want to write as JPEG2000 - void SetWriteTypeToJPEG2000() { SetWriteType(JPEG2000); } + void SetWriteTypeToJPEG2000() { SetWriteType(JPEG2000); } /// \brief Tells the writer which format we want to write /// (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) void SetWriteType(FileType format) { WriteType = format; } /// \brief Gets the format we talled the write we wanted to write /// (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) FileType GetWriteType() { return WriteType; } - /// \brief 1 : white=0, black=high value + /// \brief 1 : white=0, black=high value void SetPhotometricInterpretationToMonochrome1() { PhotometricInterpretation = 1;} - /// \brief 2 : black=0, white=high value (default) + /// \brief 2 : black=0, white=high value (default) void SetPhotometricInterpretationToMonochrome2() { PhotometricInterpretation = 2;} - /// \brief 1 : white=0, black=high value + /// \brief 1 : white=0, black=high value int GetPhotometricInterpretation() { - return PhotometricInterpretation; } - + return PhotometricInterpretation; } + // Write pixels of ONE image on hard drive // No test is made on processor "endianness" // The user must call his reader correctly @@ -184,7 +184,7 @@ protected: FileHelper( File *header ); ~FileHelper(); - /// \todo move all those 'protected' methods to 'privete' + /// \todo move all those 'protected' methods to 'private' /// since FileHelper is not derived in anything! bool CheckWriteIntegrity(); @@ -194,7 +194,7 @@ protected: void SetWriteFileTypeToACR(); void SetWriteFileTypeToJPEG(); - void SetWriteFileTypeToJPEG2000(); + void SetWriteFileTypeToJPEG2000(); void SetWriteFileTypeToExplicitVR(); void SetWriteFileTypeToImplicitVR(); void RestoreWriteFileType(); @@ -204,14 +204,14 @@ protected: void RestoreWriteOfLibido(); DataEntry *CopyDataEntry(uint16_t group, uint16_t elem, - const VRKey &vr = GDCM_VRUNKNOWN); + const VRKey &vr = GDCM_VRUNKNOWN); void CheckMandatoryElements(); void CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value, - const VRKey &vr = GDCM_VRUNKNOWN); + const VRKey &vr = GDCM_VRUNKNOWN); void SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value, - const VRKey &vr = GDCM_VRUNKNOWN); + const VRKey &vr = GDCM_VRUNKNOWN); void CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value, - const VRKey &vr = GDCM_VRUNKNOWN); + const VRKey &vr = GDCM_VRUNKNOWN); void RestoreWriteMandatory(); private: @@ -249,7 +249,7 @@ private: /// \brief (ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO) FileType WriteType; - + /// \brief Pointer to a user supplied function to allow modification /// of pixel order (e.g. : Mirror, UpsideDown, 90°Rotation, ...) /// use as : void userSuppliedFunction(uint8_t *im, gdcm::File *f) @@ -265,8 +265,8 @@ private: /// - he anonymized and image (*no* modif on the pixels) ImageContentType ContentType; - /// \brief 1 : white=0, black=high value - /// 2 : black=0, white=high value (default) + /// \brief 1 : white=0, black=high value + /// 2 : black=0, white=high value (default) int PhotometricInterpretation; }; diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index 9f869336..44b789aa 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg.cxx,v $ Language: C++ - Date: $Date: 2007/07/13 08:17:21 $ - Version: $Revision: 1.57 $ + Date: $Date: 2007/08/21 12:51:09 $ + Version: $Revision: 1.58 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -65,7 +65,6 @@ bool gdcm_write_JPEG_file (std::ostream *fp, char *inputdata, size_t inputlength int image_width, int image_height, int numZ, int sample_pixel, int bitsallocated, int quality) { - (void)bitsallocated; struct jpeg_compress_struct cinfo; int row_stride; /* physical row width in image buffer */ @@ -102,7 +101,7 @@ bool gdcm_write_JPEG_file (std::ostream *fp, char *inputdata, size_t inputlength /* Step 2: specify data destination (eg, a file) */ /* Note: steps 2 and 3 can be done in either order. */ - int fragment_size = inputlength; + int fragment_size = static_cast< int >( inputlength ); jpeg_stdio_dest(&cinfo, fp, fragment_size, 1); /* Step 3: set parameters for compression */ diff --git a/src/gdcmMpeg.cxx b/src/gdcmMpeg.cxx index 9480b5f5..577775b0 100644 --- a/src/gdcmMpeg.cxx +++ b/src/gdcmMpeg.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmMpeg.cxx,v $ Language: C++ - Date: $Date: 2007/05/23 14:18:10 $ - Version: $Revision: 1.11 $ + Date: $Date: 2007/08/21 12:51:09 $ + Version: $Revision: 1.12 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,103 +18,62 @@ #include "gdcmDebug.h" #include - - -typedef struct -{ - std::ifstream *InFd; -} istream; +#include +#include +#include +#include extern "C" { #define GLOBAL #include "config.h" #include "global.h" -} +/* private prototypes */ +static int video_sequence _ANSI_ARGS_((int *framenum)); +static int Decode_Bitstream _ANSI_ARGS_((void)); +static int Headers _ANSI_ARGS_((void)); +static void Initialize_Sequence _ANSI_ARGS_((void)); +static void Initialize_Decoder _ANSI_ARGS_((void)); +static void Deinitialize_Sequence _ANSI_ARGS_((void)); +//static void Process_Options _ANSI_ARGS_((int argc, char *argv[])); -off_t my_seek(istream *infile, off_t offset, int whence) -{ - //return fseek(infile->InFd,offset, whence); - switch(whence) - { - case SEEK_SET: - infile->InFd->seekg(offset, std::ios::beg); - break; - case SEEK_END: - infile->InFd->seekg(offset, std::ios::end); - break; - case SEEK_CUR: - infile->InFd->seekg(offset, std::ios::cur); - break; - } - return infile->InFd->tellg(); -} -ssize_t my_read(istream *infile, void *buf, size_t count) -{ - //return fread(buf,1,count, infile->InFd); - infile->InFd->read((char*)buf, count); - return infile->InFd->gcount(); -} - -int my_close(istream *infile) -{ - //return fclose(infile->InFd); - infile->InFd->close(); - return 0; -} - -namespace GDCM_NAME_SPACE -{ - -static int Headers(); -static void DeInitialize_Decoder() -{ - free(Clip-384); /* I love magic number */ -} -static void Deinitialize_Sequence() +/* IMPLEMENTATION specific routines */ +static void Initialize_Decoder() { int i; - /* First cleanup the static buffer in store.c */ - FreeStaticBuffer(); - - /* clear flags */ - base.MPEG2_Flag=0; + /* Clip table */ + if ( !(Clip=(unsigned char *)malloc(1024)) ) + Error("Clip[] malloc failed\n"); - for(i=0;i<3;i++) - { - free(backward_reference_frame[i]); - free(forward_reference_frame[i]); - free(auxframe[i]); + Clip += 384; - if (base.scalable_mode==SC_SPAT) - { - free(llframe0[i]); - free(llframe1[i]); - } - } + for (i=-384; i<640; i++) + Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i); - if (base.scalable_mode==SC_SPAT) - free(lltmp); + /* IDCT */ + if ( Reference_IDCT_Flag ) + Initialize_Reference_IDCT(); + else + Initialize_Fast_IDCT(); -#ifdef DISPLAY - if (Output_Type==T_X11) - Terminate_Display_Process(); -#endif } -/* mostly IMPLEMENTAION specific routines */ +/* mostly IMPLEMENTATION specific routines */ static void Initialize_Sequence() { int cc, size; static int Table_6_20[3] = {6,8,12}; /* check scalability mode of enhancement layer */ - if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP)) - Error("unsupported scalability mode\n"); - + if ( Two_Streams && (enhan.scalable_mode!=SC_SNR) + && + (base.scalable_mode!=SC_DP) ) + { + Error("unsupported scalability mode\n"); + } /* force MPEG-1 parameters for proper decoder behavior */ /* see ISO/IEC 13818-2 section D.9.14 */ - if (!base.MPEG2_Flag) + if ( !base.MPEG2_Flag ) { progressive_sequence = 1; progressive_frame = 1; @@ -144,39 +103,39 @@ static void Initialize_Sequence() for (cc=0; cc<3; cc++) { - if (cc==0) + if ( cc==0 ) size = Coded_Picture_Width*Coded_Picture_Height; else size = Chroma_Width*Chroma_Height; - if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size))) + if ( !(backward_reference_frame[cc] = (unsigned char *)malloc(size)) ) Error("backward_reference_frame[] malloc failed\n"); - if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size))) + if ( !(forward_reference_frame[cc] = (unsigned char *)malloc(size)) ) Error("forward_reference_frame[] malloc failed\n"); - if (!(auxframe[cc] = (unsigned char *)malloc(size))) + if ( !(auxframe[cc] = (unsigned char *)malloc(size)) ) Error("auxframe[] malloc failed\n"); - if(Ersatz_Flag) - if (!(substitute_frame[cc] = (unsigned char *)malloc(size))) + if ( Ersatz_Flag ) + if ( !(substitute_frame[cc] = (unsigned char *)malloc(size)) ) Error("substitute_frame[] malloc failed\n"); - if (base.scalable_mode==SC_SPAT) + if ( base.scalable_mode==SC_SPAT ) { /* this assumes lower layer is 4:2:0 */ - if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) + if ( !(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) Error("llframe0 malloc failed\n"); - if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) + if ( !(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1)))) Error("llframe1 malloc failed\n"); } } /* SCALABILITY: Spatial */ - if (base.scalable_mode==SC_SPAT) + if ( base.scalable_mode==SC_SPAT ) { - if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short)))) + if ( !(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short)))) Error("lltmp malloc failed\n"); } @@ -189,57 +148,19 @@ static void Initialize_Sequence() #endif /* DISPLAY */ } -static int video_sequence(int *Bitstream_Framenumber) -//int *Bitstream_Framenumber; -{ - int Bitstream_Framenum; - int Sequence_Framenum; - int Return_Value; - - Bitstream_Framenum = *Bitstream_Framenumber; - Sequence_Framenum=0; - - Initialize_Sequence(); - - /* decode picture whose header has already been parsed in - Decode_Bitstream() */ - - - Decode_Picture(Bitstream_Framenum, Sequence_Framenum); - - /* update picture numbers */ - if (!Second_Field) - { - Bitstream_Framenum++; - Sequence_Framenum++; - } - - /* loop through the rest of the pictures in the sequence */ - while ((Return_Value=Headers())) - { - Decode_Picture(Bitstream_Framenum, Sequence_Framenum); - - if (!Second_Field) - { - Bitstream_Framenum++; - Sequence_Framenum++; - } - } - - /* put last frame */ - if (Sequence_Framenum!=0) - { - Output_Last_Frame_of_Sequence(Bitstream_Framenum); - } - Deinitialize_Sequence(); - -#ifdef VERIFY - Clear_Verify_Headers(); -#endif /* VERIFY */ +extern void Error(char *text) +{ + fprintf(stderr,text); + exit(1); +} - *Bitstream_Framenumber = Bitstream_Framenum; - return(Return_Value); +/* Trace_Flag output */ +void Print_Bits(int code, int bits, int len) +{ + int i; + for (i=0; i>(bits-1-i))&1); } static int Headers() @@ -247,8 +168,7 @@ static int Headers() int ret; ld = &base; - - + /* return when end of sequence (0) or picture header has been parsed (1) */ @@ -281,7 +201,7 @@ static int Decode_Bitstream() ret = Headers(); - if(ret==1) + if ( ret==1 ) { ret = video_sequence(&Bitstream_Framenum); } @@ -292,28 +212,90 @@ static int Decode_Bitstream() } -/* IMPLEMENTATION specific routines */ -static void Initialize_Decoder() +static void Deinitialize_Sequence() { int i; - /* Clip table */ - if (!(Clip=(unsigned char *)malloc(1024))) - Error("Clip[] malloc failed\n"); + /* clear flags */ + base.MPEG2_Flag=0; - Clip += 384; + for(i=0;i<3;i++) + { + free(backward_reference_frame[i]); + free(forward_reference_frame[i]); + free(auxframe[i]); - for (i=-384; i<640; i++) - Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i); + if ( base.scalable_mode==SC_SPAT ) + { + free(llframe0[i]); + free(llframe1[i]); + } + } - /* IDCT */ - if (Reference_IDCT_Flag) - Initialize_Reference_IDCT(); - else - Initialize_Fast_IDCT(); + if ( base.scalable_mode==SC_SPAT ) + free(lltmp); +#ifdef DISPLAY + if ( Output_Type==T_X11 ) + Terminate_Display_Process(); +#endif } +static int video_sequence(int *Bitstream_Framenumber) +{ + int Bitstream_Framenum; + int Sequence_Framenum; + int Return_Value; + + Bitstream_Framenum = *Bitstream_Framenumber; + Sequence_Framenum=0; + + Initialize_Sequence(); + + /* decode picture whose header has already been parsed in + Decode_Bitstream() */ + + + Decode_Picture(Bitstream_Framenum, Sequence_Framenum); + + /* update picture numbers */ + if ( !Second_Field ) + { + Bitstream_Framenum++; + Sequence_Framenum++; + } + + /* loop through the rest of the pictures in the sequence */ + while ((Return_Value=Headers())) + { + Decode_Picture(Bitstream_Framenum, Sequence_Framenum); + + if ( !Second_Field ) + { + Bitstream_Framenum++; + Sequence_Framenum++; + } + } + + /* put last frame */ + if (Sequence_Framenum!=0) + { + Output_Last_Frame_of_Sequence(Bitstream_Framenum); + } + + Deinitialize_Sequence(); + +#ifdef VERIFY + Clear_Verify_Headers(); +#endif /* VERIFY */ + + *Bitstream_Framenumber = Bitstream_Framenum; + return(Return_Value); +} +} // End "C" extern + +namespace gdcm +{ /** * \brief routine for MPEG decompression * @param fp pointer to an already open file descriptor @@ -322,75 +304,46 @@ static void Initialize_Decoder() * @param length length * @return 1 on success, 0 on error */ -bool ReadMPEGFile (std::ifstream *fp, char *image_buffer, size_t length) +bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length) { - std::streampos mpeg_start = fp->tellg(); // the MPEG stream in our case does not start at 0 + int ret, code; + #if 0 fp->read((char*)image_buffer, length); - std::ofstream out("/tmp/etiam.mpeg"); + ofstream out("/tmp/etiam.mpeg"); out.write((char*)image_buffer, length); out.close(); -#else - (void)length; #endif - int ret, code; - istream bos,eos; - /*base.open_stream = my_open;*/ - base.seek_stream = my_seek; - base.read_stream = my_read; - base.close_stream = my_close; - - Verbose_Flag = 0; - Output_Type = T_MEM; //store in mem - Output_Picture_Filename = "/tmp/rec%d"; - hiQdither = 0; - Frame_Store_Flag = 1; - Spatial_Flag = 0; - Lower_Layer_Picture_Filename = ""; - Reference_IDCT_Flag = 1; - Trace_Flag = 0; - Quiet_Flag = 0; - Ersatz_Flag = 0; - Substitute_Picture_Filename = ""; - Two_Streams = 0; - Enhancement_Layer_Bitstream_Filename = ""; - Big_Picture_Flag = 0; - Main_Bitstream_Flag = 1; - Main_Bitstream_Filename = "/tmp/etiam.mpeg"; - Main_Bitstream_Filename = "/tmp/ts.mpg"; - Verify_Flag = 0; - Stats_Flag = 0; - User_Data_Flag = 0; - OUTMEM = (char*)image_buffer; +// Clear_Options(); + /* decode command line arguments */ +// Process_Options(argc,argv); + +#ifdef DEBUG + Print_Options(); +#endif ld = &base; /* select base layer context */ /* open MPEG base layer bitstream file(s) */ /* NOTE: this is either a base layer stream or a spatial enhancement stream */ -/* if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0) */ - /*base.Infile = ld->open_stream(Main_Bitstream_Filename);*/ - base.Infile = &bos; -#ifdef FILESTAR - //base.Infile->InFd = fopen(Main_Bitstream_Filename, "rb"); - //base.Infile->InFd.open(Main_Bitstream_Filename, std::ios::binary | std::ios::in); - base.Infile->InFd = fp; -#else - base.Infile->InFd = open(Main_Bitstream_Filename,O_RDONLY|O_BINARY ); -#endif - if( !base.Infile->InFd) +#if 0 + if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0) { fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename); exit(1); } +#else + base.Infile = -1; //DEBUG +#endif - if(base.Infile != 0) + if ( base.Infile != 0 ) { - Initialize_Buffer(); - - if(Show_Bits(8)==0x47) + Initialize_Buffer(); + + if ( Show_Bits(8)==0x47 ) { sprintf(Error_Text,"Decoder currently does not parse transport streams\n"); Error(Error_Text); @@ -414,34 +367,25 @@ bool ReadMPEGFile (std::ifstream *fp, char *image_buffer, size_t length) break; } - /*lseek(base.Infile, 0l, SEEK_SET);*/ - ld->seek_stream(base.Infile,mpeg_start,SEEK_SET); + //lseek(base.Infile, 0l, SEEK_SET); + //fp->seekg(mpeg_start, ios_base::beg); Initialize_Buffer(); } - if(base.Infile!=0) + if ( base.Infile!=0 ) { - /*lseek(base.Infile, 0l, SEEK_SET);*/ - ld->seek_stream(base.Infile,mpeg_start,SEEK_SET); + //lseek(base.Infile, 0l, SEEK_SET); + //fp->seekg(mpeg_start, ios_base::beg); } Initialize_Buffer(); - if(Two_Streams) + if ( Two_Streams ) { + abort(); ld = &enhan; /* select enhancement layer context */ - /*if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)*/ - /*enhan.Infile = ld->open_stream(Enhancement_Layer_Bitstream_Filename);*/ - enhan.Infile = &eos; -#ifdef FILESTAR - //enhan.Infile->InFd = fopen(Main_Bitstream_Filename, "rb"); - enhan.Infile->InFd->open(Main_Bitstream_Filename, std::ios::binary|std::ios::in); - abort(); -#else - enhan.Infile->InFd = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY); -#endif - if (enhan.Infile->InFd) + if ( (enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0) { sprintf(Error_Text,"enhancment layer bitstream file %s not found\n", Enhancement_Layer_Bitstream_Filename); @@ -457,20 +401,13 @@ bool ReadMPEGFile (std::ifstream *fp, char *image_buffer, size_t length) ret = Decode_Bitstream(); - /*close(base.Infile);*/ - ld->close_stream(base.Infile); - - if (Two_Streams) - /*close(enhan.Infile);*/ - ld->close_stream(enhan.Infile); + //close(base.Infile); - DeInitialize_Decoder(); - -#if 0 - std::ofstream out2("/tmp/etiam.raw"); - out2.write((char*)image_buffer, 352*240*3*10); - out2.close(); -#endif + if ( Two_Streams ) + { + abort(); + close(enhan.Infile); + } return ret; } diff --git a/src/gdcmPixelWriteConvert.cxx b/src/gdcmPixelWriteConvert.cxx index 94359049..fe6b870e 100644 --- a/src/gdcmPixelWriteConvert.cxx +++ b/src/gdcmPixelWriteConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelWriteConvert.cxx,v $ Language: C++ - Date: $Date: 2007/07/13 08:17:21 $ - Version: $Revision: 1.14 $ + Date: $Date: 2007/08/21 12:51:10 $ + 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 @@ -195,8 +195,8 @@ void UpdateBasicOffsetTable(std::ostream *fp, JpegVector const &v, size_t pos) { const JpegPair &jp = *i; if(i == v.begin() ){ assert( jp.first - first.first == 0); } - uint32_t offset = jp.first - first.first; - GDCM_NAME_SPACE::binary_write(*fp, offset); + uint32_t offset = (uint32_t)(jp.first - first.first); + gdcm::binary_write(*fp, offset); //std::cerr << "Updating Table:" << jp.first - first.first << std::endl; } } @@ -273,7 +273,7 @@ void PixelWriteConvert::SetCompressJPEG2000UserData(uint8_t *data, size_t size, size_t end = of->tellp(); //static int i = 0; JpegPair &jp = JpegFragmentSize[i]; - jp.second = end-beg; + jp.second = (uint32_t)(end-beg); if( ((end-beg) % 2) ) { of->put( '\0' ); @@ -294,7 +294,7 @@ void PixelWriteConvert::SetCompressJPEG2000UserData(uint8_t *data, size_t size, UserData = new uint8_t[of_size]; memcpy(UserData, of->str().c_str(), of_size); UserDataSize = of_size; - + delete of; } bool gdcm_write_JPEG_file8 (std::ostream *fp, char *inputdata, size_t inputlength, @@ -369,7 +369,7 @@ void PixelWriteConvert::SetCompressJPEGUserData(uint8_t *data, size_t size, File size_t end = of->tellp(); //static int i = 0; JpegPair &jp = JpegFragmentSize[i]; - jp.second = end-beg; + jp.second = (uint32_t)(end-beg); if( ((end-beg) % 2) ) { of->put( '\0' ); @@ -399,8 +399,7 @@ void PixelWriteConvert::SetCompressJPEGUserData(uint8_t *data, size_t size, File UserData = new uint8_t[of_size]; memcpy(UserData, of->str().c_str(), of_size); UserDataSize = of_size; - - std::cerr << "Sortie ds PixelWriteConvert::SetCompressJPEGUserData" << std::endl; + delete of; } diff --git a/src/gdcmValidator.cxx b/src/gdcmValidator.cxx index 98f79252..23bdfe46 100644 --- a/src/gdcmValidator.cxx +++ b/src/gdcmValidator.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmValidator.cxx,v $ Language: C++ - Date: $Date: 2007/05/23 14:18:12 $ - Version: $Revision: 1.15 $ + Date: $Date: 2007/08/21 12:51:10 $ + Version: $Revision: 1.16 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -79,10 +79,10 @@ DocEntry *d; grHT[d->GetGroup()] = 0; d=input->GetNextEntry(); } - for (GroupHT::iterator it = grHT.begin(); it != grHT.end(); ++it) + for (GroupHT::iterator it = grHT.begin(); it != grHT.end(); ++it) { std::cout << std::hex << it->first << std::endl; - } + } */ // berk for now SetInput do two things at the same time @@ -95,28 +95,28 @@ DocEntry *d; while(d) { if ( DataEntry *v = dynamic_cast(d) ) - { + { if ( v->GetVM() != GDCM_NAME_SPACE::GDCM_UNKNOWN ) if ( !CheckVM(v) ) { if (v->GetVM() == "FIXME" ) std::cout << "For Tag " << v->GetKey() << " VM = [" << v->GetVM() << "]" << std::endl; - + std::cout << "Tag (" << v->GetKey() - << ")-> [" << v->GetName() << "] VR :" << v->GetVR() + << ")-> [" << v->GetName() << "] VR :" << v->GetVR() << " contains an illegal VM. Expected VM :[" - << v->GetVM() << "], value [" << v->GetString() << "]" + << v->GetVM() << "], value [" << v->GetString() << "]" << std::endl; } - + if ( v->GetReadLength() % 2 ) { - std::cout << "Tag (" << v->GetKey() + std::cout << "Tag (" << v->GetKey() << ")-> [" << v->GetName() << "] has an uneven length :" << v->GetReadLength() - << " [" << v->GetString() << "] " - << std::endl; + << " [" << v->GetString() << "] " + << std::endl; } } else -- 2.45.1