]> Creatis software - gdcm.git/blob - src/gdcmParse.cxx
* Modification to compile with the distutils.
[gdcm.git] / src / gdcmParse.cxx
1 // gdcmParse.cxx
2
3 //This is needed when compiling in debug mode
4 #ifdef _MSC_VER
5 // 'type' : forcing value to bool 'true' or 'false' (performance warning)
6 //#pragma warning ( disable : 4800 )
7 // 'identifier' : class 'type' needs to have dll-interface to be used by
8 // clients of class 'type2'
9 #pragma warning ( disable : 4251 )
10 // 'identifier' : identifier was truncated to 'number' characters in the
11 // debug information
12 #pragma warning ( disable : 4786 )
13 #endif //_MSC_VER
14
15 #include "gdcmFile.h"
16 #include "gdcmUtil.h"
17
18 #define str2num(str, typeNum) *((typeNum *)(str))
19
20 /////////////////////////////////////////////////////////////////
21 /**
22  * \ingroup gdcmFile
23  * \brief   Parse pixel data from disk and *prints* the result
24  * \        For multi-fragment Jpeg/Rle files checking purpose *only*
25  * \        Allows to 'see' if the file *does* conform
26  * \       (some of them do not)
27  * \        with Dicom Part 3, Annex A (PS 3.5-2003, page 58, page 85)
28  *
29  */
30 bool gdcmFile::ParsePixelData(void) {
31
32    FILE *fp;
33
34    if ( !(fp=Header->OpenFile()))
35       return false;
36       
37     if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
38       Header->CloseFile();
39       return false;
40    } 
41    
42    if ( !Header->IsDicomV3()                             ||
43         Header->IsImplicitVRLittleEndianTransferSyntax() ||
44         Header->IsExplicitVRLittleEndianTransferSyntax() ||
45         Header->IsExplicitVRBigEndianTransferSyntax()    ||
46         Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
47         
48         printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
49         return 0;       
50    }        
51
52    int nb;
53    std::string str_nb=Header->GetPubElValByNumber(0x0028,0x0100);
54    if (str_nb == GDCM_UNFOUND ) {
55       nb = 16;
56    } else {
57       nb = atoi(str_nb.c_str() );
58       if (nb == 12) nb =16;
59    }
60    int nBytes= nb/8;
61       
62    int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel(); 
63          
64    printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
65       
66    guint16 ItemTagGr,ItemTagEl; 
67    int ln;
68    long ftellRes;
69    char * destination = NULL;
70
71   // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels 
72
73    if( !Header->IsRLELossLessTransferSyntax()) {
74
75       // JPEG Image
76       ftellRes=ftell(fp);
77       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
78       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
79       if(Header->GetSwapCode()) {
80          ItemTagGr=Header->SwapShort(ItemTagGr); 
81          ItemTagEl=Header->SwapShort(ItemTagEl);            
82       }
83       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
84                 ftellRes,ItemTagGr,ItemTagEl );
85       ftellRes=ftell(fp);
86       fread(&ln,4,1,fp); 
87       if(Header->GetSwapCode()) 
88          ln=Header->SwapLong(ln);    // Basic Offset Table Item Lentgh
89       printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
90             ftellRes,ln,ln);
91       if (ln != 0) {
92          // What is it used for ??
93          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
94          fread(BasicOffsetTableItemValue,ln,1,fp); 
95          guint32 a;
96          for (int i=0;i<ln;i+=4){
97             a=str2num(&BasicOffsetTableItemValue[i],guint32);
98             printf("      x(%08x)  %d\n",a,a);
99          }              
100       }
101       
102       ftellRes=ftell(fp);
103       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
104       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
105       if(Header->GetSwapCode()) {
106          ItemTagGr=Header->SwapShort(ItemTagGr); 
107          ItemTagEl=Header->SwapShort(ItemTagEl);            
108       }  
109       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
110             ftellRes,ItemTagGr,ItemTagEl );
111       
112       while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
113       
114          ftellRes=ftell(fp);
115          fread(&ln,4,1,fp); 
116          if(Header->GetSwapCode()) 
117             ln=Header->SwapLong(ln);    // length
118          printf("      at %x : fragment length %d x(%08x)\n",
119                 ftellRes, ln,ln);
120
121         // destination += taille * nBytes; // location in user's memory        
122         //printf ("      Destination will be x(%x) = %d \n",
123         //     destination,destination );
124
125          // ------------------------                                     
126          fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels    
127          // ------------------------              
128      
129          ftellRes=ftell(fp);
130          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
131          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
132          if(Header->GetSwapCode()) {
133             ItemTagGr=Header->SwapShort(ItemTagGr); 
134             ItemTagEl=Header->SwapShort(ItemTagEl);            
135          }
136          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
137                ftellRes,ItemTagGr,ItemTagEl );
138       } 
139
140    } else {
141
142       // RLE Image
143       long RleSegmentLength[15],fragmentLength;
144       guint32 nbRleSegments;
145       guint32 RleSegmentOffsetTable[15];
146       ftellRes=ftell(fp);
147       // Basic Offset Table with Item Value
148          // Item Tag
149       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
150       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
151       if(Header->GetSwapCode()) {
152          ItemTagGr=Header->SwapShort(ItemTagGr); 
153          ItemTagEl=Header->SwapShort(ItemTagEl);            
154       }
155       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
156                 ftellRes,ItemTagGr,ItemTagEl );
157          // Item Length
158       ftellRes=ftell(fp);
159       fread(&ln,4,1,fp); 
160       if(Header->GetSwapCode()) 
161          ln=Header->SwapLong(ln);    // Basic Offset Table Item Lentgh
162       printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
163             ftellRes,ln,ln);
164       if (ln != 0) {
165          // What is it used for ??
166          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
167          fread(BasicOffsetTableItemValue,ln,1,fp); 
168          guint32 a;
169          for (int i=0;i<ln;i+=4){
170             a=str2num(&BasicOffsetTableItemValue[i],guint32);
171             printf("      x(%08x)  %d\n",a,a);
172          }              
173       }
174
175       ftellRes=ftell(fp);
176       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
177       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
178       if(Header->GetSwapCode()) {
179          ItemTagGr=Header->SwapShort(ItemTagGr); 
180          ItemTagEl=Header->SwapShort(ItemTagEl);            
181       }  
182       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
183             ftellRes,ItemTagGr,ItemTagEl );
184
185       // while 'Sequence Delimiter Item' (fffe,e0dd) not found
186       while (  ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { 
187       // Parse fragments of the current Fragment (Frame)    
188          ftellRes=ftell(fp);
189          fread(&fragmentLength,4,1,fp); 
190          if(Header->GetSwapCode()) 
191             fragmentLength=Header->SwapLong(fragmentLength);    // length
192          printf("      at %x : 'fragment' length %d x(%08x)\n",
193                 ftellRes, fragmentLength,fragmentLength);
194                        
195           //------------------ scanning (not reading) fragment pixels
196  
197          fread(&nbRleSegments,4,1,fp);  // Reading : Number of RLE Segments
198          if(Header->GetSwapCode()) 
199             nbRleSegments=Header->SwapLong(nbRleSegments);
200             printf("   Nb of RLE Segments : %d\n",nbRleSegments);
201  
202          for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
203             ftellRes=ftell(fp);
204             fread(&RleSegmentOffsetTable[k],4,1,fp);
205             if(Header->GetSwapCode())
206                RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
207             printf("        at : %x Offset Segment %d : %d (%x)\n",
208                     ftellRes,k,RleSegmentOffsetTable[k],
209                     RleSegmentOffsetTable[k]);
210          }
211
212           if (nbRleSegments>1) { // skipping (not reading) RLE Segments
213              for(int k=1; k<=nbRleSegments-1; k++) { 
214                 RleSegmentLength[k]=   RleSegmentOffsetTable[k+1]
215                                      - RleSegmentOffsetTable[k];
216                 ftellRes=ftell(fp);
217                 printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
218                            k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
219                 fseek(fp,RleSegmentLength[k],SEEK_CUR);    
220              }
221           }
222           RleSegmentLength[nbRleSegments]= fragmentLength 
223                                          - RleSegmentOffsetTable[nbRleSegments];
224           ftellRes=ftell(fp);
225           printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
226                            nbRleSegments,RleSegmentLength[nbRleSegments],
227                            RleSegmentLength[nbRleSegments],ftellRes);
228
229           fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR); 
230             
231          // ------------------ end of scanning fragment pixels        
232       
233          ftellRes=ftell(fp);
234          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
235          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
236          if(Header->GetSwapCode()) {
237             ItemTagGr=Header->SwapShort(ItemTagGr); 
238             ItemTagEl=Header->SwapShort(ItemTagEl);            
239          }
240          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
241                ftellRes,ItemTagGr,ItemTagEl );
242       } 
243    }
244    return 1;            
245 }