2 * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy
\r
3 * All rights reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions
\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
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
26 #include "OPJViewer.h"
\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
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
38 #define STREAM_TO_UINT16(C, P) (((unsigned long int) (C)[(P) + 0] << 8) + \
\r
39 ((unsigned long int) (C)[(P) + 1] << 0))
\r
42 /* Markers values */
\r
43 #define J2KMARK_NUM 24
\r
69 /*, EPB_VAL = 0xFF96,
\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
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
88 , EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL
\r
96 char *marker_name[] = {
\r
97 "SOC", "SOT", "SOD", "EOC",
\r
99 "COD", "COC", "RGN", "QCD", "QCC", "POD",
\r
100 "TLM", "PLM", "PLT", "PPM", "PPT",
\r
104 , "EPB", "ESD", "EPC", "RED"
\r
108 #endif // USE_JPSEC
\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
122 , "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability",
\r
123 "Residual Errors Descriptor"
\r
126 , "Main security marker"
\r
127 #endif // USE_JPSEC
\r
130 void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid)
\r
132 unsigned short int csiz = 0;
\r
134 // check if the file is opened
\r
135 if (m_file->IsOpened())
\r
136 WriteText(wxT("File OK"));
\r
140 // position at the beginning
\r
141 m_file->Seek(offset, wxFromStart);
\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
153 WriteText(wxT("Start search..."));
\r
156 #define OPJ_ADVANCE(A) {offset += A; if (offset < length) m_file->Seek(offset, wxFromStart); else return;}
\r
159 while ((offset < length) && (!m_file->Eof())) {
\r
162 if (m_file->Read(&firstbyte, 1) != 1)
\r
166 if (firstbyte == 0xFF) {
\r
168 // it is a possible marker
\r
169 if (m_file->Read(&secondbyte, 1) != 1)
\r
172 currmark = (((unsigned short int) firstbyte) << 8) + (unsigned short int) secondbyte;
\r
176 // nope, advance by one and search again
\r
181 // search the marker
\r
182 for (m = 0; m < J2KMARK_NUM; m++) {
\r
183 if (currmark == marker_val[m])
\r
187 // marker not found
\r
188 if (m == J2KMARK_NUM) {
\r
189 // nope, advance by one and search again
\r
194 // if we are inside SOD, only some markers are allowed
\r
197 // we are inside SOP
\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
212 if ((currmark == SOT_VAL)) {
\r
214 if (offset < (lastsotpos + lastPsot)) {
\r
218 // we were not in the last tile
\r
219 /*if (lastPsot != 0) {
\r
226 // beyond this point, the marker MUST BE real
\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
234 // zero length markers
\r
239 // read length field
\r
240 if (m_file->Read(twobytes, 2) != 2)
\r
243 currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];
\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
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
258 new OPJMarkerData(wxT("MARK"), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)
\r
261 // append some info
\r
262 image = m_tree->TreeCtrlIcon_File;
\r
263 imageSel = image + 1;
\r
266 wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,
\r
267 wxT("*** ") + wxString::FromAscii(marker_descr[m]) + wxT(" ***"),
\r
269 new OPJMarkerData(wxT("INFO"))
\r
271 m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);
\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
278 new OPJMarkerData(wxT("INFO"))
\r
281 // give additional info on markers
\r
282 switch (currmark) {
\r
289 // read packet number
\r
290 if (m_file->Read(twobytes, 2) != 2)
\r
292 int packnum = STREAM_TO_UINT16(twobytes, 0);
\r
294 image = m_tree->TreeCtrlIcon_File;
\r
295 imageSel = image + 1;
\r
297 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
298 wxString::Format(wxT("Pack. no. %d"), packnum),
\r
300 new OPJMarkerData(wxT("INFO"))
\r
312 if (m_file->Read(onebyte, 1) != 1)
\r
314 unsigned char pred = onebyte[0];
\r
316 image = m_tree->TreeCtrlIcon_File;
\r
317 imageSel = image + 1;
\r
319 wxString address[] = {
\r
320 wxT("Packet addressing"),
\r
321 wxT("Byte-range addressing"),
\r
322 wxT("Packet-range addressing"),
\r
326 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
327 address[(pred & 0xC0) >> 6],
\r
329 new OPJMarkerData(wxT("INFO"))
\r
332 subcurrid = m_tree->AppendItem(currid,
\r
333 wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2),
\r
335 new OPJMarkerData(wxT("INFO"))
\r
338 subcurrid = m_tree->AppendItem(currid,
\r
339 pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"),
\r
341 new OPJMarkerData(wxT("INFO"))
\r
344 subcurrid = m_tree->AppendItem(currid,
\r
345 wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3),
\r
347 new OPJMarkerData(wxT("INFO"))
\r
358 unsigned short int cesd;
\r
360 if (m_file->Read(onebyte, 1) != 1)
\r
364 if (m_file->Read(twobytes, 2) != 2)
\r
366 cesd = STREAM_TO_UINT16(twobytes, 0);
\r
369 if (m_file->Read(onebyte, 1) != 1)
\r
371 unsigned char pesd = onebyte[0];
\r
373 image = m_tree->TreeCtrlIcon_File;
\r
374 imageSel = image + 1;
\r
376 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
377 pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd),
\r
379 new OPJMarkerData(wxT("INFO"))
\r
382 wxString meth[] = {
\r
383 wxT("Relative error sensitivity"),
\r
385 wxT("MSE reduction"),
\r
387 wxT("PSNR increase"),
\r
388 wxT("MAXERR (absolute peak error)"),
\r
389 wxT("TSE (total squared error)"),
\r
393 subcurrid = m_tree->AppendItem(currid,
\r
394 meth[(pesd & 0x38) >> 3],
\r
396 new OPJMarkerData(wxT("INFO"))
\r
399 wxString address[] = {
\r
400 wxT("Packet addressing"),
\r
401 wxT("Byte-range addressing"),
\r
402 wxT("Packet-range addressing"),
\r
406 subcurrid = m_tree->AppendItem(currid,
\r
407 address[(pesd & 0xC0) >> 6],
\r
409 new OPJMarkerData(wxT("INFO"))
\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
415 new OPJMarkerData(wxT("INFO"))
\r
426 if (m_file->Read(twobytes, 2) != 2)
\r
428 unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0);
\r
430 if (m_file->Read(fourbytes, 4) != 4)
\r
432 unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0);
\r
434 if (m_file->Read(onebyte, 1) != 1)
\r
436 unsigned char pepc = onebyte[0];
\r
438 image = m_tree->TreeCtrlIcon_File;
\r
439 imageSel = image + 1;
\r
441 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
442 wxString::Format(wxT("CRC-16 = 0x%x"), pcrc),
\r
444 new OPJMarkerData(wxT("INFO"))
\r
447 subcurrid = m_tree->AppendItem(currid,
\r
448 wxString::Format(wxT("Tot. length = %d"), dl),
\r
450 new OPJMarkerData(wxT("INFO"))
\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
461 new OPJMarkerData(wxT("INFO"))
\r
472 if (m_file->Read(onebyte, 1) != 1)
\r
474 unsigned char depb = onebyte[0];
\r
476 if (m_file->Read(fourbytes, 4) != 4)
\r
478 unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0);
\r
480 if (m_file->Read(fourbytes, 4) != 4)
\r
482 unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0);
\r
484 image = m_tree->TreeCtrlIcon_File;
\r
485 imageSel = image + 1;
\r
487 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
488 wxString::Format(wxT("No. %d, %slatest, %spacked"),
\r
490 depb & 0x40 ? wxT("") : wxT("not "),
\r
491 depb & 0x80 ? wxT("") : wxT("un")),
\r
493 new OPJMarkerData(wxT("INFO"))
\r
496 subcurrid = m_tree->AppendItem(currid,
\r
497 wxString::Format(wxT("%d bytes protected"), ldpepb),
\r
499 new OPJMarkerData(wxT("INFO"))
\r
502 if (pepb == 0x00000000)
\r
504 subcurrid = m_tree->AppendItem(currid,
\r
505 wxT("Predefined codes"),
\r
507 new OPJMarkerData(wxT("INFO"))
\r
510 else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) {
\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
518 text << wxT(", JPWL RA");
\r
519 subcurrid = m_tree->AppendItem(currid,
\r
522 new OPJMarkerData(wxT("INFO"))
\r
525 } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) {
\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
533 new OPJMarkerData(wxT("INFO"))
\r
536 } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE))
\r
538 subcurrid = m_tree->AppendItem(currid,
\r
541 new OPJMarkerData(wxT("INFO"))
\r
544 else if (pepb == 0xFFFFFFFF)
\r
546 subcurrid = m_tree->AppendItem(currid,
\r
549 new OPJMarkerData(wxT("INFO"))
\r
562 #endif // USE_JPSEC
\r
571 if (m_file->Read(twobytes, 2) != 2)
\r
573 unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);
\r
575 if (m_file->Read(fourbytes, 4) != 4)
\r
577 unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);
\r
579 if (m_file->Read(fourbytes, 4) != 4)
\r
581 unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);
\r
583 if (m_file->Read(fourbytes, 4) != 4)
\r
585 unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0);
\r
587 if (m_file->Read(fourbytes, 4) != 4)
\r
589 unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0);
\r
591 if (m_file->Read(fourbytes, 4) != 4)
\r
593 unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0);
\r
594 this->m_tree->m_childframe->m_twidth = xtsiz;
\r
596 if (m_file->Read(fourbytes, 4) != 4)
\r
598 unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0);
\r
599 this->m_tree->m_childframe->m_theight = ytsiz;
\r
601 if (m_file->Read(fourbytes, 4) != 4)
\r
603 unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0);
\r
604 this->m_tree->m_childframe->m_tx = xtosiz;
\r
606 if (m_file->Read(fourbytes, 4) != 4)
\r
608 unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0);
\r
609 this->m_tree->m_childframe->m_ty = ytosiz;
\r
611 if (m_file->Read(twobytes, 2) != 2)
\r
613 csiz = STREAM_TO_UINT16(twobytes, 0);
\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
620 for (c = 0; c < csiz; c++) {
\r
622 if (m_file->Read(&ssiz[c], 1) != 1)
\r
626 equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]);
\r
628 if (m_file->Read(&xrsiz[c], 1) != 1)
\r
631 if (m_file->Read(&yrsiz[c], 1) != 1)
\r
635 equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ;
\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
644 csiz, ((ssiz[0] & 0x7F) + 1),
\r
645 (ssiz[0] & 0x80) ? wxT("s") : wxT("u")),
\r
647 new OPJMarkerData(wxT("INFO"))
\r
650 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
651 wxString::Format(wxT("I: %dx%d (%d, %d), %d c."),
\r
656 new OPJMarkerData(wxT("INFO"))
\r
659 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
660 wxString::Format(wxT("T: %dx%d (%d, %d)"),
\r
664 new OPJMarkerData(wxT("INFO"))
\r
667 image = m_tree->TreeCtrlIcon_Folder;
\r
668 imageSel = image + 1;
\r
670 wxTreeItemId subcurrid4 = m_tree->AppendItem(currid,
\r
673 new OPJMarkerData(wxT("INFO"))
\r
676 image = m_tree->TreeCtrlIcon_File;
\r
677 imageSel = image + 1;
\r
679 for (c = 0; c < csiz; c++) {
\r
681 wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4,
\r
682 wxString::Format(wxT("#%d: %dx%d, %d%s bpp"),
\r
684 xsiz/xrsiz[c], ysiz/yrsiz[c],
\r
685 ((ssiz[c] & 0x7F) + 1),
\r
686 (ssiz[c] & 0x80) ? wxT("s") : wxT("u")),
\r
688 new OPJMarkerData(wxT("INFO"))
\r
701 if (m_file->Read(twobytes, 2) != 2)
\r
703 unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);
\r
705 if (m_file->Read(fourbytes, 4) != 4)
\r
707 unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);
\r
709 if (m_file->Read(onebyte, 1) != 1)
\r
711 unsigned char tpsot = onebyte[0];
\r
713 if (m_file->Read(onebyte, 1) != 1)
\r
715 unsigned char tnsot = onebyte[0];
\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
720 new OPJMarkerData(wxT("INFO"))
\r
724 lastsotpos = offset;
\r
734 unsigned short int ccoc;
\r
736 if (m_file->Read(onebyte, 1) != 1)
\r
740 if (m_file->Read(twobytes, 2) != 2)
\r
742 ccoc = STREAM_TO_UINT16(twobytes, 0);
\r
745 if (m_file->Read(onebyte, 1) != 1)
\r
747 unsigned char scoc = onebyte[0];
\r
749 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
750 wxString::Format(wxT("Comp. no. %d"), ccoc),
\r
752 new OPJMarkerData(wxT("INFO"))
\r
757 text << wxT("Partitioned entropy coder");
\r
759 text << wxT("Unpartitioned entropy coder");
\r
761 subcurrid = m_tree->AppendItem(currid,
\r
764 new OPJMarkerData(wxT("INFO"))
\r
767 if (m_file->Read(onebyte, 1) != 1)
\r
769 unsigned char decomplevs = onebyte[0];
\r
771 if (m_file->Read(onebyte, 1) != 1)
\r
773 unsigned char cbswidth = onebyte[0];
\r
775 if (m_file->Read(onebyte, 1) != 1)
\r
777 unsigned char cbsheight = onebyte[0];
\r
779 if (m_file->Read(onebyte, 1) != 1)
\r
781 unsigned char cbstyle = onebyte[0];
\r
783 if (m_file->Read(onebyte, 1) != 1)
\r
785 unsigned char transform = onebyte[0];
\r
787 subcurrid = m_tree->AppendItem(currid,
\r
788 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),
\r
790 new OPJMarkerData(wxT("INFO"))
\r
793 if (transform & 0x01)
\r
794 text = wxT("5-3 reversible wavelet");
\r
796 text = wxT("9-7 irreversible wavelet");
\r
797 subcurrid = m_tree->AppendItem(currid,
\r
800 new OPJMarkerData(wxT("INFO"))
\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
806 new OPJMarkerData(wxT("INFO"))
\r
809 image = m_tree->TreeCtrlIcon_Folder;
\r
810 imageSel = image + 1;
\r
812 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
813 wxT("Coding styles"),
\r
815 new OPJMarkerData(wxT("INFO"))
\r
818 image = m_tree->TreeCtrlIcon_File;
\r
819 imageSel = image + 1;
\r
821 if (cbstyle & 0x01)
\r
822 text = wxT("Selective arithmetic coding bypass");
\r
824 text = wxT("No selective arithmetic coding bypass");
\r
825 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
828 new OPJMarkerData(wxT("INFO"))
\r
831 if (cbstyle & 0x02)
\r
832 text = wxT("Reset context probabilities on coding pass boundaries");
\r
834 text = wxT("No reset of context probabilities on coding pass boundaries");
\r
835 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
838 new OPJMarkerData(wxT("INFO"))
\r
841 if (cbstyle & 0x04)
\r
842 text = wxT("Termination on each coding passs");
\r
844 text = wxT("No termination on each coding pass");
\r
845 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
848 new OPJMarkerData(wxT("INFO"))
\r
851 if (cbstyle & 0x08)
\r
852 text = wxT("Vertically stripe causal context");
\r
854 text = wxT("No vertically stripe causal context");
\r
855 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
858 new OPJMarkerData(wxT("INFO"))
\r
861 if (cbstyle & 0x10)
\r
862 text = wxT("Predictable termination");
\r
864 text = wxT("No predictable termination");
\r
865 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
868 new OPJMarkerData(wxT("INFO"))
\r
871 if (cbstyle & 0x20)
\r
872 text = wxT("Segmentation symbols are used");
\r
874 text = wxT("No segmentation symbols are used");
\r
875 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
878 new OPJMarkerData(wxT("INFO"))
\r
889 if (m_file->Read(onebyte, 1) != 1)
\r
891 unsigned char scod = onebyte[0];
\r
896 text << wxT("Partitioned entropy coder");
\r
898 text << wxT("Unpartitioned entropy coder");
\r
900 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
903 new OPJMarkerData(wxT("INFO"))
\r
908 text << wxT("Possible SOPs");
\r
910 text << wxT("No SOPs");
\r
913 text << wxT(", possible EPHs");
\r
915 text << wxT(", no EPHs");
\r
917 subcurrid3 = m_tree->AppendItem(currid,
\r
920 new OPJMarkerData(wxT("INFO"))
\r
923 if (m_file->Read(onebyte, 1) != 1)
\r
925 unsigned char progord = onebyte[0];
\r
927 if (m_file->Read(twobytes, 2) != 2)
\r
929 unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0);
\r
931 if (m_file->Read(onebyte, 1) != 1)
\r
933 unsigned char mctransform = onebyte[0];
\r
935 if (m_file->Read(onebyte, 1) != 1)
\r
937 unsigned char decomplevs = onebyte[0];
\r
939 if (m_file->Read(onebyte, 1) != 1)
\r
941 unsigned char cbswidth = onebyte[0];
\r
943 if (m_file->Read(onebyte, 1) != 1)
\r
945 unsigned char cbsheight = onebyte[0];
\r
947 if (m_file->Read(onebyte, 1) != 1)
\r
949 unsigned char cbstyle = onebyte[0];
\r
951 if (m_file->Read(onebyte, 1) != 1)
\r
953 unsigned char transform = onebyte[0];
\r
955 subcurrid3 = m_tree->AppendItem(currid,
\r
956 wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),
\r
958 new OPJMarkerData(wxT("INFO"))
\r
964 text << wxT("LRCP");
\r
967 text << wxT("RLCP");
\r
970 text << wxT("LRCP");
\r
973 text << wxT("RPCL");
\r
976 text << wxT("CPRL");
\r
979 text << wxT("unknown progression");
\r
982 text << wxString::Format(wxT(", %d layers"), numlayers);
\r
983 if (transform & 0x01)
\r
984 text << wxT(", 5-3 rev.");
\r
986 text << wxT(", 9-7 irr.");
\r
987 subcurrid3 = m_tree->AppendItem(currid,
\r
990 new OPJMarkerData(wxT("INFO"))
\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
996 new OPJMarkerData(wxT("INFO"))
\r
999 switch (mctransform) {
\r
1002 text = wxT("No MCT");
\r
1007 text = wxT("Reversible MCT on 0, 1, 2");
\r
1012 text = wxT("Irreversible MCT on 0, 1, 2");
\r
1017 text = wxT("Unknown");
\r
1021 subcurrid3 = m_tree->AppendItem(currid,
\r
1024 new OPJMarkerData(wxT("INFO"))
\r
1028 image = m_tree->TreeCtrlIcon_Folder;
\r
1029 imageSel = image + 1;
\r
1031 subcurrid3 = m_tree->AppendItem(currid,
\r
1032 wxT("Coding styles"),
\r
1034 new OPJMarkerData(wxT("INFO"))
\r
1037 image = m_tree->TreeCtrlIcon_File;
\r
1038 imageSel = image + 1;
\r
1040 if (cbstyle & 0x01)
\r
1041 text = wxT("Selective arithmetic coding bypass");
\r
1043 text = wxT("No selective arithmetic coding bypass");
\r
1044 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1047 new OPJMarkerData(wxT("INFO"))
\r
1050 if (cbstyle & 0x02)
\r
1051 text = wxT("Reset context probabilities on coding pass boundaries");
\r
1053 text = wxT("No reset of context probabilities on coding pass boundaries");
\r
1054 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1057 new OPJMarkerData(wxT("INFO"))
\r
1060 if (cbstyle & 0x04)
\r
1061 text = wxT("Termination on each coding passs");
\r
1063 text = wxT("No termination on each coding pass");
\r
1064 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1067 new OPJMarkerData(wxT("INFO"))
\r
1070 if (cbstyle & 0x08)
\r
1071 text = wxT("Vertically stripe causal context");
\r
1073 text = wxT("No vertically stripe causal context");
\r
1074 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1077 new OPJMarkerData(wxT("INFO"))
\r
1080 if (cbstyle & 0x10)
\r
1081 text = wxT("Predictable termination");
\r
1083 text = wxT("No predictable termination");
\r
1084 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1087 new OPJMarkerData(wxT("INFO"))
\r
1090 if (cbstyle & 0x20)
\r
1091 text = wxT("Segmentation symbols are used");
\r
1093 text = wxT("No segmentation symbols are used");
\r
1094 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1097 new OPJMarkerData(wxT("INFO"))
\r
1108 unsigned short int cqcc;
\r
1110 if (m_file->Read(onebyte, 1) != 1)
\r
1112 cqcc = onebyte[0];
\r
1114 if (m_file->Read(twobytes, 2) != 2)
\r
1116 cqcc = STREAM_TO_UINT16(twobytes, 0);
\r
1119 wxTreeItemId subcurrid = m_tree->AppendItem(currid,
\r
1120 wxString::Format(wxT("Comp. no. %d"), cqcc),
\r
1122 new OPJMarkerData(wxT("INFO"))
\r
1125 if (m_file->Read(onebyte, 1) != 1)
\r
1127 unsigned char sqcc = onebyte[0];
\r
1130 switch (sqcc & 0x1F) {
\r
1132 text = wxT("No quantization");
\r
1135 text = wxT("Scalar implicit");
\r
1138 text = wxT("Scalar explicit");
\r
1141 text = wxT("Unknown");
\r
1144 text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5);
\r
1145 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
1148 new OPJMarkerData(wxT("INFO"))
\r
1159 if (m_file->Read(onebyte, 1) != 1)
\r
1161 unsigned char sqcd = onebyte[0];
\r
1164 switch (sqcd & 0x1F) {
\r
1166 text = wxT("No quantization");
\r
1169 text = wxT("Scalar implicit");
\r
1172 text = wxT("Scalar explicit");
\r
1175 text = wxT("Unknown");
\r
1178 text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5);
\r
1179 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
1182 new OPJMarkerData(wxT("INFO"))
\r
1193 #define showlen 25
\r
1194 char comment[showlen];
\r
1195 wxString comments;
\r
1197 if (m_file->Read(twobytes, 2) != 2)
\r
1199 unsigned short int rcom = STREAM_TO_UINT16(twobytes, 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
1209 text = wxT("Reserved for extension");
\r
1210 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
1213 new OPJMarkerData(wxT("INFO"))
\r
1216 if (m_file->Read(comment, showlen) != showlen)
\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
1224 new OPJMarkerData(wxT("INFO"))
\r
1234 if (m_file->Read(onebyte, 1) != 1)
\r
1236 unsigned char ztlm = onebyte[0];
\r
1238 if (m_file->Read(onebyte, 1) != 1)
\r
1240 unsigned char stlm = onebyte[0];
\r
1242 image = m_tree->TreeCtrlIcon_File;
\r
1243 imageSel = image + 1;
\r
1245 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
1246 wxString::Format(wxT("TLM #%d"), ztlm),
\r
1248 new OPJMarkerData(wxT("INFO"))
\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
1255 new OPJMarkerData(wxT("INFO"))
\r
1260 numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6));
\r
1262 image = m_tree->TreeCtrlIcon_Folder;
\r
1263 imageSel = image + 1;
\r
1265 subcurrid3 = m_tree->AppendItem(currid,
\r
1266 wxT("Tile parts"),
\r
1268 new OPJMarkerData(wxT("INFO"))
\r
1271 image = m_tree->TreeCtrlIcon_File;
\r
1272 imageSel = image + 1;
\r
1274 for (n = 0; n < numparts; n++) {
\r
1276 unsigned short int ttlm;
\r
1277 unsigned long int ptlm;
\r
1279 switch (((stlm & 0x30) >> 4)) {
\r
1286 if (m_file->Read(onebyte, 1) != 1)
\r
1288 ttlm = onebyte[0];
\r
1292 if (m_file->Read(twobytes, 2) != 2)
\r
1294 ttlm = STREAM_TO_UINT16(twobytes, 0);
\r
1299 switch (((stlm & 0x40) >> 6)) {
\r
1302 if (m_file->Read(twobytes, 2) != 2)
\r
1304 ptlm = STREAM_TO_UINT16(twobytes, 0);
\r
1308 if (m_file->Read(fourbytes, 4) != 4)
\r
1310 ptlm = STREAM_TO_UINT32(fourbytes, 0);
\r
1315 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1316 wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm),
\r
1318 new OPJMarkerData(wxT("INFO"))
\r
1331 int n, numchanges;
\r
1334 numchanges = (currlen - 2) / 7;
\r
1336 numchanges = (currlen - 2) / 9;
\r
1338 for (n = 0; n < numchanges; n++) {
\r
1340 image = m_tree->TreeCtrlIcon_Folder;
\r
1341 imageSel = image + 1;
\r
1343 wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,
\r
1344 wxString::Format(wxT("Change #%d"), n),
\r
1346 new OPJMarkerData(wxT("INFO"))
\r
1349 if (m_file->Read(onebyte, 1) != 1)
\r
1351 unsigned char rspod = onebyte[0];
\r
1353 unsigned short int cspod;
\r
1355 if (m_file->Read(onebyte, 1) != 1)
\r
1357 cspod = onebyte[0];
\r
1359 if (m_file->Read(twobytes, 2) != 2)
\r
1361 cspod = STREAM_TO_UINT16(twobytes, 0);
\r
1364 if (m_file->Read(twobytes, 2) != 2)
\r
1366 unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0);
\r
1368 if (m_file->Read(onebyte, 1) != 1)
\r
1370 unsigned char repod = onebyte[0];
\r
1372 unsigned short int cepod;
\r
1374 if (m_file->Read(onebyte, 1) != 1)
\r
1376 cepod = onebyte[0];
\r
1378 if (m_file->Read(twobytes, 2) != 2)
\r
1380 cepod = STREAM_TO_UINT16(twobytes, 0);
\r
1383 if (m_file->Read(onebyte, 1) != 1)
\r
1385 unsigned char ppod = onebyte[0];
\r
1387 image = m_tree->TreeCtrlIcon_File;
\r
1388 imageSel = image + 1;
\r
1390 wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1391 wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod),
\r
1393 new OPJMarkerData(wxT("INFO"))
\r
1396 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1397 wxString::Format(wxT("%d <= Component < %d"), cspod, cepod),
\r
1399 new OPJMarkerData(wxT("INFO"))
\r
1402 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1403 wxString::Format(wxT("0 <= Layer < %d"), lyepod),
\r
1405 new OPJMarkerData(wxT("INFO"))
\r
1408 wxString text = wxT("");
\r
1411 text << wxT("LRCP");
\r
1414 text << wxT("RLCP");
\r
1417 text << wxT("LRCP");
\r
1420 text << wxT("RPCL");
\r
1423 text << wxT("CPRL");
\r
1426 text << wxT("unknown progression");
\r
1429 subcurrid4 = m_tree->AppendItem(subcurrid3,
\r
1432 new OPJMarkerData(wxT("INFO"))
\r
1453 // increment number of markers
\r
1454 if (nmarks++ >= maxmarks) {
\r
1455 WriteText(wxT("Maximum amount of markers exceeded"));
\r
1459 // advance position
\r
1460 OPJ_ADVANCE(currlen + 2);
\r
1463 WriteText(wxT("Search finished"));
\r