From 1200dd871a3f39d8b7367f3bcbeb2d144c38369a Mon Sep 17 00:00:00 2001 From: Francois-Olivier Devaux Date: Thu, 10 May 2007 14:21:09 +0000 Subject: [PATCH] MJ2 codec updated from LibOpenJPEG version 0.97 to LibOpenJPEG version 1. Hence, the MJ2 codec will now take advantage of all the improvements and optimizations done on the LibOpenJPEG library. --- libopenjpeg/jp2.c | 17 +- libopenjpeg/jp2.h | 13 + mj2/{MJ2_codec => }/MJ2_Extractor.dsp | 120 +- mj2/MJ2_Extractor.dsw | 44 + mj2/{MJ2_codec => }/MJ2_Wrapper.dsp | 125 +- mj2/MJ2_Wrapper.dsw | 44 + mj2/MJ2_codec/Makefile | 79 - mj2/MJ2_codec/extract_j2k_from_mj2.c | 85 - mj2/MJ2_codec/frames_to_mj2.c | 997 ------ mj2/MJ2_codec/mj2.c | 2798 ---------------- mj2/MJ2_codec/mj2.h | 201 -- mj2/MJ2_codec/mj2_convert.h | 16 - mj2/MJ2_codec/mj2_to_frames.c | 134 - mj2/MJ2_codec/wrap_j2k_in_mj2.c | 291 -- mj2/Makefile | 20 + mj2/{MJ2_codec => }/compat/getopt.c | 0 mj2/{MJ2_codec => }/compat/getopt.h | 0 mj2/extract_j2k_from_mj2.c | 142 + mj2/frames_to_mj2.c | 811 +++++ mj2/{MJ2_codec => }/frames_to_mj2.dsp | 104 +- mj2/frames_to_mj2.dsw | 44 + mj2/libopenjpeg_097/bio.c | 194 -- mj2/libopenjpeg_097/bio.h | 75 - mj2/libopenjpeg_097/cio.c | 179 - mj2/libopenjpeg_097/cio.h | 107 - mj2/libopenjpeg_097/dwt.c | 540 --- mj2/libopenjpeg_097/dwt.h | 81 - mj2/libopenjpeg_097/fix.c | 63 - mj2/libopenjpeg_097/fix.h | 33 - mj2/libopenjpeg_097/int.c | 115 - mj2/libopenjpeg_097/int.h | 88 - mj2/libopenjpeg_097/j2k.c | 1602 --------- mj2/libopenjpeg_097/j2k.h | 241 -- mj2/libopenjpeg_097/jp2.c | 529 --- mj2/libopenjpeg_097/jp2.h | 118 - mj2/libopenjpeg_097/jpt.c | 163 - mj2/libopenjpeg_097/jpt.h | 56 - mj2/libopenjpeg_097/mct.c | 134 - mj2/libopenjpeg_097/mct.h | 74 - mj2/libopenjpeg_097/mqc.c | 591 ---- mj2/libopenjpeg_097/mqc.h | 127 - mj2/libopenjpeg_097/openjpeg.h | 49 - mj2/libopenjpeg_097/pi.c | 557 ---- mj2/libopenjpeg_097/pi.h | 72 - mj2/libopenjpeg_097/raw.c | 81 - mj2/libopenjpeg_097/raw.h | 48 - mj2/libopenjpeg_097/t1.c | 1117 ------- mj2/libopenjpeg_097/t1.h | 52 - mj2/libopenjpeg_097/t2.c | 707 ---- mj2/libopenjpeg_097/t2.h | 64 - mj2/libopenjpeg_097/tcd.c | 1656 ---------- mj2/libopenjpeg_097/tcd.h | 183 -- mj2/libopenjpeg_097/tgt.c | 225 -- mj2/libopenjpeg_097/tgt.h | 87 - mj2/{MJ2_codec => }/meta_out.c | 296 +- mj2/{MJ2_codec => }/meta_out.h | 2 +- mj2/mj2.c | 2917 +++++++++++++++++ mj2/mj2.h | 391 +++ mj2/{MJ2_codec => }/mj2_convert.c | 209 +- mj2/mj2_convert.h | 45 + mj2/mj2_to_frames.c | 216 ++ mj2/{MJ2_codec => }/mj2_to_frames.dsp | 149 +- mj2/mj2_to_frames.dsw | 44 + mj2/{MJ2_codec => }/mj2_to_metadata.c | 89 +- mj2/{MJ2_codec => }/mj2_to_metadata.dsp | 148 +- mj2/mj2_to_metadata.dsw | 44 + mj2/{MJ2_codec => }/mj2_to_metadata.dtd | 0 mj2/{MJ2_codec => }/mj2_to_metadata.h | 0 mj2/{MJ2_codec => }/mj2_to_metadata.vcproj | 0 mj2/{MJ2_codec => }/mj2_to_metadata_Notes.doc | Bin mj2/{MJ2_codec => }/readme.txt | 0 mj2/wrap_j2k_in_mj2.c | 337 ++ 72 files changed, 5656 insertions(+), 15324 deletions(-) rename mj2/{MJ2_codec => }/MJ2_Extractor.dsp (68%) create mode 100644 mj2/MJ2_Extractor.dsw rename mj2/{MJ2_codec => }/MJ2_Wrapper.dsp (70%) create mode 100644 mj2/MJ2_Wrapper.dsw delete mode 100644 mj2/MJ2_codec/Makefile delete mode 100644 mj2/MJ2_codec/extract_j2k_from_mj2.c delete mode 100644 mj2/MJ2_codec/frames_to_mj2.c delete mode 100644 mj2/MJ2_codec/mj2.c delete mode 100644 mj2/MJ2_codec/mj2.h delete mode 100644 mj2/MJ2_codec/mj2_convert.h delete mode 100644 mj2/MJ2_codec/mj2_to_frames.c delete mode 100644 mj2/MJ2_codec/wrap_j2k_in_mj2.c create mode 100644 mj2/Makefile rename mj2/{MJ2_codec => }/compat/getopt.c (100%) rename mj2/{MJ2_codec => }/compat/getopt.h (100%) create mode 100644 mj2/extract_j2k_from_mj2.c create mode 100644 mj2/frames_to_mj2.c rename mj2/{MJ2_codec => }/frames_to_mj2.dsp (70%) create mode 100644 mj2/frames_to_mj2.dsw delete mode 100644 mj2/libopenjpeg_097/bio.c delete mode 100644 mj2/libopenjpeg_097/bio.h delete mode 100644 mj2/libopenjpeg_097/cio.c delete mode 100644 mj2/libopenjpeg_097/cio.h delete mode 100644 mj2/libopenjpeg_097/dwt.c delete mode 100644 mj2/libopenjpeg_097/dwt.h delete mode 100644 mj2/libopenjpeg_097/fix.c delete mode 100644 mj2/libopenjpeg_097/fix.h delete mode 100644 mj2/libopenjpeg_097/int.c delete mode 100644 mj2/libopenjpeg_097/int.h delete mode 100644 mj2/libopenjpeg_097/j2k.c delete mode 100644 mj2/libopenjpeg_097/j2k.h delete mode 100644 mj2/libopenjpeg_097/jp2.c delete mode 100644 mj2/libopenjpeg_097/jp2.h delete mode 100644 mj2/libopenjpeg_097/jpt.c delete mode 100644 mj2/libopenjpeg_097/jpt.h delete mode 100644 mj2/libopenjpeg_097/mct.c delete mode 100644 mj2/libopenjpeg_097/mct.h delete mode 100644 mj2/libopenjpeg_097/mqc.c delete mode 100644 mj2/libopenjpeg_097/mqc.h delete mode 100644 mj2/libopenjpeg_097/openjpeg.h delete mode 100644 mj2/libopenjpeg_097/pi.c delete mode 100644 mj2/libopenjpeg_097/pi.h delete mode 100644 mj2/libopenjpeg_097/raw.c delete mode 100644 mj2/libopenjpeg_097/raw.h delete mode 100644 mj2/libopenjpeg_097/t1.c delete mode 100644 mj2/libopenjpeg_097/t1.h delete mode 100644 mj2/libopenjpeg_097/t2.c delete mode 100644 mj2/libopenjpeg_097/t2.h delete mode 100644 mj2/libopenjpeg_097/tcd.c delete mode 100644 mj2/libopenjpeg_097/tcd.h delete mode 100644 mj2/libopenjpeg_097/tgt.c delete mode 100644 mj2/libopenjpeg_097/tgt.h rename mj2/{MJ2_codec => }/meta_out.c (92%) rename mj2/{MJ2_codec => }/meta_out.h (68%) create mode 100644 mj2/mj2.c create mode 100644 mj2/mj2.h rename mj2/{MJ2_codec => }/mj2_convert.c (61%) create mode 100644 mj2/mj2_convert.h create mode 100644 mj2/mj2_to_frames.c rename mj2/{MJ2_codec => }/mj2_to_frames.dsp (61%) create mode 100644 mj2/mj2_to_frames.dsw rename mj2/{MJ2_codec => }/mj2_to_metadata.c (83%) rename mj2/{MJ2_codec => }/mj2_to_metadata.dsp (60%) create mode 100644 mj2/mj2_to_metadata.dsw rename mj2/{MJ2_codec => }/mj2_to_metadata.dtd (100%) rename mj2/{MJ2_codec => }/mj2_to_metadata.h (100%) rename mj2/{MJ2_codec => }/mj2_to_metadata.vcproj (100%) rename mj2/{MJ2_codec => }/mj2_to_metadata_Notes.doc (100%) rename mj2/{MJ2_codec => }/readme.txt (100%) create mode 100644 mj2/wrap_j2k_in_mj2.c diff --git a/libopenjpeg/jp2.c b/libopenjpeg/jp2.c index a058b1b5..d102349d 100644 --- a/libopenjpeg/jp2.c +++ b/libopenjpeg/jp2.c @@ -59,19 +59,6 @@ static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio); static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio); /** -Write the JP2H box - JP2 Header box -@param jp2 JP2 handle -@param cio Output buffer stream -*/ -static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Read the JP2H box - JP2 Header box -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); -/** Write the FTYP box - File type box @param jp2 JP2 handle @param cio Output buffer stream @@ -308,7 +295,7 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio) { return true; } -static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; box.init_pos = cio_tell(cio); @@ -328,7 +315,7 @@ static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { cio_seek(cio, box.init_pos + box.length); } -static bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; int skip_len; diff --git a/libopenjpeg/jp2.h b/libopenjpeg/jp2.h index 6448db4b..61fc1e42 100644 --- a/libopenjpeg/jp2.h +++ b/libopenjpeg/jp2.h @@ -102,6 +102,19 @@ typedef struct opj_jp2_box { /*@{*/ /* ----------------------------------------------------------------------- */ /** +Write the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Output buffer stream +*/ +void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); +/** +Read the JP2H box - JP2 Header box (used in MJ2) +@param jp2 JP2 handle +@param cio Input buffer stream +@return Returns true if successful, returns false otherwise +*/ +bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); +/** Creates a JP2 decompression structure @param cinfo Codec context info @return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise diff --git a/mj2/MJ2_codec/MJ2_Extractor.dsp b/mj2/MJ2_Extractor.dsp similarity index 68% rename from mj2/MJ2_codec/MJ2_Extractor.dsp rename to mj2/MJ2_Extractor.dsp index 0ce19270..b4870fde 100644 --- a/mj2/MJ2_codec/MJ2_Extractor.dsp +++ b/mj2/MJ2_Extractor.dsp @@ -39,9 +39,10 @@ RSC=rc.exe # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg_097" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -49,7 +50,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmt" +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "MJ2_Extractor - Win32 Debug" @@ -62,9 +64,10 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "MJ2_Extractor___Win32_Debug" # PROP Intermediate_Dir "MJ2_Extractor___Win32_Debug" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg_097" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe @@ -72,7 +75,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmt" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none !ENDIF @@ -85,18 +89,10 @@ LINK32=link.exe # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=..\libopenjpeg_097\cio.c -# End Source File -# Begin Source File - SOURCE=.\extract_j2k_from_mj2.c # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\jp2.c -# End Source File -# Begin Source File - SOURCE=.\mj2.c # End Source File # End Group @@ -105,24 +101,96 @@ SOURCE=.\mj2.c # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=..\libopenjpeg_097\cio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.h -# End Source File -# Begin Source File - SOURCE=.\mj2.h # End Source File # End Group -# Begin Group "Resource Files" +# Begin Group "OpenJPEG Header Files" -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\libopenjpeg\bio.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\cio.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\dwt.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\event.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\fix.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\image.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\int.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\j2k.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\j2k_lib.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\jp2.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\jpt.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\mct.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\mqc.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\openjpeg.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\opj_includes.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\pi.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\raw.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\t1.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\t2.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\tcd.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\tgt.h +# End Source File # End Group # End Target # End Project diff --git a/mj2/MJ2_Extractor.dsw b/mj2/MJ2_Extractor.dsw new file mode 100644 index 00000000..1ee72c6c --- /dev/null +++ b/mj2/MJ2_Extractor.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LibOpenJPEG"="..\LibOpenJPEG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MJ2_Extractor"=".\MJ2_Extractor.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name LibOpenJPEG + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/mj2/MJ2_codec/MJ2_Wrapper.dsp b/mj2/MJ2_Wrapper.dsp similarity index 70% rename from mj2/MJ2_codec/MJ2_Wrapper.dsp rename to mj2/MJ2_Wrapper.dsp index 4b363451..724f6088 100644 --- a/mj2/MJ2_codec/MJ2_Wrapper.dsp +++ b/mj2/MJ2_Wrapper.dsp @@ -39,9 +39,10 @@ RSC=rc.exe # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg_097" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -62,9 +63,10 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "MJ2_Wrapper___Win32_Debug" # PROP Intermediate_Dir "MJ2_Wrapper___Win32_Debug" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg_097" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe @@ -72,7 +74,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmt" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none !ENDIF @@ -85,18 +88,6 @@ LINK32=link.exe # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File -SOURCE=..\libopenjpeg_097\cio.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.c -# End Source File -# Begin Source File - SOURCE=.\mj2.c # End Source File # Begin Source File @@ -109,28 +100,96 @@ SOURCE=.\wrap_j2k_in_mj2.c # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File -SOURCE=..\libopenjpeg_097\cio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.h -# End Source File -# Begin Source File - SOURCE=.\mj2.h # End Source File # End Group -# Begin Group "Resource Files" +# Begin Group "OpenJPEG Header Files" -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\libopenjpeg\bio.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\cio.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\dwt.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\event.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\fix.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\image.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\int.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\j2k.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\j2k_lib.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\jp2.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\jpt.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\mct.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\mqc.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\openjpeg.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\opj_includes.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\pi.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\raw.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\t1.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\t2.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\tcd.h +# End Source File +# Begin Source File + +SOURCE=..\libopenjpeg\tgt.h +# End Source File # End Group # End Target # End Project diff --git a/mj2/MJ2_Wrapper.dsw b/mj2/MJ2_Wrapper.dsw new file mode 100644 index 00000000..ae5a7011 --- /dev/null +++ b/mj2/MJ2_Wrapper.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LibOpenJPEG"="..\LibOpenJPEG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MJ2_Wrapper"=".\MJ2_Wrapper.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name LibOpenJPEG + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/mj2/MJ2_codec/Makefile b/mj2/MJ2_codec/Makefile deleted file mode 100644 index 04c59fee..00000000 --- a/mj2/MJ2_codec/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Valentin Mesaros (Octalis | DICE/UCL Belgium) -# 19 April 2005 -# -# Makefile for mj2 source files (frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2, wrap_j2k_in_mj2) -# - -INCLUDES = -Imj2 \ - -I../libopenjpeg_097 - -C_OPT = -Wall -CFLAGS = $(INCLUDES) $(C_OPT) - -CC = gcc - -OBJ_MJ2_DIR = obj -BIN_MJ2_DIR = bin -LIB_OPENJPEG_DIR = ../libopenjpeg_097/lib -LIB_OPENJPEG = $(LIB_OPENJPEG_DIR)/libopenjpeg_097.a - -all: $(OBJ_MJ2_DIR) $(BIN_MJ2_DIR) \ - $(BIN_MJ2_DIR)/frames_to_mj2 \ - $(BIN_MJ2_DIR)/mj2_to_frames \ - $(BIN_MJ2_DIR)/extract_j2k_from_mj2 \ - $(BIN_MJ2_DIR)/wrap_j2k_in_mj2 - - -$(OBJ_MJ2_DIR): - mkdir $(OBJ_MJ2_DIR) - -$(BIN_MJ2_DIR): - mkdir $(BIN_MJ2_DIR) - -$(OBJ_MJ2_DIR)/%.o: - $(CC) -c $(CFLAGS) -o $@ $< - -$(OBJ_MJ2_DIR)/frames_to_mj2.o: frames_to_mj2.c -$(OBJ_MJ2_DIR)/mj2_to_frames.o: mj2_to_frames.c -$(OBJ_MJ2_DIR)/mj2.o: mj2.c -$(OBJ_MJ2_DIR)/mj2_convert.o: mj2_convert.c -$(OBJ_MJ2_DIR)/extract_j2k_from_mj2.o: extract_j2k_from_mj2.c -$(OBJ_MJ2_DIR)/wrap_j2k_in_mj2.o: wrap_j2k_in_mj2.c - - - -MJ2_OBJS = $(addprefix $(OBJ_MJ2_DIR)/, mj2.o mj2_convert.o) - - -$(BIN_MJ2_DIR)/frames_to_mj2: $(OBJ_MJ2_DIR)/frames_to_mj2.o $(MJ2_OBJS) $(LIB_OPENJPEG) - $(CC) $(CFLAGS) \ - -o $(BIN_MJ2_DIR)/frames_to_mj2 \ - $(MJ2_OBJS) $(OBJ_MJ2_DIR)/frames_to_mj2.o \ - $(LIB_OPENJPEG) \ - -lm - - -$(BIN_MJ2_DIR)/mj2_to_frames: $(OBJ_MJ2_DIR)/mj2_to_frames.o $(MJ2_OBJS) $(LIB_OPENJPEG) - $(CC) $(CFLAGS) \ - -o $(BIN_MJ2_DIR)/mj2_to_frames \ - $(MJ2_OBJS) $(OBJ_MJ2_DIR)/mj2_to_frames.o \ - $(LIB_OPENJPEG) \ - -lm - - -$(BIN_MJ2_DIR)/extract_j2k_from_mj2: $(OBJ_MJ2_DIR)/extract_j2k_from_mj2.o $(MJ2_OBJS) $(LIB_OPENJPEG) - $(CC) $(CFLAGS) \ - -o $(BIN_MJ2_DIR)/extract_j2k_from_mj2 \ - $(MJ2_OBJS) $(OBJ_MJ2_DIR)/extract_j2k_from_mj2.o \ - $(LIB_OPENJPEG) \ - -lm -$(BIN_MJ2_DIR)/wrap_j2k_in_mj2: $(OBJ_MJ2_DIR)/wrap_j2k_in_mj2.o $(MJ2_OBJS) $(LIB_OPENJPEG) - $(CC) $(CFLAGS) \ - -o $(BIN_MJ2_DIR)/wrap_j2k_in_mj2 \ - $(MJ2_OBJS) $(OBJ_MJ2_DIR)/wrap_j2k_in_mj2.o \ - $(LIB_OPENJPEG) \ - -lm - -clean: - rm -f $(BIN_MJ2_DIR)/* $(OBJ_MJ2_DIR)/* \ No newline at end of file diff --git a/mj2/MJ2_codec/extract_j2k_from_mj2.c b/mj2/MJ2_codec/extract_j2k_from_mj2.c deleted file mode 100644 index 01ba6ebd..00000000 --- a/mj2/MJ2_codec/extract_j2k_from_mj2.c +++ /dev/null @@ -1,85 +0,0 @@ -#include -#ifdef WIN32 -#include -#else -#include -#endif -#include - -#include "mj2.h" - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM - -jmp_buf j2k_error; - -int main(int argc, char *argv[]) { - - int tnum; - unsigned int snum; - mj2_movie_t movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[50]; - - if (argc != 3) { - printf("Bad syntax: Usage: MJ2_extractor mj2filename output_location\n"); - printf("Example: MJ2_extractor foreman.mj2 output/foreman\n"); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - if (mj2_read_struct(file, &movie)) // Creating the movie structure - return 1; - - // Decode first video track - tnum = 0; - while (movie.tk[tnum].track_type != 0) - tnum ++; - - track = &movie.tk[tnum]; - - fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); - - for (snum=0; snum < track->num_samples; snum++) - { - sample = &track->sample[snum]; - frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker - fseek(file,sample->offset+8,SEEK_SET); - fread(frame_codestream,sample->sample_size-8,1, file); // Assuming that jp and ftyp markers size do - - sprintf(outfilename,"%s_%d.j2k",argv[2],snum); - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n",outfilename); - return 1; - } - fwrite(frame_codestream,sample->sample_size-8,1,outfile); - fclose(outfile); - free(frame_codestream); - } - fclose(file); - fprintf(stdout, "%d frames correctly extracted\n", snum); - mj2_memory_free(&movie); - - //MEMORY LEAK - #ifdef _DEBUG - _CrtDumpMemoryLeaks(); - #endif - //MEM - - return 0; -} \ No newline at end of file diff --git a/mj2/MJ2_codec/frames_to_mj2.c b/mj2/MJ2_codec/frames_to_mj2.c deleted file mode 100644 index efbf218b..00000000 --- a/mj2/MJ2_codec/frames_to_mj2.c +++ /dev/null @@ -1,997 +0,0 @@ -/* -* Copyright (c) 2003-2004, François-Olivier Devaux -* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include -#include -#ifndef DONT_HAVE_GETOPT -#include -#else -#include "compat/getopt.h" -#endif - -#include "mj2_convert.h" - -#define MJ2_MDAT 0x6d646174 -#define JP2_JP2C 0x6a703263 - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM - -jmp_buf j2k_error; - -void help_display() -{ - fprintf(stdout,"HELP\n----\n\n"); - fprintf(stdout,"- the -h option displays this help information on screen\n\n"); - - - fprintf(stdout,"List of parameters for the MJ2 encoder:\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"REMARKS:\n"); - fprintf(stdout,"---------\n"); - fprintf(stdout,"\n"); - fprintf - (stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); - fprintf - (stdout,"COD and QCD never appear in the tile_header.\n"); - fprintf(stdout,"\n"); - fprintf - (stdout,"- This coder can encode a mega image, a test was made on a 24000x24000 pixels \n"); - fprintf - (stdout,"color image. You need enough disk space memory (twice the original) to encode \n"); - fprintf - (stdout,"the image,i.e. for a 1.5 GB image you need a minimum of 3GB of disk memory)\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"By default:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout," * Lossless\n"); - fprintf(stdout," * 1 tile\n"); - fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); - fprintf(stdout," * Size of code-block : 64 x 64\n"); - fprintf(stdout," * Number of resolutions: 6\n"); - fprintf(stdout," * No SOP marker in the codestream\n"); - fprintf(stdout," * No EPH marker in the codestream\n"); - fprintf(stdout," * No sub-sampling in x or y direction\n"); - fprintf(stdout," * No mode switch activated\n"); - fprintf(stdout," * Progression order: LRCP\n"); - fprintf(stdout," * No index file\n"); - fprintf(stdout," * No ROI upshifted\n"); - fprintf(stdout," * No offset of the origin of the image\n"); - fprintf(stdout," * No offset of the origin of the tiles\n"); - fprintf(stdout," * Reversible DWT 5-3\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Parameters:\n"); - fprintf(stdout,"------------\n"); - fprintf(stdout,"\n"); - fprintf - (stdout,"Required Parameters (except with -h):\n"); - fprintf - (stdout,"-i : source file (-i source.yuv) \n"); - fprintf - (stdout,"-o : destination file (-o dest.mj2) \n"); - fprintf - (stdout,"Optional Parameters:\n"); - fprintf(stdout,"-h : display the help information \n"); - fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); - fprintf(stdout," - The rate specified for each quality level is the desired \n"); - fprintf(stdout," compression factor.\n"); - fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); - fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); - fprintf(stdout," (options -r and -q cannot be used together)\n "); - - fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); - - fprintf(stdout," (options -r and -q cannot be used together)\n "); - - fprintf(stdout,"-n : number of resolutions (-n 3) \n"); - fprintf(stdout,"-b : size of code block (-b 32,32) \n"); - fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); - fprintf(stdout,"-t : size of tile (-t 512,512) \n"); - fprintf - (stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); - fprintf - (stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); - fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); - fprintf - (stdout,"-SOP : write SOP marker before each packet \n"); - fprintf - (stdout,"-EPH : write EPH marker after each header packet \n"); - fprintf - (stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); - fprintf - (stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); - fprintf - (stdout," Indicate multiple modes by adding their values. \n"); - fprintf - (stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); - fprintf - (stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); - fprintf - (stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); - fprintf - (stdout," for component c=%%d [%%d = 0,1,2]\n"); - fprintf - (stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); - fprintf - (stdout,"-d : offset of the origin of the image (-d 150,300) \n"); - fprintf - (stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); - fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); - fprintf(stdout,"-W : image width, height and the dx and dy subsampling \n"); - fprintf(stdout," of the Cb and Cr components for YUV files \n"); - fprintf(stdout," (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); - fprintf(stdout,"-F : video frame rate (set to 25 by default)\n"); - - fprintf(stdout,"\n"); - fprintf(stdout,"IMPORTANT:\n"); - fprintf(stdout,"-----------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"The index file has the structure below:\n"); - fprintf(stdout,"---------------------------------------\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"Image_height Image_width\n"); - fprintf(stdout,"progression order\n"); - fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); - fprintf(stdout,"Components_nb\n"); - fprintf(stdout,"Layers_nb\n"); - fprintf(stdout,"decomposition_levels\n"); - fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); - fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); - fprintf(stdout,"Main_header_end_position\n"); - fprintf(stdout,"Codestream_size\n"); - fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n"); - fprintf(stdout,"Tile_1 '' '' '' '' '' ''\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tile_Nt '' '' '' '' '' ''\n"); - fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); - fprintf(stdout,"...\n"); - fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); - - fprintf(stdout,"MaxDisto\n"); - - fprintf(stdout,"TotalDisto\n\n"); -} - -int give_progression(char progression[4]) -{ - if (progression[0] == 'L' && progression[1] == 'R' - && progression[2] == 'C' && progression[3] == 'P') { - return 0; - } else { - if (progression[0] == 'R' && progression[1] == 'L' - && progression[2] == 'C' && progression[3] == 'P') { - return 1; - } else { - if (progression[0] == 'R' && progression[1] == 'P' - && progression[2] == 'C' && progression[3] == 'L') { - return 2; - } else { - if (progression[0] == 'P' && progression[1] == 'C' - && progression[2] == 'R' && progression[3] == 'L') { - return 3; - } else { - if (progression[0] == 'C' && progression[1] == 'P' - && progression[2] == 'R' && progression[3] == 'L') { - return 4; - } else { - return -1; - } - } - } - } - } -} - -double dwt_norms_97[4][10] = { - {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} -}; - -int floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} - -void encode_stepsize(int stepsize, int numbps, int *expn, int *mant) -{ - int p, n; - p = floorlog2(stepsize) - 13; - n = 11 - floorlog2(stepsize); - *mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; - *expn = numbps - p; -} - -void calc_explicit_stepsizes(j2k_tccp_t * tccp, int prec) -{ - int numbands, bandno; - numbands = 3 * tccp->numresolutions - 2; - for (bandno = 0; bandno < numbands; bandno++) { - double stepsize; - - int resno, level, orient, gain; - resno = bandno == 0 ? 0 : (bandno - 1) / 3 + 1; - orient = bandno == 0 ? 0 : (bandno - 1) % 3 + 1; - level = tccp->numresolutions - 1 - resno; - gain = - tccp->qmfbid == 0 ? 0 : (orient == - 0 ? 0 : (orient == 1 - || orient == 2 ? 1 : 2)); - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - stepsize = 1.0; - } else { - double norm = dwt_norms_97[orient][level]; - stepsize = (1 << (gain + 1)) / norm; - } - encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, - &tccp->stepsizes[bandno].expn, - &tccp->stepsizes[bandno].mant); - } -} - -int main(int argc, char **argv) -{ - int NumResolution, numD_min; /* NumResolution : number of resolution */ - int Tile_arg; /* Tile_arg = 0 (not in argument) ou = 1 (in argument) */ - int CSty; /* CSty : coding style */ - int Prog_order; /* progression order (default LRCP) */ - char progression[4]; - int numpocs, numpocs_tile; /* Number of progression order change (POC) default 0 */ - int prcw_init[J2K_MAXRLVLS]; /* Initialisation Precinct width */ - int prch_init[J2K_MAXRLVLS]; /* Initialisation Precinct height */ - //int prcw_init, prch_init; /* Initialisation precincts' size */ - int cblockw_init, cblockh_init; /* Initialisation codeblocks' size */ - int mode, value; /* Mode switch (cblk_style) */ - int subsampling_dx, subsampling_dy; /* subsampling value for dx and dy */ - int ROI_compno, ROI_shift; /* region of interrest */ - int Dim[2]; /* portion of the image coded */ - int TX0, TY0; /* tile off-set */ - mj2_movie_t movie; - j2k_cp_t cp, cp_init; /* cp_init is used to initialise in multiple tiles */ - j2k_tcp_t *tcp, *tcp_init; /* tcp_init is used to initialise in multiple tile */ - j2k_poc_t POC[32]; /* POC : used in case of Progression order change */ - j2k_poc_t *tcp_poc; - j2k_tccp_t *tccp; - int i, tileno, l, j; - char *infile = 0; - char *outfile = 0; - char *index = 0; - char *s, S1, S2, S3; - char *buf; - int ir = 0; - int res_spec = 0; /* For various precinct sizes specification */ - char sep; - int w; /* Width of YUV file */ - int h; /* Height of YUV file */ - int CbCr_subsampling_dx; /* Sample rate of YUV 4:4:4 4:2:2 or 4:2:0 */ - int CbCr_subsampling_dy; /* Sample rate of YUV 4:4:4 4:2:2 or 4:2:0 */ - int frame_rate; /* Video Frame Rate */ - int numcomps; /* In YUV files, numcomps always considered as 3 */ - int prec; /* In YUV files, precision always considered as 8 */ - int x1, y1, len, jp2c_initpos, m, k, pos; - long mdat_initpos, offset; - FILE *mj2file, *yuvfile; - unsigned int sampleno; - j2k_image_t img; - - /* default value */ - /* ------------- */ - NumResolution = 6; - CSty = 0; - cblockw_init = 64; - cblockh_init = 64; - cp.tw = 1; - cp.th = 1; - cp.index_on = 0; - Prog_order = 0; - numpocs = 0; - mode = 0; - subsampling_dx = 1; - subsampling_dy = 1; - ROI_compno = -1; /* no ROI */ - ROI_shift = 0; - Dim[0] = 0; - Dim[1] = 0; - TX0 = 0; - TY0 = 0; - cp.comment = NULL; - cp.disto_alloc = 0; - cp.fixed_alloc = 0; - cp.fixed_quality = 0; //add fixed_quality - w = 352; // CIF default value - h = 288; // CIF default value - CbCr_subsampling_dx = 2; // CIF default value - CbCr_subsampling_dy = 2; // CIF default value - frame_rate = 25; - - - Tile_arg = 0; - cp_init.tcps = (j2k_tcp_t *) malloc(sizeof(j2k_tcp_t)); /* initialisation if only one tile */ - tcp_init = &cp_init.tcps[0]; - tcp_init->numlayers = 0; - - cp.intermed_file = 0; // Don't store each tile in a file during processing - - while (1) { - int c = getopt(argc, argv, - "i:o:r:q:f:t:n:c:b:x:p:s:d:h:P:S:E:M:R:T:C:I:W:F:"); - if (c == -1) - break; - switch (c) { - case 'i': /* IN fill */ - infile = optarg; - s = optarg; - while (*s) { - s++; - } - s--; - S3 = *s; - s--; - S2 = *s; - s--; - S1 = *s; - - if ((S1 == 'y' && S2 == 'u' && S3 == 'v') - || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { - cp.decod_format = YUV_DFMT; - break; - } - fprintf(stderr, - "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", - S1, S2, S3); - return 1; - break; - /* ----------------------------------------------------- */ - case 'o': /* OUT fill */ - outfile = optarg; - while (*outfile) { - outfile++; - } - outfile--; - S3 = *outfile; - outfile--; - S2 = *outfile; - outfile--; - S1 = *outfile; - - outfile = optarg; - - if ((S1 == 'm' && S2 == 'j' && S3 == '2') - || (S1 == 'M' && S2 == 'J' && S3 == '2')) - cp.cod_format = MJ2_CFMT; - else { - fprintf(stderr, - "Unknown output format image *.%c%c%c [only *.mj2]!! \n", - S1, S2, S3); - return 1; - } - - - - break; - /* ----------------------------------------------------- */ - case 'r': /* rates rates/distorsion */ - s = optarg; - while (sscanf(s, "%d", &tcp_init->rates[tcp_init->numlayers]) - == 1) { - tcp_init->numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - cp.disto_alloc = 1; - cp.matrice = NULL; - break; - /* ----------------------------------------------------- */ - case 'q': /* add fixed_quality */ - s = optarg; - while (sscanf - (s, "%f", &tcp_init->distoratio[tcp_init->numlayers]) == 1) { - tcp_init->numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) - break; - s++; - } - cp.fixed_quality = 1; - cp.matrice = NULL; - break; - /* dda */ - /* ----------------------------------------------------- */ - case 'f': /* mod fixed_quality (before : -q) */ - s = optarg; - sscanf(s, "%d", &tcp_init->numlayers); - s++; - if (tcp_init->numlayers > 9) - s++; - cp.matrice = - (int *) malloc(tcp_init->numlayers * NumResolution * 3 * - sizeof(int)); - s = s + 2; - for (i = 0; i < tcp_init->numlayers; i++) { - tcp_init->rates[i] = 1; - sscanf(s, "%d,", &cp.matrice[i * NumResolution * 3]); - s += 2; - if (cp.matrice[i * NumResolution * 3] > 9) - s++; - cp.matrice[i * NumResolution * 3 + 1] = 0; - cp.matrice[i * NumResolution * 3 + 2] = 0; - for (j = 1; j < NumResolution; j++) { - sscanf(s, "%d,%d,%d", - &cp.matrice[i * NumResolution * 3 + j * 3 + 0], - &cp.matrice[i * NumResolution * 3 + j * 3 + 1], - &cp.matrice[i * NumResolution * 3 + j * 3 + 2]); - s += 6; - if (cp.matrice[i * NumResolution * 3 + j * 3] > 9) - s++; - if (cp.matrice[i * NumResolution * 3 + j * 3 + 1] > 9) - s++; - if (cp.matrice[i * NumResolution * 3 + j * 3 + 2] > 9) - s++; - } - if (i < tcp_init->numlayers - 1) - s++; - } - cp.fixed_alloc = 1; - break; - /* ----------------------------------------------------- */ - case 't': /* tiles */ - sscanf(optarg, "%d,%d", &cp.tdx, &cp.tdy); - Tile_arg = 1; - break; - /* ----------------------------------------------------- */ - case 'n': /* resolution */ - sscanf(optarg, "%d", &NumResolution); - break; - /* ----------------------------------------------------- */ - case 'c': /* precinct dimension */ - s = optarg; - do { - sep = 0; - sscanf(s, "[%d,%d]%c", &prcw_init[res_spec], - &prch_init[res_spec], &sep); - CSty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } while (sep == ','); - break; - /* ----------------------------------------------------- */ - case 'b': /* code-block dimension */ - sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init); - if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 - || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { - fprintf(stderr, - "!! Size of code_block error (option -b) !!\n\nRestriction :\n * width*height<=4096\n * 4<=width,height<= 1024\n\n"); - return 1; - } - break; - /* ----------------------------------------------------- */ - case 'x': /* creation of index file */ - index = optarg; - cp.index_on = 1; - break; - /* ----------------------------------------------------- */ - case 'p': /* progression order */ - s = optarg; - for (i = 0; i < 4; i++) { - progression[i] = *s; - s++; - } - Prog_order = give_progression(progression); - - if (Prog_order == -1) { - fprintf(stderr, - "Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - break; - /* ----------------------------------------------------- */ - case 's': /* subsampling factor */ - if (sscanf(optarg, "%d,%d", &subsampling_dx, &subsampling_dy) - != 2) { - fprintf(stderr, - "'-s' sub-sampling argument error ! [-s dx,dy]\n"); - return 1; - } - break; - /* ----------------------------------------------------- */ - case 'd': /* coordonnate of the reference grid */ - if (sscanf(optarg, "%d,%d", &Dim[0], &Dim[1]) != 2) { - fprintf(stderr, - "-d 'coordonnate of the reference grid' argument error !! [-d x0,y0]\n"); - return 1; - } - break; - /* ----------------------------------------------------- */ - case 'h': /* Display an help description */ - help_display(); - return 0; - break; - /* ----------------------------------------------------- */ - case 'P': /* POC */ - fprintf(stderr, "/----------------------------------\\\n"); - fprintf(stderr, "| POC option not fully tested !! |\n"); - fprintf(stderr, "\\----------------------------------/\n"); - - s = optarg; - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg = give_progression(POC[numpocs].progorder); - /* POC[numpocs].tile; */ - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) - break; - s++; - } - break; - /* ------------------------------------------------------ */ - case 'S': /* SOP marker */ - CSty |= 0x02; - break; - /* ------------------------------------------------------ */ - case 'E': /* EPH marker */ - CSty |= 0x04; - break; - /* ------------------------------------------------------ */ - case 'M': /* Mode switch pas tous au point !! */ - if (sscanf(optarg, "%d", &value) == 1) { - for (i = 0; i <= 5; i++) { - int cache = value & (1 << i); - if (cache) - mode |= (1 << i); - } - } - break; - /* ------------------------------------------------------ */ - case 'R': /* ROI */ - if (sscanf(optarg, "OI:c=%d,U=%d", &ROI_compno, &ROI_shift) != 2) { - fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'T': /* Tile offset */ - if (sscanf(optarg, "%d,%d", &TX0, &TY0) != 2) { - fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'C': /* Add a comment */ - cp.comment = optarg; - break; - /* ------------------------------------------------------ */ - case 'I': /* reversible or not */ - ir = 1; - break; - /* ------------------------------------------------------ */ - case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ - if (sscanf - (optarg, "%d,%d,%d,%d", &w, &h, &CbCr_subsampling_dx, - &CbCr_subsampling_dy) != 4) { - fprintf(stderr, "-W argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'F': /* Video frame rate */ - if (sscanf(optarg, "%d", &frame_rate) != 1) { - fprintf(stderr, "-F argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - default: - return 1; - } - } - - cp.tx0 = TX0; - cp.ty0 = TY0; - - /* Error messages */ - /* -------------- */ - if (!infile || !outfile) { - fprintf(stderr, - "Correct usage: mj2_encoder -i yuv-file -o mj2-file (+ options)\n"); - return 1; - } - - if ((cp.disto_alloc || cp.fixed_alloc || cp.fixed_quality) - && (!(cp.disto_alloc ^ cp.fixed_alloc ^ cp.fixed_quality))) { - fprintf(stderr, - "Error: options -r -q and -f can not be used together !!\n"); - return 1; - } // mod fixed_quality - - /* if no rate entered, lossless by default */ - if (tcp_init->numlayers == 0) { - tcp_init->rates[tcp_init->numlayers] = 0; //MOD antonin : losslessbug - tcp_init->numlayers++; - cp.disto_alloc = 1; - } - - if (TX0 > Dim[0] || TY0 > Dim[1]) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - TX0, Dim[0], TY0, Dim[1]); - return 1; - } - - for (i = 0; i < numpocs; i++) { - if (POC[i].prg == -1) { - fprintf(stderr, - "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", - i + 1); - } - } - - /* to respect profile - 0 */ - /* ---------------------- */ - numD_min = 0; - - x1 = !Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w - - 1) * - subsampling_dx + 1; - y1 = !Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h - - 1) * - subsampling_dy + 1; - - if (Tile_arg == 1) { - cp.tw = int_ceildiv(x1 - cp.tx0, cp.tdx); - cp.th = int_ceildiv(y1 - cp.ty0, cp.tdy); - } else { - cp.tdx = x1 - cp.tx0; - cp.tdy = y1 - cp.ty0; - } - - - /* Initialization for PPM marker */ - cp.ppm = 0; - cp.ppm_data = NULL; - cp.ppm_previous = 0; - cp.ppm_store = 0; - - numcomps = 3; /* Because YUV files only have 3 components */ - - tcp_init->mct = 0; /* No component transform needed */ - - prec = 8; /* Because in YUV files, components have 8-bit depth */ - - /* Init the mutiple tiles */ - /* ---------------------- */ - cp.tcps = (j2k_tcp_t *) malloc(cp.tw * cp.th * sizeof(j2k_tcp_t)); - - for (tileno = 0; tileno < cp.tw * cp.th; tileno++) { - tcp = &cp.tcps[tileno]; - tcp->numlayers = tcp_init->numlayers; - for (j = 0; j < tcp->numlayers; j++) { - if (cp.fixed_quality) // add fixed_quality - tcp->distoratio[j] = tcp_init->distoratio[j]; - else - tcp->rates[j] = tcp_init->rates[j]; - } - tcp->csty = CSty; - tcp->prg = Prog_order; - tcp->mct = tcp_init->mct; - tcp->ppt = 0; - tcp->ppt_data = NULL; - tcp->ppt_store = 0; - - numpocs_tile = 0; - tcp->POC = 0; - if (numpocs) { - /* intialisation of POC */ - tcp->POC = 1; - for (i = 0; i < numpocs; i++) { - if (tileno == POC[i].tile - 1 || POC[i].tile == -1) { - tcp_poc = &tcp->pocs[numpocs_tile]; - tcp_poc->resno0 = POC[numpocs_tile].resno0; - tcp_poc->compno0 = POC[numpocs_tile].compno0; - tcp_poc->layno1 = POC[numpocs_tile].layno1; - tcp_poc->resno1 = POC[numpocs_tile].resno1; - tcp_poc->compno1 = POC[numpocs_tile].compno1; - tcp_poc->prg = POC[numpocs_tile].prg; - tcp_poc->tile = POC[numpocs_tile].tile; - numpocs_tile++; - } - } - } - tcp->numpocs = numpocs_tile; - tcp->tccps = (j2k_tccp_t *) malloc(numcomps * sizeof(j2k_tccp_t)); - - for (i = 0; i < numcomps; i++) { - tccp = &tcp->tccps[i]; - tccp->csty = CSty & 0x01; /* 0 => one precinct || 1 => custom precinct */ - tccp->numresolutions = NumResolution; - tccp->cblkw = int_floorlog2(cblockw_init); - tccp->cblkh = int_floorlog2(cblockh_init); - tccp->cblksty = mode; - tccp->qmfbid = ir ? 0 : 1; - tccp->qntsty = ir ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; - tccp->numgbits = 2; - if (i == ROI_compno) - tccp->roishift = ROI_shift; - else - tccp->roishift = 0; - if (CSty & J2K_CCP_CSTY_PRT) { - int p = 0; - for (j = tccp->numresolutions - 1; j >= 0; j--) { - if (p < res_spec) { - if (prcw_init[p] < 1) - tccp->prcw[j] = 1; - else - tccp->prcw[j] = int_floorlog2(prcw_init[p]); - - if (prch_init[p] < 1) - tccp->prch[j] = 1; - else - tccp->prch[j] = int_floorlog2(prch_init[p]); - } else { - int size_prcw, size_prch; - size_prcw = prcw_init[res_spec - 1] >> (p - (res_spec - 1)); - size_prch = prch_init[res_spec - 1] >> (p - (res_spec - 1)); - if (size_prcw < 1) - tccp->prcw[j] = 1; - else - tccp->prcw[j] = int_floorlog2(size_prcw); - if (size_prch < 1) - tccp->prch[j] = 1; - else - tccp->prch[j] = int_floorlog2(size_prch); - } - p++; - /*printf("\nsize precinct pour level %d : %d,%d\n", j, - tccp->prcw[j], tccp->prch[j]); */ - } - } else { - for (j = 0; j < tccp->numresolutions; j++) { - tccp->prcw[j] = 15; - tccp->prch[j] = 15; - } - } - calc_explicit_stepsizes(tccp, prec); - } - } - - mj2file = fopen(outfile, "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - - movie.tk = (mj2_tk_t *) malloc(sizeof(mj2_tk_t)); - movie.num_vtk = 1; - movie.num_stk = 0; - movie.num_htk = 0; - - movie.tk[0].track_type = 0; // Video Track - movie.tk[0].track_ID = 1; - movie.tk[0].Dim[0] = Dim[0]; - movie.tk[0].Dim[1] = Dim[1]; - movie.tk[0].w = w; - movie.tk[0].h = h; - movie.tk[0].CbCr_subsampling_dx = CbCr_subsampling_dx; - movie.tk[0].CbCr_subsampling_dy = CbCr_subsampling_dy; - movie.tk[0].sample_rate = frame_rate; - movie.tk[0].jp2_struct.numcomps = 3; // NC - jp2_init_stdjp2(&movie.tk[0].jp2_struct); - - movie.tk[0].jp2_struct.w = w; - movie.tk[0].jp2_struct.h = h; - movie.tk[0].jp2_struct.bpc = 7; - movie.tk[0].jp2_struct.meth = 1; - movie.tk[0].jp2_struct.enumcs = 18; // YUV - - - yuvfile = fopen(infile,"rb"); - if (!yuvfile) { - fprintf(stderr, "failed to open %s for reading\n",infile); - return 1; - } - - movie.tk[0].num_samples = yuv_num_frames(&movie.tk[0],yuvfile); - if (!movie.tk[0].num_samples) { - fprintf(stderr,"Unable to count the number of frames in YUV input file\n"); - } - - // One sample per chunk - movie.tk[0].chunk = (mj2_chunk_t*) malloc(movie.tk[0].num_samples * sizeof(mj2_chunk_t)); - movie.tk[0].sample = (mj2_sample_t*) malloc(movie.tk[0].num_samples * sizeof(mj2_sample_t)); - - if (mj2_init_stdmovie(&movie)) { - fprintf(stderr, "Error with movie initialization"); - return 1; - }; - - // Writing JP, FTYP and MDAT boxes - buf = (char*) malloc (300 * sizeof(char)); // Assuming that the JP and FTYP - // boxes won't be longer than 300 bytes - cio_init(buf , 300); - mj2_write_jp(); - mj2_write_ftyp(&movie); - mdat_initpos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MDAT, 4); - fwrite(buf,cio_tell(),1,mj2file); - offset = cio_tell(); - free(buf); - - for (i = 0; i < movie.num_stk + movie.num_htk + movie.num_vtk; i++) { - if (movie.tk[i].track_type != 0) { - fprintf(stderr, "Unable to write sound or hint tracks\n"); - } else { - //j2k_cp_t cp_init; - mj2_tk_t *tk; - - tk = &movie.tk[i]; - - //tk->sample = - //(mj2_sample_t *) malloc(tk->num_samples * sizeof(mj2_sample_t)); - tk->num_chunks = tk->num_samples; - //tk->chunk = - //(mj2_chunk_t *) malloc(tk->num_chunks * sizeof(mj2_chunk_t)); - - fprintf(stderr, "Video Track number %d\n", i + 1); - - // Copy the first tile coding parameters (tcp) to cp_init - - //cp_init.tcps = - //(j2k_tcp_t *) malloc(cp.tw * cp.th * sizeof(j2k_tcp_t)); - for (tileno = 0; tileno < cp.tw * cp.th; tileno++) { - for (l = 0; l < cp.tcps[tileno].numlayers; l++) { - cp_init.tcps[tileno].rates[l] = cp.tcps[tileno].rates[l]; - //tileno = cp.tcps[tileno].rates[l]; - } - } - - for (sampleno = 0; sampleno < tk->num_samples; sampleno++) { - buf = (char *) malloc(cp.tdx * cp.tdy * cp.th * cp.tw * 2); - cio_init(buf, cp.tdx * cp.tdy * cp.th * cp.tw * 2); - - fprintf(stderr, "Frame number %d/%d: ", sampleno + 1, tk->num_samples); - - - if (!yuvtoimage(yuvfile, tk, &img, sampleno, subsampling_dx, subsampling_dy)) { - fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); - return 1; - } - - jp2c_initpos = cio_tell(); - cio_skip(4); - cio_write(JP2_JP2C, 4); // JP2C - - len = j2k_encode(&img, &cp, buf, cp.tdx * cp.tdy * 2, index); - if (len ==0) { - fprintf(stderr,"Unable to encode image"); - return 1; - } - - cio_seek(jp2c_initpos); - cio_write(len+8,4); - - for (m = 0; m < img.numcomps; m++) { - free(img.comps[m].data); - } - free(img.comps); - - tk->sample[sampleno].sample_size = len+8; - - tk->sample[sampleno].offset = offset; - tk->chunk[sampleno].offset = offset; // There is one sample per chunk - - fwrite(buf, 1, len+8, mj2file); - - offset += len+8; - - free(buf); - - // Copy the cp_init parameters to cp.tcps - - for (tileno = 0; tileno < cp.tw * cp.th; tileno++) { - for (k = 0; k < cp.tcps[tileno].numlayers; k++) { - cp.tcps[tileno].rates[k] = cp_init.tcps[tileno].rates[k]; - } - } - } - } - } - - fseek(mj2file, mdat_initpos, SEEK_SET); - - buf = (char*) malloc(4*sizeof(char)); - - cio_init(buf, 4); // Init a cio to write box length variable in a little endian way - cio_write(offset - mdat_initpos, 4); - fwrite(buf, 4, 1, mj2file); - fseek(mj2file,0,SEEK_END); - free(buf); - - // Writing MOOV box - i=1; - buf = (char*) malloc (10000 * sizeof(char)); - cio_init(buf , i*10000); - if (setjmp(j2k_error)) { - i++; - realloc(buf,i*10000* sizeof(char)); - pos = cio_tell(); - cio_init(buf , i*10000); - cio_seek(pos); - } - mj2_write_moov(&movie); - fwrite(buf,cio_tell(),1,mj2file); - - // Ending program - mj2_memory_free(&movie); - free(cp_init.tcps); - if (tcp_init->numlayers > 9) - free(cp.matrice); - for (tileno = 0; tileno < cp.tw * cp.th; tileno++) - free(cp.tcps[tileno].tccps); - free(cp.tcps); - fclose(mj2file); - free(buf); - remove("Compo0"); - remove("Compo1"); - remove("Compo2"); - - //MEMORY LEAK - #ifdef _DEBUG - _CrtDumpMemoryLeaks(); - #endif - //MEM - - return 0; -} - - diff --git a/mj2/MJ2_codec/mj2.c b/mj2/MJ2_codec/mj2.c deleted file mode 100644 index cdafe751..00000000 --- a/mj2/MJ2_codec/mj2.c +++ /dev/null @@ -1,2798 +0,0 @@ -/* -* Copyright (c) 2003-2004, François-Olivier Devaux -* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include - -#include "mj2.h" -#include - -#define MJ2_JP 0x6a502020 -#define MJ2_FTYP 0x66747970 -#define MJ2_MJ2 0x6d6a7032 -#define MJ2_MJ2S 0x6d6a3273 -#define MJ2_MDAT 0x6d646174 -#define MJ2_MOOV 0x6d6f6f76 -#define MJ2_MVHD 0x6d766864 -#define MJ2_TRAK 0x7472616b -#define MJ2_TKHD 0x746b6864 -#define MJ2_MDIA 0x6d646961 -#define MJ2_MDHD 0x6d646864 -#define MJ2_MHDR 0x6d686472 -#define MJ2_HDLR 0x68646C72 -#define MJ2_MINF 0x6d696e66 -#define MJ2_VMHD 0x766d6864 -#define MJ2_SMHD 0x736d6864 -#define MJ2_HMHD 0x686d6864 -#define MJ2_DINF 0x64696e66 -#define MJ2_DREF 0x64726566 -#define MJ2_URL 0x75726c20 -#define MJ2_URN 0x75726e20 -#define MJ2_STBL 0x7374626c -#define MJ2_STSD 0x73747364 -#define MJ2_STTS 0x73747473 -#define MJ2_STSC 0x73747363 -#define MJ2_STSZ 0x7374737A -#define MJ2_STCO 0x7374636f -#define MJ2_MOOF 0x6d6f6f66 -#define MJ2_FREE 0x66726565 -#define MJ2_SKIP 0x736b6970 -#define MJ2_JP2C 0x6a703263 -#define MJ2_FIEL 0x6669656c -#define MJ2_JP2P 0x6a703270 -#define MJ2_JP2X 0x6a703278 -#define MJ2_JSUB 0x6a737562 -#define MJ2_ORFO 0x6f72666f -#define MJ2_MVEX 0x6d766578 -#define MJ2_JP2 0x6a703220 -#define MJ2_J2P0 0x4a325030 - -/* -* -* Free movie structure memory -* -*/ -void mj2_memory_free(mj2_movie_t * movie) -{ - int i; - mj2_tk_t *tk=NULL; - - if (movie->num_cl != 0) - free(movie->cl); - - for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) { - tk = &movie->tk[i]; - if (tk->name_size != 0) - free(tk->name); - if (tk->track_type == 0) {// Video track - if (tk->jp2_struct.comps != 0) - free(tk->jp2_struct.comps); - if (tk->jp2_struct.cl != 0) - free(tk->jp2_struct.cl); - if (tk->num_jp2x != 0) - free(tk->jp2xdata); - - } - if (tk->num_url != 0) - free(tk->url); - if (tk->num_urn != 0) - free(tk->urn); - if (tk->num_br != 0) - free(tk->br); - if (tk->num_tts != 0) - free(tk->tts); - if (tk->num_chunks != 0) - free(tk->chunk); - if (tk->num_samplestochunk != 0) - free(tk->sampletochunk); - if (tk->num_samples != 0) - free(tk->sample); - } - - free(movie->tk); -} - -/* -* -* Read box headers -* -*/ - -int mj2_read_boxhdr(mj2_box_t * box) -{ - box->init_pos = cio_tell(); - box->length = cio_read(4); - box->type = cio_read(4); - if (box->length == 1) { - if (cio_read(4) != 0) { - fprintf(stderr, "Error: Cannot handle box sizes higher than 2^32\n"); - return 1; - }; - box->length = cio_read(4); - if (box->length == 0) - box->length = cio_numbytesleft() + 12; - } - else if (box->length == 0) { - box->length = cio_numbytesleft() + 8; - } - return 0; -} - -/* -* -* Initialisation of a Standard Movie, given a simple movie structure defined by the user -* The movie will have one sample per chunk -* -* Arguments: mj2_movie_t * movie -* Several variables of "movie" must be defined in order to enable a correct execution of -* this function: -* - The number of tracks of each type (movie->num_vtk, movie->num_stk, movie->num_htk) -* - The memory for each must be allocated (movie->tk) -* - For each track: -* The track type (tk->track_type) -* The number of sample (tk->num_samples) -* The sample rate (tk->sample_rate) -* -*/ - -int mj2_init_stdmovie(mj2_movie_t * movie) -{ - int i; - unsigned int j; - time_t ltime; - - movie->brand = MJ2_MJ2; - movie->minversion = 0; - movie->num_cl = 2; - movie->cl = - (unsigned int *) malloc(movie->num_cl * sizeof(unsigned int)); - - movie->cl[0] = MJ2_MJ2; - movie->cl[1] = MJ2_MJ2S; - time(<ime); /* Time since 1/1/70 */ - movie->creation_time = (unsigned int) ltime + 2082844800; /* Seconds between 1/1/04 and 1/1/70 */ - movie->timescale = 1000; - - movie->rate = 1 << 16; /* Rate to play presentation (default = 0x00010000) */ - movie->volume = 1 << 8; /* Movie volume (default = 0x0100) */ - movie->trans_matrix[0] = 0x00010000; /* Transformation matrix for video */ - movie->trans_matrix[1] = 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ - movie->trans_matrix[2] = 0; - movie->trans_matrix[3] = 0; - movie->trans_matrix[4] = 0x00010000; - movie->trans_matrix[5] = 0; - movie->trans_matrix[6] = 0; - movie->trans_matrix[7] = 0; - movie->trans_matrix[8] = 0x40000000; - movie->next_tk_id = 1; - - for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { - mj2_tk_t *tk = &movie->tk[i]; - movie->next_tk_id++; - tk->jp2_struct.comps = NULL; - tk->jp2_struct.cl = NULL; - - if (tk->track_type == 0) { - if (tk->num_samples == 0) - return 1; - - tk->Dim[0] = 0; - tk->Dim[1] = 0; - - tk->timescale = 1000; /* Timescale = 1 ms */ - - tk->chunk[0].num_samples = 1; - tk->chunk[0].sample_descr_idx = 1; - - tk->same_sample_size = 0; - - tk->num_samplestochunk = 1; /* One sample per chunk */ - tk->sampletochunk = - (mj2_sampletochunk_t *) malloc(tk->num_samplestochunk * - sizeof(mj2_sampletochunk_t)); - tk->sampletochunk[0].first_chunk = 1; - tk->sampletochunk[0].samples_per_chunk = 1; - tk->sampletochunk[0].sample_descr_idx = 1; - - if (tk->sample_rate == 0) { - fprintf(stderr,"Error while initializing MJ2 movie: Sample rate of track %d must be different from zero\n",tk->track_ID); - return 1; - } - - for (j = 0; j < tk->num_samples; j++) { - tk->sample[j].sample_delta = tk->timescale / tk->sample_rate; - } - - tk->num_tts = 1; - tk->tts = (mj2_tts_t *) malloc(tk->num_tts * sizeof(mj2_tts_t)); - tk->tts[0].sample_count = tk->num_samples; - tk->tts[0].sample_delta = tk->timescale / tk->sample_rate; - - tk->horizresolution = 0x00480000; /* Horizontal resolution (typically 72) */ - tk->vertresolution = 0x00480000; /* Vertical resolution (typically 72) */ - tk->compressorname[0] = 0x0f4d6f74; /* Compressor Name[]: Motion JPEG2000 */ - tk->compressorname[1] = 0x696f6e20; - tk->compressorname[2] = 0x4a504547; - tk->compressorname[3] = 0x32303030; - tk->compressorname[4] = 0x00120000; - tk->compressorname[5] = 0; - tk->compressorname[6] = 0x00000042; - tk->compressorname[7] = 0x000000DC; - tk->num_url = 0; /* Number of URL */ - tk->num_urn = 0; /* Number of URN */ - tk->graphicsmode = 0; /* Graphicsmode */ - tk->opcolor[0] = 0; /* OpColor */ - tk->opcolor[1] = 0; /* OpColor */ - tk->opcolor[2] = 0; /* OpColor */ - tk->creation_time = movie->creation_time; /* Seconds between 1/1/04 and 1/1/70 */ - tk->language = 0; /* Language (undefined) */ - tk->layer = 0; - tk->volume = 1 << 8; /* Movie volume (default = 0x0100) */ - tk->trans_matrix[0] = 0x00010000; /* Transformation matrix for track */ - tk->trans_matrix[1] = 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ - tk->trans_matrix[2] = 0; - tk->trans_matrix[3] = 0; - tk->trans_matrix[4] = 0x00010000; - tk->trans_matrix[5] = 0; - tk->trans_matrix[6] = 0; - tk->trans_matrix[7] = 0; - tk->trans_matrix[8] = 0x40000000; - tk->fieldcount = 1; - tk->fieldorder = 0; - tk->or_fieldcount = 1; - tk->or_fieldorder = 0; - tk->num_br = 2; - tk->br = (unsigned int *) malloc(tk->num_br * sizeof(unsigned int)); - tk->br[0] = MJ2_JP2; - tk->br[1] = MJ2_J2P0; - tk->num_jp2x = 0; - tk->hsub = 2; /* 4:2:0 */ - tk->vsub = 2; /* 4:2:0 */ - tk->hoff = 0; - tk->voff = 0; - tk->visual_w = tk->w << 16; - tk->visual_h = tk->h << 16; - } - else { - tk->num_br = 0; - tk->jp2xdata = NULL; - } - } - return 0; -} - -/* -* Time To Sample box Decompact -* -*/ -void mj2_tts_decompact(mj2_tk_t * tk) -{ - int i, j; - tk->num_samples = 0; - for (i = 0; i < tk->num_tts; i++) { - tk->num_samples += tk->tts[i].sample_count; - } - - tk->sample = - (mj2_sample_t *) malloc(tk->num_samples * sizeof(mj2_sample_t)); - - for (i = 0; i < tk->num_tts; i++) { - for (j = 0; j < tk->tts[i].sample_count; j++) { - tk->sample[j].sample_delta = tk->tts[i].sample_delta; - } - } -} - -/* -* Sample To Chunk box Decompact -* -*/ -void mj2_stsc_decompact(mj2_tk_t * tk) -{ - int j, i; - unsigned int k; - int sampleno=0; - - if (tk->num_samplestochunk == 1) { - tk->num_chunks = - (unsigned int) ceil((double) tk->num_samples / - (double) tk->sampletochunk[0].samples_per_chunk); - tk->chunk = - (mj2_chunk_t *) malloc(tk->num_chunks * sizeof(mj2_chunk_t)); - for (k = 0; k < tk->num_chunks; k++) { - tk->chunk[k].num_samples = tk->sampletochunk[0].samples_per_chunk; - } - - } else { - tk->chunk = - (mj2_chunk_t *) malloc(tk->num_samples * sizeof(mj2_chunk_t)); - tk->num_chunks = 0; - for (i = 0; i < tk->num_samplestochunk -1 ; i++) { - for (j = tk->sampletochunk[i].first_chunk - 1; - j < tk->sampletochunk[i + 1].first_chunk - 1; j++) { - tk->chunk[j].num_samples = tk->sampletochunk[i].samples_per_chunk; - tk->num_chunks++; - sampleno += tk->chunk[j].num_samples; - } - } - tk->num_chunks += (int)(tk->num_samples - sampleno) / tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; - for (k = tk->sampletochunk[tk->num_samplestochunk - 1].first_chunk - 1; - k < tk->num_chunks; k++) { - tk->chunk[k].num_samples = - tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; - } - tk->chunk = realloc(tk->chunk, tk->num_chunks * sizeof(mj2_chunk_t)); - } - -} - - -/* -* Chunk offset box Decompact -* -*/ -void mj2_stco_decompact(mj2_tk_t * tk) -{ - int j; - unsigned int i; - int k = 0; - int intra_chunk_offset; - - for (i = 0; i < tk->num_chunks; i++) { - intra_chunk_offset = 0; - for (j = 0; j < tk->chunk[i].num_samples; j++) { - tk->sample[k].offset = intra_chunk_offset + tk->chunk[i].offset; - intra_chunk_offset += tk->sample[k].sample_size; - k++; - } - } -} - -/* -* Write the JP box -* -* JP Signature box -* -*/ -void mj2_write_jp() -{ - mj2_box_t box; - box.init_pos = cio_tell(); - cio_skip(4); - - cio_write(MJ2_JP, 4); /* JP */ - cio_write(0x0d0a870a, 4); /* 0x0d0a870a required in a JP box */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); - cio_seek(box.init_pos + box.length); -} - -/* -* Read the JP box -* -* JPEG 2000 signature -* -*/ -int mj2_read_jp() -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_JP != box.type) { /* Check Marker */ - fprintf(stderr, "Error: Expected JP Marker\n"); - return 1; - } - if (0x0d0a870a != cio_read(4)) { /* read the 0x0d0a870a required in a JP box */ - fprintf(stderr, "Error with JP Marker\n"); - return 1; - } - if (cio_tell() - box.init_pos != box.length) { /* Check box length */ - fprintf(stderr, "Error with JP Box size \n"); - return 1; - } - return 0; - -} - -/* -* Write the FTYP box -* -* File type box -* -*/ -void mj2_write_ftyp(mj2_movie_t * movie) -{ - int i; - mj2_box_t box; - box.init_pos = cio_tell(); - cio_skip(4); - - cio_write(MJ2_FTYP, 4); /* FTYP */ - cio_write(movie->brand, 4); /* BR */ - cio_write(movie->minversion, 4); /* MinV */ - - for (i = 0; i < movie->num_cl; i++) - cio_write(movie->cl[i], 4); /* CL */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* Length */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the FTYP box -* -* File type box -* -*/ -int mj2_read_ftyp(mj2_movie_t * movie) -{ - int i; - mj2_box_t box; - - mj2_read_boxhdr(&box); /* Box Size */ - if (MJ2_FTYP != box.type) { - fprintf(stderr, "Error: Expected FTYP Marker\n"); - return 1; - } - - movie->brand = cio_read(4); /* BR */ - movie->minversion = cio_read(4); /* MinV */ - movie->num_cl = (box.length - 16) / 4; - movie->cl = - (unsigned int *) malloc(movie->num_cl * sizeof(unsigned int)); - - for (i = movie->num_cl - 1; i > -1; i--) - movie->cl[i] = cio_read(4); /* CLi */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with FTYP Box\n"); - return 1; - } - return 0; -} - - -/* -* Write the STCO box -* -* Chunk Offset Box -* -*/ -void mj2_write_stco(mj2_tk_t * tk) -{ - mj2_box_t box; - unsigned int i; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STCO, 4); /* STCO */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->num_chunks, 4); /* Entry Count */ - - for (i = 0; i < tk->num_chunks; i++) { - cio_write(tk->chunk[i].offset, 4); /* Entry offset */ - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STCO box -* -* Chunk Offset Box -* -*/ -int mj2_read_stco(mj2_tk_t * tk) -{ - unsigned int i; - mj2_box_t box; - - mj2_read_boxhdr(&box); /* Box Size */ - if (MJ2_STCO != box.type) { - fprintf(stderr, "Error: Expected STCO Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in STCO box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in STCO box. Expected flag 0\n"); - return 1; - } - - - if (cio_read(4) != tk->num_chunks) { - fprintf(stderr, - "Error in STCO box: expecting same amount of entry-count as chunks \n"); - } else { - for (i = 0; i < tk->num_chunks; i++) { - tk->chunk[i].offset = cio_read(4); /* Entry offset */ - } - } - - mj2_stco_decompact(tk); - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STCO Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STSZ box -* -* Sample size box -* -*/ -void mj2_write_stsz(mj2_tk_t * tk) -{ - mj2_box_t box; - unsigned int i; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STSZ, 4); /* STSZ */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - if (tk->same_sample_size == 1) { /* If they all have the same size */ - cio_write(tk->sample[0].sample_size, 4); /* Size */ - - cio_write(1, 4); /* Entry count = 1 */ - } - - else { - cio_write(0, 4); /* Sample Size = 0 becase they all have different sizes */ - - cio_write(tk->num_samples, 4); /* Sample Count */ - - for (i = 0; i < tk->num_samples; i++) { - cio_write(tk->sample[i].sample_size, 4); - } - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STSZ box -* -* Sample size box -* -*/ -int mj2_read_stsz(mj2_tk_t * tk) -{ - int sample_size; - unsigned int i; - mj2_box_t box; - - mj2_read_boxhdr(&box); /* Box Size */ - if (MJ2_STSZ != box.type) { - fprintf(stderr, "Error: Expected STSZ Marker\n"); - return 1; - } - - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in STSZ box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in STSZ box. Expected flag 0\n"); - return 1; - } - - sample_size = cio_read(4); - - if (sample_size != 0) { /* Samples do have the same size */ - tk->same_sample_size = 1; - for (i = 0; i < tk->num_samples; i++) { - tk->sample[i].sample_size = sample_size; - } - cio_skip(4); /* Sample count = 1 */ - } else { - tk->same_sample_size = 0; - if (tk->num_samples != cio_read(4)) { /* Sample count */ - fprintf(stderr, - "Error in STSZ box. Expected that sample-count is number of samples in track\n"); - return 1; - } - for (i = 0; i < tk->num_samples; i++) { - tk->sample[i].sample_size = cio_read(4); /* Sample Size */ - } - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STSZ Box size\n"); - return 1; - } - } - return 0; - -} - -/* -* Write the STSC box -* -* Sample to Chunk -* -*/ -void mj2_write_stsc(mj2_tk_t * tk) -{ - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STSC, 4); /* STSC */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->num_samplestochunk, 4); /* Entry Count */ - - for (i = 0; i < tk->num_samplestochunk; i++) { - cio_write(tk->sampletochunk[i].first_chunk, 4); /* First Chunk */ - cio_write(tk->sampletochunk[i].samples_per_chunk, 4); /* Samples per chunk */ - cio_write(tk->sampletochunk[i].sample_descr_idx, 4); /* Samples description index */ - } - - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STSC box -* -* Sample to Chunk -* -*/ -int mj2_read_stsc(mj2_tk_t * tk) -{ - int i; - mj2_box_t box; - - mj2_read_boxhdr(&box); /* Box Size */ - if (MJ2_STSC != box.type) { - fprintf(stderr, "Error: Expected STSC Marker\n"); - return 1; - } - - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in STSC box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in STSC box. Expected flag 0\n"); - return 1; - } - - tk->num_samplestochunk = cio_read(4); - - tk->sampletochunk = - (mj2_sampletochunk_t *) malloc(tk->num_samplestochunk * - sizeof(mj2_sampletochunk_t)); - - - for (i = 0; i < tk->num_samplestochunk; i++) { - tk->sampletochunk[i].first_chunk = cio_read(4); - tk->sampletochunk[i].samples_per_chunk = cio_read(4); - tk->sampletochunk[i].sample_descr_idx = cio_read(4); - } - - mj2_stsc_decompact(tk); /* decompact sample to chunk box */ - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STSC Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STTS box -* -* Time to Sample Box -* -*/ -void mj2_write_stts(mj2_tk_t * tk) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STTS, 4); /* STTS */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->num_tts, 4); /* entry_count */ - for (i = 0; i < tk->num_tts; i++) { - cio_write(tk->tts[i].sample_count, 4); /* Sample-count */ - cio_write(tk->tts[i].sample_delta, 4); /* Sample-Delta */ - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STTS box -* -* -* -*/ -int mj2_read_stts(mj2_tk_t * tk) -{ - int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_STTS != box.type) { - fprintf(stderr, "Error: Expected STTS Marker\n"); - return 1; - } - - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in STTS box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in STTS box. Expected flag 0\n"); - return 1; - } - - tk->num_tts = cio_read(4); - - tk->tts = (mj2_tts_t *) malloc(tk->num_tts * sizeof(mj2_tts_t)); - - for (i = 0; i < tk->num_tts; i++) { - tk->tts[i].sample_count = cio_read(4); - tk->tts[i].sample_delta = cio_read(4); - } - - mj2_tts_decompact(tk); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STTS Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the FIEL box -* -* Field coding Box -* -*/ -void mj2_write_fiel(mj2_tk_t * tk) -{ - - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_FIEL, 4); /* STTS */ - - cio_write(tk->fieldcount, 1); /* Field count */ - cio_write(tk->fieldorder, 1); /* Field order */ - - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the FIEL box -* -* Field coding Box -* -*/ -int mj2_read_fiel(mj2_tk_t * tk) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_FIEL != box.type) { - fprintf(stderr, "Error: Expected FIEL Marker\n"); - return 1; - } - - - tk->fieldcount = cio_read(1); - tk->fieldorder = cio_read(1); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with FIEL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the ORFO box -* -* Original Format Box -* -*/ -void mj2_write_orfo(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_ORFO, 4); - - cio_write(tk->or_fieldcount, 1); /* Original Field count */ - cio_write(tk->or_fieldorder, 1); /* Original Field order */ - - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the ORFO box -* -* Original Format Box -* -*/ -int mj2_read_orfo(mj2_tk_t * tk) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_ORFO != box.type) { - fprintf(stderr, "Error: Expected ORFO Marker\n"); - return 1; - } - - - tk->or_fieldcount = cio_read(1); - tk->or_fieldorder = cio_read(1); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with ORFO Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JP2P box -* -* MJP2 Profile Box -* -*/ -void mj2_write_jp2p(mj2_tk_t * tk) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_JP2P, 4); - - cio_write(0, 4); /* Version 0, flags =0 */ - - for (i = 0; i < tk->num_br; i++) { - cio_write(tk->br[i], 4); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the JP2P box -* -* MJP2 Profile Box -* -*/ -int mj2_read_jp2p(mj2_tk_t * tk) -{ - int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_JP2P != box.type) { - fprintf(stderr, "Error: Expected JP2P Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in JP2P box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in JP2P box. Expected flag 0\n"); - return 1; - } - - - tk->num_br = (box.length - 12) / 4; - tk->br = (unsigned int *) malloc(tk->num_br * sizeof(unsigned int)); - - for (i = 0; i < tk->num_br; i++) { - tk->br[i] = cio_read(4); - } - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with JP2P Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JP2X box -* -* MJP2 Prefix Box -* -*/ -void mj2_write_jp2x(mj2_tk_t * tk) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_JP2X, 4); - - for (i = 0; i < tk->num_jp2x; i++) { - cio_write(tk->jp2xdata[i], 1); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the JP2X box -* -* MJP2 Prefix Box -* -*/ -int mj2_read_jp2x(mj2_tk_t * tk) -{ - unsigned int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_JP2X != box.type) { - fprintf(stderr, "Error: Expected JP2X Marker\n"); - return 1; - } - - - tk->num_jp2x = (box.length - 8); - tk->jp2xdata = - (unsigned char *) malloc(tk->num_jp2x * sizeof(unsigned char)); - - for (i = 0; i < tk->num_jp2x; i++) { - tk->jp2xdata[i] = cio_read(1); - } - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with JP2X Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JSUB box -* -* MJP2 Subsampling Box -* -*/ -void mj2_write_jsub(mj2_tk_t * tk) -{ - - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_JSUB, 4); - - cio_write(tk->hsub, 1); - cio_write(tk->vsub, 1); - cio_write(tk->hoff, 1); - cio_write(tk->voff, 1); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the JSUB box -* -* MJP2 Subsampling Box -* -*/ -int mj2_read_jsub(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_JSUB != box.type) { - fprintf(stderr, "Error: Expected JSUB Marker\n"); - return 1; - } - - tk->hsub = cio_read(1); - tk->vsub = cio_read(1); - tk->hoff = cio_read(1);; - tk->voff = cio_read(1); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with JSUB Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the SMJ2 box -* -* Visual Sample Entry Description -* -*/ -void mj2_write_smj2(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MJ2, 4); /* MJ2 */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(1, 4); - - cio_write(0, 2); /* Pre-defined */ - - cio_write(0, 2); /* Reserved */ - - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - - cio_write(tk->w, 2); /* Width */ - cio_write(tk->h, 2); /* Height */ - - cio_write(tk->horizresolution, 4); /* Horizontal resolution */ - cio_write(tk->vertresolution, 4); /* Vertical resolution */ - - cio_write(0, 4); /* Reserved */ - - cio_write(1, 2); /* Pre-defined = 1 */ - - cio_write(tk->compressorname[0], 4); /* Compressor Name */ - cio_write(tk->compressorname[1], 4); - cio_write(tk->compressorname[2], 4); - cio_write(tk->compressorname[3], 4); - cio_write(tk->compressorname[4], 4); - cio_write(tk->compressorname[5], 4); - cio_write(tk->compressorname[6], 4); - cio_write(tk->compressorname[7], 4); - - cio_write(tk->depth, 2); /* Depth */ - - cio_write(0xffff, 2); /* Pre-defined = -1 */ - - jp2_write_jp2h(&tk->jp2_struct); - - mj2_write_fiel(tk); - - if (tk->num_br != 0) - mj2_write_jp2p(tk); - if (tk->num_jp2x != 0) - mj2_write_jp2x(tk); - - mj2_write_jsub(tk); - mj2_write_orfo(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the SMJ2 box -* -* Visual Sample Entry Description -* -*/ -int mj2_read_smj2(j2k_image_t * img, mj2_tk_t * tk) -{ - mj2_box_t box; - mj2_box_t box2; - int i; - - mj2_read_boxhdr(&box); - - if (MJ2_MJ2 != box.type) { - fprintf(stderr, "Error in SMJ2 box: Expected MJ2 Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in MJP2 box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in MJP2 box. Expected flag 0\n"); - return 1; - } - - cio_skip(4); - - cio_skip(2); /* Pre-defined */ - - cio_skip(2); /* Reserved */ - - cio_skip(4); /* Pre-defined */ - cio_skip(4); /* Pre-defined */ - cio_skip(4); /* Pre-defined */ - - tk->w = cio_read(2); /* Width */ - tk->h = cio_read(2); /* Height */ - - tk->horizresolution = cio_read(4); /* Horizontal resolution */ - tk->vertresolution = cio_read(4); /* Vertical resolution */ - - cio_skip(4); /* Reserved */ - - cio_skip(2); /* Pre-defined = 1 */ - - tk->compressorname[0] = cio_read(4); /* Compressor Name */ - tk->compressorname[1] = cio_read(4); - tk->compressorname[2] = cio_read(4); - tk->compressorname[3] = cio_read(4); - tk->compressorname[4] = cio_read(4); - tk->compressorname[5] = cio_read(4); - tk->compressorname[6] = cio_read(4); - tk->compressorname[7] = cio_read(4); - - tk->depth = cio_read(2); /* Depth */ - - /* Init std value */ - tk->num_jp2x = 0; - tk->fieldcount = 1; - tk->fieldorder = 0; - tk->or_fieldcount = 1; - tk->or_fieldorder = 0; - - cio_skip(2); /* Pre-defined = -1 */ - - if (jp2_read_jp2h(&tk->jp2_struct)) { - fprintf(stderr, "Error with JP2H Box\n"); - return 1; - } - - tk->jp2_struct.comps = (jp2_comps_t *) malloc(tk->jp2_struct.numcomps * sizeof(jp2_comps_t)); - tk->jp2_struct.cl = (int *) malloc(sizeof(int)); - - tk->num_br = 0; - tk->num_jp2x = 0; - - for (i = 0; cio_tell() - box.init_pos < box.length; i++) { - mj2_read_boxhdr(&box2); - cio_seek(box2.init_pos); - switch (box2.type) { - case MJ2_FIEL: - if (mj2_read_fiel(tk)) - return 1; - break; - - case MJ2_JP2P: - if (mj2_read_jp2p(tk)) - return 1; - break; - - case MJ2_JP2X: - if (mj2_read_jp2x(tk)) - return 1; - break; - - case MJ2_JSUB: - if (mj2_read_jsub(tk)) - return 1; - break; - - case MJ2_ORFO: - if (mj2_read_orfo(tk)) - return 1; - break; - - default: - fprintf(stderr, "Error with MJP2 Box size\n"); - return 1; - break; - - } - } - return 0; -} - - -/* -* Write the STSD box -* -* Sample Description -* -*/ -void mj2_write_stsd(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STSD, 4); /* STSD */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(1, 4); /* entry_count = 1 (considering same JP2 headerboxes) */ - - if (tk->track_type == 0) { - mj2_write_smj2(tk); - } else if (tk->track_type == 1) { - // Not implemented - } - if (tk->track_type == 2) { - // Not implemented - } - - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STSD box -* -* Sample Description -* -*/ -int mj2_read_stsd(mj2_tk_t * tk, j2k_image_t * img) -{ - int i; - int entry_count, len_2skip; - - mj2_box_t box; - - mj2_read_boxhdr(&box); - - if (MJ2_STSD != box.type) { - fprintf(stderr, "Error: Expected STSD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in STSD box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in STSD box. Expected flag 0\n"); - return 1; - } - - entry_count = cio_read(4); - - if (tk->track_type == 0) { - for (i = 0; i < entry_count; i++) { - if (mj2_read_smj2(img, tk)) - return 1; - } - } else if (tk->track_type == 1) { - len_2skip = cio_read(4); // Not implemented -> skipping box - cio_skip(len_2skip - 4); - } else if (tk->track_type == 2) { - len_2skip = cio_read(4); // Not implemented -> skipping box - cio_skip(len_2skip - 4); - } - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STSD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STBL box -* -* Sample table box box -* -*/ -void mj2_write_stbl(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_STBL, 4); /* STBL */ - - mj2_write_stsd(tk); - mj2_write_stts(tk); - mj2_write_stsc(tk); - mj2_write_stsz(tk); - mj2_write_stco(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the STBL box -* -* Sample table box box -* -*/ -int mj2_read_stbl(mj2_tk_t * tk, j2k_image_t * img) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_STBL != box.type) { - fprintf(stderr, "Error: Expected STBL Marker\n"); - return 1; - } - - if (mj2_read_stsd(tk, img)) - return 1; - if (mj2_read_stts(tk)) - return 1; - if (mj2_read_stsc(tk)) - return 1; - if (mj2_read_stsz(tk)) - return 1; - if (mj2_read_stco(tk)) - return 1; - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with STBL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the URL box -* -* URL box -* -*/ -void mj2_write_url(mj2_tk_t * tk, int url_num) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_URL, 4); /* URL */ - - if (url_num == 0) - cio_write(1, 4); /* Version = 0, flags = 1 because stored in same file */ - else { - cio_write(0, 4); /* Version = 0, flags = 0 */ - cio_write(tk->url[url_num - 1].location[0], 4); - cio_write(tk->url[url_num - 1].location[1], 4); - cio_write(tk->url[url_num - 1].location[2], 4); - cio_write(tk->url[url_num - 1].location[3], 4); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the URL box -* -* URL box -* -*/ -int mj2_read_url(mj2_tk_t * tk, int urn_num) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_URL != box.type) { - fprintf(stderr, "Error: Expected URL Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in URL box\n"); - return 1; - } - - if (1 != cio_read(3)) { /* If flags = 1 --> media data in file */ - tk->url[urn_num].location[0] = cio_read(4); - tk->url[urn_num].location[1] = cio_read(4); - tk->url[urn_num].location[2] = cio_read(4); - tk->url[urn_num].location[3] = cio_read(4); - } else { - tk->num_url--; - } - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with URL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the URN box -* -* URN box -* -*/ -void mj2_write_urn(mj2_tk_t * tk, int urn_num) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_URN, 4); /* URN */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->urn[urn_num].name[0], 4); - cio_write(tk->urn[urn_num].name[1], 4); - cio_write(tk->urn[urn_num].name[2], 4); - cio_write(tk->urn[urn_num].name[3], 4); - cio_write(tk->urn[urn_num].location[0], 4); - cio_write(tk->urn[urn_num].location[1], 4); - cio_write(tk->urn[urn_num].location[2], 4); - cio_write(tk->urn[urn_num].location[3], 4); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the URN box -* -* URN box -* -*/ -int mj2_read_urn(mj2_tk_t * tk, int urn_num) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_URN != box.type) { - fprintf(stderr, "Error: Expected URN Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in URN box\n"); - return 1; - } - - if (1 != cio_read(3)) { /* If flags = 1 --> media data in file */ - tk->urn[urn_num].name[0] = cio_read(4); - tk->urn[urn_num].name[1] = cio_read(4); - tk->urn[urn_num].name[2] = cio_read(4); - tk->urn[urn_num].name[3] = cio_read(4); - tk->urn[urn_num].location[0] = cio_read(4); - tk->urn[urn_num].location[1] = cio_read(4); - tk->urn[urn_num].location[2] = cio_read(4); - tk->urn[urn_num].location[3] = cio_read(4); - } - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with URN Box size\n"); - return 1; - } - return 0; -} - - -/* -* Write the DREF box -* -* Data reference box -* -*/ -void mj2_write_dref(mj2_tk_t * tk) -{ - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_DREF, 4); /* DREF */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - if (tk->num_url + tk->num_urn == 0) { /* Media data in same file */ - cio_write(1, 4); /* entry_count = 1 */ - mj2_write_url(tk, 0); - } else { - cio_write(tk->num_url + tk->num_urn, 4); /* entry_count */ - - for (i = 0; i < tk->num_url; i++) - mj2_write_url(tk, i + 1); - - for (i = 0; i < tk->num_urn; i++) - mj2_write_urn(tk, i); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the DREF box -* -* Data reference box -* -*/ -int mj2_read_dref(mj2_tk_t * tk) -{ - - int i; - int entry_count, marker; - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_DREF != box.type) { - fprintf(stderr, "Error: Expected DREF Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in DREF box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in DREF box. Expected flag 0\n"); - return 1; - } - - entry_count = cio_read(4); - tk->num_url = 0; - tk->num_urn = 0; - - for (i = 0; i < entry_count; i++) { - cio_skip(4); - marker = cio_read(4); - if (marker == MJ2_URL) { - cio_skip(-8); - tk->num_url++; - if (mj2_read_url(tk, tk->num_url)) - return 1; - } else if (marker == MJ2_URN) { - cio_skip(-8); - tk->num_urn++; - if (mj2_read_urn(tk, tk->num_urn)) - return 1; - } else { - fprintf(stderr, "Error with in DREF box. Expected URN or URL box\n"); - return 1; - } - - } - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with DREF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the DINF box -* -* Data information box -* -*/ -void mj2_write_dinf(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_DINF, 4); /* DINF */ - - mj2_write_dref(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the DINF box -* -* Data information box -* -*/ -int mj2_read_dinf(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_DINF != box.type) { - fprintf(stderr, "Error: Expected DINF Marker\n"); - return 1; - } - - if (mj2_read_dref(tk)) - return 1; - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with DINF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the VMHD box -* -* Video Media information box -* -*/ -void mj2_write_vmhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_VMHD, 4); /* VMHD */ - - cio_write(1, 4); /* Version = 0, flags = 1 */ - - cio_write(tk->graphicsmode, 2); - cio_write(tk->opcolor[0], 2); - cio_write(tk->opcolor[1], 2); - cio_write(tk->opcolor[2], 2); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the VMHD box -* -* Video Media information box -* -*/ -int mj2_read_vmhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_VMHD != box.type) { - fprintf(stderr, "Error: Expected VMHD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in VMHD box\n"); - return 1; - } - - if (1 != cio_read(3)) { /* Flags = 1 */ - fprintf(stderr, "Error with flag in VMHD box. Expected flag 1\n"); - return 1; - } - - tk->track_type = 0; - tk->graphicsmode = cio_read(2); - tk->opcolor[0] = cio_read(2); - tk->opcolor[1] = cio_read(2); - tk->opcolor[2] = cio_read(2); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with VMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the SMHD box -* -* Sound Media information box -* -*/ -void mj2_write_smhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_SMHD, 4); /* SMHD */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->balance, 2); - - cio_write(0, 2); /* Reserved */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the SMHD box -* -* Sound Media information box -* -*/ -int mj2_read_smhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_SMHD != box.type) { - fprintf(stderr, "Error: Expected SMHD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in SMHD box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in SMHD box. Expected flag 0\n"); - return 1; - } - - tk->track_type = 1; - tk->balance = cio_read(2); - - /* Init variables to zero to avoid problems when freeeing memory - The values will possibly be overidded when decoding the track structure */ - tk->num_br = 0; - tk->num_url = 0; - tk->num_urn = 0; - tk->num_chunks = 0; - tk->num_tts = 0; - tk->num_samplestochunk = 0; - tk->num_samples = 0; - - cio_skip(2); /* Reserved */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with SMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the HMHD box -* -* Hint Media information box -* -*/ -void mj2_write_hmhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_HMHD, 4); /* HMHD */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->maxPDUsize, 2); - cio_write(tk->avgPDUsize, 2); - cio_write(tk->maxbitrate, 4); - cio_write(tk->avgbitrate, 4); - cio_write(tk->slidingavgbitrate, 4); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the HMHD box -* -* Hint Media information box -* -*/ -int mj2_read_hmhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_HMHD != box.type) { - fprintf(stderr, "Error: Expected HMHD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in HMHD box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in HMHD box. Expected flag 0\n"); - return 1; - } - - tk->track_type = 2; - tk->maxPDUsize = cio_read(2); - tk->avgPDUsize = cio_read(2); - tk->maxbitrate = cio_read(4); - tk->avgbitrate = cio_read(4); - tk->slidingavgbitrate = cio_read(4); - - /* Init variables to zero to avoid problems when freeeing memory - The values will possibly be overidded when decoding the track structure */ - tk->num_br = 0; - tk->num_url = 0; - tk->num_urn = 0; - tk->num_chunks = 0; - tk->num_tts = 0; - tk->num_samplestochunk = 0; - tk->num_samples = 0; - - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with HMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MINF box -* -* Media information box -* -*/ -void mj2_write_minf(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MINF, 4); /* MINF */ - - if (tk->track_type == 0) { - mj2_write_vmhd(tk); - } else if (tk->track_type == 1) { - mj2_write_smhd(tk); - } else if (tk->track_type == 2) { - mj2_write_hmhd(tk); - } - - mj2_write_dinf(tk); - mj2_write_stbl(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the MINF box -* -* Media information box -* -*/ -int mj2_read_minf(mj2_tk_t * tk, j2k_image_t * img) -{ - - unsigned int box_type; - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_MINF != box.type) { - fprintf(stderr, "Error: Expected MINF Marker\n"); - return 1; - } - - cio_skip(4); - box_type = cio_read(4); - cio_skip(-8); - - if (box_type == MJ2_VMHD) { - if (mj2_read_vmhd(tk)) - return 1; - } else if (box_type == MJ2_SMHD) { - if (mj2_read_smhd(tk)) - return 1; - } else if (box_type == MJ2_HMHD) { - if (mj2_read_hmhd(tk)) - return 1; - } else { - fprintf(stderr, "Error in MINF box expected vmhd, smhd or hmhd\n"); - return 1; - } - - if (mj2_read_dinf(tk)) - return 1; - - if (mj2_read_stbl(tk, img)) - return 1; - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with MINF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the HDLR box -* -* Handler reference box -* -*/ -void mj2_write_hdlr(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_HDLR, 4); /* HDLR */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(0, 4); /* Predefine */ - - tk->name = 0; /* The track name is immediately determined by the track type */ - - if (tk->track_type == 0) { - tk->handler_type = 0x76696465; /* Handler type: vide */ - cio_write(tk->handler_type, 4); - - cio_write(0, 4); - cio_write(0, 4); - cio_write(0, 4); /* Reserved */ - - cio_write(0x76696465, 4); - cio_write(0x6F206d65, 4); - cio_write(0x64696120, 4); - cio_write(0x74726163, 4); - cio_write(0x6b00, 2); /* String: video media track */ - } else if (tk->track_type == 1) { - tk->handler_type = 0x736F756E; /* Handler type: soun */ - cio_write(tk->handler_type, 4); - - cio_write(0, 4); - cio_write(0, 4); - cio_write(0, 4); /* Reserved */ - - cio_write(0x536F756E, 4); - cio_write(0x6400, 2); /* String: Sound */ - } else if (tk->track_type == 2) { - tk->handler_type = 0x68696E74; /* Handler type: hint */ - cio_write(tk->handler_type, 4); - - cio_write(0, 4); - cio_write(0, 4); - cio_write(0, 4); /* Reserved */ - - cio_write(0x48696E74, 4); - cio_write(0, 2); /* String: Hint */ - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the HDLR box -* -* Handler reference box -* -*/ -int mj2_read_hdlr(mj2_tk_t * tk) -{ - int i; - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_HDLR != box.type) { - fprintf(stderr, "Error: Expected HDLR Marker\n"); - return 1; - } - - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in HDLR box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in HDLR box. Expected flag 0\n"); - return 1; - } - - cio_skip(4); /* Reserved */ - - tk->handler_type = cio_read(4); - cio_skip(12); /* Reserved */ - - tk->name_size = box.length - 32; - - tk->name = (char *) malloc(tk->name_size * sizeof(char)); - for (i = 0; i < tk->name_size; i++) { - tk->name[i] = cio_read(1); /* Name */ - } - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with HDLR Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MDHD box -* -* Media Header Box -* -*/ -void mj2_write_mdhd(mj2_tk_t * tk) -{ - mj2_box_t box; - unsigned int i; - time_t ltime; - unsigned int modification_time; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MDHD, 4); /* MDHD */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - cio_write(tk->creation_time, 4); /* Creation Time */ - - time(<ime); /* Time since 1/1/70 */ - modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(modification_time, 4); /* Modification Time */ - - cio_write(tk->timescale, 4); /* Timescale */ - - tk->duration = 0; - - for (i = 0; i < tk->num_samples; i++) - tk->duration += tk->sample[i].sample_delta; - - cio_write(tk->duration, 4); /* Duration */ - - cio_write(tk->language, 2); /* Language */ - - cio_write(0, 2); /* Predefined */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the MDHD box -* -* Media Header Box -* -*/ -int mj2_read_mdhd(mj2_tk_t * tk) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (!(MJ2_MHDR == box.type || MJ2_MDHD == box.type)) { // Kakadu writes MHDR instead of MDHD - fprintf(stderr, "Error: Expected MDHD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in MDHD box\n"); - return 1; - } - - if (0 != cio_read(3)) { /* Flags = 0 */ - fprintf(stderr, "Error with flag in MDHD box. Expected flag 0\n"); - return 1; - } - - - tk->creation_time = cio_read(4); /* Creation Time */ - - tk->modification_time = cio_read(4); /* Modification Time */ - - tk->timescale = cio_read(4); /* Timescale */ - - tk->duration = cio_read(4); /* Duration */ - - tk->language = cio_read(2); /* Language */ - - cio_skip(2); /* Predefined */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with MDHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MDIA box -* -* Media box -* -*/ -void mj2_write_mdia(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MDIA, 4); /* MDIA */ - - mj2_write_mdhd(tk); - mj2_write_hdlr(tk); - mj2_write_minf(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the MDIA box -* -* Media box -* -*/ -int mj2_read_mdia(mj2_tk_t * tk, j2k_image_t * img) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_MDIA != box.type) { - fprintf(stderr, "Error: Expected MDIA Marker\n"); - return 1; - } - - if (mj2_read_mdhd(tk)) - return 1; - if (mj2_read_hdlr(tk)) - return 1; - if (mj2_read_minf(tk, img)) - return 1; - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with MDIA Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the TKHD box -* -* Track Header box -* -*/ -void mj2_write_tkhd(mj2_tk_t * tk) -{ - mj2_box_t box; - unsigned int i; - time_t ltime; - - box.init_pos = cio_tell(); - cio_skip(4); - - cio_write(MJ2_TKHD, 4); /* TKHD */ - - cio_write(3, 4); /* Version=0, flags=3 */ - - time(<ime); /* Time since 1/1/70 */ - tk->modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(tk->creation_time, 4); /* Creation Time */ - - cio_write(tk->modification_time, 4); /* Modification Time */ - - cio_write(tk->track_ID, 4); /* Track ID */ - - cio_write(0, 4); /* Reserved */ - - tk->duration = 0; - - for (i = 0; i < tk->num_samples; i++) - tk->duration += tk->sample[i].sample_delta; - - cio_write(tk->duration, 4); /* Duration */ - - cio_write(0, 4); /* Reserved */ - cio_write(0, 4); /* Reserved */ - - cio_write(tk->layer, 2); /* Layer */ - - cio_write(0, 2); /* Predefined */ - - cio_write(tk->volume, 2); /* Volume */ - - cio_write(0, 2); /* Reserved */ - - cio_write(tk->trans_matrix[0], 4); /* Transformation matrix for track */ - cio_write(tk->trans_matrix[1], 4); - cio_write(tk->trans_matrix[2], 4); - cio_write(tk->trans_matrix[3], 4); - cio_write(tk->trans_matrix[4], 4); - cio_write(tk->trans_matrix[5], 4); - cio_write(tk->trans_matrix[6], 4); - cio_write(tk->trans_matrix[7], 4); - cio_write(tk->trans_matrix[8], 4); - - cio_write(tk->visual_w, 4); /* Video Visual Width */ - - cio_write(tk->visual_h, 4); /* Video Visual Height */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the TKHD box -* -* Track Header box -* -*/ -int mj2_read_tkhd(mj2_tk_t * tk) -{ - int flag; - - mj2_box_t box; - - mj2_read_boxhdr(&box); - - if (MJ2_TKHD != box.type) { - fprintf(stderr, "Error: Expected TKHD Marker\n"); - return 1; - } - - if (0 != cio_read(1)) { /* Version = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in TKHD box\n"); - return 1; - } - - flag = cio_read(3); - - if (!(flag == 1 || flag == 2 || flag == 3 || flag == 4)) { /* Flags = 1,2,3 or 4 */ - fprintf(stderr, - "Error with flag in TKHD box: Expected flag 1,2,3 or 4\n"); - return 1; - } - - tk->creation_time = cio_read(4); /* Creation Time */ - - tk->modification_time = cio_read(4); /* Modification Time */ - - tk->track_ID = cio_read(4); /* Track ID */ - - cio_skip(4); /* Reserved */ - - tk->duration = cio_read(4); /* Duration */ - - cio_skip(8); /* Reserved */ - - tk->layer = cio_read(2); /* Layer */ - - cio_read(2); /* Predefined */ - - tk->volume = cio_read(2); /* Volume */ - - cio_skip(2); /* Reserved */ - - tk->trans_matrix[0] = cio_read(4); /* Transformation matrix for track */ - tk->trans_matrix[1] = cio_read(4); - tk->trans_matrix[2] = cio_read(4); - tk->trans_matrix[3] = cio_read(4); - tk->trans_matrix[4] = cio_read(4); - tk->trans_matrix[5] = cio_read(4); - tk->trans_matrix[6] = cio_read(4); - tk->trans_matrix[7] = cio_read(4); - tk->trans_matrix[8] = cio_read(4); - - tk->visual_w = cio_read(4); /* Video Visual Width */ - - tk->visual_h = cio_read(4); /* Video Visual Height */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with TKHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the TRAK box -* -* Track box -* -*/ -void mj2_write_trak(mj2_tk_t * tk) -{ - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - - cio_write(MJ2_TRAK, 4); /* TRAK */ - - mj2_write_tkhd(tk); - mj2_write_mdia(tk); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the TRAK box -* -* Track box -* -*/ -int mj2_read_trak(mj2_tk_t * tk, j2k_image_t * img) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_TRAK != box.type) { - fprintf(stderr, "Error: Expected TRAK Marker\n"); - return 1; - } - if (mj2_read_tkhd(tk)) - return 1; - if (mj2_read_mdia(tk, img)) - return 1; - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with TRAK Box\n"); - return 1; - } - return 0; -} - -/* -* Write the MVHD box -* -* Movie header Box -* -*/ -void mj2_write_mvhd(mj2_movie_t * movie) -{ - int i; - mj2_box_t box; - unsigned j; - time_t ltime; - int max_tk_num = 0; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MVHD, 4); /* MVHD */ - - cio_write(0, 4); /* Version = 0, flags = 0 */ - - time(<ime); /* Time since 1/1/70 */ - movie->modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(movie->creation_time, 4); /* Creation Time */ - - cio_write(movie->modification_time, 4); /* Modification Time */ - - cio_write(movie->timescale, 4); /* Timescale */ - - movie->duration = 0; - - for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { - mj2_tk_t *tk = &movie->tk[i]; - - for (j = 0; j < tk->num_samples; j++) { - movie->duration += tk->sample[j].sample_delta; - } - } - - cio_write(movie->duration, 4); - - cio_write(movie->rate, 4); /* Rate to play presentation */ - - cio_write(movie->volume, 2); /* Volume */ - - cio_write(0, 2); /* Reserved */ - cio_write(0, 4); /* Reserved */ - cio_write(0, 4); /* Reserved */ - - cio_write(movie->trans_matrix[0], 4); /* Transformation matrix for video */ - cio_write(movie->trans_matrix[1], 4); - cio_write(movie->trans_matrix[2], 4); - cio_write(movie->trans_matrix[3], 4); - cio_write(movie->trans_matrix[4], 4); - cio_write(movie->trans_matrix[5], 4); - cio_write(movie->trans_matrix[6], 4); - cio_write(movie->trans_matrix[7], 4); - cio_write(movie->trans_matrix[8], 4); - - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - cio_write(0, 4); /* Pre-defined */ - - - for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { - if (max_tk_num < movie->tk[i].track_ID) - max_tk_num = movie->tk[i].track_ID; - } - - movie->next_tk_id = max_tk_num + 1; - - cio_write(movie->next_tk_id, 4); /* ID of Next track to be added */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the MVHD box -* -* Movie header Box -* -*/ -int mj2_read_mvhd(mj2_movie_t * movie) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box); - if (MJ2_MVHD != box.type) { - fprintf(stderr, "Error: Expected MVHD Marker\n"); - return 1; - } - - - if (0 != cio_read(4)) { /* Version = 0, flags = 0 */ - fprintf(stderr, "Error: Only Version 0 handled in MVHD box\n"); - } - - movie->creation_time = cio_read(4); /* Creation Time */ - - movie->modification_time = cio_read(4); /* Modification Time */ - - movie->timescale = cio_read(4); /* Timescale */ - - movie->duration = cio_read(4); /* Duration */ - - movie->rate = cio_read(4); /* Rate to play presentation */ - - movie->volume = cio_read(2); /* Volume */ - - cio_skip(10); /* Reserved */ - - movie->trans_matrix[0] = cio_read(4); /* Transformation matrix for video */ - movie->trans_matrix[1] = cio_read(4); - movie->trans_matrix[2] = cio_read(4); - movie->trans_matrix[3] = cio_read(4); - movie->trans_matrix[4] = cio_read(4); - movie->trans_matrix[5] = cio_read(4); - movie->trans_matrix[6] = cio_read(4); - movie->trans_matrix[7] = cio_read(4); - movie->trans_matrix[8] = cio_read(4); - - cio_skip(24); /* Pre-defined */ - - movie->next_tk_id = cio_read(4); /* ID of Next track to be added */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with MVHD Box Size\n"); - return 1; - } - return 0; -} - - -/* -* Write the MOOV box -* -* Movie Box -* -*/ -void mj2_write_moov(mj2_movie_t * movie) -{ - int i; - mj2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MOOV, 4); /* MOOV */ - - mj2_write_mvhd(movie); - - for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { - mj2_write_trak(&movie->tk[i]); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); - -} - -/* -* Read the MOOV box -* -* Movie Box -* -*/ -int mj2_read_moov(mj2_movie_t * movie, j2k_image_t * img) -{ - unsigned int i; - mj2_box_t box; - mj2_box_t box2; - - mj2_read_boxhdr(&box); - if (MJ2_MOOV != box.type) { - fprintf(stderr, "Error: Expected MOOV Marker\n"); - return 1; - } - - - - if (mj2_read_mvhd(movie)) - return 1; - - - movie->tk = - (mj2_tk_t *) malloc((movie->next_tk_id - 1) * sizeof(mj2_tk_t)); - - for (i = 0; cio_tell() - box.init_pos < box.length; i++) { - mj2_read_boxhdr(&box2); - if (box2.type == MJ2_TRAK) { - cio_seek(box2.init_pos); - if (mj2_read_trak(&movie->tk[i], img)) - return 1; - - if (movie->tk[i].track_type == 0) { - movie->num_vtk++; - } else if (movie->tk[i].track_type == 1) { - movie->num_stk++; - } else if (movie->tk[i].track_type == 2) { - movie->num_htk++; - } - } else if (box2.type == MJ2_MVEX) { - cio_seek(box2.init_pos); - cio_skip(box2.length); - i--; - } else { - fprintf(stderr, "Error with MOOV Box: Expected TRAK or MVEX box\n"); - return 1; - } - } - return 0; -} - -int mj2_read_struct(FILE *file, mj2_movie_t * movie) { - mj2_box_t box; - j2k_image_t img; - char * src; - int fsresult; - int foffset; - - movie->num_vtk=0; - movie->num_stk=0; - movie->num_htk=0; - - src = (char*) malloc (300 * sizeof(char)); - fread(src,300,1, file); // Assuming that jp and ftyp markers size do - // not exceed 300 bytes - - cio_init(src, 300); - - if (mj2_read_jp()) - return 1; - if (mj2_read_ftyp(movie)) - return 1; - - fsresult = fseek(file,cio_tell(),SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read data after FTYP box\n" ); - return 1; - } - - foffset = cio_tell(); - - box.type = 0; - - fread(src,30,1,file); - cio_init(src, 30); - mj2_read_boxhdr(&box); - - while(box.type != MJ2_MOOV) { - - switch(box.type) - { - case MJ2_MDAT: - fsresult = fseek(file,foffset+box.length,SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read MDAT box\n" ); - return 1; - } - foffset += box.length; - break; - - case MJ2_MOOF: - fsresult = fseek(file,foffset+box.length,SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read MOOF box\n" ); - return 1; - } - foffset += box.length; - break; - case MJ2_FREE: - fsresult = fseek(file,foffset+box.length,SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read FREE box\n" ); - return 1; - } - foffset += box.length; - break; - case MJ2_SKIP: - fsresult = fseek(file,foffset+box.length,SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read SKIP box\n" ); - return 1; - } - foffset += box.length; - break; - default: - fprintf(stderr, "Unknown box in MJ2 stream\n"); - fsresult = fseek(file,foffset+box.length,SEEK_SET); - if( fsresult ) { - fprintf(stderr, "End of file reached while trying to read end of unknown box\n"); - return 1; - } - foffset += box.length; - break; - } - fsresult = fread(src,8,1,file); - if (fsresult != 1) { - fprintf(stderr, "MOOV box not found in file\n"); - return 1; - } - cio_init(src, 8); - mj2_read_boxhdr(&box); - } - - fseek(file,foffset,SEEK_SET); - src = realloc(src,box.length); - fsresult = fread(src,box.length,1,file); - if (fsresult != 1) { - fprintf(stderr, "End of file reached while trying to read MOOV box\n"); - return 1; - } - - cio_init(src, box.length); - - if (mj2_read_moov(movie, &img)) - return 1; - - free(src); - return 0; -} diff --git a/mj2/MJ2_codec/mj2.h b/mj2/MJ2_codec/mj2.h deleted file mode 100644 index 0ba4897d..00000000 --- a/mj2/MJ2_codec/mj2.h +++ /dev/null @@ -1,201 +0,0 @@ -/* -* Copyright (c) 2003-2004, François-Olivier Devaux -* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium -* All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#ifndef __MJ2_H -#define __MJ2_H - -typedef struct { /* Time To Sample */ - int sample_count; - int sample_delta; -} mj2_tts_t; - -typedef struct { /* Chunk */ - int num_samples; - int sample_descr_idx; - int offset; -} mj2_chunk_t; - -typedef struct { /* Sample to chunk */ - int first_chunk; - int samples_per_chunk; - int sample_descr_idx; -} mj2_sampletochunk_t; - -typedef struct { /* Sample */ - unsigned int sample_size; - unsigned int offset; - unsigned int sample_delta; -} mj2_sample_t; - -typedef struct { /* URL */ - int location[4]; -} mj2_url_t; - -typedef struct { /* URN */ - int name[2]; - int location[4]; -} mj2_urn_t; - -typedef struct { /* Video Track Parameters */ - int track_ID; - int track_type; - unsigned int creation_time; - unsigned int modification_time; - int duration; - int timescale; - int layer; - int volume; - int language; - int balance; - int maxPDUsize; - int avgPDUsize; - int maxbitrate; - int avgbitrate; - int slidingavgbitrate; - int graphicsmode; - int opcolor[3]; - int num_url; - mj2_url_t *url; - int num_urn; - mj2_urn_t *urn; - int Dim[2]; - int w; - int h; - int visual_w; - int visual_h; - int CbCr_subsampling_dx; - int CbCr_subsampling_dy; - // int subsampling_dx; - // int subsampling_dy; - int sample_rate; - int sample_description; - int horizresolution; - int vertresolution; - int compressorname[8]; - int depth; - unsigned char fieldcount; - unsigned char fieldorder; - unsigned char or_fieldcount; - unsigned char or_fieldorder; - int num_br; - unsigned int *br; - unsigned char num_jp2x; - unsigned char *jp2xdata; - unsigned char hsub; - unsigned char vsub; - unsigned char hoff; - unsigned char voff; - int trans_matrix[9]; - unsigned int num_samples; /* Number of samples */ - int transorm; - int handler_type; - int name_size; - unsigned char same_sample_size; - int num_tts; - mj2_tts_t *tts; /* Time to sample */ - unsigned int num_chunks; - mj2_chunk_t *chunk; - int num_samplestochunk; - mj2_sampletochunk_t *sampletochunk; - char *name; - jp2_struct_t jp2_struct; - mj2_sample_t *sample; /* Sample parameters */ -} mj2_tk_t; /* Track Parameters */ - -typedef struct { /* Movie */ - unsigned int brand; - unsigned int minversion; - int num_cl; - unsigned int *cl; - unsigned int creation_time; - unsigned int modification_time; - int timescale; - unsigned int duration; - int rate; - int num_vtk; - int num_stk; - int num_htk; - int volume; - int trans_matrix[9]; - int next_tk_id; - mj2_tk_t *tk; /* Track Parameters */ -} mj2_movie_t; - -typedef struct { - int length; - int type; - int init_pos; -} mj2_box_t; - -void mj2_write_jp(); - -void mj2_write_ftyp(mj2_movie_t * movie); - -/* - * Use this function to initialize a standard movie with standard values - * It has one sample per chunk - */ -int mj2_init_stdmovie(mj2_movie_t * movie); - - -/* int mj2_encode(mj2_movie_t * movie, j2k_cp_t * cp, char *index); - * - * Encode a MJ2 movie from a yuv file - * movie: an existing mj2_movie structure (to create a standard one, use mj2_init_stdmovie - * cp: coding parameters of j2k images - * index: index file name - */ -int mj2_encode(mj2_movie_t * movie, j2k_cp_t * cp, char *index); - - -/* int mj2_decode(unsigned char *src, int len, mj2_movie_t * movie, - * j2k_cp_t * cp, char *outfile); - * - * Decode a MJ2 movie to a yuv file - * src: pointer to memory where frames will be stored - * movie: a mj2_movie structure - * cp: coding parameters of j2k images - * outfile: yuv file name - */ -int mj2_decode(unsigned char *src, int len, mj2_movie_t * movie, - j2k_cp_t * cp, char *outfile); - - -/* - * Free memory used to encode and decode mj2 files - * - */ -void mj2_memory_free(mj2_movie_t * movie); - -int mj2_read_struct(FILE *file, mj2_movie_t * movie); - -void mj2_write_moov(mj2_movie_t * movie); - -#endif diff --git a/mj2/MJ2_codec/mj2_convert.h b/mj2/MJ2_codec/mj2_convert.h deleted file mode 100644 index e02bd430..00000000 --- a/mj2/MJ2_codec/mj2_convert.h +++ /dev/null @@ -1,16 +0,0 @@ -#include "mj2.h" - -#ifndef __MJ2_CONVERT_H -#define __MJ2_CONVERT_H - -int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile); - -int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile); - -int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img, - int frame_num, int subsampling_dx, int subsampling_dy); - -int yuv_num_frames(mj2_tk_t * tk, FILE *f); - - -#endif diff --git a/mj2/MJ2_codec/mj2_to_frames.c b/mj2/MJ2_codec/mj2_to_frames.c deleted file mode 100644 index 39415f35..00000000 --- a/mj2/MJ2_codec/mj2_to_frames.c +++ /dev/null @@ -1,134 +0,0 @@ -#include -#ifdef WIN32 -#include -#else -#include -#endif -#include - -#include "mj2.h" -#include "mj2_convert.h" -#include - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM - -jmp_buf j2k_error; - -int main(int argc, char *argv[]) { - - unsigned int tnum, snum; - mj2_movie_t movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[50]; - j2k_image_t img; - j2k_cp_t cp; - int i; - - cp.layer=0; - cp.reduce=0; - - if (argc != 3) { - printf("Bad syntax: Usage: mj2_to_frames inputfile.mj2 outputfile.yuv\n"); - printf("Example: MJ2_decoder foreman.mj2 foreman.yuv\n"); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - // Checking output file - outfile = fopen(argv[2], "w"); - if (!file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - fclose(outfile); - - if (mj2_read_struct(file, &movie)) // Creating the movie structure - return 1; - - - // Decode first video track - tnum = 0; - while (movie.tk[tnum].track_type != 0) - tnum ++; - - track = &movie.tk[tnum]; - - // Output info on first video tracl - fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", - track->num_samples, track->w, track->h); - - for (snum=0; snum < track->num_samples; snum++) - { - fprintf(stdout,"Frame %d: ",snum+1); - sample = &track->sample[snum]; - frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker - fseek(file,sample->offset+8,SEEK_SET); - fread(frame_codestream,sample->sample_size-8,1, file); // Assuming that jp and ftyp markers size do - - if (!j2k_decode(frame_codestream, sample->sample_size-8, &img, &cp)) // Decode J2K to image - return 1; - - if (((img.numcomps == 3) && (img.comps[0].dx == img.comps[1].dx / 2) - && (img.comps[0].dx == img.comps[2].dx / 2 ) && (img.comps[0].dx == 1)) - || (img.numcomps == 1)) { - - if (imagetoyuv(&img, &cp, argv[2])) // Convert image to YUV - return 1; - } - else if ((img.numcomps == 3) && - (img.comps[0].dx == 1) && (img.comps[1].dx == 1)&& - (img.comps[2].dx == 1))// If YUV 4:4:4 input --> to bmp - { - fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n"); - sprintf(outfilename,"output_%d.bmp",snum); - if (imagetobmp(&img, &cp, outfilename)) // Convert image to YUV - return 1; - - } - else { - fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); - fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); - - sprintf(outfilename,"output_%d.j2k",snum); - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n",outfilename); - return 1; - } - fwrite(frame_codestream,sample->sample_size-8,1,outfile); - fclose(outfile); - } - for (i=0; i -#ifdef WIN32 -#include -#else -#include -#endif -#include -#include - -#include "mj2.h" -#include -#include -#include - -#define MJ2_MJ2 0x6d6a7032 -#define MJ2_MJ2S 0x6d6a3273 -#define JP2_JP2C 0x6a703263 -#define MJ2_MDAT 0x6d646174 - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM - -jmp_buf j2k_error; - -void j2k_read_siz_marker(FILE *file, j2k_image_t *j2k_img) -{ - int len,i; - char buf, buf2[2]; - char *siz_buffer; - - fseek(file, 0, SEEK_SET); - do { - fread(&buf,1,1, file); - if (buf==(char)0xff) - fread(&buf,1,1, file); - } - while (!(buf==(char)0x51)); - - fread(buf2,2,1,file); /* Lsiz */ - len = ((buf2[0])<<8) + buf2[1]; - - siz_buffer = (char*) malloc(len * sizeof(char)); - fread(siz_buffer,len, 1, file); - cio_init(siz_buffer,len); - - cio_read(2); /* Rsiz (capabilities) */ - j2k_img->x1 = cio_read(4); /* Xsiz */ - j2k_img->y1 = cio_read(4); /* Ysiz */ - j2k_img->x0 = cio_read(4); /* X0siz */ - j2k_img->y0 = cio_read(4); /* Y0siz */ - cio_skip(16); /* XTsiz, YTsiz, XT0siz, YT0siz */ - - j2k_img->numcomps = cio_read(2); /* Csiz */ - j2k_img->comps = - (j2k_comp_t *) malloc(j2k_img->numcomps * sizeof(j2k_comp_t)); - for (i = 0; i < j2k_img->numcomps; i++) { - int tmp; - tmp = cio_read(1); /* Ssiz_i */ - j2k_img->comps[i].prec = (tmp & 0x7f) + 1; - j2k_img->comps[i].sgnd = tmp >> 7; - j2k_img->comps[i].dx = cio_read(1); /* XRsiz_i */ - j2k_img->comps[i].dy = cio_read(1); /* YRsiz_i */ - j2k_img->comps[i].resno_decoded = 0; /* number of resolution decoded */ - j2k_img->comps[i].factor = 0; /* reducing factor by component */ - } - free(siz_buffer); - fseek(file, 0, SEEK_SET); -} - -void setparams(mj2_movie_t *movie, j2k_image_t *img) { - int i, depth_0, depth, sign; - - movie->tk[0].sample_rate = 25; - movie->tk[0].w = int_ceildiv(img->x1 - img->x0, img->comps[0].dx); - movie->tk[0].h = int_ceildiv(img->y1 - img->y0, img->comps[0].dy); - mj2_init_stdmovie(movie); - - movie->tk[0].depth = img->comps[0].prec; - - if (img->numcomps==3) { - if ((img->comps[0].dx == 1) && (img->comps[1].dx == 1) && (img->comps[1].dx == 1)) - movie->tk[0].CbCr_subsampling_dx = 1; - else if ((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && (img->comps[1].dx == 2)) - movie->tk[0].CbCr_subsampling_dx = 2; - else - fprintf(stderr,"Image component sizes are incoherent\n"); - - if ((img->comps[0].dy == 1) && (img->comps[1].dy == 1) && (img->comps[1].dy == 1)) - movie->tk[0].CbCr_subsampling_dy = 1; - else if ((img->comps[0].dy == 1) && (img->comps[1].dy == 2) && (img->comps[1].dy == 2)) - movie->tk[0].CbCr_subsampling_dy = 2; - else - fprintf(stderr,"Image component sizes are incoherent\n"); - } - - movie->tk[0].sample_rate = 25; - - movie->tk[0].jp2_struct.numcomps = img->numcomps; // NC - jp2_init_stdjp2(&movie->tk[0].jp2_struct); - - movie->tk[0].jp2_struct.w = int_ceildiv(img->x1 - img->x0, img->comps[0].dx); - movie->tk[0].jp2_struct.h = int_ceildiv(img->y1 - img->y0, img->comps[0].dy); - - depth_0 = img->comps[0].prec - 1; - sign = img->comps[0].sgnd; - movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); - - for (i = 1; i < img->numcomps; i++) { - depth = img->comps[i].prec - 1; - sign = img->comps[i].sgnd; - if (depth_0 != depth) - movie->tk[0].jp2_struct.bpc = 255; - } - - for (i = 0; i < img->numcomps; i++) - movie->tk[0].jp2_struct.comps[i].bpcc = - img->comps[i].prec - 1 + (img->comps[i].sgnd << 7); - - if ((img->numcomps == 1 || img->numcomps == 3) - && (movie->tk[0].jp2_struct.bpc != 255)) - movie->tk[0].jp2_struct.meth = 1; - else - movie->tk[0].jp2_struct.meth = 2; - - if (img->numcomps == 1) - movie->tk[0].jp2_struct.enumcs = 17; // Grayscale - - else if ((img->comps[0].dx == 1) && (img->comps[1].dx == 1) && (img->comps[1].dx == 1) && - (img->comps[0].dy == 1) && (img->comps[1].dy == 1) && (img->comps[1].dy == 1)) - movie->tk[0].jp2_struct.enumcs = 16; // RGB - - else if ((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && (img->comps[1].dx == 2) && - (img->comps[0].dy == 1) && (img->comps[1].dy == 2) && (img->comps[1].dy == 2)) - movie->tk[0].jp2_struct.enumcs = 18; // YUV - - else - movie->tk[0].jp2_struct.enumcs = 0; // Unkown profile */ -} - -int main(int argc, char *argv[]) { - - unsigned int snum; - mj2_movie_t movie; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *mj2file, *j2kfile; - char j2kfilename[50]; - char *buf; - int offset, mdat_initpos; - j2k_image_t img; - int i; - - if (argc != 3) { - printf("Bad syntax: Usage: MJ2_Wrapper source_location mj2_filename\n"); - printf("Example: MJ2_Wrapper input/input output.mj2\n"); - return 1; - } - - mj2file = fopen(argv[2], "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - - // Initialing the movie (parameters used in the JP and FTYP boxes - movie.num_htk = 0; // No hint tracks - movie.num_stk = 0; // No sound tracks - movie.num_vtk = 1; // One video track - movie.tk = (mj2_tk_t*) malloc (sizeof(mj2_tk_t)); //Memory allocation for the video track - movie.tk[0].sample = (mj2_sample_t*) malloc (sizeof(mj2_sample_t)); - movie.tk[0].chunk = (mj2_chunk_t *) malloc(sizeof(mj2_chunk_t)); - movie.tk[0].track_type = 0; // Video track - movie.tk[0].track_ID = 1; // Track ID = 1 - movie.brand = MJ2_MJ2; // One brand: MJ2 - movie.num_cl = 2; // Two compatible brands: MJ2 and MJ2S - movie.cl = (unsigned int *) malloc(movie.num_cl * sizeof(unsigned int)); - movie.cl[0] = MJ2_MJ2; - movie.cl[1] = MJ2_MJ2S; - movie.minversion = 0; // Minimum version: 0 - - // Writing JP, FTYP and MDAT boxes - buf = (char*) malloc (300 * sizeof(char)); // Assuming that the JP and FTYP - // boxes won't be longer than 300 bytes - cio_init(buf , 300); - mj2_write_jp(); - mj2_write_ftyp(&movie); - mdat_initpos = cio_tell(); - cio_skip(4); - cio_write(MJ2_MDAT, 4); - fwrite(buf,cio_tell(),1,mj2file); - free(buf); - - // Insert each j2k codestream in a JP2C box - snum=0; - offset = 0; - while(1) - { - sample = &movie.tk[0].sample[snum]; - sprintf(j2kfilename,"%s_%d.j2k",argv[1],snum); - j2kfile = fopen(j2kfilename, "rb"); - if (!j2kfile) { - if (snum==0) { // Could not open a single codestream - fprintf(stderr, "failed to open %s for reading\n",j2kfilename); - return 1; - } - else { // Tried to open a inexistant codestream - fprintf(stdout,"%d frames created\n",snum); - break; - } - } - // Calculating offset for samples and chunks - offset += cio_tell(); - sample->offset = offset; - movie.tk[0].chunk[snum].offset = offset; // There will be one sample per chunk - - // Calculating sample size - fseek(j2kfile,0,SEEK_END); - sample->sample_size = ftell(j2kfile) + 8; // Sample size is codestream + JP2C box header - fseek(j2kfile,0,SEEK_SET); - - // Reading siz marker of j2k image for the first codestream - if (snum==0) - j2k_read_siz_marker(j2kfile, &img); - - // Writing JP2C box header - frame_codestream = (unsigned char*) malloc (sample->sample_size+8); - cio_init(frame_codestream, sample->sample_size); - cio_write(sample->sample_size, 4); // Sample size - cio_write(JP2_JP2C, 4); // JP2C - - // Writing codestream from J2K file to MJ2 file - fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); - fwrite(frame_codestream,sample->sample_size,1,mj2file); - cio_skip(sample->sample_size-8); - - // Ending loop - fclose(j2kfile); - snum++; - movie.tk[0].sample = realloc(movie.tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); - movie.tk[0].chunk = realloc(movie.tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); - free(frame_codestream); - } - - // Writing the MDAT box length in header - offset += cio_tell(); - buf = (char*) malloc (4 * sizeof(char)); - cio_init(buf,4); - cio_write(offset-mdat_initpos,4); // Write MDAT length in MDAT box header - fseek(mj2file,(long)mdat_initpos,SEEK_SET); - fwrite(buf,4,1,mj2file); - fseek(mj2file,0,SEEK_END); - free(buf); - - // Setting movie parameters - movie.tk[0].num_samples=snum; - movie.tk[0].num_chunks=snum; - setparams(&movie, &img); - - // Writing MOOV box - i=1; - buf = (char*) malloc (10000 * sizeof(char)); - cio_init(buf , i*10000); - if (setjmp(j2k_error)) { - i++; - buf = realloc(buf,i*10000* sizeof(char)); - cio_init(buf , i*10000); - } - mj2_write_moov(&movie); - fwrite(buf,cio_tell(),1,mj2file); - - // Ending program - fclose(mj2file); - free(img.comps); - free(buf); - mj2_memory_free(&movie); - - - //MEMORY LEAK - #ifdef _DEBUG - _CrtDumpMemoryLeaks(); - #endif - //MEM - - return 0; -} \ No newline at end of file diff --git a/mj2/Makefile b/mj2/Makefile new file mode 100644 index 00000000..18d6030d --- /dev/null +++ b/mj2/Makefile @@ -0,0 +1,20 @@ +# Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2 + +CFLAGS = -O3 -lstdc++ # -g -p -pg + +all: frames_to_mj2 mj2_to_frames extract_j2k_from_mj2 wrap_j2k_in_mj2 + +frames_to_mj2: frames_to_mj2.c ../libopenjpeg.a + gcc $(CFLAGS) compat/getopt.c mj2_convert.c mj2.c frames_to_mj2.c -o frames_to_mj2 -L.. -lopenjpeg -I ../libopenjpeg/ -lm + +mj2_to_frames: mj2_to_frames.c ../libopenjpeg.a + gcc $(CFLAGS) compat/getopt.c mj2_convert.c mj2.c mj2_to_frames.c -o mj2_to_frames -L.. -lopenjpeg -I ../libopenjpeg/ -lm + +extract_j2k_from_mj2: extract_j2k_from_mj2.c ../libopenjpeg.a + gcc $(CFLAGS) mj2.c extract_j2k_from_mj2.c -o extract_j2k_from_mj2 -L.. -lopenjpeg -I ../libopenjpeg/ -lm + +wrap_j2k_in_mj2: wrap_j2k_in_mj2.c ../libopenjpeg.a + gcc $(CFLAGS) mj2.c wrap_j2k_in_mj2.c -o wrap_j2k_in_mj2 -L.. -lopenjpeg -I ../libopenjpeg/ -lm + +clean: + rm -f frames_to_mj2 mj2_to_frames extract_j2k_from_mj2 wrap_j2k_in_mj2 diff --git a/mj2/MJ2_codec/compat/getopt.c b/mj2/compat/getopt.c similarity index 100% rename from mj2/MJ2_codec/compat/getopt.c rename to mj2/compat/getopt.c diff --git a/mj2/MJ2_codec/compat/getopt.h b/mj2/compat/getopt.h similarity index 100% rename from mj2/MJ2_codec/compat/getopt.h rename to mj2/compat/getopt.h diff --git a/mj2/extract_j2k_from_mj2.c b/mj2/extract_j2k_from_mj2.c new file mode 100644 index 00000000..eff86063 --- /dev/null +++ b/mj2/extract_j2k_from_mj2.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" +#include "mj2.h" + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + + +int main(int argc, char *argv[]) { + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + int tnum; + unsigned int snum; + opj_mj2_t *movie; + mj2_tk_t *track; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *file, *outfile; + char outfilename[50]; + mj2_dparameters_t parameters; + + if (argc != 3) { + printf("Bad syntax: Usage: MJ2_extractor mj2filename output_location\n"); + printf("Example: MJ2_extractor foreman.mj2 output/foreman\n"); + return 1; + } + + file = fopen(argv[1], "rb"); + + if (!file) { + fprintf(stderr, "failed to open %s for reading\n", argv[1]); + return 1; + } + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + movie = (opj_mj2_t*) dinfo->mj2_handle; + mj2_setup_decoder(dinfo->mj2_handle, ¶meters); + + if (mj2_read_struct(file, movie)) // Creating the movie structure + return 1; + + // Decode first video track + tnum = 0; + while (movie->tk[tnum].track_type != 0) + tnum ++; + + track = &movie->tk[tnum]; + + fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); + + for (snum=0; snum < track->num_samples; snum++) + { + sample = &track->sample[snum]; + frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker + fseek(file,sample->offset+8,SEEK_SET); + fread(frame_codestream,sample->sample_size-8,1, file); // Assuming that jp and ftyp markers size do + + sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); + outfile = fopen(outfilename, "wb"); + if (!outfile) { + fprintf(stderr, "failed to open %s for writing\n",outfilename); + return 1; + } + fwrite(frame_codestream,sample->sample_size-8,1,outfile); + fclose(outfile); + free(frame_codestream); + } + fclose(file); + fprintf(stdout, "%d frames correctly extracted\n", snum); + + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); + } + + return 0; +} diff --git a/mj2/frames_to_mj2.c b/mj2/frames_to_mj2.c new file mode 100644 index 00000000..0ab8fc12 --- /dev/null +++ b/mj2/frames_to_mj2.c @@ -0,0 +1,811 @@ +/* +* Copyright (c) 2003-2004, François-Olivier Devaux +* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "opj_includes.h" +#include "mj2.h" +#include "mj2_convert.h" +#include "compat/getopt.h" + +/** +Size of memory first allocated for MOOV box +*/ +#define TEMP_BUF 10000 + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + + +void help_display() +{ + fprintf(stdout,"HELP\n----\n\n"); + fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + + + fprintf(stdout,"List of parameters for the MJ2 encoder:\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"REMARKS:\n"); + fprintf(stdout,"---------\n"); + fprintf(stdout,"\n"); + fprintf + (stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); + fprintf + (stdout,"COD and QCD never appear in the tile_header.\n"); + fprintf(stdout,"\n"); + fprintf + (stdout,"- This coder can encode a mega image, a test was made on a 24000x24000 pixels \n"); + fprintf + (stdout,"color image. You need enough disk space memory (twice the original) to encode \n"); + fprintf + (stdout,"the image,i.e. for a 1.5 GB image you need a minimum of 3GB of disk memory)\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"By default:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout," * Lossless\n"); + fprintf(stdout," * 1 tile\n"); + fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); + fprintf(stdout," * Size of code-block : 64 x 64\n"); + fprintf(stdout," * Number of resolutions: 6\n"); + fprintf(stdout," * No SOP marker in the codestream\n"); + fprintf(stdout," * No EPH marker in the codestream\n"); + fprintf(stdout," * No sub-sampling in x or y direction\n"); + fprintf(stdout," * No mode switch activated\n"); + fprintf(stdout," * Progression order: LRCP\n"); + fprintf(stdout," * No index file\n"); + fprintf(stdout," * No ROI upshifted\n"); + fprintf(stdout," * No offset of the origin of the image\n"); + fprintf(stdout," * No offset of the origin of the tiles\n"); + fprintf(stdout," * Reversible DWT 5-3\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Parameters:\n"); + fprintf(stdout,"------------\n"); + fprintf(stdout,"\n"); + fprintf + (stdout,"Required Parameters (except with -h):\n"); + fprintf + (stdout,"-i : source file (-i source.yuv) \n"); + fprintf + (stdout,"-o : destination file (-o dest.mj2) \n"); + fprintf + (stdout,"Optional Parameters:\n"); + fprintf(stdout,"-h : display the help information \n"); + fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); + fprintf(stdout," - The rate specified for each quality level is the desired \n"); + fprintf(stdout," compression factor.\n"); + fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); + fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); + fprintf(stdout," (options -r and -q cannot be used together)\n "); + + fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); + + fprintf(stdout," (options -r and -q cannot be used together)\n "); + + fprintf(stdout,"-n : number of resolutions (-n 3) \n"); + fprintf(stdout,"-b : size of code block (-b 32,32) \n"); + fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); + fprintf(stdout,"-t : size of tile (-t 512,512) \n"); + fprintf + (stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); + fprintf + (stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); + fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); + fprintf + (stdout,"-SOP : write SOP marker before each packet \n"); + fprintf + (stdout,"-EPH : write EPH marker after each header packet \n"); + fprintf + (stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); + fprintf + (stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); + fprintf + (stdout," Indicate multiple modes by adding their values. \n"); + fprintf + (stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); + fprintf + (stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); + fprintf + (stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); + fprintf + (stdout," for component c=%%d [%%d = 0,1,2]\n"); + fprintf + (stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); + fprintf + (stdout,"-d : offset of the origin of the image (-d 150,300) \n"); + fprintf + (stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); + fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); + fprintf(stdout,"-W : image width, height and the dx and dy subsampling \n"); + fprintf(stdout," of the Cb and Cr components for YUV files \n"); + fprintf(stdout," (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); + fprintf(stdout,"-F : video frame rate (set to 25 by default)\n"); + + fprintf(stdout,"\n"); + fprintf(stdout,"IMPORTANT:\n"); + fprintf(stdout,"-----------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"The index file has the structure below:\n"); + fprintf(stdout,"---------------------------------------\n"); + fprintf(stdout,"\n"); + fprintf(stdout,"Image_height Image_width\n"); + fprintf(stdout,"progression order\n"); + fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); + fprintf(stdout,"Components_nb\n"); + fprintf(stdout,"Layers_nb\n"); + fprintf(stdout,"decomposition_levels\n"); + fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); + fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); + fprintf(stdout,"Main_header_end_position\n"); + fprintf(stdout,"Codestream_size\n"); + fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n"); + fprintf(stdout,"Tile_1 '' '' '' '' '' ''\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tile_Nt '' '' '' '' '' ''\n"); + fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); + fprintf(stdout,"...\n"); + fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); + + fprintf(stdout,"MaxDisto\n"); + + fprintf(stdout,"TotalDisto\n\n"); +} + +int give_progression(char progression[4]) +{ + if (progression[0] == 'L' && progression[1] == 'R' + && progression[2] == 'C' && progression[3] == 'P') { + return 0; + } else { + if (progression[0] == 'R' && progression[1] == 'L' + && progression[2] == 'C' && progression[3] == 'P') { + return 1; + } else { + if (progression[0] == 'R' && progression[1] == 'P' + && progression[2] == 'C' && progression[3] == 'L') { + return 2; + } else { + if (progression[0] == 'P' && progression[1] == 'C' + && progression[2] == 'R' && progression[3] == 'L') { + return 3; + } else { + if (progression[0] == 'C' && progression[1] == 'P' + && progression[2] == 'R' && progression[3] == 'L') { + return 4; + } else { + return -1; + } + } + } + } + } +} + + + + +int main(int argc, char **argv) +{ + mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */ + opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ + opj_event_mgr_t event_mgr; /* event manager */ + opj_cio_t *cio; + char value; + opj_mj2_t *movie; + opj_image_t *img; + int i, j; + char *s, S1, S2, S3; + char *buf; + int x1, y1, len; + long mdat_initpos, offset; + FILE *mj2file; + int sampleno; + opj_cinfo_t* cinfo; + bool bSuccess; + int numframes; + double total_time = 0; + + /* default value */ + /* ------------- */ + mj2_parameters.Dim[0] = 0; + mj2_parameters.Dim[1] = 0; + mj2_parameters.w = 352; // CIF default value + mj2_parameters.h = 288; // CIF default value + mj2_parameters.CbCr_subsampling_dx = 2; // CIF default value + mj2_parameters.CbCr_subsampling_dy = 2; // CIF default value + mj2_parameters.frame_rate = 25; + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = NULL; + + /* set J2K encoding parameters to default values */ + opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters); + j2k_parameters = &mj2_parameters.j2k_parameters; + + /* Create comment for codestream */ + if(j2k_parameters->cp_comment == NULL) { + const char comment[] = "Created by OpenJPEG version "; + const size_t clen = strlen(comment); + const char *version = opj_version(); + j2k_parameters->cp_comment = (char*)malloc(clen+strlen(version)+1); + sprintf(j2k_parameters->cp_comment,"%s%s", comment, version); + } + + + while (1) { + int c = getopt(argc, argv, + "i:o:r:q:f:t:n:c:b:x:p:s:d:h P:S:E:M:R:T:C:I:W:F:"); + if (c == -1) + break; + switch (c) { + case 'i': /* IN fill */ + { + char *infile = optarg; + s = optarg; + while (*s) { + s++; + } + s--; + S3 = *s; + s--; + S2 = *s; + s--; + S1 = *s; + + if ((S1 == 'y' && S2 == 'u' && S3 == 'v') + || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { + mj2_parameters.decod_format = YUV_DFMT; + } + else { + fprintf(stderr, + "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", + S1, S2, S3); + return 1; + } + strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile)-1); + } + break; + /* ----------------------------------------------------- */ + case 'o': /* OUT fill */ + { + char *outfile = optarg; + while (*outfile) { + outfile++; + } + outfile--; + S3 = *outfile; + outfile--; + S2 = *outfile; + outfile--; + S1 = *outfile; + + outfile = optarg; + + if ((S1 == 'm' && S2 == 'j' && S3 == '2') + || (S1 == 'M' && S2 == 'J' && S3 == '2')) + mj2_parameters.cod_format = MJ2_CFMT; + else { + fprintf(stderr, + "Unknown output format image *.%c%c%c [only *.mj2]!! \n", + S1, S2, S3); + return 1; + } + strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile)-1); + } + break; + /* ----------------------------------------------------- */ + case 'r': /* rates rates/distorsion */ + { + float rate; + s = optarg; + while (sscanf(s, "%f", &rate) == 1) { + j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2; + j2k_parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + j2k_parameters->cp_disto_alloc = 1; + } + break; + /* ----------------------------------------------------- */ + case 'q': /* add fixed_quality */ + s = optarg; + while (sscanf(s, "%f", &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) { + j2k_parameters->tcp_numlayers++; + while (*s && *s != ',') { + s++; + } + if (!*s) + break; + s++; + } + j2k_parameters->cp_fixed_quality = 1; + break; + /* dda */ + /* ----------------------------------------------------- */ + case 'f': /* mod fixed_quality (before : -q) */ + { + int *row = NULL, *col = NULL; + int numlayers = 0, numresolution = 0, matrix_width = 0; + + s = optarg; + sscanf(s, "%d", &numlayers); + s++; + if (numlayers > 9) + s++; + + j2k_parameters->tcp_numlayers = numlayers; + numresolution = j2k_parameters->numresolution; + matrix_width = numresolution * 3; + j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); + s = s + 2; + + for (i = 0; i < numlayers; i++) { + row = &j2k_parameters->cp_matrice[i * matrix_width]; + col = row; + j2k_parameters->tcp_rates[i] = 1; + sscanf(s, "%d,", &col[0]); + s += 2; + if (col[0] > 9) + s++; + col[1] = 0; + col[2] = 0; + for (j = 1; j < numresolution; j++) { + col += 3; + sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); + s += 6; + if (col[0] > 9) + s++; + if (col[1] > 9) + s++; + if (col[2] > 9) + s++; + } + if (i < numlayers - 1) + s++; + } + j2k_parameters->cp_fixed_alloc = 1; + } + break; + /* ----------------------------------------------------- */ + case 't': /* tiles */ + sscanf(optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); + j2k_parameters->tile_size_on = true; + break; + /* ----------------------------------------------------- */ + case 'n': /* resolution */ + sscanf(optarg, "%d", &j2k_parameters->numresolution); + break; + /* ----------------------------------------------------- */ + case 'c': /* precinct dimension */ + { + char sep; + int res_spec = 0; + + char *s = optarg; + do { + sep = 0; + sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec], + &j2k_parameters->prch_init[res_spec], &sep); + j2k_parameters->csty |= 0x01; + res_spec++; + s = strpbrk(s, "]") + 2; + } + while (sep == ','); + j2k_parameters->res_spec = res_spec; + } + break; + + /* ----------------------------------------------------- */ + case 'b': /* code-block dimension */ + { + int cblockw_init = 0, cblockh_init = 0; + sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init); + if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 + || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { + fprintf(stderr, + "!! Size of code_block error (option -b) !!\n\nRestriction :\n" + " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); + return 1; + } + j2k_parameters->cblockw_init = cblockw_init; + j2k_parameters->cblockh_init = cblockh_init; + } + break; + /* ----------------------------------------------------- */ + case 'x': /* creation of index file */ + { + char *index = optarg; + strncpy(j2k_parameters->index, index, sizeof(j2k_parameters->index)-1); + j2k_parameters->index_on = 1; + } + break; + /* ----------------------------------------------------- */ + case 'p': /* progression order */ + { + char progression[4]; + + strncpy(progression, optarg, 4); + j2k_parameters->prog_order = give_progression(progression); + if (j2k_parameters->prog_order == -1) { + fprintf(stderr, "Unrecognized progression order " + "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 's': /* subsampling factor */ + { + if (sscanf(optarg, "%d,%d", &j2k_parameters->subsampling_dx, + &j2k_parameters->subsampling_dy) != 2) { + fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 'd': /* coordonnate of the reference grid */ + { + if (sscanf(optarg, "%d,%d", &j2k_parameters->image_offset_x0, + &j2k_parameters->image_offset_y0) != 2) { + fprintf(stderr, "-d 'coordonnate of the reference grid' argument " + "error !! [-d x0,y0]\n"); + return 1; + } + } + break; + /* ----------------------------------------------------- */ + case 'h': /* Display an help description */ + help_display(); + return 0; + break; + /* ----------------------------------------------------- */ + case 'P': /* POC */ + { + int numpocs = 0; /* number of progression order change (POC) default 0 */ + opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ + + char *s = optarg; + POC = j2k_parameters->POC; + + while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, + &POC[numpocs].resno0, &POC[numpocs].compno0, + &POC[numpocs].layno1, &POC[numpocs].resno1, + &POC[numpocs].compno1, &POC[numpocs].progorder) == 7) { + POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); + numpocs++; + while (*s && *s != '/') { + s++; + } + if (!*s) { + break; + } + s++; + } + j2k_parameters->numpocs = numpocs; + } + break; + /* ------------------------------------------------------ */ + case 'S': /* SOP marker */ + j2k_parameters->csty |= 0x02; + break; + /* ------------------------------------------------------ */ + case 'E': /* EPH marker */ + j2k_parameters->csty |= 0x04; + break; + /* ------------------------------------------------------ */ + case 'M': /* Mode switch pas tous au point !! */ + if (sscanf(optarg, "%d", &value) == 1) { + for (i = 0; i <= 5; i++) { + int cache = value & (1 << i); + if (cache) + j2k_parameters->mode |= (1 << i); + } + } + break; + /* ------------------------------------------------------ */ + case 'R': /* ROI */ + { + if (sscanf(optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno, + &j2k_parameters->roi_shift) != 2) { + fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); + return 1; + } + } + break; + /* ------------------------------------------------------ */ + case 'T': /* Tile offset */ + { + if (sscanf(optarg, "%d,%d", &j2k_parameters->cp_tx0, &j2k_parameters->cp_ty0) != 2) { + fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); + return 1; + } + } + break; + /* ------------------------------------------------------ */ + case 'C': /* Add a comment */ + { + j2k_parameters->cp_comment = (char*)malloc(strlen(optarg) + 1); + if(j2k_parameters->cp_comment) { + strcpy(j2k_parameters->cp_comment, optarg); + } + } + break; + /* ------------------------------------------------------ */ + case 'I': /* reversible or not */ + { + j2k_parameters->irreversible = 1; + } + break; + /* ------------------------------------------------------ */ + case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ + if (sscanf + (optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h, &mj2_parameters.CbCr_subsampling_dx, + &mj2_parameters.CbCr_subsampling_dy) != 4) { + fprintf(stderr, "-W argument error"); + return 1; + } + break; + /* ------------------------------------------------------ */ + case 'F': /* Video frame rate */ + if (sscanf(optarg, "%d", &mj2_parameters.frame_rate) != 1) { + fprintf(stderr, "-F argument error"); + return 1; + } + break; + /* ------------------------------------------------------ */ + default: + return 1; + } + } + + /* Error messages */ + /* -------------- */ + if (!mj2_parameters.infile || !mj2_parameters.outfile) { + fprintf(stderr, + "Correct usage: mj2_encoder -i yuv-file -o mj2-file (+ options)\n"); + return 1; + } + + if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc || j2k_parameters->cp_fixed_quality) + && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^ j2k_parameters->cp_fixed_quality))) { + fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); + return 1; + } /* mod fixed_quality */ + + /* if no rate entered, lossless by default */ + if (j2k_parameters->tcp_numlayers == 0) { + j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ + j2k_parameters->tcp_numlayers++; + j2k_parameters->cp_disto_alloc = 1; + } + + if((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) || (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) { + fprintf(stderr, + "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", + j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0, j2k_parameters->image_offset_y0); + return 1; + } + + for (i = 0; i < j2k_parameters->numpocs; i++) { + if (j2k_parameters->POC[i].prg == -1) { + fprintf(stderr, + "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", + i + 1); + } + } + + if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] || j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) { + fprintf(stderr, + "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", + j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy, mj2_parameters.Dim[1]); + return 1; + } + + /* to respect profile - 0 */ + /* ---------------------- */ + + x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + 1; + y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + 1; + mj2_parameters.numcomps = 3; /* Because YUV files only have 3 components */ + mj2_parameters.prec = 8; /* Because in YUV files, components have 8-bit depth */ + + j2k_parameters->tcp_mct = 0; + + mj2file = fopen(mj2_parameters.outfile, "wb"); + + if (!mj2file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; + } + + /* get a MJ2 decompressor handle */ + cinfo = mj2_create_compress(); + movie = cinfo->mj2_handle; + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup encoder parameters */ + mj2_setup_encoder(movie, &mj2_parameters); + + movie->tk[0].num_samples = yuv_num_frames(&movie->tk[0],mj2_parameters.infile); + if (!movie->tk[0].num_samples) { + fprintf(stderr,"Unable to count the number of frames in YUV input file\n"); + } + + // One sample per chunk + movie->tk[0].chunk = (mj2_chunk_t*) malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); + movie->tk[0].sample = (mj2_sample_t*) malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); + + if (mj2_init_stdmovie(movie)) { + fprintf(stderr, "Error with movie initialization"); + return 1; + }; + + // Writing JP, FTYP and MDAT boxes + buf = (char*) malloc (300 * sizeof(char)); // Assuming that the JP and FTYP + // boxes won't be longer than 300 bytes + cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); + mj2_write_jp(cio); + mj2_write_ftyp(movie, cio); + mdat_initpos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio, MJ2_MDAT, 4); + fwrite(buf,cio_tell(cio),1,mj2file); + offset = cio_tell(cio); + opj_free(buf); + + for (i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) { + if (movie->tk[i].track_type != 0) { + fprintf(stderr, "Unable to write sound or hint tracks\n"); + } else { + mj2_tk_t *tk; + int buflen = 0; + + tk = &movie->tk[i]; + tk->num_chunks = tk->num_samples; + numframes = tk->num_samples; + + fprintf(stderr, "Video Track number %d\n", i + 1); + + img = mj2_image_create(tk, j2k_parameters); + buflen = 2 * (tk->w * tk->h * 8); + buf = (char *) malloc(buflen*sizeof(char)); + + for (sampleno = 0; sampleno < numframes; sampleno++) { + double init_time = opj_clock(); + double elapsed_time; + if (!yuvtoimage(tk, img, sampleno, j2k_parameters, mj2_parameters.infile)) { + fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); + return 1; + } + + /* setup the encoder parameters using the current image and user parameters */ + opj_setup_encoder(cinfo, j2k_parameters, img); + + cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); + + cio_skip(cio, 4); + cio_write(cio, JP2_JP2C, 4); // JP2C + + /* encode the image */ + bSuccess = opj_encode(cinfo, cio, img, j2k_parameters->index); + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stderr, "failed to encode image\n"); + return 1; + } + + len = cio_tell(cio) - 8; + cio_seek(cio, 0); + cio_write(cio, len+8,4); + tk->sample[sampleno].sample_size = len+8; + tk->sample[sampleno].offset = offset; + tk->chunk[sampleno].offset = offset; // There is one sample per chunk + fwrite(buf, 1, len+8, mj2file); + offset += len+8; + elapsed_time = opj_clock()-init_time; + fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n", sampleno + 1, numframes, elapsed_time*1000); + total_time += elapsed_time; + + } + /* free buffer data */ + opj_free(buf); + /* free image data */ + opj_image_destroy(img); + } + } + + fseek(mj2file, mdat_initpos, SEEK_SET); + + buf = (char*) malloc(4*sizeof(char)); + + // Init a cio to write box length variable in a little endian way + cio = opj_cio_open(NULL, buf, 4); + cio_write(cio, offset - mdat_initpos, 4); + fwrite(buf, 4, 1, mj2file); + fseek(mj2file,0,SEEK_END); + opj_free(buf); + + // Writing MOOV box + buf = (char*) malloc ((TEMP_BUF+numframes*20) * sizeof(char)); + cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); + mj2_write_moov(movie, cio); + fwrite(buf,cio_tell(cio),1,mj2file); + + fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", total_time, numframes, (float)numframes/total_time); + + // Ending program + + fclose(mj2file); + /* free remaining compression structures */ + mj2_destroy_compress(movie); + free(cinfo); + /* free user parameters structure */ + if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); + if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); + opj_cio_close(cio); + + return 0; +} + + diff --git a/mj2/MJ2_codec/frames_to_mj2.dsp b/mj2/frames_to_mj2.dsp similarity index 70% rename from mj2/MJ2_codec/frames_to_mj2.dsp rename to mj2/frames_to_mj2.dsp index 6c027c67..c1da2676 100644 --- a/mj2/MJ2_codec/frames_to_mj2.dsp +++ b/mj2/frames_to_mj2.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg_097" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -51,6 +51,7 @@ BSC32=bscmake.exe LINK32=link.exe # 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 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 # 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 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 +# SUBTRACT LINK32 /pdb:none /incremental:yes /debug !ELSEIF "$(CFG)" == "frames_to_mj2 - Win32 Debug" @@ -66,7 +67,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg_097" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe @@ -74,7 +75,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmt" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none !ENDIF @@ -90,10 +92,6 @@ LINK32=link.exe # PROP Default_Filter "" # Begin Source File -SOURCE=.\compat\getopt.h -# End Source File -# Begin Source File - SOURCE=.\mj2.h # End Source File # Begin Source File @@ -122,140 +120,92 @@ SOURCE=.\mj2_convert.c # End Source File # End Group # End Group -# Begin Group "Libopenjpeg_097" +# Begin Group "Libopenjpeg Header files" # PROP Default_Filter "" # Begin Source File -SOURCE=..\libopenjpeg_097\bio.c +SOURCE=..\libopenjpeg\bio.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\bio.h +SOURCE=..\libopenjpeg\cio.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\cio.c +SOURCE=..\libopenjpeg\dwt.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\cio.h +SOURCE=..\libopenjpeg\event.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\dwt.c +SOURCE=..\libopenjpeg\fix.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\dwt.h +SOURCE=..\libopenjpeg\image.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\fix.c +SOURCE=..\libopenjpeg\int.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\fix.h +SOURCE=..\libopenjpeg\j2k.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\int.c +SOURCE=..\libopenjpeg\j2k_lib.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\int.h +SOURCE=..\libopenjpeg\jp2.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\j2k.c +SOURCE=..\libopenjpeg\jpt.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\j2k.h +SOURCE=..\libopenjpeg\mct.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\jp2.c +SOURCE=..\libopenjpeg\mqc.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\jp2.h +SOURCE=..\libopenjpeg\openjpeg.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\jpt.c +SOURCE=..\libopenjpeg\opj_includes.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\jpt.h +SOURCE=..\libopenjpeg\pi.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\mct.c +SOURCE=..\libopenjpeg\raw.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\mct.h +SOURCE=..\libopenjpeg\t1.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\mqc.c +SOURCE=..\libopenjpeg\t2.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\mqc.h +SOURCE=..\libopenjpeg\tcd.h # End Source File # Begin Source File -SOURCE=..\libopenjpeg_097\openjpeg.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.h +SOURCE=..\libopenjpeg\tgt.h # End Source File # End Group # End Target diff --git a/mj2/frames_to_mj2.dsw b/mj2/frames_to_mj2.dsw new file mode 100644 index 00000000..92c5fc17 --- /dev/null +++ b/mj2/frames_to_mj2.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "frames_to_mj2"=".\frames_to_mj2.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name LibOpenJPEG + End Project Dependency +}}} + +############################################################################### + +Project: "LibOpenJPEG"="..\LibOpenJPEG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/mj2/libopenjpeg_097/bio.c b/mj2/libopenjpeg_097/bio.c deleted file mode 100644 index df99dbf9..00000000 --- a/mj2/libopenjpeg_097/bio.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2003, Yannick Verschueren - * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ***/ - -#include "bio.h" -#include -#include - -static unsigned char *bio_start; /* pointer to the start of the buffer */ -static unsigned char *bio_end; /* pointer to the end of the buffer */ -static unsigned char *bio_bp; /* pointer to the present position in the buffer */ -static unsigned int bio_buf; /* temporary place where each byte is read or written */ -static int bio_ct; /* coder : number of bits free to write // decoder : number of bits read */ - -extern jmp_buf j2k_error; - -/* - * Number of bytes written. - */ -int bio_numbytes() -{ - return bio_bp - bio_start; -} - -/* - * Init encoder. - * - * bp : Output buffer - * len : Output buffer length - */ -void bio_init_enc(unsigned char *bp, int len) -{ - bio_start = bp; - bio_end = bp + len; - bio_bp = bp; - bio_buf = 0; - bio_ct = 8; -} - -/* - * Init decoder. - * - * bp : Input buffer - * len : Input buffer length - */ -void bio_init_dec(unsigned char *bp, int len) -{ - bio_start = bp; - bio_end = bp + len; - bio_bp = bp; - bio_buf = 0; - bio_ct = 0; -} - -/* - * Write byte. --> function modified to eliminate longjmp !!! - * - */ -int bio_byteout() -{ - bio_buf = (bio_buf << 8) & 0xffff; - bio_ct = bio_buf == 0xff00 ? 7 : 8; - if (bio_bp >= bio_end) - return 1; - *bio_bp++ = bio_buf >> 8; - return 0; -} - -/* - * Read byte. --> function modified to eliminate longjmp !! - * - */ -int bio_bytein() -{ - bio_buf = (bio_buf << 8) & 0xffff; - bio_ct = bio_buf == 0xff00 ? 7 : 8; - if (bio_bp >= bio_end) - return 1; - bio_buf |= *bio_bp++; - return 0; -} - -/* - * Write bit. - * - * b : Bit to write (0 or 1) - */ -void bio_putbit(int b) -{ - if (bio_ct == 0) { - bio_byteout(); - } - bio_ct--; - bio_buf |= b << bio_ct; -} - -/* - * Read bit. - * - */ -int bio_getbit() -{ - if (bio_ct == 0) { - bio_bytein(); - } - bio_ct--; - return (bio_buf >> bio_ct) & 1; -} - -/* - * Write bits. - * - * v : Value of bits - * n : Number of bits to write - */ -void bio_write(int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - bio_putbit((v >> i) & 1); - } -} - -/* - * Read bits. - * - * n : Number of bits to read - */ -int bio_read(int n) -{ - int i, v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += bio_getbit() << i; - } - return v; -} - -/* - * Flush bits. Modified to eliminate longjmp !! - * - */ -int bio_flush() -{ - bio_ct = 0; - if (bio_byteout()) - return 1; - if (bio_ct == 7) { - bio_ct = 0; - - if (bio_byteout()) - return 1; - } - return 0; -} - -/* - * Passes the ending bits (coming from flushing) - */ -int bio_inalign() -{ - bio_ct = 0; - if ((bio_buf & 0xff) == 0xff) { - if (bio_bytein()) - return 1; - bio_ct = 0; - } - return 0; -} diff --git a/mj2/libopenjpeg_097/bio.h b/mj2/libopenjpeg_097/bio.h deleted file mode 100644 index 1e3e3edb..00000000 --- a/mj2/libopenjpeg_097/bio.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2003, Yannick Verschueren - * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __BIO_H -#define __BIO_H - -/* - * Number of bytes written. - */ -int bio_numbytes(); - -/* - * Init encoder. - * - * bp : Output buffer - * len : Output buffer length - */ -void bio_init_enc(unsigned char *bp, int len); - -/* - * Init decoder. - * - * bp : Input buffer - * len : Input buffer length - */ -void bio_init_dec(unsigned char *bp, int len); - -/* - * Write bits. - * - * v : Value of bits - * n : Number of bits to write - */ -void bio_write(int v, int n); - -/* - * Read bits. - * - * n : Number of bits to read - */ -int bio_read(int n); - -/* - * Flush bits. Modified to eliminate longjmp !! - */ -int bio_flush(); - -int bio_inalign(); /* modified to eliminated longjmp !! */ - -#endif diff --git a/mj2/libopenjpeg_097/cio.c b/mj2/libopenjpeg_097/cio.c deleted file mode 100644 index 2c41553a..00000000 --- a/mj2/libopenjpeg_097/cio.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "cio.h" -#include -#include - -static unsigned char *cio_start; /* pointer to the start of the stream */ -static unsigned char *cio_end; /* pointer to the end of the stream */ -static unsigned char *cio_bp; /* pointer to the present position */ - -extern jmp_buf j2k_error; - -/* - * Number of bytes written. - */ -int cio_numbytes() -{ - return cio_bp - cio_start; -} - -/* - * Get position in byte stream. - */ -int cio_tell() -{ - return cio_bp - cio_start; -} - -/* - * Set position in byte stream. - * - * pos : position, in number of bytes, from the beginning of the stream - */ -void cio_seek(int pos) -{ - cio_bp = cio_start + pos; -} - -/* - * Number of bytes left before the end of the stream. - */ -int cio_numbytesleft() -{ - return cio_end - cio_bp; -} - -/* - * Get pointer to the current position in the stream. - */ -unsigned char *cio_getbp() -{ - return cio_bp; -} - -/* - * Initialize byte IO - * - * bp : destination/source stream - * len : length of the stream - */ -void cio_init(unsigned char *bp, int len) -{ - cio_start = bp; - cio_end = bp + len; - cio_bp = bp; -} - -/* - * Write a byte. - */ -void cio_byteout(unsigned char v) -{ - if (cio_bp >= cio_end) - longjmp(j2k_error, 1); - *cio_bp++ = v; - -} - -/* - * Read a byte. - */ -unsigned char cio_bytein() -{ - if (cio_bp >= cio_end) - longjmp(j2k_error, 1); - return *cio_bp++; -} - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -void cio_write(unsigned int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff)); - } -} - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -unsigned int cio_read(int n) -{ - int i; - unsigned int v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += cio_bytein() << (i << 3); - } - return v; -} - -/* - * Skip some bytes. - * - * n : number of bytes to skip - */ -void cio_skip(int n) -{ - cio_bp += n; -} - -/* - * Read n bytes, copy to buffer - * - * n : number of bytes to transfer - */ -void cio_read_to_buf(unsigned char* src_buf, int n)/* Glenn adds */ -{ - if (cio_bp + n > cio_end) - longjmp(j2k_error, 1); - memcpy(cio_bp, src_buf, n); - cio_bp += n; -} - -/* - * Write n bytes, copy from buffer - * - * n : number of bytes to transfer - */ -void cio_write_from_buf(unsigned char* dest_buf, int n)/* Glenn adds */ -{ - if (cio_bp + n > cio_end) - longjmp(j2k_error, 1); - memcpy(dest_buf, cio_bp, n); - cio_bp += n; -} \ No newline at end of file diff --git a/mj2/libopenjpeg_097/cio.h b/mj2/libopenjpeg_097/cio.h deleted file mode 100644 index f06ef925..00000000 --- a/mj2/libopenjpeg_097/cio.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __CIO_H -#define __CIO_H - -/* - * Number of bytes written. - * - * returns number of bytes written - */ -int cio_numbytes(); - -/* - * Get position in byte stream. - * - * return position in bytes - */ -int cio_tell(); - -/* - * Set position in byte stream. - * - * pos : position, in number of bytes, from the beginning of the stream - */ -void cio_seek(int pos); - -/* - * Number of bytes left before the end of the stream. - * - * Returns the number of bytes before the end of the stream - */ -int cio_numbytesleft(); - -/* - * Get pointer to the current position in the stream. - * - * return : pointer to the position - */ -unsigned char *cio_getbp(); - -/* - * Initialize byte IO - * - * bp : destination/source stream - * len : length of the stream - */ -void cio_init(unsigned char *bp, int len); - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -void cio_write(unsigned int v, int n); - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -unsigned int cio_read(int n); - -/* - * Skip some bytes. - * - * n : number of bytes to skip - */ -void cio_skip(int n); - -/* - * Read n bytes, copy to buffer - */ -void cio_read_to_buf(unsigned char* src_buf, int n);/* Glenn Pearson adds */ - -/* - * Write n bytes, copy from buffer - */ -void cio_write_from_buf(unsigned char* dest_buf, int n);/* Glenn Pearson adds */ - -#endif diff --git a/mj2/libopenjpeg_097/dwt.c b/mj2/libopenjpeg_097/dwt.c deleted file mode 100644 index 9682864a..00000000 --- a/mj2/libopenjpeg_097/dwt.c +++ /dev/null @@ -1,540 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2004, Yannick Verschueren - * Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * Copyright (c) 2005, Reiner Wahler - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * NOTE: - * This is a modified version of the openjpeg dwt.c file. - * Average speed improvement compared to the original file (measured on - * my own machine, a P4 running at 3.0 GHz): - * 5x3 wavelets about 2 times faster - * 9x7 wavelets about 3 times faster - * for both, encoding and decoding. - * - * The better performance is caused by doing the 1-dimensional DWT - * within a temporary buffer where the data can be accessed sequential - * for both directions, horizontal and vertical. The 2d vertical DWT was - * the major bottleneck in the former version. - * - * I have also removed the "Add Patrick" part because it is not longer - * needed. - * - * 6/6/2005 - * -Ive (aka Reiner Wahler) - * mail: ive@lilysoft.com - */ - - -#include "dwt.h" -#include "int.h" -#include "fix.h" -#include "tcd.h" -#include - -#define S(i) a[(i)*2] -#define D(i) a[(1+(i)*2)] -#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) -#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) -/* new */ -#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) -#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) - -/* */ -/* This table contains the norms of the 5-3 wavelets for different bands. */ -/* */ -double dwt_norms[4][10] = { - {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} -}; - -/* */ -/* This table contains the norms of the 9-7 wavelets for different bands. */ -/* */ -double dwt_norms_real[4][10] = { - {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} -}; - - -/* */ -/* Forward lazy transform (horizontal). */ -/* */ -void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { - int i; - for (i=0; i */ -/* Forward lazy transform (vertical). */ -/* */ -void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) { - int i; - for (i=0; i */ -/* Inverse lazy transform (horizontal). */ -/* */ -void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) { - int i; -/* for (i=0; i */ -/* Inverse lazy transform (vertical). */ -/* */ -void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) { - int i; -/* for (i=0; i */ -/* Forward 5-3 wavelet tranform in 1-D. */ -/* */ -void dwt_encode_1(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1; - for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2; - } - } else { - if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ - S(0) *= 2; - else { - for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; - for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; - } - - } -} - -/* */ -/* Inverse 5-3 wavelet tranform in 1-D. */ -/* */ -void dwt_decode_1(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; - for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1; - } - } else { - if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ - S(0) /= 2; - else { - for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; - for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1; - } - } -} - - -/* */ -/* Forward 5-3 wavelet tranform in 2-D. */ -/* */ -void dwt_encode(tcd_tilecomp_t * tilec) -{ - int i, j, k; - int* a; - int* aj; - int* bj; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - - sn = rh1; - dn = rh - rh1; - bj=(int*)malloc(rh*sizeof(int)); - for (j=0; j */ -/* Inverse 5-3 wavelet tranform in 2-D. */ -/* */ -void dwt_decode(tcd_tilecomp_t * tilec, int stop) -{ - int i, j, k; - int* a; - int* aj; - int* bj; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = l - 1; i >= stop; i--) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rw1; - dn = rw - rw1; - bj=(int*)malloc(rw*sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a+j*w; - dwt_interleave_h(aj, bj, dn, sn, cas_row); - dwt_decode_1(bj, dn, sn, cas_row); - for (k = 0; k < rw; k++) aj[k] = bj[k]; - } - free(bj); - - sn = rh1; - dn = rh - rh1; - bj=(int*)malloc(rh*sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a+j; - dwt_interleave_v(aj, bj, dn, sn, w, cas_col); - dwt_decode_1(bj, dn, sn, cas_col); - for (k = 0; k < rh; k++) aj[k * w] = bj[k]; - } - free(bj); - - } -} - - -/* */ -/* Get gain of 5-3 wavelet transform. */ -/* */ -int dwt_getgain(int orient) -{ - if (orient == 0) - return 0; - if (orient == 1 || orient == 2) - return 1; - return 2; -} - -/* */ -/* Get norm of 5-3 wavelet. */ -/* */ -double dwt_getnorm(int level, int orient) -{ - return dwt_norms[orient][level]; -} - -/* */ -/* Forward 9-7 wavelet transform in 1-D. */ -/* */ -void dwt_encode_1_real(int *a, int dn, int sn, int cas) -{ - int i; - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) - D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); - for (i = 0; i < sn; i++) - S(i) -= fix_mul(D_(i - 1) + D_(i), 434); - for (i = 0; i < dn; i++) - D(i) += fix_mul(S_(i) + S_(i + 1), 7233); - for (i = 0; i < sn; i++) - S(i) += fix_mul(D_(i - 1) + D_(i), 3633); - for (i = 0; i < dn; i++) - D(i) = fix_mul(D(i), 5038); /*5038 */ - for (i = 0; i < sn; i++) - S(i) = fix_mul(S(i), 6659); /*6660 */ - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); - for (i = 0; i < sn; i++) - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); - for (i = 0; i < dn; i++) - S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); - for (i = 0; i < sn; i++) - D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); - for (i = 0; i < dn; i++) - S(i) = fix_mul(S(i), 5038); /*5038 */ - for (i = 0; i < sn; i++) - D(i) = fix_mul(D(i), 6659); /*6660 */ - } - } -} - -/* */ -/* Inverse 9-7 wavelet transform in 1-D. */ -/* */ -void dwt_decode_1_real(int *a, int dn, int sn, int cas) -{ - int i; - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) - S(i) = fix_mul(S(i), 10078); /* 10076 */ - for (i = 0; i < dn; i++) - D(i) = fix_mul(D(i), 13318); /* 13320 */ - for (i = 0; i < sn; i++) - S(i) -= fix_mul(D_(i - 1) + D_(i), 3633); - for (i = 0; i < dn; i++) - D(i) -= fix_mul(S_(i) + S_(i + 1), 7233); - for (i = 0; i < sn; i++) - S(i) += fix_mul(D_(i - 1) + D_(i), 434); - for (i = 0; i < dn; i++) - D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */ - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) - D(i) = fix_mul(D(i), 10078); /* 10076 */ - for (i = 0; i < dn; i++) - S(i) = fix_mul(S(i), 13318); /* 13320 */ - for (i = 0; i < sn; i++) - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633); - for (i = 0; i < dn; i++) - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233); - for (i = 0; i < sn; i++) - D(i) += fix_mul(SS_(i) + SS_(i + 1), 434); - for (i = 0; i < dn; i++) - S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */ - } - } -} - -/* */ -/* Forward 9-7 wavelet transform in 2-D. */ -/* */ - -void dwt_encode_real(tcd_tilecomp_t * tilec) -{ - int i, j, k; - int* a; - int* aj; - int* bj; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rh1; - dn = rh - rh1; - bj=(int*)malloc(rh*sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a + j; - for (k = 0; k < rh; k++) bj[k] = aj[k*w]; - dwt_encode_1_real(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - free(bj); - - sn = rw1; - dn = rw - rw1; - bj=(int*)malloc(rw*sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a + j * w; - for (k = 0; k < rw; k++) bj[k] = aj[k]; - dwt_encode_1_real(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - free(bj); - } -} - - -/* */ -/* Inverse 9-7 wavelet transform in 2-D. */ -/* */ -void dwt_decode_real(tcd_tilecomp_t * tilec, int stop) -{ - - int i, j, k; - int* a; - int* aj; - int* bj; - int w, l; - - w = tilec->x1-tilec->x0; - l = tilec->numresolutions-1; - a = tilec->data; - - for (i = l-1; i >= stop; i--) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_col = tilec->resolutions[l - i].x0 % 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - cas_row = tilec->resolutions[l - i].y0 % 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - - sn = rw1; - dn = rw-rw1; - bj = (int*)malloc(rw * sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a+j*w; - dwt_interleave_h(aj, bj, dn, sn, cas_col); - dwt_decode_1_real(bj, dn, sn, cas_col); - for (k = 0; k < rw; k++) aj[k] = bj[k]; - } - free(bj); - - sn = rh1; - dn = rh-rh1; - bj = (int*)malloc(rh * sizeof(int)); - for (j=0; j */ -/* Get gain of 9-7 wavelet transform. */ -/* */ -int dwt_getgain_real(int orient) -{ - (void)orient; - return 0; -} - -/* */ -/* Get norm of 9-7 wavelet. */ -/* */ -double dwt_getnorm_real(int level, int orient) -{ - return dwt_norms_real[orient][level]; -} diff --git a/mj2/libopenjpeg_097/dwt.h b/mj2/libopenjpeg_097/dwt.h deleted file mode 100644 index 8449fd40..00000000 --- a/mj2/libopenjpeg_097/dwt.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "tcd.h" - -#ifndef __DWT_H -#define __DWT_H - -/* - * Apply a reversible DWT transform to a component of an image - * tilec : tile component information (present tile) - */ -/* void dwt_encode(int* a, int w, int h, int l); */ -void dwt_encode(tcd_tilecomp_t * tilec); -/* - * Apply a reversible inverse DWT transform to a component of an image - * tilec : tile component information (present tile) - */ -void dwt_decode(tcd_tilecomp_t * tilec, int stop); - -/* - * Get the gain of a subband for the reversible DWT - * orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) - */ -int dwt_getgain(int orient); - -/* - * Get the norm of a wavelet function of a subband at a specified level for the reversible DWT - * level: level of the wavelet function - * orient: band of the wavelet function - */ -double dwt_getnorm(int level, int orient); - -/* - * Apply an irreversible DWT transform to a component of an image - */ -void dwt_encode_real(tcd_tilecomp_t * tilec); - -/* - * Apply an irreversible inverse DWT transform to a component of an image - */ -void dwt_decode_real(tcd_tilecomp_t * tilec, int stop); -/* - * Get the gain of a subband for the irreversible DWT - * orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) - */ -int dwt_getgain_real(int orient); - -/* - * Get the norm of a wavelet function of a subband at a specified level for the irreversible DWT - * level: level of the wavelet function - * orient: band of the wavelet function - */ -double dwt_getnorm_real(int level, int orient); - -#endif diff --git a/mj2/libopenjpeg_097/fix.c b/mj2/libopenjpeg_097/fix.c deleted file mode 100644 index d4198c9a..00000000 --- a/mj2/libopenjpeg_097/fix.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "fix.h" -#include /*Add Antonin : multbug1*/ - -#ifdef WIN32 -#define int64 __int64 -#else -#define int64 long long -#endif - -/* - * Multiply two fixed-precision rational numbers. - */ - -/*int fix_mul(int a, int b) -{ - return (int) ((int64) a * (int64) b >> 13); -}*/ - - -/*Mod Antonin : multbug1*/ -/* -int fix_mul(int a, int b) -{ - double tmp= (double) ((int64) a * (int64) b); - int64 v = (int64) ((fabs(tmp/8192.0)>=floor(fabs(tmp/8192.0))+0.5)?fabs(tmp/8192.0)+1.0:fabs(tmp/8192.0)); - v = (tmp<0)?-v:v; - return (int) v; -} -*/ -/*doM*/ - -int fix_mul(int a, int b) /* Luke Lee optimized : 11/16/2004*/ -{ - int64 temp = (int64) a * (int64) b >> 12; - return (int) ((temp >> 1) + (temp & 1)) ; -} - diff --git a/mj2/libopenjpeg_097/fix.h b/mj2/libopenjpeg_097/fix.h deleted file mode 100644 index 85ff49b6..00000000 --- a/mj2/libopenjpeg_097/fix.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - -#ifndef __FIX_H -#define __FIX_H - -int fix_mul(int a, int b); - -#endif diff --git a/mj2/libopenjpeg_097/int.c b/mj2/libopenjpeg_097/int.c deleted file mode 100644 index 1fd85eb2..00000000 --- a/mj2/libopenjpeg_097/int.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "int.h" - -/* - * Get the minimum of two integers. - * - * returns a if a < b else b - */ -int int_min(int a, int b) -{ - return a < b ? a : b; -} - -/* - * Get the maximum of two integers. - * - * returns a if a > b else b - */ -int int_max(int a, int b) -{ - return a > b ? a : b; -} - -/* - * Clamp an integer inside an interval. - * - * return a if (min < a < max) - * return max if (a > max) - * return min if (a < min) - */ -int int_clamp(int a, int min, int max) -{ - if (a < min) - return min; - if (a > max) - return max; - return a; -} - -/* - * Get absolute value of integer. - */ -int int_abs(int a) -{ - return a < 0 ? -a : a; -} - -/* - * Divide an integer and round upwards. - * - * a divided by b - */ -int int_ceildiv(int a, int b) -{ - return (a + b - 1) / b; -} - -/* - * Divide an integer by a power of 2 and round upwards. - * - * a divided by 2^b - */ -int int_ceildivpow2(int a, int b) -{ - return (a + (1 << b) - 1) >> b; -} - -/* - * Divide an integer by a power of 2 and round downwards. - * - * a divided by 2^b - */ -int int_floordivpow2(int a, int b) -{ - return a >> b; -} - -/* - * Get logarithm of an integer and round downwards. - * - * log2(a) - */ -int int_floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} diff --git a/mj2/libopenjpeg_097/int.h b/mj2/libopenjpeg_097/int.h deleted file mode 100644 index 90e6fbd7..00000000 --- a/mj2/libopenjpeg_097/int.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "j2k.h" - -#ifndef __INT_H -#define __INT_H - -/* - * Get the minimum of two integers. - * - * returns a if a < b else b - */ -int int_min(int a, int b); - -/* - * Get the maximum of two integers. - * - * returns a if a > b else b - */ -int int_max(int a, int b); - -/* - * Clamp an integer inside an interval. - * - * return a if (min < a < max) - * return max if (a > max) - * return min if (a < min) - */ -int int_clamp(int a, int min, int max); - -/* - * Get absolute value of integer. - */ -int int_abs(int a); - -/* - * Divide an integer and round upwards. - * - * a divided by b - */ -int int_ceildiv(int a, int b); - -/* - * Divide an integer by a power of 2 and round upwards. - * - * a divided by 2^b - */ -LIBJ2K_API int int_ceildivpow2(int a, int b); - -/* - * Divide an integer by a power of 2 and round downwards. - * - * a divided by 2^b - */ -LIBJ2K_API int int_floordivpow2(int a, int b); - -/* - * Get logarithm of an integer and round downwards. - * - * log2(a) - */ -int int_floorlog2(int a); - -#endif diff --git a/mj2/libopenjpeg_097/j2k.c b/mj2/libopenjpeg_097/j2k.c deleted file mode 100644 index f0bb1215..00000000 --- a/mj2/libopenjpeg_097/j2k.c +++ /dev/null @@ -1,1602 +0,0 @@ -/* -* Copyright (c) 2001-2002, David Janssens -* Copyright (c) 2002-2004, Yannick Verschueren -* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include - -#include "j2k.h" -#include "cio.h" -#include "tcd.h" -#include "dwt.h" -#include "int.h" -#include "jpt.h" - -#define J2K_MS_SOC 0xff4f -#define J2K_MS_SOT 0xff90 -#define J2K_MS_SOD 0xff93 -#define J2K_MS_EOC 0xffd9 -#define J2K_MS_SIZ 0xff51 -#define J2K_MS_COD 0xff52 -#define J2K_MS_COC 0xff53 -#define J2K_MS_RGN 0xff5e -#define J2K_MS_QCD 0xff5c -#define J2K_MS_QCC 0xff5d -#define J2K_MS_POC 0xff5f -#define J2K_MS_TLM 0xff55 -#define J2K_MS_PLM 0xff57 -#define J2K_MS_PLT 0xff58 -#define J2K_MS_PPM 0xff60 -#define J2K_MS_PPT 0xff61 -#define J2K_MS_SOP 0xff91 -#define J2K_MS_EPH 0xff92 -#define J2K_MS_CRG 0xff63 -#define J2K_MS_COM 0xff64 - -#define J2K_STATE_MHSOC 0x0001 -#define J2K_STATE_MHSIZ 0x0002 -#define J2K_STATE_MH 0x0004 -#define J2K_STATE_TPHSOT 0x0008 -#define J2K_STATE_TPH 0x0010 -#define J2K_STATE_MT 0x0020 -#define J2K_STATE_NEOC 0x0040 - - -jmp_buf j2k_error; - -static int j2k_state; -static int j2k_curtileno; -j2k_tcp_t j2k_default_tcp; -static unsigned char *j2k_eot; -static int j2k_sot_start; -static int pos_correction; - -static j2k_image_t *j2k_img; -static j2k_cp_t *j2k_cp; - -static unsigned char **j2k_tile_data; -static int *j2k_tile_len; - -static info_image info_IM; - -/* Add Patrick */ -void j2k_clean() -{ - int tileno = 0; -#ifndef NO_PACKETS_DECODING - tcd_free_encode(j2k_img, j2k_cp, j2k_curtileno); -#endif - - if (info_IM.index_on) { - for (tileno = 0; tileno < j2k_cp->tw * j2k_cp->th; tileno++) { - free(info_IM.tile[tileno].packet); - } - free(info_IM.tile); - } -} - -/* \Add Patrick */ - -void j2k_dump_image(j2k_image_t * img) -{ - int compno; - fprintf(stdout, "image {\n"); - fprintf(stdout, " x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0, - img->x1, img->y1); - fprintf(stdout, " numcomps=%d\n", img->numcomps); - for (compno = 0; compno < img->numcomps; compno++) { - j2k_comp_t *comp = &img->comps[compno]; - fprintf(stdout, " comp %d {\n", compno); - fprintf(stdout, " dx=%d, dy=%d\n", comp->dx, comp->dy); - fprintf(stdout, " prec=%d\n", comp->prec); - fprintf(stdout, " sgnd=%d\n", comp->sgnd); - fprintf(stdout, " }\n"); - } - fprintf(stdout, "}\n"); -} - -void j2k_dump_cp(j2k_image_t * img, j2k_cp_t * cp) -{ - int tileno, compno, layno, bandno, resno, numbands; - fprintf(stdout, "coding parameters {\n"); - fprintf(stdout, " tx0=%d, ty0=%d\n", cp->tx0, cp->ty0); - fprintf(stdout, " tdx=%d, tdy=%d\n", cp->tdx, cp->tdy); - fprintf(stdout, " tw=%d, th=%d\n", cp->tw, cp->th); - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - j2k_tcp_t *tcp = &cp->tcps[tileno]; - fprintf(stdout, " tile %d {\n", tileno); - fprintf(stdout, " csty=%x\n", tcp->csty); - fprintf(stdout, " prg=%d\n", tcp->prg); - fprintf(stdout, " numlayers=%d\n", tcp->numlayers); - fprintf(stdout, " mct=%d\n", tcp->mct); - fprintf(stdout, " rates="); - for (layno = 0; layno < tcp->numlayers; layno++) { - fprintf(stdout, "%d ", tcp->rates[layno]); - } - fprintf(stdout, "\n"); - for (compno = 0; compno < img->numcomps; compno++) { - j2k_tccp_t *tccp = &tcp->tccps[compno]; - fprintf(stdout, " comp %d {\n", compno); - fprintf(stdout, " csty=%x\n", tccp->csty); - fprintf(stdout, " numresolutions=%d\n", tccp->numresolutions); - fprintf(stdout, " cblkw=%d\n", tccp->cblkw); - fprintf(stdout, " cblkh=%d\n", tccp->cblkh); - fprintf(stdout, " cblksty=%x\n", tccp->cblksty); - fprintf(stdout, " qmfbid=%d\n", tccp->qmfbid); - fprintf(stdout, " qntsty=%d\n", tccp->qntsty); - fprintf(stdout, " numgbits=%d\n", tccp->numgbits); - fprintf(stdout, " roishift=%d\n", tccp->roishift); - fprintf(stdout, " stepsizes="); - numbands = - tccp->qntsty == - J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; - for (bandno = 0; bandno < numbands; bandno++) { - fprintf(stdout, "(%d,%d) ", tccp->stepsizes[bandno].mant, - tccp->stepsizes[bandno].expn); - } - fprintf(stdout, "\n"); - - if (tccp->csty & J2K_CCP_CSTY_PRT) { - fprintf(stdout, " prcw="); - for (resno = 0; resno < tccp->numresolutions; resno++) { - fprintf(stdout, "%d ", tccp->prcw[resno]); - } - fprintf(stdout, "\n"); - fprintf(stdout, " prch="); - for (resno = 0; resno < tccp->numresolutions; resno++) { - fprintf(stdout, "%d ", tccp->prch[resno]); - } - fprintf(stdout, "\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, "}\n"); -} - -void j2k_write_soc() -{ - cio_write(J2K_MS_SOC, 2); -} - -void j2k_read_soc() -{ - j2k_state = J2K_STATE_MHSIZ; -} - -void j2k_write_siz() -{ - int i; - int lenp, len; - - cio_write(J2K_MS_SIZ, 2); /* SIZ */ - lenp = cio_tell(); - cio_skip(2); - cio_write(0, 2); /* Rsiz (capabilities) */ - cio_write(j2k_img->x1, 4); /* Xsiz */ - cio_write(j2k_img->y1, 4); /* Ysiz */ - cio_write(j2k_img->x0, 4); /* X0siz */ - cio_write(j2k_img->y0, 4); /* Y0siz */ - cio_write(j2k_cp->tdx, 4); /* XTsiz */ - cio_write(j2k_cp->tdy, 4); /* YTsiz */ - cio_write(j2k_cp->tx0, 4); /* XT0siz */ - cio_write(j2k_cp->ty0, 4); /* YT0siz */ - cio_write(j2k_img->numcomps, 2); /* Csiz */ - for (i = 0; i < j2k_img->numcomps; i++) { - cio_write(j2k_img->comps[i].prec - 1 + (j2k_img->comps[i].sgnd << 7), 1); /* Ssiz_i */ - cio_write(j2k_img->comps[i].dx, 1); /* XRsiz_i */ - cio_write(j2k_img->comps[i].dy, 1); /* YRsiz_i */ - } - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lsiz */ - cio_seek(lenp + len); - -} - -void j2k_read_siz() -{ - int len, i; - - len = cio_read(2); /* Lsiz */ - cio_read(2); /* Rsiz (capabilities) */ - j2k_img->x1 = cio_read(4); /* Xsiz */ - j2k_img->y1 = cio_read(4); /* Ysiz */ - j2k_img->x0 = cio_read(4); /* X0siz */ - j2k_img->y0 = cio_read(4); /* Y0siz */ - j2k_cp->tdx = cio_read(4); /* XTsiz */ - j2k_cp->tdy = cio_read(4); /* YTsiz */ - j2k_cp->tx0 = cio_read(4); /* XT0siz */ - j2k_cp->ty0 = cio_read(4); /* YT0siz */ - - j2k_img->numcomps = cio_read(2); /* Csiz */ - j2k_img->comps = - (j2k_comp_t *) malloc(j2k_img->numcomps * sizeof(j2k_comp_t)); - for (i = 0; i < j2k_img->numcomps; i++) { - int tmp, w, h; - tmp = cio_read(1); /* Ssiz_i */ - j2k_img->comps[i].prec = (tmp & 0x7f) + 1; - j2k_img->comps[i].sgnd = tmp >> 7; - j2k_img->comps[i].dx = cio_read(1); /* XRsiz_i */ - j2k_img->comps[i].dy = cio_read(1); /* YRsiz_i */ - w = int_ceildiv(j2k_img->x1 - j2k_img->x0, j2k_img->comps[i].dx); - h = int_ceildiv(j2k_img->y1 - j2k_img->y0, j2k_img->comps[i].dy); - j2k_img->comps[i].resno_decoded = 0; /* number of resolution decoded */ - j2k_img->comps[i].factor = 0; /* reducing factor by component */ - } - - j2k_cp->tw = int_ceildiv(j2k_img->x1 - j2k_cp->tx0, j2k_cp->tdx); - j2k_cp->th = int_ceildiv(j2k_img->y1 - j2k_cp->ty0, j2k_cp->tdy); - j2k_cp->tcps = - (j2k_tcp_t *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(j2k_tcp_t)); - j2k_cp->tileno = (int *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(int)); - j2k_cp->tileno_size = 0; - - for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++) { - j2k_cp->tcps[i].POC = 0; - j2k_cp->tcps[i].numpocs = 0; - j2k_cp->tcps[i].first = 1; - } - - /* Initialization for PPM marker */ - j2k_cp->ppm = 0; - j2k_cp->ppm_data = NULL; - j2k_cp->ppm_data_first = NULL; - j2k_cp->ppm_previous = 0; - j2k_cp->ppm_store = 0; - - j2k_default_tcp.tccps = - (j2k_tccp_t *) calloc(sizeof(j2k_tccp_t), j2k_img->numcomps); - for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++) { - j2k_cp->tcps[i].tccps = - (j2k_tccp_t *) calloc(sizeof(j2k_tccp_t), j2k_img->numcomps); - } - j2k_tile_data = - (unsigned char **) calloc(j2k_cp->tw * j2k_cp->th, sizeof(char *)); - j2k_tile_len = (int *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(int)); - j2k_state = J2K_STATE_MH; - - -} - -void j2k_write_com() -{ - unsigned int i; - int lenp, len; - char str[256]; - sprintf(str, "%s", j2k_cp->comment); - - cio_write(J2K_MS_COM, 2); - lenp = cio_tell(); - cio_skip(2); - cio_write(0, 2); - for (i = 0; i < strlen(str); i++) { - cio_write(str[i], 1); - } - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); - cio_seek(lenp + len); - -} - -void j2k_read_com() -{ - int len; - - len = cio_read(2); - cio_skip(len - 2); - -} - -void j2k_write_cox(int compno) -{ - int i; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - tcp = &j2k_cp->tcps[j2k_curtileno]; - tccp = &tcp->tccps[compno]; - - cio_write(tccp->numresolutions - 1, 1); /* SPcox (D) */ - cio_write(tccp->cblkw - 2, 1); /* SPcox (E) */ - cio_write(tccp->cblkh - 2, 1); /* SPcox (F) */ - cio_write(tccp->cblksty, 1); /* SPcox (G) */ - cio_write(tccp->qmfbid, 1); /* SPcox (H) */ - - if (tccp->csty & J2K_CCP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - cio_write(tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ - } - } -} - -void j2k_read_cox(int compno) -{ - int i; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - tccp = &tcp->tccps[compno]; - tccp->numresolutions = cio_read(1) + 1; /* SPcox (D) */ - /*Check the reduce value*/ - j2k_cp->reduce=int_min((tccp->numresolutions)-1,j2k_cp->reduce); - tccp->cblkw = cio_read(1) + 2; /* SPcox (E) */ - tccp->cblkh = cio_read(1) + 2; /* SPcox (F) */ - tccp->cblksty = cio_read(1); /* SPcox (G) */ - tccp->qmfbid = cio_read(1); /* SPcox (H) */ - if (tccp->csty & J2K_CP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - int tmp = cio_read(1); /* SPcox (I_i) */ - tccp->prcw[i] = tmp & 0xf; - tccp->prch[i] = tmp >> 4; - } - } -} - -void j2k_write_cod() -{ - j2k_tcp_t *tcp; - int lenp, len; - - cio_write(J2K_MS_COD, 2); /* COD */ - - lenp = cio_tell(); - cio_skip(2); - - tcp = &j2k_cp->tcps[j2k_curtileno]; - cio_write(tcp->csty, 1); /* Scod */ - cio_write(tcp->prg, 1); /* SGcod (A) */ - cio_write(tcp->numlayers, 2); /* SGcod (B) */ - cio_write(tcp->mct, 1); /* SGcod (C) */ - - j2k_write_cox(0); - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lcod */ - cio_seek(lenp + len); -} - -void j2k_read_cod() -{ - int len, i, pos; - j2k_tcp_t *tcp; - - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - len = cio_read(2); /* Lcod */ - tcp->csty = cio_read(1); /* Scod */ - tcp->prg = cio_read(1); /* SGcod (A) */ - tcp->numlayers = cio_read(2); /* SGcod (B) */ - tcp->mct = cio_read(1); /* SGcod (C) */ - - pos = cio_tell(); - for (i = 0; i < j2k_img->numcomps; i++) { - tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; - cio_seek(pos); - j2k_read_cox(i); - } -} - -void j2k_write_coc(int compno) -{ - j2k_tcp_t *tcp; - int lenp, len; - - cio_write(J2K_MS_COC, 2); /* COC */ - lenp = cio_tell(); - cio_skip(2); - tcp = &j2k_cp->tcps[j2k_curtileno]; - cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ - cio_write(tcp->tccps[compno].csty, 1); /* Scoc */ - j2k_write_cox(compno); - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lcoc */ - cio_seek(lenp + len); -} - -void j2k_read_coc() -{ - int len, compno; - j2k_tcp_t *tcp; - - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - len = cio_read(2); /* Lcoc */ - compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ - tcp->tccps[compno].csty = cio_read(1); /* Scoc */ - j2k_read_cox(compno); -} - -void j2k_write_qcx(int compno) -{ - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - int bandno, numbands; - int expn, mant; - - tcp = &j2k_cp->tcps[j2k_curtileno]; - tccp = &tcp->tccps[compno]; - - cio_write(tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */ - numbands = - tccp->qntsty == - J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2; - - for (bandno = 0; bandno < numbands; bandno++) { - expn = tccp->stepsizes[bandno].expn; - mant = tccp->stepsizes[bandno].mant; - - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - cio_write(expn << 3, 1); /* SPqcx_i */ - } else { - cio_write((expn << 11) + mant, 2); /* SPqcx_i */ - } - } - -} - -void j2k_read_qcx(int compno, int len) -{ - int tmp; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - int bandno, numbands; - - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - tccp = &tcp->tccps[compno]; - tmp = cio_read(1); /* Sqcx */ - tccp->qntsty = tmp & 0x1f; - tccp->numgbits = tmp >> 5; - numbands = - tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : (tccp->qntsty == - J2K_CCP_QNTSTY_NOQNT ? - len - 1 : (len - 1) / 2); - for (bandno = 0; bandno < numbands; bandno++) { - int expn, mant; - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - expn = cio_read(1) >> 3; /* SPqcx_i */ - mant = 0; - } else { - tmp = cio_read(2); /* SPqcx_i */ - expn = tmp >> 11; - mant = tmp & 0x7ff; - } - tccp->stepsizes[bandno].expn = expn; - tccp->stepsizes[bandno].mant = mant; - } - - - - /* Add Antonin : if scalar_derived -> compute other stepsizes */ - - - - if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { - - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - - tccp->stepsizes[bandno].expn = - ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > - 0) ? (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0; - - tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; - - } - - } - - - - /* ddA */ -} - -void j2k_write_qcd() -{ - int lenp, len; - - cio_write(J2K_MS_QCD, 2); /* QCD */ - lenp = cio_tell(); - cio_skip(2); - j2k_write_qcx(0); - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lqcd */ - cio_seek(lenp + len); -} - -void j2k_read_qcd() -{ - int len, i, pos; - - len = cio_read(2); /* Lqcd */ - pos = cio_tell(); - for (i = 0; i < j2k_img->numcomps; i++) { - cio_seek(pos); - j2k_read_qcx(i, len - 2); - } -} - -void j2k_write_qcc(int compno) -{ - int lenp, len; - - cio_write(J2K_MS_QCC, 2); /* QCC */ - lenp = cio_tell(); - cio_skip(2); - cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2); /* Cqcc */ - j2k_write_qcx(compno); - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lqcc */ - cio_seek(lenp + len); -} - -void j2k_read_qcc() -{ - int len, compno; - - len = cio_read(2); /* Lqcc */ - compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Cqcc */ - j2k_read_qcx(compno, len - 2 - (j2k_img->numcomps <= 256 ? 1 : 2)); -} - -void j2k_write_poc() -{ - int len, numpchgs, i; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - - tcp = &j2k_cp->tcps[j2k_curtileno]; - tccp = &tcp->tccps[0]; - numpchgs = tcp->numpocs; - cio_write(J2K_MS_POC, 2); /* POC */ - len = 2 + (5 + 2 * (j2k_img->numcomps <= 256 ? 1 : 2)) * numpchgs; - cio_write(len, 2); /* Lpoc */ - for (i = 0; i < numpchgs; i++) { - /* MODIF*/ - j2k_poc_t *poc; - poc = &tcp->pocs[i]; - cio_write(poc->resno0, 1); /* RSpoc_i */ - cio_write(poc->compno0, (j2k_img->numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ - cio_write(poc->layno1, 2); /* LYEpoc_i */ - poc->layno1 = int_min(poc->layno1, tcp->numlayers); - cio_write(poc->resno1, 1); /* REpoc_i */ - poc->resno1 = int_min(poc->resno1, tccp->numresolutions); - cio_write(poc->compno1, (j2k_img->numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ - poc->compno1 = int_min(poc->compno1, j2k_img->numcomps); - cio_write(poc->prg, 1); /* Ppoc_i */ - } -} - -void j2k_read_poc() -{ - int len, numpchgs, i, old_poc; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - - old_poc = tcp->POC ? tcp->numpocs + 1 : 0; - tcp->POC = 1; - tccp = &tcp->tccps[0]; - len = cio_read(2); /* Lpoc */ - numpchgs = (len - 2) / (5 + 2 * (j2k_img->numcomps <= 256 ? 1 : 2)); - - for (i = old_poc; i < numpchgs + old_poc; i++) { - j2k_poc_t *poc; - poc = &tcp->pocs[i]; - poc->resno0 = cio_read(1); /* RSpoc_i */ - poc->compno0 = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* CSpoc_i */ - poc->layno1 = int_min(cio_read(2), (unsigned int) tcp->numlayers); /* LYEpoc_i */ - poc->resno1 = int_min(cio_read(1), (unsigned int) tccp->numresolutions); /* REpoc_i */ - poc->compno1 = int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), (unsigned int) j2k_img->numcomps); /* CEpoc_i */ - poc->prg = cio_read(1); /* Ppoc_i */ - } - - tcp->numpocs = numpchgs + old_poc - 1; -} - -void j2k_read_crg() -{ - int len, i, Xcrg_i, Ycrg_i; - - len = cio_read(2); /* Lcrg */ - for (i = 0; i < j2k_img->numcomps; i++) { - Xcrg_i = cio_read(2); /* Xcrg_i */ - Ycrg_i = cio_read(2); /* Ycrg_i */ - } -} - -void j2k_read_tlm() -{ - int len, Ztlm, Stlm, ST, SP, tile_tlm, i; - long int Ttlm_i, Ptlm_i; - - len = cio_read(2); /* Ltlm */ - Ztlm = cio_read(1); /* Ztlm */ - Stlm = cio_read(1); /* Stlm */ - ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); - SP = (Stlm >> 6) & 0x01; - tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); - for (i = 0; i < tile_tlm; i++) { - Ttlm_i = cio_read(ST); /* Ttlm_i */ - Ptlm_i = cio_read(SP ? 4 : 2); /* Ptlm_i */ - } -} - -void j2k_read_plm() -{ - int len, i, Zplm, Nplm, add, packet_len = 0; - - len = cio_read(2); /* Lplm */ - Zplm = cio_read(1); /* Zplm */ - len -= 3; - while (len > 0) { - Nplm = cio_read(4); /* Nplm */ - len -= 4; - for (i = Nplm; i > 0; i--) { - add = cio_read(1); - len--; - packet_len = (packet_len << 7) + add; /* Iplm_ij */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - if (len <= 0) - break; - } - } -} - -void j2k_read_plt() -{ - int len, i, Zplt, packet_len = 0, add; - - len = cio_read(2); /* Lplt */ - Zplt = cio_read(1); /* Zplt */ - for (i = len - 3; i > 0; i--) { - add = cio_read(1); - packet_len = (packet_len << 7) + add; /* Iplt_i */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - } -} - -void j2k_read_ppm() -{ - int len, Z_ppm, i, j; - int N_ppm; - - len = cio_read(2); - j2k_cp->ppm = 1; - - Z_ppm = cio_read(1); /* Z_ppm */ - len -= 3; - while (len > 0) { - if (j2k_cp->ppm_previous == 0) { - N_ppm = cio_read(4); /* N_ppm */ - len -= 4; - } else { - N_ppm = j2k_cp->ppm_previous; - } - - j = j2k_cp->ppm_store; - if (Z_ppm == 0) { /* First PPM marker */ - j2k_cp->ppm_data = - (unsigned char *) calloc(N_ppm, sizeof(unsigned char)); - j2k_cp->ppm_data_first = j2k_cp->ppm_data; - - j2k_cp->ppm_len = N_ppm; /*Add antonin : ppmbug1*/ - - } else { /* NON-first PPM marker */ - j2k_cp->ppm_data = - (unsigned char *) realloc(j2k_cp->ppm_data, - (N_ppm + - j2k_cp->ppm_store) * - sizeof(unsigned char)); - j2k_cp->ppm_data_first = j2k_cp->ppm_data; - - j2k_cp->ppm_len = N_ppm + j2k_cp->ppm_store; /*Add antonin : ppmbug1*/ - - } - - for (i = N_ppm; i > 0; i--) { /* Read packet header */ - j2k_cp->ppm_data[j] = cio_read(1); - j++; - len--; - if (len == 0) - break; /* Case of non-finished packet header in present marker but finished in next one */ - } - - j2k_cp->ppm_previous = i - 1; - j2k_cp->ppm_store = j; - } -} - -void j2k_read_ppt() -{ - int len, Z_ppt, i, j = 0; - j2k_tcp_t *tcp; - - len = cio_read(2); - Z_ppt = cio_read(1); - tcp = &j2k_cp->tcps[j2k_curtileno]; - tcp->ppt = 1; - if (Z_ppt == 0) { /* First PPT marker */ - tcp->ppt_data = - (unsigned char *) calloc(len - 3, sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_store = 0; - - tcp->ppt_len = len - 3; /*Add antonin : ppmbug1*/ - } else { /* NON-first PPT marker */ - tcp->ppt_data = - (unsigned char *) realloc(tcp->ppt_data, - (len - 3 + - tcp->ppt_store) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - - tcp->ppt_len = len - 3 + tcp->ppt_store; /*Add antonin : ppmbug1*/ - - } - - j = tcp->ppt_store; - for (i = len - 3; i > 0; i--) { - tcp->ppt_data[j] = cio_read(1); - j++; - } - tcp->ppt_store = j; -} - -void j2k_write_sot() -{ - int lenp, len; - - j2k_sot_start = cio_tell(); - cio_write(J2K_MS_SOT, 2); /* SOT */ - lenp = cio_tell(); - cio_skip(2); /* Lsot (further) */ - cio_write(j2k_curtileno, 2); /* Isot */ - cio_skip(4); /* Psot (further in j2k_write_sod) */ - cio_write(0, 1); /* TPsot */ - cio_write(1, 1); /* TNsot */ - len = cio_tell() - lenp; - cio_seek(lenp); - cio_write(len, 2); /* Lsot */ - cio_seek(lenp + len); -} - -void j2k_read_sot() -{ - int len, tileno, totlen, partno, numparts, i; - j2k_tcp_t *tcp; - j2k_tccp_t *tmp; - char status = 0; - - len = cio_read(2); - tileno = cio_read(2); - - if (j2k_cp->tileno_size == 0) { - j2k_cp->tileno[j2k_cp->tileno_size] = tileno; - j2k_cp->tileno_size++; - } else { - i = 0; - while (i < j2k_cp->tileno_size && status == 0) { - status = j2k_cp->tileno[i] == tileno ? 1 : 0; - i++; - } - if (status == 0) { - j2k_cp->tileno[j2k_cp->tileno_size] = tileno; - j2k_cp->tileno_size++; - } - } - - totlen = cio_read(4); - if (!totlen) - totlen = cio_numbytesleft() + 8; - - partno = cio_read(1); - numparts = cio_read(1); - - j2k_curtileno = tileno; - j2k_eot = cio_getbp() - 12 + totlen; - j2k_state = J2K_STATE_TPH; - tcp = &j2k_cp->tcps[j2k_curtileno]; - - if (tcp->first == 1) { - tmp = tcp->tccps; - *tcp = j2k_default_tcp; - - /* Initialization PPT */ - tcp->ppt = 0; - tcp->ppt_data = NULL; - tcp->ppt_data_first = NULL; - - tcp->tccps = tmp; - for (i = 0; i < j2k_img->numcomps; i++) { - tcp->tccps[i] = j2k_default_tcp.tccps[i]; - } - j2k_cp->tcps[j2k_curtileno].first = 0; - } -} - -void j2k_write_sod() -{ - int l, layno; - int totlen; - j2k_tcp_t *tcp; - static int j2k_sod_start; - - cio_write(J2K_MS_SOD, 2); - if (j2k_curtileno == 0) { - j2k_sod_start = cio_tell() + pos_correction; - } - - /* INDEX >> */ - if (info_IM.index_on) { - info_IM.tile[j2k_curtileno].end_header = - cio_tell() + pos_correction - 1; - } - /* << INDEX */ - - tcp = &j2k_cp->tcps[j2k_curtileno]; - for (layno = 0; layno < tcp->numlayers; layno++) { - tcp->rates[layno] -= tcp->rates[layno] ? (j2k_sod_start / (j2k_cp->th * j2k_cp->tw)) : 0; /*Mod antonin losslessbug*/ - } - - info_IM.num = 0; - if (j2k_cp->decod_format != PGX_DFMT) - l = tcd_encode_tile_pxm(j2k_curtileno, cio_getbp(), - cio_numbytesleft() - 2, &info_IM); - else - l = tcd_encode_tile_pgx(j2k_curtileno, cio_getbp(), - cio_numbytesleft() - 2, &info_IM); - - /* Writing Psot in SOT marker */ - totlen = cio_tell() + l - j2k_sot_start; - cio_seek(j2k_sot_start + 6); - cio_write(totlen, 4); - cio_seek(j2k_sot_start + totlen); -} - -void j2k_read_sod() -{ - int len, truncate = 0, i; - unsigned char *data; - - len = int_min(j2k_eot - cio_getbp(), cio_numbytesleft() + 1); - - if (len == cio_numbytesleft() + 1) - truncate = 1; /* Case of a truncate codestream */ - - data = - (unsigned char *) malloc((j2k_tile_len[j2k_curtileno] + len) * - sizeof(unsigned char)); - for (i = 0; i < j2k_tile_len[j2k_curtileno]; i++) - data[i] = j2k_tile_data[j2k_curtileno][i]; - for (i = 0; i < len; i++) - data[i + j2k_tile_len[j2k_curtileno]] = cio_read(1); - - j2k_tile_len[j2k_curtileno] += len; - free(j2k_tile_data[j2k_curtileno]); - j2k_tile_data[j2k_curtileno] = data; - data = NULL; - - if (!truncate) - j2k_state = J2K_STATE_TPHSOT; - else - j2k_state = J2K_STATE_NEOC; /* RAJOUTE !! */ -} - -void j2k_write_rgn(int compno, int tileno) -{ - j2k_tcp_t *tcp = &j2k_cp->tcps[tileno]; - - cio_write(J2K_MS_RGN, 2); /* RGN */ - cio_write(j2k_img->numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ - cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2); /* Crgn */ - cio_write(0, 1); /* Srgn */ - cio_write(tcp->tccps[compno].roishift, 1); /* SPrgn */ -} - -void j2k_read_rgn() -{ - int len, compno, roisty; - j2k_tcp_t *tcp; - - tcp = - j2k_state == - J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; - len = cio_read(2); /* Lrgn */ - compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Crgn */ - roisty = cio_read(1); /* Srgn */ - tcp->tccps[compno].roishift = cio_read(1); /* SPrgn */ -} - -void j2k_write_eoc() -{ - /* fprintf(stderr, "%.8x: EOC\n", cio_tell() + pos_correction); */ - cio_write(J2K_MS_EOC, 2); -} - -void j2k_read_eoc() -{ - int i, tileno; - -#ifndef NO_PACKETS_DECODING - tcd_init(j2k_img, j2k_cp); -#endif - - for (i = 0; i < j2k_cp->tileno_size; i++) { - tileno = j2k_cp->tileno[i]; -#ifndef NO_PACKETS_DECODING - tcd_decode_tile(j2k_tile_data[tileno], j2k_tile_len[tileno], tileno); -#endif - free(j2k_tile_data[tileno]); - } - - j2k_state = J2K_STATE_MT; - longjmp(j2k_error, 1); -} - -void j2k_read_unk() -{ - fprintf(stderr, "warning: unknown marker\n"); -} - -LIBJ2K_API int -j2k_encode(j2k_image_t * img, j2k_cp_t * cp, char *output, - int len, char *index) -{ - int tileno, compno, layno, resno, precno, pack_nb, x, y; - unsigned char *dest = NULL; - FILE *INDEX = NULL; - FILE *f = NULL; - - if (setjmp(j2k_error)) { - return 0; - } - - if (cp->intermed_file == 1) { - f = fopen(output, "wb"); - if (!f) { - fprintf(stderr, "failed to open %s for writing\n", output); - return 1; - } - dest = (unsigned char *) malloc(len); - cio_init(dest, len); - } - - j2k_img = img; - j2k_cp = cp; - /* j2k_dump_cp(j2k_img, j2k_cp); */ - - /* INDEX >> */ - info_IM.index_on = j2k_cp->index_on; - if (info_IM.index_on) { - info_IM.tile = - (info_tile *) malloc(j2k_cp->tw * j2k_cp->th * sizeof(info_tile)); - info_IM.Im_w = j2k_img->x1 - j2k_img->x0; - info_IM.Im_h = j2k_img->y1 - j2k_img->y0; - info_IM.Prog = (&j2k_cp->tcps[0])->prg; - info_IM.tw = j2k_cp->tw; - info_IM.th = j2k_cp->th; - info_IM.Tile_x = j2k_cp->tdx; /* new version parser */ - info_IM.Tile_y = j2k_cp->tdy; /* new version parser */ - info_IM.Tile_Ox = j2k_cp->tx0; /* new version parser */ - info_IM.Tile_Oy = j2k_cp->ty0; /* new version parser */ - info_IM.Comp = j2k_img->numcomps; - info_IM.Layer = (&j2k_cp->tcps[0])->numlayers; - info_IM.Decomposition = (&j2k_cp->tcps[0])->tccps->numresolutions - 1; - info_IM.D_max = 0; /* ADD Marcela */ - } - /* << INDEX */ - - j2k_write_soc(); - j2k_write_siz(); - j2k_write_cod(); - j2k_write_qcd(); - for (compno = 0; compno < j2k_img->numcomps; compno++) { - j2k_tcp_t *tcp = &j2k_cp->tcps[0]; - if (tcp->tccps[compno].roishift) - j2k_write_rgn(compno, 0); - } - if (j2k_cp->comment != NULL) - j2k_write_com(); - - if (cp->intermed_file == 1) { - /* Writing the main header */ - pos_correction = cio_tell(); - fwrite(dest, 1, cio_tell(), f); - } - - /* INDEX >> */ - if (info_IM.index_on) { - info_IM.Main_head_end = cio_tell() - 1; - } - /* << INDEX */ - - - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - fprintf(stdout, "Tile number %d / %d ", tileno + 1, cp->tw * cp->th); - - if (cp->intermed_file == 1) { - /* new dest for each tile */ - free(dest); - dest = (unsigned char *) malloc(len); - cio_init(dest, len); - } - j2k_curtileno = tileno; - /* initialisation before tile encoding */ - - if (tileno == 0) { - tcd_malloc_encode(j2k_img, j2k_cp, j2k_curtileno); - } else { - tcd_init_encode(j2k_img, j2k_cp, j2k_curtileno); - } - - /* INDEX >> */ - if (info_IM.index_on) { - info_IM.tile[j2k_curtileno].num_tile = j2k_curtileno; - info_IM.tile[j2k_curtileno].start_pos = cio_tell() + pos_correction; - } - /* << INDEX */ - j2k_write_sot(); - - for (compno = 1; compno < img->numcomps; compno++) { - j2k_write_coc(compno); - j2k_write_qcc(compno); - } - - if (cp->tcps[tileno].numpocs) - j2k_write_poc(); - j2k_write_sod(); - - /* INDEX >> */ - if (info_IM.index_on) { - info_IM.tile[j2k_curtileno].end_pos = - cio_tell() + pos_correction - 1; - } - /* << INDEX */ - - /* - if (tile->PPT) BAD PPT !!! - { - FILE *PPT_file; - - int i; - PPT_file=fopen("PPT","rb"); - fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256); - for (i=0;ilen_ppt;i++) - { - unsigned char elmt; - fread(&elmt, 1, 1, PPT_file); - fwrite(&elmt,1,1,f); - } - fclose(PPT_file); - unlink("PPT"); - } - */ - if (cp->intermed_file == 1) { - fwrite(dest, 1, cio_tell(), f); - pos_correction = cio_tell() + pos_correction; - } - } - - if (cp->intermed_file == 1) { - free(dest); - dest = (unsigned char *) malloc(len); - cio_init(dest, len); - } - - j2k_write_eoc(); - - if (cp->intermed_file == 1) { - fwrite(dest, 1, 2, f); - free(dest); - /* closing file *.j2k */ - fclose(f); - } - - /* Creation of the index file */ - - if (info_IM.index_on) { - - double DistoTotal = 0; - - info_IM.codestream_size = cio_tell() + pos_correction; /* Correction 14/4/03 suite rmq de Patrick */ - - INDEX = fopen(index, "w"); - - - - if (!INDEX) { - - fprintf(stderr, "failed to open %s for writing\n", index); - - return 1; - - } - - fprintf(INDEX, "%d %d\n", info_IM.Im_w, info_IM.Im_h); - - fprintf(INDEX, "%d\n", info_IM.Prog); - - fprintf(INDEX, "%d %d\n", info_IM.Tile_x, info_IM.Tile_y); - - fprintf(INDEX, "%d %d\n", info_IM.tw, info_IM.th); - - fprintf(INDEX, "%d\n", info_IM.Comp); - - fprintf(INDEX, "%d\n", info_IM.Layer); - - fprintf(INDEX, "%d\n", info_IM.Decomposition); - - for (resno = info_IM.Decomposition; resno >= 0; resno--) { - - fprintf(INDEX, "[%d,%d] ", (1 << info_IM.tile[0].pdx[resno]), (1 << info_IM.tile[0].pdx[resno])); /*based on tile 0*/ - - } - - fprintf(INDEX, "\n"); - - fprintf(INDEX, "%d\n", info_IM.Main_head_end); - - fprintf(INDEX, "%d\n", info_IM.codestream_size); - - for (tileno = 0; tileno < info_IM.tw * info_IM.th; tileno++) { - - fprintf(INDEX, "%4d %9d %9d %9d %9e %9d %9e\n", - info_IM.tile[tileno].num_tile, - info_IM.tile[tileno].start_pos, - info_IM.tile[tileno].end_header, - info_IM.tile[tileno].end_pos, - info_IM.tile[tileno].distotile, info_IM.tile[tileno].nbpix, - info_IM.tile[tileno].distotile / info_IM.tile[tileno].nbpix); - - } - - for (tileno = 0; tileno < info_IM.tw * info_IM.th; tileno++) { - - int start_pos, end_pos; - - double disto = 0; - - pack_nb = 0; - - /* fprintf(INDEX, - - "pkno tileno layerno resno compno precno start_pos end_pos deltaSE \n"); */ - - if (info_IM.Prog == 0) { /* LRCP */ - /*fprintf(INDEX, "pack_nb tileno layno resno compno precno start_pos end_pos disto");*/ - for (layno = 0; layno < info_IM.Layer; layno++) { - for (resno = 0; resno < info_IM.Decomposition + 1; resno++) { - for (compno = 0; compno < info_IM.Comp; compno++) { - for (precno = 0; - precno < - info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno]; - precno++) { - start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos; - end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos; - disto = info_IM.tile[tileno].packet[pack_nb].disto; - fprintf(INDEX, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n", - pack_nb, tileno, layno, resno, compno, precno, - start_pos, end_pos, disto); - DistoTotal += disto; - pack_nb++; - } - } - } - } - } else if (info_IM.Prog == 1) { /* RLCP */ - /*fprintf(INDEX, "pack_nb tileno resno layno compno precno start_pos end_pos disto");*/ - for (resno = 0; resno < info_IM.Decomposition + 1; resno++) { - for (layno = 0; layno < info_IM.Layer; layno++) { - for (compno = 0; compno < info_IM.Comp; compno++) { - for (precno = 0; precno < info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno]; precno++) { - start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos; - end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos; - disto = info_IM.tile[tileno].packet[pack_nb].disto; - fprintf(INDEX, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n", - pack_nb, tileno, resno, layno, compno, precno, - start_pos, end_pos, disto); - DistoTotal += disto; - pack_nb++; - } - } - } - } - } else if (info_IM.Prog == 2) { /* RPCL */ - /*fprintf(INDEX, "\npack_nb tileno resno precno compno layno start_pos end_pos disto\n"); */ - for (resno = 0; resno < info_IM.Decomposition + 1; resno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = info_IM.Tile_Ox + tileno - (int)floor( tileno/info_IM.tw ) * info_IM.tw * info_IM.Tile_x; - int y0 = info_IM.Tile_Ox + (int)floor( tileno/info_IM.tw ) * info_IM.Tile_y; - int x1 = x0 + info_IM.Tile_x; - int y1 = y0 + info_IM.Tile_y; - for (y=y0; yid != 0; e++) { - if (e->id == id) { - break; - } - } - return e; -} - - - -LIBJ2K_API int -j2k_decode(unsigned char *src, int len, j2k_image_t * img, j2k_cp_t * cp) -{ - - if (setjmp(j2k_error)) { - if (j2k_state != J2K_STATE_MT) { - fprintf(stderr, "WARNING: incomplete bitstream\n"); - return 0; - } - j2k_clean(); - return cio_numbytes(); /* Correct way of ending j2k_decode */ - } - - j2k_img = img; - - j2k_cp = cp; - - j2k_state = J2K_STATE_MHSOC; - cio_init(src, len); - - for (;;) { - - - j2k_dec_mstabent_t *e; - int id = cio_read(2); - if (id >> 8 != 0xff) { - fprintf(stderr, "%.8x: expected a marker instead of %x\n", - cio_tell() - 2, id); - return 0; - } - e = j2k_dec_mstab_lookup(id); - if (!(j2k_state & e->states)) { - fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell() - 2, id); - return 0; - } - if (e->handler) { - (*e->handler) (); - } - - - if (j2k_state == J2K_STATE_NEOC) - break; /* RAJOUTE */ - } - if (j2k_state == J2K_STATE_NEOC) - j2k_read_eoc(); /* RAJOUTE */ - - return 0; -} - -/* -* Read a JPT-stream and decode file -* -*/ -int -j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img, - j2k_cp_t * cp) -{ - jpt_msg_header_struct_t header; - int position; - - if (setjmp(j2k_error)) { - if (j2k_state != J2K_STATE_MT) { - fprintf(stderr, "WARNING: incomplete bitstream\n"); - return 0; - } - return cio_numbytes(); - } - - j2k_img = img; - - j2k_cp = cp; - - j2k_state = J2K_STATE_MHSOC; - cio_init(src, len); - - /* Initialize the header */ - jpt_init_Msg_Header(&header); - /* Read the first header of the message */ - jpt_read_Msg_Header(&header); - - position = cio_tell(); - if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ - fprintf(stderr, - "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", - header.Class_Id); - return 0; - } - - for (;;) { - j2k_dec_mstabent_t *e; - int id; - - if (!cio_numbytesleft()) { - j2k_read_eoc(); - return 0; - } - /* data-bin read -> need to read a new header */ - if ((unsigned int) (cio_tell() - position) == header.Msg_length) { - jpt_read_Msg_Header(&header); - position = cio_tell(); - if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ - fprintf(stderr, "[JPT-stream] : Expecting Tile info !\n"); - return 0; - } - } - - id = cio_read(2); - if (id >> 8 != 0xff) { - fprintf(stderr, "%.8x: expected a marker instead of %x\n", - cio_tell() - 2, id); - return 0; - } - e = j2k_dec_mstab_lookup(id); - if (!(j2k_state & e->states)) { - fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell() - 2, id); - return 0; - } - if (e->handler) { - (*e->handler) (); - } - if (j2k_state == J2K_STATE_NEOC) - break; /* RAJOUTE */ - } - if (j2k_state == J2K_STATE_NEOC) - j2k_read_eoc(); /* RAJOUTE */ - - return 0; -} - - - -void j2k_dec_release() - -{ - - int i=0; - - - - /*tcd_dec_release();*/ - - - - if (j2k_tile_len!=NULL) free(j2k_tile_len); - - if (j2k_tile_data!=NULL) free(j2k_tile_data); - - if (j2k_default_tcp.ppt_data_first!=NULL) free(j2k_default_tcp.ppt_data_first); - - if (j2k_default_tcp.tccps!=NULL) free(j2k_default_tcp.tccps); - - for (i=0;itw*j2k_cp->th;i++) { - - if (j2k_cp->tcps[i].ppt_data_first!=NULL) free(j2k_cp->tcps[i].ppt_data_first); - - if (j2k_cp->tcps[i].tccps!=NULL) free(j2k_cp->tcps[i].tccps); - - } - - if (j2k_cp->ppm_data_first!=NULL) free(j2k_cp->ppm_data_first); - - if (j2k_cp->tcps!=NULL) free(j2k_cp->tcps); - - if (j2k_img->comps!=NULL) free(j2k_img->comps); - - if (j2k_cp->tileno!=NULL) free(j2k_cp->tileno); - -} - -#ifdef WIN32 -#include - -BOOL APIENTRY -DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} -#endif diff --git a/mj2/libopenjpeg_097/j2k.h b/mj2/libopenjpeg_097/j2k.h deleted file mode 100644 index 8bf1908f..00000000 --- a/mj2/libopenjpeg_097/j2k.h +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#define VERSION "0.0.8" - -#if defined(_WIN32) && defined (OPENJPEGDLL) -#ifdef gdcmopenjpeg_EXPORTS /*LIBJ2K_EXPORTS*/ -#define LIBJ2K_API __declspec(dllexport) -#else -#define LIBJ2K_API __declspec(dllimport) -#endif -#else -#ifdef OPENJPEGSTATIC -#define LIBJ2K_API extern -#else -#define LIBJ2K_API -#endif -#endif - - -#ifndef __J2K_H -#define __J2K_H - -#define J2K_MAXRLVLS 33 /* Number of maximum resolution level authorized */ -#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /* Number of maximum sub-band linked to number of resolution level */ -#define J2K_CFMT 0 -#define JP2_CFMT 1 -#define JPT_CFMT 2 -#define MJ2_CFMT 3 -#define PXM_DFMT 0 -#define PGX_DFMT 1 -#define BMP_DFMT 2 -#define YUV_DFMT 3 - -#define J2K_CP_CSTY_PRT 0x01 -#define J2K_CP_CSTY_SOP 0x02 -#define J2K_CP_CSTY_EPH 0x04 -#define J2K_CCP_CSTY_PRT 0x01 -#define J2K_CCP_CBLKSTY_LAZY 0x01 -#define J2K_CCP_CBLKSTY_RESET 0x02 -#define J2K_CCP_CBLKSTY_TERMALL 0x04 -#define J2K_CCP_CBLKSTY_VSC 0x08 -#define J2K_CCP_CBLKSTY_PTERM 0x10 -#define J2K_CCP_CBLKSTY_SEGSYM 0x20 -#define J2K_CCP_QNTSTY_NOQNT 0 -#define J2K_CCP_QNTSTY_SIQNT 1 -#define J2K_CCP_QNTSTY_SEQNT 2 - -typedef struct { - int dx, dy; /* XRsiz, YRsiz */ - int w, h; /* width and height of data */ - int x0, y0; /* offset of the component compare to the whole image */ - int prec; /* precision */ - int bpp; /* deapth of image in bits */ - int sgnd; /* signed */ - int resno_decoded; /* number of decoded resolution */ - int factor; /* number of division by 2 of the out image compare to the original size of image */ - int *data; /* image-component data */ -} j2k_comp_t; - -typedef struct { - int x0, y0; /* XOsiz, YOsiz */ - int x1, y1; /* Xsiz, Ysiz */ - int numcomps; /* number of components */ - int color_space; /* sRGB, Greyscale or YUV */ - j2k_comp_t *comps; /* image-components */ -} j2k_image_t; - -typedef struct { - int expn; /* exponent */ - int mant; /* mantissa */ -} j2k_stepsize_t; - -typedef struct { - int csty; /* coding style */ - int numresolutions; /* number of resolutions */ - int cblkw; /* width of code-blocks */ - int cblkh; /* height of code-blocks */ - int cblksty; /* code-block coding style */ - int qmfbid; /* discrete wavelet transform identifier */ - int qntsty; /* quantisation style */ - j2k_stepsize_t stepsizes[J2K_MAXBANDS]; /* stepsizes used for quantization */ - int numgbits; /* number of guard bits */ - int roishift; /* Region Of Interest shift */ - int prcw[J2K_MAXRLVLS]; /* Precinct width */ - int prch[J2K_MAXRLVLS]; /* Precinct height */ -} j2k_tccp_t; - -typedef struct { - int resno0, compno0; - int layno1, resno1, compno1; - int prg; - int tile; - char progorder[4]; -} j2k_poc_t; - -typedef struct { - int first; /* 1 : first part-tile of a tile */ - int csty; /* coding style */ - int prg; /* progression order */ - int numlayers; /* number of layers */ - int mct; /* multi-component transform identifier */ - int rates[100]; /* rates of layers */ - int numpocs; /* number of progression order changes */ - int POC; /* Precise if a POC marker has been used O:NO, 1:YES */ - j2k_poc_t pocs[32]; /* progression order changes */ - unsigned char *ppt_data; /* packet header store there for futur use in t2_decode_packet */ - unsigned char *ppt_data_first; /* pointer remaining on the first byte of the first header if ppt is used */ - int ppt; /* If ppt == 1 --> there was a PPT marker for the present tile */ - int ppt_store; /* Use in case of multiple marker PPT (number of info already store) */ - int ppt_len; /* ppmbug1 */ - float distoratio[100]; /* add fixed_quality */ - j2k_tccp_t *tccps; /* tile-component coding parameters */ -} j2k_tcp_t; - -typedef struct { - int intermed_file; /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/ - int decod_format; /* 0: PGX, 1: PxM, 2: BMP */ - int cod_format; /* 0: J2K, 1: JP2, 2: JPT */ - int disto_alloc; /* Allocation by rate/distortion */ - int fixed_alloc; /* Allocation by fixed layer */ - int fixed_quality; /* add fixed_quality */ - int reduce; /* if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ - int layer; /* if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ - int index_on; /* 0 = no index || 1 = index */ - int tx0, ty0; /* XTOsiz, YTOsiz */ - int tdx, tdy; /* XTsiz, YTsiz */ - char *comment; /* comment for coding */ - int tw, th; /* number of tiles in width and heigth */ - int *tileno; /* ID number of the tiles present in the codestream */ - int tileno_size; /* size of the vector tileno */ - unsigned char *ppm_data; /* packet header store there for futur use in t2_decode_packet */ - unsigned char *ppm_data_first; /* pointer remaining on the first byte of the first header if ppm is used */ - int ppm; /* If ppm == 1 --> there was a PPM marker for the present tile */ - int ppm_store; /* Use in case of multiple marker PPM (number of info already store) */ - int ppm_previous; /* Use in case of multiple marker PPM (case on non-finished previous info) */ - int ppm_len; /* ppmbug1 */ - j2k_tcp_t *tcps; /* tile coding parameters */ - int *matrice; /* Fixed layer */ -} j2k_cp_t; - -typedef struct { - int start_pos, end_pos; /* start and end position */ - double disto; /* ADD for Marcela */ -} info_packet; /* Index struct */ - -typedef struct { - double *thresh; /* value of thresh for each layer by tile cfr. Marcela */ - int num_tile; /* Number of Tile */ - int start_pos; /* Start position */ - int end_header; /* End position of the header */ - int end_pos; /* End position */ - int pw[33], ph[33]; /* precinct number for each resolution level */ - - int pdx[33], pdy[33]; /* precinct size (in power of 2), in X and Y for each resolution level */ - info_packet *packet; /* information concerning packets inside tile */ - int nbpix; /* add fixed_quality */ - double distotile; /* add fixed_quality */ -} info_tile; /* index struct */ - -typedef struct { - int index_on; - double D_max; /* ADD for Marcela */ - int num; /* numero of packet */ - int index_write; /* writing the packet inthe index with t2_encode_packets */ - int Im_w, Im_h; /* Image width and Height */ - int Prog; /* progression order */ - int Tile_x, Tile_y; /* Tile size in x and y */ - int Tile_Ox, Tile_Oy; - int tw, th; /* Number of Tile in X and Y */ - int Comp; /* Component numbers */ - int Layer; /* number of layer */ - int Decomposition; /* number of decomposition */ - int Main_head_end; /* Main header position */ - int codestream_size; /* codestream's size */ - info_tile *tile; /* information concerning tiles inside image */ -} info_image; /* index struct */ - -/* - * Encode an image into a JPEG-2000 codestream - * i: image to encode - * cp: coding parameters - * output: destination buffer or name of the output file when cp->intermed_file==1 - * len: length of destination buffer - * index : index file name - */ -LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output, - int len, char *index); - -/* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */ -/* - * Decode an image from a JPEG-2000 codestream - * src: source buffer - * len: length of source buffer - * i: decode image - * cp: coding parameters that were used to encode the image - */ - -LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img, - j2k_cp_t * cp); - - -/* - * Decode an image form a JPT-stream (JPEG 2000, JPIP) - * src: source buffer - * len: length of source buffer - * i: decode image - * cp: coding parameters that were used to encode the image - * - */ -int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img, - j2k_cp_t * cp); - -LIBJ2K_API void j2k_dec_release();/*antonin*/ - -#endif diff --git a/mj2/libopenjpeg_097/jp2.c b/mj2/libopenjpeg_097/jp2.c deleted file mode 100644 index 169a3ae4..00000000 --- a/mj2/libopenjpeg_097/jp2.c +++ /dev/null @@ -1,529 +0,0 @@ -/* -* Copyright (c) 2003-2004, Yannick Verschueren -* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include - -#include "j2k.h" -#include "jp2.h" -#include "cio.h" - -#define JPIP_JPIP 0x6a706970 - -#define JP2_JP 0x6a502020 -#define JP2_FTYP 0x66747970 -#define JP2_JP2H 0x6a703268 -#define JP2_IHDR 0x69686472 -#define JP2_COLR 0x636f6c72 -#define JP2_JP2C 0x6a703263 -#define JP2_URL 0x75726c20 -#define JP2_DBTL 0x6474626c -#define JP2_BPCC 0x62706363 -#define JP2_JP2 0x6a703220 - -/* -* -* Read box headers -* -*/ - -int jp2_read_boxhdr(jp2_box_t * box) -{ - box->init_pos = cio_tell(); - box->length = cio_read(4); - box->type = cio_read(4); - if (box->length == 1) { - if (cio_read(4) != 0) { - fprintf(stderr, "Error: Cannot handle box sizes higher than 2^32\n"); - return 1; - } - box->length = cio_read(4); - if (box->length == 0) - box->length = cio_numbytesleft() + 12; - } else if (box->length == 0) { - box->length = cio_numbytesleft() + 8; - } - return 0; -} - -/* -* -* Initialisation of a Standard JP2 structure -*/ - -int jp2_init_stdjp2(jp2_struct_t * jp2_struct) -{ - - jp2_struct->comps = - (jp2_comps_t *) malloc(jp2_struct->numcomps * sizeof(jp2_comps_t)); - - jp2_struct->precedence = 0; /* PRECEDENCE*/ - jp2_struct->approx = 0; /* APPROX*/ - - jp2_struct->brand = JP2_JP2; /* BR */ - jp2_struct->minversion = 0; /* MinV */ - jp2_struct->numcl = 1; - jp2_struct->cl = (unsigned int *) malloc(jp2_struct->numcl * sizeof(int)); - jp2_struct->cl[0] = JP2_JP2; /* CL0 : JP2 */ - - jp2_struct->C = 7; /* C : Always 7*/ - jp2_struct->UnkC = 0; /* UnkC, colorspace specified in colr box*/ - jp2_struct->IPR = 0; /* IPR, no intellectual property*/ - - return 0; -} - - -void jp2_write_url(char *Idx_file) -{ - unsigned int i; - char str[256]; - jp2_box_t box; - - sprintf(str, "%s", Idx_file); - - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_URL, 4); /* DBTL*/ - cio_write(0, 1); /* VERS*/ - cio_write(0, 3); /* FLAG*/ - - for (i = 0; i < strlen(str); i++) { - cio_write(str[i], 1); - } - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the IHDR box -* -* Image Header box -* -*/ -int jp2_read_ihdr(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - - jp2_read_boxhdr(&box); - if (JP2_IHDR != box.type) { - fprintf(stderr, "Error: Expected IHDR Marker\n"); - return 1; - } - - jp2_struct->h = cio_read(4); /* HEIGHT*/ - jp2_struct->w = cio_read(4); /* WIDTH*/ - jp2_struct->numcomps = cio_read(2); /* NC*/ - - jp2_struct->bpc = cio_read(1); /* BPC*/ - - jp2_struct->C = cio_read(1); /* C */ - jp2_struct->UnkC = cio_read(1); /* UnkC*/ - jp2_struct->IPR = cio_read(1); /* IPR*/ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with IHDR Box\n"); - return 1; - } - return 0; -} - -void jp2_write_ihdr(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_IHDR, 4); /* IHDR*/ - - cio_write(jp2_struct->h, 4); /* HEIGHT*/ - cio_write(jp2_struct->w, 4); /* WIDTH*/ - cio_write(jp2_struct->numcomps, 2); /* NC*/ - - cio_write(jp2_struct->bpc, 1); /* BPC */ - - cio_write(jp2_struct->C, 1); /* C : Always 7*/ - cio_write(jp2_struct->UnkC, 1); /* UnkC, colorspace unknow*/ - cio_write(jp2_struct->IPR, 1); /* IPR, no intellectual property*/ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - - -void jp2_write_bpcc(jp2_struct_t * jp2_struct) -{ - unsigned int i; - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_BPCC, 4); /* BPCC*/ - - for (i = 0; i < jp2_struct->numcomps; i++) - cio_write(jp2_struct->comps[i].bpcc, 1); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - - -int jp2_read_bpcc(jp2_struct_t * jp2_struct) -{ - unsigned int i; - jp2_box_t box; - - jp2_read_boxhdr(&box); - if (JP2_BPCC != box.type) { - fprintf(stderr, "Error: Expected BPCC Marker\n"); - return 1; - } - - for (i = 0; i < jp2_struct->numcomps; i++) - jp2_struct->comps[i].bpcc = cio_read(1); - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with BPCC Box\n"); - return 1; - } - return 0; -} - -void jp2_write_colr(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_COLR, 4); /* COLR*/ - - cio_write(jp2_struct->meth, 1); /* METH*/ - cio_write(jp2_struct->precedence, 1); /* PRECEDENCE*/ - cio_write(jp2_struct->approx, 1); /* APPROX*/ - - if (jp2_struct->meth == 1) - cio_write(jp2_struct->enumcs, 4); /* EnumCS*/ - else - cio_write(0, 1); /* PROFILE (??)*/ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -int jp2_read_colr(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - int skip_len; - - jp2_read_boxhdr(&box); - do { - if (JP2_COLR != box.type) { - cio_skip(box.length - 8); - jp2_read_boxhdr(&box); - } - } while (JP2_COLR != box.type); - - jp2_struct->meth = cio_read(1); /* METH*/ - jp2_struct->precedence = cio_read(1); /* PRECEDENCE*/ - jp2_struct->approx = cio_read(1); /* APPROX*/ - - if (jp2_struct->meth == 1) - jp2_struct->enumcs = cio_read(4); /* EnumCS*/ - else { - /* SKIP PROFILE */ - skip_len = box.init_pos + box.length - cio_tell(); - if (skip_len < 0) { - fprintf(stderr, "Error with JP2H box size\n"); - return 1; - } - cio_skip(box.init_pos + box.length - cio_tell()); - } - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with BPCC Box\n"); - return 1; - } - return 0; -} - -/* -* Write the JP2H box -* -* JP2 Header box -* -*/ -void jp2_write_jp2h(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4);; - cio_write(JP2_JP2H, 4); /* JP2H */ - - jp2_write_ihdr(jp2_struct); - - if (jp2_struct->bpc == 255) - jp2_write_bpcc(jp2_struct); - jp2_write_colr(jp2_struct); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - - -/* -* Read the JP2H box -* -* JP2 Header box -* -*/ -int jp2_read_jp2h(jp2_struct_t * jp2_struct) -{ - jp2_box_t box; - int skip_len; - - jp2_read_boxhdr(&box); - do { - if (JP2_JP2H != box.type) { - if (box.type == JP2_JP2C) { - fprintf(stderr, "Error: Expected JP2H Marker\n"); - return 1; - } - cio_skip(box.length - 8); - jp2_read_boxhdr(&box); - } - } while (JP2_JP2H != box.type); - - if (jp2_read_ihdr(jp2_struct)) - return 1; - - if (jp2_struct->bpc == 255) { - if (jp2_read_bpcc(jp2_struct)) - return 1; - } - - if (jp2_read_colr(jp2_struct)) - return 1; - - skip_len = box.init_pos + box.length - cio_tell(); - if (skip_len < 0) { - fprintf(stderr, "Error with JP2H box size\n"); - return 1; - } - cio_skip(box.init_pos + box.length - cio_tell()); - - return 0; -} - -/* -* Write the FTYP box -* -* File type box -* -*/ -void jp2_write_ftyp(jp2_struct_t * jp2_struct) -{ - unsigned int i; - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_FTYP, 4); /* FTYP */ - - cio_write(jp2_struct->brand, 4); /* BR */ - cio_write(jp2_struct->minversion, 4); /* MinV */ - - for (i = 0; i < jp2_struct->numcl; i++) - cio_write(jp2_struct->cl[i], 4); /* CL */ - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the FTYP box -* -* File type box -* -*/ -int jp2_read_ftyp(jp2_struct_t * jp2_struct) -{ - int i; - jp2_box_t box; - - jp2_read_boxhdr(&box); - - if (JP2_FTYP != box.type) { - fprintf(stderr, "Error: Excpected FTYP Marker\n"); - return 1; - } - - jp2_struct->brand = cio_read(4); /* BR */ - jp2_struct->minversion = cio_read(4); /* MinV */ - jp2_struct->numcl = (box.length - 16) / 4; - jp2_struct->cl = - (unsigned int *) malloc(jp2_struct->numcl * sizeof(unsigned int)); - - for (i = 0; i < (int) jp2_struct->numcl; i++) - jp2_struct->cl[i] = cio_read(4); /* CLi */ - - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with FTYP Box\n"); - return 1; - } - return 0; -} - -int jp2_write_jp2c(int j2k_codestream_len, int *j2k_codestream_offset, - char *j2k_codestream) -{ - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_JP2C, 4); /* JP2C*/ - - *j2k_codestream_offset = cio_tell(); - memcpy(cio_getbp(), j2k_codestream, j2k_codestream_len); - - box.length = 8 + j2k_codestream_len; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); - - return box.length; -} - - -int jp2_read_jp2c(unsigned int *j2k_codestream_len, - unsigned int *j2k_codestream_offset) -{ - jp2_box_t box; - - jp2_read_boxhdr(&box); - do { - if (JP2_JP2C != box.type) { - cio_skip(box.length - 8); - jp2_read_boxhdr(&box); - } - } while (JP2_JP2C != box.type); - - *j2k_codestream_offset = cio_tell(); - *j2k_codestream_len = box.length - 8; - - return 0; -} - -void jp2_write_jp() -{ - jp2_box_t box; - - box.init_pos = cio_tell(); - cio_skip(4); - cio_write(JP2_JP, 4); /* JP*/ - cio_write(0x0d0a870a, 4); - - box.length = cio_tell() - box.init_pos; - cio_seek(box.init_pos); - cio_write(box.length, 4); /* L */ - cio_seek(box.init_pos + box.length); -} - -/* -* Read the JP box -* -* JPEG 2000 signature -* -* return 1 if error else 0 -*/ -int jp2_read_jp() -{ - jp2_box_t box; - - jp2_read_boxhdr(&box); - if (JP2_JP != box.type) { - fprintf(stderr, "Error: Expected JP Marker\n"); - return 1; - } - if (0x0d0a870a != cio_read(4)) { - fprintf(stderr, "Error with JP Marker\n"); - return 1; - } - if (cio_tell() - box.init_pos != box.length) { - fprintf(stderr, "Error with JP Box size\n"); - return 1; - } - return 0; - -} - - -int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct, int len) -{ - cio_init(src, len); - - if (jp2_read_jp()) - return 1; - if (jp2_read_ftyp(jp2_struct)) - return 1; - if (jp2_read_jp2h(jp2_struct)) - return 1; - if (jp2_read_jp2c - (&jp2_struct->j2k_codestream_len, - &jp2_struct->j2k_codestream_offset)) - return 1; - return 0; -} - -int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream, - char *output) -{ - (void)output; - jp2_write_jp(); - jp2_write_ftyp(jp2_struct); - jp2_write_jp2h(jp2_struct); - - jp2_write_jp2c(jp2_struct->j2k_codestream_len, - &jp2_struct->j2k_codestream_offset, j2k_codestream); - - return cio_tell(); -} diff --git a/mj2/libopenjpeg_097/jp2.h b/mj2/libopenjpeg_097/jp2.h deleted file mode 100644 index 278eb5d4..00000000 --- a/mj2/libopenjpeg_097/jp2.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2003, Yannick Verschueren - * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef __JP2_H -#define __JP2_H - -#include "j2k.h" - -typedef struct { - int depth; - int sgnd; - int bpcc; -} jp2_comps_t; - -typedef struct { - unsigned int w; - unsigned int h; - unsigned int numcomps; - unsigned int bpc; - unsigned int C; - unsigned int UnkC; - unsigned int IPR; - unsigned int meth; - unsigned int approx; - unsigned int enumcs; - unsigned int precedence; - unsigned int brand; - unsigned int minversion; - unsigned int numcl; - unsigned int *cl; - jp2_comps_t *comps; - j2k_image_t *image; - unsigned int j2k_codestream_offset; - unsigned int j2k_codestream_len; -} jp2_struct_t; - -typedef struct { - int length; - int type; - int init_pos; -} jp2_box_t; - -/* int jp2_init_stdjp2(jp2_struct_t * jp2_struct, j2k_image_t * img); - * - * Create a standard jp2_structure - * jp2_struct: the structure you are creating - * img: a j2k_image_t wich will help you to create the jp2_structure - */ -int jp2_init_stdjp2(jp2_struct_t * jp2_struct); - -/* int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream) - * - * Write the jp2c codestream box - * j2k_len: the j2k codestream length - * j2k_codestream_offset: the function will return the j2k codestream offset - * j2k_codestream: the j2k codestream to include in jp2 file - */ -int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream); - -/* int jp2_write_jp2h(jp2_struct_t * jp2_struct); - * - * Write the jp2h header box - * jp2_struct: the jp2 structure you are working with - */ -void jp2_write_jp2h(jp2_struct_t * jp2_struct); - -/* int jp2_read_jp2h(jp2_struct_t * jp2_struct); - * - * Read the jp2h header box - * jp2_struct: the jp2 structure you are working with - */ -int jp2_read_jp2h(jp2_struct_t * jp2_struct); - -/* int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream, - int j2k_len, char *output) - * - * Wrap a J2K codestream in a JP2 file - * jp2_struct: the jp2 structure used to create jp2 boxes - * j2k_codestream: the j2k codestream to include in jp2 file - * output: pointer to jp2 codestream that will be created - */ -int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream, - char *output); - - -/* int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct); - * - * Decode the structure of a JP2 file - * src: pointer to memory where compressed data is stored - * jp2_struct: the jp2 structure that will be created - * len: length of jp2 codestream - */ -int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct, int len); - -#endif diff --git a/mj2/libopenjpeg_097/jpt.c b/mj2/libopenjpeg_097/jpt.c deleted file mode 100644 index cf7f651b..00000000 --- a/mj2/libopenjpeg_097/jpt.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2004, Yannick Verschueren - * Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include "jpt.h" -#include "j2k.h" -#include "cio.h" - - -/* - * Read the information contains in VBAS [JPP/JPT stream message header] - * Store information (7 bits) in value - * - */ -unsigned int jpt_read_VBAS_info(unsigned int value) -{ - unsigned char elmt; - - elmt = cio_read(1); - while ((elmt >> 7) == 1) { - value = (value << 7); - value |= (elmt & 0x7f); - elmt = cio_read(1); - } - value = (value << 7); - value |= (elmt & 0x7f); - - return value; -} - -/* - * Initialize the value of the message header structure - * - */ -void jpt_init_Msg_Header(jpt_msg_header_struct_t * header) -{ - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Class_Id = 0; /* Class Identifier */ - header->CSn_Id = 0; /* CSn : index identifier */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ - header->Layer_nb = 0; /* Auxiliary for JPP case */ -} - -/* - * Re-initialize the value of the message header structure - * - * Only parameters always present in message header - * - */ -void jpt_reinit_Msg_Header(jpt_msg_header_struct_t * header) -{ - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ -} - -/* - * Read the message header for a JPP/JPT - stream - * - */ -void jpt_read_Msg_Header(jpt_msg_header_struct_t * header) -{ - unsigned char elmt, Class = 0, CSn = 0; - jpt_reinit_Msg_Header(header); - - /* ------------- */ - /* VBAS : Bin-ID */ - /* ------------- */ - elmt = cio_read(1); - - /* See for Class and CSn */ - switch ((elmt >> 5) & 0x03) { - case 0: - fprintf(stderr, "Forbidden value encounter in message header !!\n"); - break; - case 1: - Class = 0; - CSn = 0; - break; - case 2: - Class = 1; - CSn = 0; - break; - case 3: - Class = 1; - CSn = 1; - break; - default: - break; - } - - /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ - if (((elmt >> 4) & 0x01) == 1) - header->last_byte = 1; - - /* In-class identifier */ - header->Id |= (elmt & 0x0f); - if ((elmt >> 7) == 1) - header->Id = jpt_read_VBAS_info(header->Id); - - /* ------------ */ - /* VBAS : Class */ - /* ------------ */ - if (Class == 1) { - header->Class_Id = 0; - header->Class_Id = jpt_read_VBAS_info(header->Class_Id); - } - - /* ---------- */ - /* VBAS : CSn */ - /* ---------- */ - if (CSn == 1) { - header->CSn_Id = 0; - header->CSn_Id = jpt_read_VBAS_info(header->CSn_Id); - } - - /* ----------------- */ - /* VBAS : Msg_offset */ - /* ----------------- */ - header->Msg_offset = jpt_read_VBAS_info(header->Msg_offset); - - /* ----------------- */ - /* VBAS : Msg_length */ - /* ----------------- */ - header->Msg_length = jpt_read_VBAS_info(header->Msg_length); - - /* ---------- */ - /* VBAS : Aux */ - /* ---------- */ - if ((header->Class_Id & 0x01) == 1) { - header->Layer_nb = 0; - header->Layer_nb = jpt_read_VBAS_info(header->Layer_nb); - } -} diff --git a/mj2/libopenjpeg_097/jpt.h b/mj2/libopenjpeg_097/jpt.h deleted file mode 100644 index bee07c7d..00000000 --- a/mj2/libopenjpeg_097/jpt.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2004, Yannick Verschueren - * Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Message Header JPT_stream Structure - * - */ -typedef struct { - unsigned int Id; /* In-class Identifier */ - unsigned int last_byte; /* Last byte information */ - unsigned int Class_Id; /* Class Identifier */ - unsigned int CSn_Id; /* CSn : index identifier */ - unsigned int Msg_offset; /* Message offset */ - unsigned int Msg_length; /* Message length */ - unsigned int Layer_nb; /* Auxiliary for JPP case */ -} jpt_msg_header_struct_t; - -/* - * Initialize the value of the message header structure - * - * header : Message header structure - * - */ -void jpt_init_Msg_Header(jpt_msg_header_struct_t * header); - -/* - * Read the message header for a JPP/JPT - stream - * - * header : Message header structure - * - */ -void jpt_read_Msg_Header(jpt_msg_header_struct_t * header); diff --git a/mj2/libopenjpeg_097/mct.c b/mj2/libopenjpeg_097/mct.c deleted file mode 100644 index 718305cd..00000000 --- a/mj2/libopenjpeg_097/mct.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "mct.h" -#include "fix.h" - -/* */ -/* This table contains the norms of the basis function of the reversible MCT. */ -/* */ -double mct_norms[3] = { 1.732, .8292, .8292 }; - -/* */ -/* This table contains the norms of the basis function of the irreversible MCT. */ -/* */ -double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; - -/* */ -/* Foward reversible MCT. */ -/* */ -void mct_encode(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int r, g, b, y, u, v; - r = c0[i]; - g = c1[i]; - b = c2[i]; - y = (r + (g << 1) + b) >> 2; - u = b - g; - v = r - g; - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse reversible MCT. */ -/* */ -void mct_decode(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int y, u, v, r, g, b; - y = c0[i]; - u = c1[i]; - v = c2[i]; - g = y - ((u + v) >> 2); - r = v + g; - b = u + g; - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of reversible MCT. */ -/* */ -double mct_getnorm(int compno) -{ - return mct_norms[compno]; -} - -/* */ -/* Foward irreversible MCT. */ -/* */ -void mct_encode_real(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int r, g, b, y, u, v; - r = c0[i]; - g = c1[i]; - b = c2[i]; - y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); - u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); - v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse irreversible MCT. */ -/* */ -void mct_decode_real(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int y, u, v, r, g, b; - y = c0[i]; - u = c1[i]; - v = c2[i]; - r = y + fix_mul(v, 11485); - g = y - fix_mul(u, 2819) - fix_mul(v, 5850); - b = y + fix_mul(u, 14516); - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of irreversible MCT. */ -/* */ -double mct_getnorm_real(int compno) -{ - return mct_norms_real[compno]; -} diff --git a/mj2/libopenjpeg_097/mct.h b/mj2/libopenjpeg_097/mct.h deleted file mode 100644 index fa48aa8d..00000000 --- a/mj2/libopenjpeg_097/mct.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MCT_H -#define __MCT_H - -/* - * Apply a reversible multi-component transform to an image - * R: samples for red component - * G: samples for green component - * B: samples blue component - * n: number of samples for each component - */ -void mct_encode(int *R, int *G, int *B, int n); -/* - * Apply a reversible multi-component inverse transform to an image - * Y: samples for luminance component - * U: samples for red chrominance component - * V: samples for blue chrominance component - * n: number of samples for each component - */ -void mct_decode(int *V, int *U, int *Y, int n); -/* - * Get norm of the basis function used for the reversible multi-component transform - * compno: number of the component (0->Y, 1->U, 2->V) - */ -double mct_getnorm(int compno); - -/* - * Apply an irreversible multi-component transform to an image - * R: samples for red component - * G: samples for green component - * B: samples blue component - * n: number of samples for each component - */ -void mct_encode_real(int *c0, int *c1, int *c2, int n); -/* - * Apply an irreversible multi-component inverse transform to an image - * Y: samples for luminance component - * U: samples for red chrominance component - * V: samples for blue chrominance component - * n: number of samples for each component - */ -void mct_decode_real(int *c0, int *c1, int *c2, int n); -/* - * Get norm of the basis function used for the irreversible multi-component transform - * compno: number of the component (0->Y, 1->U, 2->V) - */ -double mct_getnorm_real(int compno); - -#endif diff --git a/mj2/libopenjpeg_097/mqc.c b/mj2/libopenjpeg_097/mqc.c deleted file mode 100644 index b04029f0..00000000 --- a/mj2/libopenjpeg_097/mqc.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "mqc.h" -#include - -/* */ -/* This struct defines the state of a context. */ -/* */ -typedef struct mqc_state_s { - unsigned int qeval; /* the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ - int mps; /* the Most Probable Symbol (0 or 1) */ - struct mqc_state_s *nmps; /* next state if the next encoded symbol is the MPS */ - struct mqc_state_s *nlps; /* next state if the next encoded symbol is the LPS */ -} mqc_state_t; - -/* */ -/* This array defines all the possible states for a context. */ -/* */ -mqc_state_t mqc_states[47 * 2] = { - {0x5601, 0, &mqc_states[2], &mqc_states[3]}, - {0x5601, 1, &mqc_states[3], &mqc_states[2]}, - {0x3401, 0, &mqc_states[4], &mqc_states[12]}, - {0x3401, 1, &mqc_states[5], &mqc_states[13]}, - {0x1801, 0, &mqc_states[6], &mqc_states[18]}, - {0x1801, 1, &mqc_states[7], &mqc_states[19]}, - {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, - {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, - {0x0521, 0, &mqc_states[10], &mqc_states[58]}, - {0x0521, 1, &mqc_states[11], &mqc_states[59]}, - {0x0221, 0, &mqc_states[76], &mqc_states[66]}, - {0x0221, 1, &mqc_states[77], &mqc_states[67]}, - {0x5601, 0, &mqc_states[14], &mqc_states[13]}, - {0x5601, 1, &mqc_states[15], &mqc_states[12]}, - {0x5401, 0, &mqc_states[16], &mqc_states[28]}, - {0x5401, 1, &mqc_states[17], &mqc_states[29]}, - {0x4801, 0, &mqc_states[18], &mqc_states[28]}, - {0x4801, 1, &mqc_states[19], &mqc_states[29]}, - {0x3801, 0, &mqc_states[20], &mqc_states[28]}, - {0x3801, 1, &mqc_states[21], &mqc_states[29]}, - {0x3001, 0, &mqc_states[22], &mqc_states[34]}, - {0x3001, 1, &mqc_states[23], &mqc_states[35]}, - {0x2401, 0, &mqc_states[24], &mqc_states[36]}, - {0x2401, 1, &mqc_states[25], &mqc_states[37]}, - {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, - {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, - {0x1601, 0, &mqc_states[58], &mqc_states[42]}, - {0x1601, 1, &mqc_states[59], &mqc_states[43]}, - {0x5601, 0, &mqc_states[30], &mqc_states[29]}, - {0x5601, 1, &mqc_states[31], &mqc_states[28]}, - {0x5401, 0, &mqc_states[32], &mqc_states[28]}, - {0x5401, 1, &mqc_states[33], &mqc_states[29]}, - {0x5101, 0, &mqc_states[34], &mqc_states[30]}, - {0x5101, 1, &mqc_states[35], &mqc_states[31]}, - {0x4801, 0, &mqc_states[36], &mqc_states[32]}, - {0x4801, 1, &mqc_states[37], &mqc_states[33]}, - {0x3801, 0, &mqc_states[38], &mqc_states[34]}, - {0x3801, 1, &mqc_states[39], &mqc_states[35]}, - {0x3401, 0, &mqc_states[40], &mqc_states[36]}, - {0x3401, 1, &mqc_states[41], &mqc_states[37]}, - {0x3001, 0, &mqc_states[42], &mqc_states[38]}, - {0x3001, 1, &mqc_states[43], &mqc_states[39]}, - {0x2801, 0, &mqc_states[44], &mqc_states[38]}, - {0x2801, 1, &mqc_states[45], &mqc_states[39]}, - {0x2401, 0, &mqc_states[46], &mqc_states[40]}, - {0x2401, 1, &mqc_states[47], &mqc_states[41]}, - {0x2201, 0, &mqc_states[48], &mqc_states[42]}, - {0x2201, 1, &mqc_states[49], &mqc_states[43]}, - {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, - {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, - {0x1801, 0, &mqc_states[52], &mqc_states[46]}, - {0x1801, 1, &mqc_states[53], &mqc_states[47]}, - {0x1601, 0, &mqc_states[54], &mqc_states[48]}, - {0x1601, 1, &mqc_states[55], &mqc_states[49]}, - {0x1401, 0, &mqc_states[56], &mqc_states[50]}, - {0x1401, 1, &mqc_states[57], &mqc_states[51]}, - {0x1201, 0, &mqc_states[58], &mqc_states[52]}, - {0x1201, 1, &mqc_states[59], &mqc_states[53]}, - {0x1101, 0, &mqc_states[60], &mqc_states[54]}, - {0x1101, 1, &mqc_states[61], &mqc_states[55]}, - {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, - {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, - {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, - {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, - {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, - {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, - {0x0521, 0, &mqc_states[68], &mqc_states[62]}, - {0x0521, 1, &mqc_states[69], &mqc_states[63]}, - {0x0441, 0, &mqc_states[70], &mqc_states[64]}, - {0x0441, 1, &mqc_states[71], &mqc_states[65]}, - {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, - {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, - {0x0221, 0, &mqc_states[74], &mqc_states[68]}, - {0x0221, 1, &mqc_states[75], &mqc_states[69]}, - {0x0141, 0, &mqc_states[76], &mqc_states[70]}, - {0x0141, 1, &mqc_states[77], &mqc_states[71]}, - {0x0111, 0, &mqc_states[78], &mqc_states[72]}, - {0x0111, 1, &mqc_states[79], &mqc_states[73]}, - {0x0085, 0, &mqc_states[80], &mqc_states[74]}, - {0x0085, 1, &mqc_states[81], &mqc_states[75]}, - {0x0049, 0, &mqc_states[82], &mqc_states[76]}, - {0x0049, 1, &mqc_states[83], &mqc_states[77]}, - {0x0025, 0, &mqc_states[84], &mqc_states[78]}, - {0x0025, 1, &mqc_states[85], &mqc_states[79]}, - {0x0015, 0, &mqc_states[86], &mqc_states[80]}, - {0x0015, 1, &mqc_states[87], &mqc_states[81]}, - {0x0009, 0, &mqc_states[88], &mqc_states[82]}, - {0x0009, 1, &mqc_states[89], &mqc_states[83]}, - {0x0005, 0, &mqc_states[90], &mqc_states[84]}, - {0x0005, 1, &mqc_states[91], &mqc_states[85]}, - {0x0001, 0, &mqc_states[90], &mqc_states[86]}, - {0x0001, 1, &mqc_states[91], &mqc_states[87]}, - {0x5601, 0, &mqc_states[92], &mqc_states[92]}, - {0x5601, 1, &mqc_states[93], &mqc_states[93]}, -}; - -#define MQC_NUMCTXS 32 - -unsigned int mqc_c; -unsigned int mqc_a; -unsigned int mqc_ct; -unsigned char *mqc_bp; -unsigned char *mqc_start; -unsigned char *mqc_end; -mqc_state_t *mqc_ctxs[MQC_NUMCTXS]; -mqc_state_t **mqc_curctx; - -/* */ -/* Return the number of bytes already encoded. */ -/* */ -int mqc_numbytes() -{ - return mqc_bp - mqc_start; -} - -/* */ -/* Output a byte, doing bit-stuffing if necessary. */ -/* After a 0xff byte, the next byte must be smaller than 0x90 */ -/* */ -void mqc_byteout() -{ - if (*mqc_bp == 0xff) { - mqc_bp++; - *mqc_bp = mqc_c >> 20; - mqc_c &= 0xfffff; - mqc_ct = 7; - } else { - if ((mqc_c & 0x8000000) == 0) { /* ((mqc_c&0x8000000)==0) CHANGE */ - mqc_bp++; - *mqc_bp = mqc_c >> 19; - mqc_c &= 0x7ffff; - mqc_ct = 8; - } else { - (*mqc_bp)++; - if (*mqc_bp == 0xff) { - mqc_c &= 0x7ffffff; - mqc_bp++; - *mqc_bp = mqc_c >> 20; - mqc_c &= 0xfffff; - mqc_ct = 7; - } else { - mqc_bp++; - *mqc_bp = mqc_c >> 19; - mqc_c &= 0x7ffff; - mqc_ct = 8; - } - } - } -} - -/* */ -/* Renormalize mqc_a and mqc_c while encoding, so that mqc_a stays between 0x8000 and 0x10000 */ -/* */ -void mqc_renorme() -{ - do { - mqc_a <<= 1; - mqc_c <<= 1; - mqc_ct--; - if (mqc_ct == 0) { - mqc_byteout(); - } - } while ((mqc_a & 0x8000) == 0); -} - -/* */ -/* Encode the most probable symbol. */ -/* */ -void mqc_codemps() -{ - mqc_a -= (*mqc_curctx)->qeval; - if ((mqc_a & 0x8000) == 0) { - if (mqc_a < (*mqc_curctx)->qeval) { - mqc_a = (*mqc_curctx)->qeval; - } else { - mqc_c += (*mqc_curctx)->qeval; - } - *mqc_curctx = (*mqc_curctx)->nmps; - mqc_renorme(); - } else { - mqc_c += (*mqc_curctx)->qeval; - } -} - -/* */ -/* Encode the most least symbol. */ -/* */ -void mqc_codelps() -{ - mqc_a -= (*mqc_curctx)->qeval; - if (mqc_a < (*mqc_curctx)->qeval) { - mqc_c += (*mqc_curctx)->qeval; - } else { - mqc_a = (*mqc_curctx)->qeval; - } - *mqc_curctx = (*mqc_curctx)->nlps; - mqc_renorme(); -} - -/* */ -/* Initialize encoder. */ -/* */ -/* Output buffer. */ -void mqc_init_enc(unsigned char *bp) -{ - mqc_setcurctx(0); - mqc_a = 0x8000; - mqc_c = 0; - mqc_bp = bp - 1; - mqc_ct = 12; - if (*mqc_bp == 0xff) { - mqc_ct = 13; - } - mqc_start = bp; -} - -/* */ -/* Set current context. */ -/* */ -/* Context number. */ -void mqc_setcurctx(int ctxno) -{ - mqc_curctx = &mqc_ctxs[ctxno]; -} - -/* */ -/* Encode a symbol using the MQ-coder. */ -/* */ -/* The symbol to be encoded (0 or 1). */ -void mqc_encode(int d) -{ - if ((*mqc_curctx)->mps == d) { - mqc_codemps(); - } else { - mqc_codelps(); - } -} - -/* */ -/* Fill mqc_c with 1's for flushing */ -/* */ -void mqc_setbits() -{ - unsigned int tempc = mqc_c + mqc_a; - mqc_c |= 0xffff; - if (mqc_c >= tempc) { - mqc_c -= 0x8000; - } -} - -/* */ -/* Flush encoded data. */ -/* */ -void mqc_flush() -{ - mqc_setbits(); - mqc_c <<= mqc_ct; - mqc_byteout(); - mqc_c <<= mqc_ct; - mqc_byteout(); - - if (*mqc_bp != 0xff) { - mqc_bp++; - } -} - -/* */ -/* not fully implemented and tested !! */ -/* BYPASS mode switch, initialization operation */ -/* JPEG 2000 p 505 */ -/* */ -void mqc_bypass_init_enc() -{ - mqc_c = 0; - mqc_ct = 8; - /*if (*mqc_bp == 0xff) { - mqc_ct = 7; - } */ -} - -/* */ -/* not fully implemented and tested !! */ -/* BYPASS mode switch, coding operation */ -/* JPEG 2000 p 505 */ -/* */ -void mqc_bypass_enc(int d) -{ - mqc_ct--; - mqc_c = mqc_c + (d << mqc_ct); - if (mqc_ct == 0) { - mqc_bp++; - *mqc_bp = mqc_c; - mqc_ct = 8; - if (*mqc_bp == 0xff) { - mqc_ct = 7; - } - mqc_c = 0; - } -} - -/* */ -/* not fully implemented and tested !! */ -/* BYPASS mode switch, flush operation */ -/* */ -int mqc_bypass_flush_enc() -{ - unsigned char bit_padding; - - bit_padding = 0; - - if (mqc_ct != 0) { - while (mqc_ct > 0) { - mqc_ct--; - mqc_c += bit_padding << mqc_ct; - bit_padding = (bit_padding + 1) & 0x01; - } - mqc_bp++; - *mqc_bp = mqc_c; - mqc_ct = 8; - mqc_c = 0; - } - - return 1; -} - -/* */ -/* RESET mode switch */ -/* */ -void mqc_reset_enc() -{ - mqc_resetstates(); - mqc_setstate(18, 0, 46); - mqc_setstate(0, 0, 3); - mqc_setstate(1, 0, 4); -} - -/* */ -/* mode switch RESTART (TERMALL) */ -/* */ -int mqc_restart_enc() -{ - int correction = 1; - - /* */ - int n = 27 - 15 - mqc_ct; - mqc_c <<= mqc_ct; - while (n > 0) { - mqc_byteout(); - n -= mqc_ct; - mqc_c <<= mqc_ct; - } - mqc_byteout(); - - return correction; -} - -/* */ -/* mode switch RESTART (TERMALL) reinitialisation */ -/* */ -void mqc_restart_init_enc() -{ - /* */ - mqc_setcurctx(0); - mqc_a = 0x8000; - mqc_c = 0; - mqc_ct = 12; - mqc_bp--; - if (*mqc_bp == 0xff) { - mqc_ct = 13; - } -} - - -/* */ -/* ERTERM mode switch */ -/* */ -void mqc_erterm_enc() -{ - int k = 11 - mqc_ct + 1; - - while (k > 0) { - mqc_c <<= mqc_ct; - mqc_ct = 0; - mqc_byteout(); - k -= mqc_ct; - } - - if (*mqc_bp != 0xff) { - mqc_byteout(); - } -} - -/* */ -/* SEGMARK mode switch (SEGSYM) */ -/* */ -void mqc_segmark_enc() -{ - int i; - mqc_setcurctx(18); - - for (i = 1; i < 5; i++) { - mqc_encode(i % 2); - } -} - -/* */ -/* */ -int mqc_mpsexchange() -{ - int d; - if (mqc_a < (*mqc_curctx)->qeval) { - d = 1 - (*mqc_curctx)->mps; - *mqc_curctx = (*mqc_curctx)->nlps; - } else { - d = (*mqc_curctx)->mps; - *mqc_curctx = (*mqc_curctx)->nmps; - } - return d; -} - -/* */ -/* */ -int mqc_lpsexchange() -{ - int d; - if (mqc_a < (*mqc_curctx)->qeval) { - mqc_a = (*mqc_curctx)->qeval; - d = (*mqc_curctx)->mps; - *mqc_curctx = (*mqc_curctx)->nmps; - } else { - mqc_a = (*mqc_curctx)->qeval; - d = 1 - (*mqc_curctx)->mps; - *mqc_curctx = (*mqc_curctx)->nlps; - } - return d; -} - -/* */ -/* Input a byte. */ -/* */ -void mqc_bytein() -{ - if (mqc_bp != mqc_end) { - unsigned int c; - if (mqc_bp + 1 != mqc_end) { - c = *(mqc_bp + 1); - } else { - c = 0xff; - } - if (*mqc_bp == 0xff) { - if (c > 0x8f) { - mqc_c += 0xff00; - mqc_ct = 8; - } else { - mqc_bp++; - mqc_c += c << 9; - mqc_ct = 7; - } - } else { - mqc_bp++; - mqc_c += c << 8; - mqc_ct = 8; - } - } else { - mqc_c += 0xff00; - mqc_ct = 8; - } -} - -/* */ -/* Renormalize mqc_a and mqc_c while decoding. */ -/* */ -void mqc_renormd() -{ - do { - if (mqc_ct == 0) { - mqc_bytein(); - } - mqc_a <<= 1; - mqc_c <<= 1; - mqc_ct--; - } while (mqc_a < 0x8000); -} - -/* */ -/* Initialize decoder. */ -/* */ -void mqc_init_dec(unsigned char *bp, int len) -{ - mqc_setcurctx(0); - mqc_start = bp; - mqc_end = bp + len; - mqc_bp = bp; - /*add antonin initbug1*/ - if (len==0) mqc_c = 0xff << 16; - else mqc_c = *mqc_bp << 16; - /*dda*/ - mqc_bytein(); - mqc_c <<= 7; - mqc_ct -= 7; - mqc_a = 0x8000; -} - -/* */ -/* Decode a symbol. */ -/* */ -int mqc_decode() -{ - int d; - mqc_a -= (*mqc_curctx)->qeval; - if ((mqc_c >> 16) < (*mqc_curctx)->qeval) { - d = mqc_lpsexchange(); - mqc_renormd(); - } else { - mqc_c -= (*mqc_curctx)->qeval << 16; - if ((mqc_a & 0x8000) == 0) { - d = mqc_mpsexchange(); - mqc_renormd(); - } else { - d = (*mqc_curctx)->mps; - } - } - return d; -} - -/* */ -/* Reset states of all contexts. */ -/* */ -void mqc_resetstates() -{ - int i; - for (i = 0; i < MQC_NUMCTXS; i++) { - mqc_ctxs[i] = mqc_states; - } -} - -/* */ -/* Set the state for a context. */ -/* */ -/* Context number */ -/* Most significant bit */ -/* Index to the probability of symbols */ -void mqc_setstate(int ctxno, int msb, int prob) -{ - mqc_ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; -} diff --git a/mj2/libopenjpeg_097/mqc.h b/mj2/libopenjpeg_097/mqc.h deleted file mode 100644 index f6d93a62..00000000 --- a/mj2/libopenjpeg_097/mqc.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MQC_H -#define __MQC_H - -/* - * Return the number of bytes written/read since initialisation - */ -int mqc_numbytes(); - -/* - * Reset the states of all the context of the coder/decoder - * (each context is set to a state where 0 and 1 are more or less equiprobable) - */ -void mqc_resetstates(); - -/* - * Set the state of a particular context - * ctxno: number that identifies the context - * msb: the MSB of the new state of the context - * prob: number that identifies the probability of the symbols for the new state of the context - */ -void mqc_setstate(int ctxno, int msb, int prob); - -/* - * Initialize the encoder - * bp: pointer to the start of the buffer where the bytes will be written - */ -void mqc_init_enc(unsigned char *bp); - -/* - * Set the current context used for coding/decoding - * ctxno: number that identifies the context - */ -void mqc_setcurctx(int ctxno); - -/* - * Encode a bit - * d: bit to encode (0 or 1) - */ -void mqc_encode(int d); - -/* - * Flush the encoder, so that all remaining data is written - */ -void mqc_flush(); - -/* - * BYPASS mode switch - */ -void mqc_bypass_init_enc(); - -/* - * BYPASS mode switch - */ -void mqc_bypass_enc(int d); - -/* - * BYPASS mode switch - */ -int mqc_bypass_flush_enc(); - -/* - * RESET mode switch - */ -void mqc_reset_enc(); - -/* - * RESTART mode switch (TERMALL) - */ -int mqc_restart_enc(); - -/* - * RESTART mode switch (TERMALL) - */ -void mqc_restart_init_enc(); - -/* - * ERTERM mode switch (PTERM) - */ -void mqc_erterm_enc(); - -/* - * SEGMARK mode switch (SEGSYM) - */ -void mqc_segmark_enc(); - - -/* - * Initialize the decoder - * bp: pointer to the start of the buffer from which the bytes will be read - * len: length of the input buffer - */ -void mqc_init_dec(unsigned char *bp, int len); - -/* - * Decode a bit (returns 0 or 1) - */ -int mqc_decode(); - -#endif diff --git a/mj2/libopenjpeg_097/openjpeg.h b/mj2/libopenjpeg_097/openjpeg.h deleted file mode 100644 index 34566037..00000000 --- a/mj2/libopenjpeg_097/openjpeg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2003, Yannick Verschueren - * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __OPENJPEG_H -#define __OPENJPEG_H - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/mj2/libopenjpeg_097/pi.c b/mj2/libopenjpeg_097/pi.c deleted file mode 100644 index dcb05493..00000000 --- a/mj2/libopenjpeg_097/pi.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2003-2004, Yannick Verschueren - * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "pi.h" -#include "int.h" -#include -#include - -/* - * Create a packet iterator. - * */ -pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno) -{ - int p, q, i; - int compno, resno, pino; - int maxres = 0; - pi_iterator_t *pi; - j2k_tcp_t *tcp; - j2k_tccp_t *tccp; - - tcp = &cp->tcps[tileno]; - pi = (pi_iterator_t *) malloc((tcp->numpocs + 1) * - sizeof(pi_iterator_t)); - - for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, img->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, img->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - pi[pino].numcomps = img->numcomps; - pi[pino].comps = - (pi_comp_t *) malloc(img->numcomps * sizeof(pi_comp_t)); - - for (compno = 0; compno < pi->numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = img->comps[compno].dx; - comp->dy = img->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - comp->resolutions = - (pi_resolution_t *) malloc(comp->numresolutions * - sizeof(pi_resolution_t)); - tcx0 = int_ceildiv(pi->tx0, comp->dx); - tcy0 = int_ceildiv(pi->ty0, comp->dy); - tcx1 = int_ceildiv(pi->tx1, comp->dx); - tcy1 = int_ceildiv(pi->ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); /*Mod Antonin : sizebug1*/ - res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); /*Mod Antonin : sizebug1*/ - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = 100 * pi[pino].step_p; - pi[pino].step_r = img->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - if (pino == 0) { - pi[pino].include = - (short int *) malloc(img->numcomps * maxres * - tcp->numlayers * 100 * sizeof(short int)); - for (i = 0; i < img->numcomps * maxres * tcp->numlayers * 100; i++) - pi[pino].include[i] = 0; - } - /* pi[pino].include=(short int*)calloc(img->numcomps*maxres*tcp->numlayers*1000,sizeof(short int)); */ - else - pi[pino].include = pi[pino - 1].include; - - if (tcp->POC == 0) { - pi[pino].first = 1; - pi[pino].poc.resno0 = 0; - pi[pino].poc.compno0 = 0; - pi[pino].poc.layno1 = tcp->numlayers; - pi[pino].poc.resno1 = maxres; - pi[pino].poc.compno1 = img->numcomps; - pi[pino].poc.prg = tcp->prg; - } else { - pi[pino].first = 1; - pi[pino].poc.resno0 = tcp->pocs[pino].resno0; - pi[pino].poc.compno0 = tcp->pocs[pino].compno0; - pi[pino].poc.layno1 = tcp->pocs[pino].layno1; - pi[pino].poc.resno1 = tcp->pocs[pino].resno1; - pi[pino].poc.compno1 = tcp->pocs[pino].compno1; - pi[pino].poc.prg = tcp->pocs[pino].prg; - } - } - return pi; -} - -/* - * Get next packet in layer-resolution-component-precinct order. - * - * pi: packet iterator to modify - * */ -int pi_next_lrcp(pi_iterator_t * pi) -{ - pi_comp_t *comp; - pi_resolution_t *res; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto skip; - } else { - pi->first = 0; - } - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; - pi->resno++) { - for (pi->compno = pi->poc.compno0; - pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) { - if (!pi-> - include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + pi->precno * pi->step_p]) { - pi->include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p] = 1; - return 1; - } - skip:; - } - } - } - } - return 0; -} - -/* - * Get next packet in resolution-layer-component-precinct order. - * - * pi: packet iterator to modify - * */ -int pi_next_rlcp(pi_iterator_t * pi) -{ - pi_comp_t *comp; - pi_resolution_t *res; - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto skip; - } else { - pi->first = 0; - } - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->compno = pi->poc.compno0; - pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) { - if (!pi-> - include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + pi->precno * pi->step_p]) { - pi->include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p] = 1; - return 1; - } - skip:; - } - } - } - } - return 0; -} - -/* - * Get next packet in resolution-precinct-component-layer order. - * - * pi: packet iterator to modify - * */ -int pi_next_rpcl(pi_iterator_t * pi) -{ - pi_comp_t *comp; - pi_resolution_t *res; - if (!pi->first) { - goto skip; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * - (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * - (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->y = pi->ty0; pi->y < pi->ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; - pi->compno < pi->poc.compno1; pi->compno++) { - int levelno; - int trx0, try0; - int trx1, try1;/* Add antonin pcrl*/ - int rpx, rpy; - int prci, prcj; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/ - try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/ - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (! - (pi->x % (comp->dx << rpx) == 0 - || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { - continue; - } - if (! - (pi->y % (comp->dy << rpy) == 0 - || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { - continue; - } - - /*Add Antonin : sizebug1*/ - if ((res->pw==0)||(res->pw==0)) continue; - /*ddA*/ - - /*Add Antonin : pcrl*/ - if ((trx0==trx1)||(try0==try1)) continue; - /*ddA*/ - - prci = - int_floordivpow2(int_ceildiv - (pi->x, comp->dx << levelno), - res->pdx) - int_floordivpow2(trx0, res->pdx); - prcj = - int_floordivpow2(int_ceildiv - (pi->y, comp->dy << levelno), - res->pdy) - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - if (!pi-> - include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p]) { - pi->include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p] = 1; - return 1; - } - skip:; - } - } - } - } - } - return 0; -} - -/* - * Get next packet in precinct-component-resolution-layer order. - * - * pi: packet iterator to modify - * */ -int pi_next_pcrl(pi_iterator_t * pi) -{ - pi_comp_t *comp; - pi_resolution_t *res; - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto skip; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * - (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * - (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - for (pi->y = pi->ty0; pi->y < pi->ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; - pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, - comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1;/* Add antonin pcrl*/ - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/ - try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/ - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (! - (pi->x % (comp->dx << rpx) == 0 - || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { - continue; - } - if (! - (pi->y % (comp->dy << rpy) == 0 - || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { - continue; - } - - /*Add Antonin : sizebug1*/ - if ((res->pw==0)||(res->pw==0)) continue; - /*ddA*/ - - /*Add Antonin : pcrl*/ - if ((trx0==trx1)||(try0==try1)) continue; - /*ddA*/ - - prci = - int_floordivpow2(int_ceildiv - (pi->x, comp->dx << levelno), - res->pdx) - int_floordivpow2(trx0, res->pdx); - prcj = - int_floordivpow2(int_ceildiv - (pi->y, comp->dy << levelno), - res->pdy) - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - if (!pi-> - include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p]) { - pi->include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p] = 1; - return 1; - } -skip:; - } - } - } - } - } - return 0; -} - -/* - * Get next packet in component-precinct-resolution-layer order. - * - * pi: packet iterator to modify - * */ -int pi_next_cprl(pi_iterator_t * pi) -{ - pi_comp_t *comp; - pi_resolution_t *res; - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto skip; - } else { - pi->first = 0; - } - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; - pi->compno++) { - int resno; - comp = &pi->comps[pi->compno]; - pi->dx = 0; - pi->dy = 0; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - for (pi->y = pi->ty0; pi->y < pi->ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, - comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1;/* Add antonin pcrl*/ - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/ - try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/ - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (! - (pi->x % (comp->dx << rpx) == 0 - || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { - continue; - } - if (! - (pi->y % (comp->dy << rpy) == 0 - || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { - continue; - } - - /*Add Antonin : sizebug1*/ - if ((res->pw==0)||(res->pw==0)) continue; - /*ddA*/ - - /*Add Antonin : pcrl*/ - if ((trx0==trx1)||(try0==try1)) continue; - /*ddA*/ - - prci = - int_floordivpow2(int_ceildiv - (pi->x, comp->dx << levelno), - res->pdx) - int_floordivpow2(trx0, res->pdx); - prcj = - int_floordivpow2(int_ceildiv - (pi->y, comp->dy << levelno), - res->pdy) - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - if (!pi-> - include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p]) { - pi->include[pi->layno * pi->step_l + - pi->resno * pi->step_r + - pi->compno * pi->step_c + - pi->precno * pi->step_p] = 1; - return 1; - } - skip:; - } - } - } - } - } - return 0; -} - -/* - * Get next packet. - * - * pi: packet iterator to modify - * */ -int pi_next(pi_iterator_t * pi) -{ - switch (pi->poc.prg) { - case 0: - return pi_next_lrcp(pi); - case 1: - return pi_next_rlcp(pi); - case 2: - return pi_next_rpcl(pi); - case 3: - return pi_next_pcrl(pi); - case 4: - return pi_next_cprl(pi); - } - return 0; -} diff --git a/mj2/libopenjpeg_097/pi.h b/mj2/libopenjpeg_097/pi.h deleted file mode 100644 index 88aed2be..00000000 --- a/mj2/libopenjpeg_097/pi.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __PI_H -#define __PI_H - -#include "j2k.h" -#include "tcd.h" - -typedef struct { - int pdx, pdy; - int pw, ph; -} pi_resolution_t; - -typedef struct { - int dx, dy; - int numresolutions; - pi_resolution_t *resolutions; -} pi_comp_t; - -typedef struct { - short int *include; /* precise if the packet has been already used (usefull for progression order change) */ - int step_l, step_r, step_c, step_p; /* different steps (layer, resolution, component, precinct) to localize the packet in the include vector */ - int compno, resno, precno, layno; /* component, resolution, precinct and layer that indentify the packet */ - int first; /* 0 if the first packet */ - j2k_poc_t poc; - int numcomps; - pi_comp_t *comps; - int tx0, ty0, tx1, ty1; - int x, y, dx, dy; -} pi_iterator_t; /* packet iterator */ - -/* - * Create a packet iterator - * img: raw image for which the packets will be listed - * cp: coding paremeters - * tileno: number that identifies the tile for which to list the packets - * return value: returns a packet iterator that points to the first packet of the tile - */ -pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno); - -/* - * Modify the packet iterator to point to the next packet - * pi: packet iterator to modify - * return value: returns 0 if pi pointed to the last packet or else returns 1 - */ -int pi_next(pi_iterator_t * pi); - -#endif diff --git a/mj2/libopenjpeg_097/raw.c b/mj2/libopenjpeg_097/raw.c deleted file mode 100644 index 606ca206..00000000 --- a/mj2/libopenjpeg_097/raw.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2002-2003, Antonin Descampe - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "raw.h" - - -unsigned char raw_c; /* temporary buffer where bits are coded or decoded */ -unsigned int raw_ct; /* number of bits already read or free to write */ -unsigned int raw_lenmax; /* maximum length to decode */ -unsigned int raw_len; /* length decoded */ -unsigned char *raw_bp; /* pointer to the current position in the buffer */ -unsigned char *raw_start; /* pointer to the start of the buffer */ -unsigned char *raw_end; /* pointer to the end of the buffer */ - -/* - * Return the number of bytes already encoded. - */ -int raw_numbytes() -{ - return raw_bp - raw_start; -} - -/* - * Initialize raw-decoder. - * - * bp : pointer to the start of the buffer from which the bytes will be read - * len : length of the input buffer - */ -void raw_init_dec(unsigned char *bp, int len) -{ - raw_start = bp; - raw_lenmax = len; - raw_len = 0; - raw_c = 0; - raw_ct = 0; -} - -/* - * Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN - */ -int raw_decode() -{ - int d; - if (raw_ct == 0) { - raw_ct = 8; - if (raw_len == raw_lenmax) - raw_c = 0xff; - else { - if (raw_c == 0xff) - raw_ct = 7; - raw_c = *(raw_start + raw_len); - raw_len++; - } - } - raw_ct--; - d = (raw_c >> raw_ct) & 0x01; - return d; -} diff --git a/mj2/libopenjpeg_097/raw.h b/mj2/libopenjpeg_097/raw.h deleted file mode 100644 index 4b3ea795..00000000 --- a/mj2/libopenjpeg_097/raw.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2002-2003, Antonin Descampe - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __RAW_H -#define __RAW_H - -/* - * Return the number of bytes written/read since initialisation - */ -int raw_numbytes(); - -/* - * Initialize the decoder - * bp: pointer to the start of the buffer from which the bytes will be read - * len: length of the input buffer - */ -void raw_init_dec(unsigned char *bp, int len); - -/* - * Decode a bit (returns 0 or 1) - */ -int raw_decode(); - -#endif diff --git a/mj2/libopenjpeg_097/t1.c b/mj2/libopenjpeg_097/t1.c deleted file mode 100644 index ddac016d..00000000 --- a/mj2/libopenjpeg_097/t1.c +++ /dev/null @@ -1,1117 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "t1.h" -#include "j2k.h" -#include "mqc.h" -#include "raw.h" /* Antonin */ -#include "int.h" -#include "mct.h" -#include "dwt.h" -#include "fix.h" -#include -#include -#include - -#define T1_MAXCBLKW 1024 -#define T1_MAXCBLKH 1024 - -#define T1_SIG_NE 0x0001 -#define T1_SIG_SE 0x0002 -#define T1_SIG_SW 0x0004 -#define T1_SIG_NW 0x0008 -#define T1_SIG_N 0x0010 -#define T1_SIG_E 0x0020 -#define T1_SIG_S 0x0040 -#define T1_SIG_W 0x0080 -#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) -#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) - -#define T1_SGN_N 0x0100 -#define T1_SGN_E 0x0200 -#define T1_SGN_S 0x0400 -#define T1_SGN_W 0x0800 -#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) - -#define T1_SIG 0x1000 -#define T1_REFINE 0x2000 -#define T1_VISIT 0x4000 - -#define T1_NUMCTXS_AGG 1 -#define T1_NUMCTXS_ZC 9 -#define T1_NUMCTXS_MAG 3 -#define T1_NUMCTXS_SC 5 -#define T1_NUMCTXS_UNI 1 - -#define T1_CTXNO_AGG 0 -#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG) -#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC) -#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG) -#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC) -#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) - -#define T1_NMSEDEC_BITS 7 -#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) - -/* add TONY */ -#define T1_TYPE_MQ 0 -#define T1_TYPE_RAW 1 -/* dda */ - -static int t1_lut_ctxno_zc[1024]; -static int t1_lut_ctxno_sc[256]; -static int t1_lut_ctxno_mag[4096]; -static int t1_lut_spb[256]; -static int t1_lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; -static int t1_lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; -static int t1_lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; -static int t1_lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; - -static int t1_data[T1_MAXCBLKH][T1_MAXCBLKW]; -static int t1_flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2]; - -int t1_getctxno_zc(int f, int orient) -{ - return t1_lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; -} - -int t1_getctxno_sc(int f) -{ - return t1_lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -int t1_getctxno_mag(int f) -{ - return t1_lut_ctxno_mag[(f & T1_SIG_OTH) | - (((f & T1_REFINE) != 0) << 11)]; -} - -int t1_getspb(int f) -{ - return t1_lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -int t1_getnmsedec_sig(int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) - return t1_lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & - ((1 << T1_NMSEDEC_BITS) - 1)]; - else - return t1_lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -int t1_getnmsedec_ref(int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) - return t1_lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & - ((1 << T1_NMSEDEC_BITS) - 1)]; - else - return t1_lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -void t1_updateflags(int *fp, int s) -{ - int *np = fp - (T1_MAXCBLKW + 2); - int *sp = fp + (T1_MAXCBLKW + 2); - np[-1] |= T1_SIG_SE; - np[1] |= T1_SIG_SW; - sp[-1] |= T1_SIG_NE; - sp[1] |= T1_SIG_NW; - *np |= T1_SIG_S; - *sp |= T1_SIG_N; - fp[-1] |= T1_SIG_E; - fp[1] |= T1_SIG_W; - if (s) { - *np |= T1_SGN_S; - *sp |= T1_SGN_N; - fp[-1] |= T1_SGN_E; - fp[1] |= T1_SGN_W; - } -} - -void t1_enc_sigpass_step(int *fp, int *dp, int orient, int bpno, int one, - int *nmsedec, char type, int vsc) -{ - int v, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(t1_getctxno_zc(flag, orient)); /* ESSAI */ - mqc_bypass_enc(v); - } else { - mqc_setcurctx(t1_getctxno_zc(flag, orient)); - mqc_encode(v); - } - if (v) { - v = *dp < 0 ? 1 : 0; - *nmsedec += - t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(t1_getctxno_sc(flag)); /* ESSAI */ - mqc_bypass_enc(v); - } else { - mqc_setcurctx(t1_getctxno_sc(flag)); - mqc_encode(v ^ t1_getspb(flag)); - } - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - *fp |= T1_VISIT; - } -} - - - -void t1_dec_sigpass_step(int *fp, int *dp, int orient, int oneplushalf, - char type, int vsc) -{ - int v, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - if (type == T1_TYPE_RAW) { - if (raw_decode()) { - v = raw_decode(); /* ESSAI */ - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } else { - mqc_setcurctx(t1_getctxno_zc(flag, orient)); - if (mqc_decode()) { - mqc_setcurctx(t1_getctxno_sc(flag)); - v = mqc_decode() ^ t1_getspb(flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -void t1_enc_sigpass(int w, int h, int bpno, int orient, int *nmsedec, - char type, int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_sigpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], orient, bpno, one, - nmsedec, type, vsc); - } - } - } -} - -void t1_dec_sigpass(int w, int h, int bpno, int orient, char type, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_sigpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], - - orient, - - oneplushalf, - type, vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -void t1_enc_refpass_step(int *fp, int *dp, int bpno, int one, int *nmsedec, - char type, int vsc) -{ - int v, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - *nmsedec += - t1_getnmsedec_ref(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(t1_getctxno_mag(flag)); /* ESSAI */ - mqc_bypass_enc(v); - } else { - mqc_setcurctx(t1_getctxno_mag(flag)); - mqc_encode(v); - } - *fp |= T1_REFINE; - } -} - - - -void t1_dec_refpass_step(int *fp, int *dp, int poshalf, int neghalf, - char type, int vsc) -{ - int v, t, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - if (type == T1_TYPE_RAW) { - mqc_setcurctx(t1_getctxno_mag(flag)); /* ESSAI */ - v = raw_decode(); - } else { - mqc_setcurctx(t1_getctxno_mag(flag)); - v = mqc_decode(); - } - t = v ? poshalf : neghalf; - *dp += *dp < 0 ? -t : t; - *fp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -void t1_enc_refpass(int w, int h, int bpno, int *nmsedec, char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_refpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], bpno, one, nmsedec, type, vsc); - } - } - } -} - -void t1_dec_refpass(int w, int h, int bpno, char type, int cblksty) -{ - int i, j, k, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_refpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], - - poshalf, - - neghalf, - - type, vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -void t1_enc_clnpass_step(int *fp, int *dp, int orient, int bpno, int one, - int *nmsedec, int partial, int vsc) -{ - int v, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if (partial) - goto label_partial; - if (!(*fp & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(t1_getctxno_zc(flag, orient)); - v = int_abs(*dp) & one ? 1 : 0; - mqc_encode(v); - if (v) { - label_partial: - *nmsedec += - t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(t1_getctxno_sc(flag)); - v = *dp < 0 ? 1 : 0; - mqc_encode(v ^ t1_getspb(flag)); - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp &= ~T1_VISIT; -} - - - - -void t1_dec_clnpass_step(int *fp, int *dp, int orient, int oneplushalf, - int partial, int vsc) -{ - int v, flag; - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) - : (*fp); - if (partial) - goto label_partial; - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(t1_getctxno_zc(flag, orient)); - if (mqc_decode()) { - label_partial: - mqc_setcurctx(t1_getctxno_sc(flag)); - v = mqc_decode() ^ t1_getspb(flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -void t1_enc_clnpass(int w, int h, int bpno, int orient, int *nmsedec, - int cblksty) -{ - int i, j, k, one, agg, runlen, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1_flags[1 + k + 1][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 2][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || (t1_flags[1 + k + 3][1 + i] & - (~ - (T1_SIG_S | T1_SIG_SE | T1_SIG_SW | - T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1_flags[1 + k + 1][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 2][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 3][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; runlen++) { - if (int_abs(t1_data[k + runlen][i]) & one) - break; - } - mqc_setcurctx(T1_CTXNO_AGG); - mqc_encode(runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(T1_CTXNO_UNI); - mqc_encode(runlen >> 1); - mqc_encode(runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_clnpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], orient, bpno, one, - nmsedec, agg && (j == k + runlen), vsc); - } - } - } -} - -void t1_dec_clnpass(int w, int h, int bpno, int orient, int cblksty) -{ - int i, j, k, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1_flags[1 + k + 1][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 2][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || (t1_flags[1 + k + 3][1 + i] & - (~ - (T1_SIG_S | T1_SIG_SE | T1_SIG_SW | - T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1_flags[1 + k + 1][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 2][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH) - || t1_flags[1 + k + 3][1 + - i] & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(T1_CTXNO_AGG); - if (!mqc_decode()) { - continue; - } - mqc_setcurctx(T1_CTXNO_UNI); - runlen = mqc_decode(); - runlen = (runlen << 1) | mqc_decode(); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) - && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_clnpass_step(&t1_flags[1 + j][1 + i], - &t1_data[j][i], - - orient, - - oneplushalf, - agg && (j == k + runlen), vsc); - } - } - } - if (segsym) { - int v = 0; - mqc_setcurctx(T1_CTXNO_UNI); - v = mqc_decode(); - v = (v << 1) | mqc_decode(); - v = (v << 1) | mqc_decode(); - v = (v << 1) | mqc_decode(); - /* if (v!=0xa) - { - fprintf(stderr, "warning: bad segmentation symbol %x\n",v); - } */ - } -} /* VSC and BYPASS by Antonin */ - -double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, float stepsize, int numcomps) /*mod fixed_quality*/ -{ - double w1, w2, wmsedec; - if (qmfbid == 1) { - w1 = (numcomps > 1) ? mct_getnorm(compno) : 1; - w2 = dwt_getnorm(level, orient); - } else { /* if (qmfbid == 0) */ - w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1; - w2 = dwt_getnorm_real(level, orient); - } - wmsedec = w1 * w2 * (stepsize / 8192.0) * (1 << bpno); - wmsedec *= wmsedec * nmsedec / 8192.0; - return wmsedec; -} - -void t1_encode_cblk(tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, float stepsize, int cblksty, int numcomps, tcd_tile_t * tile) /*mod fixed_quality*/ -{ - int i, j; - int w, h; - int passno; - int bpno, passtype; - int max; - int nmsedec; - double cumwmsedec = 0; - char type = T1_TYPE_MQ; - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - - max = 0; - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++) { - max = int_max(max, int_abs(t1_data[j][i])); - } - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - /* Changed by Dmitry Kolyadin */ - for (i = 0; i <= w; i++) - for (j = 0; j <= h; j++){ - t1_flags[j][i] = 0; - } - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(); - mqc_setstate(T1_CTXNO_UNI, 0, 46); - mqc_setstate(T1_CTXNO_AGG, 0, 3); - mqc_setstate(T1_CTXNO_ZC, 0, 4); - mqc_init_enc(cblk->data); - - for (passno = 0; bpno >= 0; passno++) { - tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) - && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : - T1_TYPE_MQ; - - switch (passtype) { - case 0: - t1_enc_sigpass(w, h, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_enc_refpass(w, h, bpno, &nmsedec, type, cblksty); - break; - case 2: - t1_enc_clnpass(w, h, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) - mqc_segmark_enc(); - break; - } - - cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps); /*mod fixed_quality*/ - tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps); /*add antonin quality*/ - - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) - && !((passtype == 2) && (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) - && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) - && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : - T1_TYPE_MQ; - if (type == T1_TYPE_RAW) - mqc_bypass_init_enc(); - else - mqc_restart_init_enc(); - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes() + correction; /* FIXME */ - pass->len = - pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - - /* Code-switch "RESET" */ - if (cblksty & J2K_CCP_CBLKSTY_RESET) - mqc_reset_enc(); - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J2K_CCP_CBLKSTY_PTERM) - mqc_erterm_enc(); - else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) - mqc_flush(); - - cblk->totalpasses = passno; -} - -void t1_decode_cblk(tcd_cblk_t * cblk, int orient, int roishift, - int cblksty) -{ - int i, j, w, h; - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /*BYPASS mode*/ - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - - /* Changed by Dmitry Kolyadin */ - for (j = 0; j <= h; j++){ - for (i = 0; i <= w; i++) { - t1_flags[j][i] = 0; - } - } - - /* Changed by Dmitry Kolyadin */ - for (i = 0; i < w; i++) { - for (j = 0; j < h; j++){ - t1_data[j][i] = 0; - } - } - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(); - mqc_setstate(T1_CTXNO_UNI, 0, 46); - mqc_setstate(T1_CTXNO_AGG, 0, 3); - mqc_setstate(T1_CTXNO_ZC, 0, 4); - - for (segno = 0; segno < cblk->numsegs; segno++) { - tcd_seg_t *seg = &cblk->segs[segno]; - - /* Add BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) - && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : - T1_TYPE_MQ; - if (type == T1_TYPE_RAW) - raw_init_dec(seg->data, seg->len); - else - mqc_init_dec(seg->data, seg->len); - /* ddA */ - - for (passno = 0; passno < seg->numpasses; passno++) { - switch (passtype) { - case 0: - t1_dec_sigpass(w, h, bpno+1, orient, type, cblksty); - break; - case 1: - t1_dec_refpass(w, h, bpno+1, type, cblksty); - break; - case 2: - t1_dec_clnpass(w, h, bpno+1, orient, cblksty); - break; - } - - if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_resetstates(); - - mqc_setstate(T1_CTXNO_UNI, 0, 46); - - mqc_setstate(T1_CTXNO_AGG, 0, 3); - - mqc_setstate(T1_CTXNO_ZC, 0, 4); - - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - } - } -} - -void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp) -{ - int compno, resno, bandno, precno, cblkno; - int x, y, i, j, orient; - tcd_tilecomp_t *tilec; - tcd_resolution_t *res; - tcd_band_t *band; - tcd_precinct_t *prc; - tcd_cblk_t *cblk; - - tile->distotile = 0; /*add fixed_quality*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - cblk = &prc->cblks[cblkno]; - - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - } else if (band->bandno == 1) { - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - } else if (band->bandno == 2) { - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - } else { /* if (band->bandno == 3) */ - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - } - - if (tcp->tccps[compno].qmfbid == 1) { - - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1_data[j][i] = - tilec->data[(x + i) + - (y + j) * (tilec->x1 - - tilec-> - x0)] << T1_NMSEDEC_FRACBITS; - } - } - } else if (tcp->tccps[compno].qmfbid == 0) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1_data[j][i] = - fix_mul(tilec-> - data[x + i + - (y + j) * (tilec->x1 - - tilec-> - x0)], - 8192 * 8192 / - ((int) floor(band->stepsize * 8192))) >> (13 - T1_NMSEDEC_FRACBITS); - } - } - } - orient = band->bandno; /* FIXME */ - if (orient == 2) { - orient = 1; - } else if (orient == 1) { - orient = 2; - } - t1_encode_cblk(cblk, orient, compno, tilec->numresolutions - 1 - resno, tcp->tccps[compno].qmfbid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile); /*mod fixed_quality*/ - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compo */ -} - - -void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp) -{ - int compno, resno, bandno, precno, cblkno; - - for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int x, y, i, j, orient; - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - orient = band->bandno; /* FIXME */ - if (orient == 2) - orient = 1; - else if (orient == 1) - orient = 2; - t1_decode_cblk(cblk, orient, - tcp->tccps[compno].roishift, - tcp->tccps[compno].cblksty); - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - } else if (band->bandno == 1) { - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - } else if (band->bandno == 2) { - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - } else { /* if (band->bandno == 3) */ - tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - } - - if (tcp->tccps[compno].roishift) { - int thresh, val, mag; - thresh = 1 << tcp->tccps[compno].roishift; - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - val = t1_data[j][i]; - mag = int_abs(val); - if (mag >= thresh) { - mag >>= tcp->tccps[compno].roishift; - t1_data[j][i] = val < 0 ? -mag : mag; - } - } - } - } - - if (tcp->tccps[compno].qmfbid == 1) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - int tmp=t1_data[j][i]; - if (tmp>>1==0) tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0; - else tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = tmp<0?(tmp>>1)+1:(tmp>>1); - } - } - } else { /* if (tcp->tccps[compno].qmfbid == 0) */ - - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - double tmp=t1_data[j][i] * band->stepsize * 4096.0; - int tmp2; - if (t1_data[j][i]>>1 == 0) { - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0; - } else { - tmp2=((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2); - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = ((tmp<0)?-tmp2:tmp2); - } - } - } - } - } - } - } - } - } -} - -int t1_init_ctxno_zc(int f, int orient) -{ - int h, v, d, n, t, hv; - n = 0; - h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0); - v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0); - d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != - 0) + ((f & T1_SIG_SE) != - 0) + ((f & T1_SIG_SW) != 0); - switch (orient) { - case 2: - t = h; - h = v; - v = t; - case 0: - case 1: - if (!h) { - if (!v) { - if (!d) - n = 0; - else if (d == 1) - n = 1; - else - n = 2; - } else if (v == 1) - n = 3; - else - n = 4; - } else if (h == 1) { - if (!v) { - if (!d) - n = 5; - else - n = 6; - } else - n = 7; - } else - n = 8; - break; - case 3: - hv = h + v; - if (!d) { - if (!hv) - n = 0; - else if (hv == 1) - n = 1; - else - n = 2; - } else if (d == 1) { - if (!hv) - n = 3; - else if (hv == 1) - n = 4; - else - n = 5; - } else if (d == 2) { - if (!hv) - n = 6; - else - n = 7; - } else - n = 8; - break; - } - return T1_CTXNO_ZC + n; -} - -int t1_init_ctxno_sc(int f) -{ - int hc, vc, n; - n = 0; - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - if (hc < 0) { - hc = -hc; - vc = -vc; - } - if (!hc) { - if (vc == -1) - n = 1; - else if (!vc) - n = 0; - else - n = 1; - } else if (hc == 1) { - if (vc == -1) - n = 2; - else if (!vc) - n = 3; - else - n = 4; - } - return T1_CTXNO_SC + n; -} - -int t1_init_ctxno_mag(int f) -{ - int n; - if (!(f & T1_REFINE)) - n = (f & (T1_SIG_OTH)) ? 1 : 0; - else - n = 2; - return T1_CTXNO_MAG + n; -} - -int t1_init_spb(int f) -{ - int hc, vc, n; - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - if (!hc && !vc) - n = 0; - else - n = (!(hc > 0 || (!hc && vc > 0))); - return n; -} - -void t1_init_luts() -{ - int i, j; - double u, v, t; - for (j = 0; j < 4; j++) { - for (i = 0; i < 256; ++i) { - t1_lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j); - } - } - for (i = 0; i < 256; i++) { - t1_lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4); - } - for (j = 0; j < 2; j++) { - for (i = 0; i < 2048; ++i) { - t1_lut_ctxno_mag[(j << 11) + i] = - t1_init_ctxno_mag((j ? T1_REFINE : 0) | i); - } - } - for (i = 0; i < 256; ++i) { - t1_lut_spb[i] = t1_init_spb(i << 4); - } - /* FIXME FIXME FIXME */ - /* fprintf(stdout,"nmsedec luts:\n"); */ - for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) { - t = i / pow(2, T1_NMSEDEC_FRACBITS); - u = t; - v = t - 1.5; - t1_lut_nmsedec_sig[i] = - int_max(0, - (int) (floor - ((u * u - v * v) * pow(2, - T1_NMSEDEC_FRACBITS) + - 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - t1_lut_nmsedec_sig0[i] = - int_max(0, - (int) (floor - ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + - 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - u = t - 1.0; - if (i & (1 << (T1_NMSEDEC_BITS - 1))) { - v = t - 1.5; - } else { - v = t - 0.5; - } - t1_lut_nmsedec_ref[i] = - int_max(0, - (int) (floor - ((u * u - v * v) * pow(2, - T1_NMSEDEC_FRACBITS) + - 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - t1_lut_nmsedec_ref0[i] = - int_max(0, - (int) (floor - ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + - 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - } -} diff --git a/mj2/libopenjpeg_097/t1.h b/mj2/libopenjpeg_097/t1.h deleted file mode 100644 index 86e35e93..00000000 --- a/mj2/libopenjpeg_097/t1.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __T1_H -#define __T1_H - -#include "tcd.h" -#include "j2k.h" - -/* - * Initialize the look-up tables of the Tier-1 coder/decoder - */ -void t1_init_luts(); - -/* - * Encode the code-blocks of a tile - * tile: the tile to encode - * tcp: tile coding parameters - */ -void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp); - -/* - * Decode the code-blocks of a tile - * tile: the tile to encode - * tcp: tile coding parameters - */ -void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp); - -#endif diff --git a/mj2/libopenjpeg_097/t2.c b/mj2/libopenjpeg_097/t2.c deleted file mode 100644 index 7b777620..00000000 --- a/mj2/libopenjpeg_097/t2.c +++ /dev/null @@ -1,707 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2004, Yannick Verschueren - * Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "t2.h" -#include "tcd.h" -#include "bio.h" -#include "j2k.h" -#include "pi.h" -#include "tgt.h" -#include "int.h" -#include "cio.h" -#include -#include -#include -#include - -#define RESTART 0x04 - -extern jmp_buf j2k_error; - -void t2_putcommacode(int n) -{ - while (--n >= 0) { - bio_write(1, 1); - } - bio_write(0, 1); -} - -int t2_getcommacode() -{ - int n; - for (n = 0; bio_read(1); n++) { - } - return n; -} - -/* */ -/* Variable length code for signalling delta Zil (truncation point) */ -/* n : delta Zil */ -/* <\summary> */ -void t2_putnumpasses(int n) -{ - if (n == 1) { - bio_write(0, 1); - } else if (n == 2) { - bio_write(2, 2); - } else if (n <= 5) { - bio_write(0xc | (n - 3), 4); - } else if (n <= 36) { - bio_write(0x1e0 | (n - 6), 9); - } else if (n <= 164) { - bio_write(0xff80 | (n - 37), 16); - } -} - -int t2_getnumpasses() -{ - int n; - if (!bio_read(1)) - return 1; - if (!bio_read(1)) - return 2; - if ((n = bio_read(2)) != 3) - return 3 + n; - if ((n = bio_read(5)) != 31) - return 6 + n; - return 37 + bio_read(7); -} - -/* - * Encode a packet of a tile to a destination buffer - * - * Tile : the tile for which to write the packets - * tcp : the tile coding parameters - * compno : Identity of the packet --> component value - * resno : Identity of the packet --> resolution level value - * precno : Identity of the packet --> precinct value - * layno : Identity of the packet --> quality layer value - * dest : the destination buffer - * len : the length of the destination buffer - * info_IM : structure to create an index file - * tileno : number of the tile encoded -*/ -int t2_encode_packet(tcd_tile_t * tile, j2k_tcp_t * tcp, int compno, - int resno, int precno, int layno, unsigned char *dest, - int len, info_image * info_IM, int tileno) -{ - int bandno, cblkno; - unsigned char *sop = 0, *eph = 0; - tcd_tilecomp_t *tilec = &tile->comps[compno]; - tcd_resolution_t *res = &tilec->resolutions[resno]; - unsigned char *c = dest; - - /* */ - if (tcp->csty & J2K_CP_CSTY_SOP) { - sop = (unsigned char *) malloc(6 * sizeof(unsigned char)); - sop[0] = 255; - sop[1] = 145; - sop[2] = 0; - sop[3] = 4; - sop[4] = (info_IM->num % 65536) / 256; - sop[5] = (info_IM->num % 65536) % 256; - memcpy(c, sop, 6); - free(sop); - c += 6; - } - /* */ - - if (!layno) { - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); - } - } - } - - bio_init_enc(c, len); - bio_write(1, 1); /* Empty header bit */ - - /* Writing Packet header */ - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); - } - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - int increment = 0; - int nump = 0; - int len = 0, passno; - /* cblk inclusion bits */ - if (!cblk->numpasses) { - tgt_encode(prc->incltree, cblkno, layno + 1); - } else { - bio_write(layer->numpasses != 0, 1); - } - /* if cblk not included, go to the next cblk */ - if (!layer->numpasses) { - continue; - } - /* if first instance of cblk --> zero bit-planes information */ - if (!cblk->numpasses) { - cblk->numlenbits = 3; - tgt_encode(prc->imsbtree, cblkno, 999); - } - /* number of coding passes included */ - t2_putnumpasses(layer->numpasses); - - /* computation of the increase of the length indicator and insertion in the header */ - for (passno = cblk->numpasses; - passno < cblk->numpasses + layer->numpasses; passno++) { - tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term - || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = - int_max(increment, - int_floorlog2(len) + 1 - - (cblk->numlenbits + int_floorlog2(nump))); - len = 0; - nump = 0; - } - } - t2_putcommacode(increment); - /* computation of the new Length indicator */ - cblk->numlenbits += increment; - /* insertion of the codeword segment length */ - - for (passno = cblk->numpasses; - passno < cblk->numpasses + layer->numpasses; passno++) { - tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term - || passno == (cblk->numpasses + layer->numpasses) - 1) { - bio_write(len, cblk->numlenbits + int_floorlog2(nump)); - len = 0; - nump = 0; - } - } - } - } - - if (bio_flush()) - return -999; /* modified to eliminate longjmp !! */ - - c += bio_numbytes(); - - /* */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - eph = (unsigned char *) malloc(2 * sizeof(unsigned char)); - eph[0] = 255; - eph[1] = 146; - memcpy(c, eph, 2); - free(eph); - c += 2; - } - /* */ - - /* Writing the packet body */ - - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - if (!layer->numpasses) { - continue; - } - if (c + layer->len > dest + len) { - return -999; - } - - memcpy(c, layer->data, layer->len); - cblk->numpasses += layer->numpasses; - c += layer->len; - /* ADD for index Cfr. Marcela --> delta disto by packet */ - if (info_IM->index_write && info_IM->index_on) { - info_tile *info_TL = &info_IM->tile[tileno]; - info_packet *info_PK = &info_TL->packet[info_IM->num]; - info_PK->disto += layer->disto; - if (info_IM->D_max < info_PK->disto) - info_IM->D_max = info_PK->disto; - } /* */ - } - } - return c - dest; -} - -void t2_init_seg(tcd_seg_t * seg, int cblksty, int first) -{ - seg->numpasses = 0; - seg->len = 0; - if (cblksty & J2K_CCP_CBLKSTY_TERMALL) - seg->maxpasses = 1; - else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { - if (first) - seg->maxpasses = 10; - else - seg->maxpasses = (((seg - 1)->maxpasses == 1) - || ((seg - 1)->maxpasses == 10)) ? 2 : 1; - } else - seg->maxpasses = 109; -} - -/* - * Decode a packet of a tile from a source buffer - * - * src : the source buffer - * len : the length of the source buffer - * tile : the tile for which to write the packets - * cp : the image coding parameters - * tcp : the tile coding parameters - * compno : Identity of the packet --> component value - * resno : Identity of the packet --> resolution level value - * precno : Identity of the packet --> precinct value - * layno : Identity of the packet --> quality layer value - */ -int t2_decode_packet(unsigned char *src, int len, tcd_tile_t * tile, - j2k_cp_t * cp, j2k_tcp_t * tcp, int compno, int resno, - int precno, int layno) -{ - int bandno, cblkno; - tcd_tilecomp_t *tilec = &tile->comps[compno]; - tcd_resolution_t *res = &tilec->resolutions[resno]; - unsigned char *c = src; - - unsigned char *hd = NULL; - int present; - - if (layno == 0) { - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - - - - /*Add Antonin : sizebug1*/ - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - /*ddA*/ - - - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numsegs = 0; - } - } - } - - - - /* SOP markers*/ - - if (tcp->csty & J2K_CP_CSTY_SOP) { - - if ((*c) != 0xff || (*(c + 1) != 0x91)) { - - fprintf(stderr,"Warning : expected SOP marker\n"); - - } else { - - c += 6; - - } - - /*TODO : check the Nsop value*/ - - } - - /* When the marker PPT/PPM is used the packet header are store in PPT/PPM marker - This part deal with this caracteristic - step 1: Read packet header in the saved structure - step 2: Return to codestream for decoding */ - - - if (cp->ppm == 1) { /* PPM */ - hd = cp->ppm_data; - bio_init_dec(hd, cp->ppm_len); /*Mod Antonin : ppmbug1*/ - } else if (tcp->ppt == 1) { /* PPT */ - hd = tcp->ppt_data; - bio_init_dec(hd, tcp->ppt_len); /*Mod Antonin : ppmbug1*/ - } else { /* Normal Case */ - - hd = c; - - bio_init_dec(hd, src+len-hd); - - } - - present = bio_read(1); - - if (!present) { - bio_inalign(); - - hd += bio_numbytes(); - - - - /* EPH markers*/ - - if (tcp->csty & J2K_CP_CSTY_EPH) { - - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - - printf("Error : expected EPH marker\n"); - - } else { - - hd += 2; - - } - - } - - if (cp->ppm == 1) { /* PPM case */ - - cp->ppm_len+=cp->ppm_data-hd; - cp->ppm_data = hd; - return c - src; - } - if (tcp->ppt == 1) { /* PPT case */ - - tcp->ppt_len+=tcp->ppt_data-hd; - tcp->ppt_data = hd; - return c - src; - } - - - return hd - src; - } - - - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - - - - /*Add Antonin : sizebug1*/ - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - /*ddA*/ - - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int included, increment, n; - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_seg_t *seg; - /* if cblk not yet included before --> inclusion tagtree */ - if (!cblk->numsegs) { - included = tgt_decode(prc->incltree, cblkno, layno + 1); - /* else one bit */ - } else { - included = bio_read(1); - } - /* if cblk not included */ - if (!included) { - cblk->numnewpasses = 0; - continue; - } - /* if cblk not yet included --> zero-bitplane tagtree */ - if (!cblk->numsegs) { - int i, numimsbs; - for (i = 0; !tgt_decode(prc->imsbtree, cblkno, i); i++) { - } - numimsbs = i - 1; - cblk->numbps = band->numbps - numimsbs; - cblk->numlenbits = 3; - } - /* number of coding passes */ - cblk->numnewpasses = t2_getnumpasses(); - increment = t2_getcommacode(); - /* length indicator increment */ - cblk->numlenbits += increment; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - t2_init_seg(seg, tcp->tccps[compno].cblksty, 1); - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } - n = cblk->numnewpasses; - - do { - seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n); - seg->newlen = - bio_read(cblk->numlenbits + int_floorlog2(seg->numnewpasses)); - n -= seg->numnewpasses; - if (n > 0) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } while (n > 0); - } - } - if (bio_inalign()) - return -999; - - hd += bio_numbytes(); - - - /* EPH markers*/ - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - fprintf(stderr,"Error : expected EPH marker\n"); - } else { - hd += 2; - - } - } - - - - if (cp->ppm==1) { - - cp->ppm_len+=cp->ppm_data-hd; - - cp->ppm_data = hd; - - } else if (tcp->ppt == 1) { - - tcp->ppt_len+=tcp->ppt_data-hd; - - tcp->ppt_data = hd; - - } else { - - c=hd; - - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - tcd_precinct_t *prc = &band->precincts[precno]; - - - - /*Add Antonin : sizebug1*/ - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - /*ddA*/ - - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_seg_t *seg; - if (!cblk->numnewpasses) - continue; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - - cblk->numsegs++; - cblk->len = 0; - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - seg++; - cblk->numsegs++; - } - } - do { - if (c + seg->newlen > src + len) { - return -999; - } - - memcpy(cblk->data + cblk->len, c, seg->newlen); - if (seg->numpasses == 0) { - seg->data = cblk->data + cblk->len; - } - c += seg->newlen; - cblk->len += seg->newlen; - seg->len += seg->newlen; - seg->numpasses += seg->numnewpasses; - cblk->numnewpasses -= seg->numnewpasses; - if (cblk->numnewpasses > 0) { - seg++; - cblk->numsegs++; - } - } while (cblk->numnewpasses > 0); - } - } - - return c - src; -} - - - -/* - * Encode the packets of a tile to a destination buffer - * - * img : the source image - * cp : the image coding parameters - * tileno : number of the tile encoded - * tile : the tile for which to write the packets - * maxlayers : maximum number of layers - * dest : the destination buffer - * len : the length of the destination buffer - * info_IM : structure to create an index file - */ -int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno, - tcd_tile_t * tile, int maxlayers, - unsigned char *dest, int len, info_image * info_IM) -{ - unsigned char *c = dest; - int e = 0; - pi_iterator_t *pi; - int pino, compno; - - pi = pi_create(img, cp, tileno); - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if (pi[pino].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], - pi[pino].compno, pi[pino].resno, - pi[pino].precno, pi[pino].layno, c, - dest + len - c, info_IM, tileno); - if (e == -999) { - break; - } else - c += e; - /* INDEX >> */ - if (info_IM->index_write && info_IM->index_on) { - info_tile *info_TL = &info_IM->tile[tileno]; - info_packet *info_PK = &info_TL->packet[info_IM->num]; - if (!info_IM->num) { - info_PK->start_pos = info_TL->end_header + 1; - } else { - info_PK->start_pos = - info_TL->packet[info_IM->num - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - - } - /* << INDEX */ - if ((info_IM->index_write - && cp->tcps[tileno].csty & J2K_CP_CSTY_SOP) - || (info_IM->index_write && info_IM->index_on)) { - info_IM->num++; - } - } - - } - - /* FREE space memory taken by pi */ - for (compno = 0; compno < pi[pino].numcomps; compno++) { - free(pi[pino].comps[compno].resolutions); - } - free(pi[pino].comps); - } - free(pi[0].include); - free(pi); - if (e == -999) - return e; - else - return c - dest; -} - - - -/* - * Decode the packets of a tile from a source buffer - * - * src: the source buffer - * len: length of the source buffer - * img: destination image - * cp: image coding parameters - * tileno: number that identifies the tile for which to decode the packets - * tile: tile for which to decode the packets - */ -int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img, - j2k_cp_t * cp, int tileno, tcd_tile_t * tile) -{ - unsigned char *c = src; - pi_iterator_t *pi; - int pino, compno, e = 0; - int n = 0; - - pi = pi_create(img, cp, tileno); - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - - if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { - e = t2_decode_packet(c, src + len - c, tile, cp, - &cp->tcps[tileno], pi[pino].compno, - pi[pino].resno, pi[pino].precno, - pi[pino].layno); - } else { - e = 0; - } - - /* progression in resolution */ - img->comps[pi[pino].compno].resno_decoded = - e > 0 ? int_max(pi[pino].resno, - img->comps[pi[pino].compno]. - resno_decoded) : img->comps[pi[pino]. - compno].resno_decoded; - n++; - - if (e == -999) { /* ADD */ - break; - } else { - c += e; - } - } - - /* FREE space memory taken by pi */ - for (compno = 0; compno < pi[pino].numcomps; compno++) { - free(pi[pino].comps[compno].resolutions); - } - free(pi[pino].comps); - } - free(pi[0].include); - free(pi); - - if (e == -999) - return e; - else - return c - src; -} diff --git a/mj2/libopenjpeg_097/t2.h b/mj2/libopenjpeg_097/t2.h deleted file mode 100644 index 64879af1..00000000 --- a/mj2/libopenjpeg_097/t2.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __T2_H -#define __T2_H - -#include "tcd.h" -#include "j2k.h" - -/* - * Encode the packets of a tile to a destination buffer - * - * img : the source image - * cp : the image coding parameters - * tileno : number of the tile encoded - * tile : the tile for which to write the packets - * maxlayers : maximum number of layers - * dest : the destination buffer - * len : the length of the destination buffer - * info_IM : structure to create an index file - */ -int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno, - tcd_tile_t * tile, int maxlayers, - unsigned char *dest, int len, info_image * info_IM); - -/* - * Decode the packets of a tile from a source buffer - * - * src: the source buffer - * len: length of the source buffer - * img: destination image - * cp: image coding parameters - * tileno: number that identifies the tile for which to decode the packets - * tile: tile for which to decode the packets - */ -int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img, - j2k_cp_t * cp, int tileno, tcd_tile_t * tile); - -#endif diff --git a/mj2/libopenjpeg_097/tcd.c b/mj2/libopenjpeg_097/tcd.c deleted file mode 100644 index 78a9016b..00000000 --- a/mj2/libopenjpeg_097/tcd.c +++ /dev/null @@ -1,1656 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2004, Yannick Verschueren - * Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "tcd.h" -#include "int.h" -#include "t1.h" -#include "t2.h" -#include "dwt.h" -#include "mct.h" -#include -#include -#include -#include -#include -#include -#include - -static tcd_image_t tcd_image; - -static j2k_image_t *tcd_img; -static j2k_cp_t *tcd_cp; - -static tcd_tile_t *tcd_tile; -static j2k_tcp_t *tcd_tcp; -static int tcd_tileno; - -static tcd_tile_t *tile; -static tcd_tilecomp_t *tilec; -static tcd_resolution_t *res; -static tcd_band_t *band; -static tcd_precinct_t *prc; -static tcd_cblk_t *cblk; - -extern jmp_buf j2k_error; - -void tcd_dump(tcd_image_t * img, int curtileno) -{ - int tileno, compno, resno, bandno, precno, cblkno; - (void)curtileno; - fprintf(stdout, "image {\n"); - fprintf(stdout, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", img->tw, - img->th, tcd_img->x0, tcd_img->x1, tcd_img->y0, tcd_img->y1); - for (tileno = 0; tileno < img->th * img->tw; tileno++) { - tcd_tile_t *tile = &tcd_image.tiles[tileno]; - fprintf(stdout, " tile {\n"); - fprintf(stdout, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", - tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); - for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - fprintf(stdout, " tilec {\n"); - fprintf(stdout, - " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", - tilec->x0, tilec->y0, tilec->x1, tilec->y1, - tilec->numresolutions); - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - fprintf(stdout, "\n res {\n"); - fprintf(stdout, - " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", - res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, - res->numbands); - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - fprintf(stdout, " band {\n"); - fprintf(stdout, - " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", - band->x0, band->y0, band->x1, band->y1, - band->stepsize, band->numbps); - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prec = &band->precincts[precno]; - fprintf(stdout, " prec {\n"); - fprintf(stdout, - " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", - prec->x0, prec->y0, prec->x1, prec->y1, - prec->cw, prec->ch); - for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { - tcd_cblk_t *cblk = &prec->cblks[cblkno]; - fprintf(stdout, " cblk {\n"); - fprintf(stdout, - " x0=%d, y0=%d, x1=%d, y1=%d\n", - cblk->x0, cblk->y0, cblk->x1, cblk->y1); - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, " }\n"); - } - fprintf(stdout, "}\n"); -} - -void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) -{ - int tileno, compno, resno, bandno, precno, cblkno; - tcd_img = img; - tcd_cp = cp; - tcd_image.tw = cp->tw; - tcd_image.th = cp->th; - tcd_image.tiles = (tcd_tile_t *) malloc(sizeof(tcd_tile_t)); - - for (tileno = 0; tileno < 1; tileno++) { - j2k_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; /* si numerotation matricielle .. */ - int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - /* tcd_tile_t *tile=&tcd_image.tiles[tileno]; */ - tile = tcd_image.tiles; - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - tile->numcomps = img->numcomps; - /* tile->PPT=img->PPT; */ - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? int_ceildiv(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec, (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)) : 0; /*Mod antonin losslessbug*/ - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - tile->comps = - (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - j2k_tccp_t *tccp = &tcp->tccps[compno]; - /* tcd_tilecomp_t *tilec=&tile->comps[compno]; */ - tilec = &tile->comps[compno]; - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx); - - tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - - tilec->data = - (int *) malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - - tilec->resolutions = - (tcd_resolution_t *) malloc(tilec->numresolutions * - sizeof(tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - /* tcd_resolution_t *res=&tilec->resolutions[resno]; */ - - res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, i; - int gain, numbps; - j2k_stepsize_t *ss; - band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = - int_ceildivpow2(tilec->x0 - - (1 << levelno) * x0b, levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - - (1 << levelno) * y0b, levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - - (1 << levelno) * x0b, levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - - (1 << levelno) * y0b, levelno + 1); - - } - - ss = &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = img->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = - (tcd_precinct_t *) malloc(3 * res->pw * res->ph * - sizeof(tcd_precinct_t)); - - for (i = 0; i < res->pw * res->ph * 3; i++) { - band->precincts[i].imsbtree = NULL; - band->precincts[i].incltree = NULL; - } - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = - tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = - tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - /* tcd_precinct_t *prc=&band->precincts[precno]; */ - prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks = - (tcd_cblk_t *) malloc((prc->cw * prc->ch) * - sizeof(tcd_cblk_t)); - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - cblk = &prc->cblks[cblkno]; - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - } - } - } - } - } - } - /* tcd_dump(&tcd_image,curtileno); */ -} - -void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) -{ - int tileno, compno, resno, bandno, precno; - (void)curtileno; - tcd_img = img; - tcd_cp = cp; - tcd_image.tw = cp->tw; - tcd_image.th = cp->th; - for (tileno = 0; tileno < 1; tileno++) { - /* j2k_tcp_t *tcp=&cp->tcps[curtileno]; */ - tile = tcd_image.tiles; - for (compno = 0; compno < tile->numcomps; compno++) { - tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - prc = &band->precincts[precno]; - - if (prc->incltree != NULL) - tgt_destroy(prc->incltree); - if (prc->imsbtree != NULL) - tgt_destroy(prc->imsbtree); - free(prc->cblks); - } /* for (precno */ - free(band->precincts); - } /* for (bandno */ - } /* for (resno */ - free(tilec->resolutions); - } /* for (compno */ - free(tile->comps); - } /* for (tileno */ - free(tcd_image.tiles); -} - -void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) -{ - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - j2k_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - /* int previous_x0, previous_x1, previous_y0, previous_y1;*/ - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; - int q = curtileno / cp->tw; - tile = tcd_image.tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - - tile->numcomps = img->numcomps; - /* tile->PPT=img->PPT; */ - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? int_ceildiv(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec, (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)) : 0; /*Mod antonin losslessbug*/ - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - /* tile->comps=(tcd_tilecomp_t*)realloc(tile->comps,img->numcomps*sizeof(tcd_tilecomp_t)); */ - for (compno = 0; compno < tile->numcomps; compno++) { - j2k_tccp_t *tccp = &tcp->tccps[compno]; - /* int realloc_op; */ - - tilec = &tile->comps[compno]; - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - - tilec->data = - (int *) malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - /* tilec->resolutions=(tcd_resolution_t*)realloc(tilec->resolutions,tilec->numresolutions*sizeof(tcd_resolution_t)); */ - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - res = &tilec->resolutions[resno]; - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - j2k_stepsize_t *ss; - band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - band->x0 = - int_ceildivpow2(tilec->x0 - - (1 << levelno) * x0b, levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - - (1 << levelno) * y0b, levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - - (1 << levelno) * x0b, levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = img->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = - tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = - tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - free(prc->cblks); - prc->cblks = - (tcd_cblk_t *) malloc(prc->cw * prc->ch * - sizeof(tcd_cblk_t)); - - if (prc->incltree != NULL) - tgt_destroy(prc->incltree); - if (prc->imsbtree != NULL) - tgt_destroy(prc->imsbtree); - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - cblk = &prc->cblks[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - - } - } - } - } - } - } - /* tcd_dump(&tcd_image,0); */ -} - -void tcd_init(j2k_image_t * img, j2k_cp_t * cp) -{ - int tileno, compno, resno, bandno, precno, cblkno, i, j, p, q; - unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; - tcd_img = img; - tcd_cp = cp; - tcd_image.tw = cp->tw; - tcd_image.th = cp->th; - tcd_image.tiles = - (tcd_tile_t *) malloc(cp->tw * cp->th * sizeof(tcd_tile_t)); - - /*for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - j2k_tcp_t *tcp = &cp->tcps[tileno]; - tcd_tile_t *tile = &tcd_image.tiles[tileno]; */ - - for (i = 0; i < cp->tileno_size; i++) { - j2k_tcp_t *tcp = &cp->tcps[cp->tileno[i]]; - tcd_tile_t *tile = &tcd_image.tiles[cp->tileno[i]]; - tileno = cp->tileno[i]; - - - /* int previous_x0, previous_x1, previous_y0, previous_y1;*/ - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - p = tileno % cp->tw; /* si numerotation matricielle .. */ - q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - - tile->numcomps = img->numcomps; - tile->comps = - (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - j2k_tccp_t *tccp = &tcp->tccps[compno]; - tcd_tilecomp_t *tilec = &tile->comps[compno]; - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - - tilec->data = - (int *) malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = - (tcd_resolution_t *) malloc(tilec->numresolutions * - sizeof(tcd_resolution_t)); - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); /* Mod Antonin : sizebug1*/ - res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); /* Mod Antonin : sizebug1*/ - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - j2k_stepsize_t *ss; - tcd_band_t *band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = - int_ceildivpow2(tilec->x0 - - (1 << levelno) * x0b, levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - - (1 << levelno) * y0b, levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - - (1 << levelno) * x0b, levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = img->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = - (tcd_precinct_t *) malloc(res->pw * res->ph * - sizeof(tcd_precinct_t)); - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = - tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = - tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - tcd_precinct_t *prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks = - (tcd_cblk_t *) malloc(prc->cw * prc->ch * - sizeof(tcd_cblk_t)); - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - } - } - } - } - } - } - /*tcd_dump(&tcd_image,0);*/ - - - /* Allocate place to store the data decoded = final image */ - /* Place limited by the tile really present in the codestream */ - - - for (i = 0; i < img->numcomps; i++) { - for (j = 0; j < cp->tileno_size; j++) { - tileno = cp->tileno[j]; - x0 = j == 0 ? tcd_image.tiles[tileno].comps[i].x0 : int_min(x0, - (unsigned int) - tcd_image. - tiles - [tileno]. - comps - [i].x0); - y0 = - j == 0 ? tcd_image.tiles[tileno].comps[i].y0 : int_min(y0, - (unsigned int) - tcd_image. - tiles - [tileno]. - comps[i]. - y0); - x1 = - j == 0 ? tcd_image.tiles[tileno].comps[i].x1 : int_max(x1, - (unsigned int) - tcd_image. - tiles - [tileno]. - comps[i]. - x1); - y1 = - j == 0 ? tcd_image.tiles[tileno].comps[i].y1 : int_max(y1, - (unsigned int) - tcd_image. - tiles - [tileno]. - comps[i]. - y1); - } - - w = x1 - x0; - - h = y1 - y0; - img->comps[i].data = (int *) calloc(w * h, sizeof(int)); - img->comps[i].w = w; - img->comps[i].h = h; - img->comps[i].x0 = x0; - img->comps[i].y0 = y0; - } -} - -void tcd_makelayer_fixed(int layno, int final) -{ - int compno, resno, bandno, precno, cblkno; - int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3];*/ - int matrice[10][10][3]; - int i, j, k; - - /*matrice=(int*)malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < tcd_tcp->numlayers; i++) { - for (j = 0; j < tilec->numresolutions; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int) (tcd_cp-> - matrice[i * tilec->numresolutions * 3 + - j * 3 + - k] * - (float) (tcd_img->comps[compno].prec / 16.0)); - } - } - } - - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - int n; - int imsb = tcd_img->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - - if (layno == 0) { - value = matrice[layno][resno][bandno]; - if (imsb >= value) - value = 0; - else - value -= imsb; - } else { - value = - matrice[layno][resno][bandno] - - matrice[layno - 1][resno][bandno]; - if (imsb >= matrice[layno - 1][resno][bandno]) { - value -= (imsb - matrice[layno - 1][resno][bandno]); - if (value < 0) - value = 0; - } - } - - if (layno == 0) - cblk->numpassesinlayers = 0; - - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (value != 0) - n = 3 * value - 2 + cblk->numpassesinlayers; - else - n = cblk->numpassesinlayers; - } else - n = 3 * value + cblk->numpassesinlayers; - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) - continue; - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = - cblk->passes[n - 1].rate - - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = - cblk->data + - cblk->passes[cblk->numpassesinlayers - 1].rate; - } - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -void tcd_rateallocate_fixed() -{ - int layno; - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - tcd_makelayer_fixed(layno, 1); - } -} - -void tcd_makelayer(int layno, double thresh, int final) -{ - int compno, resno, bandno, precno, cblkno, passno; - - tcd_tile->distolayer[layno] = 0; /*add fixed_quality*/ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - int n; - - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - for (passno = cblk->numpassesinlayers; - passno < cblk->totalpasses; passno++) { - int dr; - double dd; - tcd_pass_t *pass = &cblk->passes[passno]; - if (n == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[n - 1].rate; - dd = pass->distortiondec - cblk->passes[n - - 1].distortiondec; - } - if (!dr) { - if (dd) - n = passno + 1; - continue; - } - - if (dd / dr >= thresh) - n = passno + 1; - } - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - layer->disto = 0; - continue; - } - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - layer->disto = cblk->passes[n - 1].distortiondec; - } else { - layer->len = cblk->passes[n - 1].rate - - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = - cblk->data + - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->disto = - cblk->passes[n - 1].distortiondec - - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; - } - - tcd_tile->distolayer[layno] += layer->disto; /*add fixed_quality*/ - - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM) -{ - int compno, resno, bandno, precno, cblkno, passno, layno; - double min, max; - double cumdisto[100]; /*add fixed_quality*/ - const double K = 1; /* 1.1; //add fixed_quality*/ - - double maxSE = 0; - min = DBL_MAX; - max = 0; - - tcd_tile->nbpix = 0; /*add fixed_quality*/ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - - tilec->nbpix = 0; - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - for (passno = 0; passno < cblk->totalpasses; passno++) { - tcd_pass_t *pass = &cblk->passes[passno]; - int dr; - double dd, rdslope; - if (passno == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[passno - 1].rate; - dd = pass->distortiondec - - cblk->passes[passno - 1].distortiondec; - } - if (dr == 0) { - continue; - } - - rdslope = dd / dr; - - if (rdslope < min) { - min = rdslope; - } - if (rdslope > max) { - max = rdslope; - } - } /* passno */ - - tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); /*add fixed_quality*/ - - tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); /*add fixed_quality*/ - - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - maxSE += (((double)(1 << tcd_img->comps[compno].prec) - 1.0) * ((double)(1 << tcd_img->comps[compno].prec) -1.0)) * ((double)(tilec->nbpix)); - } /* compno */ - - /* add antonin index */ - if (info_IM->index_on) { - info_tile *info_TL = &info_IM->tile[tcd_tileno]; - info_TL->nbpix = tcd_tile->nbpix; - info_TL->distotile = tcd_tile->distotile; - info_TL->thresh = - (double *) malloc(tcd_tcp->numlayers * sizeof(double)); - } - /* dda */ - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - volatile double lo = min; - volatile double hi = max; - volatile int success = 0; - volatile int maxlen = tcd_tcp->rates[layno] ? int_min(tcd_tcp->rates[layno], len) : len; /*Mod antonin losslessbug*/ - volatile double goodthresh; - volatile int i; - double distotarget; /*add fixed_quality*/ - - distotarget = tcd_tile->distotile - ((K * maxSE) / pow(10, tcd_tcp->distoratio[layno] / 10)); /* add fixed_quality*/ - - if ((tcd_tcp->rates[layno]) || (tcd_cp->disto_alloc==0)) { - for (i = 0; i < 32; i++) { - volatile double thresh = (lo + hi) / 2; - int l = 0; - double distoachieved = 0; /* add fixed_quality*/ - - tcd_makelayer(layno, thresh, 0); - - if (tcd_cp->fixed_quality) { /* add fixed_quality*/ - distoachieved = - layno == - 0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + - tcd_tile->distolayer[layno]; - if (distoachieved < distotarget) { - hi = thresh; - continue; - } - lo = thresh; - } else { - l = - t2_encode_packets(tcd_img, tcd_cp, tcd_tileno, tcd_tile, - layno + 1, dest, maxlen, info_IM); - /* fprintf(stderr, "rate alloc: len=%d, max=%d\n", l, maxlen); */ - if (l == -999) { - lo = thresh; - continue; - } - hi = thresh; - } - - success = 1; - goodthresh = thresh; - } - } else { - success = 1; - goodthresh = min; - } - - if (!success) { - longjmp(j2k_error, 1); - } - - if (info_IM->index_on) { /* Threshold for Marcela Index */ - info_IM->tile[tcd_tileno].thresh[layno] = goodthresh; - } - tcd_makelayer(layno, goodthresh, 1); - - cumdisto[layno] = layno == 0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; /* add fixed_quality*/ - } -} - -int -tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, - info_image * info_IM) -{ - int compno; - int l, i, npck=0; - clock_t time7; - tcd_tile_t *tile; - j2k_tcp_t *tcp = &tcd_cp->tcps[0]; - j2k_tccp_t *tccp = &tcp->tccps[0]; - - tcd_tileno = tileno; - tcd_tile = tcd_image.tiles; - tcd_tcp = &tcd_cp->tcps[tileno]; - tile = tcd_tile; - /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ - if (info_IM->index_on) { - tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /*Based on Component 0*/ - - for (i = 0; i < tilec_idx->numresolutions; i++) { - - tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - info_IM->tile[tileno].pw[i] = res_idx->pw; - info_IM->tile[tileno].ph[i] = res_idx->ph; - - npck+=res_idx->pw * res_idx->ph; - - info_IM->tile[tileno].pdx[i] = tccp->prcw[i]; - info_IM->tile[tileno].pdy[i] = tccp->prch[i]; - - } - info_IM->tile[tileno].packet = (info_packet *) calloc(info_IM->Comp * info_IM->Layer * npck, sizeof(info_packet)); - } - /* << INDEX */ - -/*---------------TILE-------------------*/ - - time7 = clock(); - - for (compno = 0; compno < tile->numcomps; compno++) { - FILE *src; - char tmp[256]; - int k; - unsigned char elmt; - int i, j; - int tw, w; - tcd_tilecomp_t *tilec = &tile->comps[compno]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno]. - prec - 1); - int offset_x, offset_y; - - offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx); - offset_y = int_ceildiv(tcd_img->y0, tcd_img->comps[compno].dy); - tw = tilec->x1 - tilec->x0; - w = int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx); - sprintf(tmp, "Compo%d", compno); /* component file */ - src = fopen(tmp, "rb"); - if (!src) { - fprintf(stderr, "failed to open %s for reading\n", tmp); - return 1; - } - - /* read the Compo file to extract data of the tile */ - k = 0; - fseek(src, (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w, - SEEK_SET); - k = (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w; - for (j = tilec->y0; j < tilec->y1; j++) { - for (i = tilec->x0; i < tilec->x1; i++) { - if (tcd_tcp->tccps[compno].qmfbid == 1) { - elmt = fgetc(src); - tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = - elmt - adjust; - k++; - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - elmt = fgetc(src); - tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = - (elmt - adjust) << 13; - k++; - } - } - fseek(src, (tilec->x0 - offset_x) + (j + 1 - offset_y) * w - k, - SEEK_CUR); - k = tilec->x0 - offset_x + (j + 1 - offset_y) * w; - - } - fclose(src); - } - -/*----------------MCT-------------------*/ - - if (tcd_tcp->mct) { - if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } - } -/*----------------DWT---------------------*/ - -/* mod Ive*/ -for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec); - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec); - } -} -/* /mod Ive*/ -/*------------------TIER1-----------------*/ - - t1_init_luts(); - t1_encode_cblks(tile, tcd_tcp); - -/*-----------RATE-ALLOCATE------------------*/ - info_IM->index_write = 0; /* INDEX */ - - if (tcd_cp->disto_alloc || tcd_cp->fixed_quality) /* mod fixed_quality*/ - /* Normal Rate/distortion allocation */ - tcd_rateallocate(dest, len, info_IM); - else - /* Fixed layer allocation */ - tcd_rateallocate_fixed(); - -/*--------------TIER2------------------*/ - info_IM->index_write = 1; /* INDEX */ - l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile, - tcd_tcp->numlayers, dest, len, info_IM); -/*---------------CLEAN-------------------*/ - - time7 = clock() - time7; - fprintf(stdout,"total: %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC, - (time7 % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); - - /* cleaning memory */ - for (compno = 0; compno < tile->numcomps; compno++) { - tilec = &tile->comps[compno]; - free(tilec->data); - } - - return l; -} - -int -tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, - info_image * info_IM) -{ - int compno; - int l, i, npck=0; - clock_t time; - tcd_tile_t *tile; - j2k_tcp_t *tcp = &tcd_cp->tcps[0]; - j2k_tccp_t *tccp = &tcp->tccps[0]; - - tcd_tileno = tileno; - tcd_tile = tcd_image.tiles; - tcd_tcp = &tcd_cp->tcps[tileno]; - tile = tcd_tile; - /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ - if (info_IM->index_on) { - tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /*Based on Component 0*/ - - for (i = 0; i < tilec_idx->numresolutions; i++) { - - tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - info_IM->tile[tileno].pw[i] = res_idx->pw; - info_IM->tile[tileno].ph[i] = res_idx->ph; - - npck+=res_idx->pw * res_idx->ph; - - info_IM->tile[tileno].pdx[i] = tccp->prcw[i]; - info_IM->tile[tileno].pdy[i] = tccp->prch[i]; - - } - info_IM->tile[tileno].packet = (info_packet *) calloc(info_IM->Comp * info_IM->Layer * npck, sizeof(info_packet)); - } - /* << INDEX */ -/*---------------TILE-------------------*/ - time = clock(); - - for (compno = 0; compno < tile->numcomps; compno++) { - FILE *src; - char tmp[256]; - int k; - int elmt; - int i, j; - int tw, w; - tcd_tilecomp_t *tilec = &tile->comps[compno]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno]. - prec - 1); - int offset_x, offset_y; - - offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx); - offset_y = int_ceildiv(tcd_img->y0, tcd_img->comps[compno].dy); - tw = tilec->x1 - tilec->x0; - w = int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx); - sprintf(tmp, "bandtile%d", tileno / tcd_cp->tw + 1); /* bandtile file opening */ - src = fopen(tmp, "rb"); - if (!src) { - fprintf(stderr, "failed to open %s for reading\n", tmp); - return 1; - } - /* Extract data from bandtile file limited to the current tile */ - k = 0; - while (k < tilec->x0 - offset_x) { - k++; - fscanf(src, "%d", &elmt); - } - - for (j = 0; j < tilec->y1 - tilec->y0; j++) { - for (i = tilec->x0; i < tilec->x1; i++) { - if (tcd_tcp->tccps[compno].qmfbid == 1) { - fscanf(src, "%d", &elmt); - tilec->data[i - tilec->x0 + (j) * tw] = elmt - adjust; - k++; - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - fscanf(src, "%d", &elmt); - tilec->data[i - tilec->x0 + (j) * tw] = (elmt - adjust) << 13; - k++; - } - } - while (k < tilec->x0 - offset_x + (j + 1) * w) { - k++; - fscanf(src, "%d", &elmt); - } - } - fclose(src); - } - -/*----------------MCT-------------------*/ - - if (tcd_tcp->mct) { - if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } - } - -/*----------------DWT---------------------*/ - -/* mod Ive*/ -for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec); - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec); - } -} -/* /mod Ive*/ - -/*------------------TIER1-----------------*/ - - t1_init_luts(); - t1_encode_cblks(tile, tcd_tcp); - -/*-----------RATE-ALLOCATE------------------*/ - - info_IM->index_write = 0; /* INDEX */ - - if (tcd_cp->disto_alloc || tcd_cp->fixed_quality) /* mod fixed_quality*/ - - /* Normal Rate/distortion allocation */ - - tcd_rateallocate(dest, len, info_IM); - - else - /* Fixed layer allocation */ - - tcd_rateallocate_fixed(); - -/*--------------TIER2------------------*/ - info_IM->index_write = 1; /* INDEX */ - - l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile, - tcd_tcp->numlayers, dest, len, info_IM); - - /*---------------CLEAN-------------------*/ - time = clock() - time; - fprintf(stdout,"total: %ld.%.3ld s\n", time / CLOCKS_PER_SEC, - (time % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); - - for (compno = 0; compno < tile->numcomps; compno++) { - tilec = &tile->comps[compno]; - free(tilec->data); - } - - return l; -} - - -int tcd_decode_tile(unsigned char *src, int len, int tileno) -{ - int l; - int compno; - int eof = 0; - clock_t time; - tcd_tile_t *tile; - - tcd_tileno = tileno; - tcd_tile = &tcd_image.tiles[tileno]; - tcd_tcp = &tcd_cp->tcps[tileno]; - tile = tcd_tile; - - time = clock(); - - fprintf(stdout, "Tile %d of %d decoded in ", tileno + 1, - tcd_cp->tw * tcd_cp->th); - - /*--------------TIER2------------------*/ - - l = t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile); - - if (l == -999) { - eof = 1; - fprintf(stderr, "tcd_decode: incomplete bistream\n"); - } - - /*------------------TIER1-----------------*/ - t1_init_luts(); - t1_decode_cblks(tile, tcd_tcp); - - /*----------------DWT---------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_cp->reduce != 0) { - tcd_img->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd_cp->reduce - 1; - } - - - /* mod Ive */ - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_decode(tilec, - tilec->numresolutions - 1 - - tcd_img->comps[compno].resno_decoded); - } else { - dwt_decode_real(tilec, - tilec->numresolutions - 1 - - tcd_img->comps[compno].resno_decoded); - } - /* /mod Ive*/ - - if (tile->comps[compno].numresolutions > 0) - tcd_img->comps[compno].factor = - tile->comps[compno].numresolutions - - (tcd_img->comps[compno].resno_decoded + 1); - } - - /*----------------MCT-------------------*/ - - if (tcd_tcp->mct) { - if (tcd_tcp->tccps[0].qmfbid == 1) { - mct_decode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } else { - mct_decode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); - } - } - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - tcd_resolution_t *res = - &tilec->resolutions[tcd_img->comps[compno].resno_decoded]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno]. - prec - 1); - int min = - tcd_img->comps[compno]. - sgnd ? -(1 << (tcd_img->comps[compno].prec - 1)) : 0; - int max = - tcd_img->comps[compno]. - sgnd ? (1 << (tcd_img->comps[compno].prec - 1)) - - 1 : (1 << tcd_img->comps[compno].prec) - 1; - - int tw = tilec->x1 - tilec->x0; - int w = tcd_img->comps[compno].w; - - int i, j; - int offset_x = int_ceildivpow2(tcd_img->comps[compno].x0, - tcd_img->comps[compno].factor); - int offset_y = int_ceildivpow2(tcd_img->comps[compno].y0, - tcd_img->comps[compno].factor); - - for (j = res->y0; j < res->y1; j++) { - for (i = res->x0; i < res->x1; i++) { - - int v; - double tmp = (tilec->data[i - res->x0 + (j - res->y0) * tw])/8192.0; - int tmp2; - - if (tcd_tcp->tccps[compno].qmfbid == 1) { - v = tilec->data[i - res->x0 + (j - res->y0) * tw]; - } else { - tmp2=((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2); - v = ((tmp<0)?-tmp2:tmp2); - } - - v += adjust; - - tcd_img->comps[compno].data[(i - offset_x) + - (j - offset_y) * w] = - int_clamp(v, min, max); - } - } - } - - time = clock() - time; - fprintf(stdout, "%ld.%.3ld s\n", time / CLOCKS_PER_SEC, - (time % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); - - - - for (compno = 0; compno < tile->numcomps; compno++) { - free(tcd_image.tiles[tileno].comps[compno].data); - } - - if (eof) { - longjmp(j2k_error, 1); - } - - return l; -} - - - -void tcd_dec_release() - -{ - - int tileno,compno,resno,bandno,precno; - - for (tileno=0;tileno -#include - -/* */ -/* Reset tag-tree. */ -/* */ -void tgt_reset(tgt_tree_t * tree) -{ - int i; - /* new */ - if (!tree || tree == NULL) - return; - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} - -/* */ -/* Create tag-tree. */ -/* */ -tgt_tree_t *tgt_create(int numleafsh, int numleafsv) -{ - int nplh[32]; - int nplv[32]; - tgt_node_t *node; - tgt_node_t *parentnode; - tgt_node_t *parentnode0; - tgt_tree_t *tree; - int i, j, k; - int numlvls; - int n; - - tree = (tgt_tree_t *) malloc(sizeof(tgt_tree_t)); - tree->numleafsh = numleafsh; - tree->numleafsv = numleafsv; - - numlvls = 0; - nplh[0] = numleafsh; - nplv[0] = numleafsv; - tree->numnodes = 0; - do { - n = nplh[numlvls] * nplv[numlvls]; - nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; - nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; - tree->numnodes += n; - ++numlvls; - } while (n > 1); - - /* ADD */ - if (tree->numnodes == 0) { - free(tree); - return NULL; - } - - tree->nodes = (tgt_node_t *) malloc(tree->numnodes * sizeof(tgt_node_t)); - - node = tree->nodes; - parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; - parentnode0 = parentnode; - - for (i = 0; i < numlvls - 1; ++i) { - for (j = 0; j < nplv[i]; ++j) { - k = nplh[i]; - while (--k >= 0) { - node->parent = parentnode; - ++node; - if (--k >= 0) { - node->parent = parentnode; - ++node; - } - ++parentnode; - } - if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; - } else { - parentnode = parentnode0; - parentnode0 += nplh[i]; - } - } - } - node->parent = 0; - - tgt_reset(tree); - - return tree; -} - -/* */ -/* Destroy tag-tree. */ -/* */ -void tgt_destroy(tgt_tree_t * t) -{ - free(t->nodes); - free(t); -} - -/* */ -/* Set the value of a leaf of the tag-tree. */ -/* */ -void tgt_setvalue(tgt_tree_t * tree, int leafno, int value) -{ - tgt_node_t *node; - node = &tree->nodes[leafno]; - while (node && node->value > value) { - node->value = value; - node = node->parent; - } -} - -/* */ -/* Encode the value of a leaf of the tag-tree. */ -/* */ -void tgt_encode(tgt_tree_t * tree, int leafno, int threshold) -{ - tgt_node_t *stk[31]; - tgt_node_t **stkptr; - tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - - while (low < threshold) { - if (low >= node->value) { - if (!node->known) { - bio_write(1, 1); - node->known = 1; - } - break; - } - bio_write(0, 1); - ++low; - } - - node->low = low; - if (stkptr == stk) - break; - node = *--stkptr; - } - -} - -/* */ -/* Decode the value of a leaf of the tag-tree. */ -/* */ -int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) -{ - tgt_node_t *stk[31]; - tgt_node_t **stkptr; - tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - while (low < threshold && low < node->value) { - if (bio_read(1)) { - node->value = low; - } else { - ++low; - } - } - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } - - return (node->value < threshold) ? 1 : 0; -} diff --git a/mj2/libopenjpeg_097/tgt.h b/mj2/libopenjpeg_097/tgt.h deleted file mode 100644 index 316e8a3f..00000000 --- a/mj2/libopenjpeg_097/tgt.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2001-2002, David Janssens - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __TGT_H -#define __TGT_H - -typedef struct tgt_node { - struct tgt_node *parent; - int value; - int low; - int known; -} tgt_node_t; - -typedef struct { - int numleafsh; - int numleafsv; - int numnodes; - tgt_node_t *nodes; -} tgt_tree_t; - - - -/* - * Reset a tag-tree (set all leaves to 0) - * tree: tag-tree to reset - */ -void tgt_reset(tgt_tree_t * tree); - -/* - * Create a tag-tree - * numleafsh: width of the array of leafs of the tree - * numleafsv: height of the array of leafs of the tree - */ -tgt_tree_t *tgt_create(int numleafsh, int numleafsv); - -/* - * Destroy a tag-tree, liberating memory - * tree: tag-tree to destroy - */ -void tgt_destroy(tgt_tree_t * tree); - -/* - * Set the value of a leaf of a tag-tree - * tree: tag-tree to modify - * leafno: number that identifies the leaf to modify - * value: new value of the leaf - */ -void tgt_setvalue(tgt_tree_t * tree, int leafno, int value); - -/* - * Encode the value of a leaf of the tag-tree up to a given threshold - * leafno: number that identifies the leaf to encode - * threshold: threshold to use when encoding value of the leaf - */ -void tgt_encode(tgt_tree_t * tree, int leafno, int threshold); - -/* - * Decode the value of a leaf of the tag-tree up to a given threshold - * leafno: number that identifies the leaf to decode - * threshold: threshold to use when decoding value of the leaf - */ -int tgt_decode(tgt_tree_t * tree, int leafno, int threshold); - -#endif diff --git a/mj2/MJ2_codec/meta_out.c b/mj2/meta_out.c similarity index 92% rename from mj2/MJ2_codec/meta_out.c rename to mj2/meta_out.c index 12c97f35..c77ec20a 100644 --- a/mj2/MJ2_codec/meta_out.c +++ b/mj2/meta_out.c @@ -11,40 +11,29 @@ A non-exclusive copy of this code has been contributed to the Open JPEG project. Except for copyright, inclusion of the code within Open JPEG for distribution and use can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. */ -#include -#include -#include - -#include "mj2.h" -#include - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM #include /* for time functions */ + +#include "opj_includes.h" +#include "mj2.h" + #include #include "meta_out.h" -#include -jmp_buf j2k_error; -extern j2k_tcp_t j2k_default_tcp; static BOOL notes = TRUE; static BOOL sampletables = FALSE; static BOOL raw = TRUE; static BOOL derived = TRUE; +opj_tcp_t *j2k_default_tcp; + /* Forwards */ -int xml_write_overall_header(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe); -int xml_write_moov(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe); +int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr); +int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr); void uint_to_chars(unsigned int value, char* buf); -void xml_write_trak(FILE *file, FILE *xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe); +void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr); void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); @@ -56,43 +45,41 @@ void xml_time_out(FILE* xmlout, time_t t); void int16_to_3packedchars(short int value, char* buf); -void xml_write_moov_udta(FILE* xmlout, mj2_movie_t * movie); -void xml_write_free_and_skip(FILE* xmlout, mj2_movie_t * movie); -void xml_write_uuid(FILE* xmlout, mj2_movie_t * movie); +void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie); +void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie); +void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie); -int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum); +int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr); -void xml_out_frame_siz(FILE* xmlout, j2k_image_t *img, j2k_cp_t *cp); -void xml_out_frame_cod(FILE* xmlout, j2k_tcp_t *tcp); -void xml_out_frame_coc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps); /* j2k_image_t *img); */ -BOOL same_component_style(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2); -void xml_out_frame_qcd(FILE* xmlout, j2k_tcp_t *tcp); -void xml_out_frame_qcc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps); /* j2k_image_t *img); */ -BOOL same_component_quantization(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2); -void xml_out_frame_rgn(FILE* xmlout, j2k_tcp_t *tcp, int numcomps);/* j2k_image_t *img);*/ -void xml_out_frame_poc(FILE* xmlout, j2k_tcp_t *tcp); -void xml_out_frame_ppm(FILE* xmlout, j2k_cp_t *cp); -void xml_out_frame_ppt(FILE* xmlout, j2k_tcp_t *tcp); +void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp); +void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp); +void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps); /* opj_image_t *img); */ +BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2); +void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp); +void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps); /* opj_image_t *img); */ +BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2); +void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps);/* opj_image_t *img);*/ +void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp); +void xml_out_frame_ppm(FILE* xmlout, opj_cp_t *cp); +void xml_out_frame_ppt(FILE* xmlout, opj_tcp_t *tcp); void xml_out_frame_tlm(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ void xml_out_frame_plm(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ -void xml_out_frame_plt(FILE* xmlout, j2k_tcp_t *tcp); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ +void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ void xml_out_frame_crg(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* opt in main; */ -void xml_out_frame_com(FILE* xmlout, j2k_tcp_t *tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ +void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s); void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s); -void xml_out_frame_jp2h(FILE* xmlout, jp2_struct_t *jp2_struct); +void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct); #ifdef NOTYET /* Shown with cp, extended, as data structure... but it could be a new different one */ -void xml_out_frame_jp2i(FILE* xmlout, j2k_cp_t *cp);/* IntellectualProperty 'jp2i' (no restrictions on location) */ -void xml_out_frame_xml(FILE* xmlout, j2k_cp_t *cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ -void xml_out_frame_uuid(FILE* xmlout, j2k_cp_t *cp); /* UUID 'uuid' (top level only) */ -void xml_out_frame_uinf(FILE* xmlout, j2k_cp_t *cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ -void xml_out_frame_unknown_type(FILE* xmlout, j2k_cp_t *cp); +void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp);/* IntellectualProperty 'jp2i' (no restrictions on location) */ +void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ +void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp); /* UUID 'uuid' (top level only) */ +void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ +void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp); #endif -/* ------------------------------------------------------------------------------------------- */ - void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d) { /* Init file globals */ @@ -102,7 +89,7 @@ void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d) derived = d; } -int xml_write_struct(FILE* file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe, char* stringDTD) { +int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr) { if(stringDTD != NULL) { @@ -116,14 +103,14 @@ int xml_write_struct(FILE* file, FILE *xmlout, mj2_movie_t * movie, unsigned int fprintf(xmlout,"\n"); fprintf(xmlout, "\n"); - xml_write_overall_header(file, xmlout, movie, sampleframe); + xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); fprintf(xmlout, ""); return 0; } /* ------------- */ -int xml_write_overall_header(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe) +int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { int i; char buf[5]; @@ -143,7 +130,7 @@ int xml_write_overall_header(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsi } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); - xml_write_moov(file, xmlout, movie, sampleframe); + xml_write_moov(file, xmlout, movie, sampleframe, event_mgr); // To come? // This is the container for media data that can also be accessed through track structures, // so is redundant, and simply not of interest as metadata // // Allows incremental build up of movie. Probably not in Simple Profile @@ -154,7 +141,7 @@ int xml_write_overall_header(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsi /* ------------- */ -int xml_write_moov(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe) +int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { unsigned int tnum; mj2_tk_t *track; @@ -188,10 +175,6 @@ int xml_write_moov(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int s if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Rate to play presentation (default = 0x00010000) */ -#define CURRENTSTRUCT -#ifdef CURRENTSTRUCT - movie->rate = movie->rate << 16; -#endif if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); @@ -200,11 +183,6 @@ int xml_write_moov(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int s fprintf(xmlout, " 0x%08x\n", movie->rate); if(derived) fprintf(xmlout, " %12.6f\n", (double)movie->rate/(double)0x00010000); -#ifdef CURRENTSTRUCT - if(notes) - fprintf(xmlout, " \n"); - movie->rate = movie->rate >> 16; -#endif fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) @@ -272,7 +250,7 @@ int xml_write_moov(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int s track = &(movie->tk[tnum]); // For now, output info on first video track - xml_write_trak(file, xmlout, track, tnum, sampleframe); + xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr); // to come: // possibly not in Simple Profile xml_write_moov_udta(xmlout, movie); /* NO OP so far */ /* contains */ @@ -341,7 +319,7 @@ void xml_time_out(FILE* xmlout, time_t t) /* ------------- */ -void xml_write_moov_udta(FILE* xmlout, mj2_movie_t * movie) { +void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie) { /* Compare with xml_write_udta */ #ifdef NOTYET /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) @@ -368,7 +346,7 @@ void xml_write_moov_udta(FILE* xmlout, mj2_movie_t * movie) { #endif } -void xml_write_free_and_skip(FILE* xmlout, mj2_movie_t * movie) { +void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie) { #ifdef NOTYET /* NO-OP so far. There can be zero or more instances of free and/or skip at the top level of the file. This may be a place where the user squirrel's metadata. @@ -396,7 +374,7 @@ void xml_write_free_and_skip(FILE* xmlout, mj2_movie_t * movie) { #endif } -void xml_write_uuid(FILE* xmlout, mj2_movie_t * movie) { +void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) { /* Univeral Unique IDs of 16 bytes. */ #ifdef NOTYET /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file. @@ -420,7 +398,7 @@ void xml_write_uuid(FILE* xmlout, mj2_movie_t * movie) { /* ------------- */ -void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe) +void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { fprintf(xmlout, " \n", tnum); xml_write_tkhd(file, xmlout, track, tnum); @@ -442,7 +420,7 @@ void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){ // fprintf(stdout,"Frame %d: ",snum+1); sample = &track->sample[snum]; - if(xml_out_frame(file, xmlout, sample, snum)) + if(xml_out_frame(file, xmlout, sample, snum, event_mgr)) return; /* Not great error handling here */ } } @@ -932,14 +910,29 @@ void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum /* ------------- */ -int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum) +int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr) { - j2k_image_t img; - j2k_cp_t cp; + opj_dparameters_t parameters; /* decompression parameters */ + opj_image_t *img; + opj_cp_t *cp; int i; int numcomps; unsigned char* frame_codestream; -/* char xmloutname[50]; */ + opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ + opj_cio_t *cio = NULL; + opj_j2k_t *j2k; + + /* JPEG 2000 compressed image data */ + + /* get a decoder handle */ + dinfo = opj_create_decompress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr); + + /* setup the decoder decoding parameters using the current image and user parameters */ + parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS; + opj_setup_decoder(dinfo, ¶meters); frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker */ if(frame_codestream == NULL) @@ -947,65 +940,71 @@ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int s fseek(file,sample->offset+8,SEEK_SET); fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do */ - /* Decode J2K to image: */ - if (!j2k_decode(frame_codestream, sample->sample_size-8, &img, &cp)) { - free(frame_codestream); -#ifndef NO_PACKETS_DECODING - for (i=0; isample_size-8); + + /* Decode J2K to image: */ + img = opj_decode(dinfo, cio); + if (!img) { + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); + opj_destroy_decompress(dinfo); + opj_cio_close(cio); + return 1; + } + + j2k = (opj_j2k_t*)dinfo->j2k_handle; + j2k_default_tcp = j2k->default_tcp; + cp = j2k->cp; + + numcomps = img->numcomps; + /* Alignments: " < To help maintain xml pretty-printing */ fprintf(xmlout, " \n", snum+1); fprintf(xmlout, " \n"); /* There can be multiple codestreams; a particular image is entirely within a single codestream */ /* TO DO: A frame can be represented by two I-guess-contigious codestreams if its interleaved. */ fprintf(xmlout, " \n"); /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */ - xml_out_frame_siz(xmlout, &img, &cp); /* reqd in main */ - xml_out_frame_cod(xmlout, &j2k_default_tcp); /* reqd in main */ - xml_out_frame_coc(xmlout, &j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_qcd(xmlout, &j2k_default_tcp); /* reqd in main */ - xml_out_frame_qcc(xmlout, &j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_rgn(xmlout, &j2k_default_tcp, numcomps); /* opt, at most 1 per component */ - xml_out_frame_poc(xmlout, &j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ + xml_out_frame_siz(xmlout, img, cp); /* reqd in main */ + xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */ + xml_out_frame_coc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ + xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */ + xml_out_frame_qcc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ + xml_out_frame_rgn(xmlout, j2k_default_tcp, numcomps); /* opt, at most 1 per component */ + xml_out_frame_poc(xmlout, j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ /* Next four get j2k_default_tcp passed globally: */ #ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppm(xmlout, &cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ + xml_out_frame_ppm(xmlout, cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ #endif xml_out_frame_tlm(xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */ xml_out_frame_plm(xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */ xml_out_frame_crg(xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ - xml_out_frame_com(xmlout, &j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ + xml_out_frame_com(xmlout, j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ fprintf(xmlout, " \n"); /* TO DO: all the tile headers (sigh) */ - fprintf(xmlout, " \n", cp.tileno_size); /* size of the vector tileno */ - for(i = 0; i < cp.tileno_size; i++) { /* I think cp.tileno_size will be same number as (cp.tw * cp.th) or as global j2k_curtileno */ + fprintf(xmlout, " \n", cp->tileno_size); /* size of the vector tileno */ + for(i = 0; i < cp->tileno_size; i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */ // Standard seems to use zero-based # for tile-part. - fprintf(xmlout, " \n", i, cp.tileno[i]); /* ID number of the tiles present in the codestream */ + fprintf(xmlout, " \n", i, cp->tileno[i]); /* ID number of the tiles present in the codestream */ fprintf(xmlout, " \n"); /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */ if(i == 0) { - xml_out_frame_cod(xmlout, &(cp.tcps[i])); /* No more than 1 per tile */ - xml_out_frame_coc(xmlout, &(cp.tcps[i]), numcomps); /* No more than 1 per component */ - xml_out_frame_qcd(xmlout, &(cp.tcps[i])); /* No more than 1 per tile */ - xml_out_frame_qcc(xmlout, &(cp.tcps[i]), numcomps); /* No more than 1 per component */ - xml_out_frame_rgn(xmlout, &(cp.tcps[i]), numcomps); /* No more than 1 per component */ + xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ + xml_out_frame_coc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ + xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ + xml_out_frame_qcc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ + xml_out_frame_rgn(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ } - xml_out_frame_poc(xmlout, &(cp.tcps[i])); /* Reqd only if any progression order changes different from main POC */ + xml_out_frame_poc(xmlout, &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */ #ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppt(xmlout, &(cp.tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ + xml_out_frame_ppt(xmlout, &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ #endif - xml_out_frame_plt(xmlout, &(cp.tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ - xml_out_frame_com(xmlout, &(cp.tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ - /* j2k_tcp_t * cp.tcps; "tile coding parameters" */ - /* Maybe not: fprintf(xmlout, " <>%d, cp.matrice[i]; */ /* Fixed layer */ + xml_out_frame_plt(xmlout, &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ + xml_out_frame_com(xmlout, &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ + /* opj_tcp_t * cp->tcps; "tile coding parameters" */ + /* Maybe not: fprintf(xmlout, " <>%d, cp->matrice[i]; */ /* Fixed layer */ fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); @@ -1028,14 +1027,14 @@ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int s /* Extra commentary: */ if(notes) { fprintf(xmlout, " \n"); - if (((img.numcomps == 3) && (img.comps[0].dx == img.comps[1].dx / 2) - && (img.comps[0].dx == img.comps[2].dx / 2 ) && (img.comps[0].dx == 1)) - || (img.numcomps == 1)) { + if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) + && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) + || (img->numcomps == 1)) { fprintf(xmlout, " \n"); } - else if ((img.numcomps == 3) && - (img.comps[0].dx == 1) && (img.comps[1].dx == 1)&& - (img.comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp + else if ((img->numcomps == 3) && + (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& + (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp fprintf(xmlout, " \n"); } else { @@ -1043,11 +1042,8 @@ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int s } } -#ifndef NO_PACKETS_DECODING - for (i=0; i\n"); @@ -1137,17 +1133,17 @@ void xml_out_frame_siz(FILE* xmlout, j2k_image_t *img, j2k_cp_t *cp) /* ------------- */ -void xml_out_frame_cod(FILE* xmlout, j2k_tcp_t *tcp) +void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp) { /* Could be called with tcp = &j2k_default_tcp; /* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno] /* Alignment for main:" < < < < To help maintain xml pretty-printing */ /* Alignment for tile:" < < < To help maintain xml pretty-printing */ - j2k_tccp_t *tccp; + opj_tccp_t *tccp; int i; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } tccp = &(tcp->tccps[0]); @@ -1221,14 +1217,14 @@ void xml_out_frame_cod(FILE* xmlout, j2k_tcp_t *tcp) /* ------------- */ -void xml_out_frame_coc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ +void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ { /* Uses global j2k_default_tcp */ - j2k_tccp_t *tccp, *firstcomp_tccp; + opj_tccp_t *tccp, *firstcomp_tccp; int i, compno; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } @@ -1240,7 +1236,7 @@ void xml_out_frame_coc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* Optional i /* Let's pretend that [0] is the default and all others are not */ if(notes) { fprintf(xmlout, "%s\n", s); - if(tcp == &j2k_default_tcp) + if(tcp == j2k_default_tcp) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); @@ -1314,7 +1310,7 @@ void xml_out_frame_coc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* Optional i /* ------------- */ -BOOL same_component_style(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2) +BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int i; @@ -1340,14 +1336,14 @@ BOOL same_component_style(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2) /* ------------- */ -void xml_out_frame_qcd(FILE* xmlout, j2k_tcp_t *tcp) +void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp) { /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - j2k_tccp_t *tccp; + opj_tccp_t *tccp; int bandno, numbands; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } @@ -1471,16 +1467,16 @@ void xml_out_frame_qcd(FILE* xmlout, j2k_tcp_t *tcp) /* ------------- */ -void xml_out_frame_qcc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) +void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) { /* Uses global j2k_default_tcp */ /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - j2k_tccp_t *tccp, *firstcomp_tccp; + opj_tccp_t *tccp, *firstcomp_tccp; int bandno, numbands; int compno; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } @@ -1492,7 +1488,7 @@ void xml_out_frame_qcc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* Let's pretend that [0] is the default and all others are not */ if(notes) { fprintf(xmlout, "%s\n", s); - if(tcp == &j2k_default_tcp) + if(tcp == j2k_default_tcp) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); @@ -1505,7 +1501,7 @@ void xml_out_frame_qcc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* Compare j2k_read_qcx */ fprintf(xmlout, "%s\n", s, compno); /* Required in main header, single occurrence */ - tccp = &j2k_default_tcp.tccps[0]; + tccp = &j2k_default_tcp->tccps[0]; /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */ fprintf(xmlout, "%s \n", s); /* 1 byte */ if(notes) @@ -1617,7 +1613,7 @@ void xml_out_frame_qcc(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* ------------- */ -BOOL same_component_quantization(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2) +BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int bandno, numbands; @@ -1658,13 +1654,13 @@ BOOL same_component_quantization(j2k_tccp_t *tccp1, j2k_tccp_t *tccp2) /* ------------- */ -void xml_out_frame_rgn(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) +void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps) { int compno, SPrgn; /* MJ2 files can have regions of interest if hybridized with JPX Part II */ char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } @@ -1690,13 +1686,13 @@ void xml_out_frame_rgn(FILE* xmlout, j2k_tcp_t *tcp, int numcomps) /* ------------- */ -void xml_out_frame_poc(FILE* xmlout, j2k_tcp_t *tcp) { /* Progression Order Change */ +void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp) { /* Progression Order Change */ /* Compare j2k_read_poc() */ int i; - j2k_poc_t *poc; + opj_poc_t *poc; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; - if(tcp == &j2k_default_tcp) { + if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } @@ -1743,7 +1739,7 @@ void xml_out_frame_poc(FILE* xmlout, j2k_tcp_t *tcp) { /* Progression Order Chan /* Suppress PPM and PPT since we're not showing data from the third option, namely within the codestream, and that's evidently what frames_to_mj2 uses. And a hex dump isn't so useful anyway */ -void xml_out_frame_ppm(FILE *xmlout, j2k_cp_t *cp) { /* For main header, not tile-part (which uses PPT instead). */ +void xml_out_frame_ppm(FILE *xmlout, opj_cp_t *cp) { /* For main header, not tile-part (which uses PPT instead). */ /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ /* Use of PPM and PPT are mutually exclusive. */ /* Compare j2k_read_ppm() */ @@ -1774,7 +1770,7 @@ void xml_out_frame_ppm(FILE *xmlout, j2k_cp_t *cp) { /* For main header, not til /* ------------- */ -void xml_out_frame_ppt(FILE *xmlout, j2k_tcp_t *tcp) { /* For tile-part header, not main (which uses PPM instead). */ +void xml_out_frame_ppt(FILE *xmlout, opj_tcp_t *tcp) { /* For tile-part header, not main (which uses PPM instead). */ /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ /* Use of PPM and PPT are mutually exclusive. */ /* Compare j2k_read_ppt() */ @@ -1824,7 +1820,7 @@ void xml_out_frame_plm(FILE* xmlout) { /* opt, main header only; can be used in /* ------------- */ -void xml_out_frame_plt(FILE* xmlout, j2k_tcp_t *tcp) { /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ +void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp) { /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Compare j2k_read_plt()... which doesn't retain anything! */ /* Tile-part header indents are 12 spaces */ @@ -1879,7 +1875,7 @@ void xml_out_frame_crg(FILE* xmlout) { /* NO-OP. CRG NOT SAVED IN DATA STRUCTUR /* ------------- */ /* Regrettably from a metadata point of view, j2k_read_com() skips over any comments in main header or tile-part-header */ -void xml_out_frame_com(FILE* xmlout, j2k_tcp_t *tcp) { /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ +void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp) { /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ /* Compare j2k_read_com()... which doesn't retain anything! */ #ifdef NOTYET char spaces[13] = " "; /* 12 spaces if tilepart*/ @@ -1948,8 +1944,8 @@ void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s) /* ------------- */ -void xml_out_frame_jp2h(FILE* xmlout, jp2_struct_t *jp2_struct) { /* JP2 Header */ -/* Compare jp2_read_jp2h(jp2_struct_t * jp2_struct) */ +void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) { /* JP2 Header */ +/* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */ int i; fprintf(xmlout, " \n"); @@ -2052,7 +2048,7 @@ void xml_out_frame_jp2h(FILE* xmlout, jp2_struct_t *jp2_struct) { /* JP2 Header #ifdef NOTYET IMAGE these use cp structure, extended... but we could use a new data structure instead -void xml_out_frame_jp2i(FILE* xmlout, j2k_cp_t *cp) { +void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp) { /* IntellectualProperty 'jp2i' (no restrictions on location) */ int i; IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data (array of chars), cp->cp2i_len (array of ints) @@ -2070,7 +2066,7 @@ void xml_out_frame_jp2i(FILE* xmlout, j2k_cp_t *cp) { } } -void xml_out_frame_xml(FILE* xmlout, j2k_cp_t *cp) { +void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp) { /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */ IMAGE cp->xml, cp->xml_count, cp->xml_data (array of chars) MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED. @@ -2089,7 +2085,7 @@ void xml_out_frame_xml(FILE* xmlout, j2k_cp_t *cp) { } } -void xml_out_frame_uuid(FILE* xmlout, j2k_cp_t *cp) { +void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp) { /* UUID 'uuid' (top level only) */ /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */ /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */ @@ -2119,7 +2115,7 @@ void xml_out_frame_uuid(FILE* xmlout, j2k_cp_t *cp) { } } -void xml_out_frame_uinf(FILE* xmlout, j2k_cp_t *cp) { +void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp) { /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */ /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */ @@ -2151,7 +2147,7 @@ void xml_out_frame_uinf(FILE* xmlout, j2k_cp_t *cp) { } IMAGE these use cp structure, extended... but we could use a new data structure instead -void xml_out_frame_unknown_type(FILE* xmlout, j2k_cp_t *cp) { +void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp) { /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions shall be acieved through the 'uuid' type." [This implies an unknown type would be an error, but then...] "Boxes not explicitly defined in this standard, diff --git a/mj2/MJ2_codec/meta_out.h b/mj2/meta_out.h similarity index 68% rename from mj2/MJ2_codec/meta_out.h rename to mj2/meta_out.h index bfe9d190..293316d1 100644 --- a/mj2/MJ2_codec/meta_out.h +++ b/mj2/meta_out.h @@ -9,5 +9,5 @@ void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d); -int xml_write_struct(FILE *file, FILE *xmlout, mj2_movie_t * movie, unsigned int sampleframe, char* stringDTD); +int xml_write_struct(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr); diff --git a/mj2/mj2.c b/mj2/mj2.c new file mode 100644 index 00000000..f4457950 --- /dev/null +++ b/mj2/mj2.c @@ -0,0 +1,2917 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" +#include "mj2.h" + +/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ +/*@{*/ + +/** @name Local static functions */ +/*@{*/ + +/** +Read box headers +@param cinfo Codec context info +@param cio Input stream +@param box +@return Returns true if successful, returns false otherwise +*/ +static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box); + +/* +* +* Read box headers +* +*/ + +int mj2_read_boxhdr(mj2_box_t * box, opj_cio_t *cio) +{ + box->init_pos = cio_tell(cio); + box->length = cio_read(cio, 4); + box->type = cio_read(cio, 4); + if (box->length == 1) { + if (cio_read(cio, 4) != 0) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Cannot handle box sizes higher than 2^32\n"); + return 1; + }; + box->length = cio_read(cio, 4); + if (box->length == 0) + box->length = cio_numbytesleft(cio) + 12; + } + else if (box->length == 0) { + box->length = cio_numbytesleft(cio) + 8; + } + return 0; +} + +/* +* +* Initialisation of a Standard Movie, given a simple movie structure defined by the user +* The movie will have one sample per chunk +* +* Arguments: opj_mj2_t * movie +* Several variables of "movie" must be defined in order to enable a correct execution of +* this function: +* - The number of tracks of each type (movie->num_vtk, movie->num_stk, movie->num_htk) +* - The memory for each must be allocated (movie->tk) +* - For each track: +* The track type (tk->track_type) +* The number of sample (tk->num_samples) +* The sample rate (tk->sample_rate) +* +*/ + +int mj2_init_stdmovie(opj_mj2_t * movie) +{ + int i; + unsigned int j; + time_t ltime; + + movie->brand = MJ2_MJ2; + movie->minversion = 0; + movie->num_cl = 2; + movie->cl = + (unsigned int *) malloc(movie->num_cl * sizeof(unsigned int)); + + movie->cl[0] = MJ2_MJ2; + movie->cl[1] = MJ2_MJ2S; + time(<ime); /* Time since 1/1/70 */ + movie->creation_time = (unsigned int) ltime + 2082844800; /* Seconds between 1/1/04 and 1/1/70 */ + movie->timescale = 1000; + + movie->rate = 1 << 16; /* Rate to play presentation (default = 0x00010000) */ + movie->volume = 1 << 8; /* Movie volume (default = 0x0100) */ + movie->trans_matrix[0] = 0x00010000; /* Transformation matrix for video */ + movie->trans_matrix[1] = 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ + movie->trans_matrix[2] = 0; + movie->trans_matrix[3] = 0; + movie->trans_matrix[4] = 0x00010000; + movie->trans_matrix[5] = 0; + movie->trans_matrix[6] = 0; + movie->trans_matrix[7] = 0; + movie->trans_matrix[8] = 0x40000000; + movie->next_tk_id = 1; + + for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { + mj2_tk_t *tk = &movie->tk[i]; + movie->next_tk_id++; + tk->jp2_struct.comps = NULL; + tk->jp2_struct.cl = NULL; + + if (tk->track_type == 0) { + if (tk->num_samples == 0) + return 1; + + tk->Dim[0] = 0; + tk->Dim[1] = 0; + + tk->timescale = 1000; /* Timescale = 1 ms */ + + tk->chunk[0].num_samples = 1; + tk->chunk[0].sample_descr_idx = 1; + + tk->same_sample_size = 0; + + tk->num_samplestochunk = 1; /* One sample per chunk */ + tk->sampletochunk = + (mj2_sampletochunk_t *) malloc(tk->num_samplestochunk * + sizeof(mj2_sampletochunk_t)); + tk->sampletochunk[0].first_chunk = 1; + tk->sampletochunk[0].samples_per_chunk = 1; + tk->sampletochunk[0].sample_descr_idx = 1; + + if (tk->sample_rate == 0) { + opj_event_msg(tk->cinfo, EVT_ERROR, + "Error while initializing MJ2 movie: Sample rate of track %d must be different from zero\n", + tk->track_ID); + return 1; + } + + for (j = 0; j < tk->num_samples; j++) { + tk->sample[j].sample_delta = tk->timescale / tk->sample_rate; + } + + tk->num_tts = 1; + tk->tts = (mj2_tts_t *) malloc(tk->num_tts * sizeof(mj2_tts_t)); + tk->tts[0].sample_count = tk->num_samples; + tk->tts[0].sample_delta = tk->timescale / tk->sample_rate; + + tk->horizresolution = 0x00480000; /* Horizontal resolution (typically 72) */ + tk->vertresolution = 0x00480000; /* Vertical resolution (typically 72) */ + tk->compressorname[0] = 0x0f4d6f74; /* Compressor Name[]: Motion JPEG2000 */ + tk->compressorname[1] = 0x696f6e20; + tk->compressorname[2] = 0x4a504547; + tk->compressorname[3] = 0x32303030; + tk->compressorname[4] = 0x00120000; + tk->compressorname[5] = 0; + tk->compressorname[6] = 0x00000042; + tk->compressorname[7] = 0x000000DC; + tk->num_url = 0; /* Number of URL */ + tk->num_urn = 0; /* Number of URN */ + tk->graphicsmode = 0; /* Graphicsmode */ + tk->opcolor[0] = 0; /* OpColor */ + tk->opcolor[1] = 0; /* OpColor */ + tk->opcolor[2] = 0; /* OpColor */ + tk->creation_time = movie->creation_time; /* Seconds between 1/1/04 and 1/1/70 */ + tk->language = 0; /* Language (undefined) */ + tk->layer = 0; + tk->volume = 1 << 8; /* Movie volume (default = 0x0100) */ + tk->trans_matrix[0] = 0x00010000; /* Transformation matrix for track */ + tk->trans_matrix[1] = 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ + tk->trans_matrix[2] = 0; + tk->trans_matrix[3] = 0; + tk->trans_matrix[4] = 0x00010000; + tk->trans_matrix[5] = 0; + tk->trans_matrix[6] = 0; + tk->trans_matrix[7] = 0; + tk->trans_matrix[8] = 0x40000000; + tk->fieldcount = 1; + tk->fieldorder = 0; + tk->or_fieldcount = 1; + tk->or_fieldorder = 0; + tk->num_br = 2; + tk->br = (unsigned int *) malloc(tk->num_br * sizeof(unsigned int)); + tk->br[0] = MJ2_JP2; + tk->br[1] = MJ2_J2P0; + tk->num_jp2x = 0; + tk->hsub = 2; /* 4:2:0 */ + tk->vsub = 2; /* 4:2:0 */ + tk->hoff = 0; + tk->voff = 0; + tk->visual_w = tk->w << 16; + tk->visual_h = tk->h << 16; + } + else { + tk->num_br = 0; + tk->jp2xdata = NULL; + } + } + return 0; +} + +/* +* Time To Sample box Decompact +* +*/ +void mj2_tts_decompact(mj2_tk_t * tk) +{ + int i, j; + tk->num_samples = 0; + for (i = 0; i < tk->num_tts; i++) { + tk->num_samples += tk->tts[i].sample_count; + } + + tk->sample = + (mj2_sample_t *) malloc(tk->num_samples * sizeof(mj2_sample_t)); + + for (i = 0; i < tk->num_tts; i++) { + for (j = 0; j < tk->tts[i].sample_count; j++) { + tk->sample[j].sample_delta = tk->tts[i].sample_delta; + } + } +} + +/* +* Sample To Chunk box Decompact +* +*/ +void mj2_stsc_decompact(mj2_tk_t * tk) +{ + int j, i; + unsigned int k; + int sampleno=0; + + if (tk->num_samplestochunk == 1) { + tk->num_chunks = + (unsigned int) ceil((double) tk->num_samples / + (double) tk->sampletochunk[0].samples_per_chunk); + tk->chunk = + (mj2_chunk_t *) malloc(tk->num_chunks * sizeof(mj2_chunk_t)); + for (k = 0; k < tk->num_chunks; k++) { + tk->chunk[k].num_samples = tk->sampletochunk[0].samples_per_chunk; + } + + } else { + tk->chunk = + (mj2_chunk_t *) malloc(tk->num_samples * sizeof(mj2_chunk_t)); + tk->num_chunks = 0; + for (i = 0; i < tk->num_samplestochunk -1 ; i++) { + for (j = tk->sampletochunk[i].first_chunk - 1; + j < tk->sampletochunk[i + 1].first_chunk - 1; j++) { + tk->chunk[j].num_samples = tk->sampletochunk[i].samples_per_chunk; + tk->num_chunks++; + sampleno += tk->chunk[j].num_samples; + } + } + tk->num_chunks += (int)(tk->num_samples - sampleno) / tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; + for (k = tk->sampletochunk[tk->num_samplestochunk - 1].first_chunk - 1; + k < tk->num_chunks; k++) { + tk->chunk[k].num_samples = + tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; + } + tk->chunk = realloc(tk->chunk, tk->num_chunks * sizeof(mj2_chunk_t)); + } + +} + + +/* +* Chunk offset box Decompact +* +*/ +void mj2_stco_decompact(mj2_tk_t * tk) +{ + int j; + unsigned int i; + int k = 0; + int intra_chunk_offset; + + for (i = 0; i < tk->num_chunks; i++) { + intra_chunk_offset = 0; + for (j = 0; j < tk->chunk[i].num_samples; j++) { + tk->sample[k].offset = intra_chunk_offset + tk->chunk[i].offset; + intra_chunk_offset += tk->sample[k].sample_size; + k++; + } + } +} + +/* +* Write the JP box +* +* JP Signature box +* +*/ +void mj2_write_jp(opj_cio_t *cio) +{ + mj2_box_t box; + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + + cio_write(cio, MJ2_JP, 4); /* JP */ + cio_write(cio, 0x0d0a870a, 4); /* 0x0d0a870a required in a JP box */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the JP box +* +* JPEG 2000 signature +* +*/ +int mj2_read_jp(opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_JP != box.type) { /* Check Marker */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP Marker\n"); + return 1; + } + if (0x0d0a870a != cio_read(cio, 4)) { /* read the 0x0d0a870a required in a JP box */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Marker\n"); + return 1; + } + if (cio_tell(cio) - box.init_pos != box.length) { /* Check box length */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Box size \n"); + return 1; + } + return 0; + +} + +/* +* Write the FTYP box +* +* File type box +* +*/ +void mj2_write_ftyp(opj_mj2_t * movie, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + + cio_write(cio, MJ2_FTYP, 4); /* FTYP */ + cio_write(cio, movie->brand, 4); /* BR */ + cio_write(cio, movie->minversion, 4); /* MinV */ + + for (i = 0; i < movie->num_cl; i++) + cio_write(cio, movie->cl[i], 4); /* CL */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* Length */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the FTYP box +* +* File type box +* +*/ +int mj2_read_ftyp(opj_mj2_t * movie, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); /* Box Size */ + if (MJ2_FTYP != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FTYP Marker\n"); + return 1; + } + + movie->brand = cio_read(cio, 4); /* BR */ + movie->minversion = cio_read(cio, 4); /* MinV */ + movie->num_cl = (box.length - 16) / 4; + movie->cl = + (unsigned int *) malloc(movie->num_cl * sizeof(unsigned int)); + + for (i = movie->num_cl - 1; i > -1; i--) + movie->cl[i] = cio_read(cio, 4); /* CLi */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FTYP Box\n"); + return 1; + } + return 0; +} + + +/* +* Write the STCO box +* +* Chunk Offset Box +* +*/ +void mj2_write_stco(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + unsigned int i; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STCO, 4); /* STCO */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->num_chunks, 4); /* Entry Count */ + + for (i = 0; i < tk->num_chunks; i++) { + cio_write(cio, tk->chunk[i].offset, 4); /* Entry offset */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STCO box +* +* Chunk Offset Box +* +*/ +int mj2_read_stco(mj2_tk_t * tk, opj_cio_t *cio) +{ + unsigned int i; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); /* Box Size */ + if (MJ2_STCO != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STCO Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in STCO box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in STCO box. Expected flag 0\n"); + return 1; + } + + + if (cio_read(cio, 4) != tk->num_chunks) { + opj_event_msg(cio->cinfo, EVT_ERROR, + "Error in STCO box: expecting same amount of entry-count as chunks \n"); + } else { + for (i = 0; i < tk->num_chunks; i++) { + tk->chunk[i].offset = cio_read(cio, 4); /* Entry offset */ + } + } + + mj2_stco_decompact(tk); + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STCO Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the STSZ box +* +* Sample size box +* +*/ +void mj2_write_stsz(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + unsigned int i; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STSZ, 4); /* STSZ */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + if (tk->same_sample_size == 1) { /* If they all have the same size */ + cio_write(cio, tk->sample[0].sample_size, 4); /* Size */ + + cio_write(cio, 1, 4); /* Entry count = 1 */ + } + + else { + cio_write(cio, 0, 4); /* Sample Size = 0 becase they all have different sizes */ + + cio_write(cio, tk->num_samples, 4); /* Sample Count */ + + for (i = 0; i < tk->num_samples; i++) { + cio_write(cio, tk->sample[i].sample_size, 4); + } + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STSZ box +* +* Sample size box +* +*/ +int mj2_read_stsz(mj2_tk_t * tk, opj_cio_t *cio) +{ + int sample_size; + unsigned int i; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); /* Box Size */ + if (MJ2_STSZ != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSZ Marker\n"); + return 1; + } + + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in STSZ box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in STSZ box. Expected flag 0\n"); + return 1; + } + + sample_size = cio_read(cio, 4); + + if (sample_size != 0) { /* Samples do have the same size */ + tk->same_sample_size = 1; + for (i = 0; i < tk->num_samples; i++) { + tk->sample[i].sample_size = sample_size; + } + cio_skip(cio,4); /* Sample count = 1 */ + } else { + tk->same_sample_size = 0; + if (tk->num_samples != cio_read(cio, 4)) { /* Sample count */ + opj_event_msg(cio->cinfo, EVT_ERROR, + "Error in STSZ box. Expected that sample-count is number of samples in track\n"); + return 1; + } + for (i = 0; i < tk->num_samples; i++) { + tk->sample[i].sample_size = cio_read(cio, 4); /* Sample Size */ + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSZ Box size\n"); + return 1; + } + } + return 0; + +} + +/* +* Write the STSC box +* +* Sample to Chunk +* +*/ +void mj2_write_stsc(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STSC, 4); /* STSC */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->num_samplestochunk, 4); /* Entry Count */ + + for (i = 0; i < tk->num_samplestochunk; i++) { + cio_write(cio, tk->sampletochunk[i].first_chunk, 4); /* First Chunk */ + cio_write(cio, tk->sampletochunk[i].samples_per_chunk, 4); /* Samples per chunk */ + cio_write(cio, tk->sampletochunk[i].sample_descr_idx, 4); /* Samples description index */ + } + + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STSC box +* +* Sample to Chunk +* +*/ +int mj2_read_stsc(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); /* Box Size */ + if (MJ2_STSC != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSC Marker\n"); + return 1; + } + + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in STSC box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in STSC box. Expected flag 0\n"); + return 1; + } + + tk->num_samplestochunk = cio_read(cio, 4); + + tk->sampletochunk = + (mj2_sampletochunk_t *) malloc(tk->num_samplestochunk * + sizeof(mj2_sampletochunk_t)); + + + for (i = 0; i < tk->num_samplestochunk; i++) { + tk->sampletochunk[i].first_chunk = cio_read(cio, 4); + tk->sampletochunk[i].samples_per_chunk = cio_read(cio, 4); + tk->sampletochunk[i].sample_descr_idx = cio_read(cio, 4); + } + + mj2_stsc_decompact(tk); /* decompact sample to chunk box */ + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSC Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the STTS box +* +* Time to Sample Box +* +*/ +void mj2_write_stts(mj2_tk_t * tk, opj_cio_t *cio) +{ + + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STTS, 4); /* STTS */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->num_tts, 4); /* entry_count */ + for (i = 0; i < tk->num_tts; i++) { + cio_write(cio, tk->tts[i].sample_count, 4); /* Sample-count */ + cio_write(cio, tk->tts[i].sample_delta, 4); /* Sample-Delta */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STTS box +* +* +* +*/ +int mj2_read_stts(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_STTS != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STTS Marker\n"); + return 1; + } + + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in STTS box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in STTS box. Expected flag 0\n"); + return 1; + } + + tk->num_tts = cio_read(cio, 4); + + tk->tts = (mj2_tts_t *) malloc(tk->num_tts * sizeof(mj2_tts_t)); + + for (i = 0; i < tk->num_tts; i++) { + tk->tts[i].sample_count = cio_read(cio, 4); + tk->tts[i].sample_delta = cio_read(cio, 4); + } + + mj2_tts_decompact(tk); + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STTS Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the FIEL box +* +* Field coding Box +* +*/ +void mj2_write_fiel(mj2_tk_t * tk, opj_cio_t *cio) +{ + + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_FIEL, 4); /* STTS */ + + cio_write(cio, tk->fieldcount, 1); /* Field count */ + cio_write(cio, tk->fieldorder, 1); /* Field order */ + + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the FIEL box +* +* Field coding Box +* +*/ +int mj2_read_fiel(mj2_tk_t * tk, opj_cio_t *cio) +{ + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_FIEL != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FIEL Marker\n"); + return 1; + } + + + tk->fieldcount = cio_read(cio, 1); + tk->fieldorder = cio_read(cio, 1); + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FIEL Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the ORFO box +* +* Original Format Box +* +*/ +void mj2_write_orfo(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_ORFO, 4); + + cio_write(cio, tk->or_fieldcount, 1); /* Original Field count */ + cio_write(cio, tk->or_fieldorder, 1); /* Original Field order */ + + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the ORFO box +* +* Original Format Box +* +*/ +int mj2_read_orfo(mj2_tk_t * tk, opj_cio_t *cio) +{ + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_ORFO != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected ORFO Marker\n"); + return 1; + } + + + tk->or_fieldcount = cio_read(cio, 1); + tk->or_fieldorder = cio_read(cio, 1); + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with ORFO Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the JP2P box +* +* MJP2 Profile Box +* +*/ +void mj2_write_jp2p(mj2_tk_t * tk, opj_cio_t *cio) +{ + + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_JP2P, 4); + + cio_write(cio, 0, 4); /* Version 0, flags =0 */ + + for (i = 0; i < tk->num_br; i++) { + cio_write(cio, tk->br[i], 4); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the JP2P box +* +* MJP2 Profile Box +* +*/ +int mj2_read_jp2p(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_JP2P != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2P Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in JP2P box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in JP2P box. Expected flag 0\n"); + return 1; + } + + + tk->num_br = (box.length - 12) / 4; + tk->br = (unsigned int *) malloc(tk->num_br * sizeof(unsigned int)); + + for (i = 0; i < tk->num_br; i++) { + tk->br[i] = cio_read(cio, 4); + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2P Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the JP2X box +* +* MJP2 Prefix Box +* +*/ +void mj2_write_jp2x(mj2_tk_t * tk, opj_cio_t *cio) +{ + + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_JP2X, 4); + + for (i = 0; i < tk->num_jp2x; i++) { + cio_write(cio, tk->jp2xdata[i], 1); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the JP2X box +* +* MJP2 Prefix Box +* +*/ +int mj2_read_jp2x(mj2_tk_t * tk, opj_cio_t *cio) +{ + unsigned int i; + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_JP2X != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2X Marker\n"); + return 1; + } + + + tk->num_jp2x = (box.length - 8); + tk->jp2xdata = + (unsigned char *) malloc(tk->num_jp2x * sizeof(unsigned char)); + + for (i = 0; i < tk->num_jp2x; i++) { + tk->jp2xdata[i] = cio_read(cio, 1); + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2X Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the JSUB box +* +* MJP2 Subsampling Box +* +*/ +void mj2_write_jsub(mj2_tk_t * tk, opj_cio_t *cio) +{ + + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_JSUB, 4); + + cio_write(cio, tk->hsub, 1); + cio_write(cio, tk->vsub, 1); + cio_write(cio, tk->hoff, 1); + cio_write(cio, tk->voff, 1); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the JSUB box +* +* MJP2 Subsampling Box +* +*/ +int mj2_read_jsub(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_JSUB != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JSUB Marker\n"); + return 1; + } + + tk->hsub = cio_read(cio, 1); + tk->vsub = cio_read(cio, 1); + tk->hoff = cio_read(cio, 1);; + tk->voff = cio_read(cio, 1); + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JSUB Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the SMJ2 box +* +* Visual Sample Entry Description +* +*/ +void mj2_write_smj2(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MJ2, 4); /* MJ2 */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, 1, 4); + + cio_write(cio, 0, 2); /* Pre-defined */ + + cio_write(cio, 0, 2); /* Reserved */ + + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + + cio_write(cio, tk->w, 2); /* Width */ + cio_write(cio, tk->h, 2); /* Height */ + + cio_write(cio, tk->horizresolution, 4); /* Horizontal resolution */ + cio_write(cio, tk->vertresolution, 4); /* Vertical resolution */ + + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, 1, 2); /* Pre-defined = 1 */ + + cio_write(cio, tk->compressorname[0], 4); /* Compressor Name */ + cio_write(cio, tk->compressorname[1], 4); + cio_write(cio, tk->compressorname[2], 4); + cio_write(cio, tk->compressorname[3], 4); + cio_write(cio, tk->compressorname[4], 4); + cio_write(cio, tk->compressorname[5], 4); + cio_write(cio, tk->compressorname[6], 4); + cio_write(cio, tk->compressorname[7], 4); + + cio_write(cio, tk->depth, 2); /* Depth */ + + cio_write(cio, 0xffff, 2); /* Pre-defined = -1 */ + + jp2_write_jp2h(&tk->jp2_struct, cio); + + mj2_write_fiel(tk, cio); + + if (tk->num_br != 0) + mj2_write_jp2p(tk, cio); + if (tk->num_jp2x != 0) + mj2_write_jp2x(tk, cio); + + mj2_write_jsub(tk, cio); + mj2_write_orfo(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the SMJ2 box +* +* Visual Sample Entry Description +* +*/ +int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + mj2_box_t box2; + int i; + + mj2_read_boxhdr(&box, cio); + + if (MJ2_MJ2 != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error in SMJ2 box: Expected MJ2 Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in MJP2 box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in MJP2 box. Expected flag 0\n"); + return 1; + } + + cio_skip(cio,4); + + cio_skip(cio,2); /* Pre-defined */ + + cio_skip(cio,2); /* Reserved */ + + cio_skip(cio,4); /* Pre-defined */ + cio_skip(cio,4); /* Pre-defined */ + cio_skip(cio,4); /* Pre-defined */ + + tk->w = cio_read(cio, 2); /* Width */ + tk->h = cio_read(cio, 2); /* Height */ + + tk->horizresolution = cio_read(cio, 4); /* Horizontal resolution */ + tk->vertresolution = cio_read(cio, 4); /* Vertical resolution */ + + cio_skip(cio,4); /* Reserved */ + + cio_skip(cio,2); /* Pre-defined = 1 */ + + tk->compressorname[0] = cio_read(cio, 4); /* Compressor Name */ + tk->compressorname[1] = cio_read(cio, 4); + tk->compressorname[2] = cio_read(cio, 4); + tk->compressorname[3] = cio_read(cio, 4); + tk->compressorname[4] = cio_read(cio, 4); + tk->compressorname[5] = cio_read(cio, 4); + tk->compressorname[6] = cio_read(cio, 4); + tk->compressorname[7] = cio_read(cio, 4); + + tk->depth = cio_read(cio, 2); /* Depth */ + + /* Init std value */ + tk->num_jp2x = 0; + tk->fieldcount = 1; + tk->fieldorder = 0; + tk->or_fieldcount = 1; + tk->or_fieldorder = 0; + + cio_skip(cio,2); /* Pre-defined = -1 */ + + if (!jp2_read_jp2h(&tk->jp2_struct, cio)) { + opj_event_msg(tk->cinfo, EVT_ERROR, "Error reading JP2H Box\n"); + return 1; + } + + tk->jp2_struct.comps = (opj_jp2_comps_t *) malloc(tk->jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); + tk->jp2_struct.cl = (int *) malloc(sizeof(int)); + + tk->num_br = 0; + tk->num_jp2x = 0; + + for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) { + mj2_read_boxhdr(&box2, cio); + cio_seek(cio, box2.init_pos); + switch (box2.type) { + case MJ2_FIEL: + if (mj2_read_fiel(tk, cio)) + return 1; + break; + + case MJ2_JP2P: + if (mj2_read_jp2p(tk, cio)) + return 1; + break; + + case MJ2_JP2X: + if (mj2_read_jp2x(tk, cio)) + return 1; + break; + + case MJ2_JSUB: + if (mj2_read_jsub(tk, cio)) + return 1; + break; + + case MJ2_ORFO: + if (mj2_read_orfo(tk, cio)) + return 1; + break; + + default: + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MJP2 Box size\n"); + return 1; + break; + + } + } + return 0; +} + + +/* +* Write the STSD box +* +* Sample Description +* +*/ +void mj2_write_stsd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STSD, 4); /* STSD */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, 1, 4); /* entry_count = 1 (considering same JP2 headerboxes) */ + + if (tk->track_type == 0) { + mj2_write_smj2(tk, cio); + } else if (tk->track_type == 1) { + // Not implemented + } + if (tk->track_type == 2) { + // Not implemented + } + + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STSD box +* +* Sample Description +* +*/ +int mj2_read_stsd(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) +{ + int i; + int entry_count, len_2skip; + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + + if (MJ2_STSD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in STSD box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in STSD box. Expected flag 0\n"); + return 1; + } + + entry_count = cio_read(cio, 4); + + if (tk->track_type == 0) { + for (i = 0; i < entry_count; i++) { + if (mj2_read_smj2(img, tk, cio)) + return 1; + } + } else if (tk->track_type == 1) { + len_2skip = cio_read(cio, 4); // Not implemented -> skipping box + cio_skip(cio,len_2skip - 4); + } else if (tk->track_type == 2) { + len_2skip = cio_read(cio, 4); // Not implemented -> skipping box + cio_skip(cio,len_2skip - 4); + } + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the STBL box +* +* Sample table box box +* +*/ +void mj2_write_stbl(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_STBL, 4); /* STBL */ + + mj2_write_stsd(tk, cio); + mj2_write_stts(tk, cio); + mj2_write_stsc(tk, cio); + mj2_write_stsz(tk, cio); + mj2_write_stco(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the STBL box +* +* Sample table box box +* +*/ +int mj2_read_stbl(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_STBL != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STBL Marker\n"); + return 1; + } + + if (mj2_read_stsd(tk, img, cio)) + return 1; + if (mj2_read_stts(tk, cio)) + return 1; + if (mj2_read_stsc(tk, cio)) + return 1; + if (mj2_read_stsz(tk, cio)) + return 1; + if (mj2_read_stco(tk, cio)) + return 1; + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STBL Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the URL box +* +* URL box +* +*/ +void mj2_write_url(mj2_tk_t * tk, int url_num, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_URL, 4); /* URL */ + + if (url_num == 0) + cio_write(cio, 1, 4); /* Version = 0, flags = 1 because stored in same file */ + else { + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + cio_write(cio, tk->url[url_num - 1].location[0], 4); + cio_write(cio, tk->url[url_num - 1].location[1], 4); + cio_write(cio, tk->url[url_num - 1].location[2], 4); + cio_write(cio, tk->url[url_num - 1].location[3], 4); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the URL box +* +* URL box +* +*/ +int mj2_read_url(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_URL != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URL Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in URL box\n"); + return 1; + } + + if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */ + tk->url[urn_num].location[0] = cio_read(cio, 4); + tk->url[urn_num].location[1] = cio_read(cio, 4); + tk->url[urn_num].location[2] = cio_read(cio, 4); + tk->url[urn_num].location[3] = cio_read(cio, 4); + } else { + tk->num_url--; + } + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URL Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the URN box +* +* URN box +* +*/ +void mj2_write_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_URN, 4); /* URN */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->urn[urn_num].name[0], 4); + cio_write(cio, tk->urn[urn_num].name[1], 4); + cio_write(cio, tk->urn[urn_num].name[2], 4); + cio_write(cio, tk->urn[urn_num].name[3], 4); + cio_write(cio, tk->urn[urn_num].location[0], 4); + cio_write(cio, tk->urn[urn_num].location[1], 4); + cio_write(cio, tk->urn[urn_num].location[2], 4); + cio_write(cio, tk->urn[urn_num].location[3], 4); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the URN box +* +* URN box +* +*/ +int mj2_read_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) +{ + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_URN != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URN Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in URN box\n"); + return 1; + } + + if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */ + tk->urn[urn_num].name[0] = cio_read(cio, 4); + tk->urn[urn_num].name[1] = cio_read(cio, 4); + tk->urn[urn_num].name[2] = cio_read(cio, 4); + tk->urn[urn_num].name[3] = cio_read(cio, 4); + tk->urn[urn_num].location[0] = cio_read(cio, 4); + tk->urn[urn_num].location[1] = cio_read(cio, 4); + tk->urn[urn_num].location[2] = cio_read(cio, 4); + tk->urn[urn_num].location[3] = cio_read(cio, 4); + } + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URN Box size\n"); + return 1; + } + return 0; +} + + +/* +* Write the DREF box +* +* Data reference box +* +*/ +void mj2_write_dref(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_DREF, 4); /* DREF */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + if (tk->num_url + tk->num_urn == 0) { /* Media data in same file */ + cio_write(cio, 1, 4); /* entry_count = 1 */ + mj2_write_url(tk, 0, cio); + } else { + cio_write(cio, tk->num_url + tk->num_urn, 4); /* entry_count */ + + for (i = 0; i < tk->num_url; i++) + mj2_write_url(tk, i + 1, cio); + + for (i = 0; i < tk->num_urn; i++) + mj2_write_urn(tk, i, cio); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the DREF box +* +* Data reference box +* +*/ +int mj2_read_dref(mj2_tk_t * tk, opj_cio_t *cio) +{ + + int i; + int entry_count, marker; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_DREF != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DREF Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in DREF box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in DREF box. Expected flag 0\n"); + return 1; + } + + entry_count = cio_read(cio, 4); + tk->num_url = 0; + tk->num_urn = 0; + + for (i = 0; i < entry_count; i++) { + cio_skip(cio,4); + marker = cio_read(cio, 4); + if (marker == MJ2_URL) { + cio_skip(cio,-8); + tk->num_url++; + if (mj2_read_url(tk, tk->num_url, cio)) + return 1; + } else if (marker == MJ2_URN) { + cio_skip(cio,-8); + tk->num_urn++; + if (mj2_read_urn(tk, tk->num_urn, cio)) + return 1; + } else { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with in DREF box. Expected URN or URL box\n"); + return 1; + } + + } + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DREF Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the DINF box +* +* Data information box +* +*/ +void mj2_write_dinf(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_DINF, 4); /* DINF */ + + mj2_write_dref(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the DINF box +* +* Data information box +* +*/ +int mj2_read_dinf(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_DINF != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DINF Marker\n"); + return 1; + } + + if (mj2_read_dref(tk, cio)) + return 1; + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DINF Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the VMHD box +* +* Video Media information box +* +*/ +void mj2_write_vmhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_VMHD, 4); /* VMHD */ + + cio_write(cio, 1, 4); /* Version = 0, flags = 1 */ + + cio_write(cio, tk->graphicsmode, 2); + cio_write(cio, tk->opcolor[0], 2); + cio_write(cio, tk->opcolor[1], 2); + cio_write(cio, tk->opcolor[2], 2); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the VMHD box +* +* Video Media information box +* +*/ +int mj2_read_vmhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_VMHD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected VMHD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in VMHD box\n"); + return 1; + } + + if (1 != cio_read(cio, 3)) { /* Flags = 1 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in VMHD box. Expected flag 1\n"); + return 1; + } + + tk->track_type = 0; + tk->graphicsmode = cio_read(cio, 2); + tk->opcolor[0] = cio_read(cio, 2); + tk->opcolor[1] = cio_read(cio, 2); + tk->opcolor[2] = cio_read(cio, 2); + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with VMHD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the SMHD box +* +* Sound Media information box +* +*/ +void mj2_write_smhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_SMHD, 4); /* SMHD */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->balance, 2); + + cio_write(cio, 0, 2); /* Reserved */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the SMHD box +* +* Sound Media information box +* +*/ +int mj2_read_smhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_SMHD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected SMHD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in SMHD box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in SMHD box. Expected flag 0\n"); + return 1; + } + + tk->track_type = 1; + tk->balance = cio_read(cio, 2); + + /* Init variables to zero to avoid problems when freeeing memory + The values will possibly be overidded when decoding the track structure */ + tk->num_br = 0; + tk->num_url = 0; + tk->num_urn = 0; + tk->num_chunks = 0; + tk->num_tts = 0; + tk->num_samplestochunk = 0; + tk->num_samples = 0; + + cio_skip(cio,2); /* Reserved */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with SMHD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the HMHD box +* +* Hint Media information box +* +*/ +void mj2_write_hmhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_HMHD, 4); /* HMHD */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->maxPDUsize, 2); + cio_write(cio, tk->avgPDUsize, 2); + cio_write(cio, tk->maxbitrate, 4); + cio_write(cio, tk->avgbitrate, 4); + cio_write(cio, tk->slidingavgbitrate, 4); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the HMHD box +* +* Hint Media information box +* +*/ +int mj2_read_hmhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_HMHD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HMHD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in HMHD box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in HMHD box. Expected flag 0\n"); + return 1; + } + + tk->track_type = 2; + tk->maxPDUsize = cio_read(cio, 2); + tk->avgPDUsize = cio_read(cio, 2); + tk->maxbitrate = cio_read(cio, 4); + tk->avgbitrate = cio_read(cio, 4); + tk->slidingavgbitrate = cio_read(cio, 4); + + /* Init variables to zero to avoid problems when freeeing memory + The values will possibly be overidded when decoding the track structure */ + tk->num_br = 0; + tk->num_url = 0; + tk->num_urn = 0; + tk->num_chunks = 0; + tk->num_tts = 0; + tk->num_samplestochunk = 0; + tk->num_samples = 0; + + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HMHD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the MINF box +* +* Media information box +* +*/ +void mj2_write_minf(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MINF, 4); /* MINF */ + + if (tk->track_type == 0) { + mj2_write_vmhd(tk, cio); + } else if (tk->track_type == 1) { + mj2_write_smhd(tk, cio); + } else if (tk->track_type == 2) { + mj2_write_hmhd(tk, cio); + } + + mj2_write_dinf(tk, cio); + mj2_write_stbl(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the MINF box +* +* Media information box +* +*/ +int mj2_read_minf(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) +{ + + unsigned int box_type; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_MINF != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MINF Marker\n"); + return 1; + } + + cio_skip(cio,4); + box_type = cio_read(cio, 4); + cio_skip(cio,-8); + + if (box_type == MJ2_VMHD) { + if (mj2_read_vmhd(tk, cio)) + return 1; + } else if (box_type == MJ2_SMHD) { + if (mj2_read_smhd(tk, cio)) + return 1; + } else if (box_type == MJ2_HMHD) { + if (mj2_read_hmhd(tk, cio)) + return 1; + } else { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error in MINF box expected vmhd, smhd or hmhd\n"); + return 1; + } + + if (mj2_read_dinf(tk, cio)) + return 1; + + if (mj2_read_stbl(tk, img, cio)) + return 1; + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MINF Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the HDLR box +* +* Handler reference box +* +*/ +void mj2_write_hdlr(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_HDLR, 4); /* HDLR */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, 0, 4); /* Predefine */ + + tk->name = 0; /* The track name is immediately determined by the track type */ + + if (tk->track_type == 0) { + tk->handler_type = 0x76696465; /* Handler type: vide */ + cio_write(cio, tk->handler_type, 4); + + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, 0x76696465, 4); + cio_write(cio, 0x6F206d65, 4); + cio_write(cio, 0x64696120, 4); + cio_write(cio, 0x74726163, 4); + cio_write(cio, 0x6b00, 2); /* String: video media track */ + } else if (tk->track_type == 1) { + tk->handler_type = 0x736F756E; /* Handler type: soun */ + cio_write(cio, tk->handler_type, 4); + + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, 0x536F756E, 4); + cio_write(cio, 0x6400, 2); /* String: Sound */ + } else if (tk->track_type == 2) { + tk->handler_type = 0x68696E74; /* Handler type: hint */ + cio_write(cio, tk->handler_type, 4); + + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, 0x48696E74, 4); + cio_write(cio, 0, 2); /* String: Hint */ + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the HDLR box +* +* Handler reference box +* +*/ +int mj2_read_hdlr(mj2_tk_t * tk, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_HDLR != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HDLR Marker\n"); + return 1; + } + + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in HDLR box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in HDLR box. Expected flag 0\n"); + return 1; + } + + cio_skip(cio,4); /* Reserved */ + + tk->handler_type = cio_read(cio, 4); + cio_skip(cio,12); /* Reserved */ + + tk->name_size = box.length - 32; + + tk->name = (char *) malloc(tk->name_size * sizeof(char)); + for (i = 0; i < tk->name_size; i++) { + tk->name[i] = cio_read(cio, 1); /* Name */ + } + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HDLR Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the MDHD box +* +* Media Header Box +* +*/ +void mj2_write_mdhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + unsigned int i; + time_t ltime; + unsigned int modification_time; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MDHD, 4); /* MDHD */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + cio_write(cio, tk->creation_time, 4); /* Creation Time */ + + time(<ime); /* Time since 1/1/70 */ + modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ + + cio_write(cio, modification_time, 4); /* Modification Time */ + + cio_write(cio, tk->timescale, 4); /* Timescale */ + + tk->duration = 0; + + for (i = 0; i < tk->num_samples; i++) + tk->duration += tk->sample[i].sample_delta; + + cio_write(cio, tk->duration, 4); /* Duration */ + + cio_write(cio, tk->language, 2); /* Language */ + + cio_write(cio, 0, 2); /* Predefined */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the MDHD box +* +* Media Header Box +* +*/ +int mj2_read_mdhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (!(MJ2_MHDR == box.type || MJ2_MDHD == box.type)) { // Kakadu writes MHDR instead of MDHD + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDHD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in MDHD box\n"); + return 1; + } + + if (0 != cio_read(cio, 3)) { /* Flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with flag in MDHD box. Expected flag 0\n"); + return 1; + } + + + tk->creation_time = cio_read(cio, 4); /* Creation Time */ + + tk->modification_time = cio_read(cio, 4); /* Modification Time */ + + tk->timescale = cio_read(cio, 4); /* Timescale */ + + tk->duration = cio_read(cio, 4); /* Duration */ + + tk->language = cio_read(cio, 2); /* Language */ + + cio_skip(cio,2); /* Predefined */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDHD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the MDIA box +* +* Media box +* +*/ +void mj2_write_mdia(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MDIA, 4); /* MDIA */ + + mj2_write_mdhd(tk, cio); + mj2_write_hdlr(tk, cio); + mj2_write_minf(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the MDIA box +* +* Media box +* +*/ +int mj2_read_mdia(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_MDIA != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDIA Marker\n"); + return 1; + } + + if (mj2_read_mdhd(tk, cio)) + return 1; + if (mj2_read_hdlr(tk, cio)) + return 1; + if (mj2_read_minf(tk, img, cio)) + return 1; + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDIA Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the TKHD box +* +* Track Header box +* +*/ +void mj2_write_tkhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + unsigned int i; + time_t ltime; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + + cio_write(cio, MJ2_TKHD, 4); /* TKHD */ + + cio_write(cio, 3, 4); /* Version=0, flags=3 */ + + time(<ime); /* Time since 1/1/70 */ + tk->modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ + + cio_write(cio, tk->creation_time, 4); /* Creation Time */ + + cio_write(cio, tk->modification_time, 4); /* Modification Time */ + + cio_write(cio, tk->track_ID, 4); /* Track ID */ + + cio_write(cio, 0, 4); /* Reserved */ + + tk->duration = 0; + + for (i = 0; i < tk->num_samples; i++) + tk->duration += tk->sample[i].sample_delta; + + cio_write(cio, tk->duration, 4); /* Duration */ + + cio_write(cio, 0, 4); /* Reserved */ + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, tk->layer, 2); /* Layer */ + + cio_write(cio, 0, 2); /* Predefined */ + + cio_write(cio, tk->volume, 2); /* Volume */ + + cio_write(cio, 0, 2); /* Reserved */ + + cio_write(cio, tk->trans_matrix[0], 4); /* Transformation matrix for track */ + cio_write(cio, tk->trans_matrix[1], 4); + cio_write(cio, tk->trans_matrix[2], 4); + cio_write(cio, tk->trans_matrix[3], 4); + cio_write(cio, tk->trans_matrix[4], 4); + cio_write(cio, tk->trans_matrix[5], 4); + cio_write(cio, tk->trans_matrix[6], 4); + cio_write(cio, tk->trans_matrix[7], 4); + cio_write(cio, tk->trans_matrix[8], 4); + + cio_write(cio, tk->visual_w, 4); /* Video Visual Width */ + + cio_write(cio, tk->visual_h, 4); /* Video Visual Height */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the TKHD box +* +* Track Header box +* +*/ +int mj2_read_tkhd(mj2_tk_t * tk, opj_cio_t *cio) +{ + int flag; + + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + + if (MJ2_TKHD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TKHD Marker\n"); + return 1; + } + + if (0 != cio_read(cio, 1)) { /* Version = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in TKHD box\n"); + return 1; + } + + flag = cio_read(cio, 3); + + if (!(flag == 1 || flag == 2 || flag == 3 || flag == 4)) { /* Flags = 1,2,3 or 4 */ + opj_event_msg(cio->cinfo, EVT_ERROR, + "Error with flag in TKHD box: Expected flag 1,2,3 or 4\n"); + return 1; + } + + tk->creation_time = cio_read(cio, 4); /* Creation Time */ + + tk->modification_time = cio_read(cio, 4); /* Modification Time */ + + tk->track_ID = cio_read(cio, 4); /* Track ID */ + + cio_skip(cio,4); /* Reserved */ + + tk->duration = cio_read(cio, 4); /* Duration */ + + cio_skip(cio,8); /* Reserved */ + + tk->layer = cio_read(cio, 2); /* Layer */ + + cio_read(cio, 2); /* Predefined */ + + tk->volume = cio_read(cio, 2); /* Volume */ + + cio_skip(cio,2); /* Reserved */ + + tk->trans_matrix[0] = cio_read(cio, 4); /* Transformation matrix for track */ + tk->trans_matrix[1] = cio_read(cio, 4); + tk->trans_matrix[2] = cio_read(cio, 4); + tk->trans_matrix[3] = cio_read(cio, 4); + tk->trans_matrix[4] = cio_read(cio, 4); + tk->trans_matrix[5] = cio_read(cio, 4); + tk->trans_matrix[6] = cio_read(cio, 4); + tk->trans_matrix[7] = cio_read(cio, 4); + tk->trans_matrix[8] = cio_read(cio, 4); + + tk->visual_w = cio_read(cio, 4); /* Video Visual Width */ + + tk->visual_h = cio_read(cio, 4); /* Video Visual Height */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TKHD Box size\n"); + return 1; + } + return 0; +} + +/* +* Write the TRAK box +* +* Track box +* +*/ +void mj2_write_trak(mj2_tk_t * tk, opj_cio_t *cio) +{ + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + + cio_write(cio, MJ2_TRAK, 4); /* TRAK */ + + mj2_write_tkhd(tk, cio); + mj2_write_mdia(tk, cio); + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the TRAK box +* +* Track box +* +*/ +int mj2_read_trak(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_TRAK != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TRAK Marker\n"); + return 1; + } + if (mj2_read_tkhd(tk, cio)) + return 1; + if (mj2_read_mdia(tk, img, cio)) + return 1; + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TRAK Box\n"); + return 1; + } + return 0; +} + +/* +* Write the MVHD box +* +* Movie header Box +* +*/ +void mj2_write_mvhd(opj_mj2_t * movie, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + unsigned j; + time_t ltime; + int max_tk_num = 0; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MVHD, 4); /* MVHD */ + + cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ + + time(<ime); /* Time since 1/1/70 */ + movie->modification_time = ltime + 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ + + cio_write(cio, movie->creation_time, 4); /* Creation Time */ + + cio_write(cio, movie->modification_time, 4); /* Modification Time */ + + cio_write(cio, movie->timescale, 4); /* Timescale */ + + movie->duration = 0; + + for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { + mj2_tk_t *tk = &movie->tk[i]; + + for (j = 0; j < tk->num_samples; j++) { + movie->duration += tk->sample[j].sample_delta; + } + } + + cio_write(cio, movie->duration, 4); + + cio_write(cio, movie->rate, 4); /* Rate to play presentation */ + + cio_write(cio, movie->volume, 2); /* Volume */ + + cio_write(cio, 0, 2); /* Reserved */ + cio_write(cio, 0, 4); /* Reserved */ + cio_write(cio, 0, 4); /* Reserved */ + + cio_write(cio, movie->trans_matrix[0], 4); /* Transformation matrix for video */ + cio_write(cio, movie->trans_matrix[1], 4); + cio_write(cio, movie->trans_matrix[2], 4); + cio_write(cio, movie->trans_matrix[3], 4); + cio_write(cio, movie->trans_matrix[4], 4); + cio_write(cio, movie->trans_matrix[5], 4); + cio_write(cio, movie->trans_matrix[6], 4); + cio_write(cio, movie->trans_matrix[7], 4); + cio_write(cio, movie->trans_matrix[8], 4); + + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + cio_write(cio, 0, 4); /* Pre-defined */ + + + for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { + if (max_tk_num < movie->tk[i].track_ID) + max_tk_num = movie->tk[i].track_ID; + } + + movie->next_tk_id = max_tk_num + 1; + + cio_write(cio, movie->next_tk_id, 4); /* ID of Next track to be added */ + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the MVHD box +* +* Movie header Box +* +*/ +int mj2_read_mvhd(opj_mj2_t * movie, opj_cio_t *cio) +{ + mj2_box_t box; + + mj2_read_boxhdr(&box, cio); + if (MJ2_MVHD != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MVHD Marker\n"); + return 1; + } + + + if (0 != cio_read(cio, 4)) { /* Version = 0, flags = 0 */ + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Only Version 0 handled in MVHD box\n"); + } + + movie->creation_time = cio_read(cio, 4); /* Creation Time */ + + movie->modification_time = cio_read(cio, 4); /* Modification Time */ + + movie->timescale = cio_read(cio, 4); /* Timescale */ + + movie->duration = cio_read(cio, 4); /* Duration */ + + movie->rate = cio_read(cio, 4); /* Rate to play presentation */ + + movie->volume = cio_read(cio, 2); /* Volume */ + + cio_skip(cio,10); /* Reserved */ + + movie->trans_matrix[0] = cio_read(cio, 4); /* Transformation matrix for video */ + movie->trans_matrix[1] = cio_read(cio, 4); + movie->trans_matrix[2] = cio_read(cio, 4); + movie->trans_matrix[3] = cio_read(cio, 4); + movie->trans_matrix[4] = cio_read(cio, 4); + movie->trans_matrix[5] = cio_read(cio, 4); + movie->trans_matrix[6] = cio_read(cio, 4); + movie->trans_matrix[7] = cio_read(cio, 4); + movie->trans_matrix[8] = cio_read(cio, 4); + + cio_skip(cio,24); /* Pre-defined */ + + movie->next_tk_id = cio_read(cio, 4); /* ID of Next track to be added */ + + if (cio_tell(cio) - box.init_pos != box.length) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MVHD Box Size\n"); + return 1; + } + return 0; +} + + +/* +* Write the MOOV box +* +* Movie Box +* +*/ +void mj2_write_moov(opj_mj2_t * movie, opj_cio_t *cio) +{ + int i; + mj2_box_t box; + + box.init_pos = cio_tell(cio); + cio_skip(cio,4); + cio_write(cio, MJ2_MOOV, 4); /* MOOV */ + + mj2_write_mvhd(movie, cio); + + for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { + mj2_write_trak(&movie->tk[i], cio); + } + + box.length = cio_tell(cio) - box.init_pos; + cio_seek(cio, box.init_pos); + cio_write(cio, box.length, 4); /* L */ + cio_seek(cio, box.init_pos + box.length); +} + +/* +* Read the MOOV box +* +* Movie Box +* +*/ +int mj2_read_moov(opj_mj2_t * movie, opj_image_t * img, opj_cio_t *cio) +{ + unsigned int i; + mj2_box_t box; + mj2_box_t box2; + + mj2_read_boxhdr(&box, cio); + if (MJ2_MOOV != box.type) { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MOOV Marker\n"); + return 1; + } + + if (mj2_read_mvhd(movie, cio)) + return 1; + + movie->tk = + (mj2_tk_t *) malloc((movie->next_tk_id - 1) * sizeof(mj2_tk_t)); + + for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) { + mj2_tk_t *tk = &movie->tk[i]; + tk->cinfo = movie->cinfo; + mj2_read_boxhdr(&box2, cio); + if (box2.type == MJ2_TRAK) { + cio_seek(cio, box2.init_pos); + if (mj2_read_trak(tk, img, cio)) + return 1; + + if (tk->track_type == 0) { + movie->num_vtk++; + } else if (tk->track_type == 1) { + movie->num_stk++; + } else if (tk->track_type == 2) { + movie->num_htk++; + } + } else if (box2.type == MJ2_MVEX) { + cio_seek(cio, box2.init_pos); + cio_skip(cio,box2.length); + i--; + } else { + opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MOOV Box: Expected TRAK or MVEX box\n"); + return 1; + } + } + return 0; +} + +int mj2_read_struct(FILE *file, opj_mj2_t *movie) { + mj2_box_t box; + opj_image_t img; + char * src; + int fsresult; + int foffset; + opj_cio_t *cio; + + /* open a byte stream for reading */ + src = (char*) malloc (300 * sizeof(char)); + + /* Assuming that jp and ftyp markers size do + not exceed 300 bytes */ + fread(src,300,1, file); + + cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300); + + if (mj2_read_jp(cio)) + return 1; + if (mj2_read_ftyp(movie, cio)) + return 1; + + fsresult = fseek(file,cio_tell(cio),SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read data after FTYP box\n" ); + return 1; + } + + foffset = cio_tell(cio); + + box.type = 0; + + fread(src,30,1,file); + cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300); + mj2_read_boxhdr(&box, cio); + + while(box.type != MJ2_MOOV) { + + switch(box.type) + { + case MJ2_MDAT: + fsresult = fseek(file,foffset+box.length,SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read MDAT box\n" ); + return 1; + } + foffset += box.length; + break; + + case MJ2_MOOF: + fsresult = fseek(file,foffset+box.length,SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read MOOF box\n" ); + return 1; + } + foffset += box.length; + break; + case MJ2_FREE: + fsresult = fseek(file,foffset+box.length,SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read FREE box\n" ); + return 1; + } + foffset += box.length; + break; + case MJ2_SKIP: + fsresult = fseek(file,foffset+box.length,SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read SKIP box\n" ); + return 1; + } + foffset += box.length; + break; + default: + opj_event_msg(cio->cinfo, EVT_ERROR, "Unknown box in MJ2 stream\n"); + fsresult = fseek(file,foffset+box.length,SEEK_SET); + if( fsresult ) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read end of unknown box\n"); + return 1; + } + foffset += box.length; + break; + } + fsresult = fread(src,8,1,file); + if (fsresult != 1) { + opj_event_msg(cio->cinfo, EVT_ERROR, "MOOV box not found in file\n"); + return 1; + } + cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 8); + mj2_read_boxhdr(&box, cio); + } + + fseek(file,foffset,SEEK_SET); + src = realloc(src,box.length); + fsresult = fread(src,box.length,1,file); + if (fsresult != 1) { + opj_event_msg(cio->cinfo, EVT_ERROR, "End of file reached while trying to read MOOV box\n"); + return 1; + } + + cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, box.length); + + if (mj2_read_moov(movie, &img, cio)) + return 1; + + free(src); + return 0; +} + +/* ----------------------------------------------------------------------- */ +/* MJ2 decoder interface */ +/* ----------------------------------------------------------------------- */ + +opj_dinfo_t* mj2_create_decompress() { + opj_mj2_t* mj2; + opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t)); + if(!dinfo) return NULL; + + dinfo->is_decompressor = true; + + mj2 = (opj_mj2_t*)opj_malloc(sizeof(opj_mj2_t)); + dinfo->mj2_handle = mj2; + if(mj2) { + mj2->cinfo = (opj_common_ptr)dinfo; + } + mj2->j2k = j2k_create_decompress((opj_common_ptr)dinfo); + dinfo->j2k_handle = mj2->j2k; + + return dinfo; +} + +void mj2_setup_decoder(opj_mj2_t *movie, mj2_dparameters_t *mj2_parameters) { + movie->num_vtk=0; + movie->num_stk=0; + movie->num_htk=0; + /* setup the J2K decoder parameters */ + j2k_setup_decoder(movie->cinfo->j2k_handle, &mj2_parameters->j2k_parameters); +} + +void mj2_destroy_decompress(opj_mj2_t *movie) { + if(movie) { + int i; + mj2_tk_t *tk=NULL; + + if (movie->cinfo->j2k_handle) { + j2k_destroy_compress(movie->j2k); + } + + if (movie->num_cl != 0) + opj_free(movie->cl); + + for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) { + tk = &movie->tk[i]; + if (tk->name_size != 0) + opj_free(tk->name); + if (tk->track_type == 0) {// Video track + if (tk->jp2_struct.comps != 0) + opj_free(tk->jp2_struct.comps); + if (tk->jp2_struct.cl != 0) + opj_free(tk->jp2_struct.cl); + if (tk->num_jp2x != 0) + opj_free(tk->jp2xdata); + + } + if (tk->num_url != 0) + opj_free(tk->url); + if (tk->num_urn != 0) + opj_free(tk->urn); + if (tk->num_br != 0) + opj_free(tk->br); + if (tk->num_tts != 0) + opj_free(tk->tts); + if (tk->num_chunks != 0) + opj_free(tk->chunk); + if (tk->num_samplestochunk != 0) + opj_free(tk->sampletochunk); + if (tk->num_samples != 0) + opj_free(tk->sample); + } + + opj_free(movie->tk); + } + opj_free(movie); +} + +/* ----------------------------------------------------------------------- */ +/* MJ2 encoder interface */ +/* ----------------------------------------------------------------------- */ + + +opj_cinfo_t* mj2_create_compress() { + opj_mj2_t* mj2; + opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t)); + if(!cinfo) return NULL; + + mj2 = (opj_mj2_t*)opj_malloc(sizeof(opj_mj2_t)); + cinfo->mj2_handle = mj2; + if(mj2) { + mj2->cinfo = (opj_common_ptr)cinfo; + } + + mj2->j2k = j2k_create_compress(mj2->cinfo); + cinfo->j2k_handle = mj2->j2k; + + return cinfo; +} + +void mj2_setup_encoder(opj_mj2_t *movie, mj2_cparameters_t *parameters) { + if(movie && parameters) { + opj_jp2_t *jp2_struct; + + movie->num_htk = 0; // No hint tracks + movie->num_stk = 0; // No sound tracks + movie->num_vtk = 1; // One video track + + movie->brand = MJ2_MJ2; // One brand: MJ2 + movie->num_cl = 2; // Two compatible brands: MJ2 and MJ2S + movie->cl = (unsigned int *) malloc(movie->num_cl * sizeof(unsigned int)); + movie->cl[0] = MJ2_MJ2; + movie->cl[1] = MJ2_MJ2S; + movie->minversion = 0; // Minimum version: 0 + + movie->tk = (mj2_tk_t*) malloc (sizeof(mj2_tk_t)); //Memory allocation for the video track + movie->tk[0].sample = (mj2_sample_t*) malloc (sizeof(mj2_sample_t)); + movie->tk[0].chunk = (mj2_chunk_t *) malloc(sizeof(mj2_chunk_t)); + movie->tk[0].track_type = 0; // Video track + movie->tk[0].track_ID = 1; // Track ID = 1 + movie->tk[0].Dim[0] = parameters->Dim[0]; + movie->tk[0].Dim[1] = parameters->Dim[1]; + movie->tk[0].w = parameters->w; + movie->tk[0].h = parameters->h; + movie->tk[0].CbCr_subsampling_dx = parameters->CbCr_subsampling_dx; + movie->tk[0].CbCr_subsampling_dy = parameters->CbCr_subsampling_dy; + movie->tk[0].sample_rate = parameters->frame_rate; + + jp2_struct = &movie->tk[0].jp2_struct; + jp2_struct->numcomps = 3; // NC + jp2_struct->comps = + (opj_jp2_comps_t *) malloc(jp2_struct->numcomps * sizeof(opj_jp2_comps_t)); + jp2_struct->precedence = 0; /* PRECEDENCE*/ + jp2_struct->approx = 0; /* APPROX*/ + jp2_struct->brand = JP2_JP2; /* BR */ + jp2_struct->minversion = 0; /* MinV */ + jp2_struct->numcl = 1; + jp2_struct->cl = (unsigned int *) malloc(jp2_struct->numcl * sizeof(int)); + jp2_struct->cl[0] = JP2_JP2; /* CL0 : JP2 */ + jp2_struct->C = 7; /* C : Always 7*/ + jp2_struct->UnkC = 0; /* UnkC, colorspace specified in colr box*/ + jp2_struct->IPR = 0; /* IPR, no intellectual property*/ + jp2_struct->w = parameters->w; + jp2_struct->h = parameters->h; + jp2_struct->bpc = 7; + jp2_struct->meth = 1; + jp2_struct->enumcs = 18; // YUV + } +} + +void mj2_destroy_compress(opj_mj2_t *movie) { + if(movie) { + int i; + mj2_tk_t *tk=NULL; + + if (movie->cinfo->j2k_handle) { + j2k_destroy_compress(movie->j2k); + } + + if (movie->num_cl != 0) + opj_free(movie->cl); + + for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) { + tk = &movie->tk[i]; + if (tk->name_size != 0) + opj_free(tk->name); + if (tk->track_type == 0) {// Video track + if (tk->jp2_struct.comps != 0) + opj_free(tk->jp2_struct.comps); + if (tk->jp2_struct.cl != 0) + opj_free(tk->jp2_struct.cl); + if (tk->num_jp2x != 0) + opj_free(tk->jp2xdata); + + } + if (tk->num_url != 0) + opj_free(tk->url); + if (tk->num_urn != 0) + opj_free(tk->urn); + if (tk->num_br != 0) + opj_free(tk->br); + if (tk->num_tts != 0) + opj_free(tk->tts); + if (tk->num_chunks != 0) + opj_free(tk->chunk); + if (tk->num_samplestochunk != 0) + opj_free(tk->sampletochunk); + if (tk->num_samples != 0) + opj_free(tk->sample); + } + + opj_free(movie->tk); + } + opj_free(movie); +} diff --git a/mj2/mj2.h b/mj2/mj2.h new file mode 100644 index 00000000..3eee7148 --- /dev/null +++ b/mj2/mj2.h @@ -0,0 +1,391 @@ +/* +* Copyright (c) 2003-2004, François-Olivier Devaux +* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium +* All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MJ2_H +#define __MJ2_H +/** +@file mj2.h +@brief The Motion JPEG 2000 file format Reader/Writer (MJ22) + +*/ + +/** @defgroup MJ2 MJ2 - Motion JPEG 2000 file format reader/writer */ +/*@{*/ + +#define MJ2_JP 0x6a502020 +#define MJ2_FTYP 0x66747970 +#define MJ2_MJ2 0x6d6a7032 +#define MJ2_MJ2S 0x6d6a3273 +#define MJ2_MDAT 0x6d646174 +#define MJ2_MOOV 0x6d6f6f76 +#define MJ2_MVHD 0x6d766864 +#define MJ2_TRAK 0x7472616b +#define MJ2_TKHD 0x746b6864 +#define MJ2_MDIA 0x6d646961 +#define MJ2_MDHD 0x6d646864 +#define MJ2_MHDR 0x6d686472 +#define MJ2_HDLR 0x68646C72 +#define MJ2_MINF 0x6d696e66 +#define MJ2_VMHD 0x766d6864 +#define MJ2_SMHD 0x736d6864 +#define MJ2_HMHD 0x686d6864 +#define MJ2_DINF 0x64696e66 +#define MJ2_DREF 0x64726566 +#define MJ2_URL 0x75726c20 +#define MJ2_URN 0x75726e20 +#define MJ2_STBL 0x7374626c +#define MJ2_STSD 0x73747364 +#define MJ2_STTS 0x73747473 +#define MJ2_STSC 0x73747363 +#define MJ2_STSZ 0x7374737a +#define MJ2_STCO 0x7374636f +#define MJ2_MOOF 0x6d6f6f66 +#define MJ2_FREE 0x66726565 +#define MJ2_SKIP 0x736b6970 +#define MJ2_JP2C 0x6a703263 +#define MJ2_FIEL 0x6669656c +#define MJ2_JP2P 0x6a703270 +#define MJ2_JP2X 0x6a703278 +#define MJ2_JSUB 0x6a737562 +#define MJ2_ORFO 0x6f72666f +#define MJ2_MVEX 0x6d766578 +#define MJ2_JP2 0x6a703220 +#define MJ2_J2P0 0x4a325030 + +/** +Decompressed format used in parameters +YUV = 0 +*/ +#define YUV_DFMT 0 + +/** +Compressed format used in parameters +MJ2 = 0 +*/ +#define MJ2_CFMT 0 + + +/* ----------------------------------------------------------------------- */ + +/** +Time To Sample +*/ +typedef struct mj2_tts { + int sample_count; + int sample_delta; +} mj2_tts_t; + +/** +Chunk +*/ +typedef struct mj2_chunk { + int num_samples; + int sample_descr_idx; + int offset; +} mj2_chunk_t; + +/** +Sample to chunk +*/ +typedef struct mj2_sampletochunk { + int first_chunk; + int samples_per_chunk; + int sample_descr_idx; +} mj2_sampletochunk_t; + +/** +Sample +*/ +typedef struct mj2_sample { + unsigned int sample_size; + unsigned int offset; + unsigned int sample_delta; +} mj2_sample_t; + +/** +URL +*/ +typedef struct mj2_url { + int location[4]; +} mj2_url_t; + +/** +URN +*/ +typedef struct mj2_urn { + int name[2]; + int location[4]; +} mj2_urn_t; + +/** +Video Track Parameters +*/ +typedef struct mj2_tk { + /** codec context */ + opj_common_ptr cinfo; + int track_ID; + int track_type; + unsigned int creation_time; + unsigned int modification_time; + int duration; + int timescale; + int layer; + int volume; + int language; + int balance; + int maxPDUsize; + int avgPDUsize; + int maxbitrate; + int avgbitrate; + int slidingavgbitrate; + int graphicsmode; + int opcolor[3]; + int num_url; + mj2_url_t *url; + int num_urn; + mj2_urn_t *urn; + int Dim[2]; + int w; + int h; + int visual_w; + int visual_h; + int CbCr_subsampling_dx; + int CbCr_subsampling_dy; + int sample_rate; + int sample_description; + int horizresolution; + int vertresolution; + int compressorname[8]; + int depth; + unsigned char fieldcount; + unsigned char fieldorder; + unsigned char or_fieldcount; + unsigned char or_fieldorder; + int num_br; + unsigned int *br; + unsigned char num_jp2x; + unsigned char *jp2xdata; + unsigned char hsub; + unsigned char vsub; + unsigned char hoff; + unsigned char voff; + int trans_matrix[9]; + /** Number of samples */ + unsigned int num_samples; + int transorm; + int handler_type; + int name_size; + unsigned char same_sample_size; + int num_tts; + /** Time to sample */ + mj2_tts_t *tts; + unsigned int num_chunks; + mj2_chunk_t *chunk; + int num_samplestochunk; + mj2_sampletochunk_t *sampletochunk; + char *name; + opj_jp2_t jp2_struct; + /** Sample parameters */ + mj2_sample_t *sample; +} mj2_tk_t; + +/** +MJ2 box +*/ +typedef struct mj2_box { + int length; + int type; + int init_pos; +} mj2_box_t; + +/** +MJ2 Movie +*/ +typedef struct opj_mj2 { + /** codec context */ + opj_common_ptr cinfo; + /** handle to the J2K codec */ + opj_j2k_t *j2k; + unsigned int brand; + unsigned int minversion; + int num_cl; + unsigned int *cl; + unsigned int creation_time; + unsigned int modification_time; + int timescale; + unsigned int duration; + int rate; + int num_vtk; + int num_stk; + int num_htk; + int volume; + int trans_matrix[9]; + int next_tk_id; + /** Track Parameters */ + mj2_tk_t *tk; +} opj_mj2_t; + +/** +Decompression parameters +*/ +typedef struct mj2_dparameters { + /**@name command line encoder parameters (not used inside the library) */ + /*@{*/ + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** J2K decompression parameters */ + opj_dparameters_t j2k_parameters; +} mj2_dparameters_t; + +/** +Compression parameters +*/ +typedef struct mj2_cparameters { + /**@name command line encoder parameters (not used inside the library) */ + /*@{*/ + /** J2K compression parameters */ + opj_cparameters_t j2k_parameters; + /** input file name */ + char infile[OPJ_PATH_LEN]; + /** output file name */ + char outfile[OPJ_PATH_LEN]; + /** input file format 0:MJ2 */ + int decod_format; + /** output file format 0:YUV */ + int cod_format; + /** Portion of the image coded */ + int Dim[2]; + /** YUV Frame width */ + int w; + /** YUV Frame height */ + int h; + /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */ + int CbCr_subsampling_dx; + /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */ + int CbCr_subsampling_dy; + /* Video Frame Rate */ + int frame_rate; + /* In YUV files, numcomps always considered as 3 */ + int numcomps; + /* In YUV files, precision always considered as 8 */ + int prec; +} mj2_cparameters_t; + + +/** @name Exported functions */ +/*@{*/ +/* ----------------------------------------------------------------------- */ +/** +Write the JP box +*/ +void mj2_write_jp(opj_cio_t *cio); +/** +Write the FTYP box +@param movie MJ2 movie +@param cio Output buffer stream +*/ +void mj2_write_ftyp(opj_mj2_t *movie, opj_cio_t *cio); +/** +Creates an MJ2 decompression structure +@return Returns a handle to a MJ2 decompressor if successful, returns NULL otherwise +*/ +opj_dinfo_t* mj2_create_decompress(); +/** +Destroy a MJ2 decompressor handle +@param movie MJ2 decompressor handle to destroy +*/ +void mj2_destroy_decompress(opj_mj2_t *movie); +/** +Setup the decoder decoding parameters using user parameters. +Decoding parameters are returned in mj2->j2k->cp. +@param movie MJ2 decompressor handle +@param parameters decompression parameters +*/ +void mj2_setup_decoder(opj_mj2_t *movie, mj2_dparameters_t *mj2_parameters); +/** +Decode an image from a JPEG-2000 file stream +@param movie MJ2 decompressor handle +@param cio Input buffer stream +@return Returns a decoded image if successful, returns NULL otherwise +*/ +opj_image_t* mj2_decode(opj_mj2_t *movie, opj_cio_t *cio); +/** +Creates a MJ2 compression structure +@return Returns a handle to a MJ2 compressor if successful, returns NULL otherwise +*/ +opj_cinfo_t* mj2_create_compress(); +/** +Destroy a MJ2 compressor handle +@param movie MJ2 compressor handle to destroy +*/ +void mj2_destroy_compress(opj_mj2_t *movie); +/** +Setup the encoder parameters using the current image and using user parameters. +Coding parameters are returned in mj2->j2k->cp. +@param movie MJ2 compressor handle +@param parameters compression parameters +*/ +void mj2_setup_encoder(opj_mj2_t *movie, mj2_cparameters_t *parameters); +/** +Encode an image into a JPEG-2000 file stream +@param movie MJ2 compressor handle +@param cio Output buffer stream +@param image Image to encode +@param index Name of the index file if required, NULL otherwise +@return Returns true if successful, returns false otherwise +*/ +bool mj2_encode(opj_mj2_t *movie, opj_cio_t *cio, opj_image_t *image, char *index); + +/** +Init a Standard MJ2 movie +@param movie MJ2 Movie +@return Returns 0 if successful, returns 1 otherwise +*/ +int mj2_init_stdmovie(opj_mj2_t *movie); +/** +Read the structure of an MJ2 file +@param File MJ2 input File +@param movie J2 movie structure +@return Returns 0 if successful, returns 1 otherwise +*/ +int mj2_read_struct(FILE *file, opj_mj2_t *mj2); +/** +Write the the MOOV box to an output buffer stream +@param movie MJ2 movie structure +@param cio Output buffer stream +*/ +void mj2_write_moov(opj_mj2_t *movie, opj_cio_t *cio); + + +/* ----------------------------------------------------------------------- */ +/*@}*/ + +/*@}*/ + +#endif /* __MJ2_H */ diff --git a/mj2/MJ2_codec/mj2_convert.c b/mj2/mj2_convert.c similarity index 61% rename from mj2/MJ2_codec/mj2_convert.c rename to mj2/mj2_convert.c index 9a87de53..589087a4 100644 --- a/mj2/MJ2_codec/mj2_convert.c +++ b/mj2/mj2_convert.c @@ -1,13 +1,33 @@ -#include -#ifdef WIN32 -#include -#else -#include -#endif +/* +* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium +* Copyright (c) 2002-2007, Professor Benoit Macq +* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +#include "opj_includes.h" #include "mj2.h" -#include -#include /* ----------------------- */ /* */ @@ -17,27 +37,34 @@ /* */ /* ----------------------- */ -int yuv_num_frames(mj2_tk_t * tk, FILE *f) +int yuv_num_frames(mj2_tk_t * tk, char *infile) { int numimages, frame_size; long end_of_f; + FILE *f; + f = fopen(infile,"rb"); + if (!f) { + fprintf(stderr, "failed to open %s for reading\n",infile); + return 1; + } + frame_size = (int) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); /* Calculate frame size */ - + fseek(f, 0, SEEK_END); end_of_f = ftell(f); /* Calculate file size */ - + if (end_of_f < frame_size) { fprintf(stderr, - "YUV does not contains any frame of %d x %d size\n", tk->w, - tk->h); + "YUV does not contains any frame of %d x %d size\n", tk->w, + tk->h); return 0; } - + numimages = end_of_f / frame_size; /* Calculate number of images */ + fclose(f); return numimages; - fclose(f); } // ----------------------- @@ -47,97 +74,79 @@ int yuv_num_frames(mj2_tk_t * tk, FILE *f) // // ----------------------- -int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img, - int frame_num, int subsampling_dx, int subsampling_dy) +opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters) { - int i, j; + opj_image_cmptparm_t cmptparm[3]; + opj_image_t * img; + int i; + int numcomps = 3; + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + + /* initialize image components */ + memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); + for(i = 0; i < numcomps; i++) { + cmptparm[i].prec = 8; + cmptparm[i].bpp = 8; + cmptparm[i].sgnd = 0; + cmptparm[i].dx = i ? subsampling_dx * tk->CbCr_subsampling_dx : subsampling_dx; + cmptparm[i].dy = i ? subsampling_dy * tk->CbCr_subsampling_dy : subsampling_dy; + cmptparm[i].w = tk->w; + cmptparm[i].h = tk->h; + } + /* create the image */ + img = opj_image_create(numcomps, cmptparm, CLRSPC_SRGB); + return img; +} + +bool yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters_t *parameters, char* infile) +{ + int i, compno; int offset; long end_of_f, position; - FILE *Compo; + int numcomps = 3; + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + FILE *yuvfile; + + yuvfile = fopen(infile,"rb"); + if (!yuvfile) { + fprintf(stderr, "failed to open %s for reading\n",parameters->infile); + return false; + } - offset = - (int) ((double) (frame_num * tk->w * tk->h) * - (1.0 + - 1.0 * (double) 2 / (double) (tk->CbCr_subsampling_dx * - tk->CbCr_subsampling_dy))); + offset = (int) ((double) (frame_num * tk->w * tk->h) * (1.0 + + 1.0 * (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); fseek(yuvfile, 0, SEEK_END); end_of_f = ftell(yuvfile); fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET); position = ftell(yuvfile); if (position >= end_of_f) { fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n", - frame_num); - return 0; + frame_num); + fclose(yuvfile); + return false; } - + img->x0 = tk->Dim[0]; img->y0 = tk->Dim[1]; img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] + (tk->w - 1) * subsampling_dx + 1; img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] + (tk->h - 1) * subsampling_dy + 1; - img->numcomps = 3; - img->color_space = 3; - img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t)); - - for (i = 0; i < img->numcomps; i++) { - img->comps[i].data = (int *) malloc(sizeof(int) * tk->w * tk->h); - img->comps[i].prec = 8; - img->comps[i].bpp = 8; - img->comps[i].sgnd = 0; - if (i == 0) { - img->comps[i].dx = subsampling_dx; - img->comps[i].dy = subsampling_dy; - } else { - img->comps[i].dx = subsampling_dx * tk->CbCr_subsampling_dx; - img->comps[i].dy = subsampling_dy * tk->CbCr_subsampling_dy; - } - } - - Compo = fopen("Compo0", "wb"); - if (!Compo) { - fprintf(stderr, "Failed to open Compo0 for writing !\n"); - } - - for (i = 0; i < (tk->w * tk->h / (img->comps[0].dx * img->comps[0].dy)) - && !feof(yuvfile); i++) { - unsigned char y; - j = fread(&y, 1, 1, yuvfile); - fwrite(&y, 1, 1, Compo); - } - - fclose(Compo); - - Compo = fopen("Compo1", "wb"); - if (!Compo) { - fprintf(stderr, "Failed to open Compo1 for writing !\n"); - } - - - for (i = 0; i < (tk->w * tk->h / (img->comps[1].dx * img->comps[1].dy)) - && !feof(yuvfile); i++) { - unsigned char cb; - j = fread(&cb, sizeof(unsigned char), 1, yuvfile); - fwrite(&cb, 1, 1, Compo); - } - - fclose(Compo); - - Compo = fopen("Compo2", "wb"); - if (!Compo) { - fprintf(stderr, "Failed to open Compo2 for writing !\n"); - } - - - for (i = 0; i < (tk->w * tk->h / (img->comps[2].dx * img->comps[2].dy)) - && !feof(yuvfile); i++) { - unsigned char cr; - j = fread(&cr, sizeof(unsigned char), 1, yuvfile); - fwrite(&cr, 1, 1, Compo); - } - - fclose(Compo); - return 1; + + for(compno = 0; compno < numcomps; compno++) { + for (i = 0; i < (tk->w * tk->h / (img->comps[compno].dx * img->comps[compno].dy)) + && !feof(yuvfile); i++) { + if (!fread(&img->comps[compno].data[i], 1, 1, yuvfile)) { + fprintf(stderr, "Error reading %s file !!\n", infile); + return false; + } + } + } + fclose(yuvfile); + + return true; } @@ -150,7 +159,7 @@ int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img, // ----------------------- -int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile) +bool imagetoyuv(opj_image_t * img, char *outfile) { FILE *f; int i; @@ -159,19 +168,19 @@ int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile) if (img->comps[0].dx != img->comps[1].dx / 2 || img->comps[1].dx != img->comps[2].dx) { fprintf(stderr, - "Error with the input image components size: cannot create yuv file)\n"); - return 1; + "Error with the input image components size: cannot create yuv file)\n"); + return false; } } else if (!(img->numcomps == 1)) { fprintf(stderr, "Error with the number of image components(must be one or three)\n"); - return 1; + return false; } f = fopen(outfile, "a+b"); if (!f) { fprintf(stderr, "failed to open %s for writing\n", outfile); - return 1; + return false; } @@ -208,7 +217,7 @@ int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile) } } fclose(f); - return 0; + return true; } // ----------------------- @@ -218,7 +227,7 @@ int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile) // // ----------------------- -int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile) { +int imagetobmp(opj_image_t * img, char *outfile) { int w,wr,h,hr,i,pad; FILE *f; @@ -310,13 +319,13 @@ int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile) { fprintf(f, "%c%c%c", B, G, R); if ((i + 1) % wr == 0) { - for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */ - fprintf(f, "%c", 0); + for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */ + fprintf(f, "%c", 0); } } fclose(f); - free(img->comps[1].data); - free(img->comps[2].data); + opj_free(img->comps[1].data); + opj_free(img->comps[2].data); } return 0; } diff --git a/mj2/mj2_convert.h b/mj2/mj2_convert.h new file mode 100644 index 00000000..e5f1f601 --- /dev/null +++ b/mj2/mj2_convert.h @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2003-2004, François-Olivier Devaux +* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "mj2.h" + +#ifndef __MJ2_CONVERT_H +#define __MJ2_CONVERT_H + +int imagetoyuv(opj_image_t * img, char *outfile); + +int imagetobmp(opj_image_t * img, char *outfile); + +opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters); + +bool yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters_t *parameters, char* infile); + +int yuv_num_frames(mj2_tk_t * tk, char *infile); + + +#endif diff --git a/mj2/mj2_to_frames.c b/mj2/mj2_to_frames.c new file mode 100644 index 00000000..69357d31 --- /dev/null +++ b/mj2/mj2_to_frames.c @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2003-2004, François-Olivier Devaux +* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "opj_includes.h" +#include "mj2.h" +#include "mj2_convert.h" + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + + +int main(int argc, char *argv[]) { + mj2_dparameters_t mj2_parameters; /* decompression parameters */ + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + opj_cio_t *cio = NULL; + unsigned int tnum, snum; + opj_mj2_t *movie; + mj2_tk_t *track; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *file, *outfile; + char outfilename[50]; + opj_image_t *img = NULL; + unsigned int max_codstrm_size = 0; + double total_time = 0; + unsigned int numframes = 0; + + if (argc != 3) { + printf("Bad syntax: Usage: mj2_to_frames inputfile.mj2 outputfile.yuv\n"); + printf("Example: MJ2_decoder foreman.mj2 foreman.yuv\n"); + return 1; + } + + file = fopen(argv[1], "rb"); + + if (!file) { + fprintf(stderr, "failed to open %s for reading\n", argv[1]); + return 1; + } + + // Checking output file + outfile = fopen(argv[2], "w"); + if (!file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; + } + fclose(outfile); + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = NULL; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + movie = dinfo->mj2_handle; + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* set J2K decoding parameters to default values */ + opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters); + + /* setup the decoder decoding parameters using user parameters */ + mj2_setup_decoder(dinfo->mj2_handle, &mj2_parameters); + + if (mj2_read_struct(file, movie)) // Creating the movie structure + return 1; + + // Decode first video track + for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) { + if (movie->tk[tnum].track_type == 0) + break; + } + + if (movie->tk[tnum].track_type != 0) { + printf("Error. Movie does not contain any video track\n"); + return 1; + } + + track = &movie->tk[tnum]; + + // Output info on first video tracl + fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", + track->num_samples, track->w, track->h); + + max_codstrm_size = track->sample[0].sample_size-8; + frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char)); + + numframes = track->num_samples; + + for (snum=0; snum < numframes; snum++) + { + double init_time = opj_clock(); + double elapsed_time; + sample = &track->sample[snum]; + if (sample->sample_size-8 > max_codstrm_size) { + max_codstrm_size = sample->sample_size-8; + if ((frame_codestream = realloc(frame_codestream, max_codstrm_size)) == NULL) { + printf("Error reallocation memory\n"); + return 1; + }; + } + fseek(file,sample->offset+8,SEEK_SET); + fread(frame_codestream, sample->sample_size-8, 1, file); // Assuming that jp and ftyp markers size do + + /* open a byte stream */ + cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); + + img = opj_decode(dinfo, cio); // Decode J2K to image + + if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) + && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) + || (img->numcomps == 1)) { + + if (!imagetoyuv(img, argv[2])) // Convert image to YUV + return 1; + } + else if ((img->numcomps == 3) && + (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& + (img->comps[2].dx == 1))// If YUV 4:4:4 input --> to bmp + { + fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n"); + sprintf(outfilename,"output_%d.bmp",snum); + if (imagetobmp(img, outfilename)) // Convert image to YUV + return 1; + + } + else { + fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); + fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); + + sprintf(outfilename,"output_%d.j2k",snum); + outfile = fopen(outfilename, "wb"); + if (!outfile) { + fprintf(stderr, "failed to open %s for writing\n",outfilename); + return 1; + } + fwrite(frame_codestream,sample->sample_size-8,1,outfile); + fclose(outfile); + } + /* close the byte stream */ + opj_cio_close(cio); + /* free image data structure */ + opj_image_destroy(img); + elapsed_time = opj_clock()-init_time; + fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000); + total_time += elapsed_time; + + } + + free(frame_codestream); + fclose(file); + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); + } + free(dinfo); + + fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); + fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time); + + return 0; +} diff --git a/mj2/MJ2_codec/mj2_to_frames.dsp b/mj2/mj2_to_frames.dsp similarity index 61% rename from mj2/MJ2_codec/mj2_to_frames.dsp rename to mj2/mj2_to_frames.dsp index 25457bd3..5b5bad61 100644 --- a/mj2/MJ2_codec/mj2_to_frames.dsp +++ b/mj2/mj2_to_frames.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg_097" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -63,9 +63,10 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "mj2_to_frames___Win32_Debug0" # PROP Intermediate_Dir "mj2_to_frames___Win32_Debug0" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg_097" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /GZ /c # SUBTRACT CPP /X # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" @@ -74,7 +75,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmtd" /pdbtype:sept !ENDIF @@ -112,8 +113,6 @@ SOURCE=.\compat\getopt.c !ELSEIF "$(CFG)" == "mj2_to_frames - Win32 Debug" -# ADD CPP /I "../libopenjpeg" - !ENDIF # End Source File @@ -125,8 +124,6 @@ SOURCE=.\mj2.c !ELSEIF "$(CFG)" == "mj2_to_frames - Win32 Debug" -# ADD CPP /I "../libopenjpeg" - !ENDIF # End Source File @@ -138,8 +135,6 @@ SOURCE=.\mj2_convert.c !ELSEIF "$(CFG)" == "mj2_to_frames - Win32 Debug" -# ADD CPP /I "../libopenjpeg" - !ENDIF # End Source File @@ -151,148 +146,14 @@ SOURCE=.\mj2_to_frames.c !ELSEIF "$(CFG)" == "mj2_to_frames - Win32 Debug" -# ADD CPP /I "../libopenjpeg" - !ENDIF # End Source File # End Group # End Group -# Begin Group "Libopenjpeg_097" +# Begin Group "OpenJPEG Headers" # PROP Default_Filter "" -# Begin Source File - -SOURCE=..\libopenjpeg_097\bio.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\bio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\cio.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\cio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\dwt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\dwt.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\fix.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\fix.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jpt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jpt.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mct.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mct.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mqc.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mqc.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\openjpeg.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.h -# End Source File # End Group # End Target # End Project diff --git a/mj2/mj2_to_frames.dsw b/mj2/mj2_to_frames.dsw new file mode 100644 index 00000000..897121cf --- /dev/null +++ b/mj2/mj2_to_frames.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LibOpenJPEG"="..\LibOpenJPEG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "mj2_to_frames"=".\mj2_to_frames.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name LibOpenJPEG + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/mj2/MJ2_codec/mj2_to_metadata.c b/mj2/mj2_to_metadata.c similarity index 83% rename from mj2/MJ2_codec/mj2_to_metadata.c rename to mj2/mj2_to_metadata.c index 45a91b1c..a9c8893b 100644 --- a/mj2/MJ2_codec/mj2_to_metadata.c +++ b/mj2/mj2_to_metadata.c @@ -10,28 +10,41 @@ A non-exclusive copy of this code has been contributed to the Open JPEG project. Except for copyright, inclusion of the code within Open JPEG for distribution and use can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. */ -#include -#include -#include +#include "opj_includes.h" #include "mj2.h" -#include - -//MEMORY LEAK -#ifdef _DEBUG -#define _CRTDBG_MAP_ALLOC -#include // Must be included first -#include -#endif -//MEM #include "mj2_to_metadata.h" #include -#ifndef DONT_HAVE_GETOPT -#include -#else #include "compat/getopt.h" -#endif + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + + /* ------------- */ @@ -96,9 +109,12 @@ void help_display() int main(int argc, char *argv[]) { + opj_dinfo_t* dinfo; + opj_event_mgr_t event_mgr; /* event manager */ + FILE *file, *xmlout; /* char xmloutname[50]; */ - mj2_movie_t movie; + opj_mj2_t *movie; char* infile = 0; char* outfile = 0; @@ -110,10 +126,7 @@ int main(int argc, char *argv[]) { BOOL sampletables = FALSE; BOOL raw = TRUE; BOOL derived = TRUE; - -#ifndef NO_PACKETS_DECODING - fprintf(stdout,"WARNING: For best performance, define NO_PACKETS_DECODING in preprocessing.\n"); -#endif + mj2_dparameters_t parameters; while (TRUE) { /* ':' after letter means it takes an argument */ @@ -257,23 +270,41 @@ int main(int argc, char *argv[]) { } // Leave it open - if (mj2_read_struct(file, &movie)) // Creating the movie structure + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + dinfo = mj2_create_decompress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); + + /* setup the decoder decoding parameters using user parameters */ + movie = (opj_mj2_t*) dinfo->mj2_handle; + mj2_setup_decoder(dinfo->mj2_handle, ¶meters); + + if (mj2_read_struct(file, movie)) // Creating the movie structure { fclose(xmlout); return 1; } xml_write_init(notes, sampletables, raw, derived); - xml_write_struct(file, xmlout, &movie, sampleframe, stringDTD); + xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr); fclose(xmlout); - mj2_memory_free(&movie); + fprintf(stderr,"Metadata correctly extracted to XML file \n");; - //MEMORY LEAK - #ifdef _DEBUG - _CrtDumpMemoryLeaks(); - #endif - //MEM + /* free remaining structures */ + if(dinfo) { + mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); + } return 0; } diff --git a/mj2/MJ2_codec/mj2_to_metadata.dsp b/mj2/mj2_to_metadata.dsp similarity index 60% rename from mj2/MJ2_codec/mj2_to_metadata.dsp rename to mj2/mj2_to_metadata.dsp index 8878cfa2..7b4e20fd 100644 --- a/mj2/MJ2_codec/mj2_to_metadata.dsp +++ b/mj2/mj2_to_metadata.dsp @@ -39,9 +39,10 @@ RSC=rc.exe # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg_097" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /YX /FD /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe @@ -49,7 +50,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmtd" +# SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "mj2_to_metadata - Win32 Debug" @@ -62,9 +64,10 @@ LINK32=link.exe # PROP Use_Debug_Libraries 1 # PROP Output_Dir "mj2_to_metadata___Win32_Debug0" # PROP Intermediate_Dir "mj2_to_metadata___Win32_Debug0" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg_097" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /FR /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "OPJ_STATIC" /FR /YX /FD /GZ /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe @@ -72,7 +75,8 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # 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 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 -# 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 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 +# 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 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 /nodefaultlib:"libcmtd" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none !ENDIF @@ -132,141 +136,5 @@ SOURCE=.\mj2_to_metadata.c # End Source File # End Group # End Group -# Begin Group "Libopenjpeg_097" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\libopenjpeg_097\bio.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\bio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\cio.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\cio.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\dwt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\dwt.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\fix.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\fix.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\int.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\j2k.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jp2.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jpt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\jpt.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mct.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mct.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mqc.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\mqc.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\openjpeg.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\pi.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\raw.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t1.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\t2.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tcd.h -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.c -# End Source File -# Begin Source File - -SOURCE=..\libopenjpeg_097\tgt.h -# End Source File -# End Group # End Target # End Project diff --git a/mj2/mj2_to_metadata.dsw b/mj2/mj2_to_metadata.dsw new file mode 100644 index 00000000..f28254b4 --- /dev/null +++ b/mj2/mj2_to_metadata.dsw @@ -0,0 +1,44 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LibOpenJPEG"="..\LibOpenJPEG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "mj2_to_metadata"=".\mj2_to_metadata.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name LibOpenJPEG + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/mj2/MJ2_codec/mj2_to_metadata.dtd b/mj2/mj2_to_metadata.dtd similarity index 100% rename from mj2/MJ2_codec/mj2_to_metadata.dtd rename to mj2/mj2_to_metadata.dtd diff --git a/mj2/MJ2_codec/mj2_to_metadata.h b/mj2/mj2_to_metadata.h similarity index 100% rename from mj2/MJ2_codec/mj2_to_metadata.h rename to mj2/mj2_to_metadata.h diff --git a/mj2/MJ2_codec/mj2_to_metadata.vcproj b/mj2/mj2_to_metadata.vcproj similarity index 100% rename from mj2/MJ2_codec/mj2_to_metadata.vcproj rename to mj2/mj2_to_metadata.vcproj diff --git a/mj2/MJ2_codec/mj2_to_metadata_Notes.doc b/mj2/mj2_to_metadata_Notes.doc similarity index 100% rename from mj2/MJ2_codec/mj2_to_metadata_Notes.doc rename to mj2/mj2_to_metadata_Notes.doc diff --git a/mj2/MJ2_codec/readme.txt b/mj2/readme.txt similarity index 100% rename from mj2/MJ2_codec/readme.txt rename to mj2/readme.txt diff --git a/mj2/wrap_j2k_in_mj2.c b/mj2/wrap_j2k_in_mj2.c new file mode 100644 index 00000000..71dab0de --- /dev/null +++ b/mj2/wrap_j2k_in_mj2.c @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2007, Professor Benoit Macq + * Copyright (c) 2003-2007, Francois-Olivier Devaux + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "opj_includes.h" +#include "mj2.h" + +/** +Size of memory first allocated for MOOV box +*/ +#define TEMP_BUF 10000 + + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + + + +static void read_siz_marker(FILE *file, opj_image_t *image) +{ + int len,i; + char buf, buf2[2]; + char *siz_buffer; + opj_cio_t *cio; + + fseek(file, 0, SEEK_SET); + do { + fread(&buf,1,1, file); + if (buf==(char)0xff) + fread(&buf,1,1, file); + } + while (!(buf==(char)0x51)); + + fread(buf2,2,1,file); /* Lsiz */ + len = ((buf2[0])<<8) + buf2[1]; + + siz_buffer = (char*) malloc(len * sizeof(char)); + fread(siz_buffer,len, 1, file); + cio = opj_cio_open(NULL, siz_buffer, len); + + cio_read(cio, 2); /* Rsiz (capabilities) */ + image->x1 = cio_read(cio, 4); /* Xsiz */ + image->y1 = cio_read(cio, 4); /* Ysiz */ + image->x0 = cio_read(cio, 4); /* X0siz */ + image->y0 = cio_read(cio, 4); /* Y0siz */ + cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */ + + image->numcomps = cio_read(cio,2); /* Csiz */ + image->comps = + (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t)); + + for (i = 0; i < image->numcomps; i++) { + int tmp; + tmp = cio_read(cio,1); /* Ssiz_i */ + image->comps[i].prec = (tmp & 0x7f) + 1; + image->comps[i].sgnd = tmp >> 7; + image->comps[i].dx = cio_read(cio,1); /* XRsiz_i */ + image->comps[i].dy = cio_read(cio,1); /* YRsiz_i */ + image->comps[i].resno_decoded = 0; /* number of resolution decoded */ + image->comps[i].factor = 0; /* reducing factor by component */ + } + fseek(file, 0, SEEK_SET); + opj_cio_close(cio); +} + +static void setparams(opj_mj2_t *movie, opj_image_t *image) { + int i, depth_0, depth, sign; + + movie->tk[0].sample_rate = 25; + movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); + movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); + mj2_init_stdmovie(movie); + + movie->tk[0].depth = image->comps[0].prec; + + if (image->numcomps==3) { + if ((image->comps[0].dx == 1) && (image->comps[1].dx == 1) && (image->comps[1].dx == 1)) + movie->tk[0].CbCr_subsampling_dx = 1; + else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[1].dx == 2)) + movie->tk[0].CbCr_subsampling_dx = 2; + else + fprintf(stderr,"Image component sizes are incoherent\n"); + + if ((image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[1].dy == 1)) + movie->tk[0].CbCr_subsampling_dy = 1; + else if ((image->comps[0].dy == 1) && (image->comps[1].dy == 2) && (image->comps[1].dy == 2)) + movie->tk[0].CbCr_subsampling_dy = 2; + else + fprintf(stderr,"Image component sizes are incoherent\n"); + } + + movie->tk[0].sample_rate = 25; + + movie->tk[0].jp2_struct.numcomps = image->numcomps; // NC + + /* Init Standard jp2 structure */ + + movie->tk[0].jp2_struct.comps = + (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); + movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ + movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ + movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ + movie->tk[0].jp2_struct.minversion = 0; /* MinV */ + movie->tk[0].jp2_struct.numcl = 1; + movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(movie->tk[0].jp2_struct.numcl * sizeof(int)); + movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ + movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ + movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/ + movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/ + movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); + movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); + + depth_0 = image->comps[0].prec - 1; + sign = image->comps[0].sgnd; + movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); + + for (i = 1; i < image->numcomps; i++) { + depth = image->comps[i].prec - 1; + sign = image->comps[i].sgnd; + if (depth_0 != depth) + movie->tk[0].jp2_struct.bpc = 255; + } + + for (i = 0; i < image->numcomps; i++) + movie->tk[0].jp2_struct.comps[i].bpcc = + image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); + + if ((image->numcomps == 1 || image->numcomps == 3) + && (movie->tk[0].jp2_struct.bpc != 255)) + movie->tk[0].jp2_struct.meth = 1; + else + movie->tk[0].jp2_struct.meth = 2; + + if (image->numcomps == 1) + movie->tk[0].jp2_struct.enumcs = 17; // Grayscale + + else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 1) && (image->comps[1].dx == 1) && + (image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[1].dy == 1)) + movie->tk[0].jp2_struct.enumcs = 16; // RGB + + else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[1].dx == 2) && + (image->comps[0].dy == 1) && (image->comps[1].dy == 2) && (image->comps[1].dy == 2)) + movie->tk[0].jp2_struct.enumcs = 18; // YUV + + else + movie->tk[0].jp2_struct.enumcs = 0; // Unkown profile */ +} + +int main(int argc, char *argv[]) { + opj_cinfo_t* cinfo; + opj_event_mgr_t event_mgr; /* event manager */ + unsigned int snum; + opj_mj2_t *movie; + mj2_sample_t *sample; + unsigned char* frame_codestream; + FILE *mj2file, *j2kfile; + char j2kfilename[50]; + char *buf; + int offset, mdat_initpos; + opj_image_t img; + opj_cio_t *cio; + mj2_cparameters_t parameters; + + if (argc != 3) { + printf("Bad syntax: Usage: MJ2_Wrapper source_location mj2_filename\n"); + printf("Example: MJ2_Wrapper input/input output.mj2\n"); + return 1; + } + + mj2file = fopen(argv[2], "wb"); + + if (!mj2file) { + fprintf(stderr, "failed to open %s for writing\n", argv[2]); + return 1; + } + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* get a MJ2 decompressor handle */ + cinfo = mj2_create_compress(); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); + + /* setup the decoder encoding parameters using user parameters */ + movie = (opj_mj2_t*) cinfo->mj2_handle; + mj2_setup_encoder(cinfo->mj2_handle, ¶meters); + + + /* Writing JP, FTYP and MDAT boxes + Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ + + buf = (char*) malloc (300 * sizeof(char)); + cio = opj_cio_open(movie->cinfo, buf, 300); + mj2_write_jp(cio); + mj2_write_ftyp(movie, cio); + mdat_initpos = cio_tell(cio); + cio_skip(cio, 4); + cio_write(cio,MJ2_MDAT, 4); + fwrite(buf,cio_tell(cio),1,mj2file); + free(buf); + + // Insert each j2k codestream in a JP2C box + snum=0; + offset = 0; + while(1) + { + sample = &movie->tk[0].sample[snum]; + sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum); + j2kfile = fopen(j2kfilename, "rb"); + if (!j2kfile) { + if (snum==0) { // Could not open a single codestream + fprintf(stderr, "failed to open %s for reading\n",j2kfilename); + return 1; + } + else { // Tried to open a inexistant codestream + fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum); + break; + } + } + + // Calculating offset for samples and chunks + offset += cio_tell(cio); + sample->offset = offset; + movie->tk[0].chunk[snum].offset = offset; // There will be one sample per chunk + + // Calculating sample size + fseek(j2kfile,0,SEEK_END); + sample->sample_size = ftell(j2kfile) + 8; // Sample size is codestream + JP2C box header + fseek(j2kfile,0,SEEK_SET); + + // Reading siz marker of j2k image for the first codestream + if (snum==0) + read_siz_marker(j2kfile, &img); + + // Writing JP2C box header + frame_codestream = (unsigned char*) malloc (sample->sample_size+8); + cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); + cio_write(cio,sample->sample_size, 4); // Sample size + cio_write(cio,JP2_JP2C, 4); // JP2C + + // Writing codestream from J2K file to MJ2 file + fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); + fwrite(frame_codestream,sample->sample_size,1,mj2file); + cio_skip(cio, sample->sample_size-8); + + // Ending loop + fclose(j2kfile); + snum++; + movie->tk[0].sample = realloc(movie->tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); + movie->tk[0].chunk = realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); + free(frame_codestream); + } + + // Writing the MDAT box length in header + offset += cio_tell(cio); + buf = (char*) malloc (4 * sizeof(char)); + cio = opj_cio_open(movie->cinfo, buf, 4); + cio_write(cio,offset-mdat_initpos,4); + fseek(mj2file,(long)mdat_initpos,SEEK_SET); + fwrite(buf,4,1,mj2file); + fseek(mj2file,0,SEEK_END); + free(buf); + + // Setting movie parameters + movie->tk[0].num_samples=snum; + movie->tk[0].num_chunks=snum; + setparams(movie, &img); + + // Writing MOOV box + buf = (char*) malloc ((TEMP_BUF+snum*20) * sizeof(char)); + cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20)); + mj2_write_moov(movie, cio); + fwrite(buf,cio_tell(cio),1,mj2file); + + // Ending program + fclose(mj2file); + free(img.comps); + opj_cio_close(cio); + mj2_destroy_compress(movie); + + return 0; +}