Adapted the JPWL and OPJViewer code to new interface; fixed a samll bug in JPWL which...
authorGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Fri, 7 Sep 2007 23:16:31 +0000 (23:16 +0000)
committerGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Fri, 7 Sep 2007 23:16:31 +0000 (23:16 +0000)
ChangeLog
OPJViewer/OPJViewer.dsp
OPJViewer/source/OPJViewer.cpp
OPJViewer/source/OPJViewer.h
OPJViewer/source/build.h
OPJViewer/source/imagj2k.cpp
OPJViewer/source/imagjp2.cpp
OPJViewer/source/imagmj2.cpp
codec/image_to_j2k.c
jpwl/jpwl.c
jpwl/jpwl_lib.c

index 007d7f9a0896e1e9a47de1fd69cf50d1478c8111..183d8628ea65cec6e3b5e4d19426d676b18e85c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+September 8, 2007
+* [GB] Adapted the JPWL and OPJViewer code to new interface; fixed a samll bug in JPWL which created large EPBs even when null protection was specified
+
 September 7, 2007
 + [FOD] Indexes can now be generated when decoding J2K codestreams.
 * [Mathieu Malaterre] Upon failure, properly return error code (!=0).
index 73f7c851f4baecd7dc18422e13fb2b32f0faf8cd..a2415892aef4eff6ba53db41c40dfdac1b441103 100644 (file)
@@ -42,15 +42,15 @@ 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 "c:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\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 BASE RSC /l 0x410 /d "NDEBUG"\r
-# ADD RSC /l 0x409 /i "d:\programmi\wxWidgets-2.8.0\include" /d "NDEBUG"\r
+# ADD RSC /l 0x409 /i "c:\programmi\wxWidgets-2.8.0\include" /d "NDEBUG"\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 /machine:I386\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 wxzlib.lib wxregex.lib wxpng.lib wxjpeg.lib wxbase28.lib wxmsw28_core.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib LibOpenJPEG_JPWL.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcmt.lib" /libpath:"d:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Release" /IGNORE:4089\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 wxzlib.lib wxregex.lib wxpng.lib wxjpeg.lib wxbase28.lib wxmsw28_core.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib LibOpenJPEG_JPWL.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcmt.lib" /libpath:"c:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Release" /IGNORE:4089\r
 # SUBTRACT LINK32 /pdb:none\r
 # Begin Special Build Tool\r
 SOURCE="$(InputPath)"\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 "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 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 BASE RSC /l 0x410 /d "_DEBUG"\r
-# ADD RSC /l 0x410 /i "c:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
+# ADD RSC /l 0x410 /i "d:\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:"c:\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:"d:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Debug"\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ENDIF \r
index 8253f90bb63e6eed869f1abb865388f46b965e19..66d47c5d65c008c3838b1cddf0ad1a9a2a5d087e 100644 (file)
@@ -2995,11 +2995,19 @@ OPJEncoderDialog::OPJEncoderDialog(wxWindow* win, int dialogType)
 \r
        m_settingsNotebook = GetBookCtrl();\r
 \r
-       wxPanel* jpeg2000Settings = CreatePart1SettingsPage(m_settingsNotebook);\r
+       wxPanel* jpeg2000_1Settings = CreatePart1_1SettingsPage(m_settingsNotebook);\r
+       wxPanel* jpeg2000_2Settings = CreatePart1_2SettingsPage(m_settingsNotebook);\r
        wxPanel* mainSettings = CreateMainSettingsPage(m_settingsNotebook);\r
+#ifdef USE_JPWL\r
+       wxPanel* jpwlSettings = CreatePart11SettingsPage(m_settingsNotebook);\r
+#endif // USE_JPWL\r
 \r
-       m_settingsNotebook->AddPage(jpeg2000Settings, wxT("JPEG 2000"), false);\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
 \r
        LayoutDialog();\r
 }\r
@@ -3027,7 +3035,28 @@ wxPanel* OPJEncoderDialog::CreateMainSettingsPage(wxWindow* parent)
     return panel;\r
 }\r
 \r
