add info on how to build doxygen doc with autotools
[openjpeg.git] / OPJViewer / source / wxj2kparser.cpp
1 /*\r
2  * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  *\r
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
24  * POSSIBILITY OF SUCH DAMAGE.\r
25  */\r
26 #include "OPJViewer.h"\r
27 \r
28 /* From little endian to big endian, 2 bytes */\r
29 #define BYTE_SWAP2(X)   ((X & 0x00FF) << 8) | ((X & 0xFF00) >> 8)\r
30 #define BYTE_SWAP4(X)   ((X & 0x000000FF) << 24) | ((X & 0x0000FF00) << 8) | ((X & 0x00FF0000) >> 8) | ((X & 0xFF000000) >> 24)\r
31 \r
32 /* From codestream to int values */\r
33 #define STREAM_TO_UINT32(C, P)  (((unsigned long int) (C)[(P) + 0] << 24) + \\r
34                                                                 ((unsigned long int) (C)[(P) + 1] << 16) + \\r
35                                                                 ((unsigned long int) (C)[(P) + 2] << 8) + \\r
36                                                                 ((unsigned long int) (C)[(P) + 3] << 0))\r
37 \r
38 #define STREAM_TO_UINT16(C, P)  (((unsigned long int) (C)[(P) + 0] << 8) + \\r
39                                                                 ((unsigned long int) (C)[(P) + 1] << 0))\r
40 \r
41 \r
42 /* Markers values */\r
43 #define J2KMARK_NUM 24\r
44 enum {\r
45         SOC_VAL = 0xFF4F,\r
46         SOT_VAL = 0xFF90,\r
47         SOD_VAL = 0xFF93,\r
48         EOC_VAL = 0xFFD9,\r
49         SIZ_VAL = 0xFF51,\r
50         COD_VAL = 0xFF52,\r
51         COC_VAL = 0xFF53,\r
52         RGN_VAL = 0xFF5E,\r
53         QCD_VAL = 0xFF5C,\r
54         QCC_VAL = 0xFF5D,\r
55         POD_VAL = 0xFF5F,\r
56         TLM_VAL = 0xFF55,\r
57         PLM_VAL = 0xFF57,\r
58         PLT_VAL = 0xFF58,\r
59         PPM_VAL = 0xFF60,\r
60         PPT_VAL = 0xFF61,\r
61         SOP_VAL = 0xFF91,\r
62         EPH_VAL = 0xFF92,\r
63         COM_VAL = 0xFF64\r
64 #ifdef USE_JPWL\r
65         , EPB_VAL       = 0xFF66,\r
66         ESD_VAL = 0xFF67,\r
67         EPC_VAL = 0xFF68,\r
68         RED_VAL = 0xFF69\r
69         /*, EPB_VAL = 0xFF96,\r
70         ESD_VAL = 0xFF98,\r
71         EPC_VAL = 0xFF97,\r
72         RED_VAL = 0xFF99*/\r
73 #endif // USE_JPWL\r
74 #ifdef USE_JPSEC\r
75         , SEC_VAL = 0xFF65\r
76 #endif // USE_JPSEC\r
77 };\r
78 \r
79 // All the markers in one vector\r
80 unsigned short int marker_val[] = {\r
81         SOC_VAL, SOT_VAL, SOD_VAL, EOC_VAL,\r
82         SIZ_VAL,\r
83         COD_VAL, COC_VAL, RGN_VAL, QCD_VAL, QCC_VAL, POD_VAL,\r
84         TLM_VAL, PLM_VAL, PLT_VAL, PPM_VAL, PPT_VAL,\r
85         SOP_VAL, EPH_VAL,\r
86         COM_VAL\r
87 #ifdef USE_JPWL\r
88         , EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL\r
89 #endif // USE_JPWL\r
90 #ifdef USE_JPSEC\r
91         , SEC_VAL\r
92 #endif // USE_JPSEC\r
93 };\r
94 \r
95 // Marker names\r
96 char *marker_name[] = {\r
97         "SOC", "SOT", "SOD", "EOC",\r
98         "SIZ",\r
99         "COD", "COC", "RGN", "QCD", "QCC", "POD",\r
100         "TLM", "PLM", "PLT", "PPM", "PPT",\r
101         "SOP", "EPH",\r
102         "COM"\r
103 #ifdef USE_JPWL\r
104         , "EPB", "ESD", "EPC", "RED"\r
105 #endif // USE_JPWL\r
106 #ifdef USE_JPSEC\r
107         , "SEC"\r
108 #endif // USE_JPSEC\r
109 };\r
110 \r
111 // Marker descriptions\r
112 char *marker_descr[] = {\r
113         "Start of codestream", "Start of tile-part", "Start of data", "End of codestream",\r
114         "Image and tile size",\r
115         "Coding style default", "Coding style component", "Region-of-interest", "Quantization default",\r
116         "Quantization component", "Progression order change, default",\r
117         "Tile-part lengths, main header", "Packet length, main header", "Packets length, tile-part header",\r
118         "Packed packet headers, main header", "Packed packet headers, tile-part header",\r
119         "Start of packet", "End of packet header",\r
120         "Comment and extension"\r
121 #ifdef USE_JPWL\r
122         , "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability",\r
123         "Residual Errors Descriptor"\r
124 #endif // USE_JPWL\r
125 #ifdef USE_JPSEC\r
126         , "Main security marker"\r
127 #endif // USE_JPSEC\r
128 };\r
129 \r
130 void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid)\r
131 {\r
132         unsigned short int csiz = 0;\r
133 \r
134         // check if the file is opened\r
135         if (m_file->IsOpened())\r
136                 WriteText(wxT("File OK"));\r
137         else\r
138                 return;\r
139 \r
140         // position at the beginning\r
141         m_file->Seek(offset, wxFromStart);\r
142 \r
143         // navigate the file\r
144         int m, inside_sod = 0, inside_sop = 0;\r
145         int nmarks = 0, maxmarks = 10000;\r
146         unsigned char onebyte[1];\r
147         unsigned char twobytes[2], firstbyte, secondbyte;\r
148         unsigned char fourbytes[4];\r
149         unsigned short int currmark;\r
150         unsigned short int currlen;\r
151         int lastPsot = 0, lastsotpos = 0;\r
152 \r
153         WriteText(wxT("Start search..."));\r
154 \r
155 // advancing macro\r
156 #define OPJ_ADVANCE(A) {offset += A; if (offset < length) m_file->Seek(offset, wxFromStart); else return;}\r
157 \r
158         // begin search\r
159         while ((offset < length) && (!m_file->Eof())) {\r
160 \r
161                 // read one byte\r
162                 if (m_file->Read(&firstbyte, 1) != 1)\r
163                         break;\r
164 \r
165                 // look for 0xFF\r
166                 if (firstbyte == 0xFF) {\r
167 \r
168                         // it is a possible marker\r
169                         if (m_file->Read(&secondbyte, 1) != 1)\r
170                                 break;\r
171                         else\r
172                                 currmark = (((unsigned short int) firstbyte) << 8) + (unsigned short int) secondbyte;\r
173 \r
174                 } else {\r
175 \r
176                         // nope, advance by one and search again\r
177                         OPJ_ADVANCE(1);\r
178                         continue;\r
179                 }\r
180                 \r
181                 // search the marker\r
182                 for (m = 0; m < J2KMARK_NUM; m++) {\r
183                         if (currmark == marker_val[m])\r
184                                 break;\r
185                 }\r
186 \r
187                 // marker not found\r
188                 if (m == J2KMARK_NUM) {\r
189                         // nope, advance by one and search again\r
190                         OPJ_ADVANCE(1);\r
191                         continue;\r
192                 }\r
193 \r
194                 // if we are inside SOD, only some markers are allowed\r
195                 if (inside_sod) {\r
196 \r
197                         // we are inside SOP\r
198                         if (inside_sop) {\r
199 \r
200                         }\r
201 \r
202                         // randomly marker coincident data\r
203                         if ((currmark != SOT_VAL) &&\r
204                                 (currmark != EOC_VAL) &&\r
205                                 (currmark != SOP_VAL) &&\r
206                                 (currmark != EPH_VAL)) {\r
207                                 OPJ_ADVANCE(1);\r
208                                 continue;\r
209                         }\r
210 \r
211                         // possible SOT?\r
212                         if ((currmark == SOT_VAL)) {\r
213                                 // too early SOT\r
214                                 if (offset < (lastsotpos + lastPsot)) {\r
215                                         OPJ_ADVANCE(1);\r
216                                         continue;\r
217                                 }\r
218                                 // we were not in the last tile\r
219                                 /*if (lastPsot != 0) {\r
220                                         OPJ_ADVANCE(1);\r
221                                         break;\r
222                                 }*/\r
223                         }\r
224                 }\r
225 \r
226                 // beyond this point, the marker MUST BE real\r
227 \r
228                 // length of current marker segment\r
229                 if ((currmark == SOD_VAL) ||\r
230                         (currmark == SOC_VAL) ||\r
231                         (currmark == EOC_VAL) ||\r
232                         (currmark == EPH_VAL))\r
233 \r
234                         // zero length markers\r
235                         currlen = 0;\r
236 \r
237                 else {\r
238 \r
239                         // read length field\r
240                         if (m_file->Read(twobytes, 2) != 2)\r
241                                 break;\r
242 \r
243                         currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];\r
244                 }\r
245 \r
246                 // here we pass to AppendItem() normal and selected item images (we\r
247                 // suppose that selected image follows the normal one in the enum)\r
248                 int image, imageSel;\r
249                 image = m_tree->TreeCtrlIcon_Folder;\r
250                 imageSel = image + 1;\r
251 \r
252                 // append the marker\r
253                 wxTreeItemId currid = m_tree->AppendItem(parentid,\r
254                         wxString::Format(wxT("%03d: "), nmarks) +\r
255                         wxString::FromAscii(marker_name[m]) + \r
256                         wxString::Format(wxT(" (0x%04X)"), marker_val[m]),\r
257                         image, imageSel,\r
258                         new OPJMarkerData(wxT("MARK") + wxString::Format(wxT(" (%d)"), marker_val[m]),\r
259                                 m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)\r
260                         );\r
261 \r
262                 // append some info\r
263                 image = m_tree->TreeCtrlIcon_File;\r
264                 imageSel = image + 1;\r
265 \r
266                 // marker name\r
267                 wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
268                         wxT("*** ") + wxString::FromAscii(marker_descr[m]) + wxT(" ***"),\r
269                         image, imageSel,\r
270                         new OPJMarkerData(wxT("INFO"))\r
271                         );\r
272                 m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);\r
273 \r
274                 // position and length\r
275                 wxTreeItemId subcurrid2 = m_tree->AppendItem(currid,\r
276                         wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() + \r
277                         wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2),\r
278                         image, imageSel,\r
279                         new OPJMarkerData(wxT("INFO"))\r
280                         );\r
281 \r
282                 // give additional info on markers\r
283                 switch (currmark) {\r
284 \r
285                 /////////\r
286                 // SOP //\r
287                 /////////\r
288                 case SOP_VAL:\r
289                         {\r
290                         // read packet number\r
291                         if (m_file->Read(twobytes, 2) != 2)\r
292                                 break;\r
293                         int packnum = STREAM_TO_UINT16(twobytes, 0);\r
294 \r
295                         image = m_tree->TreeCtrlIcon_File;\r
296                         imageSel = image + 1;\r
297 \r
298                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
299                                 wxString::Format(wxT("Pack. no. %d"), packnum),\r
300                                 image, imageSel,\r
301                                 new OPJMarkerData(wxT("INFO"))\r
302                                 );\r
303                         inside_sop = 1;\r
304                         };\r
305                         break;\r
306 \r
307 #ifdef USE_JPWL\r
308                 /////////\r
309                 // RED //\r
310                 /////////\r
311                 case RED_VAL:\r
312                         {\r
313                         if (m_file->Read(onebyte, 1) != 1)\r
314                                 break;\r
315                         unsigned char pred = onebyte[0];\r
316 \r
317                         image = m_tree->TreeCtrlIcon_File;\r
318                         imageSel = image + 1;\r
319 \r
320                         wxString address[] = {\r
321                                 wxT("Packet addressing"),\r
322                                 wxT("Byte-range addressing"),\r
323                                 wxT("Packet-range addressing"),\r
324                                 wxT("Reserved")\r
325                         };\r
326 \r
327                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
328                                 address[(pred & 0xC0) >> 6],\r
329                                 image, imageSel,\r
330                                 new OPJMarkerData(wxT("INFO"))\r
331                                 );\r
332 \r
333                         subcurrid = m_tree->AppendItem(currid,\r
334                                 wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2),\r
335                                 image, imageSel,\r
336                                 new OPJMarkerData(wxT("INFO"))\r
337                                 );\r
338 \r
339                         subcurrid = m_tree->AppendItem(currid,\r
340                                 pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"),\r
341                                 image, imageSel,\r
342                                 new OPJMarkerData(wxT("INFO"))\r
343                                 );\r
344 \r
345                         subcurrid = m_tree->AppendItem(currid,\r
346                                 wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3),\r
347                                 image, imageSel,\r
348                                 new OPJMarkerData(wxT("INFO"))\r
349                                 );\r
350 \r
351                         }\r
352                         break;\r
353 \r
354                 /////////\r
355                 // ESD //\r
356                 /////////\r
357                 case ESD_VAL:\r
358                         {\r
359                         unsigned short int cesd;\r
360                         if (csiz < 257) {\r
361                                 if (m_file->Read(onebyte, 1) != 1)\r
362                                         break;\r
363                                 cesd = onebyte[0];\r
364                         } else {\r
365                                 if (m_file->Read(twobytes, 2) != 2)\r
366                                         break;\r
367                                 cesd = STREAM_TO_UINT16(twobytes, 0);\r
368                         }\r
369 \r
370                         if (m_file->Read(onebyte, 1) != 1)\r
371                                 break;\r
372                         unsigned char pesd = onebyte[0];\r
373 \r
374                         image = m_tree->TreeCtrlIcon_File;\r
375                         imageSel = image + 1;\r
376 \r
377                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
378                                 pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd),\r
379                                 image, imageSel,\r
380                                 new OPJMarkerData(wxT("INFO"))\r
381                                 );\r
382 \r
383                         wxString meth[] = {\r
384                                 wxT("Relative error sensitivity"),\r
385                                 wxT("MSE"),\r
386                                 wxT("MSE reduction"),\r
387                                 wxT("PSNR"),\r
388                                 wxT("PSNR increase"),\r
389                                 wxT("MAXERR (absolute peak error)"),\r
390                                 wxT("TSE (total squared error)"),\r
391                                 wxT("Reserved")\r
392                         };\r
393 \r
394                         subcurrid = m_tree->AppendItem(currid,\r
395                                 meth[(pesd & 0x38) >> 3],\r
396                                 image, imageSel,\r
397                                 new OPJMarkerData(wxT("INFO"))\r
398                                 );\r
399 \r
400                         wxString address[] = {\r
401                                 wxT("Packet addressing"),\r
402                                 wxT("Byte-range addressing"),\r
403                                 wxT("Packet-range addressing"),\r
404                                 wxT("Reserved")\r
405                         };\r
406 \r
407                         subcurrid = m_tree->AppendItem(currid,\r
408                                 address[(pesd & 0xC0) >> 6],\r
409                                 image, imageSel,\r
410                                 new OPJMarkerData(wxT("INFO"))\r
411                                 );\r
412 \r
413                         subcurrid = m_tree->AppendItem(currid,\r
414                                 wxString::Format(wxT("%d bytes/value, %d bytes range"), ((pesd & 0x04) >> 2) + 1, (((pesd & 0x02) >> 1) + 1) * 2),\r
415                                 image, imageSel,\r
416                                 new OPJMarkerData(wxT("INFO"))\r
417                                 );\r
418 \r
419                         }\r
420                         break;\r
421 \r
422                 /////////\r
423                 // EPC //\r
424                 /////////\r
425                 case EPC_VAL:\r
426                         {\r
427                         if (m_file->Read(twobytes, 2) != 2)\r
428                                 break;\r
429                         unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0);\r
430 \r
431                         if (m_file->Read(fourbytes, 4) != 4)\r
432                                 break;\r
433                         unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0);\r
434 \r
435                         if (m_file->Read(onebyte, 1) != 1)\r
436                                 break;\r
437                         unsigned char pepc = onebyte[0];\r
438 \r
439                         image = m_tree->TreeCtrlIcon_File;\r
440                         imageSel = image + 1;\r
441 \r
442                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
443                                 wxString::Format(wxT("CRC-16 = 0x%x"), pcrc),\r
444                                 image, imageSel,\r
445                                 new OPJMarkerData(wxT("INFO"))\r
446                                 );\r
447 \r
448                         subcurrid = m_tree->AppendItem(currid,\r
449                                 wxString::Format(wxT("Tot. length = %d"), dl),\r
450                                 image, imageSel,\r
451                                 new OPJMarkerData(wxT("INFO"))\r
452                                 );\r
453 \r
454                         subcurrid = m_tree->AppendItem(currid,\r
455                                 wxString::Format(wxT("%s%s%s%s"),\r
456                                         pepc & 0x10 ? wxT("ESD, ") : wxT(""),\r
457                                         pepc & 0x20 ? wxT("RED, ") : wxT(""),\r
458                                         pepc & 0x40 ? wxT("EPB, ") : wxT(""),\r
459                                         pepc & 0x80 ? wxT("Info") : wxT("")\r
460                                         ),\r
461                                 image, imageSel,\r
462                                 new OPJMarkerData(wxT("INFO"))\r
463                                 );\r
464 \r
465                         }\r
466                         break;\r
467 \r
468                 /////////\r
469                 // EPB //\r
470                 /////////\r
471                 case EPB_VAL:\r
472                         {\r
473                         if (m_file->Read(onebyte, 1) != 1)\r
474                                 break;\r
475                         unsigned char depb = onebyte[0];\r
476 \r
477                         if (m_file->Read(fourbytes, 4) != 4)\r
478                                 break;\r
479                         unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0);\r
480 \r
481                         if (m_file->Read(fourbytes, 4) != 4)\r
482                                 break;\r
483                         unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0);\r
484 \r
485                         image = m_tree->TreeCtrlIcon_File;\r
486                         imageSel = image + 1;\r
487 \r
488                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
489                                 wxString::Format(wxT("No. %d, %slatest, %spacked"),\r
490                                         depb & 0x3F,\r
491                                         depb & 0x40 ? wxT("") : wxT("not "),\r
492                                         depb & 0x80 ? wxT("") : wxT("un")),\r
493                                 image, imageSel,\r
494                                 new OPJMarkerData(wxT("INFO"))\r
495                                 );\r
496 \r
497                         subcurrid = m_tree->AppendItem(currid,\r
498                                 wxString::Format(wxT("%d bytes protected"), ldpepb),\r
499                                 image, imageSel,\r
500                                 new OPJMarkerData(wxT("INFO"))\r
501                                 );\r
502 \r
503                         if (pepb == 0x00000000)\r
504 \r
505                                 subcurrid = m_tree->AppendItem(currid,\r
506                                         wxT("Predefined codes"),\r
507                                         image, imageSel,\r
508                                         new OPJMarkerData(wxT("INFO"))\r
509                                         );\r
510 \r
511                         else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) {\r
512 \r
513                                 wxString text = wxT("CRC code");\r
514                                 if (pepb == 0x10000000)\r
515                                         text << wxT(", CCITT (X25) 16 bits");\r
516                                 else if (pepb == 0x10000001)\r
517                                         text << wxT(", Ethernet 32 bits");\r
518                                 else\r
519                                         text << wxT(", JPWL RA");\r
520                                 subcurrid = m_tree->AppendItem(currid,\r
521                                         text,\r
522                                         image, imageSel,\r
523                                         new OPJMarkerData(wxT("INFO"))\r
524                                         );\r
525 \r
526                         } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) {\r
527 \r
528                                 wxString text;\r
529                                 subcurrid = m_tree->AppendItem(currid,\r
530                                         wxString::Format(wxT("RS code, RS(%d, %d)"),\r
531                                                 (pepb & 0x0000FF00) >> 8,\r
532                                                 (pepb & 0x000000FF)),\r
533                                         image, imageSel,\r
534                                         new OPJMarkerData(wxT("INFO"))\r
535                                         );\r
536 \r
537                         } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE))\r
538 \r
539                                 subcurrid = m_tree->AppendItem(currid,\r
540                                         wxT("JPWL RA"),\r
541                                         image, imageSel,\r
542                                         new OPJMarkerData(wxT("INFO"))\r
543                                         );\r
544 \r
545                         else if (pepb == 0xFFFFFFFF)\r
546 \r
547                                 subcurrid = m_tree->AppendItem(currid,\r
548                                         wxT("No method"),\r
549                                         image, imageSel,\r
550                                         new OPJMarkerData(wxT("INFO"))\r
551                                         );\r
552 \r
553                         }\r
554                         break;\r
555 #endif // USE_JPWL\r
556 \r
557 #ifdef USE_JPSEC\r
558                 case SEC_VAL:\r
559                         {\r
560 \r
561                         }\r
562                         break;\r
563 #endif // USE_JPSEC\r
564 \r
565                 /////////\r
566                 // SIZ //\r
567                 /////////\r
568                 case SIZ_VAL:\r
569                         {\r
570                         int c;\r
571                         \r
572                         if (m_file->Read(twobytes, 2) != 2)\r
573                                 break;\r
574                         unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);\r
575 \r
576                         if (m_file->Read(fourbytes, 4) != 4)\r
577                                 break;\r
578                         unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);\r
579 \r
580                         if (m_file->Read(fourbytes, 4) != 4)\r
581                                 break;\r
582                         unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);\r
583 \r
584                         if (m_file->Read(fourbytes, 4) != 4)\r
585                                 break;\r
586                         unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0);\r
587 \r
588                         if (m_file->Read(fourbytes, 4) != 4)\r
589                                 break;\r
590                         unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0);\r
591 \r
592                         if (m_file->Read(fourbytes, 4) != 4)\r
593                                 break;\r
594                         unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0);\r
595                         this->m_tree->m_childframe->m_twidth = xtsiz;\r
596 \r
597                         if (m_file->Read(fourbytes, 4) != 4)\r
598                                 break;\r
599                         unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0);\r
600                         this->m_tree->m_childframe->m_theight = ytsiz;\r
601 \r
602                         if (m_file->Read(fourbytes, 4) != 4)\r
603                                 break;\r
604                         unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0);\r
605                         this->m_tree->m_childframe->m_tx = xtosiz;\r
606 \r
607                         if (m_file->Read(fourbytes, 4) != 4)\r
608                                 break;\r
609                         unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0);\r
610                         this->m_tree->m_childframe->m_ty = ytosiz;\r
611 \r
612                         if (m_file->Read(twobytes, 2) != 2)\r
613                                 break;\r
614                         csiz = STREAM_TO_UINT16(twobytes, 0);\r
615 \r
616                         bool equaldepth = true, equalsize = true;\r
617                         unsigned char *ssiz  = new unsigned char(csiz);\r
618                         unsigned char *xrsiz = new unsigned char(csiz);\r
619                         unsigned char *yrsiz = new unsigned char(csiz);\r
620 \r
621                         for (c = 0; c < csiz; c++) {\r
622 \r
623                                 if (m_file->Read(&ssiz[c], 1) != 1)\r
624                                         break;\r
625 \r
626                                 if (c > 0)\r
627                                         equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]);\r
628 \r
629                                 if (m_file->Read(&xrsiz[c], 1) != 1)\r
630                                         break;\r
631 \r
632                                 if (m_file->Read(&yrsiz[c], 1) != 1)\r
633                                         break;\r
634 \r
635                                 if (c > 0)\r
636                                         equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ;\r
637 \r
638                         }\r
639 \r
640                         if (equaldepth && equalsize)\r
641                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
642                                         wxString::Format(wxT("I: %dx%d (%d, %d), %d c., %d%s bpp"),\r
643                                         xsiz, ysiz,\r
644                                         xosiz, yosiz,\r
645                                         csiz, ((ssiz[0] & 0x7F) + 1),\r
646                                         (ssiz[0] & 0x80) ? wxT("s") : wxT("u")),\r
647                                         image, imageSel,\r
648                                         new OPJMarkerData(wxT("INFO"))\r
649                                         );\r
650                         else\r
651                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
652                                         wxString::Format(wxT("I: %dx%d (%d, %d), %d c."),\r
653                                         xsiz, ysiz,\r
654                                         xosiz, yosiz,\r
655                                         csiz),\r
656                                         image, imageSel,\r
657                                         new OPJMarkerData(wxT("INFO"))\r
658                                         );\r
659 \r
660                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
661                                 wxString::Format(wxT("T: %dx%d (%d, %d)"),\r
662                                 xtsiz, ytsiz,\r
663                                 xtosiz, ytosiz),\r
664                                 image, imageSel,\r
665                                 new OPJMarkerData(wxT("INFO"))\r
666                                 );\r
667 \r
668                         image = m_tree->TreeCtrlIcon_Folder;\r
669                         imageSel = image + 1;\r
670 \r
671                         wxTreeItemId subcurrid4 = m_tree->AppendItem(currid,\r
672                                 wxT("Components"),\r
673                                 image, imageSel,\r
674                                 new OPJMarkerData(wxT("INFO"))\r
675                                 );\r
676 \r
677                         image = m_tree->TreeCtrlIcon_File;\r
678                         imageSel = image + 1;\r
679 \r
680                         for (c = 0; c < csiz; c++) {\r
681 \r
682                                 wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4,\r
683                                         wxString::Format(wxT("#%d: %dx%d, %d%s bpp"),\r
684                                         c,\r
685                                         xsiz/xrsiz[c], ysiz/yrsiz[c],\r
686                                         ((ssiz[c] & 0x7F) + 1),\r
687                                         (ssiz[c] & 0x80) ? wxT("s") : wxT("u")),\r
688                                         image, imageSel,\r
689                                         new OPJMarkerData(wxT("INFO"))\r
690                                         );\r
691 \r
692                         }\r
693 \r
694                         };\r
695                         break;\r
696 \r
697                 /////////\r
698                 // SOT //\r
699                 /////////\r
700                 case SOT_VAL:\r
701                         {\r
702                         if (m_file->Read(twobytes, 2) != 2)\r
703                                 break;\r
704                         unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);\r
705 \r
706                         if (m_file->Read(fourbytes, 4) != 4)\r
707                                 break;\r
708                         unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);\r
709 \r
710                         if (m_file->Read(onebyte, 1) != 1)\r
711                                 break;\r
712                         unsigned char tpsot = onebyte[0];\r
713 \r
714                         if (m_file->Read(onebyte, 1) != 1)\r
715                                 break;\r
716                         unsigned char tnsot = onebyte[0];\r
717 \r
718                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
719                                 wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot),\r
720                                 image, imageSel,\r
721                                 new OPJMarkerData(wxT("INFO"))\r
722                                 );\r
723 \r
724                         lastPsot = psot;\r
725                         lastsotpos = offset;\r
726                         inside_sod = 0;\r
727                         };\r
728                         break;\r
729 \r
730                 /////////\r
731                 // COC //\r
732                 /////////\r
733                 case COC_VAL:\r
734                         {\r
735                         unsigned short int ccoc;\r
736                         if (csiz < 257) {\r
737                                 if (m_file->Read(onebyte, 1) != 1)\r
738                                         break;\r
739                                 ccoc = onebyte[0];\r
740                         } else {\r
741                                 if (m_file->Read(twobytes, 2) != 2)\r
742                                         break;\r
743                                 ccoc = STREAM_TO_UINT16(twobytes, 0);\r
744                         }\r
745 \r
746                         if (m_file->Read(onebyte, 1) != 1)\r
747                                 break;\r
748                         unsigned char scoc = onebyte[0];\r
749 \r
750                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
751                                 wxString::Format(wxT("Comp. no. %d"), ccoc),\r
752                                 image, imageSel,\r
753                                 new OPJMarkerData(wxT("INFO"))\r
754                                 );\r
755                         \r
756                         wxString text;\r
757                         if (scoc & 0x01)\r
758                                 text << wxT("Partitioned entropy coder");\r
759                         else\r
760                                 text << wxT("Unpartitioned entropy coder");\r
761 \r
762                         subcurrid = m_tree->AppendItem(currid,\r
763                                 text,\r
764                                 image, imageSel,\r
765                                 new OPJMarkerData(wxT("INFO"))\r
766                                 );\r
767 \r
768                         if (m_file->Read(onebyte, 1) != 1)\r
769                                 break;\r
770                         unsigned char decomplevs = onebyte[0];\r
771 \r
772                         if (m_file->Read(onebyte, 1) != 1)\r
773                                 break;\r
774                         unsigned char cbswidth = onebyte[0];\r
775 \r
776                         if (m_file->Read(onebyte, 1) != 1)\r
777                                 break;\r
778                         unsigned char cbsheight = onebyte[0];\r
779 \r
780                         if (m_file->Read(onebyte, 1) != 1)\r
781                                 break;\r
782                         unsigned char cbstyle = onebyte[0];\r
783 \r
784                         if (m_file->Read(onebyte, 1) != 1)\r
785                                 break;\r
786                         unsigned char transform = onebyte[0];\r
787 \r
788                         subcurrid = m_tree->AppendItem(currid,\r
789                                 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
790                                 image, imageSel,\r
791                                 new OPJMarkerData(wxT("INFO"))\r
792                                 );\r
793 \r
794                         if (transform & 0x01)\r
795                                 text = wxT("5-3 reversible wavelet");\r
796                         else\r
797                                 text = wxT("9-7 irreversible wavelet");\r
798                         subcurrid = m_tree->AppendItem(currid,\r
799                                 text,\r
800                                 image, imageSel,\r
801                                 new OPJMarkerData(wxT("INFO"))\r
802                                 );\r
803 \r
804                         subcurrid = m_tree->AppendItem(currid,\r
805                                 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
806                                 image, imageSel,\r
807                                 new OPJMarkerData(wxT("INFO"))\r
808                                 );\r
809 \r
810                         image = m_tree->TreeCtrlIcon_Folder;\r
811                         imageSel = image + 1;\r
812 \r
813                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
814                                 wxT("Coding styles"),\r
815                                 image, imageSel,\r
816                                 new OPJMarkerData(wxT("INFO"))\r
817                                 );\r
818 \r
819                         image = m_tree->TreeCtrlIcon_File;\r
820                         imageSel = image + 1;\r
821 \r
822                         if (cbstyle & 0x01)\r
823                                 text = wxT("Selective arithmetic coding bypass");\r
824                         else\r
825                                 text = wxT("No selective arithmetic coding bypass");\r
826                         wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
827                                 text,\r
828                                 image, imageSel,\r
829                                 new OPJMarkerData(wxT("INFO"))\r
830                                 );\r
831 \r
832                         if (cbstyle & 0x02)\r
833                                 text = wxT("Reset context probabilities on coding pass boundaries");\r
834                         else\r
835                                 text = wxT("No reset of context probabilities on coding pass boundaries");\r
836                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
837                                 text,\r
838                                 image, imageSel,\r
839                                 new OPJMarkerData(wxT("INFO"))\r
840                                 );\r
841 \r
842                         if (cbstyle & 0x04)\r
843                                 text = wxT("Termination on each coding passs");\r
844                         else\r
845                                 text = wxT("No termination on each coding pass");\r
846                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
847                                 text,\r
848                                 image, imageSel,\r
849                                 new OPJMarkerData(wxT("INFO"))\r
850                                 );\r
851 \r
852                         if (cbstyle & 0x08)\r
853                                 text = wxT("Vertically stripe causal context");\r
854                         else\r
855                                 text = wxT("No vertically stripe causal context");\r
856                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
857                                 text,\r
858                                 image, imageSel,\r
859                                 new OPJMarkerData(wxT("INFO"))\r
860                                 );\r
861 \r
862                         if (cbstyle & 0x10)\r
863                                 text = wxT("Predictable termination");\r
864                         else\r
865                                 text = wxT("No predictable termination");\r
866                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
867                                 text,\r
868                                 image, imageSel,\r
869                                 new OPJMarkerData(wxT("INFO"))\r
870                                 );\r
871 \r
872                         if (cbstyle & 0x20)\r
873                                 text = wxT("Segmentation symbols are used");\r
874                         else\r
875                                 text = wxT("No segmentation symbols are used");\r
876                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
877                                 text,\r
878                                 image, imageSel,\r
879                                 new OPJMarkerData(wxT("INFO"))\r
880                                 );\r
881 \r
882                         }\r
883                         break;\r
884 \r
885                 /////////\r
886                 // COD //\r
887                 /////////\r
888                 case COD_VAL:\r
889                         {\r
890                         if (m_file->Read(onebyte, 1) != 1)\r
891                                 break;\r
892                         unsigned char scod = onebyte[0];\r
893 \r
894                         wxString text;\r
895 \r
896                         if (scod & 0x01)\r
897                                 text << wxT("Partitioned entropy coder");\r
898                         else\r
899                                 text << wxT("Unpartitioned entropy coder");\r
900 \r
901                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
902                                 text,\r
903                                 image, imageSel,\r
904                                 new OPJMarkerData(wxT("INFO"))\r
905                                 );\r
906 \r
907                         text = wxT("");\r
908                         if (scod & 0x02)\r
909                                 text << wxT("Possible SOPs");\r
910                         else\r
911                                 text << wxT("No SOPs");\r
912 \r
913                         if (scod & 0x04)\r
914                                 text << wxT(", possible EPHs");\r
915                         else\r
916                                 text << wxT(", no EPHs");\r
917 \r
918                         subcurrid3 = m_tree->AppendItem(currid,\r
919                                 text,\r
920                                 image, imageSel,\r
921                                 new OPJMarkerData(wxT("INFO"))\r
922                                 );\r
923 \r
924                         if (m_file->Read(onebyte, 1) != 1)\r
925                                 break;\r
926                         unsigned char progord = onebyte[0];\r
927 \r
928                         if (m_file->Read(twobytes, 2) != 2)\r
929                                 break;\r
930                         unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0);\r
931 \r
932                         if (m_file->Read(onebyte, 1) != 1)\r
933                                 break;\r
934                         unsigned char mctransform = onebyte[0];\r
935 \r
936                         if (m_file->Read(onebyte, 1) != 1)\r
937                                 break;\r
938                         unsigned char decomplevs = onebyte[0];\r
939 \r
940                         if (m_file->Read(onebyte, 1) != 1)\r
941                                 break;\r
942                         unsigned char cbswidth = onebyte[0];\r
943 \r
944                         if (m_file->Read(onebyte, 1) != 1)\r
945                                 break;\r
946                         unsigned char cbsheight = onebyte[0];\r
947 \r
948                         if (m_file->Read(onebyte, 1) != 1)\r
949                                 break;\r
950                         unsigned char cbstyle = onebyte[0];\r
951 \r
952                         if (m_file->Read(onebyte, 1) != 1)\r
953                                 break;\r
954                         unsigned char transform = onebyte[0];\r
955 \r
956                         subcurrid3 = m_tree->AppendItem(currid,\r
957                                 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
958                                 image, imageSel,\r
959                                 new OPJMarkerData(wxT("INFO"))\r
960                                 );\r
961 \r
962                         text = wxT("");\r
963                         switch (progord) {\r
964                         case (0):\r
965                                 text << wxT("LRCP");\r
966                                 break;\r
967                         case (1):\r
968                                 text << wxT("RLCP");\r
969                                 break;\r
970                         case (2):\r
971                                 text << wxT("LRCP");\r
972                                 break;\r
973                         case (3):\r
974                                 text << wxT("RPCL");\r
975                                 break;\r
976                         case (4):\r
977                                 text << wxT("CPRL");\r
978                                 break;\r
979                         default:\r
980                                 text << wxT("unknown progression");\r
981                                 break;\r
982                         }\r
983                         text << wxString::Format(wxT(", %d layers"), numlayers);\r
984                         if (transform & 0x01)\r
985                                 text << wxT(", 5-3 rev.");\r
986                         else\r
987                                 text << wxT(", 9-7 irr.");\r
988                         subcurrid3 = m_tree->AppendItem(currid,\r
989                                 text,\r
990                                 image, imageSel,\r
991                                 new OPJMarkerData(wxT("INFO"))\r
992                                 );\r
993 \r
994                         subcurrid3 = m_tree->AppendItem(currid,\r
995                                 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
996                                 image, imageSel,\r
997                                 new OPJMarkerData(wxT("INFO"))\r
998                                 );\r
999 \r
1000                         switch (mctransform) {\r
1001                         case (0):\r
1002                                 {\r
1003                                 text = wxT("No MCT");\r
1004                                 }\r
1005                                 break;\r
1006                         case (1):\r
1007                                 {\r
1008                                 text = wxT("Reversible MCT on 0, 1, 2");\r
1009                                 }\r
1010                                 break;\r
1011                         case (2):\r
1012                                 {\r
1013                                 text = wxT("Irreversible MCT on 0, 1, 2");\r
1014                                 }\r
1015                                 break;\r
1016                         default:\r
1017                                 {\r
1018                                 text = wxT("Unknown");\r
1019                                 }\r
1020                                 break;\r
1021                         };\r
1022                         subcurrid3 = m_tree->AppendItem(currid,\r
1023                                 text,\r
1024                                 image, imageSel,\r
1025                                 new OPJMarkerData(wxT("INFO"))\r
1026                                 );\r
1027 \r
1028 \r
1029                         image = m_tree->TreeCtrlIcon_Folder;\r
1030                         imageSel = image + 1;\r
1031 \r
1032                         subcurrid3 = m_tree->AppendItem(currid,\r
1033                                 wxT("Coding styles"),\r
1034                                 image, imageSel,\r
1035                                 new OPJMarkerData(wxT("INFO"))\r
1036                                 );\r
1037 \r
1038                         image = m_tree->TreeCtrlIcon_File;\r
1039                         imageSel = image + 1;\r
1040 \r
1041                         if (cbstyle & 0x01)\r
1042                                 text = wxT("Selective arithmetic coding bypass");\r
1043                         else\r
1044                                 text = wxT("No selective arithmetic coding bypass");\r
1045                         wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1046                                 text,\r
1047                                 image, imageSel,\r
1048                                 new OPJMarkerData(wxT("INFO"))\r
1049                                 );\r
1050 \r
1051                         if (cbstyle & 0x02)\r
1052                                 text = wxT("Reset context probabilities on coding pass boundaries");\r
1053                         else\r
1054                                 text = wxT("No reset of context probabilities on coding pass boundaries");\r
1055                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1056                                 text,\r
1057                                 image, imageSel,\r
1058                                 new OPJMarkerData(wxT("INFO"))\r
1059                                 );\r
1060 \r
1061                         if (cbstyle & 0x04)\r
1062                                 text = wxT("Termination on each coding passs");\r
1063                         else\r
1064                                 text = wxT("No termination on each coding pass");\r
1065                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1066                                 text,\r
1067                                 image, imageSel,\r
1068                                 new OPJMarkerData(wxT("INFO"))\r
1069                                 );\r
1070 \r
1071                         if (cbstyle & 0x08)\r
1072                                 text = wxT("Vertically stripe causal context");\r
1073                         else\r
1074                                 text = wxT("No vertically stripe causal context");\r
1075                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1076                                 text,\r
1077                                 image, imageSel,\r
1078                                 new OPJMarkerData(wxT("INFO"))\r
1079                                 );\r
1080 \r
1081                         if (cbstyle & 0x10)\r
1082                                 text = wxT("Predictable termination");\r
1083                         else\r
1084                                 text = wxT("No predictable termination");\r
1085                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1086                                 text,\r
1087                                 image, imageSel,\r
1088                                 new OPJMarkerData(wxT("INFO"))\r
1089                                 );\r
1090 \r
1091                         if (cbstyle & 0x20)\r
1092                                 text = wxT("Segmentation symbols are used");\r
1093                         else\r
1094                                 text = wxT("No segmentation symbols are used");\r
1095                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1096                                 text,\r
1097                                 image, imageSel,\r
1098                                 new OPJMarkerData(wxT("INFO"))\r
1099                                 );\r
1100 \r
1101                         };\r
1102                         break;\r
1103 \r
1104                 /////////\r
1105                 // QCC //\r
1106                 /////////\r
1107                 case QCC_VAL:\r
1108                         {\r
1109                         unsigned short int cqcc;\r
1110                         if (csiz < 257) {\r
1111                                 if (m_file->Read(onebyte, 1) != 1)\r
1112                                         break;\r
1113                                 cqcc = onebyte[0];\r
1114                         } else {\r
1115                                 if (m_file->Read(twobytes, 2) != 2)\r
1116                                         break;\r
1117                                 cqcc = STREAM_TO_UINT16(twobytes, 0);\r
1118                         }\r
1119 \r
1120                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
1121                                 wxString::Format(wxT("Comp. no. %d"), cqcc),\r
1122                                 image, imageSel,\r
1123                                 new OPJMarkerData(wxT("INFO"))\r
1124                                 );\r
1125                         \r
1126                         if (m_file->Read(onebyte, 1) != 1)\r
1127                                 break;\r
1128                         unsigned char sqcc = onebyte[0];\r
1129 \r
1130                         wxString text;\r
1131                         switch (sqcc & 0x1F) {\r
1132                         case (0):\r
1133                                 text = wxT("No quantization");\r
1134                                 break;\r
1135                         case (1):\r
1136                                 text = wxT("Scalar implicit");\r
1137                                 break;\r
1138                         case (2):\r
1139                                 text = wxT("Scalar explicit");\r
1140                                 break;\r
1141                         default:\r
1142                                 text = wxT("Unknown");\r
1143                                 break;\r
1144                         }\r
1145                         text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5);\r
1146                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1147                                 text,\r
1148                                 image, imageSel,\r
1149                                 new OPJMarkerData(wxT("INFO"))\r
1150                                 );\r
1151 \r
1152                         }\r
1153                         break;\r
1154 \r
1155                 /////////\r
1156                 // QCD //\r
1157                 /////////\r
1158                 case QCD_VAL:\r
1159                         {\r
1160                         if (m_file->Read(onebyte, 1) != 1)\r
1161                                 break;\r
1162                         unsigned char sqcd = onebyte[0];\r
1163 \r
1164                         wxString text;\r
1165                         switch (sqcd & 0x1F) {\r
1166                         case (0):\r
1167                                 text = wxT("No quantization");\r
1168                                 break;\r
1169                         case (1):\r
1170                                 text = wxT("Scalar implicit");\r
1171                                 break;\r
1172                         case (2):\r
1173                                 text = wxT("Scalar explicit");\r
1174                                 break;\r
1175                         default:\r
1176                                 text = wxT("Unknown");\r
1177                                 break;\r
1178                         }\r
1179                         text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5);\r
1180                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1181                                 text,\r
1182                                 image, imageSel,\r
1183                                 new OPJMarkerData(wxT("INFO"))\r
1184                                 );\r
1185 \r
1186                         };\r
1187                         break;\r
1188 \r
1189                 /////////\r
1190                 // COM //\r
1191                 /////////\r
1192                 case COM_VAL:\r
1193                         {\r
1194                         #define showlen 25\r
1195                         char comment[showlen];\r
1196                         wxString comments;\r
1197 \r
1198                         if (m_file->Read(twobytes, 2) != 2)\r
1199                                 break;\r
1200                         unsigned short int rcom = STREAM_TO_UINT16(twobytes, 0);\r
1201 \r
1202                         wxString text;\r
1203                         if (rcom == 0)\r
1204                                 text = wxT("Binary values");\r
1205                         else if (rcom == 1)\r
1206                                 text = wxT("ISO 8859-1 (latin-1) values");\r
1207                         else if (rcom < 65535)\r
1208                                 text = wxT("Reserved for registration");\r
1209                         else\r
1210                                 text = wxT("Reserved for extension");\r
1211                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1212                                 text,\r
1213                                 image, imageSel,\r
1214                                 new OPJMarkerData(wxT("INFO"))\r
1215                                 );\r
1216 \r
1217                         if (m_file->Read(comment, showlen) != showlen)\r
1218                                 break;\r
1219                         comments = wxString::FromAscii(comment).Truncate(wxMin(showlen, currlen - 4));\r
1220                         if ((currlen - 4) > showlen)\r
1221                                 comments << wxT("...");\r
1222                         subcurrid3 = m_tree->AppendItem(currid,\r
1223                                 comments,\r
1224                                 image, imageSel,\r
1225                                 new OPJMarkerData(wxT("INFO"))\r
1226                                 );\r
1227                         };\r
1228                         break;\r
1229 \r
1230                 /////////\r
1231                 // TLM //\r
1232                 /////////\r
1233                 case TLM_VAL:\r
1234                         {\r
1235                         if (m_file->Read(onebyte, 1) != 1)\r
1236                                 break;\r
1237                         unsigned char ztlm = onebyte[0];\r
1238 \r
1239                         if (m_file->Read(onebyte, 1) != 1)\r
1240                                 break;\r
1241                         unsigned char stlm = onebyte[0];\r
1242 \r
1243                         image = m_tree->TreeCtrlIcon_File;\r
1244                         imageSel = image + 1;\r
1245 \r
1246                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1247                                 wxString::Format(wxT("TLM #%d"), ztlm),\r
1248                                 image, imageSel,\r
1249                                 new OPJMarkerData(wxT("INFO"))\r
1250                                 );\r
1251 \r
1252                         subcurrid3 = m_tree->AppendItem(currid,\r
1253                                 wxString::Format(wxT("%d bits/index, %d bits/length"),\r
1254                                 8 * ((stlm & 0x30) >> 4), 16 + 16 * ((stlm & 0x40) >> 6)),\r
1255                                 image, imageSel,\r
1256                                 new OPJMarkerData(wxT("INFO"))\r
1257                                 );\r
1258 \r
1259                         int n, numparts;\r
1260 \r
1261                         numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6));\r
1262 \r
1263                         image = m_tree->TreeCtrlIcon_Folder;\r
1264                         imageSel = image + 1;\r
1265 \r
1266                         subcurrid3 = m_tree->AppendItem(currid,\r
1267                                 wxT("Tile parts"),\r
1268                                 image, imageSel,\r
1269                                 new OPJMarkerData(wxT("INFO"))\r
1270                                 );\r
1271 \r
1272                         image = m_tree->TreeCtrlIcon_File;\r
1273                         imageSel = image + 1;\r
1274 \r
1275                         for (n = 0; n < numparts; n++) {\r
1276 \r
1277                                 unsigned short int ttlm;\r
1278                                 unsigned long int ptlm;\r
1279 \r
1280                                 switch (((stlm & 0x30) >> 4)) {\r
1281 \r
1282                                 case 0:\r
1283                                         ttlm = 0;\r
1284                                         break;\r
1285 \r
1286                                 case 1:\r
1287                                         if (m_file->Read(onebyte, 1) != 1)\r
1288                                                 break;\r
1289                                         ttlm = onebyte[0];\r
1290                                         break;\r
1291 \r
1292                                 case 2:\r
1293                                         if (m_file->Read(twobytes, 2) != 2)\r
1294                                                 break;\r
1295                                         ttlm = STREAM_TO_UINT16(twobytes, 0);\r
1296                                         break;\r
1297 \r
1298                                 }\r
1299 \r
1300                                 switch (((stlm & 0x40) >> 6)) {\r
1301 \r
1302                                 case 0:\r
1303                                         if (m_file->Read(twobytes, 2) != 2)\r
1304                                                 break;\r
1305                                         ptlm = STREAM_TO_UINT16(twobytes, 0);\r
1306                                         break;\r
1307 \r
1308                                 case 1:\r
1309                                         if (m_file->Read(fourbytes, 4) != 4)\r
1310                                                 break;\r
1311                                         ptlm = STREAM_TO_UINT32(fourbytes, 0);\r
1312                                         break;\r
1313 \r
1314                                 }\r
1315 \r
1316                                 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1317                                         wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm),\r
1318                                         image, imageSel,\r
1319                                         new OPJMarkerData(wxT("INFO"))\r
1320                                         );\r
1321 \r
1322                         }\r
1323 \r
1324                         }\r
1325                         break;\r
1326 \r
1327                 /////////\r
1328                 // POD //\r
1329                 /////////\r
1330                 case POD_VAL:\r
1331                         {\r
1332                         int n, numchanges;\r
1333 \r
1334                         if (csiz < 257)\r
1335                                 numchanges = (currlen - 2) / 7;\r
1336                         else\r
1337                                 numchanges = (currlen - 2) / 9;\r
1338 \r
1339                         for (n = 0; n < numchanges; n++) {\r
1340 \r
1341                                 image = m_tree->TreeCtrlIcon_Folder;\r
1342                                 imageSel = image + 1;\r
1343 \r
1344                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1345                                         wxString::Format(wxT("Change #%d"), n),\r
1346                                         image, imageSel,\r
1347                                         new OPJMarkerData(wxT("INFO"))\r
1348                                         );\r
1349 \r
1350                                 if (m_file->Read(onebyte, 1) != 1)\r
1351                                         break;\r
1352                                 unsigned char rspod = onebyte[0];\r
1353 \r
1354                                 unsigned short int cspod;\r
1355                                 if (csiz < 257) {\r
1356                                         if (m_file->Read(onebyte, 1) != 1)\r
1357                                                 break;\r
1358                                         cspod = onebyte[0];\r
1359                                 } else {\r
1360                                         if (m_file->Read(twobytes, 2) != 2)\r
1361                                                 break;\r
1362                                         cspod = STREAM_TO_UINT16(twobytes, 0);\r
1363                                 }\r
1364 \r
1365                                 if (m_file->Read(twobytes, 2) != 2)\r
1366                                         break;\r
1367                                 unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0);\r
1368 \r
1369                                 if (m_file->Read(onebyte, 1) != 1)\r
1370                                         break;\r
1371                                 unsigned char repod = onebyte[0];\r
1372 \r
1373                                 unsigned short int cepod;\r
1374                                 if (csiz < 257) {\r
1375                                         if (m_file->Read(onebyte, 1) != 1)\r
1376                                                 break;\r
1377                                         cepod = onebyte[0];\r
1378                                 } else {\r
1379                                         if (m_file->Read(twobytes, 2) != 2)\r
1380                                                 break;\r
1381                                         cepod = STREAM_TO_UINT16(twobytes, 0);\r
1382                                 }\r
1383 \r
1384                                 if (m_file->Read(onebyte, 1) != 1)\r
1385                                         break;\r
1386                                 unsigned char ppod = onebyte[0];\r
1387 \r
1388                                 image = m_tree->TreeCtrlIcon_File;\r
1389                                 imageSel = image + 1;\r
1390 \r
1391                                 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1392                                         wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod),\r
1393                                         image, imageSel,\r
1394                                         new OPJMarkerData(wxT("INFO"))\r
1395                                         );\r
1396 \r
1397                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1398                                         wxString::Format(wxT("%d <= Component < %d"), cspod, cepod),\r
1399                                         image, imageSel,\r
1400                                         new OPJMarkerData(wxT("INFO"))\r
1401                                         );\r
1402 \r
1403                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1404                                         wxString::Format(wxT("0 <= Layer < %d"), lyepod),\r
1405                                         image, imageSel,\r
1406                                         new OPJMarkerData(wxT("INFO"))\r
1407                                         );\r
1408 \r
1409                                 wxString text = wxT("");\r
1410                                 switch (ppod) {\r
1411                                 case (0):\r
1412                                         text << wxT("LRCP");\r
1413                                         break;\r
1414                                 case (1):\r
1415                                         text << wxT("RLCP");\r
1416                                         break;\r
1417                                 case (2):\r
1418                                         text << wxT("LRCP");\r
1419                                         break;\r
1420                                 case (3):\r
1421                                         text << wxT("RPCL");\r
1422                                         break;\r
1423                                 case (4):\r
1424                                         text << wxT("CPRL");\r
1425                                         break;\r
1426                                 default:\r
1427                                         text << wxT("unknown progression");\r
1428                                         break;\r
1429                                 }\r
1430                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1431                                         text,\r
1432                                         image, imageSel,\r
1433                                         new OPJMarkerData(wxT("INFO"))\r
1434                                         );\r
1435                         }\r
1436 \r
1437                         }\r
1438                         break;\r
1439 \r
1440                 /////////\r
1441                 // SOD //\r
1442                 /////////\r
1443                 case SOD_VAL:\r
1444                         {\r
1445                         inside_sod = 1;\r
1446                         };\r
1447                         break;\r
1448 \r
1449                 default:\r
1450                         break;\r
1451                         \r
1452                 }\r
1453                                                                 \r
1454                 // increment number of markers\r
1455                 if (nmarks++ >= maxmarks) {\r
1456                         WriteText(wxT("Maximum amount of markers exceeded"));\r
1457                         break;\r
1458                 }\r
1459 \r
1460                 // advance position\r
1461                 OPJ_ADVANCE(currlen + 2);\r
1462         }       \r
1463 \r
1464         WriteText(wxT("Search finished"));\r
1465 }\r