Added index.h and index.c in VC6 projects; wrapped index.h in the C++ preprocessor...
authorGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Thu, 29 Nov 2007 14:38:26 +0000 (14:38 +0000)
committerGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Thu, 29 Nov 2007 14:38:26 +0000 (14:38 +0000)
21 files changed:
ChangeLog
OPJViewer/Makefile
OPJViewer/OPJViewer.dsp
OPJViewer/source/OPJDialogs.cpp
OPJViewer/source/OPJThreads.cpp [new file with mode: 0644]
OPJViewer/source/OPJViewer.cpp
OPJViewer/source/OPJViewer.h
OPJViewer/source/build.h
OPJViewer/source/imagj2k.cpp
OPJViewer/source/imagj2k.h
OPJViewer/source/imagmxf.cpp [new file with mode: 0644]
OPJViewer/source/imagmxf.h [new file with mode: 0644]
codec/image_to_j2k.dsp
codec/index.c
codec/index.h
codec/j2k_to_image.dsp
jpwl/JPWL_image_to_j2k.dsp
jpwl/JPWL_j2k_to_image.dsp
jpwl/LibOpenJPEG_JPWL.dsp
jpwl/jpwl.c
jpwl/jpwl_lib.c

index 8e348eacac03cb83fe6437432b7b02f97052ac6d..d71b60323d3135be6f24ce227d88ccad4503325a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+November 29, 2007
+! [GB] Added index.h and index.c in VC6 projects; wrapped index.h in the C++ preprocessor; modified OPJViewer project and some files.
+
 November 14, 2007
 + [FOD] Created the file index.c in the codec directory. This file handles the creation of index files, 
                at encoding and decoding. 
index 75f57230aabb642eb8733093866fc96ca9ae4f3e..d3cb34164ec7ceeac13d73a18623090468e11e74 100644 (file)
@@ -6,7 +6,7 @@ AR = ar
 \r
 CFLAGS = -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT $(shell wx-config-2.8 --cxxflags) # -g -p -pg -DUSE_JPWL\r
 \r
-OPJV_SRCS = source/imagj2k.cpp source/imagmj2.cpp source/wxj2kparser.cpp source/imagjp2.cpp source/OPJViewer.cpp source/wxjp2parser.cpp\r
+OPJV_SRCS = source/imagj2k.cpp source/imagmj2.cpp source/wxj2kparser.cpp source/imagjp2.cpp source/OPJViewer.cpp source/wxjp2parser.cpp source/OPJViewer.cpp source/OPJThreads.cpp\r
 \r
 MODULES = $(OPJV_SRCS:.cpp=.o)\r
 \r
index d9521f4ce8594e4999cbd04c0a6a3d957f2d4e99..dad478bee7e58c98f43fab3beecbab1733d073d0 100644 (file)
@@ -42,7 +42,7 @@ RSC=rc.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "d:\programmi\wxWidgets-2.8.0\include" /I ".." /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /D "OPJ_HTMLABOUT" /D "OPJ_MANYFORMATS" /D "OPJ_INICONFIG" /FR /FD /c\r
+# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "d:\programmi\wxWidgets-2.8.0\include" /I ".." /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /D "USE_MXF" /D "OPJ_HTMLABOUT" /D "OPJ_MANYFORMATS" /D "OPJ_INICONFIG" /FR /FD /c\r
 # ADD BASE RSC /l 0x410 /d "NDEBUG"\r
 # ADD RSC /l 0x409 /i "d:\programmi\wxWidgets-2.8.0\include" /d "NDEBUG"\r
 BSC32=bscmake.exe\r
@@ -72,15 +72,15 @@ PostBuild_Cmds=buildupdate.bat
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "d:\Programmi\wxWidgets-2.8.0\INCLUDE" /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\programmi\wxWidgets-2.8.0\include" /I ".." /D "_DEBUG" /D "__WXDEBUG__" /D WXDEBUG=1 /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "OPJ_HTMLABOUT" /FR /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\Programmi\wxWidgets-2.8.0\INCLUDE" /I "c:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\programmi\wxWidgets-2.8.0\include" /I ".." /D "_DEBUG" /D "__WXDEBUG__" /D WXDEBUG=1 /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "OPJ_HTMLABOUT" /FR /FD /GZ /c\r
 # ADD BASE RSC /l 0x410 /d "_DEBUG"\r
-# ADD RSC /l 0x410 /i "d:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
+# ADD RSC /l 0x410 /i "c:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
 BSC32=bscmake.exe\r
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib wxzlibd.lib wxregexd.lib wxpngd.lib wxjpegd.lib wxtiffd.lib wxbase28d.lib wxmsw28d_core.lib wxmsw28d_html.lib wxmsw28d_adv.lib LibOpenJPEG_JPWLd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmtd.lib" /pdbtype:sept /libpath:"d:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Debug"\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib wxzlibd.lib wxregexd.lib wxpngd.lib wxjpegd.lib wxtiffd.lib wxbase28d.lib wxmsw28d_core.lib wxmsw28d_html.lib wxmsw28d_adv.lib LibOpenJPEG_JPWLd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmtd.lib" /pdbtype:sept /libpath:"c:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Debug"\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ENDIF \r
@@ -111,10 +111,26 @@ SOURCE=.\source\imagmj2.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\source\imagmxf.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\source\OPJAbout.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\source\OPJDialogs.cpp\r
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\source\OPJThreads.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\source\OPJViewer.cpp\r
 # End Source File\r
 # Begin Source File\r
@@ -160,6 +176,14 @@ SOURCE=.\source\imagmj2.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\source\imagmxf.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\source\OPJViewer.h\r
 # End Source File\r
 # End Group\r
index 063cec8bef7068d7e7ecd6fffe998d4ce5834655..ed68ef3f5c550e21c4d2402e4f647c7182843d3b 100644 (file)
@@ -32,8 +32,8 @@
 IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog)\r
 \r
 BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog)\r
-#ifdef USE_JPWL\r
        EVT_CHECKBOX(OPJDECO_ENABLEDECO, OPJDecoderDialog::OnEnableDeco)\r
+#ifdef USE_JPWL\r
        EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL)\r
 #endif // USE_JPWL\r
 END_EVENT_TABLE()\r
@@ -400,21 +400,6 @@ void OPJDecoderDialog::OnEnableJPWL(wxCommandEvent& event)
 \r
 #endif // USE_JPWL\r
 \r
-bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
-{\r
-    /*size_t nFiles = filenames.GetCount();\r
-    wxString str;\r
-    str.Printf( _T("%d files dropped\n"), (int)nFiles);\r
-    for ( size_t n = 0; n < nFiles; n++ ) {\r
-        str << filenames[n] << wxT("\n");\r
-    }\r
-    wxLogMessage(str);*/\r
-       m_pOwner->OpenFiles(filenames, filenames);\r
-\r
-    return true;\r
-}\r
-\r
-\r
 \r
 \r
 \r
@@ -425,12 +410,16 @@ bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
 IMPLEMENT_CLASS(OPJEncoderDialog, wxPropertySheetDialog)\r
 \r
 BEGIN_EVENT_TABLE(OPJEncoderDialog, wxPropertySheetDialog)\r
-#ifdef USE_JPWL\r
-       EVT_CHECKBOX(OPJENCO_ENABLEJPWL, OPJEncoderDialog::OnEnableJPWL)\r
        EVT_CHECKBOX(OPJENCO_ENABLECOMM, OPJEncoderDialog::OnEnableComm)\r
        EVT_CHECKBOX(OPJENCO_ENABLEINDEX, OPJEncoderDialog::OnEnableIdx)\r
+       EVT_CHECKBOX(OPJENCO_ENABLEPOC, OPJEncoderDialog::OnEnablePoc)\r
        EVT_RADIOBUTTON(OPJENCO_RATERADIO, OPJEncoderDialog::OnRadioQualityRate)\r
        EVT_RADIOBUTTON(OPJENCO_QUALITYRADIO, OPJEncoderDialog::OnRadioQualityRate)\r
+#ifdef USE_JPWL\r
+       EVT_CHECKBOX(OPJENCO_ENABLEJPWL, OPJEncoderDialog::OnEnableJPWL)\r
+       EVT_CHOICE(OPJENCO_HPROT, OPJEncoderDialog::OnHprotSelect)\r
+       EVT_CHOICE(OPJENCO_PPROT, OPJEncoderDialog::OnPprotSelect)\r
+       EVT_CHOICE(OPJENCO_SENSI, OPJEncoderDialog::OnSensiSelect)\r
 #endif // USE_JPWL\r
 END_EVENT_TABLE()\r
 \r
@@ -454,12 +443,12 @@ OPJEncoderDialog::OPJEncoderDialog(wxWindow* win, int dialogType)
        wxPanel* jpwlSettings = CreatePart11SettingsPage(m_settingsNotebook);\r
 #endif // USE_JPWL\r
 \r
-       m_settingsNotebook->AddPage(jpeg2000_1Settings, wxT("JPEG 2000 - 1"), false);\r
-       m_settingsNotebook->AddPage(jpeg2000_2Settings, wxT("JPEG 2000 - 2"), false);\r
-       m_settingsNotebook->AddPage(mainSettings, wxT("General"), false);\r
 #ifdef USE_JPWL\r
        m_settingsNotebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
 #endif // USE_JPWL\r
+       m_settingsNotebook->AddPage(jpeg2000_1Settings, wxT("JPEG 2000 - 1"), false);\r
+       m_settingsNotebook->AddPage(jpeg2000_2Settings, wxT("JPEG 2000 - 2"), false);\r
+       m_settingsNotebook->AddPage(mainSettings, wxT("General"), false);\r
 \r
        LayoutDialog();\r
 }\r
@@ -491,12 +480,218 @@ wxPanel* OPJEncoderDialog::CreateMainSettingsPage(wxWindow* parent)
 wxPanel* OPJEncoderDialog::CreatePart11SettingsPage(wxWindow* parent)\r
 {\r
     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+       int specno;\r
 \r
        // top sizer\r
     wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
 \r
+               // add JPWL enabling check box\r
+               topSizer->Add(\r
+                       m_enablejpwlCheck = new wxCheckBox(panel, OPJENCO_ENABLEJPWL, wxT("Enable JPWL"),\r
+                       wxDefaultPosition, wxDefaultSize),\r
+                       0, wxGROW | wxALL | wxALIGN_CENTER, 5);\r
+               m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwle);\r
+\r
                // sub top sizer\r
-               wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+               wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3);\r
+\r
+                       // header settings, column\r
+                       wxStaticBox* headerBox = new wxStaticBox(panel, wxID_ANY, wxT("Header protection"));\r
+                       wxBoxSizer* headerSizer = new wxStaticBoxSizer(headerBox, wxVERTICAL);\r
+\r
+                               // info sizer, row\r
+                               wxBoxSizer* info1Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               info1Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Type")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               // add some horizontal space\r
+                               info1Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                               // add some text\r
+                               info1Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Tile part")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                       headerSizer->Add(info1Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+                       // specify specs\r
+                       wxString hprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"),\r
+                               wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"),\r
+                               wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"),\r
+                               wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")};\r
+                       for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+                                       // tile+hprot sizer, row\r
+                                       wxBoxSizer* tilehprotSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                                       // add the value selection\r
+                                       tilehprotSizer->Add(\r
+                                               m_hprotChoice[specno] = new wxChoice(panel, OPJENCO_HPROT,\r
+                                                       wxDefaultPosition, wxSize(60, wxDefaultCoord),\r
+                                                       WXSIZEOF(hprotvalues), hprotvalues),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+                                       m_hprotChoice[specno]->SetSelection(wxGetApp().m_hprotsel[specno]);\r
+\r
+                                       // add some horizontal space\r
+                                       tilehprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                                       // add the value control\r
+                                       tilehprotSizer->Add(\r
+                                               m_htileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_HTILE,\r
+                                                       wxString::Format(wxT("%d"), wxGetApp().m_htileval[specno]),\r
+                                                       wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+                                                       wxSP_ARROW_KEYS,\r
+                                                       0, JPWL_MAXIMUM_TILES - 1, 0),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               headerSizer->Add(tilehprotSizer, 0, wxGROW | wxALL, 0);\r
+                       }\r
+\r
+                       wxCommandEvent event1;\r
+                       OnHprotSelect(event1);\r
+\r
+               subtopSizer->Add(headerSizer, 0, wxGROW | wxALL, 3);\r
+\r
+                       // packet settings, column\r
+                       wxStaticBox* packetBox = new wxStaticBox(panel, wxID_ANY, wxT("Packet protection"));\r
+                       wxBoxSizer* packetSizer = new wxStaticBoxSizer(packetBox, wxVERTICAL);\r
+\r
+                               // info sizer, row\r
+                               wxBoxSizer* info2Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Type")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               // add some horizontal space\r
+                               info2Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                               // add some text\r
+                               info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Tile part")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               // add some horizontal space\r
+                               info2Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                               // add some text\r
+                               info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Packet")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                       packetSizer->Add(info2Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+                       // specify specs\r
+                       wxString pprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"),\r
+                               wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"),\r
+                               wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"),\r
+                               wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")};\r
+                       for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+                                       // tile+pprot sizer, row\r
+                                       wxBoxSizer* tilepprotSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                                       // add the value selection\r
+                                       tilepprotSizer->Add(\r
+                                               m_pprotChoice[specno] = new wxChoice(panel, OPJENCO_PPROT,\r
+                                                       wxDefaultPosition, wxSize(60, wxDefaultCoord),\r
+                                                       WXSIZEOF(pprotvalues), pprotvalues),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+                                       m_pprotChoice[specno]->SetSelection(wxGetApp().m_pprotsel[specno]);\r
+\r
+                                       // add some horizontal space\r
+                                       tilepprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                                       // add the value control\r
+                                       tilepprotSizer->Add(\r
+                                               m_ptileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PTILE,\r
+                                                       wxString::Format(wxT("%d"), wxGetApp().m_ptileval[specno]),\r
+                                                       wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+                                                       wxSP_ARROW_KEYS,\r
+                                                       0, JPWL_MAXIMUM_TILES - 1, 0),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                                       // add some horizontal space\r
+                                       tilepprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                                       // add the value control\r
+                                       tilepprotSizer->Add(\r
+                                               m_ppackCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PPACK,\r
+                                                       wxString::Format(wxT("%d"), wxGetApp().m_ppackval[specno]),\r
+                                                       wxDefaultPosition, wxSize(50, wxDefaultCoord),\r
+                                                       wxSP_ARROW_KEYS,\r
+                                                       0, 2047, 0),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               packetSizer->Add(tilepprotSizer, 0, wxGROW | wxALL, 0);\r
+                       }\r
+\r
+                       wxCommandEvent event2;\r
+                       OnPprotSelect(event2);\r
+\r
+               subtopSizer->Add(packetSizer, 0, wxGROW | wxALL, 3);\r
+\r
+                       // sensitivity settings, column\r
+                       wxStaticBox* sensiBox = new wxStaticBox(panel, wxID_ANY, wxT("Sensitivity"));\r
+                       wxBoxSizer* sensiSizer = new wxStaticBoxSizer(sensiBox, wxVERTICAL);\r
+\r
+                               // info sizer, row\r
+                               wxBoxSizer* info3Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               info3Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Type")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               // add some horizontal space\r
+                               info3Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                               // add some text\r
+                               info3Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+                                                               wxT("Tile part")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                       sensiSizer->Add(info3Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+                       // specify specs\r
+                       wxString sensivalues[] = {wxT("None"), wxT("RELATIVE ERROR"), wxT("MSE"),\r
+                               wxT("MSE REDUCTION"), wxT("PSNR INCREMENT"), wxT("MAXERR"), wxT("TSE")};\r
+                       for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+                                       // tile+sensi sizer, row\r
+                                       wxBoxSizer* tilesensiSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                                       // add the value selection\r
+                                       tilesensiSizer->Add(\r
+                                               m_sensiChoice[specno] = new wxChoice(panel, OPJENCO_SENSI,\r
+                                                       wxDefaultPosition, wxSize(110, wxDefaultCoord),\r
+                                                       WXSIZEOF(sensivalues), sensivalues),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+                                       m_sensiChoice[specno]->SetSelection(wxGetApp().m_sensisel[specno]);\r
+\r
+                                       // add some horizontal space\r
+                                       tilesensiSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+                                       // add the value control\r
+                                       tilesensiSizer->Add(\r
+                                               m_stileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_STILE,\r
+                                                       wxString::Format(wxT("%d"), wxGetApp().m_stileval[specno]),\r
+                                                       wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+                                                       wxSP_ARROW_KEYS,\r
+                                                       0, JPWL_MAXIMUM_TILES - 1, 0),\r
+                                               0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+                               sensiSizer->Add(tilesensiSizer, 0, wxGROW | wxALL, 0);\r
+                       }\r
+\r
+                       wxCommandEvent event3;\r
+                       OnSensiSelect(event3);\r
+\r
+               subtopSizer->Add(sensiSizer, 0, wxGROW | wxALL, 3);\r
 \r
        topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
 \r
@@ -668,7 +863,7 @@ wxPanel* OPJEncoderDialog::CreatePart1_1SettingsPage(wxWindow* parent)
                                                                wxString::Format(wxT("%d"), wxGetApp().m_resolutions),\r
                                                                wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
                                                                wxSP_ARROW_KEYS,\r
-                                                               0, 256, 6),\r
+                                                               1, 256, 6),\r
                                        0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
 \r
                        transformSizer->Add(resnumSizer, 0, wxGROW | wxALL, 3);\r
@@ -926,40 +1121,40 @@ wxPanel* OPJEncoderDialog::CreatePart1_2SettingsPage(wxWindow* parent)
 \r
                subtopSizer->Add(roiSizer, 0, wxGROW | wxALL, 3);\r
 \r
-                       // Index file settings, column\r
-                       wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing"));\r
-                       wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL);\r
+                       // POC settings, column\r
+                       wxStaticBox* pocBox = new wxStaticBox(panel, wxID_ANY, wxT("POC"));\r
+                       wxBoxSizer* pocSizer = new wxStaticBoxSizer(pocBox, wxVERTICAL);\r
 \r
-                       // indexing check box\r
-                       indexSizer->Add(\r
-                               m_enableidxCheck = new wxCheckBox(panel, OPJENCO_ENABLEINDEX, wxT("Enabled"),\r
+                       // POC check box\r
+                       pocSizer->Add(\r
+                               m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled (tn=rs,cs,le,re,ce,pr)"),\r
                                wxDefaultPosition, wxDefaultSize),\r
                                0, wxGROW | wxALL, 3);\r
-                       m_enableidxCheck->SetValue(wxGetApp().m_enableidx);\r
+                       m_enablepocCheck->SetValue(wxGetApp().m_enablepoc);\r
 \r
-                               // index file sizer, row\r
-                               wxBoxSizer* indexnameSizer = new wxBoxSizer(wxHORIZONTAL);\r
+                               // POC sizer, row\r
+                               wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL);\r
 \r
                                // add some text\r
-                               indexnameSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&File name:")),\r
-                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 3);\r
+                               pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")),\r
+                                                               0, wxALL | wxALIGN_TOP, 3);\r
 \r
                                // add some horizontal space\r
-                               indexnameSizer->Add(3, 3, 1, wxALL, 0);\r
+                               pocspecSizer->Add(3, 3, 1, wxALL, 0);\r
 \r
                                // add the value control\r
-                               indexnameSizer->Add(\r
-                                       m_indexCtrl = new wxTextCtrl(panel, OPJENCO_INDEXNAME,\r
-                                                               wxGetApp().m_index,\r
-                                                               wxDefaultPosition, wxSize(120, wxDefaultCoord),\r
-                                                               wxTE_LEFT),\r
+                               pocspecSizer->Add(\r
+                                       m_pocCtrl = new wxTextCtrl(panel, OPJENCO_POCSPEC,\r
+                                                               wxGetApp().m_poc,\r
+                                                               wxDefaultPosition, wxSize(140, 60),\r
+                                                               wxTE_LEFT | wxTE_MULTILINE),\r
                                        0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
-                               m_indexCtrl->Enable(wxGetApp().m_enableidx);\r
+                               m_pocCtrl->Enable(wxGetApp().m_enablepoc);\r
 \r
-                       indexSizer->Add(indexnameSizer, 0, wxGROW | wxALL, 3);\r
-\r
-               subtopSizer->Add(indexSizer, 0, wxGROW | wxALL, 3);\r
+                       pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3);\r
 \r
+               subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3);\r
+                       \r
                        // Comment settings, column\r
                        wxStaticBox* commentBox = new wxStaticBox(panel, wxID_ANY, wxT("Comment"));\r
                        wxBoxSizer* commentSizer = new wxStaticBoxSizer(commentBox, wxVERTICAL);\r