-wxPanel* OPJEncoderDialog::CreatePart1SettingsPage(wxWindow* parent)\r
+#ifdef USE_JPWL\r
+wxPanel* OPJEncoderDialog::CreatePart11SettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+       // top sizer\r
+    wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+               // sub top sizer\r
+               wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+       topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+       // assign top and fit it\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}\r
+#endif // USE_JPWL\r
+\r
+wxPanel* OPJEncoderDialog::CreatePart1_1SettingsPage(wxWindow* parent)\r
 {\r
     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
 \r
@@ -3038,7 +3067,7 @@ wxPanel* OPJEncoderDialog::CreatePart1SettingsPage(wxWindow* parent)
        //topSizer->AddSpacer(5);\r
 \r
                // sub top sizer\r
-               wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(4, 3, 3);\r
+               wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3);\r
 \r
                        // image settings, column\r
                        wxStaticBox* imageBox = new wxStaticBox(panel, wxID_ANY, wxT("Image"));\r
@@ -3258,19 +3287,42 @@ wxPanel* OPJEncoderDialog::CreatePart1SettingsPage(wxWindow* parent)
 \r
                subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 3);\r
 \r
-                       // progression settings, column\r
-                       wxString choices[] = {wxT("LRCP"), wxT("RLCP"), wxT("RPCL"), wxT("PCRL"), wxT("CPRL")};\r
+                       // progression and profile settings, column\r
+                       wxString choices[] = {wxT("LRCP"), wxT("RLCP"), wxT("RPCL"), wxT("PCRL"), wxT("CPRL"),\r
+                               wxT("DCI2K24"), wxT("DCI2K48"), wxT("DCI4K")};\r
                        wxRadioBox *progressionBox = new wxRadioBox(panel, OPJENCO_PROGRESSION,\r
-                               wxT("Progression order"),\r
+                               wxT("Progression order/profile"),\r
                                wxDefaultPosition, wxDefaultSize,\r
                                WXSIZEOF(choices),\r
                                choices,\r
-                               4,\r
+                               3,\r
                                wxRA_SPECIFY_COLS);\r
                        progressionBox->SetSelection(0);\r
 \r
                subtopSizer->Add(progressionBox, 0, wxGROW | wxALL, 3);\r
 \r
+       topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+       // assign top and fit it\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}\r
+\r
+wxPanel* OPJEncoderDialog::CreatePart1_2SettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+       // top sizer\r
+    wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+       // add some space\r
+       //topSizer->AddSpacer(5);\r
+\r
+               // sub top sizer\r
+               wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3);\r
+                       \r
                        // resilience settings, column\r
                        wxStaticBox* resilBox = new wxStaticBox(panel, wxID_ANY, wxT("Error resilience"));\r
                        wxBoxSizer* resilSizer = new wxStaticBoxSizer(resilBox, wxVERTICAL);\r
@@ -3394,7 +3446,7 @@ wxPanel* OPJEncoderDialog::CreatePart1SettingsPage(wxWindow* parent)
 \r
                subtopSizer->Add(roiSizer, 0, wxGROW | wxALL, 3);\r
 \r
-                       // ROI settings, column\r
+                       // Index file settings, column\r
                        wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing"));\r
                        wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL);\r
 \r
@@ -3453,6 +3505,40 @@ wxPanel* OPJEncoderDialog::CreatePart1SettingsPage(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
+\r
+                       // POC check box\r
+                       pocSizer->Add(\r
+                               m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled"),\r
+                               wxDefaultPosition, wxDefaultSize),\r
+                               0, wxGROW | wxALL, 3);\r
+                       m_enablepocCheck->SetValue(/*wxGetApp().m_enableidx*/true);\r
+\r
+                               // POC sizer, row\r
+                               wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 3);\r
+\r
+                               // add some horizontal space\r
+                               pocspecSizer->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
+                                                               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
+\r
+                       pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3);\r
+\r
+               subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3);\r
+\r
        topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
 \r
        // assign top and fit it\r
