]> Creatis software - gdcm.git/blobdiff - src/gdcmPixelReadConvert.cxx
Solve (hope so!) the JPEG troubles when BitsStored == 8 && BitsAllocated==16
[gdcm.git] / src / gdcmPixelReadConvert.cxx
index 32a8f81dfa4bb3d4573e4f0c14ae45964f527d99..c8aec3dfaefcb0fb087fc9d7fd84ad327ba25578 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2006/03/29 16:09:48 $
-  Version:   $Revision: 1.111 $
+  Date:      $Date: 2007/09/04 13:14:33 $
+  Version:   $Revision: 1.119 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -32,7 +32,7 @@
    #include <mem.h> // for memset
 #endif 
 
-namespace gdcm
+namespace GDCM_NAME_SPACE
 {
 
 //bool ReadMPEGFile (std::ifstream *fp, char *inputdata, size_t lenght); 
@@ -85,6 +85,7 @@ bool PixelReadConvert::IsRawRGB()
 /**
  * \brief Gets various usefull informations from the file header
  * @param file gdcm::File pointer
+ * @param fileHelper gdcm::FileHelper pointer 
  */
 void PixelReadConvert::GrabInformationsFromFile( File *file,
                                                  FileHelper *fileHelper )
@@ -97,6 +98,10 @@ void PixelReadConvert::GrabInformationsFromFile( File *file,
       BitsAllocated = 16;
    }
 
+   else if (BitsAllocated > 8 && BitsAllocated < 16 && BitsAllocated != 12)
+   {
+      BitsAllocated = 16;
+   }   
    // Number of "Bits Stored", defaulted to number of "Bits Allocated"
    // when absent from the file.
    BitsStored = file->GetBitsStored();
@@ -165,7 +170,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file,
             if( IsJPEG2000      = Global::GetTS()->IsJPEG2000(ts) )     break;
             if( IsMPEG          = Global::GetTS()->IsMPEG(ts) )         break;
             if( IsJPEGLS        = Global::GetTS()->IsJPEGLS(ts) )       break;
-            // DeflatedExplicitVRLittleEndian is considered as 'Unexpected' (we don't know yet haow to process !)
+            // DeflatedExplicitVRLittleEndian is considered as 'Unexpected' (we don't know yet how to process !)
             gdcmWarningMacro("Unexpected Transfer Syntax :[" << ts << "]");
             break;
          } 
@@ -271,7 +276,8 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    unsigned int count = 0;
    unsigned int frameSize;
    unsigned int bitsAllocated = BitsAllocated;
-   if(bitsAllocated == 12)
+   //if(bitsAllocated == 12)
+   if(bitsAllocated > 8 && bitsAllocated < 16)
       bitsAllocated = 16;
    frameSize = XSize*YSize*SamplesPerPixel*bitsAllocated/8;
    
@@ -588,8 +594,15 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
      // Precompute the offset localRaw will be shifted with
      int length = XSize * YSize * ZSize * SamplesPerPixel;
      int numberBytes = BitsAllocated / 8;
-
-     JPEGInfo->DecompressFromFile(fp, Raw, BitsStored, numberBytes, length );
+      
+      // to avoid major troubles when BitsStored == 8 && BitsAllocated==16 !
+     int dummy;
+     if (BitsStored == 8 && BitsAllocated==16)
+        dummy = 16;
+     else
+        dummy = BitsStored;
+     
+     JPEGInfo->DecompressFromFile(fp, Raw, /*BitsStored*/ dummy , numberBytes, length );
      return true;
    }
 }
@@ -963,6 +976,7 @@ void PixelReadConvert::ConvertReorderEndianity()
      && BitsStored < BitsAllocated
      && !PixelSign )
    {
+      int l = (int)( RawSize / ( BitsAllocated / 8 ) );
       int l = (int)( RawSize / ( BitsAllocated / 8 ) );
       uint16_t *deb = (uint16_t *)Raw;
       for(int i = 0; i<l; i++)
@@ -1059,20 +1073,26 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
       {
          // pmask : to mask the 'unused bits' (may contain overlays)
          uint16_t pmask = 0xffff;
-         pmask = pmask >> ( BitsAllocated - BitsStored );
+         // It's up to the user to remove overlays if any),
+         // not to gdcm, witout asking !
+         //pmask = pmask >> ( BitsAllocated - BitsStored );
 
          uint16_t *deb = (uint16_t*)Raw;
 
          if ( !PixelSign )  // Pixels are unsigned
          {
             for(int i = 0; i<l; i++)
-            {   
-               *deb = (*deb >> (BitsStored - HighBitPosition - 1)) & pmask;
+            {  
+              //                                                save CPU time
+               *deb = (*deb >> (BitsStored - HighBitPosition - 1))/* & pmask */;
                deb++;
             }
          }
          else // Pixels are signed
          {
+            // Hope there is never A
             // smask : to check the 'sign' when BitsStored != BitsAllocated
             uint16_t smask = 0x0001;
             smask = smask << ( 16 - (BitsAllocated - BitsStored + 1) );
@@ -1097,10 +1117,17 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
       }
       else if ( BitsAllocated == 32 )
       {
+               }
+               deb++;
+            }
+         }
+      }
+      else if ( BitsAllocated == 32 )
+      { 
          // pmask : to mask the 'unused bits' (may contain overlays)
          uint32_t pmask = 0xffffffff;
          pmask = pmask >> ( BitsAllocated - BitsStored );
-
          uint32_t *deb = (uint32_t*)Raw;
 
          if ( !PixelSign )
@@ -1125,8 +1152,8 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
                *deb = *deb >> (BitsStored - HighBitPosition - 1);
                if ( *deb & smask )
                   *deb = *deb | nmask;
-               else
-                  *deb = *deb & pmask;
+               else                
+                 *deb = *deb & pmask; 
                deb++;
             }
          }
@@ -1345,7 +1372,10 @@ void PixelReadConvert::ComputeRawAndRGBSizes()
    else
    {
       RGBSize = RawSize;
+      
    }
+   RawSize += RawSize%2;
+   RGBSize += RGBSize%2;
 }
 
 /// Allocates room for RGB Pixels
@@ -1516,13 +1546,6 @@ of 12 for the third value and a max of 0xfff).
 
 Since almost every vendor that I have encountered that encodes LUTs
 makes this mistake, perhaps it is time to amend the standard to warn
-implementor's of receivers and/or sanction this bad behavior. We have
-talked about this in the past in WG 6 but so far everyone has been
-reluctant to write into the standard such a comment. Maybe it is time
-to try again, since if one is not aware of this problem, one cannot
-effectively implement display using VOI LUTs, and there is a vast
-installed base to contend with.
-
 I did not check presentation states, in which VOI LUTs could also be
 encountered, for the prevalence of this mistake, nor did I look at the
 encoding of Modality LUT's, which are unusual. Nor did I check digital