]> Creatis software - gdcm.git/blob - src/gdcmParse.cxx
d618c3156c63752c30667ecfeef5588d8ae72e50
[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 // DO NOT remove the printf s.
33 // The ONLY purpose of this methos is to PRINT the content
34
35    FILE *fp;
36
37    if ( !(fp=Header->OpenFile()))
38       return false;
39       
40     if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
41       Header->CloseFile();
42       return false;
43    } 
44    
45    if ( !Header->IsDicomV3()                             ||
46         Header->IsImplicitVRLittleEndianTransferSyntax() ||
47         Header->IsExplicitVRLittleEndianTransferSyntax() ||
48         Header->IsExplicitVRBigEndianTransferSyntax()    ||
49         Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
50         
51         printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
52         return false;       
53    }        
54
55    int nb;
56    std::string str_nb=Header->GetPubElValByNumber(0x0028,0x0100);
57    if (str_nb == GDCM_UNFOUND ) {
58       nb = 16;
59    } else {
60       nb = atoi(str_nb.c_str() );
61       if (nb == 12) nb =16;
62    }
63    int nBytes= nb/8;
64       
65    int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel(); 
66          
67    printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
68       
69    guint16 ItemTagGr,ItemTagEl; 
70    int ln;
71    long ftellRes;
72    char * destination = NULL;
73
74   // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels 
75
76    if( !Header->IsRLELossLessTransferSyntax()) {
77
78       // JPEG Image
79       ftellRes=ftell(fp);
80       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
81       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
82       if(Header->GetSwapCode()) {
83          ItemTagGr=Header->SwapShort(ItemTagGr); 
84          ItemTagEl=Header->SwapShort(ItemTagEl);            
85       }
86       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
87                 ftellRes,ItemTagGr,ItemTagEl );
88       ftellRes=ftell(fp);
89       fread(&ln,4,1,fp); 
90       if(Header->GetSwapCode()) 
91          ln=Header->SwapLong(ln);    // Basic Offset Table Item Lentgh
92       printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
93             ftellRes,ln,ln);
94       if (ln != 0) {
95          // What is it used for ??
96          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
97          fread(BasicOffsetTableItemValue,ln,1,fp); 
98          guint32 a;
99          for (int i=0;i<ln;i+=4){
100             a=str2num(&BasicOffsetTableItemValue[i],guint32);
101             printf("      x(%08x)  %d\n",a,a);
102          }              
103       }
104       
105       ftellRes=ftell(fp);
106       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
107       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
108       if(Header->GetSwapCode()) {
109          ItemTagGr=Header->SwapShort(ItemTagGr); 
110          ItemTagEl=Header->SwapShort(ItemTagEl);            
111       }  
112       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
113             ftellRes,ItemTagGr,ItemTagEl );
114       
115       while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
116       
117          ftellRes=ftell(fp);
118          fread(&ln,4,1,fp); 
119          if(Header->GetSwapCode()) 
120             ln=Header->SwapLong(ln);    // length
121          printf("      at %x : fragment length %d x(%08x)\n",
122                 ftellRes, ln,ln);
123
124         // destination += taille * nBytes; // location in user's memory        
125         //printf ("      Destination will be x(%x) = %d \n",
126         //     destination,destination );
127
128          // ------------------------                                     
129          fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels    
130          // ------------------------              
131      
132          ftellRes=ftell(fp);
133          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
134          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
135          if(Header->GetSwapCode()) {
136             ItemTagGr=Header->SwapShort(ItemTagGr); 
137             ItemTagEl=Header->SwapShort(ItemTagEl);            
138          }
139          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
140                ftellRes,ItemTagGr,ItemTagEl );
141       } 
142
143    } else {
144
145       // RLE Image
146       long RleSegmentLength[15],fragmentLength;
147       guint32 nbRleSegments;
148       guint32 RleSegmentOffsetTable[15];
149       ftellRes=ftell(fp);
150       // Basic Offset Table with Item Value
151          // Item Tag
152       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
153       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
154       if(Header->GetSwapCode()) {
155          ItemTagGr=Header->SwapShort(ItemTagGr); 
156          ItemTagEl=Header->SwapShort(ItemTagEl);            
157       }
158       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
159                 ftellRes,ItemTagGr,ItemTagEl );
160          // Item Length
161       ftellRes=ftell(fp);
162       fread(&ln,4,1,fp); 
163       if(Header->GetSwapCode()) 
164          ln=Header->SwapLong(ln);    // Basic Offset Table Item Lentgh
165       printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
166             ftellRes,ln,ln);
167       if (ln != 0) {
168          // What is it used for ??
169          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
170          fread(BasicOffsetTableItemValue,ln,1,fp); 
171          guint32 a;
172          for (int i=0;i<ln;i+=4){
173             a=str2num(&BasicOffsetTableItemValue[i],guint32);
174             printf("      x(%08x)  %d\n",a,a);
175          }              
176       }
177
178       ftellRes=ftell(fp);
179       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
180       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
181       if(Header->GetSwapCode()) {
182          ItemTagGr=Header->SwapShort(ItemTagGr); 
183          ItemTagEl=Header->SwapShort(ItemTagEl);            
184       }  
185       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
186             ftellRes,ItemTagGr,ItemTagEl );
187
188       // while 'Sequence Delimiter Item' (fffe,e0dd) not found
189       while (  ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { 
190       // Parse fragments of the current Fragment (Frame)    
191          ftellRes=ftell(fp);
192          fread(&fragmentLength,4,1,fp); 
193          if(Header->GetSwapCode()) 
194             fragmentLength=Header->SwapLong(fragmentLength);    // length
195          printf("      at %x : 'fragment' length %d x(%08x)\n",
196                 ftellRes, fragmentLength,fragmentLength);
197                        
198           //------------------ scanning (not reading) fragment pixels
199  
200          fread(&nbRleSegments,4,1,fp);  // Reading : Number of RLE Segments
201          if(Header->GetSwapCode()) 
202             nbRleSegments=Header->SwapLong(nbRleSegments);
203             printf("   Nb of RLE Segments : %d\n",nbRleSegments);
204  
205          for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
206             ftellRes=ftell(fp);
207             fread(&RleSegmentOffsetTable[k],4,1,fp);
208             if(Header->GetSwapCode())
209                RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
210             printf("        at : %x Offset Segment %d : %d (%x)\n",
211                     ftellRes,k,RleSegmentOffsetTable[k],
212                     RleSegmentOffsetTable[k]);
213          }
214
215           if (nbRleSegments>1) { // skipping (not reading) RLE Segments
216              for(int k=1; k<=nbRleSegments-1; k++) { 
217                 RleSegmentLength[k]=   RleSegmentOffsetTable[k+1]
218                                      - RleSegmentOffsetTable[k];
219                 ftellRes=ftell(fp);
220                 printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
221                            k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
222                 fseek(fp,RleSegmentLength[k],SEEK_CUR);    
223              }
224           }
225           RleSegmentLength[nbRleSegments]= fragmentLength 
226                                          - RleSegmentOffsetTable[nbRleSegments];
227           ftellRes=ftell(fp);
228           printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
229                            nbRleSegments,RleSegmentLength[nbRleSegments],
230                            RleSegmentLength[nbRleSegments],ftellRes);
231
232           fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR); 
233             
234          // ------------------ end of scanning fragment pixels        
235       
236          ftellRes=ftell(fp);
237          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
238          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
239          if(Header->GetSwapCode()) {
240             ItemTagGr=Header->SwapShort(ItemTagGr); 
241             ItemTagEl=Header->SwapShort(ItemTagEl);            
242          }
243          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
244                ftellRes,ItemTagGr,ItemTagEl );
245       } 
246    }
247    return true;            
248 }