]> Creatis software - gdcm.git/blob - src/gdcmParse.cxx
gdcmHeaderHelper::GetNumberOfScalarComponents() added, to allow displaying RGB images...
[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 #include "iddcmjpeg.h" // for the 'LibIDO' Jpeg LossLess
18
19 #define str2num(str, typeNum) *((typeNum *)(str))
20
21 /////////////////////////////////////////////////////////////////
22 /**
23  * \ingroup gdcmFile
24  * \brief   Parse pixel data from disk and *prints* the result
25  * \        For multi-fragment Jpeg/Rle files checking purpose *only*
26  * \        Allows to 'see' if the file *does* conform
27  * \       (some of them do not)
28  * \        with Dicom Part 3, Annex A (PS 3.5-2003, page 58, page 85)
29  *
30  */
31 bool gdcmFile::ParsePixelData(void) {
32
33    if ( !OpenFile())
34       return false;
35       
36     if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) {
37       CloseFile();
38       return false;
39    } 
40    
41    if ( !IsDicomV3()                             ||
42         IsImplicitVRLittleEndianTransferSyntax() ||
43         IsExplicitVRLittleEndianTransferSyntax() ||
44         IsExplicitVRBigEndianTransferSyntax()    ||
45         IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
46         
47         printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
48         return 0;       
49    }        
50
51    int nb;
52    std::string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100);
53    if (str_nb == GDCM_UNFOUND ) {
54       nb = 16;
55    } else {
56       nb = atoi(str_nb.c_str() );
57       if (nb == 12) nb =16;
58    }
59    int nBytes= nb/8;
60       
61    int taille = GetXSize() *  GetYSize()  * GetSamplesPerPixel(); 
62          
63    printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
64       
65    guint16 ItemTagGr,ItemTagEl; 
66    int ln;
67    long ftellRes;
68    char * destination = NULL;
69
70   // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels 
71
72    if( !IsRLELossLessTransferSyntax()) {
73
74       // JPEG Image
75
76       std::cout << "JPEG image" << std::endl;
77       ftellRes=ftell(fp);
78       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
79       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
80       if(GetSwapCode()) {
81          ItemTagGr=SwapShort(ItemTagGr); 
82          ItemTagEl=SwapShort(ItemTagEl);            
83       }
84       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
85                 ftellRes,ItemTagGr,ItemTagEl );
86       ftellRes=ftell(fp);
87       fread(&ln,4,1,fp); 
88       if(GetSwapCode()) 
89          ln=SwapLong(ln);    // Basic Offset Table Item Lentgh
90       printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
91             ftellRes,ln,ln);
92       if (ln != 0) {
93          // What is it used for ??
94          char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
95          fread(BasicOffsetTableItemValue,ln,1,fp); 
96          guint32 a;
97          for (int i=0;i<ln;i+=4){
98             a=str2num(&BasicOffsetTableItemValue[i],guint32);
99             printf("      x(%08x)  %d\n",a,a);
100          }              
101       }
102       
103       ftellRes=ftell(fp);
104       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
105       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
106       if(GetSwapCode()) {
107          ItemTagGr=SwapShort(ItemTagGr); 
108          ItemTagEl=SwapShort(ItemTagEl);            
109       }  
110       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
111             ftellRes,ItemTagGr,ItemTagEl );
112       
113       while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
114       
115          ftellRes=ftell(fp);
116          fread(&ln,4,1,fp); 
117          if(GetSwapCode()) 
118             ln=SwapLong(ln);    // length
119          printf("      at %x : fragment length %d x(%08x)\n",
120                 ftellRes, ln,ln);
121
122         // destination += taille * nBytes; // location in user's memory        
123         //printf ("      Destination will be x(%x) = %d \n",
124         //     destination,destination );
125
126          // ------------------------                                     
127          fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels    
128          // ------------------------              
129      
130          ftellRes=ftell(fp);
131          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
132          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
133          if(GetSwapCode()) {
134             ItemTagGr=SwapShort(ItemTagGr); 
135             ItemTagEl=SwapShort(ItemTagEl);            
136          }
137          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
138                ftellRes,ItemTagGr,ItemTagEl );
139       } 
140
141    } else {
142
143       // RLE Image
144
145       std::cout << "RLE image" << std::endl;
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(GetSwapCode()) {
155          ItemTagGr=SwapShort(ItemTagGr); 
156          ItemTagEl=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(GetSwapCode()) 
164          ln=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(GetSwapCode()) {
182          ItemTagGr=SwapShort(ItemTagGr); 
183          ItemTagEl=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(GetSwapCode()) 
194             fragmentLength=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(GetSwapCode()) 
202             nbRleSegments=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(GetSwapCode())
209                RleSegmentOffsetTable[k]=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(GetSwapCode()) {
240             ItemTagGr=SwapShort(ItemTagGr); 
241             ItemTagEl=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 1;            
248 }