@@ -985,39 +1180,39 @@ wxPanel* OPJEncoderDialog::CreatePart1_2SettingsPage(wxWindow* parent)
 \r
                subtopSizer->Add(commentSizer, 0, wxGROW | wxALL, 3);\r
 \r
-                       // POC settings, column\r
-                       wxStaticBox* pocBox = new wxStaticBox(panel, wxID_ANY, wxT("POC"));\r
-                       wxBoxSizer* pocSizer = new wxStaticBoxSizer(pocBox, wxVERTICAL);\r
+                       // Index file settings, column\r
+                       wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing"));\r
+                       wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL);\r
 \r
-                       // POC check box\r
-                       pocSizer->Add(\r
-                               m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled"),\r
+                       // indexing check box\r
+                       indexSizer->Add(\r
+                               m_enableidxCheck = new wxCheckBox(panel, OPJENCO_ENABLEINDEX, wxT("Enabled"),\r
                                wxDefaultPosition, wxDefaultSize),\r
                                0, wxGROW | wxALL, 3);\r
-                       m_enablepocCheck->SetValue(/*wxGetApp().m_enableidx*/true);\r
+                       m_enableidxCheck->SetValue(wxGetApp().m_enableidx);\r
 \r
-                               // POC sizer, row\r
-                               wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL);\r
+                               // index file sizer, row\r
+                               wxBoxSizer* indexnameSizer = new wxBoxSizer(wxHORIZONTAL);\r
 \r
                                // add some text\r
-                               pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")),\r
+                               indexnameSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&File name:")),\r
                                                                0, wxALL | wxALIGN_CENTER_VERTICAL, 3);\r
 \r
                                // add some horizontal space\r
-                               pocspecSizer->Add(3, 3, 1, wxALL, 0);\r
+                               indexnameSizer->Add(3, 3, 1, wxALL, 0);\r
 \r
                                // add the value control\r
-                               pocspecSizer->Add(\r
-                                       m_pocCtrl = new wxTextCtrl(panel, OPJENCO_POCSPEC,\r
-                                                               /*wxGetApp().m_index*/wxT("RRRR"),\r
+                               indexnameSizer->Add(\r
+                                       m_indexCtrl = new wxTextCtrl(panel, OPJENCO_INDEXNAME,\r
+                                                               wxGetApp().m_index,\r
                                                                wxDefaultPosition, wxSize(120, wxDefaultCoord),\r
                                                                wxTE_LEFT),\r
                                        0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
-                               m_pocCtrl->Enable(/*wxGetApp().m_enableidx*/true);\r
+                               m_indexCtrl->Enable(wxGetApp().m_enableidx);\r
 \r
-                       pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3);\r
+                       indexSizer->Add(indexnameSizer, 0, wxGROW | wxALL, 3);\r
 \r
-               subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3);\r
+               subtopSizer->Add(indexSizer, 0, wxGROW | wxALL, 3);\r
 \r
        topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
 \r
@@ -1052,6 +1247,18 @@ void OPJEncoderDialog::OnEnableIdx(wxCommandEvent& event)
 \r
 }\r
 \r
+void OPJEncoderDialog::OnEnablePoc(wxCommandEvent& event)\r
+{\r
+       if (event.IsChecked()) {\r
+               wxLogMessage(wxT("POC enabled"));\r
+               m_pocCtrl->Enable(true);\r
+       } else {\r
+               wxLogMessage(wxT("POC disabled"));\r
+               m_pocCtrl->Enable(false);\r
+       }\r
+\r
+}\r
+\r
 void OPJEncoderDialog::OnRadioQualityRate(wxCommandEvent& event)\r
 {\r
        if (event.GetId() == OPJENCO_QUALITYRADIO) {\r
@@ -1068,15 +1275,99 @@ void OPJEncoderDialog::OnRadioQualityRate(wxCommandEvent& event)
 #ifdef USE_JPWL\r
 void OPJEncoderDialog::OnEnableJPWL(wxCommandEvent& event)\r
 {\r
-       /*if (event.IsChecked()) {\r
+       int specno;\r
+\r
+       if (event.IsChecked()) {\r
                wxLogMessage(wxT("JPWL enabled"));\r
-               m_expcompsCtrl->Enable(true);\r
-               m_maxtilesCtrl->Enable(true);\r
+               for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+                       m_hprotChoice[specno]->Enable(true);\r
+                       m_htileCtrl[specno]->Enable(true);\r
+                       m_pprotChoice[specno]->Enable(true);\r
+                       m_ptileCtrl[specno]->Enable(true);\r
+                       m_ppackCtrl[specno]->Enable(true);\r
+                       m_sensiChoice[specno]->Enable(true);\r
+                       m_stileCtrl[specno]->Enable(true);\r
+               }\r
+               OnHprotSelect(event);\r
+               OnPprotSelect(event);\r
+               OnSensiSelect(event);\r
        } else {\r
                wxLogMessage(wxT("JPWL disabled"));\r
-               m_expcompsCtrl->Enable(false);\r
-               m_maxtilesCtrl->Enable(false);\r
-       }*/\r
+               for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+                       m_hprotChoice[specno]->Enable(false);\r
+                       m_htileCtrl[specno]->Enable(false);\r
+                       m_pprotChoice[specno]->Enable(false);\r
+                       m_ptileCtrl[specno]->Enable(false);\r
+                       m_ppackCtrl[specno]->Enable(false);\r
+                       m_sensiChoice[specno]->Enable(false);\r
+                       m_stileCtrl[specno]->Enable(false);\r
+               }\r
+       }\r
 \r
 }\r
+\r
+void OPJEncoderDialog::OnHprotSelect(wxCommandEvent& event)\r
+{\r
+       int specno;\r
+\r
+       // deactivate properly\r
+       for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+               if (!m_hprotChoice[specno]->GetSelection()) {\r
+                       m_hprotChoice[specno]->Enable(false);\r
+                       m_htileCtrl[specno]->Enable(false);\r
+               } else\r
+                       break;\r
+       }\r
+       if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+               m_hprotChoice[specno + 1]->Enable(true);\r
+               m_htileCtrl[specno + 1]->Enable(true);\r
+       }\r
+\r
+       //wxLogMessage(wxT("hprot changed: %d"), specno);\r
+}\r
+\r
+void OPJEncoderDialog::OnPprotSelect(wxCommandEvent& event)\r
+{\r
+       int specno;\r
+\r
+       // deactivate properly\r
+       for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+               if (!m_pprotChoice[specno]->GetSelection()) {\r
+                       m_pprotChoice[specno]->Enable(false);\r
+                       m_ptileCtrl[specno]->Enable(false);\r
+                       m_ppackCtrl[specno]->Enable(false);\r
+               } else\r
+                       break;\r
+       }\r
+       if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+               m_pprotChoice[specno + 1]->Enable(true);\r
+               m_ptileCtrl[specno + 1]->Enable(true);\r
+               m_ppackCtrl[specno + 1]->Enable(true);\r
+       }\r
+\r
+       //wxLogMessage(wxT("pprot changed: %d"), specno);\r
+}\r
+\r
+void OPJEncoderDialog::OnSensiSelect(wxCommandEvent& event)\r
+{\r
+       int specno;\r
+\r
+       // deactivate properly\r
+       for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+               if (!m_sensiChoice[specno]->GetSelection()) {\r
+                       m_sensiChoice[specno]->Enable(false);\r
+                       m_stileCtrl[specno]->Enable(false);\r
+               } else\r
+                       break;\r
+       }\r
+       if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+               m_sensiChoice[specno + 1]->Enable(true);\r
+               m_stileCtrl[specno + 1]->Enable(true);\r
+       }\r
+\r
+       //wxLogMessage(wxT("sprot changed: %d"), specno);\r
+}\r
+\r
+\r
 #endif // USE_JPWL\r
