00001 
00002 
00003 
00004 #ifdef _MSC_VER
00005 
00006 
00007 
00008 
00009 #pragma warning ( disable : 4251 )
00010 
00011 
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 
00032 
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   
00073 
00074    if( !Header->IsRLELossLessTransferSyntax()) {
00075 
00076       
00077       ftellRes=ftell(fp);
00078       fread(&ItemTagGr,2,1,fp);  
00079       fread(&ItemTagEl,2,1,fp);  
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);    
00090       printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00091             ftellRes,ln,ln);
00092       if (ln != 0) {
00093          
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);  
00105       fread(&ItemTagEl,2,1,fp);  
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) ) { 
00114       
00115          ftellRes=ftell(fp);
00116          fread(&ln,4,1,fp); 
00117          if(Header->GetSwapCode()) 
00118             ln=Header->SwapLong(ln);    
00119          printf("      at %x : fragment length %d x(%08x)\n",
00120                 ftellRes, ln,ln);
00121 
00122         
00123         
00124         
00125 
00126          
00127          fseek(fp,ln,SEEK_CUR); 
00128          
00129      
00130          ftellRes=ftell(fp);
00131          fread(&ItemTagGr,2,1,fp);  
00132          fread(&ItemTagEl,2,1,fp);  
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       
00144       long RleSegmentLength[15],fragmentLength;
00145       guint32 nbRleSegments;
00146       guint32 RleSegmentOffsetTable[15];
00147       ftellRes=ftell(fp);
00148       
00149          
00150       fread(&ItemTagGr,2,1,fp);  
00151       fread(&ItemTagEl,2,1,fp);  
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          
00159       ftellRes=ftell(fp);
00160       fread(&ln,4,1,fp); 
00161       if(Header->GetSwapCode()) 
00162          ln=Header->SwapLong(ln);    
00163       printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00164             ftellRes,ln,ln);
00165       if (ln != 0) {
00166          
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);  
00178       fread(&ItemTagEl,2,1,fp);  
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       
00187       while (  ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { 
00188       
00189          ftellRes=ftell(fp);
00190          fread(&fragmentLength,4,1,fp); 
00191          if(Header->GetSwapCode()) 
00192             fragmentLength=Header->SwapLong(fragmentLength);    
00193          printf("      at %x : 'fragment' length %d x(%08x)\n",
00194                 ftellRes, fragmentLength,fragmentLength);
00195                        
00196           
00197  
00198          fread(&nbRleSegments,4,1,fp);  
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++) { 
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) { 
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          
00233       
00234          ftellRes=ftell(fp);
00235          fread(&ItemTagGr,2,1,fp);  
00236          fread(&ItemTagEl,2,1,fp);  
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