index 0c29af4d84e22f087aa90596a66de07b2846e625..db28837eb52aa7b3991a44022f4bc9cdaa7c3d41 100644 (file)
@@ -631,20 +631,22 @@ public:
        wxBookCtrlBase* m_settingsNotebook;\r
 \r
     wxPanel* CreateMainSettingsPage(wxWindow* parent);\r
-    wxPanel* CreatePart1SettingsPage(wxWindow* parent);\r
+    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
-/*    wxPanel* CreatePart11SettingsPage(wxWindow* parent);\r
-       wxCheckBox *m_enablejpwlCheck;*/\r
+       wxPanel* CreatePart11SettingsPage(wxWindow* parent);\r
+       /*wxCheckBox *m_enablejpwlCheck;*/\r
 #endif // USE_JPWL\r
 \r
        wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl;\r
-       wxTextCtrl *m_indexCtrl, *m_qualityCtrl, *m_cbsizeCtrl, *m_prsizeCtrl;\r
+       wxTextCtrl *m_indexCtrl, *m_qualityCtrl, *m_cbsizeCtrl, *m_prsizeCtrl, *m_pocCtrl;\r
        wxTextCtrl *m_tsizeCtrl, *m_toriginCtrl;\r
        wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_irrevCheck, *m_sopCheck, *m_ephCheck;\r
+       wxCheckBox *m_enablepocCheck;\r
        wxSpinCtrl *m_resolutionsCtrl;\r
 \r
 protected:\r
@@ -667,6 +669,7 @@ protected:
                OPJENCO_ENABLEVSC,\r
                OPJENCO_ENABLEERTERM,\r
                OPJENCO_ENABLESEGMARK,\r
+               OPJENCO_ENABLEPOC,\r
                OPJENCO_ROICOMP,\r
                OPJENCO_ROISHIFT,\r
                OPJENCO_IMORIG,\r
@@ -674,6 +677,7 @@ protected:
                OPJENCO_ENABLEIRREV,\r
                OPJENCO_ENABLEINDEX,\r
                OPJENCO_INDEXNAME,\r
+               OPJENCO_POCSPEC,\r
                OPJENCO_ENABLECOMM,\r
                OPJENCO_COMMENTTEXT\r
     };\r
index 176e98c13b7c6022e74a9bd806822b6bb07d1b88..4d7baa6b7084ddecfe60b8fee6de445dce865831 100644 (file)
@@ -1 +1 @@
-wxT("207") \r
+wxT("219") \r
index 64c051fff75f939aed3b00cf077e3bead2087180..9ce142df9317a842efebe3082f9414fd63ababd8 100644 (file)
@@ -131,6 +131,7 @@ bool wxJ2KHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        unsigned char *src = NULL;\r
     unsigned char *ptr;\r
        int file_length;\r
+       opj_codestream_info_t cstr_info;  /* Codestream information structure */\r
 \r
        // destroy the image\r
     image->Destroy();\r
@@ -188,7 +189,7 @@ bool wxJ2KHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);\r
 \r
        /* decode the stream and fill the image structure */\r