+\r
diff --git a/OPJViewer/source/OPJThreads.cpp b/OPJViewer/source/OPJThreads.cpp
new file mode 100644 (file)
index 0000000..55ed4ac
--- /dev/null
@@ -0,0 +1,1251 @@
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita'� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#include "OPJViewer.h"\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Encoding thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJEncoThread::OPJEncoThread(OPJCanvas *canvas)\r
+        : wxThread()\r
+{\r
+    m_count = 0;\r
+    m_canvas = canvas;\r
+}\r
+\r
+void OPJEncoThread::WriteText(const wxString& text)\r
+{\r
+    wxString msg;\r
+\r
+    // before doing any GUI calls we must ensure that this thread is the only\r
+    // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiEnter();\r
+#endif // __WXGTK__\r
+\r
+    msg << text;\r
+    m_canvas->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif // __WXGTK__\r
+}\r
+\r
+void OPJEncoThread::OnExit()\r
+{\r
+    wxCriticalSectionLocker locker(wxGetApp().m_enco_critsect);\r
+\r
+    wxArrayThread& ethreads = wxGetApp().m_enco_threads;\r
+    ethreads.Remove(this);\r
+\r
+    if (ethreads.IsEmpty() )\r
+    {\r
+        // signal the main thread that there are no more threads left if it is\r
+        // waiting for us\r
+        if (wxGetApp().m_enco_waitingUntilAllDone) {\r
+            wxGetApp().m_enco_waitingUntilAllDone = false;\r
+            wxGetApp().m_enco_semAllDone.Post();\r
+        }\r
+    }\r
+}\r
+\r
+void *OPJEncoThread::Entry()\r
+{\r
+    wxString text;\r
+\r
+       srand(GetId());\r
+       //int m_countnum = rand() % 9;\r
+    //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
+    //            GetId(), GetPriority(), m_countnum);\r
+    text.Printf(wxT("Enco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
+    WriteText(text);\r
+\r
+       // set handler properties\r
+       wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
+       j2kkkhandler->m_subsampling = wxGetApp().m_subsampling;\r
+       j2kkkhandler->m_origin = wxGetApp().m_origin;\r
+       j2kkkhandler->m_rates = wxGetApp().m_rates;\r
+       j2kkkhandler->m_quality = wxGetApp().m_quality;\r
+       j2kkkhandler->m_enablequality = wxGetApp().m_enablequality;\r
+       j2kkkhandler->m_multicomp = wxGetApp().m_multicomp;\r
+       j2kkkhandler->m_irreversible = wxGetApp().m_irreversible;\r
+       j2kkkhandler->m_resolutions = wxGetApp().m_resolutions;\r
+       j2kkkhandler->m_progression = wxGetApp().m_progression;\r
+       j2kkkhandler->m_cbsize = wxGetApp().m_cbsize;\r
+       j2kkkhandler->m_prsize = wxGetApp().m_prsize;\r
+       j2kkkhandler->m_tsize = wxGetApp().m_tsize;\r
+       j2kkkhandler->m_torigin = wxGetApp().m_torigin;\r
+       j2kkkhandler->m_enablesop = wxGetApp().m_enablesop;\r
+       j2kkkhandler->m_enableeph = wxGetApp().m_enableeph;\r
+       j2kkkhandler->m_enablebypass = wxGetApp().m_enablebypass;\r
+       j2kkkhandler->m_enablerestart = wxGetApp().m_enablerestart;\r
+       j2kkkhandler->m_enablereset = wxGetApp().m_enablereset;\r
+       j2kkkhandler->m_enablesegmark = wxGetApp().m_enablesegmark;\r
+       j2kkkhandler->m_enableerterm = wxGetApp().m_enableerterm;\r
+       j2kkkhandler->m_enablevsc = wxGetApp().m_enablevsc;\r
+       j2kkkhandler->m_enableidx = wxGetApp().m_enableidx;\r
+       j2kkkhandler->m_index = m_canvas->m_savename.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxGetApp().m_index;\r
+       j2kkkhandler->m_enablecomm = wxGetApp().m_enablecomm;\r
+       j2kkkhandler->m_comment = wxGetApp().m_comment;\r
+       j2kkkhandler->m_enablepoc = wxGetApp().m_enablepoc;\r
+       j2kkkhandler->m_poc = wxGetApp().m_poc;\r
+\r
+       // save the file\r
+       if (!m_canvas->m_image100.SaveFile(m_canvas->m_savename.GetFullPath(), (wxBitmapType) wxBITMAP_TYPE_J2K)) {\r
+               WriteText(wxT("Can't save image"));\r
+               return NULL;\r
+       }\r
+\r
+    text.Printf(wxT("Enco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
+    WriteText(text);\r
+    return NULL;\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Decoding thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)\r
+        : wxThread()\r
+{\r
+    m_count = 0;\r
+    m_canvas = canvas;\r
+}\r
+\r
+void OPJDecoThread::WriteText(const wxString& text)\r
+{\r
+    wxString msg;\r
+\r
+    // before doing any GUI calls we must ensure that this thread is the only\r
+    // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiEnter();\r
+#endif // __WXGTK__\r
+\r
+    msg << text;\r
+    m_canvas->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif // __WXGTK__\r
+}\r
+\r
+void OPJDecoThread::OnExit()\r
+{\r
+    wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);\r
+\r
+    wxArrayThread& dthreads = wxGetApp().m_deco_threads;\r
+    dthreads.Remove(this);\r
+\r
+    if (dthreads.IsEmpty() )\r
+    {\r
+        // signal the main thread that there are no more threads left if it is\r
+        // waiting for us\r
+        if (wxGetApp().m_deco_waitingUntilAllDone) {\r
+            wxGetApp().m_deco_waitingUntilAllDone = false;\r
+            wxGetApp().m_deco_semAllDone.Post();\r
+        }\r
+    }\r
+}\r
+\r
+void *OPJDecoThread::Entry()\r
+{\r
+\r
+    wxString text;\r
+\r
+       srand(GetId());\r
+       //int m_countnum = rand() % 9;\r
+    //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
+    //            GetId(), GetPriority(), m_countnum);\r
+    text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
+\r
+    WriteText(text);\r
+\r
+    wxBitmap bitmap(100, 100);\r
+    wxImage image(100, 100, true); //= bitmap.ConvertToImage();\r
+    image.Destroy();\r
+\r
+       WriteText(m_canvas->m_fname.GetFullPath());\r
+\r
+\r
+       // set handler properties\r
+       wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
+       j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
+       j2kkkhandler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
+       j2kkkhandler->m_components = wxGetApp().m_components;\r
+#ifdef USE_JPWL\r
+       j2kkkhandler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
+       j2kkkhandler->m_expcomps = wxGetApp().m_expcomps;\r
+       j2kkkhandler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+       wxJP2Handler *jp222handler = (wxJP2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_JP2);\r
+       jp222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
+       jp222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
+       jp222handler->m_components = wxGetApp().m_components;\r
+#ifdef USE_JPWL\r
+       jp222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
+       jp222handler->m_expcomps = wxGetApp().m_expcomps;\r
+       jp222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+       wxMJ2Handler *mj222handler = (wxMJ2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_MJ2);\r
+       mj222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
+       mj222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
+       mj222handler->m_components = wxGetApp().m_components;\r
+       mj222handler->m_framenum = wxGetApp().m_framenum;\r
+#ifdef USE_JPWL\r
+       mj222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
+       mj222handler->m_expcomps = wxGetApp().m_expcomps;\r
+       mj222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+       if (wxGetApp().m_enabledeco) {\r
+\r
+               // load the file\r
+               if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY, 0)) {\r
+                       WriteText(wxT("Can't load image"));\r
+                       return NULL;\r
+               }\r
+\r
+       } else {\r
+\r
+               // display a macaron\r
+               if (!image.Create(300, 5, false)) {\r
+                       WriteText(wxT("Can't create image"));\r
+                       return NULL;\r
+               }\r
+\r
+       }\r
+\r
+       // assign 100% image\r
+    m_canvas->m_image100 = wxBitmap(image);\r
+\r
+       // find a fit-to-width zoom\r
+       int zooml, wzooml, hzooml;\r
+       wxSize clientsize = m_canvas->GetClientSize();\r
+       wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth()));\r
+       hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight()));\r
+       zooml = wxMin(100, wxMin(wzooml, hzooml));\r
+\r
+       // fit to width\r
+#ifndef __WXGTK__\r
+       m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
+#endif // __WXGTK__\r
+\r
+       //m_canvas->m_image = m_canvas->m_image100;\r
+       //m_canvas->Refresh();\r
+       //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0));\r
+\r
+    //text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\r
+    text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
+    WriteText(text);\r
+    return NULL;\r
+\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Parsing thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)\r
+        : wxThread()\r
+{\r
+    m_count = 0;\r
+    m_tree = tree;\r
+       m_parentid = parentid;\r
+}\r
+\r
+void OPJParseThread::WriteText(const wxString& text)\r
+{\r
+    wxString msg;\r
+\r
+    // before doing any GUI calls we must ensure that this thread is the only\r
+    // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiEnter();\r
+#endif // __WXGTK\r
+\r
+    msg << text;\r
+    m_tree->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif // __WXGTK\r
+}\r
+\r
+void OPJParseThread::OnExit()\r
+{\r
+    wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);\r
+\r
+    wxArrayThread& threads = wxGetApp().m_parse_threads;\r
+    threads.Remove(this);\r
+\r
+    if (threads.IsEmpty()) {\r
+        // signal the main thread that there are no more threads left if it is\r
+        // waiting for us\r
+        if (wxGetApp().m_parse_waitingUntilAllDone) {\r
+            wxGetApp().m_parse_waitingUntilAllDone = false;\r
+            wxGetApp().m_parse_semAllDone.Post();\r
+        }\r
+    }\r
+}\r
+\r
+void *OPJParseThread::Entry()\r
+{\r
+\r
+       printf("Entering\n\n");\r
+\r
+    wxString text;\r
+\r
+       srand(GetId());\r
+       int m_countnum = rand() % 9;\r
+    text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
+            GetId(), GetPriority(), m_countnum);\r
+    WriteText(text);\r
+    LoadFile(m_tree->m_fname);\r
+    text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
+    WriteText(text);\r
+\r
+\r
+    //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness\r
+\r
+       //wxBusyCursor wait;\r
+       //wxBusyInfo wait(wxT("Decoding image ..."));\r
+\r
+\r
+    /*for ( m_count = 0; m_count < m_countnum; m_count++ )\r
+    {\r
+        // check if we were asked to exit\r
+        if ( TestDestroy() )\r
+            break;\r
+\r
+        text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());\r
+        WriteText(text);\r
+\r
+        // wxSleep() can't be called from non-GUI thread!\r
+        wxThread::Sleep(10);\r
+    }*/\r
+\r
+    // wxLogMessage(text); -- test wxLog thread safeness\r
+\r
+       printf("Exiting\n\n");\r
+\r
+    return NULL;\r
+}\r
+\r
+\r
+///////////////////////////////////////////\r
+// Parsing hread and related\r
+///////////////////////////////////////////\r
+\r
+#if USE_GENERIC_TREECTRL\r
+BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)\r
+#else\r
+BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)\r
+#endif\r
+    /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag)\r
+    EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag)\r
+    EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/\r
+    /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit)\r
+    EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/\r
+    /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/\r
+#if 0       // there are so many of those that logging them causes flicker\r
+    /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/\r
+#endif\r
+    /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo)\r
+    EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/\r
+    EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding)\r
+    /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed)\r
+    EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/\r
+\r
+    EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged)\r
+    /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/\r
+    /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/\r
+    /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/\r
+\r
+    // so many differents ways to handle right mouse button clicks...\r
+    /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/\r
+    // EVT_TREE_ITEM_MENU is the preferred event for creating context menus\r
+    // on a tree control, because it includes the point of the click or item,\r
+    // meaning that no additional placement calculations are required.\r
+    EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
+    /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
+\r
+    /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
+    EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)\r
+    EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/\r
+END_EVENT_TABLE()\r
+\r
+// OPJMarkerTree implementation\r
+#if USE_GENERIC_TREECTRL\r
+IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)\r
+#else\r
+IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
+#endif\r
+\r
+OPJMarkerTree::OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id,\r
+           const wxPoint& pos, const wxSize& size, long style)\r
+          : wxTreeCtrl(parent, id, pos, size, style)\r
+{\r
+    m_reverseSort = false;\r
+       m_fname = fname;\r
+\r
+       m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;\r
+    CreateImageList();\r
+\r
+    // Add some items to the tree\r
+    //AddTestItemsToTree(5, 5);\r
+    int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
+    wxTreeItemId rootId = AddRoot(name,\r
+                                  image, image,\r
+                                  new OPJMarkerData(name));\r
+\r
+    OPJParseThread *pthread = CreateParseThread(0x00, subframe);\r
+    if (pthread->Run() != wxTHREAD_NO_ERROR)\r
+        wxLogMessage(wxT("Can't start parse thread!"));\r
+    else\r
+               wxLogMessage(wxT("New parse thread started."));\r
+\r
+       m_childframe = subframe;\r
+}\r
+\r
+void OPJMarkerTree::CreateImageList(int size)\r
+{\r
+    if (size == -1) {\r
+        SetImageList(NULL);\r
+        return;\r
+    }\r
+    if (size == 0)\r
+        size = m_imageSize;\r
+    else\r
+        m_imageSize = size;\r
+\r
+    // Make an image list containing small icons\r
+    wxImageList *images = new wxImageList(size, size, true);\r
+\r
+    // should correspond to TreeCtrlIcon_xxx enum\r
+    wxBusyCursor wait;\r
+    wxIcon icons[5];\r
+    icons[0] = wxIcon(icon1_xpm);\r
+    icons[1] = wxIcon(icon2_xpm);\r
+    icons[2] = wxIcon(icon3_xpm);\r
+    icons[3] = wxIcon(icon4_xpm);\r
+    icons[4] = wxIcon(icon5_xpm);\r
+\r
+    int sizeOrig = icons[0].GetWidth();\r
+    for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
+        if (size == sizeOrig) {\r
+            images->Add(icons[i]);\r
+        } else {\r
+            images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
+        }\r
+    }\r
+\r
+    AssignImageList(images);\r
+}\r
+\r
+#if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
+void OPJMarkerTree::CreateButtonsImageList(int size)\r
+{\r
+    if ( size == -1 ) {\r
+        SetButtonsImageList(NULL);\r
+        return;\r
+    }\r
+\r
+    // Make an image list containing small icons\r
+    wxImageList *images = new wxImageList(size, size, true);\r
+\r
+    // should correspond to TreeCtrlIcon_xxx enum\r
+    wxBusyCursor wait;\r
+    wxIcon icons[4];\r
+    icons[0] = wxIcon(icon3_xpm);   // closed\r
+    icons[1] = wxIcon(icon3_xpm);   // closed, selected\r
+    icons[2] = wxIcon(icon5_xpm);   // open\r
+    icons[3] = wxIcon(icon5_xpm);   // open, selected\r
+\r
+    for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
+        int sizeOrig = icons[i].GetWidth();\r
+        if ( size == sizeOrig ) {\r
+            images->Add(icons[i]);\r
+        } else {\r
+            images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
+        }\r
+    }\r
+\r
+    AssignButtonsImageList(images);\r
+#else\r
+void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))\r
+{\r
+#endif\r
+}\r
+\r
+void OPJParseThread::LoadFile(wxFileName fname)\r
+{\r
+       wxTreeItemId rootid;\r
+\r
+       // this is the root node\r
+       int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;\r
+\r
+       if (this->m_parentid) {\r
+               // leaf of a tree\r
+               rootid = m_parentid;\r
+               m_tree->SetItemText(rootid, wxT("Parsing..."));\r
+\r
+       } else {\r
+\r
+               // delete the existing tree hierarchy\r
+               m_tree->DeleteAllItems();\r
+\r
+               // new tree\r
+               rootid = m_tree->AddRoot(wxT("Parsing..."),\r
+                       image,\r
+                       image,\r
+                       new OPJMarkerData(fname.GetFullPath())\r
+                       );\r
+               //m_tree->SetItemFont(rootid, *wxITALIC_FONT);\r
+               m_tree->SetItemBold(rootid);\r
+       }\r
+\r
+       // open the file\r
+       wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);\r
+\r
+       // parsing enabled?\r
+       if (wxGetApp().m_enableparse) {\r
+\r
+               // what is the extension?\r
+               if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {\r
+\r
+                       // parse the file\r
+                       ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);\r
+\r
+               } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {\r
+\r
+                       // parse the file\r
+                       if (this->m_parentid) {\r
+                               //WriteText(wxT("Only a subsection of jp2"));\r
+                               OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid);\r
+                               ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid);\r
+                               m_tree->Expand(rootid);\r
+\r
+                       } else {\r
+                               // as usual\r
+                               ParseJP2File(&m_file, 0, m_file.Length(), rootid);\r
+                       }\r
+\r
+               } else {\r
+\r
+                       // unknown extension\r
+                       WriteText(wxT("Unknown file format!"));\r
+\r
+               }\r
+\r
+       }\r
+\r
+\r
+       // this is the root node\r
+       if (this->m_parentid)\r
+               m_tree->SetItemText(rootid, wxT("Codestream"));\r
+       else\r
+               //m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length()));\r
+               m_tree->SetItemText(rootid, fname.GetFullName());\r
+\r
+       // close the file\r
+       m_file.Close();\r
+\r
+       WriteText(wxT("Parsing finished!"));\r
+}\r
+\r
+/*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,\r
+                               const wxTreeItemId& item2)\r
+{\r
+    if ( m_reverseSort )\r
+    {\r
+        // just exchange 1st and 2nd items\r
+        return wxTreeCtrl::OnCompareItems(item2, item1);\r
+    }\r
+    else\r
+    {\r
+        return wxTreeCtrl::OnCompareItems(item1, item2);\r
+    }\r
+}*/\r
+\r
+/*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,\r
+                                     size_t numChildren,\r
+                                     size_t depth,\r
+                                     size_t folder)\r
+{\r
+    if ( depth > 0 )\r
+    {\r
+        bool hasChildren = depth > 1;\r
+\r
+        wxString str;\r
+        for ( size_t n = 0; n < numChildren; n++ )\r
+        {\r
+            // at depth 1 elements won't have any more children\r
+            if ( hasChildren )\r
+                str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));\r
+            else\r
+                str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));\r
+\r
+            // here we pass to AppendItem() normal and selected item images (we\r
+            // suppose that selected image follows the normal one in the enum)\r
+            int image, imageSel;\r
+            if ( wxGetApp().ShowImages() )\r
+            {\r
+                image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;\r
+                imageSel = image + 1;\r
+            }\r
+            else\r
+            {\r
+                image = imageSel = -1;\r
+            }\r
+            wxTreeItemId id = AppendItem(idParent, str, image, imageSel,\r
+                                         new OPJMarkerData(str));\r
+\r
+            // and now we also set the expanded one (only for the folders)\r
+            if ( hasChildren && wxGetApp().ShowImages() )\r
+            {\r
+                SetItemImage(id, TreeCtrlIcon_FolderOpened,\r
+                             wxTreeItemIcon_Expanded);\r
+            }\r
+\r
+            // remember the last child for OnEnsureVisible()\r
+            if ( !hasChildren && n == numChildren - 1 )\r
+            {\r
+                m_lastItem = id;\r
+            }\r
+\r
+            AddItemsRecursively(id, numChildren, depth - 1, n + 1);\r
+        }\r
+    }\r
+    //else: done!\r
+}*/\r
+\r
+/*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,\r
+                                    size_t depth)\r
+{\r
+    int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
+    wxTreeItemId rootId = AddRoot(wxT("Root"),\r
+                                  image, image,\r
+                                  new OPJMarkerData(wxT("Root item")));\r
+    if ( image != -1 )\r
+    {\r
+        SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);\r
+    }\r
+\r
+    AddItemsRecursively(rootId, numChildren, depth, 0);\r
+\r
+    // set some colours/fonts for testing\r
+    SetItemFont(rootId, *wxITALIC_FONT);\r
+\r
+    wxTreeItemIdValue cookie;\r
+    wxTreeItemId id = GetFirstChild(rootId, cookie);\r
+    SetItemTextColour(id, *wxBLUE);\r
+\r
+    id = GetNextChild(rootId, cookie);\r
+    id = GetNextChild(rootId, cookie);\r
+    SetItemTextColour(id, *wxRED);\r
+    SetItemBackgroundColour(id, *wxLIGHT_GREY);\r
+}*/\r
+\r
+/*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,\r
+                                     wxTreeItemIdValue cookie)\r
+{\r
+    wxTreeItemId id;\r
+\r
+    if ( !cookie )\r
+        id = GetFirstChild(idParent, cookie);\r
+    else\r
+        id = GetNextChild(idParent, cookie);\r
+\r
+    if ( !id.IsOk() )\r
+        return;\r
+\r
+    wxString text = GetItemText(id);\r
+    wxLogMessage(text);\r
+\r
+    if (ItemHasChildren(id))\r
+        GetItemsRecursively(id);\r
+\r
+    GetItemsRecursively(idParent, cookie);\r
+}*/\r
+\r
+/*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)\r
+{\r
+    int image = (GetItemImage(item) == TreeCtrlIcon_Folder)\r
+                    ? TreeCtrlIcon_File\r
+                    : TreeCtrlIcon_Folder;\r
+    SetItemImage(item, image, wxTreeItemIcon_Normal);\r
+\r
+    image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)\r
+                    ? TreeCtrlIcon_FileSelected\r
+                    : TreeCtrlIcon_FolderSelected;\r
+    SetItemImage(item, image, wxTreeItemIcon_Selected);\r
+}*/\r
+\r
+void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)\r
+{\r
+    wxTreeItemId item = event.GetItem();\r
+    wxString text;\r
+    if ( item.IsOk() )\r
+        text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
+    else\r
+        text = wxT("invalid item");\r
+    wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
+}\r
+\r
+OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
+{\r
+    OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
+\r
+    if (pthread->Create() != wxTHREAD_NO_ERROR)\r
+               wxLogError(wxT("Can't create parse thread!"));\r
+\r
+    wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);\r
+    wxGetApp().m_parse_threads.Add(pthread);\r
+\r
+    return pthread;\r
+}\r
+\r
+\r
+/*// avoid repetition\r
+#define TREE_EVENT_HANDLER(name)                                 \\r
+void OPJMarkerTree::name(wxTreeEvent& event)                        \\r
+{                                                                \\r
+    LogEvent(_T(#name), event);                                  \\r
+    SetLastItem(wxTreeItemId());                                 \\r
+    event.Skip();                                                \\r
+}*/\r
+\r
+/*TREE_EVENT_HANDLER(OnBeginRDrag)*/\r
+/*TREE_EVENT_HANDLER(OnDeleteItem)*/\r
+/*TREE_EVENT_HANDLER(OnGetInfo)\r
+TREE_EVENT_HANDLER(OnSetInfo)*/\r
+/*TREE_EVENT_HANDLER(OnItemExpanded)\r
+TREE_EVENT_HANDLER(OnItemExpanding)*/\r
+/*TREE_EVENT_HANDLER(OnItemCollapsed)*/\r
+/*TREE_EVENT_HANDLER(OnSelChanged)\r
+TREE_EVENT_HANDLER(OnSelChanging)*/\r
+\r
+/*#undef TREE_EVENT_HANDLER*/\r
+\r
+void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)\r
+{\r
+       wxTreeItemId item = event.GetItem();\r
+       OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
+       wxString text;\r
+\r
+       if (item.IsOk())\r
+               text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
+       else\r
+               text = wxT("invalid item");\r
+\r
+       if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))\r
+               return;\r
+\r
+       wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"),\r
+               text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
+               data->m_start, data->m_length);\r
+\r
+       // the codestream box is being asked for expansion\r
+       wxTreeItemIdValue cookie;\r
+       if (!GetFirstChild(item, cookie).IsOk()) {\r
+               OPJParseThread *pthread = CreateParseThread(item);\r
+               if (pthread->Run() != wxTHREAD_NO_ERROR)\r
+                       wxLogMessage(wxT("Can't start parse thread!"));\r
+               else\r
+                       wxLogMessage(wxT("New parse thread started."));\r
+       }\r
+}\r
+\r
+void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
+{\r
+       int bunch_linesize = 16;\r
+       int bunch_numlines = 7;\r
+\r
+       wxTreeItemId item = event.GetItem();\r
+       OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
+       wxString text;\r
+       int l, c, pos = 0, pre_pos;\r
+\r
+       m_peektextCtrl->Clear();\r
+\r
+       /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\r
+               text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
+               data->m_start, data->m_length) << wxT("\n");*/\r
+\r
+       // open the file and browse a little\r
+       wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);\r
+\r
+       // go to position claimed\r
+       fp->Seek(data->m_start, wxFromStart);\r
+\r
+       // read a bunch\r
+       int max_read = wxMin(wxFileOffset(bunch_linesize * bunch_numlines), data->m_length - data->m_start + 1);\r
+       if (data->m_desc == wxT("MARK (65380)")) {\r
+               /*wxLogMessage(data->m_desc);*/\r
+               max_read = data->m_length - data->m_start + 1;\r
+               bunch_numlines = (int) ceil((float) max_read / (float) bunch_linesize);\r
+       }\r
+       unsigned char *buffer = new unsigned char[bunch_linesize * bunch_numlines];\r
+       fp->Read(buffer, max_read);\r
+\r
+       // write the file data between start and stop\r
+       pos = 0;\r
+       for (l = 0; l < bunch_numlines; l++) {\r
+\r
+               text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
+\r
+               pre_pos = pos;\r
+\r
+               // add hex browsing text\r
+               for (c = 0; c < bunch_linesize; c++) {\r
+\r
+                       if (!(c % 8))\r
+                               text << wxT(" ");\r
+\r
+                       if (pos < max_read) {\r
+                               text << wxString::Format(wxT("%02X "), buffer[pos]);\r
+                       } else\r
+                               text << wxT("   ");\r
+                       pos++;\r
+               }\r
+\r
+               text << wxT("    ");\r
+\r
+               // add char browsing text\r
+               for (c = 0; c < bunch_linesize; c++) {\r
+\r
+                       if (pre_pos < max_read) {\r
+                               if ((buffer[pre_pos] == '\n') ||\r
+                                       (buffer[pre_pos] == '\t') ||\r
+                                       (buffer[pre_pos] == '\0') ||\r
+                                       (buffer[pre_pos] == 0x0D) ||\r
+                                       (buffer[pre_pos] == 0x0B))\r
+                                       buffer[pre_pos] = ' ';\r
+                               text << wxString::FromAscii((char) buffer[pre_pos]) << wxT(".");\r
+                       } else\r
+                               text << wxT("  ");\r
+                       pre_pos++;\r
+               }\r
+\r
+               text << wxT("\n");\r
+\r
+       }\r
+\r
+       // close the file\r
+       fp->Close();\r
+\r
+       m_peektextCtrl->WriteText(text);\r
+\r
+       delete buffer;\r
+}\r
+\r
+/*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)\r
+{\r
+    wxString key;\r
+    long keycode = event.GetKeyCode();\r
+    {\r
+        switch ( keycode )\r
+        {\r
+            case WXK_BACK: key = wxT("BACK"); break;\r
+            case WXK_TAB: key = wxT("TAB"); break;\r
+            case WXK_RETURN: key = wxT("RETURN"); break;\r
+            case WXK_ESCAPE: key = wxT("ESCAPE"); break;\r
+            case WXK_SPACE: key = wxT("SPACE"); break;\r
+            case WXK_DELETE: key = wxT("DELETE"); break;\r
+            case WXK_START: key = wxT("START"); break;\r
+            case WXK_LBUTTON: key = wxT("LBUTTON"); break;\r
+            case WXK_RBUTTON: key = wxT("RBUTTON"); break;\r
+            case WXK_CANCEL: key = wxT("CANCEL"); break;\r
+            case WXK_MBUTTON: key = wxT("MBUTTON"); break;\r
+            case WXK_CLEAR: key = wxT("CLEAR"); break;\r
+            case WXK_SHIFT: key = wxT("SHIFT"); break;\r
+            case WXK_ALT: key = wxT("ALT"); break;\r
+            case WXK_CONTROL: key = wxT("CONTROL"); break;\r
+            case WXK_MENU: key = wxT("MENU"); break;\r
+            case WXK_PAUSE: key = wxT("PAUSE"); break;\r
+            case WXK_CAPITAL: key = wxT("CAPITAL"); break;\r
+            case WXK_END: key = wxT("END"); break;\r
+            case WXK_HOME: key = wxT("HOME"); break;\r
+            case WXK_LEFT: key = wxT("LEFT"); break;\r
+            case WXK_UP: key = wxT("UP"); break;\r
+            case WXK_RIGHT: key = wxT("RIGHT"); break;\r
+            case WXK_DOWN: key = wxT("DOWN"); break;\r
+            case WXK_SELECT: key = wxT("SELECT"); break;\r
+            case WXK_PRINT: key = wxT("PRINT"); break;\r
+            case WXK_EXECUTE: key = wxT("EXECUTE"); break;\r
+            case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;\r
+            case WXK_INSERT: key = wxT("INSERT"); break;\r
+            case WXK_HELP: key = wxT("HELP"); break;\r
+            case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;\r
+            case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;\r
+            case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;\r
+            case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;\r
+            case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;\r
+            case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;\r
+            case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;\r
+            case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;\r
+            case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;\r
+            case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;\r
+            case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;\r
+            case WXK_ADD: key = wxT("ADD"); break;\r
+            case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;\r
+            case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;\r
+            case WXK_DECIMAL: key = wxT("DECIMAL"); break;\r
+            case WXK_DIVIDE: key = wxT("DIVIDE"); break;\r
+            case WXK_F1: key = wxT("F1"); break;\r
+            case WXK_F2: key = wxT("F2"); break;\r
+            case WXK_F3: key = wxT("F3"); break;\r
+            case WXK_F4: key = wxT("F4"); break;\r
+            case WXK_F5: key = wxT("F5"); break;\r
+            case WXK_F6: key = wxT("F6"); break;\r
+            case WXK_F7: key = wxT("F7"); break;\r
+            case WXK_F8: key = wxT("F8"); break;\r
+            case WXK_F9: key = wxT("F9"); break;\r
+            case WXK_F10: key = wxT("F10"); break;\r
+            case WXK_F11: key = wxT("F11"); break;\r
+            case WXK_F12: key = wxT("F12"); break;\r
+            case WXK_F13: key = wxT("F13"); break;\r
+            case WXK_F14: key = wxT("F14"); break;\r
+            case WXK_F15: key = wxT("F15"); break;\r
+            case WXK_F16: key = wxT("F16"); break;\r
+            case WXK_F17: key = wxT("F17"); break;\r
+            case WXK_F18: key = wxT("F18"); break;\r
+            case WXK_F19: key = wxT("F19"); break;\r
+            case WXK_F20: key = wxT("F20"); break;\r
+            case WXK_F21: key = wxT("F21"); break;\r
+            case WXK_F22: key = wxT("F22"); break;\r
+            case WXK_F23: key = wxT("F23"); break;\r
+            case WXK_F24: key = wxT("F24"); break;\r
+            case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;\r
+            case WXK_SCROLL: key = wxT("SCROLL"); break;\r
+            case WXK_PAGEUP: key = wxT("PAGEUP"); break;\r
+            case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;\r
+            case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;\r
+            case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;\r
+            case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;\r
+            case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;\r
+            case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;\r
+            case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;\r
+            case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;\r
+            case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;\r
+            case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;\r
+            case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;\r
+            case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;\r
+            case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;\r
+            case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;\r
+            case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;\r
+            case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;\r
+            case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;\r
+            case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;\r
+            case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;\r
+            case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;\r
+            case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;\r
+            case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;\r
+            case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;\r
+            case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;\r
+            case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;\r
+\r
+            default:\r
+            {\r
+               if ( keycode < 128 && wxIsprint((int)keycode) )\r
+                   key.Printf(wxT("'%c'"), (char)keycode);\r
+               else if ( keycode > 0 && keycode < 27 )\r
+                   key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);\r
+               else\r
+                   key.Printf(wxT("unknown (%ld)"), keycode);\r
+            }\r
+        }\r
+    }\r
+\r
+    wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
+                  name,\r
+                  key.c_str(),\r
+                  event.ControlDown() ? wxT('C') : wxT('-'),\r
+                  event.AltDown() ? wxT('A') : wxT('-'),\r
+                  event.ShiftDown() ? wxT('S') : wxT('-'),\r
+                  event.MetaDown() ? wxT('M') : wxT('-'));\r
+}\r
+\r
+void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)\r
+{\r
+    LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());\r
+\r
+    event.Skip();\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)\r
+{\r
+    // need to explicitly allow drag\r
+    if ( event.GetItem() != GetRootItem() )\r
+    {\r
+        m_draggedItem = event.GetItem();\r
+\r
+        wxLogMessage(wxT("OnBeginDrag: started dragging %s"),\r
+                     GetItemText(m_draggedItem).c_str());\r
+\r
+        event.Allow();\r
+    }\r
+    else\r
+    {\r
+        wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));\r
+    }\r
+}\r
+\r
+void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)\r
+{\r
+    wxTreeItemId itemSrc = m_draggedItem,\r
+                 itemDst = event.GetItem();\r
+    m_draggedItem = (wxTreeItemId)0l;\r
+\r
+    // where to copy the item?\r
+    if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )\r
+    {\r
+        // copy to the parent then\r
+        itemDst = GetItemParent(itemDst);\r
+    }\r
+\r
+    if ( !itemDst.IsOk() )\r
+    {\r
+        wxLogMessage(wxT("OnEndDrag: can't drop here."));\r
+\r
+        return;\r
+    }\r
+\r
+    wxString text = GetItemText(itemSrc);\r
+    wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."),\r
+                 text.c_str(), GetItemText(itemDst).c_str());\r
+\r
+    // just do append here - we could also insert it just before/after the item\r
+    // on which it was dropped, but this requires slightly more work... we also\r
+    // completely ignore the client data and icon of the old item but could\r
+    // copy them as well.\r
+    //\r
+    // Finally, we only copy one item here but we might copy the entire tree if\r
+    // we were dragging a folder.\r
+    int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1;\r
+    AppendItem(itemDst, text, image);\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)\r
+{\r
+    wxLogMessage(wxT("OnBeginLabelEdit"));\r
+\r
+    // for testing, prevent this item's label editing\r
+    wxTreeItemId itemId = event.GetItem();\r
+    if ( IsTestItem(itemId) )\r
+    {\r
+        wxMessageBox(wxT("You can't edit this item."));\r
+\r
+        event.Veto();\r
+    }\r
+    else if ( itemId == GetRootItem() )\r
+    {\r
+        // test that it is possible to change the text of the item being edited\r
+        SetItemText(itemId, _T("Editing root item"));\r
+    }\r
+}\r
+\r
+void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)\r
+{\r
+    wxLogMessage(wxT("OnEndLabelEdit"));\r
+\r
+    // don't allow anything except letters in the labels\r
+    if ( !event.GetLabel().IsWord() )\r
+    {\r
+        wxMessageBox(wxT("The new label should be a single word."));\r
+\r
+        event.Veto();\r
+    }\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)\r
+{\r
+    wxLogMessage(wxT("OnItemCollapsing"));\r
+\r
+    // for testing, prevent the user from collapsing the first child folder\r
+    wxTreeItemId itemId = event.GetItem();\r
+    if ( IsTestItem(itemId) )\r
+    {\r
+        wxMessageBox(wxT("You can't collapse this item."));\r
+\r
+        event.Veto();\r
+    }\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)\r
+{\r
+    // show some info about this item\r
+    wxTreeItemId itemId = event.GetItem();\r
+    OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);\r
+\r
+    if ( item != NULL )\r
+    {\r
+        item->ShowInfo(this);\r
+    }\r
+\r
+    wxLogMessage(wxT("OnItemActivated"));\r
+}*/\r
+\r
+void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
+{\r
+    /*wxTreeItemId itemId = event.GetItem();\r
+    OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
+                                         : NULL;\r
+\r
+    wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()\r
+                                                         : _T(""));*/\r
+\r
+       //wxLogMessage(wxT("EEEEEEEEEE"));\r
+\r
+    //event.Skip();\r
+}\r
+\r
+/*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
+{\r
+    wxPoint pt = event.GetPosition();\r
+    wxTreeItemId item;\r
+    wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);\r
+\r
+    // check if event was generated by keyboard (MSW-specific?)\r
+    if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)\r
+    {\r
+        if ( !HasFlag(wxTR_MULTIPLE) )\r
+            item = GetSelection();\r
+\r
+        // attempt to guess where to show the menu\r
+        if ( item.IsOk() )\r
+        {\r
+            // if an item was clicked, show menu to the right of it\r
+            wxRect rect;\r
+            GetBoundingRect(item, rect, true );// only the label\r
+            pt = wxPoint(rect.GetRight(), rect.GetTop());\r
+        }\r
+        else\r
+        {\r
+            pt = wxPoint(0, 0);\r
+        }\r
+    }\r
+    else // event was generated by mouse, use supplied coords\r
+    {\r
+        pt = ScreenToClient(pt);\r
+        item = HitTest(pt);\r
+    }\r
+\r
+    ShowMenu(item, pt);\r
+}*/\r
+\r
+/*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)\r
+{\r
+    wxString title;\r
+    if ( id.IsOk() )\r
+    {\r
+        title << wxT("Menu for ") << GetItemText(id);\r
+    }\r
+    else\r
+    {\r
+        title = wxT("Menu for no particular item");\r
+    }\r
+\r
+#if wxUSE_MENUS\r
+    wxMenu menu(title);\r
+    menu.Append(TreeTest_About, wxT("&About..."));\r
+    menu.AppendSeparator();\r
+    menu.Append(TreeTest_Highlight, wxT("&Highlight item"));\r
+    menu.Append(TreeTest_Dump, wxT("&Dump"));\r
+\r
+    PopupMenu(&menu, pt);\r
+#endif // wxUSE_MENUS\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)\r
+{\r
+    wxTreeItemId itemId = event.GetItem();\r
+    OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
+                                         : NULL;\r
+\r
+    wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()\r
+                                                        : _T(""));\r
+\r
+    event.Skip();\r
+}*/\r
+\r
+/*\r
+void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)\r
+{\r
+    wxLogMessage(wxT("Right mouse button down"));\r
+\r
+    event.Skip();\r
+}\r
+\r
+void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)\r
+{\r
+    wxLogMessage(wxT("Right mouse button up"));\r
+\r
+    event.Skip();\r
+}\r
+\r
+void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)\r
+{\r
+    wxTreeItemId id = HitTest(event.GetPosition());\r
+    if ( !id )\r
+        wxLogMessage(wxT("No item under mouse"));\r
+    else\r
+    {\r
+        OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);\r
+        if ( item )\r
+            wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());\r
+    }\r
+\r
+    event.Skip();\r
+}\r
+*/\r
+\r
+static inline const wxChar *Bool2String(bool b)\r
+{\r
+    return b ? wxT("") : wxT("not ");\r
+}\r
+\r
+void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)\r
+{\r
+    wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")\r
+                 wxT("%u children (%u immediately under this item)."),\r
+                 m_desc.c_str(),\r
+                 Bool2String(tree->IsSelected(GetId())),\r
+                 Bool2String(tree->IsExpanded(GetId())),\r
+                 Bool2String(tree->IsBold(GetId())),\r
+                 unsigned(tree->GetChildrenCount(GetId())),\r
+                 unsigned(tree->GetChildrenCount(GetId(), false)));\r
+}\r
+\r
+\r
index 61668e41a377a1fd63e27c05fae0716a50e261be..082a04fbff01438b0927040eeb818d5687fa02b8 100644 (file)
@@ -132,11 +132,11 @@ int winNumber = 1;
 // Initialise this in OnInit, not statically\r
 bool OPJViewerApp::OnInit(void)\r
 {\r
+       int n;\r
 #if wxUSE_UNICODE\r
 \r
     wxChar **wxArgv = new wxChar *[argc + 1];\r
 \r
-       int n;\r
     for (n = 0; n < argc; n++ ) {\r
         wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]);\r
         wxArgv[n] = wxStrdup(warg);\r
