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