Enable accepting file names with `-´ symbol .Modification getopt.c
[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: %s (0x%04X)"), nmarks, marker_name[m], marker_val[m]),\r
255                         image, imageSel,\r
256                         new OPJMarkerData(wxT("MARK"), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)\r
257                         );\r
258 \r
259                 // append some info\r
260                 image = m_tree->TreeCtrlIcon_File;\r
261                 imageSel = image + 1;\r
262 \r
263                 // marker name\r
264                 wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
265                         wxT("*** ") + wxString::Format(wxT("%s"), marker_descr[m]) + wxT(" ***"),\r
266                         image, imageSel,\r
267                         new OPJMarkerData(wxT("INFO"))\r
268                         );\r
269                 m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);\r
270 \r
271                 // position and length\r
272                 wxTreeItemId subcurrid2 = m_tree->AppendItem(currid,\r
273                         wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() + \r
274                         wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2),\r
275                         image, imageSel,\r
276                         new OPJMarkerData(wxT("INFO"))\r
277                         );\r
278 \r
279                 // give additional info on markers\r
280                 switch (currmark) {\r
281 \r
282                 /////////\r
283                 // SOP //\r
284                 /////////\r
285                 case SOP_VAL:\r
286                         {\r
287                         // read packet number\r
288                         if (m_file->Read(twobytes, 2) != 2)\r
289                                 break;\r
290                         int packnum = STREAM_TO_UINT16(twobytes, 0);\r
291 \r
292                         image = m_tree->TreeCtrlIcon_File;\r
293                         imageSel = image + 1;\r
294 \r
295                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
296                                 wxString::Format(wxT("Pack. no. %d"), packnum),\r
297                                 image, imageSel,\r
298                                 new OPJMarkerData(wxT("INFO"))\r
299                                 );\r
300                         inside_sop = 1;\r
301                         };\r
302                         break;\r
303 \r
304                 /////////\r
305                 // RED //\r
306                 /////////\r
307                 case RED_VAL:\r
308                         {\r
309                         if (m_file->Read(onebyte, 1) != 1)\r
310                                 break;\r
311                         unsigned char pred = onebyte[0];\r
312 \r
313                         image = m_tree->TreeCtrlIcon_File;\r
314                         imageSel = image + 1;\r
315 \r
316                         wxString address[] = {\r
317                                 wxT("Packet addressing"),\r
318                                 wxT("Byte-range addressing"),\r
319                                 wxT("Packet-range addressing"),\r
320                                 wxT("Reserved")\r
321                         };\r
322 \r
323                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
324                                 address[(pred & 0xC0) >> 6],\r
325                                 image, imageSel,\r
326                                 new OPJMarkerData(wxT("INFO"))\r
327                                 );\r
328 \r
329                         subcurrid = m_tree->AppendItem(currid,\r
330                                 wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2),\r
331                                 image, imageSel,\r
332                                 new OPJMarkerData(wxT("INFO"))\r
333                                 );\r
334 \r
335                         subcurrid = m_tree->AppendItem(currid,\r
336                                 pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"),\r
337                                 image, imageSel,\r
338                                 new OPJMarkerData(wxT("INFO"))\r
339                                 );\r
340 \r
341                         subcurrid = m_tree->AppendItem(currid,\r
342                                 wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3),\r
343                                 image, imageSel,\r
344                                 new OPJMarkerData(wxT("INFO"))\r
345                                 );\r
346 \r
347                         }\r
348                         break;\r
349 \r
350                 /////////\r
351                 // ESD //\r
352                 /////////\r
353                 case ESD_VAL:\r
354                         {\r
355                         unsigned short int cesd;\r
356                         if (csiz < 257) {\r
357                                 if (m_file->Read(onebyte, 1) != 1)\r
358                                         break;\r
359                                 cesd = onebyte[0];\r
360                         } else {\r
361                                 if (m_file->Read(twobytes, 2) != 2)\r
362                                         break;\r
363                                 cesd = STREAM_TO_UINT16(twobytes, 0);\r
364                         }\r
365 \r
366                         if (m_file->Read(onebyte, 1) != 1)\r
367                                 break;\r
368                         unsigned char pesd = onebyte[0];\r
369 \r
370                         image = m_tree->TreeCtrlIcon_File;\r
371                         imageSel = image + 1;\r
372 \r
373                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
374                                 pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd),\r
375                                 image, imageSel,\r
376                                 new OPJMarkerData(wxT("INFO"))\r
377                                 );\r
378 \r
379                         wxString meth[] = {\r
380                                 wxT("Relative error sensitivity"),\r
381                                 wxT("MSE"),\r
382                                 wxT("MSE reduction"),\r
383                                 wxT("PSNR"),\r
384                                 wxT("PSNR increase"),\r
385                                 wxT("MAXERR (absolute peak error)"),\r
386                                 wxT("TSE (total squared error)"),\r
387                                 wxT("Reserved")\r
388                         };\r
389 \r
390                         subcurrid = m_tree->AppendItem(currid,\r
391                                 meth[(pesd & 0x38) >> 3],\r
392                                 image, imageSel,\r
393                                 new OPJMarkerData(wxT("INFO"))\r
394                                 );\r
395 \r
396                         wxString address[] = {\r
397                                 wxT("Packet addressing"),\r
398                                 wxT("Byte-range addressing"),\r
399                                 wxT("Packet-range addressing"),\r
400                                 wxT("Reserved")\r
401                         };\r
402 \r
403                         subcurrid = m_tree->AppendItem(currid,\r
404                                 address[(pesd & 0xC0) >> 6],\r
405                                 image, imageSel,\r
406                                 new OPJMarkerData(wxT("INFO"))\r
407                                 );\r
408 \r
409                         subcurrid = m_tree->AppendItem(currid,\r
410                                 wxString::Format(wxT("%d bytes/value, %d bytes range"), ((pesd & 0x04) >> 2) + 1, (((pesd & 0x02) >> 1) + 1) * 2),\r
411                                 image, imageSel,\r
412                                 new OPJMarkerData(wxT("INFO"))\r
413                                 );\r
414 \r
415                         }\r
416                         break;\r
417 \r
418                 /////////\r
419                 // EPC //\r
420                 /////////\r
421                 case EPC_VAL:\r
422                         {\r
423                         if (m_file->Read(twobytes, 2) != 2)\r
424                                 break;\r
425                         unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0);\r
426 \r
427                         if (m_file->Read(fourbytes, 4) != 4)\r
428                                 break;\r
429                         unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0);\r
430 \r
431                         if (m_file->Read(onebyte, 1) != 1)\r
432                                 break;\r
433                         unsigned char pepc = onebyte[0];\r
434 \r
435                         image = m_tree->TreeCtrlIcon_File;\r
436                         imageSel = image + 1;\r
437 \r
438                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
439                                 wxString::Format(wxT("CRC-16 = 0x%x"), pcrc),\r
440                                 image, imageSel,\r
441                                 new OPJMarkerData(wxT("INFO"))\r
442                                 );\r
443 \r
444                         subcurrid = m_tree->AppendItem(currid,\r
445                                 wxString::Format(wxT("Tot. length = %d"), dl),\r
446                                 image, imageSel,\r
447                                 new OPJMarkerData(wxT("INFO"))\r
448                                 );\r
449 \r
450                         subcurrid = m_tree->AppendItem(currid,\r
451                                 wxString::Format(wxT("%s%s%s%s"),\r
452                                         pepc & 0x10 ? wxT("ESD, ") : wxT(""),\r
453                                         pepc & 0x20 ? wxT("RED, ") : wxT(""),\r
454                                         pepc & 0x40 ? wxT("EPB, ") : wxT(""),\r
455                                         pepc & 0x80 ? wxT("Info") : wxT("")\r
456                                         ),\r
457                                 image, imageSel,\r
458                                 new OPJMarkerData(wxT("INFO"))\r
459                                 );\r
460 \r
461                         }\r
462                         break;\r
463 \r
464                 /////////\r
465                 // EPB //\r
466                 /////////\r
467                 case EPB_VAL:\r
468                         {\r
469                         if (m_file->Read(onebyte, 1) != 1)\r
470                                 break;\r
471                         unsigned char depb = onebyte[0];\r
472 \r
473                         if (m_file->Read(fourbytes, 4) != 4)\r
474                                 break;\r
475                         unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0);\r
476 \r
477                         if (m_file->Read(fourbytes, 4) != 4)\r
478                                 break;\r
479                         unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0);\r
480 \r
481                         image = m_tree->TreeCtrlIcon_File;\r
482                         imageSel = image + 1;\r
483 \r
484                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
485                                 wxString::Format(wxT("No. %d, %slatest, %spacked"),\r
486                                         depb & 0x3F,\r
487                                         depb & 0x40 ? wxT("") : wxT("not "),\r
488                                         depb & 0x80 ? wxT("") : wxT("un")),\r
489                                 image, imageSel,\r
490                                 new OPJMarkerData(wxT("INFO"))\r
491                                 );\r
492 \r
493                         subcurrid = m_tree->AppendItem(currid,\r
494                                 wxString::Format(wxT("%d bytes protected"), ldpepb),\r
495                                 image, imageSel,\r
496                                 new OPJMarkerData(wxT("INFO"))\r
497                                 );\r
498 \r
499                         if (pepb == 0x00000000)\r
500 \r
501                                 subcurrid = m_tree->AppendItem(currid,\r
502                                         wxT("Predefined codes"),\r
503                                         image, imageSel,\r
504                                         new OPJMarkerData(wxT("INFO"))\r
505                                         );\r
506 \r
507                         else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) {\r
508 \r
509                                 wxString text = wxT("CRC code");\r
510                                 if (pepb == 0x10000000)\r
511                                         text << wxT(", CCITT (X25) 16 bits");\r
512                                 else if (pepb == 0x10000001)\r
513                                         text << wxT(", Ethernet 32 bits");\r
514                                 else\r
515                                         text << wxT(", JPWL RA");\r
516                                 subcurrid = m_tree->AppendItem(currid,\r
517                                         text,\r
518                                         image, imageSel,\r
519                                         new OPJMarkerData(wxT("INFO"))\r
520                                         );\r
521 \r
522                         } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) {\r
523 \r
524                                 wxString text;\r
525                                 subcurrid = m_tree->AppendItem(currid,\r
526                                         wxString::Format(wxT("RS code, RS(%d, %d)"),\r
527                                                 (pepb & 0x0000FF00) >> 8,\r
528                                                 (pepb & 0x000000FF)),\r
529                                         image, imageSel,\r
530                                         new OPJMarkerData(wxT("INFO"))\r
531                                         );\r
532 \r
533                         } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE))\r
534 \r
535                                 subcurrid = m_tree->AppendItem(currid,\r
536                                         wxT("JPWL RA"),\r
537                                         image, imageSel,\r
538                                         new OPJMarkerData(wxT("INFO"))\r
539                                         );\r
540 \r
541                         else if (pepb == 0xFFFFFFFF)\r
542 \r
543                                 subcurrid = m_tree->AppendItem(currid,\r
544                                         wxT("No method"),\r
545                                         image, imageSel,\r
546                                         new OPJMarkerData(wxT("INFO"))\r
547                                         );\r
548 \r
549                         }\r
550                         break;\r
551 \r
552                 /////////\r
553                 // SIZ //\r
554                 /////////\r
555                 case SIZ_VAL:\r
556                         {\r
557                         int c;\r
558 \r
559                         if (m_file->Read(twobytes, 2) != 2)\r
560                                 break;\r
561                         unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);\r
562 \r
563                         if (m_file->Read(fourbytes, 4) != 4)\r
564                                 break;\r
565                         unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);\r
566 \r
567                         if (m_file->Read(fourbytes, 4) != 4)\r
568                                 break;\r
569                         unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);\r
570 \r
571                         if (m_file->Read(fourbytes, 4) != 4)\r
572                                 break;\r
573                         unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0);\r
574 \r
575                         if (m_file->Read(fourbytes, 4) != 4)\r
576                                 break;\r
577                         unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0);\r
578 \r
579                         if (m_file->Read(fourbytes, 4) != 4)\r
580                                 break;\r
581                         unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0);\r
582                         this->m_tree->m_childframe->m_twidth = xtsiz;\r
583 \r
584                         if (m_file->Read(fourbytes, 4) != 4)\r
585                                 break;\r
586                         unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0);\r
587                         this->m_tree->m_childframe->m_theight = ytsiz;\r
588 \r
589                         if (m_file->Read(fourbytes, 4) != 4)\r
590                                 break;\r
591                         unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0);\r
592                         this->m_tree->m_childframe->m_tx = xtosiz;\r
593 \r
594                         if (m_file->Read(fourbytes, 4) != 4)\r
595                                 break;\r
596                         unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0);\r
597                         this->m_tree->m_childframe->m_ty = ytosiz;\r
598 \r
599                         if (m_file->Read(twobytes, 2) != 2)\r
600                                 break;\r
601                         csiz = STREAM_TO_UINT16(twobytes, 0);\r
602 \r
603                         bool equaldepth = true, equalsize = true;\r
604                         unsigned char *ssiz  = new unsigned char(csiz);\r
605                         unsigned char *xrsiz = new unsigned char(csiz);\r
606                         unsigned char *yrsiz = new unsigned char(csiz);\r
607 \r
608                         for (c = 0; c < csiz; c++) {\r
609 \r
610                                 if (m_file->Read(&ssiz[c], 1) != 1)\r
611                                         break;\r
612 \r
613                                 if (c > 0)\r
614                                         equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]);\r
615 \r
616                                 if (m_file->Read(&xrsiz[c], 1) != 1)\r
617                                         break;\r
618 \r
619                                 if (m_file->Read(&yrsiz[c], 1) != 1)\r
620                                         break;\r
621 \r
622                                 if (c > 0)\r
623                                         equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ;\r
624 \r
625                         }\r
626 \r
627                         if (equaldepth && equalsize)\r
628                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
629                                         wxString::Format(wxT("I: %dx%d (%d, %d), %d c., %d%s bpp"),\r
630                                         xsiz, ysiz,\r
631                                         xosiz, yosiz,\r
632                                         csiz, ((ssiz[0] & 0x7F) + 1),\r
633                                         (ssiz[0] & 0x80) ? wxT("s") : wxT("u")),\r
634                                         image, imageSel,\r
635                                         new OPJMarkerData(wxT("INFO"))\r
636                                         );\r
637                         else\r
638                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
639                                         wxString::Format(wxT("I: %dx%d (%d, %d), %d c."),\r
640                                         xsiz, ysiz,\r
641                                         xosiz, yosiz,\r
642                                         csiz),\r
643                                         image, imageSel,\r
644                                         new OPJMarkerData(wxT("INFO"))\r
645                                         );\r
646 \r
647                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
648                                 wxString::Format(wxT("T: %dx%d (%d, %d)"),\r
649                                 xtsiz, ytsiz,\r
650                                 xtosiz, ytosiz),\r
651                                 image, imageSel,\r
652                                 new OPJMarkerData(wxT("INFO"))\r
653                                 );\r
654 \r
655                         image = m_tree->TreeCtrlIcon_Folder;\r
656                         imageSel = image + 1;\r
657 \r
658                         wxTreeItemId subcurrid4 = m_tree->AppendItem(currid,\r
659                                 wxT("Components"),\r
660                                 image, imageSel,\r
661                                 new OPJMarkerData(wxT("INFO"))\r
662                                 );\r
663 \r
664                         image = m_tree->TreeCtrlIcon_File;\r
665                         imageSel = image + 1;\r
666 \r
667                         for (c = 0; c < csiz; c++) {\r
668 \r
669                                 wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4,\r
670                                         wxString::Format(wxT("#%d: %dx%d, %d%s bpp"),\r
671                                         c,\r
672                                         xsiz/xrsiz[c], ysiz/yrsiz[c],\r
673                                         ((ssiz[c] & 0x7F) + 1),\r
674                                         (ssiz[c] & 0x80) ? wxT("s") : wxT("u")),\r
675                                         image, imageSel,\r
676                                         new OPJMarkerData(wxT("INFO"))\r
677                                         );\r
678 \r
679                         }\r
680 \r
681                         };\r
682                         break;\r
683 \r
684                 /////////\r
685                 // SOT //\r
686                 /////////\r
687                 case SOT_VAL:\r
688                         {\r
689                         if (m_file->Read(twobytes, 2) != 2)\r
690                                 break;\r
691                         unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);\r
692 \r
693                         if (m_file->Read(fourbytes, 4) != 4)\r
694                                 break;\r
695                         unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);\r
696 \r
697                         if (m_file->Read(onebyte, 1) != 1)\r
698                                 break;\r
699                         unsigned char tpsot = onebyte[0];\r
700 \r
701                         if (m_file->Read(onebyte, 1) != 1)\r
702                                 break;\r
703                         unsigned char tnsot = onebyte[0];\r
704 \r
705                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
706                                 wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot),\r
707                                 image, imageSel,\r
708                                 new OPJMarkerData(wxT("INFO"))\r
709                                 );\r
710 \r
711                         lastPsot = psot;\r
712                         lastsotpos = offset;\r
713                         inside_sod = 0;\r
714                         };\r
715                         break;\r
716 \r
717                 /////////\r
718                 // COC //\r
719                 /////////\r
720                 case COC_VAL:\r
721                         {\r
722                         unsigned short int ccoc;\r
723                         if (csiz < 257) {\r
724                                 if (m_file->Read(onebyte, 1) != 1)\r
725                                         break;\r
726                                 ccoc = onebyte[0];\r
727                         } else {\r
728                                 if (m_file->Read(twobytes, 2) != 2)\r
729                                         break;\r
730                                 ccoc = STREAM_TO_UINT16(twobytes, 0);\r
731                         }\r
732 \r
733                         if (m_file->Read(onebyte, 1) != 1)\r
734                                 break;\r
735                         unsigned char scoc = onebyte[0];\r
736 \r
737                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
738                                 wxString::Format(wxT("Comp. no. %d"), ccoc),\r
739                                 image, imageSel,\r
740                                 new OPJMarkerData(wxT("INFO"))\r
741                                 );\r
742                         \r
743                         wxString text;\r
744                         if (scoc & 0x01)\r
745                                 text << wxT("Partitioned entropy coder");\r
746                         else\r
747                                 text << wxT("Unpartitioned entropy coder");\r
748 \r
749                         subcurrid = m_tree->AppendItem(currid,\r
750                                 text,\r
751                                 image, imageSel,\r
752                                 new OPJMarkerData(wxT("INFO"))\r
753                                 );\r
754 \r
755                         if (m_file->Read(onebyte, 1) != 1)\r
756                                 break;\r
757                         unsigned char decomplevs = onebyte[0];\r
758 \r
759                         if (m_file->Read(onebyte, 1) != 1)\r
760                                 break;\r
761                         unsigned char cbswidth = onebyte[0];\r
762 \r
763                         if (m_file->Read(onebyte, 1) != 1)\r
764                                 break;\r
765                         unsigned char cbsheight = onebyte[0];\r
766 \r
767                         if (m_file->Read(onebyte, 1) != 1)\r
768                                 break;\r
769                         unsigned char cbstyle = onebyte[0];\r
770 \r
771                         if (m_file->Read(onebyte, 1) != 1)\r
772                                 break;\r
773                         unsigned char transform = onebyte[0];\r
774 \r
775                         subcurrid = m_tree->AppendItem(currid,\r
776                                 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
777                                 image, imageSel,\r
778                                 new OPJMarkerData(wxT("INFO"))\r
779                                 );\r
780 \r
781                         if (transform & 0x01)\r
782                                 text = wxT("5-3 reversible wavelet");\r
783                         else\r
784                                 text = wxT("9-7 irreversible wavelet");\r
785                         subcurrid = m_tree->AppendItem(currid,\r
786                                 text,\r
787                                 image, imageSel,\r
788                                 new OPJMarkerData(wxT("INFO"))\r
789                                 );\r
790 \r
791                         subcurrid = m_tree->AppendItem(currid,\r
792                                 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
793                                 image, imageSel,\r
794                                 new OPJMarkerData(wxT("INFO"))\r
795                                 );\r
796 \r
797                         image = m_tree->TreeCtrlIcon_Folder;\r
798                         imageSel = image + 1;\r
799 \r
800                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
801                                 wxT("Coding styles"),\r
802                                 image, imageSel,\r
803                                 new OPJMarkerData(wxT("INFO"))\r
804                                 );\r
805 \r
806                         image = m_tree->TreeCtrlIcon_File;\r
807                         imageSel = image + 1;\r
808 \r
809                         if (cbstyle & 0x01)\r
810                                 text = wxT("Selective arithmetic coding bypass");\r
811                         else\r
812                                 text = wxT("No selective arithmetic coding bypass");\r
813                         wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
814                                 text,\r
815                                 image, imageSel,\r
816                                 new OPJMarkerData(wxT("INFO"))\r
817                                 );\r
818 \r
819                         if (cbstyle & 0x02)\r
820                                 text = wxT("Reset context probabilities on coding pass boundaries");\r
821                         else\r
822                                 text = wxT("No reset of context probabilities on coding pass boundaries");\r
823                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
824                                 text,\r
825                                 image, imageSel,\r
826                                 new OPJMarkerData(wxT("INFO"))\r
827                                 );\r
828 \r
829                         if (cbstyle & 0x04)\r
830                                 text = wxT("Termination on each coding passs");\r
831                         else\r
832                                 text = wxT("No termination on each coding pass");\r
833                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
834                                 text,\r
835                                 image, imageSel,\r
836                                 new OPJMarkerData(wxT("INFO"))\r
837                                 );\r
838 \r
839                         if (cbstyle & 0x08)\r
840                                 text = wxT("Vertically stripe causal context");\r
841                         else\r
842                                 text = wxT("No vertically stripe causal context");\r
843                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
844                                 text,\r
845                                 image, imageSel,\r
846                                 new OPJMarkerData(wxT("INFO"))\r
847                                 );\r
848 \r
849                         if (cbstyle & 0x10)\r
850                                 text = wxT("Predictable termination");\r
851                         else\r
852                                 text = wxT("No predictable termination");\r
853                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
854                                 text,\r
855                                 image, imageSel,\r
856                                 new OPJMarkerData(wxT("INFO"))\r
857                                 );\r
858 \r
859                         if (cbstyle & 0x20)\r
860                                 text = wxT("Segmentation symbols are used");\r
861                         else\r
862                                 text = wxT("No segmentation symbols are used");\r
863                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
864                                 text,\r
865                                 image, imageSel,\r
866                                 new OPJMarkerData(wxT("INFO"))\r
867                                 );\r
868 \r
869                         }\r
870                         break;\r
871 \r
872                 /////////\r
873                 // COD //\r
874                 /////////\r
875                 case COD_VAL:\r
876                         {\r
877                         if (m_file->Read(onebyte, 1) != 1)\r
878                                 break;\r
879                         unsigned char scod = onebyte[0];\r
880 \r
881                         wxString text;\r
882 \r
883                         if (scod & 0x01)\r
884                                 text << wxT("Partitioned entropy coder");\r
885                         else\r
886                                 text << wxT("Unpartitioned entropy coder");\r
887 \r
888                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
889                                 text,\r
890                                 image, imageSel,\r
891                                 new OPJMarkerData(wxT("INFO"))\r
892                                 );\r
893 \r
894                         text = wxT("");\r
895                         if (scod & 0x02)\r
896                                 text << wxT("Possible SOPs");\r
897                         else\r
898                                 text << wxT("No SOPs");\r
899 \r
900                         if (scod & 0x04)\r
901                                 text << wxT(", possible EPHs");\r
902                         else\r
903                                 text << wxT(", no EPHs");\r
904 \r
905                         subcurrid3 = m_tree->AppendItem(currid,\r
906                                 text,\r
907                                 image, imageSel,\r
908                                 new OPJMarkerData(wxT("INFO"))\r
909                                 );\r
910 \r
911                         if (m_file->Read(onebyte, 1) != 1)\r
912                                 break;\r
913                         unsigned char progord = onebyte[0];\r
914 \r
915                         if (m_file->Read(twobytes, 2) != 2)\r
916                                 break;\r
917                         unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0);\r
918 \r
919                         if (m_file->Read(onebyte, 1) != 1)\r
920                                 break;\r
921                         unsigned char mctransform = onebyte[0];\r
922 \r
923                         if (m_file->Read(onebyte, 1) != 1)\r
924                                 break;\r
925                         unsigned char decomplevs = onebyte[0];\r
926 \r
927                         if (m_file->Read(onebyte, 1) != 1)\r
928                                 break;\r
929                         unsigned char cbswidth = onebyte[0];\r
930 \r
931                         if (m_file->Read(onebyte, 1) != 1)\r
932                                 break;\r
933                         unsigned char cbsheight = onebyte[0];\r
934 \r
935                         if (m_file->Read(onebyte, 1) != 1)\r
936                                 break;\r
937                         unsigned char cbstyle = onebyte[0];\r
938 \r
939                         if (m_file->Read(onebyte, 1) != 1)\r
940                                 break;\r
941                         unsigned char transform = onebyte[0];\r
942 \r
943                         subcurrid3 = m_tree->AppendItem(currid,\r
944                                 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
945                                 image, imageSel,\r
946                                 new OPJMarkerData(wxT("INFO"))\r
947                                 );\r
948 \r
949                         text = wxT("");\r
950                         switch (progord) {\r
951                         case (0):\r
952                                 text << wxT("LRCP");\r
953                                 break;\r
954                         case (1):\r
955                                 text << wxT("RLCP");\r
956                                 break;\r
957                         case (2):\r
958                                 text << wxT("LRCP");\r
959                                 break;\r
960                         case (3):\r
961                                 text << wxT("RPCL");\r
962                                 break;\r
963                         case (4):\r
964                                 text << wxT("CPRL");\r
965                                 break;\r
966                         default:\r
967                                 text << wxT("unknown progression");\r
968                                 break;\r
969                         }\r
970                         text << wxString::Format(wxT(", %d layers"), numlayers);\r
971                         if (transform & 0x01)\r
972                                 text << wxT(", 5-3 rev.");\r
973                         else\r
974                                 text << wxT(", 9-7 irr.");\r
975                         subcurrid3 = m_tree->AppendItem(currid,\r
976                                 text,\r
977                                 image, imageSel,\r
978                                 new OPJMarkerData(wxT("INFO"))\r
979                                 );\r
980 \r
981                         subcurrid3 = m_tree->AppendItem(currid,\r
982                                 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
983                                 image, imageSel,\r
984                                 new OPJMarkerData(wxT("INFO"))\r
985                                 );\r
986 \r
987                         switch (mctransform) {\r
988                         case (0):\r
989                                 {\r
990                                 text = wxT("No MCT");\r
991                                 }\r
992                                 break;\r
993                         case (1):\r
994                                 {\r
995                                 text = wxT("Reversible MCT on 0, 1, 2");\r
996                                 }\r
997                                 break;\r
998                         case (2):\r
999                                 {\r
1000                                 text = wxT("Irreversible MCT on 0, 1, 2");\r
1001                                 }\r
1002                                 break;\r
1003                         default:\r
1004                                 {\r
1005                                 text = wxT("Unknown");\r
1006                                 }\r
1007                                 break;\r
1008                         };\r
1009                         subcurrid3 = m_tree->AppendItem(currid,\r
1010                                 text,\r
1011                                 image, imageSel,\r
1012                                 new OPJMarkerData(wxT("INFO"))\r
1013                                 );\r
1014 \r
1015 \r
1016                         image = m_tree->TreeCtrlIcon_Folder;\r
1017                         imageSel = image + 1;\r
1018 \r
1019                         subcurrid3 = m_tree->AppendItem(currid,\r
1020                                 wxT("Coding styles"),\r
1021                                 image, imageSel,\r
1022                                 new OPJMarkerData(wxT("INFO"))\r
1023                                 );\r
1024 \r
1025                         image = m_tree->TreeCtrlIcon_File;\r
1026                         imageSel = image + 1;\r
1027 \r
1028                         if (cbstyle & 0x01)\r
1029                                 text = wxT("Selective arithmetic coding bypass");\r
1030                         else\r
1031                                 text = wxT("No selective arithmetic coding bypass");\r
1032                         wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1033                                 text,\r
1034                                 image, imageSel,\r
1035                                 new OPJMarkerData(wxT("INFO"))\r
1036                                 );\r
1037 \r
1038                         if (cbstyle & 0x02)\r
1039                                 text = wxT("Reset context probabilities on coding pass boundaries");\r
1040                         else\r
1041                                 text = wxT("No reset of context probabilities on coding pass boundaries");\r
1042                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1043                                 text,\r
1044                                 image, imageSel,\r
1045                                 new OPJMarkerData(wxT("INFO"))\r
1046                                 );\r
1047 \r
1048                         if (cbstyle & 0x04)\r
1049                                 text = wxT("Termination on each coding passs");\r
1050                         else\r
1051                                 text = wxT("No termination on each coding pass");\r
1052                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1053                                 text,\r
1054                                 image, imageSel,\r
1055                                 new OPJMarkerData(wxT("INFO"))\r
1056                                 );\r
1057 \r
1058                         if (cbstyle & 0x08)\r
1059                                 text = wxT("Vertically stripe causal context");\r
1060                         else\r
1061                                 text = wxT("No vertically stripe causal context");\r
1062                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1063                                 text,\r
1064                                 image, imageSel,\r
1065                                 new OPJMarkerData(wxT("INFO"))\r
1066                                 );\r
1067 \r
1068                         if (cbstyle & 0x10)\r
1069                                 text = wxT("Predictable termination");\r
1070                         else\r
1071                                 text = wxT("No predictable termination");\r
1072                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1073                                 text,\r
1074                                 image, imageSel,\r
1075                                 new OPJMarkerData(wxT("INFO"))\r
1076                                 );\r
1077 \r
1078                         if (cbstyle & 0x20)\r
1079                                 text = wxT("Segmentation symbols are used");\r
1080                         else\r
1081                                 text = wxT("No segmentation symbols are used");\r
1082                         subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1083                                 text,\r
1084                                 image, imageSel,\r
1085                                 new OPJMarkerData(wxT("INFO"))\r
1086                                 );\r
1087 \r
1088                         };\r
1089                         break;\r
1090 \r
1091                 /////////\r
1092                 // QCC //\r
1093                 /////////\r
1094                 case QCC_VAL:\r
1095                         {\r
1096                         unsigned short int cqcc;\r
1097                         if (csiz < 257) {\r
1098                                 if (m_file->Read(onebyte, 1) != 1)\r
1099                                         break;\r
1100                                 cqcc = onebyte[0];\r
1101                         } else {\r
1102                                 if (m_file->Read(twobytes, 2) != 2)\r
1103                                         break;\r
1104                                 cqcc = STREAM_TO_UINT16(twobytes, 0);\r
1105                         }\r
1106 \r
1107                         wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
1108                                 wxString::Format(wxT("Comp. no. %d"), cqcc),\r
1109                                 image, imageSel,\r
1110                                 new OPJMarkerData(wxT("INFO"))\r
1111                                 );\r
1112                         \r
1113                         if (m_file->Read(onebyte, 1) != 1)\r
1114                                 break;\r
1115                         unsigned char sqcc = onebyte[0];\r
1116 \r
1117                         wxString text;\r
1118                         switch (sqcc & 0x1F) {\r
1119                         case (0):\r
1120                                 text = wxT("No quantization");\r
1121                                 break;\r
1122                         case (1):\r
1123                                 text = wxT("Scalar implicit");\r
1124                                 break;\r
1125                         case (2):\r
1126                                 text = wxT("Scalar explicit");\r
1127                                 break;\r
1128                         default:\r
1129                                 text = wxT("Unknown");\r
1130                                 break;\r
1131                         }\r
1132                         text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5);\r
1133                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1134                                 text,\r
1135                                 image, imageSel,\r
1136                                 new OPJMarkerData(wxT("INFO"))\r
1137                                 );\r
1138 \r
1139                         }\r
1140                         break;\r
1141 \r
1142                 /////////\r
1143                 // QCD //\r
1144                 /////////\r
1145                 case QCD_VAL:\r
1146                         {\r
1147                         if (m_file->Read(onebyte, 1) != 1)\r
1148                                 break;\r
1149                         unsigned char sqcd = onebyte[0];\r
1150 \r
1151                         wxString text;\r
1152                         switch (sqcd & 0x1F) {\r
1153                         case (0):\r
1154                                 text = wxT("No quantization");\r
1155                                 break;\r
1156                         case (1):\r
1157                                 text = wxT("Scalar implicit");\r
1158                                 break;\r
1159                         case (2):\r
1160                                 text = wxT("Scalar explicit");\r
1161                                 break;\r
1162                         default:\r
1163                                 text = wxT("Unknown");\r
1164                                 break;\r
1165                         }\r
1166                         text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5);\r
1167                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1168                                 text,\r
1169                                 image, imageSel,\r
1170                                 new OPJMarkerData(wxT("INFO"))\r
1171                                 );\r
1172 \r
1173                         };\r
1174                         break;\r
1175 \r
1176                 /////////\r
1177                 // COM //\r
1178                 /////////\r
1179                 case COM_VAL:\r
1180                         {\r
1181                         #define showlen 25\r
1182                         unsigned char comment[showlen];\r
1183 \r
1184                         if (m_file->Read(twobytes, 2) != 2)\r
1185                                 break;\r
1186                         unsigned short int rcom = STREAM_TO_UINT16(twobytes, 0);\r
1187 \r
1188                         wxString text;\r
1189                         if (rcom == 0)\r
1190                                 text = wxT("Binary values");\r
1191                         else if (rcom == 1)\r
1192                                 text = wxT("ISO 8859-1 (latin-1) values");\r
1193                         else if (rcom < 65535)\r
1194                                 text = wxT("Reserved for registration");\r
1195                         else\r
1196                                 text = wxT("Reserved for extension");\r
1197                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1198                                 text,\r
1199                                 image, imageSel,\r
1200                                 new OPJMarkerData(wxT("INFO"))\r
1201                                 );\r
1202 \r
1203                         if (m_file->Read(comment, showlen) != showlen)\r
1204                                 break;\r
1205                         subcurrid3 = m_tree->AppendItem(currid,\r
1206                                 wxString::Format(wxT("%.*s%s"), wxMin(showlen, currlen - 4), comment,\r
1207                                 (((currlen - 4) > showlen) ? "..." : "")),\r
1208                                 image, imageSel,\r
1209                                 new OPJMarkerData(wxT("INFO"))\r
1210                                 );\r
1211                         };\r
1212                         break;\r
1213 \r
1214                 /////////\r
1215                 // TLM //\r
1216                 /////////\r
1217                 case TLM_VAL:\r
1218                         {\r
1219                         if (m_file->Read(onebyte, 1) != 1)\r
1220                                 break;\r
1221                         unsigned char ztlm = onebyte[0];\r
1222 \r
1223                         if (m_file->Read(onebyte, 1) != 1)\r
1224                                 break;\r
1225                         unsigned char stlm = onebyte[0];\r
1226 \r
1227                         image = m_tree->TreeCtrlIcon_File;\r
1228                         imageSel = image + 1;\r
1229 \r
1230                         wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1231                                 wxString::Format(wxT("TLM #%d"), ztlm),\r
1232                                 image, imageSel,\r
1233                                 new OPJMarkerData(wxT("INFO"))\r
1234                                 );\r
1235 \r
1236                         subcurrid3 = m_tree->AppendItem(currid,\r
1237                                 wxString::Format(wxT("%d bits/index, %d bits/length"),\r
1238                                 8 * ((stlm & 0x30) >> 4), 16 + 16 * ((stlm & 0x40) >> 6)),\r
1239                                 image, imageSel,\r
1240                                 new OPJMarkerData(wxT("INFO"))\r
1241                                 );\r
1242 \r
1243                         int n, numparts;\r
1244 \r
1245                         numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6));\r
1246 \r
1247                         image = m_tree->TreeCtrlIcon_Folder;\r
1248                         imageSel = image + 1;\r
1249 \r
1250                         subcurrid3 = m_tree->AppendItem(currid,\r
1251                                 wxT("Tile parts"),\r
1252                                 image, imageSel,\r
1253                                 new OPJMarkerData(wxT("INFO"))\r
1254                                 );\r
1255 \r
1256                         image = m_tree->TreeCtrlIcon_File;\r
1257                         imageSel = image + 1;\r
1258 \r
1259                         for (n = 0; n < numparts; n++) {\r
1260 \r
1261                                 unsigned short int ttlm;\r
1262                                 unsigned long int ptlm;\r
1263 \r
1264                                 switch (((stlm & 0x30) >> 4)) {\r
1265 \r
1266                                 case 0:\r
1267                                         ttlm = 0;\r
1268                                         break;\r
1269 \r
1270                                 case 1:\r
1271                                         if (m_file->Read(onebyte, 1) != 1)\r
1272                                                 break;\r
1273                                         ttlm = onebyte[0];\r
1274                                         break;\r
1275 \r
1276                                 case 2:\r
1277                                         if (m_file->Read(twobytes, 2) != 2)\r
1278                                                 break;\r
1279                                         ttlm = STREAM_TO_UINT16(twobytes, 0);\r
1280                                         break;\r
1281 \r
1282                                 }\r
1283 \r
1284                                 switch (((stlm & 0x40) >> 6)) {\r
1285 \r
1286                                 case 0:\r
1287                                         if (m_file->Read(twobytes, 2) != 2)\r
1288                                                 break;\r
1289                                         ptlm = STREAM_TO_UINT16(twobytes, 0);\r
1290                                         break;\r
1291 \r
1292                                 case 1:\r
1293                                         if (m_file->Read(fourbytes, 4) != 4)\r
1294                                                 break;\r
1295                                         ptlm = STREAM_TO_UINT32(fourbytes, 0);\r
1296                                         break;\r
1297 \r
1298                                 }\r
1299 \r
1300                                 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1301                                         wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm),\r
1302                                         image, imageSel,\r
1303                                         new OPJMarkerData(wxT("INFO"))\r
1304                                         );\r
1305 \r
1306                         }\r
1307 \r
1308                         }\r
1309                         break;\r
1310 \r
1311                 /////////\r
1312                 // POD //\r
1313                 /////////\r
1314                 case POD_VAL:\r
1315                         {\r
1316                         int n, numchanges;\r
1317 \r
1318                         if (csiz < 257)\r
1319                                 numchanges = (currlen - 2) / 7;\r
1320                         else\r
1321                                 numchanges = (currlen - 2) / 9;\r
1322 \r
1323                         for (n = 0; n < numchanges; n++) {\r
1324 \r
1325                                 image = m_tree->TreeCtrlIcon_Folder;\r
1326                                 imageSel = image + 1;\r
1327 \r
1328                                 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
1329                                         wxString::Format(wxT("Change #%d"), n),\r
1330                                         image, imageSel,\r
1331                                         new OPJMarkerData(wxT("INFO"))\r
1332                                         );\r
1333 \r
1334                                 if (m_file->Read(onebyte, 1) != 1)\r
1335                                         break;\r
1336                                 unsigned char rspod = onebyte[0];\r
1337 \r
1338                                 unsigned short int cspod;\r
1339                                 if (csiz < 257) {\r
1340                                         if (m_file->Read(onebyte, 1) != 1)\r
1341                                                 break;\r
1342                                         cspod = onebyte[0];\r
1343                                 } else {\r
1344                                         if (m_file->Read(twobytes, 2) != 2)\r
1345                                                 break;\r
1346                                         cspod = STREAM_TO_UINT16(twobytes, 0);\r
1347                                 }\r
1348 \r
1349                                 if (m_file->Read(twobytes, 2) != 2)\r
1350                                         break;\r
1351                                 unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0);\r
1352 \r
1353                                 if (m_file->Read(onebyte, 1) != 1)\r
1354                                         break;\r
1355                                 unsigned char repod = onebyte[0];\r
1356 \r
1357                                 unsigned short int cepod;\r
1358                                 if (csiz < 257) {\r
1359                                         if (m_file->Read(onebyte, 1) != 1)\r
1360                                                 break;\r
1361                                         cepod = onebyte[0];\r
1362                                 } else {\r
1363                                         if (m_file->Read(twobytes, 2) != 2)\r
1364                                                 break;\r
1365                                         cepod = STREAM_TO_UINT16(twobytes, 0);\r
1366                                 }\r
1367 \r
1368                                 if (m_file->Read(onebyte, 1) != 1)\r
1369                                         break;\r
1370                                 unsigned char ppod = onebyte[0];\r
1371 \r
1372                                 image = m_tree->TreeCtrlIcon_File;\r
1373                                 imageSel = image + 1;\r
1374 \r
1375                                 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1376                                         wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod),\r
1377                                         image, imageSel,\r
1378                                         new OPJMarkerData(wxT("INFO"))\r
1379                                         );\r
1380 \r
1381                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1382                                         wxString::Format(wxT("%d <= Component < %d"), cspod, cepod),\r
1383                                         image, imageSel,\r
1384                                         new OPJMarkerData(wxT("INFO"))\r
1385                                         );\r
1386 \r
1387                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1388                                         wxString::Format(wxT("0 <= Layer < %d"), lyepod),\r
1389                                         image, imageSel,\r
1390                                         new OPJMarkerData(wxT("INFO"))\r
1391                                         );\r
1392 \r
1393                                 wxString text = wxT("");\r
1394                                 switch (ppod) {\r
1395                                 case (0):\r
1396                                         text << wxT("LRCP");\r
1397                                         break;\r
1398                                 case (1):\r
1399                                         text << wxT("RLCP");\r
1400                                         break;\r
1401                                 case (2):\r
1402                                         text << wxT("LRCP");\r
1403                                         break;\r
1404                                 case (3):\r
1405                                         text << wxT("RPCL");\r
1406                                         break;\r
1407                                 case (4):\r
1408                                         text << wxT("CPRL");\r
1409                                         break;\r
1410                                 default:\r
1411                                         text << wxT("unknown progression");\r
1412                                         break;\r
1413                                 }\r
1414                                 subcurrid4 = m_tree->AppendItem(subcurrid3,\r
1415                                         text,\r
1416                                         image, imageSel,\r
1417                                         new OPJMarkerData(wxT("INFO"))\r
1418                                         );\r
1419                         }\r
1420 \r
1421                         }\r
1422                         break;\r
1423 \r
1424                 /////////\r
1425                 // SOD //\r
1426                 /////////\r
1427                 case SOD_VAL:\r
1428                         {\r
1429                         inside_sod = 1;\r
1430                         };\r
1431                         break;\r
1432 \r
1433                 default:\r
1434                         break;\r
1435                         \r
1436                 }\r
1437                                                                 \r
1438                 // increment number of markers\r
1439                 if (nmarks++ >= maxmarks) {\r
1440                         WriteText(wxT("Maximum amount of markers exceeded"));\r
1441                         break;\r
1442                 }\r
1443 \r
1444                 // advance position\r
1445                 OPJ_ADVANCE(currlen + 2);\r
1446         }       \r
1447 \r
1448         WriteText(wxT("Search finished"));\r
1449 }\r