@@ -189,6 +189,9 @@ bool OPJViewerApp::OnInit(void)
 #if wxUSE_LIBJPEG\r
   wxImage::AddHandler( new wxJPEGHandler );\r
 #endif\r
+#if USE_MXF\r
+  wxImage::AddHandler( new wxMXFHandler );\r
+#endif // USE_MXF\r
 #if wxUSE_LIBOPENJPEG\r
   wxImage::AddHandler( new wxJ2KHandler );\r
   wxImage::AddHandler( new wxJP2Handler );\r
@@ -211,17 +214,17 @@ bool OPJViewerApp::OnInit(void)
        //load decoding engine parameters\r
        OPJconfig = new wxConfig(OPJ_APPLICATION, OPJ_APPLICATION_VENDOR);\r
 \r
-       OPJconfig->Read(wxT("enabledeco"), &m_enabledeco, (bool) true);\r
-       OPJconfig->Read(wxT("enableparse"), &m_enableparse, (bool) true);\r
-       OPJconfig->Read(wxT("resizemethod"), &m_resizemethod, (long) 0);\r
-       OPJconfig->Read(wxT("xxxreducefactor"), &m_reducefactor, (long) 0);\r
-       OPJconfig->Read(wxT("xxxqualitylayers"), &m_qualitylayers, (long) 0);\r
-       OPJconfig->Read(wxT("xxxcomponents"), &m_components, (long) 0);\r
-       OPJconfig->Read(wxT("xxxframenum"), &m_framenum, (long) 0);\r
+       OPJconfig->Read(wxT("decode/enabledeco"), &m_enabledeco, (bool) true);\r
+       OPJconfig->Read(wxT("decode/enableparse"), &m_enableparse, (bool) true);\r
+       OPJconfig->Read(wxT("decode/resizemethod"), &m_resizemethod, (long) 0);\r
+       OPJconfig->Read(wxT("decode/xxxreducefactor"), &m_reducefactor, (long) 0);\r
+       OPJconfig->Read(wxT("decode/xxxqualitylayers"), &m_qualitylayers, (long) 0);\r
+       OPJconfig->Read(wxT("decode/xxxcomponents"), &m_components, (long) 0);\r
+       OPJconfig->Read(wxT("decode/xxxframenum"), &m_framenum, (long) 0);\r
 #ifdef USE_JPWL\r
-       OPJconfig->Read(wxT("enablejpwl"), &m_enablejpwl, (bool) true);\r
-       OPJconfig->Read(wxT("expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS);\r
-       OPJconfig->Read(wxT("maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES);\r
+       OPJconfig->Read(wxT("decode/enablejpwl"), &m_enablejpwl, (bool) true);\r
+       OPJconfig->Read(wxT("decode/expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS);\r
+       OPJconfig->Read(wxT("decode/maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES);\r
 #endif // USE_JPWL\r
 \r
        OPJconfig->Write(wxT("teststring"), wxT("This is a test value"));\r
@@ -237,31 +240,45 @@ bool OPJViewerApp::OnInit(void)
        OPJconfig->Read(wxT("frameheight"), &m_frameheight, (long) OPJ_FRAME_HEIGHT);\r
 \r
        // load encoding engine parameters\r
-       OPJconfig->Read(wxT("subsampling"), &m_subsampling, (wxString) wxT("1,1"));\r
-       OPJconfig->Read(wxT("origin"), &m_origin, (wxString) wxT("0,0"));\r
-       OPJconfig->Read(wxT("rates"), &m_rates, (wxString) wxT("20,10,5"));\r
-       OPJconfig->Read(wxT("quality"), &m_quality, (wxString) wxT("30,35,40"));\r
-       OPJconfig->Read(wxT("enablequality"), &m_enablequality, (bool) false);\r
-       OPJconfig->Read(wxT("multicomp"), &m_multicomp, (bool) false);  \r
-       OPJconfig->Read(wxT("irreversible"), &m_irreversible, (bool) false);    \r
-       OPJconfig->Read(wxT("resolutions"), &m_resolutions, (int) 6);   \r
-       OPJconfig->Read(wxT("progression"), &m_progression, (int) 0);   \r
-       OPJconfig->Read(wxT("cbsize"), &m_cbsize, (wxString) wxT("32,32"));\r
-       OPJconfig->Read(wxT("prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]"));\r
-       OPJconfig->Read(wxT("tsize"), &m_tsize, (wxString) wxT(""));\r
-       OPJconfig->Read(wxT("torigin"), &m_torigin, (wxString) wxT("0,0"));\r
-       OPJconfig->Read(wxT("enablesop"), &m_enablesop, (bool) false);  \r
-       OPJconfig->Read(wxT("enableeph"), &m_enableeph, (bool) false);  \r
-       OPJconfig->Read(wxT("enablebypass"), &m_enablebypass, (bool) false);    \r
-       OPJconfig->Read(wxT("enablereset"), &m_enablereset, (bool) false);      \r
-       OPJconfig->Read(wxT("enablerestart"), &m_enablerestart, (bool) false);  \r
-       OPJconfig->Read(wxT("enablevsc"), &m_enablevsc, (bool) false);  \r
-       OPJconfig->Read(wxT("enableerterm"), &m_enableerterm, (bool) false);    \r
-       OPJconfig->Read(wxT("enablesegmark"), &m_enablesegmark, (bool) false);  \r
-       OPJconfig->Read(wxT("enablecomm"), &m_enablecomm, (bool) true); \r
-       OPJconfig->Read(wxT("comment"), &m_comment, (wxString) wxT(""));\r
-       OPJconfig->Read(wxT("enableidx"), &m_enableidx, (bool) false);  \r
-       OPJconfig->Read(wxT("index"), &m_index, (wxString) wxT("index.txt"));\r
+       OPJconfig->Read(wxT("encode/subsampling"), &m_subsampling, (wxString) wxT("1,1"));\r
+       OPJconfig->Read(wxT("encode/origin"), &m_origin, (wxString) wxT("0,0"));\r
+       OPJconfig->Read(wxT("encode/rates"), &m_rates, (wxString) wxT("20,10,5"));\r
+       OPJconfig->Read(wxT("encode/quality"), &m_quality, (wxString) wxT("30,35,40"));\r
+       OPJconfig->Read(wxT("encode/enablequality"), &m_enablequality, (bool) false);\r
+       OPJconfig->Read(wxT("encode/multicomp"), &m_multicomp, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/irreversible"), &m_irreversible, (bool) false);     \r
+       OPJconfig->Read(wxT("encode/resolutions"), &m_resolutions, (int) 6);    \r
+       OPJconfig->Read(wxT("encode/progression"), &m_progression, (int) 0);    \r
+       OPJconfig->Read(wxT("encode/cbsize"), &m_cbsize, (wxString) wxT("32,32"));\r
+       OPJconfig->Read(wxT("encode/prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]"));\r
+       OPJconfig->Read(wxT("encode/tsize"), &m_tsize, (wxString) wxT(""));\r
+       OPJconfig->Read(wxT("encode/torigin"), &m_torigin, (wxString) wxT("0,0"));\r
+       OPJconfig->Read(wxT("encode/enablesop"), &m_enablesop, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/enableeph"), &m_enableeph, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/enablebypass"), &m_enablebypass, (bool) false);     \r
+       OPJconfig->Read(wxT("encode/enablereset"), &m_enablereset, (bool) false);       \r
+       OPJconfig->Read(wxT("encode/enablerestart"), &m_enablerestart, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/enablevsc"), &m_enablevsc, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/enableerterm"), &m_enableerterm, (bool) false);     \r
+       OPJconfig->Read(wxT("encode/enablesegmark"), &m_enablesegmark, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/enablecomm"), &m_enablecomm, (bool) true);  \r
+       OPJconfig->Read(wxT("encode/enablepoc"), &m_enablepoc, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/comment"), &m_comment, (wxString) wxT(""));\r
+       OPJconfig->Read(wxT("encode/poc"), &m_poc, (wxString) wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"));\r
+       OPJconfig->Read(wxT("encode/enableidx"), &m_enableidx, (bool) false);   \r
+       OPJconfig->Read(wxT("encode/index"), &m_index, (wxString) wxT("index.txt"));\r
+#ifdef USE_JPWL\r
+       OPJconfig->Read(wxT("encode/enablejpwl"), &m_enablejpwle, (bool) true);\r
+       for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+               OPJconfig->Read(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), &m_hprotsel[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), &m_htileval[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), &m_pprotsel[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), &m_ptileval[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), &m_ppackval[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), &m_sensisel[n], 0);\r
+               OPJconfig->Read(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), &m_stileval[n], 0);\r
+       }\r
+#endif // USE_JPWL\r
 \r
 #else\r
        // set decoding engine parameters\r
@@ -311,6 +328,19 @@ bool OPJViewerApp::OnInit(void)
        m_index = wxT("index.txt");\r
        m_enablecomm = true;\r
        m_comment = wxT("");\r
+       m_enablepoc = false;\r
+       m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL");\r
+#ifdef USE_JPWL\r
+       m_enablejpwle = true;\r
+       for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+               m_hprotsel[n] = 0;\r
+               m_htileval[n] = 0;\r
+               m_pprotsel[n] = 0;\r
+               m_ptileval[n] = 0;\r
+               m_sensisel[n] = 0;\r
+               m_stileval[n] = 0;\r
+       }\r
+#endif // USE_JPWL\r
 \r
 #endif // OPJ_INICONFIG\r
 \r
@@ -362,18 +392,20 @@ bool OPJViewerApp::OnInit(void)
 \r
 int OPJViewerApp::OnExit()\r
 {\r
+       int n;\r
+\r
 #ifdef OPJ_INICONFIG\r
-       OPJconfig->Write(wxT("enabledeco"), m_enabledeco);\r
-       OPJconfig->Write(wxT("enableparse"), m_enableparse);\r
-       OPJconfig->Write(wxT("resizemethod"), m_resizemethod);\r
-       OPJconfig->Write(wxT("reducefactor"), m_reducefactor);\r
-       OPJconfig->Write(wxT("qualitylayers"), m_qualitylayers);\r
-       OPJconfig->Write(wxT("components"), m_components);\r
-       OPJconfig->Write(wxT("framenum"), m_framenum);\r
+       OPJconfig->Write(wxT("decode/enabledeco"), m_enabledeco);\r
+       OPJconfig->Write(wxT("decode/enableparse"), m_enableparse);\r
+       OPJconfig->Write(wxT("decode/resizemethod"), m_resizemethod);\r
+       OPJconfig->Write(wxT("decode/reducefactor"), m_reducefactor);\r
+       OPJconfig->Write(wxT("decode/qualitylayers"), m_qualitylayers);\r
+       OPJconfig->Write(wxT("decode/components"), m_components);\r
+       OPJconfig->Write(wxT("decode/framenum"), m_framenum);\r
 #ifdef USE_JPWL\r
-       OPJconfig->Write(wxT("enablejpwl"), m_enablejpwl);\r
-       OPJconfig->Write(wxT("expcomps"), m_expcomps);\r
-       OPJconfig->Write(wxT("maxtiles"), m_maxtiles);\r
+       OPJconfig->Write(wxT("decode/enablejpwl"), m_enablejpwl);\r
+       OPJconfig->Write(wxT("decode/expcomps"), m_expcomps);\r
+       OPJconfig->Write(wxT("decode/maxtiles"), m_maxtiles);\r
 #endif // USE_JPWL\r
        OPJconfig->Write(wxT("showtoolbar"), m_showtoolbar);\r
        OPJconfig->Write(wxT("showbrowser"), m_showbrowser);\r
@@ -383,31 +415,45 @@ int OPJViewerApp::OnExit()
        OPJconfig->Write(wxT("framewidth"), m_framewidth);\r
        OPJconfig->Write(wxT("frameheight"), m_frameheight);\r
 \r
-       OPJconfig->Write(wxT("subsampling"), m_subsampling);\r
-       OPJconfig->Write(wxT("origin"), m_origin);\r
-       OPJconfig->Write(wxT("rates"), m_rates);\r
-       OPJconfig->Write(wxT("quality"), m_quality);\r
-       OPJconfig->Write(wxT("enablequality"), m_enablequality);\r
-       OPJconfig->Write(wxT("multicomp"), m_multicomp);\r
-       OPJconfig->Write(wxT("irreversible"), m_irreversible);\r
-       OPJconfig->Write(wxT("resolutions"), m_resolutions);\r
-       OPJconfig->Write(wxT("progression"), m_progression);\r
-       OPJconfig->Write(wxT("cbsize"), m_cbsize);\r
-       OPJconfig->Write(wxT("prsize"), m_prsize);\r
-       OPJconfig->Write(wxT("tiles"), m_tsize);\r
-       OPJconfig->Write(wxT("torigin"), m_torigin);\r
-       OPJconfig->Write(wxT("enablesop"), m_enablesop);\r
-       OPJconfig->Write(wxT("enableeph"), m_enableeph);\r
-       OPJconfig->Write(wxT("enablebypass"), m_enablebypass);\r
-       OPJconfig->Write(wxT("enablereset"), m_enablereset);\r
-       OPJconfig->Write(wxT("enablerestart"), m_enablerestart);\r
-       OPJconfig->Write(wxT("enablevsc"), m_enablevsc);\r
-       OPJconfig->Write(wxT("enableerterm"), m_enableerterm);\r
-       OPJconfig->Write(wxT("enablesegmark"), m_enablesegmark);\r
-       OPJconfig->Write(wxT("enableidx"), m_enableidx);\r
-       OPJconfig->Write(wxT("index"), m_index);\r
-       OPJconfig->Write(wxT("enablecomm"), m_enablecomm);\r
-       OPJconfig->Write(wxT("comment"), m_comment);\r
+       OPJconfig->Write(wxT("encode/subsampling"), m_subsampling);\r
+       OPJconfig->Write(wxT("encode/origin"), m_origin);\r
+       OPJconfig->Write(wxT("encode/rates"), m_rates);\r
+       OPJconfig->Write(wxT("encode/quality"), m_quality);\r
+       OPJconfig->Write(wxT("encode/enablequality"), m_enablequality);\r
+       OPJconfig->Write(wxT("encode/multicomp"), m_multicomp);\r
+       OPJconfig->Write(wxT("encode/irreversible"), m_irreversible);\r
+       OPJconfig->Write(wxT("encode/resolutions"), m_resolutions);\r
+       OPJconfig->Write(wxT("encode/progression"), m_progression);\r
+       OPJconfig->Write(wxT("encode/cbsize"), m_cbsize);\r
+       OPJconfig->Write(wxT("encode/prsize"), m_prsize);\r
+       OPJconfig->Write(wxT("encode/tiles"), m_tsize);\r
+       OPJconfig->Write(wxT("encode/torigin"), m_torigin);\r
+       OPJconfig->Write(wxT("encode/enablesop"), m_enablesop);\r
+       OPJconfig->Write(wxT("encode/enableeph"), m_enableeph);\r
+       OPJconfig->Write(wxT("encode/enablebypass"), m_enablebypass);\r
+       OPJconfig->Write(wxT("encode/enablereset"), m_enablereset);\r
+       OPJconfig->Write(wxT("encode/enablerestart"), m_enablerestart);\r
+       OPJconfig->Write(wxT("encode/enablevsc"), m_enablevsc);\r
+       OPJconfig->Write(wxT("encode/enableerterm"), m_enableerterm);\r
+       OPJconfig->Write(wxT("encode/enablesegmark"), m_enablesegmark);\r
+       OPJconfig->Write(wxT("encode/enableidx"), m_enableidx);\r
+       OPJconfig->Write(wxT("encode/index"), m_index);\r
+       OPJconfig->Write(wxT("encode/enablecomm"), m_enablecomm);\r
+       OPJconfig->Write(wxT("encode/comment"), m_comment);\r
+       OPJconfig->Write(wxT("encode/enablepoc"), m_enablepoc);\r
+       OPJconfig->Write(wxT("encode/poc"), m_poc);\r
+#ifdef USE_JPWL\r
+       OPJconfig->Write(wxT("encode/enablejpwl"), m_enablejpwle);\r
+       for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+               OPJconfig->Write(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), m_hprotsel[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), m_htileval[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), m_pprotsel[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), m_ptileval[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), m_ppackval[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), m_sensisel[n]);\r
+               OPJconfig->Write(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), m_stileval[n]);\r
+       }\r
+#endif // USE_JPWL\r
 \r
 #endif // OPJ_INICONFIG\r
 \r
@@ -786,6 +832,8 @@ void OPJFrame::Resize(int number)
 \r
 void OPJFrame::OnSetsEnco(wxCommandEvent& event)\r
 {\r
+       int n;\r
+\r
     OPJEncoderDialog dialog(this, event.GetId());\r
 \r
     if (dialog.ShowModal() == wxID_OK) {\r
@@ -816,6 +864,20 @@ void OPJFrame::OnSetsEnco(wxCommandEvent& event)
                wxGetApp().m_index = dialog.m_indexCtrl->GetValue();\r
                wxGetApp().m_enablecomm = dialog.m_enablecommCheck->GetValue();\r
                wxGetApp().m_comment = dialog.m_commentCtrl->GetValue();\r
+               wxGetApp().m_enablepoc = dialog.m_enablepocCheck->GetValue();\r
+               wxGetApp().m_poc = dialog.m_pocCtrl->GetValue();\r
+#ifdef USE_JPWL\r
+               wxGetApp().m_enablejpwle = dialog.m_enablejpwlCheck->GetValue();\r
+               for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+                       wxGetApp().m_hprotsel[n] = dialog.m_hprotChoice[n]->GetSelection();\r
+                       wxGetApp().m_htileval[n] = dialog.m_htileCtrl[n]->GetValue();\r
+                       wxGetApp().m_pprotsel[n] = dialog.m_pprotChoice[n]->GetSelection();\r
+                       wxGetApp().m_ptileval[n] = dialog.m_ptileCtrl[n]->GetValue();\r
+                       wxGetApp().m_ppackval[n] = dialog.m_ppackCtrl[n]->GetValue();\r
+                       wxGetApp().m_sensisel[n] = dialog.m_sensiChoice[n]->GetSelection();\r
+                       wxGetApp().m_stileval[n] = dialog.m_stileCtrl[n]->GetValue();\r
+               }\r
+#endif // USE_JPWL\r
        };\r
 }\r
 \r
@@ -1047,63 +1109,6 @@ void OPJFrame::OnNextComp(wxCommandEvent& event)
        OnReload(e);\r
 }\r
 \r
-// about window for the frame\r
-void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))\r
-{\r
-#ifdef OPJ_HTMLABOUT\r
-#include "about_htm.h"\r
-#include "opj_logo.xpm"\r
-\r
-    wxBoxSizer *topsizer;\r
-    wxHtmlWindow *html;\r
-    wxDialog dlg(this, wxID_ANY, wxString(_("About")));\r
-\r
-    wxMemoryFSHandler::AddFile(wxT("opj_logo.xpm"), wxBitmap(opj_logo), wxBITMAP_TYPE_XPM);\r
-\r
-    topsizer = new wxBoxSizer(wxVERTICAL);\r
-\r
-    html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(320, 250), wxHW_SCROLLBAR_NEVER);\r
-    html->SetBorders(0);\r
-    //html->LoadPage(wxT("about/about.htm"));\r
-       //html->SetPage("<html><body>Hello, world!</body></html>");\r
-       html->SetPage(htmlaboutpage);\r
-    html->SetSize(html->GetInternalRepresentation()->GetWidth(),\r
-                    html->GetInternalRepresentation()->GetHeight());\r
-\r
-    topsizer->Add(html, 1, wxALL, 10);\r
-\r
-    topsizer->Add(new wxStaticLine(&dlg, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 10);\r
-\r
-    wxButton *bu1 = new wxButton(&dlg, wxID_OK, wxT("OK"));\r
-    bu1->SetDefault();\r
-\r
-    topsizer->Add(bu1, 0, wxALL | wxALIGN_RIGHT, 15);\r
-\r
-    dlg.SetSizer(topsizer);\r
-    topsizer->Fit(&dlg);\r
-\r
-    dlg.ShowModal();\r
-\r
-#else\r
-\r
-       wxMessageBox(wxString::Format(OPJ_APPLICATION_TITLEBAR\r
-                                                                 wxT("\n\n")\r
-                                                                 wxT("Built with %s and OpenJPEG ")\r
-                                                                 wxT(OPENJPEG_VERSION)\r
-                                                                 wxT("\non ") wxT(__DATE__) wxT(", ") wxT(__TIME__)\r
-                                                                 wxT("\nRunning under %s\n\n")\r
-                                                                 OPJ_APPLICATION_COPYRIGHT,\r
-                                                                 wxVERSION_STRING,\r
-                                                                 wxGetOsDescription().c_str()),\r
-                                wxT("About ") OPJ_APPLICATION_NAME,\r
-                                wxOK | wxICON_INFORMATION,\r
-                                this\r
-                                );\r
-\r
-#endif\r
-\r
-}\r
-\r
 void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))\r
 {\r
     if (markerTreeWindow->IsShown())\r
@@ -1275,6 +1280,9 @@ void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))
 #if wxUSE_LIBOPENJPEG\r
        wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2")\r
 #endif\r
