2 * The copyright in this software is being made available under the 2-clauses
3 * BSD License, included below. This software may be subject to other third
4 * party and contributor rights, including patent rights, and no such rights
5 * are granted under this license.
7 * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
31 #include "OPJViewer.h"
33 /* From little endian to big endian, 2 bytes */
34 #define BYTE_SWAP2(X) ((X & 0x00FF) << 8) | ((X & 0xFF00) >> 8)
35 #define BYTE_SWAP4(X) ((X & 0x000000FF) << 24) | ((X & 0x0000FF00) << 8) | ((X & 0x00FF0000) >> 8) | ((X & 0xFF000000) >> 24)
37 /* From codestream to int values */
38 #define STREAM_TO_UINT32(C, P) (((unsigned long int) (C)[(P) + 0] << 24) + \
39 ((unsigned long int) (C)[(P) + 1] << 16) + \
40 ((unsigned long int) (C)[(P) + 2] << 8) + \
41 ((unsigned long int) (C)[(P) + 3] << 0))
43 #define STREAM_TO_UINT16(C, P) (((unsigned long int) (C)[(P) + 0] << 8) + \
44 ((unsigned long int) (C)[(P) + 1] << 0))
48 #define J2KMARK_NUM 24
84 // All the markers in one vector
85 unsigned short int marker_val[] = {
86 SOC_VAL, SOT_VAL, SOD_VAL, EOC_VAL,
88 COD_VAL, COC_VAL, RGN_VAL, QCD_VAL, QCC_VAL, POD_VAL,
89 TLM_VAL, PLM_VAL, PLT_VAL, PPM_VAL, PPT_VAL,
93 , EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL
101 static const char *marker_name[] = {
102 "SOC", "SOT", "SOD", "EOC",
104 "COD", "COC", "RGN", "QCD", "QCC", "POD",
105 "TLM", "PLM", "PLT", "PPM", "PPT",
109 , "EPB", "ESD", "EPC", "RED"
116 // Marker descriptions
117 static const char *marker_descr[] = {
118 "Start of codestream", "Start of tile-part", "Start of data", "End of codestream",
119 "Image and tile size",
120 "Coding style default", "Coding style component", "Region-of-interest", "Quantization default",
121 "Quantization component", "Progression order change, default",
122 "Tile-part lengths, main header", "Packet length, main header", "Packets length, tile-part header",
123 "Packed packet headers, main header", "Packed packet headers, tile-part header",
124 "Start of packet", "End of packet header",
125 "Comment and extension"
127 , "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability",
128 "Residual Errors Descriptor"
131 , "Main security marker"
135 void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid)
137 unsigned short int csiz = 0;
139 // check if the file is opened
140 if (m_file->IsOpened())
141 WriteText(wxT("File OK"));
145 // position at the beginning
146 m_file->Seek(offset, wxFromStart);
149 int m, inside_sod = 0, inside_sop = 0;
150 int nmarks = 0, maxmarks = 10000;
151 unsigned char onebyte[1];
152 unsigned char twobytes[2], firstbyte, secondbyte;
153 unsigned char fourbytes[4];
154 unsigned short int currmark;
155 unsigned short int currlen;
156 int lastPsot = 0, lastsotpos = 0;
158 WriteText(wxT("Start search..."));
161 #define OPJ_ADVANCE(A) {offset += A; if (offset < length) m_file->Seek(offset, wxFromStart); else return;}
164 while ((offset < length) && (!m_file->Eof())) {
167 if (m_file->Read(&firstbyte, 1) != 1)
171 if (firstbyte == 0xFF) {
173 // it is a possible marker
174 if (m_file->Read(&secondbyte, 1) != 1)
177 currmark = (((unsigned short int) firstbyte) << 8) + (unsigned short int) secondbyte;
181 // nope, advance by one and search again
187 for (m = 0; m < J2KMARK_NUM; m++) {
188 if (currmark == marker_val[m])
193 if (m == J2KMARK_NUM) {
194 // nope, advance by one and search again
199 // if we are inside SOD, only some markers are allowed
207 // randomly marker coincident data
208 if ((currmark != SOT_VAL) &&
209 (currmark != EOC_VAL) &&
210 (currmark != SOP_VAL) &&
211 (currmark != EPH_VAL)) {
217 if ((currmark == SOT_VAL)) {
219 if (offset < (lastsotpos + lastPsot)) {
223 // we were not in the last tile
224 /*if (lastPsot != 0) {
231 // beyond this point, the marker MUST BE real
233 // length of current marker segment
234 if ((currmark == SOD_VAL) ||
235 (currmark == SOC_VAL) ||
236 (currmark == EOC_VAL) ||
237 (currmark == EPH_VAL))
239 // zero length markers
245 if (m_file->Read(twobytes, 2) != 2)
248 currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];
251 // here we pass to AppendItem() normal and selected item images (we
252 // suppose that selected image follows the normal one in the enum)
254 image = m_tree->TreeCtrlIcon_Folder;
255 imageSel = image + 1;
258 wxTreeItemId currid = m_tree->AppendItem(parentid,
259 wxString::Format(wxT("%03d: "), nmarks) +
260 wxString::FromAscii(marker_name[m]) +
261 wxString::Format(wxT(" (0x%04X)"), marker_val[m]),
263 new OPJMarkerData(wxT("MARK") + wxString::Format(wxT(" (%d)"), marker_val[m]),
264 m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)
268 image = m_tree->TreeCtrlIcon_File;
269 imageSel = image + 1;
272 wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,
273 wxT("*** ") + wxString::FromAscii(marker_descr[m]) + wxT(" ***"),
275 new OPJMarkerData(wxT("INFO"))
277 m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);
279 // position and length
280 wxTreeItemId subcurrid2 = m_tree->AppendItem(currid,
281 wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() +
282 wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2),
284 new OPJMarkerData(wxT("INFO"))
287 // give additional info on markers
295 // read packet number
296 if (m_file->Read(twobytes, 2) != 2)
298 int packnum = STREAM_TO_UINT16(twobytes, 0);
300 image = m_tree->TreeCtrlIcon_File;
301 imageSel = image + 1;
303 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
304 wxString::Format(wxT("Pack. no. %d"), packnum),
306 new OPJMarkerData(wxT("INFO"))
318 if (m_file->Read(onebyte, 1) != 1)
320 unsigned char pred = onebyte[0];
322 image = m_tree->TreeCtrlIcon_File;
323 imageSel = image + 1;
325 wxString address[] = {
326 wxT("Packet addressing"),
327 wxT("Byte-range addressing"),
328 wxT("Packet-range addressing"),
332 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
333 address[(pred & 0xC0) >> 6],
335 new OPJMarkerData(wxT("INFO"))
338 subcurrid = m_tree->AppendItem(currid,
339 wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2),
341 new OPJMarkerData(wxT("INFO"))
344 subcurrid = m_tree->AppendItem(currid,
345 pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"),
347 new OPJMarkerData(wxT("INFO"))
350 subcurrid = m_tree->AppendItem(currid,
351 wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3),
353 new OPJMarkerData(wxT("INFO"))
364 unsigned short int cesd;
366 if (m_file->Read(onebyte, 1) != 1)
370 if (m_file->Read(twobytes, 2) != 2)
372 cesd = STREAM_TO_UINT16(twobytes, 0);
375 if (m_file->Read(onebyte, 1) != 1)
377 unsigned char pesd = onebyte[0];
379 image = m_tree->TreeCtrlIcon_File;
380 imageSel = image + 1;
382 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
383 pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd),
385 new OPJMarkerData(wxT("INFO"))
389 wxT("Relative error sensitivity"),
391 wxT("MSE reduction"),
393 wxT("PSNR increase"),
394 wxT("MAXERR (absolute peak error)"),
395 wxT("TSE (total squared error)"),
399 subcurrid = m_tree->AppendItem(currid,
400 meth[(pesd & 0x38) >> 3],
402 new OPJMarkerData(wxT("INFO"))
405 wxString address[] = {
406 wxT("Packet addressing"),
407 wxT("Byte-range addressing"),
408 wxT("Packet-range addressing"),
412 subcurrid = m_tree->AppendItem(currid,
413 address[(pesd & 0xC0) >> 6],
415 new OPJMarkerData(wxT("INFO"))
418 subcurrid = m_tree->AppendItem(currid,
419 wxString::Format(wxT("%d bytes/value, %d bytes range"), ((pesd & 0x04) >> 2) + 1, (((pesd & 0x02) >> 1) + 1) * 2),
421 new OPJMarkerData(wxT("INFO"))
432 if (m_file->Read(twobytes, 2) != 2)
434 unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0);
436 if (m_file->Read(fourbytes, 4) != 4)
438 unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0);
440 if (m_file->Read(onebyte, 1) != 1)
442 unsigned char pepc = onebyte[0];
444 image = m_tree->TreeCtrlIcon_File;
445 imageSel = image + 1;
447 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
448 wxString::Format(wxT("CRC-16 = 0x%x"), pcrc),
450 new OPJMarkerData(wxT("INFO"))
453 subcurrid = m_tree->AppendItem(currid,
454 wxString::Format(wxT("Tot. length = %d"), dl),
456 new OPJMarkerData(wxT("INFO"))
459 subcurrid = m_tree->AppendItem(currid,
460 wxString::Format(wxT("%s%s%s%s"),
461 pepc & 0x10 ? wxT("ESD, ") : wxT(""),
462 pepc & 0x20 ? wxT("RED, ") : wxT(""),
463 pepc & 0x40 ? wxT("EPB, ") : wxT(""),
464 pepc & 0x80 ? wxT("Info") : wxT("")
467 new OPJMarkerData(wxT("INFO"))
478 if (m_file->Read(onebyte, 1) != 1)
480 unsigned char depb = onebyte[0];
482 if (m_file->Read(fourbytes, 4) != 4)
484 unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0);
486 if (m_file->Read(fourbytes, 4) != 4)
488 unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0);
490 image = m_tree->TreeCtrlIcon_File;
491 imageSel = image + 1;
493 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
494 wxString::Format(wxT("No. %d, %slatest, %spacked"),
496 depb & 0x40 ? wxT("") : wxT("not "),
497 depb & 0x80 ? wxT("") : wxT("un")),
499 new OPJMarkerData(wxT("INFO"))
502 subcurrid = m_tree->AppendItem(currid,
503 wxString::Format(wxT("%d bytes protected"), ldpepb),
505 new OPJMarkerData(wxT("INFO"))
508 if (pepb == 0x00000000)
510 subcurrid = m_tree->AppendItem(currid,
511 wxT("Predefined codes"),
513 new OPJMarkerData(wxT("INFO"))
516 else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) {
518 wxString text = wxT("CRC code");
519 if (pepb == 0x10000000)
520 text << wxT(", CCITT (X25) 16 bits");
521 else if (pepb == 0x10000001)
522 text << wxT(", Ethernet 32 bits");
524 text << wxT(", JPWL RA");
525 subcurrid = m_tree->AppendItem(currid,
528 new OPJMarkerData(wxT("INFO"))
531 } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) {
534 subcurrid = m_tree->AppendItem(currid,
535 wxString::Format(wxT("RS code, RS(%d, %d)"),
536 (pepb & 0x0000FF00) >> 8,
537 (pepb & 0x000000FF)),
539 new OPJMarkerData(wxT("INFO"))
542 } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE))
544 subcurrid = m_tree->AppendItem(currid,
547 new OPJMarkerData(wxT("INFO"))
550 else if (pepb == 0xFFFFFFFF)
552 subcurrid = m_tree->AppendItem(currid,
555 new OPJMarkerData(wxT("INFO"))
577 if (m_file->Read(twobytes, 2) != 2)
579 unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);
581 if (m_file->Read(fourbytes, 4) != 4)
583 unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);
585 if (m_file->Read(fourbytes, 4) != 4)
587 unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);
589 if (m_file->Read(fourbytes, 4) != 4)
591 unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0);
593 if (m_file->Read(fourbytes, 4) != 4)
595 unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0);
597 if (m_file->Read(fourbytes, 4) != 4)
599 unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0);
600 this->m_tree->m_childframe->m_twidth = xtsiz;
602 if (m_file->Read(fourbytes, 4) != 4)
604 unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0);
605 this->m_tree->m_childframe->m_theight = ytsiz;
607 if (m_file->Read(fourbytes, 4) != 4)
609 unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0);
610 this->m_tree->m_childframe->m_tx = xtosiz;
612 if (m_file->Read(fourbytes, 4) != 4)
614 unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0);
615 this->m_tree->m_childframe->m_ty = ytosiz;
617 if (m_file->Read(twobytes, 2) != 2)
619 csiz = STREAM_TO_UINT16(twobytes, 0);
621 bool equaldepth = true, equalsize = true;
622 unsigned char *ssiz = new unsigned char(csiz);
623 unsigned char *xrsiz = new unsigned char(csiz);
624 unsigned char *yrsiz = new unsigned char(csiz);
626 for (c = 0; c < csiz; c++) {
628 if (m_file->Read(&ssiz[c], 1) != 1)
632 equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]);
634 if (m_file->Read(&xrsiz[c], 1) != 1)
637 if (m_file->Read(&yrsiz[c], 1) != 1)
641 equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ;
645 if (equaldepth && equalsize)
646 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
647 wxString::Format(wxT("I: %dx%d (%d, %d), %d c., %d%s bpp"),
650 csiz, ((ssiz[0] & 0x7F) + 1),
651 (ssiz[0] & 0x80) ? wxT("s") : wxT("u")),
653 new OPJMarkerData(wxT("INFO"))
656 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
657 wxString::Format(wxT("I: %dx%d (%d, %d), %d c."),
662 new OPJMarkerData(wxT("INFO"))
665 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
666 wxString::Format(wxT("T: %dx%d (%d, %d)"),
670 new OPJMarkerData(wxT("INFO"))
673 image = m_tree->TreeCtrlIcon_Folder;
674 imageSel = image + 1;
676 wxTreeItemId subcurrid4 = m_tree->AppendItem(currid,
679 new OPJMarkerData(wxT("INFO"))
682 image = m_tree->TreeCtrlIcon_File;
683 imageSel = image + 1;
685 for (c = 0; c < csiz; c++) {
687 wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4,
688 wxString::Format(wxT("#%d: %dx%d, %d%s bpp"),
690 xsiz/xrsiz[c], ysiz/yrsiz[c],
691 ((ssiz[c] & 0x7F) + 1),
692 (ssiz[c] & 0x80) ? wxT("s") : wxT("u")),
694 new OPJMarkerData(wxT("INFO"))
707 if (m_file->Read(twobytes, 2) != 2)
709 unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);
711 if (m_file->Read(fourbytes, 4) != 4)
713 unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);
715 if (m_file->Read(onebyte, 1) != 1)
717 unsigned char tpsot = onebyte[0];
719 if (m_file->Read(onebyte, 1) != 1)
721 unsigned char tnsot = onebyte[0];
723 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
724 wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot),
726 new OPJMarkerData(wxT("INFO"))
740 unsigned short int ccoc;
742 if (m_file->Read(onebyte, 1) != 1)
746 if (m_file->Read(twobytes, 2) != 2)
748 ccoc = STREAM_TO_UINT16(twobytes, 0);
751 if (m_file->Read(onebyte, 1) != 1)
753 unsigned char scoc = onebyte[0];
755 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
756 wxString::Format(wxT("Comp. no. %d"), ccoc),
758 new OPJMarkerData(wxT("INFO"))
763 text << wxT("Partitioned entropy coder");
765 text << wxT("Unpartitioned entropy coder");
767 subcurrid = m_tree->AppendItem(currid,
770 new OPJMarkerData(wxT("INFO"))
773 if (m_file->Read(onebyte, 1) != 1)
775 unsigned char decomplevs = onebyte[0];
777 if (m_file->Read(onebyte, 1) != 1)
779 unsigned char cbswidth = onebyte[0];
781 if (m_file->Read(onebyte, 1) != 1)
783 unsigned char cbsheight = onebyte[0];
785 if (m_file->Read(onebyte, 1) != 1)
787 unsigned char cbstyle = onebyte[0];
789 if (m_file->Read(onebyte, 1) != 1)
791 unsigned char transform = onebyte[0];
793 subcurrid = m_tree->AppendItem(currid,
794 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),
796 new OPJMarkerData(wxT("INFO"))
799 if (transform & 0x01)
800 text = wxT("5-3 reversible wavelet");
802 text = wxT("9-7 irreversible wavelet");
803 subcurrid = m_tree->AppendItem(currid,
806 new OPJMarkerData(wxT("INFO"))
809 subcurrid = m_tree->AppendItem(currid,
810 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),
812 new OPJMarkerData(wxT("INFO"))
815 image = m_tree->TreeCtrlIcon_Folder;
816 imageSel = image + 1;
818 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
819 wxT("Coding styles"),
821 new OPJMarkerData(wxT("INFO"))
824 image = m_tree->TreeCtrlIcon_File;
825 imageSel = image + 1;
828 text = wxT("Selective arithmetic coding bypass");
830 text = wxT("No selective arithmetic coding bypass");
831 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
834 new OPJMarkerData(wxT("INFO"))
838 text = wxT("Reset context probabilities on coding pass boundaries");
840 text = wxT("No reset of context probabilities on coding pass boundaries");
841 subcurrid4 = m_tree->AppendItem(subcurrid3,
844 new OPJMarkerData(wxT("INFO"))
848 text = wxT("Termination on each coding passs");
850 text = wxT("No termination on each coding pass");
851 subcurrid4 = m_tree->AppendItem(subcurrid3,
854 new OPJMarkerData(wxT("INFO"))
858 text = wxT("Vertically stripe causal context");
860 text = wxT("No vertically stripe causal context");
861 subcurrid4 = m_tree->AppendItem(subcurrid3,
864 new OPJMarkerData(wxT("INFO"))
868 text = wxT("Predictable termination");
870 text = wxT("No predictable termination");
871 subcurrid4 = m_tree->AppendItem(subcurrid3,
874 new OPJMarkerData(wxT("INFO"))
878 text = wxT("Segmentation symbols are used");
880 text = wxT("No segmentation symbols are used");
881 subcurrid4 = m_tree->AppendItem(subcurrid3,
884 new OPJMarkerData(wxT("INFO"))
895 if (m_file->Read(onebyte, 1) != 1)
897 unsigned char scod = onebyte[0];
902 text << wxT("Partitioned entropy coder");
904 text << wxT("Unpartitioned entropy coder");
906 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
909 new OPJMarkerData(wxT("INFO"))
914 text << wxT("Possible SOPs");
916 text << wxT("No SOPs");
919 text << wxT(", possible EPHs");
921 text << wxT(", no EPHs");
923 subcurrid3 = m_tree->AppendItem(currid,
926 new OPJMarkerData(wxT("INFO"))
929 if (m_file->Read(onebyte, 1) != 1)
931 unsigned char progord = onebyte[0];
933 if (m_file->Read(twobytes, 2) != 2)
935 unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0);
937 if (m_file->Read(onebyte, 1) != 1)
939 unsigned char mctransform = onebyte[0];
941 if (m_file->Read(onebyte, 1) != 1)
943 unsigned char decomplevs = onebyte[0];
945 if (m_file->Read(onebyte, 1) != 1)
947 unsigned char cbswidth = onebyte[0];
949 if (m_file->Read(onebyte, 1) != 1)
951 unsigned char cbsheight = onebyte[0];
953 if (m_file->Read(onebyte, 1) != 1)
955 unsigned char cbstyle = onebyte[0];
957 if (m_file->Read(onebyte, 1) != 1)
959 unsigned char transform = onebyte[0];
961 subcurrid3 = m_tree->AppendItem(currid,
962 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),
964 new OPJMarkerData(wxT("INFO"))
985 text << wxT("unknown progression");
988 text << wxString::Format(wxT(", %d layers"), numlayers);
989 if (transform & 0x01)
990 text << wxT(", 5-3 rev.");
992 text << wxT(", 9-7 irr.");
993 subcurrid3 = m_tree->AppendItem(currid,
996 new OPJMarkerData(wxT("INFO"))
999 subcurrid3 = m_tree->AppendItem(currid,
1000 wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),
1002 new OPJMarkerData(wxT("INFO"))
1005 switch (mctransform) {
1008 text = wxT("No MCT");
1013 text = wxT("Reversible MCT on 0, 1, 2");
1018 text = wxT("Irreversible MCT on 0, 1, 2");
1023 text = wxT("Unknown");
1027 subcurrid3 = m_tree->AppendItem(currid,
1030 new OPJMarkerData(wxT("INFO"))
1034 image = m_tree->TreeCtrlIcon_Folder;
1035 imageSel = image + 1;
1037 subcurrid3 = m_tree->AppendItem(currid,
1038 wxT("Coding styles"),
1040 new OPJMarkerData(wxT("INFO"))
1043 image = m_tree->TreeCtrlIcon_File;
1044 imageSel = image + 1;
1047 text = wxT("Selective arithmetic coding bypass");
1049 text = wxT("No selective arithmetic coding bypass");
1050 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
1053 new OPJMarkerData(wxT("INFO"))
1057 text = wxT("Reset context probabilities on coding pass boundaries");
1059 text = wxT("No reset of context probabilities on coding pass boundaries");
1060 subcurrid4 = m_tree->AppendItem(subcurrid3,
1063 new OPJMarkerData(wxT("INFO"))
1067 text = wxT("Termination on each coding passs");
1069 text = wxT("No termination on each coding pass");
1070 subcurrid4 = m_tree->AppendItem(subcurrid3,
1073 new OPJMarkerData(wxT("INFO"))
1077 text = wxT("Vertically stripe causal context");
1079 text = wxT("No vertically stripe causal context");
1080 subcurrid4 = m_tree->AppendItem(subcurrid3,
1083 new OPJMarkerData(wxT("INFO"))
1087 text = wxT("Predictable termination");
1089 text = wxT("No predictable termination");
1090 subcurrid4 = m_tree->AppendItem(subcurrid3,
1093 new OPJMarkerData(wxT("INFO"))
1097 text = wxT("Segmentation symbols are used");
1099 text = wxT("No segmentation symbols are used");
1100 subcurrid4 = m_tree->AppendItem(subcurrid3,
1103 new OPJMarkerData(wxT("INFO"))
1114 unsigned short int cqcc;
1116 if (m_file->Read(onebyte, 1) != 1)
1120 if (m_file->Read(twobytes, 2) != 2)
1122 cqcc = STREAM_TO_UINT16(twobytes, 0);
1125 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
1126 wxString::Format(wxT("Comp. no. %d"), cqcc),
1128 new OPJMarkerData(wxT("INFO"))
1131 if (m_file->Read(onebyte, 1) != 1)
1133 unsigned char sqcc = onebyte[0];
1136 switch (sqcc & 0x1F) {
1138 text = wxT("No quantization");
1141 text = wxT("Scalar implicit");
1144 text = wxT("Scalar explicit");
1147 text = wxT("Unknown");
1150 text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5);
1151 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
1154 new OPJMarkerData(wxT("INFO"))
1165 if (m_file->Read(onebyte, 1) != 1)
1167 unsigned char sqcd = onebyte[0];
1170 switch (sqcd & 0x1F) {
1172 text = wxT("No quantization");
1175 text = wxT("Scalar implicit");
1178 text = wxT("Scalar explicit");
1181 text = wxT("Unknown");
1184 text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5);
1185 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
1188 new OPJMarkerData(wxT("INFO"))
1200 char comment[showlen];
1203 if (m_file->Read(twobytes, 2) != 2)
1205 unsigned short int rcom = STREAM_TO_UINT16(twobytes, 0);
1209 text = wxT("Binary values");
1211 text = wxT("ISO 8859-1 (latin-1) values");
1212 else if (rcom < 65535)
1213 text = wxT("Reserved for registration");
1215 text = wxT("Reserved for extension");
1216 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
1219 new OPJMarkerData(wxT("INFO"))
1222 if (m_file->Read(comment, showlen) != showlen)
1224 comments = wxString::FromAscii(comment).Truncate(wxMin(showlen, currlen - 4));
1225 if ((currlen - 4) > showlen)
1226 comments << wxT("...");
1227 subcurrid3 = m_tree->AppendItem(currid,
1230 new OPJMarkerData(wxT("INFO"))
1240 if (m_file->Read(onebyte, 1) != 1)
1242 unsigned char ztlm = onebyte[0];
1244 if (m_file->Read(onebyte, 1) != 1)
1246 unsigned char stlm = onebyte[0];
1248 image = m_tree->TreeCtrlIcon_File;
1249 imageSel = image + 1;
1251 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
1252 wxString::Format(wxT("TLM #%d"), ztlm),
1254 new OPJMarkerData(wxT("INFO"))
1257 subcurrid3 = m_tree->AppendItem(currid,
1258 wxString::Format(wxT("%d bits/index, %d bits/length"),
1259 8 * ((stlm & 0x30) >> 4), 16 + 16 * ((stlm & 0x40) >> 6)),
1261 new OPJMarkerData(wxT("INFO"))
1266 numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6));
1268 image = m_tree->TreeCtrlIcon_Folder;
1269 imageSel = image + 1;
1271 subcurrid3 = m_tree->AppendItem(currid,
1274 new OPJMarkerData(wxT("INFO"))
1277 image = m_tree->TreeCtrlIcon_File;
1278 imageSel = image + 1;
1280 for (n = 0; n < numparts; n++) {
1282 unsigned short int ttlm;
1283 unsigned long int ptlm;
1285 switch (((stlm & 0x30) >> 4)) {
1292 if (m_file->Read(onebyte, 1) != 1)
1298 if (m_file->Read(twobytes, 2) != 2)
1300 ttlm = STREAM_TO_UINT16(twobytes, 0);
1305 switch (((stlm & 0x40) >> 6)) {
1308 if (m_file->Read(twobytes, 2) != 2)
1310 ptlm = STREAM_TO_UINT16(twobytes, 0);
1314 if (m_file->Read(fourbytes, 4) != 4)
1316 ptlm = STREAM_TO_UINT32(fourbytes, 0);
1321 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
1322 wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm),
1324 new OPJMarkerData(wxT("INFO"))
1340 numchanges = (currlen - 2) / 7;
1342 numchanges = (currlen - 2) / 9;
1344 for (n = 0; n < numchanges; n++) {
1346 image = m_tree->TreeCtrlIcon_Folder;
1347 imageSel = image + 1;
1349 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
1350 wxString::Format(wxT("Change #%d"), n),
1352 new OPJMarkerData(wxT("INFO"))
1355 if (m_file->Read(onebyte, 1) != 1)
1357 unsigned char rspod = onebyte[0];
1359 unsigned short int cspod;
1361 if (m_file->Read(onebyte, 1) != 1)
1365 if (m_file->Read(twobytes, 2) != 2)
1367 cspod = STREAM_TO_UINT16(twobytes, 0);
1370 if (m_file->Read(twobytes, 2) != 2)
1372 unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0);
1374 if (m_file->Read(onebyte, 1) != 1)
1376 unsigned char repod = onebyte[0];
1378 unsigned short int cepod;
1380 if (m_file->Read(onebyte, 1) != 1)
1384 if (m_file->Read(twobytes, 2) != 2)
1386 cepod = STREAM_TO_UINT16(twobytes, 0);
1389 if (m_file->Read(onebyte, 1) != 1)
1391 unsigned char ppod = onebyte[0];
1393 image = m_tree->TreeCtrlIcon_File;
1394 imageSel = image + 1;
1396 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
1397 wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod),
1399 new OPJMarkerData(wxT("INFO"))
1402 subcurrid4 = m_tree->AppendItem(subcurrid3,
1403 wxString::Format(wxT("%d <= Component < %d"), cspod, cepod),
1405 new OPJMarkerData(wxT("INFO"))
1408 subcurrid4 = m_tree->AppendItem(subcurrid3,
1409 wxString::Format(wxT("0 <= Layer < %d"), lyepod),
1411 new OPJMarkerData(wxT("INFO"))
1414 wxString text = wxT("");
1417 text << wxT("LRCP");
1420 text << wxT("RLCP");
1423 text << wxT("LRCP");
1426 text << wxT("RPCL");
1429 text << wxT("CPRL");
1432 text << wxT("unknown progression");
1435 subcurrid4 = m_tree->AppendItem(subcurrid3,
1438 new OPJMarkerData(wxT("INFO"))
1459 // increment number of markers
1460 if (nmarks++ >= maxmarks) {
1461 WriteText(wxT("Maximum amount of markers exceeded"));
1466 OPJ_ADVANCE(currlen + 2);
1469 WriteText(wxT("Search finished"));