Main Page | File List | Related Pages

gdcmParsePixels.cxx

00001 // gdcmParse.cxx
00002 //-----------------------------------------------------------------------------
00003 //This is needed when compiling in debug mode
00004 #ifdef _MSC_VER
00005 // 'type' : forcing value to bool 'true' or 'false' (performance warning)
00006 //#pragma warning ( disable : 4800 )
00007 // 'identifier' : class 'type' needs to have dll-interface to be used by
00008 // clients of class 'type2'
00009 #pragma warning ( disable : 4251 )
00010 // 'identifier' : identifier was truncated to 'number' characters in the
00011 // debug information
00012 #pragma warning ( disable : 4786 )
00013 #endif //_MSC_VER
00014 
00015 #include "gdcmFile.h"
00016 #include "gdcmUtil.h"
00017 
00018 #define str2num(str, typeNum) *((typeNum *)(str))
00019 
00020 //-----------------------------------------------------------------------------
00030 bool gdcmFile::ParsePixelData(void) {
00031 // DO NOT remove the printf s.
00032 // The ONLY purpose of this method is to PRINT the content
00033    FILE *fp;
00034 
00035    if ( !(fp=Header->OpenFile()))
00036       return false;
00037       
00038     if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
00039       Header->CloseFile();
00040       return false;
00041    } 
00042    
00043    if ( !Header->IsDicomV3()                             ||
00044         Header->IsImplicitVRLittleEndianTransferSyntax() ||
00045         Header->IsExplicitVRLittleEndianTransferSyntax() ||
00046         Header->IsExplicitVRBigEndianTransferSyntax()    ||
00047         Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
00048         
00049         printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
00050         return false;       
00051    }        
00052 
00053    int nb;
00054    std::string str_nb=Header->GetEntryByNumber(0x0028,0x0100);
00055    if (str_nb == GDCM_UNFOUND ) {
00056       nb = 16;
00057    } else {
00058       nb = atoi(str_nb.c_str() );
00059       if (nb == 12) nb =16;
00060    }
00061    int nBytes= nb/8;
00062       
00063    int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel(); 
00064          
00065    printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
00066       
00067    guint16 ItemTagGr,ItemTagEl; 
00068    int ln;
00069    long ftellRes;
00070    char * destination = NULL;
00071 
00072   // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels 
00073 
00074    if( !Header->IsRLELossLessTransferSyntax()) {
00075 
00076       // JPEG Image
00077       ftellRes=ftell(fp);
00078       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
00079       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
00080       if(Header->GetSwapCode()) {
00081          ItemTagGr=Header->SwapShort(ItemTagGr); 
00082          ItemTagEl=Header->SwapShort(ItemTagEl);            
00083       }
00084       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
00085                 ftellRes,ItemTagGr,ItemTagEl );
00086       ftellRes=ftell(fp);
00087       fread(&ln,4,1,fp); 
00088       if(Header->GetSwapCode()) 
00089          ln=Header->SwapLong(ln);    // Basic Offset Table Item Length
00090       printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00091             ftellRes,ln,ln);
00092       if (ln != 0) {
00093          // What is it used for ??
00094          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
00095          fread(BasicOffsetTableItemValue,ln,1,fp); 
00096          guint32 a;
00097          for (int i=0;i<ln;i+=4){
00098             a=str2num(&BasicOffsetTableItemValue[i],guint32);
00099             printf("      x(%08x)  %d\n",a,a);
00100          }              
00101       }
00102       
00103       ftellRes=ftell(fp);
00104       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
00105       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
00106       if(Header->GetSwapCode()) {
00107          ItemTagGr=Header->SwapShort(ItemTagGr); 
00108          ItemTagEl=Header->SwapShort(ItemTagEl);            
00109       }  
00110       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00111             ftellRes,ItemTagGr,ItemTagEl );
00112       
00113       while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
00114       
00115          ftellRes=ftell(fp);
00116          fread(&ln,4,1,fp); 
00117          if(Header->GetSwapCode()) 
00118             ln=Header->SwapLong(ln);    // length
00119          printf("      at %x : fragment length %d x(%08x)\n",
00120                 ftellRes, ln,ln);
00121 
00122         // destination += taille * nBytes; // location in user's memory        
00123         //printf ("      Destination will be x(%x) = %d \n",
00124         //     destination,destination );
00125 
00126          // ------------------------                                     
00127          fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels    
00128          // ------------------------              
00129      
00130          ftellRes=ftell(fp);
00131          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
00132          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
00133          if(Header->GetSwapCode()) {
00134             ItemTagGr=Header->SwapShort(ItemTagGr); 
00135             ItemTagEl=Header->SwapShort(ItemTagEl);            
00136          }
00137          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00138                ftellRes,ItemTagGr,ItemTagEl );
00139       } 
00140 
00141    } else {
00142 
00143       // RLE Image
00144       long RleSegmentLength[15],fragmentLength;
00145       guint32 nbRleSegments;
00146       guint32 RleSegmentOffsetTable[15];
00147       ftellRes=ftell(fp);
00148       // Basic Offset Table with Item Value
00149          // Item Tag
00150       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
00151       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
00152       if(Header->GetSwapCode()) {
00153          ItemTagGr=Header->SwapShort(ItemTagGr); 
00154          ItemTagEl=Header->SwapShort(ItemTagEl);            
00155       }
00156       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
00157                 ftellRes,ItemTagGr,ItemTagEl );
00158          // Item Length
00159       ftellRes=ftell(fp);
00160       fread(&ln,4,1,fp); 
00161       if(Header->GetSwapCode()) 
00162          ln=Header->SwapLong(ln);    // Basic Offset Table Item Length
00163       printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00164             ftellRes,ln,ln);
00165       if (ln != 0) {
00166          // What is it used for ??
00167          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
00168          fread(BasicOffsetTableItemValue,ln,1,fp); 
00169          guint32 a;
00170          for (int i=0;i<ln;i+=4){
00171             a=str2num(&BasicOffsetTableItemValue[i],guint32);
00172             printf("      x(%08x)  %d\n",a,a);
00173          }              
00174       }
00175 
00176       ftellRes=ftell(fp);
00177       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
00178       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
00179       if(Header->GetSwapCode()) {
00180          ItemTagGr=Header->SwapShort(ItemTagGr); 
00181          ItemTagEl=Header->SwapShort(ItemTagEl);            
00182       }  
00183       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00184             ftellRes,ItemTagGr,ItemTagEl );
00185 
00186       // while 'Sequence Delimiter Item' (fffe,e0dd) not found
00187       while (  ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { 
00188       // Parse fragments of the current Fragment (Frame)    
00189          ftellRes=ftell(fp);
00190          fread(&fragmentLength,4,1,fp); 
00191          if(Header->GetSwapCode()) 
00192             fragmentLength=Header->SwapLong(fragmentLength);    // length
00193          printf("      at %x : 'fragment' length %d x(%08x)\n",
00194                 ftellRes, fragmentLength,fragmentLength);
00195                        
00196           //------------------ scanning (not reading) fragment pixels
00197  
00198          fread(&nbRleSegments,4,1,fp);  // Reading : Number of RLE Segments
00199          if(Header->GetSwapCode()) 
00200             nbRleSegments=Header->SwapLong(nbRleSegments);
00201             printf("   Nb of RLE Segments : %d\n",nbRleSegments);
00202  
00203          for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
00204             ftellRes=ftell(fp);
00205             fread(&RleSegmentOffsetTable[k],4,1,fp);
00206             if(Header->GetSwapCode())
00207                RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
00208             printf("        at : %x Offset Segment %d : %d (%x)\n",
00209                     ftellRes,k,RleSegmentOffsetTable[k],
00210                     RleSegmentOffsetTable[k]);
00211          }
00212 
00213           if (nbRleSegments>1) { // skipping (not reading) RLE Segments
00214              for(int k=1; k<=nbRleSegments-1; k++) { 
00215                 RleSegmentLength[k]=   RleSegmentOffsetTable[k+1]
00216                                      - RleSegmentOffsetTable[k];
00217                 ftellRes=ftell(fp);
00218                 printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
00219                            k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
00220                 fseek(fp,RleSegmentLength[k],SEEK_CUR);    
00221              }
00222           }
00223           RleSegmentLength[nbRleSegments]= fragmentLength 
00224                                          - RleSegmentOffsetTable[nbRleSegments];
00225           ftellRes=ftell(fp);
00226           printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
00227                            nbRleSegments,RleSegmentLength[nbRleSegments],
00228                            RleSegmentLength[nbRleSegments],ftellRes);
00229 
00230           fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR); 
00231             
00232          // ------------------ end of scanning fragment pixels        
00233       
00234          ftellRes=ftell(fp);
00235          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
00236          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
00237          if(Header->GetSwapCode()) {
00238             ItemTagGr=Header->SwapShort(ItemTagGr); 
00239             ItemTagEl=Header->SwapShort(ItemTagEl);            
00240          }
00241          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00242                ftellRes,ItemTagGr,ItemTagEl );
00243       } 
00244    }
00245    return true;            
00246 }
00247 
00248 //-----------------------------------------------------------------------------

Generated on Mon Feb 14 16:13:44 2005 for gdcm by doxygen 1.3.6