+#if USE_MXF\r
+       wxT("|MXF JPEG 2000 video (*.mxf)|*.mxf")\r
+#endif // USE_MXF\r
 #if wxUSE_LIBJPEG\r
                wxT("|JPEG files (*.jpg)|*.jpg")\r
 #endif\r
@@ -1332,6 +1340,9 @@ void OPJFrame::OnFileSaveAs(wxCommandEvent& WXUNUSED(event))
 \r
 void OPJFrame::OnMemoryOpen(wxCommandEvent& WXUNUSED(event))\r
 {\r
+       // do nothing\r
+       return;\r
+       \r
        wxTextEntryDialog dialog(this, wxT("Memory HEX address range: start_address-stop_address"),\r
                                                        wxT("Decode a memory buffer"),\r
                                                        wxT("0x-0x"),\r
@@ -1548,1223 +1559,22 @@ void OPJChildFrame::OnLostFocus(wxFocusEvent& event)
        //wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());\r
 }\r
 \r
-#if USE_GENERIC_TREECTRL\r
-BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)\r
-#else\r
-BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)\r
-#endif\r
-    /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag)\r
-    EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag)\r
-    EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/\r
-    /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit)\r
-    EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/\r
-    /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/\r
-#if 0       // there are so many of those that logging them causes flicker\r
-    /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/\r
-#endif\r
-    /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo)\r
-    EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/\r
-    EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding)\r
-    /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed)\r
-    EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/\r
-\r
-    EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged)\r
-    /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/\r
-    /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/\r
-    /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/\r
-\r
-    // so many differents ways to handle right mouse button clicks...\r
-    /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/\r
-    // EVT_TREE_ITEM_MENU is the preferred event for creating context menus\r
-    // on a tree control, because it includes the point of the click or item,\r
-    // meaning that no additional placement calculations are required.\r
-    EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
-    /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
-\r
-    /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
-    EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)\r
-    EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/\r
-END_EVENT_TABLE()\r
-\r
-// OPJMarkerTree implementation\r
-#if USE_GENERIC_TREECTRL\r
-IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)\r
-#else\r
-IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
-#endif\r
-\r
-OPJMarkerTree::OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id,\r
-           const wxPoint& pos, const wxSize& size, long style)\r
-          : wxTreeCtrl(parent, id, pos, size, style)\r
-{\r
-    m_reverseSort = false;\r
-       m_fname = fname;\r
-\r
-       m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;\r
-    CreateImageList();\r
-\r
-    // Add some items to the tree\r
-    //AddTestItemsToTree(5, 5);\r
-    int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
-    wxTreeItemId rootId = AddRoot(name,\r
-                                  image, image,\r
-                                  new OPJMarkerData(name));\r
-\r
-    OPJParseThread *pthread = CreateParseThread(0x00, subframe);\r
-    if (pthread->Run() != wxTHREAD_NO_ERROR)\r
-        wxLogMessage(wxT("Can't start parse thread!"));\r
-    else\r
-               wxLogMessage(wxT("New parse thread started."));\r
-\r
-       m_childframe = subframe;\r
-}\r
-\r
-void OPJMarkerTree::CreateImageList(int size)\r
-{\r
-    if (size == -1) {\r
-        SetImageList(NULL);\r
-        return;\r
-    }\r
-    if (size == 0)\r
-        size = m_imageSize;\r
-    else\r
-        m_imageSize = size;\r
-\r
-    // Make an image list containing small icons\r
-    wxImageList *images = new wxImageList(size, size, true);\r
-\r
-    // should correspond to TreeCtrlIcon_xxx enum\r
-    wxBusyCursor wait;\r
-    wxIcon icons[5];\r
-    icons[0] = wxIcon(icon1_xpm);\r
-    icons[1] = wxIcon(icon2_xpm);\r
-    icons[2] = wxIcon(icon3_xpm);\r
-    icons[3] = wxIcon(icon4_xpm);\r
-    icons[4] = wxIcon(icon5_xpm);\r
-\r
-    int sizeOrig = icons[0].GetWidth();\r
-    for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
-        if (size == sizeOrig) {\r
-            images->Add(icons[i]);\r
-        } else {\r
-            images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
-        }\r
-    }\r
-\r
-    AssignImageList(images);\r
-}\r
-\r
-#if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
-void OPJMarkerTree::CreateButtonsImageList(int size)\r
-{\r
-    if ( size == -1 ) {\r
-        SetButtonsImageList(NULL);\r
-        return;\r
-    }\r
-\r
-    // Make an image list containing small icons\r
-    wxImageList *images = new wxImageList(size, size, true);\r
-\r
-    // should correspond to TreeCtrlIcon_xxx enum\r
-    wxBusyCursor wait;\r
-    wxIcon icons[4];\r
-    icons[0] = wxIcon(icon3_xpm);   // closed\r
-    icons[1] = wxIcon(icon3_xpm);   // closed, selected\r
-    icons[2] = wxIcon(icon5_xpm);   // open\r
-    icons[3] = wxIcon(icon5_xpm);   // open, selected\r
-\r
-    for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
-        int sizeOrig = icons[i].GetWidth();\r
-        if ( size == sizeOrig ) {\r
-            images->Add(icons[i]);\r
-        } else {\r
-            images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
-        }\r
-    }\r
-\r
-    AssignButtonsImageList(images);\r
-#else\r
-void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))\r
-{\r
-#endif\r
-}\r
-\r
-void OPJParseThread::LoadFile(wxFileName fname)\r
-{\r
-       wxTreeItemId rootid;\r
-\r
-       // this is the root node\r
-       int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;\r
-\r
-       if (this->m_parentid) {\r
-               // leaf of a tree\r
-               rootid = m_parentid;\r
-               m_tree->SetItemText(rootid, wxT("Parsing..."));\r
-\r
-       } else {\r
-\r
-               // delete the existing tree hierarchy\r
-               m_tree->DeleteAllItems();\r
-\r
-               // new tree\r
-               rootid = m_tree->AddRoot(wxT("Parsing..."),\r
-                       image,\r
-                       image,\r
-                       new OPJMarkerData(fname.GetFullPath())\r
-                       );\r
-               //m_tree->SetItemFont(rootid, *wxITALIC_FONT);\r
-               m_tree->SetItemBold(rootid);\r
-       }\r
-\r
-       // open the file\r
-       wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);\r
-\r
-       // parsing enabled?\r
-       if (wxGetApp().m_enableparse) {\r
-\r
-               // what is the extension?\r
-               if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {\r
-\r
-                       // parse the file\r
-                       ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);\r
-\r
-               } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {\r
-\r
-                       // parse the file\r
-                       if (this->m_parentid) {\r
-                               //WriteText(wxT("Only a subsection of jp2"));\r
-                               OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid);\r
-                               ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid);\r
-                               m_tree->Expand(rootid);\r
-\r
-                       } else {\r
-                               // as usual\r
-                               ParseJP2File(&m_file, 0, m_file.Length(), rootid);\r
-                       }\r
-\r
-               } else {\r
-\r
-                       // unknown extension\r
-                       WriteText(wxT("Unknown file format!"));\r
-\r
-               }\r
-\r
-       }\r
-\r
-\r
-       // this is the root node\r
-       if (this->m_parentid)\r
-               m_tree->SetItemText(rootid, wxT("Codestream"));\r
-       else\r
-               //m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length()));\r
-               m_tree->SetItemText(rootid, fname.GetFullName());\r
-\r
-       // close the file\r
-       m_file.Close();\r
-\r
-       WriteText(wxT("Parsing finished!"));\r
-}\r
-\r
-/*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,\r
-                               const wxTreeItemId& item2)\r
-{\r
-    if ( m_reverseSort )\r
-    {\r
-        // just exchange 1st and 2nd items\r
-        return wxTreeCtrl::OnCompareItems(item2, item1);\r
-    }\r
-    else\r
-    {\r
-        return wxTreeCtrl::OnCompareItems(item1, item2);\r
-    }\r
-}*/\r
-\r
-/*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,\r
-                                     size_t numChildren,\r
-                                     size_t depth,\r
-                                     size_t folder)\r
-{\r
-    if ( depth > 0 )\r
-    {\r
-        bool hasChildren = depth > 1;\r
-\r
-        wxString str;\r
-        for ( size_t n = 0; n < numChildren; n++ )\r
-        {\r
-            // at depth 1 elements won't have any more children\r
-            if ( hasChildren )\r
-                str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));\r
-            else\r
-                str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));\r
-\r
-            // here we pass to AppendItem() normal and selected item images (we\r
-            // suppose that selected image follows the normal one in the enum)\r
-            int image, imageSel;\r
-            if ( wxGetApp().ShowImages() )\r
-            {\r
-                image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;\r
-                imageSel = image + 1;\r
-            }\r
-            else\r
-            {\r
-                image = imageSel = -1;\r
-            }\r
-            wxTreeItemId id = AppendItem(idParent, str, image, imageSel,\r
-                                         new OPJMarkerData(str));\r
-\r
-            // and now we also set the expanded one (only for the folders)\r
-            if ( hasChildren && wxGetApp().ShowImages() )\r
-            {\r
-                SetItemImage(id, TreeCtrlIcon_FolderOpened,\r
-                             wxTreeItemIcon_Expanded);\r
-            }\r
-\r
-            // remember the last child for OnEnsureVisible()\r
-            if ( !hasChildren && n == numChildren - 1 )\r
-            {\r
-                m_lastItem = id;\r
-            }\r
-\r
-            AddItemsRecursively(id, numChildren, depth - 1, n + 1);\r
-        }\r
-    }\r
-    //else: done!\r
-}*/\r
-\r
-/*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,\r
-                                    size_t depth)\r
-{\r
-    int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
-    wxTreeItemId rootId = AddRoot(wxT("Root"),\r
-                                  image, image,\r
-                                  new OPJMarkerData(wxT("Root item")));\r
-    if ( image != -1 )\r
-    {\r
-        SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);\r
-    }\r
-\r
-    AddItemsRecursively(rootId, numChildren, depth, 0);\r
-\r
-    // set some colours/fonts for testing\r
-    SetItemFont(rootId, *wxITALIC_FONT);\r
-\r
-    wxTreeItemIdValue cookie;\r
-    wxTreeItemId id = GetFirstChild(rootId, cookie);\r
-    SetItemTextColour(id, *wxBLUE);\r
-\r
-    id = GetNextChild(rootId, cookie);\r
-    id = GetNextChild(rootId, cookie);\r
-    SetItemTextColour(id, *wxRED);\r
-    SetItemBackgroundColour(id, *wxLIGHT_GREY);\r
-}*/\r
-\r
-/*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,\r
-                                     wxTreeItemIdValue cookie)\r
-{\r
-    wxTreeItemId id;\r
-\r
-    if ( !cookie )\r
-        id = GetFirstChild(idParent, cookie);\r
-    else\r
-        id = GetNextChild(idParent, cookie);\r
-\r
-    if ( !id.IsOk() )\r
-        return;\r
-\r
-    wxString text = GetItemText(id);\r
-    wxLogMessage(text);\r
-\r
-    if (ItemHasChildren(id))\r
-        GetItemsRecursively(id);\r
-\r
-    GetItemsRecursively(idParent, cookie);\r
-}*/\r
-\r
-/*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)\r
-{\r
-    int image = (GetItemImage(item) == TreeCtrlIcon_Folder)\r
-                    ? TreeCtrlIcon_File\r
-                    : TreeCtrlIcon_Folder;\r
-    SetItemImage(item, image, wxTreeItemIcon_Normal);\r
-\r
-    image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)\r
-                    ? TreeCtrlIcon_FileSelected\r
-                    : TreeCtrlIcon_FolderSelected;\r
-    SetItemImage(item, image, wxTreeItemIcon_Selected);\r
-}*/\r
-\r
-void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)\r
-{\r
-    wxTreeItemId item = event.GetItem();\r
-    wxString text;\r
-    if ( item.IsOk() )\r
-        text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
-    else\r
-        text = wxT("invalid item");\r
-    wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
-}\r
-\r
-OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
-{\r
-    OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
-\r
-    if (pthread->Create() != wxTHREAD_NO_ERROR)\r
-               wxLogError(wxT("Can't create parse thread!"));\r
-\r
-    wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);\r
-    wxGetApp().m_parse_threads.Add(pthread);\r
-\r
-    return pthread;\r
-}\r
-\r
-\r
-/*// avoid repetition\r
-#define TREE_EVENT_HANDLER(name)                                 \\r
-void OPJMarkerTree::name(wxTreeEvent& event)                        \\r
-{                                                                \\r
-    LogEvent(_T(#name), event);                                  \\r
-    SetLastItem(wxTreeItemId());                                 \\r
-    event.Skip();                                                \\r
-}*/\r
-\r
-/*TREE_EVENT_HANDLER(OnBeginRDrag)*/\r
-/*TREE_EVENT_HANDLER(OnDeleteItem)*/\r
-/*TREE_EVENT_HANDLER(OnGetInfo)\r
-TREE_EVENT_HANDLER(OnSetInfo)*/\r
-/*TREE_EVENT_HANDLER(OnItemExpanded)\r
-TREE_EVENT_HANDLER(OnItemExpanding)*/\r
-/*TREE_EVENT_HANDLER(OnItemCollapsed)*/\r
-/*TREE_EVENT_HANDLER(OnSelChanged)\r
-TREE_EVENT_HANDLER(OnSelChanging)*/\r
-\r
-/*#undef TREE_EVENT_HANDLER*/\r
-\r
-void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)\r
-{\r
-       wxTreeItemId item = event.GetItem();\r
-       OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
-       wxString text;\r
-\r
-       if (item.IsOk())\r
-               text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
-       else\r
-               text = wxT("invalid item");\r
-\r
-       if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))\r
-               return;\r
-\r
-       wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"),\r
-               text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
-               data->m_start, data->m_length);\r
-\r
-       // the codestream box is being asked for expansion\r
-       wxTreeItemIdValue cookie;\r
-       if (!GetFirstChild(item, cookie).IsOk()) {\r
-               OPJParseThread *pthread = CreateParseThread(item);\r
-               if (pthread->Run() != wxTHREAD_NO_ERROR)\r
-                       wxLogMessage(wxT("Can't start parse thread!"));\r
-               else\r
-                       wxLogMessage(wxT("New parse thread started."));\r
-       }\r
-}\r
-\r
-void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
-{\r
-       int bunch_linesize = 16;\r
-       int bunch_numlines = 7;\r
-\r
-       wxTreeItemId item = event.GetItem();\r
-       OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
-       wxString text;\r
-       int l, c, pos = 0, pre_pos;\r
-\r
-       m_peektextCtrl->Clear();\r
-\r
-       /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\r
-               text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
-               data->m_start, data->m_length) << wxT("\n");*/\r
-\r
-       // open the file and browse a little\r
-       wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);\r
-\r
-       // go to position claimed\r
-       fp->Seek(data->m_start, wxFromStart);\r
-\r
-       // read a bunch\r
-       int max_read = wxMin(wxFileOffset(bunch_linesize * bunch_numlines), data->m_length - data->m_start + 1);\r
-       if (data->m_desc == wxT("MARK (65380)")) {\r
-               /*wxLogMessage(data->m_desc);*/\r
-               max_read = data->m_length - data->m_start + 1;\r
-               bunch_numlines = (int) ceil((float) max_read / (float) bunch_linesize);\r
-       }\r
-       unsigned char *buffer = new unsigned char[bunch_linesize * bunch_numlines];\r
-       fp->Read(buffer, max_read);\r
-\r
-       // write the file data between start and stop\r
-       pos = 0;\r
-       for (l = 0; l < bunch_numlines; l++) {\r
-\r
-               text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
-\r
-               pre_pos = pos;\r
-\r
-               // add hex browsing text\r
-               for (c = 0; c < bunch_linesize; c++) {\r
-\r
-                       if (!(c % 8))\r
-                               text << wxT(" ");\r
-\r
-                       if (pos < max_read) {\r
-                               text << wxString::Format(wxT("%02X "), buffer[pos]);\r
-                       } else\r
-                               text << wxT("   ");\r
-                       pos++;\r
-               }\r
-\r
-               text << wxT("    ");\r
-\r
-               // add char browsing text\r
-               for (c = 0; c < bunch_linesize; c++) {\r
-\r
-                       if (pre_pos < max_read) {\r
-                               if ((buffer[pre_pos] == '\n') ||\r
-                                       (buffer[pre_pos] == '\t') ||\r
-                                       (buffer[pre_pos] == '\0') ||\r
-                                       (buffer[pre_pos] == 0x0D) ||\r
-                                       (buffer[pre_pos] == 0x0B))\r
-                                       buffer[pre_pos] = ' ';\r
-                               text << wxString::FromAscii((char) buffer[pre_pos]) << wxT(".");\r
-                       } else\r
-                               text << wxT("  ");\r
-                       pre_pos++;\r
-               }\r
-\r
-               text << wxT("\n");\r
-\r
-       }\r
-\r
-       // close the file\r
-       fp->Close();\r
-\r
-       m_peektextCtrl->WriteText(text);\r
-\r
-       delete buffer;\r
-}\r
-\r
-/*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)\r
-{\r
-    wxString key;\r
-    long keycode = event.GetKeyCode();\r
-    {\r
-        switch ( keycode )\r
-        {\r
-            case WXK_BACK: key = wxT("BACK"); break;\r
-            case WXK_TAB: key = wxT("TAB"); break;\r
-            case WXK_RETURN: key = wxT("RETURN"); break;\r
-            case WXK_ESCAPE: key = wxT("ESCAPE"); break;\r
-            case WXK_SPACE: key = wxT("SPACE"); break;\r
-            case WXK_DELETE: key = wxT("DELETE"); break;\r
-            case WXK_START: key = wxT("START"); break;\r
-            case WXK_LBUTTON: key = wxT("LBUTTON"); break;\r
-            case WXK_RBUTTON: key = wxT("RBUTTON"); break;\r
-            case WXK_CANCEL: key = wxT("CANCEL"); break;\r
-            case WXK_MBUTTON: key = wxT("MBUTTON"); break;\r
-            case WXK_CLEAR: key = wxT("CLEAR"); break;\r
-            case WXK_SHIFT: key = wxT("SHIFT"); break;\r
-            case WXK_ALT: key = wxT("ALT"); break;\r
-            case WXK_CONTROL: key = wxT("CONTROL"); break;\r
-            case WXK_MENU: key = wxT("MENU"); break;\r
-            case WXK_PAUSE: key = wxT("PAUSE"); break;\r
-            case WXK_CAPITAL: key = wxT("CAPITAL"); break;\r
-            case WXK_END: key = wxT("END"); break;\r
-            case WXK_HOME: key = wxT("HOME"); break;\r
-            case WXK_LEFT: key = wxT("LEFT"); break;\r
-            case WXK_UP: key = wxT("UP"); break;\r
-            case WXK_RIGHT: key = wxT("RIGHT"); break;\r
-            case WXK_DOWN: key = wxT("DOWN"); break;\r
-            case WXK_SELECT: key = wxT("SELECT"); break;\r
-            case WXK_PRINT: key = wxT("PRINT"); break;\r
-            case WXK_EXECUTE: key = wxT("EXECUTE"); break;\r
-            case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;\r
-            case WXK_INSERT: key = wxT("INSERT"); break;\r
-            case WXK_HELP: key = wxT("HELP"); break;\r
-            case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;\r
-            case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;\r
-            case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;\r
-            case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;\r
-            case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;\r
-            case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;\r
-            case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;\r
-            case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;\r
-            case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;\r
-            case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;\r
-            case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;\r
-            case WXK_ADD: key = wxT("ADD"); break;\r
-            case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;\r
-            case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;\r
-            case WXK_DECIMAL: key = wxT("DECIMAL"); break;\r
-            case WXK_DIVIDE: key = wxT("DIVIDE"); break;\r
-            case WXK_F1: key = wxT("F1"); break;\r
-            case WXK_F2: key = wxT("F2"); break;\r
-            case WXK_F3: key = wxT("F3"); break;\r
-            case WXK_F4: key = wxT("F4"); break;\r
-            case WXK_F5: key = wxT("F5"); break;\r
-            case WXK_F6: key = wxT("F6"); break;\r
-            case WXK_F7: key = wxT("F7"); break;\r
-            case WXK_F8: key = wxT("F8"); break;\r
-            case WXK_F9: key = wxT("F9"); break;\r
-            case WXK_F10: key = wxT("F10"); break;\r
-            case WXK_F11: key = wxT("F11"); break;\r
-            case WXK_F12: key = wxT("F12"); break;\r
-            case WXK_F13: key = wxT("F13"); break;\r
-            case WXK_F14: key = wxT("F14"); break;\r
-            case WXK_F15: key = wxT("F15"); break;\r
-            case WXK_F16: key = wxT("F16"); break;\r
-            case WXK_F17: key = wxT("F17"); break;\r
-            case WXK_F18: key = wxT("F18"); break;\r
-            case WXK_F19: key = wxT("F19"); break;\r
-            case WXK_F20: key = wxT("F20"); break;\r
-            case WXK_F21: key = wxT("F21"); break;\r
-            case WXK_F22: key = wxT("F22"); break;\r
-            case WXK_F23: key = wxT("F23"); break;\r
-            case WXK_F24: key = wxT("F24"); break;\r
-            case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;\r
-            case WXK_SCROLL: key = wxT("SCROLL"); break;\r
-            case WXK_PAGEUP: key = wxT("PAGEUP"); break;\r
-            case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;\r
-            case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;\r
-            case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;\r
-            case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;\r
-            case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;\r
-            case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;\r
-            case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;\r
-            case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;\r
-            case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;\r
-            case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;\r
-            case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;\r
-            case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;\r
-            case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;\r
-            case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;\r
-            case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;\r
-            case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;\r
-            case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;\r
-            case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;\r
-            case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;\r
-            case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;\r
-            case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;\r
-            case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;\r
-            case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;\r
-            case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;\r
-            case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;\r
-\r
-            default:\r
-            {\r
-               if ( keycode < 128 && wxIsprint((int)keycode) )\r
-                   key.Printf(wxT("'%c'"), (char)keycode);\r
-               else if ( keycode > 0 && keycode < 27 )\r
-                   key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);\r
-               else\r
-                   key.Printf(wxT("unknown (%ld)"), keycode);\r
-            }\r
-        }\r
-    }\r
-\r
-    wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
-                  name,\r
-                  key.c_str(),\r
-                  event.ControlDown() ? wxT('C') : wxT('-'),\r
-                  event.AltDown() ? wxT('A') : wxT('-'),\r
-                  event.ShiftDown() ? wxT('S') : wxT('-'),\r
-                  event.MetaDown() ? wxT('M') : wxT('-'));\r
-}\r
-\r
-void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)\r
-{\r
-    LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());\r
-\r
-    event.Skip();\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)\r
-{\r
-    // need to explicitly allow drag\r
-    if ( event.GetItem() != GetRootItem() )\r
-    {\r
-        m_draggedItem = event.GetItem();\r
-\r
-        wxLogMessage(wxT("OnBeginDrag: started dragging %s"),\r
-                     GetItemText(m_draggedItem).c_str());\r
-\r
-        event.Allow();\r
-    }\r
-    else\r
-    {\r
-        wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));\r
-    }\r
-}\r
-\r
-void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)\r
-{\r
-    wxTreeItemId itemSrc = m_draggedItem,\r
-                 itemDst = event.GetItem();\r
-    m_draggedItem = (wxTreeItemId)0l;\r
-\r
-    // where to copy the item?\r
-    if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )\r
-    {\r
-        // copy to the parent then\r
-        itemDst = GetItemParent(itemDst);\r
-    }\r
-\r
-    if ( !itemDst.IsOk() )\r
-    {\r
-        wxLogMessage(wxT("OnEndDrag: can't drop here."));\r
-\r
-        return;\r
-    }\r
-\r
-    wxString text = GetItemText(itemSrc);\r
-    wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."),\r
-                 text.c_str(), GetItemText(itemDst).c_str());\r
-\r
-    // just do append here - we could also insert it just before/after the item\r
-    // on which it was dropped, but this requires slightly more work... we also\r
-    // completely ignore the client data and icon of the old item but could\r
-    // copy them as well.\r
-    //\r
-    // Finally, we only copy one item here but we might copy the entire tree if\r
-    // we were dragging a folder.\r
-    int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1;\r
-    AppendItem(itemDst, text, image);\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)\r
-{\r
-    wxLogMessage(wxT("OnBeginLabelEdit"));\r
-\r
-    // for testing, prevent this item's label editing\r
-    wxTreeItemId itemId = event.GetItem();\r
-    if ( IsTestItem(itemId) )\r
-    {\r
-        wxMessageBox(wxT("You can't edit this item."));\r
-\r
-        event.Veto();\r
-    }\r
-    else if ( itemId == GetRootItem() )\r
-    {\r
-        // test that it is possible to change the text of the item being edited\r
-        SetItemText(itemId, _T("Editing root item"));\r
-    }\r
-}\r
-\r
-void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)\r
-{\r
-    wxLogMessage(wxT("OnEndLabelEdit"));\r
-\r
-    // don't allow anything except letters in the labels\r
-    if ( !event.GetLabel().IsWord() )\r
-    {\r
-        wxMessageBox(wxT("The new label should be a single word."));\r
-\r
-        event.Veto();\r
-    }\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)\r
-{\r
-    wxLogMessage(wxT("OnItemCollapsing"));\r
-\r
-    // for testing, prevent the user from collapsing the first child folder\r
-    wxTreeItemId itemId = event.GetItem();\r
-    if ( IsTestItem(itemId) )\r
-    {\r
-        wxMessageBox(wxT("You can't collapse this item."));\r
-\r
-        event.Veto();\r
-    }\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)\r
-{\r
-    // show some info about this item\r
-    wxTreeItemId itemId = event.GetItem();\r
-    OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);\r
-\r
-    if ( item != NULL )\r
-    {\r
-        item->ShowInfo(this);\r
-    }\r
-\r
-    wxLogMessage(wxT("OnItemActivated"));\r
-}*/\r
-\r
-void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
-{\r
-    /*wxTreeItemId itemId = event.GetItem();\r
-    OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
-                                         : NULL;\r
-\r
-    wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()\r
-                                                         : _T(""));*/\r
-\r
-       //wxLogMessage(wxT("EEEEEEEEEE"));\r
-\r
-    //event.Skip();\r
-}\r
-\r
-/*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
-{\r
-    wxPoint pt = event.GetPosition();\r
-    wxTreeItemId item;\r
-    wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);\r
-\r
-    // check if event was generated by keyboard (MSW-specific?)\r
-    if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)\r
-    {\r
-        if ( !HasFlag(wxTR_MULTIPLE) )\r
-            item = GetSelection();\r
-\r
-        // attempt to guess where to show the menu\r
-        if ( item.IsOk() )\r
-        {\r
-            // if an item was clicked, show menu to the right of it\r
-            wxRect rect;\r
-            GetBoundingRect(item, rect, true );// only the label\r
-            pt = wxPoint(rect.GetRight(), rect.GetTop());\r
-        }\r
-        else\r
-        {\r
-            pt = wxPoint(0, 0);\r
-        }\r
-    }\r
-    else // event was generated by mouse, use supplied coords\r
-    {\r
-        pt = ScreenToClient(pt);\r
-        item = HitTest(pt);\r
-    }\r
-\r
-    ShowMenu(item, pt);\r
-}*/\r
-\r
-/*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)\r
-{\r
-    wxString title;\r
-    if ( id.IsOk() )\r
-    {\r
-        title << wxT("Menu for ") << GetItemText(id);\r
-    }\r
-    else\r
-    {\r
-        title = wxT("Menu for no particular item");\r
-    }\r
-\r
-#if wxUSE_MENUS\r
-    wxMenu menu(title);\r
-    menu.Append(TreeTest_About, wxT("&About..."));\r
-    menu.AppendSeparator();\r
-    menu.Append(TreeTest_Highlight, wxT("&Highlight item"));\r
-    menu.Append(TreeTest_Dump, wxT("&Dump"));\r
-\r
-    PopupMenu(&menu, pt);\r
-#endif // wxUSE_MENUS\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)\r
-{\r
-    wxTreeItemId itemId = event.GetItem();\r
-    OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
-                                         : NULL;\r
-\r
-    wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()\r
-                                                        : _T(""));\r
-\r
-    event.Skip();\r
-}*/\r
-\r
-/*\r
-void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)\r
-{\r
-    wxLogMessage(wxT("Right mouse button down"));\r
-\r
-    event.Skip();\r
-}\r
-\r
-void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)\r
-{\r
-    wxLogMessage(wxT("Right mouse button up"));\r
-\r
-    event.Skip();\r
-}\r
-\r
-void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)\r
-{\r
-    wxTreeItemId id = HitTest(event.GetPosition());\r
-    if ( !id )\r
-        wxLogMessage(wxT("No item under mouse"));\r
-    else\r
-    {\r
-        OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);\r
-        if ( item )\r
-            wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());\r
-    }\r
-\r
-    event.Skip();\r
-}\r
-*/\r
-\r
-static inline const wxChar *Bool2String(bool b)\r
-{\r
-    return b ? wxT("") : wxT("not ");\r
-}\r
-\r
-void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)\r
-{\r
-    wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")\r
-                 wxT("%u children (%u immediately under this item)."),\r
-                 m_desc.c_str(),\r
-                 Bool2String(tree->IsSelected(GetId())),\r
-                 Bool2String(tree->IsExpanded(GetId())),\r
-                 Bool2String(tree->IsBold(GetId())),\r
-                 unsigned(tree->GetChildrenCount(GetId())),\r
-                 unsigned(tree->GetChildrenCount(GetId(), false)));\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Encoding thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJEncoThread::OPJEncoThread(OPJCanvas *canvas)\r
-        : wxThread()\r
-{\r
-    m_count = 0;\r
-    m_canvas = canvas;\r
-}\r
-\r
-void OPJEncoThread::WriteText(const wxString& text)\r
-{\r
-    wxString msg;\r
-\r
-    // before doing any GUI calls we must ensure that this thread is the only\r
-    // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiEnter();\r
-#endif // __WXGTK__\r
-\r
-    msg << text;\r
-    m_canvas->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiLeave();\r
-#endif // __WXGTK__\r
-}\r
-\r
-void OPJEncoThread::OnExit()\r
-{\r
-    wxCriticalSectionLocker locker(wxGetApp().m_enco_critsect);\r
-\r
-    wxArrayThread& ethreads = wxGetApp().m_enco_threads;\r
-    ethreads.Remove(this);\r
-\r
-    if (ethreads.IsEmpty() )\r
-    {\r
-        // signal the main thread that there are no more threads left if it is\r
-        // waiting for us\r
-        if (wxGetApp().m_enco_waitingUntilAllDone) {\r
-            wxGetApp().m_enco_waitingUntilAllDone = false;\r
-            wxGetApp().m_enco_semAllDone.Post();\r
-        }\r
-    }\r
-}\r
-\r
-void *OPJEncoThread::Entry()\r
-{\r
-    wxString text;\r
-\r
-       srand(GetId());\r
-       //int m_countnum = rand() % 9;\r
-    //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
-    //            GetId(), GetPriority(), m_countnum);\r
-    text.Printf(wxT("Enco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
-    WriteText(text);\r
-\r
-       // set handler properties\r
-       wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
-       j2kkkhandler->m_subsampling = wxGetApp().m_subsampling;\r
-       j2kkkhandler->m_origin = wxGetApp().m_origin;\r
-       j2kkkhandler->m_rates = wxGetApp().m_rates;\r
-       j2kkkhandler->m_quality = wxGetApp().m_quality;\r
-       j2kkkhandler->m_enablequality = wxGetApp().m_enablequality;\r
-       j2kkkhandler->m_multicomp = wxGetApp().m_multicomp;\r
-       j2kkkhandler->m_irreversible = wxGetApp().m_irreversible;\r
-       j2kkkhandler->m_resolutions = wxGetApp().m_resolutions;\r
-       j2kkkhandler->m_progression = wxGetApp().m_progression;\r
-       j2kkkhandler->m_cbsize = wxGetApp().m_cbsize;\r
-       j2kkkhandler->m_prsize = wxGetApp().m_prsize;\r
-       j2kkkhandler->m_tsize = wxGetApp().m_tsize;\r
-       j2kkkhandler->m_torigin = wxGetApp().m_torigin;\r
-       j2kkkhandler->m_enablesop = wxGetApp().m_enablesop;\r
-       j2kkkhandler->m_enableeph = wxGetApp().m_enableeph;\r
-       j2kkkhandler->m_enablebypass = wxGetApp().m_enablebypass;\r
-       j2kkkhandler->m_enablerestart = wxGetApp().m_enablerestart;\r
-       j2kkkhandler->m_enablereset = wxGetApp().m_enablereset;\r
-       j2kkkhandler->m_enablesegmark = wxGetApp().m_enablesegmark;\r
-       j2kkkhandler->m_enableerterm = wxGetApp().m_enableerterm;\r
-       j2kkkhandler->m_enablevsc = wxGetApp().m_enablevsc;\r
-       j2kkkhandler->m_enableidx = wxGetApp().m_enableidx;\r
-       j2kkkhandler->m_index = m_canvas->m_savename.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxGetApp().m_index;\r
-       j2kkkhandler->m_enablecomm = wxGetApp().m_enablecomm;\r
-       j2kkkhandler->m_comment = wxGetApp().m_comment;\r
-\r
-       // save the file\r
-       if (!m_canvas->m_image100.SaveFile(m_canvas->m_savename.GetFullPath(), (wxBitmapType) wxBITMAP_TYPE_J2K)) {\r
-               WriteText(wxT("Can't save image"));\r
-               return NULL;\r
-       }\r
-\r
-    text.Printf(wxT("Enco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
-    WriteText(text);\r
-    return NULL;\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Decoding thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)\r
-        : wxThread()\r
-{\r
-    m_count = 0;\r
-    m_canvas = canvas;\r
-}\r
-\r
-void OPJDecoThread::WriteText(const wxString& text)\r
-{\r
-    wxString msg;\r
-\r
-    // before doing any GUI calls we must ensure that this thread is the only\r
-    // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiEnter();\r
-#endif // __WXGTK__\r
-\r
-    msg << text;\r
-    m_canvas->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiLeave();\r
-#endif // __WXGTK__\r
-}\r
-\r
-void OPJDecoThread::OnExit()\r
-{\r
-    wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);\r
-\r
-    wxArrayThread& dthreads = wxGetApp().m_deco_threads;\r
-    dthreads.Remove(this);\r
-\r
-    if (dthreads.IsEmpty() )\r
-    {\r
-        // signal the main thread that there are no more threads left if it is\r
-        // waiting for us\r
-        if (wxGetApp().m_deco_waitingUntilAllDone) {\r
-            wxGetApp().m_deco_waitingUntilAllDone = false;\r
-            wxGetApp().m_deco_semAllDone.Post();\r
-        }\r
-    }\r
-}\r
-\r
-void *OPJDecoThread::Entry()\r
-{\r
-\r
-    wxString text;\r
-\r
-       srand(GetId());\r
-       //int m_countnum = rand() % 9;\r
-    //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
-    //            GetId(), GetPriority(), m_countnum);\r
-    text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
-\r
-    WriteText(text);\r
-\r
-    wxBitmap bitmap(100, 100);\r
-    wxImage image(100, 100, true); //= bitmap.ConvertToImage();\r
-    image.Destroy();\r
-\r
-       WriteText(m_canvas->m_fname.GetFullPath());\r
-\r
-\r
-       // set handler properties\r
-       wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
-       j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
-       j2kkkhandler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
-       j2kkkhandler->m_components = wxGetApp().m_components;\r
-#ifdef USE_JPWL\r
-       j2kkkhandler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
-       j2kkkhandler->m_expcomps = wxGetApp().m_expcomps;\r
-       j2kkkhandler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
-       wxJP2Handler *jp222handler = (wxJP2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_JP2);\r
-       jp222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
-       jp222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
-       jp222handler->m_components = wxGetApp().m_components;\r
-#ifdef USE_JPWL\r
-       jp222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
-       jp222handler->m_expcomps = wxGetApp().m_expcomps;\r
-       jp222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
-       wxMJ2Handler *mj222handler = (wxMJ2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_MJ2);\r
-       mj222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
-       mj222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
-       mj222handler->m_components = wxGetApp().m_components;\r
-       mj222handler->m_framenum = wxGetApp().m_framenum;\r
-#ifdef USE_JPWL\r
-       mj222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
-       mj222handler->m_expcomps = wxGetApp().m_expcomps;\r
-       mj222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
-       if (wxGetApp().m_enabledeco) {\r
-\r
-               // load the file\r
-               if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY, 0)) {\r
-                       WriteText(wxT("Can't load image"));\r
-                       return NULL;\r
-               }\r
 \r
-       } else {\r
-\r
-               // display a macaron\r
-               if (!image.Create(300, 5, false)) {\r
-                       WriteText(wxT("Can't create image"));\r
-                       return NULL;\r
-               }\r
-\r
-       }\r
-\r
-       // assign 100% image\r
-    m_canvas->m_image100 = wxBitmap(image);\r
-\r
-       // find a fit-to-width zoom\r
-       int zooml, wzooml, hzooml;\r
-       wxSize clientsize = m_canvas->GetClientSize();\r
-       wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth()));\r
-       hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight()));\r
-       zooml = wxMin(100, wxMin(wzooml, hzooml));\r
-\r
-       // fit to width\r
-#ifndef __WXGTK__\r
-       m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
-#endif // __WXGTK__\r
-\r
-       //m_canvas->m_image = m_canvas->m_image100;\r
-       //m_canvas->Refresh();\r
-       //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0));\r
+////////////////////////////////\r
+// drag and drop \r
+////////////////////////////////\r
 \r