-       opjimage = opj_decode(dinfo, cio);\r
+       opjimage = opj_decode(dinfo, cio, &cstr_info);\r
        if (!opjimage) {\r
 #ifndef __WXGTK__ \r
                wxMutexGuiEnter();\r
@@ -242,6 +243,7 @@ bool wxJ2KHandler::SaveFile( wxImage *wimage, wxOutputStream& stream, bool verbo
        int codestream_length;\r
        bool bSuccess;\r
        int i;\r
+       char indexfilename[OPJ_PATH_LEN] = "";  /* index file name */\r
 \r
        /*\r
        configure the event callbacks (not required)\r
@@ -316,11 +318,8 @@ bool wxJ2KHandler::SaveFile( wxImage *wimage, wxOutputStream& stream, bool verbo
 \r
        /* indexing file */\r
        if (m_enableidx) {\r
-               strncpy(parameters.index, m_index.c_str(), m_index.Len());\r
-               wxLogMessage("index file is %s", parameters.index);\r
-               parameters.index_on = 1;\r
-       } else {\r
-               parameters.index_on = 0;\r
+               strncpy(indexfilename, m_index.c_str(), OPJ_PATH_LEN);\r
+               wxLogMessage("index file is %s", indexfilename);\r
        }\r
 \r
        /* if no rate entered, lossless by default */\r
@@ -479,8 +478,8 @@ bool wxJ2KHandler::SaveFile( wxImage *wimage, wxOutputStream& stream, bool verbo
        opj_cio_close(cio);\r
 \r
        /* Write the index to disk */\r
-       if (parameters.index_on) {\r
-               bSuccess = write_index_file(&cstr_info, parameters.index);\r
+       if (*indexfilename) {\r
+               bSuccess = write_index_file(&cstr_info, indexfilename);\r
                if (bSuccess) {\r
                        wxLogError(wxT("Failed to output index file"));\r
                }\r
@@ -536,67 +535,72 @@ Create an index and write it to a file
 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
        if (!cstr_info)         \r
-               return false;\r
+               return 1;\r
 \r
        stream = fopen(index, "w");\r
        if (!stream) {\r
-               wxLogError(wxT("failed to open index file [%s] for writing"), index);\r
-               return false;\r
+               fprintf(stderr, "failed to open index file [%s] for writing\n", index);\r
+               return 1;\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->comp);\r
-       fprintf(stream, "%d\n", cstr_info->layer);\r
-       fprintf(stream, "%d\n", cstr_info->decomposition);\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->decomposition; resno >= 0; resno--) {\r
+       for (resno = cstr_info->numdecompos; 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 */\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         disto     nbpix   disto/nbpix\n");\r
+       fprintf(stream, "tileno start_pos  end_hd  end_tile   nbparts\n");\r
        for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
-               fprintf(stream, "%4d %9d %9d %9d %9e %9d %9e\n",\r
-                       cstr_info->tile[tileno].num_tile,\r
+               fprintf(stream, "%4d %9d %9d %9d %9d\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].distotile, cstr_info->tile[tileno].nbpix,\r
-                       cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].nbpix);\r
+                       cstr_info->tile[tileno].num_tps);\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
                pack_nb = 0;\r
 \r
-               fprintf(stream, "\nTILE %d DETAILS\n", tileno);                         \r
+               fprintf(stream, "\nTILE %d DETAILS\n", tileno); \r
+               fprintf(stream, "part_nb tileno  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 %11d %9d\n",\r
+                               tilepartno, tileno,\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\n");\r
 \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->layer; layno++) {\r
-                               for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {\r
-                                       for (compno = 0; compno < cstr_info->comp; compno++) {\r
+                       for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
+                               for (resno = 0; resno < cstr_info->numdecompos + 1; resno++) {\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
                                                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
+                                                       fprintf(stream, "%4d %6d %7d %5d %6d  %6d    %6d     %6d %7d\n",\r
+                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos);\r
                                                        pack_nb++;\r
                                                }\r
                                        }\r
@@ -605,20 +609,18 @@ bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *inde
                } /* 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
+                       fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n");\r
 \r
-                       for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {\r
-                               for (layno = 0; layno < cstr_info->layer; layno++) {\r
-                                       for (compno = 0; compno < cstr_info->comp; compno++) {\r
+                       for (resno = 0; resno < cstr_info->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 = 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
+                                                       fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d   %9d %7d\n",\r
+                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos);\r
                                                        pack_nb++;\r
                                                }\r
                                        }\r
@@ -627,34 +629,32 @@ bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *inde
                } /* 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
+                       fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos\n"); \r
 \r
-                       for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {\r
+                       for (resno = 0; resno < cstr_info->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->comp; compno++) {\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
                                        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->decomposition - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->decomposition - resno );\r
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos - resno );\r
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos - 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->layer; layno++) {\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
+                                                                                       fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d   %9d %7d\n",\r
+                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); \r
                                                                                        pack_nb++; \r
                                                                                }\r
                                                                        }\r
@@ -672,29 +672,27 @@ bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *inde
                        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
+                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos\n"); \r
 \r
-                       for (compno = 0; compno < cstr_info->comp; compno++) {\r
-                               for (resno = 0; resno < cstr_info->decomposition + 1; resno++) {\r
+                       for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
+                               for (resno = 0; resno < cstr_info->numdecompos + 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->decomposition - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->decomposition - resno );\r
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos - resno );\r
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos - 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->layer; layno++) {\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
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d\n",\r
+                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); \r
                                                                                        pack_nb++; \r
                                                                                }\r
                                                                        }\r
@@ -707,35 +705,33 @@ bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *inde
                } /* 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
+                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos\n"); \r
 \r
-                       for (compno = 0; compno < cstr_info->comp; compno++) {\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->decomposition + 1; resno++) {\r
+                               for (resno = 0; resno < cstr_info->numdecompos + 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->decomposition - resno );\r
-                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->decomposition - resno );\r
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos - resno );\r
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos - 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->layer; layno++) {\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
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d\n",\r
+                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); \r
                                                                                        pack_nb++; \r
                                                                                }\r
                                                                        }\r
@@ -748,11 +744,9 @@ bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *inde
                } /* 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
        fclose(stream);\r
 \r
-       wxLogError(wxT("Generated index file %s"), index);\r
+       fprintf(stderr,"Generated index file %s\n", index);\r
 \r
        return true;\r
 }\r
index 70be1555f73e143e5a288d11b4a62ef0bc83a4d4..7328e8074225a037056712879d4b03e52aded821 100644 (file)
@@ -135,6 +135,7 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        unsigned char *src = NULL;\r
     unsigned char *ptr;\r
        int file_length;\r
+       opj_codestream_info_t cstr_info;  /* Codestream information structure */\r
 \r
        // destroy the image\r
     image->Destroy();\r
@@ -193,7 +194,7 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);\r
 \r
        /* decode the stream and fill the image structure */\r
-       opjimage = opj_decode(dinfo, cio);\r
+       opjimage = opj_decode(dinfo, cio, &cstr_info);\r
        if (!opjimage) {\r
 #ifndef __WXGTK__ \r
                wxMutexGuiEnter();\r
index 1cd7244faf7a3a8cda0fbe21ebaca11aede517ed..e2862916ad5dc8922e414c572fb7b5e9fd9be20d 100644 (file)
@@ -618,6 +618,7 @@ bool wxMJ2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
     unsigned char *ptr;\r
        int file_length, jp2c_point, jp2h_point;\r
        unsigned long int jp2hboxlen, jp2cboxlen;\r
+       opj_codestream_info_t cstr_info;  /* Codestream information structure */\r
 \r
        // destroy the image\r
     image->Destroy();\r
@@ -699,7 +700,7 @@ bool wxMJ2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        cio = opj_cio_open((opj_common_ptr)dinfo, src, my_jPheadSIZE + jp2hboxlen + jp2cboxlen);\r
 \r
        /* decode the stream and fill the image structure */\r
-       opjimage = opj_decode(dinfo, cio);\r
+       opjimage = opj_decode(dinfo, cio, &cstr_info);\r
        if (!opjimage) {\r
                wxMutexGuiEnter();\r
                wxLogError(wxT("MJ2: failed to decode image!"));\r
index eb559f3c9c98361bc5bced51e4fabc3f2f3869e8..576c0ee9ead6be2bcfa2a1b970aa1cc2ecc660aa 100644 (file)
@@ -1289,7 +1289,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                                /* we need to enable indexing */
                                if (!indexfilename) {
-                                       strncpy(parameters->index, JPWL_PRIVATEINDEX_NAME, sizeof(parameters->index)-1);
+                                       strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN);
                                }
 
                                /* search for different protection methods */
index f97331d4be7f7d62f37b66dbe66f28298fcda69f..7a307839976dbba24a4eac6bb7d7976f468948d1 100644 (file)
@@ -232,7 +232,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                        unsigned long int left_THmarks_len;\r
 \r
                        /******* sot_pos = j2k->cstr_info->tile[tileno].start_pos; */\r
-                       sot_pos = j2k->cstr_info->tile[tileno].tp_start_pos[tpno];\r
+                       sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos;\r
                        cio_seek(cio, sot_pos + 2); \r
                        sot_len = cio_read(cio, 2); /* SOT Len */\r
                        cio_skip(cio, 2);\r
@@ -240,7 +240,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                        Psot = cio_read(cio, 4); /* tile length */\r
 \r
                        /******* post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */\r
-                       post_sod_pos = j2k->cstr_info->tile[tileno].tp_end_header[tpno] + 1;\r
+                       post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1;\r
                        left_THmarks_len = post_sod_pos - sot_pos;\r
 \r
                        /* add all the lengths of the markers which are len-ready and stay within SOT and SOD */\r
@@ -282,7 +282,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                                                jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */\r
                                                jwmarker[jwmarker_num].esdmark = esd_mark; /* the EPB */\r
                                                /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */\r
-                                               jwmarker[jwmarker_num].pos = soc_pos + j2k->cstr_info->tile[tileno].tp_start_pos[tpno] + sot_len + 2; /* after SOT */\r
+                                               jwmarker[jwmarker_num].pos = soc_pos + j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */\r
                                                jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.2; /* not first at all! */\r
                                                jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */\r
                                                jwmarker[jwmarker_num].len_ready = true; /* ready, yet */\r
@@ -403,12 +403,12 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                        int sot_len, Psot, Psotp, mm, epb_index = 0, prot_len = 0;\r
                        unsigned long sot_pos, post_sod_pos;\r
                        unsigned long int left_THmarks_len, epbs_len = 0;\r
-                       int startpack = 0, stoppack = j2k->cstr_info->num;\r
+                       int startpack = 0, stoppack = j2k->cstr_info->packno;\r
                        int first_tp_pack, last_tp_pack;\r
                        jpwl_epb_ms_t *tph_epb = NULL;\r
 \r
                        /****** sot_pos = j2k->cstr_info->tile[tileno].start_pos; */\r
-                       sot_pos = j2k->cstr_info->tile[tileno].tp_start_pos[tpno];\r
+                       sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos;\r
                        cio_seek(cio, sot_pos + 2); \r
                        sot_len = cio_read(cio, 2); /* SOT Len */\r
                        cio_skip(cio, 2);\r
@@ -417,7 +417,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
 \r
                        /* a-priori length of the data dwelling between SOT and SOD */\r
                        /****** post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */\r
-                       post_sod_pos = j2k->cstr_info->tile[tileno].tp_end_header[tpno] + 1;\r
+                       post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1;\r
                        left_THmarks_len = post_sod_pos - (sot_pos + sot_len + 2);\r
 \r
                        /* add all the lengths of the JPWL markers which are len-ready and stay within SOT and SOD */\r
@@ -458,7 +458,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                                                jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */\r
                                                jwmarker[jwmarker_num].epbmark = epb_mark; /* the EPB */\r
                                                /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */\r
-                                               jwmarker[jwmarker_num].pos = soc_pos + j2k->cstr_info->tile[tileno].tp_start_pos[tpno] + sot_len + 2; /* after SOT */\r
+                                               jwmarker[jwmarker_num].pos = soc_pos + j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */\r
                                                jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos; /* first first first! */\r
                                                jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */\r
                                                jwmarker[jwmarker_num].len_ready = true; /* ready */\r
@@ -493,9 +493,9 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                        startpack = 0;\r
                        /* EPB MSs for UEP packet data protection in Tile Parts */\r
                        /****** for (packno = 0; packno < j2k->cstr_info->num; packno++) { */\r
-                       first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp_num[tpno - 1]) : 0;\r
-                       last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp_num[tpno] - 1;\r
-                       for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp_num[tpno]; packno++) {\r
+                       first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno - 1].tp_numpacks) : 0;\r
+                       last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks - 1;\r
+                       for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks; packno++) {\r
 \r
                                /******** if ((packspec < JPWL_MAX_NO_PACKSPECS) &&\r
                                        (j2k->cp->pprot_tileno[packspec] == tileno) && (j2k->cp->pprot_packno[packspec] == packno)) { */\r
@@ -547,7 +547,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                                                        &epb_index, /* pointer to EPB index */\r
                                                        pprot, /* protection type */\r
                                                        /****** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001, */ /* position */\r
-                                                       (double) (j2k->cstr_info->tile[tileno].tp_start_pos[tpno] + sot_len + 2) + 0.0001, /* position */\r
+                                                       (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */\r
                                                        tileno, /* number of tile */\r
                                                        0, /* length of pre-data */\r
                                                        prot_len /*4000*/ /* length of post-data */\r
@@ -607,7 +607,7 @@ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) {
                                                        &epb_index, /* pointer to EPB index */\r
                                                        pprot, /* protection type */\r
                                                        /***** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001,*/ /* position */\r
-                                                       (double) (j2k->cstr_info->tile[tileno].tp_start_pos[tpno] + sot_len + 2) + 0.0001, /* position */\r
+                                                       (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */\r
                                                        tileno, /* number of tile */\r
                                                        0, /* length of pre-data */\r
                                                        prot_len /*4000*/ /* length of post-data */\r
index 7ebe236f8811b7b5629ce5dbc3c8d11711971c37..7839249c2e42fa843c8ef39231e27b41f1c30da0 100644 (file)
@@ -32,6 +32,7 @@
 #ifdef USE_JPWL
 
 #include "../libopenjpeg/opj_includes.h"
+#include <limits.h>
 
 /** Minimum and maximum values for the double->pfp conversion */
 #define MIN_V1 0.0
@@ -143,6 +144,11 @@ int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
                        /*      (message word size)    *            (number of containable parity words)  */
                        max_postlen = k_post * (unsigned long int) floor((double) JPWL_MAXIMUM_EPB_ROOM / (double) (n_post - k_post));
 
+               /* null protection case */
+               /* the max post length can be as large as the LDPepb field can host */
+               if (hprot == 0)
+                       max_postlen = INT_MAX;
+               
                /* length to use */
                dL4 = min(max_postlen, post_len);
 
@@ -651,7 +657,7 @@ bool jpwl_correct(opj_j2k_t *j2k) {
        j2k->state = J2K_STATE_MHSOC;
 
        /* cycle all over the markers */
-       while (cio_tell(cio) < cio->length) {
+       while ((unsigned int) cio_tell(cio) < cio->length) {
 
                /* read the marker */
                mark_pos = cio_tell(cio);
@@ -1225,7 +1231,7 @@ jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp, unsigned char addrm, un
                /* auto sense address size */
                if (ad_size == 0)
                        /* if there are more than 2^16 - 1 packets, switch to 4 bytes */
-                       ad_size = (j2k->cstr_info->num > 65535) ? 4 : 2;
+                       ad_size = (j2k->cstr_info->packno > 65535) ? 4 : 2;
                esd->sensval_size = ad_size + ad_size + se_size; 
                break;
 
@@ -1246,17 +1252,17 @@ jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp, unsigned char addrm, un
                /* just based on the portions of a codestream */
                case (0):
                        /* MH + no. of THs + no. of packets */
-                       svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) * (1 + j2k->cstr_info->num);
+                       svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) * (1 + j2k->cstr_info->packno);
                        break;
 
                /* all the ones that are based on the packets */
                default:
                        if (tileno < 0)
                                /* MH: all the packets and all the tiles info is written */
-                               svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->num;
+                               svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->packno;
                        else
                                /* TPH: only that tile info is written */
-                               svalnum = j2k->cstr_info->num;
+                               svalnum = j2k->cstr_info->packno;
                        break;
 
                }
@@ -1356,9 +1362,9 @@ bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) {
                buf += 7;
 
        /* let's fill the data fields */
-       for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->num * esd->tileno); vv < esd->svalnum; vv++) {
+       for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->packno * esd->tileno); vv < esd->svalnum; vv++) {
 
-               int thistile = vv / j2k->cstr_info->num, thispacket = vv % j2k->cstr_info->num;
+               int thistile = vv / j2k->cstr_info->packno, thispacket = vv % j2k->cstr_info->packno;
 
                /* skip for the hack some lines below */
                if (thistile == j2k->cstr_info->tw * j2k->cstr_info->th)
@@ -1367,7 +1373,7 @@ bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) {
                /* starting tile distortion */
                if (thispacket == 0) {
                        TSE = j2k->cstr_info->tile[thistile].distotile;
-                       oldMSE = TSE / j2k->cstr_info->tile[thistile].nbpix;
+                       oldMSE = TSE / j2k->cstr_info->tile[thistile].numpix;
                        oldPSNR = 10.0 * log10(Omax2 / oldMSE);
                }
 
@@ -1375,7 +1381,7 @@ bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) {
                TSE -= j2k->cstr_info->tile[thistile].packet[thispacket].disto;
 
                /* MSE */
-               MSE = TSE / j2k->cstr_info->tile[thistile].nbpix;
+               MSE = TSE / j2k->cstr_info->tile[thistile].numpix;
 
                /* PSNR */
                PSNR = 10.0 * log10(Omax2 / MSE);
@@ -1484,7 +1490,7 @@ bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) {
                        else
                                /* packet: first is most important, and then in decreasing order
                                down to the last, which counts for 1 */
-                               dvalue = jpwl_pfp_to_double((unsigned short) (j2k->cstr_info->num - thispacket), esd->se_size);
+                               dvalue = jpwl_pfp_to_double((unsigned short) (j2k->cstr_info->packno - thispacket), esd->se_size);
                        break;
 
                /* MSE */
@@ -1658,7 +1664,7 @@ bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num)
        unsigned long int addlen;
 
        opj_codestream_info_t *info = j2k->cstr_info;
-       int tileno, tpno, packno, numtiles = info->th * info->tw, numpacks = info->num;
+       int tileno, tpno, packno, numtiles = info->th * info->tw, numpacks = info->packno;
 
        if (!j2k || !jwmarker ) {
                opj_event_msg(j2k->cinfo, EVT_ERROR, "J2K handle or JPWL markers list badly allocated\n");
@@ -1709,23 +1715,23 @@ bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num)
                        /* start_pos: increment with markers before SOT */
                        addlen = 0;
                        for (mm = 0; mm < jwmarker_num; mm++)
-                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp_start_pos[tpno])
+                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_start_pos)
                                        addlen += jwmarker[mm].len + 2;
-                       info->tile[tileno].tp_start_pos[tpno] += addlen;
+                       info->tile[tileno].tp[tpno].tp_start_pos += addlen;
 
                        /* end_header: increment with markers before of it */
                        addlen = 0;
                        for (mm = 0; mm < jwmarker_num; mm++)
-                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp_end_header[tpno])
+                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_header)
                                        addlen += jwmarker[mm].len + 2;
-                       info->tile[tileno].tp_end_header[tpno] += addlen;
+                       info->tile[tileno].tp[tpno].tp_end_header += addlen;
 
                        /* end_pos: increment with markers before the end of this tile part */
                        addlen = 0;
                        for (mm = 0; mm < jwmarker_num; mm++)
-                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp_end_pos[tpno])
+                               if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_pos)
                                        addlen += jwmarker[mm].len + 2;
-                       info->tile[tileno].tp_end_pos[tpno] += addlen;
+                       info->tile[tileno].tp[tpno].tp_end_pos += addlen;
 
                }