-    //text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\r
-    text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
-    WriteText(text);\r
-    return NULL;\r
-\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Parsing thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)\r
-        : wxThread()\r
-{\r
-    m_count = 0;\r
-    m_tree = tree;\r
-       m_parentid = parentid;\r
-}\r
-\r
-void OPJParseThread::WriteText(const wxString& text)\r
+bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
 {\r
-    wxString msg;\r
-\r
-    // before doing any GUI calls we must ensure that this thread is the only\r
-    // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiEnter();\r
-#endif // __WXGTK\r
-\r
-    msg << text;\r
-    m_tree->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
-    wxMutexGuiLeave();\r
-#endif // __WXGTK\r
-}\r
-\r
-void OPJParseThread::OnExit()\r
-{\r
-    wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);\r
-\r
-    wxArrayThread& threads = wxGetApp().m_parse_threads;\r
-    threads.Remove(this);\r
-\r
-    if (threads.IsEmpty()) {\r
-        // signal the main thread that there are no more threads left if it is\r
-        // waiting for us\r
-        if (wxGetApp().m_parse_waitingUntilAllDone) {\r
-            wxGetApp().m_parse_waitingUntilAllDone = false;\r
-            wxGetApp().m_parse_semAllDone.Post();\r
-        }\r
+    /*size_t nFiles = filenames.GetCount();\r
+    wxString str;\r
+    str.Printf( _T("%d files dropped\n"), (int)nFiles);\r
+    for ( size_t n = 0; n < nFiles; n++ ) {\r
+        str << filenames[n] << wxT("\n");\r
     }\r
-}\r
-\r
-void *OPJParseThread::Entry()\r
-{\r
-\r
-       printf("Entering\n\n");\r
-\r
-    wxString text;\r
-\r
-       srand(GetId());\r
-       int m_countnum = rand() % 9;\r
-    text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
-            GetId(), GetPriority(), m_countnum);\r
-    WriteText(text);\r
-    LoadFile(m_tree->m_fname);\r
-    text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
-    WriteText(text);\r
-\r
-\r
-    //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness\r
-\r
-       //wxBusyCursor wait;\r
-       //wxBusyInfo wait(wxT("Decoding image ..."));\r
-\r
+    wxLogMessage(str);*/\r
+       m_pOwner->OpenFiles(filenames, filenames);\r
 \r
-    /*for ( m_count = 0; m_count < m_countnum; m_count++ )\r
-    {\r
-        // check if we were asked to exit\r
-        if ( TestDestroy() )\r
-            break;\r
-\r
-        text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());\r
-        WriteText(text);\r
-\r
-        // wxSleep() can't be called from non-GUI thread!\r
-        wxThread::Sleep(10);\r
-    }*/\r
-\r
-    // wxLogMessage(text); -- test wxLog thread safeness\r
-\r
-       printf("Exiting\n\n");\r
-\r
-    return NULL;\r
+    return true;\r
 }\r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
index 51b6badb974e4a046eebf9e2def0796a0a05dfea..d44f7e48f94172809a457e1b4efb582a36015fea 100644 (file)
 #include "imagj2k.h"\r
 #include "imagjp2.h"\r
 #include "imagmj2.h"\r
+#ifdef USE_MXF\r
+#include "imagmxf.h"\r
+#endif // USE_MXF\r
 \r
 #ifdef __WXMSW__\r
 typedef unsigned __int64 int8byte;\r
@@ -150,6 +153,16 @@ typedef unsigned long long int8byte;
 #define OPJ_CANVAS_BORDER 10\r
 #define OPJ_CANVAS_COLOUR *wxWHITE\r
 \r
+\r
+\r
+#ifdef USE_JPWL\r
+\r
+//#define MYJPWL_MAX_NO_TILESPECS JPWL_MAX_NO_TILESPECS\r
+#define MYJPWL_MAX_NO_TILESPECS 4\r
+\r
+#endif // USE_JPWL\r
+\r
+\r
 class OPJDecoThread;\r
 class OPJEncoThread;\r
 class OPJParseThread;\r
@@ -198,19 +211,25 @@ class OPJViewerApp: public wxApp
                bool m_enabledeco, m_enableparse;\r
                int m_reducefactor, m_qualitylayers, m_components, m_framenum;\r
 #ifdef USE_JPWL\r
-               bool m_enablejpwl;\r
+               bool m_enablejpwl, m_enablejpwle;\r
                int m_expcomps, m_maxtiles;\r
                int m_framewidth, m_frameheight;\r
 #endif // USE_JPWL\r
 \r
                // encoding engine parameters\r
                wxString m_subsampling, m_origin, m_rates, m_comment, m_index, m_quality;\r
-               wxString m_cbsize, m_prsize, m_tsize, m_torigin;\r
+               wxString m_cbsize, m_prsize, m_tsize, m_torigin, m_poc;\r
                bool m_enablecomm, m_enableidx, m_multicomp, m_irreversible, m_enablesop, m_enableeph;\r
                bool m_enablebypass, m_enablereset, m_enablerestart, m_enablevsc, m_enableerterm;\r
-               bool m_enablesegmark;\r
+               bool m_enablesegmark, m_enablepoc;\r
                bool m_enablequality;\r
                int m_resolutions, m_progression;\r
+#ifdef USE_JPWL\r
+               int m_hprotsel[MYJPWL_MAX_NO_TILESPECS], m_pprotsel[MYJPWL_MAX_NO_TILESPECS];\r
+               int m_htileval[MYJPWL_MAX_NO_TILESPECS], m_ptileval[MYJPWL_MAX_NO_TILESPECS],\r
+                       m_ppackval[MYJPWL_MAX_NO_TILESPECS];\r
+               int m_sensisel[MYJPWL_MAX_NO_TILESPECS], m_stileval[MYJPWL_MAX_NO_TILESPECS];\r
+#endif // USE_JPWL\r
 \r
                // some layout settings\r
                bool m_showtoolbar, m_showbrowser, m_showpeeker;\r
@@ -655,13 +674,24 @@ public:
     wxPanel* CreatePart1_1SettingsPage(wxWindow* parent);\r
     wxPanel* CreatePart1_2SettingsPage(wxWindow* parent);\r
 /*    wxPanel* CreatePart3SettingsPage(wxWindow* parent);*/\r
-#ifdef USE_JPWL\r
-       void OnEnableJPWL(wxCommandEvent& event);\r
        void OnEnableComm(wxCommandEvent& event);\r
        void OnEnableIdx(wxCommandEvent& event);\r
+       void OnEnablePoc(wxCommandEvent& event);\r
        void OnRadioQualityRate(wxCommandEvent& event);\r
+#ifdef USE_JPWL\r
+       void OnEnableJPWL(wxCommandEvent& event);\r
        wxPanel* CreatePart11SettingsPage(wxWindow* parent);\r
        /*wxCheckBox *m_enablejpwlCheck;*/\r
+       wxChoice *m_hprotChoice[MYJPWL_MAX_NO_TILESPECS];\r
+       wxSpinCtrl *m_htileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+       wxChoice *m_pprotChoice[MYJPWL_MAX_NO_TILESPECS];\r
+       wxSpinCtrl *m_ptileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+       wxSpinCtrl *m_ppackCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+       wxChoice *m_sensiChoice[MYJPWL_MAX_NO_TILESPECS];\r
+       wxSpinCtrl *m_stileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+       void OnHprotSelect(wxCommandEvent& event);\r
+       void OnPprotSelect(wxCommandEvent& event);\r
+       void OnSensiSelect(wxCommandEvent& event);\r
 #endif // USE_JPWL\r
 \r
        wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl;\r
@@ -672,7 +702,7 @@ public:
        wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_mctCheck, *m_irrevCheck;\r
        wxCheckBox *m_sopCheck, *m_ephCheck, *m_enablebypassCheck, *m_enableresetCheck,\r
                *m_enablerestartCheck, *m_enablevscCheck, *m_enableertermCheck, *m_enablesegmarkCheck;\r
-       wxCheckBox *m_enablepocCheck;\r
+       wxCheckBox *m_enablepocCheck, *m_enablejpwlCheck;\r
        wxSpinCtrl *m_resolutionsCtrl;\r
 \r
 protected:\r
@@ -708,7 +738,14 @@ protected:
                OPJENCO_INDEXNAME,\r
                OPJENCO_POCSPEC,\r
                OPJENCO_ENABLECOMM,\r
-               OPJENCO_COMMENTTEXT\r
+               OPJENCO_COMMENTTEXT,\r
+               OPJENCO_HPROT,\r
+               OPJENCO_HTILE,\r
+               OPJENCO_PPROT,\r
+               OPJENCO_PTILE,\r
+               OPJENCO_PPACK,\r
+               OPJENCO_SENSI,\r
+               OPJENCO_STILE\r
     };\r
 \r
 DECLARE_EVENT_TABLE()\r
index 654179bd86fa17be0d640087408bcdf0779deb07..e7f871ba7c07d0435c7c290f16a479c2c316ee56 100644 (file)
@@ -1 +1 @@
-wxT("292") \r
+wxT("404") \r
index 143a1c0c1dd15425350d3925af1b00f2ce202fdb..e1c732d4d72d794bc744664eb5927fbf2e05bba8 100644 (file)
@@ -670,8 +670,7 @@ bool wxJ2KHandler::SaveFile( wxImage *wimage, wxOutputStream& stream, bool verbo
 \r
        /* Write the index to disk */\r
        if (*indexfilename) {\r
-               bSuccess = write_index_file(&cstr_info, indexfilename);\r
-               if (!bSuccess) {\r
+               if (write_index_file(&cstr_info, indexfilename)) {\r
                        wxLogError(wxT("Failed to output index file"));\r
                }\r
        }\r
@@ -717,268 +716,6 @@ bool wxJ2KHandler::DoCanRead( wxInputStream& stream )
     return hdr[0] == 0xFF && hdr[1] == 0x4F;\r
 }\r
 \r
-// write the index file\r
-bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *index) {\r
-       int tileno, compno, layno, resno, precno, pack_nb, x, y;\r
-       FILE *stream = NULL;\r
-       double total_disto = 0;\r
-       int tilepartno;\r
-\r
-#ifdef USE_JPWL\r
-       if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))\r
-               return true;\r
-#endif // USE_JPWL\r
-\r
-       if (!cstr_info)         \r
-               return 1;\r
-\r
-       stream = fopen(index, "w");\r
-       if (!stream) {\r
-               fprintf(stderr, "failed to open index file [%s] for writing\n", index);\r
-               return false;\r
-       }\r
-       \r
-       fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);\r
-       fprintf(stream, "%d\n", cstr_info->prog);\r
-       fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);\r
-       fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);\r
-       fprintf(stream, "%d\n", cstr_info->numcomps);\r
-       fprintf(stream, "%d\n", cstr_info->numlayers);\r
-       fprintf(stream, "%d\n", cstr_info->numdecompos);\r
-\r
-       for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {\r
-               fprintf(stream, "[%d,%d] ", \r
-                       (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno]));    /* based on tile 0 and component 0 */\r
-       }\r
-\r
-       fprintf(stream, "\n");\r
-       fprintf(stream, "%d\n", cstr_info->main_head_start);\r
-       fprintf(stream, "%d\n", cstr_info->main_head_end);\r
-       fprintf(stream, "%d\n", cstr_info->codestream_size);\r
-       \r
-       fprintf(stream, "\nINFO ON TILES\n");\r
-       fprintf(stream, "tileno start_pos  end_hd  end_tile   nbparts         disto     nbpix   disto/nbpix\n");\r
-       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
-               fprintf(stream, "%4d %9d %9d %9d %9d %9e %9d %9e\n",\r
-                       cstr_info->tile[tileno].tileno,\r
-                       cstr_info->tile[tileno].start_pos,\r
-                       cstr_info->tile[tileno].end_header,\r
-                       cstr_info->tile[tileno].end_pos,\r
-                       cstr_info->tile[tileno].num_tps,\r
-                       cstr_info->tile[tileno].distotile, cstr_info->tile[tileno].numpix,\r
-                       cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);\r
-       }\r
-               \r
-       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
-               int start_pos, end_ph_pos, end_pos;\r
-               double disto = 0;\r
-               int max_numdecompos = 0;\r
-               pack_nb = 0;\r
-\r
-               for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                       if (max_numdecompos < cstr_info->numdecompos[compno])\r
-                               max_numdecompos = cstr_info->numdecompos[compno];\r
-               }       \r
-\r
-               fprintf(stream, "\nTILE %d DETAILS\n", tileno); \r
-               fprintf(stream, "part_nb tileno  start_pack num_packs  start_pos end_tph_pos   end_pos\n");\r
-               for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)\r
-                       fprintf(stream, "%4d %9d   %9d %9d  %9d %11d %9d\n",\r
-                               tilepartno, tileno,\r
-                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,\r
-                               cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,\r
-                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,\r
-                               cstr_info->tile[tileno].tp[tilepartno].tp_end_header,\r
-                               cstr_info->tile[tileno].tp[tilepartno].tp_end_pos\r
-                               );\r
-               if (cstr_info->prog == LRCP) {  /* LRCP */\r
-                       fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n");\r
-\r
-                       for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
-                               for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
-                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                                               int prec_max;\r
-                                               if (resno > cstr_info->numdecompos[compno])\r
-                                                       break;\r
-                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
-                                               for (precno = 0; precno < prec_max; precno++) {\r
-                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
-                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
-                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
-                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
-                                                       fprintf(stream, "%4d %6d %7d %5d %6d  %6d    %6d     %6d %7d %8e\n",\r
-                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos, disto);\r
-                                                       total_disto += disto;\r
-                                                       pack_nb++;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               } /* LRCP */\r
-               else if (cstr_info->prog == RLCP) {     /* RLCP */\r
-\r
-                       fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos disto\n");\r
-\r
-                       for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
-                               for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
-                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                                               int prec_max; \r
-                                               if (resno > cstr_info->numdecompos[compno])\r
-                                                       break;\r
-                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
-                                               for (precno = 0; precno < prec_max; precno++) {\r
-                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
-                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
-                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
-                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
-                                                       fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d   %9d %7d %8e\n",\r
-                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos, disto);\r
-                                                       total_disto += disto;\r
-                                                       pack_nb++;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               } /* RLCP */\r
-               else if (cstr_info->prog == RPCL) {     /* RPCL */\r
-\r
-                       fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
-                       for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
-                               /* I suppose components have same XRsiz, YRsiz */\r
-                               int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
-                               int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
-                               int x1 = x0 + cstr_info->tile_x;\r
-                               int y1 = y0 + cstr_info->tile_y;\r
-                               for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                                       int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
-                                       if (resno > cstr_info->numdecompos[compno])\r
-                                                       break;\r
-                                       for (precno = 0; precno < prec_max; precno++) {\r
-                                               int pcnx = cstr_info->tile[tileno].pw[resno];\r
-                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
-                                               int precno_y = (int) floor( (float)precno/(float)pcnx );\r
-                                               for(y = y0; y < y1; y++) {                                                      \r
-                                                       if (precno_y*pcy == y ) {\r
-                                                               for (x = x0; x < x1; x++) {                                                                     \r
-                                                                       if (precno_x*pcx == x ) {\r
-                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
-                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
-                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
-                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
-                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
-                                                                                       fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d   %9d %7d %8e\n",\r
-                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos, disto); \r
-                                                                                       total_disto += disto;\r
-                                                                                       pack_nb++; \r
-                                                                               }\r
-                                                                       }\r
-                                                               }/* x = x0..x1 */\r
-                                                       } \r
-                                               }  /* y = y0..y1 */\r
-                                       } /* precno */\r
-                               } /* compno */\r
-                       } /* resno */\r
-               } /* RPCL */\r
-               else if (cstr_info->prog == PCRL) {     /* PCRL */\r
-                       /* I suppose components have same XRsiz, YRsiz */\r
-                       int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
-                       int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
-                       int x1 = x0 + cstr_info->tile_x;\r
-                       int y1 = y0 + cstr_info->tile_y;\r
-\r
-                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
-                       for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                               for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {\r
-                                       int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
-                                       for (precno = 0; precno < prec_max; precno++) {\r
-                                               int pcnx = cstr_info->tile[tileno].pw[resno];\r
-                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
-                                               int precno_y = (int) floor( (float)precno/(float)pcnx );\r
-                                               for(y = y0; y < y1; y++) {                                                      \r
-                                                       if (precno_y*pcy == y ) {\r
-                                                               for (x = x0; x < x1; x++) {                                                                     \r
-                                                                       if (precno_x*pcx == x ) {\r
-                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
-                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
-                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
-                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
-                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
-                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d %8e\n",\r
-                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos, disto); \r
-                                                                                       total_disto += disto;\r
-                                                                                       pack_nb++; \r
-                                                                               }\r
-                                                                       }\r
-                                                               }/* x = x0..x1 */\r
-                                                       } \r
-                                               }  /* y = y0..y1 */\r
-                                       } /* precno */\r
-                               } /* resno */\r
-                       } /* compno */\r
-               } /* PCRL */\r
-               else {  /* CPRL */\r
-\r
-                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
-                       for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
-                               /* I suppose components have same XRsiz, YRsiz */\r
-                               int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
-                               int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
-                               int x1 = x0 + cstr_info->tile_x;\r
-                               int y1 = y0 + cstr_info->tile_y;\r
-                               \r
-                               for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {\r
-                                       int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
-                                       for (precno = 0; precno < prec_max; precno++) {\r
-                                               int pcnx = cstr_info->tile[tileno].pw[resno];\r
-                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
-                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
-                                               int precno_y = (int) floor( (float)precno/(float)pcnx );\r
-                                               for(y = y0; y < y1; y++) {\r
-                                                       if (precno_y*pcy == y ) {\r
-                                                               for (x = x0; x < x1; x++) {\r
-                                                                       if (precno_x*pcx == x ) {\r
-                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
-                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
-                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
-                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
-                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
-                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d %8e\n",\r
-                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos, disto); \r
-                                                                                       total_disto += disto;\r
-                                                                                       pack_nb++; \r
-                                                                               }\r
-                                                                       }\r
-                                                               }/* x = x0..x1 */\r
-                                                       }\r
-                                               } /* y = y0..y1 */\r
-                                       } /* precno */\r
-                               } /* resno */\r
-                       } /* compno */\r
-               } /* CPRL */   \r
-       } /* tileno */\r
-       \r
-       fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */\r
-       fprintf(stream, "%.8e\n", total_disto); /* SE totale */\r
-       fprintf(stream, "\nMARKER LIST\n");\r
-       fprintf(stream, "%d\n", cstr_info->marknum);\r
-       fprintf(stream, "type\tstart_pos    length\n");\r
-       for (x = 0; x < cstr_info->marknum; x++)\r
-               fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);\r
-       fclose(stream);\r
-\r
-       fprintf(stderr,"Generated index file %s\n", index);\r
-\r
-       return true;\r
-}\r
-\r
 #endif   // wxUSE_STREAMS\r
 \r
 #endif   // wxUSE_LIBOPENJPEG\r
index af70392e0d4ef5dc3efefd86454ed40fa11e3395..72000e3140f2f766cb2ef058e9b993816a7cfcf9 100644 (file)
@@ -45,6 +45,7 @@
 \r
 #include "wx/image.h"\r
 #include "libopenjpeg/openjpeg.h"\r
+#include "codec/index.h"\r
 \r
 #define wxBITMAP_TYPE_J2K      47\r
 \r
@@ -106,6 +107,8 @@ public:
                m_indexfname*/\r
                m_enableidx = false;\r
                m_index = wxT("index.txt");\r
+               m_enablepoc = false;\r
+               m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL");\r
                m_enablecomm = true;\r
 \r
 #if defined __WXMSW__\r
@@ -162,8 +165,8 @@ public:
        wxString m_index;\r
        bool m_enablecomm;\r
        wxString m_comment;\r
-\r
-       bool write_index_file(opj_codestream_info_t *cstr_info, char *index);\r
+       bool m_enablepoc;\r
+       wxString m_poc;\r
 \r
 #if wxUSE_STREAMS\r
     virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 );\r
@@ -173,6 +176,7 @@ protected:
 #endif\r
 \r
 private:\r
+       OPJ_PROG_ORDER give_progression(char progression[4]);\r
     DECLARE_DYNAMIC_CLASS(wxJ2KHandler)\r
 };\r
 \r
diff --git a/OPJViewer/source/imagmxf.cpp b/OPJViewer/source/imagmxf.cpp
new file mode 100644 (file)
index 0000000..4bc4a2c
--- /dev/null
@@ -0,0 +1,274 @@
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        imagmxf.cpp\r
+// Purpose:     wxImage MXF (Material eXchange Format) JPEG 2000 file format handler\r
+// Author:      Giuseppe Baruffa - based on imagjpeg.cpp, Vaclav Slavik\r
+// RCS-ID:      $Id: imagmxf.cpp,v 0.00 2007/11/19 17:00:00 MW Exp $\r
+// Copyright:   (c) Giuseppe Baruffa\r
+// Licence:     wxWindows licence\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifdef USE_MXF\r
+\r
+// For compilers that support precompilation, includes "wx.h".\r
+#include "wx/wxprec.h"\r
+\r
+#ifdef __BORLANDC__\r
+    #pragma hdrstop\r
+#endif\r
+\r
+#if wxUSE_IMAGE && wxUSE_LIBOPENJPEG\r
+\r
+#include "imagmxf.h"\r
+\r
+#ifndef WX_PRECOMP\r
+    #include "wx/log.h"\r
+    #include "wx/app.h"\r
+    #include "wx/intl.h"\r
+    #include "wx/bitmap.h"\r
+    #include "wx/module.h"\r
+#endif\r
+\r
+\r
+#include "libopenjpeg/openjpeg.h"\r
+\r
+\r
+#include "wx/filefn.h"\r
+#include "wx/wfstream.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+// types\r
+// ----------------------------------------------------------------------------\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+// wxMXFHandler\r
+//-----------------------------------------------------------------------------\r
+\r
+IMPLEMENT_DYNAMIC_CLASS(wxMXFHandler,wxImageHandler)\r
+\r
+#if wxUSE_STREAMS\r
+\r
+//------------- JPEG 2000 Data Source Manager\r
+\r
+#define J2K_CFMT 0\r
+#define JP2_CFMT 1\r
+#define JPT_CFMT 2\r
+#define MJ2_CFMT 3\r
+#define PXM_DFMT 0\r
+#define PGX_DFMT 1\r
+#define BMP_DFMT 2\r
+#define YUV_DFMT 3\r
+\r
+#define MAX_MESSAGE_LEN 200\r
+\r
+/* sample error callback expecting a FILE* client object */\r
+void mxf_error_callback(const char *msg, void *client_data) {\r
+       int message_len = strlen(msg) - 1;\r
+       if (msg[message_len] != '\n')\r
+               message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+               wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+       wxLogMessage(wxT("[ERROR] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+/* sample warning callback expecting a FILE* client object */\r
+void mxf_warning_callback(const char *msg, void *client_data) {\r
+       int message_len = strlen(msg) - 1;\r
+       if (msg[message_len] != '\n')\r
+               message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+               wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+       wxLogMessage(wxT("[WARNING] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+/* sample debug callback expecting no client object */\r
+void mxf_info_callback(const char *msg, void *client_data) {\r
+       int message_len = strlen(msg) - 1;\r
+       if (msg[message_len] != '\n')\r
+               message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+               wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+       wxLogMessage(wxT("[INFO] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+    wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////\r
+/////////////////////////////////////////////////\r
+\r
+// load the mxf file format\r
+bool wxMXFHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index)\r
+{\r
+       opj_dparameters_t parameters;   /* decompression parameters */\r
+       opj_event_mgr_t event_mgr;              /* event manager */\r
+       opj_image_t *opjimage = NULL;\r
+       unsigned char *src = NULL;\r
+    unsigned char *ptr;\r
+       int file_length, j2k_point, j2k_len;\r
+       opj_codestream_info_t cstr_info;  /* Codestream information structure */\r
+\r
+       // destroy the image\r
+    image->Destroy();\r
+\r
+       /* handle to a decompressor */\r
+       opj_dinfo_t* dinfo = NULL;      \r
+       opj_cio_t *cio = NULL;\r
+\r
+       /* configure the event callbacks (not required) */\r
+       memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
+       event_mgr.error_handler = mxf_error_callback;\r
+       event_mgr.warning_handler = mxf_warning_callback;\r
+       event_mgr.info_handler = mxf_info_callback;\r
+\r
+       /* set decoding parameters to default values */\r
+       opj_set_default_decoder_parameters(&parameters);\r
+\r
+       /* prepare parameters */\r
+       strncpy(parameters.infile, "", sizeof(parameters.infile)-1);\r
+       strncpy(parameters.outfile, "", sizeof(parameters.outfile)-1);\r
+       parameters.decod_format = J2K_CFMT;\r
+       parameters.cod_format = BMP_DFMT;\r
+       if (m_reducefactor)\r
+               parameters.cp_reduce = m_reducefactor;\r
+       if (m_qualitylayers)\r
+               parameters.cp_layer = m_qualitylayers;\r
+       /*if (n_components)\r
+               parameters. = n_components;*/\r
+\r
+       /* JPWL only */\r
+#ifdef USE_JPWL\r
+       parameters.jpwl_exp_comps = m_expcomps;\r
+       parameters.jpwl_max_tiles = m_maxtiles;\r
+       parameters.jpwl_correct = m_enablejpwl;\r
+#endif /* USE_JPWL */\r
+\r
+       /* get a decoder handle */\r
+       dinfo = opj_create_decompress(CODEC_J2K);\r
+\r
+       /* find length of the stream */\r
+       stream.SeekI(0, wxFromEnd);\r
+       file_length = (int) stream.TellI();\r
+\r
+       /* search for the m_framenum codestream position and length  */\r
+       //jp2c_point = searchjp2c(stream, file_length, m_framenum);\r
+       //jp2c_len = searchjp2c(stream, file_length, m_framenum);\r
+       j2k_point = 0;\r
+       j2k_len = 10;\r
+\r
+       // malloc memory source\r
+    src = (unsigned char *) malloc(j2k_len);\r
+\r
+       // copy the jp2c\r
+       stream.SeekI(j2k_point, wxFromStart);\r
+       stream.Read(src, j2k_len);\r
+\r
+       /* catch events using our callbacks and give a local context */\r
+       opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);\r
+\r
+       /* setup the decoder decoding parameters using user parameters */\r
+       opj_setup_decoder(dinfo, &parameters);\r
+\r
+       /* open a byte stream */\r
+       cio = opj_cio_open((opj_common_ptr)dinfo, src, j2k_len);\r
+\r
+       /* decode the stream and fill the image structure */\r
+       opjimage = opj_decode_with_info(dinfo, cio, &cstr_info);\r
+       if (!opjimage) {\r
+               wxMutexGuiEnter();\r
+               wxLogError(wxT("MXF: failed to decode image!"));\r
+               wxMutexGuiLeave();\r
+               opj_destroy_decompress(dinfo);\r
+               opj_cio_close(cio);\r
+               free(src);\r
+               return false;\r
+       }\r
+\r
+       /* close the byte stream */\r
+       opj_cio_close(cio);\r
+\r
+       /* common rendering method */\r
+#include "imagjpeg2000.cpp"\r
+\r
+    wxMutexGuiEnter();\r
+    wxLogMessage(wxT("MXF: image loaded."));\r
+    wxMutexGuiLeave();\r
+\r
+       /* close openjpeg structs */\r
+       opj_destroy_decompress(dinfo);\r
+       opj_image_destroy(opjimage);\r
+       free(src);\r
+\r
+       if (!image->Ok())\r
+               return false;\r
+       else\r
+               return true;\r
+\r
+}\r
+\r
+// save the mxf file format\r
+bool wxMXFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose )\r
+{\r
+    wxLogError(wxT("MXF: Couldn't save movie -> not implemented."));\r
+    return false;\r
+}\r
+\r
+#ifdef __VISUALC__\r
+    #pragma warning(default:4611)\r
+#endif /* VC++ */\r
+\r
+// recognize the MXF JPEG 2000 starting box\r
+bool wxMXFHandler::DoCanRead( wxInputStream& stream )\r
+{\r
+    unsigned char hdr[4];\r
+\r
+    if ( !stream.Read(hdr, WXSIZEOF(hdr)) )\r
+        return false;\r
+\r
+    return (hdr[0] == 0x06 &&\r
+                       hdr[1] == 0x0E &&\r
+                       hdr[2] == 0x2B &&\r
+                       hdr[3] == 0x34);\r
+}\r
+\r
+#endif   // wxUSE_STREAMS\r
+\r
+#endif   // wxUSE_LIBOPENJPEG\r
+\r
+#endif // USE_MXF\r
+\r
diff --git a/OPJViewer/source/imagmxf.h b/OPJViewer/source/imagmxf.h
new file mode 100644 (file)
index 0000000..f747a1d
--- /dev/null
@@ -0,0 +1,96 @@
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        imagmxf.h\r
+// Purpose:     wxImage MXF (Material eXchange Format) JPEG 2000 file format handler\r
+// Author:      G. Baruffa - based on imagjpeg.h, Vaclav Slavik\r
+// RCS-ID:      $Id: imagmj2.h,v 0.0 2007/11/19 17:00:00 VZ Exp $\r
+// Copyright:   (c) Giuseppe Baruffa\r
+// Licence:     wxWindows licence\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _WX_IMAGMXF_H_\r
+#define _WX_IMAGMXF_H_\r
+\r
+#ifdef USE_MXF\r
+\r
+#include "wx/defs.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// wxMXFHandler\r
+//-----------------------------------------------------------------------------\r
+\r
+#if wxUSE_LIBOPENJPEG\r
+\r
+#include "wx/image.h"\r
+#include "libopenjpeg/openjpeg.h"\r
+\r
+#define wxBITMAP_TYPE_MXF      50\r
+\r
+class WXDLLEXPORT wxMXFHandler: public wxImageHandler\r
+{\r
+public:\r
+    inline wxMXFHandler()\r
+    {\r
+        m_name = wxT("MXF JPEG 2000 file format");\r
+        m_extension = wxT("mxf");\r
+        m_type = wxBITMAP_TYPE_MXF;\r
+        m_mime = wxT("image/mxf");\r
+\r
+               m_reducefactor = 0;\r
+               m_qualitylayers = 0;\r
+               m_components = 0;\r
+#ifdef USE_JPWL\r
+               m_enablejpwl = true;\r
+               m_expcomps = JPWL_EXPECTED_COMPONENTS;\r
+               m_maxtiles = JPWL_MAXIMUM_TILES;\r
+#endif // USE_JPWL\r
+    }\r
+\r
+               // decoding engine parameters\r
+               int m_reducefactor, m_qualitylayers, m_components, m_framenum;\r
+#ifdef USE_JPWL\r
+               bool m_enablejpwl;\r
+               int m_expcomps, m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+#if wxUSE_STREAMS\r
+    virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 );\r
+    virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true );\r
+protected:\r
+    virtual bool DoCanRead( wxInputStream& stream );\r
+#endif\r
+\r
+private:\r
+    DECLARE_DYNAMIC_CLASS(wxMXFHandler)\r
+};\r
+\r
+#endif // wxUSE_LIBOPENJPEG\r
+\r
+#endif // USE_MXF\r
+\r
+#endif // _WX_IMAGMXF_H_\r
+\r
index ee02c169a793abec5086ca7fd26eed50c4c74a9b..3e1b0f665ef75037f5c9ee51373c5387cc50a8b3 100644 (file)
@@ -106,5 +106,13 @@ SOURCE=.\compat\getopt.h
 \r
 SOURCE=.\image_to_j2k.c\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.h\r
+# End Source File\r
 # End Target\r
 # End Project\r
index 985c18a0c843124bb8f30c09125bc8349c0058e6..2e0283dda46a8350f61a8c6278c8a8d050be3503 100644 (file)
@@ -28,6 +28,7 @@
 \r
 #include <stdio.h>\r
 #include <math.h>\r
+#include <string.h>\r
 #include "openjpeg.h"\r
 #include "index.h"\r
 \r
index aed61e623e1c4f8534a87590eede27c6d02a2ba0..29f673a10452e8159ec2e446d72265f7db2f3092 100644 (file)
 #ifndef __J2K_INDEX_H\r
 #define __J2K_INDEX_H\r
 \r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
 /**\r
 Write a structured index to a file\r
 @param cstr_info Codestream information \r
@@ -37,5 +41,9 @@ Write a structured index to a file
 */\r
 int write_index_file(opj_codestream_info_t *cstr_info, char *index);\r
 \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
 #endif /* __J2K_INDEX_H */\r
 \r
index 36fc74bbbdb26dbd74f3311c50a10db862b2c0d3..927f1a5909ba44d59de5f642e24d6c9e35370bef 100644 (file)
@@ -103,6 +103,14 @@ SOURCE=.\compat\getopt.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\j2k_to_image.c\r
 # End Source File\r
 # End Target\r
index 52d5e9aa1df0080089d5e3cde7377b8ba7d2e55e..dfc30d307bf4a4c236e9dae91804f760e179b9f6 100644 (file)
@@ -98,6 +98,10 @@ SOURCE=..\codec\compat\getopt.c
 \r
 SOURCE=..\codec\image_to_j2k.c\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.c\r
+# End Source File\r
 # End Group\r
 # Begin Group "Header Files"\r
 \r
@@ -112,6 +116,10 @@ SOURCE=..\codec\compat\getopt.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\libopenjpeg\openjpeg.h\r
 # End Source File\r
 # End Group\r
index 408c3d6bee34e84a3dae4da7e68fc69226ff77a8..971b8a31c7c8aac7833e3909a73983b487e60977 100644 (file)
@@ -95,6 +95,10 @@ SOURCE=..\codec\compat\getopt.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\codec\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\codec\j2k_to_image.c\r
 # End Source File\r
 # End Group\r
@@ -115,6 +119,10 @@ SOURCE=..\codec\compat\getopt.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\jpwl.h\r
 # End Source File\r
 # Begin Source File\r
index e41673747cd0db59a9cecbd7c13d316e83ac09f0..d4d0bef93167043b128ff380e1196f9519bbe677 100644 (file)
@@ -41,7 +41,7 @@ RSC=rc.exe
 # PROP Intermediate_Dir "Release"\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /c\r
 # ADD BASE RSC /l 0x80c /d "NDEBUG"\r
 # ADD RSC /l 0x80c /d "NDEBUG"\r
 BSC32=bscmake.exe\r
@@ -64,7 +64,7 @@ LIB32=link.exe -lib
 # PROP Intermediate_Dir "Debug"\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /GZ /c\r
 # ADD BASE RSC /l 0x80c /d "_DEBUG"\r
 # ADD RSC /l 0x80c /d "_DEBUG"\r
 BSC32=bscmake.exe\r
index 5b424235b287f7dd736e1ad3de0f4926e73a7287..7351409f8987a1cdc38719b52a01bd0756580ced 100644 (file)
@@ -1219,6 +1219,7 @@ void j2k_read_red(opj_j2k_t *j2k) {
 \r
 bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) {\r
 \r
+#ifdef oerhgierhgvhreit4u\r
        /*\r
           we navigate through the tile and find possible invalid parameters:\r
        this saves a lot of crashes!!!!!\r
@@ -1280,6 +1281,8 @@ bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) {
                }\r
        }\r
 \r
+#endif\r
+\r
        return true;\r
 }\r
 \r
index 5ee53603f8155186985d3e07e5507c934d018c7b..f6a165b39845c50a8481181b05d10990446242cf 100644 (file)
@@ -661,7 +661,7 @@ bool jpwl_correct(opj_j2k_t *j2k) {
        j2k->state = J2K_STATE_MHSOC;
 
        /* cycle all over the markers */
-       while ((unsigned int) cio_tell(cio) < cio->length) {
+       while (cio_tell(cio) < cio->length) {
 
                /* read the marker */
                mark_pos = cio_tell(cio);