openjpeg-1.5.2/0000755000175000017500000000000012315072522013177 5ustar mathieumathieuopenjpeg-1.5.2/doc/0000755000175000017500000000000012315072522013744 5ustar mathieumathieuopenjpeg-1.5.2/doc/Doxyfile.dox0000644000175000017500000002410012315002100016221 0ustar mathieumathieu# Doxyfile 1.7.3 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = OpenJPEG PROJECT_NUMBER = PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = C:// STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO EXTENSION_MAPPING = BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../libopenjpeg \ ../libopenjpeg/jpwl INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.h \ *.c RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = ./html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = NO HTML_ALIGN_MEMBERS = YES HTML_DYNAMIC_SECTIONS = NO GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = org.doxygen.Project QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES USE_MATHJAX = NO MATHJAX_RELPATH = http://www.mathjax.org/mathjax SEARCHENGINE = NO SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = USE_JPWL \ USE_JPSEC EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO DOT_NUM_THREADS = 0 DOT_FONTNAME = Helvetica DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES openjpeg-1.5.2/doc/CMakeLists.txt0000644000175000017500000000175312315002100016473 0ustar mathieumathieu# Generate target to build the html documentation through CMake tool # After having configured the project with the BUILD_DOC option you can run make doc # to generate the html documentation in the doc/html repository of the build folder. # Try to find the doxygen tool FIND_PACKAGE(Doxygen) IF(DOXYGEN_FOUND) # Configure the doxygen config file with variable from CMake and move it CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.dox.cmake.in ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox @ONLY) # Configure the html mainpage file of the doxygen documentation with variable # from CMake and move it CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mainpage.dox.cmake ${CMAKE_BINARY_DIR}/doc/mainpage.dox @ONLY) # Generate new target to build the html documentation ADD_CUSTOM_TARGET(doc ALL ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox) ELSE(DOXYGEN_FOUND) MESSAGE(STATUS "Doxygen not found, we cannot generate the documentation") ENDIF(DOXYGEN_FOUND) openjpeg-1.5.2/doc/Doxyfile.dox.cmake.in0000644000175000017500000002424612315002100017720 0ustar mathieumathieu# Doxyfile 1.7.3 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = OpenJPEG PROJECT_NUMBER = @OPENJPEG_VERSION@ PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = @OPENJPEG_BINARY_DIR@/doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = C:// STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO EXTENSION_MAPPING = BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @OPENJPEG_SOURCE_DIR@/libopenjpeg \ @OPENJPEG_BINARY_DIR@/doc INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.h \ *.c \ *.dox RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = ./html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = NO HTML_ALIGN_MEMBERS = YES HTML_DYNAMIC_SECTIONS = NO GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = org.doxygen.Project QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES USE_MATHJAX = NO MATHJAX_RELPATH = http://www.mathjax.org/mathjax SEARCHENGINE = NO SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = USE_JPWL \ USE_JPSEC EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO DOT_NUM_THREADS = 0 DOT_FONTNAME = Helvetica DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES openjpeg-1.5.2/doc/man/0000755000175000017500000000000012315072522014517 5ustar mathieumathieuopenjpeg-1.5.2/doc/man/man3/0000755000175000017500000000000012315072522015355 5ustar mathieumathieuopenjpeg-1.5.2/doc/man/man3/libopenjpeg.30000644000175000017500000002513412315002100017725 0ustar mathieumathieu'\" t '\" The line above instructs most `man' programs to invoke tbl '\" '\" Separate paragraphs; not the same as PP which resets indent level. .de SP .if t .sp .5 .if n .sp .. '\" '\" Replacement em-dash for nroff (default is too short). .ie n .ds m " - .el .ds m \(em '\" '\" Placeholder macro for if longer nroff arrow is needed. .ds RA \(-> '\" '\" Decimal point set slightly raised .if t .ds d \v'-.15m'.\v'+.15m' .if n .ds d . '\" '\" Enclosure macro for examples .de EX .SP .nf .ft CW .. .de EE .ft R .SP .fi .. .TH libopenjpeg 3 "Oct 2010" "Version 1.4.0" "Oct 2010" .P .SH NAME libopenjpeg - a library for reading and writing JPEG2000 image files. .SP .SH SYNOPSIS .P .B #include .P .SS CONVERSION FORMATS .B PGX: imagetopgx() \fR/\fB pgxtoimage() .P .B PXM: imagetopnm() \fR/\fB pnmtoimage() .P .B BMP: imagetobmp() \fR/\fB bmptoimage() .P .B TIF: imagetotif() \fR/\fB tiftoimage() .P .B RAW: imagetoraw() \fR/\fB rawtoimage() .P .B TGA: imagetotga() \fR/\fB tgatoimage() .P .B PNG: imagetopng() \fR/\fB pngtoimage() .P .B YUV: imagetoyuv() \fR/\fB yuvtoimage() \fR(MJ2) .P .SS READ .B opj_set_default_decoder_parameters(opj_dparameters_t *\fIparams\fB); .P .B opj_dinfo_t *opj_create_decompress(OPJ_CODEC_FORMAT \fIformat\fB); .P .B opj_event_mgr_t *opj_set_event_mgr(opj_common_ptr \fIinfo\fB, opj_event_mgr_t *\fIevent_mgr\fB, void *\fIcontext\fB); .P .B void opj_setup_decoder(opj_dinfo_t *\fIdinfo\fB, opj_dparameters_t * \fIparams\fB); .P .B opj_cio_t *opj_cio_open(opj_common_ptr \fIinfo\fB, unsigned char *\fIbuf\fB, int \fIbuf_len\fB); .P .B opj_image_t *opj_decode(opj_dinfo_t *\fIdinfo\fB, opj_cio_t *\fIcio\fB); .P .B void opj_cio_close(opj_cio_t *\fIcio\fB); .P .B void opj_destroy_decompress(opj_dinfo_t *\fIdinfo\fB); .P .B void opj_image_destroy(opj_image_t *\fIimage\fB); .P .SS WRITE .B void opj_set_default_encoder_parameters(opj_cparameters_t *\fIparams\fB); .P /* .B opj_image_t *FORMATtoimage(const char *\fIfname\fB, opj_cparameters_t *\fIparams\fB); .P */ .br .B opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT \fIformat\fB); .P .B opj_event_mgr_t *opj_set_event_mgr(opj_common_ptr \fIinfo\fB, opj_event_mgr_t *\fIevent_mgr\fB, void *\fIcontext\fB); .P .B void opj_setup_encoder(opj_cinfo_t *\fIcinfo\fB, opj_cparameters_t *\fIparams\fB, opj_image_t *\fIimage\fB); .P .B opj_cio_t *opj_cio_open(opj_common_ptr \fIcinfo\fB, \fINULL\fB, \fI0\fB); .P .B bool opj_encode(opj_cinfo_t *\fIcinfo\fB, opj_cio_t *\fIcio\fB, opj_image_t *\fIimage\fB, char *\fIindex\fB); .P .B void opj_cio_close(opj_cio_t *\fIcio\fB); .P .B void opj_destroy_compress(opj_cinfo_t *\fIcinfo\fB); .P .B void opj_image_destroy(opj_image_t *\fIimage\fB); .P .SS GENERAL .P .B void opj_image_create(int \fInumcmpts\fB, opj_image_cmptparm_t *\fIcmptparms\fB, OPJ_COLOR_SPACE \fIclrspc\fB); .P .B int cio_tell(opj_cio_t *\fIcio\fB); .P .B void cio_seek(opj_cio_t *\fIcio\fB, int \fIpos\fB); .P .B opj_image_t *opj_decode_with_info(opj_dinfo_t *\fIdinfo\fB, opj_cio_t *\fIcio\fB, opj_codestream_info_t *\fIcstr_info\fB); .P .B bool opj_encode_with_info(opj_cinfo_t *\fIcinfo\fB, opj_cio_t *\fIcio\fB, opj_image_t *\fIimage\fB, opj_codestream_info_t *\fIcstr_info\fB); .P .B void opj_destroy_cstr_info(opj_codestream_info_t *\fIcstr_info\fB); .P .B const char *opj_version(\fIvoid\fB); .P .SH OPJ_CODEC_FORMAT .P .B CODEC_J2K\fR or \fBCODEC_JPT\fR or \fBCODEC_JP2 .P .SH OPJ_COLOR_SPACE .P .B CLRSPC_UNKNOWN\fR or \fBCLRSPC_UNSPECIFIED\fR or \fBCLRSPC_SRGB\fR or \fBCLRSPC_GRAY\fR or \fBCLRSPC_SYCC .P .SH DECOMPRESSION PARAMETERS .P typedef struct opj_dparameters .br { /* Set the number of highest resolution levels to be discarded. The image resolution is effectively divided by 2 to the power of the number of discarded levels. The reduce factor is limited by the smallest total number of decomposition levels among tiles. if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ \fBint\fR cp_reduce; /* Set the maximum number of quality layers to decode. If there are less quality layers than the specified number, all the quality layers are decoded. if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ \fBint\fR cp_layer; /*command line encoder parameters (not used inside the library) */ /* input file name */ \fBchar\fR infile[OPJ_PATH_LEN]; /* output file name */ \fBchar\fR outfile[OPJ_PATH_LEN]; /* input file format: see OPJ_CODEC_FORMAT */ \fBint\fR decod_format; /* output file format */ \fBint\fR cod_format; /*JPWL decoding parameters */ /* activates the JPWL correction capabilities */ \fBbool\fR jpwl_correct; /* expected number of components */ \fBint\fR jpwl_exp_comps; /* maximum number of tiles */ \fBint\fR jpwl_max_tiles; /* Specify whether the decoding should be done on the entire codestream, or be limited to the main header Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream if == NO_LIMITATION, the entire codestream is decoded; if == LIMIT_TO_MAIN_HEADER, only the main header is decoded; */ \fBOPJ_LIMIT_DECODING\fR cp_limit_decoding; .br } opj_dparameters_t; .SH COMPRESSION PARAMETERS .P typedef struct opj_cparameters .br { /* size of tile: tile_size_on = false (not in argument) or tile_size_on = true (in argument) */ \fBbool\fR tile_size_on; /* XTOsiz */ \fBint\fR cp_tx0; /* YTOsiz */ \fBint\fR cp_ty0; /* XTsiz */ \fBint\fR cp_tdx; /* YTsiz */ \fBint\fR cp_tdy; /* allocation by rate/distortion */ \fBint\fR cp_disto_alloc; /* allocation by fixed layer */ \fBint\fR cp_fixed_alloc; /* add fixed_quality */ \fBint\fR cp_fixed_quality; /* fixed layer */ \fBint *\fRcp_matrice; /* comment for coding */ \fBchar *\fRcp_comment; /* coding style */ \fBint\fR csty; /* progression order: PROG_UNKNOWN, LRCP(default), RLCP, RPCL, PCRL, CPRL */ \fBOPJ_PROG_ORDER\fR prog_order; /* progression order changes */ \fBopj_poc_t\fR POC[32]; /* number of progression order changes (POC), default: 0 */ \fBint\fR numpocs; /* number of layers */ \fBint\fR tcp_numlayers; /* rates of layers */ \fBfloat\fR tcp_rates[100]; /* different psnr for successive layers */ \fBfloat\fR tcp_distoratio[100]; /* number of resolutions */ \fBint\fR numresolution; /* initial code block width, default: 64 */ \fBint\fR cblockw_init; /* initial code block height, default: 64 */ \fBint\fR cblockh_init; /* mode switch (cblk_style) */ /* 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ \fBint\fR irreversible; /* region of interest: affected component in [0..3], -1 means no ROI */ \fBint\fR roi_compno; /* region of interest: upshift value */ \fBint\fR roi_shift; /* number of precinct size specifications */ \fBint\fR res_spec; /* initial precinct width */ \fBint\fR prcw_init[J2K_MAXRLVLS]; /* initial precinct height */ \fBint\fR prch_init[J2K_MAXRLVLS]; /*command line encoder parameters (not used inside the library) */ /* input file name */ \fBchar\fR infile[OPJ_PATH_LEN]; /* output file name */ \fBchar\fR outfile[OPJ_PATH_LEN]; /* DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ \fBint\fR index_on; /* DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ \fBchar\fR index[OPJ_PATH_LEN]; /* subimage encoding: origin image offset in x direction */ \fBint\fR image_offset_x0; /* subimage encoding: origin image offset in y direction */ \fBint\fR image_offset_y0; /* subsampling value for dx */ \fBint\fR subsampling_dx; /* subsampling value for dy */ \fBint\fR subsampling_dy; /* input file format */ \fBint\fR decod_format; /* output file format: see OPJ_CODEC_FORMAT */ \fBint\fR cod_format; /*JPWL encoding parameters */ /* enables writing of EPC in MH, thus activating JPWL */ \fBbool\fR jpwl_epc_on; /* error protection method for MH (0,1,16,32,37-128) */ \fBint\fR jpwl_hprot_MH; /* tile number of header protection specification (>=0) */ \fBint\fR jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /* error protection methods for TPHs (0,1,16,32,37-128) */ \fBint\fR jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; /* tile number of packet protection specification (>=0) */ \fBint\fR jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; /* packet number of packet protection specification (>=0) */ \fBint\fR jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; /* error protection methods for packets (0,1,16,32,37-128) */ \fBint\fR jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; /* enables writing of ESD, (0=no/1/2 bytes) */ \fBint\fR jpwl_sens_size; /* sensitivity addressing size (0=auto/2/4 bytes) */ \fBint\fR jpwl_sens_addr; /* sensitivity range (0-3) */ \fBint\fR jpwl_sens_range; /* sensitivity method for MH (-1=no,0-7) */ \fBint\fR jpwl_sens_MH; /* tile number of sensitivity specification (>=0) */ \fBint\fR jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /* sensitivity methods for TPHs (-1=no,0-7) */ \fBint\fR jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; /* Digital Cinema compliance: OFF-not compliant, CINEMA2K_24, CINEMA2K_48, CINEMA4K_24 */ \fBOPJ_CINEMA_MODE\fR cp_cinema; /* Maximum rate for each component. If == 0, component size limitation is not considered */ \fBint\fR max_comp_size; /* Profile name*/ \fBOPJ_RSIZ_CAPABILITIES\fR cp_rsiz; /* Tile part generation*/ \fBchar\fR tp_on; /* Flag for Tile part generation*/ \fBchar\fR tp_flag; /* MCT (multiple component transform) */ \fBchar\fR tcp_mct; .br } opj_cparameters_t; '\".SH OPTIONS '\".SH BUGS .SH AUTHORS Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium Copyright (c) 2002-2007, Professor Benoit Macq Copyright (c) 2001-2003, David Janssens Copyright (c) 2002-2003, Yannick Verschueren Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe Copyright (c) 2005, Herve Drolon, FreeImage Team Copyright (c) 2006-2007, Parvatha Elangovan .P .SH "SEE ALSO" \fBimage_to_j2k\fR(1) \fBj2k_to_image\fR(1) \fBj2k_dump\fR(1) \fBJPWL_image_to_j2k\fR(1) \fBJPWL_j2k_to_image\fR(1) \fBextract_j2k_from_mj2\fR(1) \fBwrap_j2k_in_mj2\fR(1) \fBframes_to_mj2\fR(1) \fBmj2_to_frames\fR(1) openjpeg-1.5.2/doc/man/man1/0000755000175000017500000000000012315072522015353 5ustar mathieumathieuopenjpeg-1.5.2/doc/man/man1/j2k_dump.10000644000175000017500000000225212315002100017132 0ustar mathieumathieu'\" t '\" The line above instructs most `man' programs to invoke tbl '\" '\" Separate paragraphs; not the same as PP which resets indent level. .de SP .if t .sp .5 .if n .sp .. '\" '\" Replacement em-dash for nroff (default is too short). .ie n .ds m " - .el .ds m \(em '\" '\" Placeholder macro for if longer nroff arrow is needed. .ds RA \(-> '\" '\" Decimal point set slightly raised .if t .ds d \v'-.15m'.\v'+.15m' .if n .ds d . '\" '\" Enclosure macro for examples .de EX .SP .nf .ft CW .. .de EE .ft R .SP .fi .. .TH j2k_dump 1 "Version 1.4.0" "j2k_dump" "dumps jpeg2000 files" .P .SH NAME j2k_dump - This program reads in a jpeg2000 image and dumps the contents to stdout. It is part of the OpenJPEG library. .SP Valid input image extensions are .B .j2k, .jp2, .jpt .SP .SH SYNOPSIS .P .B j2k_dump -i \fRinfile.j2k .P .B j2k_dump -ImgDir \fRimages/ \fRDump all files in images/ .P .B j2k_dump -h \fRPrint help message and exit .P .SH OPTIONS .TP .B \-\^i "name" (jpeg2000 input file name) .TP .B \-\^ImgDir "directory_name" (directory containing jpeg2000 input files) .P '\".SH BUGS .SH AUTHORS Copyright (c) 20010, Mathieu Malaterre .P .SH "SEE ALSO" image_to_j2k(1) j2k_to_image(1) openjpeg-1.5.2/doc/man/man1/image_to_j2k.10000644000175000017500000001423012315002100017750 0ustar mathieumathieu'\" t '\" The line above instructs most `man' programs to invoke tbl '\" '\" Separate paragraphs; not the same as PP which resets indent level. .de SP .if t .sp .5 .if n .sp .. '\" '\" Replacement em-dash for nroff (default is too short). .ie n .ds m " - .el .ds m \(em '\" '\" Placeholder macro for if longer nroff arrow is needed. .ds RA \(-> '\" '\" Decimal point set slightly raised .if t .ds d \v'-.15m'.\v'+.15m' .if n .ds d . '\" '\" Enclosure macro for examples .de EX .SP .nf .ft CW .. .de EE .ft R .SP .fi .. .TH image_to_j2k 1 "Version 1.4.0" "image_to_j2k" "converts to jpeg2000 files" .P .SH NAME image_to_j2k - This program reads in an image of a certain type and converts it to a jpeg2000 file. It is part of the OpenJPEG library. .SP Valid input image extensions are .B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff . .SP Valid output image extensions are .B .j2k, .jp2 .SH SYNOPSIS .P .B image_to_j2k -i \fRinfile.bmp \fB-o \fRoutfile.j2k .P .B image_to_j2k -ImgDir \fRdirectory_name \fB-OutFor \fRjp2 .P .B image_to_j2k -h \fRPrint a help message and exit. .P See JPWL OPTIONS for special options .SH OPTIONS .TP .B \-\^b " n,n" (Size of code block (e.g. -b 32,32). Default: 64 x 64) .TP .B \-\^c " n" (Size of precinct (e.g. -c 128,128). Default: 2^15 x 2^15) .TP .B \-\^cinema2K " fps" Digital Cinema 2K profile compliant codestream. Valid \fBfps\fR values are 24 or 48. .TP .B \-\^cinema4K Digital Cinema 4K profile compliant codestream. Does not need an fps: default is 24 fps. .TP .B \-\^d " X,Y" (Offset of image origin (e.g. -d 150,300)) .TP .B \-\^h Print a help message and exit. .TP .B \-\^i " name" (input file name) .TP .B \-\^n " n" (Number of resolutions. Default: 6) .TP .B \-\^o " name" (output file name) .TP .B \-\^p " name" Progression order. \fBname\fR can be one out of:LRCP, RLCP, RPCL, PCRL, CPRL. Default: LRCP. .TP .B \-\^q " n" different psnr for successive layers .br .B Note: \fR(options -r and -q cannot be used together) .TP .B \-\^r " n" different compression ratio(s) for successive layers. The rate specified for each quality level is the desired compression factor. .br .B Note: \fR(options -r and -q cannot be used together) .TP .B \-\^s " X,Y" sub-sampling factor (e.g. -s 2,2). Default: No sub-sampling in x or y direction. .br .B Remark: \fRsub-sampling bigger than 2 can produce errors. .TP .B \-\^t " W,H" (Size of tile (e.g. -t 512,512) ) .TP .B \-\^x " name" (Create index file and fill it. Default: no index file) .TP .B \-\^EPH (Write EPH marker after each header packet. Default:no EPH) .TP .B \-\^F " rawWidth,rawHeight,rawComp,rawBitDepth,s_or_u" characteristics of the raw input image .TP .B \-\^I (Use the irreversible DWT 9-7. Default: Reversible DWT 5-3) .TP .B \-\^ImgDir " directory_name" (directory containing input files) .TP .B \-\^M " n" mode switch with values: 1, 2, 4, 8, 16, 32. Default:No mode switch activated. .br \fIMeaning:\fR .br BYPASS(1) .br RESET(2) .br RESTART(4) .br VSC(8) .br ERTERM(16) .br SEGMARK(32) .br Values can be added: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38 .TP .B \-\^OutFor "ext" (extension for output files) .TP .B \-\^POC "TtileNr=resolutionStart, componentStart, layerEnd, resolutionEnd, componentEnd, progressionOrder" (see Examples) .TP .B \-\^ROI "c=n,U=n" quantization indices upshifted for component c (0 or 1 or 2) with a value of U (>= 0 and <= 37) .br e.g. \fB-ROI c=0,U=25\fR .TP .B \-\^SOP (Write SOP marker before each packet. Default: No SOP marker in the codestream.) .TP .B \-\^T "X,Y" (Offset of the origin of the tiles (e.g. -T 100,75) ) .TP .B \-\^W (see JPWL OPTIONS) .P .SH JPWL OPTIONS Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR .P .B -W h<=type>, s<=method>, a=, z=, g=, p<=type> .P .B h\fR selects the header error protection (EPB): \fBtype\fR can be [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] if \fBtilepart\fR is absent, it is for main and tile headers if \fBtilepart\fR is present, it applies from that tile onwards, up to the next h<> spec, or to the last tilepart in the codestream (max. 16 specs) .P .B p \fRselects the packet error protection (EEP/UEP with EPBs) to be applied to raw data: \fBtype\fR can be [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] if \fBtilepart:pack\fR is absent, it is from tile 0, packet 0 if \fBtilepart:pack\fR is present, it applies from that tile and that packet onwards, up to the next packet spec or to the last packet in the last tilepart in the stream (max. 16 specs) .P .B s \fRenables sensitivity data insertion (ESD): \fBmethod\fR can be [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED] if \fBtilepart\fR is absent, it is for main header only if \fBtilepart\fR is present, it applies from that tile onwards, up to the next s<> spec, or to the last tilepart in the codestream (max. 16 specs) .P .B g \fRdetermines the addressing mode: \fBrange\fR can be [0=PACKET 1=BYTE RANGE 2=PACKET RANGE] .P .B a \fRdetermines the size of data addressing: \fBaddr\fR can be 2/4 bytes (small/large codestreams). If not set, auto-mode .P .B z \fRdetermines the size of sensitivity values: \fBsize\fR can be 1/2 bytes, for the transformed pseudo-floating point value .P .SH EXAMPLES .P .B image_to_j2k -i \fRfile.bmp \fB-o \fRfile.j2k \fB-r \fR20,10,1 (compress 20x, then 10x, then lossless). .P .B image_to_j2k -i \fRfile.ppm \fB-o \fRfile.j2k \fB-q \fR30,40,50 .P .B image_to_j2k -i \fRfile.pgx \fB-o \fRfile.j2k \fB-POC \fRT1=0,0,1,5,3,CPRL .P .B image_to_j2k -i \fRlena.raw \fB-o \fRlena.j2k \fB-F \fR512,512,3,8,u .P .SH AUTHORS Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium .br Copyright (c) 2002-2007, Professor Benoit Macq .br Copyright (c) 2001-2003, David Janssens .br Copyright (c) 2002-2003, Yannick Verschueren .br Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe .br Copyright (c) 2005, Herve Drolon, FreeImage Team .br Copyright (c) 2006-2007, Parvatha Elangovan .P .SH "SEE ALSO" j2k_to_image(1) j2k_dump(1) openjpeg-1.5.2/doc/man/man1/j2k_to_image.10000644000175000017500000000553112315002100017754 0ustar mathieumathieu'\" t '\" The line above instructs most `man' programs to invoke tbl '\" '\" Separate paragraphs; not the same as PP which resets indent level. .de SP .if t .sp .5 .if n .sp .. '\" '\" Replacement em-dash for nroff (default is too short). .ie n .ds m " - .el .ds m \(em '\" '\" Placeholder macro for if longer nroff arrow is needed. .ds RA \(-> '\" '\" Decimal point set slightly raised .if t .ds d \v'-.15m'.\v'+.15m' .if n .ds d . '\" '\" Enclosure macro for examples .de EX .SP .nf .ft CW .. .de EE .ft R .SP .fi .. .TH j2k_to_image 1 "Version 1.4.0" "j2k_to_image" "converts jpeg2000 files" .P .SH NAME j2k_to_image - This program reads in a jpeg2000 image and converts it to another image type. It is part of the OpenJPEG library. .SP Valid input image extensions are .B .j2k, .jp2, .j2c, .jpt .SP Valid output image extensions are .B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff . .SH SYNOPSIS .P .B j2k_to_image -i \fRinfile.j2k \fB-o \fRoutfile.png .P .B j2k_to_image -ImgDir \fRimages/ \fB-OutFor \fRbmp .P .B j2k_to_image -h \fRPrint help message and exit .P See JPWL OPTIONS for special options .SH OPTIONS .TP .B \-\^i "name" (jpeg2000 input file name) .TP .B \-\^l "n" n is the maximum number of quality layers to decode. See LAYERS below) .TP .B \-\^o "name" (output file name with extension) .TP .B \-\^r "n" (n is the highest resolution level to be discarded. See REDUCTION below) .TP .B \-\^x "name" (use name as index file and fill it) .TP .B \-\^ImgDir "directory_name" (directory containing input files) .TP .B \-\^OutFor "ext" (extension for output files) .P .SH JPWL OPTIONS Options usable only if the library has been compiled with .B -DUSE_JPWL .TP .B -W c\fR[=Nc] (Nc is the number of expected components in the codestream; default:3) .TP .B -W t\fR[=Nt] (Nt is the maximum number of tiles in the codestream; default:8192) .TP .B -W c\fR[=Nc]\fB, t\fR[=Nt] \fR(same as above) .P .SH REDUCTION Set the number of highest resolution levels to be discarded. The image resolution is effectively divided by 2 to the power of the number of discarded levels. The reduce factor is limited by the smallest total number of decomposition levels among tiles. .SH TILES Set the maximum number of quality layers to decode. If there are less quality layers than the specified number, all the quality layers are decoded. .P '\".SH BUGS .SH AUTHORS Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium .br Copyright (c) 2002-2007, Professor Benoit Macq .br Copyright (c) 2001-2003, David Janssens .br Copyright (c) 2002-2003, Yannick Verschueren .br Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe .br Copyright (c) 2005, Herve Drolon, FreeImage Team .br Copyright (c) 2006-2007, Parvatha Elangovan .P .SH "SEE ALSO" image_to_j2k(1) j2k_dump(1) openjpeg-1.5.2/doc/Makefile.am0000644000175000017500000000412612315002100015764 0ustar mathieumathieu MAINTAINERCLEANFILES = Makefile.in .PHONY: doc PACKAGE_DOCNAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc if OPJ_BUILD_DOC doc-clean: rm -rf $(top_srcdir)/doc/html/ $(top_srcdir)/doc/$(PACKAGE_DOCNAME).tar* doc: all cd $(top_srcdir)/doc && \ $(opj_doxygen) Doxyfile.dox rm -rf $(PACKAGE_DOCNAME).tar* rm -rf $(top_srcdir)/doc/$(PACKAGE_DOCNAME).tar* mkdir -p $(PACKAGE_DOCNAME)/doc cp -R $(top_srcdir)/doc/html/ $(PACKAGE_DOCNAME)/doc tar cf $(PACKAGE_DOCNAME).tar $(PACKAGE_DOCNAME)/ bzip2 -9 $(PACKAGE_DOCNAME).tar rm -rf $(PACKAGE_DOCNAME)/ if ! test -f $(top_srcdir)/doc/$(PACKAGE_DOCNAME).tar.bz2 ; then \ mv $(PACKAGE_DOCNAME).tar.bz2 $(top_srcdir)/doc; \ fi clean-local: doc-clean else doc: @echo "Documentation not built. Run ./configure --help" endif docsdir = $(docdir)-$(MAJOR_NR).$(MINOR_NR) docs_DATA = $(top_builddir)/LICENSE dist_man1_MANS = \ man/man1/image_to_j2k.1 \ man/man1/j2k_dump.1 \ man/man1/j2k_to_image.1 dist_man3_MANS = \ man/man3/libopenjpeg.3 install-data-hook: @echo -e " (MAN)\t$(man1dir)/image_to_j2k.1" >> $(top_builddir)/report.txt @echo -e " (MAN)\t$(man1dir)/j2k_dump.1" >> $(top_builddir)/report.txt @echo -e " (MAN)\t$(man1dir)/j2k_to_image.1" >> $(top_builddir)/report.txt @echo -e " (MAN)\t$(man3dir)/libopenjpeg.3" >> $(top_builddir)/report.txt if WANT_JPWL cd $(DESTDIR)$(man1dir) && \ rm -f jpwl_image_to_j2k.1 && \ $(LN_S) image_to_j2k.1 jpwl_image_to_j2k.1 cd $(DESTDIR)$(man1dir) && \ rm -f jpwl_j2k_to_image.1 && \ $(LN_S) j2k_to_image.1 jpwl_j2k_to_image.1 cd $(DESTDIR)$(man3dir) && \ rm -f jpwl_libopenjpeg.3 && \ $(LN_S) libopenjpeg.3 jpwl_libopenjpeg.3 @echo -e " (LN)\t$(man1dir)/jpwl_image_to_j2k.1" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(man1dir)//jpwl_j2k_to_image.1" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(man3dir)/jpwl_libopenjpeg.3" >> $(top_builddir)/report.txt endif uninstall-hook: if WANT_JPWL rm -f $(DESTDIR)$(man1dir)/jpwl_image_to_j2k.1 rm -f $(DESTDIR)$(man1dir)/jpwl_j2k_to_image.1 rm -f $(DESTDIR)$(man3dir)/jpwl_libopenjpeg.3 endif EXTRA_DIST = \ CMakeLists.txt \ Doxyfile.dox openjpeg-1.5.2/doc/mainpage.dox.cmake0000644000175000017500000000543612315002100017311 0ustar mathieumathieu/* * $Id: mainpage.dox.cmake 2011-09-21 Mickael Savinaud $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes * 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. */ /*! \mainpage OpenJPEG v@OPENJPEG_VERSION@ Documentation * * \section intro Introduction * This manual documents the low-level OpenJPEG C API.\n * The OpenJPEG library is an open-source JPEG 2000 library developed in order to promote the use of JPEG 2000.\n * This documents is focused on the main part of the library which try to implement Part 1 and Part 2 of the JPEG2000 norm.\n * * \section home Home page * * The Home Page of the OpenJPEG library can be found at: * * http://code.google.com/p/openjpeg/ * * More information about the OpenJPEG library is available here: * * http://www.openjpeg.org/ * * The OpenJPEG mailing list is located here: * * http://groups.google.com/group/openjpeg * * All the source code is online and can be retrieved using svn from here: * * http://openjpeg.googlecode.com/svn/ * * \section license License * This software is released under the BSD license, anybody can use or modify the library, even for commercial applications.\n * The only restriction is to retain the copyright in the sources or the binaries documentation.\n * Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage. * * \author OpenJPEG Team * */openjpeg-1.5.2/configure.ac0000644000175000017500000003055012315002100015451 0ustar mathieumathieu # According to http://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info : # # 1) when bugs are fixed or internal code is changed: increase MICRO # 2) if API is added, increase MINOR and set MICRO to 0 # 3) if API or ABI is broken (this case should (must) never happen as it's very bad for a library), or a new designed library, increase MAJOR and set MINOR and MICRO to 0 m4_define([OPJ_MAJOR], [1]) m4_define([OPJ_MINOR], [5]) m4_define([OPJ_MICRO], [2]) m4_define([lt_cur], m4_eval(OPJ_MAJOR + OPJ_MINOR)) m4_define([lt_rev], OPJ_MICRO) m4_define([lt_age], OPJ_MINOR) AC_PREREQ([2.62]) AC_INIT([OpenJPEG], [OPJ_MAJOR.OPJ_MINOR.OPJ_MICRO], [openjpeg@googlegroups.com], [openjpeg], [http://www.openjpeg.org]) AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([opj_config.h]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE([1.11 foreign dist-bzip2 dist-xz dist-zip]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) MAJOR_NR=OPJ_MAJOR MINOR_NR=OPJ_MINOR MICRO_NR=OPJ_MICRO AC_SUBST([MAJOR_NR]) AC_SUBST([MINOR_NR]) AC_SUBST([MICRO_NR]) LT_PREREQ([2.0]) LT_INIT([win32-dll]) lt_version=lt_cur:lt_rev:lt_age AC_SUBST([lt_version]) ### Needed information have_win32=no have_darwin="no" case "$host_os" in mingw*) have_win32="yes" ;; darwin*) have_darwin="yes" ;; esac AM_CONDITIONAL([HAVE_WIN32], [test "x${have_win32}" = "xyes"]) AM_CONDITIONAL([HAVE_DARWIN], [test "x${have_darwin}" = "xyes"]) ### Additional options to configure # debug AC_ARG_ENABLE([debug], [AC_HELP_STRING([--enable-debug], [build with debug symbols @<:@default=disabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_debug="yes" else want_debug="no" fi ], [want_debug="no"]) AC_MSG_CHECKING([whether to build in debug mode]) AC_MSG_RESULT([${want_debug}]) # MJ2 AC_ARG_ENABLE([mj2], [AC_HELP_STRING([--enable-mj2], [build mj2 binaries @<:@default=disabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_mj2="yes" else want_mj2="no" fi ], [want_mj2="no"]) AC_MSG_CHECKING([whether to build the MJ2 binaries]) AC_MSG_RESULT([${want_mj2}]) if test "x${want_mj2}" = "xyes" ; then AC_DEFINE(USE_MJ2, [1], [define to 1 if you use mj2]) fi AM_CONDITIONAL([WANT_MJ2], [test "x${want_mj2}" = "xyes"]) # JPWL AC_ARG_ENABLE([jpwl], [AC_HELP_STRING([--enable-jpwl], [build JPWL library @<:@default=disabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_jpwl="yes" else want_jpwl="no" fi ], [want_jpwl="no"]) AC_MSG_CHECKING([whether to build the JPWL library]) AC_MSG_RESULT([${want_jpwl}]) AM_CONDITIONAL([WANT_JPWL], [test "x${want_jpwl}" = "xyes"]) # JPIP AC_ARG_ENABLE([jpip], [AC_HELP_STRING([--enable-jpip], [build jpip library @<:@default=disabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_jpip="yes" else want_jpip="no" fi ], [want_jpip="no"]) AC_MSG_CHECKING([whether to build the JPIP library]) AC_MSG_RESULT([${want_jpip}]) AC_ARG_ENABLE([jpip-server], [AC_HELP_STRING([--enable-jpip-server], [build jpip server @<:@default=disabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_jpip_server="yes" else want_jpip_server="no" fi ], [want_jpip_server="no"]) AC_MSG_CHECKING([whether to build the JPIP server]) AC_MSG_RESULT([${want_jpip_server}]) ### Checks for programs AC_PROG_CC # pkg-config PKG_PROG_PKG_CONFIG # Check whether pkg-config supports Requires.private if $PKG_CONFIG --atleast-pkgconfig-version 0.22 ; then pkgconfig_requires_private="Requires.private" else pkgconfig_requires_private="Requires" fi AC_SUBST([pkgconfig_requires_private]) AC_SUBST([requirements]) # doxygen OPJ_CHECK_DOXYGEN # ln -s AC_PROG_LN_S ### Checks for libraries # libpng have_libpng="no" AC_ARG_ENABLE([png], [AC_HELP_STRING([--disable-png], [disable PNG support @<:@default=enabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_png="yes" else want_png="no" fi ], [want_png="yes"]) AC_MSG_CHECKING([whether to build with PNG support]) AC_MSG_RESULT([${want_png}]) if test "x${want_png}" = "xyes" ; then PKG_CHECK_MODULES([PNG], [libpng15 zlib], [have_libpng="yes"], [ PKG_CHECK_MODULES([PNG], [libpng14 zlib], [have_libpng="yes"], [ PKG_CHECK_MODULES([PNG], [libpng12 zlib], [have_libpng="yes"], [ PKG_CHECK_MODULES([PNG], [libpng zlib], [have_libpng="yes"], [have_libpng="no"]) ]) ]) ]) if ! test "x${have_libpng}" = "xyes" ; then OPJ_CHECK_LIB([zlib.h], [z], [zlibVersion], [ OPJ_CHECK_LIB([png.h], [png], [png_access_version_number], [ have_libpng="yes" PNG_CFLAGS="${PNG_CFLAGS} ${Z_CFLAGS}" PNG_LIBS="${PNG_LIBS} ${Z_LIBS}" ], [have_libpng="no"]) ], [have_libpng="no"]) fi if test "x${have_libpng}" = "xno" ; then AC_MSG_WARN([Can not find a usuable PNG library. Make sure that CPPFLAGS and LDFLAGS are correctly set.]) fi fi AC_MSG_CHECKING([whether PNG is available]) AC_MSG_RESULT([${have_libpng}]) if test "x${have_libpng}" = "xyes" ; then AC_DEFINE(HAVE_LIBPNG, [1], [define to 1 if you have libpng]) fi AM_CONDITIONAL([with_libpng], [test x${have_libpng} = "xyes"]) # libtiff have_libtiff="no" AC_ARG_ENABLE([tiff], [AC_HELP_STRING([--disable-tiff], [disable TIFF support @<:@default=enabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_tiff="yes" else want_tiff="no" fi ], [want_tiff="yes"]) AC_MSG_CHECKING([whether to build with TIFF support]) AC_MSG_RESULT([${want_tiff}]) if test "x${want_tiff}" = "xyes" ; then OPJ_CHECK_LIB( [tiff.h], [tiff], [TIFFOpen], [have_libtiff="yes"], [have_libtiff="no"]) if test "x${have_libtiff}" = "xno" ; then AC_MSG_WARN([Can not find a usuable TIFF library. Make sure that CPPFLAGS and LDFLAGS are correctly set.]) fi fi AC_MSG_CHECKING([whether TIFF is available]) AC_MSG_RESULT([${have_libtiff}]) if test "x${have_libtiff}" = "xyes" ; then AC_DEFINE(HAVE_LIBTIFF, [1], [define to 1 if you have libtiff]) fi AM_CONDITIONAL([with_libtiff], [test "x${have_libtiff}" = "xyes"]) # libcms2 lcms_output="no" have_lcms2="no" AC_ARG_ENABLE([lcms2], [AC_HELP_STRING([--disable-lcms2], [disable LCMS-2 support @<:@default=enabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_lcms2="yes" else want_lcms2="no" fi ], [want_lcms2="yes"]) AC_MSG_CHECKING([whether to build with LCMS-2 support]) AC_MSG_RESULT([${want_lcms2}]) if test "x${want_lcms2}" = "xyes" ; then PKG_CHECK_MODULES([LCMS2], [lcms2], [have_lcms2="yes"], [have_lcms2="no"]) fi AC_MSG_CHECKING([whether LCMS-2 is available]) AC_MSG_RESULT([${have_lcms2}]) if test "x${have_lcms2}" = "xyes" ; then AC_DEFINE(HAVE_LIBLCMS2, [1], [define to 1 if you have lcms version 2.x]) lcms_output="lcms version 2.x" fi # libcms1 AC_ARG_ENABLE([lcms1], [AC_HELP_STRING([--disable-lcms1], [disable LCMS-1 support @<:@default=enabled@:>@])], [ if test "x${enableval}" = "xyes" ; then want_lcms1="yes" else want_lcms1="no" fi ], [want_lcms1="yes"]) AC_MSG_CHECKING([whether to build with LCMS-1 support]) AC_MSG_RESULT([${want_lcms1}]) if test "x${have_lcms2}" = "xno" ; then if test "x${want_lcms1}" = "xyes" ; then PKG_CHECK_MODULES([LCMS1], [lcms1], [have_lcms1="yes"], [PKG_CHECK_MODULES([LCMS1], [lcms], [have_lcms1="yes"], [have_lcms1="no"])]) fi AC_MSG_CHECKING([whether LCMS-1 is available]) AC_MSG_RESULT([${have_lcms1}]) if test "x${have_lcms1}" = "xyes" ; then AC_DEFINE(HAVE_LIBLCMS1, [1], [define to 1 if you have lcms version 1.x]) lcms_output="lcms version 1.x" fi fi # threads if test "x${want_jpip_server}" = "xyes" ; then if test "x${have_win32}" = "xno" ; then SAVE_CFLAGS=${CFLAGS} CFLAGS="${CFLAGS} -pthread" SAVE_LIBS=${LIBS} LIBS="${LIBS} -pthread" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], [[ pthread_t id; id = pthread_self(); ]])], [have_pthread="yes"], [have_pthread="no"]) CFLAGS=${SAVE_CFLAGS} LIBS=${SAVE_LIBS} AC_MSG_CHECKING([whether Pthread library is available]) AC_MSG_RESULT([${have_pthread}]) if ! test "x${have_pthread}" = "xyes" ; then AC_MSG_WARN([Pthread library not found. OpenJPIP server will not be compiled.]) want_jpip_server="no" else THREAD_CFLAGS="-pthread" THREAD_LIBS="-pthread" fi else THREAD_LIBS="-lws2_32" fi fi AC_ARG_VAR([THREAD_CFLAGS], [compiler flag for the thread library]) AC_SUBST([THREAD_CFLAGS]) AC_ARG_VAR([THREAD_LIBS], [linker flags for thread library]) AC_SUBST([THREAD_LIBS]) # libfcgi if test "x${want_jpip_server}" = "xyes" ; then have_fcgi="no" OPJ_CHECK_LIB( [fcgi_stdio.h], [fcgi], [FCGI_Accept], [have_fcgi="yes"], [have_fcgi="no"]) if ! test "x${have_fcgi}" = "xyes" ; then AC_MSG_WARN([FastCGI library not found. OpenJPIP server will not be compiled.]) want_jpip_server="no" fi fi # libcurl if test "x${want_jpip_server}" = "xyes" ; then PKG_CHECK_MODULES([LIBCURL], [libcurl], [have_libcurl="yes"], [have_libcurl="no"]) if ! test "x${have_libcurl}" = "xyes" ; then AC_MSG_WARN([libcurl library not found. OpenJPIP server will not be compiled.]) want_jpip_server="no" fi fi if test "x${want_jpip}" = "xyes" ; then AC_DEFINE(USE_JPIP, [1], [define to 1 if you use jpip]) fi AM_CONDITIONAL([WANT_JPIP], [test "x${want_jpip}" = "xyes"]) if test "x${want_jpip_server}" = "xyes" ; then AC_DEFINE(USE_JPIP_SERVER, [1], [define to 1 if you use jpip server]) fi AM_CONDITIONAL([WANT_JPIP_SERVER], [test "x${want_jpip_server}" = "xyes"]) AM_CONDITIONAL([WANT_JPIP_CODE], [test "x${want_jpip}" = "xyes" || test "x${want_jpip_server}" = "xyes"]) ### Checks for header files ## FIXME: declarations must be fixed in source code. See autoconf manual AC_HEADER_DIRENT ### Checks for types ### Checks for structures ### Checks for compiler characteristics AM_PROG_CC_C_O ac_cv_c_big_endian=0 AC_C_BIGENDIAN([ac_cv_c_big_endian=yes], [ac_cv_c_big_endian=no],[]) # if test "x${ac_cv_c_big_endian}" = "xyes" ; then AC_DEFINE(OPJ_BIG_ENDIAN, [1], [define to 1 if your machine has BE]) AC_DEFINE(WORDS_BIGENDIAN, [1], [define to 1 if your machine has BE]) fi # #OPJ_COMPILER_FLAG([-Wall]) #OPJ_COMPILER_FLAG([-Wextra]) #OPJ_COMPILER_FLAG([-Wshadow]) #OPJ_COMPILER_FLAG([-Wpointer-arith]) OPJ_COMPILER_FLAG([-Wno-unused-result]) if test "x${want_debug}" = "xyes" ; then OPJ_COMPILER_FLAG([-g]) OPJ_COMPILER_FLAG([-O0]) else OPJ_COMPILER_FLAG([-O3]) fi ### Checks for linker characteristics ### Checks for library functions ### Post configuration AM_CONDITIONAL([BUILD_SHARED], [test "x${enable_shared}" = "xyes"]) AM_CONDITIONAL([BUILD_STATIC], [test "x${enable_static}" = "xyes"]) AC_CONFIG_FILES([ Makefile libopenjpeg1.pc libopenjpeg-jpwl.pc libopenjpeg/Makefile libopenjpeg/jpwl/Makefile applications/Makefile applications/codec/Makefile applications/mj2/Makefile applications/jpip/Makefile applications/jpip/libopenjpip/Makefile applications/jpip/util/Makefile doc/Makefile ]) AC_OUTPUT ### Summary echo echo echo echo "------------------------------------------------------------------------" echo "$PACKAGE $VERSION" echo "------------------------------------------------------------------------" echo echo echo "Configuration Options Summary:" echo echo " Debug...............: ${want_debug}" echo echo " Optional support:" echo " libpng............: ${have_libpng}" echo " libtiff...........: ${have_libtiff}" echo " libcms............: ${lcms_output}" echo echo " Documentation.......: ${opj_have_doxygen}" echo " Build.............: make doc" echo echo " mj2.................: ${want_mj2}" echo " jpwl................: ${want_jpwl}" echo " jpip................: ${want_jpip}" echo " jpip server.........: ${want_jpip_server}" echo openjpeg-1.5.2/applications/0000755000175000017500000000000012315072522015665 5ustar mathieumathieuopenjpeg-1.5.2/applications/mj2/0000755000175000017500000000000012315072522016355 5ustar mathieumathieuopenjpeg-1.5.2/applications/mj2/readme.txt0000644000175000017500000000022612315002075020347 0ustar mathieumathieuAttention : the motion jpeg 2000 files currently only work with OpenJPEG v0.97 that you can find here : http://www.openjpeg.org/openjpeg_v097.tar.gzopenjpeg-1.5.2/applications/mj2/mj2_to_metadata.c0000644000175000017500000002526512315002075021561 0ustar mathieumathieu/* mj2_to_metadata.c */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. 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 "opj_includes.h" #include "mj2.h" #include "mj2_to_metadata.h" #include #include "opj_getopt.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); } /* -------------------------------------------------------------------------- */ /* ------------- */ void help_display() { /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ fprintf(stdout," Help for the 'mj2_to_metadata' Program\n"); fprintf(stdout," ======================================\n"); fprintf(stdout,"The -h option displays this information on screen.\n\n"); fprintf(stdout,"mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n"); fprintf(stdout,"The generated XML shows the structural, but not (yet) curatorial,\n"); fprintf(stdout,"metadata from the movie header and from the JPEG 2000 image and tile\n"); fprintf(stdout,"headers of a sample frame. Excluded: low-level packed-bits image data.\n\n"); fprintf(stdout,"By Default\n"); fprintf(stdout,"----------\n"); fprintf(stdout,"The metadata includes the jp2 image and tile headers of the first frame.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Metadata values are shown in 'raw' form (e.g., hexidecimal) as stored in the\n"); fprintf(stdout,"file, and, if apt, in a 'derived' form that is more quickly grasped.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Notes explaining the XML are embedded as terse comments. These include\n"); fprintf(stdout," meaning of non-obvious tag abbreviations;\n"); fprintf(stdout," range and precision of valid values;\n"); fprintf(stdout," interpretations of values, such as enumerations; and\n"); fprintf(stdout," current implementation limitations.\n"); fprintf(stdout,"\n"); fprintf(stdout,"The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n"); fprintf(stdout,"\n"); fprintf(stdout,"The file is self-contained and no verification (e.g., against a DTD) is requested.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Required Parameters (except with -h)\n"); fprintf(stdout,"------------------------------------\n"); fprintf(stdout,"[Caution: file strings that contain spaces should be wrapped with quotes.]\n"); fprintf(stdout,"-i input.mj2 : where 'input' is any source file name or path.\n"); fprintf(stdout," MJ2 files created with 'frames_to_mj2' are supported so far.\n"); fprintf(stdout," These are silent, single-track, 'MJ2 Simple Profile' videos.\n"); fprintf(stdout,"-o output.xml : where 'output' is any destination file name or path.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters\n"); fprintf(stdout,"-------------------\n"); fprintf(stdout,"-h : Display this help information.\n"); fprintf(stdout,"-n : Suppress all mj2_to_metadata notes.\n"); fprintf(stdout,"-t : Include sample-size and chunk-offset tables.\n"); fprintf(stdout,"-f n : where n > 0. Include jp2 header info for frame n [default=1].\n"); fprintf(stdout,"-f 0 : No jp2 header info.\n"); fprintf(stdout,"-r : Suppress all 'raw' data for which a 'derived' form exists.\n"); fprintf(stdout,"-d : Suppress all 'derived' data.\n"); fprintf(stdout," (If both -r and -d given, -r will be ignored.)\n"); fprintf(stdout,"-v string : Verify against the DTD file located by the string.\n"); fprintf(stdout," Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n"); fprintf(stdout," Thus, for the distributed DTD placed in the same directory as\n"); fprintf(stdout," the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n"); fprintf(stdout," \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n"); /* More to come */ fprintf(stdout,"\n"); /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ } /* ------------- */ int main(int argc, char *argv[]) { opj_dinfo_t* dinfo; opj_event_mgr_t event_mgr; /* event manager */ FILE *file, *xmlout; /* char xmloutname[50]; */ opj_mj2_t *movie; char* infile = 0; char* outfile = 0; char* s, S1, S2, S3; int len; unsigned int sampleframe = 1; /* First frame */ char* stringDTD = NULL; BOOL notes = TRUE; BOOL sampletables = FALSE; BOOL raw = TRUE; BOOL derived = TRUE; mj2_dparameters_t parameters; while (TRUE) { /* ':' after letter means it takes an argument */ int c = getopt(argc, argv, "i:o:f:v:hntrd"); /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */ if (c == -1) break; switch (c) { case 'i': /* IN file */ infile = optarg; s = optarg; while (*s) { s++; } /* Run to filename end */ s--; S3 = *s; s--; S2 = *s; s--; S1 = *s; if ((S1 == 'm' && S2 == 'j' && S3 == '2') || (S1 == 'M' && S2 == 'J' && S3 == '2')) { break; } fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1, S2, S3); return 1; /* ----------------------------------------------------- */ case 'o': /* OUT file */ outfile = optarg; while (*outfile) { outfile++; } /* Run to filename end */ outfile--; S3 = *outfile; outfile--; S2 = *outfile; outfile--; S1 = *outfile; outfile = optarg; if ((S1 == 'x' && S2 == 'm' && S3 == 'l') || (S1 == 'X' && S2 == 'M' && S3 == 'L')) break; fprintf(stderr, "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3); return 1; /* ----------------------------------------------------- */ case 'f': /* Choose sample frame. 0 = none */ sscanf(optarg, "%u", &sampleframe); break; /* ----------------------------------------------------- */ case 'v': /* Verification by DTD. */ stringDTD = optarg; /* We will not insist upon last 3 chars being "dtd", since non-file access protocol may be used. */ if(strchr(stringDTD,'"') != NULL) { fprintf(stderr, "-D's string must not contain any embedded double-quote characters.\n"); return 1; } if (strncmp(stringDTD,"PUBLIC ",7) == 0 || strncmp(stringDTD,"SYSTEM ",7) == 0) break; fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n"); return 1; /* ----------------------------------------------------- */ case 'n': /* Suppress comments */ notes = FALSE; break; /* ----------------------------------------------------- */ case 't': /* Show sample size and chunk offset tables */ sampletables = TRUE; break; /* ----------------------------------------------------- */ case 'h': /* Display an help description */ help_display(); return 0; /* ----------------------------------------------------- */ case 'r': /* Suppress raw data */ raw = FALSE; break; /* ----------------------------------------------------- */ case 'd': /* Suppress derived data */ derived = FALSE; break; /* ----------------------------------------------------- */ default: return 1; } /* switch */ } /* while */ if(!raw && !derived) raw = TRUE; /* At least one of 'raw' and 'derived' must be true */ /* Error messages */ /* -------------- */ if (!infile || !outfile) { fprintf(stderr,"Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n"); return 1; } /* was: if (argc != 3) { printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n"); printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n"); return 1; } */ len = strlen(infile); if(infile[0] == ' ') { infile++; /* There may be a leading blank if user put space after -i */ } file = fopen(infile, "rb"); /* was: argv[1] */ if (!file) { fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */ return 1; } len = strlen(outfile); if(outfile[0] == ' ') { outfile++; /* There may be a leading blank if user put space after -o */ } // Checking output file xmlout = fopen(outfile, "w"); /* was: argv[2] */ if (!xmlout) { fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */ return 1; } // Leave it open /* 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, &event_mgr); fclose(xmlout); fprintf(stderr,"Metadata correctly extracted to XML file \n");; /* free remaining structures */ if(dinfo) { mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); } return 0; } openjpeg-1.5.2/applications/mj2/mj2.c0000644000175000017500000021724412315002075017217 0ustar mathieumathieu/* * 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 * */ 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) { mj2_tk_t *tk0; int i, w, h, prec; unsigned int j; time_t ltime; movie->brand = MJ2_MJ2; movie->minversion = 0; movie->num_cl = 2; movie->cl = (unsigned int*) opj_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; tk0 = &movie->tk[0]; w = tk0->w; h = tk0->h; prec = tk0->depth; 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) /* no sound or hint track */ { if (tk->num_samples == 0) return 1; tk->w = w; tk->h = h; tk->depth = prec; 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*) opj_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*) opj_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*) opj_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*) opj_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) { unsigned int i, j, k, 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*) opj_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*) opj_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 = (mj2_chunk_t*) opj_realloc(tk->chunk, tk->num_chunks * sizeof(mj2_chunk_t)); } } /* * Chunk offset box Decompact * */ void mj2_stco_decompact(mj2_tk_t * tk) { unsigned int i, j, k = 0; unsigned 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*) opj_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) { unsigned 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) { unsigned 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*) opj_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*) opj_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*) opj_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*) opj_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; opj_jp2_color_t color; int i; opj_bool ok; 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 */ memset(&color, 0, sizeof(opj_jp2_color_t)); tk->jp2_struct.cinfo = tk->cinfo; ok = jp2_read_jp2h(&tk->jp2_struct, cio, &color); tk->jp2_struct.cinfo = NULL; if(ok == OPJ_FALSE) { opj_event_msg(tk->cinfo, EVT_ERROR, "Error reading JP2H Box\n"); return 1; } tk->jp2_struct.comps = (opj_jp2_comps_t*) opj_malloc(tk->jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); tk->jp2_struct.cl = (unsigned int*) opj_malloc(sizeof(unsigned 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*) opj_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 = (unsigned int)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 = (unsigned int)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 = (unsigned int)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*) opj_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; unsigned char * src; int fsresult; int foffset; opj_cio_t *cio; /* open a byte stream for reading */ src = (unsigned char*) opj_malloc(300 * sizeof(unsigned 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 = (unsigned char*)opj_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; opj_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_calloc(1, sizeof(opj_dinfo_t)); if(!dinfo) return NULL; dinfo->is_decompressor = OPJ_TRUE; mj2 = (opj_mj2_t*) opj_calloc(1, 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((opj_j2k_t*)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 != NULL) opj_free(tk->jp2_struct.comps); if (tk->jp2_struct.cl != NULL) 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_calloc(1, sizeof(opj_cinfo_t)); if(!cinfo) return NULL; mj2 = (opj_mj2_t*) opj_calloc(1, 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*) opj_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*) opj_malloc(sizeof(mj2_tk_t)); /*Memory allocation for the video track*/ movie->tk[0].track_ID = 1; /* Track ID = 1 */ movie->tk[0].track_type = 0; /* Video track */ 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; movie->tk[0].name_size = 0; movie->tk[0].chunk = (mj2_chunk_t*) opj_malloc(sizeof(mj2_chunk_t)); movie->tk[0].sample = (mj2_sample_t*) opj_malloc(sizeof(mj2_sample_t)); movie->tk[0].depth = parameters->prec; jp2_struct = &movie->tk[0].jp2_struct; jp2_struct->numcomps = parameters->numcomps; /* NC */ jp2_struct->comps = (opj_jp2_comps_t*) opj_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*) opj_malloc(jp2_struct->numcl * sizeof(unsigned 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 = parameters->meth; jp2_struct->enumcs = parameters->enumcs; } } 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 != NULL) opj_free(tk->jp2_struct.comps); if (tk->jp2_struct.cl != NULL) 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); } openjpeg-1.5.2/applications/mj2/CMakeLists.txt0000644000175000017500000000513712315002075021117 0ustar mathieumathieu# Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2 SET(common_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c) # While mj2 executables do not use the API correctly, we do not link with the library but rather compile the sources files. SET(OPJ_SRCS ${OPENJPEG_SOURCE_DIR}/libopenjpeg/bio.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/cio.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/dwt.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/event.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/image.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/j2k.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/j2k_lib.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/jp2.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/jpt.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/mct.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/mqc.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/openjpeg.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/pi.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/raw.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/t1.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/t2.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/tcd.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/tgt.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/cidx_manager.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/phix_manager.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/ppix_manager.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/thix_manager.c ${OPENJPEG_SOURCE_DIR}/libopenjpeg/tpix_manager.c ) SET(MJ2_SRCS mj2.c mj2_convert.c) IF(WIN32) ADD_DEFINITIONS(-DOPJ_STATIC) ENDIF(WIN32) # Headers file are located here: INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ${OPENJPEG_SOURCE_DIR}/applications/common ${LCMS_INCLUDE_DIRNAME} ) ADD_EXECUTABLE(frames_to_mj2 frames_to_mj2.c ${common_SRCS} ${OPJ_SRCS} ${MJ2_SRCS} ) TARGET_LINK_LIBRARIES(frames_to_mj2 ${LCMS_LIBNAME}) IF(UNIX) TARGET_LINK_LIBRARIES(frames_to_mj2 m) ENDIF(UNIX) ADD_EXECUTABLE(mj2_to_frames mj2_to_frames.c ${common_SRCS} ${OPJ_SRCS} ${MJ2_SRCS} ${OPENJPEG_SOURCE_DIR}/applications/common/color.c ) TARGET_LINK_LIBRARIES(mj2_to_frames ${LCMS_LIBNAME}) IF(UNIX) TARGET_LINK_LIBRARIES(mj2_to_frames m) ENDIF(UNIX) ADD_EXECUTABLE(extract_j2k_from_mj2 extract_j2k_from_mj2.c ${OPJ_SRCS} ${MJ2_SRCS} ) TARGET_LINK_LIBRARIES(extract_j2k_from_mj2 ${LCMS_LIBNAME}) IF(UNIX) TARGET_LINK_LIBRARIES(extract_j2k_from_mj2 m) ENDIF(UNIX) ADD_EXECUTABLE(wrap_j2k_in_mj2 wrap_j2k_in_mj2.c ${OPJ_SRCS} ${MJ2_SRCS} ) TARGET_LINK_LIBRARIES(wrap_j2k_in_mj2 ${LCMS_LIBNAME}) IF(UNIX) TARGET_LINK_LIBRARIES(wrap_j2k_in_mj2 m) ENDIF(UNIX) INSTALL(TARGETS frames_to_mj2 mj2_to_frames extract_j2k_from_mj2 wrap_j2k_in_mj2 DESTINATION ${OPENJPEG_INSTALL_BIN_DIR}) openjpeg-1.5.2/applications/mj2/mj2_convert.h0000644000175000017500000000356412315002075020762 0ustar mathieumathieu/* * 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); char yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters_t *parameters, char* infile); unsigned int yuv_num_frames(mj2_tk_t * tk, char *infile); #endif openjpeg-1.5.2/applications/mj2/mj2_to_frames.c0000644000175000017500000001626012315002075021251 0ustar mathieumathieu/* * 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 "opj_config.h" #include "openjpeg.h" #include "j2k_lib.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" #include "mj2_convert.h" #ifdef HAVE_LIBLCMS2 #include #endif #ifdef HAVE_LIBLCMS1 #include #endif #include "color.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); } /* -------------------------------------------------------------------------- */ #define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a" 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, failed; opj_mj2_t *movie; mj2_tk_t *track; mj2_sample_t *sample; unsigned char* frame_codestream; FILE *infile, *outfile; opj_image_t *img = NULL; unsigned int max_codstrm_size = 0; double total_time = 0; unsigned int numframes = 0; if (argc != 3) { printf("\nUsage: %s inputfile.mj2 outputfile.yuv\n\n",argv[0]); return 1; } infile = fopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "failed to open %s for reading\n", argv[1]); return 1; } { unsigned char buf[28]; size_t n; memset(buf, 0, 28); n = fread(buf, 1, 24, infile); if(memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 && memcmp(buf+20, "\x6d\x6a\x70\x32", 4) == 0) { rewind(infile); } else { fclose(infile); fprintf(stderr,"%s:%d: %s\n\tThis file is not an MJ2 file." "Quitting\n",__FILE__,__LINE__,argv[0]); return 1; } } /* Checking output file: */ outfile = fopen(argv[2], "w"); if (!outfile) { fprintf(stderr, "failed to open %s for writing\n", argv[2]); fclose(infile); return 1; } fclose(outfile); remove(argv[2]); frame_codestream = NULL; failed = 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 = NULL; /* get a MJ2 decompressor handle */ dinfo = mj2_create_decompress(); if(dinfo == NULL) goto fin; movie = (opj_mj2_t*)dinfo->mj2_handle; /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t)); /* 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(movie, &mj2_parameters); /* Create the movie structure: */ if (mj2_read_struct(infile, movie)) goto fin; /* 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"); goto fin; } track = &movie->tk[tnum]; if(track->jp2_struct.enumcs != ENUMCS_SYCC) { fprintf(stderr,"%s:%d: %s\n" "\tERROR: this MJ2 file does not contain YUV frames.\n" "\tPlease try extract_j2k_from_mj2 for this file.\n", __FILE__,__LINE__,argv[0]); goto fin; } /* Output info on first video track: */ 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)); if(frame_codestream == NULL) goto fin; 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 = (unsigned char*) realloc(frame_codestream, max_codstrm_size)) == NULL) { printf("Error reallocation memory\n"); goto fin; }; } fseek(infile,sample->offset+8,SEEK_SET); /* Assuming that jp and ftyp markers size do: */ fread(frame_codestream, sample->sample_size-8, 1, infile); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); if(cio == NULL) goto fin; img = opj_decode(dinfo, cio); if(img == NULL) goto fin; /* Convert frame to YUV: */ if (!imagetoyuv(img, argv[2])) goto fin; opj_cio_close(cio); 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; }/* for (snum */ 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); failed = 0; fin: fclose(infile); if(frame_codestream) free(frame_codestream); /* free remaining structures */ if(dinfo) { mj2_destroy_decompress(movie); free(dinfo); } return failed; }/* main() */ openjpeg-1.5.2/applications/mj2/mj2_to_metadata.dtd0000644000175000017500000006053612315002075022112 0ustar mathieumathieu openjpeg-1.5.2/applications/mj2/meta_out.h0000644000175000017500000000066512315002075020346 0ustar mathieumathieu/* meta_out.h */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Callable from mj2_to_metadata */ /* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ #define BOOL int #define FALSE 0 #define TRUE 1 void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d); int xml_write_struct(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr); openjpeg-1.5.2/applications/mj2/mj2_to_metadata.h0000644000175000017500000000035512315002075021557 0ustar mathieumathieu/* mj2_to_metadata.h */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ #define BOOL int #define FALSE 0 #define TRUE 1 #include "meta_out.h" openjpeg-1.5.2/applications/mj2/extract_j2k_from_mj2.c0000644000175000017500000001335712315002075022541 0ustar mathieumathieu/* * 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 #include #include #include "openjpeg.h" #include "cio.h" #include "j2k.h" #include "jp2.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); } /* -------------------------------------------------------------------------- */ #define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a" int main(int argc, char *argv[]) { opj_dinfo_t* dinfo; opj_event_mgr_t event_mgr; /* event manager */ int tnum, failed; unsigned int snum; opj_mj2_t *movie; mj2_tk_t *track; mj2_sample_t *sample; unsigned char* frame_codestream; FILE *mj2file, *outfile; char *outfilename; mj2_dparameters_t parameters; if (argc != 3) { printf("\nUsage: %s mj2filename output_location\n",argv[0]); printf("Example: %s foreman.mj2 output/foreman\n\n",argv[0]); return 1; } mj2file = fopen(argv[1], "rb"); if (!mj2file) { fprintf(stderr, "failed to open %s for reading\n", argv[1]); return 1; } { unsigned char buf[28]; memset(buf, 0, 28); fread(buf, 1, 24, mj2file); if(memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 && memcmp(buf+20, "\x6d\x6a\x70\x32", 4) == 0) { rewind(mj2file); } else { fclose(mj2file); fprintf(stderr,"%s:%d: %s\n\tThis file is not an MJ2 file." "Quitting\n",__FILE__,__LINE__, argv[0]); 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; failed = 1; outfilename = (char*)malloc(strlen(argv[2]) + 32); if(outfilename == NULL) goto fin; /* get a MJ2 decompressor handle */ dinfo = mj2_create_decompress(); if(dinfo == NULL) goto fin; /* 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 */ memset(¶meters, 0, sizeof(mj2_dparameters_t)); movie = (opj_mj2_t*) dinfo->mj2_handle; mj2_setup_decoder(movie, ¶meters); /* Create the movie structure: */ if (mj2_read_struct(mj2file, movie)) goto fin; /* Decode first video track : */ tnum = 0; while (movie->tk[tnum].track_type != 0) tnum ++; track = &movie->tk[tnum]; if(track->jp2_struct.enumcs != ENUMCS_SRGB && track->jp2_struct.enumcs != ENUMCS_GRAY) { fprintf(stderr,"%s:%d: %s\n" "\tERROR: this MJ2 file does not contain J2K frames.\n" "\tPlease try mj2_to_frames for this file.\n", __FILE__,__LINE__, argv[0]); goto fin; } 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(mj2file,sample->offset+8,SEEK_SET); /* Assuming that jp and ftyp markers size do: */ fread(frame_codestream,sample->sample_size-8,1, mj2file); sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); outfile = fopen(outfilename, "wb"); if (!outfile) { fprintf(stderr, "failed to open %s for writing\n",outfilename); goto fin; } fwrite(frame_codestream,sample->sample_size-8,1,outfile); fclose(outfile); free(frame_codestream); } fprintf(stdout, "%d frames correctly extracted\n", snum); failed = 0; fin: fclose(mj2file); free(outfilename); /* free remaining structures */ if(dinfo) { mj2_destroy_decompress(movie); free(dinfo); } return failed; }/* main() */ openjpeg-1.5.2/applications/mj2/frames_to_mj2.c0000644000175000017500000006716112315002075021257 0ustar mathieumathieu/* * 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 "openjpeg.h" #include "j2k_lib.h" #include "cio.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" #include "mj2_convert.h" #include "opj_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 for frames_to_mj2\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,"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,"-S : write SOP marker before each packet \n"); fprintf (stdout,"-E : 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," Example: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); fprintf (stdout,"-R : 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,"-D : depth, precision in bits [8 .. 16]; default:8\n"); fprintf(stdout,"-C : comment\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"); } OPJ_PROG_ORDER give_progression(char progression[5]) { if (progression[0] == 'L' && progression[1] == 'R' && progression[2] == 'C' && progression[3] == 'P') { return LRCP; } else { if (progression[0] == 'R' && progression[1] == 'L' && progression[2] == 'C' && progression[3] == 'P') { return RLCP; } else { if (progression[0] == 'R' && progression[1] == 'P' && progression[2] == 'C' && progression[3] == 'L') { return RPCL; } else { if (progression[0] == 'P' && progression[1] == 'C' && progression[2] == 'R' && progression[3] == 'L') { return PCRL; } else { if (progression[0] == 'C' && progression[1] == 'P' && progression[2] == 'R' && progression[3] == 'L') { return CPRL; } else { return PROG_UNKNOWN; } } } } } } 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; int value, failed; opj_mj2_t *movie; opj_image_t *img; int i, j; char *s, S1, S2, S3; unsigned char *buf; int x1, y1, len; long mdat_initpos, offset; FILE *mj2file; int sampleno; opj_cinfo_t* cinfo; opj_bool bSuccess; int numframes; int prec = 8;/* DEFAULT */ double total_time = 0; memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); /* default value */ /* ------------- */ 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; mj2_parameters.prec = 8; /* DEFAULT */ mj2_parameters.enumcs = ENUMCS_SYCC; mj2_parameters.meth = 1; /* enumerated color space */ /* 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 = opj_getopt(argc, argv, "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h"); if (c == -1) break; switch (c) { case 'i': /* IN fill */ { char *infile = opj_optarg; s = opj_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 = opj_optarg; while (*outfile) { outfile++; } outfile--; S3 = *outfile; outfile--; S2 = *outfile; outfile--; S1 = *outfile; outfile = opj_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 = opj_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 = opj_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 = opj_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(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); j2k_parameters->tile_size_on = OPJ_TRUE; break; /* ----------------------------------------------------- */ case 'n': /* resolution */ sscanf(opj_optarg, "%d", &j2k_parameters->numresolution); break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; char *s = opj_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(opj_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 'p': /* progression order */ { char progression[5]; strncpy(progression, opj_optarg, 5); 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(opj_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(opj_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 = opj_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(opj_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(opj_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(opj_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(opj_optarg) + 1); if(j2k_parameters->cp_comment) { strcpy(j2k_parameters->cp_comment, opj_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 (opj_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(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) { fprintf(stderr, "-F argument error"); return 1; } break; /* ------------------------------------------------------ */ case 'D': /* Depth: the precision */ if(sscanf(opj_optarg, "%d", &prec) != 1) prec = 0; break; default: return 1; } } /* Error messages */ /* -------------- */ if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { fprintf(stderr, "\nUsage: %s -i yuv-file -o mj2-file (+ options)\n\n",argv[0]); return 1; } if(prec < 1 || prec > 16) { fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n",prec); 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; /* YUV files only have 3 components */ mj2_parameters.prec = prec; 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; } failed = 1; /* get a MJ2 decompressor handle */ cinfo = mj2_create_compress(); if(cinfo == NULL) goto fin; movie = (opj_mj2_t*)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 == 0) { goto fin; } /* 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(movie->tk[0].chunk == NULL || movie->tk[0].sample == NULL) goto fin; if (mj2_init_stdmovie(movie)) { fprintf(stderr, "Error with movie initialization"); goto fin; } /* Writing JP, FTYP and MDAT boxes */ /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/ buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); if(buf == NULL) goto fin; cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); if(cio == NULL) goto fin; 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); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); buf = NULL; numframes = 0; for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) { mj2_tk_t *track; track = &movie->tk[i]; numframes = track->num_samples; if(track->track_type != 0) { fprintf(stderr, "Unable to write sound or hint tracks\n"); } else { int buflen = 0; track->num_chunks = track->num_samples; track->depth = prec; fprintf(stderr, "Video Track number %d\n", i); img = mj2_image_create(track, j2k_parameters); if(img == NULL) goto fin; buflen = 2 * (track->w * track->h * 8); buf = (unsigned char *) malloc(buflen*sizeof(unsigned char)); if(buf == NULL) { opj_image_destroy(img); goto fin; } for(sampleno = 0; sampleno < numframes; sampleno++) { double init_time = opj_clock(); double elapsed_time; if(yuvtoimage(track, img, sampleno, j2k_parameters, mj2_parameters.infile)) { fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); opj_image_destroy(img); goto fin; } /* 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); if(cio == NULL) goto fin; cio_skip(cio, 4); cio_write(cio, JP2_JP2C, 4); /* encode the image */ bSuccess = opj_encode(cinfo, cio, img, NULL); if (!bSuccess) { opj_image_destroy(img); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); buf = NULL; fprintf(stderr, "failed to encode image\n"); goto fin; } len = cio_tell(cio) - 8; cio_seek(cio, 0); cio_write(cio, len+8,4); opj_cio_close(cio); track->sample[sampleno].sample_size = len+8; track->sample[sampleno].offset = offset; track->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; } /* for(sampleno */ free(buf); buf = NULL; opj_image_destroy(img); } /* if(track ) */ }/* for(i */ fseek(mj2file, mdat_initpos, SEEK_SET); buf = (unsigned char*) malloc(4*sizeof(unsigned char)); if(buf == NULL) goto fin; /* Init a cio to write box length variable in a little endian way */ cio = opj_cio_open(NULL, buf, 4); if(cio == NULL) goto fin; cio_write(cio, offset - mdat_initpos, 4); fwrite(buf, 4, 1, mj2file); fseek(mj2file,0,SEEK_END); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); /* Writing MOOV box */ buf = (unsigned char*) malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char)); if(buf == NULL) goto fin; cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); if(cio == NULL) goto fin; mj2_write_moov(movie, cio); fwrite(buf,cio_tell(cio),1,mj2file); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", total_time, numframes, (float)numframes/total_time); failed = 0; fin: fclose(mj2file); /* free remaining compression structures */ if(cinfo) { mj2_destroy_compress(movie); free(cinfo); } if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); if(failed) remove(mj2_parameters.outfile); return failed; } openjpeg-1.5.2/applications/mj2/meta_out.c0000644000175000017500000033337412315002075020347 0ustar mathieumathieu/* meta_out.c */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Callable from mj2_to_metadata */ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. 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 /* for time functions */ #include "opj_includes.h" #include "mj2.h" #include #include "meta_out.h" 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, 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, 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); void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void UnixTimeToFileTime(time_t t, LPFILETIME pft); void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst); 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, 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, opj_event_mgr_t *event_mgr); 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, 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, 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, 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, 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 */ notes = n; sampletables = t; raw = r; derived = d; } 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) { fprintf(xmlout,"\n"); /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */ /* typical: SYSTEM mj2_to_metadata.dtd */ stringDTD[6] = '\0'; /* Break into two strings at space, so quotes can be inserted. */ fprintf(xmlout,"\n", stringDTD, stringDTD+7); stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */ } else fprintf(xmlout,"\n"); fprintf(xmlout, "\n"); xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); fprintf(xmlout, ""); return 0; } /* ------------- */ 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]; buf[4] = '\0'; fprintf(xmlout, " \n"); // Called after structure initialized by mj2_read_ftyp fprintf(xmlout, " \n"); uint_to_chars(movie->brand, buf); fprintf(xmlout, " %s\n", buf); /* 4 character; BR */ fprintf(xmlout, " %u\n", movie->minversion); /* 4 char; MinV */ fprintf(xmlout, " \n",movie->num_cl); for (i = movie->num_cl - 1; i > -1; i--) /* read routine stored in reverse order, so let's undo damage */ { uint_to_chars(movie->cl[i], buf); fprintf(xmlout, " %s\n", buf); /*4 characters, each CLi */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); 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 xml_write_free_and_skip(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ xml_write_uuid(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ return 0; } /* ------------- */ 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; fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->creation_time); if(notes) fprintf(xmlout, " \n"); /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time should be local or UTC */ if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, movie->creation_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->modification_time); if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, movie->modification_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", movie->timescale); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Rate to play presentation (default = 0x00010000) */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(raw) fprintf(xmlout, " 0x%08x\n", movie->rate); if(derived) fprintf(xmlout, " %12.6f\n", (double)movie->rate/(double)0x00010000); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->duration); if(derived) fprintf(xmlout, " %12.3f\n", (double)movie->duration/(double)movie->timescale); // Make this double later to get fractional seconds fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT movie->volume = movie->volume << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(raw) fprintf(xmlout, " 0x%04x\n", movie->volume); if(derived) fprintf(xmlout, " %6.3f\n", (double)movie->volume/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout, " \n"); movie->volume = movie->volume >> 8; #endif /* Transformation matrix for video */ fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[0]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[1]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[2]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[3]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[4]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[5]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[6]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[7]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[8]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", movie->num_vtk); fprintf(xmlout, " \n", movie->num_stk); fprintf(xmlout, " %d\n", movie->num_htk); if(notes) fprintf(xmlout, " \n"); /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Idea for the future: It would be possible to add code to verify that the file values: 1) are legal and self-consistent 2) comply with particular JP2 and/or MJ2 profiles. This could be reported here as additional XML elements */ // Find first video track tnum = 0; while (movie->tk[tnum].track_type != 0) tnum ++; track = &(movie->tk[tnum]); // For now, output info on first video track 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 */ fprintf(xmlout, " \n"); return 0; } /* --------------- */ void uint_to_chars(unsigned int value, char* buf) { /* buf is at least char[5] */ int i; for (i = 3; i >= 0; i--) { buf[i] = (value & 0x000000ff); value = (value >> 8); } buf[4] = '\0'; /* Precautionary */ } /* ------------- */ /* WINDOWS SPECIFIC */ void UnixTimeToFileTime(time_t t, LPFILETIME pft) { /* Windows specific. From MS Q167296 */ /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */ /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */ LONGLONG ll; /* LONGLONG is a 64-bit value. */ ll = Int32x32To64(t, 10000000) + 116444736000000000; pft->dwLowDateTime = (DWORD)ll; /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */ pft->dwHighDateTime = (DWORD)(ll >> 32); } // Once the UNIX time is converted to a FILETIME structure, // other Win32 time formats can be easily obtained by using Win32 functions such // as FileTimeToSystemTime() and FileTimeToDosDateTime(). /* ------------- */ void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst) { /* Windows specific */ FILETIME ft; UnixTimeToFileTime(t, &ft); FileTimeToLocalFileTime( &ft, &ft ); /* Adjust from UTC to local time zone */ FileTimeToSystemTime(&ft, pst); } /* ------------- */ void xml_time_out(FILE* xmlout, time_t t) { /* Windows specific */ SYSTEMTIME st; char szLocalDate[255], szLocalTime[255]; UnixTimeToSystemTime( t, &st ); GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255 ); GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 ); fprintf(xmlout, "%s %s", szLocalDate, szLocalTime ); } /* END WINDOWS SPECIFIC */ /* ------------- */ 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) can contain multiple Copyright 'cprt' with different language codes */ /* There may be nested non-standard boxes within udta */ IMAGINE movie->udta, movie->copyright_count, movie->copyright_language[i] (array of 16bit ints), movie->copyright_notice[i] (array of buffers) PROBABLY ALSO NEED movie->udta_len or special handler for non-standard boxes char buf[5]; int i; if(movie->udta != 1) return; /* Not present */ fprintf(xmlout, " \n"); for(i = 0; i < movie->copyright_count; i++) { fprintf(xmlout, " Instance=\"%d\">\n", i+1); int16_to_3packedchars((short int)movie->copyright_languages[i], buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " %s\n",movie->copyright_notices[i]); fprintf(xmlout, " \n", i+1); } /* TO DO: Non-standard boxes */ fprintf(xmlout, " \n"); #endif } 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. Let's assume unstructured, and do a dump */ IMAGINE movie->free_and_skip, movie->free_and_skip_count, movie->free_and_skip_content[i] (array of buffers), movie->free_and_skip_len[i] (array of ints), movie->is_skip[i] (array of BOOL) int i; if(movie->free_and_skip != 1) return; /* Not present */ for(i = 0; i < movie->free_and_skip_count; i++) { if(movie->is_skip[i]) fprintf(xmlout, " \n"); else fprintf(xmlout, " \n"); xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i], movie->free_and_skip_len[i]); if(movie->is_skip[i]) fprintf(xmlout, " \n"); else fprintf(xmlout, " \n"); } #endif } 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. This function supports the top level of the file, but uuid may be elsewhere [not yet supported]. This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ IMAGINE movie->uuid, movie->uuid_count, movie->uuid_content[i] (array of buffers), movie->uuid_len[i] (array of ints), movie->uuid_type[i] (array of 17-byte (16+null termination) buffers) int i; if(movie->uuid != 1) return; /* Not present */ for(i = 0; i < movie->uuid_count; i++) { fprintf(xmlout, " \n", movie->uuid_type[i]); // See Part III section 5.2.1, 6.1, 6.2 xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]); fprintf(xmlout, " \n"); } #endif } /* ------------- */ 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); // TO DO: TrackReferenceContainer 'tref' just used in hint track // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate xml_write_mdia(file, xmlout, track, tnum); xml_write_udta(file, xmlout, track, tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt' if(track->track_type==0) { /* Only do for visual track */ /* sampleframe is from user option -f. 1 = first frame */ /* sampleframe of 0 is a user requests: no jp2 header */ /* Treat out-of-bounds values in the same way */ if(sampleframe > 0 && sampleframe <= track->num_samples) { mj2_sample_t *sample; unsigned int snum; snum = sampleframe-1; // 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, event_mgr)) return; /* Not great error handling here */ } } fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " %u\n", track->track_ID); if(track->track_type==0) /* For visual track */ { fprintf(xmlout, " %d\n", track->layer); if(notes) fprintf(xmlout," \n"); } if(track->track_type!=0) /* volume irrelevant for visual track */ { #ifdef CURRENTSTRUCT track->volume = track->volume << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); } if(raw) fprintf(xmlout," 0x%04x\n", track->volume); if(derived) fprintf(xmlout," %6.3f\n", (double)track->volume/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout, " \n"); track->volume = track->volume >> 8; #endif } if(track->track_type==0) { /* Transformation matrix for video */ fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); } fprintf(xmlout, " 0x%08x\n", track->trans_matrix[0]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[1]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[2]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[3]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[4]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[5]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[6]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[7]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[8]); fprintf(xmlout, " \n"); } #ifdef CURRENTSTRUCT track->w = track->w << 16; track->h = track->h << 16; #endif if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->w); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->w/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->h); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->h/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } track->w = track->w >> 16; track->h = track->h >> 16; #endif fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) can contain multiple Copyright 'cprt' with different language codes */ /* There may be nested non-standard boxes within udta */ #ifdef NOTYET IMAGINE track->udta, track->copyright_count, track->copyright_language[i] (array of 16bit ints), track->copyright_notice[i] (array of buffers) PROBABLY ALSO NEED track->udta_len or special handler for non-standard boxes char buf[5]; int i; if(track->udta != 1) return; /* Not present */ fprintf(xmlout, " \n"); for(i = 0; i < track->copyright_count; i++) { fprintf(xmlout, " Instance=\"%d\">\n", i+1); int16_to_3packedchars((short int)track->copyright_languages[i], buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " %s\n",track->copyright_notices[i]); fprintf(xmlout, " \n", i+1); } /* TO DO: Non-standard boxes */ fprintf(xmlout, " \n"); #endif } /* ------------- */ void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { char buf[5]; int i, k; buf[4] = '\0'; fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->creation_time); if(notes) fprintf(xmlout, " \n"); /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time should be local or UTC */ if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, track->creation_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->modification_time); if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, track->modification_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->timescale); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->duration); if(derived) fprintf(xmlout, " %12.3f\n", (double)track->duration/(double)track->timescale); // Make this double later to get fractional seconds fprintf(xmlout, " \n"); int16_to_3packedchars((short int)track->language, buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); switch(track->track_type) { case 0: fprintf(xmlout, " video media track\n"); break; case 1: fprintf(xmlout, " Sound\n"); break; case 2: fprintf(xmlout, " Hint\n"); break; } if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); switch(track->track_type) { case 0: fprintf(xmlout, " \n"); fprintf(xmlout, " 0x%02x\n", track->graphicsmode); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); /* fprintf(xmlout," \n"); This was evidently dropped upon amendment */ fprintf(xmlout," \n"); fprintf(xmlout," \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " 0x%02x\n", track->opcolor[0]); fprintf(xmlout, " 0x%02x\n",track->opcolor[1]); fprintf(xmlout, " 0x%02x\n",track->opcolor[2]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); break; case 1: fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT track->balance = track->balance << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); } if(raw) fprintf(xmlout," 0x%04x\n", track->balance); if(derived) fprintf(xmlout," %6.3f\n", (double)track->balance/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout," \n"); track->balance = track->balance >> 8; #endif fprintf(xmlout, " \n"); break; case 2: fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->maxPDUsize); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->avgPDUsize); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->maxbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->avgbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->slidingavgbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " \n"); break; } fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_url, track->num_urn); // table w. flags, URLs, URNs // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. // We could infer those, but for now just present everything as a DREF table. if(notes) fprintf(xmlout, " \n"); for(k = 0; k < track->num_url; k++) { fprintf(xmlout, " \n"); // table w. flags, URLs, URNs if(notes) fprintf(xmlout," \n"); for(i = 0; i < 4; i++) { uint_to_chars(track->url[track->num_url].location[i], buf); fprintf(xmlout, " %s\n"); } fprintf(xmlout, " \n"); // table w. flags, URLs, URNs } for(k = 0; k < track->num_urn; k++) { fprintf(xmlout," \n"); // table w. flags, URLs, URNs // Only the first 16 bytes are recorded in the data structure currently. if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " "); for(i = 0; i < 4; i++) { uint_to_chars(track->urn[track->num_urn].name[i], buf); fprintf(xmlout,"%s", buf); } fprintf(xmlout, "\n"); fprintf(xmlout, " "); for(i = 0; i < 4; i++) { uint_to_chars(track->urn[track->num_urn].location[i], buf); fprintf(xmlout,"%s"); } fprintf(xmlout, "\n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { char buf[5], buf33[33]; int i, len; buf[4] = '\0'; fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); switch(track->track_type) { case 0: // There could be multiple instances of this, but "entry_count" is just a local at read-time. // And it's used wrong, too, as count of just visual type, when it's really all 3 types. // This is referred to as "smj2" within mj2.c fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */ fprintf(xmlout, " %d\n", track->w); fprintf(xmlout, " %d\n", track->h); // Horizresolution and vertresolution don't require shifting, already stored right in CURRENTSTRUCT if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->horizresolution); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->horizresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->vertresolution); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->vertresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); buf33[0] = '\0'; for(i = 0; i < 8; i++) { uint_to_chars((unsigned int)track->compressorname[i], buf); strcat(buf33, buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */ } len = (int)buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */ buf33[len+1] = '\0'; /* Suppress it */ fprintf(xmlout, " %s\n", buf33+1); /* Start beyond first byte */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " 0x%02x\n",track->depth); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */ /* Following subboxes are optional */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", (unsigned int)track->fieldcount); /* uchar as 1 byte uint */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", (unsigned int)track->fieldorder); /* uchar as 1 byte uint */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n",track->num_br); for (i = 0; i < track->num_br; i++) /* read routine stored in reverse order, so let's undo damage */ { uint_to_chars(track->br[i], buf); fprintf(xmlout, " %s\n", buf); /*4 characters, each CLi */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n",track->num_jp2x); for (i = 0; i < track->num_jp2x; i++) { // We'll probably need better formatting than this fprintf(xmlout, " 0x%02x\n", track->jp2xdata[i]); /* Each entry is single byte */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* These values are all 1 byte */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->hsub); fprintf(xmlout, " %d\n", track->vsub); fprintf(xmlout, " %d\n", track->hoff); fprintf(xmlout, " %d\n", track->voff); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); /* These values are all 1 byte */ fprintf(xmlout, " \n"); /* Part III Appx. 2 */ fprintf(xmlout, " %u\n", (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %u\n", (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); break; case 1: case 2: if(notes) fprintf(xmlout, " \n"); break; } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->num_samples); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_tts); for (i = 0; i < track->num_tts; i++) { fprintf(xmlout, " \n", i+1, track->tts[i].sample_count, track->tts[i].sample_delta); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_samplestochunk); for (i = 0; i < track->num_samplestochunk; i++) { fprintf(xmlout, " %u\n",track->sampletochunk[i].first_chunk); /* 4 bytes */ fprintf(xmlout, " %u\n",track->sampletochunk[i].samples_per_chunk); /* 4 bytes */ fprintf(xmlout, " %u\n",track->sampletochunk[i].sample_descr_idx); /* 4 bytes */ } fprintf(xmlout, " \n"); // After reading this info in, track->num_chunks is calculated and a decompressed table established internally. fprintf(xmlout, " \n"); if(track->same_sample_size) { // all values in track->sample[i].sample_size are equal. Grab the first one. fprintf(xmlout, " %u\n", track->sample[0].sample_size); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } else { fprintf(xmlout, " 0\n"); if(notes) if(sampletables) fprintf(xmlout," \n"); else fprintf(xmlout," \n"); fprintf(xmlout, " %u\n", track->num_samples); if(sampletables) for (i = 0; i < (int)track->num_samples; i++) { fprintf(xmlout, " %u\n", i+1, track->sample[i].sample_size); } } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); // Structure not yet - Variant ChunkLargeOffset 'co64' fprintf(xmlout, " %u\n", track->num_chunks); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(sampletables) for (i = 0; i < (int)track->num_chunks; i++) fprintf(xmlout, " %u\n", i+1, track->chunk[i].offset); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* ------------- */ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr) { opj_dparameters_t parameters; /* decompression parameters */ opj_image_t *img; opj_cp_t *cp; int i; int numcomps; unsigned char* frame_codestream; 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) 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); /* 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) */ /* 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) */ #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; */ 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 */ // 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"); /* 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_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. */ #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 */ /* 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"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); /* size of the vector tileno */ #ifdef NOTYET IMAGINE the cp object has data to support the following... but we could use an new different data structure instead /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */ /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */ xml_out_frame_jp2i(xmlout, &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */ xml_out_frame_xml(xmlout, &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */ xml_out_frame_uinf(xmlout, &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ #endif fprintf(xmlout, " \n"); /* 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)) { 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 fprintf(xmlout, " \n"); } else { fprintf(xmlout, " \n"); } } opj_destroy_decompress(dinfo); opj_cio_close(cio); free(frame_codestream); return 0; } /* ------------- */ void int16_to_3packedchars(short int value, char* buf) { /* This is to retrieve the 3-letter ASCII language code */ /* Each char is packed into 5 bits, as difference from 0x60 */ int i; for (i = 2; i >= 0; i--) { buf[i] = (value & 0x001f) + 0x60; value = (value >>5); } buf[3] = '\0'; } /* ------------- */ void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp) { opj_image_comp_t *comp; int i; fprintf(xmlout, " \n"); // This is similar to j2k.c's j2k_dump_image. // Not of interest: Lsiz, Rsiz fprintf(xmlout, " %d\n", img->x1); fprintf(xmlout, " %d\n", img->y1); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", img->x0); fprintf(xmlout, " %d\n", img->y0); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", cp->tdx); fprintf(xmlout, " %d\n", cp->tdy); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", cp->tx0); fprintf(xmlout, " %d\n", cp->ty0); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", img->numcomps); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); //fprintf(xmlout," \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } for (i = 0; i < img->numcomps; i++) {/* image-components */ comp = &(img->comps[i]); fprintf(xmlout, " \n", i+1); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," 0x%02x\n", (comp->sgnd << 7) & (comp->prec - 1)); if(derived) { fprintf(xmlout," %d\n", comp->sgnd); fprintf(xmlout," %d\n", comp->prec); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", comp->dx); fprintf(xmlout, " %d\n", comp->dy); fprintf(xmlout, " %d\n", comp->w); fprintf(xmlout, " %d\n", comp->h); /* Rest of these aren't calculated when SIZ is read: fprintf(xmlout, " %d\n", comp->x0); fprintf(xmlout, " %d\n", comp->y0); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", comp->bpp); fprintf(xmlout, " %d\n", comp->resno_decoded); */ // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," %dfactor); /* factor = number of division by 2 of the out image compare to the original size of image */ // TO DO comp->data: int *data; /* image-component data */ fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); } /* ------------- */ 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 */ opj_tccp_t *tccp; int i; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } tccp = &(tcp->tccps[0]); fprintf(xmlout, "%s\n",s); /* Required in main header */ /* Not retained or of interest: Lcod */ fprintf(xmlout, "%s 0x%02x\n", s, tcp->csty); /* 1 byte */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s %d\n", s, tcp->prg); /* 1 byte, SGcod (A) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s %d\n", s, tcp->numlayers); /* 2 bytes, SGcod (B) */ fprintf(xmlout, "%s %d\n", s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */ if(notes) fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ fprintf(xmlout, "%s \n",s); /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */ /* So we only have to report the first component's values here. */ /* Compare j2k_read_cox(...) */ fprintf(xmlout, "%s %d\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s 0x%02x\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s %d\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ if(notes) fprintf(xmlout, "%s \n",s); if (tccp->csty & J2K_CP_CSTY_PRT) { fprintf(xmlout, "%s \n",s); /* 1 byte, SPcox (I_i) */ if(notes) fprintf(xmlout, "%s \n",s); for (i = 0; i < tccp->numresolutions; i++) { fprintf(xmlout, "%s \n", s, i); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->prcw[i]); fprintf(xmlout,"%s %d\n", s, tccp->prch[i]); } fprintf(xmlout, "%s \n", s, i); } fprintf(xmlout, "%s \n",s); /* 1 byte, SPcox (I_i) */ } fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s\n",s); } /* ------------- */ void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ { /* Uses global j2k_default_tcp */ opj_tccp_t *tccp, *firstcomp_tccp; int i, compno; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } firstcomp_tccp = &(tcp->tccps[0]); /* Internal data structure tccp defines separate defaults for each component, set from main */ /* default, then selectively overwritten. */ /* Compare j2k_read_cox(...) */ /* We don't really know which was the default, and which were not */ /* 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) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); } for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ { tccp = &tcp->tccps[compno]; if(same_component_style(firstcomp_tccp, tccp)) continue; /* Alignments: " < < < < < To help maintain xml pretty-printing */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ if(notes) fprintf(xmlout, "%s \n", s); /* Overrides the main COD for the specific component */ /* Not retained or of interest: Lcod */ fprintf(xmlout, "%s 0x%02x\n", s, tccp->csty); /* 1 byte */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s %d\n", s, compno); /* 1 or 2 bytes */ /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ /*if(j2k_img_numcomps <=256) component is 1 byte else compno is 2 byte */ /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s %d\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s 0x%02x\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s %d\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ if(notes) fprintf(xmlout, "%s \n", s); if (tccp->csty & J2K_CP_CSTY_PRT) { fprintf(xmlout, "%s \n", s); /* 1 byte, SPcox (I_i) */ if(notes) fprintf(xmlout, "%s \n", s); for (i = 0; i < tccp->numresolutions-1; i++) { /* subtract 1 to get # of decomposition levels */ fprintf(xmlout, "%s \n", s, i); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->prcw[i]); fprintf(xmlout,"%s %d\n", s, tccp->prch[i]); } fprintf(xmlout, "%s \n", s, i); } fprintf(xmlout, "%s \n", s); /* 1 byte, SPcox (I_i) */ } fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); } } /* ------------- */ BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int i; if(tccp1->numresolutions != tccp2->numresolutions) return FALSE; if(tccp1->cblkw != tccp2->cblkw) return FALSE; if(tccp1->cblkh != tccp2->cblkh) return FALSE; if(tccp1->cblksty != tccp2->cblksty) return FALSE; if(tccp1->csty != tccp2->csty) return FALSE; if (tccp1->csty & J2K_CP_CSTY_PRT) { for (i = 0; i < tccp1->numresolutions; i++) { if(tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) return FALSE; } } return TRUE; } /* ------------- */ 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 */ opj_tccp_t *tccp; int bandno, numbands; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } /* Compare j2k_read_qcx */ fprintf(xmlout, "%s\n", s); /* Required in main header, single occurrence */ tccp = &(tcp->tccps[0]); /* Not retained or of interest: Lqcd */ fprintf(xmlout, "%s \n", s); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); if(raw) fprintf(xmlout, "%s 0x%02x\n", s, (tccp->numgbits) << 5 | tccp->qntsty); if(derived) fprintf(xmlout, "%s %d\n", s, tccp->qntsty); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } if(derived) fprintf(xmlout, "%s %d\n", s, tccp->numgbits); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ /* So we'll just dump all internal values */ /* We could calculate it, but I'm having trouble believing the length equations in the standard */ fprintf(xmlout, "%s \n", s); switch(tccp->qntsty) { case J2K_CCP_QNTSTY_NOQNT: /* no quantization */ /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */ numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ /* Instead look for first zero exponent, quit there. Adequate? */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; /* Remove when we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, tccp->stepsizes[bandno].expn << 3); if(derived) fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */ /* This is what standard says. Should I believe it:: len = 5; /* numbands = 1; */ fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; fprintf(xmlout, "%s %d\n", s, bandno, tccp->stepsizes[bandno].expn); } fprintf(xmlout, "%s \n", s); break; default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */ /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) break; /* Remove when we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].mant); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; } /* switch */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); /* Alignments: " < < < < < To help maintain xml pretty-printing */ } /* ------------- */ 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 */ 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) { s++;s++; /* shorten s to 10 spaces if main */ } firstcomp_tccp = &(tcp->tccps[0]); /* Internal data structure tccp defines separate defaults for each component, set from main */ /* default, then selectively overwritten. */ /* Compare j2k_read_qcx(...) */ /* We don't really know which was the default, and which were not */ /* 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) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); } for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ { tccp = &(tcp->tccps[compno]); if(same_component_quantization(firstcomp_tccp, tccp)) continue; /* Compare j2k_read_qcx */ fprintf(xmlout, "%s\n", s, compno); /* Required in main header, single occurrence */ 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) fprintf(xmlout, "%s \n", s); if(raw) fprintf(xmlout, "%s 0x%02x\n", s, (tccp->numgbits) << 5 | tccp->qntsty); if(derived) fprintf(xmlout, "%s %d\n", s, tccp->qntsty); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } if(derived) fprintf(xmlout, "%s %d\n", s, tccp->numgbits); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ /* So we'll just dump all internal values */ fprintf(xmlout, "%s \n", s); switch(tccp->qntsty) { case J2K_CCP_QNTSTY_NOQNT: numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ /* Instead look for first zero exponent, quit there. Adequate? */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; /* Remove this once we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, tccp->stepsizes[bandno].expn << 3); if(derived) fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; case J2K_CCP_QNTSTY_SIQNT: /* numbands = 1; */ fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; fprintf(xmlout, "%s %d\n", s, bandno, tccp->stepsizes[bandno].expn); } fprintf(xmlout, "%s \n", s); break; default: /* J2K_CCP_QNTSTY_SEQNT */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) break; /* Remove this once we have real numbands count */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].mant); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; } /* switch */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); } /* Alignments: " < < < < < To help maintain xml pretty-printing */ } /* ------------- */ BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int bandno, numbands; if(tccp1->qntsty != tccp2->qntsty) return FALSE; if(tccp1->numgbits != tccp2->numgbits) return FALSE; switch(tccp1->qntsty) { case J2K_CCP_QNTSTY_NOQNT: numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Instead look for first zero exponent, quit there. Adequate? */ for (bandno = 0; bandno < numbands; bandno++) { if(tccp1->stepsizes[bandno].expn == 0) break; if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) return FALSE; } break; case J2K_CCP_QNTSTY_SIQNT: /* numbands = 1; */ if(tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn || tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) return FALSE; /* Don't need to check remainder, since they are calculated from [0] */ break; default: /* J2K_CCP_QNTSTY_SEQNT */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* This comparison may cause us problems with trailing junk values. */ for (bandno = 0; bandno < numbands; bandno++) { if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn || tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant); return FALSE; } break; } /* switch */ return TRUE; } /* ------------- */ 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) { s++;s++; /* shorten s to 10 spaces if main */ } for(compno = 0; compno < numcomps; compno++) { SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */ if(SPrgn == 0) continue; /* Yet another kludge */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ if(notes) fprintf(xmlout, "%s\n", s); /* Not retained or of interest: Lrgd */ fprintf(xmlout, "%s 0\n", s); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s %d\n", s, compno); /* 1 or 2 bytes */ fprintf(xmlout, "%s %d\n", s, SPrgn); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "POC != 1) return; /* Not present */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does the spec really allow that? */ /* 2 bytes, not retained; Lpoc */ /* I probably didn't get this dump precisely right. */ for (i = 0; i < tcp->numpocs; i++) { poc = &tcp->pocs[i]; fprintf(xmlout, "%s \n", s, i+1); fprintf(xmlout, "%S %d\n", s, poc->resno0); /* 1 byte, RSpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->prg); /* 1 byte Ppoc_i */ if(notes) { fprintf(xmlout,"%s \n", s); fprintf(xmlout,"%s \n", s); fprintf(xmlout,"%s \n", s); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%sppm != 1) return; /* Not present */ /* Main header uses indent of 10 spaces */ fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ /* 2 bytes Lppm not saved */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* 1 byte, not retained ; Zppm is sequence # of this PPM header */ /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */ /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */ /* Not real clear whether to use ppm->store or ppm_len as upper bound */ fprintf(xmlout, " \n"); xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len); /* Dump packet headers 1 byte at a time: lppm[i][j] */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ } /* ------------- */ 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() */ int j; if(tcp->ppt != 1) return; /* Not present */ /* Tile-part indents are 12 spaces */ fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ /* 2 bytes Lppm not saved */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* 1 byte, not retained ; Zppt is sequence # of this PPT header */ /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */ /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */ /* Not real clear whether to use ppt->store or ppt_len as upper bound */ fprintf(xmlout, " \n"); xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len); /* Dump packet headers 1 byte at a time: lppt[i][j] */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */ } #endif SUPPRESS_FOR_NOW /* ------------- */ void xml_out_frame_tlm(FILE* xmlout) { /* opt, main header only. May be multiple. */ /* Compare j2k_read_tlm()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ /* Main header indents are 10 spaces */ } /* ------------- */ void xml_out_frame_plm(FILE* xmlout) { /* opt, main header only; can be used in conjunction with tile-part's PLT */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* Compare j2k_read_plm()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ /* Main header indents are 10 spaces */ } /* ------------- */ 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 */ } /* ------------- */ void xml_out_frame_crg(FILE* xmlout) { /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */ /* Compare j2k_read_crg()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ #ifdef NOTYET THIS PSEUDOCODE IMAGINES THESE EXIST: j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*, j2k_default_tcp->crg_ycrg* (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE) if(j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0) return; /* Not present */ /* Main header indents are 10 spaces */ fprintf(xmlout, " \n", j2k_default_tcp->crg_i); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */ for (i = 0; i < j2k_default_tcp->crg_i; i++) { fprintf(xmlout, " \n", i+1); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," %d\n", j2k_default_tcp->crg_xcrg[i]); if(derived) { /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */ fprintf(xmlout," %.4f\n", ((double)j2k_default_tcp->crg_xcrg[i])/655.36); /* We could do another calculation that include XRsiz[i]; maybe later. */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," %d\n", j2k_default_tcp->crg_ycrg[i]); if(derived) { fprintf(xmlout," %f\n", ((double)j2k_default_tcp->crg_ycrg[i])/655.36); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); #endif } /* ------------- */ /* 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, 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*/ char* s = spaces; if(tcp == &j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } THIS PSEUDOCODE IMAGINES THESE EXIST: tcp->com, tcp->com_len, tcp->com_data array if(tcp->com != 1) return; /* Not present */ fprintf(xmlout, "%s\n", s); /* Optional in main or tile-part header */ xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s); fprintf(xmlout, "%s\n", s); #endif } void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s) { /* s is a string of spaces for indent */ int i; /* This is called when raw is true, or there is no appropriate derived form */ fprintf(xmlout, "%s\n", s); fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */ for (i = 0; i < data_len; i++) { /* Dump packet headers */ fprintf(xmlout, "%02x", data[i]); } fprintf(xmlout, "%s\n", s); } /* Define this as an even number: */ #define BYTES_PER_DUMP_LINE 40 /* Current total width for Hex and ASCII is : 11 spaces lead + (3 * BPDL) + 2 spaces + BPDL */ void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s) { /* s is a string of spaces for indent */ int i,j; if(raw) xml_out_dump_hex(xmlout, data, data_len, s); if(derived) { fprintf(xmlout, "%s\n", s); for (i = 0; i < data_len; ) { fprintf(xmlout,"%s ", s); /* Additional leading space added in loop */ /* First column: hex */ for (j = 0; j < BYTES_PER_DUMP_LINE; j++) /* Dump bytes */ fprintf(xmlout," %02x", data[i+j]); /* Space between columns... */ fprintf(xmlout, " "); /* Second column: ASCII */ for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) { if(isprint((int)data[i]) && i < data_len) fprintf(xmlout,"%c", data[i]); else fprintf(xmlout," "); } /* If we also wanted to output UCS-2 Unicode as a third column, then entire document must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII in column 2. */ } fprintf(xmlout, "%s\n", s); } } /* ------------- */ 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"); /* Compare jp2_read_ihdr(jp2_struct)) */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->h); /* 4 bytes */ fprintf(xmlout, " %d\n", jp2_struct->w); /* 4 bytes */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->numcomps); /* 2 bytes */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " \n"); /* 1 byte */ if(jp2_struct->bpc == 255) { fprintf(xmlout, " 0x%02x\n", jp2_struct->bpc); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); } else { /* Not 0xff */ if(raw) { fprintf(xmlout, " 0x%02x\n", jp2_struct->bpc); /* 1 byte */ if(notes) fprintf(xmlout," \n"); } if(derived) { fprintf(xmlout, " %d\n", jp2_struct->bpc & 0x7f); fprintf(xmlout, " %d\n", jp2_struct->bpc >> 7); } } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->C); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " %d\n", jp2_struct->UnkC); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 1 byte */ fprintf(xmlout, " %d\n", jp2_struct->IPR); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " \n"); if (jp2_struct->bpc == 255) { fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); /* Bits per pixel varies with components */ /* Compare jp2_read_bpcc(jp2_struct) */ for (i = 0; i < (int)jp2_struct->numcomps; i++) { if(raw) fprintf(xmlout," 0x%02x\n", jp2_struct->comps[i].bpcc); /* 1 byte */ if(derived) { fprintf(xmlout," %d\n", (jp2_struct->comps[i].bpcc & 0x7f)+1); fprintf(xmlout," %d\n", jp2_struct->comps[i].bpcc >> 7); } } fprintf(xmlout, " \n"); } /* Compare jp2_read_colr(jp2_struct) */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->meth); /* 1 byte */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " %d\n", jp2_struct->precedence); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->approx); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); if (jp2_struct->meth == 1) { fprintf(xmlout, " %d\n", jp2_struct->enumcs); /* 4 bytes */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } else if(notes) fprintf(xmlout, " \n"); /* only 1 byte is read and nothing stored */ fprintf(xmlout, " \n"); /* TO DO? No OpenJPEG support. Palette 'pclr' ComponentMapping 'cmap' ChannelDefinition 'cdef' Resolution 'res' */ fprintf(xmlout, " \n"); } /* ------------- */ #ifdef NOTYET IMAGE these use cp structure, extended... but we could use a new data structure instead 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) if(cp->jp2i != 1) return; /* Not present */ for(i = 0; i < cp->jp2i_count; i++) { fprintf(xmlout, " \n"); /* I think this can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]); fprintf(xmlout, " \n"); } } 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. ASSUME ASSUME EACH LINE IS ENDED BY \n. int i; if(cp->xml != 1) return; /* Not present */ for(i = 0; i < cp->xml_count; i++) { fprintf(xmlout, " \n", i+1); /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. Being lazy, didn't indent here. */ fprintf(xmlout,cp->xml_data[i]); /* May be multiple lines */ /* Could check if this is well-formed */ fprintf(xmlout, " \n"); } } 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. */ /* A UUID is a 16-byte value. There is a conventional string representation for it: "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */ /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However, such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of the same type, or not." Here, we choose not to. */ int i; IMAGE cp->uuid, cp->uuid_count, cp->uuid_value (array of uuids... let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints) if(cp->juuid != 1) return; /* Not present */ for(i = 0; i < cp->uuid_count; i++) { fprintf(xmlout, " fprintf(xmlout, " %s\n", cp->uuid_value[i]); fprintf(xmlout, " \n"); /* I think this can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } 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) */ /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */ /* Assume UUIDs stored in canonical string format */ int i, j; IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu (array of ints) cp->uinf_uuid (2 dimensional array of uuids... let's say fixed-length strings), cp->uinf_url (array of char buffers) if(cp->uinf != 1) return; /* Not present */ for(i = 0; i < cp->uuid_count; i++) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n",cp->cp->uinf_ulst_nu[i]); for(j = 0; j < cp->uinf_ulst_nu[i]; j++) fprintf(xmlout, " %s\n", cp->uuif_uuid[i][j], j+1); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Could add VERS and FLAG here */ fprintf(xmlout, " \n"); fprintf(xmlout, " %s",cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } IMAGE these use cp structure, extended... but we could use a new data structure instead 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, or otherwise unrecognized by a reader, may be ignored." Also, it says "the following types are not and will not be used, or used only in their existing sense, in future versions of this specification, to avoid conflict with existing content using earlier pre-standard versions of this format: clip, crgn, matt, kmat, pnot, ctab, load, imap; track reference types tmcd, chap, sync,scpt, ssrc" [But good luck figuring out the mapping.] Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g., JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including MJ2] require that readers ignore objects that are unrecognizable to them". */ int i; IMAGE cp->unknown_type, cp->unknown_type_count, cp->unknown_type_boxtype (array of buf[5]s), cp->unknown_type_data (array of chars), cp->unknown_type_len (array of ints) if(cp->unknown_type != 1) return; /* Not present */ for(i = 0; i < cp->unknown_type_count; i++) { fprintf(xmlout, " \n", cp->unknown_type_boxtype[i]); /* Can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i], cp->unknown_type_len[i]); fprintf(xmlout, " \n"); } } #endif openjpeg-1.5.2/applications/mj2/Makefile.am0000644000175000017500000000512312315002075020406 0ustar mathieumathieuMAINTAINERCLEANFILES = Makefile.in OPJ_SRC = \ ../../libopenjpeg/bio.c \ ../../libopenjpeg/cio.c \ ../../libopenjpeg/dwt.c \ ../../libopenjpeg/event.c \ ../../libopenjpeg/image.c \ ../../libopenjpeg/j2k.c \ ../../libopenjpeg/j2k_lib.c \ ../../libopenjpeg/jp2.c \ ../../libopenjpeg/jpt.c \ ../../libopenjpeg/mct.c \ ../../libopenjpeg/mqc.c \ ../../libopenjpeg/openjpeg.c \ ../../libopenjpeg/pi.c \ ../../libopenjpeg/raw.c \ ../../libopenjpeg/t1.c \ ../../libopenjpeg/t2.c \ ../../libopenjpeg/tcd.c \ ../../libopenjpeg/tgt.c \ ../../libopenjpeg/cidx_manager.c \ ../../libopenjpeg/phix_manager.c \ ../../libopenjpeg/ppix_manager.c \ ../../libopenjpeg/thix_manager.c \ ../../libopenjpeg/tpix_manager.c bin_PROGRAMS = \ frames_to_mj2 \ mj2_to_frames \ extract_j2k_from_mj2 \ wrap_j2k_in_mj2 frames_to_mj2_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/common \ -I$(top_builddir)/applications/common \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ -DOPJ_STATIC frames_to_mj2_CFLAGS = frames_to_mj2_LDADD = -lm frames_to_mj2_SOURCES = \ $(OPJ_SRC) \ ../common/opj_getopt.c \ mj2_convert.c \ mj2.c \ frames_to_mj2.c \ mj2.h \ mj2_convert.h mj2_to_frames_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/common \ -I$(top_builddir)/applications/common \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ @LCMS2_CFLAGS@ \ @LCMS1_CFLAGS@ \ -DOPJ_STATIC mj2_to_frames_CFLAGS = mj2_to_frames_LDADD = @LCMS2_LIBS@ @LCMS1_LIBS@ -lm mj2_to_frames_SOURCES = \ $(OPJ_SRC) \ ../common/color.c \ ../common/opj_getopt.c \ mj2_convert.c \ mj2.c \ mj2_to_frames.c \ mj2.h \ mj2_convert.h extract_j2k_from_mj2_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/common \ -I$(top_builddir)/applications/common \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ -DOPJ_STATIC extract_j2k_from_mj2_CFLAGS = extract_j2k_from_mj2_LDADD = -lm extract_j2k_from_mj2_SOURCES = \ $(OPJ_SRC) \ mj2.c \ extract_j2k_from_mj2.c \ mj2.h wrap_j2k_in_mj2_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/common \ -I$(top_builddir)/applications/common \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ -DOPJ_STATIC wrap_j2k_in_mj2_CFLAGS = wrap_j2k_in_mj2_LDADD = -lm wrap_j2k_in_mj2_SOURCES = \ $(OPJ_SRC) \ mj2.c \ wrap_j2k_in_mj2.c \ mj2.h EXTRA_DIST = \ CMakeLists.txt install-data-hook: @echo -e " (B)\t$(bindir)/frames_to_mj2$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/mj2_to_frames$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/extract_j2k_from_mj2$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/wrap_j2k_in_mj2$(EXEEXT)" >> $(top_builddir)/report.txt openjpeg-1.5.2/applications/mj2/mj2.h0000644000175000017500000002317512315002075017222 0ustar mathieumathieu/* * 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 1 /** Compressed format used in parameters MJ2 = 0 */ #define MJ2_CFMT 2 /* ----------------------------------------------------------------------- */ /** Time To Sample */ typedef struct mj2_tts { int sample_count; int sample_delta; } mj2_tts_t; /** Chunk */ typedef struct mj2_chunk { unsigned int num_samples; int sample_descr_idx; int offset; } mj2_chunk_t; /** Sample to chunk */ typedef struct mj2_sampletochunk { unsigned int first_chunk; unsigned 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[4]; 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; unsigned 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; unsigned int meth; unsigned int enumcs; } 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 */ opj_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 */ openjpeg-1.5.2/applications/mj2/wrap_j2k_in_mj2.c0000644000175000017500000003161712315002075021502 0ustar mathieumathieu/* * 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 #include #include #include "openjpeg.h" #include "j2k.h" #include "jp2.h" #include "cio.h" #include "mj2.h" static int int_ceildiv(int a, int b) { return (a + b - 1) / b; } /** Size of memory first allocated for MOOV box */ #define TEMP_BUF 10000 #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" /* -------------------------------------------------------------------------- */ static int test_image(const char *fname, mj2_cparameters_t *cp) { FILE *reader; opj_image_t *image; unsigned char *src; opj_dinfo_t *dinfo; opj_cio_t *cio; opj_dparameters_t dparameters; int success; long src_len; success = 0; if((reader = fopen(fname, "rb")) == NULL) return success; fseek(reader, 0, SEEK_END); src_len = ftell(reader); fseek(reader, 0, SEEK_SET); src = (unsigned char*) malloc(src_len); fread(src, 1, src_len, reader); fclose(reader); if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) { fprintf(stderr,"%s:%d:\n\tONLY J2K files are accepted. Quitting.\n", __FILE__,__LINE__); free(src); return success; } memset(&dparameters, 0, sizeof(opj_dparameters_t)); opj_set_default_decoder_parameters(&dparameters); dinfo = opj_create_decompress(CODEC_J2K); opj_setup_decoder(dinfo, &dparameters); cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); if(cio == NULL) goto fin; image = opj_decode(dinfo, cio); if(image == NULL) goto fin; free(src); cio->buffer = NULL; opj_cio_close(cio); if(image == NULL) goto fin; cp->numcomps = image->numcomps; cp->w = image->comps[0].w; cp->h = image->comps[0].h; cp->prec = image->comps[0].prec; if(image->numcomps > 2)/* RGB or RGBA */ { cp->enumcs = ENUMCS_SRGB; /* cp->CbCr_subsampling_dx = 0; */ /* cp->CbCr_subsampling_dy = 0; */ } else /* GRAY or GRAYA */ { cp->enumcs = ENUMCS_GRAY; /* cp->CbCr_subsampling_dx = 0; */ /* cp->CbCr_subsampling_dy = 0; */ } if(image->icc_profile_buf) { cp->meth = 2; free(image->icc_profile_buf); image->icc_profile_buf = NULL; } else cp->meth = 1; success = 1; fin: if(dinfo) opj_destroy_decompress(dinfo); if(image) opj_image_destroy(image); return success; } /** 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]; unsigned 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 = (unsigned char*) malloc(len * sizeof(unsigned char)); fread(siz_buffer,len, 1, file); cio = opj_cio_open(NULL, siz_buffer, len); if(cio == NULL) goto fin; 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); fin: free(siz_buffer); } static void setparams(opj_mj2_t *movie, opj_image_t *image) { int i, depth_0, depth, sign; 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; movie->tk[0].CbCr_subsampling_dx = 0; movie->tk[0].CbCr_subsampling_dy = 0; 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; } 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; unsigned char *buf; int offset, mdat_initpos, failed; opj_image_t img; opj_cio_t *cio; mj2_cparameters_t parameters; if (argc != 3) { printf("\nUsage: %s source_location mj2_filename\n",argv[0]); printf("Example: %s input/input output.mj2\n\n",argv[0]); return 1; } mj2file = fopen(argv[2], "wb"); if (!mj2file) { fprintf(stderr, "failed to open %s for writing\n", argv[2]); return 1; } failed = 1; memset(&img, 0, sizeof(opj_image_t)); /* 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(); if(cinfo == NULL) goto fin; /* 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 */ memset(¶meters, 0, sizeof(mj2_cparameters_t)); movie = (opj_mj2_t*) cinfo->mj2_handle; j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ sprintf(j2kfilename, "%s_00000.j2k",argv[1]); if(test_image(j2kfilename, ¶meters) == 0) goto fin; parameters.frame_rate = 25; /* DEFAULT */ mj2_setup_encoder(movie, ¶meters); /* Writing JP, FTYP and MDAT boxes Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); if(buf == NULL) goto fin; cio = opj_cio_open(movie->cinfo, buf, 300); if(cio == NULL) goto fin; 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) { /* No more files found: done. Leave while(1) loop: */ 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; /* There will be one sample per chunk: */ movie->tk[0].chunk[snum].offset = offset; /* Calculating sample size: */ fseek(j2kfile,0,SEEK_END); /* Sample size is codestream + JP2C box header: */ sample->sample_size = ftell(j2kfile) + 8; fseek(j2kfile,0,SEEK_SET); /* Reading siz marker of j2k image for the first codestream */ if (snum==0) read_siz_marker(j2kfile, &img); frame_codestream = (unsigned char*) malloc (sample->sample_size+8); cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); if(cio == NULL) goto fin; /* Writing JP2C box header: */ cio_write(cio,sample->sample_size, 4); cio_write(cio,JP2_JP2C, 4); /* 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); fclose(j2kfile); snum++; movie->tk[0].sample = (mj2_sample_t*) realloc(movie->tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); movie->tk[0].chunk = (mj2_chunk_t*) realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); free(frame_codestream); }/* while(1) */ /* Writing the MDAT box length in header */ offset += cio_tell(cio); buf = (unsigned char*) malloc (4 * sizeof(unsigned char)); if(buf == NULL) goto fin; cio = opj_cio_open(movie->cinfo, buf, 4); if(cio == NULL) goto fin; cio_write(cio,offset-mdat_initpos,4); fseek(mj2file,(long)mdat_initpos,SEEK_SET); fwrite(buf,4,1,mj2file); fseek(mj2file,0,SEEK_END); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); /* Setting movie parameters: */ movie->tk[0].num_samples=snum; movie->tk[0].num_chunks=snum; setparams(movie, &img); /* Writing MOOV box */ buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char)); if(buf == NULL) goto fin; cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20)); if(cio == NULL) goto fin; mj2_write_moov(movie, cio); fwrite(buf,cio_tell(cio),1,mj2file); free(img.comps); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf); opj_cio_close(cio); failed = 0; buf = NULL; fin: fclose(mj2file); if(failed) remove(argv[2]); if(buf) free(buf); if(cinfo) { mj2_destroy_compress(movie); free(cinfo); } free(j2kfilename); return failed; } openjpeg-1.5.2/applications/mj2/mj2_to_metadata_Notes.doc0000644000175000017500000010500012315002075023236 0ustar mathieumathieuÐÏࡱá>þÿ >@þÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Á@ ð¿+bjbjîFîF (&Œ,Œ,+ ÿÿÿÿÿÿˆ2222222F® ® ® ® $Ò F¬$2ú ú ú ú ú ú ú ú +$-$-$-$-$-$-$$Þ%R0(|Q$2€ ú ú € € Q$22ú ú f$|||€ ú2ú 2ú +$|€ +$||Æ"22¯#ú î ÍÛ³m1Å® z ^¯"+$|$0¬$Ã"ì¬(Ø Ž¬((¯#FF2222¬(2¯#|ú 0* "|L h ú ú ú Q$Q$FF¤êÄfFFêRelease Notes – “mj2_to_metadata” within the Open JPEG Project v. 0.97 March 25, 2005 Glenn Pearson (at the US National Library of Medicine) In collaboration with François-Olivier Devaux (TELE/UCL) Synopsis "Mj2_to_metadata", under development, is a Windows command-line function that reads metadata from a Motion JPEG 2000 video file and generates an XML file with a representation of that content. So far, it is limited to reporting structural metadata, but descriptive metadata is planned. It is run from the command-line by: mj2_to_metadata -i input.mj2 -o output.xml Additional options are discussed further below. Acceptable Input So far, video input is limited to a file created by Open JPEG's "frames_to_mj2" function (because mj2_to_metadata uses the same data structures and parsing functions that the reverse function, "mj2_to_frames", does). Restrictions this imposes are: MJ2 “Simple Profile” only (self-contained file with 1 visual track, at most 1 sound track) No sound 1 field per frame (non-interleaved) 32-bit offsets (filesize under 2GB) Expected Output The output XML will contain essentially all the MJ2 header information that is saved in the existing openjpeg data structures, including the voluminous chunking tables if requested. Also, within the visual track, for a representative frame (the first unless otherwise specified), some portion of the JP2 header information is written. This is again limited to what is saved in existing openjpeg data structures. (Actually, towards overcoming these restrictions, v 0.97 has expanded certain data structures; the next step is to populate them during parsing.) Reporting of many of the optional "marker sequences" in the JP2 codestream are not yet implemented. The generated form of XML is unlikely be entirely definitive. Nevertheless, a preliminary DTD has been prepared for it. Build This is early alpha code, and only the Windows version has been built, embedded within an openjpeg project in a VC6 environment (at cul) or VC7 environment (at NLM). So you may find portability issues to resolve. The release contains these files, added to existing files within openjpeg\mj2: mj2_to_metadata.h, .c meta_out.h, .c mj2_to_metadata.dsw, .vcproj mj2_to_metadata.dtd After the build, it is recommended for convenience that you move or copy mj2_to_metadata.dtd to the same subdirectory as mj2_to_metadata.exe . The project preprocessor definitions includes NO_PACKETS_DECODING, which suppresses unused decoding of a frame’s jpeg-2000-encoded packet data. This suppression greatly speeds up execution. Runtime Options To run from the command-line: mj2_to_metadata -i input.mj2 -o output.xml To see options available: mj2_to_metadata -h Briefly, options are provided to: suppress generation of information, by categories that cuts across the xml hierarchy: interpretative notes (-n) raw-as-read values, whenever derived values are available (-r) derived values (-d) specify a jp2 frame to be analyzed, if any (-f n; n = 0 means “no frame”; default n = 1) permit verification against a DTD (-v SYSTEM_or_PUBLIC_string). generate detailed xml for the sample chunking tables, normally skipped (-t). Other options are foreseen, to further prune the voluminous output. This has only been tested on a few video files, so expect problems. Feedback Glenn_Pearson@nlm.nih.gov !">?FGOUVXe޾ÆÇÈÉÑÒâöG M E s t v † óçÛÒÆ½´Ò«½Ÿ—’ˆƒˆ{wrmfbf^fZVfQ hB>5hædhB>hxr§hw=Í hædhL ø hL ø5 hæd5h§ !h§ !hÁ ¼5 hÊ>f5 hÁ ¼5 h§ !5 hƒ5h§ !h§ !5h§ !h§ !5CJaJhE¥5CJaJhÊ>f5CJaJhB>5CJaJhB>hB>5CJaJhƒ5CJaJhÊ>fhÊ>f5CJ aJ hÊ>fhƒ5CJ aJ hÊ>fh§ !5CJ aJ "XÈÉÒ  D E u v ‡ € Ü å - . > ÔÕN÷ï÷÷ííäääääääää××××ääääÒgdÁ ¼ & F7$8$H$gdæd 7$8$H$gdL ø$a$gdÊ>f$a$gd§ !+ý† ‡ • ª Ë ø  € • . > Ý pÔÕNOU]cÄàðøù*,@Lyz{Ò`a !$015PR÷óïóèïèäÝóèÕèÑèÿ±©¥¡¥ó¥ï󥙕ó••™©ˆ©„s h\NîhóCJOJQJ^JaJh\Nî hÁ ¼5hóhƒhE¥hçìhÊ>fhmáh§ !hóhó5hÁ ¼CJOJQJ^JaJhÁ ¼hL øCJOJQJ^JaJhB>hB>hB>5 hædhædhL ø hædhL øhxr§hædhædhL ø5-NOU{‘ ½ÑÒa !1OP}~˜™®¯Ñ'A€öôôëëëëôôôæææææææææææÞÖÖ & FgdE¥ & FgdE¥gdçì„Ð`„ÐgdE¥ 7$8$H$gdL øRadenoq|}~„Œ™®¯¹ÏÐÑÙçó%'@SzŽ“›¶¾ÃÄÆÇëÖëÀªÖÀ럘”Öˆzzvrvrvnvvrrvfvfhw=Íhw=Í6h—IHh\Nîhw=Í h\NîhE¥ h\Nîh\NîhE¥mHsHhE¥hó hE¥hE¥hE¥hómHsH+hE¥hE¥6CJOJQJ^JaJmHsH+hE¥hó6CJOJQJ^JaJmHsH(hE¥hE¥CJOJQJ^JaJmHsH(hE¥hóCJOJQJ^JaJmHsH&€”í.{|ÀÁ)*+÷ïïïêåååååàåÞgdÁ ¼gdçìgd\Nî & FgdE¥ & FgdE¥ ÇÈÜæçëìí&+,.67Hby|—›£Èäêï*+úöòêòöæâÞâÙÑâÞâÞâÞâÞæÍæÍÉÅÉÁÍŹÅÍhÁ ¼hÁ ¼5hmáhÁ ¼hL øhóh—IHh—IH6 h—IH6h\Nîh—IHhE¥hÊ>fhÊ>f6hÊ>fhw=Í hw=Í6!&1h:pkt?°Ð/ °à=!° "° # $ %°œ@@ñÿ@ NormalCJ_HaJmH sH tH DA@òÿ¡D Default Paragraph FontRi@óÿ³R  Table Normalö4Ö l4Öaö (k@ôÿÁ(No List+ &ÿÿÿÿ"XÈÉÒDEuv‡€Üå -.>ÔÕNOU{‘ ½ÑÒa ! 1 O P } ~ ˜ ™ ® ¯ Ñ ' A € ” í . { | À Á    ) * - ˜0€€˜0€€˜0€€˜0€€˜0€€€˜0€€€˜0€€˜0€€€˜0€€€˜0€€€˜0€€€˜0€€€˜0€€˜0€€˜0€€0˜ 0€€˜ 0€€˜ 0€€€˜ 0€€€˜0€€€˜0€€˜0€€˜0€€˜0€€˜0€€€˜0€€€˜0€€0˜0€€€˜0€€€˜0€€€˜0€€€˜0€€€˜0€€˜0€€€˜0€€˜0€€˜0€€x˜0€€x˜0€€x˜0€€x˜0€€x˜0€€˜0€€x˜0€€x˜0€€˜ 0€€€˜ 0€€0˜ 0€€€˜ 0€€€˜ 0€€˜ 0€€˜ 0€€˜0€€˜0€€x˜0€€x˜0€€˜0€€x˜0€€x˜0€€˜0€€˜0€€.>ÔÕNOa |    ) - ^>00Øœð{\>00Øœ |\>00€\>00€\>00€^>00€^>00^>00V~00¬å\>0 Øœì|\>0 €\>0 €š0€€˜0€€è.-† RÇ+ N€+ + ÿÿÿ¡ÕQœØ#¢ÕQ¼d>¢ÕQÜØ#Gnn- Upp- B*€urn:schemas-microsoft-com:office:smarttags€country-region€9*€urn:schemas-microsoft-com:office:smarttags€place€8*€urn:schemas-microsoft-com:office:smarttags€date€ €2005€25€3€Day€Month€Year¶¼*+9C!£«Âʰº¯·ÙÜmy‘›¶¼R a b d e n o q r | › ª « ­  + - "(R ` z Ž R | › ­ í ó . 6 - 33333v‡Üå.>OU ¼! 1 ~ — ™ ® ' A € ”  * - my- ßYártÿÿÿÿÿÿÿÿÿ?XÖ Òr;ÿÿÿÿÿÿÿÿÿ§Nx$ÂÞÀAÿÿÿÿÿÿÿÿÿ¹D(Q|ÿÿÿÿÿÿÿÿÿ~u*ÚíV6ÿÿÿÿÿÿÿÿÿÙs·RZäÿÿÿÿÿÿÿÿÿT{ÍcÚíV6ÿÿÿÿÿÿÿÿÿh„Є˜þÆÐ^„Ð`„˜þOJQJo(‡hˆH·ðh„ „˜þÆ ^„ `„˜þOJQJ^Jo(‡hˆHoh„p„˜þÆp^„p`„˜þOJQJo(‡hˆH§ðh„@ „˜þÆ@ ^„@ `„˜þOJQJo(‡hˆH·ðh„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHoh„à„˜þÆà^„à`„˜þOJQJo(‡hˆH§ðh„°„˜þư^„°`„˜þOJQJo(‡hˆH·ðh„€„˜þÆ€^„€`„˜þOJQJ^Jo(‡hˆHoh„P„˜þÆP^„P`„˜þOJQJo(‡hˆH§ð„à„˜þÆà^„à`„˜þOJPJQJ^Jo(-€„°„˜þư^„°`„˜þOJQJ^Jo(‡hˆHo€„€„˜þÆ€^„€`„˜þOJQJo(‡hˆH§ð€„P „˜þÆP ^„P `„˜þOJQJo(‡hˆH·ð€„ „˜þÆ ^„ `„˜þOJQJ^Jo(‡hˆHo€„ð„˜þÆð^„ð`„˜þOJQJo(‡hˆH§ð€„À„˜þÆÀ^„À`„˜þOJQJo(‡hˆH·ð€„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHo€„`„˜þÆ`^„``„˜þOJQJo(‡hˆH§ðh„Є˜þÆÐ^„Ð`„˜þOJQJo(‡hˆH·ðh„ „˜þÆ ^„ `„˜þOJQJ^Jo(‡hˆHoh„p„˜þÆp^„p`„˜þOJQJo(‡hˆH§ðh„@ „˜þÆ@ ^„@ `„˜þOJQJo(‡hˆH·ðh„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHoh„à„˜þÆà^„à`„˜þOJQJo(‡hˆH§ðh„°„˜þư^„°`„˜þOJQJo(‡hˆH·ðh„€„˜þÆ€^„€`„˜þOJQJ^Jo(‡hˆHoh„P„˜þÆP^„P`„˜þOJQJo(‡hˆH§ðx„X„˜þÆX^„X`„˜þOJQJo(‡hˆH·ðx„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHox„脘þÆè^„è`„˜þOJQJo(‡hˆH§ðx„¸ „˜þƸ ^„¸ `„˜þOJQJo(‡hˆH·ðx„ˆ„˜þƈ^„ˆ`„˜þOJQJ^Jo(‡hˆHox„X„˜þÆX^„X`„˜þOJQJo(‡hˆH§ðx„(„˜þÆ(^„(`„˜þOJQJo(‡hˆH·ðx„ø„˜þÆø^„ø`„˜þOJQJ^Jo(‡hˆHox„È„˜þÆÈ^„È`„˜þOJQJo(‡hˆH§ðx„X„˜þÆX^„X`„˜þOJPJQJ^Jo(-x„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHox„脘þÆè^„è`„˜þOJQJo(‡hˆH§ðx„¸ „˜þƸ ^„¸ `„˜þOJQJo(‡hˆH·ðx„ˆ„˜þƈ^„ˆ`„˜þOJQJ^Jo(‡hˆHox„X„˜þÆX^„X`„˜þOJQJo(‡hˆH§ðx„(„˜þÆ(^„(`„˜þOJQJo(‡hˆH·ðx„ø„˜þÆø^„ø`„˜þOJQJ^Jo(‡hˆHox„È„˜þÆÈ^„È`„˜þOJQJo(‡hˆH§ð„„˜þÆ^„`„˜þo()€ „Ø „˜þÆØ ^„Ø `„˜þ‡hˆH.‚ „¨ „Lÿƨ ^„¨ `„Lÿ‡hˆH.€ „x„˜þÆx^„x`„˜þ‡hˆH.€ „H„˜þÆH^„H`„˜þ‡hˆH.‚ „„LÿÆ^„`„Lÿ‡hˆH.€ „脘þÆè^„è`„˜þ‡hˆH.€ „¸„˜þƸ^„¸`„˜þ‡hˆH.‚ „ˆ„Lÿƈ^„ˆ`„Lÿ‡hˆH.x„X„˜þÆX^„X`„˜þOJPJQJ^Jo(-x„„˜þÆ^„`„˜þOJQJ^Jo(‡hˆHox„脘þÆè^„è`„˜þOJQJo(‡hˆH§ðx„¸ „˜þƸ ^„¸ `„˜þOJQJo(‡hˆH·ðx„ˆ„˜þƈ^„ˆ`„˜þOJQJ^Jo(‡hˆHox„X„˜þÆX^„X`„˜þOJQJo(‡hˆH§ðx„(„˜þÆ(^„(`„˜þOJQJo(‡hˆH·ðx„ø„˜þÆø^„ø`„˜þOJQJ^Jo(‡hˆHox„È„˜þÆÈ^„È`„˜þOJQJo(‡hˆH§ð§Nx$Ùs·RßYá?XÖ ~u*T{Íc¹D(š0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ¸ýîk                          ¸ýîk        ÄtP        åƒKS/oL{ ó§ !Wz8B>kt?—IHædÊ>f>mE¥xr§ü9»Á ¼1x¿w=Í7Ñ)LÜmáçì\NîL øÿ@€zzè.-sszz+ p@ÿÿUnknownÿÿÿÿÿÿÿÿÿÿÿÿG‡z €ÿTimes New Roman5€Symbol3& ‡z €ÿArial?5 ‡z €ÿCourier New;€Wingdings"qˆðÐh(\’¦†Ë“¦ñ÷4 ÷4 !ð  ´´24% %  3ƒQðH)ðÿ?äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ !ÿÿRelease Notes  Glenn Pearson Glenn Pearson(       þÿà…ŸòùOh«‘+'³Ù0„˜°¼Ôàì $ @ L Xdlt|äRelease Notes –eleGlenn Pearson–lenlen Normal.dotoGlenn Pearson–3enMicrosoft Word 10.0@æÔª!@¸±<‚Å@“®m1Å÷4 þÿÕÍÕœ.“—+,ù®0ø hp|„Œ” œ¤¬´ ¼ Øänlm% O Release Notes – Title þÿÿÿ !"#$%&'(þÿÿÿ*+,-./0þÿÿÿ2345678þÿÿÿýÿÿÿ;þÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFè³m1Å=€1TableÿÿÿÿÿÿÿÿÔ(WordDocumentÿÿÿÿÿÿÿÿ(&SummaryInformation(ÿÿÿÿ)DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ1CompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qRoot Entryÿÿÿÿÿÿÿÿ ÀF€¡Ñ¢q1ÅC€1TableÿÿÿÿÿÿÿÿÔ(WordDocumentÿÿÿÿÿÿÿÿ(&SummaryInformation(ÿÿÿÿ) þÿÿÿ !"#$%&'(þÿÿÿ*+,-./0þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBýÿÿÿþÿÿÿþÿÿÿþÿÿÿAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_AdHocReviewCycleID_EmailSubject _AuthorEmail_AuthorEmailDisplayName° bƒ2 Yet more metagpearson@mail.nih.govPearson, Glenn (NIH/NLM/LHC)DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿäCompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®<ø hp|„Œ” œ¤¬´ ¼ Øänlm% O Release Notes – Title¨@ô€ü 0dopenjpeg-1.5.2/applications/mj2/mj2_convert.c0000644000175000017500000002543312315002075020754 0ustar mathieumathieu/* * 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" /* ----------------------- */ /* */ /* */ /* Count the number of frames */ /* in a YUV file */ /* */ /* ----------------------- */ unsigned int yuv_num_frames(mj2_tk_t * tk, char *infile) { unsigned int prec_size; long end_of_f, frame_size; FILE *f; f = fopen(infile,"rb"); if (!f) { fprintf(stderr, "failed to open %s for reading\n",infile); return 0; } prec_size = (tk->depth + 7)/8;/* bytes of precision */ frame_size = (long) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); /* Calculate frame size */ frame_size *= prec_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); return 0; } fclose(f); return (unsigned int)(end_of_f / frame_size); } /* ----------------------- YUV to IMAGE -----------------------*/ opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters) { 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 = tk->depth; cmptparm[i].bpp = tk->depth; 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; } char yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters_t *parameters, char* infile) { int i, compno; int offset, size, max, prec_bytes, is_16, v; long end_of_f, position; int numcomps = 3; int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; FILE *yuvfile; int *data; unsigned char uc; yuvfile = fopen(infile,"rb"); if (!yuvfile) { fprintf(stderr, "failed to open %s for readings\n",parameters->infile); return 1; } is_16 = (tk->depth > 8); prec_bytes = (is_16?2:1); 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 *= prec_bytes; 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); fclose(yuvfile); return 1; } 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; size = tk->w * tk->h * prec_bytes; for(compno = 0; compno < numcomps; compno++) { max = size/(img->comps[compno].dx * img->comps[compno].dy); data = img->comps[compno].data; for (i = 0; i < max && !feof(yuvfile); i++) { v = 0; fread(&uc, 1, 1, yuvfile); v = uc; if(is_16) { fread(&uc, 1, 1, yuvfile); v |= (uc<<8); } *data++ = v; } } fclose(yuvfile); return 0; } /* ----------------------- IMAGE to YUV -----------------------*/ opj_bool imagetoyuv(opj_image_t * img, char *outfile) { FILE *f; int *data; int i, v, is_16, prec_bytes; unsigned char buf[2]; if (img->numcomps == 3) { 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 OPJ_FALSE; } } else if (!(img->numcomps == 1)) { fprintf(stderr, "Error with the number of image components(must be one or three)\n"); return OPJ_FALSE; } f = fopen(outfile, "a+b"); if (!f) { fprintf(stderr, "failed to open %s for writing\n", outfile); return OPJ_FALSE; } is_16 = (img->comps[0].prec > 8); prec_bytes = (is_16?2:1); data = img->comps[0].data; for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) { v = *data++; buf[0] = (unsigned char)v; if(is_16) buf[1] = (unsigned char)(v>>8); fwrite(buf, 1, prec_bytes, f); } if (img->numcomps == 3) { data = img->comps[1].data; for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) { v = *data++; buf[0] = (unsigned char)v; if(is_16) buf[1] = (unsigned char)(v>>8); fwrite(buf, 1, prec_bytes, f); } data = img->comps[2].data; for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) { v = *data++; buf[0] = (unsigned char)v; if(is_16) buf[1] = (unsigned char)(v>>8); fwrite(buf, 1, prec_bytes, f); } } else if (img->numcomps == 1) { /* fake CbCr values */ if(is_16) { buf[0] = 255; if(img->comps[0].prec == 10) buf[1] = 1; else if(img->comps[0].prec == 12) buf[1] = 3; else buf[1] = 125; } else buf[0] = 125; for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) { fwrite(buf, 1, prec_bytes, f); } for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) { fwrite(buf, 1, prec_bytes, f); } } fclose(f); return OPJ_TRUE; } /* ----------------------- IMAGE to BMP -----------------------*/ int imagetobmp(opj_image_t * img, char *outfile) { int w,wr,h,hr,i,pad; FILE *f; if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx && img->comps[1].dx == img->comps[2].dx && img->comps[0].dy == img->comps[1].dy && img->comps[1].dy == img->comps[2].dy && img->comps[0].prec == img->comps[1].prec && img->comps[1].prec == img->comps[2].prec) { /* -->> -->> -->> -->> 24 bits color <<-- <<-- <<-- <<-- */ f = fopen(outfile, "wb"); if (!f) { fprintf(stderr, "failed to open %s for writing\n", outfile); return 1; } w = img->comps[0].w; wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor); h = img->comps[0].h; hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor); fprintf(f, "BM"); /* FILE HEADER */ /* ------------- */ fprintf(f, "%c%c%c%c", (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) + 54) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) >> 8) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) >> 16) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff, ((54) >> 16) & 0xff, ((54) >> 24) & 0xff); /* INFO HEADER */ /* ------------- */ fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff), (unsigned char) ((wr) >> 8) & 0xff, (unsigned char) ((wr) >> 16) & 0xff, (unsigned char) ((wr) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff), (unsigned char) ((hr) >> 8) & 0xff, (unsigned char) ((hr) >> 16) & 0xff, (unsigned char) ((hr) >> 24) & 0xff); fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (unsigned char) (3 * hr * wr + 3 * hr * (wr % 2)) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 8) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 16) & 0xff, (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); for (i = 0; i < wr * hr; i++) { unsigned char R, G, B; /* a modifier */ /* R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; /* G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; /* B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; 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); } } fclose(f); } return 0; } openjpeg-1.5.2/applications/mj2/mj2_to_metadata.vcproj0000644000175000017500000001757012315002075022642 0ustar mathieumathieu openjpeg-1.5.2/applications/mj2/mj2_to_metadata.sln0000644000175000017500000000274712315002075022133 0ustar mathieumathieu Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mj2_to_metadata", "mj2_to_metadata.vcproj", "{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}" ProjectSection(ProjectDependencies) = postProject {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} = {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibOpenJPEG", "..\LibOpenJPEG.vcproj", "{0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.ActiveCfg = Debug|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.Build.0 = Debug|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.ActiveCfg = Release|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.Build.0 = Release|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.ActiveCfg = Debug|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.Build.0 = Debug|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.ActiveCfg = Release|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal openjpeg-1.5.2/applications/jpip/0000755000175000017500000000000012315072522016627 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/doc/0000755000175000017500000000000012315072522017374 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/doc/jpip_protocol.png0000644000175000017500000001435012315002074022763 0ustar mathieumathieu‰PNG  IHDRXtp‚Ð[¯IDATxœíÝ=rÛJÚPÂå*'’gªÉ½x?ÎÌuÌ2ÈYÀlFØÀ|næD œñ PƒÆ»A4°Ï \$4­WxØMÚ..—ËrõiíÀš!Y„dM5A@Ö!Y„dM5A@Ö>¯Ý$Š¢¨ÿÅœ¢(šÍ¿¡ÓlœØg°Í«ûðØîSWõ–Î!Í©gô–­ò»¿Ô¯ÝÎ"m>äð1ƒ°­_—Ë¥SW eñbbïÒÕUÝÎØé¸¿þO6ÊvîáÝÈíNøøA¸¸‰@s koivîLÆŽ"OWgíBjoð@n׌jç¼~µe¢ñΖؖÇÚéÜ‘ú¯ö°ñHwBAd°b´ý|Û¼£È\gŽRE7Nb˜Ö o{_¿ÔÙ>±¥ßl?$BÚ™ØÒYŸï¬4tj&¤‡z'|ü 6½Ïà[›Á}Ïu[³T]Ýxö†âYWÿ'2oŸZ;´&ŽºúC\f?|⨻>~FÍñCö쿼ºs»hܰòu•âìÜM?Ú tãïþÝ~Öƒ}žÞùaî„õ×'Âßpm§e¶ï>?}Õû:Kšµ[Ú¹q·¨}HŸµ–jFøYkó=‚؉`óxpËÄí7Aé–ËHäžu5ØNgKTí]í6W þd;;ÁywŒyíLlé/±NÔgT£®«Ùm³wB§,,ä‹'[³Ç>/%¯«¸MÍxí±Ï‹„dí¡¾,±!Y„dM5A@Öa„GýWX—º"uN5A@Ö!Y„dM5A@Ö!¬Ì?|O ê*œ „TŠ–ûœnÞQv¶D]ÅNÿîZìÿäžèDãÜß§ÿtÙÿ¼þá=ÔÿP[³ñÿétðÿbíügâ‡à«Øæ5nJàèMŒdóRç?|ïœåjÎõÊ9„pWýÿû´ÞÒܘoˆcG5[ê§MScçšpã=±W éssËÛ2¯¨}Úݾ:b·Œóô•ÆŽÿÄUŒº³›,lB¸Ÿ~Èõ£.ê¨fKÿ¦8ÃH$¤Ï!æµµO{øêˆÝ2ΉÚàÜîj#W›í[·vABB³™ŽéÛYç¥ödbì¾²Ï}LgÃÕ!×~Ë”·Ýà=GlðWŸ›?£zèÁi‚êO æÝaûG N&fì³}ó®ý–s­5bWÏ;{1s×p¾5 i]]¹ªõ÷ ™ 6Þž7ÜÒ(gYv:2x]·œ¢ßÈ}F¬søºË×™3Ô Q¢¾öÒÿÔjðs¬é/hÌøGà×p®¶3xÉW[î48ø+¶à—e:g ç±Ëœ8×İô?§< sHSÎL÷gp‹»YÃXDP:$¥ÀæÙþ¸M|'ˆ-ð!¬l§÷Ä÷ÿ{<öôéééùùùùù¹yþtí랣?a½ƒÖÕ*ŒT…E ÖU“Ž!©™yˆÎ–a]Íf¤"(,RPWQR‡èØKk_w4uÎHEPX¤ ®î&$DÇ^ªqÆ4t­UWáŒT…E êjêDœ1 ]+DÕU8#Aa‘‚ºzx÷ ÑæñËË‹º ä70‚)¨+&Ćhýø×¯_¿ÿVWüFpÃ"uÅ‚ªª:eYžÏguÈo`7,RPW,åxŸ‹¢(Ëòíí­,˵»³3þe€kÖBÍÿf„{Õ^ ]»/;fi`—¬….ÅŒ`—¬….ÅŒ€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&ÈÚçµ;<¸¢(ê—ËeÞááöÏÕÙÒ<Ý jÇXT¤-u®ËåÒ9ïÝúÃ^BàN&fiu\õ÷iUÔÌRÂN &\ÿqçAûéÄQ°A¤Õ‰ºÃŸÔµ÷<¶ÉÑædY‚¸‡öƒ›ØaP?æµ3ÑŸÃøu…58t.—Ëëëë·o߯òì– Vä[¶ö¥‰­õgÌ^ú¹ãC ê*œ‘аµÂÚZ:š5Ã‰ÍÆž6Ó¬öôkl*¶÷™ÙƎ씺 g¤"dXX‹‡YàÓµ¯û®2¬+î@]…3RvZXÂlãvZWlœº g¤"¬XX!ßÂ{*Ì6Î ‹ÔU8#áÆÂZ$ÌfäÙ‚#@ nX¤ ®Â©EQÄ.- 3®rÃ"uÎHE(ŠâË—/_¿~f,È ‹ÔU8¡>Î?ªª:NeY®Ýà-C„úVUUÇã±,ËÓé´vxÞ¹“‚º ÷iíìOY–oooeYEq>Ÿ×î7„3ýüù³ž~ÿþ½ªªµ»ÀLæÎ—¬”r#KX¤ ®Â™Þª½Rºv_ˆæ-Cï°HA]‘‚º gF@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Y„díóÚ TQõƒËå2ïðØ›CšS7gooéw©s®Àv¢º7ãr Â}hß÷WÉ€ÎÙ›‹íIÿ*Ö½.A¸?íäho©ƒ¤ÞØÙ§3?ë´³¬yÖ¿Òß—6qí[šýe0äLîÃà]¾ÿ¸ó ¿&¹úÌr†~Ÿ£kìÚ“³ÏfϽŒ°8A¸ýÕÈÎu‡ñI^;G›±ŸÉMŸ¢Ùíêvgiížö¹yib|ú[aœç–§§§¨§‹t =w™7ƒ™÷ñ^ÈÎ!möwèlla‘>O¿‡²e9(BQï-QOÛÑ¢ý…¾‰µÁþ>ƒ†åÊØBëÄžÓO'Ú É¶¨Eà‰–ÇFcõ¥Q«²¤ ®Â©7V;cC´Y<\û²L§«ý YäœøŸ‹¢(Ëòíí­,˵»øß'à^šµPïÓaS!ÜC{-tí¾°4 ÉY …-3#„䬅–™5A@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Y„dM5A@Ö!Yû¼v€5EQ?¸\.ó=°9¤9usöö–~—:ç l'ª{3.‡ !_íûþ*Ð9{c±=é_ź×žBàpø39Ú[ê ©7vöéÌÏ:í,+Ežõ¯ôðç¥M\ûÄ–f¼‚ò5x—ï?î<è¯I®>³œ¡ßçÁè»öÃäì³Ùs/£‘9AYë¯Fv>¨;ŒOòÚ9Ú<ˆýLnúÍnWwè´38Kk÷<°ÏÍKãÓß¾BXßsËÓÓSÔÓE:О»Ì›ÁÌûx/dç6û;t¶ ¶°HŸ§ßC° ¦í¬rBQï-QOÛÑ¢ý…¾‰µÁþ>ƒ†ýšŒ-´Nì9ýt¢_Õ¨Eà‰–ÇFcõ¥Q÷«pF*‚Â"…몱!Ú,®}Y¦ÓÕ~†,rN|96 ƒû\m'pHûÜÿ²ÌÕ£#0ª')¸_…3R)¨« g6CÎHEPX¤°Óº›‰†ÌJ›EÚØµÜçç絯{7vZW«0R)dXWM:Æ®å ÑpÖÕlF*‚Â"u%uˆŽ½´öuGSWáŒT…E êênBBtì¥:gLC× QuÎHEPX¤ ®v¡NÄÓеBT]…3R)¨«‡wÏm¿¼¼¨«@~#¸a‘‚ºbBlˆÖýúõû÷ouÈo`7,RPW,¨ªªãñX–åù|VWüFpÃ"uÅRŽÇcUU§Ó©,KuîÓÚàVçó¹(в,ßÞÞʲ\»;;ãŸØ±f-Ôüo6A°WíµÐµû²c–FvÉZèRÌvÉZèRÌÈš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B`Ž¢(f¿{¢ðÖ‰¦SWÛl'âÄλˆ½÷÷÷úÏFûéØKkw|O!°¤vøÝyiqpitÁÆg·y5Ì&ž>===??×6𧝝¯c/½¼¼,;ÌòwŸÂîêjìÓµzKçöÃä'‚ýyÛàÎý}· ~^8ÖŸÀ}Ú‡ÿüç?‹‡ÙôÓ¹?¥ýÕÕŠŒT…E êjqó¾†âÛ·o÷ ³[¨«pF*‚Â"u¥™fMÏÆþýï×ûûö­yµI¦vbm9Ìn¡®Â© ‹2¬«À0|:fO×¾î»Ê°®f3R)ì´®„ÙÆí´®Va¤"(,RX±®B¾…?öT˜mœûU8#Aa‘ÂuµH˜ÍȳG€ܯ© ‹Š¢ˆ]Zf\å~ÎHEPX¤PÅ—/_¾~ý*ÌXûU8ÿ² ¬ïÇUUN§²,×î dÇ[†Þa‘B]WUUDz,O§ÓÚ=â¸_…óÿÂ&”eùööV–eQçóyíî@F!lÈÏŸ?ëÙá÷ïß«ªZ»;sç–Ha°®¬”r#÷«pf„°Eí•ÒµûÎ[†Þa‘‚º"uÎŒ€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&ÈÚçµ;Ü[QÍãËår‡ÓMŸe°?ÍÆzK»‘~ƒõ–~;ƒ[&Ú‰ê6CBŽÃàn:ýŒ«~Ú]mgpKH;‡ÛÞ"ldT $á7k¶4±4NƒGþœ“5MÍèXsT»'žGµ<ÖN§ÍÃøP´7öw›Þ B``Á°uQG5[:÷¢“ý7W¯=|–u BÈÑÄÜ¥#dæÔß¹ŽÀ[úÓÞÞžölo œ“-’IWW÷au‚Ö÷ÜòôôõtÞûµ×-;[f,WŽmœ’N÷gqý5ÒvW'’› „°¾¿ÿþûý>>>Þ[>>>þþûï¿þúkìÕv4†h}ÒÀEË~…$Ó`ã¹<ØŒÆC^]&üä"(tR¸±®ÚÑØÉÁ§ýõWø×^úŸ~‚8½9ýe™Á¸ú×'B‚vzËÄȇüåÙ£qîWáŒT…E Û¯«möpk½ÚÚWc¶Ð‡½°4 Ì16 ™•6‹´±ˆ6뺇í}ü6ø!»à-Cï°H!újÒ1p-wñÍA†u5›‘Š °HA]EI¢Óß0ÚuÎHEPX¤ ®î&$DÇ^ªqÆ4t­UWáŒT…E êjêDœ1 ]+DÕU8#Aa‘‚ºzx÷ ÑæñËË‹º ä70‚)¨+&Ćhýø×¯_¿ÿVWüFpÃ"uÅ‚ªª:eYžÏguÈo`7,RPW,åx­Ýnu>Ÿ‹¢(Ëòíí­,˵»³3þe€kÖBÍÿf„{Õ^ ]»/;fi`—¬….ÅŒ`—¬….ÅŒ€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&ÈÚçµ;lBQõƒËå2ïðÀ›µÏÕ9{»µ~Ëõ–~;ƒ[&Ú™× "cs ž½ŸvWÛÜÒÎanüwÎÅN BàÓ³´zcgŸv Ü8³lŽj²“a±©3ÖN§ÍÃÐEuºÓÃ-ì‚ ƒ 76»:ôfrMÜyf¹”~L¶ãsp®Ù¿Ò^;AÔ?TÜgðØö,ª~0ýÜ`ƒ0î·Ð ˜À9Ù"™tuq5p6HÿopÛÂáÚ”èj ê·Ùo'Ñ<¬ÿþ ÝÕ‰ä¾ÝÇÇÇûû{ýg£ýtì¥Å{òÀ!pëR^i´³Tø0¯ºfOŸžžžŸŸë?ÍÓ×××±—^^^’ ãyÀJMç!±YÝFêêê2ãØ§†‡?cïêF¯÷ê¹ÆþEø–‰q^êJ;[þñ„„ÙôÓÁ‡ØH]í‚‘Š °HA]…ØÚ(…DìÿûßÃì[±-3R)¨«(͚ጕÆfšÕž~Íž™mü/K¨«pF*‚Â"… ëjñ0 |ºöußU†u5›‘Š °Ha§u%Ì6n§uµ #Aa‘Šuò-ü±§Âlãܯ© ‹n¬«EÂlFž-8¤à~ÎHEPX¤PEìÒ¢0ã*÷«pF*‚Â"…¢(¾|ùòõëWaƂܯÂù—e`}?~ü¨ªêt:•e¹v_ ;Þ2Dð‹꺪ªêx<–ey:ÖîÀý*ܧµ;‡CY–oooeYEq>Ÿ×îdD†üüù³ž~ÿþ½ªªµ»Y0wŽ`©ëÊJ)7r¿ gF[Ô^)]»/ðà¼eˆà)¨+RPWáÌÈš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&Èš  k‚€¬ B²&ÈÚÿä.É®ÔÌÿZIEND®B`‚openjpeg-1.5.2/applications/jpip/doc/Doxyfile0000644000175000017500000017355612315002074021116 0ustar mathieumathieu# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = OpenJPIP # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = YES # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. ../libopenjpip ../util # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = ./ # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = ./html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES openjpeg-1.5.2/applications/jpip/doc/jpip_architect.png0000644000175000017500000017216112315002074023075 0ustar mathieumathieu‰PNG  IHDR® è-ç pHYsHHFÉk> vpAg®Yv—ø€IDATxÚì]wXÙ×¾“^Hh¡YE±ëZ@^Dé(ŠØ»Ø+bA ¢ˆuUìŠk+ÛêZwÝuíÒ „Ò“ùþ8?æË" ˆ(ïãã3Lfîܹs˹§¼ÃqÕ' |¥R‰¢R©•/P«ÕJ¥’L&“H$ Ãêµ2 ™L¶jÕª>o‡a˜J¥ÒÖÖF•””Éäúþ õxLJîêêªR©ÈdrCWª.o”žž~äða2‰„#„ágúaB*µzè°a?FÇS( ]…U.7?d2YYYŽã†5ÆE¤-F"‘X,¥žžã¸Z­V«ÕÐáÿ’’víÚµß~û­E‹Ó¦M£Ñhl6›F£Á] ý0ÂôN©TºuëV---•J…a˜Z­æp8çÎCyyy•––’H¤†®ìC­Vëèè9rÄÀÀÀÕÕU­V7öÕ¨ò ’ÉäK—.¥ž?ï7p °¤¤1~¦jµš«­zò$ïGéx?Â݄º…R©¤P(qqqË–-333û:I$§ú[pa½ûºiÇq•JE¡PjSHõ R©?~ «{1H¥RôC&“ÉdrYYYiiiBBÂÇÏž=Ë`0ÊÊʆzéÒ¥-[¶`Ö¶mÛ=zôë×ÏÛÛ^õØÞiB­V³ÙìuëÖéêê‚`¤P(¨TjYYBhõêÕðgCWó‹Õ …b±¸>Ê×ìý_=Ôju-Ǹ¬ÌwÀ€ññ2¥~¦J…€NÇq\\VÖÐu©Èd²ØØØœììfû×àÀqܤY³¹sçÒéô†®K=¾#B(++käÈ‘»wïÎÏϧP¾x5‡¹Q­V×yõ`·Ïf³ÕjµD"!‘H_ª¬"‘HZZZ%%%l6!TVVö…T¥Rihh8a„?Ö±¤R©À¶¥T*/^¼xèСôôt¹\Þ®]»=zìÙ³ÇÝÝ].—kkk+в²2™L¶yóæ?Ž?^©TŽ=zùòåÚÚÚõ'~{à8®T*+¿úè|ßõ÷š¢0qL4#±f€d)“É0 £Ñhö70rûúª­ ¸¸@&Ëþø±I ú T(P‹‚âb¦ž^C×¥V ´Å±68¸º²ØlµJ…š„¡ÚÇId²¸¬ìðÑ£¡¡¡t:þ?$pg2™!]]ݯØK+•J ÃêCéûÏ«W¯êèètïÞý+¶£"‘èØ±cÆ KIIÑÕÕµ··¯ýžV ?c2™b±¸.Å P\¾|yÏž=W®\A¹»»ïÙ³ÇÙÙ™D"‚9“ÉT(d2YGG!¥V«U*Õõë×.\¨££søðá¡C‡ªTªC-6H@@¥R¡éA•J¥pAqqñWò x ‰DÂb±ê¶dèîW®\ÑÖÖîÕ«Bˆ8†I ¶$ ¯ eÕªUfff!!!`"!d£çÏŸwïÞi¨…Ôj5”PóúÈd •J¡Rãgú!A¡RIf¨ÕjŽ–VÜÖ­<ž¢I ª%pœJ&ºôêõcì3kðÆàµˆ‘¦D©TR©Ô•+W¶lÙrüøñÄRû©Mcåý'ú¯®½ÂÓá§óçÏ7kÖLS ‚zjÎÀ !~-++Û¹sç°aØLf ¯ÊÊ|©¢H³ÝêlZ(99900pèС‰‰‰$‰X{ ñ'¼Uïi77·¤§§Ï™3'>>þÊ•+,‹P/ÕU=¿=À2hkkK§Ó‰‘I&“ù|>BèÒ¥K*•ª¡ëø• Óé¯_¿^ºtiÝ ãâŋ͛71èâÅ‹-Z´èÕ«—L&Ãq¼´´ÔÈÈÜø|¾B¡±R(ŠD"ƒñáÇY³fíÝ»×ÀÀ€ÃáÀOÍš5kèfkBþ¹B‘“-—Ë E£žë8ŽS©T~a¡ü§ñ:‡ó¥[;¸X&“Á’tèÐ!ƒñâÅ‹I“&eff>zô(44”Ëå&&&¾{÷ÎÚÚzàÀ¡’’’íÛ·èêêšššöìÙóÎ;)))¦¦¦!!!T*„¡P¸uëV333±X ›äû÷罹¦—Éd²C‡½~ýÚÖÖÖÛÛûæÍ›çÎëÔ©Ó°aÃ@‡týúõÎ;C—Ëår¹ …"))‰Íf?xð`ĈíÛ·/..Þ¹s'TÆÜÜüKuND»!„êF R©TT*555Õßß?%%ÅÇǤK…Bk†a•UvPâ<|WW×›7oFEEìØ±cĈÔuF³qØlvFF¬Ö¨\2~üx„Ю]»¾Î¬Ûà€·7n\qqq}”O¥R S(---„‹‹‹µµõ»wï:wî’’²qãFkkëk׮͜9S(†……!„JKK÷ìÙóäÉ“çÏŸ‡‡‡O˜0AOO/..ŽB¡´hÑbÅŠ Ýx_ V ƒA "„H$ì(0„Hÿ3 ®'ý@ñ?( …Bù: Nõfß*·ÎUþ½ëëtð•kNtËoÙŒ8ŽCK~ˇ6^±¹sçFGG#„ÜÜÜ–,Y"‹—/_¾fÍ׫W¯Õ«W“ÉdÿÙ³gëëëwíÚuêÔ©111›6mš3gÎÉ“'W¯^½lÙ2pjž7o‡ÃéܹsJJŠ««ë»wïâããá²U«VEDDÌ›7O­V÷ë×F£Ý½{7<<<,,lÏž=¥¥¥®®®K—. OMMÍÊÊB8qÂÔÔ´}ûö³gÏŽŒŒ466 ½råÊÂ… ¹\n×®]CCC—.]Ú½{÷¯öªƒîfˆsçÎùúú‚ $“É`H‘øßC¥RÑéô˜˜˜~ýú͘1ãÀ.\hÔö]¨¼ŽŽ‡Ã!\¤BÄÿufÝa[­§@M0•Â1øÝ#„>|ø˜˜Ø¡CŸk×®íØ±#..®k×®ŽŽŽ2™ŒËå._¾œN§Ïš5këÖ­3gÎܶmÛáÇBýû÷ µ¶¶ IKKóôôlt&W‰Äár…%%l6›ÅfÓD‰@ÀÖÒR«T2™ÌÀЮ•–Êårbiär¹´rŸb©TJÄÖVV)Wð¸ªpÇq !¼>CKšð S(j•ŠD"Q(„a ¹V#PøS©T™¬V©är¹¦PÖd •ªT*• …BÑâpÄeeÚ::%Á—Ö"zງËU«TàÙÚÐ-Ô„ªÃ\¥RuèÐa„ |>?---((ÈÕÕuÔ¨Q,‹D"ݾ}[$=zôÈßßÿßÿÝ´i‡Ãñôô¤Óé ©<~üX,?|ødÐÂÂÂÿý÷Ì™3'%%!töìY¸¬¬¬ìéÓ§|>ÿùóç))), ð%K–øúúzyyµlÙ…¼¼¼Zµj5eÊ„•Je±XJ¥*‰aعsçž={öáÇcÇŽq8__ßZZTj+²§¸¸xøðá'OžôññQ(µñÏ!…BáââòðáCcÇŽÕ­{TC°G"­Ø—šu¿oQO‹¢fÉ òU(;v477GõêÕëêÕ«ººº![[[dz³³§L™biiùñãGKKK¸ g¹¹¹W¯^mÓ¦ ÇCm-'“É¥Báɤ¤!#GÞHO¿žžÎ`0,,-ƒ†¿šª­«Û¥[·˜ÈH¹\N£ÑüMÍÍå2BˆF£%Ÿ<ùìñc“éêáÑ¡sg™TÊ`0”J¥R©;5±c!Ân) è–èt:\ L°}lâ¹ù~€ãx™HÄb±dRiž@ R*LL˜L¦°¤„D&Óh´">¿L$b±Ù†ÆÆr™ìÃV­æp8ÅÅÅüuuuõx¼üÜÜÔS§ì÷ïÚ5l̉¤R©`z'~ʘ1‚ââÄ;SOB Ø·`ÆŒ›7Si4DØZZ'’’fO™²sóæ9S§^:wŽL&;|Xã\mmrôôô ŒÀA“Ífkëèèóxºzzd2Y&“mÙ°AŸÇcki©T* •ºhΜ§Ñèt®¶ö‰¤¤MëÖ7kF£ÑT*‹Å242ÒÓ×GQ(mmm`~± eþwžVh­£«««§×¸ö*àRI"‘D"‚½Vi)BˆD"I$¿=’H$!33³ˆˆˆÔÔÔË—/«Õꀀ€œœœ—/_¾ÿþÉ“' Ôòx< ‹åË—Ÿ={655U"‘ 0.ûðáý{÷x<^—.]æÏŸŸ’’rùòe__ß³gϦ¥¥­X±¢G#GŽG£ÓŸ=~lnn>0(S©„eeEÅÅ[ãâŠøüÒÒÒÑãÇ÷÷ñ‰ »sëÖ/={>¼woüÔ©CFŒ8°gσ{÷–ÇÄD/]Z"” …“¦O7·°3xp›öíÍ[µ7eJC·DBaŽã±ð2‘hȈKæÍ›2kÖÑL¦\&“ËåFÆÆqÛ·—Cýýý Òçñ¨TêïwïÙ·oý–--ÍÌÞ¾z»ƒA¡Pttu)Š\.ß¾ysnv¶‡··½“ÓùÔÔR¡ðãû÷,6{Ü”)é/Ù¿_,;¹¹õqtd±X;uJKI±sr*‰2oÜÂf³r9ƒÉ̸zõÊ… &Íš ;¶ ?ÿ÷;wŸþí7ƒÑÏÇçÈý}|þþûùÔÔfÍ›:”«­}ýÊ•Âü|¡Pè?h‹ÅúIb¾¾%`¹ôððÐ××G£*›Í7nBˆËåúûû:Ž«”J„ ÃîÝûï¿ÿÞÍ̌۶íè ##*öúßÌœùöõk{{#™TZRR22$$",ÌÙÚÚ¢mÛ%+W^.IôÉ“'fff‰äßÿŠŠBõêÕËÊʪB±\.wáÂ…ÄIÇ{õê1¿:>aÂâWâOWWWWWWâb777ÍJ"„†N"‘îÞ½[¡2_- ÕJ ‚e/&&¦oß¾!MmM~*---¹\Ž‘E¡P…B¹\¾qãF>Ÿ¯¥¥õøñã'Ož0 ±XšÕ Á2l6ûÚµkàQëíí=qâD‡À”Öd„þ:ðx¼„„„ÂÂB¹\ÎçóÅbq«V­-ZTË&+§±±1*a!‘H4Åb^¬Úººº¨Ü‘Çq‡®èðt2™Ü²eKTÞªÔVùõkoo®s«Žãí:vìëé9tÔ¨.]»îݹ“D&«Õjm+[[ŸÚwê¤T(H$’\&³°´Ü{ìØû7oöþúë†Õ«uõõ‹‹ŠvmÛV*vïÕK&“Ñéô^66…ÂÞÉ)åäÉ{÷îåçæºôí»j•@ ؽm[III÷^½D"Q›víÌÌÍry“ ô}¡Üæzzº\&ëaej!m …RXP¸s'J [¾œÃå–•–b&—ɘ††’²2„ãÀ4•Óºp¸Ü">ÿê¥K®ýúýûÏ?|>ÿñÇ ÃoР¡þþÿþý÷ó§O=ýüŒLLüŽK$ ÃÚuè ¯¯ÿôÑ£Gvùå]:]­Vëéë§_¸Ÿ›ûâÏ?¥Réó'O¦Ï›gÙ¡Ãåóç-;t ÓéiÉÉV¶¶ÏŸ<ùøþýßý%‘Hþyñ¢L¡À0lаaƒ~óáC“T <´ 5Ò˜ ª6“˜Fú­³gÏ"„¶lÙbddN&0Ùl8 f„{ ‚7„qYÏ3Â3 ÖnbùÖt#Ó¬dåÊÔÆ{øë¥XxŠŠŠòóóAf¬sIqéÒ%X\BkÖ¬‘Ëå·oß GGǼ¼¼)S¦øøø…BƒÁápªùê;wî<{öìêÕ«A Õ××o’„¾ÅÅÅC† yòäIJJ …B™2eŠŽŽNË–-Áí±6ºJp?Òô”444_©P(  ên|º´DwW«ÕCGš6gNQQ‰Lçe¹\Þªuë•k×jq8R©T*‘Èd¥RÙÒÌìϧO9ZZ*µšD"ɤRT>`¢Òh}Xl¶µ­m—_~¹{ë‡Ë#¤P*itºT*ÅÕj†©p®§ÑhvNN'Ž-++ 9RŠð¤( óÖ­míí;vîÌ30 ÓémÛسgȈr™ìÄÑ£BC_ÿû/q¾8˜Òéôb‘¨¡[÷1õú â TÐktéÒ¥K—.p\e$8X ³4q’ÅÀ4øý1ÍU¨*Wž[¡2µYkj»«S(•=·ëðbb±xöìÙ8ŽÛÛÛ·iÓæúõë!ggççÏŸ¿|ù2##cíÚµûöí ¤ÓéÀ’W4†aÆÆÆË–-ËÌÌ|óæÏÙ³g RSS›â_¾R©´}ûö'NìÕ«×СCÿþûï±cÇŽ=šØ T•J¥T*Aà€c"ô–v(G$±ðC–Â_•çô rHc…Ãõp’x4ŽãB¡ðàÁƒ™O‡ \¾|´¿aÇ)d2F"©Õj:ƒ¡R©„"ì“ht:FÃ0ŒN§‹JK%å)ÞÔj5ƒÉ|üÇ gΜ².:ÚР!!Tmì!³&ON9uŠF£Q©TÈm¬V©\]=|èäæV\R2xØ0ƒ1&(hÖäÉ)'O2 :ƒAÒàkBÂL1 „ã2‘H,ýKÅb±D,ƒ ‰D–”  *.*Z8{öåóçWED¤œ:ÅápÊÊÊp„JKK ­mmo^»&—Éþøýw©D¢V«¥ !¹L&“J9Niiéá}û^¿| }OTZêåšÊ/,ìim-‘Ép/.*òðö.ÈÏûæMvVÖ?/^à8Þ©k×»·nµ±´446¾wûvûŽ\\ àš¿ÿü“N§Ëår™TÚDÿó½&IX(³³³×¬Y ó'Ò è'bÁ4ƒiPù¼¡yYmr»Be`†¯åŒôõý ö…›6m266ÃDÝNŽPƒÁøû￉´\GSrjô_ù±úP5(ŠL&/^¼xéÒ¥§N";Uã·™LË—/_¼xñ–-[rrrºtérðàÁáǃ ãà8»e Yc“ׄ‰Db2™d2Y"÷qtdkiɤR:.‹û89éêêb6hèP •JhC±òãµ›7Ÿþí·÷îééëÛØÙa6pȇ3pȵZ=7<üø‘#ׯ\161AÙÚÛ3Y¬"‰¤gïÞ"¡J£Í[¼8ýâÅ–¦¦mÛµ“ÉdJ¥RGGgþ’%Æ&& E\VæàìÌÖÒêЩӌyó®^ºD"“íœä2YÛvíÂ""Ì[µ242Z¼b…ŽžžYëÖ3æÏO¿pD&Û9:ŠÅb;GG®¶6¤älè6nÂÿƒ°[©TªéÓ§;;;wèÐáåË—2™ R›eggs¹\---p*P*•………ÀéÒ2:®Iè—éØ¿¨2u%(A) @À1±> …ÂÞ½{£òduÞîf–øä¬œ^¢‚ö¬†mG¤ò€­ÿ€RRR|}}Ïœ9ãçç×d«€ê- I „&MšòìÙ³7n„††nÙ²åòåËm‹}"K®\.Jup‘Û·oŸ&q;üúêÕ+—nݺ±X¬”””G >¼}ûöb±øÀïß¿>Ÿ?|øð¶mÛbFP¶kiiÑéôû÷ïŸ:uÊÌÌlÔ¨QT*•B¡ÀÐmxÍŽS(Qii† ~ÒètмM &,ô,--u%1•J¥­««Çã) ±XŒa˜T*5iÑáøÿT¹å·£rrød*¥R¥TWbVeùM¨?( •ú©íô ¦ff$2ÙÉÍ }º¥¥¥L&spp¸uë–£££ÁÁƒ¡gWx4ÔjáÂ…<èÝ»·R©,))122 U8‘ŠÕ¼ÇñÏæ‡rš5kvôèQ Lc0eæÌ™»wïNKK£Óé …äW"%êãÇÏž= ì «¿sçAÜþèÑ£ .À£óòòÌÍÍÇaعsçþþûï .xzz>þ¼  àîÝ»æææPg‰4xð`77·>}úøøøÜ¾}ûäÉ“ÙÙÙ¿þú«ŽŽÎÝ»woܸñôéS///`p_µjÕ©S§²³³þéÓ§¨’o`Ã>ŸŽ®.|£ê?DMÎ×¼Í?›–¥oµZÍd2K…“&½úç¶–ÖÐQ£¼üü òó5g °mÍ\° ´´T.—W˜@ýë§tÛ„N\YùF"=8Ql•šøÊ·üï *Sµ¦QCóšZº»6¡¾óÀ´iÓFýÇÌ›7ÏÆÆ¦   ??ýúõÅÅÅ}úô)--íØ±#DéÚÚÚ^»v Ã0;;;‰ôñãÇ›7o^»v­M›6†††eeeíÛ·‡Ü …*æzXN`+ ª‘ÜÜ\à;‚È,¡Pèêêšœœ +1,TÚ¥F£ÏðáÃcbbôôô¾¥XJ&“E"ÑÑ£G³³³  dhhˆþ÷SD ®^½ºE‹ãÇ'ìwÄÄúI¨¼\._µjÕ€ºuë†aX\\\§N<<<ˆ°C"æ² ­ZµÊÌÌ,$$ì›ðèüüü)S¦;vì³y!2…ž„t(<ðñña2™§OŸö÷÷öý s»iÓ¦ÌÌÌ 6T&n‡k´µµ ·ˆLqwwçp8îîî-Z´@åÓ.™L†É`0Àe êSh A {ïÑ£‡‘‘Ҝ念/·L5tEšPï€Ä)KçÏg’ɳ¦M{ðûïc‚‚¶&&z”‰DšÃÇq~a¡fÐMšð “É>|øÐºukGGÇ®]»]­¥¥eTTlwóòòˆ(™Î;!´aÄP³fÍÆŽÛ©S'‰DÂd2óòò//ïÒ¥K!@ðáÃH Ÿ#//¯  !$—ËÁ‚®ÐÕ²³³Eÿ" ŪU«~ýõW„лwïæÌ™sûöm„†aB¡0//„à&‡ëe2Ü ¥A ±& ¦c08‚‹É… ~ûí·#F,\¸P&“‘ÉdpˆÓ××ïÖ­ÛüùóÏœ9sëÖ-XãÁüÊü®]»áúùóçBP ‰$š5kæìì|ñâE™L–™™)Ò¬U(p»B¡’‘Hd``жmÛ¨¨¨<}úÔÑÑÑÅÅåìÙ³çÎÛºuëëׯ VøÇC#ŸÊ÷ãÜ´Ôý P*†ÆÆñ±±ÆúúG’’|||V­^}òäÉ…3gò !†æõà²ÚеnÂÏBK²råʱcÇ2„Á`ôíÛwРAl6{ذa#GŽ¿¤¤dΜ9VVVÀî-‰ÜÝÝ‹ŠŠ”JeFF†““¨IRRRvïÞM§Ó;uê™’’²qãFkkëëׯO:!´lÙ²ââb@°hÑ¢Úè* ¯ Aƒyyy¹¹¹ÙÙÙmܸÑÅÅÔB büý÷ßíííçλyófMâöõë×:tèîÝ»NNNÚÚÚcÇŽ1 ˜Ô###Ïž=kjj Nô=<Gõë×O[[!Ô¿7vìØ-[¶¼zõj×®] £G‘‘‘ééé~~~NNN=zôX¶lYrr2™L.о}ûjÛ„&|P¨Ô">ÿï?ÿœ6y2*Ÿ“µµµårù0Õ6¡1–{&“¹k×®ÂÂB2™ ¶ „І òòòBpæðáÄpôèQ8ÀqÜÙÙÙÚÚšÏç¡¿Z­>tèa'm—ú1ˆˆõ÷õõ½wï•J1bĵk×´µµ‰ ó¯ˆÌj,øŸ“©JrÞ·ùðÐW¯^uëÖ •“cbfjjº|ùr …2}úôÓ§Oæææ&%%•––r8>Ÿonn¾aÆ… &''[ZZ¾xñb÷îÝ¿ýö[LL̉'ˆ$_:::]ºt9|øð‡@;²víÚíÛ·wíÚÕËËëÚµk;vìfm;;;.—{úôé—/_îÚµëØ±c111[¶l©MòTð?P©Tt:ýöíÛôññ™1cFDD„GB.ÀŒ34ïe0š¿Ž9RóÇq‚Ž;‚y¤„‡‡\?sæL͖פlÇq¼G=zô .èÛ·/ÁÅP‡ßº €cïTP©TºZZºúúÏŸ=CAAD–B.W)ÿ‡¦ÖC8N*VnBƒ€J¥š˜˜ rw~„ŽãàQÐô(%˜Á±Åb¿tþËÿÄ "ÞØÖÖ!ôñãG éAô]yŒÖ`Dyyy1"662Ô÷tCp# …BTî‚aØÓ§O#"",,,À.öúõë>}ú r,*•Ú³gO„PË–-•Jåëׯ ׯ_/lmm5–¥R©ŸŸßСCGݲeË—/_BN KKK„••ÕÕ«Wuuu-,,B¶¶¶J¥òýû÷PZqq±­­-0°Õ²€‘Y¥R1"00ÐÎÎîÂ… ·nÝb2™@ÇN¡PˆP/ˆþK¸®ÉòNpWÀ7ÒtÌ$âó+@ùD#W l¯@÷^çÉ4šRר9ØM¨Tª~ÞÞ‡wíš3w.·3ƪOŸ®]»* Ý~æŽTΞ* ›¢ÉDT üIl˜ ©¨ÊžÊ„þ ÎJÿ?r9xÀƒ„Ðýð€h6›ýÍè¤á¡>>>‹-=z´±±ñÛ·oY,ÖáÇ-,,Ö­[RRRÒµk×#GŽLŸ>Ø>Py:w…B¡T*ÍÍÍÛµkEì ï.±Xܾ}{[[[—gÏž) »térÿþý üþûï¯^½êÚµëíÛ·›7o¥žnu²bb “ÉÌÌÌŒŒŒäñx;vì1bÁP¡§Uo*°|* Ƨ*”_AµY™Á½Å Ç…%%߯áìû…Ba±Ùß~â«^!§©õü–u#b9ñò©¸¨°pPp°R©4oÕŠ„a8Ž—”” :tò¸qà,X±æè'Œ0„p„Hæíçgïâ".+kÒ 5ªA­&È´ú?¿=(D¬2¤x½}û6aûI MH¤’’’‡º»»ƒ‡M}?!Ô»wïÉ“'O:ÕÈÈ(++kÖ¬Y£G ={ö‡,--}}}/\¸Äd2׬YÃår!¬Ífçä䤧§6 Çq77·ñãÇCÍ1 c±XjµzÛ¶m$é?þ€»,XN§Ó­¬¬œ…Bá¬Y³¬­­i4šD"2dÈ­[·† ¦V«½¼¼êPc ²»yxxÌš5kË–-W®\–Å2àt]Â’/ggµJE„àýœÝ‰L>wíW[ûÛw>û,â‚Z¦ÃûŠZQ¨T*• ª&(.:bD×nݦŒcÙ±cþ‡]Ú¶-**ª8'ã8Â0 ýñÆN•P«ÕÚÚÚÇŽc±Ùý}}E¥¥MbPe4%†ªŸŠg§(•J*•ºdɉDòðáCÂ.POõ¨ (ÓÔ‰Uø³&·ÔGõ88´³Ñ%—˃‚‚|||ø|¾®®.xæž>}Z,óx_¥R±Ùl‰DBØCY,D\š˜˜…B¡PÈf³!"„€¦ýi$ÍzHcGXoQyzmØzÐÊ["‘( @€«ÕÅ|>†Ñ7p„@}H¥RÅeevvvË""šRý òteeey%%Kú–¦Ÿ¦~òE @{]ºtÉÛÛ!¤T*aâ¨'T©(#¢¬+_Sý-u˜.!Â蛡‚×H-ü“`žÕô># ªÃ ¾iD±P ´10`;¥­­Mð¿!ŒVãéVWï áôt:}Íš5}úô ðððHMM¥P(Ëâ·üß$IGGçÛøœ}Ÿ€W*•õ½zôZÍ›7?ú˜˜WPPðúõë{÷îYYY¢Çñ›7oöèÑ£Y³fsçÎõòòêÙ³gnn®»»û¬Y³ˆQehH•I°áØ6hž¬ A ·oß¾dɃ‚‚‚áüÏgú´•JUR\üòï¿3¯_?|äHe•˜­£¢¢.\i4*<âû_q—J¥5ûÑP¡Pàu쯂w`¿i…„N“„‡bÌ 2™,666++ëçœgªŽãÍ›7Ÿ;wn•ü>„P^^Þ‡ Xº¾‡X,f2™0ÂBˆ’J¥0SÀº.•Ji4ø´‚rN§ÃŸÄ-‰NÖUÅ`tÅÇÇ7kÖ¬>2ÅV*½Æˆ_Ák¸Jžh"¿z5¿Vø“xáI]ý³êiÙ&Xýüü$‰§§gÏž=7mÚD„Óÿ`j!ͼ] ]—kBÎþ“Ëåă §ãòåË¥Ri@@ÀºuëŒBJ¥ÒÇÇ'66ÖÄÄ$''ÇØØx×®]b±ØÕÕuäÈ‘úúú°U¸zõjzzº (´ôôô¬¬¬îÝ»' ÝÝÝËÊÊ<øþýûAƒõèÑC(¦¤¤0™ÌŒŒŒ€€'''¥R™””@(\A^™œ¸E,íß¿¿Îéž ª·L±Õà³^cU¾fõê±O•ùEϪ¿.A¨…¨TêÕ«W!œ~úôéK–,ÑÒÒúñÔB„ÖóGz©¯k„z,?d2ùðáÃ………¡«W¯Â6U"g'þ„‚—/_>þœÅb±Ùl8yïÞ½åË—/\¸ðôéÓ>|èÒ¥K³fͬ¬¬nÞ¼ z£+V˜˜˜ôë×/22rË–-úúú3gÎ\ºtiûöí×®]ëääô×_=ztĈêÉd2A)…‘HºúúúŠrhÇ©4( è Fèêê~vR"â"“““cbbÞ¾}«R©ºtéÒµkW©Tú=X‘ˆe©OŸ>2™ŒJ¥úûû/Y²ÄÐÐpKýöUÂ0ìÎ;W®\ÁqÜÊʪ_¿~Èú‰aK7„#‡æD\ClPA’Ö¤ãG‰D¢“'OŽ5êúõëçÎÓÑÑa³Ùþþþfffµ_ÑÔj5‡Ã‰ÕÕÕýiuÏ Š‹‹¯^½ú©m!TRRbee…êyí‡ÞÓ¢E‹‡2äÝ»w8Ž ‚¬¬,µZmgg·|ùòÒÒÒ>Ðéôׯ_#„ž={6zôè—/_þñÇÇ'nÉÎÎ&“Ézzz¨®Ç …Bi çùRÔrs¯N?pà@www;;»„„0 |swƒƒè–M¬Á5„Z­îÒ¥K¿~ýH$ÒÓ§O‰±-âO …’››G¥R7lØÀ`0är9FKNNöññôsëÖ­#“É f0°¹OMM~üøÍ›7æææ £U«V=ÊÊÊ|ØÑÑqÞ¼yQQQ ¥J÷ÒŸ úy5úù*ªl-%®¯p¾†úÿº¡Ã¨“Ò­[·nÝ€aËÂÂLE•`‰?år¹¥¥e||<¤ÏCUIÀº"iYY” éí´´´ÜÜÜ,,,ŠŠŠÀªŽruuݾ}{aaá²eËÐ'(þ_Gø_M!¦ñ¦q¦š6¤R©gÏžõññ9t脎b‚Åw:D´Ò¦M›V­ZåààpëÖ­ÌÌL"+â7¨¨¦T*°ÈvêÔ Çñ „H$Ò‰'€¬×®]t:=""¤è$žžžöööOŸ>µ±±Y¶lÙºuë233---Ÿ={¶oß¾>lݺ•L&7oÞ|åÊ•è¿Ý‰ÈÅI&“íì쀽699¹öb&ÿ•JmƒˆÖøÔ"EBikk߿ճc|ŒöíÛ …ÂŒŒ CCCGGÇG½zõªS§N¡¶mÛfff¾yó¦ÿþ†eddèêêêèèXXXT¾¥sçΨî&e…BA&“=Êf³£¢¢Ðw–`ü{ìçP]pâžC©T6ìæÍ›'OžtppH$0O}'n ™L±zõê·oßÂIзÇšZzB”ø&Í+Q9ëk5VTÍ»4MX-øÄ?ø²:ºº\.·n?±B¡ ößr¹z©Z­–H$šñÄŸ†dí†Ê×-??¿”””sçÎ%$$ðùü®]»¦¦¦ÞºuëèÑ£P¦³³ó… ˆôvd2¹¬œÌ&(((%%…B¡´jÕª^½4`«’’âãã“’’2lØ0…BŸ¼^¨õðÂþº ðr(•J--­?þøÇqðI¨žV Èdr›6m@Çó˜H$255ݰaC¯^½~ýõW##£eË–­^½šD"%&&r¹ÜìììÐÐФ¤¤3gÎ „@-×»wï„„„„„??¿èèèû÷ï_¹r…ËåV˜A˜V©TD&G› !ŠË’„š6mÚû÷ïsrrêµö0«r¹ÜvíÚ%&&¶nÝÚÆÆæáÇN‚}:55uèСáááïpÃ|Æ]]ÝÝ»w/Y²tµ”„H$¨ìììž?îææÆãñÊ777·°°Ê„lwµ|5€´µµutu;tèä±c.¤Ïá8Òp9¯¨dß¾}{!äááܰ e̘1DH&™L3f ¸±Ùì±cÇ‚;¡P«ÕÖÖÖwîÜqwwg0ÁÁÁC† ¹}ûöâÅ‹½¼¼B«V­255MMMvSƒå¨Õj---P0Wý"•è+_P“NB&“‹ŠŠ†~êÔ)°Žaå”Bµ”/‰Ôj5aœU*•5ÑÙTs![S©TˆÒº}û¶\.‡läßr°Óét¹\NDfÀ˜F£*±E‹T*5//oòäÉ«W¯þøñ£D"Q©TmÛ¶mÑ¢›ÍZ&“Ù«W/„P«V­ø|~nnnFFÆš5kÚ´ic``PÙ8EüIŒÍ’’B$j(úÎZJk¥ „ŒŒŒZ¶l¹eË–¨¨(È0ZO]_Ë–-ccc×®]Ëb±Þ¾}[ZZÚºuk„µµõµk×Bæææiii“&M‚+ßò¥)?±ò4[ĈTR«Õt:ýôéÓ HIIqww¯CCÛÏ€âââ &üõ×_½{÷Þ±cG8ô€8E&“+³,þx~Ó5B¡hÕª•¿¿¿X,>sæLlllvvvnn®§§'„tìØÑÒÒ²¸¸øýû÷T*uÖ¬Y]»v­sVÇÔÔÔ¸¸8++«[·n-_¾üéÓ§t:}Ê”){÷îýøñãŠ+ÒÓÓ8€a˜±±ñªU«bccÓÓÓ»vízãÆ´oß>>>ðY³f}¥½ÇÕjµ¶ŽŽL&K¿x1!.î^fæŽýûAyðÙ1 £’ɤòË*k¶ wwwâ qL¥R‰ät@REüÉáp4ÒåÔU™>•»H×P=“ö²eËÆŒ “ÉÀyEsj:ƒ£OÛL«´~_D³@óD"ä\ª²d†×äÑ >%΀¾ $­‹/Z[[/X°X͈Ò@*ªsã8HºPhûöíóæÍCݽ{×ÎÎâXBR©T[[{ïÞ½mÚ´Y·nÝ„ ÊÊÊÈd²R©„:ƒˆCȈ‰„Ãá3æ—_~‘H$L&˜Ø4÷í¦R©6mÚ‚×W N–­ÊÌè=¤zs<„Å;Zå>_¡'|ª´ÏFêÕ!(03º»»_ºt)**ª^0 pooo¹\Þ²eK„ЬY³ ë¨Õj*•ºnÝ:ÈoÕ«W¯U«VÙÙÙÁŸº¥†k­J¥*((àr¹«' EII‰R©Ü°aÃæÍ›OŸ>Mì¢ê¯~<+ô‰'8àèèxäÈ‘àà`؃֦/áôš,‹{÷î ü!Ãé«Fûûï¿/^üÏ?ÿ888,\¸°  àÅ‹óçÏ1bFËÊÊ:tèÇëÒ¥KjjjÇŽB‰‰‰ÿþûïŽ;ˆœ»T*U.—¯_¿>!!¡sçΪC–K¥RYQQQ3gδ¶¶9räü!“ÉŒŒŒbcc×­[wüøñ%K–\¹reݺuè«(FqÇH$6›}ýÊ•õÑÑîÝS«Õ¶öööÎÎo^½ªIÀm&•HdT*B¨¸¸¸òŠT>çÇ S‰/ϦLüYe§…¢ ÙÏϯ¤¤iÌÈD™¸Fz;pÓ‘Éd·oßžÿ³›rÇ)J~~~ZZZff&ô,233¯\¹B¥Rhii©ÖDp†ÖÏ vUÍÿOž<Ù¥K—¶mÛÞ½{÷¯¿þ3fŒJ¥:vìX¯^½V¯^½sçNMzU¨0PGæååM:5)) TS`m$Èâ+Èš0Þy<ž··wttt||<ˆwõ$i~_„ÐêÕ«/^‹Åžt;;;`®¾. … Ï¿zõj›6môôôÈd2X—#""nܸa``СC‡¯öc¥P(c† yxÿ>hÔjõËþékk«¬¡1ÇÉdrqq1™D:áÂ7³žH$‡³víÚÚ 0 ãñxçÎW¡Oy©ÕêªéI$IYÏÐÖ€O=d…U«VõíÛ×ÈȈ b?qâÄŽ;BCCÁäÉ“ccc»wï.“ÉT*x±À‚ÑLÍš5CUŽ~‚¯\¹òâÅ‹ðð𤤤cÇŽ3¦¨¨(66öòåË111 ¥B&p½Âq<''GGGº*•ŠÁ`™N'ˆâ`1Z¼x±­­íÊ•+µµµ 2¡'N „UDFšrèfã¶Eôßÿ?סp==½mÛ¶åçç«Õj`Ï_°`ôƱcÇÑ0û€ÂûèÑ£0¹9rð9sæT¸þ·ß~ãóùzzzÀßC÷BGŽAÍ;ÄJmmm.—ûE–P„Ê888ØÚÚÂÀGå^G_46AÔHJJJJJ }úôiNNNÇŽ‰bbbû¼¼<Æãñˆ#—ËËÊÊ óòòH$’Z­–Ëå@[W½Ã0â² ¥cEQQ‘ŽŽŽ––ôU"Rˆ¼ƒ¾Z· À»Q(”9sæŒ5ÊÏÏÍf׫£>lž ÇWô { øÍë\5·Ôäq†M8ë „Ôjµ··wppð¸qãâââºuëöáÃ"ç.LÙ<O,ÿûï¿;w¾uë–««+†a>|@=xðH(ŒÇŽÛ©S'‘H¤¥¥%‘H ­[·nÙ²åœ9s,X€Êwü_ñ:8Ž5ŠÉdfÞ¼ g| ‹ˆàÖ¤@¥RiÒ¬ÙÜiÓ ¸Ü;wV&¬T£.ªæzhöjä*•ZXPÐÇήJúÄü¼¼ùÓ§+«yþ_¼½R åZ­Þ¾}{\\„’cuBB‚“““µµõ»wï:wî}ãÆ={öH$ˆf*..ö÷÷·³³{úô©½½}xx8<ÂÙÙùêÕ«pìééùâÅ‹wïÞÙØØ0ŒÑ£GŸ9sfÆ –––ÏŸ?ß¾}{ëÖ­'Nœ(—Ë9ÈUÓ¦MR©tíÚµ\.wþüù˜8q¢žžÞÆÇŽ› ¯¯—§T#›ÉdrFFFDDĵk×’““5_œD&SÉd0¤j¶•J¥P©è«hº4ÙóA„4Xû¹\.DÎCSƒÀGT¾ž áâihƒètºæº^󪳮™™™½½ýĉ÷îÝ;uêÔ¹sçÂfþ‹œ{`,ÿþûïmÛ¶usssrr‚òoÞ¼¹gÏ à‡$&&Þ»w¯¸¸¸ÿþ„9¾S§N­[·ÎËËËÎÎf0 .lÙ²eVVVtt4Ñ‘}ϼyó²²²˜Læ¢E‹îß¿1à&L¸zõj\\œŽŽN‡-ZD§Ó!RïéÓ§š‘w-Z´X±bEÍ_­&ø‘%BR«^¼xqÀ€r¹¼#=è6¿zùÑŒY­Pq45¹¥&ƒ©!--- àŸþY·n]çÎ ¥‘¨n[ög¨¯étzLLL¿~ýfΜ¹{÷î´´4:^KͦZèöíÛÀ²8cÆŒˆˆˆŸD~…°g˜× ½½½‡nnn)ä`J¥P(R©444”J¥ŠÅbOOÏ_~ùåêÕ«š9w*}îܹ3fÌèÝ»7ŽãB¡pôèÑC† ™={vnnn«V­B‹/^´h‘¡¡¡L&Û³g›Í&ì8;;8p\ƒ¿NϪ{!!Ξݺqã½ÌÌSÇŽ…ΞݬE EUÔ+@©Tðx &Ö›š ~ŸÀ˳‹T¦OD‘)…BA§ÓYlv5>ÎðîwîÜéß¿?qDömÛÂèpvv>~ü¸@ ÈÍÍ|HLL”ÉdGÝ¿ÿÊ•+8‚¸X,&“ÉÏŸ?'“É!¥é#B£ÑîÞ½»`Á‚›7oªÕjWWWÈ Ç`0d2™T")(,äVƒŠù|\­Crž¯ø4<]¾úÆê 5¹æSP*•†††J¥²°°pÁ‚³fÍ*((ˆŒŒüõ×_[Äš—m8}úô)S¦ØÛÛwîÜyéҥ͛7_±bÅ´iÓ¬­­CBBΟ??~üxooï¿ÿþ›0Ç¿ÿ>99955õéÓ§G…ì%%%eeeÓ¦MÓÑÑÑìH»wï.((HJJ&O33³¾}ûþõ×_aaaAAA«V­Z±b…­­mqq1ÒˆÔ[²dIBB‡úôé’––æééY‡3ÿÿlºÀ;¹wï^___ˆº}ª4ÙÁ€l\ a–NNNÞ¿—.].^¼Ø·o_byþIl+õ 5 ‡žøøø€&Ùßß¿öšM–ÅÀÀ@''§cÇŽíß¿ßÎÎîfY„ž Yr Y$&&&77W[[›J¥Â.óСC!&“¹}ûvÐÃÃ^3..N3ç.Lv¾¾¾666ááá|>___ÿäÉ“‰„Èãëææfkk 倨DXîÁÀAÉÿÕ_“„a°D¹õëçêá‘qõê²… îÙ³(2R$’?§ÚQ*• •J]n «¹á{ƒ¦§púDµZÍ$‘h4Z^NÎÇÛ…>ámŠaXqqqVV¸iÃGÐ'¹\’bQQô‡öíÛƒ¤Û£GŒŒ @pãÆëׯ·iÓÆÐÐP,[ZZ¶hÑ!Äãñ¤R)<¥Y³f:::'Ož433suuݱcGqqñ¸qãÄb1at:‚¤Z¶l©T*ß¿|¼vvv/^|óæ „é¹¹¹8p!Ô­[·]»vÁÉ}ûöuéÒi(´ @//¯[·nÁ¤¡V«ÿüóOKKKÂäWTT¤R«ïÞ¼©R©þ“R£Üó‰_Xhïàð)[äÿµƒJuùòe0ž¨Tªœœœ„„.—ûEó!t-SSÓäääÜÜÜM›6-Y²dóæÍyyy`·°°022Ú°aí[·Z·nM˜ãÛµk§§§÷âÅ pä¥R©$I&“µiÓ¦yóæè¿éõë×p…B¡P(`Ü733S©T>|`0ЋÀ׊ˆÔkÕªÕ½{÷ÀRŸ‘‘ѦM0¢Õáªý¿¢Ä}||Μ93`À€¡C‡{yyá•’R‘ÉäÂÂÂgÏž9;;׫í¬nƒG¡PŒ5ŠF£)½§×U­ézðf‡Ê:!P&éêê80>>~ýúõ Èêêê¶nÝzûöíàR d6Ïž={ûöm‡>|8oÞ¼‡†„„téÒ…ˆf"bãååz)ðºm×®]BBÂo¿ýÖºuë'OžäååmÛ¶­¨¨ˆ¤'8‹U*•¹¹yJJ BèÖ­[ÖÖÖwïÞ8qbzz:,`;vœ8qâ‰'Š‹‹cbb’’’ÐUA8ŽO:•ÅbAv „аaÃbccÂÐÐpÒĉBalBBNvvemPŸ?ràÀ›<ƒï7²NÚ ±cÇêéé 2¤wïÞðÝçÍ›7|øp{{û/J‡“Éû÷ïÙlvóæÍ‡ Á`0LLLƌƓüüüÄÄÄ;wîhšã¡XXX\¿~}Ê”)ÀÀݲBGBµnÝ:##còäɆ}üø1))éöíÛ %%ÅÐÐP.—?xðÀÆÆF$Aøv"ï¤R)‘Ž­®óÿ;H ~~~iiiûöí:t¨™™ÙêÕ«]]]ÁÅ&Ç;w†feeåææ²X¬Æ% ¼¼uëV›;wî€Ûy}?ûï”]9P¢±´a…÷BŸX‰ð™Aƒyyyi:ôÔI8=Ød×­[ççç7mÚ´„„Â)›ˆCùÁ€WJ¡y²BL)Òø:•£L‰& ÇÊS[k â•ýÂ÷²³³ƒüGÂ=¾0c‘Édð#ièfþ. V©tõô|\\Äeewž=[>>.\xöìY#ÍÜê}vãÆú{Beݹs猌 ƒò­ ò·k×®oããY瀷7n‹ÅÚ¼ys•±š„?ûÁƒ'Mš= ]¨¥æüO©TªH$ŠŠŠÚ¼y38eסß4¼ÑÌ3òJJ¶%&füøŸ ¶§ü€¾}Ÿ7Ú!Sá¾®þÄpèÔ¹óéK—ôy¼¯Kx¤T*›µh1eìX#míMññ—ä¢rƒ€i¬¹©é®-[Ž8ðÛÙ³zúú gÎ<{ò¤uïÞGŽ!‚á‰BàõçÌ™#‹·oßNÈI0±çååQ(}}} Ãrrr&L˜pèÐ!™LF,cb±˜°¢ªÕj‚æG,kÒ‹¨Õj™LL0D„q=Añä t:|V@bf2™jµ://O[[›PU¼2R©”Èw ’››kkk ûp&33süøñÇ_¼x±X,f±X3¦OÏ/)Ù–˜˜õßQ b¿ `€‡Ç³§Oõôô¾ÁF·A P(h4ÚŒ3„B¡“““§§§±±14ŸÏïÖ­Û“'O¾"õxII‰P(Ô××'tz|G0ǃðM¨óòòÈd2ǃï[eGªp™¦qŸˆãñxHH"‘ S©Õjƒ¡Y“š¿¼EQQQ×®]5ÛÎŒ3ÊÊÊ*NëDâ==½åË—K$±X¬É©Êf³%É¥K—º|=`‹|çΗǃI¥þì)`êÓ§Ïÿâ<BåÁ¡‹/6Þ44ííÛ·~¤JTpè±³³»pá­[·˜Lf†ÓNÙ»víº|ù2è5žpúo†ú£/kBÃ0¹BѼE‹»wLL}ú’%K¾+–Å þa ]†o‡&ÀÊe ¤C‡&ùëÁƒ®…ùù*–X“îܹcoookk{ûömMIäƒ+V˜››»ºº†Â á •7ÓU)ÿevþìOŸ½ìSV8OhÄ=<< <š$)_Xþãͯ.­š3ÕüYåqõÖ°´O©+|Þ×áGíy0ÆfÏž}ðàÁâââzuÚhÔ"ãgQÃFY§B~ŒÄÄÄAƒq°_]P õmàÀnnniiiuå”]'P«Õäï†S8y¸ÔbŒ¿Ýóq`ši¼Vàz‚R¥2iÞüä±c“FŽÜyð`ÀàÁ¹99T*•ö£T*oß¾mkk ’ÒØ‹«T*==½C‡ùùùã hC+tûïS’[BÈÖÖ–F£ÅÆÆ¢Jœ,ßaµ›ðÃàk©©© Ô’e<Û*³,Ö‰SöWâŸq„zÛØÔ‰âú«ÛG&•"„èåLŒ R…BA"“Á4Ó uøÞ R©8\îñ#GÂfÎÜqàÀ€r¨ò•à©) b ô|__ßÔÔT`‘¨,ô|Ÿ…B‰DL&SS¼kèz5VB3ÒÈR÷Ó¨8«O0ò5€¦•÷›wíÚ1yÔ-”J¥±‰É™3Bk6mÊÍÉiÀàD …Âb³U5Ì ö£ƒB¡äå…Íœù«†¨Ê+‰ýçíÛ·»wï>}úôÍ›7C>yTÎxâíí}ýúõùóçÇÅÅ-_¾ÜÍÍM$5¸*ôSª½èèèäääÁƒ¯\¹}IÎì&| T*z$µmèê4$@\!¤J|ÍTH£Ñ$É;w¼¼¼j“Uã‹@(xë6á0”Ù´1ýÆ ÔBT*õêÕ«uëÐS¯NÙ_ý¾\m휔J¥„;qCŠAÀ)ÕPOÿ~@8+Š­‰‰‚‚r²³«þ‡àÇD™Á ^íX£¿)ô1‘HTZZú©j|ÙTQ ZZZgΜù6b´éÅ‹“““ýüü<<<ˆi´6†šß¾}ò×ë+4¡Jhjnèîîngg—àààPW,‹õá”ýuh@U<]¡T¨Q(• …¢aEÿŸ|‡ŠÊ— „ÐÀer¹«‡GaAAMˆÄ&{öì155¥P(„pÖ1•Jåçç×·o_‚_· ñb:::°²¡aMø:@ë1Œ9sædee}3Î$èÌR©tçÎr¹²³#Œ•••££#ôÆjµZÍd2çÌ™Aø•Ûä‹w„PÄÀGµjÕ*"-p}¿ŒD"Ù²eË®]»:vì¸víZwww†`©ûŠ ÀÄ‘šš 9’*Ó³6á€ÐÜÐéôÌÌÌÇ;::Λ7/** (¿k#éÖ«Sö—¢aç÷ÿÅgU¢2oBƒæL•JåääÄçó[¶hQÄçÕГƒD"zï·ß~óõõ=zôè!C*Ž)•J¦IwòÝ204M¿u:Þ Þ¾}»D"IMMݺukFFF@@ÀÉ“'5ù¾O|qÏõþýû5Ê××733³¾«£Úßß¿wïÞ½zõ233óôôìܹ3C°Ô}©r(8/]º´sçÎ . †^¥~r€æF©T6ÌÌÌlÔ¨Qׯ_¿~ýzݲ,Ö¹SvšðuP©T eåÊ•J¥òîÝ»:tøÒ›ð†Þ·oß!C@KDX³6•J%²’}o\_u‚úÐÆUŸ˜R©TVxh=Ír„ý !”““³gχöíÛÿóÏ?»víÂ0L3­XÃâSƒâkpè¦áááæææçÏŸïß¿}«R üž={â8>þü±cÇ®^½: ÀÆÆÆÚÚzúôéFFFP+KÕäL…$ °ÆÄÄìÝ»×ÝÝýÎÊÙX&0•Jegg÷üùózbY¬§ì&4áKÔ‚ """Š‹‹Õ_µW†ÍCpppPP¨Æ) áìX\\Ü(ø*ÁfÁb±ÅUÝz~¨! 2-“æSê[†þ:< ÃΞ=›””tÿþýž={?~¼_¿~&&&[¶lÑ××W©Tß¿ÏÉWÌ+•J==½)S¦,^¼¸ÿþ UÔßrÅÞ»w¯oß¾!mmíuëÖ­[·îÔ©SÉÉÉVVVºººkÖ¬éׯ,xpW•Q`$‰J¥ž;wÎÛÛ;((häÈ‘R©” ƒoBÃ<Èdre‡žÚ‡ÓWã”Ý$7áۃȵ„aØ×‰* ‚c …’››»víZ™L¦R©.\¸ —Ë¿[Ç ÍWJ¥]»víÞ½{AAÏ Aƒ`•ý1Ò$Ëd2±XLð#ÃWûÔáR©þ,..®R¡Éõ_'Ë8¢P©Tص¦¥¥ÅÄÄ<}úTø†††¡.]º 6,00°±äûûJ¬kÖ¬±···±±IOO‡!]nn°D|üøqæÌ™HÃû5000000//oÛ¶m±±±ÐôÍš5›>}:Ng³Ù•¿AIIIDDÄáÇ­¬¬Þ½{wõêÕ&•ÀwÍü„CÏÞ½{aPÕa8};e7¡ _ÿIB_{;°R-[¶,--ÍÝÝB¡°X¬ÌÌLÈiÚÐï÷¨Õj‡“šššœœldd”°zõê+Vx{{7v§ibcc/^lnn.—ËBeeel6»N´tDbÊ .Tó¡i4Ú»wïV¬X±dÉ"£í—¬(0ýÂr¹ÿþ.]º„……yzz‚̪V«E"Ñ AƒfÏžeö+Å BÆÌÈÈððð033óõõµZmhhaØ™3g.]º”žž¾cÇ„………½½=+A&“¥RéáÇ-,,Ž;æìì¼oß>ooï3f*cÿÑØQÁ¡ÇÚÚz̘1÷îÝ[ºti†ÓƒSöÑ£G9ÜPáôMhÂ×Ú3gÎŒ1büøñ·o߆íx£lhaM9{öìÂ… cccÓÓÓauoÔsrNNÎøñãýõ×ÒÒR@Yá êÄc†HLù© ”J¥®®î„ òòòBmiÍý)û—••Õ‘#G¼½½¡@"}/—ˈˆhèVÿ2|ýÞ$!ÇÏŸ?ÿüùsƒ1jÔ¨™3gƒÆŒ Äà5ƒJ¥‚‹Á1–J¥J¥ÒîÝ»«ÕjHk¯™_pÎR*•jµÚßß?!!áúõë/_¾|þü¹««+AF¤è;zôèãÇU*ÕèÑ£ ¯_¿nooŸžž™kšM¾ÀÀS( ð»qã†ÝÕ«W!É@-?ì2•Jeppð7V¯^ݧO™L*ëïÝ„ÄLHüý©+Á›ššpàÀ¸¸8}}ý/o¿À´ãÚÛÛûÉ“'b±ØÖÖöû7êÕէʪ `çöÙË8ιsçÂÂÂÖ¬YSsñ ‡,¢EEE‘‘‘®®®ÁÁÁ\.÷Æû÷ï÷öö†Ù®!Š­ì ý£V~ÍÄknݺuåÊ•‘‘‘;wvrr2dˆ§§'†a_j›L&S«Õ)óòåË£G^±bŧâîˆ,°ðIÈd²ŽŽBhÕªUU>‚pÁ#/=zÔÍÍÍÙÙ9%%… œj²Ôðšù„j!ƒqûöí}ûöù1à|-ÃéÁ¼íààpëÖ­¨¨(M§ì†n¤&ütå7…JU)•J…}ÚS&ºK—.ùúúB1™LF¥R ‘Êã«®¦5ÍÁ‹ÿ7íügiä>5faÚ‡c0&ܹsÇÆÆÆÑÑñÆ5œ.¾Oèêê®\¹òòåË2™ ÇñüüüÞ½{KñŽJ¥feeuïÞ½´´æ7}}}ö©¥YÓþ¥R©òòò¢¢¢öìÙcaa±jÕªþýûÃÌY‹B£ã>¨muÁAÄy]]Ýøøx³gÏîØ±cäÈ‘]ºt±·· …úúú³fͪžÏT­Vkii]ºtéÂ… >üûï¿i4š««ë¾}û í³ƒKÐê$¬Óür„§HpppÿþýcbbŒŒŒ–nø'ÁMjÄg=ztPP““Ó±cÇöïßoggW',‹ ÇÄÄôë×oæÌ™»wïNKK£Óé°®4tS5ágŽã.WPTÄÿø‘Ëåêóx¥¥¥eee„BH,kkkËd2 à úfݺu‡†DªŸÝpÖÕlVM"ñÏ>¢&u P(@'}çÎWW×S§N 0 ñfØ(.. Ù½{wQQ‘@ °··¿yó&0¹ƒ§ƒ'uHHˆ¶¶v\\ÜÁƒ²³³W®\NdbT°¥¦¦†……{xx;vLÓþE¨~ ÔÔ:1"½½½akR\\¼yóæÂÂB.—›žž¾}ûv‡Sý&Ã0©TêãããæævòäI‡Ãf³B_ê+WÖ’!¤R©¸\.,„膛ÔBuÇ% ‹Å"þ„^ ø{¡r»B|¶D"Ñ©S§F•‘‘±dÉ{{{ÈY‡áô...<ðñña2™§OŸö÷÷‡§Ãn·¡›­VPs´ZR(ʪÒ7¡¡V«ÙlvÒÁƒg““y<^aAA?oo{gçÕJ¥Öªààà´´´5kÖOœ8ñرc¡¡C‡‚u !$D"ŽãT*ÕØØ„ ð¡¤ÑhW®\ÑÖÖîÕ«4ô¡Äœ ÊQ"xŒˆFÅb1[„B¡(--=tèPhh(Ò ±Å áÒÒÒäääaÆÁ½°#…êÁniÄŠ­ÉŒ3¶lÙ2`À€ÆÛWq¯d===hd‡ómT\ l±Ùl‘HTRRB"‘ž={6oÞ¼ììl¤!•O¡PòòòvìØtzAAA“&M—\ÍkºQëuù> uÆÆÆÑÑÑð ’ÏÞ˜Ãá'AóVßí£‘ˆNÒ´¯WÉ^F~~~þ”)SŽ;Føëi~_byÆËùÁÀÏL"‘ìß¿?88˜B¡¬[·ÎÏÏoÚ´i —/_®}~ Âú†aØ… Ž?>bĈ &lذF£)¹ #‘ Œ  &‹…2d0Ô&&J…¢š$;Mø–ÀÕj›}ÿÎc‡¯ß²¥EË–ÅEE9YY2©T*•¢òoTVV†’J¥ çÞ¶mÛŒ3ˆB““Ó/¿ü‚㸩©idd$±ÈÁZxñâÅæÍ›÷êՋЈÃx$.Ãq\s$ÂÐ##Ä‘H¤°°0;;»!C†ÄÇÇŸlhh¸zõj¸ý‡¤®{ñBÓ2E˜¥Èd2ÈÂ5&â7Ó¼iF'U©B?£WÇq˜ÐB†•––îÝ»—Ïç6ÌÒÒòÖ­[/^¤R©cÆŒiÑ¢†aW¯^½~ýzçι\.ŒF¹\^Ù¡§NÂéA55hÐ ///''§~ýûó z;9¡rφn¼/‰D—•mZ³†ÃåÞ¿s!¾bEnVVGÇ~ÞÞßsúñŸÀxõòe'W×Î]ºüùìY‰@`ÖªU~n. Ã7âKæÕ«WNNN¨\ù-‘HZ´h±gÏB¡rãÆ¢¢¢7oÞ°X¬I“&A =BhÛ¶m?~´¶¶8p`iiiJJ tû€€€mÛ¶èêêšššöìÙóÎ;)))¦¦¦!!!ÀõL"‘Z´hñðáÃ!C†¼{÷Çq@••E¡Pš5kÆápà¹|>ÿíÛ·\.wܸqšC˜Ãá@„fjjj§N†ž——wóæÍÀÀÀS§N1™Ìþýû'%%yyyq8¥RI¥RÛµkwõêÕÀÀÀo–Æ»ÎQê8ù ¶Öðˆ¢¢¢‰'nÚ´ÉÀÀ`ÆŒçÎ ôöö‰D iKMM]´hQ~~þ°aÃ?~l``@‹P(”ÉþU%êqÁa5ÜÒ iˆè$P 988´lÙrΜ9`•kð„”? 4—Þ9sæ|øðÁÂÂbâĉ%%%*•ÊÅÅ…ÇãÍ;!tÿþýˆˆkkëôôôœœ4XSSS×®]ëìì ÛÊZ~#‚ߌN§ß¿?$$äÁÇïÝ—•ñ ”ßÄœ_·P«ÕLëÞíÛkV¬xþäÉÓGb–/OܹS&“ýa8?0L!—Óét¥RùæõëØU«¦§ÆqŒD"‚ÇàBÂñQ¡PhºZÒh´·oß.Y²dÁ‚{öìA;w.**ÊÚÚúèÑ£/^är¹*•J.—8p --MKKkÆŒïÞ½ëÞ½ûìÙ³ çÌ™óï¿ÿ¾ÿ~Ó¦Moß¾]½z5ñ ggç?–””P©Ô¾}û>~üøÞ½{:t R© þ?þ<<÷ðáÃ'Ož|ùòå’%K¬­­/_¾, ïÝ»·hÑ"{{ûÓ§OoÞ¼YWW7!!A­V'$$$&&*Š;wjΠèmèÏÓ¸†9ƒ9×®]«¥¥uòäɈˆ;;»Õ«W<øÉ“'qqqÆÆÆH#KÆÏ`ùvÝ «1ª)ä„n"„( Øã×®]{üøñÔÔÔ.]ºh†jפ&TBS˜——÷êÕ«¥K—Ž9²[·n.\èÚµë½{÷ŠŠŠ=z„:w—×ôéÓ ß2P¼ëÇB=zô¨Ûpz™L6$(héÒ¥wnÝêkgw#=ÝÈĤN`¿%T*•‡37<ÙšJÅqÜ¥oßAAB¡°‘n¯4`˜J©lajúòï¿iJßþý7ïÚ¥V«1„d2Ž…B)--%Z­Ö××ß´i“±±1ÇCå;~µZ­­­íâââááñË/¿@ÁÁÁÁvvv>>>Ïž=£Ñhr¹âTîܹSVVvÿþ} Ã,--.\ؼyó7oÞ,[¶ÌËËËÓÓ“N§§¦¦fee=~üX,ߺu •kèÛ·o/ 322 =zôêÕ«Î;+•J---xîСCíìì¼¼¼Þ¾}{þüy¡¡¡&&&§NòõõõòòZ±bÅ¥K—h4Z×®]“““»tébnnþÛo¿õêÕ‹Ífkz,5XÔ¨Tê¶mÛú÷ïêÞ½»——×µk×–,YrëÖ­¥K—B(’fàÞÏ€Æ$eTZß  ÄqÜÅÅåùóçAAA‹/†dÈŸ­FC7Õ÷p@ÿU Q©Ôâââ±cǶjÕÊÅÅ…Á`hÞ‚UJOØ1q¿víÚ‚ |||€þ§–j!Â+BXR2`È€Aƒ†$îÜÉ30€‡~Qiß@|ÿH$’ ¸ØÖÁÁÉÕ•áB&MwV¬¡ûàw2‰$,)TÄç‡Í›zúôÎÍ›qµÚÔÜܤY³‹gÏfegÏŸ?ßÙÙ!$“É”JeiiiïÞ½Q¹ BH¥R¹¹¹¹»»ƒD¡PÀ éiöàÁƒÇ8p`«V­ÀZ[[›ðPÀL+—Ë---ÝÜÜFµoß>¼<$žËå¶k×.11±uëÖ666>|ðà³³³X,†©Oó¹0‹þÿ›j ap6BuèÐ!>>ÞÖÖ¶cÇŽ‰‰‰:thèòÂÃá¬[·nÙ²e¡ˆˆˆfÍšÙÛÛ{xxûÒŸÓ ¶Ñø:ÀX*++ö§o3båéAÖ®];sæÌþýûŸ;wnãÆVVV@N]å]T*èÒÂþTP(”7oÞ:tˆD"™™™YXXDGGwìØñÑ£G3fÌ8tè…Byþüynn®\.÷õõ9sfçÎÏž=›ŸŸ_¹I!΋Èáææ–––¶qãF—:É¡V«étúªˆˆ:E-[v(1ñÀ‰úúú%%%5üÄ “6¾)³f]OOW)•.}ûºõë'‰*šßDH`†©Ôj“³iÓ™ãÇÞ»§­«»rýzÇ,]úüéÓçÏžEEGCFÅþýûwéÒåÞ½{Ê P(oß¾=}ú4•J%“ÉŒB"‘ „¤R)¯H¥R˜9KJJþøã###ˆÁ”J¥fff®®®—/_öðð¸téÒË—/ËÊÊø|>,–àÔ²eËØØØµkײX¬·oß …B“¼¼|8B¨[·n±±±mÛ¶mÞ¼ù¦M›LMMQyô~C–o1ñòô õ´p`YRR¢P(fΜ©™úôg^ª‡KQLL̶mÛ†*ªÜ^cåDŽDÜ>ªÊ˜B\‰a8Ûâå´QЫ,ø3˜L&8'V©‘¢R©ööö …`¦ú™{XeÐéôE‹â8>}útâÏ^½zõêÕKóWWWWWW×Ï«™6500ÐÎÎîÂ… ·nÝb2™µåÂ0ž›“C£Óã¶msqw_¹téo‡ŸHK£R©………ÀeWJ¥ÒÀÐ0&2rÓš5-LM¿ aZÕÀq™¬R©˜LæšÈÈåaad©¡*•úñýû™ †EDäç7Æø»úF"©•Ê">ŸX AJ¥\ö)N ÓŸÃáH$°6õÙH*•ZYY±ÙìçÏŸƒN¨¡›ð; ?b*‡év“šô‰Ð’ §%Πj9 @Ö!—/ö™™™‘‘‘úúúÛ¶m=zt-Yq„È †aïÞ¾uë×ÏÑÕ5ÐÓ³¯ÝÒ•+ý³³²Ô*¹ªåœJ¥ææäŒ7n篿äçSnÆ!“ÉE|þ›·o­­­eR)Ö@v:¥Ba`h8q„Üò¸¿&üU­…à„¨)ÁW#Íkòæƒ3ªäb †~‹F”Éb±RRRB[¶l122.MjS¢’5"Ò ›Ð|.ñS…A]™•´ªD ý%¾)`á(--=zôhvv¶Á Aƒ E®æfÖAh¨Õ«W·hÑbüøñÄœ¿Â§ùì~øšà¼ÕÐ ÐðøÞ;|æÃ‡S(H8\ct¦“'OŽ=úÚµkiii £sç΃&®!T æM›F£ÑZµj…aØ”)S tâÄ „„û^Í9Л —Ë=qâÄÀÁ—…J¥~ibµ0ü* Ô*é«9S%*äHÉ¢ÿþK—.ݱcG°,"„h4ZQQ…BI½zu߯¿N5êêåËa:::UŠÑx9¬Ž®nÃN:\.×¼U+„ÁŸöíP&“Y*—7`Sü¨ @£†8€™³B'$îêÒ¥K—.]ˆ+±J˜fÉÄybÜAd ,Ãx974*Ÿr«ãĬûsÊ@J¥rܸqíÚµsvv¾qãÆ¥K—†œà†††°|`–——§V«MLLär¹J¥R*•b±˜ËåB9ÙÙÙ\.—ÖkBÍñ]÷9ÇÉdrqqñ”)S’’’°rÓO]Œ‹Å»wï=zô¥K—²²²¦N‰ã¸¥¥å¡C‡ÜÜÜú÷ï…¼xñâÁƒ¿ýö  ™L†Â0 üÈš5köu†%V___"‘899åää@öM+ìÍ 0"lêr£?—˵²²"¤JÂ~T¾Ë„>ÆJ(°Âõà¹E£Ñ._¾¬£££™+@¥RÙÚÚN˜0áÑ£G&&&»wï4hl…kãÛÖ">ÄØ±ž~~#}\]—¯^íã•ElËþ Ã5hd\5Øà¹™þ¿)BMÆâo ÃäryAA“É>[Â%!D¡PΟ?¯££cccCø©¢ jt`piJ3@(²Ùl}}}âY¹¹¹ ¨¥BšÙКaqß¾}zzz+W®Ö4‰ôþýû˜˜•J%‹ccc gÏžM£ÑÖ®]Ëårûí·¿ÿþûÙ³gÛ¶m³°°Xºt)ŸÏ/))™3gŽ••UƒóÆ…ïZ ‚.Ò¿ÿ‰'öïß¿&’ŽãÀ”J¡PœœœúôéãæævâÄ ggçñãLJ‡‡s¹Ü>}ú „’““ß¼y³~ýú»wï2dÆŒ@ZzóæÍ]»vYêŠ+¾¢Ú ÝÓh´¿ÿþ{Μ9½å®AºÊí\è¿Ù0Ë0ú[YYa剩+öÅjJ*š|ÿUª‹B—.]ÒÌ¥ååå%&&¦§§;99ùûû{xx¤¦¦áPm"#@Ì,ëâ­[ûví0vÒ¤Å+V)±HTÁ@F( ëÕK ×H÷]ùAø3'4°ªu›P߀¯Ÿ••5oÞ<& G5`ÀÂZº«W¯6oÞÜÆÆ×H¬A :Ñ`Ó¦Mp‚“““••Unn®‹‹Ëܹsù|þ¢E‹är¹L&kÓ¦ÍòåËA;Û²eËqãÆ5Þ´uhÒW¯^uëÖ •sEbfjj 6}úôÓ§Oæææ&%%•––r8>Ÿonn¾aÆ… &''[ZZ¾xñb÷îÝ¿ýö[LL̉'šÆ×áûƒÀzôèQ‹ƒãx µ)°Üâ8~àÀììì[·nEGGwêÔ‰ÅbYZZ¾yóÄ Q£F]¾|9>>~ûöí999°vJ¥Ò¨¨¨É“'÷îÝ;$$$--ÍÓÓó‹­¦Ÿ›Íf±XòZùóàü‘œœÌb±BBB^¿~’’B£Ñˆlð+NŸ7o—ËÍÏÏß¾};…B?~<†a÷îÝ;sæ AØŠD¢3gÎP©Ô/^Lš4)33óñãÇ“&M211ÉÈÈHKKëܹó°aÃB¥¥¥[·n533+++ƒø”mÛ¶egg4¨GàÕ.‘Hüüü$‰§§gÏž=7mÚäââR'É7 EaAÁ؉MÍÌæ…†Þ¿sçÈ™3ºzzÂ’’/š‰¯Ž*%•îíˆ'Vù覙ñgˆ;ñññíÚµ[¾|¹H$‚yI.—ïÚµëýû÷ÖÖÖd2´5÷ïßOMM555;v,Fƒ!Ìd2CCCÿý÷;wJ¥RoooˆA“J¥Íš5Ûµk—H$rttœ6mZDDD›6m.\ˆ;vì† ,Xt' Ýß# †P(DåæB Þ>}aaañáù\þúõkX¶`¤R©={öDµlÙR©T¾~ýº°°pýúõÀÖÖ¶)BùKñêÍ`Ð^¾|yèС‹/³È•€ãx·nÝ päÈ+++‹uóæM‰D2dÈâ8€=:ì~AnnîÍ›7׬YÓ¦MM’֯÷7‚Tæ©«’öºNžêñÇÏž=»]»v&&&B¡P&“¹ººÙ0ž}¬;v<”˜¨Ïãý/WkÍÊ¡”CSïE|¦ ¹hˆ»d2¬+„ÑH#‰4ÆÄõ8Ž‹Åâ*?}…“Õü©Y±X Fä*¯opÛ_*&±®]»^¾|y÷îݹ¹¹`‹ŽŽ–H$0^ ŸÁ`|üø1>>> àÍ›7›6mzóæÍÌ™3a …BCCCCCCkkk(œD"‰ÅâþùçÎ;mÚ´áóùÿüóÏÔ©Sá×¹sçÞ¾}ý¬Ô|Õ¶7>>>.\âû÷ïóóó>laa±nݺ6mÚ”””´mÛÚˆ6……B¡P(Z¶lÙ®]»¨¨¨7N›6í³Lx¾6ð=jƒwU«V9rÄÝݽæY-‰ùW­VwêÔ©k×®Ð]ž={öÏ?ÿÄÆÆæ¢+¾& …B[[ÛØØx̘1;wÎ1TmhÆgFtTÿ{q .Á ?U©ð€ØòZNL ¥8~ü¸··wpp0aµ½`ÁØ= $Õ6ÅoF{Ûˆq|=zô˜ÀÄÄúIvv6•JåñxšW‚A¾ p}I¡P”––™&|o0`ÀÀÎÍ4Šs IDATÿú믅 zyy±X,777‡ãììܱcÇ‹/R©TbTvéÒÅÚÚzéÒ¥š%T¡…´7n ;vìðáÃ)Ê?ÿüqgׯ_‡®KL†MÐŒ÷   >Ÿ¯«« 3äéÓ§Åb1ǃtBBB^^™Læñx³gφö3f Ì-ñññyyy!ô¹­;“ÉÌÈÈÍñ¸Ss|b@(ì[5ÙCÀ®4++ D,X@ T--­½{÷ŠD"•JŠ\Ç >Œ‚-†aIIIjµÚÑѱW¯^………zzzZZZ„Má³ ”Lš'µµµwìØìààP{g” ¡’‰æççïÙ³çÌ™3/^¼ÐÒÒ"¦*¥R)•J9¡úüöíÛûûû‡„„ðx}jooJ;wîÄÆÆjiiµk×.,,ìÆ{öì!â/^üþý{ …²xñb±X¼bÅ .—Û¶mÛððð„„„:´hÑ"**ŠÅbuéÒ%""¢¸¸ØßßßÎÎŽxJSÄÊwòOŸ>ýüùóÞ½{§¤¤´nÝZ__ßÁÁáâÅ‹>>>¿ÿþ{ÇŽ1 +,,4h¤Ñ(--•ËåÇŸ} áóùeeeÓ¦MÓÑÑéÛ·ï”)StuuB'Nœ`³Ù‰‰‰ VŒŽŽž:uª••ÕäÉ“>œ––¶ÿ~ØÓÏŸ?ŸÃá$&&‚K\.ÏÉÉ9zôhTTT=úõëwïÞ½nݺåä䄆†êêêOù9'Öï ð :vìøòåË[·nuìØqĈ¡èèèœ={¶E‹¡¾}û²Ùì-ZDFFž={â:lذ!99Y[[›N§Óéô˜˜˜Ó§O·nݺU9 UHH¬Í .¼ÿ¾««+FKOO§ÑhÛ·o·´´Dõïß_[[ýÄÆ—j@ÒÐñžÄ¯„+ªÔzÄö»æ,ÒR©´mÛ¶"‘(---//ïÅ‹S§N=~ü¸³³óÍÿ? ¾k1ˆ0XÊd2pð¬ž;Q©TÆÆÆ'5+++MÂ~øèZZZ0M³Ùlâ8Äíìììììˆë¹\.¤›8q¢f áöÊ ÒÅÄÄôë×oæÌ™»wïNKK£Óé ª~Ý×6¡R©¥B!›Í¾pãÆðÁƒ‹Ë;d•ËåmÚ´IHH ØçV­Zµxñb _„B¡<{ölÙ²e?~R+I œœœÒÓÓ1 ƒ4O*•ÊÐÐ0::š(„B¡XXX4oÞ!ÄãñˆMùܹsW­Zåããìë뛓““‘‘qõêUSSÓN:EFF.^¼ØÀÀ ***,,,""Â×××ÏÏo„  ¥¸¸˜Ífà ׽{÷gÏžuïÞ½mÛ¶° j>¥ V–––D P!Ðéô &—¹¸¸ÀOš9m* a„ƒƒÐúˆÑŠjÓ¦MÛ¶m+dÌ€¹×ÕÕ&¢&a•¨œ*±ú *œ¬ù‚UZZêããóêÕ«-ZP©Ô»wï¾{÷ŽÍf×Ü÷C#xg …²víÚ%K–˜››WoYYóñm.,d2ùÕ«W ÀÔü tZ÷ï߇”ŸÓ§O_²dÉש…ûŒŒŒ™3gªÕêS§Néëës8@ ‘HJKKk(Á@T‚±±ñüùóKKKù|þ’%Kz÷î½iÓ¦/õ&( ‘}bål¨Á?á OœÔ|"!U8¨’‰Ÿp{5&GN5RøT) —øøø0™ÌÓ§Oûûû+ •JUÃ9™L–H$Jµš°QV"` êïíí=dȉ'nÚ´iÕªU ÚîÝ»·M›6k×®8q"X e2YFFÆÔ©S¯_¿Îãñ´µµ‰lwÏ4qâÄøøøèèh™LÕËåD¯ãp8ñññoÞ¼ñôôôððhÙ²%ĀʧM›6~~~'NŒ‹‹[»vm||üû÷ï]\\&L˜€a˜ŽŽNYYÙ¿ÿþûË/¿„Êwùt:ýöíÛ„Z(,,LGGRºîرÃÃã]»v•ç¼ø«%$$dggëèèÀüE,\¸0<<¼°°PKK‹ÍfƒðD¥R<Èb±¶nÝÊçóõôôØl¶Z­>|ø0¬vàL 2dˆ««+È4!à&îŠ'Ž[·nmkk«V«ÁsñâÅáÈ‘#D¤˜‘‘Ñ¡C‡*<å‡ï<ß3ˆPĤ¤¤œœmmm??¿V­Z㌰)q‹L&‹‹‹“J¥4mèСx133óÊ•+T*uàÀ` ½r劶¶v¯^½@Dü©IJB"‘²³³g̘ѼyóÕ«W³X¬êÓ"5á–ª¸¸8øŽ Guqq!tá?ÉS£éˆšY™V@„Ð¥K—pà€­­m~~~FàÃÖ-??ßÖÖöÀÆÆÆúúúGŽ!“ÉJ¥²–ƒXyvzUçÏŸïãã/“ÉÈ`Ë«OÊ-Z´lÙœ~˜L¦©©)›Í†NE"‘Z¶l ²Ž‘‘‰D‚>C£ÑH$’‘‘\É`0`“ñ&, ÜÅ`—'ἦ?¡¡¡±±1<ÂUà® %WÂt:F£©Õjmmm###"2±Ê§4¡A€—'{ž0aBVV–T*…ò€IäùùðáìY³Þ¼ySZZ _ žwïÞÁ`Lž<!tòäÉåË—wíÚÕÄÄdòäÉ÷îÝC?>33•Ó _¼xXþd2™D"n„ÐáÇutt6mÚÄb±JJJòòòšd †´¿­­-0ÂÈd²àààÓ§O><,, Ø?ÅbãСª²2ÁÄ}éÒ¥V­ZõìÙ‚V^¾|9cÆŒíÛ·Ÿ>}zÅŠ4N§S(”'NìÙ³gܸqjµúêÕ«íÚµk×®}®]»váÂGGGOOO¥R¹gÏž÷ïß1¢}ûö;vìøøñcppp§NþøããÇ·mÛ¶Ja¥†€Î§R©X,ÖÕ«WÓÓÓçÌ™{ÿþ}.—{çÎôôtWW×Ên1nnnÿþûïêÕ«ûõë—››+ê× x´I$RdddŸ>}ÂÂÂvíÚuñâE~›1ø4€¨:`ÀoŸë׮͘7I¥âõ©Ì¯àOV!fD““ðS÷j2V¸¸‚[F…·Ð ¨®ReèŠf!Äõ•ù› õÏ´<oùòå*• )B{öìÁ0ÌÄÄ$::úÁƒÏŸ?_²dÉСC}}}B …¢U«VþþþR©ôøñã¹¹¹»w°A*•š°ÿ~`&žH¡P€óÆÕÕÕÑÑñÉ“'ŽŽŽ‹-ºxñâË—/333årùÚµk †…¦NÒà€O@§ÓU*•¿¿aa¡­­í7233Á‚ñ3Lû^$§R©L&S.—›››ûûû‡††òùüÂÂB##£Î;wìØ±K—.jµzçα±± Œ‹‹Û™LþðáÃÕ«WÇ¿cÇŽçÏŸŸ?žD":tô4ÁÁÁ+çðáÃS§NÍÊÊ:{ö,*çû:j!WW×›7oÚÙÙµhÑâÌ™3¡µk×BÏ L&gddXYYåçç'%%ÙÛÛüø«Ï™P·?ÚÛÛ'%%åçç[YYeddÉd™Lö3ÀBŸJ¥b³Ù×®^uww_¿~Ƕm††àETÅ4 ù§æŸ:¯yW•C0<á šTâEª/Pó× ÇŸº½ÂAê 5¡A½~ýH~ÿý÷iÓ¦ýúë¯*•****  +W®øúúöêÕkÿþý¾¾¾ÐIh4Ú‹/–,YâëëëííÍd2•J¥¥¥%tggçüü|¤ úX^^^hhè±cÇNž<‰2dȰaÃúôésüøñÛ·oߺuë§R9|‡Ðtx€IÁ`üñÇ¡îÝ»K¥ÒÚ§jhôbLèÎ}ñâÅ£Frqq177ÿ矢££—,YrôèÑÂÂB‰Ôºuk¥R¹iÓ&p)…Ïohh8cÆ KKËW¯^½yóÆÁÁ¡sçÎl6ûÊ•+}ûöíÔ©Ç»~ýz³fÍš7oîààð÷ߣډAè¿&˜78p@(‚—nTTBH*•Òéô3gÎ8::öïßÿþýR©´¤¤äÛ¸FQ©Ô’’©Tºÿþþýû;::ž9sv ?ƒ$„"“É)Ó£Gv;ž:vÌÍÆF,ëèèhO aèl@Îû6y?0€ÖÕ@"Òvš››;99Œ# …¢R©´´´†…§OŸ¢†Èºøí’„B¡Ó!ü¯ø&€g}6J@äîLOOïׯÇ;sæÌϰnôb*ØÖÓÓsrrŠŒŒ\±b…H$"–Ý»wOš4 ²LÀöõõÍËË»yó&B"¢õõõ!몟Ÿ_AA±†O!È<ÏÊæºª9£&''¯_¿>77ºÚÆ…B!‰DZ¸páðáÃW­Z5|øð¢¢¢oLE©¢¢"¢ŽûiýÏIB(ttuMIOïimÝ»S§ƒ‰‰zúúš¡ˆß3àK‰D¢Í›7/_¾$øëׯ'%%íØ±2=5¡q¬áóçÏ¿xñ"Ç?5Aêõöö¾råJ~~¾‘‘d)çr¹9qãÆëÖ­ëÚµ+$Z!”…!ðú²±±‰‹‹ûóÏ?Ÿ={öË/¿lÙ²JŽ‹‹³µµE)•Ê ‰u¡…Ba°ƒPŠˆD¢—/_"„þøã°¯ÕP§Õx“‘–F¥R òïsæÌÑÕÕíҥ˸qãnÞ¼yéÒ¥äääM›6ýœTi?h4ˆÕ\ô?={ö?~üäÉ“ŒŒø|>ä «9±sçΡ¡¡žžž! ÃÀÙ€ÉdŽ5êÀëÖ­›mÚ´åË—WÈÊü#¡Ñσ  ‚A Ö Ã ±`¦­­½nݺ5kÖ,Z´hÔ¨Q4M.—G‹fÖÕøøøÁƒ80!!á÷ßoÑ¢Eppp||ü;wZ¶lÙ£G³gÏ®^½º¨¨hêÔ©èsl45¯˜ÃáìÛ·²®òx<--­¹sçæä䨨ØH$8õoXXØ;wZ·n ‰ÐëJ€ý1Î •JíÝ»÷“'Obcc333§OŸ]¹AöîJ¥vrááá'OžÔŒ ùÙ@£ÑŠŠŠ(JêÕ«û~ýuâ¨QW/_‹ˆÐÑÑ)((hj!„䔿Ï#ÈþHƒ¬ŽŽŽ¯¯ottôæÍ›•Je5.ƒØÓv†^ó H4ï"~Å0 v>8Žcì<‘FŽOñ§&oBˆ¨('´µµ?«Wú¼¼¼K—.A~£S^ :888::Ÿ?>::rù/<¤ü6îžR©ôíÛ·ðÕjèØªé4ݧOŸîݻ߾}›Á`üx’P#ëXàK@(“*×¾ÐÑÑÑÑHë c²«ô©! …b``YEá§V­ZµjÕ ®Ñ<¦P(@Ý[·Š"–‡¨BH ØÙÙ-]ºtÀ€“&MÚ»w/ƒÁ())ùÆR©„ kôèц|ˆÊg³jnùÒ3_ÁƒP%ŸÂ•P(t:ýôéÓ{÷î}ûö-ª#'„Ô\WW÷É“'zzz³fÍ:v옭­­H$’J¥/_¾lÛ¶-ƒÁøŠÐcµZ FÌš[ÖH$RXXØéÓ§ƒ‚‚jøM§i›€€€S§NüHLÓR "¤‡ñšÂÈ.R©ô±šºBÊ©L‡þ»û364p½&[]ý½#„§I$’={öœ:ujÚ´iK–,8p`YYð Õߣ!ŒŸÍf?~<**jÉ’%¼ìÇèôµdð-,(;q¢©™Ù¼ÐÐûwî9sFWOOXR¢‰D"W›_å€pS>}:q²oß¾pPÝÕOåöf€ØØX[[[0ÁÊÔÐU«`>§R©©©© HNNÖÓÓû¬0†ubàÀ°µf0$iþüùB¡Ð}QCq¹ÜÔÔT„Ðù‰D"//////Tcáò‡wšndc´•Õ3„^ˆSóòò¦Nš””D¥R¡{s7‘FGs6' 'J®ÀŸ[A“„4ÌäuД4ÈÈÈ(..îäÉ“7nÔÑÑÎû:.y\.W Lš4I*•nÞ¼ÙÁÁ¡  €N§ÿݽaty99Ž®®×}úäÉ“¸¸¸~ýú8qÂÚÚÚÕÕµK—. µckk»zõêþùgýúõ0éïܹ“J¥úûûóÍ7üñG¿~ýäryFFÆŒ3ÆŽÛ ó.õµbÅ 77·;w¦¥¥íÛ·J¥BîÒgZöF¥R™ššªTªÉ“'‹Åâ 6ôïß¿°°°öúlP•c9';»¿¿ÿ×îîbcݺtÙ{èИÐБÿlßÎd2kïÀêjÞø´¢P(ètúúõëíìì@|„ÀpUðê^L8æåË—FFF-[¶„ñ‰{L«K€!­H¸½§Ú:e **êàÁƒÐH’–`8IKþŒ`B ¸Gt:}Ó¦M .\³fM¯^½ÀÛ×äžY2™¬P(Ú´i³|ùò     ͆iÿÌzt«ã—¢R©ÓWÍ2hºÉÐ `Ð(..þé§Ÿ …\.Ÿ2eÊŽ;ºvíêëëû×_ݽ{ðcÇŽ;vìŸþ9vìØË—/Ož<¹eË–œ:u*%%v˜Læ×_}øða¡P›àèèØ¿ÿo¿ý¶W¯^aaaéééþþþ+V¬`0‘‘‘IIIQQQùùù ,‰D¾¾¾<>|ø’%KÆŽÛÐ\®Ÿ——çîîÞ»wïéÓ§‡„„DFFúùù …B¹\ÕZ?êƒJE Êfll|éÒ¥íÛ·s8œcÇŽQ©Ô¼¼<Ö¤9~c‚N§— $)!1±§›Ûì©SgÌ™cec³o×.>Ÿ¯®ªB®à  æ÷úõëY³f¥¦¦R©TðJB£\.‡ 1ø‡L&TÁ:daaÁåru¼˜jµšJ¥îܹÓÚÚzÞ¼y E_PPÀçóuêæççÓh4sssX;¡xŒ¶÷ÿ¯H$ …fff7n!îŽEU–®R©‰Dð †^\ÇÒÒrÇŽqqqµ¨ð2ðÄ~###˜í‰ÉÇ0Q— éÓ‹&Cƒ [_¿~íîîŽªŠ¸°X¬víÚ!„ºwïþ矻ºº"„ÜÝÝ/]ºôâÅ @°iÓ&¡PèââÂf³×­[·téRssóµk×Òh4¸¦L&kß¾½££cii)Hídff¶iÓ¦eË–¯^½Z°`““Snn.È :99ÁüÞ©S'333Ø#Cu¿Aê‹B¡$%%9s&22Ò××·oß¾½zõ²°°€­@¥RùÁD"Ñh46›Í`0JJJnݺ•™™yåʕŋ>¶ÛšŸÖÐZðçß{ôé“úë¯Kçϯ(/?}üøWíÚµkݺ–µÕ¼Oœ8!“Éž>}š˜˜H&“­­­×­[‡aƒÁH$‹/F‰D¢ƒþñÇÏž=‹‰‰ 755ݶm•JmÙ²åªU«ð]°û÷ïk4šŠŠŠ%K–,Y²¤¬¬L.—¯Zµ ô†Édò²eËrrrètzddd—.]–/_.ÊË˵½§T*uéÒ¥R©tÕªU\.·[·nãÇŸ={öéÓ§ÏŸ?¿gÏ&“ îØ²²²àà`ww÷'OžxxxÄÄÄ4J}ÃHUF`í …B­V7•µ§F(•ÊÊÊJ½5ºØa3H­VÃb«ïö~¡ø`ÐtÓ„M†A·:::ÞºukÆŒ …‚ÍfK¥Ò—/_:;;?zôhÊ”)b±833!tóæÍâââo¾ù¦¢¢bíÚµ ¯­V« 4zôèiÓ¦íØ±cݺu"‘!A^*• ¤v&OžÜ©S'±X ¥Û¶m.‘H ?Ú/p F7=zôhssósçÎÅÇÇcæêêêããÓ«W/™ªý"F ddddddÜ¿ŸD"uïÞ}óæÍ>>>ÅÅÅ¥¨›Ü´¡R©Ì-,’öíÛº~½¹¥eGgg+›¿ÿüóÅ_õ\¹²–q5שּׁ¬Aƒq8œåË—ƒW244ôÁƒ|>¿²²’ÍfÇÆÆ‚orÏž=sçÎÝ»wï?þˆ8p`DD„¶S.—3Œ¾}ûÚÚÚFDDìܹ³²²òĉGŽÙ¸qã?ü@&“ËÊÊNœ8‘ššÚ±cG„PRRÒ«W¯öíÛW£÷táÂ…\.÷СC¡‚‚‰D"•JãããÁ;`À€»wïvíÚµ   ""ÂÄĤÿþ3gÎ411!vÇ>¤*QªFÛøÐ#pÉ­F"èµ^Q=húêÕ«7oބ✰¤BrÃG“¡A°0O™2åÅ‹£Fb³ÙË–-[¾|ù’%K˜L¦‡‡Gûöí[·n™™9nÜ8>ŸO£ÑÂÂÂ`Ç Ã°Lš4iæÌ™t:]*•Μ9!Ôµk×aÆÙØØ(•J##£˜˜˜%K–XZZ*•ÊíÛ·‡††.X°`Þ¼yÙÙÙíÛ·…d„^÷Y»t£r”€çùøø”””ܽ{7##cãÆ†¹»»3ŒZBVróæM‰äêê 䩲²¢¡õx—›4¨Tj¹P8644høp6‡“yùòï÷îùn¯+ãjÞ‰¤¨¨H"‘¼{÷¼’ŽŽŽ ndd”ŸŸ?sæÌ¶mÛ‚oÎ%“É?þ«¯¾‚˜}æ‘››ûõ×_#„|||Ž?‘§&&&ëÖ­‹‰‰166NLLÌÍÍ-..Þ¼ysYY™¶÷ÔÌÌlÍš5‹/^¹re``à¸qãüüüètº@ `³Ù¸`øÓ§O»wïîääÔ²eK„¹¹¹ì=[êØ'JKKc³Ùååå„k êP§¥¥yùù5ÅHðfí i//¯>}úœ;wŽÏçÏž=›Á`lݺµIÔ½4ôöáÀ+úlÛ¶ Ïstttuu…Ø8øî»ïJJJŒ!êeóæÍ………! ‰´oß>m]»vp8œ±cÇB F©“³gÏJ¥Rsss¼n5BâÂàÅ?ü€ô!ƒL¡P$‰X,¦Ñh>>>%%%YYY7nܨËéÑÑѽ{÷677‡­´ââb`Wü+š0 3b±8\®F£9vìØÐPs&ómnn¹PXËY¸š·»»{ÿþýo߾ݶmÛ‰':;;ƒWR,›˜˜$%%}õÕW›6mÂ}“R©T©Tã^L™L“22ò-[¶¼{÷îŒ3~ýõW333ØÖh4à2eʶmÛºvíúöíÛ5kÖT÷žnÛ¶->>~çÎ999ƒîÖ­†a¦¦¦‰äÕ«WàŽ>|¸\.W©T°8)  ô™9¿¾>>R‰äUn. !bˆ„P±HäêîÞ×ÇG,¼PiFsíÚµ“'O‚’UppðúõëQ‘@iMÀî8¾éÉšËåòù|˜sÁýnmm õZðƒBp0“É´³³ƒ€˜£ñ$\sžÁ`ØÙÙi48Ífs¹\•J;bL&‚‘µ_ ª=²Fž$‰***€ <¸.±AR©T&“û!vÁêxBl¹P(W(Èvvtòk«y;öâŋ˖-[²d‰µµµ\.?xð Ç«¬¬;vlxx8ø&Û´iƒêÒ¥Kpppttôúõë-Zdccƒ †ÃðX³fMaaá²eËž?>f̈ BUNÁY³fÑh4©Têïïß­[7p¦j4mï©H$ŠŽŽNNNNJJâñx&L°°°?¨¶`xÏž=ß½{Çårñš úLÉäJ©Ô£o߀àࣞ‰.­ ¯¨¨¨”J?–é˜@5Â}߸Õ)AÔ†ÀÁ@J¥6júôésøða…B‘ݪU+Ãßo4O2ÄwŽ!D gš:zð¹ö¢ÍI)Šöª‹ìÔøÚ§ÃYøçxQ¼aúJÐÀùX,†‚ZuìR‚ý4þõ\R(j‡½ßuGj«yOš4 Jòœ™L–Ëdââòóòˆ±ÿ†µ°µ ›>QgQRˆÕ]·n££chh¨‡‡Ç×_]TTôÍ7ß‚âââ;w¸XXX¬_¿™¿ÿþ{›6mmmm'Nœ§„……yzzöîÝûÝ»w¾¾¾‘‘‘ø¸χZ­&“ɇ²±±8p 0!¼1øNArü£„Äë«ëš¨‰ÿÁ! „X&“Ú¿ÄСlNlœŽ5L€+T"Ú¿ÜĉF,ÖGõ TšU*•-Z´øþûï¥Riß¾}ÓÓÓMMM °eËØó…;õ×_¹ººB16ü‰Dâïïß§OŸÖ­[÷Ýw•••ýúõ›0a •JuðàÁׯ_{zzBeŠ7oÞŒ92##¦)GGÇŸþÙÞÞ~òäÉt:ýÖ­[/^¤Ñh¡¡¡öööW¯^¯^½êСC=öïßß­[·¡C‡Ö… Á12™lëÖ­AAAœÆ0d2ÊµÄÆÆb&—Ëi4Zqq±~9¾]³uëÖˆˆH£ÖiO A ¥¢¢"::zРAl6ÛÐ&Ø8uêTii©««k½èÅ|É£ —£Jg³·«ð ÿ½|ù²­­­«««aº 4¨TêêÕ«›¢‰_ÇåĶ6nÚDaBUÝ[VVváòåOˆ@·(™L†šsÏž=c±Xl6[[ãØgaa!l-) ¸›pÊÓ§OY,Ç‹Å/_¾üóÏ?Y,“Éݛ͛7ÿñÇQQQïÞ½CÙØØp¹\˜‘æÌ™Ãf³·mÛyöìÙ 6¬X±B"‘ôë×ïùóçóçÏ?}útzzzff&T²pvv2dÈÆííí]\\êhÝi4.—»eËbÀ ­“™™ù¾Óh€ÇãíØ±Ãï+”`Q(D•”z.+Í7Ο?ß©S§±X|ôèÑœœœ^½z 6 !$‰öìÙãàà •J¿ŒÓPç*À_¢ pÓ5ñëÞi*¥!N,}ßC}4ÔTJå§=M¸ºð»wï¶mÛF£Ñ¶nÝ Á è¿›¿OžeË–-æææ¹¹¹Û·o‡+°ÙlˆJ¶±±ÉÌÌÌÎÎîÛ·/BÈÞÞÞÁÁ¡W¯^NNN‘‘‘ñññ=’J¥÷ïßG9999sF.—?yò!D§ÓGŒáããóÍ7ßXXX^½zõÞ½{...u·î`l#bÀT ¼CjD“¡A{_aZW*•MkÆÀFBˆF£Ý½{ÊZ}BŽŽŽ±±±ýúõKIIEÎ@`8U€UJ¥ƒ1}öl„о]»ŠåòÏÙVø,|^àZÐTMüjÞ *•ªËɵè$Ç#V{¬ñ-¨ýüóÏfff^^^Ðið_\]Ápôy4 •Jý믿®]»6nÜ8„Є `ìá9ãLJƒ¥R©P(´··Gݾ}ûÆcÇŽÕ>!Äápðã‘síÚµk×®]ñÏù|þ¼yóà5|/†a......ø1®®®®®®ø[ð8"„ú÷ï¯ó¢–‡åó¥»´“s?võ„ wš Ÿ·z);íÏur~ñüJ*•*‹ùå—Ñ£G㫳ÎP¬ÇáÑ iNªQõGQ'«/¦ ý‹ªÂrõý;¾P@Ïûùù)ŠÈd²°°°õëן9sfذa!!! “•žž¾páB „ÐÖ­[÷ïß_PP°uëÖÖ­[#C2›  °¸¢B¿E_TJ%fk+ª¨@Édyyz£A #×Ÿë®‰šøÆÆÆ!í)H­—J$-Z¶‹D••• W~–¡PاOBéׯßüùóñ✨Ê&Ñ™ ñ !Äáp´k…Ãd«½PTFËÛ·oçÍ›çìì¬SDë7ø;wî 1dýõWTTT—.]ªŸ¢½eƒÿF à _¹á-NÍáCïá¶7ÄF¥Rñá¦xí69ΠåŸ}¨³b"„j\=µsuVOø—P(ܱcÇÊ•+á‡WÏçEU;ÑøWk¿Ö&[!‰D’””4jÔ(@Ô9¾~ÇU3¤A™LãïØ±c\.÷ÁƒãÇoß¾}yyybb¢ƒƒH „öîÝ›ŸŸ?|øp—ÌÌÌÊÊÊ€€€K—.Ñh´¾}û6¹ 4MÐÛÞÞÞÞÞÞð Œøž={Â[*•:gÎíSŒ£££«_Ä@` ¥½ñ¨dF¥Ñ ¤¼ýç€'OžÔ—‰Ïd2CBB@ViÍ8;;ƒ‰RƒL|•J5vìXÐ(ìÑ£˜ø`1÷èÑ7ñ•J%¸- …þ|*µa˜J¥C±H4ÄÏoðСá-ííe•• š`(“Éð\¹>}úLš4‰ÇãíÛ·ïíÛ·#FŒèÑ£‡L&ûñÇß¼yãææ6hРÊÊÊÇ¿}û&L‡cll|þüùöíÛ·iÓ&''çþýûÇÏÊÊJII±··ZÙ@WUA{•%‘H*• a˜NnZ­öññ­Iü¾Ô8¢Øl¶³³3œ8yòdí#uN©%¸ ExS«¯} 6üúøçÕ_à¾.‰ÜÜÜ<==cbb€XÃw},KÀ“sÑWO‹õøñãqãÆuèÐA(V_=sss]\\FŽyûömȲ òððؽ{w^^ÞÈ‘#»wï­à¢èuºý¨ƒ "0 U3ñu¯;B¨?LjHè£Ñhô*hË‚NœÎñt:]»n$î^À[P…Óy§“Èdë-lmmÍÌÍ]:t˜:sæ¾]»üÜÝW/]ZVZjaiI"‘꫸€ WîÅ‹wîÜiÙ²¥‰‰I\\œL&óóó‹-**Z¹råýû÷¿þúkX#×®] æŠ+*++SSSïܹó×_>|!täÈ‘gÏžA˜ù!C²³³Af¼þ«©Šv‹-Z´hakûŸ¿-¬[´ U……Ñ´ -LY ¨T*…B¡i™ <¥ñmS(­[·ž7oÞ¦M›Ú¶m+‰`lè=žœ €A>gΜ7oÞ8::Θ1£²²2&&¦¨¨VO(Ljii9|øðcÇŽedd8::š››÷ìÙÓÁÁ!66V.—0 666;;—™ŠŽŽ~ðàAïÞ½U*Uyy¹••ÕðáÃ=zåÊ•ììì¹sç¶k×ÎÊÊJ$1™ÌÇ[ZZÂÚ½~ýúÊÊJíkÖWzA“·ß0 Ôju‡ÂÃÃI$ÒùóçŸ>}š““sòäIwåʕׯ_Ÿ?ÞÝÝýÙ³g%%%¿ýöÛ¸qãbbb<==¡JM£Eª&H$ÇÓN’ÒÖ=Ðîÿâxµ†€Ú=(:ž XK>ö+šÄ%P z¦ÿþ0zkø]æóùxИø:§4¾lTJ¥åBaôœ9L##µZM¥RÅ"Á(voÛvêÇûûû+Šz¬/  *•ZPP°gÏž_~ùeÁ‚$éìÙ³#FŒxöìYyyùéÓ§_¼xqäÈ0ýËËËÏ;7dÈgÏžݹsÇØØX¥R?><<!ôàÁƒï¾ûîÈ‘#?–J¥¿ÿþ;ªJ¤­ÇŽ%S(r™lá·ßBAÝÿßqÆ02…"«¬, -Zô±5¦› ¨æ­[·¨Tª@ €zÍqqqß}÷ݰaÃ>­€‹N xµZÝ©S§Y³fq8œ?ÿüsß¾}………066NOO …FFFæÎ;R©ôæÍ›Ë–-³¶¶9rdEEÅÙ³g‡úìÙ³ââ⬬¬V­ZQ(@ðøñã´´4‹ãN¯¨¨øóÏ?Ÿ?>pàÀ1cÆÀÖ^aaaëÖ­acîüùóÿý÷Å‹ýýýµ¯Y_á+Í–A"ŒènЧÔ> +ùúúòù|___„PAA¹¹yiÓ‘t&“ɉäÒ¥K>>>x”"˜> páüÎIX6*++-,,¶oßnii9fÌ¡PØ8{7Õ•1ÖÆ0~XíÁìÚ'¾;¼î«v»!È!jêÊ´¡Ñh>Ö\ÁÃ5à­~%´A"‘Ô*‡Ãé ð⢢c‡ñx¼¢ …¢mÛ¶Û·oˆˆ âr¹>>>' €B¡œ9sÿjF&‡ÃñööîØ±ã¯¿þÊçó---MMM9Âãñ,,,„Ba»ví|||ºwïnkk ÝÛ,¹ˆÞ;€<‚Š0 +((HHHø„C&“…B!¼–J¥<ž¬Æ0ÌÂÂâèÑ£ÉÉÉ;vìxúô)|;üW{œøúú¶lÙ²úé$iÇŽ·nÝÚºuëãÇ« Ãø|>¾vã×är¹ø5ëË”m¶4H©TÊd2ÈXF‘Éä²²2{{{È*òññ9}úôƽ¼¼.^¼üðáÃQ£Fݸqüº£GnÓ¦›››¯‘°öËd²ôôô¾}ûÂÃ`dd$ e2™µµµ\.722‹ÅïÞ½366f2™*•ª¸¸˜N§›˜˜@T]-å5¢ÁïSƨŽZ‚Ùu"ßñÏQµå­úí#”7šðQñAà+qÇ7¾Á¿eþKKÏ_¸°qçN ss™\nÂ`dff=x!Äãó§Ìœ8tè„aÃH¥‡D"I¥R©TêääääätìØ±àààôôô   ÌÌÌQ£FuïÞ}áÂ…*•jÈ!ÞÞÞ/^ ¼ÿ~ÇŽ1 'tŸ>}&Nœ˜””„ ^½zõË—/%‰@ ðóó«÷þÔ¨Õ &sSB‚…¹¹ò¿±A4*µ¸¤äÖµkñññ&¦¦£]—‰H$âr¹Ó§Oß°aBÈÄÄdÁ‚!!!u)ƒù0((hñâÅíÛ·/,,|öìÙêÕ« Evvvbb¢¹¹ù;w.\¸ðâÅ‹U«Vùøø¤¤¤øûûÃ>iyyùÇÍÍÍAö*))iàÀ~~~.\|8bĈƒž?ÞÞÞžB¡¬_¿þСCwîÜqwwG­^½úèÑ£iii`Žƒß!¸jÕªÀÀ@„««ëÊ•+SSSÉdò€¤ïH$ àӴo¤ñ JJ0x€¡©Ôði±X¼`Á4ˆˆ055---ý¨~Ç^½z­[·îâÅ‹t:}ß¾}<¯   gÏžöööOž>>‰‡·jÓ¦¢¼¼¸¨¨AµÚõoœœœÚ¶m‹aúàÔ~Ë`0´ßâEnÌÍÍ—/_ŽŸÒ£Gí ^ Ô™Ði:Qð!"‘¾ùV^^˜ÂyèャQUýˆ¯¿þ¦D<7^*•2dÔ¨Q°,òù|œÜ¹sçj¿õòòòòò‚+LŸ>]ç+Bt:}êÔ©ø‡Ú9¿†é”P‚%i­ÝÚcÕ߸j†4€×ZÀëJáx‚%^•ßdÁÏÂË4éûwÔ¸vqq1›Ívttäñx]ºtyðà—ËíÚµ«L&ŸÊÉ“'_½zemm­P( x¨îß‚aXYY™‘‘8ŸàCÇÓNT®@ƒRRR@ÃÁÁaåÊ•cÆŒqvv]rrrQQ‘µµ5™L.))yõêUrr2—ËÕ f/**ºwï^@@@»víÂÃÃAzzú¨Q£úõëÊb±@jC"‘dee 6 ð1cƸ»»>Ô6öìÙcbbb€Ê¾hHjµšÃáÄÄÅ‚œ²†^Åñ‰/~¨=%âÁvÚ1yøñ"7†ÁL ®\Ò8úîÙf 0“&M‚¼ZÈ=ü´£s×H$›ÍžŸ/‘HÞ¼yC¥RŸ~ü¸Gb±X"‘dddìß¿_$]½zU[néƒ×§P(‰ÄÝÝ]­VØÙÙEDDp¹\|kI£Ñà úUǧK<†WÏÐN0»££cii)ǃØ& ˆ·²²Ú¾}ûýû÷7oÞüçŸâ…Å …­]‰«ÉÝeÍUõÓ‹ )ʧ¹i?Õ'½ë%tV üH¼Ðþœx¸¸èó³}uîšN¥lTÓê©óVû 52ñSËéÚW¨þ¢~Ñôh¡´~²²¾!ôÅÅÅkÖ¬Q*•;v3fÌ÷ßO¥RÛ·oïááaØ?ü’’Ò¦M›¯¿þ6¡Œáá©K}3<ðèáÇ> Ù{ï1 + Yl¶\¡@ …BaY™‘‘ÓȈp 5¨1…Íñoz­!úM”«1ä@/k7ž‰ÞÏÚ Â7n¼½½ ­Ø1€N§gggÇÆÆ6Z‡€0¬Á‡ÚU"´CÏà­F£Ý"øD;2úÓú¯×AmFFFd2yĈ#FŒ¨;%‚J†øÕªWЪ%˜i9lµ_ÀaH+ìN;ìïíË6Î]Ó qF, 8°L €¼’ž^VZºhÅŠù‹—[0†*•ú%ä=Õxz1nkê ¯£T*u*ÎP©ÔFö`ÀÔûÑF’Z­¦Óé×®]34?6H$äa5ôà ÜV©Tæçç3 ‡ç‹B*–v¨?ªÊ˜CUÛgø¿€Áhï3âúJUŒŽB¡@ógR"í$¼Iµ³£÷нï,œñ|9(‰DRÈåÖ-Z¾wÇ*•ªV«ËJK¹<ÞБ#Å"Ñ—°ñßÔYôÑ ²õWÞÚpðo®†X,‹›· óÉ “É"‘(**J/õÐ5 ‹ÅºvíÚï¿ÿÎåraV‡ÕaìØ±Pº1›F,×øÑÖ*•¿råÊ6mÚà¸ÈWB½xñ¢Aó;À1VPP°wï^*•*•J}||ÆŒsôèQKK˘˜˜€¼†\.‡$)ÈÃR«Õ '"‘H •J566÷³X,ˆ¹‹ÅŸ ˇê•Õ=ãŒ@í S(±8lÆŒãGŽËÊh4šR©œ4mZ›¯¾*.*úraS®$0iÚ´ü¼¼Š²2}·È`€a“¦Mkü5ÕÀ]Ád2çÏŸŸ——§—Î!“É2™ÌÍÍíùóçB¡ÏîÛ·¯‰‰‰¨ÑM/øv##£ùóçà X½OšÆ$XPP0a„ƒ~ìÄ ^à¤x% |Æ5ª0 Ë|, Y;OOφ¦Þ†ÇãíÞ½ÛÞÞ>66öÅ‹•••¥¥¥.\ ‘HÙÙÙýúõûùçŸËËËû÷ïYå—/_†ßÞ¢E‹»wïR©Ô€€[[Û²²²~øÁÄÄ„ÃáXZZöìÙ3++ëæÍ›––– Êñi$(Q¨{mûz‡\.·±µºwÇ¥RÉåñƆ†–•–joª62úUGh4:ƒ±xåJ®ï¶” …°¬¬qÂüºÔ~ý^ŸÁ`ÄÄÄ4B·¼PAÊÔÔ466–F£) 33³3gÎ4šLÍÇ¢iLF†Á¶¢©©i]²»¹mÀ´€K5èw‘H$…Báè蘒’’УGÈu211a³Ù;vLHH055mݺõ¦M›Ö­[G&“wíÚ5räÈž={ŠD¢=zäää$$$¬[·n÷îÝPeqûöíáááÆÆÆ§OŸ9räõë×øá‡3fÔ‹Ï™ Dx?XXZêk%Ã0ŒF¡,‰=Ÿ’’ó¿ÿE/_îæì\"—Si4½ÄÙÁf€A~† µZ]—§ïVH$P’§×ùw8x&>ÁÑÐSM×Çe…>öj†Éd2=>_ðÕ3gÎܶm[yy9¼611©¨¨Ðct/‰Db2™5ögÓ AH«<ÏGu"DÝfff^¸pÉdvìØqôèÑCsóæÍŒŒ 6lذvíÚ•——§¤¤Œ7ìj8áî¦ï€ ƃ~þùçààà3f´hÑÂÞÞ¾K—. ‹/¶µµ}ñâEVV–§§§½½}hh(‡Ãùû￯]»¦P(rss_½zUTT´qãÆ-Zܹs‡N§ß¹s§¤¤äõë×r¹üÅ‹R©´Þ÷Ý¿XJD&“å2Ù†¸¸ü¼<¤§vb ÓȈÁd"„îß»7nòdZ­ŸÆ`X [Û°éÓL&‘±ÿA`Æb³­mlþõRð8o´®¨¨¨¨¬ª4öAT/稓i‹O㨪ú þ/FƒË⓼öÁÕ¯¦}Á÷€¬ì|íàÁ: «Ë%‘HFFFú½K*•ÊÒÒrÍš5³gÏvrrZºt)BˆËåæDÝdhЧ téÒ¥¼¼¼ˆˆˆ¸¸8™L6qâÄ“'O~ÿý÷B¡pÆŒ vvv=z4^lZß¿¸¶®9rdhhè;wâãã'L˜©OÚ.õÌb±”JeaaáúõëGŒajjzûömmÆqÓJ¥²eË–=zôprr277oh×ågR¢Áƒ#„ðªÓ†L‰ l¼L&;´ÿˆ¡CõåJ&“}úôiçäÔ®U+‰XLnôàh<¸õÐþýã&N4b±ˆ€ßÚ¡ÑhXlöÌÌ´” †‘"hÐ diPPGß¾R‰¤vƒ –€ß~û ·„G…ªÑ"„øI$’@ ˆŠŠ:xð .¡ó¸ÿáí$ø^à24€¯À¥K gÍšuòäI"AU©¯/_¾422jٲ幔ärù–-[òòòôøpáª!‹šz iÇ0ÌÖÖ6**ªF­‚&Cƒ> ¸ÒVŸ>}ÜÜÜ<==Ÿ>}ŠÚ»wï®]»:wî ÿMHHزe ¬Áúnrmé‰K—.ýïÿëØ±ãíÛ·èt:—˽qãF«V­¬­­¿ÿþ{‡—/_†……AUeè JÙÙÙ666VVV»wïvqqyðà«««‡‡Çƒrsse2Yyy¹››[£œøXJtàÀI“&uíÚµ{÷î èß¿?‰D2pJ7nã¦Mú݇ΩûVBý~xYYÙ…ªx5µ†MfFÆý›7GU^^nàTãô ŸÏ?yò$‹Í8x°øCu_R\¼x177,a¹\>a„²²2±XliiÉ`0”J%d@¡5ƒQYYI§ÓÁ$655ݸq#•JU( E ðù|ƒEh™L¦J¥***¢ÓéP¯b$ŠŠŠ \­‘‘†aùùù<O[BwËËËår9”¹×h4ïÞ½£ÓéPnçÎÖÖÖóæÍc0‰¤¼¼Z[Ë…GL&“mݺ5((H/™bø¯S*•¦¦¦AAA666 …B_CÏÛºukDDƒÁ¨>7s„»=Ž;öæÍ›«W¯?~¼¬¬ŒN§;99Áâíí}öìÙÒÒRô©Etêð„ j«8Œ­V­Zåææ>}úÔÁÁaÀ€¥¥¥AAAçÏŸ¿wïÞìÙ³/]º”ŸŸ¿páB“ÒÒÒ€€ ø\îܹsûí·víÚÍœ9S£ÑDEE%''#„ºwï®P(:wîþ|þüùaaa~~~¶¶¶3fÌP©T+V¬ R©óæÍKJJZ¼x1D2Ô¥R©Ô·Ñ P(Ÿ®¯à•öj1ÿš9 h4š¶mÛzxx̘1cõêÕgΜiÓ¦ÍÞ½{-Z„Ú¶m›››Ç3œòŒ<ï矖J¥ ¶xðù0„ðµZ]VV†"“Éø `QpLee%h—‚s…Édfeeaiee%—ËÕj5øfñÒ‹ÚH§Óa0é¥C´)BÏôf³Ùl6û}”ÈÑѱÿþ³fÍiüG%ª_hGn~òE¾Å& Óª Jxƒ Âd>x¤Ž%œ™™)—Ë_¿~åää”——ײeK„P§N¾ûî;777„ÐáÇQåBUýÏ`0ºv튲³³³··G™™™•——ïÛ·ïâÅ‹ŽŽŽ0-çç绺º"„ÜÜÜ.\¸ðòåK@°iÓ&6ÀÕ·oßöìÙ!äááqøða„жmÛ}ºjÕ*GGÇÜÜ\ô¡]‹í *€Ñ¥wh÷Æûúí‹ A â!ÆŒsêÔ©çÏŸïÚµëÛo¿8q¢\.wttŒˆˆ(**Ò^)õ¸[«V­ÊÌÌ7nܱcÇ*++«3!åJû“÷•ZƯ@&“ Eûöí»wïN"‘¤R)èl ÷ø 4 sΛ7¯K—. SªßŽ"‘H¸šª²’u(‘X,ÞµkWaa¡»»;BÈÏÏÇãEEE±X¬æG‰ê¥åjfø4rŒ‹Ïè»ùõ Üž:uê¾}ûø|¾““Ó¦M›¦M›&•JBÎÎÎ3gÎÜ ¹téR÷îÝ“““çΛíííêÝ»7›ÍîСCQQ›ÍvqqAZÂ>P§ƒÉdBb&“ »í ÅÞÞÞßß?$$ÄÑÑÑÚÚº¬¬lêÔ©wîÜ 177W©T“'O^²dÉØ±cB>>>S§N…ËN:õþýûãÆUlssó€€€ñãÇ·jÕ Üó\±bEEEň#Ö®]™Ý·o_¤•®¯/hÄÚWÚa ƒ­YÑ †¨N´£ëaÃÔ`mm´ªTU~Ó‹a„ÇG߸qÃÓÓsìØ±?þø#‹Å …õË„>8U*•±±1hÁØØØ\¿~½ÆÀmÁû(ŸÏçóù›7oþXJ.qɫߴiÓÙ³gÝÜÜÁ¬Y³<==µ N†jy {¦III£F¢Óéø03¾KàcäX­V[XXÀXþ"­ñ¢:t:ýÊ•+ÆÆÆ®®®¸<³öñHké’Ëåd2™F£á´Að B-d¨Ô_],ùó 7†aµšÎ`TAѱ„ŒŒ>L¡PF%‘HÌÍÍᇿÿþÛÈÈÈÊÊêùóçPwZeiiyâÄ „Ptt4\dÙ²eðbéÒ¥ …F£…††òù|Êê;wî$“É©©©eee4->>¾¸¸!1×pY:¾ÿþ’’H(C­_¿þÝ»wøu<<<Ξ=+‰ìììN:%•JñÖR©T=†pàC‹Ïçs¹\h¼ÎèjZ¦W³¢Au¡–x™œPk/ :“¾¾¸*nÁ_¿~Ý××wĈÑÑÑžžžÅÅÅŸC½ëˆG¶´´¼~ýúÆÛ¶m{åÊCæ@:¨J„_J£V«”ʵª ‰dúôéÓ¦MV$‹SRRŒŒŒÏ~~àð¿)lU«~½ÿØFNŽ“““]\\ ¶mÛåæñ‰­ ¸Ñ—/_¶µµ…è–÷_±~ýz;;»)S¦Tß”‡‡ÿp´ 9`K:|HUa‚L&“cjšŸ›Ëd2I5ÕF×¶„!ƒN§s8¼ Úf°NíAü_øEð¸Qmccƒõ©¬¬ŒŽŽV*•oß¾]³f BH£ÑXYYé4 øŸµµµöo‡ëàn‡¡i4Zs @†¤Ñˆˆˆ+VìÙ³gÓ¦MwîÜIKK³³³ƒ€˜_~ù…Åbá\¹¼¼<11ÑÁÁA*•¸wïÞ¹sçðã“““1 S(“'O†¯Éd0;vŒÉdþõ×_Ó§O¿uëÖ£G"""x<^RRRNNN¯^½† †ª¨¨HLL´°°066vttìҥ˞={rss?pc¦R*i4š‰©éÛœœMkÖ¤þüóÏ/Òèt•R‰0ìƒõ)t¶6ÿøØa©} F[³fMii©µµ5‹ÅR(ׂjš1t,êMBÕ*Vã'Òh4<æ´Æ!ôb±8,,læÌ™jµ:,,lãÆK–,¹sçιsçìíí'OžL§Ó>|˜’’bP¦W-hb4ˆJ¥®Y³FÇGñÒ¥KçÏŸŽŽV«Õt:];"¸ÆKÕhµÛ=tè••U@@€‘‘îÕ¾Ž6 i¸Mø*•jÔ¨Q666‘‘‘gΜIHHq–O“›©@ù|~YYÙ”)S8εk×<==›.ÒÁGQ¢òòò¶mÛæää8µk732rlh(‡ÃqhÝšD& KK5V;%‚Nk„¥Ñh:wîìççWRRbff&•J;vì®Ñh²²²öìÙpcF£ÑÌŒ—A–-?>\*¬X»Ö¥cG‘FC¦PHd²S¥LLL "B¨A«•âÃŒºdE}>ð¥‡B¡,X° >>þÉ“'{öì™={öÙ³gwìØ1bĈ¹sçΚ5ËPL¯¡‰Ñ ô_„Ëå>xð`„ íÚµÛ»woaa!›Í¦P(;vì(++;vl»ví®^½ZTTTPPàææöÏ?ÿ¨Tª¿ÿþ»v«åرc¡üü|'''¨ûyóæM ³!!!b±899 )øê†û±àiT«ÕžžžW¯^]·nÝ!C¾ýöÛqãÆ‰D"™LV_ì`L&“Ëåþøã sçΉ‰:¤ÍRüƒ” µEÎ{ú—_”rùèÀ@2…âîåÅár'OŸÎf³ßG‰à…•µu©@ñ 4!áÚC®®®...@âß½{Çáp 2œöu¼•J…Ê>>>\.×××r‰ $Œ±á€W‘˜?>ôX“füø^FFÆÛ·ooݺ•˜˜¸nݺwïÞ=~üX"‘<}úT tîÜÂuÏŸ?ÿôéÓœœœ“'Oòx¼ÔÔT„PZZZ^^ÿäÉ“’’’Î;Ï›7Édâë+®*Ý¡C‡ððp@žž>jÔ¨~ýú…††²X,2™|ûöm±XüèÑ£àààW¯^íØ±ƒËå6,???--ÍÝÝýÓ7•J-*,\±víÎ͛˅B„Áxòøñä)Sàa, -Z¤/Á–úJ¤ªP[îÚµk!ÜÀ =, ÷ëÀ 63•J=sæL~~þãÇE"Q^^^EEÅàÁƒ Çôú šÞò¦m‚ÄÅÅ5såʕ֭[+ kkë9sæp¹Ü.]ºL™2寗/_NIIÙ¶m‹Åš;wîòåËч¬ .—Û·oß;w:;;3ŒèèèåË—}êÔ©‡b³ÙŽŽŽ>>>ݺuƒ 7l6bt¸2TçR(mÛ¶Õ>žÇãá•lð#á @»•J¥……Ôã°²²Ú¾}ûýû÷7oÞüìÙ3꽸¨‹¯¯/ŸÏÿÂÍ`0^þý÷£{÷Ê…BðˆP(‡£2ŒùªIÓèÖ ø™×®]³°°`±XmÚ´ñññéÒ¥K¯^½`‘­K/ˆéÕôhŽ B&“Ïž=«T*»téÂápŒŸ={vþüy.—›••uùòe.—âããÞiÓ¦½Ïj‘H$·nÝ ¶³³kÕª•££#F377ONN2ëàà°råÊ1cÆ8;;O:•B¡$''áñq ˜q”J¥··÷Õ«WW¯^îîî>f̘-Zp8¡P+wøxh4š………X,ÎÏÏ?qâÄÍ›7Ç¿|ùr‡£T*q©¿/ Ú”!D&“+JKKär¾±1Nß¼{7¦Ñäüï‰D‡q¹ÜIÓ§sy<{Kkë{·o80&.nPpp©@€`„À½öóóKOO¿~ýzEE…ƒƒƒ««ëäÉ“a13fŒ···••ÕÙ³gù|>B¨{÷îk×®MOO2dìÓ¯^½ú×_ ôòòÒh4«W¯>räHZZš½½½¶R=ö/†aïòó• ŧ•¸U)•¤–-E"‹ÏGõ][¹Ù0*¥R qæÏŸ?eÊ”µk×^»víÅ‹PR«K—.À•¡àª½½½££cll¬Ï¹sçúôé3tèÐË—/¿|ùR,ÃñPÃF;U[©TÊd22™ —¢P(p ™L5C‰$ =zÔ§O„ÌŸ}ûöMMMݸq£J¥ºxñbppð'n‰XìÕ·ïú­[W/[vüðár¡°R*0~¼wß¾ +n]»objj˜i õri4ÜbÜ€[ZZzéÒ¥†(ÜŒÛ]ׯ_ïСÃãÇOž<¹{÷nõêÕ+‘H¤P(BBBf̘agg§T* Áôú š Ò1A4 žª£Œª¶!¾çƒVËŸþ V ~)Àžhõ¯FBÿ¡f Z­622Ú°aÃÒ¥K‡:f̘6mÚôîÝ{ðàÁvvvl6[(Öåj‰äíÛ·ß}÷]VVÖ›7o<==Ÿ?Îår¡öy³Y>d …B¥Âr[—‡â›˜èP"‘H4.8X,{ûúÚØÚ&ýôÓéãÇÃÆŒÙ{èÐ7^^¤ÿZÒõÓ02!äíí µOp„††Â‹ &`ÖµkW¨~‹Â0ÌÓÓÓÓÓÛ¯_¿~ýúáçÒéôððpí«5ÄØ†‚œŸ<ÙQi4<\¨­¬è??? ¾;vœ={¶££ãªU«Nž|˃©©é•+W¨T*A¸tâĉݺu;xð ———±±qyy9 2§@¨É ¹l*•ŠÇã]¼x±¤¤äàÁƒ©©©ãÇwppèÝ»wpp0N¯¥=¶°ÿþ¬¬¬œœœîÝ»‡†††……™››C9Š/Ó ôTY€•’Pt(‘Z¥*|÷îzfæÍk×îܸqâÈ‘ö:9wë>~|÷ž="¤´‚"ÐNØÓ¬¥†‡ö[¤¥Íò¾œj†à(>>>ððqãÆÁ ‹‹Ã›0a‚ö ⣣ñÿbæêê ió:Çã_áëë ov³ÙìñãÇ#„8NHHBhöìÙp ¿?þøÃÁÁ¡²²òõë×R=}útíºÿL™¬T©Š‹‹MMM—®^2yòñ#Gä ›Ã¡R©ˆD2 ¿E#‡H×hwÁõèÑ£Gø'...P‚ŒéU š Ò6A`š¤wïÞŽŽŽ¡íÛ·9räõë× ]çíí ú\.7,, ÕÁj™5kÖRSS `eeåèè¸nݺ .Cˆtxx8nHAÑÆ¼màÂËNÄÄÄ,Z´øPrrrXX‡ÃѼ_wdûöí'Nœˆ³„T ëº@» N‰H1˜ÌÁÆ›81çÿ+ÈÏŠˆxöÇ|>ÿá½{Ú©^s i‡oÔ9 ö·è ˆ‰þ€—~^«]Lî8ö‡¿À“·áÄ÷_ý+th7ªªû2xY‹•––†JHH°²²‚ çs7¤ƒ)•Êâ¢"3s󘸸²ÒR½ÄDQж»ð˜TÑÒ´L¯&Cƒ€r* 0A0 …áE÷îÝásV´÷ïß^s¹ÜñãÇcÆb±à›ÍÖ±ZPUѪ¨¨(üFãåååååÿ£¾züøñšº ×;ð |háÂ…b±¸öRëð_‡ŒG£Ñ€¨Ù¤ 72´)‘Z¥’J$ù¹¹£V)•~þƒ?^*•Ž Ô£Ì2/ ÚË ^ӡƪøuBk©¢ó‰íFZZ°ÚÇ;;;ƒd)ª*ºV/¿Z®T*‹ ) ¥9¦µj¬õüQ¶–¡™^MfÄèÄýÔøý×+£½ Qû‘Õ¿H:²¦5¾h¸-v žß|¯WQ;´ÙA€ê @1y|þO©©$©U›6F&“}Bš /5Œf! Ã"@ó†AÓ ÜzÆ0 â~ŠŠŠ m×6’Š‹‹! T_T¤ÿŠ®ûi8H$3ss„PQa!†aL&S­R¡ªí³æ³ùAü¿©?-$úEu‡†Ã”Úëtûöí7mÚäîî®G=¹ZÙg-Z´`±X2™L¿DíË\b ¸X=®aG¥R¿„˜ÍZðoü&F¬… #U„õ[ ‰¯æ™)únŽ!¦—æ(WwÔ%{Îpç#‹uüøq++«²²²¢¢"777}EáÔT*522ÊlàBf¾LèŸ?vìØ²²2m•`ì|k4¨ØALôP•P“Éœ4mZ~^^EY™¾[¤o`ؤiÓ˜LæûªsІF£+6›]^^NÌ*†Ïç§¥¥yùù¸a¬/Éd‘HÅù‚.uQ 4Dmuww÷ööÆ0ìÂ… d2ÙÄÄD 4‰©óÅ‹W®\©¨¨@ZáMš00ì_ÕÙOòð©Õj½bEƒŠ,6!( aYÙ'?ÿ†Á6/o+Œ-F"‘Ä"‘·D,~õö-B¨YýæO ¡âŠ —o¾ñöñ‹D:Y±5vcó†Î†)™L¦R©³gÏÎËË“ËåúnA :Ìž=:=ÿÿî*‰dˆ4HR©ôîÝ»gÏž5k¨R8¢R©mÛ¶Ý´iÒ*«@ é‚B¡Ð(Úçµ ?>§'I$BiNÅ ¿N£!„Hÿý\©Töóó 6Œ˜D´!$‹¥‰¶Ô+|N§Ñ¾œ k©³Ùì•+Wê»i† í©ƒN§+•JÃ¥ApSûôéãíí- ÏŸ?O&“i4ZSq çææÆÄÄ$''=Zßm!ðé ‘H©´¸¤DPRBÄö@•S"•ZðxúnKý@£ÑT- Cˆ„PIq1Ø~_‹£Vªv:Èd2ö_ây»°o ïf6X,ÖO?ý¤³a ÅSôÝ4C„¶@쮞;wnРA†>­Ãh¦Ñh‘‘‘ÙÙÙ0Y4Ðh´Aƒ }—‡"ðɰ´²Ú±s磬,…Af)~™ Óh999 ÈÐÔA¥R)drÈ!¸Ï¸ÐèÍ=!”€€€êQ/xñµ"¨üýýƒ‚‚HăG€@-Ëå•R)ñH±Xž6Q`&‹ ó½~A¥RA[ß !ÐÐdhaV ª Ày«ïV @€f÷Òw+š6Èdr“¡Aè Ä3b˜h6¶>1ÀÍfxhh4ˆ ð…‚Ø¬!@€|¡ h @à Aƒ @€_(D€øBAÐ  @€À ‚ @€¾P4ˆ ð…‚ A @€/ "@€|¡ h @à Aƒ @€_(þqïjç+2uÒ%tEXtdate:create2011-11-16T16:53:49+01:00'%tEXtdate:modify2011-11-16T16:46:50+01:00 ÏÎeIEND®B`‚openjpeg-1.5.2/applications/jpip/util/0000755000175000017500000000000012315072522017604 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_server.c0000644000175000017500000000764312315002075022134 0ustar mathieumathieu/* * $Id: opj_server.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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. */ /*! \file * \brief opj_server is a JPIP server program, which supports HTTP connection, JPT-stream, session, channels, and cache model managements. * * \section req Requirements * FastCGI development kit (http://www.fastcgi.com). * * \section impinst Implementing instructions * Launch opj_server from the server terminal:\n * % spawn-fcgi -f ./opj_server -p 3000 -n * * Note: JP2 files are stored in the working directory of opj_server\n * Check README for the JP2 Encoding\n * * We tested this software with a virtual server running on the same Linux machine as the clients. */ #include #include #include #include "openjpip.h" #ifndef QUIT_SIGNAL #define QUIT_SIGNAL "quitJPIP" #endif #ifdef _WIN32 WSADATA initialisation_win32; #endif /*_WIN32*/ int main(void) { server_record_t *server_record; #ifdef SERVER char *query_string; #endif #ifdef _WIN32 int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); if( erreur!=0) fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); else fprintf( stderr, "Initialisation Winsock\n"); #endif /*_WIN32*/ server_record = init_JPIPserver( 60000, 0); #ifdef SERVER while(FCGI_Accept() >= 0) #else char query_string[128]; while( fgets( query_string, 128, stdin) && query_string[0]!='\n') #endif { QR_t *qr; bool parse_status; #ifdef SERVER query_string = getenv("QUERY_STRING"); #endif /*SERVER*/ if( strcmp( query_string, QUIT_SIGNAL) == 0) break; qr = parse_querystring( query_string); parse_status = process_JPIPrequest( server_record, qr); #ifndef SERVER local_log( true, true, parse_status, false, qr, server_record); #endif if( parse_status) send_responsedata( server_record, qr); else{ fprintf( FCGI_stderr, "Error: JPIP request failed\n"); fprintf( FCGI_stdout, "\r\n"); } end_QRprocess( server_record, &qr); } fprintf( FCGI_stderr, "JPIP server terminated by a client request\n"); terminate_JPIPserver( &server_record); #ifdef _WIN32 if( WSACleanup() != 0){ fprintf( stderr, "\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); }else{ fprintf( stderr, "\nWSACleanup OK\n"); } #endif return 0; } openjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/0000755000175000017500000000000012315072522023326 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/dist/0000755000175000017500000000000012315072522024271 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/dist/manifest.txt.in0000644000175000017500000000020712315002075027240 0ustar mathieumathieuManifest-Version: 1.0 Ant-Version: Apache Ant 1.7.0 Created-By: Kaori Hagihara Main-Class: ImageWindow Class-Path: @APACHE_XERCES_JAR@ openjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/src/0000755000175000017500000000000012315072522024115 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/src/JP2XMLparser.java0000644000175000017500000001000112315002075027135 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXParseException; import org.xml.sax.ErrorHandler; import org.apache.xerces.parsers.DOMParser; import org.xml.sax.InputSource; import java.io.*; import java.lang.Integer; public class JP2XMLparser { Document document; public static class ROIparams{ public String name = null; public int x = 0; public int y = 0; public int w = 0; public int h = 0; } public static class IRTparams{ public String refimg = null; public double []mat = { 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; } public JP2XMLparser( byte[] buf) { try{ InputSource source = new InputSource( new ByteArrayInputStream( buf)); DOMParser parser = new DOMParser(); parser.setErrorHandler(new MyHandler()); parser.parse( source); document = parser.getDocument(); } catch (Exception e) { e.printStackTrace(); } } public ROIparams [] getROIparams() { ROIparams roi[]; NodeList elements = document.getElementsByTagName("roi"); int elementCount = elements.getLength(); roi = new ROIparams [elementCount]; for( int i = 0; i < elementCount; i++) { Element element = (Element)elements.item(i); roi[i] = new ROIparams(); roi[i].name = element.getAttribute( "name"); roi[i].x = Integer.parseInt( element.getAttribute( "x")) ; roi[i].y = Integer.parseInt( element.getAttribute( "y")) ; roi[i].w = Integer.parseInt( element.getAttribute( "w")) ; roi[i].h = Integer.parseInt( element.getAttribute( "h")) ; } return roi; } public IRTparams getIRTparams() { IRTparams irt = new IRTparams(); NodeList elements = document.getElementsByTagName("irt"); int elementCount = elements.getLength(); Element element = (Element)elements.item(0); irt.refimg = element.getAttribute( "refimg"); for( int i=1; i<=9; i++) irt.mat[i-1] = Double.parseDouble( element.getAttribute("m" + i)); return irt; } } class MyHandler implements ErrorHandler { public void warning(SAXParseException e) { System.out.println("Warning: line" + e.getLineNumber()); System.out.println(e.getMessage()); } public void error(SAXParseException e) { System.out.println("Error: line" + e.getLineNumber()); System.out.println(e.getMessage()); } public void fatalError(SAXParseException e) { System.out.println("Critical error: line" + e.getLineNumber()); System.out.println(e.getMessage()); } }openjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/src/ImageViewer.java0000644000175000017500000001614512315002075027167 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.*; import java.awt.geom.*; import java.net.URL; import javax.swing.border.*; import java.util.*; import java.io.*; public class ImageViewer extends JPanel { private ImageManager imgmanager; private int vw, vh; private int iw, ih; private int selected = 0; private Image img; private String cmdline = new String(); private boolean fullRefresh = false; private Point offset = new Point(0,0); private Rectangle rect = new Rectangle(); private Rectangle roirect[] = null; private String roiname[] = null; public ImageViewer( String j2kfilename, ImageManager manager, boolean session, boolean jppstream, int aux) { String str; MML myMML; this.setSize( 170, 170); Dimension asz = this.getSize(); vw = asz.width; vh = asz.height; setBackground(Color.black); myMML = new MML(this); imgmanager = manager; img = imgmanager.getImage( j2kfilename, vw, vh, session, aux, jppstream, !jppstream); addMouseListener(myMML); addMouseMotionListener(myMML); addComponentListener( new ResizeListener(this)); } public Image getImage() { return img; } public void zoomIn() { roirect = null; roiname = null; double scalex = (double)vw/(double)rect.width; double scaley = (double)vh/(double)rect.height; int fw = (int)(imgmanager.getFw()*scalex); int fh = (int)(imgmanager.getFh()*scaley); int rx = (int)((imgmanager.getRx()+rect.x)*scalex); int ry = (int)((imgmanager.getRy()+rect.y)*scaley); img = imgmanager.getImage( fw, fh, rx, ry, vw, vh); rect.x = rect.y = rect.width = rect.height = 0; selected = 0; fullRefresh = true; repaint(); } public void enlarge() { roirect = null; roiname = null; Dimension asz = this.getSize(); vw = asz.width; vh = asz.height; double scalex = vw/(double)imgmanager.getRw(); double scaley = vh/(double)imgmanager.getRh(); int fw = (int)(imgmanager.getFw()*scalex); int fh = (int)(imgmanager.getFh()*scaley); int rx = (int)(imgmanager.getRx()*scalex); int ry = (int)(imgmanager.getRy()*scaley); img = imgmanager.getImage( fw, fh, rx, ry, vw, vh); fullRefresh = true; repaint(); } public void setSelected(int state) { roirect = null; roiname = null; if (state != selected) { selected = state; repaint(); } } public boolean isInsideRect(int x, int y) { return rect.contains(x - offset.x, y - offset.y); } public void setRGeom(int x1, int y1, int x2, int y2) { rect.x = Math.min(x1,x2) - offset.x; rect.y = Math.min(y1,y2) - offset.y; rect.width = Math.abs(x2-x1); rect.height = Math.abs(y2-y1); } public void annotate( JP2XMLparser.ROIparams roi[]) { int numofroi = roi.length; roirect = new Rectangle [numofroi]; roiname = new String [numofroi]; double scale_x = imgmanager.getFw()/(double)imgmanager.getOrigWidth(); double scale_y = imgmanager.getFh()/(double)imgmanager.getOrigHeight(); int rx = imgmanager.getRx(); int ry = imgmanager.getRy(); int rw = imgmanager.getRw(); int rh = imgmanager.getRh(); for( int i=0; i 0) && (rect.height > 0)) big.draw(rect); if( roirect != null){ for( int i=0; i= 2){ uri = s[0]; j2kfilename = s[1]; if( s.length > 2) host = s[2]; else host = "localhost"; if( s.length > 3) port = Integer.valueOf( s[3]).intValue(); else port = 50000; if( s.length > 4) session = !s[4].equalsIgnoreCase( "stateless"); else session = true; if( s.length > 5) jppstream = !s[5].equalsIgnoreCase( "JPT"); else jppstream = true; if( s.length > 6){ if( s[6].equalsIgnoreCase("udp")) aux = 2; else aux = 1; } else aux = 0; } else{ System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [hostname] [portnumber] [stateless/session] [JPT/JPP] [tcp/udp]"); return; } ImageWindow frame = new ImageWindow( uri, j2kfilename, host, port, session, jppstream, aux); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Display the window. frame.pack(); frame.setSize(new Dimension(400,200)); frame.setLocation( 0, 50); frame.setVisible(true); } } openjpeg-1.5.2/applications/jpip/util/opj_viewer_xerces/src/OptionPanel.java0000644000175000017500000000663512315002075027216 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class OptionPanel extends JPanel implements ActionListener { private JButton roibutton; private JButton imregbutton; private ImageManager imgmanager; private ImageViewer iv; private JP2XMLparser xmlparser; private JFrame regimwindow; private RegimViewer regimgviewer; public OptionPanel( ImageManager manager, ImageViewer imgviewer) { this.setLayout(new BoxLayout( this, BoxLayout.Y_AXIS)); roibutton = new JButton("Region Of Interest"); imregbutton = new JButton("Image Registration"); roibutton.setAlignmentX( Component.CENTER_ALIGNMENT); imregbutton.setAlignmentX( Component.CENTER_ALIGNMENT); add( roibutton); add( imregbutton); roibutton.addActionListener(this); imregbutton.addActionListener(this); imgmanager = manager; iv = imgviewer; xmlparser = null; } public void actionPerformed(ActionEvent e) { if( xmlparser == null){ byte []xmldata = imgmanager.getXML(); if( xmldata != null) xmlparser = new JP2XMLparser( xmldata); } if( e.getSource() == roibutton){ if( xmlparser != null){ JP2XMLparser.ROIparams roi[] = xmlparser.getROIparams(); iv.annotate( roi); } } if( e.getSource() == imregbutton){ if( xmlparser != null){ if( regimwindow == null){ JP2XMLparser.IRTparams irt = xmlparser.getIRTparams(); regimgviewer = new RegimViewer( irt.refimg, irt.mat); regimgviewer.setOpaque(false); regimwindow = new JFrame("Registered Image"); regimwindow.getContentPane().add("Center", regimgviewer); regimwindow.pack(); regimwindow.setLocation( 500, 50); regimwindow.setVisible(true); } regimgviewer.projection( iv.getImage(), (double)imgmanager.getRw()/(double)imgmanager.getOrigWidth()); regimwindow.setSize( regimgviewer.get_imsize()); regimwindow.show(); } } } }openjpeg-1.5.2/applications/jpip/util/CMakeLists.txt0000644000175000017500000001166112315002075022345 0ustar mathieumathieu# Headers file are located here: INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/applications/jpip/libopenjpip ${FCGI_INCLUDE_DIRS} ) # Tool to embed metadata into JP2 file ADD_EXECUTABLE(addXMLinJP2 addXMLinJP2.c) # Install exe INSTALL(TARGETS addXMLinJP2 EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) IF(BUILD_JPIP_SERVER) SET(OPJ_SERVER_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/opj_server.c ) # Build executable ADD_EXECUTABLE(opj_server ${OPJ_SERVER_SRCS}) TARGET_LINK_LIBRARIES(opj_server openjpip_server) SET_PROPERTY( TARGET opj_server APPEND PROPERTY COMPILE_DEFINITIONS SERVER QUIT_SIGNAL="quitJPIP" ) # On unix you need to link to the math library: IF(UNIX) TARGET_LINK_LIBRARIES(opj_server m) ENDIF(UNIX) # Install exe INSTALL(TARGETS opj_server EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) ENDIF(BUILD_JPIP_SERVER) SET(EXES opj_dec_server jpip_to_jp2 jpip_to_j2k test_index ) FOREACH(exe ${EXES}) ADD_EXECUTABLE(${exe} ${exe}.c) TARGET_LINK_LIBRARIES(${exe} openjpip_local) INSTALL(TARGETS ${exe} EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) ENDFOREACH(exe) # Build the two java clients: FIND_PACKAGE(Java 1.5 COMPONENTS Development) # javac, jar # User can override this: if(NOT DEFINED JAVA_SOURCE_VERSION) set(JAVA_SOURCE_VERSION 1.5) endif() if(NOT DEFINED JAVA_TARGET_VERSION) set(JAVA_TARGET_VERSION 1.5) endif() # Only build the java viewer if dev is found: if(Java_Development_FOUND AND Java_JAVAC_EXECUTABLE) set(jflags $ENV{JFLAGS}) # 1. opj_viewer # build dep list: file(GLOB java1_srcs "opj_viewer/src/*.java") # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes1) # Build java ADD_CUSTOM_COMMAND( OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags} -source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION} ${java1_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes1 COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt -C ${CMAKE_CURRENT_BINARY_DIR}/classes1 . DEPENDS ${java1_srcs} ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt COMMENT "javac *.java; jar cvf -> opj_viewer.jar" ) # name the target ADD_CUSTOM_TARGET(OPJViewerJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar COMMENT "building opj_viewer.jar" ) INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) # 2. opj_viewer_xerces # search for package org.apache.xerces.parsers find_file(APACHE_XERCES_JAR NAMES xerces-j2.jar xercesImpl.jar PATHS /usr/share/java/ NO_DEFAULT_PATH ) mark_as_advanced(APACHE_XERCES_JAR) if(EXISTS ${APACHE_XERCES_JAR}) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in ${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt @ONLY ) # build dep list: file(GLOB java2_srcs "opj_viewer_xerces/src/*.java") # Need some common files: list(APPEND java2_srcs ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImageManager.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImgdecClient.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/JPIPHttpClient.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/MML.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/PnmImage.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/RegimViewer.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ResizeListener.java ) # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes2) # Build java ADD_CUSTOM_COMMAND( OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags} -source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION} -classpath ${APACHE_XERCES_JAR} ${java2_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes2 COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar ${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt -C ${CMAKE_CURRENT_BINARY_DIR}/classes2 . DEPENDS ${java2_srcs} ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in COMMENT "javac *.java; jar cvf -> opj_viewer_xerces.jar" ) # name the target ADD_CUSTOM_TARGET(OPJViewerXercesJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar COMMENT "building opj_viewer_xerces.jar" ) INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) endif() else(Java_Development_FOUND) message(WARNING "No java compiler found. Wont be able to build java viewer") endif() openjpeg-1.5.2/applications/jpip/util/jpip_to_jp2.c0000644000175000017500000000460212315002075022165 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief jpip_to_jp2 is a program to convert JPT- JPP- stream to JP2 file * * \section impinst Implementing instructions * This program takes two arguments. \n * -# Input JPT or JPP file * -# Output JP2 file\n * % ./jpip_to_jp2 input.jpt output.jp2 * or * % ./jpip_to_jp2 input.jpp output.jp2 */ #include #include "openjpip.h" int main(int argc,char *argv[]) { jpip_dec_param_t *dec; if( argc < 3){ fprintf( stderr, "Too few arguments:\n"); fprintf( stderr, " - input jpt or jpp file\n"); fprintf( stderr, " - output jp2 file\n"); return -1; } dec = init_jpipdecoder( true); if(!( fread_jpip( argv[1], dec))) return -1; decode_jpip( dec); if(!(fwrite_jp2k( argv[2], dec))) return -1; output_log( true, false, true, dec); destroy_jpipdecoder( &dec); return 0; } openjpeg-1.5.2/applications/jpip/util/addXMLinJP2.c0000644000175000017500000001240012315002075021715 0ustar mathieumathieu/* * $Id: addXMLinJP2.c 46 2011-02-17 14:50:55Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief addXMLinJP2 is a program to embed metadata into JP2 file * * \section impinst Implementing instructions * This program takes two arguments. \n * -# Input/output image file in JP2 format, this JP2 file is being modified * -# Input XML file with metadata contents\n * % ./addXMLinJP2 image.jp2 metadata.xml\n * * Currently, this program does not parse XML file, and the XML file contents is directly embedded as a XML Box.\n * The following is an example of XML file contents specifying Region Of Interests with target names.\n * \n * \n * \n * \n * \n * */ #include #include #include /** * Open JP2 file with the check of JP2 header * * @param[in] filename file name string * @return file descriptor */ FILE * open_jp2file( char filename[]); /** * read xml file without any format check for the moment * * @param[in] filename file name string * @param[out] fsize file byte size * @return pointer to the xml file content buffer */ char * read_xmlfile( char filename[], long *fsize); int main(int argc, char *argv[]) { FILE *fp; char *xmldata, type[]="xml "; long fsize, boxsize; if( argc<3){ fprintf( stderr, "USAGE: ./addXMLinJP2 modifing.jp2 adding.xml\n"); return -1; } fp = open_jp2file( argv[1]); if( !fp) return -1; xmldata = read_xmlfile( argv[2], &fsize); boxsize = fsize + 8; fputc( (boxsize>>24)&0xff, fp); fputc( (boxsize>>16)&0xff, fp); fputc( (boxsize>>8)&0xff, fp); fputc( boxsize&0xff, fp); fwrite( type, 4, 1, fp); fwrite( xmldata, (size_t)fsize, 1, fp); free( xmldata); fclose(fp); return 0; } FILE * open_jp2file( char filename[]) { FILE *fp; char *data; if( !(fp = fopen( filename, "a+b"))){ fprintf( stderr, "Original JP2 %s not found\n", filename); return NULL; } /* Check resource is a JP family file. */ if( fseek( fp, 0, SEEK_SET)==-1){ fclose(fp); fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename); return NULL; } data = (char *)malloc( 12); /* size of header */ if( fread( data, 12, 1, fp) != 1){ free( data); fclose(fp); fprintf( stderr, "Original JP2 %s broken (read error)\n", filename); return NULL; } if( *data || *(data + 1) || *(data + 2) || *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)){ free( data); fclose(fp); fprintf( stderr, "No JPEG 2000 Signature box in target %s\n", filename); return NULL; } free( data); return fp; } char * read_xmlfile( char filename[], long *fsize) { FILE *fp; char *data; /* fprintf( stderr, "open %s\n", filename); */ if(!(fp = fopen( filename, "r"))){ fprintf( stderr, "XML file %s not found\n", filename); return NULL; } if( fseek( fp, 0, SEEK_END) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } if( (*fsize = ftell( fp)) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } if( fseek( fp, 0, SEEK_SET) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } data = (char *)malloc( (size_t)*fsize); if( fread( data, (size_t)*fsize, 1, fp) != 1){ fprintf( stderr, "XML file %s broken (read error)\n", filename); free( data); fclose(fp); return NULL; } fclose( fp); return data; } openjpeg-1.5.2/applications/jpip/util/opj_dec_server.c0000644000175000017500000000624412315002075022743 0ustar mathieumathieu/* * $Id: opj_dec_server.c 54 2011-05-10 13:22:47Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief opj_dec_server is a server to decode JPT-stream and communicate locally with JPIP client, which is coded in java. * * \section impinst Implementing instructions * Launch opj_dec_server from a terminal in the same machine as JPIP client image viewers. \n * % ./opj_dec_server [portnumber]\n * ( portnumber=50000 by default)\n * Keep it alive as long as image viewers are open.\n * * To quite the opj_dec_server, send a message "quit" through the telnet.\n * % telnet localhost 50000\n * quit\n * Be sure all image viewers are closed.\n * Cache file in JPT format is stored in the working directly before it quites. * */ #include #include #include "openjpip.h" #ifdef _WIN32 WSADATA initialisation_win32; #endif int main(int argc, char *argv[]){ dec_server_record_t *server_record; client_t client; int port = 50000; int erreur; (void)erreur; if( argc > 1) port = atoi( argv[1]); #ifdef _WIN32 erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); if( erreur!=0) fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); else printf( "Initialisation Winsock\n"); #endif /*_WIN32*/ server_record = init_dec_server( port); while(( client = accept_connection( server_record)) != -1 ) if(!handle_clientreq( client, server_record)) break; terminate_dec_server( &server_record); #ifdef _WIN32 if( WSACleanup() != 0){ printf("\nError in WSACleanup : %d %d",erreur,WSAGetLastError()); }else{ printf("\nWSACleanup OK\n"); } #endif return 0; } openjpeg-1.5.2/applications/jpip/util/Makefile.am0000644000175000017500000000415512315002075021641 0ustar mathieumathieuMAINTAINERCLEANFILES = Makefile.in bin_PROGRAMS = if WANT_JPIP bin_PROGRAMS += opj_dec_server test_index jpip_to_j2k jpip_to_jp2 endif if WANT_JPIP_SERVER bin_PROGRAMS += opj_server endif opj_server_CPPFLAGS = \ @FCGI_CFLAGS@ \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip \ -DSERVER \ -DQUIT_SIGNAL=\"quitJPIP\" # opj_server_LDADD = $(top_builddir)/applications/jpip/libopenjpip/libopenjpip_server.la @FCGI_LIBS@ -lm # opj_server_SOURCES = opj_server.c #------------- opj_dec_server_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip # opj_dec_server_CFLAGS = opj_dec_server_LDADD = $(top_builddir)/applications/jpip/libopenjpip/libopenjpip_local.la opj_dec_server_SOURCES = opj_dec_server.c #------------- jpip_to_jp2_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip # jpip_to_jp2_CFLAGS = jpip_to_jp2_LDADD = $(top_builddir)/applications/jpip/libopenjpip/libopenjpip_local.la jpip_to_jp2_SOURCES = jpip_to_jp2.c #------------- jpip_to_j2k_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip # jpip_to_j2k_CFLAGS = jpip_to_j2k_LDADD = $(top_builddir)/applications/jpip/libopenjpip/libopenjpip_local.la jpip_to_j2k_SOURCES = jpip_to_j2k.c #------------- test_index_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip # test_index_CFLAGS = test_index_LDADD = $(top_builddir)/applications/jpip/libopenjpip/libopenjpip_local.la test_index_SOURCES = test_index.c #------------- install-data-hook: if WANT_JPIP_SERVER @echo -e " (B)\t$(bindir)/opj_server$(EXEEXT)" >> $(top_builddir)/report.txt endif if WANT_JPIP @echo -e " (B)\t$(bindir)/opj_dec_server$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/jpip_to_jp2$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/jpip_to_j2k$(EXEEXT)" >> $(top_builddir)/report.txt @echo -e " (B)\t$(bindir)/test_index$(EXEEXT)" >> $(top_builddir)/report.txt endif openjpeg-1.5.2/applications/jpip/util/test_index.c0000644000175000017500000000471112315002075022115 0ustar mathieumathieu/* * $Id: test_index.c 46 2011-02-17 14:50:55Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief test_index is a program to test the index code format of a JP2 file * * \section impinst Implementing instructions * This program takes one argument, and print out text type index information to the terminal. \n * -# Input JP2 file\n * % ./test_index input.jp2\n */ #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include "openjpip.h" int main(int argc, char *argv[]) { int fd; index_t *jp2idx; if( argc < 2 ) return 1; if( (fd = open( argv[1], O_RDONLY)) == -1){ fprintf( stderr, "Error: Target %s not found\n", argv[1]); return -1; } if( !(jp2idx = get_index_from_JP2file( fd))){ fprintf( stderr, "JP2 file broken\n"); return -1; } output_index( jp2idx); destroy_index( &jp2idx); close(fd); return 0; } /* main */ openjpeg-1.5.2/applications/jpip/util/jpip_to_j2k.c0000644000175000017500000000461712315002075022166 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief jpip_to_j2k is a program to convert JPT- JPP- stream to J2K file * * \section impinst Implementing instructions * This program takes two arguments. \n * -# Input JPT or JPP file * -# Output J2K file\n * % ./jpip_to_j2k input.jpt output.j2k * or * % ./jpip_to_j2k input.jpp output.j2k */ #include #include "openjpip.h" int main(int argc,char *argv[]) { jpip_dec_param_t *dec; if( argc < 3){ fprintf( stderr, "Too few arguments:\n"); fprintf( stderr, " - input jpt or jpp file\n"); fprintf( stderr, " - output j2k file\n"); return -1; } dec = init_jpipdecoder( false); if(!( fread_jpip( argv[1], dec))) return -1; decode_jpip( dec); if(!( fwrite_jp2k( argv[2], dec))) return -1; /* output_log( true, false, false, dec); */ destroy_jpipdecoder( &dec); return 0; } openjpeg-1.5.2/applications/jpip/util/opj_viewer/0000755000175000017500000000000012315072522021755 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer/dist/0000755000175000017500000000000012315072522022720 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer/dist/manifest.txt0000644000175000017500000000014712315002075025265 0ustar mathieumathieuManifest-Version: 1.0 Ant-Version: Apache Ant 1.7.0 Created-By: Kaori Hagihara Main-Class: ImageWindow openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/0000755000175000017500000000000012315072522022544 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/util/opj_viewer/src/ResizeListener.java0000644000175000017500000000474312315002075026362 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; class ResizeListener implements ComponentListener { private ImageViewer iv; private Dimension largest; public ResizeListener( ImageViewer _iv) { iv = _iv; largest = iv.getSize(); } public void componentHidden(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} public void componentResized(ComponentEvent e) { Dimension cursize = iv.getSize(); if( largest.getWidth() < cursize.getWidth() || largest.getHeight() < cursize.getHeight()){ update_largest( cursize); iv.enlarge(); } } private void update_largest( Dimension cursize) { if( largest.getWidth() < cursize.getWidth()) largest.setSize( cursize.getWidth(), largest.getHeight()); if( largest.getHeight() < cursize.getHeight()) largest.setSize( largest.getWidth(), cursize.getHeight()); } public void componentShown(ComponentEvent e) {} } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/PnmImage.java0000644000175000017500000001057312315002075025106 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.awt.*; import java.awt.image.*; import java.io.*; import java.util.regex.*; public class PnmImage extends Component { private byte[] data = null; private int width = 0; private int height = 0; private int channel = 0; public PnmImage( int c, int w, int h) { channel = c; width = w; height = h; data = new byte [ w*h*c]; } public PnmImage( String filename) { String str; Pattern pat; Matcher mat; int bytes; int r, offset = 0; try { FileInputStream fis = new FileInputStream( new File(filename)); DataInputStream is = new DataInputStream( fis); pat = Pattern.compile("^P([56])$"); mat = pat.matcher(str = is.readLine()); if( !mat.matches()){ System.out.println("PNM header format error"); return; } if( (mat.group(1)).compareTo("5") == 0) channel = 1; else channel = 3; pat = Pattern.compile("^(\\d+) (\\d+)$"); mat = pat.matcher(str = is.readLine()); if( !mat.matches()){ System.out.println("PNM header format error"); return; } width = Integer.parseInt( mat.group(1)); height = Integer.parseInt( mat.group(2)); str = is.readLine(); // 255 bytes = width*height*channel; data = new byte[bytes]; while( bytes > 0){ try { r = is.read(data, offset, bytes); if( r == -1){ System.err.println(" failed to read()"); break; } offset += r; bytes -= r; } catch (IOException e) { e.printStackTrace(); } } fis.close(); } catch (IOException e) { e.printStackTrace(); } } public byte [] get_data(){ return data;} public int get_width() { return width;} public int get_height(){ return height;} public Image createROIImage( int rx, int ry, int rw, int rh) { int []pix = new int[ rw*rh]; for( int i=0; i 0) && (rect.height > 0)) big.draw(rect); if( roirect != null){ for( int i=0; i= 0) && (x < iv.getWidth()) && (y >= 0) && (y < iv.getHeight()); } public void mousePressed(MouseEvent e) { btn = e.getButton(); if( iv.hasAnnotation()){ if( iv.isInsideROIRect(e.getX(), e.getY())){ iv.zoomIn(); System.out.println("annotation click"); return; } } if (iv.isInsideRect(e.getX(), e.getY())) { iv.setSelected(2); iv.repaint(); zoomrq = true; } else { iv.setRGeom(0, 0, 0, 0); iv.setSelected(0); iv.repaint(); x1 = y1 = -1; } } public void mouseReleased(MouseEvent e) { if(e.getButton() == 1) { if (zoomrq) { iv.zoomIn(); zoomrq = false; } } } public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (btn == 1) { x2 = e.getX(); y2 = e.getY(); iv.setSelected(0); zoomrq = false; if (isInside(x2, y2)) { if (x1 == -1) { x1 = x2; y1 = y2; } else { iv.setRGeom(x1, y1, x2, y2); iv.repaint(); } } } } } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/ImageWindow.java0000644000175000017500000000712212315002075025617 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ImageWindow extends JFrame { private ImageViewer imgviewer; private ImageManager imgmanager; public ImageWindow( String uri, String j2kfilename, String host, int port, boolean session, boolean jppstream, int aux) { super( j2kfilename); imgmanager = new ImageManager( uri, host, port); imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream, aux); imgviewer.setOpaque(true); //content panes must be opaque JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add( imgviewer, BorderLayout.CENTER); setContentPane( panel); addWindowListener(new WindowMyAdapter()); } class WindowMyAdapter extends WindowAdapter { public void windowClosing(WindowEvent arg) { imgmanager.closeChannel(); System.exit(0); } } public static void main(String s[]) { String j2kfilename, uri, host; boolean session, jppstream; int port, aux; // 0: none, 1: tcp, 2: udp if(s.length >= 2){ uri = s[0]; j2kfilename = s[1]; if( s.length > 2) host = s[2]; else host = "localhost"; if( s.length > 3) port = Integer.valueOf( s[3]).intValue(); else port = 50000; if( s.length > 4) session = !s[4].equalsIgnoreCase( "stateless"); else session = true; if( s.length > 5) jppstream = !s[5].equalsIgnoreCase( "JPT"); else jppstream = true; if( s.length > 6){ if( s[6].equalsIgnoreCase("udp")) aux = 2; else aux = 1; } else aux = 0; } else{ System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [hostname] [portnumber] [stateless/session] [JPT/JPP] [tcp/udp]"); return; } ImageWindow frame = new ImageWindow( uri, j2kfilename, host, port, session, jppstream, aux); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Display the window. frame.pack(); frame.setSize(new Dimension(400,200)); frame.setLocation( 0, 50); frame.setVisible(true); } } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/JPIPHttpClient.java0000644000175000017500000003543512315002075026156 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.net.*; import java.io.*; import java.util.*; public class JPIPHttpClient { private String comURL; protected int fw, fh; protected int rx, ry; protected int rw, rh; protected String cid; protected String tid; private boolean JPTstream; private boolean JPPstream; private boolean aux; private boolean tcp; // true: tcp, false: udp private int port; public JPIPHttpClient( String URI) { comURL = URI + "?"; fw = fh = -1; rx = ry = -1; rw = rh = -1; cid = null; tid = null; JPTstream = JPPstream = aux = false; port = 0; } public int getFw(){ return fw;} public int getFh(){ return fh;} public int getRx(){ return rx;} public int getRy(){ return ry;} public int getRw(){ return rw;} public int getRh(){ return rh;} public byte[] requestViewWindow( int reqfw, int reqfh) { if( cid != null) return requestViewWindow( reqfw, reqfh, cid); else return null; } public byte[] requestViewWindow( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh) { if( cid != null) return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid); else if( tid != null) return requestViewWindow( null, tid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false, 0, false, false); else return null; } public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid) { return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, false, 0, false, false); } public byte[] requestViewWindow( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh, String reqcid) { return requestViewWindow( null, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, false, 0, false, false); } public byte[] requestViewWindow( String target, int reqfw, int reqfh) { return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, false, 0, false, false); } public byte[] requestViewWindow( String target, int reqfw, int reqfh, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { if( cid == null) // 1 channel allocation only return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew, reqaux, reqJPP, reqJPT); else return null; } public byte[] requestViewWindow( String target, String reqtid, int reqfw, int reqfh, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { if( cid == null) // 1 channel allocation only return requestViewWindow( target, reqtid, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew, reqaux, reqJPP, reqJPT); else return null; } public byte[] requestViewWindow( String target, int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh) { return requestViewWindow( target, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false, 0, false, false); } public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, reqcnew, reqaux, reqJPP, reqJPT); } public byte[] requestViewWindow( String target, String reqtid, int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh, String reqcid, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { if( reqtid != null) tid = reqtid; String urlstring = const_urlstring( target, reqtid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, reqcnew, reqaux, reqJPP, reqJPT); return GETrequest( urlstring); } public byte[] requestXML() { String urlstring = comURL; if( cid == null) return null; urlstring = urlstring.concat( "cid=" + cid); urlstring = urlstring.concat( "&metareq=[xml_]"); return GETrequest( urlstring); } private byte[] GETrequest( String urlstring) { URL url = null; HttpURLConnection urlconn = null; byte[] jpipstream = null; try{ url = new URL( urlstring); System.err.println("Requesting: " + url); urlconn = (HttpURLConnection)url.openConnection(); urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); urlconn.connect(); set_responseheader( urlconn); if( !aux){ jpipstream = receive_httpchunk( urlconn); urlconn.disconnect(); } else{ urlconn.disconnect(); jpipstream = receive_tcpaux( comURL.substring( 7, comURL.indexOf('/', 7)), port, cid); } } catch ( MalformedURLException e){ e.printStackTrace(); } catch ( ProtocolException e){ e.printStackTrace(); } catch( ClassCastException e){ e.printStackTrace(); } catch( NullPointerException e){ e.printStackTrace(); } catch( UnknownServiceException e){ e.printStackTrace(); } catch ( IOException e){ e.printStackTrace(); } return jpipstream; } private void set_responseheader( HttpURLConnection urlconn) { Map> headers = urlconn.getHeaderFields(); java.util.List hvaluelist; String hvalueline; String status = headers.get(null).get(0); System.err.println( status); if( !status.contains("OK")) System.err.println( headers.get("Reason")); if(( hvaluelist = headers.get("Content-type")) == null) hvaluelist = headers.get("Content-Type"); hvalueline = hvaluelist.get(0); System.err.println( hvalueline); if( hvalueline.endsWith("jpt-stream")) JPTstream = true; else if( hvalueline.endsWith("jpp-stream")) JPPstream = true; if(( hvaluelist = headers.get("JPIP-fsiz")) != null){ hvalueline = hvaluelist.get(0); fw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue(); fh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue(); System.err.println("fw,fh: " + fw + "," + fh); } if(( hvaluelist = headers.get("JPIP-roff")) != null){ hvalueline = hvaluelist.get(0); rx = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue(); ry = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue(); System.err.println("rx,ry: " + rx + "," + ry); } if(( hvaluelist = headers.get("JPIP-rsiz")) != null){ hvalueline = hvaluelist.get(0); rw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue(); rh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue(); System.err.println("rw,rh: " + rw + "," + rh); } if(( hvaluelist = headers.get("JPIP-cnew")) != null){ hvalueline = hvaluelist.get(0); cid = hvalueline.substring( hvalueline.indexOf('=')+1, hvalueline.indexOf(',')); int idxOfcid = hvalueline.indexOf("transport")+10; int idxOfcid2 = hvalueline.indexOf(',', idxOfcid); String transport; if( idxOfcid2 != -1) transport = hvalueline.substring( idxOfcid, idxOfcid2); else transport = hvalueline.substring( idxOfcid); if( transport.matches("http-tcp")){ aux = true; tcp = true; } else if( transport.matches("http-udp")){ aux = true; tcp = false; } else aux = false; if( aux){ idxOfcid = hvalueline.indexOf("auxport")+8; port = Integer.valueOf( hvalueline.substring( idxOfcid)).intValue(); System.err.println("cid: " + cid + ", transport: " + transport + ", auxport: " + port); } else System.err.println("cid: " + cid + ", transport: " + transport); } if(( hvaluelist = headers.get("JPIP-tid")) != null){ hvalueline = hvaluelist.get(0); tid = hvalueline.substring( hvalueline.indexOf('=')+1); System.err.println("tid: " + tid); } } private static byte[] receive_httpchunk( HttpURLConnection urlconn) { byte[] chunk = null; InputStream input; try{ input = urlconn.getInputStream(); if( input.available() > 0){ ByteArrayOutputStream tmpstream = new ByteArrayOutputStream(); byte[] buf = new byte[ 1024]; int redlen, buflen; System.err.println("reading jpipstream..."); do{ redlen = input.read( buf); if( redlen == -1) break; tmpstream.write( buf, 0, redlen); }while( redlen > 0); buflen = tmpstream.size(); chunk = tmpstream.toByteArray(); buf = null; tmpstream = null; System.err.println("jpiplen: " + buflen); System.err.println(" succeeded"); } else{ System.err.println("No new jpipstream"); } input.close(); } catch ( IOException e){ e.printStackTrace(); } return chunk; } private static byte[] receive_tcpaux( String host, int port, String cid) { Socket jpipsocket; DataOutputStream os; DataInputStream is; byte []auxheader; byte []chunkbody = null; byte []stream = null; int chunkbodylen, streamlen, headlen = 8; ByteArrayOutputStream tmpstream; try{ jpipsocket = new Socket( host, port); os = new DataOutputStream( jpipsocket.getOutputStream()); is = new DataInputStream( jpipsocket.getInputStream()); auxheader = new byte[headlen]; tmpstream = new ByteArrayOutputStream(); os.writeBytes( cid + "\r\n"); do{ read_stream( is, auxheader, headlen); chunkbodylen = ((auxheader[0]&0xff)<<8 | (auxheader[1]&0xff)) - headlen; chunkbody = new byte [ chunkbodylen]; read_stream( is, chunkbody, chunkbodylen); tmpstream.write( chunkbody, 0, chunkbodylen); os.write( auxheader, 0, headlen); }while( !(chunkbody[chunkbodylen-3]==0x00 && ( chunkbody[chunkbodylen-2]==0x01 || chunkbody[chunkbodylen-2]== 0x02))); streamlen = tmpstream.size(); stream = tmpstream.toByteArray(); System.err.println("jpiplen: " + streamlen); System.err.println(" succeeded"); chunkbody = null; tmpstream = null; os.close(); is.close(); jpipsocket.close(); } catch ( IOException e){ e.printStackTrace(); } return stream; } private static void read_stream( InputStream is, byte []stream, int length) { int remlen = length; int off = 0; try{ while( remlen > 0){ int redlen = is.read( stream, off, remlen); if( redlen == -1){ System.err.println(" failed to read_stream()"); break; } off += redlen; remlen -= redlen; } } catch (IOException e) { System.err.println("IOException: " + e); } } private String const_urlstring( String target, String reqtid, int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh, String reqcid, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { String urlstring = comURL; // C.7.3 Image Return Type // add type=jpp-stream(;ptype=ext) or type=jpt-stream;ttype=ext if( target != null){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "target=" + target); } if( reqtid != null){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "tid=" + reqtid); } if( reqfw != -1 && reqfh != -1){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "fsiz=" + reqfw + "," + reqfh); } if( reqrx != -1 && reqry != -1){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "roff=" + reqrx + "," + reqry); } if( reqrw != -1 && reqrh != -1){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "rsiz=" + reqrw + "," + reqrh); } if( reqcid != null){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "cid=" + reqcid); } if( reqcnew){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); if( reqaux == 1) urlstring = urlstring.concat( "cnew=http-tcp"); else if( reqaux == 2) urlstring = urlstring.concat( "cnew=http-udp"); else urlstring = urlstring.concat( "cnew=http"); } if( reqJPP && !JPTstream){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "type=jpp-stream"); } else if( reqJPT && !JPPstream){ if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); urlstring = urlstring.concat( "type=jpt-stream"); } else{ // remove this option later if( !urlstring.endsWith("?")) urlstring = urlstring.concat( "&"); if( JPTstream) urlstring = urlstring.concat( "type=jpt-stream"); else if( JPPstream) urlstring = urlstring.concat( "type=jpp-stream"); } return urlstring; } public void closeChannel() { if( cid == null) return; try{ URL url = new URL( comURL + "cclose=" + cid); System.err.println( "closing cid: " + cid); HttpURLConnection urlconn = (HttpURLConnection)url.openConnection(); urlconn.setRequestMethod("GET"); urlconn.setInstanceFollowRedirects(false); urlconn.connect(); Map headers = urlconn.getHeaderFields(); urlconn.disconnect(); } catch ( MalformedURLException e){ e.printStackTrace(); } catch ( IOException e){ e.printStackTrace(); } } } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/ImageManager.java0000644000175000017500000001046112315002075025722 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.awt.Image; public class ImageManager extends JPIPHttpClient { private PnmImage pnmimage; private int origwidth; private int origheight; private ImgdecClient imgdecoder; public ImageManager( String uri, String host, int port) { super( uri); imgdecoder = new ImgdecClient( host, port); pnmimage = null; origwidth = 0; origheight = 0; } public int getOrigWidth(){ if( origwidth == 0){ if( cid != null || tid != null){ java.awt.Dimension dim = imgdecoder.query_imagesize( cid, tid); if( dim != null){ origwidth = dim.width; origheight = dim.height; } } else System.err.println("Neither cid or tid obtained before to get Original Image Dimension"); } return origwidth; } public int getOrigHeight(){ return origheight;} public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew, int reqaux, boolean reqJPP, boolean reqJPT) { System.err.println(); String refcid = null; byte[] jpipstream; // Todo: check if the cid is for the same stream type if( reqcnew) refcid = imgdecoder.query_cid( j2kfilename); if( refcid == null){ String reftid = imgdecoder.query_tid( j2kfilename); if( reftid == null) jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew, reqaux, reqJPP, reqJPT); else jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, reqcnew, reqaux, reqJPP, reqJPT); } else jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew, reqaux, reqJPP, reqJPT); System.err.println( "decoding to PNM image"); if((pnmimage = imgdecoder.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh))!=null){ System.err.println( " done"); return pnmimage.createROIImage( rx, ry, rw, rh); } else{ System.err.println( " failed"); return null; } } public Image getImage( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh) { System.err.println(); byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh); System.err.println( "decoding to PNM image"); if((pnmimage = imgdecoder.decode_jpipstream( jpipstream, tid, cid, fw, fh)) != null){ System.err.println( " done"); return pnmimage.createROIImage( rx, ry, rw, rh); } else{ System.err.println( " failed"); return null; } } public byte[] getXML() { System.err.println(); byte []xmldata = null; byte[] jpipstream = super.requestXML(); if( jpipstream != null){ imgdecoder.send_JPIPstream( jpipstream); xmldata = imgdecoder.get_XMLstream( cid); } return xmldata; } public void closeChannel() { if( cid != null){ imgdecoder.destroy_cid( cid); super.closeChannel(); } } } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/ImgdecClient.java0000644000175000017500000002477412315002075025750 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import java.io.*; import java.net.*; public class ImgdecClient{ private String hostname; private int portNo; public ImgdecClient( String host, int port) { hostname = host; portNo = port; } public PnmImage decode_jpipstream( byte[] jpipstream, String tid, String cid, int fw, int fh) { if( jpipstream != null) send_JPIPstream( jpipstream); return get_PNMstream( cid, tid, fw, fh); } public PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh) { send_JPIPstream( jpipstream, j2kfilename, tid, cid); return get_PNMstream( cid, tid, fw, fh); } public void send_JPIPstream( byte[] jpipstream) { try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); System.err.println("Sending " + jpipstream.length + "Data Bytes to decodingServer"); os.writeBytes("JPIP-stream\n"); os.writeBytes("version 1.2\n"); os.writeBytes( jpipstream.length + "\n"); os.write( jpipstream, 0, jpipstream.length); byte signal = is.readByte(); if( signal == 0) System.err.println(" failed"); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } public void send_JPIPstream( byte[] jpipstream, String j2kfilename, String tid, String cid) { try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); int length = 0; if( jpipstream != null) length = jpipstream.length; System.err.println("Sending " + length + "Data Bytes to decodingServer"); os.writeBytes("JPIP-stream\n"); os.writeBytes("version 1.2\n"); os.writeBytes( j2kfilename + "\n"); if( tid == null) os.writeBytes( "0\n"); else os.writeBytes( tid + "\n"); if( cid == null) os.writeBytes( "0\n"); else os.writeBytes( cid + "\n"); os.writeBytes( length + "\n"); os.write( jpipstream, 0, length); byte signal = is.readByte(); if( signal == 0) System.err.println(" failed"); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } public PnmImage get_PNMstream( String cid, String tid, int fw, int fh) { PnmImage pnmstream = null; try { Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); byte []header = new byte[7]; os.writeBytes("PNM request\n"); if( cid != null) os.writeBytes( cid + "\n"); else if( tid != null) os.writeBytes( tid + "\n"); else os.writeBytes( "0\n"); os.writeBytes( fw + "\n"); os.writeBytes( fh + "\n"); read_stream( is, header, 7); if( header[0] == 80){ // P5: gray, P6: color byte magicknum = header[1]; if( magicknum == 5 || magicknum == 6){ int c = magicknum==6 ? 3: 1; int w = (header[2]&0xff)<<8 | (header[3]&0xff); int h = (header[4]&0xff)<<8 | (header[5]&0xff); int maxval = header[6]&0xff; int length = w*h*c; if( maxval == 255 && length != 0){ pnmstream = new PnmImage( c, w, h); read_stream( is, pnmstream.get_data(), length); } else System.err.println("Error in get_PNMstream(), only 255 is accepted"); } else System.err.println("Error in get_PNMstream(), wrong magick number" + header[1]); } else System.err.println("Error in get_PNMstream(), Not starting with P"); os.close(); is.close(); imgdecSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } return pnmstream; } public byte [] get_XMLstream( String cid) { byte []xmldata = null; try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); byte []header = new byte[5]; os.writeBytes("XML request\n"); os.writeBytes( cid + "\n"); read_stream( is, header, 5); if( header[0] == 88 && header[1] == 77 && header[2] == 76){ int length = (header[3]&0xff)<<8 | (header[4]&0xff); xmldata = new byte[ length]; read_stream( is, xmldata, length); } else System.err.println("Error in get_XMLstream(), not starting with XML"); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } return xmldata; } public String query_cid( String j2kfilename) { int []retmsglabel = new int[3]; retmsglabel[0] = 67; retmsglabel[1] = 73; retmsglabel[2] = 68; return query_id( "CID request", j2kfilename, retmsglabel); } public String query_tid( String j2kfilename) { int []retmsglabel = new int[3]; retmsglabel[0] = 84; retmsglabel[1] = 73; retmsglabel[2] = 68; return query_id( "TID request", j2kfilename, retmsglabel); } public String query_id( String reqmsghead, String j2kfilename, int[] retmsglabel) { String id = null; try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); byte []header = new byte[4]; os.writeBytes( reqmsghead + "\n"); os.writeBytes( j2kfilename + "\n"); read_stream( is, header, 4); if( header[0] == retmsglabel[0] && header[1] == retmsglabel[1] && header[2] == retmsglabel[2]){ int length = header[3]&0xff; if( length > 0){ byte []iddata = new byte[ length]; read_stream( is, iddata, length); id = new String( iddata); } } else System.err.println("Error in query_id("+ reqmsghead + "), wrong to start with " + header); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } return id; } public java.awt.Dimension query_imagesize( String cid, String tid) { java.awt.Dimension dim = null; try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); byte []header = new byte[3]; os.writeBytes( "SIZ request\n"); if( tid == null) os.writeBytes( "0\n"); else os.writeBytes( tid + "\n"); if( cid == null) os.writeBytes( "0\n"); else os.writeBytes( cid + "\n"); read_stream( is, header, 3); if( header[0] == 83 && header[1] == 73 && header[2] == 90){ byte []data = new byte[ 3]; read_stream( is, data, 3); int w = (data[0]&0xff)<<16 | (data[1]&0xff)<<8 | (data[2]&0xff); read_stream( is, data, 3); int h = (data[0]&0xff)<<16 | (data[1]&0xff)<<8 | (data[2]&0xff); dim = new java.awt.Dimension( w, h); } else System.err.println("Error in query_imagesize("+ cid + ", " + tid + "), wrong to start with " + header); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } return dim; } private static void read_stream( DataInputStream is, byte []stream, int length) { int remlen = length; int off = 0; try{ while( remlen > 0){ int redlen = is.read( stream, off, remlen); if( redlen == -1){ System.err.println(" failed to read_stream()"); break; } off += redlen; remlen -= redlen; } } catch (IOException e) { System.err.println("IOException: " + e); } } public void destroy_cid( String cid) { try{ Socket imgdecSocket = new Socket( hostname, portNo); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); os.writeBytes("CID destroy\n"); os.writeBytes( cid + "\n"); byte signal = is.readByte(); if( signal == 0) System.err.println(" failed"); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } } openjpeg-1.5.2/applications/jpip/util/opj_viewer/src/RegimViewer.java0000644000175000017500000000715012315002075025633 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.awt.geom.AffineTransform; public class RegimViewer extends JPanel { private PnmImage refpnm; private int vw, vh; private Image refimg; private Image jpipImg; private double[] affine_matrix; private AffineTransform affine; public RegimViewer( String refname, double[] mat) { refpnm = new PnmImage( refname.replaceFirst("jp2", "pgm")); // decoding not realized affine_matrix = new double[6]; affine_matrix[0] = mat[0]; affine_matrix[1] = mat[3]; affine_matrix[2] = mat[1]; affine_matrix[3] = mat[4]; affine_matrix[4] = mat[2]; affine_matrix[5] = mat[5]; affine = new AffineTransform(); for( int i=0; i<3; i++){ for( int j=0; j<3; j++) System.out.print( mat[i*3+j] + " "); System.out.println(); } } public void projection( Image jpipimg, double scale) { jpipImg = jpipimg; refimg = refpnm.createScaleImage( scale); vw = refimg.getWidth(this); vh = refimg.getHeight(this); this.setSize( vw, vh); affine.setTransform( affine_matrix[0], affine_matrix[1], affine_matrix[2], affine_matrix[3], affine_matrix[4], affine_matrix[5]); repaint(); } public void paint(Graphics g) { int iw, ih; BufferedImage bi, bi2; Graphics2D big, big2; Graphics2D g2 = (Graphics2D) g; g2.clearRect(0, 0, vw, vh); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); iw = refimg.getWidth(this); ih = refimg.getHeight(this); bi = new BufferedImage( iw, ih, BufferedImage.TYPE_INT_RGB); big = bi.createGraphics(); big.drawImage(refimg, 0, 0, this); g2.drawImage(bi, 0, 0, this); bi2 = new BufferedImage( jpipImg.getWidth(this), jpipImg.getHeight(this), BufferedImage.TYPE_INT_RGB); big2 = bi2.createGraphics(); big2.drawImage( jpipImg, 0, 0, this); g2.setTransform(affine); g2.drawImage(bi2, 0, 0, this); } public Dimension get_imsize() { return (new Dimension( vw, vh)); } } openjpeg-1.5.2/applications/jpip/CMakeLists.txt0000644000175000017500000000057512315002075021372 0ustar mathieumathieu# required dep for server: IF(BUILD_JPIP_SERVER) FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(FCGI REQUIRED) FIND_PACKAGE(Threads REQUIRED) IF(NOT CMAKE_USE_PTHREADS_INIT) MESSAGE(FATAL_ERROR "Only pthread are supported") ENDIF(NOT CMAKE_USE_PTHREADS_INIT) ENDIF(BUILD_JPIP_SERVER) # JPIP library: ADD_SUBDIRECTORY(libopenjpip) # JPIP binaries: ADD_SUBDIRECTORY(util) openjpeg-1.5.2/applications/jpip/libopenjpip/0000755000175000017500000000000012315072522021142 5ustar mathieumathieuopenjpeg-1.5.2/applications/jpip/libopenjpip/jp2k_decoder.h0000644000175000017500000000346212315002075023647 0ustar mathieumathieu/* * $Id: jp2k_decoder.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 JP2K_DECODER_H_ # define JP2K_DECODER_H_ #include "byte_manager.h" #include "ihdrbox_manager.h" Byte_t * j2k_to_pnm( Byte_t *j2kstream, Byte8_t j2klen, ihdrbox_param_t **ihdrbox); #endif /* !JP2K_DECODER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/j2kheader_manager.h0000644000175000017500000000655312315002075024651 0ustar mathieumathieu/* * $Id: j2kheader_manager.h 984 2011-10-10 09:50:18Z antonin $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 J2KHEADER_MANAGER_H_ # define J2KHEADER_MANAGER_H_ #include "bool.h" #include "byte_manager.h" #include "index_manager.h" /** * get main header information from j2k codestream * * @param[in] j2kstream j2k codestream * @param[out] SIZ SIZ marker pointer * @param[out] COD COD marker pointer * @return if succeeded (true) or failed (false) */ bool get_mainheader_from_j2kstream( Byte_t *j2kstream, SIZmarker_param_t *SIZ, CODmarker_param_t *COD); /** * modify main header in j2k codestream to fit with the new number of decompositions * * @param[in] j2kstream j2k codestream * @param[in] numOfdecomp the New number of decompositions * @param[in] SIZ original SIZ marker information * @param[in] COD original COD marker information * @param[out] j2klen pointer to the length of j2k code stream * @return if succeeded (true) or failed (false) */ bool modify_mainheader( Byte_t *j2kstream, int numOfdecomp, SIZmarker_param_t SIZ, CODmarker_param_t COD, Byte8_t *j2klen); /** * modify tile header in j2k codestream to fit with the tile part length, and new number of decompositions for multi-componet images * * @param[in] j2kstream j2k codestream * @param[in] SOToffset offset of SOT marker from the beginning of j2kstream * @param[in] numOfdecomp the New number of decompositions, -1 if the same as original * @param[in] Csiz number of components * @param[out] j2klen pointer to the length of j2k code stream * @return if succeeded (true) or failed (false) */ bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, Byte2_t Csiz, Byte8_t *j2klen); #endif /* !J2KHEADER_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/placeholder_manager.c0000644000175000017500000001013112315002075025252 0ustar mathieumathieu/* * $Id: placeholder_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "placeholder_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ placeholderlist_param_t * gene_placeholderlist(void) { placeholderlist_param_t *list; list = (placeholderlist_param_t *)malloc( sizeof(placeholderlist_param_t)); list->first = NULL; list->last = NULL; return list; } void delete_placeholderlist( placeholderlist_param_t **list) { placeholder_param_t *ptr, *next; if(!(*list)) return; ptr = (*list)->first; while( ptr){ next=ptr->next; delete_placeholder( &ptr); ptr=next; } free( *list); } placeholder_param_t * gene_placeholder( box_param_t *box, int origID) { placeholder_param_t *placeholder; placeholder = (placeholder_param_t *)malloc( sizeof(placeholder_param_t)); strncpy( placeholder->TBox, "phld", 4); placeholder->Flags = 1; /* only the access to the original contents of this box, for now */ placeholder->OrigID = origID; placeholder->OrigBH = fetch_headbytes( box); placeholder->OrigBHlen = box->headlen; placeholder->LBox = 20+box->headlen; placeholder->next = NULL; return placeholder; } void delete_placeholder( placeholder_param_t **placeholder) { if( (*placeholder)->OrigBH) free((*placeholder)->OrigBH); free(*placeholder); } void insert_placeholder_into_list( placeholder_param_t *phld, placeholderlist_param_t *phldlist) { if( phldlist->first) phldlist->last->next = phld; else phldlist->first = phld; phldlist->last = phld; } void print_placeholder( placeholder_param_t *phld) { int i; fprintf( logstream, "placeholder info:\n"); fprintf( logstream, "\t LBox: %d %#x\n", phld->LBox, phld->LBox); fprintf( logstream, "\t TBox: %.4s\n", phld->TBox); fprintf( logstream, "\t Flags: %#x %#x\n", phld->Flags, phld->Flags); fprintf( logstream, "\t OrigID: %lld\n", phld->OrigID); fprintf( logstream, "\t OrigBH: "); for( i=0; i< phld->OrigBHlen; i++) fprintf( logstream, "%02x ", phld->OrigBH[i]); fprintf( logstream, "\t"); for( i=0; i< phld->OrigBHlen; i++) fprintf( logstream, "%c", phld->OrigBH[i]); fprintf( logstream, "\n"); } void print_allplaceholder( placeholderlist_param_t *list) { placeholder_param_t *ptr; if( !list) return; fprintf( logstream, "all placeholder info: \n"); ptr = list->first; while( ptr != NULL){ print_placeholder( ptr); ptr=ptr->next; } } openjpeg-1.5.2/applications/jpip/libopenjpip/bool.h0000644000175000017500000000352112315002075022243 0ustar mathieumathieu/* * $Id: bool.h 770 2011-05-09 18:11:40Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 BOOL_H_ # define BOOL_H_ #ifndef false #define false 0 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef true #define true (!false) #endif #ifndef TRUE #define TRUE (!FALSE) #endif typedef char bool; #endif /* !BOOL_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/imgreg_manager.h0000644000175000017500000000766112315002075024265 0ustar mathieumathieu/* * $Id: imgreg_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 IMGREG_MANAGER_H_ # define IMGREG_MANAGER_H_ /** image region parameters */ typedef struct imgreg_param{ int xosiz, yosiz; /** offset from the origin of the reference grid at the decomposition level */ int fx, fy; /** frame size (fsiz) */ int ox, oy; /** offset (roff) */ int sx, sy; /** region size (rsiz) */ int level; /** decomposition level */ } imgreg_param_t; /** * map view-window requests to codestream image resolutions and regions * * @param[in] fx,fy frame size * @param[in] rx,ry offset of region * @param[in] rw,rh size of region * @param[in] XOsiz,YOsiz offset from the origin of the reference grid to the left side of the image area * @param[in] Xsiz,Ysiz size of the reference grid * @param[in] numOfreslev number of resolution levels * @return structure of image region parameters */ imgreg_param_t map_viewin2imgreg( const int fx, const int fy, const int rx, const int ry, const int rw, const int rh, const int XOsiz, const int YOsiz, const int Xsiz, const int Ysiz, const int numOfreslev); /** * find deconposition level and its resolution size * C.4.1 Mapping view-window requests to codestream image resolution * and regions * Note: only round-down implemented * * @param[in] maxlev maximum decomposition level * @param[in/out] lev decomposition level pointer * @param[in/out] fx horizontal frame size pointer * @param[in/out] fy vertical frame size pointer * @param[in/out] xmin horizontal image offset pointer * @param[in/out] ymin vertical image offset pointer * @param[in/out] xmax horizontal image size pointer * @param[in/out] ymax vertical image size pointer */ void find_level( int maxlev, int *lev, int *fx, int *fy, int *xmin, int *ymin, int *xmax, int *ymax); /** * compute decomposition level (only to get the level * use find_level for all parameters * * @param[in] fx horizontal frame size * @param[in] fy vertical frame size * @param[in] Xsiz image width * @param[in] Ysiz image height * @return decomposition level */ int comp_decomplev( int fw, int fh, int Xsiz, int Ysiz); /** * print image region parameters * * @param[in] imgreg image region structure of parameters */ void print_imgreg( imgreg_param_t imgreg); #endif /* !IMGREG_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/byte_manager.h0000644000175000017500000001003112315002075023737 0ustar mathieumathieu/* * $Id: byte_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 BYTE_MANAGER_H_ #define BYTE_MANAGER_H_ #include "opj_config.h" #ifdef HAVE_STDINT_H #include typedef uint8_t Byte_t; typedef uint16_t Byte2_t; typedef uint32_t Byte4_t; typedef uint64_t Byte8_t; #else #if defined(_WIN32) /** 1Byte parameter type*/ typedef unsigned __int8 Byte_t; /** 2Byte parameter type*/ typedef unsigned __int16 Byte2_t; /** 4Byte parameter type*/ typedef unsigned __int32 Byte4_t; /** 8Byte parameter type*/ typedef unsigned __int64 Byte8_t; #else #error unsupported platform #endif #endif /** * fetch bytes of data in file stream * * @param[in] fd file discriptor * @param[in] offset start Byte position * @param[in] size Byte length * @return pointer to the fetched data */ Byte_t * fetch_bytes( int fd, long offset, int size); /** * fetch a 1-byte Byte codes in file stream * * @param[in] fd file discriptor * @param[in] offset start Byte position * @return fetched codes */ Byte_t fetch_1byte( int fd, long offset); /** * fetch a 2-byte big endian Byte codes in file stream * * @param[in] fd file discriptor * @param[in] offset start Byte position * @return fetched codes */ Byte2_t fetch_2bytebigendian( int fd, long offset); /** * fetch a 4-byte big endian Byte codes in file stream * * @param[in] fd file discriptor * @param[in] offset start Byte position * @return fetched codes */ Byte4_t fetch_4bytebigendian( int fd, long offset); /** * fetch a 8-byte big endian Byte codes in file stream * * @param[in] fd file discriptor * @param[in] offset start Byte position * @return fetched codes */ Byte8_t fetch_8bytebigendian( int fd, long offset); /** * convert 2-byte big endian Byte codes to number * * @param[in] buf Byte codes * @return resolved number */ Byte2_t big2( Byte_t *buf); /** * convert 4-byte big endian Byte codes to number * * @param[in] buf Byte codes * @return resolved number */ Byte4_t big4( Byte_t *buf); /** * convert 8-byte big endian Byte codes to number * * @param[in] buf Byte codes * @return resolved number */ Byte8_t big8( Byte_t *buf); /** * modify 4Byte code in a codestream * * @param[in] code code value * @param[out] stream modifying codestream */ void modify_4Bytecode( Byte4_t code, Byte_t *stream); /** * Get file size * * @param[in] fd file discriptor * @return file size */ Byte8_t get_filesize( int fd); #endif /* !BYTE_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/marker_manager.h0000644000175000017500000000636112315002075024270 0ustar mathieumathieu/* * $Id: marker_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 MARKER_MANAGER_H_ # define MARKER_MANAGER_H_ #include "codestream_manager.h" /** Marker parameters*/ typedef struct marker_param{ codestream_param_t cs; /**< corresponding codestream*/ Byte2_t code; /**< marker code*/ Byte8_t offset; /**< offset relative to the start of the codestream ( including the length parameter but not the marker itself)*/ Byte2_t length; /**< marker segment length*/ } marker_param_t; /** * set marker parameters from inputs * * @param[in] cs marker code * @param[in] code marker code * @param[in] offset offset in the codestream * @param[in] length marker segment length * @return structure of generated marker parameters */ marker_param_t set_marker( codestream_param_t cs, Byte2_t code, Byte8_t offset, Byte2_t length); /** * fetch marker content 1-bytes of data in file stream * * @param[in] marker marker structure * @param[in] offset start Byte position in marker * @param[in] size Byte length * @return fetched code */ Byte_t fetch_marker1byte( marker_param_t marker, long offset); /** * fetch marker content 2-byte big endian Byte codes in file stream * * @param[in] marker marker structure * @param[in] offset start Byte position in marker * @return fetched code */ Byte2_t fetch_marker2bytebigendian( marker_param_t marker, long offset); /** * fetch marker content 4-byte big endian Byte codes in file stream * * @param[in] marker marker structure * @param[in] offset start Byte position in marker * @return fetched code */ Byte4_t fetch_marker4bytebigendian( marker_param_t marker, long offset); #endif /* !MARKER_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/ihdrbox_manager.c0000644000175000017500000000513212315002075024434 0ustar mathieumathieu/* * $Id: ihdrbox_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "ihdrbox_manager.h" ihdrbox_param_t * gene_ihdrbox( metadatalist_param_t *metadatalist, Byte_t *jpipstream) { ihdrbox_param_t *ihdrbox; metadata_param_t *meta; box_param_t *jp2h, *ihdr; jp2h = NULL; meta = metadatalist->first; while( meta){ if( meta->boxlist){ jp2h = search_box( "jp2h", meta->boxlist); if( jp2h) break; } meta = meta->next; } if( !jp2h){ fprintf( stderr, "jp2h box not found\n"); return NULL; } ihdr = gene_boxbyTypeinStream( jpipstream, get_DBoxoff( jp2h), get_DBoxlen( jp2h), "ihdr"); if( !ihdr){ fprintf( stderr, "ihdr box not found\n"); return NULL; } ihdrbox = (ihdrbox_param_t *)malloc( sizeof(ihdrbox_param_t)); ihdrbox->height = big4( jpipstream+get_DBoxoff(ihdr)); ihdrbox->width = big4( jpipstream+get_DBoxoff(ihdr)+4); ihdrbox->nc = big2( jpipstream+get_DBoxoff(ihdr)+8); ihdrbox->bpc = *(jpipstream+get_DBoxoff(ihdr)+10)+1; free( ihdr); return ihdrbox; } openjpeg-1.5.2/applications/jpip/libopenjpip/index_manager.h0000644000175000017500000001661312315002075024117 0ustar mathieumathieu/* * $Id: index_manager.h 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 INDEX_MANAGER_H_ # define INDEX_MANAGER_H_ #include "byte_manager.h" #include "faixbox_manager.h" #include "metadata_manager.h" #include "mhixbox_manager.h" #include "bool.h" /** progression order */ typedef enum porder { PROG_UNKNOWN = -1, /**< place-holder */ LRCP = 0, /**< layer-resolution-component-precinct order */ RLCP = 1, /**< resolution-layer-component-precinct order */ RPCL = 2, /**< resolution-precinct-component-layer order */ PCRL = 3, /**< precinct-component-resolution-layer order */ CPRL = 4 /**< component-precinct-resolution-layer order */ } porder_t; /** A.5.1 Image and tile size (SIZ)*/ typedef struct SIZmarker_param{ Byte2_t Lsiz; /**< length of marker segment excluding the marker*/ Byte2_t Rsiz; /**< capabilities that a decoder needs*/ Byte4_t Xsiz; /**< width of the reference grid*/ Byte4_t Ysiz; /**< height of the reference grid*/ Byte4_t XOsiz; /**< horizontal offset from the origin of the reference grid to the left side of the image area*/ Byte4_t YOsiz; /**< vertical offset from the origin of the reference grid to the top side of the image area*/ Byte4_t XTsiz; /**< width of one reference tile with respect to the reference grid*/ Byte4_t YTsiz; /**< height of one reference tile with respect to the reference grid*/ Byte4_t XTOsiz; /**< horizontal offset from the origin of the reference grid to the left side of the first tile*/ Byte4_t YTOsiz; /**< vertical offset from the origin of the reference grid to the top side of the first tile*/ Byte4_t XTnum; /**< number of tiles in horizontal direction*/ Byte4_t YTnum; /**< number of tiles in vertical direction*/ Byte2_t Csiz; /**< number of the components in the image*/ Byte_t Ssiz[3]; /**< precision (depth) in bits and sign of the component samples*/ Byte_t XRsiz[3]; /**< horizontal separation of a sample of component with respect to the reference grid*/ Byte_t YRsiz[3]; /**< vertical separation of a sample of component with respect to the reference grid*/ } SIZmarker_param_t; /** A.6.1 Coding style default (COD)*/ typedef struct CODmarker_param{ Byte2_t Lcod; /**< length of marker segment excluding the marker*/ Byte_t Scod; /**< Coding style for all components*/ porder_t prog_order; /**< progression order*/ Byte2_t numOflayers; /**< number of layers*/ Byte_t numOfdecomp; /**< number of decompositions levels*/ Byte4_t *XPsiz; /**< dynamic array of precinct width at successive resolution level in order*/ Byte4_t *YPsiz; /**< dynamic array of precinct height at successive resolution level in order*/ } CODmarker_param_t; /** index parameters*/ typedef struct index_param{ metadatalist_param_t *metadatalist; /**< metadata-bin list*/ Byte8_t offset; /**< codestream offset*/ Byte8_t length; /**< codestream length */ Byte8_t mhead_length; /**< main header length */ SIZmarker_param_t SIZ; /**< SIZ marker information*/ CODmarker_param_t COD; /**< COD marker information*/ faixbox_param_t *tilepart; /**< tile part information from tpix box*/ mhixbox_param_t **tileheader; /**< dynamic array of tile header information from thix box*/ faixbox_param_t **precpacket; /**< dynamic array of precint packet information from ppix box*/ } index_param_t; /** * parse JP2 file * AnnexI: Indexing JPEG2000 files for JPIP * * @param[in] fd file descriptor of the JP2 file * @return pointer to the generated structure of index parameters */ index_param_t * parse_jp2file( int fd); /** * print index parameters * * @param[in] index index parameters */ void print_index( index_param_t index); /** * print Image and Tile SIZ parameters * * @param[in] SIZ SIZ marker information */ void print_SIZ( SIZmarker_param_t SIZ); /** * print Coding style default COD parameters * * @param[in] COD COD marker information */ void print_COD( CODmarker_param_t COD); /** * delete index * * @param[in,out] index addressof the index pointer */ void delete_index( index_param_t **index); /** * delete dynamic arrays in COD marker * * @param[in] COD COD marker information */ void delete_COD( CODmarker_param_t COD); /** 1-dimensional range parameters*/ typedef struct range_param{ Byte4_t minvalue; /**< minimal value*/ Byte4_t maxvalue; /**< maximal value*/ } range_param_t; /** * get horizontal range of the tile in reference grid * * @param[in] SIZ SIZ marker information * @param[in] tile_id tile id * @param[in] level decomposition level * @return structured range parameter */ range_param_t get_tile_Xrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level); /** * get vertical range of the tile in reference grid * * @param[in] SIZ SIZ marker information * @param[in] tile_id tile id * @param[in] level decomposition level * @return structured range parameter */ range_param_t get_tile_Yrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level); /** * get tile wdith at the decomposition level * * @param[in] SIZ SIZ marker information * @param[in] tile_id tile id * @param[in] level decomposition level * @return tile width */ Byte4_t get_tile_XSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level); Byte4_t get_tile_YSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level); /** * answers if the target is feasible to JPT-stream * * @param[in] index index parameters * @return true if JPT-stream is feasible */ bool isJPTfeasible( index_param_t index); #endif /* !INDEX_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/cache_manager.h0000644000175000017500000001217312315002075024050 0ustar mathieumathieu/* * $Id: cache_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 CACHE_MANAGER_H_ # define CACHE_MANAGER_H_ #include "metadata_manager.h" #include "ihdrbox_manager.h" /** cache parameters*/ typedef struct cache_param{ char *filename; /**< file name*/ char *tid; /**< taregt identifier*/ int csn; /**< codestream number*/ char **cid; /**< dynamic array of channel identifiers*/ int numOfcid; /**< number of cids*/ metadatalist_param_t *metadatalist; /**< metadata-bin list*/ ihdrbox_param_t *ihdrbox; /**< ihdrbox*/ struct cache_param *next; /**< pointer to the next cache*/ } cache_param_t; /**< cache list parameters*/ typedef struct cachelist_param{ cache_param_t *first; /**< first cache pointer of the list*/ cache_param_t *last; /**< last cache pointer of the list*/ } cachelist_param_t; /** * generate a cache list * * @return pointer to the generated cache list */ cachelist_param_t * gene_cachelist(); /** * delete cache list * * @param[in,out] cachelist address of the cache list pointer */ void delete_cachelist(cachelist_param_t **cachelist); /** * generate a cache * * @param[in] targetname target file name * @param[in] csn codestream number * @param[in] tid target identifier * @param[in] cid channel identifier * @return pointer to the generated cache */ cache_param_t * gene_cache( char *targetname, int csn, char *tid, char *cid); /** * delete a cache * * @param[in] cache address of the cache pointer */ void delete_cache( cache_param_t **cache); /** * insert a cache into list * * @param[in] cache cache pointer * @param[in] cachelist cache list pointer */ void insert_cache_into_list( cache_param_t *cache, cachelist_param_t *cachelist); /** * search a cache by target name * * @param[in] targetname target filename * @param[in] cachelist cache list pointer * @return found cache pointer */ cache_param_t * search_cache( char targetname[], cachelist_param_t *cachelist); /** * search a cache by csn * * @param[in] csn codestream number * @param[in] cachelist cache list pointer * @return found cache pointer */ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist); /** * search a cache by cid * * @param[in] cid channel identifer * @param[in] cachelist cache list pointer * @return found cache pointer */ cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist); /** * search a cache by tid * * @param[in] tid target identifer * @param[in] cachelist cache list pointer * @return found cache pointer */ cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist); /** * add cid into a cache * * @param[in] cid channel identifier * @param[in] cache cache pointer */ void add_cachecid( char *cid, cache_param_t *cache); /** * update tid of a cache * * @param[in] tid target identifier * @param[in] cache cache pointer */ void update_cachetid( char *tid, cache_param_t *cache); /** * remove cid in cache * * @param[in] cid channel identifier * @param[in] cachelist cachelist pointer */ void remove_cachecid( char *cid, cachelist_param_t *cachelist); /** * print cache parameters * * @param[in] cache cache pointer */ void print_cache( cache_param_t *cache); /** * print all cache parameters * * @param[in] cachelist cache list pointer */ void print_allcache( cachelist_param_t *cachelist); #endif /* !CACHE_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/jpipstream_manager.c0000644000175000017500000000717512315002075025164 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "jpipstream_manager.h" #include "jp2k_encoder.h" #include "jp2k_decoder.h" #include "ihdrbox_manager.h" #include "j2kheader_manager.h" Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_stream, int *streamlen) { Byte_t *stream = (Byte_t *)malloc( (*streamlen)+newstreamlen); if( *streamlen > 0) memcpy( stream, cache_stream, *streamlen); memcpy( stream+(*streamlen), newstream, newstreamlen); *streamlen += newstreamlen; if(cache_stream) free( cache_stream); return stream; } void save_codestream( Byte_t *codestream, Byte8_t streamlen, const char *fmt) { time_t timer; struct tm *t_st; char filename[20]; FILE *fp; time(&timer); t_st = localtime( &timer); sprintf( filename, "%4d%02d%02d%02d%02d%02d.%.3s", t_st->tm_year+1900, t_st->tm_mon+1, t_st->tm_mday, t_st->tm_hour, t_st->tm_min, t_st->tm_sec, fmt); fp = fopen( filename, "wb"); if( fwrite( codestream, streamlen, 1, fp) != 1) fprintf( stderr, "Error: failed to write codestream to file %s\n", filename); fclose( fp); } Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox) { Byte_t *pnmstream; Byte_t *j2kstream; /* j2k or jp2 codestream */ Byte8_t j2klen; j2kstream = recons_j2k( msgqueue, jpipstream, csn, fw, fh, &j2klen); pnmstream = j2k_to_pnm( j2kstream, j2klen, ihdrbox); free( j2kstream); return pnmstream; } ihdrbox_param_t * get_SIZ_from_jpipstream( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn) { ihdrbox_param_t *ihdrbox; Byte_t *j2kstream; Byte8_t j2klen; SIZmarker_param_t SIZ; j2kstream = recons_j2kmainhead( msgqueue, jpipstream, csn, &j2klen); if( !get_mainheader_from_j2kstream( j2kstream, &SIZ, NULL)){ free( j2kstream); return NULL; } ihdrbox = (ihdrbox_param_t *)malloc( sizeof(ihdrbox_param_t)); ihdrbox->width = SIZ.Xsiz; ihdrbox->height = SIZ.Ysiz; ihdrbox->nc = SIZ.Csiz; ihdrbox->bpc = SIZ.Ssiz[0]; free( j2kstream); return ihdrbox; } openjpeg-1.5.2/applications/jpip/libopenjpip/msgqueue_manager.c0000644000175000017500000004756512315002075024650 0ustar mathieumathieu/* * $Id: msgqueue_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 #ifdef _WIN32 #include #else #include #endif #include "msgqueue_manager.h" #include "metadata_manager.h" #include "index_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel) { msgqueue_param_t *msgqueue; msgqueue = (msgqueue_param_t *)malloc( sizeof(msgqueue_param_t)); msgqueue->first = NULL; msgqueue->last = NULL; msgqueue->stateless = stateless; msgqueue->cachemodel = cachemodel; return msgqueue; } void delete_msgqueue( msgqueue_param_t **msgqueue) { message_param_t *ptr, *next; if( !(*msgqueue)) return; ptr = (*msgqueue)->first; while( ptr){ next = ptr->next; free( ptr); ptr = next; } if( (*msgqueue)->stateless && (*msgqueue)->cachemodel) delete_cachemodel( &((*msgqueue)->cachemodel)); free(*msgqueue); } void print_msgqueue( msgqueue_param_t *msgqueue) { message_param_t *ptr; char *message_class[] = { "Precinct", "Ext-Prec", "TileHead", "non", "Tile", "Ext-Tile", "Main", "non", "Meta"}; if( !msgqueue) return; fprintf( logstream, "message queue:\n"); ptr = msgqueue->first; while( ptr){ fprintf( logstream, "\t class_id: %lld %s\n", ptr->class_id, message_class[ptr->class_id]); fprintf( logstream, "\t in_class_id: %lld\n", ptr->in_class_id ); fprintf( logstream, "\t csn: %lld\n", ptr->csn ); fprintf( logstream, "\t bin_offset: %#llx\n", ptr->bin_offset ); fprintf( logstream, "\t length: %#llx\n", ptr->length ); if( ptr->class_id%2) fprintf( logstream, "\t aux: %lld\n", ptr->aux ); fprintf( logstream, "\t last_byte: %d\n", ptr->last_byte ); if( ptr->phld) print_placeholder( ptr->phld); else fprintf( logstream, "\t res_offset: %#llx\n", ptr->res_offset ); fprintf( logstream, "\n"); ptr = ptr->next; } } void enqueue_message( message_param_t *msg, msgqueue_param_t *msgqueue); void enqueue_mainheader( msgqueue_param_t *msgqueue) { cachemodel_param_t *cachemodel; target_param_t *target; index_param_t *codeidx; message_param_t *msg; cachemodel = msgqueue->cachemodel; target = cachemodel->target; codeidx = target->codeidx; msg = (message_param_t *)malloc( sizeof(message_param_t)); msg->last_byte = true; msg->in_class_id = 0; msg->class_id = MAINHEADER_MSG; msg->csn = target->csn; msg->bin_offset = 0; msg->length = codeidx->mhead_length; msg->aux = 0; /* non exist*/ msg->res_offset = codeidx->offset; msg->phld = NULL; msg->next = NULL; enqueue_message( msg, msgqueue); cachemodel->mhead_model = true; } void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue) { cachemodel_param_t *cachemodel; target_param_t *target; index_param_t *codeidx; message_param_t *msg; cachemodel = msgqueue->cachemodel; target = cachemodel->target; codeidx = target->codeidx; if( !cachemodel->th_model[ tile_id]){ msg = (message_param_t *)malloc( sizeof(message_param_t)); msg->last_byte = true; msg->in_class_id = tile_id; msg->class_id = TILE_HEADER_MSG; msg->csn = target->csn; msg->bin_offset = 0; msg->length = codeidx->tileheader[tile_id]->tlen-2; /* SOT marker segment is removed*/ msg->aux = 0; /* non exist*/ msg->res_offset = codeidx->offset + get_elemOff( codeidx->tilepart, 0, tile_id) + 2; /* skip SOT marker seg*/ msg->phld = NULL; msg->next = NULL; enqueue_message( msg, msgqueue); cachemodel->th_model[ tile_id] = true; } } void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue) { cachemodel_param_t *cachemodel; target_param_t *target; bool *tp_model; Byte8_t numOftparts; /* num of tile parts par tile*/ Byte8_t numOftiles; index_param_t *codeidx; faixbox_param_t *tilepart; message_param_t *msg; Byte8_t binOffset, binLength, class_id; int i; cachemodel = msgqueue->cachemodel; target = cachemodel->target; codeidx = target->codeidx; tilepart = codeidx->tilepart; numOftparts = get_nmax( tilepart); numOftiles = get_m( tilepart); class_id = (numOftparts==1) ? TILE_MSG : EXT_TILE_MSG; if( tile_id < 0 || (int)numOftiles <= tile_id){ fprintf( FCGI_stderr, "Error, Invalid tile-id %d\n", tile_id); return; } tp_model = &cachemodel->tp_model[ tile_id*numOftparts]; binOffset=0; for( i=0; i<(int)numOftparts-level; i++){ binLength = get_elemLen( tilepart, i, tile_id); if( !tp_model[i]){ msg = (message_param_t *)malloc( sizeof(message_param_t)); msg->last_byte = (i==(int)numOftparts-1); msg->in_class_id = tile_id; msg->class_id = class_id; msg->csn = target->csn; msg->bin_offset = binOffset; msg->length = binLength; msg->aux = numOftparts-i; msg->res_offset = codeidx->offset+get_elemOff( tilepart, i, tile_id)/*-1*/; msg->phld = NULL; msg->next = NULL; enqueue_message( msg, msgqueue); tp_model[i] = true; } binOffset += binLength; } } void enqueue_precinct( int seq_id, int tile_id, int comp_id, int layers, msgqueue_param_t *msgqueue) { cachemodel_param_t *cachemodel; index_param_t *codeidx; faixbox_param_t *precpacket; message_param_t *msg; Byte8_t nmax, binOffset, binLength; int layer_id, numOflayers; cachemodel = msgqueue->cachemodel; codeidx = cachemodel->target->codeidx; precpacket = codeidx->precpacket[ comp_id]; numOflayers = codeidx->COD.numOflayers; nmax = get_nmax(precpacket); if( layers < 0) layers = numOflayers; binOffset = 0; for( layer_id = 0; layer_id < layers; layer_id++){ binLength = get_elemLen( precpacket, seq_id*numOflayers+layer_id, tile_id); if( !cachemodel->pp_model[comp_id][ tile_id*nmax+seq_id*numOflayers+layer_id]){ msg = (message_param_t *)malloc( sizeof(message_param_t)); msg->last_byte = (layer_id == (numOflayers-1)); msg->in_class_id = comp_precinct_id( tile_id, comp_id, seq_id, codeidx->SIZ.Csiz, codeidx->SIZ.XTnum * codeidx->SIZ.YTnum); msg->class_id = PRECINCT_MSG; msg->csn = cachemodel->target->csn; msg->bin_offset = binOffset; msg->length = binLength; msg->aux = 0; msg->res_offset = codeidx->offset+get_elemOff( precpacket, seq_id*numOflayers+layer_id, tile_id); msg->phld = NULL; msg->next = NULL; enqueue_message( msg, msgqueue); cachemodel->pp_model[comp_id][ tile_id*nmax+seq_id*numOflayers+layer_id] = true; } binOffset += binLength; } } Byte8_t comp_precinct_id( int t, int c, int s, int num_components, int num_tiles) { return t + (c + s * num_components ) * num_tiles; } void enqueue_box( int meta_id, boxlist_param_t *boxlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset); void enqueue_phld( int meta_id, placeholderlist_param_t *phldlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset); void enqueue_boxcontents( int meta_id, boxcontents_param_t *boxcontents, msgqueue_param_t *msgqueue, Byte8_t *binOffset); void enqueue_metadata( int meta_id, msgqueue_param_t *msgqueue) { metadatalist_param_t *metadatalist; metadata_param_t *metadata; Byte8_t binOffset; metadatalist = msgqueue->cachemodel->target->codeidx->metadatalist; metadata = search_metadata( meta_id, metadatalist); if( !metadata){ fprintf( FCGI_stderr, "Error: metadata-bin %d not found\n", meta_id); return; } binOffset = 0; if( metadata->boxlist) enqueue_box( meta_id, metadata->boxlist, msgqueue, &binOffset); if( metadata->placeholderlist) enqueue_phld( meta_id, metadata->placeholderlist, msgqueue, &binOffset); if( metadata->boxcontents) enqueue_boxcontents( meta_id, metadata->boxcontents, msgqueue, &binOffset); msgqueue->last->last_byte = true; } message_param_t * gene_metamsg( int meta_id, Byte8_t binoffset, Byte8_t length, Byte8_t res_offset, placeholder_param_t *phld, Byte8_t csn); void enqueue_box( int meta_id, boxlist_param_t *boxlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset) { box_param_t *box; message_param_t *msg; box = boxlist->first; while( box){ msg = gene_metamsg( meta_id, *binOffset, box->length, box->offset, NULL, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += box->length; box = box->next; } } void enqueue_phld( int meta_id, placeholderlist_param_t *phldlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset) { placeholder_param_t *phld; message_param_t *msg; phld = phldlist->first; while( phld){ msg = gene_metamsg( meta_id, *binOffset, phld->LBox, 0, phld, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += phld->LBox; phld = phld->next; } } void enqueue_boxcontents( int meta_id, boxcontents_param_t *boxcontents, msgqueue_param_t *msgqueue, Byte8_t *binOffset) { message_param_t *msg; msg = gene_metamsg( meta_id, *binOffset, boxcontents->length, boxcontents->offset, NULL, msgqueue->cachemodel->target->csn); enqueue_message( msg, msgqueue); *binOffset += boxcontents->length; } message_param_t * gene_metamsg( int meta_id, Byte8_t binOffset, Byte8_t length, Byte8_t res_offset, placeholder_param_t *phld, Byte8_t csn) { message_param_t *msg; msg = (message_param_t *)malloc( sizeof(message_param_t)); msg->last_byte = false; msg->in_class_id = meta_id; msg->class_id = METADATA_MSG; msg->csn = csn; msg->bin_offset = binOffset; msg->length = length; msg->aux = 0; /* non exist*/ msg->res_offset = res_offset; msg->phld = phld; msg->next = NULL; return msg; } void enqueue_message( message_param_t *msg, msgqueue_param_t *msgqueue) { if( msgqueue->first) msgqueue->last->next = msg; else msgqueue->first = msg; msgqueue->last = msg; } void add_bin_id_vbas_stream( Byte_t bb, Byte_t c, Byte8_t in_class_id, int tmpfd); void add_vbas_stream( Byte8_t code, int tmpfd); void add_body_stream( message_param_t *msg, int fd, int tmpfd); void add_placeholder_stream( placeholder_param_t *phld, int tmpfd); void recons_stream_from_msgqueue( msgqueue_param_t *msgqueue, int tmpfd) { message_param_t *msg; Byte8_t class_id, csn; Byte_t bb, c; if( !(msgqueue)) return; msg = msgqueue->first; class_id = -1; csn = -1; while( msg){ if( msg->csn == csn){ if( msg->class_id == class_id) bb = 1; else{ bb = 2; class_id = msg->class_id; } } else{ bb = 3; class_id = msg->class_id; csn = msg->csn; } c = msg->last_byte ? 1 : 0; add_bin_id_vbas_stream( bb, c, msg->in_class_id, tmpfd); if( bb >= 2) add_vbas_stream( class_id, tmpfd); if (bb == 3) add_vbas_stream( csn, tmpfd); add_vbas_stream( msg->bin_offset, tmpfd); add_vbas_stream (msg->length, tmpfd); if( msg->class_id%2) /* Aux is present only if the id is odd*/ add_vbas_stream( msg->aux, tmpfd); if( msg->phld) add_placeholder_stream( msg->phld, tmpfd); else add_body_stream( msg, msgqueue->cachemodel->target->fd, tmpfd); msg = msg->next; } } void add_vbas_with_bytelen_stream( Byte8_t code, int bytelength, int tmpfd); void print_binarycode( Byte8_t n, int segmentlen); void add_bin_id_vbas_stream( Byte_t bb, Byte_t c, Byte8_t in_class_id, int tmpfd) { int bytelength; Byte8_t tmp; /* A.2.3 In-class identifiers */ /* 7k-3bits, where k is the number of bytes in the VBAS*/ bytelength = 1; tmp = in_class_id >> 4; while( tmp){ bytelength ++; tmp >>= 7; } in_class_id |= (((bb & 3) << 5) | (c & 1) << 4) << ((bytelength-1)*7); add_vbas_with_bytelen_stream( in_class_id, bytelength, tmpfd); } void add_vbas_stream( Byte8_t code, int tmpfd) { int bytelength; Byte8_t tmp; bytelength = 1; tmp = code; while( tmp >>= 7) bytelength ++; add_vbas_with_bytelen_stream( code, bytelength, tmpfd); } void add_vbas_with_bytelen_stream( Byte8_t code, int bytelength, int tmpfd) { int n; Byte8_t seg; n = bytelength - 1; while( n >= 0) { seg = ( code >> (n*7)) & 0x7f; if( n) seg |= 0x80; if( write( tmpfd, ( Byte4_t *)&seg, 1) != 1){ fprintf( FCGI_stderr, "Error: failed to write vbas\n"); return; } n--; } } void add_body_stream( message_param_t *msg, int fd, int tmpfd) { Byte_t *data; if( !(data = fetch_bytes( fd, msg->res_offset, msg->length))){ fprintf( FCGI_stderr, "Error: fetch_bytes in add_body_stream()\n"); return; } if( write( tmpfd, data, msg->length) < 1){ free( data); fprintf( FCGI_stderr, "Error: fwrite in add_body_stream()\n"); return; } free(data); } void add_bigendian_bytestream( Byte8_t code, int bytelength, int tmpfd); void add_placeholder_stream( placeholder_param_t *phld, int tmpfd) { add_bigendian_bytestream( phld->LBox, 4, tmpfd); if( write( tmpfd, phld->TBox, 4) < 1){ fprintf( FCGI_stderr, "Error: fwrite in add_placeholder_stream()\n"); return; } add_bigendian_bytestream( phld->Flags, 4, tmpfd); add_bigendian_bytestream( phld->OrigID, 8, tmpfd); if( write( tmpfd, phld->OrigBH, phld->OrigBHlen) < 1){ fprintf( FCGI_stderr, "Error: fwrite in add_placeholder_stream()\n"); return; } } void add_bigendian_bytestream( Byte8_t code, int bytelength, int tmpfd) { int n; Byte8_t seg; n = bytelength - 1; while( n >= 0) { seg = ( code >> (n*8)) & 0xff; if( write( tmpfd, ( Byte4_t *)&seg, 1) != 1){ fprintf( FCGI_stderr, "ERROR: failed to write bigendian_bytestream\n"); return; } n--; } } void print_binarycode( Byte8_t n, int segmentlen) { char buf[256]; int i=0, j, k; do{ buf[i++] = n%2 ? '1' : '0'; }while((n=n/2)); for( j=segmentlen-1; j>=i; j--) putchar('0'); for( j=i-1, k=0; j>=0; j--, k++){ putchar( buf[j]); if( !((k+1)%segmentlen)) printf(" "); } printf("\n"); } Byte_t * parse_bin_id_vbas( Byte_t *streamptr, Byte_t *bb, Byte_t *c, Byte8_t *in_class_id); Byte_t * parse_vbas( Byte_t *streamptr, Byte8_t *elem); void parse_JPIPstream( Byte_t *JPIPstream, Byte8_t streamlen, Byte8_t offset, msgqueue_param_t *msgqueue) { Byte_t *ptr; /* stream pointer*/ message_param_t *msg; Byte_t bb, c; Byte8_t class_id, csn; class_id = -1; /* dummy*/ csn = -1; ptr = JPIPstream; while( (Byte8_t)(ptr-JPIPstream) < streamlen){ msg = (message_param_t *)malloc( sizeof(message_param_t)); ptr = parse_bin_id_vbas( ptr, &bb, &c, &msg->in_class_id); msg->last_byte = c == 1 ? true : false; if( bb >= 2) ptr = parse_vbas( ptr, &class_id); msg->class_id = class_id; if (bb == 3) ptr = parse_vbas( ptr, &csn); msg->csn = csn; ptr = parse_vbas( ptr, &msg->bin_offset); ptr = parse_vbas( ptr, &msg->length); if( msg->class_id%2) /* Aux is present only if the id is odd*/ ptr = parse_vbas( ptr, &msg->aux); else msg->aux = 0; msg->res_offset = ptr-JPIPstream+offset; msg->phld = NULL; msg->next = NULL; if(msgqueue->first) msgqueue->last->next = msg; else msgqueue->first = msg; msgqueue->last = msg; ptr += msg->length; } } void parse_metadata( metadata_param_t *metadata, message_param_t *msg, Byte_t *stream); void parse_metamsg( msgqueue_param_t *msgqueue, Byte_t *stream, Byte8_t streamlen, metadatalist_param_t *metadatalist) { message_param_t *msg; (void)streamlen; if( metadatalist == NULL) return; msg = msgqueue->first; while( msg){ if( msg->class_id == METADATA_MSG){ metadata_param_t *metadata = gene_metadata( msg->in_class_id, NULL, NULL, NULL); insert_metadata_into_list( metadata, metadatalist); parse_metadata( metadata, msg, stream+msg->res_offset); } msg = msg->next; } } placeholder_param_t * parse_phld( Byte_t *datastream, Byte8_t metalength); void parse_metadata( metadata_param_t *metadata, message_param_t *msg, Byte_t *datastream) { box_param_t *box; placeholder_param_t *phld; char *boxtype = (char *)(datastream+4); msg->phld = NULL; if( strncmp( boxtype, "phld", 4) == 0){ if( !metadata->placeholderlist) metadata->placeholderlist = gene_placeholderlist(); phld = parse_phld( datastream, msg->length); msg->phld = phld; insert_placeholder_into_list( phld, metadata->placeholderlist); } else if( isalpha(boxtype[0]) && isalpha(boxtype[1]) && (isalnum(boxtype[2])||isspace(boxtype[2])) && (isalpha(boxtype[3])||isspace(boxtype[3]))){ if( !metadata->boxlist) metadata->boxlist = gene_boxlist(); box = gene_boxbyOffinStream( datastream, msg->res_offset); insert_box_into_list( box, metadata->boxlist); } else metadata->boxcontents = gene_boxcontents( msg->res_offset, msg->length); } placeholder_param_t * parse_phld( Byte_t *datastream, Byte8_t metalength) { placeholder_param_t *phld; phld = (placeholder_param_t *)malloc( sizeof(placeholder_param_t)); phld->LBox = big4( datastream); strncpy( phld->TBox, "phld", 4); phld->Flags = big4( datastream+8); phld->OrigID = big8( datastream+12); phld->OrigBHlen = metalength - 20; phld->OrigBH = (Byte_t *)malloc(phld->OrigBHlen); memcpy( phld->OrigBH, datastream+20, phld->OrigBHlen); phld->next = NULL; return phld; } Byte_t * parse_bin_id_vbas( Byte_t *streamptr, Byte_t *bb, Byte_t *c, Byte8_t *in_class_id) { Byte_t code; Byte_t *ptr; ptr = streamptr; code = *(ptr++); *bb = (code >> 5) & 3; *c = (code >> 4) & 1; *in_class_id = code & 15; while(code >> 7){ code = *(ptr++); *in_class_id = (*in_class_id << 7) | (code & 0x7f); } return ptr; } Byte_t * parse_vbas( Byte_t *streamptr, Byte8_t *elem) { Byte_t code; Byte_t *ptr; *elem = 0; ptr = streamptr; do{ code = *(ptr++); *elem = (*elem << 7) | (code & 0x7f); }while(code >> 7); return ptr; } void delete_message_in_msgqueue( message_param_t **msg, msgqueue_param_t *msgqueue) { message_param_t *ptr; if( !(*msg)) return; if( *msg == msgqueue->first) msgqueue->first = (*msg)->next; else{ ptr = msgqueue->first; while( ptr->next != *msg){ ptr=ptr->next; } ptr->next = (*msg)->next; if( *msg == msgqueue->last) msgqueue->last = ptr; } free( *msg); } openjpeg-1.5.2/applications/jpip/libopenjpip/imgreg_manager.c0000644000175000017500000001124612315002075024252 0ustar mathieumathieu/* * $Id: imgreg_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "imgreg_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ imgreg_param_t map_viewin2imgreg( const int fx, const int fy, const int rx, const int ry, const int rw, const int rh, const int XOsiz, const int YOsiz, const int Xsiz, const int Ysiz, const int numOfreslev) { imgreg_param_t imgreg; int px,py; int xmax, ymax; imgreg.xosiz = XOsiz; imgreg.yosiz = YOsiz; imgreg.fx = fx; imgreg.fy = fy; imgreg.level = 0; xmax = Xsiz; ymax = Ysiz; find_level( numOfreslev, &imgreg.level, &imgreg.fx, &imgreg.fy, &imgreg.xosiz, &imgreg.yosiz, &xmax, &ymax); if( rx == -1 || ry == -1){ imgreg.ox = 0; imgreg.oy = 0; } else{ imgreg.ox = rx*imgreg.fx/fx; imgreg.oy = ry*imgreg.fy/fy; } if( rw == -1 || rh == -1){ imgreg.sx = imgreg.fx; imgreg.sy = imgreg.fy; } else{ px = ceil((double)((rx+rw)*imgreg.fx)/(double)fx); py = ceil((double)((ry+rh)*imgreg.fy)/(double)fy); if( imgreg.fx < px) px = imgreg.fx; if( imgreg.fy < py) py = imgreg.fy; imgreg.sx = px - imgreg.ox; imgreg.sy = py - imgreg.oy; } if( fx != imgreg.fx || fy != imgreg.fy) fprintf( FCGI_stdout, "JPIP-fsiz: %d,%d\r\n", imgreg.fx, imgreg.fy); if( rw != imgreg.sx || rh != imgreg.sy) fprintf( FCGI_stdout, "JPIP-rsiz: %d,%d\r\n", imgreg.sx, imgreg.sy); if( rx != imgreg.ox || ry != imgreg.oy) fprintf( FCGI_stdout, "JPIP-roff: %d,%d\r\n", imgreg.ox, imgreg.oy); return imgreg; } void find_level( int maxlev, int *lev, int *fx, int *fy, int *xmin, int *ymin, int *xmax, int *ymax) { int xwidth = *xmax - *xmin; int ywidth = *ymax - *ymin; /* Find smaller frame size for now (i.e. assume "round-down"). */ if ((*fx < 1 && xwidth != 0) || (*fy < 1 && ywidth != 0)){ fprintf( FCGI_stderr, "Frame size must be strictly positive"); exit(-1); } else if( *lev < maxlev-1 && ( *fx < xwidth || *fy < ywidth)) { /* Simulate the ceil function. */ *xmin = ceil((double)*xmin/(double)2.0); *ymin = ceil((double)*ymin/(double)2.0); *xmax = ceil((double)*xmax/(double)2.0); *ymax = ceil((double)*ymax/(double)2.0); (*lev) ++; find_level ( maxlev, lev, fx, fy, xmin, ymin, xmax, ymax); } else { *fx = xwidth; *fy = ywidth; } } int comp_decomplev( int fw, int fh, int Xsiz, int Ysiz) { int level; int xmin, xmax, ymin, ymax; level = 0; xmin = ymin = 0; xmax = Xsiz; ymax = Ysiz; find_level( 1000, &level, &fw, &fh, &xmin, &ymin, &xmax, &ymax); return level; } void print_imgreg( imgreg_param_t imgreg) { #ifndef SERVER fprintf( logstream, "codestream image region:\n"); fprintf( logstream, "\t fsiz: %d, %d\n", imgreg.fx, imgreg.fy); fprintf( logstream, "\t roff: %d, %d\n", imgreg.ox, imgreg.oy); fprintf( logstream, "\t rsiz: %d, %d\n", imgreg.sx, imgreg.sy); fprintf( logstream, "\t level: %d\n", imgreg.level); #else (void)imgreg; #endif } openjpeg-1.5.2/applications/jpip/libopenjpip/jpip_parser.h0000644000175000017500000001122212315002075023623 0ustar mathieumathieu/* * $Id: jpip_parser.h 1103 2011-11-30 14:54:41Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 JPIP_PARSER_H_ # define JPIP_PARSER_H_ #include "bool.h" #include "query_parser.h" #include "session_manager.h" #include "target_manager.h" #include "msgqueue_manager.h" #include "channel_manager.h" /** * REQUEST: target identification by target or tid request * * @param[in] query_param structured query * @param[in] targetlist target list pointer * @param[out] target address of target pointer * @return if succeeded (true) or failed (false) */ bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target); /** * REQUEST: channel association * this must be processed before any process * * @param[in] query_param structured query * @param[in] sessionlist session list pointer * @param[out] cursession address of the associated session pointer * @param[out] curchannel address of the associated channel pointer * @return if succeeded (true) or failed (false) */ bool associate_channel( query_param_t query_param, sessionlist_param_t *sessionlist, session_param_t **cursession, channel_param_t **curchannel); /** * REQUEST: new channel (cnew) assignment * * @param[in] query_param structured query * @param[in] sessionlist session list pointer * @param[in] auxtrans auxiliary transport * @param[in] target requested target pointer * @param[in,out] cursession address of the associated/opened session pointer * @param[in,out] curchannel address of the associated/opened channel pointer * @return if succeeded (true) or failed (false) */ bool open_channel( query_param_t query_param, sessionlist_param_t *sessionlist, auxtrans_param_t auxtrans, target_param_t *target, session_param_t **cursession, channel_param_t **curchannel); /** * REQUEST: channel close (cclose) * * @param[in] query_param structured query * @param[in] sessionlist session list pointer * @param[in,out] cursession address of the session pointer of deleting channel * @param[in,out] curchannel address of the deleting channel pointer * @return if succeeded (true) or failed (false) */ bool close_channel( query_param_t query_param, sessionlist_param_t *sessionlist, session_param_t **cursession, channel_param_t **curchannel); /** * REQUEST: view-window (fsiz) * * @param[in] query_param structured query * @param[in] target requested target pointer * @param[in,out] cursession associated session pointer * @param[in,out] curchannel associated channel pointer * @param[out] msgqueue address of the message queue pointer * @return if succeeded (true) or failed (false) */ bool gene_JPIPstream( query_param_t query_param, target_param_t *target, session_param_t *cursession, channel_param_t *curchannel, msgqueue_param_t **msgqueue); #endif /* !JPIP_PARSER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/codestream_manager.h0000644000175000017500000000676112315002075025141 0ustar mathieumathieu/* * $Id: codestream_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 CODESTREAM_MANAGER_H_ # define CODESTREAM_MANAGER_H_ #include "byte_manager.h" /** codestream parameters*/ typedef struct codestream_param{ int fd; /**< file descriptor*/ Byte8_t offset; /**< byte position of DBox (Box Contents) in the file*/ Byte8_t length; /**< content length*/ } codestream_param_t; /** * set codestream parameters from inputs * * @param[in] fd file descriptor * @param[in] offset offset in the file * @param[in] length codestream length * @return structure of generated codestream parameters */ codestream_param_t set_codestream( int fd, Byte8_t offset, Byte8_t length); /** * fetch Codestream bytes of data in file stream * * @param[in] cs codestream pointer * @param[in] offset start Byte position in codestream * @param[in] size Byte length * @return pointer to the fetched data */ Byte_t * fetch_codestreambytes( codestream_param_t *cs, long offset, int size); /** * fetch Codestream 1-byte Byte code in file stream * * @param[in] cs codestream pointer * @param[in] offset start Byte position in codestream * @return fetched code */ Byte_t fetch_codestream1byte( codestream_param_t *cs, long offset); /** * fetch Codestream 2-byte big endian Byte codes in file stream * * @param[in] cs codestream pointer * @param[in] offset start Byte position in codestream * @return fetched code */ Byte2_t fetch_codestream2bytebigendian( codestream_param_t *cs, long offset); /** * fetch Codestream 4-byte big endian Byte codes in file stream * * @param[in] cs codestream pointer * @param[in] offset start Byte position in codestream * @return fetched code */ Byte4_t fetch_codestream4bytebigendian( codestream_param_t *cs, long offset); /** * print codestream parameters * * @param[in] cs codestream */ void print_codestream( codestream_param_t cs); #endif /* !CODESTREAM_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/ihdrbox_manager.h0000644000175000017500000000432712315002075024446 0ustar mathieumathieu/* * $Id: ihdrbox_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 IHDRBOX_MANAGER_H_ # define IHDRBOX_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" #include "metadata_manager.h" /** I.5.3.1 Image Header box*/ typedef struct ihdrbox_param{ Byte4_t height; Byte4_t width; Byte2_t nc; /**< number of components*/ Byte_t bpc; /**< bits per component*/ } ihdrbox_param_t; /** * generate ihdr box * * @param[in] metadatalist metadata list pointer * @param[in] jpipstream JPT/JPP stream * @return pointer to generated ihdr box */ ihdrbox_param_t * gene_ihdrbox( metadatalist_param_t *metadatalist, Byte_t *jpipstream); #endif /* !IHDRBOX_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/auxtrans_manager.h0000644000175000017500000000607612315002075024657 0ustar mathieumathieu/* * $Id: auxtrans_manager.h 1349 2012-01-30 08:44:05Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 AUXTRANS_MANAGER_H_ # define AUXTRANS_MANAGER_H_ #include "sock_manager.h" /** auxiliary transport setting parameters*/ typedef struct auxtrans_param{ int tcpauxport; /**< tcp port*/ int udpauxport; /**< udp port*/ SOCKET tcplistensock; /**< listenning socket for aux tcp (-1 if not open)*/ SOCKET udplistensock; /**< listenning socket for aux udp (-1 if not open)*/ } auxtrans_param_t; /** * Initialize auxiliary transport server of JPIP server * * @param[in] tcp_auxport opening tcp auxiliary port ( 0 not to open, valid No. 49152–65535) * @param[in] udp_auxport opening udp auxiliary port ( 0 not to open, valid No. 49152–65535) * @return intialized transport parameters */ auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport); /** * Close auxiliary transport server of JPIP server * * @param[in] auxtrans closing transport server */ void close_aux_transport( auxtrans_param_t auxtrans); /** * Send response data on aux transport * * @param[in] istcp true if tcp, false if udp * @param[in] auxtrans available transport parameters * @param[in] cid channel ID * @param[in] data sending data * @param[in] length length of data * @param[in] maxlenPerFrame maximum data length to send per frame */ void send_responsedata_on_aux( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int length, int maxlenPerFrame); #endif /* !AUXTRANS_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/CMakeLists.txt0000644000175000017500000000471012315002075023700 0ustar mathieumathieuINCLUDE_REGULAR_EXPRESSION("^.*$") INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ${FCGI_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ) # Defines the source code for the library SET(OPENJPIP_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/boxheader_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/codestream_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/imgreg_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/marker_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/msgqueue_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/box_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/faixbox_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/index_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/metadata_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/placeholder_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/byte_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/ihdrbox_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/manfbox_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/mhixbox_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/target_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/cachemodel_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/j2kheader_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/jp2k_encoder.c ${CMAKE_CURRENT_SOURCE_DIR}/openjpip.c ${CMAKE_CURRENT_SOURCE_DIR}/query_parser.c ${CMAKE_CURRENT_SOURCE_DIR}/channel_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/session_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/jpip_parser.c ${CMAKE_CURRENT_SOURCE_DIR}/sock_manager.c ) SET(SERVER_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/auxtrans_manager.c ) SET(LOCAL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/jp2k_decoder.c ${CMAKE_CURRENT_SOURCE_DIR}/imgsock_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/jpipstream_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/cache_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/dec_clientmsg_handler.c ) # Build the library ADD_LIBRARY(openjpip_local STATIC ${OPENJPIP_SRCS} ${LOCAL_SRCS}) TARGET_LINK_LIBRARIES(openjpip_local ${OPENJPEG_LIBRARY_NAME}) IF(WIN32) # add Winsock on windows+mingw TARGET_LINK_LIBRARIES(openjpip_local ws2_32) ENDIF(WIN32) # Install library INSTALL(TARGETS openjpip_local EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) IF(BUILD_JPIP_SERVER) ADD_LIBRARY(openjpip_server STATIC ${OPENJPIP_SRCS} ${SERVER_SRCS}) TARGET_LINK_LIBRARIES(openjpip_server ${FCGI_LIBRARIES} ${CURL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) SET_TARGET_PROPERTIES(openjpip_server PROPERTIES COMPILE_FLAGS "-DSERVER") INSTALL(TARGETS openjpip_server EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) ENDIF(BUILD_JPIP_SERVER) openjpeg-1.5.2/applications/jpip/libopenjpip/sock_manager.c0000644000175000017500000001107512315002075023737 0ustar mathieumathieu/* * $Id: sock_manager.c 1736 2012-07-29 15:21:39Z mathieu.malaterre@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ #ifdef _WIN32 #include #else #include #include #include #ifdef __FreeBSD__ #include #endif #include #endif #include #include #include #include "sock_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ SOCKET open_listeningsocket( int port) { SOCKET listening_socket; struct sockaddr_in sin; int sock_optval = 1; listening_socket = socket(AF_INET, SOCK_STREAM, 0); if ( listening_socket == -1 ){ perror("socket"); exit(1); } if ( setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&sock_optval, sizeof(sock_optval)) == -1 ){ perror("setsockopt"); exit(1); } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = htonl(INADDR_ANY); if ( bind(listening_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0 ){ perror("bind"); close_socket(listening_socket); exit(1); } if( listen(listening_socket, SOMAXCONN) == -1){ perror("listen"); close_socket(listening_socket); exit(1); } fprintf( FCGI_stderr, "port %d is listened\n", port); return listening_socket; } SOCKET accept_socket( SOCKET listening_socket) { struct sockaddr_in peer_sin; unsigned int addrlen = sizeof(peer_sin); return accept( listening_socket, (struct sockaddr *)&peer_sin, &addrlen); } void send_stream( SOCKET connected_socket, void *stream, int length) { char *ptr = (char*)stream; int remlen = length; while( remlen > 0){ int sentlen = send( connected_socket, ptr, remlen, 0); if( sentlen == -1){ fprintf( FCGI_stderr, "sending stream error\n"); break; } remlen = remlen - sentlen; ptr = ptr + sentlen; } } void * receive_stream( SOCKET connected_socket, int length) { char *stream, *ptr; int remlen, redlen; ptr = stream = malloc( length); remlen = length; while( remlen > 0){ redlen = recv( connected_socket, ptr, remlen, 0); if( redlen == -1){ fprintf( FCGI_stderr, "receive stream error\n"); free( stream); stream = NULL; break; } remlen -= redlen; ptr = ptr + redlen; } return stream; } int receive_line(SOCKET connected_socket, char *p) { int len = 0; while (1){ int ret; ret = recv( connected_socket, p, 1, 0); if ( ret == -1 ){ perror("receive"); exit(1); } else if ( ret == 0 ){ break; } if ( *p == '\n' ) break; p++; len++; } *p = '\0'; if( len == 0) fprintf( FCGI_stderr, "Header receive error\n"); return len; } char * receive_string( SOCKET connected_socket) { char buf[BUF_LEN]; receive_line( connected_socket, buf); return strdup(buf); } int close_socket( SOCKET sock) { #ifdef _WIN32 return closesocket( sock); #else return close( sock); #endif } openjpeg-1.5.2/applications/jpip/libopenjpip/target_manager.h0000644000175000017500000001203512315002075024270 0ustar mathieumathieu/* * $Id: target_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 TARGET_MANAGER_H_ # define TARGET_MANAGER_H_ #include "bool.h" #include "index_manager.h" /** maximum length of target identifier*/ #define MAX_LENOFTID 30 /** target parameters*/ typedef struct target_param{ char tid[MAX_LENOFTID]; /**< target identifier*/ char *targetname; /**< local file path or URL ( URL is suported only with SERVER mode)*/ int fd; /**< file descriptor*/ #ifdef SERVER char *tmpfname; /**< temporal file name to download a remote target file*/ #endif int csn; /**< codestream number */ index_param_t *codeidx; /**< index information of codestream */ int num_of_use; /**< numbers of sessions refering to this target */ bool jppstream; /**< if this target can return JPP-stream */ bool jptstream; /**< if this target can return JPP-stream */ struct target_param *next; /**< pointer to the next target */ } target_param_t; /** Target list parameters*/ typedef struct targetlist_param{ target_param_t *first; /**< first target pointer of the list*/ target_param_t *last; /**< last target pointer of the list*/ } targetlist_param_t; /** * generate a target list * * @return pointer to the generated target list */ targetlist_param_t * gene_targetlist(void); /** * generate a target * * @param[in] targetlist target list to insert the generated target * @param[in] targetpath file path or URL of the target * @return pointer to the generated target */ target_param_t * gene_target( targetlist_param_t *targetlist, char *targetpath); /** * refer a target, used to make a new cache model * * @param[in] reftarget reference target pointer * @param[out] ptr address of feeding target pointer */ void refer_target( target_param_t *reftarget, target_param_t **ptr); /** * refer a target, used to make a new cache model * * @param[in] target reference pointer to the target */ void unrefer_target( target_param_t *target); /** * delete a target * * @param[in,out] target address of the deleting target pointer */ void delete_target( target_param_t **target); /** * delete a target in list * * @param[in,out] target address of the deleting target pointer * @param[in] targetlist target list pointer */ void delete_target_in_list( target_param_t **target, targetlist_param_t *targetlist); /** * delete target list * * @param[in,out] targetlist address of the target list pointer */ void delete_targetlist(targetlist_param_t **targetlist); /** * print target parameters * * @param[in] target target pointer */ void print_target( target_param_t *target); /** * print all target parameters * * @param[in] targetlist target list pointer */ void print_alltarget( targetlist_param_t *targetlist); /** * search a target by target name * * @param[in] targetname target name * @param[in] targetlist target list pointer * @return found target pointer */ target_param_t * search_target( char targetname[], targetlist_param_t *targetlist); /** * search a target by tid * * @param[in] tid target identifier * @param[in] targetlist target list pointer * @return found target pointer */ target_param_t * search_targetBytid( char tid[], targetlist_param_t *targetlist); #endif /* !TARGET_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/imgsock_manager.c0000644000175000017500000001347512315002075024442 0ustar mathieumathieu/* * $Id: imgsock_manager.c 54 2011-05-10 13:22:47Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "imgsock_manager.h" #if _WIN32 #define strncasecmp _strnicmp #endif msgtype_t identify_clientmsg( SOCKET connected_socket) { int receive_size; char buf[BUF_LEN]; static const char *magicid[] = { "JPIP-stream", "PNM request", "XML request", "TID request", "CID request", "CID destroy", "SIZ request", "JP2 save", "QUIT"}; int i; receive_size = receive_line( connected_socket, buf); if( receive_size == 0){ fprintf( stderr, "Error to receive the header of client message\n"); return MSGERROR; } for( i=0; i> 8) & 0xff; header[4] = length & 0xff; send_stream( connected_socket, header, 5); send_stream( connected_socket, xmlstream, length); } void send_IDstream( SOCKET connected_socket, char *id, int idlen, const char *label); void send_CIDstream( SOCKET connected_socket, char *cid, int cidlen) { send_IDstream( connected_socket, cid, cidlen, "CID"); } void send_TIDstream( SOCKET connected_socket, char *tid, int tidlen) { send_IDstream( connected_socket, tid, tidlen, "TID"); } void send_IDstream( SOCKET connected_socket, char *id, int idlen, const char *label) { Byte_t header[4]; header[0] = label[0]; header[1] = label[1]; header[2] = label[2]; header[3] = idlen & 0xff; send_stream( connected_socket, header, 4); send_stream( connected_socket, id, idlen); } void send_PNMstream( SOCKET connected_socket, Byte_t *pnmstream, unsigned int width, unsigned int height, unsigned int numofcomp, Byte_t maxval) { int pnmlen = 0; Byte_t header[7]; pnmlen = width*height*numofcomp; header[0] = 'P'; header[1] = numofcomp==3 ? 6:5; header[2] = (width >> 8) & 0xff; header[3] = width & 0xff; header[4] = (height >> 8) & 0xff; header[5] = height & 0xff; header[6] = maxval; send_stream( connected_socket, header, 7); send_stream( connected_socket, pnmstream, pnmlen); } void send_SIZstream( SOCKET connected_socket, unsigned int width, unsigned int height) { Byte_t responce[9]; responce[0] = 'S'; responce[1] = 'I'; responce[2] = 'Z'; responce[3] = (width >> 16) & 0xff; responce[4] = (width >> 8) & 0xff; responce[5] = width & 0xff; responce[6] = (height >> 16) & 0xff; responce[7] = (height >> 8) & 0xff; responce[8] = height & 0xff; send_stream( connected_socket, responce, 9); } void response_signal( SOCKET connected_socket, bool succeed) { Byte_t code; if( succeed) code = 1; else code = 0; send_stream( connected_socket, &code, 1); } openjpeg-1.5.2/applications/jpip/libopenjpip/manfbox_manager.h0000644000175000017500000000514412315002075024437 0ustar mathieumathieu/* * $Id: manfbox_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 MANFBOX_MANAGER_H_ # define MANFBOX_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" #include "boxheader_manager.h" /** manifest box parameters*/ /** I.3.2.3 Manifest box*/ typedef struct manfbox_param{ boxheader_param_t *first; /**< top of the box header list*/ } manfbox_param_t; /** * generate manifest box * * @param[in] box pointer to the reference manf box * @return generated manfbox */ manfbox_param_t * gene_manfbox( box_param_t *box); /** * delete manifest box * * @param[in,out] manf addressof the manfbox pointer */ void delete_manfbox( manfbox_param_t **manf); /** * print manf box parameters * * @param[in] manf manf box pointer */ void print_manfbox( manfbox_param_t *manf); /** * search a boxheader by box type from manifest box * * @param[in] type box type * @param[in] manf manf box pointer * @return found box pointer */ boxheader_param_t * search_boxheader( const char type[], manfbox_param_t *manf); #endif /* !MANFBOX_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/query_parser.c0000644000175000017500000002735712315002075024041 0ustar mathieumathieu/* * $Id: query_parser.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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. */ #ifdef _WIN32 #include #define strcasecmp _stricmp #define strncasecmp _strnicmp #else #include #endif #include #include #include #include "query_parser.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ /** * Get initialized query parameters * * @return initial query parameters */ query_param_t * get_initquery(void); /* * get a pair of field name and value from the string starting fieldname=fieldval&... format * * @param[in] stringptr pointer to the beginning of the parsing string * @param[out] fieldname string to copy the field name, if not found, NULL * @param[out] fieldval string to copy the field value, if not found, NULL * @return pointer to the next field string, if there is none, NULL */ char * get_fieldparam( char *stringptr, char *fieldname, char *fieldval); void parse_cclose( char *src, query_param_t *query_param); void parse_metareq( char *field, query_param_t *query_param); /* parse the requested components (parses forms like:a; a,b; a-b; a-b,c; a,b-c)*/ void parse_comps( char *field, query_param_t *query_param); /** maximum length of field name*/ #define MAX_LENOFFIELDNAME 10 /** maximum length of field value*/ #define MAX_LENOFFIELDVAL 128 query_param_t * parse_query( char *query_string) { query_param_t *query_param; char *pquery, fieldname[MAX_LENOFFIELDNAME], fieldval[MAX_LENOFFIELDVAL]; query_param = get_initquery(); pquery = query_string; while( pquery!=NULL) { pquery = get_fieldparam( pquery, fieldname, fieldval); if( fieldname[0] != '\0'){ if( strcasecmp( fieldname, "target") == 0) query_param->target = strdup( fieldval); else if( strcasecmp( fieldname, "tid") == 0) query_param->tid = strdup( fieldval); else if( strcasecmp( fieldname, "fsiz") == 0) sscanf( fieldval, "%d,%d", &query_param->fx, &query_param->fy); else if( strcasecmp( fieldname, "roff") == 0) sscanf( fieldval, "%d,%d", &query_param->rx, &query_param->ry); else if( strcasecmp( fieldname, "rsiz") == 0) sscanf( fieldval, "%d,%d", &query_param->rw, &query_param->rh); else if( strcasecmp( fieldname, "layers") == 0) sscanf( fieldval, "%d", &query_param->layers); else if( strcasecmp( fieldname, "cid") == 0) query_param->cid = strdup( fieldval); else if( strcasecmp( fieldname, "cnew") == 0){ if( strncasecmp( fieldval, "http-tcp", 8) == 0) query_param->cnew = tcp; else if( strncasecmp( fieldval, "http", 4) == 0) query_param->cnew = http; } else if( strcasecmp( fieldname, "cclose") == 0) parse_cclose( fieldval, query_param); else if( strcasecmp( fieldname, "metareq") == 0) parse_metareq( fieldval, query_param); else if( strcasecmp( fieldname, "comps") == 0) parse_comps( fieldval, query_param); else if( strcasecmp( fieldname, "type") == 0){ if( strncasecmp( fieldval, "jpp-stream", 10) == 0) query_param->return_type = JPPstream; else if( strncasecmp( fieldval, "jpt-stream", 10) == 0) query_param->return_type = JPTstream; } else if( strcasecmp( fieldname, "len") == 0){ sscanf( fieldval, "%d", &query_param->len); if( query_param->len == 2000) /* for kakadu client*/ strncpy( query_param->box_type[0], "ftyp", 4); } } } return query_param; } query_param_t * get_initquery(void) { query_param_t *query; int i; query = (query_param_t *)malloc( sizeof(query_param_t)); query->target = NULL; query->tid = NULL; query->fx = -1; query->fy = -1; query->rx = -1; query->ry = -1; query->rw = -1; query->rh = -1; query->layers = -1; query->lastcomp = -1; query->comps = NULL; query->cid = NULL; query->cnew = non; query->cclose = NULL; query->numOfcclose = 0; memset( query->box_type, 0, MAX_NUMOFBOX*4); memset( query->limit, 0, MAX_NUMOFBOX*sizeof(int)); for( i=0; iw[i] = false; query->s[i] = false; query->g[i] = false; query->a[i] = false; query->priority[i] = false; } query->root_bin = 0; query->max_depth = -1; query->metadata_only = false; query->return_type = UNKNOWN; query->len = -1; return query; } char * get_fieldparam( char *stringptr, char *fieldname, char *fieldval) { char *eqp, *andp, *nexfieldptr; if((eqp = strchr( stringptr, '='))==NULL){ fprintf( stderr, "= not found\n"); strcpy( fieldname, ""); strcpy( fieldval, ""); return NULL; } if((andp = strchr( stringptr, '&'))==NULL){ andp = strchr( stringptr, '\0'); nexfieldptr = NULL; } else nexfieldptr = andp+1; strncpy( fieldname, stringptr, eqp-stringptr); fieldname[eqp-stringptr]='\0'; strncpy( fieldval, eqp+1, andp-eqp-1); fieldval[andp-eqp-1]='\0'; return nexfieldptr; } void print_queryparam( query_param_t query_param) { int i; char *cclose; fprintf( logstream, "query parameters:\n"); if( query_param.target) fprintf( logstream, "\t target: %s\n", query_param.target); if( query_param.tid) fprintf( logstream, "\t tid: %s\n", query_param.tid); fprintf( logstream, "\t fx,fy: %d, %d\n", query_param.fx, query_param.fy); fprintf( logstream, "\t rx,ry: %d, %d \t rw,rh: %d, %d\n", query_param.rx, query_param.ry, query_param.rw, query_param.rh); fprintf( logstream, "\t layers: %d\n", query_param.layers); fprintf( logstream, "\t components: "); if( query_param.lastcomp == -1) fprintf( logstream, "ALL\n"); else{ for( i=0; i<=query_param.lastcomp; i++) if( query_param.comps[i]) fprintf( logstream, "%d ", i); fprintf( logstream, "\n"); } fprintf( logstream, "\t cnew: %d\n", query_param.cnew); if( query_param.cid) fprintf( logstream, "\t cid: %s\n", query_param.cid); if( query_param.cclose){ fprintf( logstream, "\t cclose: "); for( i=0, cclose=query_param.cclose; icclose = strdup( src); for( i=0; icclose[i] == ','){ query_param->cclose[i] = '\0'; query_param->numOfcclose ++; } query_param->numOfcclose ++; } void parse_req_box_prop( char *req_box_prop, int idx, query_param_t *query_param); void parse_metareq( char *field, query_param_t *query_param) { char req_box_prop[20]; char *ptr, *src; int numofboxreq = 0; memset( req_box_prop, 0, 20); /* req-box-prop*/ ptr = strchr( field, '['); ptr++; src = ptr; while( *ptr != ']'){ if( *ptr == ';'){ strncpy( req_box_prop, src, ptr-src); parse_req_box_prop( req_box_prop, numofboxreq++, query_param); ptr++; src = ptr; memset( req_box_prop, 0, 20); } ptr++; } strncpy( req_box_prop, src, ptr-src); parse_req_box_prop( req_box_prop, numofboxreq++, query_param); if(( ptr = strchr( field, 'R'))) sscanf( ptr+1, "%d", &(query_param->root_bin)); if(( ptr = strchr( field, 'D'))) sscanf( ptr+1, "%d", &(query_param->max_depth)); if(( ptr = strstr( field, "!!"))) query_param->metadata_only = true; } void parse_req_box_prop( char *req_box_prop, int idx, query_param_t *query_param) { char *ptr; if( *req_box_prop == '*') query_param->box_type[idx][0]='*'; else strncpy( query_param->box_type[idx], req_box_prop, 4); if(( ptr = strchr( req_box_prop, ':'))){ if( *(ptr+1)=='r') query_param->limit[idx] = -1; else sscanf( ptr+1, "%d", &(query_param->limit[idx])); } if(( ptr = strchr( req_box_prop, '/'))){ ptr++; while( *ptr=='w' || *ptr=='s' || *ptr=='g' || *ptr=='a'){ switch( *ptr){ case 'w': query_param->w[idx] = true; break; case 's': query_param->s[idx] = true; break; case 'g': query_param->g[idx] = true; break; case 'a': query_param->a[idx] = true; break; } ptr++; } } else{ query_param->g[idx] = true; query_param->s[idx] = true; query_param->w[idx] = true; } if((ptr = strchr( req_box_prop, '!'))) query_param->priority[idx] = true; idx++; } void parse_comps( char *field, query_param_t *query_param) { int i,start,stop,aux = -1; char *ptr1,*ptr2; ptr1 = strchr( field, '-'); ptr2 = strchr( field, ','); if( ptr1 && ptr2) if( ptr1 > ptr2) sscanf( field, "%d,%d-%d",&aux, &start, &stop); else sscanf( field, "%d-%d,%d", &start, &stop, &aux); else if(ptr1) sscanf( field, "%d-%d", &start, &stop); else if(ptr2){ sscanf( field, "%d,%d", &start, &stop); aux = start; start = stop; } else{ sscanf( field, "%d", &stop); start = stop; } query_param->lastcomp = stop > aux ? stop : aux; query_param->comps = (bool *)calloc( 1, (query_param->lastcomp+1)*sizeof(bool)); for( i=start; i<=stop; i++) query_param->comps[i]=true; if(aux!=-1) query_param->comps[aux] = true; } void delete_query( query_param_t **query) { if( (*query)->target) free( (*query)->target); if( (*query)->tid) free( (*query)->tid); if( (*query)->comps) free((*query)->comps); if( (*query)->cid) free( (*query)->cid); if( (*query)->cclose) free( (*query)->cclose); free( *query); } openjpeg-1.5.2/applications/jpip/libopenjpip/box_manager.h0000644000175000017500000001746312315002075023604 0ustar mathieumathieu/* * $Id: box_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 BOX_MANAGER_H_ # define BOX_MANAGER_H_ #include "byte_manager.h" /** box parameters*/ typedef struct box_param{ int fd; /**< file descriptor*/ Byte8_t offset; /**< byte position of the whole Box (LBox) in the file*/ Byte_t headlen; /**< header length 8 or 16*/ Byte8_t length; /**< length of the whole Box*/ char type[4]; /**< type of information in the DBox*/ struct box_param *next; /**< pointer to the next box*/ } box_param_t; /** Box list parameters*/ typedef struct boxlist_param{ box_param_t *first; /**< first box pointer of the list*/ box_param_t *last; /**< last box pointer of the list*/ } boxlist_param_t; /** * generate a box list * * @return pointer to the generated box list */ boxlist_param_t * gene_boxlist(); /** * get box structure of JP2 file * * @param[in] fd file descriptor * @param[in] offset offset of the decomposing region * @param[in] length length of the decomposing region * @return pointer to the generated boxlist */ boxlist_param_t * get_boxstructure( int fd, Byte8_t offset, Byte8_t length); /** * generate box from JP2 file at the given offset * * @param[in] fd file discriptor of the JP2 file * @param[in] offset Box offset * @return pointer to the structure of generate box parameters */ box_param_t * gene_boxbyOffset( int fd, Byte8_t offset); /** * generate box from code stream (JPP or JPT stream) at the given offset * * @param[in] stream code stream of a box * @param[in] offset Box offset of the whole stream * @return pointer to the structure of generate box parameters */ box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset); /** * generate(search) box from JP2 file * * @param[in] fd file discriptor of the JP2 file * @param[in] offset start Byte position of the search * @param[in] length Byte length of the search, if 0, size to the end of file * @param[in] TBox Box Type * @return pointer to the structure of generate/found box parameters */ box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, const char TBox[]); /** * generate(search) box from code stream * * @param[in] stream code stream ( from the first byte) * @param[in] offset start Byte position of the search * @param[in] length Byte length of the search, if 0, size to the end of file * @param[in] TBox Box Type * @return pointer to the structure of generate/found box parameters */ box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, const char TBox[]); /** * generate child box from JP2 file at the given offset * * @param[in] superbox super box pointer * @param[in] offset offset from DBox first byte of superbox * @return pointer to the structure of generate box parameters */ box_param_t * gene_childboxbyOffset( box_param_t *superbox, Byte8_t offset); /** * generate(search) box from JP2 file * * @param[in] superbox super box pointer * @param[in] offset offset from DBox first byte of superbox * @param[in] TBox Box Type * @return pointer to the structure of generate/found box parameters */ box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[]); /** * get DBox offset * * @param[in] box box pointer * @return DBox offset (byte position) in the file */ Byte8_t get_DBoxoff( box_param_t *box); /** * get DBox length * * @param[in] box box pointer * @return DBox length ( content length) */ Byte8_t get_DBoxlen( box_param_t *box); /** * fetch header bytes in file stream * * @param[in] box box pointer * @return pointer to the fetched bytes */ Byte_t * fetch_headbytes( box_param_t *box); /** * fetch DBox (Box Contents) bytes of data in file stream * * @param[in] box box pointer * @param[in] offset start Byte position in DBox * @param[in] size Byte length * @return pointer to the fetched data */ Byte_t * fetch_DBoxbytes( box_param_t *box, long offset, int size); /** * fetch DBox (Box Contents) 1-byte Byte codes in file stream * * @param[in] box box pointer * @param[in] offset start Byte position in DBox * @return fetched code */ Byte_t fetch_DBox1byte( box_param_t *box, long offset); /** * fetch DBox (Box Contents) 2-byte big endian Byte codes in file stream * * @param[in] box box pointer * @param[in] offset start Byte position in DBox * @return fetched code */ Byte2_t fetch_DBox2bytebigendian( box_param_t *box, long offset); /** * fetch DBox (Box Contents) 4-byte big endian Byte codes in file stream * * @param[in] box box pointer * @param[in] offset start Byte position in DBox * @return fetched code */ Byte4_t fetch_DBox4bytebigendian( box_param_t *box, long offset); /** * fetch DBox (Box Contents) 8-byte big endian Byte codes in file stream * * @param[in] box box pointer * @param[in] offset start Byte position in DBox * @return fetched code */ Byte8_t fetch_DBox8bytebigendian( box_param_t *box, long offset); /** * search a box by box type * * @param[in] type box type * @param[in] boxlist box list pointer * @return found box pointer */ box_param_t * search_box( const char type[], boxlist_param_t *boxlist); /** * print box parameters * * @param[in] box box pointer */ void print_box( box_param_t *box); /** * print all box parameters * * @param[in] boxlist box list pointer */ void print_allbox( boxlist_param_t *boxlist); /** * delete a box in list * * @param[in,out] box address of the deleting box pointer * @param[in] boxlist box list pointer */ void delete_box_in_list( box_param_t **box, boxlist_param_t *boxlist); /** * delete a box in list by Type * * @param[in,out] type box type * @param[in] boxlist box list pointer */ void delete_box_in_list_by_type( char type[], boxlist_param_t *boxlist); /** * delete box list * * @param[in,out] boxlist address of the box list pointer */ void delete_boxlist( boxlist_param_t **boxlist); /** * insert a box into list * * @param[in] box box pointer * @param[in] boxlist box list pointer */ void insert_box_into_list( box_param_t *box, boxlist_param_t *boxlist); #endif /* !BOX_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/faixbox_manager.c0000644000175000017500000001455412315002075024445 0ustar mathieumathieu/* * $Id: faixbox_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "faixbox_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ faixbox_param_t * gene_faixbox( box_param_t *box) { faixbox_param_t *faix; size_t numOfelem; long pos = 0; faix = ( faixbox_param_t *)malloc( sizeof(faixbox_param_t)); faix->version = fetch_DBox1byte( box, (pos+=1)-1); if( 3< faix->version){ fprintf( FCGI_stderr, "Error: version %d in faix box is reserved for ISO use.\n", faix->version); free(faix); return NULL; } if( faix->version%2){ subfaixbox8_param_t *subfaixbox; size_t i; faix->subfaixbox.byte8_params = (subfaixbox8_param_t *)malloc( sizeof(subfaixbox8_param_t)); subfaixbox = faix->subfaixbox.byte8_params; subfaixbox->nmax = fetch_DBox8bytebigendian( box, (pos+=8)-8); subfaixbox->m = fetch_DBox8bytebigendian( box, (pos+=8)-8); numOfelem = subfaixbox->nmax*subfaixbox->m; subfaixbox->elem = ( faixelem8_param_t *)malloc( numOfelem*sizeof(faixelem8_param_t)); if( faix->version == 3) subfaixbox->aux = ( Byte4_t *)malloc( numOfelem*sizeof(Byte4_t)); for( i=0; ielem[i].off = fetch_DBox8bytebigendian( box, (pos+=8)-8); subfaixbox->elem[i].len = fetch_DBox8bytebigendian( box, (pos+=8)-8); if( faix->version == 3) subfaixbox->aux[i] = fetch_DBox4bytebigendian( box, (pos+=4)-4); } } else{ subfaixbox4_param_t *subfaixbox; size_t i; faix->subfaixbox.byte4_params = (subfaixbox4_param_t *)malloc( sizeof(subfaixbox4_param_t)); subfaixbox = faix->subfaixbox.byte4_params; subfaixbox->nmax = fetch_DBox4bytebigendian( box, (pos+=4)-4); subfaixbox->m = fetch_DBox4bytebigendian( box, (pos+=4)-4); numOfelem = subfaixbox->nmax*subfaixbox->m; subfaixbox->elem = ( faixelem4_param_t *)malloc( numOfelem*sizeof(faixelem4_param_t)); if( faix->version == 2) subfaixbox->aux = ( Byte4_t *)malloc( numOfelem*sizeof(Byte4_t)); for( i=0; ielem[i].off = fetch_DBox4bytebigendian( box, (pos+=4)-4); subfaixbox->elem[i].len = fetch_DBox4bytebigendian( box, (pos+=4)-4); if( faix->version == 2) subfaixbox->aux[i] = fetch_DBox4bytebigendian( box, (pos+=4)-4); } } return faix; } void print_faixbox( faixbox_param_t *faix) { Byte8_t i, j; fprintf( logstream, "faix box info\n"); fprintf( logstream, "\tversion: %d\n", faix->version); fprintf( logstream, "\t nmax: %#llx = %lld\n", get_nmax( faix), get_nmax( faix)); fprintf( logstream, "\t m: %#llx = %lld\n", get_m( faix), get_m( faix)); for( i=0; iversion) fprintf( logstream, ", aux = %#x", get_elemAux( faix, j, i)); fprintf( logstream, "\n"); } fprintf( logstream, "\n"); } } void delete_faixbox( faixbox_param_t **faix) { if((*faix)->version%2){ free((*faix)->subfaixbox.byte8_params->elem); if( (*faix)->version == 3) free((*faix)->subfaixbox.byte8_params->aux); free((*faix)->subfaixbox.byte8_params); } else{ free((*faix)->subfaixbox.byte4_params->elem); if( (*faix)->version == 2) free((*faix)->subfaixbox.byte4_params->aux); free((*faix)->subfaixbox.byte4_params); } free( *faix); } Byte8_t get_nmax( faixbox_param_t *faix) { if( faix->version%2) return faix->subfaixbox.byte8_params->nmax; else return (Byte8_t)faix->subfaixbox.byte4_params->nmax; } Byte8_t get_m( faixbox_param_t *faix) { if( faix->version%2) return faix->subfaixbox.byte8_params->m; else return (Byte8_t)faix->subfaixbox.byte4_params->m; } Byte8_t get_elemOff( faixbox_param_t *faix, Byte8_t elem_id, Byte8_t row_id) { Byte8_t nmax = get_nmax( faix); if( faix->version%2) return faix->subfaixbox.byte8_params->elem[ row_id*nmax+elem_id].off; else return (Byte8_t)faix->subfaixbox.byte4_params->elem[ row_id*nmax+elem_id].off; } Byte8_t get_elemLen( faixbox_param_t *faix, Byte8_t elem_id, Byte8_t row_id) { Byte8_t nmax = get_nmax( faix); if( faix->version%2) return faix->subfaixbox.byte8_params->elem[ row_id*nmax+elem_id].len; else return (Byte8_t)faix->subfaixbox.byte4_params->elem[ row_id*nmax+elem_id].len; } Byte4_t get_elemAux( faixbox_param_t *faix, Byte8_t elem_id, Byte8_t row_id) { Byte8_t nmax; if( faix->version <2) return -1; nmax = get_nmax( faix); if( faix->version%2) return faix->subfaixbox.byte8_params->aux[ row_id*nmax+elem_id]; else return faix->subfaixbox.byte4_params->aux[ row_id*nmax+elem_id]; } openjpeg-1.5.2/applications/jpip/libopenjpip/sock_manager.h0000644000175000017500000000674312315002075023752 0ustar mathieumathieu/* * $Id: sock_manager.h 1369 2012-02-01 21:45:12Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 SOCK_MANAGER_H_ # define SOCK_MANAGER_H_ #include "bool.h" #include "byte_manager.h" #ifdef _WIN32 #include #else typedef int SOCKET; #endif /*_WIN32*/ #define BUF_LEN 256 /** * open listening socket * * @param port opening port number * @return new socket */ SOCKET open_listeningsocket( int port); /** * accept a new connection to the listenning socket * * @param listening_socket listenning socket * @return connected socket (-1 if error occurs) */ SOCKET accept_socket( SOCKET listening_socket); /** * receive a string line (ending with '\n') from client * * @param [in] connected_socket file descriptor of the connected socket * @param [out] buf string to be stored * @return red size */ int receive_line(SOCKET connected_socket, char *buf); /** * receive a string line (ending with '\n') from client, return malloc string * * @param [in] connected_socket file descriptor of the connected socket * @return pointer to the string (memory allocated) */ char * receive_string( SOCKET connected_socket); /** * receive data stream to client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] length length of the receiving stream * @return pointer to the data stream (memory allocated), NULL if failed */ void * receive_stream( SOCKET connected_socket, int length); /** * send data stream to client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] stream data stream * @param [in] length length of data stream */ void send_stream( SOCKET connected_socket, void *stream, int length); /** * close socket * * @param [in] sock closing socket * @return 0 if succeed, -1 if failed */ int close_socket( SOCKET sock); #endif /* !SOCK_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/metadata_manager.c0000644000175000017500000001507312315002075024562 0ustar mathieumathieu/* * $Id: metadata_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "metadata_manager.h" #include #include #include #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ metadatalist_param_t * gene_metadatalist(void) { metadatalist_param_t *list; list = (metadatalist_param_t *)malloc( sizeof(metadatalist_param_t)); list->first = NULL; list->last = NULL; return list; } metadatalist_param_t * const_metadatalist( int fd) { metadatalist_param_t *metadatalist; metadata_param_t *metabin; boxlist_param_t *toplev_boxlist; box_param_t *box, *next; placeholderlist_param_t *phldlist; placeholder_param_t *phld; int idx; Byte8_t filesize; if(!(filesize = get_filesize( fd))) return NULL; if( !(toplev_boxlist = get_boxstructure( fd, 0, filesize))){ fprintf( FCGI_stderr, "Error: Not correctl JP2 format\n"); return NULL; } phldlist = gene_placeholderlist(); metadatalist = gene_metadatalist(); box = toplev_boxlist->first; idx = 0; while( box){ next = box->next; if( strncmp( box->type, "jP ",4)!=0 && strncmp( box->type, "ftyp",4)!=0 && strncmp( box->type, "jp2h",4)!=0){ boxlist_param_t *boxlist = NULL; boxcontents_param_t *boxcontents = NULL; phld = gene_placeholder( box, ++idx); insert_placeholder_into_list( phld, phldlist); boxlist = get_boxstructure( box->fd, get_DBoxoff( box), get_DBoxlen(box)); if( !boxlist) boxcontents = gene_boxcontents( get_DBoxoff( box), get_DBoxlen(box)); delete_box_in_list( &box, toplev_boxlist); metabin = gene_metadata( idx, boxlist, NULL, boxcontents); insert_metadata_into_list( metabin, metadatalist); } box = next; } metabin = gene_metadata( 0, toplev_boxlist, phldlist, NULL); insert_metadata_into_list( metabin, metadatalist); return metadatalist; } void delete_metadatalist( metadatalist_param_t **list) { metadata_param_t *ptr, *next; ptr = (*list)->first; while( ptr != NULL){ next=ptr->next; delete_metadata( &ptr); ptr=next; } free( *list); } metadata_param_t * gene_metadata( int idx, boxlist_param_t *boxlist, placeholderlist_param_t *phldlist, boxcontents_param_t *boxcontents) { metadata_param_t *bin; bin = (metadata_param_t *)malloc( sizeof(metadata_param_t)); bin->idx = idx; bin->boxlist = boxlist; bin->placeholderlist = phldlist; bin->boxcontents = boxcontents; bin->next = NULL; return bin; } void delete_metadata( metadata_param_t **metadata) { delete_boxlist( &((*metadata)->boxlist)); delete_placeholderlist( &((*metadata)->placeholderlist)); if((*metadata)->boxcontents) free((*metadata)->boxcontents); #ifndef SERVER /* fprintf( logstream, "local log: Metadata-bin: %d deleted\n", (*metadata)->idx);*/ #endif free( *metadata); } void insert_metadata_into_list( metadata_param_t *metabin, metadatalist_param_t *metadatalist) { if( metadatalist->first) metadatalist->last->next = metabin; else metadatalist->first = metabin; metadatalist->last = metabin; } void print_metadata( metadata_param_t *metadata) { boxcontents_param_t *boxcont; fprintf( logstream, "metadata-bin %d info:\n", metadata->idx); print_allbox( metadata->boxlist); print_allplaceholder( metadata->placeholderlist); boxcont = metadata->boxcontents; if( boxcont) fprintf( logstream, "box contents:\n" "\t offset: %lld %#llx\n" "\t length: %lld %#llx\n", boxcont->offset, boxcont->offset, boxcont->length, boxcont->length); } void print_allmetadata( metadatalist_param_t *list) { metadata_param_t *ptr; fprintf( logstream, "all metadata info: \n"); ptr = list->first; while( ptr != NULL){ print_metadata( ptr); ptr=ptr->next; } } boxcontents_param_t * gene_boxcontents( Byte8_t offset, Byte8_t length) { boxcontents_param_t *contents; contents = (boxcontents_param_t *)malloc( sizeof(boxcontents_param_t)); contents->offset = offset; contents->length = length; return contents; } metadata_param_t * search_metadata( int idx, metadatalist_param_t *list) { metadata_param_t *found; found = list->first; while( found){ if( found->idx == idx) return found; found = found->next; } return NULL; } int search_metadataidx( char boxtype[4], metadatalist_param_t *list) { metadata_param_t *ptr; int i; for( i=0; i<4; i++) if( boxtype[i] == '_') boxtype[i] = ' '; ptr = list->first; while( ptr){ if( ptr->boxlist){ box_param_t *box = ptr->boxlist->first; while( box){ if( strncmp ( boxtype, box->type, 4) == 0) return ptr->idx; box = box->next; } } ptr = ptr->next; } ptr = list->first; while( ptr){ if( ptr->placeholderlist){ placeholder_param_t *phld = ptr->placeholderlist->first; while( phld){ if( strncmp ( boxtype, (char *)phld->OrigBH+4, 4) == 0){ return phld->OrigID; } phld = phld->next; } } ptr = ptr->next; } return -1; } openjpeg-1.5.2/applications/jpip/libopenjpip/jpipstream_manager.h0000644000175000017500000000403112315002075025155 0ustar mathieumathieu/* * $Id$ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "byte_manager.h" #include "msgqueue_manager.h" #include "ihdrbox_manager.h" Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_stream, int *streamlen); void save_codestream( Byte_t *codestream, Byte8_t streamlen, const char *fmt); Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox); ihdrbox_param_t * get_SIZ_from_jpipstream( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn); openjpeg-1.5.2/applications/jpip/libopenjpip/imgsock_manager.h0000644000175000017500000001514612315002075024444 0ustar mathieumathieu/* * $Id: imgsock_manager.h 54 2011-05-10 13:22:47Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 IMGSOCK_MANAGER_H_ # define IMGSOCK_MANAGER_H_ #include "bool.h" #include "byte_manager.h" #include "sock_manager.h" #define NUM_OF_MSGTYPES 9 typedef enum eMSGTYPE{ JPIPSTREAM, PNMREQ, XMLREQ, TIDREQ, CIDREQ, CIDDST, SIZREQ, JP2SAVE, QUIT, MSGERROR} msgtype_t; /** * indeitify client message type * * @param [in] connected_socket file descriptor of the connected socket * @return message type */ msgtype_t identify_clientmsg( SOCKET connected_socket); /** * receive a JPT- JPP- stream from client * * @param [in] connected_socket file descriptor of the connected socket * @param [out] target address of received target file name string pointer ( malloced, if not received, NULL) * @param [out] tid address of received target identifier string pointer ( malloced, if not received, null string) * @param [out] cid address of received channel identifier string pointer ( malloced, if not received, null string) * @param [out] streamlen length of the received codestream * @return JPT- JPP- codestream */ Byte_t * receive_JPIPstream( SOCKET connected_socket, char **target, char **tid, char **cid, int *streamlen); /** * send PGM/PPM image stream to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] pnmstream PGM/PPM image codestream * @param [in] width width of the PGM/PPM image (different from the original image) * @param [in] height height of the PGM/PPM image * @param [in] numofcomp number of components of the image * @param [in] maxval maximum value of the image (only 255 supported) */ void send_PNMstream( SOCKET connected_socket, Byte_t *pnmstream, unsigned int width, unsigned int height, unsigned int numofcomp, Byte_t maxval); /** * send XML data stream to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] xmlstream xml data stream * @param [in] length legnth of the xml data stream */ void send_XMLstream( SOCKET connected_socket, Byte_t *xmlstream, int length); /** * send TID data stream to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] tid tid string * @param [in] tidlen legnth of the tid string */ void send_TIDstream( SOCKET connected_socket, char *tid, int tidlen); /** * send CID data stream to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] cid cid string * @param [in] cidlen legnth of the cid string */ void send_CIDstream( SOCKET connected_socket, char *cid, int cidlen); /** * send SIZ data stream to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] width original width of the image * @param [in] height original height of the image */ void send_SIZstream( SOCKET connected_socket, unsigned int width, unsigned int height); /** * send response signal to the client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] succeed whether if the requested process succeeded */ void response_signal( SOCKET connected_socket, bool succeed); #endif /* !IMGSOCK_MANAGER_H_ */ /*! \file * PROTOCOL specification to communicate with opj_dec_server * *\section sec1 JPIP-stream * Cache JPT- JPP- stream in server * * client -> server: JPIP-stream\\n version 1.1\\n (optional for cid registration: targetnamestring\\n tidstring\\n cidstring\\n) bytelengthvalue\\n data \n * server -> client: 1 or 0 (of 1Byte response signal) * *\section sec2 PNM request * Get decoded PGM/PPM image * * client -> server: PNM request\\n [cid/tid]string\\n fw\\n fh\\n \n * server -> client: P6 or P5 (2Byte) width (2Byte Big endian) height (2Byte Big endian) maxval (1Byte) data * *\section sec3 XML request * Get XML data * * client -> server: XML request\\n \n * server -> client: XML (3Byte) length (2Byte Big endian) data * *\section sec4 TID request * Get target ID of target image * * client -> server: TID request\\n targetname\\n \n * server -> client: TID (3Byte) length (1Byte) tiddata * *\section sec5 CID request * Get Channel ID of identical target image * * client -> server: CID request\\n targetname\\n \n * server -> client: CID (3Byte) length (1Byte) ciddata * *\section sec6 CID destroy * Close Channel ID * * client -> server: CID destroy\\n ciddata \n * server -> client: 1 or 0 (of 1Byte response signal) * *\section sec7 SIZ request * Get original size of image * * client -> server: SIZ request\\n tidstring\\n cidstring\\n \n * server -> client: SIZ (3Byte) width (3Byte Big endian) height (3Byte Big endian) * *\section sec8 JP2 save * Save in JP2 file format * * client -> server: JP2 save\\n ciddata \n * server -> client: 1 or 0 (of 1Byte response signal) * *\section sec9 QUIT * Quit the opj_dec_server program * * client -> server: quit or QUIT */ openjpeg-1.5.2/applications/jpip/libopenjpip/jp2k_decoder.c0000644000175000017500000001544612315002075023647 0ustar mathieumathieu/* * $Id: jp2k_decoder.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "jp2k_decoder.h" #include "openjpeg.h" void error_callback(const char *msg, void *client_data); void warning_callback(const char *msg, void *client_data); void info_callback(const char *msg, void *client_data); Byte_t * imagetopnm(opj_image_t *image, ihdrbox_param_t **ihdrbox); Byte_t * j2k_to_pnm( Byte_t *j2kstream, Byte8_t j2klen, ihdrbox_param_t **ihdrbox) { Byte_t *pnmstream = NULL; opj_dparameters_t parameters; /* decompression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; /* configure the event callbacks (not required) */ 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; /* set decoding parameters to default values */ opj_set_default_decoder_parameters(¶meters); /* decode the code-stream */ /* ---------------------- */ /* JPEG-2000 codestream */ /* 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 user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, j2kstream, j2klen); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); fprintf(stderr, "image is decoded!\n"); if(!image) { fprintf(stderr, "ERROR -> jp2_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return NULL; } /* close the byte stream */ opj_cio_close(cio); /* create output image */ /* ------------------- */ if( (pnmstream = imagetopnm( image, ihdrbox))==NULL) fprintf( stderr, "PNM image not generated\n"); /* free remaining structures */ if(dinfo) { opj_destroy_decompress(dinfo); } /* free image data structure */ opj_image_destroy(image); return pnmstream; } /** 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 no client object */ void info_callback(const char *msg, void *client_data) { (void)client_data; (void)msg; /* fprintf(stdout, "[INFO] %s", msg); */ } Byte_t * imagetopnm(opj_image_t *image, ihdrbox_param_t **ihdrbox) { int adjustR, adjustG=0, adjustB=0; int datasize; Byte_t *pix=NULL, *ptr=NULL; int i; if(*ihdrbox){ if( (*ihdrbox)->nc != image->numcomps) fprintf( stderr, "Exception: num of components not identical, codestream: %d, ihdrbox: %d\n", image->numcomps, (*ihdrbox)->nc); if( (*ihdrbox)->width != image->comps[0].w) (*ihdrbox)->width = image->comps[0].w; if( (*ihdrbox)->height != image->comps[0].h) (*ihdrbox)->height = image->comps[0].h; if( (*ihdrbox)->bpc != image->comps[0].prec) fprintf( stderr, "Exception: bits per component not identical, codestream: %d, ihdrbox: %d\n", image->comps[0].prec, (*ihdrbox)->bpc); } else{ *ihdrbox = (ihdrbox_param_t *)malloc( sizeof(ihdrbox_param_t)); (*ihdrbox)->width = image->comps[0].w; (*ihdrbox)->height = image->comps[0].h; (*ihdrbox)->bpc = image->comps[0].prec; (*ihdrbox)->nc = image->numcomps; } datasize = (image->numcomps)*(image->comps[0].w)*(image->comps[0].h); if (image->comps[0].prec > 8) { adjustR = image->comps[0].prec - 8; printf("PNM CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec); } else adjustR = 0; if( image->numcomps == 3){ if (image->comps[1].prec > 8) { adjustG = image->comps[1].prec - 8; printf("PNM CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec); } else adjustG = 0; if (image->comps[2].prec > 8) { adjustB = image->comps[2].prec - 8; printf("PNM CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec); } else adjustB = 0; } pix = (Byte_t *)malloc( datasize); ptr = pix; for( i = 0; i < image->comps[0].w * image->comps[0].h; i++){ int r, g, b; r = image->comps[0].data[i]; r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); /* if( adjustR > 0) */ *(ptr++) = (Byte_t) ((r >> adjustR)+((r >> (adjustR-1))%2)); if( image->numcomps == 3){ g = image->comps[1].data[i]; g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); *(ptr++) = (Byte_t) ((g >> adjustG)+((g >> (adjustG-1))%2)); b = image->comps[2].data[i]; b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); *(ptr++) = (Byte_t) ((b >> adjustB)+((b >> (adjustB-1))%2)); } } return pix; } openjpeg-1.5.2/applications/jpip/libopenjpip/cachemodel_manager.h0000644000175000017500000001026212315002075025066 0ustar mathieumathieu/* * $Id: cachemodel_manager.h 1481 2012-03-02 08:44:04Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 CACHEMODEL_MANAGER_H_ # define CACHEMODEL_MANAGER_H_ #include "bool.h" #include "target_manager.h" /** Cache model parameters*/ typedef struct cachemodel_param{ target_param_t *target; /**< reference pointer to the target*/ bool jppstream; /**< return type, true: JPP-stream, false: JPT-stream*/ bool mhead_model; /**< main header model, if sent, 1, else 0*/ bool *tp_model; /**< dynamic array pointer of tile part model, if sent, 1, else 0*/ bool *th_model; /**< dynamic array pointer of tile header model*/ bool **pp_model; /**< dynamic array pointer of precint packet model*/ struct cachemodel_param *next; /**< pointer to the next cache model*/ } cachemodel_param_t; /** Cache model list parameters*/ typedef struct cachemodellist_param{ cachemodel_param_t *first; /**< first cache model pointer of the list*/ cachemodel_param_t *last; /**< last cache model pointer of the list*/ } cachemodellist_param_t; /** * generate a cache model list * * @return pointer to the generated cache model list */ cachemodellist_param_t * gene_cachemodellist(void); /** * generate a cache model under a list * * @param[in] cachemodellist cachemodel list to insert the generated cache model, NULL for stateless * @param[in] target pointer the reference target * @param[in] reqJPP if JPP-stream is desired true, JPT-stream false * @return pointer to the generated cache model */ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, bool reqJPP); /** * print cache model * * @param[in] cachemodel cache model */ void print_cachemodel( cachemodel_param_t cachemodel); /** * search a cache model of a target * * @param[in] target refering target * @param[in] cachemodellist cache model list * @return found cache model pointer */ cachemodel_param_t * search_cachemodel( target_param_t *target, cachemodellist_param_t *cachemodellist); /** * check if all data has been sent * * @param[in] cachemodel cache model * @return true if sent all, false otherwise */ bool is_allsent( cachemodel_param_t cachemodel); /** * delete a cache model * * @param[in] cachemodel address of the cachemodel pointer */ void delete_cachemodel( cachemodel_param_t **cachemodel); /** * delete cachemodel list * * @param[in,out] cachemodellist address of the cachemodel list pointer */ void delete_cachemodellist( cachemodellist_param_t **cachemodellist); #endif /* !CACHEMODEL_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/jp2k_encoder.h0000644000175000017500000000627612315002075023667 0ustar mathieumathieu/* * $Id: jp2k_encoder.h 1066 2011-11-16 15:43:01Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 JP2K_ENCODER_H_ # define JP2K_ENCODER_H_ #include "byte_manager.h" #include "msgqueue_manager.h" /** * reconstruct j2k codestream from message queue * * @param[in] msgqueue message queue pointer * @param[in] jpipstream original jpt- jpp- stream * @param[in] csn codestream number * @param[in] fw reconstructing image frame width * @param[in] fh reconstructing image frame height * @param[out] j2klen pointer to the j2k codestream length * @return generated reconstructed j2k codestream */ Byte_t * recons_j2k( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen); /** * reconstruct jp2 file codestream from message queue * * @param[in] msgqueue message queue pointer * @param[in] jpipstream original jpt- jpp- stream * @param[in] csn codestream number * @param[out] jp2len pointer to the jp2 codestream length * @return generated reconstructed jp2 codestream */ Byte_t * recons_jp2( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *jp2len); /** * reconstruct j2k codestream of mainheader from message queue * * @param[in] msgqueue message queue pointer * @param[in] jpipstream original jpt- jpp- stream * @param[in] csn codestream number * @param[out] j2klen pointer to the j2k codestream length * @return generated reconstructed j2k codestream */ Byte_t * recons_j2kmainhead( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *j2klen); #endif /* !JP2K_ENCODER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/jpip_parser.c0000644000175000017500000003766012315002075023634 0ustar mathieumathieu/* * $Id: jpip_parser.c 1481 2012-03-02 08:44:04Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 "jpip_parser.h" #include "channel_manager.h" #include "imgreg_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target) { if( query_param.tid){ if( strcmp( query_param.tid, "0") != 0 ){ if( query_param.cid[0] != '\0'){ fprintf( FCGI_stdout, "Reason: Target can not be specified both through tid and cid\r\n"); fprintf( FCGI_stdout, "Status: 400\r\n"); return false; } if( ( *target = search_targetBytid( query_param.tid, targetlist))) return true; } } if( query_param.target) if( !( *target = search_target( query_param.target, targetlist))) if(!( *target = gene_target( targetlist, query_param.target))) return false; if( *target){ fprintf( FCGI_stdout, "JPIP-tid: %s\r\n", (*target)->tid); return true; } else{ fprintf( FCGI_stdout, "Reason: target not found\r\n"); fprintf( FCGI_stdout, "Status: 400\r\n"); return false; } } bool associate_channel( query_param_t query_param, sessionlist_param_t *sessionlist, session_param_t **cursession, channel_param_t **curchannel) { if( search_session_and_channel( query_param.cid, sessionlist, cursession, curchannel)){ if( !query_param.cnew) set_channel_variable_param( query_param, *curchannel); } else{ fprintf( FCGI_stderr, "Error: process canceled\n"); return false; } return true; } bool open_channel( query_param_t query_param, sessionlist_param_t *sessionlist, auxtrans_param_t auxtrans, target_param_t *target, session_param_t **cursession, channel_param_t **curchannel) { cachemodel_param_t *cachemodel = NULL; if( target){ if( !(*cursession)) *cursession = gene_session( sessionlist); if( !( cachemodel = search_cachemodel( target, (*cursession)->cachemodellist))) if( !(cachemodel = gene_cachemodel( (*cursession)->cachemodellist, target, query_param.return_type==JPPstream))) return false; } else if( *curchannel) cachemodel = (*curchannel)->cachemodel; *curchannel = gene_channel( query_param, auxtrans, cachemodel, (*cursession)->channellist); if( *curchannel == NULL) return false; return true; } bool close_channel( query_param_t query_param, sessionlist_param_t *sessionlist, session_param_t **cursession, channel_param_t **curchannel) { char *cclose; int i; if( query_param.cclose[0] =='*'){ #ifndef SERVER fprintf( logstream, "local log: close all\n"); #endif /* all channels associatd with the session will be closed */ if( !delete_session( cursession, sessionlist)) return false; } else{ /* check if all entry belonging to the same session */ for( i=0, cclose=query_param.cclose; ichannellist))){ fprintf( FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", cclose); return false; } } /* delete channels */ for( i=0, cclose=query_param.cclose; ichannellist); delete_channel( curchannel, (*cursession)->channellist); } if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL) /* In case of empty session */ delete_session( cursession, sessionlist); } return true; } /** * enqueue tiles or precincts into the message queue * * @param[in] query_param structured query * @param[in] msgqueue message queue pointer */ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue); /** * enqueue metadata bins into the message queue * * @param[in] query_param structured query * @param[in] metadatalist pointer to metadata bin list * @param[in,out] msgqueue message queue pointer * @return if succeeded (true) or failed (false) */ bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); bool gene_JPIPstream( query_param_t query_param, target_param_t *target, session_param_t *cursession, channel_param_t *curchannel, msgqueue_param_t **msgqueue) { index_param_t *codeidx; cachemodel_param_t *cachemodel; if( !cursession || !curchannel){ /* stateless */ if( !target) return false; if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream))) return false; *msgqueue = gene_msgqueue( true, cachemodel); } else{ /* session */ cachemodel = curchannel->cachemodel; target = cachemodel->target; *msgqueue = gene_msgqueue( false, cachemodel); } codeidx = target->codeidx; if( cachemodel->jppstream) fprintf( FCGI_stdout, "Content-type: image/jpp-stream\r\n"); else fprintf( FCGI_stdout, "Content-type: image/jpt-stream\r\n"); if( query_param.layers != -1){ if( query_param.layers > codeidx->COD.numOflayers){ fprintf( FCGI_stdout, "JPIP-layers: %d\r\n", codeidx->COD.numOflayers); query_param.layers = codeidx->COD.numOflayers; } } /*meta*/ if( query_param.box_type[0][0] != 0 && query_param.len != 0) if( !enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue)) return false; if( query_param.metadata_only) return true; /* main header */ if( !cachemodel->mhead_model && query_param.len != 0) enqueue_mainheader( *msgqueue); /* image codestream */ if( (query_param.fx > 0 && query_param.fy > 0)) enqueue_imagedata( query_param, *msgqueue); return true; } /** * enqueue precinct data-bins into the queue * * @param[in] xmin min x coordinate in the tile at the decomposition level * @param[in] xmax max x coordinate in the tile at the decomposition level * @param[in] ymin min y coordinate in the tile at the decomposition level * @param[in] ymax max y coordinate in the tile at the decomposition level * @param[in] tile_id tile index * @param[in] level decomposition level * @param[in] lastcomp last component number * @param[in] comps pointer to the array that stores the requested components * @param[in] layers number of quality layers * @param[in] msgqueue message queue * @return */ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue); /** * enqueue all precincts inside a tile into the queue * * @param[in] tile_id tile index * @param[in] level decomposition level * @param[in] lastcomp last component number * @param[in] comps pointer to the array that stores the requested components * @param[in] layers number of quality layers * @param[in] msgqueue message queue * @return */ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue); void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue) { index_param_t *codeidx; imgreg_param_t imgreg; range_param_t tile_Xrange, tile_Yrange; Byte4_t u, v, tile_id; int xmin, xmax, ymin, ymax; int numOfreslev; codeidx = msgqueue->cachemodel->target->codeidx; if( !(msgqueue->cachemodel->jppstream) && get_nmax( codeidx->tilepart) == 1) /* normally not the case */ numOfreslev = 1; else numOfreslev = codeidx->COD.numOfdecomp+1; imgreg = map_viewin2imgreg( query_param.fx, query_param.fy, query_param.rx, query_param.ry, query_param.rw, query_param.rh, codeidx->SIZ.XOsiz, codeidx->SIZ.YOsiz, codeidx->SIZ.Xsiz, codeidx->SIZ.Ysiz, numOfreslev ); if( query_param.len == 0) return; for( u=0, tile_id=0; uSIZ.YTnum; u++){ tile_Yrange = get_tile_Yrange( codeidx->SIZ, tile_id, imgreg.level); for( v=0; vSIZ.XTnum; v++, tile_id++){ tile_Xrange = get_tile_Xrange( codeidx->SIZ, tile_id, imgreg.level); if( tile_Xrange.minvalue < tile_Xrange.maxvalue && tile_Yrange.minvalue < tile_Yrange.maxvalue){ if( tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox) || tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) || tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy) || tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) { /*printf("Tile completely excluded from view-window %d\n", tile_id);*/ /* Tile completely excluded from view-window */ } else if( tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) && tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) && tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) && tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) { /* Tile completely contained within view-window */ /* high priority */ /*printf("Tile completely contained within view-window %d\n", tile_id);*/ if( msgqueue->cachemodel->jppstream){ enqueue_tileheader( tile_id, msgqueue); enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); } else enqueue_tile( tile_id, imgreg.level, msgqueue); } else{ /* Tile partially overlaps view-window */ /* low priority */ /*printf("Tile partially overlaps view-window %d\n", tile_id);*/ if( msgqueue->cachemodel->jppstream){ enqueue_tileheader( tile_id, msgqueue); /* FIXME: The following code is suspicious it implicitely cast an unsigned int to int, which truncates values */ xmin = tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) ? 0 : imgreg.xosiz + imgreg.ox - tile_Xrange.minvalue; xmax = tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ? tile_Xrange.maxvalue - tile_Xrange.minvalue -1 : imgreg.xosiz + imgreg.ox + imgreg.sx - tile_Xrange.minvalue -1; ymin = tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) ? 0 : imgreg.yosiz + imgreg.oy - tile_Yrange.minvalue; ymax = tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy) ? tile_Yrange.maxvalue - tile_Yrange.minvalue -1 : imgreg.yosiz + imgreg.oy + imgreg.sy - tile_Yrange.minvalue -1; enqueue_precincts( xmin, xmax, ymin, ymax, tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); } else enqueue_tile( tile_id, imgreg.level, msgqueue); } } } } } /* MM: shouldnt xmin/xmax be Byte4_t instead ? */ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue) { index_param_t *codeidx; int c, u, v, res_lev, dec_lev; int seq_id; Byte4_t XTsiz, YTsiz; Byte4_t XPsiz, YPsiz; Byte4_t xminP, xmaxP, yminP, ymaxP; codeidx = msgqueue->cachemodel->target->codeidx; for( c=0; cSIZ.Csiz; c++) if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){ seq_id = 0; for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){ XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev); YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev); XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz; YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz; for( u=0; u xmax || ymaxP < ymin || yminP > ymax){ /* Precinct completely excluded from view-window */ } else if( xminP >= xmin && xmaxP <= xmax && yminP >= ymin && ymaxP <= ymax){ /* Precinct completely contained within view-window high priority */ enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); } else{ /* Precinct partially overlaps view-window low priority */ enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); } } } } } } void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue) { index_param_t *codeidx; int c, i, res_lev, dec_lev; int seq_id; Byte4_t XTsiz, YTsiz; Byte4_t XPsiz, YPsiz; codeidx = msgqueue->cachemodel->target->codeidx; for( c=0; cSIZ.Csiz; c++) if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){ seq_id = 0; for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){ XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev); YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev); XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz; YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz; for( i=0; ilevel)?-1:layers, msgqueue); } } } bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue) { int i; for( i=0; query_param.box_type[i][0]!=0 && i #include #include #include "dec_clientmsg_handler.h" #include "ihdrbox_manager.h" #include "jpipstream_manager.h" #include "jp2k_encoder.h" void handle_JPIPstreamMSG( SOCKET connected_socket, cachelist_param_t *cachelist, Byte_t **jpipstream, int *streamlen, msgqueue_param_t *msgqueue) { Byte_t *newjpipstream; int newstreamlen = 0; cache_param_t *cache; char *target, *tid, *cid; metadatalist_param_t *metadatalist; newjpipstream = receive_JPIPstream( connected_socket, &target, &tid, &cid, &newstreamlen); fprintf( stderr, "newjpipstream length: %d\n", newstreamlen); parse_JPIPstream( newjpipstream, newstreamlen, *streamlen, msgqueue); *jpipstream = update_JPIPstream( newjpipstream, newstreamlen, *jpipstream, streamlen); free( newjpipstream); metadatalist = gene_metadatalist(); parse_metamsg( msgqueue, *jpipstream, *streamlen, metadatalist); /* cid registration*/ if( target != NULL){ if((cache = search_cache( target, cachelist))){ if( tid != NULL) update_cachetid( tid, cache); if( cid != NULL) add_cachecid( cid, cache); } else{ cache = gene_cache( target, msgqueue->last->csn, tid, cid); insert_cache_into_list( cache, cachelist); } } else cache = search_cacheBycsn( msgqueue->last->csn, cachelist); if( cache->metadatalist) delete_metadatalist( &cache->metadatalist); cache->metadatalist = metadatalist; if( target) free( target); if( tid) free( tid); if( cid) free( cid); response_signal( connected_socket, true); } void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist) { Byte_t *pnmstream; ihdrbox_param_t *ihdrbox; char *CIDorTID, tmp[10]; cache_param_t *cache; int fw, fh; CIDorTID = receive_string( connected_socket); if(!(cache = search_cacheBycid( CIDorTID, cachelist))) if(!(cache = search_cacheBytid( CIDorTID, cachelist))){ free( CIDorTID); return; } free( CIDorTID); receive_line( connected_socket, tmp); fw = atoi( tmp); receive_line( connected_socket, tmp); fh = atoi( tmp); ihdrbox = NULL; pnmstream = jpipstream_to_pnm( jpipstream, msgqueue, cache->csn, fw, fh, &ihdrbox); send_PNMstream( connected_socket, pnmstream, ihdrbox->width, ihdrbox->height, ihdrbox->nc, ihdrbox->bpc > 8 ? 255 : (1 << ihdrbox->bpc) - 1); free( ihdrbox); free( pnmstream); } void handle_XMLreqMSG( SOCKET connected_socket, Byte_t *jpipstream, cachelist_param_t *cachelist) { char *cid; cache_param_t *cache; boxcontents_param_t *boxcontents; Byte_t *xmlstream; cid = receive_string( connected_socket); if(!(cache = search_cacheBycid( cid, cachelist))){ free( cid); return; } free( cid); boxcontents = cache->metadatalist->last->boxcontents; xmlstream = (Byte_t *)malloc( boxcontents->length); memcpy( xmlstream, jpipstream+boxcontents->offset, boxcontents->length); send_XMLstream( connected_socket, xmlstream, boxcontents->length); free( xmlstream); } void handle_TIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist) { char *target, *tid = NULL; cache_param_t *cache; int tidlen = 0; target = receive_string( connected_socket); cache = search_cache( target, cachelist); free( target); if( cache){ tid = cache->tid; tidlen = strlen(tid); } send_TIDstream( connected_socket, tid, tidlen); } void handle_CIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist) { char *target, *cid = NULL; cache_param_t *cache; int cidlen = 0; target = receive_string( connected_socket); cache = search_cache( target, cachelist); free( target); if( cache){ if( cache->numOfcid > 0){ cid = cache->cid[ cache->numOfcid-1]; cidlen = strlen(cid); } } send_CIDstream( connected_socket, cid, cidlen); } void handle_dstCIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist) { char *cid; cid = receive_string( connected_socket); remove_cachecid( cid, cachelist); response_signal( connected_socket, true); free( cid); } void handle_SIZreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist) { char *tid, *cid; cache_param_t *cache; Byte4_t width, height; tid = receive_string( connected_socket); cid = receive_string( connected_socket); cache = NULL; if( tid[0] != '0') cache = search_cacheBytid( tid, cachelist); if( !cache && cid[0] != '0') cache = search_cacheBycid( cid, cachelist); free( tid); free( cid); width = height = 0; if( cache){ if( !cache->ihdrbox) cache->ihdrbox = get_SIZ_from_jpipstream( jpipstream, msgqueue, cache->csn); width = cache->ihdrbox->width; height = cache->ihdrbox->height; } send_SIZstream( connected_socket, width, height); } void handle_JP2saveMSG( SOCKET connected_socket, cachelist_param_t *cachelist, msgqueue_param_t *msgqueue, Byte_t *jpipstream) { char *cid; cache_param_t *cache; Byte_t *jp2stream; Byte8_t jp2len; cid = receive_string( connected_socket); if(!(cache = search_cacheBycid( cid, cachelist))){ free( cid); return; } free( cid); jp2stream = recons_jp2( msgqueue, jpipstream, cache->csn, &jp2len); if( jp2stream){ save_codestream( jp2stream, jp2len, "jp2"); free( jp2stream); } } openjpeg-1.5.2/applications/jpip/libopenjpip/metadata_manager.h0000644000175000017500000001150112315002075024557 0ustar mathieumathieu/* * $Id: metadata_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 METADATA_MANAGER_H_ #define METADATA_MANAGER_H_ #include "box_manager.h" #include "placeholder_manager.h" typedef struct boxcontents_param{ Byte8_t offset; /**< byte position of the box contents in the file*/ Byte8_t length; /**< length of the box contents*/ } boxcontents_param_t; /** metadata-bin parameters*/ typedef struct metadata_param{ int idx; /**< index number*/ boxlist_param_t *boxlist; /**< box list*/ placeholderlist_param_t *placeholderlist; /**< placeholder box list*/ boxcontents_param_t *boxcontents; /**< box contens in case of no boxlist and placeholderlist*/ struct metadata_param *next; /**< pointer to the next metadata-bin*/ } metadata_param_t; /** metadata-bin list parameters*/ typedef struct metadatalist_param{ metadata_param_t *first; /**< first metadata-bin pointer of the list*/ metadata_param_t *last; /**< last metadata-bin pointer of the list*/ } metadatalist_param_t; /** * generate a metadata list * * @return pointer to the generated metadata list */ metadatalist_param_t * gene_metadatalist(void); /** * construct metadata-bin list of JP2 file * * @param[in] fd file descriptor * @return pointer to the generated metadata-bin list */ metadatalist_param_t * const_metadatalist( int fd); /** * delete metadata list * * @param[in,out] list address of the metadata list pointer */ void delete_metadatalist( metadatalist_param_t **list); /** * generate a metadata bin * * @param[in] idx metadata-bin index * @param[in] boxlist box list pointer * @param[in] phldlist placeholder list pointer * @param[in] boxcontents boxcontents pointer * @return pointer to the generated metadata bin */ metadata_param_t * gene_metadata( int idx, boxlist_param_t *boxlist, placeholderlist_param_t *phldlist, boxcontents_param_t *boxcontents); /** * delete a metadata bin * * @param[in,out] metadata address of the deleting metadata bin pointer */ void delete_metadata( metadata_param_t **metadata); /** * generate box contents * * @return pointer to the box contents */ boxcontents_param_t * gene_boxcontents( Byte8_t offset, Byte8_t length); /** * print metadata-bin parameters * * @param[in] metadata metadata-bin pointer */ void print_metadata( metadata_param_t *metadata); /** * print all metadata parameters * * @param[in] metadatalist metadata list pointer */ void print_allmetadata( metadatalist_param_t *list); /** * search a metadata bin by index * * @param[in] idx index * @param[in] list metadata-bin list pointer * @return found metadata-bin pointer */ metadata_param_t * search_metadata( int idx, metadatalist_param_t *list); /** * search a metadata index by box-type * * @param[in] boxtype box-type * @param[in] list metadata-bin list pointer * @return found metadata-bin index, if not found, -1 */ int search_metadataidx( char boxtype[4], metadatalist_param_t *list); /** * insert a metadata-bin into list * * @param[in] metabin metadata-bin pointer * @param[in] metadatalist metadata list pointer */ void insert_metadata_into_list( metadata_param_t *metabin, metadatalist_param_t *metadatalist); #endif /* !METADATA_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/mhixbox_manager.c0000644000175000017500000001002412315002075024447 0ustar mathieumathieu/* * $Id: mhixbox_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "mhixbox_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ mhixbox_param_t * gene_mhixbox( box_param_t *box) { mhixbox_param_t *mhix; markeridx_param_t *mkridx, *lastmkidx; Byte8_t pos = 0; mhix = ( mhixbox_param_t *)malloc( sizeof( mhixbox_param_t)); mhix->tlen = fetch_DBox8bytebigendian( box, (pos+=8)-8); mhix->first = lastmkidx = NULL; while( pos < get_DBoxlen( box)){ mkridx = ( markeridx_param_t *)malloc( sizeof( markeridx_param_t)); mkridx->code = fetch_DBox2bytebigendian( box, (pos+=2)-2); mkridx->num_remain = fetch_DBox2bytebigendian( box, (pos+=2)-2); mkridx->offset = fetch_DBox8bytebigendian( box, (pos+=8)-8); mkridx->length = fetch_DBox2bytebigendian( box, (pos+=2)-2); mkridx->next = NULL; if( mhix->first) lastmkidx->next = mkridx; else mhix->first = mkridx; lastmkidx = mkridx; } return mhix; } markeridx_param_t * search_markeridx( Byte2_t code, mhixbox_param_t *mhix) { markeridx_param_t *found; found = mhix->first; while( found != NULL){ if( code == found->code) return found; found = found->next; } fprintf( FCGI_stderr, "Error: Marker index %#x not found\n", code); return NULL; } void print_mhixbox( mhixbox_param_t *mhix) { markeridx_param_t *ptr; fprintf( logstream, "mhix box info:\n"); fprintf( logstream, "\t tlen: %#llx\n", mhix->tlen); ptr = mhix->first; while( ptr != NULL){ fprintf( logstream, "marker index info:\n" "\t code: %#x\n" "\t num_remain: %#x\n" "\t offset: %#llx\n" "\t length: %#x\n", ptr->code, ptr->num_remain, ptr->offset, ptr->length); ptr=ptr->next; } } void print_markeridx( markeridx_param_t *markeridx) { fprintf( logstream, "marker index info:\n" "\t code: %#x\n" "\t num_remain: %#x\n" "\t offset: %#llx\n" "\t length: %#x\n", markeridx->code, markeridx->num_remain, markeridx->offset, markeridx->length); } void delete_mhixbox( mhixbox_param_t **mhix) { markeridx_param_t *mkPtr, *mkNext; mkPtr = (*mhix)->first; while( mkPtr != NULL){ mkNext=mkPtr->next; #ifndef SERVER /* fprintf( logstream, "local log: marker index %#x deleted!\n", mkPtr->code); */ #endif free(mkPtr); mkPtr=mkNext; } free(*mhix); } openjpeg-1.5.2/applications/jpip/libopenjpip/cachemodel_manager.c0000644000175000017500000001611512315002075025064 0ustar mathieumathieu/* * $Id: cachemodel_manager.c 1481 2012-03-02 08:44:04Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "cachemodel_manager.h" #include "faixbox_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ cachemodellist_param_t * gene_cachemodellist(void) { cachemodellist_param_t *cachemodellist; cachemodellist = (cachemodellist_param_t *)malloc( sizeof(cachemodellist_param_t)); cachemodellist->first = NULL; cachemodellist->last = NULL; return cachemodellist; } cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, bool reqJPP) { cachemodel_param_t *cachemodel; faixbox_param_t *tilepart; faixbox_param_t *precpacket; size_t numOfelem; Byte8_t numOftiles; int i; cachemodel = (cachemodel_param_t *)malloc( sizeof(cachemodel_param_t)); refer_target( target, &cachemodel->target); if( reqJPP){ if( target->jppstream) cachemodel->jppstream = true; else cachemodel->jppstream = false; } else{ /* reqJPT */ if( target->jptstream) cachemodel->jppstream = false; else cachemodel->jppstream = true; } cachemodel->mhead_model = false; tilepart = target->codeidx->tilepart; numOftiles = get_m( tilepart); numOfelem = get_nmax( tilepart)*numOftiles; cachemodel->tp_model = (bool *)calloc( 1, numOfelem*sizeof(bool)); cachemodel->th_model = (bool *)calloc( 1, numOftiles*sizeof(bool)); cachemodel->pp_model = (bool **)malloc( target->codeidx->SIZ.Csiz*sizeof(bool *)); for( i=0; icodeidx->SIZ.Csiz; i++){ precpacket = target->codeidx->precpacket[i]; cachemodel->pp_model[i] = (bool *)calloc( 1, get_nmax(precpacket)*get_m(precpacket)*sizeof(bool)); } cachemodel->next = NULL; if( cachemodellist){ if( cachemodellist->first) /* there are one or more entries */ cachemodellist->last->next = cachemodel; else /* first entry */ cachemodellist->first = cachemodel; cachemodellist->last = cachemodel; } #ifndef SERVER fprintf( logstream, "local log: cachemodel generated\n"); #endif return cachemodel; } void print_cachemodel( cachemodel_param_t cachemodel) { target_param_t *target; Byte8_t TPnum; /* num of tile parts in each tile */ Byte8_t Pmax; /* max num of packets per tile */ Byte8_t i, j, k; int n; /* FIXME: Is this large enough ? */ target = cachemodel.target; fprintf( logstream, "target: %s\n", target->targetname); fprintf( logstream, "\t main header model: %d\n", cachemodel.mhead_model); fprintf( logstream, "\t tile part model:\n"); TPnum = get_nmax( target->codeidx->tilepart); for( i=0, n=0; icodeidx->SIZ.YTnum; i++){ for( j=0; jcodeidx->SIZ.XTnum; j++){ for( k=0; kcodeidx->SIZ.XTnum*target->codeidx->SIZ.YTnum; i++){ fprintf( logstream, "\t tile.%llud %d\n", i, cachemodel.th_model[i]); for( j=0; jcodeidx->SIZ.Csiz; j++){ fprintf( logstream, "\t compo.%llud: ", j); Pmax = get_nmax( target->codeidx->precpacket[j]); for( k=0; kfirst; while( foundcachemodel != NULL){ if( foundcachemodel->target == target) return foundcachemodel; foundcachemodel = foundcachemodel->next; } return NULL; } void delete_cachemodellist( cachemodellist_param_t **cachemodellist) { cachemodel_param_t *cachemodelPtr, *cachemodelNext; cachemodelPtr = (*cachemodellist)->first; while( cachemodelPtr != NULL){ cachemodelNext=cachemodelPtr->next; delete_cachemodel( &cachemodelPtr); cachemodelPtr=cachemodelNext; } free(*cachemodellist); } void delete_cachemodel( cachemodel_param_t **cachemodel) { int i; unrefer_target( (*cachemodel)->target); free( (*cachemodel)->tp_model); free( (*cachemodel)->th_model); for( i=0; i<(*cachemodel)->target->codeidx->SIZ.Csiz; i++) free( (*cachemodel)->pp_model[i]); free( (*cachemodel)->pp_model); #ifndef SERVER fprintf( logstream, "local log: cachemodel deleted\n"); #endif free( *cachemodel); } bool is_allsent( cachemodel_param_t cachemodel) { target_param_t *target; Byte8_t TPnum; /* num of tile parts in each tile */ Byte8_t Pmax; /* max num of packets per tile */ Byte8_t i, j, k; int n; /* FIXME: is this large enough ? */ target = cachemodel.target; if( !cachemodel.mhead_model) return false; TPnum = get_nmax( target->codeidx->tilepart); if( cachemodel.jppstream){ for( i=0; icodeidx->SIZ.XTnum*target->codeidx->SIZ.YTnum; i++){ if( !cachemodel.th_model[i]) return false; for( j=0; jcodeidx->SIZ.Csiz; j++){ Pmax = get_nmax( target->codeidx->precpacket[j]); for( k=0; kcodeidx->SIZ.YTnum; i++) for( j=0; jcodeidx->SIZ.XTnum; j++) for( k=0; k #include #include #ifdef _WIN32 #define snprintf _snprintf /* Visual Studio */ #include #else #include #include #endif #include #include #include #include "target_manager.h" #ifdef SERVER #include #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ targetlist_param_t * gene_targetlist(void) { targetlist_param_t *targetlist; targetlist = (targetlist_param_t *)malloc( sizeof(targetlist_param_t)); targetlist->first = NULL; targetlist->last = NULL; return targetlist; } /** * open jp2 format image file * * @param[in] filepath file name (.jp2) * @param[out] tmpfname new file name if filepath is a URL * @return file descriptor */ int open_jp2file( char filepath[], char tmpfname[]); target_param_t * gene_target( targetlist_param_t *targetlist, char *targetpath) { target_param_t *target; int fd; index_param_t *jp2idx; char tmpfname[MAX_LENOFTID]; static int last_csn = 0; if( targetpath[0]=='\0'){ fprintf( FCGI_stderr, "Error: exception, no targetpath in gene_target()\n"); return NULL; } if((fd = open_jp2file( targetpath, tmpfname)) == -1){ fprintf( FCGI_stdout, "Status: 404\r\n"); return NULL; } if( !(jp2idx = parse_jp2file( fd))){ fprintf( FCGI_stdout, "Status: 501\r\n"); return NULL; } target = (target_param_t *)malloc( sizeof(target_param_t)); snprintf( target->tid, MAX_LENOFTID, "%x-%x", (unsigned int)time(NULL), (unsigned int)rand()); target->targetname = strdup( targetpath); target->fd = fd; #ifdef SERVER if( tmpfname[0]) target->tmpfname = strdup( tmpfname); else target->tmpfname = NULL; #endif target->csn = last_csn++; target->codeidx = jp2idx; target->num_of_use = 0; target->jppstream = true; target->jptstream = isJPTfeasible( *jp2idx); target->next=NULL; if( targetlist->first) /* there are one or more entries*/ targetlist->last->next = target; else /* first entry*/ targetlist->first = target; targetlist->last = target; #ifndef SERVER fprintf( logstream, "local log: target %s generated\n", targetpath); #endif return target; } void refer_target( target_param_t *reftarget, target_param_t **ptr) { *ptr = reftarget; reftarget->num_of_use++; } void unrefer_target( target_param_t *target) { target->num_of_use--; } void delete_target( target_param_t **target) { close( (*target)->fd); #ifdef SERVER if( (*target)->tmpfname){ fprintf( FCGI_stderr, "Temporal file %s is deleted\n", (*target)->tmpfname); remove( (*target)->tmpfname); } #endif if( (*target)->codeidx) delete_index ( &(*target)->codeidx); #ifndef SERVER fprintf( logstream, "local log: target: %s deleted\n", (*target)->targetname); #endif free( (*target)->targetname); free(*target); } void delete_target_in_list( target_param_t **target, targetlist_param_t *targetlist) { target_param_t *ptr; if( *target == targetlist->first) targetlist->first = (*target)->next; else{ ptr = targetlist->first; while( ptr->next != *target){ ptr=ptr->next; } ptr->next = (*target)->next; if( *target == targetlist->last) targetlist->last = ptr; } delete_target( target); } void delete_targetlist(targetlist_param_t **targetlist) { target_param_t *targetPtr, *targetNext; targetPtr = (*targetlist)->first; while( targetPtr != NULL){ targetNext=targetPtr->next; delete_target( &targetPtr); targetPtr=targetNext; } free( *targetlist); } void print_target( target_param_t *target) { fprintf( logstream, "target:\n"); fprintf( logstream, "\t tid=%s\n", target->tid); fprintf( logstream, "\t csn=%d\n", target->csn); fprintf( logstream, "\t target=%s\n\n", target->targetname); } void print_alltarget( targetlist_param_t *targetlist) { target_param_t *ptr; ptr = targetlist->first; while( ptr != NULL){ print_target( ptr); ptr=ptr->next; } } target_param_t * search_target( char targetname[], targetlist_param_t *targetlist) { target_param_t *foundtarget; foundtarget = targetlist->first; while( foundtarget != NULL){ if( strcmp( targetname, foundtarget->targetname) == 0) return foundtarget; foundtarget = foundtarget->next; } return NULL; } target_param_t * search_targetBytid( char tid[], targetlist_param_t *targetlist) { target_param_t *foundtarget; foundtarget = targetlist->first; while( foundtarget != NULL){ if( strcmp( tid, foundtarget->tid) == 0) return foundtarget; foundtarget = foundtarget->next; } return NULL; } int open_remotefile( char filepath[], char tmpfname[]); int open_jp2file( char filepath[], char tmpfname[]) { int fd; char *data; /* download remote target file to local storage*/ if( strncmp( filepath, "http://", 7) == 0){ if( (fd = open_remotefile( filepath, tmpfname)) == -1) return -1; } else{ tmpfname[0] = 0; if( (fd = open( filepath, O_RDONLY)) == -1){ fprintf( FCGI_stdout, "Reason: Target %s not found\r\n", filepath); return -1; } } /* Check resource is a JP family file.*/ if( lseek( fd, 0, SEEK_SET)==-1){ close(fd); fprintf( FCGI_stdout, "Reason: Target %s broken (lseek error)\r\n", filepath); return -1; } data = (char *)malloc( 12); /* size of header*/ if( read( fd, data, 12) != 12){ free( data); close(fd); fprintf( FCGI_stdout, "Reason: Target %s broken (read error)\r\n", filepath); return -1; } if( *data || *(data + 1) || *(data + 2) || *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)){ free( data); close(fd); fprintf( FCGI_stdout, "Reason: No JPEG 2000 Signature box in target %s\r\n", filepath); return -1; } free( data); return fd; } #ifdef SERVER static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream); #endif int open_remotefile( char filepath[], char tmpfname[]) { #ifndef SERVER (void)filepath; (void)tmpfname; fprintf( FCGI_stderr, "Remote file can not be opened in local mode\n"); return -1; #else CURL *curl_handle; int fd; curl_handle = curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, filepath); curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); snprintf( tmpfname, MAX_LENOFTID, "%x-%x.jp2", (unsigned int)time(NULL), (unsigned int)rand()); fprintf( FCGI_stderr, "%s is downloaded to a temporal new file %s\n", filepath, tmpfname); if( (fd = open( tmpfname, O_RDWR|O_CREAT|O_EXCL, S_IRWXU)) == -1){ fprintf( FCGI_stdout, "Reason: File open error %s\r\n", tmpfname); curl_easy_cleanup(curl_handle); return -1; } curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &fd); curl_easy_perform(curl_handle); curl_easy_cleanup(curl_handle); return fd; #endif /*SERVER*/ } #ifdef SERVER static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { int *fd = (int *)stream; int written = write( *fd, ptr, size*nmemb); return written; } #endif /*SERVER*/ openjpeg-1.5.2/applications/jpip/libopenjpip/boxheader_manager.h0000644000175000017500000000547512315002075024755 0ustar mathieumathieu/* * $Id: boxheader_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 BOXHEADER_MANAGER_H_ # define BOXHEADER_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" /** box header parameters*/ typedef struct boxheader_param{ Byte_t headlen; /**< header length 8 or 16*/ Byte8_t length; /**< length of the reference Box*/ char type[4]; /**< type of information in the DBox*/ struct boxheader_param *next; /**< pointer to the next header box*/ } boxheader_param_t; /** * generate a box header at the given offset * * @param[in] fd file discriptor of the JP2 file * @param[in] offset Box offset * @return pointer to the structure of generate box header parameters */ boxheader_param_t * gene_boxheader( int fd, Byte8_t offset); /** * generate a child box header at the given offset * * @param[in] superbox super box pointer * @param[in] offset offset from DBox first byte of superbox * @return pointer to the structure of generate box header parameters */ boxheader_param_t * gene_childboxheader( box_param_t *superbox, Byte8_t offset); /** * print box header parameters * * @param[in] boxheader boxheader pointer */ void print_boxheader( boxheader_param_t *boxheader); #endif /* !BOXHEADER_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/cache_manager.c0000644000175000017500000001474512315002075024052 0ustar mathieumathieu/* * $Id: cache_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "cache_manager.h" cachelist_param_t * gene_cachelist() { cachelist_param_t *cachelist; cachelist = (cachelist_param_t *)malloc( sizeof(cachelist_param_t)); cachelist->first = NULL; cachelist->last = NULL; return cachelist; } void delete_cachelist(cachelist_param_t **cachelist) { cache_param_t *cachePtr, *cacheNext; cachePtr = (*cachelist)->first; while( cachePtr != NULL){ cacheNext=cachePtr->next; delete_cache( &cachePtr); cachePtr=cacheNext; } free( *cachelist); } cache_param_t * gene_cache( char *targetname, int csn, char *tid, char *cid) { cache_param_t *cache; cache = (cache_param_t *)malloc( sizeof(cache_param_t)); cache->filename = strdup( targetname); cache->tid = strdup( tid); cache->csn = csn; cache->cid = (char **)malloc( sizeof(char *)); *cache->cid = strdup( cid); cache->numOfcid = 1; #if 1 cache->metadatalist = NULL; #else cache->metadatalist = gene_metadatalist(); #endif cache->ihdrbox = NULL; cache->next = NULL; return cache; } void delete_cache( cache_param_t **cache) { int i; free( (*cache)->filename); free( (*cache)->tid); delete_metadatalist( &(*cache)->metadatalist); if((*cache)->ihdrbox) free((*cache)->ihdrbox); for( i=0; i<(*cache)->numOfcid; i++) free( (*cache)->cid[i]); free( (*cache)->cid); free( *cache); } void insert_cache_into_list( cache_param_t *cache, cachelist_param_t *cachelist) { if( cachelist->first) cachelist->last->next = cache; else cachelist->first = cache; cachelist->last = cache; } cache_param_t * search_cache( char targetname[], cachelist_param_t *cachelist) { cache_param_t *foundcache; if( !targetname) return NULL; foundcache = cachelist->first; while( foundcache != NULL){ if( strcmp( targetname, foundcache->filename) == 0) return foundcache; foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist) { cache_param_t *foundcache; foundcache = cachelist->first; while( foundcache != NULL){ if( csn == foundcache->csn) return foundcache; foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist) { cache_param_t *foundcache; int i; if( !cid) return NULL; foundcache = cachelist->first; while( foundcache != NULL){ for( i=0; inumOfcid; i++) if( strcmp( cid, foundcache->cid[i]) == 0) return foundcache; foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist) { cache_param_t *foundcache; if( !tid) return NULL; foundcache = cachelist->first; while( foundcache != NULL){ if( strcmp( tid, foundcache->tid) == 0) return foundcache; foundcache = foundcache->next; } return NULL; } void add_cachecid( char *cid, cache_param_t *cache) { if( !cid) return; if( (cache->cid = realloc( cache->cid, (cache->numOfcid+1)*sizeof(char *))) == NULL){ fprintf( stderr, "failed to add new cid to cache table in add_cachecid()\n"); return; } cache->cid[ cache->numOfcid] = strdup( cid); cache->numOfcid ++; } void update_cachetid( char *tid, cache_param_t *cache) { if( !tid) return; if( tid[0] != '0' && strcmp( tid, cache->tid) !=0){ fprintf( stderr, "tid is updated to %s for %s\n", tid, cache->filename); free( cache->tid); cache->tid = strdup( tid); } } void remove_cidInCache( char *cid, cache_param_t *cache); void remove_cachecid( char *cid, cachelist_param_t *cachelist) { cache_param_t *cache; cache = search_cacheBycid( cid, cachelist); remove_cidInCache( cid, cache); } void remove_cidInCache( char *cid, cache_param_t *cache) { int idx = -1; char **tmp; int i, j; for( i=0; inumOfcid; i++) if( strcmp( cid, cache->cid[i]) == 0){ idx = i; break; } if( idx == -1){ fprintf( stderr, "cid: %s not found\n", cid); return; } tmp = cache->cid; cache->cid = (char **)malloc( (cache->numOfcid-1)*sizeof(char *)); for( i=0, j=0; inumOfcid; i++){ if( i != idx){ cache->cid[j] = strdup( tmp[i]); j++; } free( tmp[i]); } free( tmp); cache->numOfcid --; } void print_cache( cache_param_t *cache) { int i; fprintf( stdout,"cache\n"); fprintf( stdout,"\t filename: %s\n", cache->filename); fprintf( stdout,"\t tid: %s\n", cache->tid); fprintf( stdout,"\t csn: %d\n", cache->csn); fprintf( stdout,"\t cid:"); for( i=0; inumOfcid; i++) fprintf( stdout," %s", cache->cid[i]); fprintf( stdout,"\n"); } void print_allcache( cachelist_param_t *cachelist) { cache_param_t *ptr; fprintf( stdout,"cache list\n"); ptr = cachelist->first; while( ptr != NULL){ print_cache( ptr); ptr=ptr->next; } } openjpeg-1.5.2/applications/jpip/libopenjpip/Makefile.am0000644000175000017500000000724612315002075023203 0ustar mathieumathieuMAINTAINERCLEANFILES = Makefile.in includesdir = $(includedir)/openjpeg-$(MAJOR_NR).$(MINOR_NR) includes_HEADERS = lib_LTLIBRARIES = if WANT_JPIP lib_LTLIBRARIES += libopenjpip_local.la endif if WANT_JPIP_SERVER lib_LTLIBRARIES += libopenjpip_server.la endif JPIP_SRC = \ openjpip.c \ query_parser.c \ channel_manager.c \ session_manager.c \ jpip_parser.c \ boxheader_manager.c \ codestream_manager.c \ imgreg_manager.c \ marker_manager.c \ msgqueue_manager.c \ box_manager.c \ faixbox_manager.c \ index_manager.c \ metadata_manager.c \ placeholder_manager.c \ byte_manager.c \ ihdrbox_manager.c \ manfbox_manager.c \ mhixbox_manager.c \ target_manager.c \ cachemodel_manager.c \ j2kheader_manager.c \ jp2k_encoder.c \ sock_manager.c \ openjpip.h \ bool.h \ boxheader_manager.h \ box_manager.h \ byte_manager.h \ codestream_manager.h \ faixbox_manager.h \ ihdrbox_manager.h \ imgreg_manager.h \ index_manager.h \ manfbox_manager.h \ marker_manager.h \ metadata_manager.h \ mhixbox_manager.h \ msgqueue_manager.h \ placeholder_manager.h \ target_manager.h \ cachemodel_manager.h \ j2kheader_manager.h \ jp2k_encoder.h \ query_parser.h \ channel_manager.h \ session_manager.h \ jpip_parser.h \ jp2k_decoder.h \ sock_manager.h SERVER_SRC = auxtrans_manager.c \ auxtrans_manager.h LOCAL_SRC = jp2k_decoder.c \ imgsock_manager.c \ jpipstream_manager.c \ cache_manager.c \ dec_clientmsg_handler.c \ imgsock_manager.h \ jpipstream_manager.h \ cache_manager.h \ dec_clientmsg_handler.h libopenjpip_server_la_CPPFLAGS = \ -I. \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip \ @FCGI_CFLAGS@ \ @LIBCURL_CFLAGS@ \ -DSERVER libopenjpip_server_la_CFLAGS = @THREAD_CFLAGS@ libopenjpip_server_la_LIBADD = @FCGI_LIBS@ @LIBCURL_LIBS@ @THREAD_LIBS@ -lm libopenjpip_server_la_LDFLAGS = -no-undefined -version-info @lt_version@ libopenjpip_server_la_SOURCES = $(JPIP_SRC) $(SERVER_SRC) libopenjpip_local_la_CPPFLAGS = \ -I. \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ -I$(top_srcdir)/applications/jpip/libopenjpip \ -I$(top_builddir)/applications/jpip/libopenjpip \ @LIBCURL_CFLAGS@ libopenjpip_local_la_CFLAGS = libopenjpip_local_la_LIBADD = $(top_builddir)/libopenjpeg/libopenjpeg.la -lm libopenjpip_local_la_LDFLAGS = -no-undefined -version-info @lt_version@ libopenjpip_local_la_SOURCES = $(JPIP_SRC) $(LOCAL_SRC) install-data-hook: if WANT_JPIP_SERVER @echo -e " (LA)\t$(libdir)/libopenjpip_server.la" >> $(top_builddir)/report.txt if BUILD_SHARED @( $(call solist_s) ) >> $(top_builddir)/report.txt endif if BUILD_STATIC @echo -e " (A)\t$(base_s)/$(a_s)" >> $(top_builddir)/report.txt endif endif if WANT_JPIP @echo -e " (LA)\t$(libdir)/libopenjpip_local.la" >> $(top_builddir)/report.txt if BUILD_SHARED @( $(call solist_c) ) >> $(top_builddir)/report.txt endif if BUILD_STATIC @echo -e " (A)\t$(base_c)/$(a_c)" >> $(top_builddir)/report.txt endif endif solist_s = $(foreach f, $(dll_s) $(so_s), echo -e ' $(SO_PREFIX)\t$(base_s)/$(f)' ;) get_tok_s = $(shell grep -E "^$(1)=" libopenjpip_server.la | cut -d "'" -f 2) base_s = $(call get_tok_s,libdir) so_s = $(call get_tok_s,library_names) a_s = $(call get_tok_s,old_library) solist_c = $(foreach f, $(dll_c) $(so_c), echo -e ' $(SO_PREFIX)\t$(base_c)/$(f)' ;) get_tok_c = $(shell grep -E "^$(1)=" libopenjpip_local.la | cut -d "'" -f 2) base_c = $(call get_tok_c,libdir) so_c = $(call get_tok_c,library_names) a_c = $(call get_tok_c,old_library) if HAVE_WIN32 SO_PREFIX = (DLL) dll_s = $(call get_tok_s,dlname) dll_c = $(call get_tok_c,dlname) else if HAVE_DARWIN SO_PREFIX = (DY) dll_s = dll_c = else SO_PREFIX = (SO) dll_s = dll_c = endif endif openjpeg-1.5.2/applications/jpip/libopenjpip/query_parser.h0000644000175000017500000001020612315002075024027 0ustar mathieumathieu/* * $Id: query_parser.h 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 QUERY_PARSER_H_ # define QUERY_PARSER_H_ #include "bool.h" /** maximum number of meta request box */ #define MAX_NUMOFBOX 10 /** cnew aux transport name */ typedef enum cnew_transport { non, http, tcp, udp} cnew_transport_t; /** image return type */ typedef enum image_return { JPPstream, JPTstream, UNKNOWN=-1} image_return_t; /** Query parameters */ typedef struct query_param{ char *target; /**< target name */ char *tid; /**< target identifier */ int fx, fy; /**< frame size (fx,fy) */ int rx, ry, rw, rh; /**< roi region */ int layers; /**< quality layers */ int lastcomp; /**< last component number */ bool *comps; /**< components (dynamic array) for jpp-stream, null means all components */ char *cid; /**< channel identifier */ cnew_transport_t cnew; /**< transport name if there is new channel request, else non */ char *cclose; /**< list of closing channel identifiers, separated by '\0' */ int numOfcclose; /**< number of closing channels */ char box_type[MAX_NUMOFBOX][4]; /**< interested box-types */ int limit[MAX_NUMOFBOX]; /**< limit value, -1: skeleton request "r", 0: entire contents */ bool w[MAX_NUMOFBOX]; /**< Metadata request qualifier flags */ bool s[MAX_NUMOFBOX]; bool g[MAX_NUMOFBOX]; bool a[MAX_NUMOFBOX]; bool priority[MAX_NUMOFBOX]; /**< priority flag */ int root_bin; /**< root-bin */ int max_depth; /**< max-depth */ bool metadata_only; /**< metadata-only request */ image_return_t return_type; /**< image return type */ int len; /**< maximum response length */ } query_param_t; /** * parse query * * @param[in] query_string request query string * @return pointer to query parameters */ query_param_t * parse_query( char *query_string); /** * print query parameters * * @param[in] query_param query parameters */ void print_queryparam( query_param_t query_param); /** * delete query * * @param[in] query address of the deleting query pointer */ void delete_query( query_param_t **query); #endif /* !QUERY_PARSER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/boxheader_manager.c0000644000175000017500000000550112315002075024736 0ustar mathieumathieu/* * $Id: boxheader_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "boxheader_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ boxheader_param_t * gene_boxheader( int fd, Byte8_t offset) { Byte8_t boxlen; Byte_t headlen; char *boxtype; boxheader_param_t *boxheader; boxlen = fetch_4bytebigendian( fd, offset); boxtype = (char *)fetch_bytes( fd, offset+4, 4); headlen = 8; if( boxlen == 1){ /* read XLBox */ boxlen = fetch_8bytebigendian( fd, offset+8); headlen = 16; } boxheader = (boxheader_param_t *)malloc( sizeof( boxheader_param_t)); boxheader->headlen = headlen; boxheader->length = boxlen; strncpy( boxheader->type, boxtype, 4); boxheader->next = NULL; free( boxtype); return boxheader; } boxheader_param_t * gene_childboxheader( box_param_t *superbox, Byte8_t offset) { return gene_boxheader( superbox->fd, get_DBoxoff( superbox)+offset); } void print_boxheader( boxheader_param_t *boxheader) { fprintf( logstream, "boxheader info:\n" "\t type: %.4s\n" "\t length:%lld %#llx\n", boxheader->type, boxheader->length, boxheader->length); } openjpeg-1.5.2/applications/jpip/libopenjpip/jp2k_encoder.c0000644000175000017500000005763412315002075023666 0ustar mathieumathieu/* * $Id: jp2k_encoder.c 1481 2012-03-02 08:44:04Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 "jp2k_encoder.h" #include "j2kheader_manager.h" #include "imgreg_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ /** * search a message by class_id * * @param[in] class_id class identifiers * @param[in] in_class_id in-class identifiers, -1 means any * @param[in] csn codestream number * @param[in] msg first message pointer of the searching list * @return found message pointer */ message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg); /** * reconstruct j2k codestream from JPT- (in future, JPP-) stream * * @param[in] msgqueue message queue pointer * @param[in] jpipstream original JPT- JPP- stream * @param[in] csn codestream number * @param[in] fw reconstructing image frame width * @param[in] fh reconstructing image frame height * @param[out] codelen codestream length * @return generated reconstructed j2k codestream */ Byte_t * recons_codestream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *codelen); Byte_t * recons_j2k( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen) { Byte_t *j2kstream = NULL; if( !msgqueue) return NULL; j2kstream = recons_codestream( msgqueue, jpipstream, csn, fw, fh, j2klen); return j2kstream; } Byte_t * add_emptyboxstream( placeholder_param_t *phld, Byte_t *jp2stream, Byte8_t *jp2len); Byte_t * add_msgstream( message_param_t *message, Byte_t *origstream, Byte_t *j2kstream, Byte8_t *j2klen); Byte_t * recons_jp2( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *jp2len) { message_param_t *ptr; Byte_t *jp2stream = NULL; Byte_t *codestream = NULL; Byte8_t codelen; Byte8_t jp2cDBoxOffset = 0, jp2cDBoxlen = 0; *jp2len = 0; if( !msgqueue) return NULL; ptr = msgqueue->first; while(( ptr = search_message( METADATA_MSG, -1, csn, ptr))!=NULL){ if( ptr->phld){ if( strncmp( (char *)ptr->phld->OrigBH+4, "jp2c", 4) == 0){ jp2cDBoxOffset = *jp2len + ptr->phld->OrigBHlen; jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); /* header only */ jp2cDBoxlen = *jp2len - jp2cDBoxOffset; } else jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); /* header only */ } jp2stream = add_msgstream( ptr, jpipstream, jp2stream, jp2len); ptr = ptr->next; } codestream = recons_codestream( msgqueue, jpipstream, csn, 0, 0, &codelen); if( jp2cDBoxOffset != 0 && codelen <= jp2cDBoxlen) memcpy( jp2stream+jp2cDBoxOffset, codestream, codelen); free( codestream); return jp2stream; } bool isJPPstream( Byte8_t csn, msgqueue_param_t *msgqueue); Byte_t * recons_codestream_from_JPTstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen); Byte_t * recons_codestream_from_JPPstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen); Byte_t * add_EOC( Byte_t *j2kstream, Byte8_t *j2klen); Byte_t * recons_codestream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *codelen) { if( isJPPstream( csn, msgqueue)) return recons_codestream_from_JPPstream( msgqueue, jpipstream, csn, fw, fh, codelen); else return recons_codestream_from_JPTstream( msgqueue, jpipstream, csn, fw, fh, codelen); } bool isJPPstream( Byte8_t csn, msgqueue_param_t *msgqueue) { message_param_t *msg; msg = msgqueue->first; while( msg){ if( msg->csn == csn){ if( msg->class_id <= 2) return true; else if( msg->class_id == 4 || msg->class_id == 5) return false; } msg = msg->next; } fprintf( FCGI_stderr, "Error, message of csn %lld not found\n", csn); return false; } Byte_t * add_mainhead_msgstream( msgqueue_param_t *msgqueue, Byte_t *origstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t *j2klen); Byte8_t get_last_tileID( msgqueue_param_t *msgqueue, Byte8_t csn, bool isJPPstream); Byte_t * add_emptytilestream( const Byte8_t tileID, Byte_t *j2kstream, Byte8_t *j2klen); Byte_t * recons_codestream_from_JPTstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen) { Byte_t *j2kstream = NULL; Byte8_t last_tileID, tileID; bool found; Byte8_t binOffset; message_param_t *ptr; SIZmarker_param_t SIZ; int mindeclev; *j2klen = 0; j2kstream = add_mainhead_msgstream( msgqueue, jpipstream, j2kstream, csn, j2klen); if( !get_mainheader_from_j2kstream( j2kstream, &SIZ, NULL)) return j2kstream; if( fw <= 0 || fh <= 0) mindeclev = 0; else mindeclev = comp_decomplev( fw, fh, SIZ.Xsiz, SIZ.Ysiz); last_tileID = get_last_tileID( msgqueue, csn, false); for( tileID=0; tileID <= last_tileID; tileID++){ found = false; binOffset = 0; ptr = msgqueue->first; while(( ptr = search_message( TILE_MSG, tileID, csn, ptr))!=NULL){ if( ptr->bin_offset == binOffset){ found = true; j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); binOffset += ptr->length; } ptr = ptr->next; } ptr = msgqueue->first; while(( ptr = search_message( EXT_TILE_MSG, tileID, csn, ptr))!=NULL){ if( ptr->aux > mindeclev){ /* FIXME: pointer comparison ? */ if( ptr->bin_offset == binOffset){ found = true; j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); binOffset += ptr->length; } } ptr = ptr->next; } if(!found) j2kstream = add_emptytilestream( tileID, j2kstream, j2klen); } j2kstream = add_EOC( j2kstream, j2klen); return j2kstream; } Byte_t * add_SOTmkr( Byte_t *j2kstream, Byte8_t *j2klen); Byte_t * recons_bitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_codestream_from_JPPstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int fw, int fh, Byte8_t *j2klen) { Byte_t *j2kstream = NULL; Byte8_t tileID, last_tileID; Byte8_t SOToffset; bool foundTH; Byte8_t binOffset; message_param_t *ptr; SIZmarker_param_t SIZ; CODmarker_param_t COD; int max_reslev, mindeclev; *j2klen = 0; j2kstream = add_mainhead_msgstream( msgqueue, jpipstream, j2kstream, csn, j2klen); if( !get_mainheader_from_j2kstream( j2kstream, &SIZ, &COD)) return j2kstream; if( fw == 0 || fh == 0) mindeclev = 0; else mindeclev = comp_decomplev( fw, fh, SIZ.Xsiz, SIZ.Ysiz); max_reslev = -1; last_tileID = get_last_tileID( msgqueue, csn, true); for( tileID=0; tileID <= last_tileID; tileID++){ ptr = msgqueue->first; binOffset = 0; foundTH = false; SOToffset = *j2klen; while(( ptr = search_message( TILE_HEADER_MSG, tileID, csn, ptr))!=NULL){ if( ptr->bin_offset == binOffset){ j2kstream = add_SOTmkr( j2kstream, j2klen); j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); foundTH = true; binOffset += ptr->length; } ptr = ptr->next; } if( foundTH){ j2kstream = recons_bitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, &max_reslev, j2klen); modify_tileheader( j2kstream, SOToffset, (max_reslevfirst; binOffset = 0; while(( ptr = search_message( MAINHEADER_MSG, -1, csn, ptr))!=NULL){ if( ptr->bin_offset == binOffset){ j2kstream = add_msgstream( ptr, origstream, j2kstream, j2klen); binOffset += ptr->length; } ptr = ptr->next; } return j2kstream; } Byte_t * add_SOTmkr( Byte_t *j2kstream, Byte8_t *j2klen) { Byte_t *buf; const Byte2_t SOT = 0x90ff; buf = (Byte_t *)malloc(( *j2klen)+2); memcpy( buf, j2kstream, *j2klen); memcpy( buf+(*j2klen), &SOT, 2); *j2klen += 2; if(j2kstream) free(j2kstream); return buf; } Byte_t * recons_LRCPbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_RLCPbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_RPCLbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_PCRLbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_CPRLbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen); Byte_t * recons_bitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen) { switch( COD.prog_order){ case LRCP: return recons_LRCPbitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, max_reslev, j2klen); case RLCP: return recons_RLCPbitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, max_reslev, j2klen); case RPCL: return recons_RPCLbitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, max_reslev, j2klen); case PCRL: return recons_PCRLbitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, max_reslev, j2klen); case CPRL: return recons_CPRLbitstream( msgqueue, jpipstream, j2kstream, csn, tileID, SIZ, COD, mindeclev, max_reslev, j2klen); default: fprintf( FCGI_stderr, "Error, progression order not supported\n"); } return j2kstream; } int comp_numOfprcts( Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int r); Byte8_t comp_seqID( Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int r, int p); Byte_t * recons_packet( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int *max_reslev, int comp_idx, int res_idx, int prct_idx, int lay_idx, Byte8_t *j2klen); Byte_t * recons_LRCPbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, int *max_reslev, Byte8_t *j2klen) { int r, p, c, l, numOfprcts; for( l=0; lfirst; binOffset = 0; foundPrec = false; l = 0; while(( ptr = search_message( PRECINCT_MSG, precID, csn, ptr))!=NULL){ if( ptr->bin_offset == binOffset){ if( lay_idx == l){ j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); foundPrec = true; if( *max_reslev < res_idx) *max_reslev = res_idx; break; } binOffset += ptr->length; l++; } ptr = ptr->next; } if( !foundPrec && COD.Scod & 0x01) j2kstream = add_padding( 1, j2kstream, j2klen); return j2kstream; } Byte_t * recons_precinct( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte_t *j2kstream, Byte8_t csn, Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int *max_reslev, int comp_idx, int res_idx, Byte8_t seqID, Byte8_t *j2klen) { Byte8_t precID, binOffset; message_param_t *ptr; bool foundPrec; precID = comp_precinct_id( tileID, comp_idx, seqID, SIZ.Csiz, SIZ.XTnum*SIZ.YTnum); ptr = msgqueue->first; binOffset = 0; foundPrec = false; while(( ptr = search_message( PRECINCT_MSG, precID, csn, ptr))!=NULL){ if( ptr->bin_offset == binOffset){ j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); foundPrec = true; binOffset += ptr->length; if( *max_reslev < res_idx) *max_reslev = res_idx; if( ptr->last_byte) break; } ptr = ptr->next; } if(!foundPrec && COD.Scod & 0x01) j2kstream = add_padding( COD.numOflayers, j2kstream, j2klen); return j2kstream; } Byte8_t comp_seqID( Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int r, int p) { Byte8_t seqID = 0; int rr; for( rr=0; rrfirst; while( msg){ if( isJPPstream){ if((msg->class_id == TILE_HEADER_MSG) && msg->csn == csn && last_tileID < msg->in_class_id) last_tileID = msg->in_class_id; } else{ if((msg->class_id == TILE_MSG || msg->class_id == EXT_TILE_MSG) && msg->csn == csn && last_tileID < msg->in_class_id) last_tileID = msg->in_class_id; } msg = msg->next; } return last_tileID; } message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg) { while( msg != NULL){ if( in_class_id == (Byte8_t)-1){ if( msg->class_id == class_id && msg->csn == csn) return msg; } else{ if( msg->class_id == class_id && msg->in_class_id == in_class_id && msg->csn == csn) return msg; } msg = msg->next; } return NULL; } Byte_t * gene_msgstream( message_param_t *message, Byte_t *stream, Byte8_t *length); Byte_t * gene_emptytilestream( const Byte8_t tileID, Byte8_t *length); Byte_t * add_msgstream( message_param_t *message, Byte_t *origstream, Byte_t *j2kstream, Byte8_t *j2klen) { Byte_t *newstream; Byte8_t newlen; Byte_t *buf; if( !message) return NULL; newstream = gene_msgstream( message, origstream, &newlen); buf = (Byte_t *)malloc(( *j2klen)+newlen); memcpy( buf, j2kstream, *j2klen); memcpy( buf+(*j2klen), newstream, newlen); *j2klen += newlen; free( newstream); if(j2kstream) free(j2kstream); return buf; } Byte_t * add_emptyboxstream( placeholder_param_t *phld, Byte_t *jp2stream, Byte8_t *jp2len) { Byte_t *newstream; Byte8_t newlen; Byte_t *buf; if( phld->OrigBHlen == 8) newlen = big4(phld->OrigBH); else newlen = big8(phld->OrigBH+8); newstream = (Byte_t *)malloc( newlen); memset( newstream, 0, newlen); memcpy( newstream, phld->OrigBH, phld->OrigBHlen); buf = (Byte_t *)malloc(( *jp2len)+newlen); memcpy( buf, jp2stream, *jp2len); memcpy( buf+(*jp2len), newstream, newlen); *jp2len += newlen; free( newstream); if(jp2stream) free(jp2stream); return buf; } Byte_t * add_emptytilestream( const Byte8_t tileID, Byte_t *j2kstream, Byte8_t *j2klen) { Byte_t *newstream; Byte8_t newlen; Byte_t *buf; newstream = gene_emptytilestream( tileID, &newlen); buf = (Byte_t *)malloc(( *j2klen)+newlen); memcpy( buf, j2kstream, *j2klen); memcpy( buf+(*j2klen), newstream, newlen); *j2klen += newlen; free( newstream); if(j2kstream) free(j2kstream); return buf; } Byte_t * add_padding( Byte8_t padding, Byte_t *j2kstream, Byte8_t *j2klen) { Byte_t *buf; buf = (Byte_t *)malloc(( *j2klen)+padding); memcpy( buf, j2kstream, *j2klen); memset( buf+(*j2klen), 0, padding); *j2klen += padding; if(j2kstream) free(j2kstream); return buf; } Byte_t * add_EOC( Byte_t *j2kstream, Byte8_t *j2klen) { Byte2_t EOC = 0xd9ff; Byte_t *buf; buf = (Byte_t *)malloc(( *j2klen)+2); memcpy( buf, j2kstream, *j2klen); memcpy( buf+(*j2klen), &EOC, 2); *j2klen += 2; if(j2kstream) free(j2kstream); return buf; } Byte_t * gene_msgstream( message_param_t *message, Byte_t *stream, Byte8_t *length) { Byte_t *buf; if( !message) return NULL; *length = message->length; buf = (Byte_t *)malloc( *length); memcpy( buf, stream+message->res_offset, *length); return buf; } Byte_t * gene_emptytilestream( const Byte8_t tileID, Byte8_t *length) { Byte_t *buf; const Byte2_t SOT = 0x90ff; const Byte2_t Lsot = 0xa << 8; Byte2_t Isot; const Byte4_t Psot = 0xe << 24; const Byte_t TPsot = 0, TNsot = 1; const Byte2_t SOD = 0x93ff; *length = 14; buf = (Byte_t *)malloc(*length); Isot = (((Byte2_t)tileID) << 8) | ((((Byte2_t)tileID) & 0xf0) >> 8); memcpy( buf, &SOT, 2); memcpy( buf+2, &Lsot, 2); memcpy( buf+4, &Isot, 2); memcpy( buf+6, &Psot, 4); memcpy( buf+10, &TPsot, 1); memcpy( buf+11, &TNsot, 1); memcpy( buf+12, &SOD, 2); return buf; } Byte_t * recons_j2kmainhead( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *j2klen) { *j2klen = 0; return add_mainhead_msgstream( msgqueue, jpipstream, NULL, csn, j2klen); } openjpeg-1.5.2/applications/jpip/libopenjpip/box_manager.c0000644000175000017500000002372112315002075023571 0ustar mathieumathieu/* * $Id: box_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "box_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ boxlist_param_t * gene_boxlist() { boxlist_param_t *boxlist; boxlist = (boxlist_param_t *)malloc( sizeof(boxlist_param_t)); boxlist->first = NULL; boxlist->last = NULL; return boxlist; } boxlist_param_t * get_boxstructure( int fd, Byte8_t offset, Byte8_t length) { boxlist_param_t *boxlist; box_param_t *box; int pos; boxlist = NULL; pos = offset; do{ if(!(box = gene_boxbyOffset( fd, pos))) break; pos += box->length; if( !boxlist) boxlist = gene_boxlist(); insert_box_into_list( box, boxlist); }while( pos < (int)(offset+length)); return boxlist; } box_param_t * gene_boxbyOffset( int fd, Byte8_t offset) { Byte_t *data; Byte8_t boxlen, headlen; char *boxtype; box_param_t *box; /* read LBox and TBox*/ if(!(data = fetch_bytes( fd, offset, 8))){ fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %lld)\n", fd, offset); return NULL; } headlen = 8; boxlen = (Byte8_t)big4(data); boxtype = (char *)(data+4); /* box type constraint*/ if( !isalpha(boxtype[0]) || !isalpha(boxtype[1]) || (!isalnum(boxtype[2])&&!isspace(boxtype[2])) || (!isalpha(boxtype[3])&&!isspace(boxtype[3]))){ free( data); return NULL; } if( boxlen == 1){ Byte_t *data2; headlen = 16; /* read XLBox*/ if((data2 = fetch_bytes( fd, offset+8, 8))){ boxlen = big8(data2); free(data2); } else{ fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %lld)\n", fd, offset); free( data); return NULL; } } box = (box_param_t *)malloc( sizeof( box_param_t)); box->fd = fd; box->offset = offset; box->headlen = headlen; box->length = boxlen; strncpy( box->type, boxtype, 4); box->next = NULL; free( data); return box; } box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset) { Byte8_t boxlen, headlen; char *boxtype; box_param_t *box; /* read LBox and TBox*/ headlen = 8; boxlen = (Byte8_t)big4( stream); boxtype = (char *)( stream+4); /* box type constraint*/ if( !isalpha(boxtype[0]) || !isalpha(boxtype[1]) || (!isalnum(boxtype[2])&&!isspace(boxtype[2])) || (!isalpha(boxtype[3])&&!isspace(boxtype[3]))){ return NULL; } if( boxlen == 1){ headlen = 16; boxlen = big8( stream+8); /* read XLBox*/ } box = (box_param_t *)malloc( sizeof( box_param_t)); box->fd = -1; box->offset = offset; box->headlen = headlen; box->length = boxlen; strncpy( box->type, boxtype, 4); box->next = NULL; return box; } box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, const char TBox[]) { Byte8_t pos; Byte_t *data; Byte8_t boxlen, headlen; char *boxtype; box_param_t *foundbox; if( length==0){ /* set the max length*/ if( (length = get_filesize( fd) - offset) <= 0) return NULL; } pos = offset; while( pos < offset+length-7){ /* LBox+TBox-1=7*/ /* read LBox and TBox*/ if((data = fetch_bytes( fd, pos, 8))){ headlen = 8; boxlen = (Byte8_t)big4(data); boxtype = (char *)(data+4); if( boxlen == 1){ Byte_t *data2; headlen = 16; /* read XLBox*/ if((data2 = fetch_bytes( fd, pos+8, 8))){ boxlen = big8(data2); free(data2); } else{ fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %lld, %lld, %s)\n", fd, offset, length, TBox); return NULL; } } if( strncmp ( boxtype, TBox, 4) == 0){ foundbox = (box_param_t *)malloc( sizeof( box_param_t)); foundbox->fd = fd; foundbox->offset = pos; foundbox->headlen = headlen; foundbox->length = boxlen; strncpy( foundbox->type, TBox, 4); foundbox->next = NULL; free( data); return foundbox; } free( data); } else{ fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %lld, %lld, %s)\n", fd, offset, length, TBox); return NULL; } pos+= boxlen; } fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox); return NULL; } box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, const char TBox[]) { Byte8_t pos; Byte_t *data; Byte8_t boxlen, headlen; char *boxtype; box_param_t *foundbox; if( length<=0){ /* set the max length*/ fprintf( FCGI_stderr, "func gene_boxbyTypeinStream(), max length must be more than 0\n"); return NULL; } pos = offset; while( pos < offset+length-7){ /* LBox+TBox-1=7*/ /* read LBox and TBox*/ data = stream + pos; headlen = 8; boxlen = (Byte8_t)big4(data); boxtype = (char *)(data+4); if( boxlen == 1){ /* read XLBox*/ headlen = 16; boxlen = big8( data+8); } if( strncmp ( boxtype, TBox, 4) == 0){ foundbox = (box_param_t *)malloc( sizeof( box_param_t)); foundbox->fd = -1; foundbox->offset = pos; foundbox->headlen = headlen; foundbox->length = boxlen; strncpy( foundbox->type, TBox, 4); foundbox->next = NULL; return foundbox; } pos+= boxlen; } fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox); return NULL; } box_param_t * gene_childboxbyOffset( box_param_t *superbox, Byte8_t offset) { return gene_boxbyOffset( superbox->fd, get_DBoxoff( superbox)+offset); } box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[]) { return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, get_DBoxlen( superbox)-offset, TBox); } Byte8_t get_DBoxoff( box_param_t *box) { return box->offset+box->headlen; } Byte8_t get_DBoxlen( box_param_t *box) { return box->length-box->headlen; } Byte_t * fetch_headbytes( box_param_t *box) { return fetch_bytes( box->fd, box->offset, box->headlen); } Byte_t * fetch_DBoxbytes( box_param_t *box, long offset, int size) { return fetch_bytes( box->fd, get_DBoxoff( box)+offset, size); } Byte_t fetch_DBox1byte( box_param_t *box, long offset) { return fetch_1byte( box->fd, get_DBoxoff( box)+offset); } Byte2_t fetch_DBox2bytebigendian( box_param_t *box, long offset) { return fetch_2bytebigendian( box->fd, get_DBoxoff( box)+offset); } Byte4_t fetch_DBox4bytebigendian( box_param_t *box, long offset) { return fetch_4bytebigendian( box->fd, get_DBoxoff( box)+offset); } Byte8_t fetch_DBox8bytebigendian( box_param_t *box, long offset) { return fetch_8bytebigendian( box->fd, get_DBoxoff( box)+offset); } box_param_t * search_box( const char type[], boxlist_param_t *boxlist) { box_param_t *foundbox; foundbox = boxlist->first; while( foundbox != NULL){ if( strncmp( type, foundbox->type, 4) == 0) return foundbox; foundbox = foundbox->next; } fprintf( FCGI_stderr, "Error: Box %s not found\n", type); return NULL; } void print_box( box_param_t *box) { fprintf( logstream, "box info:\n" "\t type: %.4s\n" "\t offset: %lld %#llx\n" "\t header length: %d\n" "\t length: %lld %#llx\n", box->type, box->offset, box->offset, box->headlen, box->length, box->length); } void print_allbox( boxlist_param_t *boxlist) { box_param_t *ptr; if( !boxlist) return; ptr = boxlist->first; if( !ptr) fprintf( logstream, "no box\n"); fprintf( logstream, "all box info: \n"); while( ptr != NULL){ print_box( ptr); ptr=ptr->next; } } void delete_box_in_list( box_param_t **box, boxlist_param_t *boxlist) { box_param_t *ptr; if( *box == boxlist->first) boxlist->first = (*box)->next; else{ ptr = boxlist->first; while( ptr->next != *box){ ptr=ptr->next; } ptr->next = (*box)->next; if( *box == boxlist->last) boxlist->last = ptr; } free( *box); } void delete_box_in_list_by_type( char type[], boxlist_param_t *boxlist) { box_param_t *box; box = search_box( type, boxlist); delete_box_in_list( &box, boxlist); } void delete_boxlist( boxlist_param_t **boxlist) { box_param_t *boxPtr, *boxNext; if(!(*boxlist)) return; boxPtr = (*boxlist)->first; while( boxPtr != NULL){ boxNext=boxPtr->next; free( boxPtr); boxPtr=boxNext; } free( *boxlist); } void insert_box_into_list( box_param_t *box, boxlist_param_t *boxlist) { if( boxlist->first) boxlist->last->next = box; else boxlist->first = box; boxlist->last = box; } openjpeg-1.5.2/applications/jpip/libopenjpip/channel_manager.h0000644000175000017500000001024212315002075024410 0ustar mathieumathieu/* * $Id: channel_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 CHANNEL_MANAGER_H_ # define CHANNEL_MANAGER_H_ #include #include "query_parser.h" #include "cachemodel_manager.h" #include "auxtrans_manager.h" /** maximum length of channel identifier*/ #define MAX_LENOFCID 30 /** Channel parameters*/ typedef struct channel_param{ cachemodel_param_t *cachemodel; /**< reference pointer to the cache model*/ char cid[MAX_LENOFCID]; /**< channel identifier*/ cnew_transport_t aux; /**< auxiliary transport*/ /* - a record of the client's capabilities and preferences to the extent that the server queues requests*/ time_t start_tm; /**< starting time*/ struct channel_param *next; /**< pointer to the next channel*/ } channel_param_t; /** Channel list parameters*/ typedef struct channellist_param{ channel_param_t *first; /**< first channel pointer of the list*/ channel_param_t *last; /**< last channel pointer of the list*/ } channellist_param_t; /** * generate a channel list * * @return pointer to the generated channel list */ channellist_param_t * gene_channellist(void); /** * generate a channel under the channel list * * @param[in] query_param query parameters * @param[in] auxtrans auxiliary transport * @param[in] cachemodel reference cachemodel * @param[in] channellist channel list pointer * @return pointer to the generated channel */ channel_param_t * gene_channel( query_param_t query_param, auxtrans_param_t auxtrans, cachemodel_param_t *cachemodel, channellist_param_t *channellist); /** * set channel variable parameters * * @param[in] query_param query parameters * @param[in,out] channel pointer to the modifying channel */ void set_channel_variable_param( query_param_t query_param, channel_param_t *channel); /** * delete a channel * * @param[in] channel address of the deleting channel pointer * @param[in,out] channellist channel list pointer */ void delete_channel( channel_param_t **channel, channellist_param_t *channellist); /** * delete channel list * * @param[in,out] channellist address of the channel list pointer */ void delete_channellist( channellist_param_t **channellist); /** * print all channel parameters * * @param[in] channellist channel list pointer */ void print_allchannel( channellist_param_t *channellist); /** * search a channel by channel ID * * @param[in] cid channel identifier * @param[in] channellist channel list pointer * @return found channel pointer */ channel_param_t * search_channel( char cid[], channellist_param_t *channellist); #endif /* !CHANNEL_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/byte_manager.c0000644000175000017500000001137012315002075023741 0ustar mathieumathieu/* * $Id: byte_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 #ifdef _WIN32 #include #else #include #include #endif #include #include #include "byte_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ Byte_t * fetch_bytes( int fd, long offset, int size) { Byte_t *data; if( lseek( fd, offset, SEEK_SET)==-1){ fprintf( FCGI_stdout, "Reason: Target broken (fseek error)\r\n"); fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %d)\n", fd, offset, size); return NULL; } data = (Byte_t *)malloc( size); if( read( fd, data, size) != size){ free( data); fprintf( FCGI_stdout, "Reason: Target broken (read error)\r\n"); fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %d)\n", fd, offset, size); return NULL; } return data; } Byte_t fetch_1byte( int fd, long offset) { Byte_t code; if( lseek( fd, offset, SEEK_SET)==-1){ fprintf( FCGI_stdout, "Reason: Target broken (seek error)\r\n"); fprintf( FCGI_stderr, "Error: error in fetch_1byte( %d, %lld)\n", fd, offset); return 0; } if( read( fd, &code, 1) != 1){ fprintf( FCGI_stdout, "Reason: Target broken (read error)\r\n"); fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %lld)\n", fd, offset); return 0; } return code; } Byte2_t fetch_2bytebigendian( int fd, long offset) { Byte_t *data; Byte2_t code; if(!(data = fetch_bytes( fd, offset, 2))){ fprintf( FCGI_stderr, "Error: error in fetch_2bytebigendian( %d, %lld)\n", fd, offset); return 0; } code = big2(data); free( data); return code; } Byte4_t fetch_4bytebigendian( int fd, long offset) { Byte_t *data; Byte4_t code; if(!(data = fetch_bytes( fd, offset, 4))){ fprintf( FCGI_stderr, "Error: error in fetch_4bytebigendian( %d, %lld)\n", fd, offset); return 0; } code = big4(data); free( data); return code; } Byte8_t fetch_8bytebigendian( int fd, long offset) { Byte_t *data; Byte8_t code; if(!(data = fetch_bytes( fd, offset, 8))){ fprintf( FCGI_stderr, "Error: error in fetch_8bytebigendian( %d, %lld)\n", fd, offset); return 0; } code = big8(data); free( data); return code; } Byte2_t big2( Byte_t *buf) { return (((Byte2_t) buf[0]) << 8) + ((Byte2_t) buf[1]); } Byte4_t big4( Byte_t *buf) { return (((((((Byte4_t) buf[0]) << 8) + ((Byte4_t) buf[1])) << 8) + ((Byte4_t) buf[2])) << 8) + ((Byte4_t) buf[3]); } Byte8_t big8( Byte_t *buf) { return (((Byte8_t) big4 (buf)) << 32) + ((Byte8_t) big4 (buf + 4)); } void modify_4Bytecode( Byte4_t code, Byte_t *stream) { *stream = (Byte_t) ((Byte4_t)(code & 0xff000000) >> 24); *(stream+1) = (Byte_t) ((Byte4_t)(code & 0x00ff0000) >> 16); *(stream+2) = (Byte_t) ((Byte4_t)(code & 0x0000ff00) >> 8); *(stream+3) = (Byte_t) (code & 0x000000ff); } Byte8_t get_filesize( int fd) { struct stat sb; if( fstat( fd, &sb) == -1){ fprintf( FCGI_stdout, "Reason: Target broken (fstat error)\r\n"); fprintf( FCGI_stderr, "Error: error in get_filesize( %d)\n", fd); return 0; } return (Byte8_t)sb.st_size; } openjpeg-1.5.2/applications/jpip/libopenjpip/msgqueue_manager.h0000644000175000017500000001506012315002075024636 0ustar mathieumathieu/* * $Id: msgqueue_manager.h 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 MSGQUEUE_MANAGER_H_ # define MSGQUEUE_MANAGER_H_ #include "bool.h" #include "byte_manager.h" #include "cachemodel_manager.h" #include "placeholder_manager.h" #define PRECINCT_MSG 0 #define EXT_PRECINCT_MSG 1 #define TILE_HEADER_MSG 2 #define TILE_MSG 4 #define EXT_TILE_MSG 5 #define MAINHEADER_MSG 6 #define METADATA_MSG 8 /** message parameters */ typedef struct message_param{ bool last_byte; /**< if message contains the last byte of the data-bin*/ Byte8_t in_class_id; /**< in-class identifier A.2.3*/ Byte8_t class_id; /**< class identifiers */ Byte8_t csn; /**< index of the codestream*/ Byte8_t bin_offset; /**< offset of the data in this message from the start of the data-bin*/ Byte8_t length; /**< message byte length*/ Byte8_t aux; /**<*/ Byte8_t res_offset; /**< offset in the resource*/ placeholder_param_t *phld; /**< placeholder pointer in index*/ struct message_param *next; /**< pointer to the next message*/ } message_param_t; /** message queue parameters */ typedef struct msgqueue_param{ message_param_t *first; /**< first message pointer of the list*/ message_param_t *last; /**< last message pointer of the list*/ bool stateless; /**< if this is a stateless message queue*/ cachemodel_param_t *cachemodel; /**< reference cachemodel pointer*/ } msgqueue_param_t; /** * generate message queue * * @param[in] stateless if this is a stateless message queue * @param[in] cachemodel cachemodel pointer * @return generated message queue pointer */ msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel); /** * delete message queue * * @param[in] msgqueue address of the message queue pointer */ void delete_msgqueue( msgqueue_param_t **msgqueue); /** * delete a message in msgqueue * * @param[in] message address of the deleting message pointer * @param[in] msgqueue message queue pointer */ void delete_message_in_msgqueue( message_param_t **message, msgqueue_param_t *msgqueue); /** * print message queue * * @param[in] msgqueue message queue pointer */ void print_msgqueue( msgqueue_param_t *msgqueue); /** * enqueue main header data-bin into message queue * * @param[in,out] msgqueue message queue pointer */ void enqueue_mainheader( msgqueue_param_t *msgqueue); /** * enqueue tile headers data-bin into message queue * * @param[in] tile_id tile id starting from 0 * @param[in,out] msgqueue message queue pointer */ void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue); /** * enqueue tile data-bin into message queue * * @param[in] tile_id tile id starting from 0 * @param[in] level decomposition level * @param[in,out] msgqueue message queue pointer */ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue); /** * enqueue precinct data-bin into message queue * * @param[in] seq_id precinct sequence number within its tile * @param[in] tile_id tile index * @param[in] comp_id component number * @param[in] layers num of layers * @param[in,out] msgqueue message queue */ void enqueue_precinct( int seq_id, int tile_id, int comp_id, int layers, msgqueue_param_t *msgqueue); /** * enqueue Metadata-bin into message queue * * @param[in] meta_id metadata-bin id * @param[in,out] msgqueue message queue pointer */ void enqueue_metadata( int meta_id, msgqueue_param_t *msgqueue); /** * reconstruct JPT/JPP-stream from message queue * * @param[in] msgqueue message queue pointer * @param[in] tmpfd file discriptor to write JPT/JPP-stream */ void recons_stream_from_msgqueue( msgqueue_param_t *msgqueue, int tmpfd); /** * parse JPT- JPP- stream to message queue * * @param[in] JPIPstream JPT- JPP- stream data pointer * @param[in] streamlen JPIPstream length * @param[in] offset offset of the stream from the whole beginning * @param[in,out] msgqueue adding message queue pointer */ void parse_JPIPstream( Byte_t *JPIPstream, Byte8_t streamlen, Byte8_t offset, msgqueue_param_t *msgqueue); /** * parse JPT- JPP- stream to message queue * * @param[in] msgqueue reference message queue pointer * @param[in] stream stream data pointer * @param[in] streamlen stream length * @param[in] metadatalist adding metadata list pointer */ void parse_metamsg( msgqueue_param_t *msgqueue, Byte_t *stream, Byte8_t streamlen, metadatalist_param_t *metadatalist); /** * compute precinct ID A.3.2.1 * * @param[in] t tile index * @param[in] c component index * @param[in] s sequence number * @param[in] num_components total number of components * @param[in] num_tiles total number of tiles * @return precicnt id */ Byte8_t comp_precinct_id( int t, int c, int s, int num_components, int num_tiles); #endif /* !MSGQUEUE_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/codestream_manager.c0000644000175000017500000000530312315002075025123 0ustar mathieumathieu/* * $Id: codestream_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "codestream_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ codestream_param_t set_codestream( int fd, Byte8_t offset, Byte8_t length) { codestream_param_t cs; cs.fd = fd; cs.offset = offset; cs.length = length; return cs; } Byte_t * fetch_codestreambytes( codestream_param_t *cs, long offset, int size) { return fetch_bytes( cs->fd, cs->offset+offset, size); } Byte_t fetch_codestream1byte( codestream_param_t *cs, long offset) { return fetch_1byte( cs->fd, cs->offset+offset); } Byte2_t fetch_codestream2bytebigendian( codestream_param_t *cs, long offset) { return fetch_2bytebigendian( cs->fd, cs->offset+offset); } Byte4_t fetch_codestream4bytebigendian( codestream_param_t *cs, long offset) { return fetch_4bytebigendian( cs->fd, cs->offset+offset); } void print_codestream( codestream_param_t cs) { fprintf( logstream, "codestream info:\n" "\t fd: %d\n" "\t offset: %#llx\n" "\t length: %#llx\n", cs.fd, cs.offset, cs.length); } openjpeg-1.5.2/applications/jpip/libopenjpip/placeholder_manager.h0000644000175000017500000000723312315002075025270 0ustar mathieumathieu/* * $Id: placeholder_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 PLACEHOLDER_MANAGER_H_ # define PLACEHOLDER_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" /** A.3.6.3 Placeholder box format*/ /** placeholder box parameters*/ typedef struct placeholder_param{ Byte4_t LBox; char TBox[4]; Byte4_t Flags; Byte8_t OrigID; Byte_t *OrigBH; /**< dynamic memory pointer*/ Byte_t OrigBHlen; /**< length of OrigBH*/ #ifdef AAA Byte8_t EquivID; Byte_t *EquivBH; /**< dynamic memory pointer*/ Byte_t EquivBHlen; /**< length of EquivBH*/ Byte8_t CSID; Byte4_t NCS; #endif /*AAA*/ struct placeholder_param *next; /**< pointer to the next placeholder*/ } placeholder_param_t; /** placeholder box list parameters*/ typedef struct placeholderlist_param{ placeholder_param_t *first; /**< first placeholder pointer of the list*/ placeholder_param_t *last; /**< last placeholder pointer of the list*/ } placeholderlist_param_t; /** * generate a placeholder list * * @return pointer to the generated placeholder list */ placeholderlist_param_t * gene_placeholderlist(void); /** * delete placeholder list * * @param[in,out] list address of the placeholder list pointer */ void delete_placeholderlist( placeholderlist_param_t **list); /** * generate a placeholder of a box * * @param[in] box box pointer * @param[in] origID metadata-bin ID of the bin containing the contents of the original box * @return pointer to the generated placeholder */ placeholder_param_t * gene_placeholder( box_param_t *box, int origID); /** * delete a placeholder * * @param[in,out] placeholder address of the placeholder pointer */ void delete_placeholder( placeholder_param_t **placeholder); void insert_placeholder_into_list( placeholder_param_t *phld, placeholderlist_param_t *phldlist); /** * print placeholder parameters * * @param[in] phld placeholder pointer */ void print_placeholder( placeholder_param_t *phld); /** * print all placeholder parameters * * @param[in] list placeholder list pointer */ void print_allplaceholder( placeholderlist_param_t *list); #endif /* !PLACEHOLDER_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/channel_manager.c0000644000175000017500000001235612315002075024413 0ustar mathieumathieu/* * $Id: channel_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "channel_manager.h" #ifdef _WIN32 #define snprintf _snprintf /* Visual Studio */ #endif #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ channellist_param_t * gene_channellist(void) { channellist_param_t *channellist; channellist = (channellist_param_t *)malloc( sizeof(channellist_param_t)); channellist->first = NULL; channellist->last = NULL; return channellist; } channel_param_t * gene_channel( query_param_t query_param, auxtrans_param_t auxtrans, cachemodel_param_t *cachemodel, channellist_param_t *channellist) { channel_param_t *channel; char transport[4][10] = { "non", "http", "http-tcp", "http-udp"}; if( !cachemodel){ fprintf( FCGI_stdout, "Status: 404\r\n"); fprintf( FCGI_stdout, "Reason: cnew cancelled\r\n"); return NULL; } channel = (channel_param_t *)malloc( sizeof(channel_param_t)); channel->cachemodel = cachemodel; /* set channel ID and get present time */ snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand()); channel->aux = query_param.cnew; /* only tcp implemented for now */ if( channel->aux == udp) channel->aux = tcp; channel->next=NULL; set_channel_variable_param( query_param, channel); if( channellist->first != NULL) channellist->last->next = channel; else channellist->first = channel; channellist->last = channel; fprintf( FCGI_stdout, "JPIP-cnew: cid=%s", channel->cid); fprintf( FCGI_stdout, ",transport=%s", transport[channel->aux]); if( channel->aux == tcp || channel->aux == udp) fprintf( FCGI_stdout, ",auxport=%d", channel->aux==tcp ? auxtrans.tcpauxport : auxtrans.udpauxport); fprintf( FCGI_stdout, "\r\n"); return channel; } void set_channel_variable_param( query_param_t query_param, channel_param_t *channel) { /* set roi information */ (void)query_param; (void)channel; } void delete_channel( channel_param_t **channel, channellist_param_t *channellist) { channel_param_t *ptr; if( *channel == channellist->first) channellist->first = (*channel)->next; else{ ptr = channellist->first; while( ptr->next != *channel){ ptr=ptr->next; } ptr->next = (*channel)->next; if( *channel == channellist->last) channellist->last = ptr; } #ifndef SERVER fprintf( logstream, "local log: channel: %s deleted\n", (*channel)->cid); #endif free(*channel); } void delete_channellist( channellist_param_t **channellist) { channel_param_t *channelPtr, *channelNext; channelPtr = (*channellist)->first; while( channelPtr != NULL){ channelNext=channelPtr->next; #ifndef SERVER fprintf( logstream, "local log: channel %s deleted!\n", channelPtr->cid); #endif free(channelPtr); channelPtr=channelNext; } free( *channellist); } void print_allchannel( channellist_param_t *channellist) { channel_param_t *ptr; ptr = channellist->first; while( ptr != NULL){ fprintf( logstream,"channel-ID=%s \t target=%s\n", ptr->cid, ptr->cachemodel->target->targetname); ptr=ptr->next; } } channel_param_t * search_channel( char cid[], channellist_param_t *channellist) { channel_param_t *foundchannel; foundchannel = channellist->first; while( foundchannel != NULL){ if( strcmp( cid, foundchannel->cid) == 0) return foundchannel; foundchannel = foundchannel->next; } fprintf( FCGI_stdout, "Status: 503\r\n"); fprintf( FCGI_stdout, "Reason: Channel %s not found in this session\r\n", cid); return NULL; } openjpeg-1.5.2/applications/jpip/libopenjpip/marker_manager.c0000644000175000017500000000465712315002075024271 0ustar mathieumathieu/* * $Id: marker_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "marker_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ marker_param_t set_marker( codestream_param_t cs, Byte2_t code, Byte8_t offset, Byte2_t length) { marker_param_t mkr; mkr.cs = cs; mkr.code = code; mkr.offset = offset; mkr.length = length; return mkr; } Byte_t fetch_marker1byte( marker_param_t marker, long offset) { return fetch_codestream1byte( &(marker.cs), marker.offset+offset); } Byte2_t fetch_marker2bytebigendian( marker_param_t marker, long offset) { return fetch_codestream2bytebigendian( &(marker.cs), marker.offset+offset); } Byte4_t fetch_marker4bytebigendian( marker_param_t marker, long offset) { return fetch_codestream4bytebigendian( &(marker.cs), marker.offset+offset); } openjpeg-1.5.2/applications/jpip/libopenjpip/openjpip.c0000644000175000017500000002632012315002075023131 0ustar mathieumathieu/* * $Id: openjpip.c 1480 2012-03-01 20:58:29Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "openjpip.h" #include "jpip_parser.h" #include "channel_manager.h" #include "byte_manager.h" #ifdef _WIN32 #include #else #include #endif #ifdef SERVER #include "auxtrans_manager.h" #endif #include #include "dec_clientmsg_handler.h" #include "jpipstream_manager.h" #include #include #include #include #include "jp2k_encoder.h" #ifdef SERVER server_record_t * init_JPIPserver( int tcp_auxport, int udp_auxport) { server_record_t *record = (server_record_t *)malloc( sizeof(server_record_t)); record->sessionlist = gene_sessionlist(); record->targetlist = gene_targetlist(); record->auxtrans = init_aux_transport( tcp_auxport, udp_auxport); return record; } void terminate_JPIPserver( server_record_t **rec) { delete_sessionlist( &(*rec)->sessionlist); delete_targetlist( &(*rec)->targetlist); close_aux_transport( (*rec)->auxtrans); free( *rec); } QR_t * parse_querystring( char *query_string) { QR_t *qr; qr = (QR_t *)malloc( sizeof(QR_t)); qr->query = parse_query( query_string); qr->msgqueue = NULL; qr->channel = NULL; return qr; } bool process_JPIPrequest( server_record_t *rec, QR_t *qr) { target_param_t *target = NULL; session_param_t *cursession = NULL; channel_param_t *curchannel = NULL; if( qr->query->target || qr->query->tid){ if( !identify_target( *(qr->query), rec->targetlist, &target)) return false; } if( qr->query->cid){ if( !associate_channel( *(qr->query), rec->sessionlist, &cursession, &curchannel)) return false; qr->channel = curchannel; } if( qr->query->cnew != non){ if( !open_channel( *(qr->query), rec->sessionlist, rec->auxtrans, target, &cursession, &curchannel)) return false; qr->channel = curchannel; } if( qr->query->cclose) if( !close_channel( *(qr->query), rec->sessionlist, &cursession, &curchannel)) return false; if( (qr->query->fx > 0 && qr->query->fy > 0) || qr->query->box_type[0][0] != 0 || qr->query->len > 0) if( !gene_JPIPstream( *(qr->query), target, cursession, curchannel, &qr->msgqueue)) return false; return true; } void add_EORmsg( int fd, QR_t *qr); void send_responsedata( server_record_t *rec, QR_t *qr) { int fd; char tmpfname[] = "tmpjpipstream.jpp"; Byte_t *jpipstream; Byte8_t len_of_jpipstream; if( (fd = open( tmpfname, O_RDWR|O_CREAT|O_EXCL, S_IRWXU)) == -1){ fprintf( FCGI_stderr, "file open error %s", tmpfname); fprintf( FCGI_stdout, "Status: 503\r\n"); fprintf( FCGI_stdout, "Reason: Implementation failed\r\n"); return; } recons_stream_from_msgqueue( qr->msgqueue, fd); add_EORmsg( fd, qr); /* needed at least for tcp and udp */ len_of_jpipstream = get_filesize( fd); jpipstream = fetch_bytes( fd, 0, len_of_jpipstream); close( fd); remove( tmpfname); fprintf( FCGI_stdout, "\r\n"); if( len_of_jpipstream){ if( qr->channel) if( qr->channel->aux == tcp || qr->channel->aux == udp){ send_responsedata_on_aux( qr->channel->aux==tcp, rec->auxtrans, qr->channel->cid, jpipstream, len_of_jpipstream, 1000); /* 1KB per frame*/ return; } if( fwrite( jpipstream, len_of_jpipstream, 1, FCGI_stdout) != 1) fprintf( FCGI_stderr, "Error: failed to write jpipstream\n"); } free( jpipstream); return; } void add_EORmsg( int fd, QR_t *qr) { unsigned char EOR[3]; if( qr->channel){ EOR[0] = 0x00; EOR[1] = is_allsent( *(qr->channel->cachemodel)) ? 0x01 : 0x02; EOR[2] = 0x00; if( write( fd, EOR, 3) != 3) fprintf( FCGI_stderr, "Error: failed to write EOR message\n"); } } void end_QRprocess( server_record_t *rec, QR_t **qr) { /* TODO: record client preferences if necessary*/ (void)rec; /* unused */ delete_query( &((*qr)->query)); delete_msgqueue( &((*qr)->msgqueue)); free( *qr); } void local_log( bool query, bool messages, bool sessions, bool targets, QR_t *qr, server_record_t *rec) { if( query) print_queryparam( *qr->query); if( messages) print_msgqueue( qr->msgqueue); if( sessions) print_allsession( rec->sessionlist); if( targets) print_alltarget( rec->targetlist); } #endif /*SERVER*/ #ifndef SERVER dec_server_record_t * init_dec_server( int port) { dec_server_record_t *record = (dec_server_record_t *)malloc( sizeof(dec_server_record_t)); record->cachelist = gene_cachelist(); record->jpipstream = NULL; record->jpipstreamlen = 0; record->msgqueue = gene_msgqueue( true, NULL); record->listening_socket = open_listeningsocket( port); return record; } void terminate_dec_server( dec_server_record_t **rec) { delete_cachelist( &(*rec)->cachelist); free( (*rec)->jpipstream); if( (*rec)->msgqueue) delete_msgqueue( &((*rec)->msgqueue)); if( close_socket( (*rec)->listening_socket) != 0) perror("close"); free( *rec); } client_t accept_connection( dec_server_record_t *rec) { client_t client; client = accept_socket( rec->listening_socket); if( client == -1) fprintf( stderr, "error: failed to connect to client\n"); return client; } bool handle_clientreq( client_t client, dec_server_record_t *rec) { bool quit = false; msgtype_t msgtype = identify_clientmsg( client); switch( msgtype){ case JPIPSTREAM: handle_JPIPstreamMSG( client, rec->cachelist, &rec->jpipstream, &rec->jpipstreamlen, rec->msgqueue); break; case PNMREQ: handle_PNMreqMSG( client, rec->jpipstream, rec->msgqueue, rec->cachelist); break; case XMLREQ: handle_XMLreqMSG( client, rec->jpipstream, rec->cachelist); break; case TIDREQ: handle_TIDreqMSG( client, rec->cachelist); break; case CIDREQ: handle_CIDreqMSG( client, rec->cachelist); break; case CIDDST: handle_dstCIDreqMSG( client, rec->cachelist); break; case SIZREQ: handle_SIZreqMSG( client, rec->jpipstream, rec->msgqueue, rec->cachelist); break; case JP2SAVE: handle_JP2saveMSG( client, rec->cachelist, rec->msgqueue, rec->jpipstream); break; case QUIT: quit = true; save_codestream( rec->jpipstream, rec->jpipstreamlen, "jpt"); break; case MSGERROR: break; } fprintf( stderr, "\t end of the connection\n\n"); if( close_socket(client) != 0){ perror("close"); return false; } if( quit) return false; return true; } jpip_dec_param_t * init_jpipdecoder( bool jp2) { jpip_dec_param_t *dec; dec = (jpip_dec_param_t *)calloc( 1, sizeof(jpip_dec_param_t)); dec->msgqueue = gene_msgqueue( true, NULL); if( jp2) dec->metadatalist = gene_metadatalist(); return dec; } bool fread_jpip( char fname[], jpip_dec_param_t *dec) { int infd; if(( infd = open( fname, O_RDONLY)) == -1){ fprintf( stderr, "file %s not exist\n", fname); return false; } if(!(dec->jpiplen = get_filesize(infd))) return false; dec->jpipstream = (Byte_t *)malloc( dec->jpiplen); if( read( infd, dec->jpipstream, dec->jpiplen) != (int)dec->jpiplen){ fprintf( stderr, "file reading error\n"); free( dec->jpipstream); return false; } close(infd); return true; } void decode_jpip( jpip_dec_param_t *dec) { parse_JPIPstream( dec->jpipstream, dec->jpiplen, 0, dec->msgqueue); if( dec->metadatalist){ /* JP2 encoding*/ parse_metamsg( dec->msgqueue, dec->jpipstream, dec->jpiplen, dec->metadatalist); dec->ihdrbox = gene_ihdrbox( dec->metadatalist, dec->jpipstream); dec->jp2kstream = recons_jp2( dec->msgqueue, dec->jpipstream, dec->msgqueue->first->csn, &dec->jp2klen); } else /* J2k encoding */ /* Notice: arguments fw, fh need to be set for LRCP, PCRL, CPRL*/ dec->jp2kstream = recons_j2k( dec->msgqueue, dec->jpipstream, dec->msgqueue->first->csn, 0, 0, &dec->jp2klen); } bool fwrite_jp2k( char fname[], jpip_dec_param_t *dec) { int outfd; #ifdef _WIN32 if(( outfd = open( fname, O_WRONLY|O_CREAT, _S_IREAD | _S_IWRITE)) == -1){ #else if(( outfd = open( fname, O_WRONLY|O_CREAT, S_IRWXU|S_IRWXG)) == -1){ #endif fprintf( stderr, "file %s open error\n", fname); return false; } if( write( outfd, dec->jp2kstream, dec->jp2klen) != (int)dec->jp2klen) fprintf( stderr, "j2k file write error\n"); close(outfd); return true; } void output_log( bool messages, bool metadata, bool ihdrbox, jpip_dec_param_t *dec) { if( messages) print_msgqueue( dec->msgqueue); if( metadata) print_allmetadata( dec->metadatalist); if( ihdrbox){ printf("W*H: %d*%d\n", dec->ihdrbox->height, dec->ihdrbox->width); printf("NC: %d, bpc: %d\n", dec->ihdrbox->nc, dec->ihdrbox->bpc); } } void destroy_jpipdecoder( jpip_dec_param_t **dec) { free( (*dec)->jpipstream); delete_msgqueue( &(*dec)->msgqueue); if( (*dec)->metadatalist){ delete_metadatalist( &(*dec)->metadatalist); free( (*dec)->ihdrbox); } free( (*dec)->jp2kstream); free( *dec); } index_t * get_index_from_JP2file( int fd) { char *data; /* Check resource is a JP family file.*/ if( lseek( fd, 0, SEEK_SET)==-1){ fprintf( stderr, "Error: File broken (lseek error)\n"); return NULL; } data = (char *)malloc( 12); /* size of header*/ if( read( fd, data, 12) != 12){ free( data); fprintf( stderr, "Error: File broken (read error)\n"); return NULL; } if( *data || *(data + 1) || *(data + 2) || *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)){ free( data); fprintf( stderr, "Error: No JPEG 2000 Signature box in this file\n"); return NULL; } free( data); return parse_jp2file( fd); } void destroy_index( index_t **idx) { delete_index( idx); } void output_index( index_t *index) { print_index( *index); } #endif /*SERVER*/ openjpeg-1.5.2/applications/jpip/libopenjpip/auxtrans_manager.c0000644000175000017500000001666312315002075024655 0ustar mathieumathieu/* * $Id: auxtrans_manager.c 1533 2012-03-02 16:51:10Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "auxtrans_manager.h" #ifdef _WIN32 #include #else #include #endif #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport) { auxtrans_param_t auxtrans; auxtrans.tcpauxport = tcp_auxport; auxtrans.udpauxport = udp_auxport; if( 49152 <= tcp_auxport && tcp_auxport <= 65535) auxtrans.tcplistensock = open_listeningsocket( tcp_auxport); else auxtrans.tcplistensock = -1; auxtrans.udplistensock = -1; /* open listening socket for udp later */ return auxtrans; } void close_aux_transport( auxtrans_param_t auxtrans) { if( auxtrans.tcplistensock != -1) if( close_socket( auxtrans.tcplistensock) != 0) perror("close"); if( auxtrans.udplistensock != -1) if( close_socket( auxtrans.udplistensock) != 0) perror("close"); } /*!< auxiliary response parameters */ typedef struct aux_response_param{ char *cid; /*!< channel ID */ unsigned char *data; /*!< sending data */ int datalen; /*!< length of data */ int maxlenPerFrame; /*!< maximum data length to send per frame */ SOCKET listensock; /*!< listeing socket */ #ifdef _WIN32 HANDLE hTh; /*!< thread handle */ #endif } aux_response_param_t; aux_response_param_t * gene_auxresponse( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame); void delete_auxresponse( aux_response_param_t **auxresponse); #ifdef _WIN32 unsigned __stdcall aux_streaming( void *arg); #else void * aux_streaming( void *arg); #endif void send_responsedata_on_aux( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame) { aux_response_param_t *auxresponse; #ifdef _WIN32 unsigned int threadId; #else pthread_t thread; int status; #endif if( istcp){ if( auxtrans.tcplistensock == -1){ fprintf( FCGI_stderr, "Error: error in send_responsedata_on_aux(), tcp listening socket no open\n"); return; } auxresponse = gene_auxresponse( istcp, auxtrans, cid, data, datalen, maxlenPerFrame); #ifdef _WIN32 auxresponse->hTh = (HANDLE)_beginthreadex( NULL, 0, &aux_streaming, auxresponse, 0, &threadId); if( auxresponse->hTh == 0) fprintf( FCGI_stderr,"ERRO: pthread_create() %s", strerror( (int)auxresponse->hTh)); #else status = pthread_create( &thread, NULL, &aux_streaming, auxresponse); if( status != 0) fprintf( FCGI_stderr,"ERROR: pthread_create() %s",strerror(status)); #endif } else fprintf( FCGI_stderr, "Error: error in send_responsedata_on_aux(), udp not implemented\n"); } aux_response_param_t * gene_auxresponse( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame) { aux_response_param_t *auxresponse; auxresponse = (aux_response_param_t *)malloc( sizeof(aux_response_param_t)); auxresponse->cid = strdup( cid); auxresponse->data = data; auxresponse->datalen = datalen; auxresponse->maxlenPerFrame = maxlenPerFrame; auxresponse->listensock = istcp ? auxtrans.tcplistensock : auxtrans.udplistensock; return auxresponse; } void delete_auxresponse( aux_response_param_t **auxresponse) { free( (*auxresponse)->cid); free( (*auxresponse)->data); free( *auxresponse); } /** * Identify cid sent from client * * @param [in] connected_socket file descriptor of the connected socket * @param [in] refcid refenrece channel ID * @param [in] fp file pointer for log of aux stream * @return true if identified, false otherwise */ bool identify_cid( SOCKET connected_socket, char refcid[], FILE *fp); bool recv_ack( SOCKET connected_socket, void *data); #ifdef _WIN32 unsigned __stdcall aux_streaming( void *arg) #else void * aux_streaming( void *arg) #endif { SOCKET connected_socket; unsigned char *chunk, *ptr; int maxLenOfBody, remlen, chunklen; const int headlen = 8; aux_response_param_t *auxresponse = (aux_response_param_t *)arg; #ifdef _WIN32 CloseHandle( auxresponse->hTh); #else pthread_detach( pthread_self()); #endif chunk = (unsigned char *)malloc( auxresponse->maxlenPerFrame); maxLenOfBody = auxresponse->maxlenPerFrame - headlen; remlen = auxresponse->datalen; while((connected_socket = accept_socket( auxresponse->listensock)) != -1){ if( identify_cid( connected_socket, auxresponse->cid, FCGI_stderr)){ ptr = auxresponse->data; while( 0 < remlen){ memset( chunk, 0, auxresponse->maxlenPerFrame); chunklen = remlen> 8) & 0xff; chunk[1] = chunklen & 0xff; memcpy( chunk+headlen, ptr, chunklen-headlen); do{ send_stream( connected_socket, chunk, chunklen); }while( !recv_ack( connected_socket, chunk)); remlen -= maxLenOfBody; ptr += maxLenOfBody; } if( close_socket( connected_socket) != 0) perror("close"); break; } } free( chunk); delete_auxresponse( &auxresponse); #ifdef _WIN32 _endthreadex(0); #else pthread_exit(0); #endif return 0; } bool identify_cid( SOCKET connected_socket, char refcid[], FILE *fp) { char *cid; bool succeed; if(!(cid = receive_string( connected_socket))){ fprintf( fp, "Error: error in identify_cid(), while receiving cid from client\n"); return false; } succeed = false; if( strncmp( refcid, cid, strlen( refcid)) == 0) succeed = true; free( cid); return succeed; } bool recv_ack( SOCKET connected_socket, void *data) { char *header; bool succeed; header = receive_stream( connected_socket, 8); if( memcmp( header, data, 8) != 0) succeed = false; else succeed = true; free( header); return succeed; } openjpeg-1.5.2/applications/jpip/libopenjpip/index_manager.c0000644000175000017500000005402412315002075024110 0ustar mathieumathieu/* * $Id: index_manager.c 53 2011-05-09 16:55:39Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "bool.h" #include "index_manager.h" #include "box_manager.h" #include "manfbox_manager.h" #include "mhixbox_manager.h" #include "codestream_manager.h" #include "marker_manager.h" #include "faixbox_manager.h" #include "boxheader_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER*/ /** * chekc JP2 box indexing * * @param[in] toplev_boxlist top level box list * @return if correct (true) or wrong (false) */ bool check_JP2boxidx( boxlist_param_t *toplev_boxlist); /** * set code index parameters (parse cidx box) * Annex I * * @param[in] cidx_box pointer to the reference cidx_box * @param[out] codeidx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_cidxdata( box_param_t *cidx_box, index_param_t *codeidx); index_param_t * parse_jp2file( int fd) { index_param_t *jp2idx; box_param_t *cidx; metadatalist_param_t *metadatalist; boxlist_param_t *toplev_boxlist; Byte8_t filesize; if( !(filesize = get_filesize( fd))) return NULL; if( !(toplev_boxlist = get_boxstructure( fd, 0, filesize))){ fprintf( FCGI_stderr, "Error: Not correctl JP2 format\n"); return NULL; } if( !check_JP2boxidx( toplev_boxlist)){ fprintf( FCGI_stderr, "Index format not supported\n"); delete_boxlist( &toplev_boxlist); return NULL; } if( !(cidx = search_box( "cidx", toplev_boxlist))){ fprintf( FCGI_stderr, "Box cidx not found\n"); delete_boxlist( &toplev_boxlist); return NULL; } jp2idx = (index_param_t *)malloc( sizeof(index_param_t)); if( !set_cidxdata( cidx, jp2idx)){ fprintf( FCGI_stderr, "Error: Not correctl format in cidx box\n"); free(jp2idx); delete_boxlist( &toplev_boxlist); return NULL; } delete_boxlist( &toplev_boxlist); metadatalist = const_metadatalist( fd); jp2idx->metadatalist = metadatalist; #ifndef SERVER fprintf( logstream, "local log: code index created\n"); #endif return jp2idx; } void print_index( index_param_t index) { int i; fprintf( logstream, "index info:\n"); fprintf( logstream, "\tCodestream Offset: %#llx\n", index.offset); fprintf( logstream, "\t Length: %#llx\n", index.length); fprintf( logstream, "\tMain header Length: %#llx\n", index.mhead_length); print_SIZ( index.SIZ); print_COD( index.COD); fprintf( logstream, "Tile part information: \n"); print_faixbox( index.tilepart); fprintf( logstream, "Tile header information: \n"); for( i=0; i<(int)(index.SIZ.XTnum*index.SIZ.YTnum);i++) print_mhixbox( index.tileheader[i]); fprintf( logstream, "Precinct packet information: \n"); for( i=0; imetadatalist)); delete_COD( (*index)->COD); delete_faixbox( &((*index)->tilepart)); for( i=0; i< (int)((*index)->SIZ.XTnum*(*index)->SIZ.YTnum);i++) delete_mhixbox( &((*index)->tileheader[i])); free( (*index)->tileheader); for( i=0; i<(*index)->SIZ.Csiz; i++) delete_faixbox( &((*index)->precpacket[i])); free( (*index)->precpacket); free(*index); } void delete_COD( CODmarker_param_t COD) { if( COD.XPsiz) free( COD.XPsiz); if( COD.YPsiz) free( COD.YPsiz); } bool check_JP2boxidx( boxlist_param_t *toplev_boxlist) { box_param_t *iptr, *fidx, *prxy; box_param_t *cidx, *jp2c; Byte8_t off; Byte8_t len; int pos; Byte8_t ooff; boxheader_param_t *obh; Byte_t ni; Byte8_t ioff; boxheader_param_t *ibh; iptr = search_box( "iptr", toplev_boxlist); fidx = search_box( "fidx", toplev_boxlist); cidx = search_box( "cidx", toplev_boxlist); jp2c = search_box( "jp2c", toplev_boxlist); prxy = gene_childboxbyType( fidx, 0, "prxy"); off = fetch_DBox8bytebigendian( iptr, 0); if( off != fidx->offset) fprintf( FCGI_stderr, "Reference File Index box offset in Index Finder box not correct\n"); len = fetch_DBox8bytebigendian( iptr, 8); if( len != fidx->length) fprintf( FCGI_stderr, "Reference File Index box length in Index Finder box not correct\n"); pos = 0; ooff = fetch_DBox8bytebigendian( prxy, pos); if( ooff != jp2c->offset) fprintf( FCGI_stderr, "Reference jp2c offset in prxy box not correct\n"); pos += 8; obh = gene_childboxheader( prxy, pos); if( obh->length != jp2c->length || strncmp( obh->type, "jp2c",4)!=0) fprintf( FCGI_stderr, "Reference jp2c header in prxy box not correct\n"); pos += obh->headlen; free(obh); ni = fetch_DBox1byte( prxy, pos); if( ni != 1){ fprintf( FCGI_stderr, "Multiple indexes not supported\n"); return false; } pos += 1; ioff = fetch_DBox8bytebigendian( prxy, pos); if( ioff != cidx->offset) fprintf( FCGI_stderr, "Reference cidx offset in prxy box not correct\n"); pos += 8; ibh = gene_childboxheader( prxy, pos); if( ibh->length != cidx->length || strncmp( ibh->type, "cidx",4)!=0) fprintf( FCGI_stderr, "Reference cidx header in prxy box not correct\n"); pos += ibh->headlen; free(ibh); free(prxy); return true; } /** * set code index parameters from cptr box * I.3.2.2 Codestream Finder box * * @param[in] cidx_box pointer to the reference cidx_box * @param[out] jp2idx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_cptrdata( box_param_t *cidx_box, index_param_t *jp2idx); /** * set code index parameters from mhix box for main header * I.3.2.4.3 Header Index Table box * * @param[in] cidx_box pointer to the reference cidx_box * @param[in] codestream codestream parameters * @param[out] jp2idx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_mainmhixdata( box_param_t *cidx_box, codestream_param_t codestream, index_param_t *jp2idx); /** * set code index parameters from tpix box * I.3.2.4.4 Tile-part Index Table box * * @param[in] cidx_box pointer to the reference cidx_box * @param[out] jp2idx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_tpixdata( box_param_t *cidx_box, index_param_t *jp2idx); /** * set code index parameters from thix box * I.3.2.4.5 Tile Header Index Table box * * @param[in] cidx_box pointer to the reference cidx_box * @param[out] jp2idx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_thixdata( box_param_t *cidx_box, index_param_t *jp2idx); /** * set code index parameters from ppix box * I.3.2.4.6 Precinct Packet Index Table box * * @param[in] cidx_box pointer to the reference cidx_box * @param[out] jp2idx pointer to index parameters * @return if succeeded (true) or failed (false) */ bool set_ppixdata( box_param_t *cidx_box, index_param_t *jp2idx); bool set_cidxdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *manf_box; manfbox_param_t *manf; codestream_param_t codestream; set_cptrdata( cidx_box, jp2idx); codestream = set_codestream( cidx_box->fd, jp2idx->offset, jp2idx->length); manf_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "manf"); manf = gene_manfbox( manf_box); if( !search_boxheader( "mhix", manf)){ fprintf( FCGI_stderr, "Error: mhix box not present in manfbox\n"); free(jp2idx); return false; } set_mainmhixdata( cidx_box, codestream, jp2idx); if( !search_boxheader( "tpix", manf)){ fprintf( FCGI_stderr, "Error: tpix box not present in manfbox\n"); free(jp2idx); return false; } set_tpixdata( cidx_box, jp2idx); if( !search_boxheader( "thix", manf)){ fprintf( FCGI_stderr, "Error: thix box not present in manfbox\n"); free(jp2idx); return false; } set_thixdata( cidx_box, jp2idx); if( !search_boxheader( "ppix", manf)){ fprintf( FCGI_stderr, "Error: ppix box not present in manfbox\n"); free(jp2idx); return false; } set_ppixdata( cidx_box, jp2idx); delete_manfbox( &manf); free( manf_box); return true; } bool set_cptrdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *box; /**< cptr box*/ Byte2_t dr, cont; if( !(box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "cptr"))) return false; /* DR: Data Reference. */ /* If 0, the codestream or its Fragment Table box exists in the current file*/ if(( dr = fetch_DBox2bytebigendian( box, 0))){ fprintf( FCGI_stderr, "Error: Codestream not present in current file\n"); free( box); return false; } /* CONT: Container Type*/ /* If 0, the entire codestream appears as a contiguous range of*/ /* bytes within its file or resource.*/ if(( cont = fetch_DBox2bytebigendian( box, 2))){ fprintf( FCGI_stderr, "Error: Can't cope with fragmented codestreams yet\n"); free( box); return false; } jp2idx->offset = fetch_DBox8bytebigendian( box, 4); jp2idx->length = fetch_DBox8bytebigendian( box, 12); free( box); return true; } /** * set SIZ marker information * A.5 Fixed information marker segment * A.5.1 Image and tile size (SIZ) * * @param[in] sizmkidx pointer to SIZ marker index in mhix box * @param[in] codestream codestream parameters * @param[out] SIZ SIZ marker parameters pointer * @return if succeeded (true) or failed (false) */ bool set_SIZmkrdata( markeridx_param_t *sizmkidx, codestream_param_t codestream, SIZmarker_param_t *SIZ); /** * set code index parameters from COD marker in codestream * A.6 Functional marker segments * A.6.1 Coding style default (COD) * * @param[in] codmkidx pointer to COD marker index in mhix box * @param[in] codestream codestream parameters * @param[out] COD COD marker parameters pointer * @return if succeeded (true) or failed (false) */ bool set_CODmkrdata( markeridx_param_t *codmkidx, codestream_param_t codestream, CODmarker_param_t *COD); bool set_mainmhixdata( box_param_t *cidx_box, codestream_param_t codestream, index_param_t *jp2idx) { box_param_t *mhix_box; mhixbox_param_t *mhix; markeridx_param_t *sizmkidx; markeridx_param_t *codmkidx; if( !(mhix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "mhix"))) return false; jp2idx->mhead_length = fetch_DBox8bytebigendian( mhix_box, 0); mhix = gene_mhixbox( mhix_box); free( mhix_box); sizmkidx = search_markeridx( 0xff51, mhix); set_SIZmkrdata( sizmkidx, codestream, &(jp2idx->SIZ)); codmkidx = search_markeridx( 0xff52, mhix); set_CODmkrdata( codmkidx, codestream, &(jp2idx->COD)); delete_mhixbox( &mhix); return true; } bool set_tpixdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *tpix_box; /**< tpix box*/ box_param_t *faix_box; /**< faix box*/ if( !(tpix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "tpix"))){ fprintf( FCGI_stderr, "Error: tpix box not present in cidx box\n"); return false; } if( !(faix_box = gene_boxbyType( tpix_box->fd, get_DBoxoff( tpix_box), get_DBoxlen( tpix_box), "faix"))){ fprintf( FCGI_stderr, "Error: faix box not present in tpix box\n"); return false; } jp2idx->tilepart = gene_faixbox( faix_box); free( tpix_box); free( faix_box); return true; } bool set_thixdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *thix_box, *manf_box, *mhix_box; manfbox_param_t *manf; boxheader_param_t *ptr; mhixbox_param_t *mhix; Byte8_t pos, mhixseqoff; Byte2_t tile_no; if( !(thix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "thix"))){ fprintf( FCGI_stderr, "Error: thix box not present in cidx box\n"); return false; } if( !(manf_box = gene_boxbyType( thix_box->fd, get_DBoxoff( thix_box), get_DBoxlen( thix_box), "manf"))){ fprintf( FCGI_stderr, "Error: manf box not present in thix box\n"); free( thix_box); return false; } manf = gene_manfbox( manf_box); ptr = manf->first; mhixseqoff = manf_box->offset+manf_box->length; pos = 0; tile_no = 0; jp2idx->tileheader = (mhixbox_param_t **)malloc( jp2idx->SIZ.XTnum*jp2idx->SIZ.YTnum*sizeof(mhixbox_param_t *)); while( ptr){ if( !(mhix_box = gene_boxbyType( thix_box->fd, mhixseqoff+pos, get_DBoxlen( thix_box)-manf_box->length-pos, "mhix"))){ fprintf( FCGI_stderr, "Error: mhix box not present in thix box\n"); delete_manfbox( &manf); free( manf_box); free( thix_box); return false; } mhix = gene_mhixbox( mhix_box); pos += mhix_box->length; ptr = ptr->next; free( mhix_box); jp2idx->tileheader[tile_no++] = mhix; } delete_manfbox( &manf); free( manf_box); free( thix_box); return true; } bool set_ppixdata( box_param_t *cidx_box, index_param_t *jp2idx) { box_param_t *ppix_box, *faix_box, *manf_box; manfbox_param_t *manf; /**< manf*/ boxheader_param_t *bh; /**< box headers*/ faixbox_param_t *faix; /**< faix*/ Byte8_t inbox_offset; int comp_idx; if( !(ppix_box = gene_boxbyType( cidx_box->fd, get_DBoxoff( cidx_box), get_DBoxlen( cidx_box), "ppix"))){ fprintf( FCGI_stderr, "Error: ppix box not present in cidx box\n"); return false; } inbox_offset = get_DBoxoff( ppix_box); if( !(manf_box = gene_boxbyType( ppix_box->fd, inbox_offset, get_DBoxlen( ppix_box), "manf"))){ fprintf( FCGI_stderr, "Error: manf box not present in ppix box\n"); free( ppix_box); return false; } free( ppix_box); manf = gene_manfbox( manf_box); bh = search_boxheader( "faix", manf); inbox_offset = manf_box->offset + manf_box->length; free( manf_box); jp2idx->precpacket = (faixbox_param_t **)malloc( jp2idx->SIZ.Csiz*sizeof(faixbox_param_t *)); for( comp_idx=0; bh!=NULL; bh=bh->next, comp_idx++){ if( jp2idx->SIZ.Csiz <= comp_idx ){ fprintf( FCGI_stderr, "Error: num of faix boxes is not identical to num of components in ppix box\n"); return false; } if( !(faix_box = gene_boxbyOffset( cidx_box->fd, inbox_offset))){ fprintf( FCGI_stderr, "Error: faix box not present in ppix box\n"); return false; } faix = gene_faixbox( faix_box); jp2idx->precpacket[comp_idx] = faix; inbox_offset = faix_box->offset + faix_box->length; free( faix_box); } delete_manfbox( &manf); return true; } bool set_SIZmkrdata( markeridx_param_t *sizmkidx, codestream_param_t codestream, SIZmarker_param_t *SIZ) { marker_param_t sizmkr; int i; sizmkr = set_marker( codestream, sizmkidx->code, sizmkidx->offset, sizmkidx->length); SIZ->Lsiz = fetch_marker2bytebigendian( sizmkr, 0); if( sizmkidx->length != SIZ->Lsiz){ fprintf( FCGI_stderr, "Error: marker %#x index is not correct\n", sizmkidx->code); return false; } SIZ->Rsiz = fetch_marker2bytebigendian( sizmkr, 2); SIZ->Xsiz = fetch_marker4bytebigendian( sizmkr, 4); SIZ->Ysiz = fetch_marker4bytebigendian( sizmkr, 8); SIZ->XOsiz = fetch_marker4bytebigendian( sizmkr, 12); SIZ->YOsiz = fetch_marker4bytebigendian( sizmkr, 16); SIZ->XTsiz = fetch_marker4bytebigendian( sizmkr, 20); SIZ->YTsiz = fetch_marker4bytebigendian( sizmkr, 24); SIZ->XTOsiz = fetch_marker4bytebigendian( sizmkr, 28); SIZ->YTOsiz = fetch_marker4bytebigendian( sizmkr, 32); SIZ->Csiz = fetch_marker2bytebigendian( sizmkr, 36); SIZ->XTnum = ( SIZ->Xsiz-SIZ->XTOsiz+SIZ->XTsiz-1)/SIZ->XTsiz; SIZ->YTnum = ( SIZ->Ysiz-SIZ->YTOsiz+SIZ->YTsiz-1)/SIZ->YTsiz; for( i=0; i<(int)SIZ->Csiz; i++){ SIZ->Ssiz[i] = fetch_marker1byte( sizmkr, 38+i*3); SIZ->XRsiz[i] = fetch_marker1byte( sizmkr, 39+i*3); SIZ->YRsiz[i] = fetch_marker1byte( sizmkr, 40+i*3); } return true; } bool set_CODmkrdata( markeridx_param_t *codmkidx, codestream_param_t codestream, CODmarker_param_t *COD) { marker_param_t codmkr; int i; codmkr = set_marker( codestream, codmkidx->code, codmkidx->offset, codmkidx->length); COD->Lcod = fetch_marker2bytebigendian( codmkr, 0); if( codmkidx->length != COD->Lcod){ fprintf( FCGI_stderr, "Error: marker %#x index is not correct\n", codmkidx->code); return false; } COD->Scod = fetch_marker1byte( codmkr, 2); COD->prog_order = fetch_marker1byte( codmkr, 3); COD->numOflayers = fetch_marker2bytebigendian( codmkr, 4); COD->numOfdecomp = fetch_marker1byte( codmkr, 7); if(COD->Scod & 0x01){ COD->XPsiz = (Byte4_t *)malloc( (COD->numOfdecomp+1)*sizeof(Byte4_t)); COD->YPsiz = (Byte4_t *)malloc( (COD->numOfdecomp+1)*sizeof(Byte4_t)); for( i=0; i<=COD->numOfdecomp; i++){ /*precinct size*/ COD->XPsiz[i] = pow( 2, fetch_marker1byte( codmkr, 12+i) & 0x0F); COD->YPsiz[i] = pow( 2,(fetch_marker1byte( codmkr, 12+i) & 0xF0) >> 4); } } else{ COD->XPsiz = (Byte4_t *)malloc( sizeof(Byte4_t)); COD->YPsiz = (Byte4_t *)malloc( sizeof(Byte4_t)); COD->XPsiz[0] = COD->YPsiz[0] = pow(2,15); } return true; } /* very very generic name see NOMINMAX */ #ifdef min #undef min #endif #ifdef max #undef max #endif Byte4_t max( Byte4_t n1, Byte4_t n2); Byte4_t min( Byte4_t n1, Byte4_t n2); range_param_t get_tile_range( Byte4_t Osiz, Byte4_t siz, Byte4_t TOsiz, Byte4_t Tsiz, Byte4_t tile_XYid, int level); range_param_t get_tile_Xrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level) { return get_tile_range( SIZ.XOsiz, SIZ.Xsiz, SIZ.XTOsiz, SIZ.XTsiz, tile_id%SIZ.XTnum, level); } range_param_t get_tile_Yrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level) { return get_tile_range( SIZ.YOsiz, SIZ.Ysiz, SIZ.YTOsiz, SIZ.YTsiz, tile_id/SIZ.XTnum, level); } range_param_t get_tile_range( Byte4_t Osiz, Byte4_t siz, Byte4_t TOsiz, Byte4_t Tsiz, Byte4_t tile_XYid, int level) { range_param_t range; int n; range.minvalue = max( Osiz, TOsiz+tile_XYid*Tsiz); range.maxvalue = min( siz, TOsiz+(tile_XYid+1)*Tsiz); for( n=0; n #include #include #include #include "j2kheader_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream); CODmarker_param_t get_CODmkrdata_from_j2kstream( Byte_t *CODstream); bool get_mainheader_from_j2kstream( Byte_t *j2kstream, SIZmarker_param_t *SIZ, CODmarker_param_t *COD) { if( *j2kstream++ != 0xff || *j2kstream++ != 0x4f){ fprintf( FCGI_stderr, "Error, j2kstream is not starting with SOC marker\n"); return false; } if( SIZ){ *SIZ = get_SIZmkrdata_from_j2kstream( j2kstream); if( SIZ->Lsiz == 0) return false; j2kstream += (SIZ->Lsiz+2); } if( COD){ if( !SIZ) j2kstream += (big2( j2kstream+2) + 2); *COD = get_CODmkrdata_from_j2kstream( j2kstream); if( COD->Lcod == 0) return false; } return true; } SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream) { SIZmarker_param_t SIZ = {0}; int i; if( *SIZstream++ != 0xff || *SIZstream++ != 0x51){ fprintf( FCGI_stderr, "Error, SIZ marker not found in the reconstructed j2kstream\n"); return SIZ; } SIZ.Lsiz = big2( SIZstream); SIZ.Rsiz = big2( SIZstream+2); SIZ.Xsiz = big4( SIZstream+4); SIZ.Ysiz = big4( SIZstream+8); SIZ.XOsiz = big4( SIZstream+12); SIZ.YOsiz = big4( SIZstream+16); SIZ.XTsiz = big4( SIZstream+20); SIZ.YTsiz = big4( SIZstream+24); SIZ.XTOsiz = big4( SIZstream+28); SIZ.YTOsiz = big4( SIZstream+32); SIZ.Csiz = big2( SIZstream+36); SIZ.XTnum = ( SIZ.Xsiz-SIZ.XTOsiz+SIZ.XTsiz-1)/SIZ.XTsiz; SIZ.YTnum = ( SIZ.Ysiz-SIZ.YTOsiz+SIZ.YTsiz-1)/SIZ.YTsiz; for( i=0; i<(int)SIZ.Csiz; i++){ SIZ.Ssiz[i] = *(SIZstream+(38+i*3)); SIZ.XRsiz[i] = *(SIZstream+(39+i*3)); SIZ.YRsiz[i] = *(SIZstream+(40+i*3)); } return SIZ; } CODmarker_param_t get_CODmkrdata_from_j2kstream( Byte_t *CODstream) { CODmarker_param_t COD; int i; if( *CODstream++ != 0xff || *CODstream++ != 0x52){ fprintf( FCGI_stderr, "Error, COD marker not found in the reconstructed j2kstream\n"); COD.Lcod = 0; COD.Scod = 0; COD.prog_order = 0; COD.numOflayers = 0; COD.numOfdecomp = 0; COD.XPsiz = 0; COD.YPsiz = 0; return COD; } COD.Lcod = big2( CODstream); COD.Scod = *( CODstream+2); COD.prog_order = *( CODstream+3); COD.numOflayers = big2( CODstream+4); COD.numOfdecomp = *( CODstream+7); if(COD.Scod & 0x01){ COD.XPsiz = (Byte4_t *)malloc( (COD.numOfdecomp+1)*sizeof(Byte4_t)); COD.YPsiz = (Byte4_t *)malloc( (COD.numOfdecomp+1)*sizeof(Byte4_t)); for( i=0; i<=COD.numOfdecomp; i++){ /*precinct size */ COD.XPsiz[i] = pow( 2, *( CODstream+12+i) & 0x0F); COD.YPsiz[i] = pow( 2, (*( CODstream+12+i) & 0xF0) >> 4); } } else{ COD.XPsiz = (Byte4_t *)malloc( sizeof(Byte4_t)); COD.YPsiz = (Byte4_t *)malloc( sizeof(Byte4_t)); COD.XPsiz[0] = COD.YPsiz[0] = pow(2,15); } return COD; } bool modify_SIZmkrstream( SIZmarker_param_t SIZ, int difOfdecomplev, Byte_t *SIZstream); Byte2_t modify_CODmkrstream( CODmarker_param_t COD, int numOfdecomp, Byte_t *CODstream); bool modify_mainheader( Byte_t *j2kstream, int numOfdecomp, SIZmarker_param_t SIZ, CODmarker_param_t COD, Byte8_t *j2klen) { Byte2_t newLcod; if( *j2kstream++ != 0xff || *j2kstream++ != 0x4f){ fprintf( FCGI_stderr, "Error, j2kstream is not starting with SOC marker\n"); return false; } if(!modify_SIZmkrstream( SIZ, COD.numOfdecomp-numOfdecomp, j2kstream)) return false; j2kstream += SIZ.Lsiz+2; if( !(newLcod = modify_CODmkrstream( COD, numOfdecomp, j2kstream))) return false; memmove( j2kstream+2+newLcod, j2kstream+2+COD.Lcod, (*j2klen)-(SIZ.Lsiz+COD.Lcod+6)); *j2klen -= ( COD.Lcod - newLcod); return true; } bool modify_SIZmkrstream( SIZmarker_param_t SIZ, int difOfdecomplev, Byte_t *SIZstream) { int i; if( *SIZstream++ != 0xff || *SIZstream++ != 0x51){ fprintf( FCGI_stderr, "Error, SIZ marker not found in the reconstructed j2kstream\n"); return false; } for( i=0; i> 8); *CODstream++ = (Byte_t)(newLcod & 0x00ff); } else{ newLcod = COD.Lcod; CODstream += 2; } CODstream += 5; /* skip Scod & SGcod */ /* SPcod */ *CODstream++ = (Byte_t) numOfdecomp; return newLcod; } bool modify_COCmkrstream( int numOfdecomp, Byte_t *COCstream, Byte2_t Csiz, Byte2_t *oldLcoc, Byte2_t *newLcoc); bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, Byte2_t Csiz, Byte8_t *j2klen) { Byte4_t Psot; /* tile part length ref A.4.2 Start of tile-part SOT */ Byte_t *thstream, *SOTstream, *Psot_stream; Byte2_t oldLcoc, newLcoc; SOTstream = thstream = j2kstream+SOToffset; if( *SOTstream++ != 0xff || *SOTstream++ != 0x90){ fprintf( FCGI_stderr, "Error, thstream is not starting with SOT marker\n"); return false; } SOTstream += 4; /* skip Lsot & Isot */ Psot = (SOTstream[0]<<24)+(SOTstream[1]<<16)+(SOTstream[2]<<8)+(SOTstream[3]); Psot_stream = SOTstream; thstream += 12; /* move to next marker (SOT always 12bytes) */ while( !( *thstream == 0xff && *(thstream+1) == 0x93)){ /* search SOD */ if( numOfdecomp != -1 && *thstream == 0xff && *(thstream+1) == 0x53){ /* COC */ if( !modify_COCmkrstream( numOfdecomp, thstream, Csiz, &oldLcoc, &newLcoc)) return false; memmove( thstream+newLcoc+2, thstream+oldLcoc+2, (*j2klen)-(thstream-j2kstream+oldLcoc+2)); *j2klen -= ( oldLcoc - newLcoc); } thstream += 2; thstream += ((thstream[0]<<8)+(thstream[1])); /* marker length */ } if( (*j2klen)-SOToffset != Psot){ Psot = (*j2klen)-SOToffset; modify_4Bytecode( Psot, Psot_stream); } return true; } bool modify_COCmkrstream( int numOfdecomp, Byte_t *COCstream, Byte2_t Csiz, Byte2_t *oldLcoc, Byte2_t *newLcoc) { if( *COCstream++ != 0xff || *COCstream++ != 0x53){ fprintf( FCGI_stderr, "Error, COC marker not found in the reconstructed j2kstream\n"); return false; } *oldLcoc = big2( COCstream); *newLcoc = (Csiz < 257 ? 10 : 11) + numOfdecomp; *COCstream++ = (Byte_t)((Byte2_t)((*newLcoc) & 0xff00) >> 8); *COCstream++ = (Byte_t)((*newLcoc) & 0x00ff); if( Csiz < 257) COCstream +=2; /* skip Ccoc & Scoc */ else COCstream += 3; *COCstream = numOfdecomp; return true; } openjpeg-1.5.2/applications/jpip/libopenjpip/openjpip.h0000644000175000017500000002177712315002075023151 0ustar mathieumathieu/* * $Id: openjpip.h 1349 2012-01-30 08:44:05Z mathieu.malaterre $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 OPENJPIP_H_ # define OPENJPIP_H_ #include "session_manager.h" #include "target_manager.h" #include "query_parser.h" #include "msgqueue_manager.h" #include "bool.h" #include "sock_manager.h" #include "auxtrans_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #include "cache_manager.h" #include "byte_manager.h" #include "imgsock_manager.h" #include "metadata_manager.h" #include "ihdrbox_manager.h" #include "index_manager.h" #endif /*SERVER*/ /* *========================================================== * JPIP server API *========================================================== */ #ifdef SERVER /** Server static records*/ typedef struct server_record{ sessionlist_param_t *sessionlist; /**< list of session records*/ targetlist_param_t *targetlist; /**< list of target records*/ auxtrans_param_t auxtrans; } server_record_t; /** Query/response data for each client*/ typedef struct QR{ query_param_t *query; /**< query parameters*/ msgqueue_param_t *msgqueue; /**< message queue*/ channel_param_t *channel; /**< channel, (NULL if stateless)*/ } QR_t; /** * Initialize the JPIP server * * @param[in] tcp_auxport opening tcp auxiliary port ( 0 not to open, valid No. 49152–65535) * @param[in] udp_auxport opening udp auxiliary port ( 0 not to open, valid No. 49152–65535) * @return intialized server record pointer */ server_record_t * init_JPIPserver( int tcp_auxport, int udp_auxport); /** * Terminate the JPIP server * * @param[in] rec address of deleting server static record pointer */ void terminate_JPIPserver( server_record_t **rec); /** * 1st process per client request; parse query string * * @param[in] query_string request query string * @return initialized query/response data pointer */ QR_t * parse_querystring( char *query_string); /** * 2nd process; process JPIP request and construct message queue * * @param[in] rec server static record pointer * @param[in] qr query/response data pointer * @return true if succeed, otherwise false */ bool process_JPIPrequest( server_record_t *rec, QR_t *qr); /** * 3rd process; send response data JPT/JPP-stream * * @param[in] rec server static record pointer * @param[in] qr query/response data pointer */ void send_responsedata( server_record_t *rec, QR_t *qr); /** * 4th (last) process; * * @param[in] rec server static record pinter * @param[in] qr address of query/response data pointer */ void end_QRprocess( server_record_t *rec, QR_t **qr); /** * Option for local tests; print out parameter values to logstream (stderr) * * @param[in] query true if query parameters are to be printed out * @param[in] messages true if queue of messages is to be printed out * @param[in] sessions true if session list is to be printed out * @param[in] targets true if target list is to be printed out * @param[in] qr query/response data pointer * @param[in] rec server static record pinter */ void local_log( bool query, bool messages, bool sessions, bool targets, QR_t *qr, server_record_t *rec); #endif /*SERVER*/ /* *========================================================== * JPIP decoding server API *========================================================== */ #ifndef SERVER /** Decoding server static records*/ typedef struct dec_server_record{ cachelist_param_t *cachelist; /**< cache list*/ Byte_t *jpipstream; /**< JPT/JPP stream*/ int jpipstreamlen; /**< length of jpipstream*/ msgqueue_param_t *msgqueue; /**< parsed message queue of jpipstream*/ SOCKET listening_socket; /**< listenning socket*/ } dec_server_record_t; /** Client socket identifier*/ typedef SOCKET client_t; /** * Initialize the image decoding server * * @param[in] port opening tcp port (valid No. 49152–65535) * @return intialized decoding server record pointer */ dec_server_record_t * init_dec_server( int port); /** * Terminate the image decoding server * * @param[in] rec address of deleting decoding server static record pointer */ void terminate_dec_server( dec_server_record_t **rec); /** * Accept client connection * * @param[in] rec decoding server static record pointer * @return client socket ID, -1 if failed */ client_t accept_connection( dec_server_record_t *rec); /** * Handle client request * * @param[in] client client socket ID * @param[in] rec decoding server static record pointer * @return true if succeed */ bool handle_clientreq( client_t client, dec_server_record_t *rec); #endif /*SERVER*/ /* *========================================================== * JPIP tool API *========================================================== */ #ifndef SERVER /* * jpip to JP2 or J2K */ /** JPIP decoding parameters*/ typedef struct jpip_dec_param{ Byte_t *jpipstream; /**< JPT/JPP-stream*/ Byte8_t jpiplen; /**< length of jpipstream*/ msgqueue_param_t *msgqueue; /**< message queue*/ metadatalist_param_t *metadatalist; /**< metadata list going into JP2 file*/ ihdrbox_param_t *ihdrbox; /**< ihdr box going into JP2 file*/ Byte_t *jp2kstream; /**< J2K codestream or JP2 file codestream*/ Byte8_t jp2klen; /**< length of j2kstream or JP2 file*/ } jpip_dec_param_t; /** * Initialize jpip decoder * * @param[in] jp2 true in case of jp2 file encoding, else j2k file encoding * @return JPIP decoding parameters pointer */ jpip_dec_param_t * init_jpipdecoder( bool jp2); /** * Destroy jpip decoding parameters * * @param[in] dec address of JPIP decoding parameters pointer */ void destroy_jpipdecoder( jpip_dec_param_t **dec); /** * Read jpip codestream from a file * * @param[in] fname file name * @param[in] dec JPIP decoding parameters pointer * @return true if succeed */ bool fread_jpip( char fname[], jpip_dec_param_t *dec); /** * Decode jpip codestream * * @param[in] dec JPIP decoding parameters pointer */ void decode_jpip( jpip_dec_param_t *dec); /** * Write J2K/JP2 codestream to a file * * @param[in] fname file name * @param[in] dec JPIP decoding parameters pointer * @return true if succeed */ bool fwrite_jp2k( char fname[], jpip_dec_param_t *dec); /** * Option; print out parameter values to stderr * * @param[in] messages true if queue of messages is to be printed out * @param[in] metadata true if metadata is to be printed out * @param[in] ihdrbox true if image header data is to be printed out * @param[in] dec JPIP decoding parameters pointer */ void output_log( bool messages, bool metadata, bool ihdrbox, jpip_dec_param_t *dec); /* * test the format of index (cidx) box in JP2 file */ /** Redefinition of index parameters*/ typedef index_param_t index_t; /** * Parse JP2 file and get index information from cidx box inside * * @param[in] fd file descriptor of the JP2 file * @return pointer to the generated structure of index parameters */ index_t * get_index_from_JP2file( int fd); /** * Destroy index parameters * * @param[in,out] idx addressof the index pointer */ void destroy_index( index_t **idx); /** * print index parameters * * @param[in] index index parameters */ void output_index( index_t *index); #endif /*SERVER*/ #endif /* !OPENJPIP_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/dec_clientmsg_handler.h0000644000175000017500000001055412315002075025611 0ustar mathieumathieu/* * $Id: dec_clientmsg_handler.h 1066 2011-11-16 15:43:01Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * 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 DEC_CLIENTMSG_HANDLER_H_ # define DEC_CLIENTMSG_HANDLER_H_ #include "imgsock_manager.h" #include "cache_manager.h" #include "byte_manager.h" #include "msgqueue_manager.h" /** * handle JPT- JPP- stream message * * @param[in] connected_socket socket descriptor * @param[in] cachelist cache list pointer * @param[in,out] jpipstream address of JPT- JPP- stream pointer * @param[in,out] streamlen address of stream length * @param[in,out] msgqueue message queue pointer */ void handle_JPIPstreamMSG( SOCKET connected_socket, cachelist_param_t *cachelist, Byte_t **jpipstream, int *streamlen, msgqueue_param_t *msgqueue); /** * handle PNM request message * * @param[in] connected_socket socket descriptor * @param[in] jpipstream jpipstream pointer * @param[in] msgqueue message queue pointer * @param[in] cachelist cache list pointer */ void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist); /** * handle XML request message * * @param[in] connected_socket socket descriptor * @param[in] jpipstream address of caching jpipstream pointer * @param[in] cachelist cache list pointer */ void handle_XMLreqMSG( SOCKET connected_socket, Byte_t *jpipstream, cachelist_param_t *cachelist); /** * handle TargetID request message * * @param[in] connected_socket socket descriptor * @param[in] cachelist cache list pointer */ void handle_TIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist); /** * handle ChannelID request message * * @param[in] connected_socket socket descriptor * @param[in] cachelist cache list pointer */ void handle_CIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist); /** * handle distroy ChannelID message * * @param[in] connected_socket socket descriptor * @param[in,out] cachelist cache list pointer */ void handle_dstCIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist); /** * handle SIZ request message * * @param[in] connected_socket socket descriptor * @param[in,out] cachelist cache list pointer */ void handle_SIZreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist); /** * handle saving JP2 file request message * * @param[in] connected_socket socket descriptor * @param[in] cachelist cache list pointer * @param[in] msgqueue message queue pointer * @param[in] jpipstream address of caching jpipstream pointer */ void handle_JP2saveMSG( SOCKET connected_socket, cachelist_param_t *cachelist, msgqueue_param_t *msgqueue, Byte_t *jpipstream); #endif /* !DEC_CLIENTMSG_HANDLER_H_ */ openjpeg-1.5.2/applications/jpip/libopenjpip/faixbox_manager.h0000644000175000017500000001172012315002075024442 0ustar mathieumathieu/* * $Id: faixbox_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 FAIXBOX_MANAGER_H_ # define FAIXBOX_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" /** 4byte parameters of a faix element*/ typedef struct faixelem4_param{ Byte4_t off; /**< offset*/ Byte4_t len; /**< length*/ } faixelem4_param_t; /** 8byte parameters of a faix element*/ typedef struct faixelem8_param{ Byte8_t off; /**< offset*/ Byte8_t len; /**< length*/ } faixelem8_param_t; /** 4byte parameters of fragment array index box*/ typedef struct subfaixbox4_param{ Byte4_t nmax; /**< maximum number of valid elements in any row of the array*/ Byte4_t m; /**< number of raws of the array*/ faixelem4_param_t *elem; /**< dynamic array pointer of faix elements*/ Byte4_t *aux; /**< dynamic array pointer of auxiliary*/ /**info in each element for version 2 or 3*/ } subfaixbox4_param_t; /** 8byte parameters of fragment array index box*/ typedef struct subfaixbox8_param{ Byte8_t nmax; /**< maximum number of valid elements in any row of the array*/ Byte8_t m; /**< number of raws of the array*/ faixelem8_param_t *elem; /**< dynamic array pointer of faix elements*/ Byte4_t *aux; /**< dynamic array pointer of auxiliary*/ /**info in each element for version 2 or 3*/ } subfaixbox8_param_t; /** variable sized parameters in fragment array index box*/ typedef union subfaixbox_param{ subfaixbox4_param_t *byte4_params; /**< parameters with 4byte codes for version 0 or 2*/ subfaixbox8_param_t *byte8_params; /**< parameters with 8byte codes for version 1 or 3*/ } subfaixbox_param_t; /** fragment array index box parameters*/ /** I.3.2.4.2 Fragment Array Index box*/ typedef struct faixbox_param{ Byte_t version; /**< Refer to the Table I.3 - Version values*/ subfaixbox_param_t subfaixbox; /**< rest information in faixbox*/ } faixbox_param_t; /** * generate faix box * * @param[in] box pointer to the reference faix_box * @return generated faixbox */ faixbox_param_t * gene_faixbox( box_param_t *box); /** * print faix box parameters * * @param[in] faix faix box pointer */ void print_faixbox( faixbox_param_t *faix); /** * delete faix box * * @param[in,out] faix addressof the faixbox pointer */ void delete_faixbox( faixbox_param_t **faix); /** * get nmax parameter value from faix box * * @param[in] faix faix box pointer */ Byte8_t get_nmax( faixbox_param_t *faix); /** * get m parameter value from faix box * * @param[in] faix faix box pointer */ Byte8_t get_m( faixbox_param_t *faix); /** * get offset of a element from faix box * * @param[in] faix faix box pointer * @param[in] elem_id element id in a row (0<= #include #include #include "manfbox_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ manfbox_param_t * gene_manfbox( box_param_t *box) { manfbox_param_t *manf; /* manifest parameters */ boxheader_param_t *bh; /* current box pointer */ boxheader_param_t *last; /* last boxheader pointer of the list */ Byte8_t pos; /* current position in manf_box contents; */ manf = ( manfbox_param_t *)malloc( sizeof( manfbox_param_t)); pos = 0; manf->first = last = NULL; while( pos < get_DBoxlen( box)){ bh = gene_childboxheader( box, pos); pos += bh->headlen; /* insert into the list */ if( manf->first) last->next = bh; else manf->first = bh; last = bh; } return manf; } void delete_manfbox( manfbox_param_t **manf) { boxheader_param_t *bhPtr, *bhNext; bhPtr = (*manf)->first; while( bhPtr != NULL){ bhNext = bhPtr->next; #ifndef SERVER /* fprintf( logstream, "local log: boxheader %.4s deleted!\n", bhPtr->type); */ #endif free(bhPtr); bhPtr = bhNext; } free( *manf); } void print_manfbox( manfbox_param_t *manf) { boxheader_param_t *ptr; ptr = manf->first; while( ptr != NULL){ print_boxheader( ptr); ptr=ptr->next; } } boxheader_param_t * search_boxheader( const char type[], manfbox_param_t *manf) { boxheader_param_t *found; found = manf->first; while( found != NULL){ if( strncmp( type, found->type, 4) == 0) return found; found = found->next; } fprintf( FCGI_stderr, "Error: Boxheader %s not found\n", type); return NULL; } openjpeg-1.5.2/applications/jpip/libopenjpip/session_manager.c0000644000175000017500000001260012315002075024456 0ustar mathieumathieu/* * $Id: session_manager.c 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 "session_manager.h" #include "target_manager.h" #ifdef SERVER #include "fcgi_stdio.h" #define logstream FCGI_stdout #else #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr #endif /*SERVER */ sessionlist_param_t * gene_sessionlist(void) { sessionlist_param_t *sessionlist; sessionlist = (sessionlist_param_t *)malloc( sizeof(sessionlist_param_t)); sessionlist->first = NULL; sessionlist->last = NULL; return sessionlist; } session_param_t * gene_session( sessionlist_param_t *sessionlist) { session_param_t *session; session = (session_param_t *)malloc( sizeof(session_param_t)); session->channellist = gene_channellist(); session->cachemodellist = gene_cachemodellist(); session->next = NULL; if( sessionlist->first) /* there are one or more entries */ sessionlist->last->next = session; else /* first entry */ sessionlist->first = session; sessionlist->last = session; return session; } bool search_session_and_channel( char cid[], sessionlist_param_t *sessionlist, session_param_t **foundsession, channel_param_t **foundchannel) { *foundsession = sessionlist->first; while( *foundsession != NULL){ *foundchannel = (*foundsession)->channellist->first; while( *foundchannel != NULL){ if( strcmp( cid, (*foundchannel)->cid) == 0) return true; *foundchannel = (*foundchannel)->next; } *foundsession = (*foundsession)->next; } fprintf( FCGI_stdout, "Status: 503\r\n"); fprintf( FCGI_stdout, "Reason: Channel %s not found\r\n", cid); return false; } void insert_cachemodel_into_session( session_param_t *session, cachemodel_param_t *cachemodel) { if(!cachemodel) return; #ifndef SERVER fprintf( logstream, "local log: insert cachemodel into session\n"); #endif if( session->cachemodellist->first != NULL) session->cachemodellist->last->next = cachemodel; else session->cachemodellist->first = cachemodel; session->cachemodellist->last = cachemodel; } bool delete_session( session_param_t **session, sessionlist_param_t *sessionlist) { session_param_t *ptr; if( *session == NULL) return false; if( *session == sessionlist->first) sessionlist->first = (*session)->next; else{ ptr = sessionlist->first; while( ptr->next != *session) ptr = ptr->next; ptr->next = (*session)->next; if( *session == sessionlist->last) sessionlist->last = ptr; } delete_channellist( &((*session)->channellist)); delete_cachemodellist( &((*session)->cachemodellist)); #ifndef SERVER fprintf( logstream, "local log: session: %p deleted!\n", (void *)(*session)); #endif free( *session); return true; } void delete_sessionlist( sessionlist_param_t **sessionlist) { session_param_t *sessionPtr, *sessionNext; sessionPtr = (*sessionlist)->first; while( sessionPtr != NULL){ sessionNext=sessionPtr->next; delete_channellist( &(sessionPtr->channellist)); delete_cachemodellist( &(sessionPtr->cachemodellist)); #ifndef SERVER fprintf( logstream, "local log: session: %p deleted!\n", (void *)sessionPtr); #endif free( sessionPtr); sessionPtr=sessionNext; } (*sessionlist)->first = NULL; (*sessionlist)->last = NULL; free(*sessionlist); } void print_allsession( sessionlist_param_t *sessionlist) { session_param_t *ptr; cachemodel_param_t *cachemodel; int i=0; fprintf( logstream, "SESSIONS info:\n"); ptr = sessionlist->first; while( ptr != NULL){ fprintf( logstream, "session No.%d\n", i++); print_allchannel( ptr->channellist); cachemodel = ptr->cachemodellist->first; while( cachemodel){ print_target( cachemodel->target); cachemodel = cachemodel->next; } ptr=ptr->next; } } openjpeg-1.5.2/applications/jpip/libopenjpip/mhixbox_manager.h0000644000175000017500000000671612315002075024471 0ustar mathieumathieu/* * $Id: mhixbox_manager.h 44 2011-02-15 12:32:29Z kaori $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * 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 MHIXBOX_MANAGER_H_ # define MHIXBOX_MANAGER_H_ #include "byte_manager.h" #include "box_manager.h" /** Marker index parameters*/ typedef struct markeridx_param{ Byte2_t code; /**< marker code*/ Byte2_t num_remain; /**< remining number of the same marker index segments listed immediately*/ Byte8_t offset; /**< offset relative to the start of the*/ /**codestream ( including the length*/ /**parameter but not the marker itself)*/ Byte2_t length; /**< marker segment length*/ struct markeridx_param *next; /**< pointer to the next markeridx*/ } markeridx_param_t; /** header index table box parameters*/ /** I.3.2.4.3 Header Index Table box*/ typedef struct mhixbox_param{ Byte8_t tlen; /**< length ( total length of the main*/ /**header or of the first tile-part header)*/ markeridx_param_t *first; /**< first marker index pointer of the list*/ } mhixbox_param_t; /** * generate mhix box * * @param[in] box pointer to the reference mhix box * @return generated mhixbox pointer */ mhixbox_param_t * gene_mhixbox( box_param_t *box); /** * search a marker index by marker code from mhix box * * @param[in] code marker code * @param[in] mhix mhix box pointer * @return found marker index pointer */ markeridx_param_t * search_markeridx( Byte2_t code, mhixbox_param_t *mhix); /** * print mhix box parameters * * @param[in] mhix mhix box pointer */ void print_mhixbox( mhixbox_param_t *mhix); /** * print marker index parameters * * @param[in] markeridx marker index pointer */ void print_markeridx( markeridx_param_t *markeridx); /** * delete mhix box * * @param[in,out] mhix address of the mhix box pointer */ void delete_mhixbox( mhixbox_param_t **mhix); #endif /* !MHIXBOX_MANAGER_H_ */ openjpeg-1.5.2/applications/jpip/Makefile.am0000644000175000017500000000007712315002075020663 0ustar mathieumathieuMAINTAINERCLEANFILES = Makefile.in SUBDIRS = libopenjpip util openjpeg-1.5.2/applications/jpip/README0000644000175000017500000001374012315002075017510 0ustar mathieumathieu======================================================================== OpenJPIP software 2.1 ReadMe OpenJPEG: http://www.openjpeg.org Written by: Kaori Hagihara UCL/SST/ICTM/ELEN February 18 2011 ======================================================================== Contents: 1. Introduction 2. License 3. System requirements 4. Implementing instructions 5. JP2 encoding instructions ---------- 1. Introduction ---------- OpenJPIP software is an implementation of JPEG 2000 Part9: Interactivity tools, APIs and protocols (JPIP). ( For more info about JPIP, check the website: http://www.jpeg.org/jpeg2000/j2kpart9.html) The current implementation uses some results from the 2KAN project (http://www.2kan.org). Version 2.1 covers: - JPT-stream (Tile) and JPP-stream (Precinct) media types - Session, channels, cache model managements - JPIP over HTTP, HTTP requests and TCP return - Indexing JPEG 2000 files - Embedding XML formatted metadata - Region Of Interest (ROI) requests - Access to JP2 files with their URL ---------- 2. License ---------- This software is released under the BSD license, anybody can use or modify the library, even for commercial applications. The only restriction is to retain the copyright in the sources or the binaries documentation. Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage. ---------- 3. System requirements ---------- - FastCGI development kit (C libraries) at server (http://www.fastcgi.com) - libcURL library - Java application launcher at client - Xerces2 java XML parser on the client for accessing embedded image metadata (http://xerces.apache.org/xerces2-j) We tested this software with a virtual server running on the same Linux machine as the clients. ---------- 4. Building instructions ---------- A Makefile is available in the same directory as this README file. Simply type 'make' and it will build all the required C-executables. Concerning the java-based opj_viewer, simply type 'ant' in the corresponding directory (requires 'ant' utility of course) The documentation can be build this way (requires doxygen utility): cd doc doxygen Doxyfile ---------- 5. Usage ---------- Preliminary notes : * HTML documentation is available at http://www.openjpeg.org/jpip/doc/html * Example image is available at http://www.openjpeg.org/jpip/data/copenhague1.zip (20 Mb !) Webserver: You need a webserver running with the fastcgi module enabled and correctly configured. For Apache, add the following line to your /etc/apache2/mods-available/fastcgi.conf configuration file: FastCGIExternalServer /var/www/myFCGI -host localhost:3000 where /var/www is your DocumentRoot. Please refer to 'http://www.openjpeg.org/jpip/doc/ApacheFastCGITutorial.pdf' for more details. Server: 1. Store JP2 files in the same directory as opj_server 2. Launch opj_server from the server terminal: % spawn-fcgi -f ./opj_server -p 3000 -n For shutting down JPIP server: %GET http://hostname/myFCGI?quitJPIP Notice, http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) Requst message "quitJPIP" can be changed in Makfile, modify -DQUIT_SIGNAL=\"quitJPIP\" Client: 1. Launch image decoding server, and keep it alive as long as image viewers are open % ./opj_dec_server [portnumber (50000 by default)] You might prefer to implement this program from another directory since cache files are saved in the working directory. % mkdir cache % cd cache % ../opj_dec_server 2. Open image viewers (as many as needed) % java -jar opj_viewer.jar http://hostname/myFCGI path/filename.jp2 [hostname] [portnumber] [stateless/session] [jptstream/jppstream] [tcp/udp] ( The arguments - http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) - path/filename.jp2 is the server local path or URL of a JP2 file - host name of opj_dec_server, localhost by default - portnumber of opj_dec_server, 50000 by default - request type stateless for no caching, session (default) for caching - return media type, JPT-stream tile based stream, or JPP-stream (default) precinct based stream - auxiliary return protocol, tcp or udp (udp is not implemented yet), if not given, return data is filled in http chunk Image viewer GUI instructions: Scale up request: Enlarge the window ROI request: Select a region by mouse click and drag, then click inside the red frame of the selected region % java -jar opj_viewer_xerces.jar http://hostname/myFCGI JP2_filename.jp2 Annotate image with ROI information in XML metadata: Click button "Region Of Interest" Open a new window presenting an aligned image with a locally stored image: Click button "Image Registration" (Under Construction) 3. Quit the image decoding server through the telnet, be sure all image viewers are closed % telnet localhost 50000 quit ---------- 5. JP2 encoding instructions ---------- An example to encode a TIF image "copenhague1.tif" at resolution 4780x4050, 8bit/pixel, grayscale. % ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip -TP R options -jpip : embed index table 'cidx' box into the output JP2 file (obligation for JPIP) -TP R : partition a tile into tile parts of different resolution levels (obligation for JPT-stream)
* [EACESS |Permission denied. * [EMFILE |Too many open files used by the process. * [ENFILE |Too many open files in system. * [ENOENT |Directory does not exist. * [ENOMEM |Insufficient memory. * [ENOTDIR |dirname does not refer to directory. This value is not * reliable on MS-DOS and MS-Windows platforms. Many * implementations return ENOENT even when the name refers to a * file.] *
* */ static DIR *opendir(const char *dirname) { DIR *dirp; assert (dirname != NULL); dirp = (DIR*)malloc (sizeof (struct DIR)); if (dirp != NULL) { char *p; /* allocate room for directory name */ dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); if (dirp->dirname == NULL) { /* failed to duplicate directory name. errno set by malloc() */ free (dirp); return NULL; } /* Copy directory name while appending directory separator and "*.*". * Directory separator is not appended if the name already ends with * drive or directory separator. Directory separator is assumed to be * '/' or '\' and drive separator is assumed to be ':'. */ strcpy (dirp->dirname, dirname); p = strchr (dirp->dirname, '\0'); if (dirp->dirname < p && *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { strcpy (p++, "\\"); } # ifdef DIRENT_WIN32_INTERFACE strcpy (p, "*"); /*scan files with and without extension in win32*/ # else strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif /* open stream */ if (_initdir (dirp) == 0) { /* initialization failed */ free (dirp->dirname); free (dirp); return NULL; } } return dirp; } /* * * read a directory entry * struct dirent *readdir (DIR *dirp); * * Read individual directory entry and return pointer to a structure * containing the name of the entry. Individual directory entries returned * include normal files, sub-directories, pseudo-directories "." and ".." * and also volume labels, hidden files and system files in MS-DOS and * MS-Windows. You might want to use stat(2) function to determinate which * one are you dealing with. Many dirent implementations already contain * equivalent information in dirent structure but you cannot depend on * this. * * The dirent structure contains several system dependent fields that * generally have no interest to you. The only interesting one is char * d_name[] that is also portable across different systems. The d_name * field contains the name of the directory entry without leading path. * While d_name is portable across different systems the actual storage * capacity of d_name varies from system to system and there is no portable * way to find out it at compile time as different systems define the * capacity of d_name with different macros and some systems do not define * capacity at all (besides actual declaration of the field). If you really * need to find out storage capacity of d_name then you might want to try * NAME_MAX macro. The NAME_MAX is defined in POSIX standard althought * there are many MS-DOS and MS-Windows implementations those do not define * it. There are also systems that declare d_name as "char d_name[1]" and * then allocate suitable amount of memory at run-time. Thanks to Alain * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. * * This all leads to the fact that it is difficult to allocate space * for the directory names when the very same program is being compiled on * number of operating systems. Therefore I suggest that you always * allocate space for directory names dynamically. * * * Returns a pointer to a structure containing name of the directory entry * in `d_name' field or NULL if there was an error. In case of an error the * global `errno' variable will set as follows: * * * [EBADF |dir parameter refers to an invalid directory stream. This value * is not set reliably on all implementations.] *
*
*/ static struct dirent * readdir (DIR *dirp) { assert(dirp != NULL); if (dirp == NULL) { errno = EBADF; return NULL; } #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* directory stream was opened/rewound incorrectly or it ended normally */ errno = EBADF; return NULL; } #endif if (dirp->dirent_filled != 0) { /* * Directory entry has already been retrieved and there is no need to * retrieve a new one. Directory entry will be retrieved in advance * when the user calls readdir function for the first time. This is so * because real dirent has separate functions for opening and reading * the stream whereas Win32 and DOS dirents open the stream * automatically when we retrieve the first file. Therefore, we have to * save the first file when opening the stream and later we have to * return the saved entry when the user tries to read the first entry. */ dirp->dirent_filled = 0; } else { /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { /* Last file has been processed or an error occured */ FindClose (dirp->search_handle); dirp->search_handle = INVALID_HANDLE_VALUE; errno = ENOENT; return NULL; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findnext (&dirp->current.data) != 0) { /* _dos_findnext and findnext will set errno to ENOENT when no * more entries could be retrieved. */ return NULL; } # endif _setdirname (dirp); assert (dirp->dirent_filled == 0); } return &dirp->current; } /* * * close directory stream. * int closedir (DIR *dirp); * * Close directory stream opened by the `opendir' function. Close of * directory stream invalidates the DIR structure as well as previously read * dirent entry. * * The function typically returns 0 on success and -1 on failure but * the function may be declared to return void on same systems. At least * Borland C/C++ and some UNIX implementations use void as a return type. * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is * known to return nothing. The very same definition is made by the GNU * autoconf if you happen to use it. * * The global `errno' variable will set to EBADF in case of error. * */ static int closedir (DIR *dirp) { int retcode = 0; /* make sure that dirp points to legal structure */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return -1; } /* free directory name and search handles */ if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ retcode = -1; errno = EBADF; } } #endif /* clear dirp structure to make sure that it cannot be used anymore*/ memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) dirp->search_handle = INVALID_HANDLE_VALUE; # endif free (dirp); return retcode; } /* * * rewind directory stream to the beginning * void rewinddir (DIR *dirp); * * Rewind directory stream to the beginning so that the next call of * readdir() returns the very first directory entry again. However, note * that next call of readdir() may not return the same directory entry as it * did in first time. The directory stream may have been affected by newly * created files. * * Almost every dirent implementation ensure that rewinddir will update * the directory stream to reflect any changes made to the directory entries * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on * this if your program depends on the feature. I know at least one dirent * implementation where you are required to close and re-open the stream to * see the changes. * * Returns nothing. If something went wrong while rewinding, you will * notice it later when you try to retrieve the first directory entry. */ static void rewinddir (DIR *dirp) { /* make sure that dirp is legal */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return; } assert (dirp->dirname != NULL); /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ errno = EBADF; } } #endif /* re-open previous stream */ if (_initdir (dirp) == 0) { /* initialization failed but we cannot deal with error. User will notice * error later when she tries to retrieve first directory enty. */ /*EMPTY*/; } } /* * Open native directory stream object and retrieve first file. * Be sure to close previous stream before opening new one. */ static int _initdir (DIR *dirp) { assert (dirp != NULL); assert (dirp->dirname != NULL); dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) /* Open stream and retrieve first file */ dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* something went wrong but we don't know what. GetLastError() could * give us more information about the error, but then we should map * the error code into errno. */ errno = ENOENT; return 0; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findfirst (dirp->dirname, _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, &dirp->current.data) != 0) { /* _dos_findfirst and findfirst will set errno to ENOENT when no * more entries could be retrieved. */ return 0; } # endif /* initialize DIR and it's first entry */ _setdirname (dirp); dirp->dirent_filled = 1; return 1; } /* * Return implementation dependent name of the current directory entry. */ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) return dp->data.cFileName; #elif defined(DIRENT_USE_FFBLK) return dp->data.ff_name; #else return dp->data.name; #endif } /* * Copy name of implementation dependent directory entry to the d_name field. */ static void _setdirname (struct DIR *dirp) { /* make sure that d_name is long enough */ assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); strncpy (dirp->current.d_name, _getdirname (&dirp->current), NAME_MAX); dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } # ifdef __cplusplus } # endif # define NAMLEN(dp) ((int)(strlen((dp)->d_name))) #else # error "missing dirent interface" #endif #endif /*DIRENT_H*/ openjpeg-1.5.2/applications/codec/index.h0000644000175000017500000000362112315002076020221 0ustar mathieumathieu/* * 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. */ #ifndef __J2K_INDEX_H #define __J2K_INDEX_H #ifdef __cplusplus extern "C" { #endif /** Write a structured index to a file @param cstr_info Codestream information @param index Index filename @return Returns 0 if successful, returns 1 otherwise */ int write_index_file(opj_codestream_info_t *cstr_info, char *index); #ifdef __cplusplus } #endif #endif /* __J2K_INDEX_H */ openjpeg-1.5.2/applications/codec/convert.h0000644000175000017500000000662312315002076020577 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __J2K_CONVERT_H #define __J2K_CONVERT_H /**@name RAW image encoding parameters */ /*@{*/ typedef struct raw_cparameters { /** width of the raw image */ int rawWidth; /** height of the raw image */ int rawHeight; /** components of the raw image */ int rawComp; /** bit depth of the raw image */ int rawBitDepth; /** signed/unsigned raw image */ opj_bool rawSigned; /*@}*/ } raw_cparameters_t; /* TGA conversion */ opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters); int imagetotga(opj_image_t * image, const char *outfile); /* BMP conversion */ opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters); int imagetobmp(opj_image_t *image, const char *outfile); /* TIFF conversion*/ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters); int imagetotif(opj_image_t *image, const char *outfile); /** Load a single image component encoded in PGX file format @param filename Name of the PGX file to load @param parameters *List ?* @return Returns a greyscale image if successful, returns NULL otherwise */ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters); int imagetopgx(opj_image_t *image, const char *outfile); opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters); int imagetopnm(opj_image_t *image, const char *outfile); /* RAW conversion */ int imagetoraw(opj_image_t * image, const char *outfile); opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp); /* PNG conversion*/ extern int imagetopng(opj_image_t *image, const char *write_idf); extern opj_image_t* pngtoimage(const char *filename, opj_cparameters_t *parameters); #endif /* __J2K_CONVERT_H */ openjpeg-1.5.2/applications/OPJViewer/0000755000175000017500000000000012315072522017477 5ustar mathieumathieuopenjpeg-1.5.2/applications/OPJViewer/CMakeLists.txt0000644000175000017500000000162712315002076022242 0ustar mathieumathieuPROJECT(viewer CXX) FIND_PACKAGE(wxWidgets REQUIRED) INCLUDE(${wxWidgets_USE_FILE}) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../.. ${CMAKE_CURRENT_SOURCE_DIR}/.. ) # original flags: # -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT -DOPJ_INICONFIG -DUSE_JPSEC -DOPJ_MANYFORMATS ADD_DEFINITIONS(-DwxUSE_LIBOPENJPEG -DOPENJPEG_VERSION="1.5.0") SET(OPJV_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/source/imagjpeg2000.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/wxj2kparser.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/OPJViewer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/wxjp2parser.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/OPJDialogs.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/OPJThreads.cpp ${CMAKE_CURRENT_SOURCE_DIR}/source/OPJAbout.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../codec/index.c ) ADD_EXECUTABLE(opjviewer ${OPJV_SRCS}) TARGET_LINK_LIBRARIES(opjviewer ${wxWidgets_LIBRARIES} openjpeg) openjpeg-1.5.2/applications/OPJViewer/Readme.txt0000644000175000017500000001044312315002076021434 0ustar mathieumathieu=============================================================================== JPEG2000 Visualization Software - OPJViewer Version 0.4 beta =============================================================================== 1. Scope ============= This document describes the installation and use of the OPJViewer in the framework of OpenJPEG library. This implementation has been developed using the OpenJPEG library as decoding engine and wxWidgets 2.8 as GUI engine. If you find some bugs or if you have problems using the viewer, please send an e-mail to jpwl@diei.unipg.it 2. Installing the viewer ========================== There are two options available, at the moment: a) compile from source code b) download a precompiled binary. In order to use option a), it is mandatory to have compiled and built the LibOpenJPEG_JPWL library and the wxWidgets 2.8 framework (you have to download it from http://www.wxwidgets.org/ and compile the wx* libraries). 2.1. Compiling the source code in Windows ------------------------------------------- The steps required to compile the viewer under windows are: a) Download at least the libopenjpeg, jpwl, and opjviewer folders from the SVN trunk. b) Open the OPJViewer.dsw workspace with Visual C++ 6 and activate the "OPJViewer - Win32 Release" configuration. c) In the configuration settings, go to the C++ tab and modify the wxWidgets paths in order to reflect your wx* install configuration (Preprocessor -> Additional include directories): simply update each instance of the two wx paths, do not remove or add them. d) In the configuration settings, go to the Link tab and modify the wxWidgets path in order to reflect your wx* install configuration (Input -> Additional library path): simply update the wx path. e) In the configuration settings, go to the Resources tab and modify the wxWidgets path in order to reflect your wx* install configuration (Additional resource include directories): simply update the wx path. f) Build! g) Run! h) (OPTIONAL) Prepare an installer by compiling the InnoSetup script OPJViewer.iss (you need to download InnoSetup from http://www.jrsoftware.org/isinfo.php). 2.1.1 Additional libraries ---------------------------- Since we are also working on the Digital Cinema JPEG 2000, we are integrating the viewer with the MXF library, which is used to prepare the DCPs for digital movies. You can enable its linking in the code by specifying the USE_MXF preprocessor directive but, remember, the integration is at a very early stage. 2.2. Compiling the source code in Unix-like systems ----------------------------------------------------- The porting is possible and under way. 3. General information on the viewer ==================================== This viewer is conceived to open and display information and image content of J2K, JP2, and MJ2 files. The viewer application interface is divided into three main panels: - a browsing pane; - a viewing pane; - a log/peek pane. The browsing pane will present the markers or boxes hierarchy, with position (byte number where marker/box starts and stops) and length information (i.e., inner length as signalled by marker/box and total length, with marker/box sign included), in the following form: filename | |_ #000: Marker/Box short name (Hex code) | | | |_ *** Marker/Box long name *** | |_ startbyte > stopbyte, inner_length + marker/box sign length (total length) | |_ Additional info, depending on the marker/box type | |_ ... | |_ #001: Marker/Box short name (Hex code) | | | |_ ... | ... The viewing pane will display the decoded image contained in the JPEG 2000 file. It should display correctly images as large as 4000x2000, provided that a couple of GB of RAM are available. Nothing is known about the display of larger sizes: let us know if you manage to get it working. The log/peek pane is shared among two different subpanels: - the log panel will report a lot of debugging info coming out from the wx GUI as well as from the openjpeg library - the peek pane tries to give a peek on the codestream/file portion which is currently selected in the browsing pane. It shows both hex and ascii values corresponding to the marker/box section. 4. Known bugs and limitations =============================== 4.1. Bugs ----------- * 4.2. Limitations ------------------ * For mj2 files, rendering is only in B/W openjpeg-1.5.2/applications/OPJViewer/OPJViewer.iss0000644000175000017500000000352412315002076022032 0ustar mathieumathieu; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AppName=OPJViewer AppVerName=OPJViewer 0.4 beta AppPublisher=OpenJPEG AppPublisherURL=http://www.openjpeg.org AppSupportURL=http://www.openjpeg.org AppUpdatesURL=http://www.openjpeg.org DefaultDirName={pf}\OPJViewer DefaultGroupName=OPJViewer OutputDir=setup OutputBaseFilename=OPJViewer04beta_setup Compression=lzma SolidCompression=true InfoBeforeFile=source\readmebefore.txt InfoAfterFile=source\readmeafter.txt LicenseFile=source\license.txt VersionInfoVersion=0.4.0.0 VersionInfoCompany=OpenJPEG VersionInfoDescription=JPEG 2000 viewer ShowLanguageDialog=yes SetupIconFile=source\OPJViewer.ico [Languages] Name: english; MessagesFile: compiler:Default.isl [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked [Files] Source: Release\OPJViewer.exe; DestDir: {app}; Flags: ignoreversion ;Source: about\about.htm; DestDir: {app}/about; Flags: ignoreversion ;Source: about\opj_logo.png; DestDir: {app}/about; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: {group}\OPJViewer; Filename: {app}\OPJViewer.exe; WorkingDir: {app}; IconIndex: 0 Name: {group}\{cm:UninstallProgram,OPJViewer}; Filename: {uninstallexe} Name: {userdesktop}\OPJViewer; Filename: {app}\OPJViewer.exe; Tasks: desktopicon; WorkingDir: {app}; IconIndex: 0 [Run] Filename: {app}\OPJViewer.exe; Description: {cm:LaunchProgram,OPJViewer}; Flags: nowait postinstall skipifsilent; WorkingDir: {app} [Registry] Root: HKCU; Subkey: Software\OpenJPEG; ValueType: none; ValueData: 1; Flags: uninsdeletekey; Tasks: ; Languages: Root: HKCU; Subkey: Software\OpenJPEG\OPJViewer; ValueType: none; ValueData: 1; Flags: uninsdeletekey; Tasks: ; Languages: openjpeg-1.5.2/applications/OPJViewer/source/0000755000175000017500000000000012315072522020777 5ustar mathieumathieuopenjpeg-1.5.2/applications/OPJViewer/source/about_htm.h0000644000175000017500000000410312315002075023124 0ustar mathieumathieuwxString htmlaboutpage = wxT( "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
" "

" "
" "" OPJ_APPLICATION " " OPJ_APPLICATION_VERSION "
" "A JPEG 2000 image viewer
" "" OPJ_APPLICATION_PLATFORM " version" "
" "
OpenJPEG
" "

The OpenJPEG library is an open-source JPEG 2000 codec written in C language. " "In addition to the basic codec, various other features are under development.


" "* Build: ") #include "build.h" wxT(", " __DATE__ ", " __TIME__ "
") wxT("* " wxVERSION_STRING "
") wxT("* OpenJPEG " OPENJPEG_VERSION " (") #ifdef USE_JPWL wxT("JPWL ") #endif // USE_JPWL #ifdef USE_JPSEC wxT("JPSEC ") #endif // USE_JPSEC wxT(")
") #ifdef USE_MXF wxT("* MXFLib " MXFLIB_VERSION_MAJOR "." MXFLIB_VERSION_MINOR "." MXFLIB_VERSION_TWEAK " (" MXFLIB_VERSION_BUILD ")
") #endif // USE_MXF wxT("
" "OpenJPEG is © 2002-2008 TELE - Universite' Catholique de Louvain
" "OPJViewer is © 2007-2008 DSPLab - Universita' degli studi di Perugia" "
" "" "" ); openjpeg-1.5.2/applications/OPJViewer/source/wxj2kparser.cpp0000644000175000017500000010355612315002075023773 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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 "OPJViewer.h" /* From little endian to big endian, 2 bytes */ #define BYTE_SWAP2(X) ((X & 0x00FF) << 8) | ((X & 0xFF00) >> 8) #define BYTE_SWAP4(X) ((X & 0x000000FF) << 24) | ((X & 0x0000FF00) << 8) | ((X & 0x00FF0000) >> 8) | ((X & 0xFF000000) >> 24) /* From codestream to int values */ #define STREAM_TO_UINT32(C, P) (((unsigned long int) (C)[(P) + 0] << 24) + \ ((unsigned long int) (C)[(P) + 1] << 16) + \ ((unsigned long int) (C)[(P) + 2] << 8) + \ ((unsigned long int) (C)[(P) + 3] << 0)) #define STREAM_TO_UINT16(C, P) (((unsigned long int) (C)[(P) + 0] << 8) + \ ((unsigned long int) (C)[(P) + 1] << 0)) /* Markers values */ #define J2KMARK_NUM 24 enum { SOC_VAL = 0xFF4F, SOT_VAL = 0xFF90, SOD_VAL = 0xFF93, EOC_VAL = 0xFFD9, SIZ_VAL = 0xFF51, COD_VAL = 0xFF52, COC_VAL = 0xFF53, RGN_VAL = 0xFF5E, QCD_VAL = 0xFF5C, QCC_VAL = 0xFF5D, POD_VAL = 0xFF5F, TLM_VAL = 0xFF55, PLM_VAL = 0xFF57, PLT_VAL = 0xFF58, PPM_VAL = 0xFF60, PPT_VAL = 0xFF61, SOP_VAL = 0xFF91, EPH_VAL = 0xFF92, COM_VAL = 0xFF64 #ifdef USE_JPWL , EPB_VAL = 0xFF66, ESD_VAL = 0xFF67, EPC_VAL = 0xFF68, RED_VAL = 0xFF69 /*, EPB_VAL = 0xFF96, ESD_VAL = 0xFF98, EPC_VAL = 0xFF97, RED_VAL = 0xFF99*/ #endif // USE_JPWL #ifdef USE_JPSEC , SEC_VAL = 0xFF65 #endif // USE_JPSEC }; // All the markers in one vector unsigned short int marker_val[] = { SOC_VAL, SOT_VAL, SOD_VAL, EOC_VAL, SIZ_VAL, COD_VAL, COC_VAL, RGN_VAL, QCD_VAL, QCC_VAL, POD_VAL, TLM_VAL, PLM_VAL, PLT_VAL, PPM_VAL, PPT_VAL, SOP_VAL, EPH_VAL, COM_VAL #ifdef USE_JPWL , EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL #endif // USE_JPWL #ifdef USE_JPSEC , SEC_VAL #endif // USE_JPSEC }; // Marker names static const char *marker_name[] = { "SOC", "SOT", "SOD", "EOC", "SIZ", "COD", "COC", "RGN", "QCD", "QCC", "POD", "TLM", "PLM", "PLT", "PPM", "PPT", "SOP", "EPH", "COM" #ifdef USE_JPWL , "EPB", "ESD", "EPC", "RED" #endif // USE_JPWL #ifdef USE_JPSEC , "SEC" #endif // USE_JPSEC }; // Marker descriptions static const char *marker_descr[] = { "Start of codestream", "Start of tile-part", "Start of data", "End of codestream", "Image and tile size", "Coding style default", "Coding style component", "Region-of-interest", "Quantization default", "Quantization component", "Progression order change, default", "Tile-part lengths, main header", "Packet length, main header", "Packets length, tile-part header", "Packed packet headers, main header", "Packed packet headers, tile-part header", "Start of packet", "End of packet header", "Comment and extension" #ifdef USE_JPWL , "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability", "Residual Errors Descriptor" #endif // USE_JPWL #ifdef USE_JPSEC , "Main security marker" #endif // USE_JPSEC }; void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid) { unsigned short int csiz = 0; // check if the file is opened if (m_file->IsOpened()) WriteText(wxT("File OK")); else return; // position at the beginning m_file->Seek(offset, wxFromStart); // navigate the file int m, inside_sod = 0, inside_sop = 0; int nmarks = 0, maxmarks = 10000; unsigned char onebyte[1]; unsigned char twobytes[2], firstbyte, secondbyte; unsigned char fourbytes[4]; unsigned short int currmark; unsigned short int currlen; int lastPsot = 0, lastsotpos = 0; WriteText(wxT("Start search...")); // advancing macro #define OPJ_ADVANCE(A) {offset += A; if (offset < length) m_file->Seek(offset, wxFromStart); else return;} // begin search while ((offset < length) && (!m_file->Eof())) { // read one byte if (m_file->Read(&firstbyte, 1) != 1) break; // look for 0xFF if (firstbyte == 0xFF) { // it is a possible marker if (m_file->Read(&secondbyte, 1) != 1) break; else currmark = (((unsigned short int) firstbyte) << 8) + (unsigned short int) secondbyte; } else { // nope, advance by one and search again OPJ_ADVANCE(1); continue; } // search the marker for (m = 0; m < J2KMARK_NUM; m++) { if (currmark == marker_val[m]) break; } // marker not found if (m == J2KMARK_NUM) { // nope, advance by one and search again OPJ_ADVANCE(1); continue; } // if we are inside SOD, only some markers are allowed if (inside_sod) { // we are inside SOP if (inside_sop) { } // randomly marker coincident data if ((currmark != SOT_VAL) && (currmark != EOC_VAL) && (currmark != SOP_VAL) && (currmark != EPH_VAL)) { OPJ_ADVANCE(1); continue; } // possible SOT? if ((currmark == SOT_VAL)) { // too early SOT if (offset < (lastsotpos + lastPsot)) { OPJ_ADVANCE(1); continue; } // we were not in the last tile /*if (lastPsot != 0) { OPJ_ADVANCE(1); break; }*/ } } // beyond this point, the marker MUST BE real // length of current marker segment if ((currmark == SOD_VAL) || (currmark == SOC_VAL) || (currmark == EOC_VAL) || (currmark == EPH_VAL)) // zero length markers currlen = 0; else { // read length field if (m_file->Read(twobytes, 2) != 2) break; currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1]; } // here we pass to AppendItem() normal and selected item images (we // suppose that selected image follows the normal one in the enum) int image, imageSel; image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; // append the marker wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("%03d: "), nmarks) + wxString::FromAscii(marker_name[m]) + wxString::Format(wxT(" (0x%04X)"), marker_val[m]), image, imageSel, new OPJMarkerData(wxT("MARK") + wxString::Format(wxT(" (%d)"), marker_val[m]), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1) ); // append some info image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; // marker name wxTreeItemId subcurrid1 = m_tree->AppendItem(currid, wxT("*** ") + wxString::FromAscii(marker_descr[m]) + wxT(" ***"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT); // position and length wxTreeItemId subcurrid2 = m_tree->AppendItem(currid, wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() + wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2), image, imageSel, new OPJMarkerData(wxT("INFO")) ); // give additional info on markers switch (currmark) { ///////// // SOP // ///////// case SOP_VAL: { // read packet number if (m_file->Read(twobytes, 2) != 2) break; int packnum = STREAM_TO_UINT16(twobytes, 0); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("Pack. no. %d"), packnum), image, imageSel, new OPJMarkerData(wxT("INFO")) ); inside_sop = 1; }; break; #ifdef USE_JPWL ///////// // RED // ///////// case RED_VAL: { if (m_file->Read(onebyte, 1) != 1) break; unsigned char pred = onebyte[0]; image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxString address[] = { wxT("Packet addressing"), wxT("Byte-range addressing"), wxT("Packet-range addressing"), wxT("Reserved") }; wxTreeItemId subcurrid = m_tree->AppendItem(currid, address[(pred & 0xC0) >> 6], image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; ///////// // ESD // ///////// case ESD_VAL: { unsigned short int cesd; if (csiz < 257) { if (m_file->Read(onebyte, 1) != 1) break; cesd = onebyte[0]; } else { if (m_file->Read(twobytes, 2) != 2) break; cesd = STREAM_TO_UINT16(twobytes, 0); } if (m_file->Read(onebyte, 1) != 1) break; unsigned char pesd = onebyte[0]; image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid = m_tree->AppendItem(currid, pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd), image, imageSel, new OPJMarkerData(wxT("INFO")) ); wxString meth[] = { wxT("Relative error sensitivity"), wxT("MSE"), wxT("MSE reduction"), wxT("PSNR"), wxT("PSNR increase"), wxT("MAXERR (absolute peak error)"), wxT("TSE (total squared error)"), wxT("Reserved") }; subcurrid = m_tree->AppendItem(currid, meth[(pesd & 0x38) >> 3], image, imageSel, new OPJMarkerData(wxT("INFO")) ); wxString address[] = { wxT("Packet addressing"), wxT("Byte-range addressing"), wxT("Packet-range addressing"), wxT("Reserved") }; subcurrid = m_tree->AppendItem(currid, address[(pesd & 0xC0) >> 6], image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("%d bytes/value, %d bytes range"), ((pesd & 0x04) >> 2) + 1, (((pesd & 0x02) >> 1) + 1) * 2), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; ///////// // EPC // ///////// case EPC_VAL: { if (m_file->Read(twobytes, 2) != 2) break; unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(onebyte, 1) != 1) break; unsigned char pepc = onebyte[0]; image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("CRC-16 = 0x%x"), pcrc), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("Tot. length = %d"), dl), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("%s%s%s%s"), pepc & 0x10 ? wxT("ESD, ") : wxT(""), pepc & 0x20 ? wxT("RED, ") : wxT(""), pepc & 0x40 ? wxT("EPB, ") : wxT(""), pepc & 0x80 ? wxT("Info") : wxT("") ), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; ///////// // EPB // ///////// case EPB_VAL: { if (m_file->Read(onebyte, 1) != 1) break; unsigned char depb = onebyte[0]; if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("No. %d, %slatest, %spacked"), depb & 0x3F, depb & 0x40 ? wxT("") : wxT("not "), depb & 0x80 ? wxT("") : wxT("un")), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("%d bytes protected"), ldpepb), image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (pepb == 0x00000000) subcurrid = m_tree->AppendItem(currid, wxT("Predefined codes"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) { wxString text = wxT("CRC code"); if (pepb == 0x10000000) text << wxT(", CCITT (X25) 16 bits"); else if (pepb == 0x10000001) text << wxT(", Ethernet 32 bits"); else text << wxT(", JPWL RA"); subcurrid = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) { wxString text; subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("RS code, RS(%d, %d)"), (pepb & 0x0000FF00) >> 8, (pepb & 0x000000FF)), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE)) subcurrid = m_tree->AppendItem(currid, wxT("JPWL RA"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); else if (pepb == 0xFFFFFFFF) subcurrid = m_tree->AppendItem(currid, wxT("No method"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; #endif // USE_JPWL #ifdef USE_JPSEC case SEC_VAL: { } break; #endif // USE_JPSEC ///////// // SIZ // ///////// case SIZ_VAL: { int c; if (m_file->Read(twobytes, 2) != 2) break; unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0); this->m_tree->m_childframe->m_twidth = xtsiz; if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0); this->m_tree->m_childframe->m_theight = ytsiz; if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0); this->m_tree->m_childframe->m_tx = xtosiz; if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0); this->m_tree->m_childframe->m_ty = ytosiz; if (m_file->Read(twobytes, 2) != 2) break; csiz = STREAM_TO_UINT16(twobytes, 0); bool equaldepth = true, equalsize = true; unsigned char *ssiz = new unsigned char(csiz); unsigned char *xrsiz = new unsigned char(csiz); unsigned char *yrsiz = new unsigned char(csiz); for (c = 0; c < csiz; c++) { if (m_file->Read(&ssiz[c], 1) != 1) break; if (c > 0) equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]); if (m_file->Read(&xrsiz[c], 1) != 1) break; if (m_file->Read(&yrsiz[c], 1) != 1) break; if (c > 0) equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ; } if (equaldepth && equalsize) wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("I: %dx%d (%d, %d), %d c., %d%s bpp"), xsiz, ysiz, xosiz, yosiz, csiz, ((ssiz[0] & 0x7F) + 1), (ssiz[0] & 0x80) ? wxT("s") : wxT("u")), image, imageSel, new OPJMarkerData(wxT("INFO")) ); else wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("I: %dx%d (%d, %d), %d c."), xsiz, ysiz, xosiz, yosiz, csiz), image, imageSel, new OPJMarkerData(wxT("INFO")) ); wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("T: %dx%d (%d, %d)"), xtsiz, ytsiz, xtosiz, ytosiz), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; wxTreeItemId subcurrid4 = m_tree->AppendItem(currid, wxT("Components"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; for (c = 0; c < csiz; c++) { wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4, wxString::Format(wxT("#%d: %dx%d, %d%s bpp"), c, xsiz/xrsiz[c], ysiz/yrsiz[c], ((ssiz[c] & 0x7F) + 1), (ssiz[c] & 0x80) ? wxT("s") : wxT("u")), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } }; break; ///////// // SOT // ///////// case SOT_VAL: { if (m_file->Read(twobytes, 2) != 2) break; unsigned short int isot = STREAM_TO_UINT16(twobytes, 0); if (m_file->Read(fourbytes, 4) != 4) break; unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0); if (m_file->Read(onebyte, 1) != 1) break; unsigned char tpsot = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char tnsot = onebyte[0]; wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot), image, imageSel, new OPJMarkerData(wxT("INFO")) ); lastPsot = psot; lastsotpos = offset; inside_sod = 0; }; break; ///////// // COC // ///////// case COC_VAL: { unsigned short int ccoc; if (csiz < 257) { if (m_file->Read(onebyte, 1) != 1) break; ccoc = onebyte[0]; } else { if (m_file->Read(twobytes, 2) != 2) break; ccoc = STREAM_TO_UINT16(twobytes, 0); } if (m_file->Read(onebyte, 1) != 1) break; unsigned char scoc = onebyte[0]; wxTreeItemId subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("Comp. no. %d"), ccoc), image, imageSel, new OPJMarkerData(wxT("INFO")) ); wxString text; if (scoc & 0x01) text << wxT("Partitioned entropy coder"); else text << wxT("Unpartitioned entropy coder"); subcurrid = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (m_file->Read(onebyte, 1) != 1) break; unsigned char decomplevs = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbswidth = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbsheight = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbstyle = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char transform = onebyte[0]; subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1), image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (transform & 0x01) text = wxT("5-3 reversible wavelet"); else text = wxT("9-7 irreversible wavelet"); subcurrid = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxT("Coding styles"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; if (cbstyle & 0x01) text = wxT("Selective arithmetic coding bypass"); else text = wxT("No selective arithmetic coding bypass"); wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x02) text = wxT("Reset context probabilities on coding pass boundaries"); else text = wxT("No reset of context probabilities on coding pass boundaries"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x04) text = wxT("Termination on each coding passs"); else text = wxT("No termination on each coding pass"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x08) text = wxT("Vertically stripe causal context"); else text = wxT("No vertically stripe causal context"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x10) text = wxT("Predictable termination"); else text = wxT("No predictable termination"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x20) text = wxT("Segmentation symbols are used"); else text = wxT("No segmentation symbols are used"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; ///////// // COD // ///////// case COD_VAL: { if (m_file->Read(onebyte, 1) != 1) break; unsigned char scod = onebyte[0]; wxString text; if (scod & 0x01) text << wxT("Partitioned entropy coder"); else text << wxT("Unpartitioned entropy coder"); wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); text = wxT(""); if (scod & 0x02) text << wxT("Possible SOPs"); else text << wxT("No SOPs"); if (scod & 0x04) text << wxT(", possible EPHs"); else text << wxT(", no EPHs"); subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (m_file->Read(onebyte, 1) != 1) break; unsigned char progord = onebyte[0]; if (m_file->Read(twobytes, 2) != 2) break; unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0); if (m_file->Read(onebyte, 1) != 1) break; unsigned char mctransform = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char decomplevs = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbswidth = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbsheight = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char cbstyle = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char transform = onebyte[0]; subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1), image, imageSel, new OPJMarkerData(wxT("INFO")) ); text = wxT(""); switch (progord) { case (0): text << wxT("LRCP"); break; case (1): text << wxT("RLCP"); break; case (2): text << wxT("LRCP"); break; case (3): text << wxT("RPCL"); break; case (4): text << wxT("CPRL"); break; default: text << wxT("unknown progression"); break; } text << wxString::Format(wxT(", %d layers"), numlayers); if (transform & 0x01) text << wxT(", 5-3 rev."); else text << wxT(", 9-7 irr."); subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)), image, imageSel, new OPJMarkerData(wxT("INFO")) ); switch (mctransform) { case (0): { text = wxT("No MCT"); } break; case (1): { text = wxT("Reversible MCT on 0, 1, 2"); } break; case (2): { text = wxT("Irreversible MCT on 0, 1, 2"); } break; default: { text = wxT("Unknown"); } break; }; subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; subcurrid3 = m_tree->AppendItem(currid, wxT("Coding styles"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; if (cbstyle & 0x01) text = wxT("Selective arithmetic coding bypass"); else text = wxT("No selective arithmetic coding bypass"); wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x02) text = wxT("Reset context probabilities on coding pass boundaries"); else text = wxT("No reset of context probabilities on coding pass boundaries"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x04) text = wxT("Termination on each coding passs"); else text = wxT("No termination on each coding pass"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x08) text = wxT("Vertically stripe causal context"); else text = wxT("No vertically stripe causal context"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x10) text = wxT("Predictable termination"); else text = wxT("No predictable termination"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (cbstyle & 0x20) text = wxT("Segmentation symbols are used"); else text = wxT("No segmentation symbols are used"); subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); }; break; ///////// // QCC // ///////// case QCC_VAL: { unsigned short int cqcc; if (csiz < 257) { if (m_file->Read(onebyte, 1) != 1) break; cqcc = onebyte[0]; } else { if (m_file->Read(twobytes, 2) != 2) break; cqcc = STREAM_TO_UINT16(twobytes, 0); } wxTreeItemId subcurrid = m_tree->AppendItem(currid, wxString::Format(wxT("Comp. no. %d"), cqcc), image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (m_file->Read(onebyte, 1) != 1) break; unsigned char sqcc = onebyte[0]; wxString text; switch (sqcc & 0x1F) { case (0): text = wxT("No quantization"); break; case (1): text = wxT("Scalar implicit"); break; case (2): text = wxT("Scalar explicit"); break; default: text = wxT("Unknown"); break; } text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5); wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); } break; ///////// // QCD // ///////// case QCD_VAL: { if (m_file->Read(onebyte, 1) != 1) break; unsigned char sqcd = onebyte[0]; wxString text; switch (sqcd & 0x1F) { case (0): text = wxT("No quantization"); break; case (1): text = wxT("Scalar implicit"); break; case (2): text = wxT("Scalar explicit"); break; default: text = wxT("Unknown"); break; } text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5); wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); }; break; ///////// // COM // ///////// case COM_VAL: { #define showlen 25 char comment[showlen]; wxString comments; if (m_file->Read(twobytes, 2) != 2) break; unsigned short int rcom = STREAM_TO_UINT16(twobytes, 0); wxString text; if (rcom == 0) text = wxT("Binary values"); else if (rcom == 1) text = wxT("ISO 8859-1 (latin-1) values"); else if (rcom < 65535) text = wxT("Reserved for registration"); else text = wxT("Reserved for extension"); wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (m_file->Read(comment, showlen) != showlen) break; comments = wxString::FromAscii(comment).Truncate(wxMin(showlen, currlen - 4)); if ((currlen - 4) > showlen) comments << wxT("..."); subcurrid3 = m_tree->AppendItem(currid, comments, image, imageSel, new OPJMarkerData(wxT("INFO")) ); }; break; ///////// // TLM // ///////// case TLM_VAL: { if (m_file->Read(onebyte, 1) != 1) break; unsigned char ztlm = onebyte[0]; if (m_file->Read(onebyte, 1) != 1) break; unsigned char stlm = onebyte[0]; image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("TLM #%d"), ztlm), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("%d bits/index, %d bits/length"), 8 * ((stlm & 0x30) >> 4), 16 + 16 * ((stlm & 0x40) >> 6)), image, imageSel, new OPJMarkerData(wxT("INFO")) ); int n, numparts; numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6)); image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; subcurrid3 = m_tree->AppendItem(currid, wxT("Tile parts"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; for (n = 0; n < numparts; n++) { unsigned short int ttlm; unsigned long int ptlm; switch (((stlm & 0x30) >> 4)) { case 0: ttlm = 0; break; case 1: if (m_file->Read(onebyte, 1) != 1) break; ttlm = onebyte[0]; break; case 2: if (m_file->Read(twobytes, 2) != 2) break; ttlm = STREAM_TO_UINT16(twobytes, 0); break; } switch (((stlm & 0x40) >> 6)) { case 0: if (m_file->Read(twobytes, 2) != 2) break; ptlm = STREAM_TO_UINT16(twobytes, 0); break; case 1: if (m_file->Read(fourbytes, 4) != 4) break; ptlm = STREAM_TO_UINT32(fourbytes, 0); break; } wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3, wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm), image, imageSel, new OPJMarkerData(wxT("INFO")) ); } } break; ///////// // POD // ///////// case POD_VAL: { int n, numchanges; if (csiz < 257) numchanges = (currlen - 2) / 7; else numchanges = (currlen - 2) / 9; for (n = 0; n < numchanges; n++) { image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; wxTreeItemId subcurrid3 = m_tree->AppendItem(currid, wxString::Format(wxT("Change #%d"), n), image, imageSel, new OPJMarkerData(wxT("INFO")) ); if (m_file->Read(onebyte, 1) != 1) break; unsigned char rspod = onebyte[0]; unsigned short int cspod; if (csiz < 257) { if (m_file->Read(onebyte, 1) != 1) break; cspod = onebyte[0]; } else { if (m_file->Read(twobytes, 2) != 2) break; cspod = STREAM_TO_UINT16(twobytes, 0); } if (m_file->Read(twobytes, 2) != 2) break; unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0); if (m_file->Read(onebyte, 1) != 1) break; unsigned char repod = onebyte[0]; unsigned short int cepod; if (csiz < 257) { if (m_file->Read(onebyte, 1) != 1) break; cepod = onebyte[0]; } else { if (m_file->Read(twobytes, 2) != 2) break; cepod = STREAM_TO_UINT16(twobytes, 0); } if (m_file->Read(onebyte, 1) != 1) break; unsigned char ppod = onebyte[0]; image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3, wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid4 = m_tree->AppendItem(subcurrid3, wxString::Format(wxT("%d <= Component < %d"), cspod, cepod), image, imageSel, new OPJMarkerData(wxT("INFO")) ); subcurrid4 = m_tree->AppendItem(subcurrid3, wxString::Format(wxT("0 <= Layer < %d"), lyepod), image, imageSel, new OPJMarkerData(wxT("INFO")) ); wxString text = wxT(""); switch (ppod) { case (0): text << wxT("LRCP"); break; case (1): text << wxT("RLCP"); break; case (2): text << wxT("LRCP"); break; case (3): text << wxT("RPCL"); break; case (4): text << wxT("CPRL"); break; default: text << wxT("unknown progression"); break; } subcurrid4 = m_tree->AppendItem(subcurrid3, text, image, imageSel, new OPJMarkerData(wxT("INFO")) ); } } break; ///////// // SOD // ///////// case SOD_VAL: { inside_sod = 1; }; break; default: break; } // increment number of markers if (nmarks++ >= maxmarks) { WriteText(wxT("Maximum amount of markers exceeded")); break; } // advance position OPJ_ADVANCE(currlen + 2); } WriteText(wxT("Search finished")); } openjpeg-1.5.2/applications/OPJViewer/source/OPJViewer.ico0000644000175000017500000000206612315002075023305 0ustar mathieumathieu è&(( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ ™™™™™™™‘‘™™™™‘ ‘‘‘™™™™ ‘™™™™ ‘‘™‘‘‘™™‘ ‘‘ ™™ ‘ ‘‘ ‘‘‘‘‘‘‘ ‘‘ ‘‘ ‘‘ ™™‘™ ‘ ™™™™‘ ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÌ ÏñÈñ‡äÉð‡äÈ'ÄÌÀ'ÎNgÿÿÿÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿþà|?Ç>ŸžŸŸžÏŸÎÏŸÎGÏŸÎgÏÏÎsÏÏŽsÏãcÏø>Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ‘ ‘‘ ‘‘™™™‘    ™™™™‘ÿÿÿÿÿÇÿÇÿÇÿ‡ÿ“ÁÿŒÿžžžžÌàÿÿÿopenjpeg-1.5.2/applications/OPJViewer/source/wxjp2parser.cpp0000644000175000017500000010772612315002075024003 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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 "OPJViewer.h" /* defines */ #define SHORT_DESCR_LEN 32 #define LONG_DESCR_LEN 256 /* enumeration for file formats */ #define J2FILENUM 4 typedef enum { JP2_FILE, J2K_FILE, MJ2_FILE, UNK_FILE } j2filetype; /* enumeration for the box types */ #define j22boxNUM 23 typedef enum { FILE_BOX, JP_BOX, FTYP_BOX, JP2H_BOX, IHDR_BOX, COLR_BOX, JP2C_BOX, JP2I_BOX, XML_BOX, UUID_BOX, UINF_BOX, MOOV_BOX, MVHD_BOX, TRAK_BOX, TKHD_BOX, MDIA_BOX, MDHD_BOX, HDLR_BOX, MINF_BOX, VMHD_BOX, STBL_BOX, STSD_BOX, STSZ_BOX, MJP2_BOX, MDAT_BOX, ANY_BOX, UNK_BOX } j22boxtype; /* the box structure itself */ struct boxdef { char value[5]; /* hexadecimal value/string*/ char name[SHORT_DESCR_LEN]; /* short description */ char descr[LONG_DESCR_LEN]; /* long description */ int sbox; /* is it a superbox? */ int req[J2FILENUM]; /* mandatory box */ j22boxtype ins; /* contained in box... */ }; /* jp2 family box signatures */ #define FILE_SIGN "" #define JP_SIGN "jP\040\040" #define FTYP_SIGN "ftyp" #define JP2H_SIGN "jp2h" #define IHDR_SIGN "ihdr" #define COLR_SIGN "colr" #define JP2C_SIGN "jp2c" #define JP2I_SIGN "jp2i" #define XML_SIGN "xml\040" #define UUID_SIGN "uuid" #define UINF_SIGN "uinf" #define MOOV_SIGN "moov" #define MVHD_SIGN "mvhd" #define TRAK_SIGN "trak" #define TKHD_SIGN "tkhd" #define MDIA_SIGN "mdia" #define MDHD_SIGN "mdhd" #define HDLR_SIGN "hdlr" #define MINF_SIGN "minf" #define VMHD_SIGN "vmhd" #define STBL_SIGN "stbl" #define STSD_SIGN "stsd" #define STSZ_SIGN "stsz" #define MJP2_SIGN "mjp2" #define MDAT_SIGN "mdat" #define ANY_SIGN "" #define UNK_SIGN "" /* the possible boxes */ struct boxdef j22box[] = { /* sign */ {FILE_SIGN, /* short */ "placeholder for nothing", /* long */ "Nothing to say", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP_SIGN, /* short */ "JPEG 2000 Signature box", /* long */ "This box uniquely identifies the file as being part of the JPEG 2000 family of files", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {FTYP_SIGN, /* short */ "File Type box", /* long */ "This box specifies file type, version and compatibility information, including specifying if this file " "is a conforming JP2 file or if it can be read by a conforming JP2 reader", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP2H_SIGN, /* short */ "JP2 Header box", /* long */ "This box contains a series of boxes that contain header-type information about the file", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {IHDR_SIGN, /* short */ "Image Header box", /* long */ "This box specifies the size of the image and other related fields", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ JP2H_BOX}, /* sign */ {COLR_SIGN, /* short */ "Colour Specification box", /* long */ "This box specifies the colourspace of the image", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ JP2H_BOX}, /* sign */ {JP2C_SIGN, /* short */ "Contiguous Codestream box", /* long */ "This box contains the codestream as defined by Annex A", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP2I_SIGN, /* short */ "Intellectual Property box", /* long */ "This box contains intellectual property information about the image", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {XML_SIGN, /* short */ "XML box", /* long */ "This box provides a tool by which vendors can add XML formatted information to a JP2 file", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UUID_SIGN, /* short */ "UUID box", /* long */ "This box provides a tool by which vendors can add additional information to a file " "without risking conflict with other vendors", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UINF_SIGN, /* short */ "UUID Info box", /* long */ "This box provides a tool by which a vendor may provide access to additional information associated with a UUID", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {MOOV_SIGN, /* short */ "Movie box", /* long */ "This box contains the media data. In video tracks, this box would contain JPEG2000 video frames", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {MVHD_SIGN, /* short */ "Movie Header box", /* long */ "This box defines overall information which is media-independent, and relevant to the entire presentation " "considered as a whole", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MOOV_BOX}, /* sign */ {TRAK_SIGN, /* short */ "Track box", /* long */ "This is a container box for a single track of a presentation. A presentation may consist of one or more tracks", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MOOV_BOX}, /* sign */ {TKHD_SIGN, /* short */ "Track Header box", /* long */ "This box specifies the characteristics of a single track. Exactly one Track Header Box is contained in a track", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ TRAK_BOX}, /* sign */ {MDIA_SIGN, /* short */ "Media box", /* long */ "The media declaration container contains all the objects which declare information about the media data " "within a track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ TRAK_BOX}, /* sign */ {MDHD_SIGN, /* short */ "Media Header box", /* long */ "The media header declares overall information which is media-independent, and relevant to characteristics " "of the media in a track", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MDIA_BOX}, /* sign */ {HDLR_SIGN, /* short */ "Handler Reference box", /* long */ "This box within a Media Box declares the process by which the media-data in the track may be presented, " "and thus, the nature of the media in a track", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MDIA_BOX}, /* sign */ {MINF_SIGN, /* short */ "Media Information box", /* long */ "This box contains all the objects which declare characteristic information of the media in the track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MDIA_BOX}, /* sign */ {VMHD_SIGN, /* short */ "Video Media Header box", /* long */ "The video media header contains general presentation information, independent of the coding, for video media", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {STBL_SIGN, /* short */ "Sample Table box", /* long */ "The sample table contains all the time and data indexing of the media samples in a track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {STSD_SIGN, /* short */ "STSD Sample Description box", /* long */ "The sample description table gives detailed information about the coding type used, and any initialization " "information needed for that coding", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {STSZ_SIGN, /* short */ "Sample Size box", /* long */ "This box contains the sample count and a table giving the size of each sample", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ STBL_BOX}, /* sign */ {MJP2_SIGN, /* short */ "MJP2 Sample Description box", /* long */ "The MJP2 sample description table gives detailed information about the coding type used, and any initialization " "information needed for that coding", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {MDAT_SIGN, /* short */ "Media Data box", /* long */ "The meta-data for a presentation is stored in the single Movie Box which occurs at the top-level of a file", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {ANY_SIGN, /* short */ "Any box", /* long */ "All the existing boxes", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UNK_SIGN, /* short */ "Unknown Type box", /* long */ "The signature is not recognised to be that of an existing box", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ ANY_BOX} }; /* macro functions */ /* From little endian to big endian, 2 and 4 bytes */ #define BYTE_SWAP2(X) ((X & 0x00FF) << 8) | ((X & 0xFF00) >> 8) #define BYTE_SWAP4(X) ((X & 0x000000FF) << 24) | ((X & 0x0000FF00) << 8) | ((X & 0x00FF0000) >> 8) | ((X & 0xFF000000) >> 24) #ifdef __WXGTK__ #define BYTE_SWAP8(X) ((X & 0x00000000000000FFULL) << 56) | ((X & 0x000000000000FF00ULL) << 40) | \ ((X & 0x0000000000FF0000ULL) << 24) | ((X & 0x00000000FF000000ULL) << 8) | \ ((X & 0x000000FF00000000ULL) >> 8) | ((X & 0x0000FF0000000000ULL) >> 24) | \ ((X & 0x00FF000000000000ULL) >> 40) | ((X & 0xFF00000000000000ULL) >> 56) #else #define BYTE_SWAP8(X) ((X & 0x00000000000000FF) << 56) | ((X & 0x000000000000FF00) << 40) | \ ((X & 0x0000000000FF0000) << 24) | ((X & 0x00000000FF000000) << 8) | \ ((X & 0x000000FF00000000) >> 8) | ((X & 0x0000FF0000000000) >> 24) | \ ((X & 0x00FF000000000000) >> 40) | ((X & 0xFF00000000000000) >> 56) #endif /* From codestream to int values */ #define STREAM_TO_UINT32(C, P) (((unsigned long int) (C)[(P) + 0] << 24) + \ ((unsigned long int) (C)[(P) + 1] << 16) + \ ((unsigned long int) (C)[(P) + 2] << 8) + \ ((unsigned long int) (C)[(P) + 3] << 0)) #define STREAM_TO_UINT16(C, P) (((unsigned long int) (C)[(P) + 0] << 8) + \ ((unsigned long int) (C)[(P) + 1] << 0)) #define OPJREAD_LONG(F,L,N) { \ if (F->Read(fourbytes, 4) < 4) { \ wxLogMessage(wxT("Problem reading " N " from the file (file ended?)")); \ return -1; \ }; \ L = STREAM_TO_UINT32(fourbytes, 0); \ } /* handling functions */ #define ITEM_PER_ROW 10 //#define indprint if (0) printf("%.*s", 2 * level + 9, indent), printf char indent[] = " " " " " " " "; void indprint(wxString printout, int level) { wxLogMessage(/*wxString::Format(wxT("%.*s"), 2 * level + 9, indent) + */printout); } /* Box handler function */ int OPJParseThread::box_handler_function(int boxtype, wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint) { switch ((j22boxtype) boxtype) { /* JPEG 2000 Signature box */ case (JP_BOX): { unsigned long int checkdata = 0; fileid->Read(&checkdata, sizeof(unsigned long int)); checkdata = BYTE_SWAP4(checkdata); // add info wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Check data: %X -> %s"), checkdata, (checkdata == 0x0D0A870A) ? wxT("OK") : wxT("KO")), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; break; /* JPEG 2000 codestream box */ case (JP2C_BOX): { // add info wxTreeItemId currid = m_tree->AppendItem(parentid, wxString(wxT("Codestream")), m_tree->TreeCtrlIcon_Folder, m_tree->TreeCtrlIcon_Folder + 1, new OPJMarkerData(wxT("INFO-CSTREAM"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); m_tree->SetItemHasChildren(currid); // parse the file //ParseJ2KFile(fileid, filepoint, filelimit, currid); }; break; /* File Type box */ case (FTYP_BOX): { char BR[4], CL[4]; unsigned long int MinV, numCL, i; fileid->Read(BR, sizeof(char) * 4); fileid->Read(&MinV, sizeof(unsigned long int)); MinV = BYTE_SWAP4(MinV); numCL = (filelimit - fileid->Tell()) / 4; // add info wxTreeItemId currid = m_tree->AppendItem(parentid, wxT("Brand/Minor version: ") + wxString::FromAscii(BR).Truncate(4) + wxString::Format(wxT("/%d"), MinV), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Compatibility list")), m_tree->TreeCtrlIcon_Folder, m_tree->TreeCtrlIcon_Folder + 1, new OPJMarkerData(wxT("INFO")) ); for (i = 0; i < numCL; i++) { fileid->Read(CL, sizeof(char) * 4); m_tree->AppendItem(currid, wxString::FromAscii(CL).Truncate(4), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; }; break; /* JP2 Header box */ case (IHDR_BOX): { unsigned long int height, width; unsigned short int nc; unsigned char bpc, C, UnkC, IPR; fileid->Read(&height, sizeof(unsigned long int)); height = BYTE_SWAP4(height); fileid->Read(&width, sizeof(unsigned long int)); width = BYTE_SWAP4(width); fileid->Read(&nc, sizeof(unsigned short int)); nc = BYTE_SWAP2(nc); fileid->Read(&bpc, sizeof(unsigned char)); fileid->Read(&C, sizeof(unsigned char)); fileid->Read(&UnkC, sizeof(unsigned char)); fileid->Read(&IPR, sizeof(unsigned char)); // add info wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Dimensions: %d x %d x %d @ %d bpc"), width, height, nc, bpc + 1), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Compression type: %d"), C), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Colourspace unknown: %d"), UnkC), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Intellectual Property Rights: %d"), IPR), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; break; /* Colour Specification box */ case (COLR_BOX): { unsigned char METH, PREC, APPROX; char methdescr[80], enumcsdescr[80]; unsigned long int EnumCS; fileid->Read(&METH, sizeof(unsigned char)); switch (METH) { case 1: strcpy(methdescr, "Enumerated Colourspace"); break; case 2: strcpy(methdescr, "Restricted ICC profile"); break; default: strcpy(methdescr, "Unknown"); break; }; fileid->Read(&PREC, sizeof(unsigned char)); fileid->Read(&APPROX, sizeof(unsigned char)); if (METH != 2) { fileid->Read(&EnumCS, sizeof(unsigned long int)); EnumCS = BYTE_SWAP4(EnumCS); switch (EnumCS) { case 16: strcpy(enumcsdescr, "sRGB"); break; case 17: strcpy(enumcsdescr, "greyscale"); break; case 18: strcpy(enumcsdescr, "sYCC"); break; default: strcpy(enumcsdescr, "Unknown"); break; }; }; // add info wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Specification method: %d ("), METH) + wxString::FromAscii(methdescr) + wxT(")"), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Precedence: %d"), PREC), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Colourspace approximation: %d"), APPROX), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); if (METH != 2) currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Enumerated colourspace: %d ("), EnumCS) + wxString::FromAscii(enumcsdescr) + wxT(")"), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); if (METH != 1) currid = m_tree->AppendItem(parentid, wxString::Format(wxT("ICC profile: there is one")), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; break; /* Movie Header Box */ case (MVHD_BOX): { unsigned long int version, rate, matrix[9], next_track_ID; unsigned short int volume; fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); if (version == 0) { unsigned long int creation_time, modification_time, timescale, duration; fileid->Read(&creation_time, sizeof(unsigned long int)); creation_time = BYTE_SWAP4(creation_time); fileid->Read(&modification_time, sizeof(unsigned long int)); modification_time = BYTE_SWAP4(modification_time); fileid->Read(×cale, sizeof(unsigned long int)); timescale = BYTE_SWAP4(timescale); fileid->Read(&duration, sizeof(unsigned long int)); duration = BYTE_SWAP4(duration); const long unix_time = creation_time - 2082844800L; wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Creation time: %u (%.24s)"), creation_time, ctime(&unix_time)), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); const long unix_time1 = modification_time - 2082844800L; currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Modification time: %u (%.24s)"), modification_time, ctime(&unix_time1)), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Timescale: %u (%.6fs)"), timescale, 1.0 / (float) timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Duration: %u (%.3fs)"), duration, (float) duration / (float) timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); } else { int8byte creation_time, modification_time, duration; unsigned long int timescale; fileid->Read(&creation_time, sizeof(int8byte)); creation_time = BYTE_SWAP8(creation_time); fileid->Read(&modification_time, sizeof(int8byte)); modification_time = BYTE_SWAP8(modification_time); fileid->Read(×cale, sizeof(unsigned long int)); timescale = BYTE_SWAP4(timescale); fileid->Read(&duration, sizeof(int8byte)); duration = BYTE_SWAP8(duration); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Creation time: %u"), creation_time), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Modification time: %u"), modification_time), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Timescale: %u"), timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Duration: %u"), duration), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; fileid->Read(&rate, sizeof(unsigned long int)); rate = BYTE_SWAP4(rate); fileid->Read(&volume, sizeof(unsigned short int)); volume = BYTE_SWAP2(volume); fileid->Seek(6, wxFromCurrent); fileid->Read(&matrix, sizeof(unsigned char) * 9); fileid->Seek(4, wxFromCurrent); fileid->Read(&next_track_ID, sizeof(unsigned long int)); next_track_ID = BYTE_SWAP4(next_track_ID); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Rate: %d (%d.%d)"), rate, rate >> 16, rate & 0x0000FFFF), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Volume: %d (%d.%d)"), volume, volume >> 8, volume & 0x00FF), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Next track ID: %d"), next_track_ID), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; break; /* Sample Description box */ case (STSD_BOX): { unsigned long int version, entry_count; fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); fileid->Read(&entry_count, sizeof(unsigned long int)); entry_count = BYTE_SWAP4(entry_count); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Entry count: %d"), entry_count), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); jpeg2000parse(fileid, filepoint + 8, filelimit, parentid, level + 1, scansign, scanpoint); }; break; /* Sample Size box */ case (STSZ_BOX): { unsigned long int version, sample_size, sample_count, entry_size; fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); fileid->Read(&sample_size, sizeof(unsigned long int)); sample_size = BYTE_SWAP4(sample_size); if (sample_size == 0) { fileid->Read(&sample_count, sizeof(unsigned long int)); sample_count = BYTE_SWAP4(sample_count); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Sample count: %d"), sample_count), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); currid = m_tree->AppendItem(parentid, wxT("Entries size (bytes)"), m_tree->TreeCtrlIcon_Folder, m_tree->TreeCtrlIcon_Folder + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); wxString text; for (unsigned int s = 0; s < sample_count; s++) { fileid->Read(&entry_size, sizeof(unsigned long int)); entry_size = BYTE_SWAP4(entry_size); text << wxString::Format(wxT("%d, "), entry_size); if (((s % 10) == (ITEM_PER_ROW - 1)) || (s == (sample_count - 1))) { m_tree->AppendItem(currid, text, m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); text = wxT(""); } } } }; break; /* Video Media Header box */ case (VMHD_BOX): { unsigned long int version; unsigned short int graphicsmode, opcolor[3]; char graphicsdescr[100]; fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); fileid->Read(&graphicsmode, sizeof(unsigned short int)); graphicsmode = BYTE_SWAP2(graphicsmode); switch (graphicsmode) { case (0x00): strcpy(graphicsdescr, "copy"); break; case (0x24): strcpy(graphicsdescr, "transparent"); break; case (0x0100): strcpy(graphicsdescr, "alpha"); break; case (0x0101): strcpy(graphicsdescr, "whitealpha"); break; case (0x0102): strcpy(graphicsdescr, "blackalpha"); break; default: strcpy(graphicsdescr, "unknown"); break; }; fileid->Read(opcolor, 3 * sizeof(unsigned short int)); opcolor[0] = BYTE_SWAP2(opcolor[0]); opcolor[1] = BYTE_SWAP2(opcolor[1]); opcolor[2] = BYTE_SWAP2(opcolor[2]); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Composition mode: %d (")) + wxString::FromAscii(graphicsdescr) + wxT(")"), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("OP color: %d %d %d"), opcolor[0], opcolor[1], opcolor[2]), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); }; break; /* MJP2 Sample Description box */ case (MJP2_BOX): { unsigned short int height, width, depth; unsigned long int horizresolution, vertresolution; char compressor_name[32]; fileid->Seek(24, wxFromCurrent); fileid->Read(&width, sizeof(unsigned short int)); width = BYTE_SWAP2(width); fileid->Read(&height, sizeof(unsigned short int)); height = BYTE_SWAP2(height); fileid->Read(&horizresolution, sizeof(unsigned long int)); horizresolution = BYTE_SWAP4(horizresolution); fileid->Read(&vertresolution, sizeof(unsigned long int)); vertresolution = BYTE_SWAP4(vertresolution); fileid->Seek(6, wxFromCurrent); fileid->Read(compressor_name, sizeof(char) * 32); fileid->Read(&depth, sizeof(unsigned short int)); depth = BYTE_SWAP2(depth); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Dimensions: %d x %d @ %d bpp"), width, height, depth), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Resolution: %d.%d x %d.%d"), horizresolution >> 16, horizresolution & 0x0000FFFF, vertresolution >> 16, vertresolution & 0x0000FFFF), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Compressor: %.32s"), compressor_name), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); jpeg2000parse(fileid, filepoint + 78, filelimit, parentid, level + 1, scansign, scanpoint); }; break; /* Media Header box */ case (MDHD_BOX): { unsigned long int version; unsigned short int language; fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); if (version == 0) { unsigned long int creation_time, modification_time, timescale, duration; fileid->Read(&creation_time, sizeof(unsigned long int)); creation_time = BYTE_SWAP4(creation_time); fileid->Read(&modification_time, sizeof(unsigned long int)); modification_time = BYTE_SWAP4(modification_time); fileid->Read(×cale, sizeof(unsigned long int)); timescale = BYTE_SWAP4(timescale); fileid->Read(&duration, sizeof(unsigned long int)); duration = BYTE_SWAP4(duration); const long unix_time = creation_time - 2082844800L; wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Creation time: %u (%.24s)"), creation_time, ctime(&unix_time)), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); const long unix_time1 = modification_time - 2082844800L; currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Modification time: %u (%.24s)"), modification_time, ctime(&unix_time1)), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Timescale: %u (%.6fs)"), timescale, 1.0 / (float) timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Duration: %u (%.3fs)"), duration, (float) duration / (float) timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); } else { int8byte creation_time, modification_time, duration; unsigned long int timescale; fileid->Read(&creation_time, sizeof(int8byte)); creation_time = BYTE_SWAP8(creation_time); fileid->Read(&modification_time, sizeof(int8byte)); modification_time = BYTE_SWAP8(modification_time); fileid->Read(×cale, sizeof(unsigned long int)); timescale = BYTE_SWAP4(timescale); fileid->Read(&duration, sizeof(int8byte)); duration = BYTE_SWAP8(duration); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Creation time: %u"), creation_time), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Modification time: %u"), modification_time), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Timescale: %u"), timescale), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Duration: %u"), duration), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); } fileid->Read(&language, sizeof(unsigned short int)); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Language: %d (%c%c%c)"), language & 0xEFFF, 0x60 + (char) ((language >> 10) & 0x001F), 0x60 + (char) ((language >> 5) & 0x001F), 0x60 + (char) ((language >> 0) & 0x001F)), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); }; break; /* Media Handler box */ case (HDLR_BOX): { unsigned long int version, predefined, temp[3]; char handler[4], name[256]; int namelen = wxMin(256, (filelimit - filepoint - 24)); fileid->Read(&version, sizeof(unsigned long int)); version = BYTE_SWAP4(version); fileid->Read(&predefined, sizeof(unsigned long int)); fileid->Read(handler, 4 * sizeof(char)); fileid->Read(&temp, 3 * sizeof(unsigned long int)); fileid->Read(name, namelen * sizeof(char)); wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Handler: %.4s"), handler), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); currid = m_tree->AppendItem(parentid, wxString::Format(wxT("Name: %.255s"), name), m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1, new OPJMarkerData(wxT("INFO")) ); } break; /* not yet implemented */ default: break; }; return (0); } void OPJParseThread::ParseJP2File(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid) { unsigned long int scanpoint; jpeg2000parse(fileid, filepoint, filelimit, parentid, 0, NULL, &scanpoint); } /* the parsing function itself */ /* fileid = fid of the file to scan (you should open it by yourself) filepoint = first byte where to start to scan from (usually 0) filelimit = first byte where to stop to scan from (usually the file size) level = set this to 0 scansign = signature to scan for (NULL avoids search, returns " " if successful) scanpoint = point where the scan signature lies */ int OPJParseThread::jpeg2000parse(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint) { unsigned long int LBox = 0x00000000; //int LBox_read; char TBox[5] = "\0\0\0\0"; //int TBox_read; int8byte XLBox = 0x0000000000000000; //int XLBox_read; unsigned long int box_length = 0; int last_box = 0, box_num = 0; int box_type = ANY_BOX; unsigned char /*onebyte[1], twobytes[2],*/ fourbytes[4]; /* cycle all over the file */ box_num = 0; last_box = 0; while (!last_box) { /* do not exceed file limit */ if (filepoint >= filelimit) return (0); /* seek on file */ if (fileid->Seek(filepoint, wxFromStart) == wxInvalidOffset) return (-1); /* read the mandatory LBox, 4 bytes */ if (fileid->Read(fourbytes, 4) < 4) { WriteText(wxT("Problem reading LBox from the file (file ended?)")); return -1; }; LBox = STREAM_TO_UINT32(fourbytes, 0); /* read the mandatory TBox, 4 bytes */ if (fileid->Read(TBox, 4) < 4) { WriteText(wxT("Problem reading TBox from the file (file ended?)")); return -1; }; /* look if scansign is got */ if ((scansign != NULL) && (memcmp(TBox, scansign, 4) == 0)) { memcpy(scansign, " ", 4); *scanpoint = filepoint; /* hack/exploit */ // stop as soon as you find the codebox return (0); }; /* determine the box type */ for (box_type = JP_BOX; box_type < UNK_BOX; box_type++) if (memcmp(TBox, j22box[box_type].value, 4) == 0) break; /* read the optional XLBox, 8 bytes */ if (LBox == 1) { if (fileid->Read(&XLBox, 8) < 8) { WriteText(wxT("Problem reading XLBox from the file (file ended?)")); return -1; }; box_length = (unsigned long int) BYTE_SWAP8(XLBox); } else if (LBox == 0x00000000) { /* last box in file */ last_box = 1; box_length = filelimit - filepoint; } else box_length = LBox; /* show box info */ // append the marker int image, imageSel; image = m_tree->TreeCtrlIcon_Folder; imageSel = image + 1; wxTreeItemId currid = m_tree->AppendItem(parentid, wxString::Format(wxT("%03d: "), box_num) + wxString::FromAscii(TBox) + wxString::Format(wxT(" (0x%04X)"), ((unsigned long int) TBox[3]) + ((unsigned long int) TBox[2] << 8) + ((unsigned long int) TBox[1] << 16) + ((unsigned long int) TBox[0] << 24) ), image, imageSel, new OPJMarkerData(wxT("BOX"), m_tree->m_fname.GetFullPath(), filepoint, filepoint + box_length) ); // append some info image = m_tree->TreeCtrlIcon_File; imageSel = image + 1; // box name wxTreeItemId subcurrid1 = m_tree->AppendItem(currid, wxT("*** ") + wxString::FromAscii(j22box[box_type].name) + wxT(" ***"), image, imageSel, new OPJMarkerData(wxT("INFO")) ); m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT); // position and length wxTreeItemId subcurrid2 = m_tree->AppendItem(currid, wxLongLong(filepoint).ToString() + wxT(" > ") + wxLongLong(filepoint + box_length - 1).ToString() + wxT(", ") + wxString::Format(wxT("%d + 8 (%d)"), box_length, box_length + 8), image, imageSel, new OPJMarkerData(wxT("INFO")) ); /* go deep in the box */ box_handler_function((int) box_type, fileid, (LBox == 1) ? (filepoint + 16) : (filepoint + 8), filepoint + box_length, currid, level, scansign, scanpoint); /* if it's a superbox go inside it */ if (j22box[box_type].sbox) jpeg2000parse(fileid, (LBox == 1) ? (filepoint + 16) : (filepoint + 8), filepoint + box_length, currid, level + 1, scansign, scanpoint); /* increment box number and filepoint*/ box_num++; filepoint += box_length; }; /* all good */ return (0); } openjpeg-1.5.2/applications/OPJViewer/source/OPJDialogs.cpp0000644000175000017500000013051412315002075023436 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita'  degli studi di Perugia (UPG), Italy * 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 "OPJViewer.h" // ---------------------------------------------------------------------------- // OPJDecoderDialog // ---------------------------------------------------------------------------- IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog) BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog) EVT_CHECKBOX(OPJDECO_ENABLEDECO, OPJDecoderDialog::OnEnableDeco) #ifdef USE_JPWL EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL) #endif // USE_JPWL END_EVENT_TABLE() OPJDecoderDialog::OPJDecoderDialog(wxWindow* win, int dialogType) { SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY); Create(win, wxID_ANY, wxT("Decoder settings"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, wxRESIZE_BORDER) ); CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)); m_settingsNotebook = GetBookCtrl(); wxPanel* mainSettings = CreateMainSettingsPage(m_settingsNotebook); wxPanel* jpeg2000Settings = CreatePart1SettingsPage(m_settingsNotebook); if (!wxGetApp().m_enabledeco) jpeg2000Settings->Enable(false); wxPanel* mjpeg2000Settings = CreatePart3SettingsPage(m_settingsNotebook); if (!wxGetApp().m_enabledeco) mjpeg2000Settings->Enable(false); #ifdef USE_JPWL wxPanel* jpwlSettings = CreatePart11SettingsPage(m_settingsNotebook); if (!wxGetApp().m_enabledeco) jpwlSettings->Enable(false); #endif // USE_JPWL m_settingsNotebook->AddPage(mainSettings, wxT("Display"), false); m_settingsNotebook->AddPage(jpeg2000Settings, wxT("JPEG 2000"), false); m_settingsNotebook->AddPage(mjpeg2000Settings, wxT("MJPEG 2000"), false); #ifdef USE_JPWL m_settingsNotebook->AddPage(jpwlSettings, wxT("JPWL"), false); #endif // USE_JPWL LayoutDialog(); } OPJDecoderDialog::~OPJDecoderDialog() { } wxPanel* OPJDecoderDialog::CreateMainSettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // sub top sizer wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL); // add decoding enabling check box subtopSizer->Add( m_enabledecoCheck = new wxCheckBox(panel, OPJDECO_ENABLEDECO, wxT("Enable decoding"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 5); m_enabledecoCheck->SetValue(wxGetApp().m_enabledeco); // add parsing enabling check box subtopSizer->Add( m_enableparseCheck = new wxCheckBox(panel, OPJDECO_ENABLEPARSE, wxT("Enable parsing"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 5); m_enableparseCheck->SetValue(wxGetApp().m_enableparse); // resize settings, column wxString choices[] = {wxT("Don't resize"), wxT("Low quality"), wxT("High quality")}; m_resizeBox = new wxRadioBox(panel, OPJDECO_RESMETHOD, wxT("Resize method"), wxDefaultPosition, wxDefaultSize, WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_ROWS); m_resizeBox->SetSelection(wxGetApp().m_resizemethod + 1); subtopSizer->Add(m_resizeBox, 0, wxGROW | wxALL, 5); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } wxPanel* OPJDecoderDialog::CreatePart3SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add some space //topSizer->AddSpacer(5); // sub top sizer wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL); // frame settings, column wxStaticBox* frameBox = new wxStaticBox(panel, wxID_ANY, wxT("Frame")); wxBoxSizer* frameSizer = new wxStaticBoxSizer(frameBox, wxVERTICAL); // selected frame number, row wxBoxSizer* framenumSizer = new wxBoxSizer(wxHORIZONTAL); // add some text framenumSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Displayed frame:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space framenumSizer->Add(5, 5, 1, wxALL, 0); // add the value control framenumSizer->Add( m_framenumCtrl = new wxSpinCtrl(panel, OPJDECO_FRAMENUM, wxString::Format(wxT("%d"), wxGetApp().m_framenum), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 100000, wxGetApp().m_framenum), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); frameSizer->Add(framenumSizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(frameSizer, 0, wxGROW | wxALL, 5); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } wxPanel* OPJDecoderDialog::CreatePart1SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add some space //topSizer->AddSpacer(5); // sub top sizer wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL); // resolutions settings, column wxStaticBox* resolutionBox = new wxStaticBox(panel, wxID_ANY, wxT("Resolutions")); wxBoxSizer* resolutionSizer = new wxStaticBoxSizer(resolutionBox, wxVERTICAL); // reduce factor sizer, row wxBoxSizer* reduceSizer = new wxBoxSizer(wxHORIZONTAL); // add some text reduceSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Reduce factor:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space reduceSizer->Add(5, 5, 1, wxALL, 0); // add the value control reduceSizer->Add( m_reduceCtrl = new wxSpinCtrl(panel, OPJDECO_REDUCEFACTOR, wxString::Format(wxT("%d"), wxGetApp().m_reducefactor), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 10000, wxGetApp().m_reducefactor), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); resolutionSizer->Add(reduceSizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(resolutionSizer, 0, wxGROW | wxALL, 5); // quality layer settings, column wxStaticBox* layerBox = new wxStaticBox(panel, wxID_ANY, wxT("Layers")); wxBoxSizer* layerSizer = new wxStaticBoxSizer(layerBox, wxVERTICAL); // quality layers sizer, row wxBoxSizer* qualitySizer = new wxBoxSizer(wxHORIZONTAL); // add some text qualitySizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Quality layers:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space qualitySizer->Add(5, 5, 1, wxALL, 0); // add the value control qualitySizer->Add( m_layerCtrl = new wxSpinCtrl(panel, OPJDECO_QUALITYLAYERS, wxString::Format(wxT("%d"), wxGetApp().m_qualitylayers), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 100000, wxGetApp().m_qualitylayers), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); layerSizer->Add(qualitySizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(layerSizer, 0, wxGROW | wxALL, 5); // component settings, column wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components")); wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL); // quality layers sizer, row wxBoxSizer* numcompsSizer = new wxBoxSizer(wxHORIZONTAL); // add some text numcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Component displayed:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space numcompsSizer->Add(5, 5, 1, wxALL, 0); // add the value control numcompsSizer->Add( m_numcompsCtrl = new wxSpinCtrl(panel, OPJDECO_NUMCOMPS, wxString::Format(wxT("%d"), wxGetApp().m_components), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 100000, wxGetApp().m_components), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); m_numcompsCtrl->Enable(true); compoSizer->Add(numcompsSizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } #ifdef USE_JPWL wxPanel* OPJDecoderDialog::CreatePart11SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add some space //topSizer->AddSpacer(5); // sub top sizer wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL); // add JPWL enabling check box subtopSizer->Add( m_enablejpwlCheck = new wxCheckBox(panel, OPJDECO_ENABLEJPWL, wxT("Enable JPWL"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 5); m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwl); // component settings, column wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components")); wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL); // expected components sizer, row wxBoxSizer* expcompsSizer = new wxBoxSizer(wxHORIZONTAL); // add some text expcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Expected comps.:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space expcompsSizer->Add(5, 5, 1, wxALL, 0); // add the value control expcompsSizer->Add( m_expcompsCtrl = new wxSpinCtrl(panel, OPJDECO_EXPCOMPS, wxString::Format(wxT("%d"), wxGetApp().m_expcomps), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 100000, wxGetApp().m_expcomps), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); m_expcompsCtrl->Enable(wxGetApp().m_enablejpwl); compoSizer->Add(expcompsSizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5); // tiles settings, column wxStaticBox* tileBox = new wxStaticBox(panel, wxID_ANY, wxT("Tiles")); wxBoxSizer* tileSizer = new wxStaticBoxSizer(tileBox, wxVERTICAL); // maximum tiles sizer, row wxBoxSizer* maxtileSizer = new wxBoxSizer(wxHORIZONTAL); // add some text maxtileSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Max. no. of tiles:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5); // add some horizontal space maxtileSizer->Add(5, 5, 1, wxALL, 0); // add the value control maxtileSizer->Add( m_maxtilesCtrl = new wxSpinCtrl(panel, OPJDECO_MAXTILES, wxString::Format(wxT("%d"), wxGetApp().m_maxtiles), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 100000, wxGetApp().m_maxtiles), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5); m_maxtilesCtrl->Enable(wxGetApp().m_enablejpwl); tileSizer->Add(maxtileSizer, 0, wxGROW | wxALL, 5); subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 5); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } void OPJDecoderDialog::OnEnableJPWL(wxCommandEvent& event) { if (event.IsChecked()) { wxLogMessage(wxT("JPWL enabled")); m_expcompsCtrl->Enable(true); m_maxtilesCtrl->Enable(true); } else { wxLogMessage(wxT("JPWL disabled")); m_expcompsCtrl->Enable(false); m_maxtilesCtrl->Enable(false); } } #endif // USE_JPWL void OPJDecoderDialog::OnEnableDeco(wxCommandEvent& event) { size_t pp; if (event.IsChecked()) { wxLogMessage(wxT("Decoding enabled")); m_resizeBox->Enable(true); // enable all tabs except ourselves for (pp = 0; pp < m_settingsNotebook->GetPageCount(); pp++) { if (m_settingsNotebook->GetPageText(pp) != wxT("Display")) m_settingsNotebook->GetPage(pp)->Enable(true); } } else { wxLogMessage(wxT("Decoding disabled")); m_resizeBox->Enable(false); // disable all tabs except ourselves for (pp = 0; pp < m_settingsNotebook->GetPageCount(); pp++) { if (m_settingsNotebook->GetPageText(pp) != wxT("Display")) m_settingsNotebook->GetPage(pp)->Enable(false); } } } // ---------------------------------------------------------------------------- // OPJEncoderDialog // ---------------------------------------------------------------------------- IMPLEMENT_CLASS(OPJEncoderDialog, wxPropertySheetDialog) BEGIN_EVENT_TABLE(OPJEncoderDialog, wxPropertySheetDialog) EVT_CHECKBOX(OPJENCO_ENABLECOMM, OPJEncoderDialog::OnEnableComm) EVT_CHECKBOX(OPJENCO_ENABLEINDEX, OPJEncoderDialog::OnEnableIdx) EVT_CHECKBOX(OPJENCO_ENABLEPOC, OPJEncoderDialog::OnEnablePoc) EVT_RADIOBUTTON(OPJENCO_RATERADIO, OPJEncoderDialog::OnRadioQualityRate) EVT_RADIOBUTTON(OPJENCO_QUALITYRADIO, OPJEncoderDialog::OnRadioQualityRate) #ifdef USE_JPWL EVT_CHECKBOX(OPJENCO_ENABLEJPWL, OPJEncoderDialog::OnEnableJPWL) EVT_CHOICE(OPJENCO_HPROT, OPJEncoderDialog::OnHprotSelect) EVT_CHOICE(OPJENCO_PPROT, OPJEncoderDialog::OnPprotSelect) EVT_CHOICE(OPJENCO_SENSI, OPJEncoderDialog::OnSensiSelect) #endif // USE_JPWL END_EVENT_TABLE() OPJEncoderDialog::OPJEncoderDialog(wxWindow* win, int dialogType) { SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY); Create(win, wxID_ANY, wxT("Encoder settings"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, wxRESIZE_BORDER) ); CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP)); m_settingsNotebook = GetBookCtrl(); wxPanel* jpeg2000_1Settings = CreatePart1_1SettingsPage(m_settingsNotebook); wxPanel* jpeg2000_2Settings = CreatePart1_2SettingsPage(m_settingsNotebook); wxPanel* mainSettings = CreateMainSettingsPage(m_settingsNotebook); #ifdef USE_JPWL wxPanel* jpwlSettings = CreatePart11SettingsPage(m_settingsNotebook); #endif // USE_JPWL #ifdef USE_JPWL m_settingsNotebook->AddPage(jpwlSettings, wxT("JPWL"), false); #endif // USE_JPWL m_settingsNotebook->AddPage(jpeg2000_1Settings, wxT("JPEG 2000 - 1"), false); m_settingsNotebook->AddPage(jpeg2000_2Settings, wxT("JPEG 2000 - 2"), false); m_settingsNotebook->AddPage(mainSettings, wxT("General"), false); LayoutDialog(); } OPJEncoderDialog::~OPJEncoderDialog() { } wxPanel* OPJEncoderDialog::CreateMainSettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // sub top sizer wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } #ifdef USE_JPWL wxPanel* OPJEncoderDialog::CreatePart11SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); int specno; // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add JPWL enabling check box topSizer->Add( m_enablejpwlCheck = new wxCheckBox(panel, OPJENCO_ENABLEJPWL, wxT("Enable JPWL"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL | wxALIGN_CENTER, 5); m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwle); // sub top sizer wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3); // header settings, column wxStaticBox* headerBox = new wxStaticBox(panel, wxID_ANY, wxT("Header protection")); wxBoxSizer* headerSizer = new wxStaticBoxSizer(headerBox, wxVERTICAL); // info sizer, row wxBoxSizer* info1Sizer = new wxBoxSizer(wxHORIZONTAL); // add some text info1Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Type")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); // add some horizontal space info1Sizer->Add(3, 3, 1, wxALL, 0); // add some text info1Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Tile part")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); headerSizer->Add(info1Sizer, 0, wxGROW | wxALL, 0); // specify specs wxString hprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"), wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"), wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"), wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")}; for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) { // tile+hprot sizer, row wxBoxSizer* tilehprotSizer = new wxBoxSizer(wxHORIZONTAL); // add the value selection tilehprotSizer->Add( m_hprotChoice[specno] = new wxChoice(panel, OPJENCO_HPROT, wxDefaultPosition, wxSize(60, wxDefaultCoord), WXSIZEOF(hprotvalues), hprotvalues), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); m_hprotChoice[specno]->SetSelection(wxGetApp().m_hprotsel[specno]); // add some horizontal space tilehprotSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilehprotSizer->Add( m_htileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_HTILE, wxString::Format(wxT("%d"), wxGetApp().m_htileval[specno]), wxDefaultPosition, wxSize(45, wxDefaultCoord), wxSP_ARROW_KEYS, 0, JPWL_MAXIMUM_TILES - 1, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); headerSizer->Add(tilehprotSizer, 0, wxGROW | wxALL, 0); } wxCommandEvent event1; OnHprotSelect(event1); subtopSizer->Add(headerSizer, 0, wxGROW | wxALL, 3); // packet settings, column wxStaticBox* packetBox = new wxStaticBox(panel, wxID_ANY, wxT("Packet protection")); wxBoxSizer* packetSizer = new wxStaticBoxSizer(packetBox, wxVERTICAL); // info sizer, row wxBoxSizer* info2Sizer = new wxBoxSizer(wxHORIZONTAL); // add some text info2Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Type")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); // add some horizontal space info2Sizer->Add(3, 3, 1, wxALL, 0); // add some text info2Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Tile part")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); // add some horizontal space info2Sizer->Add(3, 3, 1, wxALL, 0); // add some text info2Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Packet")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); packetSizer->Add(info2Sizer, 0, wxGROW | wxALL, 0); // specify specs wxString pprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"), wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"), wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"), wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")}; for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) { // tile+pprot sizer, row wxBoxSizer* tilepprotSizer = new wxBoxSizer(wxHORIZONTAL); // add the value selection tilepprotSizer->Add( m_pprotChoice[specno] = new wxChoice(panel, OPJENCO_PPROT, wxDefaultPosition, wxSize(60, wxDefaultCoord), WXSIZEOF(pprotvalues), pprotvalues), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); m_pprotChoice[specno]->SetSelection(wxGetApp().m_pprotsel[specno]); // add some horizontal space tilepprotSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilepprotSizer->Add( m_ptileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PTILE, wxString::Format(wxT("%d"), wxGetApp().m_ptileval[specno]), wxDefaultPosition, wxSize(45, wxDefaultCoord), wxSP_ARROW_KEYS, 0, JPWL_MAXIMUM_TILES - 1, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); // add some horizontal space tilepprotSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilepprotSizer->Add( m_ppackCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PPACK, wxString::Format(wxT("%d"), wxGetApp().m_ppackval[specno]), wxDefaultPosition, wxSize(50, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 2047, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); packetSizer->Add(tilepprotSizer, 0, wxGROW | wxALL, 0); } wxCommandEvent event2; OnPprotSelect(event2); subtopSizer->Add(packetSizer, 0, wxGROW | wxALL, 3); // sensitivity settings, column wxStaticBox* sensiBox = new wxStaticBox(panel, wxID_ANY, wxT("Sensitivity")); wxBoxSizer* sensiSizer = new wxStaticBoxSizer(sensiBox, wxVERTICAL); // info sizer, row wxBoxSizer* info3Sizer = new wxBoxSizer(wxHORIZONTAL); // add some text info3Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Type")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); // add some horizontal space info3Sizer->Add(3, 3, 1, wxALL, 0); // add some text info3Sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Tile part")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 1); sensiSizer->Add(info3Sizer, 0, wxGROW | wxALL, 0); // specify specs wxString sensivalues[] = {wxT("None"), wxT("RELATIVE ERROR"), wxT("MSE"), wxT("MSE REDUCTION"), wxT("PSNR INCREMENT"), wxT("MAXERR"), wxT("TSE")}; for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) { // tile+sensi sizer, row wxBoxSizer* tilesensiSizer = new wxBoxSizer(wxHORIZONTAL); // add the value selection tilesensiSizer->Add( m_sensiChoice[specno] = new wxChoice(panel, OPJENCO_SENSI, wxDefaultPosition, wxSize(110, wxDefaultCoord), WXSIZEOF(sensivalues), sensivalues), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); m_sensiChoice[specno]->SetSelection(wxGetApp().m_sensisel[specno]); // add some horizontal space tilesensiSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilesensiSizer->Add( m_stileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_STILE, wxString::Format(wxT("%d"), wxGetApp().m_stileval[specno]), wxDefaultPosition, wxSize(45, wxDefaultCoord), wxSP_ARROW_KEYS, 0, JPWL_MAXIMUM_TILES - 1, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1); sensiSizer->Add(tilesensiSizer, 0, wxGROW | wxALL, 0); } wxCommandEvent event3; OnSensiSelect(event3); subtopSizer->Add(sensiSizer, 0, wxGROW | wxALL, 3); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } #endif // USE_JPWL wxPanel* OPJEncoderDialog::CreatePart1_1SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add some space //topSizer->AddSpacer(5); // sub top sizer wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3); // image settings, column wxStaticBox* imageBox = new wxStaticBox(panel, wxID_ANY, wxT("Image")); wxBoxSizer* imageSizer = new wxStaticBoxSizer(imageBox, wxVERTICAL); // subsampling factor sizer, row wxBoxSizer* subsSizer = new wxBoxSizer(wxHORIZONTAL); // add some text subsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Subsampling:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space subsSizer->Add(3, 3, 1, wxALL, 0); // add the value control subsSizer->Add( m_subsamplingCtrl = new wxTextCtrl(panel, OPJENCO_SUBSAMPLING, wxGetApp().m_subsampling, wxDefaultPosition, wxSize(80, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); imageSizer->Add(subsSizer, 0, wxGROW | wxALL, 3); // origin sizer, row wxBoxSizer* imorigSizer = new wxBoxSizer(wxHORIZONTAL); // add some text imorigSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Origin:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space imorigSizer->Add(3, 3, 1, wxALL, 0); // add the value control imorigSizer->Add( m_originCtrl = new wxTextCtrl(panel, OPJENCO_IMORIG, wxGetApp().m_origin, wxDefaultPosition, wxSize(80, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); imageSizer->Add(imorigSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(imageSizer, 0, wxGROW | wxALL, 3); // layer settings, column wxStaticBox* layerBox = new wxStaticBox(panel, wxID_ANY, wxT("Layers/compression")); wxBoxSizer* layerSizer = new wxStaticBoxSizer(layerBox, wxVERTICAL); // rate factor sizer, row wxBoxSizer* rateSizer = new wxBoxSizer(wxHORIZONTAL); // add some text /*rateSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Rate values:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3);*/ // add the radio button rateSizer->Add( m_rateRadio = new wxRadioButton(panel, OPJENCO_RATERADIO, wxT("&Rate values"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP), 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); m_rateRadio->SetValue(!(wxGetApp().m_enablequality)); // add some horizontal space rateSizer->Add(3, 3, 1, wxALL, 0); // add the value control rateSizer->Add( m_rateCtrl = new wxTextCtrl(panel, OPJENCO_RATEFACTOR, wxGetApp().m_rates, wxDefaultPosition, wxSize(100, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); if (wxGetApp().m_enablequality == true) m_rateCtrl->Enable(false); layerSizer->Add(rateSizer, 0, wxGROW | wxALL, 3); // quality factor sizer, row wxBoxSizer* qualitySizer = new wxBoxSizer(wxHORIZONTAL); // add some text /*qualitySizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Quality values:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3);*/ // add the radio button qualitySizer->Add( m_qualityRadio = new wxRadioButton(panel, OPJENCO_QUALITYRADIO, wxT("&Quality values"), wxDefaultPosition, wxDefaultSize), 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); m_qualityRadio->SetValue(wxGetApp().m_enablequality); // add some horizontal space qualitySizer->Add(3, 3, 1, wxALL, 0); // add the value control qualitySizer->Add( m_qualityCtrl = new wxTextCtrl(panel, OPJENCO_QUALITYFACTOR, wxGetApp().m_quality, wxDefaultPosition, wxSize(100, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); if (wxGetApp().m_enablequality == false) m_qualityCtrl->Enable(false); layerSizer->Add(qualitySizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(layerSizer, 0, wxGROW | wxALL, 3); // wavelet settings, column wxStaticBox* transformBox = new wxStaticBox(panel, wxID_ANY, wxT("Transforms")); wxBoxSizer* transformSizer = new wxStaticBoxSizer(transformBox, wxVERTICAL); // multiple component check box transformSizer->Add( m_mctCheck = new wxCheckBox(panel, OPJENCO_ENABLEMCT, wxT("Multiple component"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_mctCheck->SetValue(wxGetApp().m_multicomp); // irreversible wavelet check box transformSizer->Add( m_irrevCheck = new wxCheckBox(panel, OPJENCO_ENABLEIRREV, wxT("Irreversible wavelet"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_irrevCheck->SetValue(wxGetApp().m_irreversible); // resolution number sizer, row wxBoxSizer* resnumSizer = new wxBoxSizer(wxHORIZONTAL); // add some text resnumSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Resolutions:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space resnumSizer->Add(3, 3, 1, wxALL, 0); // add the value control resnumSizer->Add( m_resolutionsCtrl = new wxSpinCtrl(panel, OPJENCO_RESNUMBER, wxString::Format(wxT("%d"), wxGetApp().m_resolutions), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 256, 6), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); transformSizer->Add(resnumSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(transformSizer, 0, wxGROW | wxALL, 3); // codestream settings, column wxStaticBox* codestreamBox = new wxStaticBox(panel, wxID_ANY, wxT("Codestream")); wxBoxSizer* codestreamSizer = new wxStaticBoxSizer(codestreamBox, wxVERTICAL); // codeblock sizer, row wxBoxSizer* codeblockSizer = new wxBoxSizer(wxHORIZONTAL); // add some text codeblockSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Codeblocks size:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space codeblockSizer->Add(3, 3, 1, wxALL, 0); // add the value control codeblockSizer->Add( m_cbsizeCtrl = new wxTextCtrl(panel, OPJENCO_CODEBLOCKSIZE, wxGetApp().m_cbsize, wxDefaultPosition, wxSize(100, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); codestreamSizer->Add(codeblockSizer, 0, wxGROW | wxALL, 3); // precinct sizer, row wxBoxSizer* precinctSizer = new wxBoxSizer(wxHORIZONTAL); // add some text precinctSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Precincts size:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space precinctSizer->Add(3, 3, 1, wxALL, 0); // add the value control precinctSizer->Add( m_prsizeCtrl = new wxTextCtrl(panel, OPJENCO_PRECINCTSIZE, wxGetApp().m_prsize, wxDefaultPosition, wxSize(100, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); codestreamSizer->Add(precinctSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(codestreamSizer, 0, wxGROW | wxALL, 3); // tile settings, column wxStaticBox* tileBox = new wxStaticBox(panel, wxID_ANY, wxT("Tiles")); wxBoxSizer* tileSizer = new wxStaticBoxSizer(tileBox, wxVERTICAL); // tile size sizer, row wxBoxSizer* tilesizeSizer = new wxBoxSizer(wxHORIZONTAL); // add some text tilesizeSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Size:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space tilesizeSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilesizeSizer->Add( m_tsizeCtrl = new wxTextCtrl(panel, OPJENCO_TILESIZE, wxGetApp().m_tsize, wxDefaultPosition, wxSize(80, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); tileSizer->Add(tilesizeSizer, 0, wxGROW | wxALL, 3); // tile origin sizer, row wxBoxSizer* tilorigSizer = new wxBoxSizer(wxHORIZONTAL); // add some text tilorigSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Origin:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space tilorigSizer->Add(3, 3, 1, wxALL, 0); // add the value control tilorigSizer->Add( m_toriginCtrl = new wxTextCtrl(panel, OPJENCO_TILORIG, wxGetApp().m_torigin, wxDefaultPosition, wxSize(80, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); tileSizer->Add(tilorigSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 3); // progression and profile settings, column wxString choices[] = {wxT("LRCP"), wxT("RLCP"), wxT("RPCL"), wxT("PCRL"), wxT("CPRL"), wxT("DCI2K24"), wxT("DCI2K48"), wxT("DCI4K")}; progressionBox = new wxRadioBox(panel, OPJENCO_PROGRESSION, wxT("Progression order/profile"), wxDefaultPosition, wxDefaultSize, WXSIZEOF(choices), choices, 3, wxRA_SPECIFY_COLS); progressionBox->SetSelection(wxGetApp().m_progression); subtopSizer->Add(progressionBox, 0, wxGROW | wxALL, 3); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } wxPanel* OPJEncoderDialog::CreatePart1_2SettingsPage(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); // top sizer wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); // add some space //topSizer->AddSpacer(5); // sub top sizer wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3); // resilience settings, column wxStaticBox* resilBox = new wxStaticBox(panel, wxID_ANY, wxT("Error resilience")); wxBoxSizer* resilSizer = new wxStaticBoxSizer(resilBox, wxVERTICAL); // resil2 sizer, row wxBoxSizer* resil2Sizer = new wxBoxSizer(wxHORIZONTAL); // SOP check box resil2Sizer->Add( m_sopCheck = new wxCheckBox(panel, OPJENCO_ENABLESOP, wxT("SOP"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_sopCheck->SetValue(wxGetApp().m_enablesop); // EPH check box resil2Sizer->Add( m_ephCheck = new wxCheckBox(panel, OPJENCO_ENABLEEPH, wxT("EPH"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_ephCheck->SetValue(wxGetApp().m_enableeph); resilSizer->Add(resil2Sizer, 0, wxGROW | wxALL, 3); // separation resilSizer->Add(new wxStaticLine(panel, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 3); // resil3 sizer, row wxFlexGridSizer* resil3Sizer = new wxFlexGridSizer(3, 3, 3); // BYPASS check box resil3Sizer->Add( m_enablebypassCheck = new wxCheckBox(panel, OPJENCO_ENABLEBYPASS, wxT("BYPASS"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablebypassCheck->SetValue(wxGetApp().m_enablebypass); // RESET check box resil3Sizer->Add( m_enableresetCheck = new wxCheckBox(panel, OPJENCO_ENABLERESET, wxT("RESET"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enableresetCheck->SetValue(wxGetApp().m_enablereset); // RESTART check box resil3Sizer->Add( m_enablerestartCheck = new wxCheckBox(panel, OPJENCO_ENABLERESTART, wxT("RESTART"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablerestartCheck->SetValue(wxGetApp().m_enablerestart); // VSC check box resil3Sizer->Add( m_enablevscCheck = new wxCheckBox(panel, OPJENCO_ENABLEVSC, wxT("VSC"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablevscCheck->SetValue(wxGetApp().m_enablevsc); // ERTERM check box resil3Sizer->Add( m_enableertermCheck = new wxCheckBox(panel, OPJENCO_ENABLEERTERM, wxT("ERTERM"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enableertermCheck->SetValue(wxGetApp().m_enableerterm); // SEGMARK check box resil3Sizer->Add( m_enablesegmarkCheck = new wxCheckBox(panel, OPJENCO_ENABLESEGMARK, wxT("SEGMARK"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablesegmarkCheck->SetValue(wxGetApp().m_enablesegmark); resilSizer->Add(resil3Sizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(resilSizer, 0, wxGROW | wxALL, 3); // ROI settings, column wxStaticBox* roiBox = new wxStaticBox(panel, wxID_ANY, wxT("Region Of Interest")); wxBoxSizer* roiSizer = new wxStaticBoxSizer(roiBox, wxVERTICAL); // component number sizer, row wxBoxSizer* roicompSizer = new wxBoxSizer(wxHORIZONTAL); // add some text roicompSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Component:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space roicompSizer->Add(3, 3, 1, wxALL, 0); // add the value control roicompSizer->Add( /*m_layerCtrl =*/ new wxSpinCtrl(panel, OPJENCO_ROICOMP, wxT("0"), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 256, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); roiSizer->Add(roicompSizer, 0, wxGROW | wxALL, 3); // upshift sizer, row wxBoxSizer* roishiftSizer = new wxBoxSizer(wxHORIZONTAL); // add some text roishiftSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Upshift:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space roishiftSizer->Add(3, 3, 1, wxALL, 0); // add the value control roishiftSizer->Add( /*m_layerCtrl =*/ new wxSpinCtrl(panel, OPJENCO_ROISHIFT, wxT("0"), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 0, 37, 0), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); roiSizer->Add(roishiftSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(roiSizer, 0, wxGROW | wxALL, 3); // POC settings, column wxStaticBox* pocBox = new wxStaticBox(panel, wxID_ANY, wxT("POC")); wxBoxSizer* pocSizer = new wxStaticBoxSizer(pocBox, wxVERTICAL); // POC check box pocSizer->Add( m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled (tn=rs,cs,le,re,ce,pr)"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablepocCheck->SetValue(wxGetApp().m_enablepoc); // POC sizer, row wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL); // add some text pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")), 0, wxALL | wxALIGN_TOP, 3); // add some horizontal space pocspecSizer->Add(3, 3, 1, wxALL, 0); // add the value control pocspecSizer->Add( m_pocCtrl = new wxTextCtrl(panel, OPJENCO_POCSPEC, wxGetApp().m_poc, wxDefaultPosition, wxSize(140, 60), wxTE_LEFT | wxTE_MULTILINE), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); m_pocCtrl->Enable(wxGetApp().m_enablepoc); pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3); // Comment settings, column wxStaticBox* commentBox = new wxStaticBox(panel, wxID_ANY, wxT("Comment")); wxBoxSizer* commentSizer = new wxStaticBoxSizer(commentBox, wxVERTICAL); // commenting check box commentSizer->Add( m_enablecommCheck = new wxCheckBox(panel, OPJENCO_ENABLECOMM, wxT("Enabled (empty to reset)"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enablecommCheck->SetValue(wxGetApp().m_enablecomm); // add some horizontal space commentSizer->Add(3, 3, 1, wxALL, 0); // add the value control commentSizer->Add( m_commentCtrl = new wxTextCtrl(panel, OPJENCO_COMMENTTEXT, wxGetApp().m_comment, wxDefaultPosition, wxSize(wxDefaultCoord, 60), wxTE_LEFT | wxTE_MULTILINE), 0, wxGROW | wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); m_commentCtrl->Enable(wxGetApp().m_enablecomm); subtopSizer->Add(commentSizer, 0, wxGROW | wxALL, 3); // Index file settings, column wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing")); wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL); // indexing check box indexSizer->Add( m_enableidxCheck = new wxCheckBox(panel, OPJENCO_ENABLEINDEX, wxT("Enabled"), wxDefaultPosition, wxDefaultSize), 0, wxGROW | wxALL, 3); m_enableidxCheck->SetValue(wxGetApp().m_enableidx); // index file sizer, row wxBoxSizer* indexnameSizer = new wxBoxSizer(wxHORIZONTAL); // add some text indexnameSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&File name:")), 0, wxALL | wxALIGN_CENTER_VERTICAL, 3); // add some horizontal space indexnameSizer->Add(3, 3, 1, wxALL, 0); // add the value control indexnameSizer->Add( m_indexCtrl = new wxTextCtrl(panel, OPJENCO_INDEXNAME, wxGetApp().m_index, wxDefaultPosition, wxSize(120, wxDefaultCoord), wxTE_LEFT), 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3); m_indexCtrl->Enable(wxGetApp().m_enableidx); indexSizer->Add(indexnameSizer, 0, wxGROW | wxALL, 3); subtopSizer->Add(indexSizer, 0, wxGROW | wxALL, 3); topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5); // assign top and fit it panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } void OPJEncoderDialog::OnEnableComm(wxCommandEvent& event) { if (event.IsChecked()) { wxLogMessage(wxT("Comment enabled")); m_commentCtrl->Enable(true); } else { wxLogMessage(wxT("Comment disabled")); m_commentCtrl->Enable(false); } } void OPJEncoderDialog::OnEnableIdx(wxCommandEvent& event) { if (event.IsChecked()) { wxLogMessage(wxT("Index enabled")); m_indexCtrl->Enable(true); } else { wxLogMessage(wxT("Index disabled")); m_indexCtrl->Enable(false); } } void OPJEncoderDialog::OnEnablePoc(wxCommandEvent& event) { if (event.IsChecked()) { wxLogMessage(wxT("POC enabled")); m_pocCtrl->Enable(true); } else { wxLogMessage(wxT("POC disabled")); m_pocCtrl->Enable(false); } } void OPJEncoderDialog::OnRadioQualityRate(wxCommandEvent& event) { if (event.GetId() == OPJENCO_QUALITYRADIO) { wxLogMessage(wxT("Quality selected")); m_rateCtrl->Enable(false); m_qualityCtrl->Enable(true); } else { wxLogMessage(wxT("Rate selected")); m_rateCtrl->Enable(true); m_qualityCtrl->Enable(false); } } #ifdef USE_JPWL void OPJEncoderDialog::OnEnableJPWL(wxCommandEvent& event) { int specno; if (event.IsChecked()) { wxLogMessage(wxT("JPWL enabled")); for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) { m_hprotChoice[specno]->Enable(true); m_htileCtrl[specno]->Enable(true); m_pprotChoice[specno]->Enable(true); m_ptileCtrl[specno]->Enable(true); m_ppackCtrl[specno]->Enable(true); m_sensiChoice[specno]->Enable(true); m_stileCtrl[specno]->Enable(true); } OnHprotSelect(event); OnPprotSelect(event); OnSensiSelect(event); } else { wxLogMessage(wxT("JPWL disabled")); for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) { m_hprotChoice[specno]->Enable(false); m_htileCtrl[specno]->Enable(false); m_pprotChoice[specno]->Enable(false); m_ptileCtrl[specno]->Enable(false); m_ppackCtrl[specno]->Enable(false); m_sensiChoice[specno]->Enable(false); m_stileCtrl[specno]->Enable(false); } } } void OPJEncoderDialog::OnHprotSelect(wxCommandEvent& event) { int specno; // deactivate properly for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) { if (!m_hprotChoice[specno]->GetSelection()) { m_hprotChoice[specno]->Enable(false); m_htileCtrl[specno]->Enable(false); } else break; } if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) { m_hprotChoice[specno + 1]->Enable(true); m_htileCtrl[specno + 1]->Enable(true); } //wxLogMessage(wxT("hprot changed: %d"), specno); } void OPJEncoderDialog::OnPprotSelect(wxCommandEvent& event) { int specno; // deactivate properly for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) { if (!m_pprotChoice[specno]->GetSelection()) { m_pprotChoice[specno]->Enable(false); m_ptileCtrl[specno]->Enable(false); m_ppackCtrl[specno]->Enable(false); } else break; } if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) { m_pprotChoice[specno + 1]->Enable(true); m_ptileCtrl[specno + 1]->Enable(true); m_ppackCtrl[specno + 1]->Enable(true); } //wxLogMessage(wxT("pprot changed: %d"), specno); } void OPJEncoderDialog::OnSensiSelect(wxCommandEvent& event) { int specno; // deactivate properly for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) { if (!m_sensiChoice[specno]->GetSelection()) { m_sensiChoice[specno]->Enable(false); m_stileCtrl[specno]->Enable(false); } else break; } if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) { m_sensiChoice[specno + 1]->Enable(true); m_stileCtrl[specno + 1]->Enable(true); } //wxLogMessage(wxT("sprot changed: %d"), specno); } #endif // USE_JPWL openjpeg-1.5.2/applications/OPJViewer/source/OPJViewer.h0000644000175000017500000006016112315002075022762 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: sashtest.h // Purpose: Layout window/sash sample // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id: sashtest.h,v 1.5 2005/06/02 12:04:24 JS Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: treectrl.h // Purpose: wxTreeCtrl sample // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id: treetest.h,v 1.50 2006/11/04 11:26:51 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: dialogs.h // Purpose: Common dialogs demo // Author: Julian Smart // Modified by: ABX (2004) - adjustementd for conditional building // Created: 04/01/98 // RCS-ID: $Id: dialogs.h,v 1.50 2006/10/08 14:12:59 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifndef __OPJ_VIEWER_H__ #define __OPJ_VIEWER_H__ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #include "wx/mdi.h" #endif #include "wx/toolbar.h" #include "wx/laywin.h" #include "wx/treectrl.h" #include "icon1.xpm" #include "icon2.xpm" #include "icon3.xpm" #include "icon4.xpm" #include "icon5.xpm" #include "wx/filedlg.h" #include "wx/toolbar.h" #include #include #include #include #include "wx/notebook.h" #include #include "wx/propdlg.h" #include "wx/spinctrl.h" #include #include "wx/wxhtml.h" #include "wx/statline.h" #include #include #include "wx/toolbar.h" #include "wx/artprov.h" #include "libopenjpeg/openjpeg.h" //#include "imagj2k.h" //#include "imagjp2.h" //#include "imagmj2.h" #include "imagjpeg2000.h" #ifdef USE_MXF #include "imagmxf.h" #endif // USE_MXF #ifdef __WXMSW__ typedef unsigned __int64 int8byte; #endif // __WXMSW__ #ifdef __WXGTK__ typedef unsigned long long int8byte; #endif // __WXGTK__ #define USE_GENERIC_TREECTRL 0 #define USE_PENCIL_ON_CANVAS 0 #if USE_GENERIC_TREECTRL #include "wx/generic/treectlg.h" #ifndef wxTreeCtrl #define wxTreeCtrl wxGenericTreeCtrl #define sm_classwxTreeCtrl sm_classwxGenericTreeCtrl #endif #endif #define OPJ_APPLICATION wxT("OPJViewer") #define OPJ_APPLICATION_NAME wxT("OpenJPEG Viewer") #define OPJ_APPLICATION_VERSION wxT("0.4 beta") #define OPJ_APPLICATION_TITLEBAR OPJ_APPLICATION_NAME wxT(" ") OPJ_APPLICATION_VERSION #define OPJ_APPLICATION_COPYRIGHT wxT("(C) 2007-2008, Giuseppe Baruffa") #define OPJ_APPLICATION_VENDOR wxT("OpenJPEG") #ifdef __WXMSW__ #define OPJ_APPLICATION_PLATFORM wxT("Windows") #endif #ifdef __WXGTK__ #define OPJ_APPLICATION_PLATFORM wxT("Linux") #endif #define OPJ_FRAME_WIDTH 800 #define OPJ_FRAME_HEIGHT 600 #define OPJ_BROWSER_WIDTH 300 #define OPJ_PEEKER_HEIGHT 130 #define OPJ_CANVAS_BORDER 10 #define OPJ_CANVAS_COLOUR *wxWHITE #ifdef USE_JPWL //#define MYJPWL_MAX_NO_TILESPECS JPWL_MAX_NO_TILESPECS #define MYJPWL_MAX_NO_TILESPECS 4 #endif // USE_JPWL class OPJDecoThread; class OPJEncoThread; class OPJParseThread; WX_DEFINE_ARRAY_PTR(wxThread *, wxArrayThread); class OPJChildFrame; ////////////////////////////////// // this is our main application // ////////////////////////////////// class OPJViewerApp: public wxApp { // public methods and variables public: // class constructor OPJViewerApp() { m_showImages = true; m_showButtons = false; } // other methods bool OnInit(void); int OnExit(void); void SetShowImages(bool show) { m_showImages = show; } bool ShowImages() const { return m_showImages; } void ShowCmdLine(const wxCmdLineParser& parser); // all the threads currently alive - as soon as the thread terminates, it's // removed from the array wxArrayThread m_deco_threads, m_parse_threads, m_enco_threads; // crit section protects access to all of the arrays below wxCriticalSection m_deco_critsect, m_parse_critsect, m_enco_critsect; // semaphore used to wait for the threads to exit, see OPJFrame::OnQuit() wxSemaphore m_deco_semAllDone, m_parse_semAllDone, m_enco_semAllDone; // the last exiting thread should post to m_semAllDone if this is true // (protected by the same m_critsect) bool m_deco_waitingUntilAllDone, m_parse_waitingUntilAllDone, m_enco_waitingUntilAllDone; // the list of all filenames written in the command line wxArrayString m_filelist; // displaying engine parameters int m_resizemethod; // decoding engine parameters bool m_enabledeco, m_enableparse; int m_reducefactor, m_qualitylayers, m_components, m_framenum; #ifdef USE_JPWL bool m_enablejpwl, m_enablejpwle; int m_expcomps, m_maxtiles; #endif // USE_JPWL int m_framewidth, m_frameheight; // encoding engine parameters wxString m_subsampling, m_origin, m_rates, m_comment, m_index, m_quality; wxString m_cbsize, m_prsize, m_tsize, m_torigin, m_poc; bool m_enablecomm, m_enableidx, m_multicomp, m_irreversible, m_enablesop, m_enableeph; bool m_enablebypass, m_enablereset, m_enablerestart, m_enablevsc, m_enableerterm; bool m_enablesegmark, m_enablepoc; bool m_enablequality; int m_resolutions, m_progression; #ifdef USE_JPWL int m_hprotsel[MYJPWL_MAX_NO_TILESPECS], m_pprotsel[MYJPWL_MAX_NO_TILESPECS]; int m_htileval[MYJPWL_MAX_NO_TILESPECS], m_ptileval[MYJPWL_MAX_NO_TILESPECS], m_ppackval[MYJPWL_MAX_NO_TILESPECS]; int m_sensisel[MYJPWL_MAX_NO_TILESPECS], m_stileval[MYJPWL_MAX_NO_TILESPECS]; #endif // USE_JPWL // some layout settings bool m_showtoolbar, m_showbrowser, m_showpeeker; int m_browserwidth, m_peekerheight; // application configuration wxConfig *OPJconfig; // private methods and variables private: bool m_showImages, m_showButtons; }; DECLARE_APP(OPJViewerApp) /////////////////////////////////////////// // this canvas is used to draw the image // /////////////////////////////////////////// class OPJCanvas: public wxScrolledWindow { // public methods and variables public: // class constructor OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size); virtual void OnDraw(wxDC& dc); void OnEvent(wxMouseEvent& event); void WriteText(const wxString& text) { #ifndef __WXGTK__ wxMutexGuiEnter(); #endif //__WXGTK__ wxLogMessage(text); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif //__WXGTK__ } void OnThreadSignal(wxCommandEvent& event); OPJDecoThread *CreateDecoThread(void); OPJEncoThread *CreateEncoThread(void); OPJChildFrame *m_childframe; wxBitmap m_image, m_image100; wxFileName m_fname, m_savename; long m_zooml; DECLARE_EVENT_TABLE() }; /////////////////////////////////////////////////// // the data associated to each tree leaf or node // /////////////////////////////////////////////////// class OPJMarkerData : public wxTreeItemData { // public methods and variables public: // class constructor OPJMarkerData(const wxString& desc, const wxString& fname = wxT(""), wxFileOffset start = 0, wxFileOffset length = 0) : m_desc(desc), m_filestring(fname) { m_start = start; m_length = length; } void ShowInfo(wxTreeCtrl *tree); const wxChar *GetDesc1() const { return m_desc.c_str(); } const wxChar *GetDesc2() const { return m_filestring.c_str(); } wxFileOffset m_start, m_length; wxString m_desc; // private methods and variables private: wxString m_filestring; }; class OPJMarkerTree : public wxTreeCtrl { public: enum { TreeCtrlIcon_File, TreeCtrlIcon_FileSelected, TreeCtrlIcon_Folder, TreeCtrlIcon_FolderSelected, TreeCtrlIcon_FolderOpened }; OPJMarkerTree() { }; OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style); virtual ~OPJMarkerTree(){}; OPJParseThread *CreateParseThread(wxTreeItemId parentid = 0x00, OPJChildFrame *subframe = NULL); void WriteText(const wxString& text) { wxMutexGuiEnter(); wxLogMessage(text); wxMutexGuiLeave(); } wxFileName m_fname; wxTextCtrl *m_peektextCtrl; OPJChildFrame *m_childframe; /*void OnBeginDrag(wxTreeEvent& event); void OnBeginRDrag(wxTreeEvent& event); void OnEndDrag(wxTreeEvent& event);*/ /*void OnBeginLabelEdit(wxTreeEvent& event); void OnEndLabelEdit(wxTreeEvent& event);*/ /*void OnDeleteItem(wxTreeEvent& event);*/ /*void OnContextMenu(wxContextMenuEvent& event);*/ void OnItemMenu(wxTreeEvent& event); /*void OnGetInfo(wxTreeEvent& event); void OnSetInfo(wxTreeEvent& event);*/ /*void OnItemExpanded(wxTreeEvent& event);*/ void OnItemExpanding(wxTreeEvent& event); /*void OnItemCollapsed(wxTreeEvent& event); void OnItemCollapsing(wxTreeEvent& event);*/ void OnSelChanged(wxTreeEvent& event); /*void OnSelChanging(wxTreeEvent& event);*/ /*void OnTreeKeyDown(wxTreeEvent& event);*/ /*void OnItemActivated(wxTreeEvent& event);*/ /*void OnItemRClick(wxTreeEvent& event);*/ /*void OnRMouseDown(wxMouseEvent& event); void OnRMouseUp(wxMouseEvent& event); void OnRMouseDClick(wxMouseEvent& event);*/ /*void GetItemsRecursively(const wxTreeItemId& idParent, wxTreeItemIdValue cookie = 0);*/ void CreateImageList(int size = 16); void CreateButtonsImageList(int size = 11); /*void AddTestItemsToTree(size_t numChildren, size_t depth);*/ /*void DoSortChildren(const wxTreeItemId& item, bool reverse = false) { m_reverseSort = reverse; wxTreeCtrl::SortChildren(item); }*/ /*void DoEnsureVisible() { if (m_lastItem.IsOk()) EnsureVisible(m_lastItem); }*/ /*void DoToggleIcon(const wxTreeItemId& item);*/ /*void ShowMenu(wxTreeItemId id, const wxPoint& pt);*/ int ImageSize(void) const { return m_imageSize; } void SetLastItem(wxTreeItemId id) { m_lastItem = id; } protected: /*virtual int OnCompareItems(const wxTreeItemId& i1, const wxTreeItemId& i2);*/ // is this the test item which we use in several event handlers? /*bool IsTestItem(const wxTreeItemId& item) { // the test item is the first child folder return GetItemParent(item) == GetRootItem() && !GetPrevSibling(item); }*/ private: /*void AddItemsRecursively(const wxTreeItemId& idParent, size_t nChildren, size_t depth, size_t folder);*/ void LogEvent(const wxChar *name, const wxTreeEvent& event); int m_imageSize; // current size of images bool m_reverseSort; // flag for OnCompareItems wxTreeItemId m_lastItem, // for OnEnsureVisible() m_draggedItem; // item being dragged right now // NB: due to an ugly wxMSW hack you _must_ use DECLARE_DYNAMIC_CLASS() // if you want your overloaded OnCompareItems() to be called. // OTOH, if you don't want it you may omit the next line - this will // make default (alphabetical) sorting much faster under wxMSW. DECLARE_DYNAMIC_CLASS(OPJMarkerTree) DECLARE_EVENT_TABLE() }; // this hash map stores all the trees of currently opened images, with an integer key WX_DECLARE_HASH_MAP(int, OPJMarkerTree*, wxIntegerHash, wxIntegerEqual, OPJMarkerTreeHash); // this hash map stores all the children of currently opened images, with an integer key WX_DECLARE_HASH_MAP(int, OPJChildFrame*, wxIntegerHash, wxIntegerEqual, OPJChildFrameHash); // Define a new frame class OPJFrame: public wxMDIParentFrame { public: OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); ~OPJFrame(void); void OnSize(wxSizeEvent& WXUNUSED(event)); void OnAbout(wxCommandEvent& WXUNUSED(event)); void OnFileOpen(wxCommandEvent& WXUNUSED(event)); void OnFileSaveAs(wxCommandEvent& WXUNUSED(event)); void OnMemoryOpen(wxCommandEvent& WXUNUSED(event)); void OnQuit(wxCommandEvent& WXUNUSED(event)); void OnClose(wxCommandEvent& WXUNUSED(event)); void OnZoom(wxCommandEvent& WXUNUSED(event)); void OnFit(wxCommandEvent& event); void OnToggleBrowser(wxCommandEvent& WXUNUSED(event)); void OnTogglePeeker(wxCommandEvent& WXUNUSED(event)); void OnToggleToolbar(wxCommandEvent& WXUNUSED(event)); void OnReload(wxCommandEvent& event); void OnPrevFrame(wxCommandEvent& event); void OnHomeFrame(wxCommandEvent& event); void OnNextFrame(wxCommandEvent& event); void OnLessLayers(wxCommandEvent& event); void OnAllLayers(wxCommandEvent& event); void OnMoreLayers(wxCommandEvent& event); void OnLessRes(wxCommandEvent& event); void OnFullRes(wxCommandEvent& event); void OnMoreRes(wxCommandEvent& event); void OnPrevComp(wxCommandEvent& event); void OnAllComps(wxCommandEvent& event); void OnNextComp(wxCommandEvent& event); void OnSetsEnco(wxCommandEvent& event); void OnSetsDeco(wxCommandEvent& event); void OnSashDrag(wxSashEvent& event); void OpenFiles(wxArrayString paths, wxArrayString filenames); void SaveFile(wxArrayString paths, wxArrayString filenames); void OnNotebook(wxNotebookEvent& event); void Rescale(int scale, OPJChildFrame *child); void OnThreadLogmsg(wxCommandEvent& event); OPJMarkerTreeHash m_treehash; OPJChildFrameHash m_childhash; wxSashLayoutWindow* markerTreeWindow; wxSashLayoutWindow* loggingWindow; wxToolBar* tool_bar; void Resize(int number); wxNotebook *m_bookCtrl; wxNotebook *m_bookCtrlbottom; wxTextCtrl *m_textCtrlbrowse; private: void TogStyle(int id, long flag); void DoSort(bool reverse = false); wxPanel *m_panel; wxTextCtrl *m_textCtrl; void DoSetBold(bool bold = true); protected: wxSashLayoutWindow* m_topWindow; wxSashLayoutWindow* m_leftWindow2; DECLARE_EVENT_TABLE() }; class OPJChildFrame: public wxMDIChildFrame { public: OPJCanvas *m_canvas; OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); ~OPJChildFrame(void); void OnActivate(wxActivateEvent& event); /*void OnQuit(wxCommandEvent& WXUNUSED(event));*/ void OnClose(wxCloseEvent& event); void OnGotFocus(wxFocusEvent& event); void OnLostFocus(wxFocusEvent& event); OPJFrame *m_frame; wxFileName m_fname; int m_winnumber; unsigned long m_twidth, m_theight, m_tx, m_ty; DECLARE_EVENT_TABLE() }; // frame and main menu ids enum { OPJFRAME_FILEEXIT = wxID_EXIT, OPJFRAME_HELPABOUT = wxID_ABOUT, OPJFRAME_FILEOPEN, OPJFRAME_MEMORYOPEN, OPJFRAME_FILESAVEAS, OPJFRAME_FILETOGGLEB, OPJFRAME_FILETOGGLEP, OPJFRAME_FILETOGGLET, OPJFRAME_VIEWZOOM, OPJFRAME_VIEWFIT, OPJFRAME_VIEWRELOAD, OPJFRAME_VIEWPREVFRAME, OPJFRAME_VIEWHOMEFRAME, OPJFRAME_VIEWNEXTFRAME, OPJFRAME_VIEWLESSLAYERS, OPJFRAME_VIEWALLLAYERS, OPJFRAME_VIEWMORELAYERS, OPJFRAME_VIEWLESSRES, OPJFRAME_VIEWFULLRES, OPJFRAME_VIEWMORERES, OPJFRAME_VIEWPREVCOMP, OPJFRAME_VIEWALLCOMPS, OPJFRAME_VIEWNEXTCOMP, OPJFRAME_FILECLOSE, OPJFRAME_SETSENCO, OPJFRAME_SETSDECO, OPJFRAME_BROWSEWIN = 10000, OPJFRAME_LOGWIN, OPJFRAME_TOOLBAR, OPJFRAME_THREADLOGMSG, OPJCANVAS_THREADSIGNAL }; // menu and control ids enum { TreeTest_Quit = wxID_EXIT, TreeTest_About = wxID_ABOUT, TreeTest_TogButtons = wxID_HIGHEST, TreeTest_TogTwist, TreeTest_TogLines, TreeTest_TogEdit, TreeTest_TogHideRoot, TreeTest_TogRootLines, TreeTest_TogBorder, TreeTest_TogFullHighlight, TreeTest_SetFgColour, TreeTest_SetBgColour, TreeTest_ResetStyle, TreeTest_Highlight, TreeTest_Dump, TreeTest_DumpSelected, TreeTest_Count, TreeTest_CountRec, TreeTest_Sort, TreeTest_SortRev, TreeTest_SetBold, TreeTest_ClearBold, TreeTest_Rename, TreeTest_Delete, TreeTest_DeleteChildren, TreeTest_DeleteAll, TreeTest_Recreate, TreeTest_ToggleImages, TreeTest_ToggleButtons, TreeTest_SetImageSize, TreeTest_ToggleSel, TreeTest_CollapseAndReset, TreeTest_EnsureVisible, TreeTest_AddItem, TreeTest_InsertItem, TreeTest_IncIndent, TreeTest_DecIndent, TreeTest_IncSpacing, TreeTest_DecSpacing, TreeTest_ToggleIcon, TreeTest_Select, TreeTest_Unselect, TreeTest_SelectRoot, TreeTest_Ctrl = 1000, BOTTOM_NOTEBOOK_ID, LEFT_NOTEBOOK_ID }; class OPJEncoThread : public wxThread { public: OPJEncoThread(OPJCanvas *canvas); // thread execution starts here virtual void *Entry(); // called when the thread exits - whether it terminates normally or is // stopped with Delete() (but not when it is Kill()ed!) virtual void OnExit(); // write something to the text control void WriteText(const wxString& text); public: unsigned m_count; OPJCanvas *m_canvas; }; class OPJDecoThread : public wxThread { public: OPJDecoThread(OPJCanvas *canvas); // thread execution starts here virtual void *Entry(); // called when the thread exits - whether it terminates normally or is // stopped with Delete() (but not when it is Kill()ed!) virtual void OnExit(); // write something to the text control void WriteText(const wxString& text); public: unsigned m_count; OPJCanvas *m_canvas; }; class OPJParseThread : public wxThread { public: OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid = 0x00); // thread execution starts here virtual void *Entry(); // called when the thread exits - whether it terminates normally or is // stopped with Delete() (but not when it is Kill()ed!) virtual void OnExit(); // write something to the text control void WriteText(const wxString& text); void LoadFile(wxFileName fname); void ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid); void ParseJP2File(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid); unsigned m_count; OPJMarkerTree *m_tree; wxTreeItemId m_parentid; private: int jpeg2000parse(wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); int box_handler_function(int boxtype, wxFile *fileid, wxFileOffset filepoint, wxFileOffset filelimit, wxTreeItemId parentid, int level, char *scansign, unsigned long int *scanpoint); }; // Drag and drop files target class OPJDnDFile: public wxFileDropTarget { public: OPJDnDFile(OPJFrame *pOwner) { m_pOwner = pOwner; } virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); private: OPJFrame *m_pOwner; }; // Property sheet dialog: encoder class OPJEncoderDialog: public wxPropertySheetDialog { DECLARE_CLASS(OPJEncoderDialog) public: OPJEncoderDialog(wxWindow* parent, int dialogType); ~OPJEncoderDialog(); wxBookCtrlBase* m_settingsNotebook; wxPanel* CreateMainSettingsPage(wxWindow* parent); wxPanel* CreatePart1_1SettingsPage(wxWindow* parent); wxPanel* CreatePart1_2SettingsPage(wxWindow* parent); /* wxPanel* CreatePart3SettingsPage(wxWindow* parent);*/ void OnEnableComm(wxCommandEvent& event); void OnEnableIdx(wxCommandEvent& event); void OnEnablePoc(wxCommandEvent& event); void OnRadioQualityRate(wxCommandEvent& event); #ifdef USE_JPWL void OnEnableJPWL(wxCommandEvent& event); wxPanel* CreatePart11SettingsPage(wxWindow* parent); /*wxCheckBox *m_enablejpwlCheck;*/ wxChoice *m_hprotChoice[MYJPWL_MAX_NO_TILESPECS]; wxSpinCtrl *m_htileCtrl[MYJPWL_MAX_NO_TILESPECS]; wxChoice *m_pprotChoice[MYJPWL_MAX_NO_TILESPECS]; wxSpinCtrl *m_ptileCtrl[MYJPWL_MAX_NO_TILESPECS]; wxSpinCtrl *m_ppackCtrl[MYJPWL_MAX_NO_TILESPECS]; wxChoice *m_sensiChoice[MYJPWL_MAX_NO_TILESPECS]; wxSpinCtrl *m_stileCtrl[MYJPWL_MAX_NO_TILESPECS]; void OnHprotSelect(wxCommandEvent& event); void OnPprotSelect(wxCommandEvent& event); void OnSensiSelect(wxCommandEvent& event); #endif // USE_JPWL wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl; wxRadioButton *m_rateRadio, *m_qualityRadio; wxTextCtrl *m_indexCtrl, *m_qualityCtrl, *m_cbsizeCtrl, *m_prsizeCtrl, *m_pocCtrl; wxTextCtrl *m_tsizeCtrl, *m_toriginCtrl; wxRadioBox *progressionBox; wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_mctCheck, *m_irrevCheck; wxCheckBox *m_sopCheck, *m_ephCheck, *m_enablebypassCheck, *m_enableresetCheck, *m_enablerestartCheck, *m_enablevscCheck, *m_enableertermCheck, *m_enablesegmarkCheck; wxCheckBox *m_enablepocCheck, *m_enablejpwlCheck; wxSpinCtrl *m_resolutionsCtrl; protected: enum { OPJENCO_ENABLEJPWL = 100, OPJENCO_RATEFACTOR, OPJENCO_RATERADIO, OPJENCO_QUALITYFACTOR, OPJENCO_QUALITYRADIO, OPJENCO_RESNUMBER, OPJENCO_CODEBLOCKSIZE, OPJENCO_PRECINCTSIZE, OPJENCO_TILESIZE, OPJENCO_PROGRESSION, OPJENCO_SUBSAMPLING, OPJENCO_ENABLESOP, OPJENCO_ENABLEEPH, OPJENCO_ENABLEBYPASS, OPJENCO_ENABLERESET, OPJENCO_ENABLERESTART, OPJENCO_ENABLEVSC, OPJENCO_ENABLEERTERM, OPJENCO_ENABLESEGMARK, OPJENCO_ENABLEPOC, OPJENCO_ROICOMP, OPJENCO_ROISHIFT, OPJENCO_IMORIG, OPJENCO_TILORIG, OPJENCO_ENABLEMCT, OPJENCO_ENABLEIRREV, OPJENCO_ENABLEINDEX, OPJENCO_INDEXNAME, OPJENCO_POCSPEC, OPJENCO_ENABLECOMM, OPJENCO_COMMENTTEXT, OPJENCO_HPROT, OPJENCO_HTILE, OPJENCO_PPROT, OPJENCO_PTILE, OPJENCO_PPACK, OPJENCO_SENSI, OPJENCO_STILE }; DECLARE_EVENT_TABLE() }; // Property sheet dialog: decoder class OPJDecoderDialog: public wxPropertySheetDialog { DECLARE_CLASS(OPJDecoderDialog) public: OPJDecoderDialog(wxWindow* parent, int dialogType); ~OPJDecoderDialog(); wxBookCtrlBase* m_settingsNotebook; wxCheckBox *m_enabledecoCheck, *m_enableparseCheck; wxSpinCtrl *m_reduceCtrl, *m_layerCtrl, *m_numcompsCtrl; wxRadioBox* m_resizeBox; void OnEnableDeco(wxCommandEvent& event); wxPanel* CreateMainSettingsPage(wxWindow* parent); wxPanel* CreatePart1SettingsPage(wxWindow* parent); wxPanel* CreatePart3SettingsPage(wxWindow* parent); #ifdef USE_JPWL void OnEnableJPWL(wxCommandEvent& event); wxPanel* CreatePart11SettingsPage(wxWindow* parent); wxSpinCtrl *m_expcompsCtrl, *m_maxtilesCtrl; wxCheckBox *m_enablejpwlCheck; #endif // USE_JPWL wxSpinCtrl *m_framenumCtrl; protected: enum { OPJDECO_RESMETHOD = 100, OPJDECO_REDUCEFACTOR, OPJDECO_QUALITYLAYERS, OPJDECO_NUMCOMPS, OPJDECO_ENABLEDECO, OPJDECO_ENABLEPARSE, OPJDECO_ENABLEJPWL, OPJDECO_EXPCOMPS, OPJDECO_MAXTILES, OPJDECO_FRAMENUM }; DECLARE_EVENT_TABLE() }; #endif //__OPJ_VIEWER_H__ openjpeg-1.5.2/applications/OPJViewer/source/imagmxf.h0000644000175000017500000000652012315002075022577 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: imagmxf.h // Purpose: wxImage MXF (Material eXchange Format) JPEG 2000 file format handler // Author: G. Baruffa - based on imagjpeg.h, Vaclav Slavik // RCS-ID: $Id: imagmj2.h,v 0.0 2007/11/19 17:00:00 VZ Exp $ // Copyright: (c) Giuseppe Baruffa // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_IMAGMXF_H_ #define _WX_IMAGMXF_H_ #ifdef USE_MXF #include "wx/defs.h" #include "wx/filename.h" //----------------------------------------------------------------------------- // wxMXFHandler //----------------------------------------------------------------------------- #if wxUSE_LIBOPENJPEG #include "wx/image.h" #include "libopenjpeg/openjpeg.h" #define wxBITMAP_TYPE_MXF 51 class WXDLLEXPORT wxMXFHandler: public wxImageHandler { public: inline wxMXFHandler() { m_name = wxT("MXF JPEG 2000 file format"); m_extension = wxT("mxf"); m_type = wxBITMAP_TYPE_MXF; m_mime = wxT("image/mxf"); m_reducefactor = 0; m_qualitylayers = 0; m_components = 0; m_filename = wxT(""); #ifdef USE_JPWL m_enablejpwl = true; m_expcomps = JPWL_EXPECTED_COMPONENTS; m_maxtiles = JPWL_MAXIMUM_TILES; #endif // USE_JPWL } // decoding engine parameters int m_reducefactor, m_qualitylayers, m_components, m_framenum; wxFileName m_filename; #ifdef USE_JPWL bool m_enablejpwl; int m_expcomps, m_maxtiles; #endif // USE_JPWL #if wxUSE_STREAMS virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); protected: virtual bool DoCanRead( wxInputStream& stream ); #endif private: DECLARE_DYNAMIC_CLASS(wxMXFHandler) }; #endif // wxUSE_LIBOPENJPEG #endif // USE_MXF #endif // _WX_IMAGMXF_H_ openjpeg-1.5.2/applications/OPJViewer/source/icon3.xpm0000644000175000017500000000353012315002075022535 0ustar mathieumathieu/* XPM */ static const char *icon3_xpm[] = { /* columns rows colors chars-per-pixel */ "32 32 41 1", "6 c #EDF2FB", "- c #AAC1E8", ": c #B9CDED", "X c #295193", ", c #C6D6F0", "a c #4A7CCE", "u c #779DDB", "y c #7FA2DD", "$ c #3263B4", "5 c #EAF0FA", ". c #2D59A3", "o c #6E96D8", "* c #356AC1", "r c #F7F9FD", "> c #BED0EE", "3 c #E1E9F7", "7 c #F0F5FC", "< c #CBD9F1", "2 c #DAE5F6", "# c #3161B1", " c None", "0 c #FDFEFF", "= c #9FB9E5", "e c #AEC5EA", "t c #89A9DF", "q c #98B5E4", "p c #5584D1", "d c #3A70CA", "@ c #305FAC", "i c #5D89D3", "1 c #D2DFF4", "% c #3366B9", "9 c #FAFCFE", "8 c #F5F8FD", "s c #4075CC", "O c #638ED5", "w c #90AFE2", "& c #3467BC", "+ c #2F5DA9", "; c #B3C8EB", "4 c #E5EDF9", /* pixels */ " ", " ", " ", " ", " ", " ", " ......X ", " .oooooO+ ", " .ooooooo. ", " .+@@@##$%%&&&&&****. ", " .=-;:>,<12345678900. ", " .q=-;:>,<1234567890. ", " .wq=-e:>,<12345678r. ", " .twq=-e:>,<12345678. ", " .ytwq=-e:>,<1234567. ", " .uytwq=-e:>,<123456. ", " .ouytwq=-e:>,<12345. ", " .Oouytwq=-e;>,<1234. ", " .iOouytwq=-e;>,<123. ", " .piOouytwq=-e;>,<12. ", " .apiOouytwq=-e;>,<1. ", " .sapiOouytwq=-e;>,<. ", " .dsapiOouytwq=-e;>,. ", " ...................# ", " ", " ", " ", " ", " ", " ", " ", " " }; openjpeg-1.5.2/applications/OPJViewer/source/imagmxf.cpp0000644000175000017500000003277412315002075023144 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: imagmxf.cpp // Purpose: wxImage MXF (Material eXchange Format) JPEG 2000 file format handler // Author: Giuseppe Baruffa - based on imagjpeg.cpp, Vaclav Slavik // RCS-ID: $Id: imagmxf.cpp,v 0.00 2007/11/19 17:00:00 MW Exp $ // Copyright: (c) Giuseppe Baruffa // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef USE_MXF #include "mxflib/mxflib.h" using namespace mxflib; namespace { //! Structure holding information about the essence in each body stream struct EssenceInfo { UMIDPtr PackageID; PackagePtr Package; MDObjectPtr Descriptor; }; //! Map of EssenceInfo structures indexed by BodySID typedef std::map EssenceInfoMap; //! The map of essence info for this file EssenceInfoMap EssenceLookup; }; //! Build an EssenceInfoMap for the essence in a given file /*! \return True if al OK, else false */ bool BuildEssenceInfo(MXFFilePtr &File, EssenceInfoMap &EssenceLookup); // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #if wxUSE_IMAGE && wxUSE_LIBOPENJPEG #include "imagmxf.h" #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/app.h" #include "wx/intl.h" #include "wx/bitmap.h" #include "wx/module.h" #endif #include "libopenjpeg/openjpeg.h" #include "wx/filefn.h" #include "wx/wfstream.h" // ---------------------------------------------------------------------------- // types // ---------------------------------------------------------------------------- //----------------------------------------------------------------------------- // wxMXFHandler //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxMXFHandler,wxImageHandler) #if wxUSE_STREAMS #include #define MAX_MESSAGE_LEN 200 //------------- MXF Manager // Debug and error messages //! Display a warning message void mxflib::warning(const char *Fmt, ...) { char msg[MAX_MESSAGE_LEN]; va_list args; va_start(args, Fmt); _vsnprintf(msg, MAX_MESSAGE_LEN, Fmt, args); va_end(args); int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[WARNING_MXF] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } //! Display an error message void mxflib::error(const char *Fmt, ...) { char msg[MAX_MESSAGE_LEN]; va_list args; va_start(args, Fmt); _vsnprintf(msg, MAX_MESSAGE_LEN, Fmt, args); va_end(args); int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[ERROR_MXF] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } //! Display an error message void mxflib::debug(const char *Fmt, ...) { char msg[MAX_MESSAGE_LEN]; va_list args; va_start(args, Fmt); _vsnprintf(msg, MAX_MESSAGE_LEN, Fmt, args); va_end(args); int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[DEBUG_MXF] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } //------------- JPEG 2000 Data Source Manager #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 /* sample error callback expecting a FILE* client object */ void mxf_error_callback(const char *msg, void *client_data) { int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[ERROR] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } /* sample warning callback expecting a FILE* client object */ void mxf_warning_callback(const char *msg, void *client_data) { int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[WARNING] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } /* sample debug callback expecting no client object */ void mxf_info_callback(const char *msg, void *client_data) { int message_len = strlen(msg) - 1; if (msg[message_len] != '\n') message_len = MAX_MESSAGE_LEN; #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("[INFO] %.*s"), message_len, msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } ///////////////////////////////////////////////// ///////////////////////////////////////////////// // load the mxf file format bool wxMXFHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index) { opj_dparameters_t parameters; /* decompression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *opjimage = NULL; unsigned char *src = NULL; unsigned char *ptr; int file_length, j2k_point, j2k_len; opj_codestream_info_t cstr_info; /* Codestream information structure */ // simply display the version of the library wxLogMessage(wxT("Version of MXF: %s "), wxString::FromAscii(LibraryVersion().c_str())); //wxLogMessage(wxT("MXF file name: %s"), m_filename.GetFullPath()); // open MXF file MXFFilePtr TestFile = new MXFFile; if (! TestFile->Open(m_filename.GetFullPath().c_str(), true)) { wxLogError(wxT("Could not find %s"), m_filename.GetFullPath().c_str()); return false; } else wxLogMessage(wxT("Found %s"), m_filename.GetFullPath().c_str()); // Get the size TestFile->SeekEnd(); wxLogMessage(wxT("Size is %d bytes"), TestFile->Tell()); TestFile->Seek(0); // essence information //BuildEssenceInfo(TestFile, EssenceLookup); // close MXF file TestFile->Close(); return false; // destroy the image image->Destroy(); /* handle to a decompressor */ opj_dinfo_t* dinfo = NULL; opj_cio_t *cio = NULL; /* configure the event callbacks (not required) */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = mxf_error_callback; event_mgr.warning_handler = mxf_warning_callback; event_mgr.info_handler = mxf_info_callback; /* set decoding parameters to default values */ opj_set_default_decoder_parameters(¶meters); /* prepare parameters */ strncpy(parameters.infile, "", sizeof(parameters.infile)-1); strncpy(parameters.outfile, "", sizeof(parameters.outfile)-1); parameters.decod_format = J2K_CFMT; parameters.cod_format = BMP_DFMT; if (m_reducefactor) parameters.cp_reduce = m_reducefactor; if (m_qualitylayers) parameters.cp_layer = m_qualitylayers; /*if (n_components) parameters. = n_components;*/ /* JPWL only */ #ifdef USE_JPWL parameters.jpwl_exp_comps = m_expcomps; parameters.jpwl_max_tiles = m_maxtiles; parameters.jpwl_correct = m_enablejpwl; #endif /* USE_JPWL */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_J2K); /* find length of the stream */ stream.SeekI(0, wxFromEnd); file_length = (int) stream.TellI(); /* search for the m_framenum codestream position and length */ //jp2c_point = searchjp2c(stream, file_length, m_framenum); //jp2c_len = searchjp2c(stream, file_length, m_framenum); j2k_point = 0; j2k_len = 10; // malloc memory source src = (unsigned char *) malloc(j2k_len); // copy the jp2c stream.SeekI(j2k_point, wxFromStart); stream.Read(src, j2k_len); /* 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 */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, j2k_len); /* decode the stream and fill the image structure */ opjimage = opj_decode_with_info(dinfo, cio, &cstr_info); if (!opjimage) { wxMutexGuiEnter(); wxLogError(wxT("MXF: failed to decode image!")); wxMutexGuiLeave(); opj_destroy_decompress(dinfo); opj_cio_close(cio); free(src); return false; } /* close the byte stream */ opj_cio_close(cio); /* common rendering method */ #include "imagjpeg2000.cpp" wxMutexGuiEnter(); wxLogMessage(wxT("MXF: image loaded.")); wxMutexGuiLeave(); /* close openjpeg structs */ opj_destroy_decompress(dinfo); opj_image_destroy(opjimage); free(src); if (!image->Ok()) return false; else return true; } // save the mxf file format bool wxMXFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) { wxLogError(wxT("MXF: Couldn't save movie -> not implemented.")); return false; } #ifdef __VISUALC__ #pragma warning(default:4611) #endif /* VC++ */ // recognize the MXF JPEG 2000 starting box bool wxMXFHandler::DoCanRead( wxInputStream& stream ) { unsigned char hdr[4]; if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) return false; return (hdr[0] == 0x06 && hdr[1] == 0x0E && hdr[2] == 0x2B && hdr[3] == 0x34); } //! Build an EssenceInfoMap for the essence in a given file /*! \return True if al OK, else false */ bool BuildEssenceInfo(MXFFilePtr &File, EssenceInfoMap &EssenceLookup) { // Empty any old data EssenceLookup.clear(); // Get the master metadata set (or the header if we must) PartitionPtr MasterPartition = File->ReadMasterPartition(); if(!MasterPartition) { File->Seek(0); MasterPartition = File->ReadPartition(); warning("File %s does not contain a cloased copy of header metadata - using the open copy in the file header\n", File->Name.c_str()); } if(!MasterPartition) { error("Could not read header metadata from file %s\n", File->Name.c_str()); return false; } // Read and parse the metadata MasterPartition->ReadMetadata(); MetadataPtr HMeta = MasterPartition->ParseMetadata(); if(!HMeta) { error("Could not read header metadata from file %s\n", File->Name.c_str()); return false; } /* Scan the Essence container data sets to get PackageID to BodySID mapping */ MDObjectPtr ECDSet = HMeta[ContentStorage_UL]; if(ECDSet) ECDSet = ECDSet->GetLink(); if(ECDSet) ECDSet = ECDSet[EssenceContainerDataBatch_UL]; if(!ECDSet) { error("Header metadata in file %s does not contain an EssenceContainerData set\n", File->Name.c_str()); return false; } MDObject::iterator it = ECDSet->begin(); while(it != ECDSet->end()) { MDObjectPtr ThisECDSet = (*it).second->GetLink(); MDObjectPtr PackageID; if(ThisECDSet) PackageID = ThisECDSet->Child(LinkedPackageUID_UL); if(PackageID) { EssenceInfo NewEI; NewEI.PackageID = new UMID(PackageID->PutData()->Data); // Inset the basic essence info - but not if this is external essence (BodySID == 0) UInt32 BodySID = ThisECDSet->GetUInt(BodySID_UL); if(BodySID) EssenceLookup[BodySID] = NewEI; } it++; } /* Now find the other items for the essence lookup map */ if(EssenceLookup.size()) { PackageList::iterator it = HMeta->Packages.begin(); while(it != HMeta->Packages.end()) { // Only Source Packages are of interest if((*it)->IsA(SourcePackage_UL)) { MDObjectPtr Descriptor = (*it)->Child(Descriptor_UL); if(Descriptor) Descriptor = Descriptor->GetLink(); if(Descriptor) { MDObjectPtr PackageID = (*it)->Child(PackageUID_UL); if(PackageID) { UMIDPtr TheID = new UMID(PackageID->PutData()->Data); /* Now do a lookup in the essence lookup map (it will need to be done the long way here */ EssenceInfoMap::iterator EL_it = EssenceLookup.begin(); while(EL_it != EssenceLookup.end()) { if((*((*EL_it).second.PackageID)) == (*TheID)) { // If found, set the missing items and stop searching (*EL_it).second.Package = (*it); (*EL_it).second.Descriptor = Descriptor; break; } EL_it++; } } } } it++; } } return true; } #endif // wxUSE_STREAMS #endif // wxUSE_LIBOPENJPEG #endif // USE_MXF openjpeg-1.5.2/applications/OPJViewer/source/opj_logo.xpm0000644000175000017500000003474612315002075023347 0ustar mathieumathieu/* XPM */ static char *opj_logo[] = { /* columns rows colors chars-per-pixel */ "90 61 218 2", " c #BE3D12", ". c #BF461D", "X c #AD5435", "o c #B64925", "O c #B54E2B", "+ c #BC4620", "@ c #BB4B25", "# c #BC4E29", "$ c #B5502F", "% c #BD512C", "& c #B45334", "* c #B35638", "= c #B45B3D", "- c #BB5533", "; c #BE5937", ": c #BC5C3D", "> c #9C766A", ", c #AD5D42", "< c #B55F41", "1 c #BA5E40", "2 c #A7634D", "3 c #A76C57", "4 c #AA6750", "5 c #AC6B56", "6 c #AA6E5A", "7 c #A4705E", "8 c #B46045", "9 c #B1644B", "0 c #BD6244", "q c #B96448", "w c #BC694D", "e c #B36B53", "r c #B26E58", "t c #BB6C52", "y c #B2725D", "u c #BD7056", "i c #BB745C", "p c #A67566", "a c #A57B6D", "s c #AE7562", "d c #AB7867", "f c #AA7C6C", "g c #A07E73", "h c #AA7F71", "j c #B37661", "k c #B47863", "l c #B27D6B", "z c #BB7863", "x c #BA7E69", "c c #C73605", "v c #C63A0B", "b c #CB3300", "n c #CA3807", "m c #C93A0A", "M c #C43E11", "N c #C93E10", "B c #C44115", "V c #C3441A", "C c #C4481E", "Z c #CA4113", "A c #C94519", "S c #CB481C", "D c #C24A23", "F c #C24F28", "G c #CD4D23", "H c #C4522D", "J c #CB532B", "K c #C25632", "L c #C35936", "P c #C25C3B", "I c #C85630", "U c #CB5933", "Y c #CB5E3A", "T c #D05026", "R c #CC613D", "E c #C26343", "W c #C46748", "Q c #C1694C", "! c #CD6744", "~ c #CA6C4D", "^ c #C37155", "/ c #C4755B", "( c #CB7356", ") c #C8765B", "_ c #D06D4C", "` c #D07253", "' c #D47B5E", "] c #C37B63", "[ c #C27E68", "{ c #C97F68", "} c #A68175", "| c #A48479", " . c #AD8172", ".. c #AD8578", "X. c #AB897D", "o. c #B1806F", "O. c #BA816F", "+. c #B38373", "@. c #B58778", "#. c #B3897B", "$. c #BA8472", "%. c #BB8C7C", "&. c #C2816B", "*. c #CD846C", "=. c #C38470", "-. c #C38976", ";. c #C38D7B", ":. c #CC8973", ">. c #CF8F7A", ",. c #CB907D", "<. c #D1937F", "1. c #948E8C", "2. c #9D8C86", "3. c #9D8F89", "4. c #96908E", "5. c #9C918D", "6. c #949392", "7. c #9B9492", "8. c #9D9997", "9. c #9D9C9C", "0. c #A38B83", "q. c #AA8D83", "w. c #A4918B", "e. c #AC9087", "r. c #AB938C", "t. c #A49590", "y. c #A29996", "u. c #A19D9C", "i. c #AA9790", "p. c #AC9994", "a. c #AC9E99", "s. c #B18D81", "d. c #B59084", "f. c #B49389", "g. c #BA9184", "h. c #B89589", "j. c #BA988D", "k. c #B29B93", "l. c #BC9C92", "z. c #ACA19D", "x. c #B1A19D", "c. c #BCA39B", "v. c #A3A3A3", "b. c #ABA5A3", "n. c #AEA9A7", "m. c #ABABAA", "M. c #B3A5A1", "N. c #B3A9A6", "B. c #B3ADAA", "V. c #B9A6A0", "C. c #B9AAA5", "Z. c #BAADA9", "A. c #B4B0AF", "S. c #BAB0AD", "D. c #B4B3B3", "F. c #BAB5B3", "G. c #BDB8B6", "H. c #BBBBBB", "J. c #C39384", "K. c #C0978A", "L. c #C2998B", "P. c #CA9483", "I. c #CD9A8A", "U. c #C19D92", "Y. c #D69B89", "T. c #DB9680", "R. c #C2A095", "E. c #C4A69C", "W. c #CCA193", "Q. c #C8A599", "!. c #CBA99D", "~. c #C6AEA6", "^. c #CCACA2", "/. c #CBB2AB", "(. c #C3B8B5", "). c #C2BDBC", "_. c #C9B9B3", "`. c #D3ADA0", "'. c #D3B4A9", "]. c #DCB2A4", "[. c #DEB6A8", "{. c #D1BFB9", "}. c #D9BEB5", "|. c #C5C0BE", " X c #CDC0BC", ".X c #D2C1BB", "XX c #DDC3BB", "oX c #E0C5BC", "OX c #E0C8BF", "+X c #C2C2C2", "@X c #CBC4C2", "#X c #CDC8C6", "$X c #CCCBCB", "%X c #D2C6C2", "&X c #D1CECD", "*X c #DDC8C1", "=X c #DECFCA", "-X c #D9D1CE", ";X c #D3D3D3", ":X c #D9D5D4", ">X c #DED9D7", ",X c #DBDBDB", ".;X0XwXwXwXwXrXwXwXrXrXrXrXtXrXtXrXrXrXwXrXrXrXrXrXrXrXrXrXrXrXwXrXrXwXrXrXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXtXrXrXrX0X,X'.S b b P l.z.M.k.w n b b g.;X,X,X,X0X0X0X0X0XwXwXwXwXwXwXwXwXwX0X0X0XwX0X0XwXwXwXwX0X0X0X0X0X0XwXwXwXwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXrXrXrXwX0X:XT.m b A ] G.D.D.m.$.m b b $.$X&X.X}.XX>XOX}.oXXX c b @ 9.v.9.u., b b - 3.& b b 7 1.1.4.4.4.6.7.9.w.m b + t.v.m.p.D b b K.;X,X0XwXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXwX0X,X$X-.b b b i D.H.G.H.J.N b b = 9.9.5 c b B 7.9.v.y.b b m f 4.O b b 3 6.6.6.g 9 4 h u.h b b - b.m.m.s.b b N ~.;X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXwX0X,X;XE.G b b I z ] ] ] W n b H l 9.8.9 b b m e 6 r e b b # 0.y.< b b O 6 p 6 < # ; q.v.t b b 0 n.A.A.+.b b H _.;X,XwXwXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXwXwX,X;X#Xf.b b b b b b b b b - a.v.v.w.@ b b v b b b b b @ b.m.v.w.M b b b b b b v ..m.n.A b n g.H.H.H.4 b b [ &X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXwXwX0X:X$XZ.Q H v n b m B H E x n.m.m.q.B b v < . v N + E z m.m.m.b.e - M m v M - t k.D.m.; # - V.H.+XH.s # # K.:X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXrXwXwX,X,X$X+XG.Z.Z.B.C.S.F.H.H.H.D.D.j b b q v.b.a.n.B.H.H.+X+X+XH.H.D.Z.C.Z.Z.F.H.H.+X+XH.).H.$X&X&X;X$X#X#X:X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXrXrXwX0X,X;X#X+X+X+XH.H.+X+X+XH.H.H.D.e b n i n.m.D.H.H.+X#X$X$X+X+X+X+XH.H.H.H.+X+X+X$X&X&X&X$X;X;X;X:X;X:X,X,X0XwXwXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXtXrXrXwXwX,X,X;X;X$X$X$X;X;X&X;X$X#X+XF b v s.H.H.+X$X&X;X;X,X,X,X;X:X;X;X;X;X;X;X:X,X,X,X0X,X0X,X0X0X0X0X0X0X0XwXwXrXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXrXtXrXwXwX0X,X:X;X;X;X;X;X:X;X;X;X$X+XC b B k.+X+X$X$X;X,X,X0X0X0X0X0X;X,X,X,X,X,X,X,X,X0X0X0X0X0X0XwX0X0X0XwXwXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXtXtXrXrXrXrXwXwXwX0X0X0X0X0X0X0X,X,X:X^.^.!.$X$X;X,X,X0XwXwXwXwXwXwXwXwX0X0X0X0XwXwXwXwXwXwXrXrXwXrXrXrXrXrXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXtXtXtXrXrXrXrXwXwXwXwX0XwXwXwX0X0X,X:X;X$X&X&X;X,X,X0XwXwXwXrXrXrXrXrXwXwXwXwXwXwXwXrXrXrXwXrXrXrXrXrXrXrXrXrXrXtXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXrXrXrXrXrXrXrXrXrXwXwXwXwX0X,X0X0X0XwXwXrXrXrXrXrXrXrXrXrXrXrXrXrXrXwXrXrXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXtXtXtXrXrXtXtXtXtXrXrXtXrXrXtXrXtXrXtXtXtXtXtXtXtXtXtX", "tXtXtXtXtXtXtXtXrXtXtXrXtXrXrXrXrXrXrXwXwXwX0XwX0XwXwXwXrXrXrXtXtXrXrXrXrXrXrXrXrXwXrXwXrXwXwXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXtXtXrXrXrXrXrXrXrXrXrXrXtXtXtXtXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXwXrXrXrXrXrXrXtXrXtXrXrXrXrXrXwXwXwXwXwX0X0XwX0XwXwXwXwXwXwXwXrXwXwXwX0X0X0X0XwX0XwXwXrXrXrXwXrXwXwXwX0XwX0XwXwXwXrXrXrXrXtXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXrXrXrXrXtXtXrXrXtXrXrXeX7X7X9XwXwXwX5X3X3X3X2X2X2X5X0XwXwXwXwXwX8X3X3X2X2X2X2X2X3X6X6X7XwXwXwXwXwXwX7X1XXXOXOX1X8XwXwXrXrXrXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXtXtXrXrXrXwXT.T T :.,X,X-X` G G G G G G U _ J.-X,X,X,X[ G G G G G G G G G G _ >XwX0X,X&XI.R N b b b m ! `.5XwXrXrXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXtXtXrXtXrXrXrXwX0X' b b ] >X,X%XJ b b b b b b b b Q {.:X;X:Xq b b b b b b b b b b Y >X0X,X-X'.^ n b b b b b m *.1XwXwXrXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrX0X0X%XL b b L.@X+X-.b b M L L L D b b b M V.+X(.N b b D H H H H H U U W.;X&X^.H b b n W -.-.W n b b J &XwXrXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX0X XF b b U.+X+X[ b b D z z j P v b b N U.H.S.m b m E Q t ^ ) / ) ) /.$X$X;.m b n A %.H.H.J.N b b N .XwXwXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX,X:X!.m b L N.D.m.* b b y v.v.v.v.p.n b M f.m.w b b D u.v.m.m.D.G.H.H.+X).g.b b B j.F.D.D.D.D.l.; F I /.0XwXrXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwX,X:XU.n b E B.A.n.$ b b s v.9.v.v.r.n n M r.b.1 b b D u.v.m.m.D.D.H.H.).H.k b b # M.G.D.D.D.D.Z.t w u _.0XwXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwXwX,X;X$XJ b m h b.v.i.m b M a 5.5.2.p M b c < 8.2.+ b b M o o o o # % j G.H.g.m b A M.D.D.D.B.M.M.M.M.Z.(.:X0XwXrXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXrXwX,X,X&X(.n b M 0.v.v.s b b b b b n b b c b M u.v.g M b b b b b b b b b i G.D.0 b b 8 D.D.H.G.P n b b n b U :X,XwXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXwX0X,X;X$XV.n b M w.v.9.< b b b b b b b b c H r 9.v.a n b * < < w w Q Q g.D.B.: b b r D.D.D.m.C b b b b b ) ;X0XwXrXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrX6XP.=.K.;X#X+Xx n b D v.u.7.. b b M D . D & 2 q.b.b.v.v.< b b X 6.9.9.b.m.D.D.D.D.n.# b b f D.D.D.b.= 1 * N b n !.;X,XwXtXtXtXtXtX", "tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXrXwX c #97C4E7", "# c #4381AA", "d c #FFFFFF", "< c #71B2DE", "+ c #538BB1", "& c #D1E5F5", "q c #63B3DE", "6 c #F1F4F7", "* c #CAE1F3", "y c #7AC4E5", "= c #C3DDF1", "X c #74A1BD", "- c #BCD9EF", "5 c #619BC4", "3 c #E6EAF1", "2 c #4B8EBF", "o c #6B97B6", ". c #4B82A8", " c None", "w c #54A6D8", "1 c #71A8D1", ", c #85BBE2", "t c #EFF6FC", "7 c #DEEDF8", "@ c #4388B4", "a c #F7FBFD", "$ c #D7E0E9", "r c #FAFCFE", "4 c #DAEAF7", "e c #E9F3FA", "0 c #76BAE2", "% c #7FA6C0", "s c #FDFDFE", "O c #5896BE", "p c #B6D5EE", "8 c #87ABC3", ": c #A5CCEA", "9 c #E5F0F9", "; c #AFD1EC", "i c #F4F9FD", "u c #8FB0C3", /* pixels */ " ", " ", " ", " ", " ", " .XXXooOO++@#$ ", " %&*=-;:>>,<123 ", " %4&*=-;:>>,1>56 ", " %74&*=-;:>>1*>56 ", " 89700qqqqwq1e*>X ", " 8e974&*=-;:1re*>8 ", " 8te974&*=-;11111# ", " 8tty000qqqqqww>,+ ", " uitte974&*=-p:>>+ ", " uaitte974&*=-p:>O ", " uaayyyy000qqqqp:O ", " uraaitte974&*=-po ", " urraaitte974&*=-o ", " usryyyyyyy000q*=X ", " ussrraaitte974&*X ", " udssrraaitte974&X ", " uddyyyyyyyyyy074% ", " udddssrraaitte97% ", " uddddssrraaitte9% ", " udddddssrraaitte8 ", " uddddddssrraaitt8 ", " uuuuuuuuuuuuuu88u ", " ", " ", " ", " ", " " }; openjpeg-1.5.2/applications/OPJViewer/source/icon4.xpm0000644000175000017500000000247112315002075022541 0ustar mathieumathieu/* XPM */ static const char *icon4_xpm[] = { /* columns rows colors chars-per-pixel */ "32 32 5 1", ". c Black", "o c #8399B4", "X c #8DA0B9", " c None", "O c #800000", /* pixels */ " ", " ", " ", " ", " ", " ", " ....... ", " .XXXXXo. ", " .XXXXXXX. ", " .................... ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .OOOOOOOOOOOOOOOOOO. ", " .................... ", " ", " ", " ", " ", " ", " ", " ", " " }; openjpeg-1.5.2/applications/OPJViewer/source/imagjpeg2000.cpp0000644000175000017500000013344512315002075023576 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: imagjpeg2000.cpp // Purpose: wxImage JPEG 2000 family file format handler // Author: Giuseppe Baruffa - based on imagjpeg.cpp, Vaclav Slavik // RCS-ID: $Id: imagjpeg2000.cpp,v 0.00 2008/01/31 10:58:00 MW Exp $ // Copyright: (c) Giuseppe Baruffa // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #if wxUSE_IMAGE && wxUSE_LIBOPENJPEG #include "imagjpeg2000.h" #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/app.h" #include "wx/intl.h" #include "wx/bitmap.h" #include "wx/module.h" #endif #include "libopenjpeg/openjpeg.h" #include "wx/filefn.h" #include "wx/wfstream.h" // ---------------------------------------------------------------------------- // types // ---------------------------------------------------------------------------- //----------------------------------------------------------------------------- // wxJPEG2000Handler //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxJPEG2000Handler,wxImageHandler) #if wxUSE_STREAMS //------------- JPEG 2000 Data Source Manager #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 MAX_MESSAGE_LEN 200 /* check file type */ int jpeg2000familytype(unsigned char *hdr, int hdr_len) { // check length if (hdr_len < 24) return -1; // check format if (hdr[0] == 0x00 && hdr[1] == 0x00 && hdr[2] == 0x00 && hdr[3] == 0x0C && hdr[4] == 0x6A && hdr[5] == 0x50 && hdr[6] == 0x20 && hdr[7] == 0x20 && hdr[20] == 0x6A && hdr[21] == 0x70 && hdr[22] == 0x32) // JP2 file format return JP2_CFMT; else if (hdr[0] == 0x00 && hdr[1] == 0x00 && hdr[2] == 0x00 && hdr[3] == 0x0C && hdr[4] == 0x6A && hdr[5] == 0x50 && hdr[6] == 0x20 && hdr[7] == 0x20 && hdr[20] == 0x6D && hdr[21] == 0x6A && hdr[22] == 0x70 && hdr[23] == 0x32) // MJ2 file format return MJ2_CFMT; else if (hdr[0] == 0xFF && hdr[1] == 0x4F) // J2K file format return J2K_CFMT; else // unknown format return -1; } /* we have to use this to avoid GUI-noGUI threads crashing */ void printevent(const char *msg) { #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("%s"), msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ } /* sample error callback expecting a FILE* client object */ void jpeg2000_error_callback(const char *msg, void *client_data) { char mess[MAX_MESSAGE_LEN + 20]; int message_len = strlen(msg); if (message_len > MAX_MESSAGE_LEN) message_len = MAX_MESSAGE_LEN; if (msg[message_len - 1] == '\n') message_len--; sprintf(mess, "[ERROR] %.*s", message_len, msg); printevent(mess); } /* sample warning callback expecting a FILE* client object */ void jpeg2000_warning_callback(const char *msg, void *client_data) { char mess[MAX_MESSAGE_LEN + 20]; int message_len = strlen(msg); if (message_len > MAX_MESSAGE_LEN) message_len = MAX_MESSAGE_LEN; if (msg[message_len - 1] == '\n') message_len--; sprintf(mess, "[WARNING] %.*s", message_len, msg); printevent(mess); } /* sample debug callback expecting no client object */ void jpeg2000_info_callback(const char *msg, void *client_data) { char mess[MAX_MESSAGE_LEN + 20]; int message_len = strlen(msg); if (message_len > MAX_MESSAGE_LEN) message_len = MAX_MESSAGE_LEN; if (msg[message_len - 1] == '\n') message_len--; sprintf(mess, "[INFO] %.*s", message_len, msg); printevent(mess); } /* macro functions */ /* From little endian to big endian, 2 and 4 bytes */ #define BYTE_SWAP2(X) ((X & 0x00FF) << 8) | ((X & 0xFF00) >> 8) #define BYTE_SWAP4(X) ((X & 0x000000FF) << 24) | ((X & 0x0000FF00) << 8) | ((X & 0x00FF0000) >> 8) | ((X & 0xFF000000) >> 24) #ifdef __WXGTK__ #define BYTE_SWAP8(X) ((X & 0x00000000000000FFULL) << 56) | ((X & 0x000000000000FF00ULL) << 40) | \ ((X & 0x0000000000FF0000ULL) << 24) | ((X & 0x00000000FF000000ULL) << 8) | \ ((X & 0x000000FF00000000ULL) >> 8) | ((X & 0x0000FF0000000000ULL) >> 24) | \ ((X & 0x00FF000000000000ULL) >> 40) | ((X & 0xFF00000000000000ULL) >> 56) #else #define BYTE_SWAP8(X) ((X & 0x00000000000000FF) << 56) | ((X & 0x000000000000FF00) << 40) | \ ((X & 0x0000000000FF0000) << 24) | ((X & 0x00000000FF000000) << 8) | \ ((X & 0x000000FF00000000) >> 8) | ((X & 0x0000FF0000000000) >> 24) | \ ((X & 0x00FF000000000000) >> 40) | ((X & 0xFF00000000000000) >> 56) #endif /* From codestream to int values */ #define STREAM_TO_UINT32(C, P) (((unsigned long int) (C)[(P) + 0] << 24) + \ ((unsigned long int) (C)[(P) + 1] << 16) + \ ((unsigned long int) (C)[(P) + 2] << 8) + \ ((unsigned long int) (C)[(P) + 3] << 0)) #define STREAM_TO_UINT16(C, P) (((unsigned long int) (C)[(P) + 0] << 8) + \ ((unsigned long int) (C)[(P) + 1] << 0)) /* defines */ #define SHORT_DESCR_LEN 32 #define LONG_DESCR_LEN 256 /* enumeration for file formats */ #define JPEG2000FILENUM 4 typedef enum { JP2_FILE, J2K_FILE, MJ2_FILE, UNK_FILE } jpeg2000filetype; /* enumeration for the box types */ #define JPEG2000BOXNUM 23 typedef enum { FILE_BOX, JP_BOX, FTYP_BOX, JP2H_BOX, IHDR_BOX, COLR_BOX, JP2C_BOX, JP2I_BOX, XML_BOX, UUID_BOX, UINF_BOX, MOOV_BOX, MVHD_BOX, TRAK_BOX, TKHD_BOX, MDIA_BOX, MINF_BOX, STBL_BOX, STSD_BOX, MJP2_BOX, MDAT_BOX, ANY_BOX, UNK_BOX } jpeg2000boxtype; /* jpeg2000 family box signatures */ #define FILE_SIGN "" #define JP_SIGN "jP\040\040" #define FTYP_SIGN "ftyp" #define JP2H_SIGN "jp2h" #define IHDR_SIGN "ihdr" #define COLR_SIGN "colr" #define JP2C_SIGN "jp2c" #define JP2I_SIGN "jp2i" #define XML_SIGN "xml\040" #define UUID_SIGN "uuid" #define UINF_SIGN "uinf" #define MOOV_SIGN "moov" #define MVHD_SIGN "mvhd" #define TRAK_SIGN "trak" #define TKHD_SIGN "tkhd" #define MDIA_SIGN "mdia" #define MINF_SIGN "minf" #define VMHD_SIGN "vmhd" #define STBL_SIGN "stbl" #define STSD_SIGN "stsd" #define MJP2_SIGN "mjp2" #define MDAT_SIGN "mdat" #define ANY_SIGN "" #define UNK_SIGN "" /* the box structure itself */ struct jpeg2000boxdef { char value[5]; /* hexadecimal value/string*/ char name[SHORT_DESCR_LEN]; /* short description */ char descr[LONG_DESCR_LEN]; /* long description */ int sbox; /* is it a superbox? */ int req[JPEG2000FILENUM]; /* mandatory box */ jpeg2000boxtype ins; /* contained in box... */ }; /* the possible boxes */ struct jpeg2000boxdef jpeg2000box[] = { /* sign */ {FILE_SIGN, /* short */ "placeholder for nothing", /* long */ "Nothing to say", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP_SIGN, /* short */ "JPEG 2000 Signature box", /* long */ "This box uniquely identifies the file as being part of the JPEG 2000 family of files", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {FTYP_SIGN, /* short */ "File Type box", /* long */ "This box specifies file type, version and compatibility information, including specifying if this file " "is a conforming JP2 file or if it can be read by a conforming JP2 reader", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP2H_SIGN, /* short */ "JP2 Header box", /* long */ "This box contains a series of boxes that contain header-type information about the file", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {IHDR_SIGN, /* short */ "Image Header box", /* long */ "This box specifies the size of the image and other related fields", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ JP2H_BOX}, /* sign */ {COLR_SIGN, /* short */ "Colour Specification box", /* long */ "This box specifies the colourspace of the image", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ JP2H_BOX}, /* sign */ {JP2C_SIGN, /* short */ "Contiguous Codestream box", /* long */ "This box contains the codestream as defined by Annex A", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {JP2I_SIGN, /* short */ "Intellectual Property box", /* long */ "This box contains intellectual property information about the image", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {XML_SIGN, /* short */ "XML box", /* long */ "This box provides a tool by which vendors can add XML formatted information to a JP2 file", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UUID_SIGN, /* short */ "UUID box", /* long */ "This box provides a tool by which vendors can add additional information to a file " "without risking conflict with other vendors", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UINF_SIGN, /* short */ "UUID Info box", /* long */ "This box provides a tool by which a vendor may provide access to additional information associated with a UUID", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {MOOV_SIGN, /* short */ "Movie box", /* long */ "This box contains the media data. In video tracks, this box would contain JPEG2000 video frames", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {MVHD_SIGN, /* short */ "Movie Header box", /* long */ "This box defines overall information which is media-independent, and relevant to the entire presentation " "considered as a whole", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MOOV_BOX}, /* sign */ {TRAK_SIGN, /* short */ "Track box", /* long */ "This is a container box for a single track of a presentation. A presentation may consist of one or more tracks", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MOOV_BOX}, /* sign */ {TKHD_SIGN, /* short */ "Track Header box", /* long */ "This box specifies the characteristics of a single track. Exactly one Track Header Box is contained in a track", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ TRAK_BOX}, /* sign */ {MDIA_SIGN, /* short */ "Media box", /* long */ "The media declaration container contains all the objects which declare information about the media data " "within a track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ TRAK_BOX}, /* sign */ {MINF_SIGN, /* short */ "Media Information box", /* long */ "This box contains all the objects which declare characteristic information of the media in the track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MDIA_BOX}, /* sign */ {STBL_SIGN, /* short */ "Sample Table box", /* long */ "The sample table contains all the time and data indexing of the media samples in a track", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {STSD_SIGN, /* short */ "Sample Description box", /* long */ "The sample description table gives detailed information about the coding type used, and any initialization " "information needed for that coding", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {MJP2_SIGN, /* short */ "MJP2 Sample Description box", /* long */ "The MJP2 sample description table gives detailed information about the coding type used, and any initialization " "information needed for that coding", /* sbox */ 0, /* req */ {1, 1, 1}, /* ins */ MINF_BOX}, /* sign */ {MDAT_SIGN, /* short */ "Media Data box", /* long */ "The meta-data for a presentation is stored in the single Movie Box which occurs at the top-level of a file", /* sbox */ 1, /* req */ {1, 1, 1}, /* ins */ FILE_BOX}, /* sign */ {ANY_SIGN, /* short */ "Any box", /* long */ "All the existing boxes", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ FILE_BOX}, /* sign */ {UNK_SIGN, /* short */ "Unknown Type box", /* long */ "The signature is not recognised to be that of an existing box", /* sbox */ 0, /* req */ {0, 0, 0}, /* ins */ ANY_BOX} }; /* declaration */ int jpeg2000_box_handler_function(jpeg2000boxtype boxtype, wxInputStream& stream, unsigned long int filepoint, unsigned long int filelimit, int level, char *scansign, unsigned long int *scanpoint); #ifdef __WXMSW__ typedef unsigned __int64 int8byte; #endif // __WXMSW__ #ifdef __WXGTK__ typedef unsigned long long int8byte; #endif // __WXGTK__ /* internal mini-search for a box signature */ int jpeg2000_file_parse(wxInputStream& stream, unsigned long int filepoint, unsigned long int filelimit, int level, char *scansign, unsigned long int *scanpoint) { unsigned long int LBox = 0x00000000; char TBox[5] = "\0\0\0\0"; int8byte XLBox = 0x0000000000000000; unsigned long int box_length = 0; int last_box = 0, box_num = 0; int box_type = ANY_BOX; unsigned char fourbytes[4]; int box_number = 0; /* cycle all over the file */ box_num = 0; last_box = 0; while (!last_box) { /* do not exceed file limit */ if (filepoint >= filelimit) return (0); /* seek on file */ if (stream.SeekI(filepoint, wxFromStart) == wxInvalidOffset) return (-1); /* read the mandatory LBox, 4 bytes */ if (!stream.Read(fourbytes, 4)) { wxLogError(wxT("Problem reading LBox from the file (file ended?)")); return -1; }; LBox = STREAM_TO_UINT32(fourbytes, 0); /* read the mandatory TBox, 4 bytes */ if (!stream.Read(TBox, 4)) { wxLogError(wxT("Problem reading TBox from the file (file ended?)")); return -1; }; /* look if scansign is got */ if ((scansign != NULL) && (memcmp(TBox, scansign, 4) == 0)) { /* hack/exploit */ // stop as soon as you find the level-th codebox if (box_number == level) { memcpy(scansign, " ", 4); *scanpoint = filepoint; return (0); } else box_number++; }; /* determine the box type */ for (box_type = JP_BOX; box_type < UNK_BOX; box_type++) if (memcmp(TBox, jpeg2000box[box_type].value, 4) == 0) break; /* read the optional XLBox, 8 bytes */ if (LBox == 1) { if (!stream.Read(&XLBox, 8)) { wxLogError(wxT("Problem reading XLBox from the file (file ended?)")); return -1; }; box_length = (unsigned long int) BYTE_SWAP8(XLBox); } else if (LBox == 0x00000000) { /* last box in file */ last_box = 1; box_length = filelimit - filepoint; } else box_length = LBox; /* go deep in the box */ jpeg2000_box_handler_function((jpeg2000boxtype) box_type, stream, (LBox == 1) ? (filepoint + 16) : (filepoint + 8), filepoint + box_length, level, scansign, scanpoint); /* if it's a superbox go inside it */ if (jpeg2000box[box_type].sbox) jpeg2000_file_parse(stream, (LBox == 1) ? (filepoint + 16) : (filepoint + 8), filepoint + box_length, level, scansign, scanpoint); /* increment box number and filepoint*/ box_num++; filepoint += box_length; }; /* all good */ return (0); } // search first contiguos codestream box in an mj2 file unsigned long int searchjpeg2000c(wxInputStream& stream, unsigned long int fsize, int number) { char scansign[] = "jp2c"; unsigned long int scanpoint = 0L; wxLogMessage(wxT("Searching jp2c box... ")); /* do the parsing */ if (jpeg2000_file_parse(stream, 0, fsize, number, scansign, &scanpoint) < 0) wxLogMessage(wxT("Unrecoverable error during JPEG 2000 box parsing: stopping")); if (strcmp(scansign, " ")) wxLogMessage(wxT("Box not found")); else { wxLogMessage(wxString::Format(wxT("Box found at byte %d"), scanpoint)); }; return (scanpoint); } // search the jp2h box in the file unsigned long int searchjpeg2000headerbox(wxInputStream& stream, unsigned long int fsize) { char scansign[] = "jp2h"; unsigned long int scanpoint = 0L; wxLogMessage(wxT("Searching jp2h box... ")); /* do the parsing */ if (jpeg2000_file_parse(stream, 0, fsize, 0, scansign, &scanpoint) < 0) wxLogMessage(wxT("Unrecoverable error during JPEG 2000 box parsing: stopping")); if (strcmp(scansign, " ")) wxLogMessage(wxT("Box not found")); else wxLogMessage(wxString::Format(wxT("Box found at byte %d"), scanpoint)); return (scanpoint); } /* handling functions */ #define ITEM_PER_ROW 10 /* Box handler function */ int jpeg2000_box_handler_function(jpeg2000boxtype boxtype, wxInputStream& stream, unsigned long int filepoint, unsigned long int filelimit, int level, char *scansign, unsigned long int *scanpoint) { switch (boxtype) { /* Sample Description box */ case (STSD_BOX): jpeg2000_file_parse(stream, filepoint + 8, filelimit, level, scansign, scanpoint); break; /* MJP2 Sample Description box */ case (MJP2_BOX): jpeg2000_file_parse(stream, filepoint + 78, filelimit, level, scansign, scanpoint); break; /* not yet implemented */ default: break; }; return (0); } // the jP and ftyp parts of the header #define jpeg2000headSIZE 32 unsigned char jpeg2000head[jpeg2000headSIZE] = { 0x00, 0x00, 0x00, 0x0C, 'j', 'P', ' ', ' ', 0x0D, 0x0A, 0x87, 0x0A, 0x00, 0x00, 0x00, 0x14, 'f', 't', 'y', 'p', 'j', 'p', '2', ' ', 0x00, 0x00, 0x00, 0x00, 'j', 'p', '2', ' ' }; ///////////////////////////////////////////////// ///////////////////////////////////////////////// // load the jpeg2000 file format bool wxJPEG2000Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index) { opj_dparameters_t parameters; /* decompression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *opjimage = NULL; unsigned char *src = NULL; unsigned char *ptr; int file_length, jp2c_point, jp2h_point; unsigned long int jp2hboxlen, jp2cboxlen; opj_codestream_info_t cstr_info; /* Codestream information structure */ unsigned char hdr[24]; int jpfamform; // destroy the image image->Destroy(); /* read the beginning of the file to check the type */ if (!stream.Read(hdr, WXSIZEOF(hdr))) return false; if ((jpfamform = jpeg2000familytype(hdr, WXSIZEOF(hdr))) < 0) return false; stream.SeekI(0, wxFromStart); /* handle to a decompressor */ opj_dinfo_t* dinfo = NULL; opj_cio_t *cio = NULL; /* configure the event callbacks */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = jpeg2000_error_callback; event_mgr.warning_handler = jpeg2000_warning_callback; event_mgr.info_handler = jpeg2000_info_callback; /* set decoding parameters to default values */ opj_set_default_decoder_parameters(¶meters); /* prepare parameters */ strncpy(parameters.infile, "", sizeof(parameters.infile) - 1); strncpy(parameters.outfile, "", sizeof(parameters.outfile) - 1); parameters.decod_format = jpfamform; parameters.cod_format = BMP_DFMT; if (m_reducefactor) parameters.cp_reduce = m_reducefactor; if (m_qualitylayers) parameters.cp_layer = m_qualitylayers; /*if (n_components) parameters. = n_components;*/ /* JPWL only */ #ifdef USE_JPWL parameters.jpwl_exp_comps = m_expcomps; parameters.jpwl_max_tiles = m_maxtiles; parameters.jpwl_correct = m_enablejpwl; #endif /* USE_JPWL */ /* get a decoder handle */ if (jpfamform == JP2_CFMT || jpfamform == MJ2_CFMT) dinfo = opj_create_decompress(CODEC_JP2); else if (jpfamform == J2K_CFMT) dinfo = opj_create_decompress(CODEC_J2K); else return false; /* find length of the stream */ stream.SeekI(0, wxFromEnd); file_length = (int) stream.TellI(); /* it's a movie */ if (jpfamform == MJ2_CFMT) { /* search for the first codestream box and the movie header box */ jp2c_point = searchjpeg2000c(stream, file_length, m_framenum); jp2h_point = searchjpeg2000headerbox(stream, file_length); // read the jp2h box and store it stream.SeekI(jp2h_point, wxFromStart); stream.Read(&jp2hboxlen, sizeof(unsigned long int)); jp2hboxlen = BYTE_SWAP4(jp2hboxlen); // read the jp2c box and store it stream.SeekI(jp2c_point, wxFromStart); stream.Read(&jp2cboxlen, sizeof(unsigned long int)); jp2cboxlen = BYTE_SWAP4(jp2cboxlen); // malloc memory source src = (unsigned char *) malloc(jpeg2000headSIZE + jp2hboxlen + jp2cboxlen); // copy the jP and ftyp memcpy(src, jpeg2000head, jpeg2000headSIZE); // copy the jp2h stream.SeekI(jp2h_point, wxFromStart); stream.Read(&src[jpeg2000headSIZE], jp2hboxlen); // copy the jp2c stream.SeekI(jp2c_point, wxFromStart); stream.Read(&src[jpeg2000headSIZE + jp2hboxlen], jp2cboxlen); } else if (jpfamform == JP2_CFMT || jpfamform == J2K_CFMT) { /* It's a plain image */ /* get data */ stream.SeekI(0, wxFromStart); src = (unsigned char *) malloc(file_length); stream.Read(src, file_length); } else return false; /* 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 */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ if (jpfamform == MJ2_CFMT) cio = opj_cio_open((opj_common_ptr)dinfo, src, jpeg2000headSIZE + jp2hboxlen + jp2cboxlen); else if (jpfamform == JP2_CFMT || jpfamform == J2K_CFMT) cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); else { free(src); return false; } /* decode the stream and fill the image structure */ opjimage = opj_decode_with_info(dinfo, cio, &cstr_info); if (!opjimage) { wxMutexGuiEnter(); wxLogError(wxT("JPEG 2000 failed to decode image!")); wxMutexGuiLeave(); opj_destroy_decompress(dinfo); opj_cio_close(cio); free(src); return false; } /* close the byte stream */ opj_cio_close(cio); /* - At this point, we have the structure "opjimage" that is filled with decompressed data, as processed by the OpenJPEG decompression engine - We need to fill the class "image" with the proper pixel sample values */ { int shiftbpp; int c, tempcomps; // check components number if (m_components > opjimage->numcomps) m_components = opjimage->numcomps; // check image depth (only on the first one, for now) if (m_components) shiftbpp = opjimage->comps[m_components - 1].prec - 8; else shiftbpp = opjimage->comps[0].prec - 8; // prepare image size if (m_components) image->Create(opjimage->comps[m_components - 1].w, opjimage->comps[m_components - 1].h, true); else image->Create(opjimage->comps[0].w, opjimage->comps[0].h, true); // access image raw data image->SetMask(false); ptr = image->GetData(); // workaround for components different from 1 or 3 if ((opjimage->numcomps != 1) && (opjimage->numcomps != 3)) { #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("JPEG2000: weird number of components")); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ tempcomps = 1; } else tempcomps = opjimage->numcomps; // workaround for subsampled components for (c = 1; c < tempcomps; c++) { if ((opjimage->comps[c].w != opjimage->comps[c - 1].w) || (opjimage->comps[c].h != opjimage->comps[c - 1].h)) { tempcomps = 1; break; } } // workaround for different precision components for (c = 1; c < tempcomps; c++) { if (opjimage->comps[c].bpp != opjimage->comps[c - 1].bpp) { tempcomps = 1; break; } } // only one component selected if (m_components) tempcomps = 1; // RGB color picture if (tempcomps == 3) { int row, col; int *r = opjimage->comps[0].data; int *g = opjimage->comps[1].data; int *b = opjimage->comps[2].data; if (shiftbpp > 0) { for (row = 0; row < opjimage->comps[0].h; row++) { for (col = 0; col < opjimage->comps[0].w; col++) { *(ptr++) = (*(r++)) >> shiftbpp; *(ptr++) = (*(g++)) >> shiftbpp; *(ptr++) = (*(b++)) >> shiftbpp; } } } else if (shiftbpp < 0) { for (row = 0; row < opjimage->comps[0].h; row++) { for (col = 0; col < opjimage->comps[0].w; col++) { *(ptr++) = (*(r++)) << -shiftbpp; *(ptr++) = (*(g++)) << -shiftbpp; *(ptr++) = (*(b++)) << -shiftbpp; } } } else { for (row = 0; row < opjimage->comps[0].h; row++) { for (col = 0; col < opjimage->comps[0].w; col++) { *(ptr++) = *(r++); *(ptr++) = *(g++); *(ptr++) = *(b++); } } } } // B/W picture if (tempcomps == 1) { int row, col; int selcomp; if (m_components) selcomp = m_components - 1; else selcomp = 0; int *y = opjimage->comps[selcomp].data; if (shiftbpp > 0) { for (row = 0; row < opjimage->comps[selcomp].h; row++) { for (col = 0; col < opjimage->comps[selcomp].w; col++) { *(ptr++) = (*(y)) >> shiftbpp; *(ptr++) = (*(y)) >> shiftbpp; *(ptr++) = (*(y++)) >> shiftbpp; } } } else if (shiftbpp < 0) { for (row = 0; row < opjimage->comps[selcomp].h; row++) { for (col = 0; col < opjimage->comps[selcomp].w; col++) { *(ptr++) = (*(y)) << -shiftbpp; *(ptr++) = (*(y)) << -shiftbpp; *(ptr++) = (*(y++)) << -shiftbpp; } } } else { for (row = 0; row < opjimage->comps[selcomp].h; row++) { for (col = 0; col < opjimage->comps[selcomp].w; col++) { *(ptr++) = *(y); *(ptr++) = *(y); *(ptr++) = *(y++); } } } } } wxMutexGuiEnter(); wxLogMessage(wxT("JPEG 2000 image loaded.")); wxMutexGuiLeave(); /* close openjpeg structs */ opj_destroy_decompress(dinfo); opj_image_destroy(opjimage); free(src); if (!image->Ok()) return false; else return true; } #define CINEMA_24_CS 1302083 /* Codestream length for 24fps */ #define CINEMA_48_CS 651041 /* Codestream length for 48fps */ #define COMP_24_CS 1041666 /* Maximum size per color component for 2K & 4K @ 24fps */ #define COMP_48_CS 520833 /* Maximum size per color component for 2K @ 48fps */ // save the j2k codestream bool wxJPEG2000Handler::SaveFile( wxImage *wimage, wxOutputStream& stream, bool verbose ) { opj_cparameters_t parameters; /* compression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *oimage = NULL; opj_image_cmptparm_t *cmptparm; opj_cio_t *cio = NULL; opj_codestream_info_t cstr_info; int codestream_length; bool bSuccess; int i; char indexfilename[OPJ_PATH_LEN] = ""; /* index file name */ /* 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 = jpeg2000_error_callback; event_mgr.warning_handler = jpeg2000_warning_callback; event_mgr.info_handler = jpeg2000_info_callback; /* set encoding parameters to default values */ opj_set_default_encoder_parameters(¶meters); /* load parameters */ parameters.cp_cinema = OFF; /* subsampling */ if (sscanf(m_subsampling.ToAscii(), "%d,%d", &(parameters.subsampling_dx), &(parameters.subsampling_dy)) != 2) { wxLogError(wxT("Wrong sub-sampling encoder setting: dx,dy")); return false; } /* compression rates */ if ((m_rates != wxT("")) && (!m_enablequality)) { const char *s1 = m_rates.ToAscii(); wxLogMessage(wxT("rates %s"), s1); while (sscanf(s1, "%f", &(parameters.tcp_rates[parameters.tcp_numlayers])) == 1) { parameters.tcp_numlayers++; while (*s1 && *s1 != ',') { s1++; } if (!*s1) break; s1++; } wxLogMessage(wxT("%d layers"), parameters.tcp_numlayers); parameters.cp_disto_alloc = 1; } /* image quality, dB */ if ((m_quality != wxT("")) && (m_enablequality)) { const char *s2 = m_quality.ToAscii(); wxLogMessage(wxT("qualities %s"), s2); while (sscanf(s2, "%f", ¶meters.tcp_distoratio[parameters.tcp_numlayers]) == 1) { parameters.tcp_numlayers++; while (*s2 && *s2 != ',') { s2++; } if (!*s2) break; s2++; } wxLogMessage(wxT("%d layers"), parameters.tcp_numlayers); parameters.cp_fixed_quality = 1; } /* image origin */ if (sscanf(m_origin.ToAscii(), "%d,%d", ¶meters.image_offset_x0, ¶meters.image_offset_y0) != 2) { wxLogError(wxT("bad coordinate of the image origin: x0,y0")); return false; } /* Create comment for codestream */ if(m_enablecomm) { parameters.cp_comment = (char *) malloc(strlen(m_comment.ToAscii()) + 1); if(parameters.cp_comment) { strcpy(parameters.cp_comment, m_comment.ToAscii()); } } else { parameters.cp_comment = NULL; } /* indexing file */ if (m_enableidx) { strncpy(indexfilename, m_index.ToAscii(), OPJ_PATH_LEN); wxLogMessage(wxT("index file is %s"), indexfilename); } /* if no rate entered, lossless by default */ if (parameters.tcp_numlayers == 0) { parameters.tcp_rates[0] = 0; /* MOD antonin : losslessbug */ parameters.tcp_numlayers++; parameters.cp_disto_alloc = 1; } /* irreversible transform */ parameters.irreversible = (m_irreversible == true) ? 1 : 0; /* resolutions */ parameters.numresolution = m_resolutions; /* codeblocks size */ if (m_cbsize != wxT("")) { int cblockw_init = 0, cblockh_init = 0; sscanf(m_cbsize.ToAscii(), "%d,%d", &cblockw_init, &cblockh_init); if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) { wxLogError(wxT("!! Size of code_block error !! Restrictions:\n width*height<=4096\n 4<=width,height<= 1024")); return false; } parameters.cblockw_init = cblockw_init; parameters.cblockh_init = cblockh_init; } /* precincts size */ if (m_prsize != wxT("")) { char sep; int res_spec = 0; char *s = (char *) m_prsize.c_str(); do { sep = 0; sscanf(s, "[%d,%d]%c", ¶meters.prcw_init[res_spec], ¶meters.prch_init[res_spec], &sep); parameters.csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); parameters.res_spec = res_spec; } /* tiles */ if (m_tsize != wxT("")) { sscanf(m_tsize.ToAscii(), "%d,%d", ¶meters.cp_tdx, ¶meters.cp_tdy); parameters.tile_size_on = true; } /* tile origin */ if (sscanf(m_torigin.ToAscii(), "%d,%d", ¶meters.cp_tx0, ¶meters.cp_ty0) != 2) { wxLogError(wxT("tile offset setting error: X0,Y0")); return false; } /* use SOP */ if (m_enablesop) parameters.csty |= 0x02; /* use EPH */ if (m_enableeph) parameters.csty |= 0x04; /* multiple component transform */ if (m_multicomp) parameters.tcp_mct = 1; else parameters.tcp_mct = 0; /* mode switch */ parameters.mode = (m_enablebypass ? 1 : 0) + (m_enablereset ? 2 : 0) + (m_enablerestart ? 4 : 0) + (m_enablevsc ? 8 : 0) + (m_enableerterm ? 16 : 0) + (m_enablesegmark ? 32 : 0); /* progression order */ switch (m_progression) { /* LRCP */ case 0: parameters.prog_order = LRCP; break; /* RLCP */ case 1: parameters.prog_order = RLCP; break; /* RPCL */ case 2: parameters.prog_order = RPCL; break; /* PCRL */ case 3: parameters.prog_order = PCRL; break; /* CPRL */ case 4: parameters.prog_order = CPRL; break; /* DCI2K24 */ case 5: parameters.cp_cinema = CINEMA2K_24; parameters.cp_rsiz = CINEMA2K; break; /* DCI2K48 */ case 6: parameters.cp_cinema = CINEMA2K_48; parameters.cp_rsiz = CINEMA2K; break; /* DCI4K */ case 7: parameters.cp_cinema = CINEMA4K_24; parameters.cp_rsiz = CINEMA4K; break; default: break; } /* check cinema */ if (parameters.cp_cinema) { /* set up */ parameters.tile_size_on = false; parameters.cp_tdx=1; parameters.cp_tdy=1; /*Tile part*/ parameters.tp_flag = 'C'; parameters.tp_on = 1; /*Tile and Image shall be at (0,0)*/ parameters.cp_tx0 = 0; parameters.cp_ty0 = 0; parameters.image_offset_x0 = 0; parameters.image_offset_y0 = 0; /*Codeblock size= 32*32*/ parameters.cblockw_init = 32; parameters.cblockh_init = 32; parameters.csty |= 0x01; /*The progression order shall be CPRL*/ parameters.prog_order = CPRL; /* No ROI */ parameters.roi_compno = -1; parameters.subsampling_dx = 1; parameters.subsampling_dy = 1; /* 9-7 transform */ parameters.irreversible = 1; } /* convert wx image into opj image */ cmptparm = (opj_image_cmptparm_t*) malloc(3 * sizeof(opj_image_cmptparm_t)); /* initialize opj image components */ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); for(i = 0; i < 3; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = false; cmptparm[i].dx = parameters.subsampling_dx; cmptparm[i].dy = parameters.subsampling_dy; cmptparm[i].w = wimage->GetWidth(); cmptparm[i].h = wimage->GetHeight(); } /* create the image */ oimage = opj_image_create(3, &cmptparm[0], CLRSPC_SRGB); if(!oimage) { if (cmptparm) free(cmptparm); return false; } /* set image offset and reference grid */ oimage->x0 = parameters.image_offset_x0; oimage->y0 = parameters.image_offset_y0; oimage->x1 = parameters.image_offset_x0 + (wimage->GetWidth() - 1) * 1 + 1; oimage->y1 = parameters.image_offset_y0 + (wimage->GetHeight() - 1) * 1 + 1; /* load image data */ unsigned char *value = wimage->GetData(); int area = wimage->GetWidth() * wimage->GetHeight(); for (i = 0; i < area; i++) { oimage->comps[0].data[i] = *(value++); oimage->comps[1].data[i] = *(value++); oimage->comps[2].data[i] = *(value++); } /* check cinema again */ if (parameters.cp_cinema) { int i; float temp_rate; opj_poc_t *POC = NULL; switch (parameters.cp_cinema) { case CINEMA2K_24: case CINEMA2K_48: if (parameters.numresolution > 6) { parameters.numresolution = 6; } if (!((oimage->comps[0].w == 2048) | (oimage->comps[0].h == 1080))) { wxLogWarning(wxT("Image coordinates %d x %d is not 2K compliant. JPEG Digital Cinema Profile-3 " "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080"), oimage->comps[0].w, oimage->comps[0].h); parameters.cp_rsiz = STD_RSIZ; } break; case CINEMA4K_24: if (parameters.numresolution < 1) { parameters.numresolution = 1; } else if (parameters.numresolution > 7) { parameters.numresolution = 7; } if (!((oimage->comps[0].w == 4096) | (oimage->comps[0].h == 2160))) { wxLogWarning(wxT("Image coordinates %d x %d is not 4K compliant. JPEG Digital Cinema Profile-4" "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160"), oimage->comps[0].w, oimage->comps[0].h); parameters.cp_rsiz = STD_RSIZ; } parameters.POC[0].tile = 1; parameters.POC[0].resno0 = 0; parameters.POC[0].compno0 = 0; parameters.POC[0].layno1 = 1; parameters.POC[0].resno1 = parameters.numresolution - 1; parameters.POC[0].compno1 = 3; parameters.POC[0].prg1 = CPRL; parameters.POC[1].tile = 1; parameters.POC[1].resno0 = parameters.numresolution - 1; parameters.POC[1].compno0 = 0; parameters.POC[1].layno1 = 1; parameters.POC[1].resno1 = parameters.numresolution; parameters.POC[1].compno1 = 3; parameters.POC[1].prg1 = CPRL; parameters.numpocs = 2; break; } switch (parameters.cp_cinema) { case CINEMA2K_24: case CINEMA4K_24: for (i = 0 ; i < parameters.tcp_numlayers; i++) { temp_rate = 0; if (parameters.tcp_rates[i] == 0) { parameters.tcp_rates[0] = ((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (CINEMA_24_CS * 8 * oimage->comps[0].dx * oimage->comps[0].dy); }else{ temp_rate = ((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (parameters.tcp_rates[i] * 8 * oimage->comps[0].dx * oimage->comps[0].dy); if (temp_rate > CINEMA_24_CS ) { parameters.tcp_rates[i]= ((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (CINEMA_24_CS * 8 * oimage->comps[0].dx * oimage->comps[0].dy); } else { /* do nothing */ } } } parameters.max_comp_size = COMP_24_CS; break; case CINEMA2K_48: for (i = 0; i < parameters.tcp_numlayers; i++) { temp_rate = 0 ; if (parameters.tcp_rates[i] == 0) { parameters.tcp_rates[0] = ((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (CINEMA_48_CS * 8 * oimage->comps[0].dx * oimage->comps[0].dy); }else{ temp_rate =((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (parameters.tcp_rates[i] * 8 * oimage->comps[0].dx * oimage->comps[0].dy); if (temp_rate > CINEMA_48_CS ){ parameters.tcp_rates[0]= ((float) (oimage->numcomps * oimage->comps[0].w * oimage->comps[0].h * oimage->comps[0].prec)) / (CINEMA_48_CS * 8 * oimage->comps[0].dx * oimage->comps[0].dy); }else{ /* do nothing */ } } } parameters.max_comp_size = COMP_48_CS; break; } parameters.cp_disto_alloc = 1; } /* get a J2K compressor handle */ opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); /* setup the encoder parameters using the current image and user parameters */ opj_setup_encoder(cinfo, ¶meters, oimage); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the image */ bSuccess = opj_encode_with_info(cinfo, cio, oimage, &cstr_info); if (!bSuccess) { opj_cio_close(cio); opj_destroy_compress(cinfo); opj_image_destroy(oimage); if (cmptparm) free(cmptparm); if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogError(wxT("failed to encode image")); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ return false; } codestream_length = cio_tell(cio); wxLogMessage(wxT("Codestream: %d bytes"), codestream_length); /* write the buffer to stream */ stream.Write(cio->buffer, codestream_length); /* close and free the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { if (write_index_file(&cstr_info, indexfilename)) { wxLogError(wxT("Failed to output index file")); } } /* free remaining compression structures */ opj_destroy_compress(cinfo); /* free image data */ opj_image_destroy(oimage); if (cmptparm) free(cmptparm); if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); #ifndef __WXGTK__ wxMutexGuiEnter(); #endif /* __WXGTK__ */ wxLogMessage(wxT("J2K: Image encoded!")); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif /* __WXGTK__ */ return true; } #ifdef __VISUALC__ #pragma warning(default:4611) #endif /* VC++ */ // recognize the JPEG 2000 family starting box or the 0xFF4F JPEG 2000 SOC marker bool wxJPEG2000Handler::DoCanRead(wxInputStream& stream) { unsigned char hdr[24]; int jpfamform; if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) return false; jpfamform = jpeg2000familytype(hdr, WXSIZEOF(hdr)); return ((jpfamform == JP2_CFMT) || (jpfamform == MJ2_CFMT) || (jpfamform == J2K_CFMT)); } #endif // wxUSE_STREAMS #endif // wxUSE_LIBOPENJPEG openjpeg-1.5.2/applications/OPJViewer/source/OPJViewer16.xpm0000644000175000017500000000074212315002075023505 0ustar mathieumathieu/* XPM */ static char *OPJViewer16[] = { /* columns rows colors chars-per-pixel */ "16 16 4 1", " c black", ". c #800000", "X c red", "o c None", /* pixels */ "oooooooooooooooo", "ooo.XXXXoooooooo", "ooXXoo .Xooooooo", "o..oooo .ooooooo", "oX.oooo ooooooo", "oX.oooo .ooooooo", "oXXoooo .ooooooo", "o.XXoo .oooooooo", "oo.XXXXooooooooo", "ooooooooo.Xo .oo", "ooooooooo X. ooo", "oooooooooo...ooo", "oooooooooo XXooo", "oooooooooo .Xooo", "oooooooooooooooo", "oooooooooooooooo" }; openjpeg-1.5.2/applications/OPJViewer/source/readmebefore.txt0000644000175000017500000000246112315002075024157 0ustar mathieumathieuWhat is OpenJPEG ? ================== The OpenJPEG library is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of JPEG 2000, the new still-image compression standard from the Joint Photographic Experts Group (JPEG). In addition to the basic codec, various other features are under development, among them the JP2 and MJ2 (Motion JPEG 2000) file formats, an indexing tool useful for the JPIP protocol, JPWL-tools for error-resilience, a Java-viewer for j2k-images, ... Who can use the library ? ========================= Anybody. As the OpenJPEG library is released under the BSD license, anybody can use or modify the library, even for commercial applications. The only restriction is to retain the copyright in the sources or the binaries documentation. Who is developing the library ? =============================== The library is developed by the Communications and Remote Sensing Lab (TELE), in the Université Catholique de Louvain (UCL). The JPWL module is developped and maintained by the Digital Signal Processing Lab (DSPLab) of the University of Perugia, Italy (UNIPG). As our purpose is to make OpenJPEG really useful for those interested in the image compression field, any feedback/advices are obviously welcome ! We will do our best to handle them quickly. openjpeg-1.5.2/applications/OPJViewer/source/icon5.xpm0000644000175000017500000000353012315002075022537 0ustar mathieumathieu/* XPM */ static const char *icon5_xpm[] = { /* columns rows colors chars-per-pixel */ "32 32 41 1", "0 c #AAC1E8", "q c #B9CDED", "X c #295193", "e c #C6D6F0", "a c #4A7CCE", "& c #779DDB", "* c #7FA2DD", "2 c #EAF0FA", "@ c #2D59A3", "o c #6E96D8", "y c #356AC1", "d c #214279", "w c #BED0EE", "= c #85A7DF", "< c #E1E9F7", "3 c #F0F5FC", "s c #CBD9F1", ", c #DAE5F6", "7 c #3161B1", " c None", ". c #274D8B", "6 c #FDFEFF", "i c #E7EEF9", "9 c #9FB9E5", "- c #89A9DF", "8 c #98B5E4", "$ c #5584D1", "+ c #3569BF", "% c #305FAC", "O c #5D89D3", "> c #D2DFF4", "p c #3366B9", "5 c #FAFCFE", "4 c #F5F8FD", "t c #4075CC", "u c #638ED5", "r c #CEDCF2", "; c #90AFE2", "# c #2F5DA9", ": c #B3C8EB", "1 c #E5EDF9", /* pixels */ " ", " ", " ", " ", " ", " ", " ", " ......X ", " XoooooO. ", " Xoooooo+. ", " Xooooooo@XXXXXXXXXX# ", " Xoooooooooooooooooo# ", " Xoooooooooooooooooo# ", " Xoo$################### ", " Xoo%O&*=-;:>,<123445667 ", " XooX890:qwer>,<123445q# ", " Xoty;890:qwer>,<12344# ", " Xo%u-;890:qwer>,,,,<# ", " XX$Ouo&*-;890:qwer>s# ", " d%a$Ouo&*-;890:qwer# ", " d+ta$Ouo&*-;890:qwe# ", " d..................# ", " ", " ", " ", " ", " ", " ", " " }; openjpeg-1.5.2/applications/OPJViewer/source/OPJViewer.rc0000644000175000017500000000012312315002075023127 0ustar mathieumathieuOPJChild16 ICON OPJChild.ico OPJViewer16 ICON OPJViewer.ico #include "wx/msw/wx.rc"openjpeg-1.5.2/applications/OPJViewer/source/OPJViewer.cpp0000644000175000017500000015436212315002075023324 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: sashtest.cpp // Purpose: Layout/sash sample // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id: sashtest.cpp,v 1.18 2005/08/23 15:54:35 ABX Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: treetest.cpp // Purpose: wxTreeCtrl sample // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id: treetest.cpp,v 1.110 2006/11/04 11:26:51 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: dialogs.cpp // Purpose: Common dialogs demo // Author: Julian Smart // Modified by: ABX (2004) - adjustements for conditional building + new menu // Created: 04/01/98 // RCS-ID: $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: thread.cpp // Purpose: wxWidgets thread sample // Author: Guilhem Lavaux, Vadim Zeitlin // Modified by: // Created: 06/16/98 // RCS-ID: $Id: thread.cpp,v 1.26 2006/10/02 05:36:28 PC Exp $ // Copyright: (c) 1998-2002 wxWidgets team // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Name: samples/image/image.cpp // Purpose: sample showing operations with wxImage // Author: Robert Roebling // Modified by: // Created: 1998 // RCS-ID: $Id: image.cpp,v 1.120 2006/12/06 17:13:11 VZ Exp $ // Copyright: (c) 1998-2005 Robert Roebling // License: wxWindows licence /////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: samples/console/console.cpp // Purpose: A sample console (as opposed to GUI) program using wxWidgets // Author: Vadim Zeitlin // Modified by: // Created: 04.10.99 // RCS-ID: $Id: console.cpp,v 1.206 2006/11/12 19:55:19 VZ Exp $ // Copyright: (c) 1999 Vadim Zeitlin // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: samples/notebook/notebook.cpp // Purpose: a sample demonstrating notebook usage // Author: Julian Smart // Modified by: Dimitri Schoolwerth // Created: 26/10/98 // RCS-ID: $Id: notebook.cpp,v 1.49 2006/11/04 18:24:07 RR Exp $ // Copyright: (c) 1998-2002 wxWidgets team // License: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: dialogs.cpp // Purpose: Common dialogs demo // Author: Julian Smart // Modified by: ABX (2004) - adjustements for conditional building + new menu // Created: 04/01/98 // RCS-ID: $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $ // Copyright: (c) Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: dnd.cpp // Purpose: Drag and drop sample // Author: Vadim Zeitlin // Modified by: // Created: 04/01/98 // RCS-ID: $Id: dnd.cpp,v 1.107 2006/10/30 20:23:41 VZ Exp $ // Copyright: // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Name: test.cpp // Purpose: wxHtml testing example ///////////////////////////////////////////////////////////////////////////// #include "OPJViewer.h" IMPLEMENT_APP(OPJViewerApp) // For drawing lines in a canvas long xpos = -1; long ypos = -1; int winNumber = 1; // Initialise this in OnInit, not statically bool OPJViewerApp::OnInit(void) { int n; #if wxUSE_UNICODE wxChar **wxArgv = new wxChar *[argc + 1]; for (n = 0; n < argc; n++ ) { wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]); wxArgv[n] = wxStrdup(warg); } wxArgv[n] = NULL; #else // !wxUSE_UNICODE #define wxArgv argv #endif // wxUSE_UNICODE/!wxUSE_UNICODE #if wxUSE_CMDLINE_PARSER static const wxCmdLineEntryDesc cmdLineDesc[] = { { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, { wxCMD_LINE_PARAM, NULL, NULL, _T("input file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE }, { wxCMD_LINE_NONE } }; wxCmdLineParser parser(cmdLineDesc, argc, wxArgv); switch (parser.Parse()) { case -1: wxLogMessage(wxT("Help was given, terminating.")); break; case 0: ShowCmdLine(parser); break; default: wxLogMessage(wxT("Syntax error detected.")); break; } #endif // wxUSE_CMDLINE_PARSER //wxInitAllImageHandlers(); #if wxUSE_LIBJPEG wxImage::AddHandler( new wxJPEGHandler ); #endif #if wxUSE_LIBOPENJPEG wxImage::AddHandler( new wxJPEG2000Handler ); #endif #if USE_MXF wxImage::AddHandler( new wxMXFHandler ); #endif // USE_MXF #if OPJ_MANYFORMATS wxImage::AddHandler( new wxBMPHandler ); wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxGIFHandler ); wxImage::AddHandler( new wxPNMHandler ); wxImage::AddHandler( new wxTIFFHandler ); #endif // we use a XPM image in our HTML page wxImage::AddHandler(new wxXPMHandler); // memory file system wxFileSystem::AddHandler(new wxMemoryFSHandler); #ifdef OPJ_INICONFIG //load decoding engine parameters OPJconfig = new wxConfig(OPJ_APPLICATION, OPJ_APPLICATION_VENDOR); OPJconfig->Read(wxT("decode/enabledeco"), &m_enabledeco, (bool) true); OPJconfig->Read(wxT("decode/enableparse"), &m_enableparse, (bool) true); OPJconfig->Read(wxT("decode/resizemethod"), &m_resizemethod, (long) 0); OPJconfig->Read(wxT("decode/xxxreducefactor"), &m_reducefactor, (long) 0); OPJconfig->Read(wxT("decode/xxxqualitylayers"), &m_qualitylayers, (long) 0); OPJconfig->Read(wxT("decode/xxxcomponents"), &m_components, (long) 0); OPJconfig->Read(wxT("decode/xxxframenum"), &m_framenum, (long) 0); #ifdef USE_JPWL OPJconfig->Read(wxT("decode/enablejpwl"), &m_enablejpwl, (bool) true); OPJconfig->Read(wxT("decode/expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS); OPJconfig->Read(wxT("decode/maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES); #endif // USE_JPWL OPJconfig->Write(wxT("teststring"), wxT("This is a test value")); OPJconfig->Write(wxT("testbool"), (bool) true); OPJconfig->Write(wxT("testlong"), (long) 245); OPJconfig->Read(wxT("showtoolbar"), &m_showtoolbar, (bool) true); OPJconfig->Read(wxT("showbrowser"), &m_showbrowser, (bool) true); OPJconfig->Read(wxT("showpeeker"), &m_showpeeker, (bool) true); OPJconfig->Read(wxT("browserwidth"), &m_browserwidth, (long) OPJ_BROWSER_WIDTH); OPJconfig->Read(wxT("peekerheight"), &m_peekerheight, (long) OPJ_PEEKER_HEIGHT); OPJconfig->Read(wxT("framewidth"), &m_framewidth, (long) OPJ_FRAME_WIDTH); OPJconfig->Read(wxT("frameheight"), &m_frameheight, (long) OPJ_FRAME_HEIGHT); // load encoding engine parameters OPJconfig->Read(wxT("encode/subsampling"), &m_subsampling, (wxString) wxT("1,1")); OPJconfig->Read(wxT("encode/origin"), &m_origin, (wxString) wxT("0,0")); OPJconfig->Read(wxT("encode/rates"), &m_rates, (wxString) wxT("20,10,5")); OPJconfig->Read(wxT("encode/quality"), &m_quality, (wxString) wxT("30,35,40")); OPJconfig->Read(wxT("encode/enablequality"), &m_enablequality, (bool) false); OPJconfig->Read(wxT("encode/multicomp"), &m_multicomp, (bool) false); OPJconfig->Read(wxT("encode/irreversible"), &m_irreversible, (bool) false); OPJconfig->Read(wxT("encode/resolutions"), &m_resolutions, (int) 6); OPJconfig->Read(wxT("encode/progression"), &m_progression, (int) 0); OPJconfig->Read(wxT("encode/cbsize"), &m_cbsize, (wxString) wxT("32,32")); OPJconfig->Read(wxT("encode/prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]")); OPJconfig->Read(wxT("encode/tsize"), &m_tsize, (wxString) wxT("")); OPJconfig->Read(wxT("encode/torigin"), &m_torigin, (wxString) wxT("0,0")); OPJconfig->Read(wxT("encode/enablesop"), &m_enablesop, (bool) false); OPJconfig->Read(wxT("encode/enableeph"), &m_enableeph, (bool) false); OPJconfig->Read(wxT("encode/enablebypass"), &m_enablebypass, (bool) false); OPJconfig->Read(wxT("encode/enablereset"), &m_enablereset, (bool) false); OPJconfig->Read(wxT("encode/enablerestart"), &m_enablerestart, (bool) false); OPJconfig->Read(wxT("encode/enablevsc"), &m_enablevsc, (bool) false); OPJconfig->Read(wxT("encode/enableerterm"), &m_enableerterm, (bool) false); OPJconfig->Read(wxT("encode/enablesegmark"), &m_enablesegmark, (bool) false); OPJconfig->Read(wxT("encode/enablecomm"), &m_enablecomm, (bool) true); OPJconfig->Read(wxT("encode/enablepoc"), &m_enablepoc, (bool) false); OPJconfig->Read(wxT("encode/comment"), &m_comment, (wxString) wxT("")); OPJconfig->Read(wxT("encode/poc"), &m_poc, (wxString) wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL")); OPJconfig->Read(wxT("encode/enableidx"), &m_enableidx, (bool) false); OPJconfig->Read(wxT("encode/index"), &m_index, (wxString) wxT("index.txt")); #ifdef USE_JPWL OPJconfig->Read(wxT("encode/enablejpwl"), &m_enablejpwle, (bool) true); for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) { OPJconfig->Read(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), &m_hprotsel[n], 0); OPJconfig->Read(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), &m_htileval[n], 0); OPJconfig->Read(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), &m_pprotsel[n], 0); OPJconfig->Read(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), &m_ptileval[n], 0); OPJconfig->Read(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), &m_ppackval[n], 0); OPJconfig->Read(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), &m_sensisel[n], 0); OPJconfig->Read(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), &m_stileval[n], 0); } #endif // USE_JPWL #else // set decoding engine parameters m_enabledeco = true; m_enableparse = true; m_resizemethod = 0; m_reducefactor = 0; m_qualitylayers = 0; m_components = 0; m_framenum = 0; #ifdef USE_JPWL m_enablejpwl = true; m_expcomps = JPWL_EXPECTED_COMPONENTS; m_maxtiles = JPWL_MAXIMUM_TILES; #endif // USE_JPWL m_showtoolbar = true; m_showbrowser = true; m_showpeeker = true; m_browserwidth = OPJ_BROWSER_WIDTH; m_peekerheight = OPJ_PEEKER_HEIGHT; m_framewidth = OPJ_FRAME_WIDTH; m_frameheight = OPJ_FRAME_HEIGHT; // set encoding engine parameters m_subsampling = wxT("1,1"); m_origin = wxT("0,0"); m_rates = wxT("20,10,5"); m_quality = wxT("30,35,40"); m_enablequality = false; m_multicomp = false; m_irreversible = false; m_resolutions = 6; m_progression = 0; m_cbsize= wxT("32,32"); m_prsize= wxT("[128,128],[128,128]"); m_tsize = wxT(""); m_torigin = wxT("0,0"); m_enablesop = false; m_enableeph = false; m_enablebypass = false; m_enablereset = false; m_enablerestart = false; m_enablevsc = false; m_enableerterm = false; m_enablesegmark = false; m_enableidx = false; m_index = wxT("index.txt"); m_enablecomm = true; m_comment = wxT(""); m_enablepoc = false; m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"); #ifdef USE_JPWL m_enablejpwle = true; for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) { m_hprotsel[n] = 0; m_htileval[n] = 0; m_pprotsel[n] = 0; m_ptileval[n] = 0; m_sensisel[n] = 0; m_stileval[n] = 0; } #endif // USE_JPWL #endif // OPJ_INICONFIG if (m_comment == wxT("")) { #if defined __WXMSW__ m_comment = wxT("Created by OPJViewer Win32 - OpenJPEG version "); #elif defined __WXGTK__ m_comment = wxT("Created by OPJViewer Lin32 - OpenJPEG version "); #else m_comment = wxT("Created by OPJViewer - OpenJPEG version "); #endif #ifdef USE_JPWL m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version()); #else m_comment += wxString::Format(wxT("%s"), (char *) opj_version()); #endif } // Create the main frame window OPJFrame *frame = new OPJFrame(NULL, wxID_ANY, OPJ_APPLICATION_TITLEBAR, wxDefaultPosition, wxSize(wxGetApp().m_framewidth, wxGetApp().m_frameheight), wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE | wxHSCROLL | wxVSCROLL); // Give it an icon (this is ignored in MDI mode: uses resources) #ifdef __WXMSW__ frame->SetIcon(wxIcon(wxT("OPJViewer16"))); #endif frame->Show(true); SetTopWindow(frame); // if there are files on the command line, open them if (!(m_filelist.IsEmpty())) { //wxLogMessage(wxT("Habemus files!!!")); wxArrayString paths, filenames; for (unsigned int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) { paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath()); filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName()); } //wxLogMessage(paths[0]); frame->OpenFiles(paths, filenames); } return true; } int OPJViewerApp::OnExit() { int n; #ifdef OPJ_INICONFIG OPJconfig->Write(wxT("decode/enabledeco"), m_enabledeco); OPJconfig->Write(wxT("decode/enableparse"), m_enableparse); OPJconfig->Write(wxT("decode/resizemethod"), m_resizemethod); OPJconfig->Write(wxT("decode/reducefactor"), m_reducefactor); OPJconfig->Write(wxT("decode/qualitylayers"), m_qualitylayers); OPJconfig->Write(wxT("decode/components"), m_components); OPJconfig->Write(wxT("decode/framenum"), m_framenum); #ifdef USE_JPWL OPJconfig->Write(wxT("decode/enablejpwl"), m_enablejpwl); OPJconfig->Write(wxT("decode/expcomps"), m_expcomps); OPJconfig->Write(wxT("decode/maxtiles"), m_maxtiles); #endif // USE_JPWL OPJconfig->Write(wxT("showtoolbar"), m_showtoolbar); OPJconfig->Write(wxT("showbrowser"), m_showbrowser); OPJconfig->Write(wxT("showpeeker"), m_showpeeker); OPJconfig->Write(wxT("browserwidth"), m_browserwidth); OPJconfig->Write(wxT("peekerheight"), m_peekerheight); OPJconfig->Write(wxT("framewidth"), m_framewidth); OPJconfig->Write(wxT("frameheight"), m_frameheight); OPJconfig->Write(wxT("encode/subsampling"), m_subsampling); OPJconfig->Write(wxT("encode/origin"), m_origin); OPJconfig->Write(wxT("encode/rates"), m_rates); OPJconfig->Write(wxT("encode/quality"), m_quality); OPJconfig->Write(wxT("encode/enablequality"), m_enablequality); OPJconfig->Write(wxT("encode/multicomp"), m_multicomp); OPJconfig->Write(wxT("encode/irreversible"), m_irreversible); OPJconfig->Write(wxT("encode/resolutions"), m_resolutions); OPJconfig->Write(wxT("encode/progression"), m_progression); OPJconfig->Write(wxT("encode/cbsize"), m_cbsize); OPJconfig->Write(wxT("encode/prsize"), m_prsize); OPJconfig->Write(wxT("encode/tiles"), m_tsize); OPJconfig->Write(wxT("encode/torigin"), m_torigin); OPJconfig->Write(wxT("encode/enablesop"), m_enablesop); OPJconfig->Write(wxT("encode/enableeph"), m_enableeph); OPJconfig->Write(wxT("encode/enablebypass"), m_enablebypass); OPJconfig->Write(wxT("encode/enablereset"), m_enablereset); OPJconfig->Write(wxT("encode/enablerestart"), m_enablerestart); OPJconfig->Write(wxT("encode/enablevsc"), m_enablevsc); OPJconfig->Write(wxT("encode/enableerterm"), m_enableerterm); OPJconfig->Write(wxT("encode/enablesegmark"), m_enablesegmark); OPJconfig->Write(wxT("encode/enableidx"), m_enableidx); OPJconfig->Write(wxT("encode/index"), m_index); OPJconfig->Write(wxT("encode/enablecomm"), m_enablecomm); OPJconfig->Write(wxT("encode/comment"), m_comment); OPJconfig->Write(wxT("encode/enablepoc"), m_enablepoc); OPJconfig->Write(wxT("encode/poc"), m_poc); #ifdef USE_JPWL OPJconfig->Write(wxT("encode/enablejpwl"), m_enablejpwle); for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) { OPJconfig->Write(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), m_hprotsel[n]); OPJconfig->Write(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), m_htileval[n]); OPJconfig->Write(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), m_pprotsel[n]); OPJconfig->Write(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), m_ptileval[n]); OPJconfig->Write(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), m_ppackval[n]); OPJconfig->Write(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), m_sensisel[n]); OPJconfig->Write(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), m_stileval[n]); } #endif // USE_JPWL #endif // OPJ_INICONFIG return 1; } void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser) { wxString s = wxT("Command line parsed successfully:\nInput files: "); size_t count = parser.GetParamCount(); for (size_t param = 0; param < count; param++) { s << parser.GetParam(param) << ';'; m_filelist.Add(parser.GetParam(param)); } //wxLogMessage(s); } // OPJFrame events // Event class for sending text messages between worker and GUI threads BEGIN_EVENT_TABLE(OPJFrame, wxMDIParentFrame) EVT_MENU(OPJFRAME_HELPABOUT, OPJFrame::OnAbout) EVT_MENU(OPJFRAME_FILEOPEN, OPJFrame::OnFileOpen) EVT_MENU(OPJFRAME_FILESAVEAS, OPJFrame::OnFileSaveAs) EVT_MENU(OPJFRAME_MEMORYOPEN, OPJFrame::OnMemoryOpen) EVT_SIZE(OPJFrame::OnSize) EVT_MENU(OPJFRAME_FILEEXIT, OPJFrame::OnQuit) EVT_MENU(OPJFRAME_FILECLOSE, OPJFrame::OnClose) EVT_MENU(OPJFRAME_VIEWZOOM, OPJFrame::OnZoom) EVT_MENU(OPJFRAME_VIEWFIT, OPJFrame::OnFit) EVT_MENU(OPJFRAME_VIEWRELOAD, OPJFrame::OnReload) EVT_MENU(OPJFRAME_VIEWPREVFRAME, OPJFrame::OnPrevFrame) EVT_MENU(OPJFRAME_VIEWHOMEFRAME, OPJFrame::OnHomeFrame) EVT_MENU(OPJFRAME_VIEWNEXTFRAME, OPJFrame::OnNextFrame) EVT_MENU(OPJFRAME_VIEWLESSLAYERS, OPJFrame::OnLessLayers) EVT_MENU(OPJFRAME_VIEWALLLAYERS, OPJFrame::OnAllLayers) EVT_MENU(OPJFRAME_VIEWMORELAYERS, OPJFrame::OnMoreLayers) EVT_MENU(OPJFRAME_VIEWLESSRES, OPJFrame::OnLessRes) EVT_MENU(OPJFRAME_VIEWFULLRES, OPJFrame::OnFullRes) EVT_MENU(OPJFRAME_VIEWMORERES, OPJFrame::OnMoreRes) EVT_MENU(OPJFRAME_VIEWPREVCOMP, OPJFrame::OnPrevComp) EVT_MENU(OPJFRAME_VIEWALLCOMPS, OPJFrame::OnAllComps) EVT_MENU(OPJFRAME_VIEWNEXTCOMP, OPJFrame::OnNextComp) EVT_MENU(OPJFRAME_FILETOGGLEB, OPJFrame::OnToggleBrowser) EVT_MENU(OPJFRAME_FILETOGGLEP, OPJFrame::OnTogglePeeker) EVT_MENU(OPJFRAME_FILETOGGLET, OPJFrame::OnToggleToolbar) EVT_MENU(OPJFRAME_SETSENCO, OPJFrame::OnSetsEnco) EVT_MENU(OPJFRAME_SETSDECO, OPJFrame::OnSetsDeco) EVT_SASH_DRAGGED_RANGE(OPJFRAME_BROWSEWIN, OPJFRAME_LOGWIN, OPJFrame::OnSashDrag) EVT_NOTEBOOK_PAGE_CHANGED(LEFT_NOTEBOOK_ID, OPJFrame::OnNotebook) EVT_MENU(OPJFRAME_THREADLOGMSG, OPJFrame::OnThreadLogmsg) END_EVENT_TABLE() // this is the frame constructor OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long style) : wxMDIParentFrame(parent, id, title, pos, size, style) { // file menu and its items wxMenu *file_menu = new wxMenu; file_menu->Append(OPJFRAME_FILEOPEN, wxT("&Open\tCtrl+O")); file_menu->SetHelpString(OPJFRAME_FILEOPEN, wxT("Open one or more files")); file_menu->Append(OPJFRAME_MEMORYOPEN, wxT("&Memory\tCtrl+M")); file_menu->SetHelpString(OPJFRAME_MEMORYOPEN, wxT("Open a memory buffer")); file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C")); file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image")); file_menu->AppendSeparator(); file_menu->Append(OPJFRAME_FILESAVEAS, wxT("&Save as\tCtrl+S")); file_menu->SetHelpString(OPJFRAME_FILESAVEAS, wxT("Save the current image")); //file_menu->Enable(OPJFRAME_FILESAVEAS, false); file_menu->AppendSeparator(); file_menu->Append(OPJFRAME_FILETOGGLEB, wxT("Toggle &browser\tCtrl+B")); file_menu->SetHelpString(OPJFRAME_FILETOGGLEB, wxT("Toggle the left browsing pane")); file_menu->Append(OPJFRAME_FILETOGGLEP, wxT("Toggle &peeker\tCtrl+P")); file_menu->SetHelpString(OPJFRAME_FILETOGGLEP, wxT("Toggle the bottom peeking pane")); file_menu->Append(OPJFRAME_FILETOGGLET, wxT("Toggle &toolbar\tCtrl+T")); file_menu->SetHelpString(OPJFRAME_FILETOGGLET, wxT("Toggle the toolbar")); file_menu->AppendSeparator(); file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q")); file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program")); // view menu and its items wxMenu *view_menu = new wxMenu; view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z")); view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image")); view_menu->Append(OPJFRAME_VIEWFIT, wxT("Zoom to &fit\tCtrl+F")); view_menu->SetHelpString(OPJFRAME_VIEWFIT, wxT("Fit the image in canvas")); view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R")); view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image")); view_menu->AppendSeparator(); view_menu->Append(OPJFRAME_VIEWPREVFRAME, wxT("&Prev frame\tLeft")); view_menu->SetHelpString(OPJFRAME_VIEWPREVFRAME, wxT("View previous frame")); view_menu->Append(OPJFRAME_VIEWHOMEFRAME, wxT("&Start frame\tHome")); view_menu->SetHelpString(OPJFRAME_VIEWHOMEFRAME, wxT("View starting frame")); view_menu->Append(OPJFRAME_VIEWNEXTFRAME, wxT("&Next frame\tRight")); view_menu->SetHelpString(OPJFRAME_VIEWNEXTFRAME, wxT("View next frame")); view_menu->AppendSeparator(); view_menu->Append(OPJFRAME_VIEWLESSLAYERS, wxT("&Less layers\t-")); view_menu->SetHelpString(OPJFRAME_VIEWLESSLAYERS, wxT("Remove a layer")); view_menu->Append(OPJFRAME_VIEWALLLAYERS, wxT("&All layers\t0")); view_menu->SetHelpString(OPJFRAME_VIEWALLLAYERS, wxT("Show all layers")); view_menu->Append(OPJFRAME_VIEWMORELAYERS, wxT("&More layers\t+")); view_menu->SetHelpString(OPJFRAME_VIEWMORELAYERS, wxT("Add a layer")); view_menu->AppendSeparator(); view_menu->Append(OPJFRAME_VIEWLESSRES, wxT("&Less resolution\t<")); view_menu->SetHelpString(OPJFRAME_VIEWLESSRES, wxT("Reduce the resolution")); view_menu->Append(OPJFRAME_VIEWFULLRES, wxT("&Full resolution\tf")); view_menu->SetHelpString(OPJFRAME_VIEWFULLRES, wxT("Full resolution")); view_menu->Append(OPJFRAME_VIEWMORERES, wxT("&More resolution\t>")); view_menu->SetHelpString(OPJFRAME_VIEWMORERES, wxT("Increase the resolution")); view_menu->AppendSeparator(); view_menu->Append(OPJFRAME_VIEWPREVCOMP, wxT("&Prev component\tDown")); view_menu->SetHelpString(OPJFRAME_VIEWPREVCOMP, wxT("View previous component")); view_menu->Append(OPJFRAME_VIEWALLCOMPS, wxT("&All components\ta")); view_menu->SetHelpString(OPJFRAME_VIEWALLCOMPS, wxT("View all components")); view_menu->Append(OPJFRAME_VIEWNEXTCOMP, wxT("&Next component\tUp")); view_menu->SetHelpString(OPJFRAME_VIEWNEXTCOMP, wxT("View next component")); // settings menu and its items wxMenu *sets_menu = new wxMenu; sets_menu->Append(OPJFRAME_SETSENCO, wxT("&Encoder\tCtrl+E")); sets_menu->SetHelpString(OPJFRAME_SETSENCO, wxT("Encoder settings")); sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D")); sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings")); // help menu and its items wxMenu *help_menu = new wxMenu; help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1")); help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program")); // the whole menubar wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, wxT("&File")); menu_bar->Append(view_menu, wxT("&View")); menu_bar->Append(sets_menu, wxT("&Settings")); menu_bar->Append(help_menu, wxT("&Help")); // Associate the menu bar with the frame SetMenuBar(menu_bar); // the status bar CreateStatusBar(); // the toolbar tool_bar = new wxToolBar(this, OPJFRAME_TOOLBAR, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL | wxNO_BORDER); wxBitmap bmpOpen = wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpSaveAs = wxArtProvider::GetBitmap(wxART_FILE_SAVE_AS, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpZoom = wxArtProvider::GetBitmap(wxART_FIND, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpFit = wxArtProvider::GetBitmap(wxART_FIND_AND_REPLACE, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpReload = wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpDecosettings = wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpEncosettings = wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpPrevframe = wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpHomeframe = wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpNextframe = wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpLesslayers = bmpPrevframe; wxBitmap bmpAlllayers = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpMorelayers = bmpNextframe; wxBitmap bmpLessres = bmpPrevframe; wxBitmap bmpFullres = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpMoreres = bmpNextframe; wxBitmap bmpPrevcomp = bmpPrevframe; wxBitmap bmpAllcomps = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR, wxDefaultSize); wxBitmap bmpNextcomp = bmpNextframe; tool_bar->AddTool(OPJFRAME_FILEOPEN, bmpOpen, wxT("Open")); tool_bar->AddTool(OPJFRAME_FILESAVEAS, bmpSaveAs, wxT("Save as ")); //tool_bar->EnableTool(OPJFRAME_FILESAVEAS, false); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_VIEWZOOM, bmpZoom, wxT("Zoom")); tool_bar->AddTool(OPJFRAME_VIEWFIT, bmpFit, wxT("Zoom to fit")); tool_bar->AddTool(OPJFRAME_VIEWRELOAD, bmpReload, wxT("Reload")); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_SETSDECO, bmpDecosettings, wxT("Decoder settings")); tool_bar->AddTool(OPJFRAME_SETSENCO, bmpEncosettings, wxT("Encoder settings")); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_VIEWPREVFRAME, bmpPrevframe, wxT("Previous frame")); tool_bar->AddTool(OPJFRAME_VIEWHOMEFRAME, bmpHomeframe, wxT("Starting frame")); tool_bar->AddTool(OPJFRAME_VIEWNEXTFRAME, bmpNextframe, wxT("Next frame")); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_VIEWLESSLAYERS, bmpLesslayers, wxT("Remove a layer")); tool_bar->AddTool(OPJFRAME_VIEWALLLAYERS, bmpAlllayers, wxT("Show all layers")); tool_bar->AddTool(OPJFRAME_VIEWMORELAYERS, bmpMorelayers, wxT("Add a layer")); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_VIEWLESSRES, bmpLessres, wxT("Reduce the resolution")); tool_bar->AddTool(OPJFRAME_VIEWFULLRES, bmpFullres, wxT("Full resolution")); tool_bar->AddTool(OPJFRAME_VIEWMORERES, bmpMoreres, wxT("Increase the resolution")); tool_bar->AddSeparator(); tool_bar->AddTool(OPJFRAME_VIEWPREVCOMP, bmpPrevcomp, wxT("Previous component")); tool_bar->AddTool(OPJFRAME_VIEWALLCOMPS, bmpAllcomps, wxT("All components")); tool_bar->AddTool(OPJFRAME_VIEWNEXTCOMP, bmpNextcomp, wxT("Next component")); tool_bar->Realize(); // associate the toolbar with the frame SetToolBar(tool_bar); // show the toolbar? if (!wxGetApp().m_showtoolbar) tool_bar->Show(false); else tool_bar->Show(true); // the logging window loggingWindow = new wxSashLayoutWindow(this, OPJFRAME_LOGWIN, wxDefaultPosition, wxSize(400, wxGetApp().m_peekerheight), wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN ); loggingWindow->SetDefaultSize(wxSize(1000, wxGetApp().m_peekerheight)); loggingWindow->SetOrientation(wxLAYOUT_HORIZONTAL); loggingWindow->SetAlignment(wxLAYOUT_BOTTOM); //loggingWindow->SetBackgroundColour(wxColour(0, 0, 255)); loggingWindow->SetSashVisible(wxSASH_TOP, true); // show the logging? if (!wxGetApp().m_showpeeker) loggingWindow->Show(false); else loggingWindow->Show(true); // create the bottom notebook m_bookCtrlbottom = new wxNotebook(loggingWindow, BOTTOM_NOTEBOOK_ID, wxDefaultPosition, wxDefaultSize, wxBK_LEFT); // create the text control of the logger m_textCtrl = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY ); m_textCtrl->SetValue(_T("Logging window\n")); // add it to the notebook m_bookCtrlbottom->AddPage(m_textCtrl, wxT("Log")); // create the text control of the browser m_textCtrlbrowse = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH ); wxFont *browsefont = new wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); m_textCtrlbrowse->SetDefaultStyle(wxTextAttr(wxNullColour, wxNullColour, *browsefont)); m_textCtrlbrowse->AppendText(wxT("Browsing window\n")); // add it the notebook m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false); // the browser window markerTreeWindow = new wxSashLayoutWindow(this, OPJFRAME_BROWSEWIN, wxDefaultPosition, wxSize(wxGetApp().m_browserwidth, 30), wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN ); markerTreeWindow->SetDefaultSize(wxSize(wxGetApp().m_browserwidth, 1000)); markerTreeWindow->SetOrientation(wxLAYOUT_VERTICAL); markerTreeWindow->SetAlignment(wxLAYOUT_LEFT); //markerTreeWindow->SetBackgroundColour(wxColour(0, 255, 0)); markerTreeWindow->SetSashVisible(wxSASH_RIGHT, true); markerTreeWindow->SetExtraBorderSize(0); // create the browser notebook m_bookCtrl = new wxNotebook(markerTreeWindow, LEFT_NOTEBOOK_ID, wxDefaultPosition, wxDefaultSize, wxBK_TOP); // show the browser? if (!wxGetApp().m_showbrowser) markerTreeWindow->Show(false); else markerTreeWindow->Show(true); #ifdef __WXMOTIF__ // For some reason, we get a memcpy crash in wxLogStream::DoLogStream // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc? delete wxLog::SetActiveTarget(new wxLogStderr); #else // set our text control as the log target wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl); delete wxLog::SetActiveTarget(logWindow); #endif // associate drop targets with the controls SetDropTarget(new OPJDnDFile(this)); } // this is the frame destructor OPJFrame::~OPJFrame(void) { // save size settings GetSize(&(wxGetApp().m_framewidth), &(wxGetApp().m_frameheight)); // delete all possible things delete m_bookCtrl; m_bookCtrl = NULL; delete markerTreeWindow; markerTreeWindow = NULL; delete m_textCtrl; m_textCtrl = NULL; delete m_bookCtrlbottom; m_bookCtrlbottom = NULL; delete loggingWindow; loggingWindow = NULL; } void OPJFrame::OnNotebook(wxNotebookEvent& event) { int sel = event.GetSelection(); long childnum; m_bookCtrl->GetPageText(sel).ToLong(&childnum); if (m_childhash[childnum]) m_childhash[childnum]->Activate(); //wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber); } void OPJFrame::Resize(int number) { wxSize size = GetClientSize(); } void OPJFrame::OnSetsEnco(wxCommandEvent& event) { int n; OPJEncoderDialog dialog(this, event.GetId()); if (dialog.ShowModal() == wxID_OK) { // load settings wxGetApp().m_subsampling = dialog.m_subsamplingCtrl->GetValue(); wxGetApp().m_origin = dialog.m_originCtrl->GetValue(); wxGetApp().m_rates = dialog.m_rateCtrl->GetValue(); wxGetApp().m_quality = dialog.m_qualityCtrl->GetValue(); wxGetApp().m_enablequality = dialog.m_qualityRadio->GetValue(); wxGetApp().m_multicomp = dialog.m_mctCheck->GetValue(); wxGetApp().m_irreversible = dialog.m_irrevCheck->GetValue(); wxGetApp().m_resolutions = dialog.m_resolutionsCtrl->GetValue(); wxGetApp().m_cbsize = dialog.m_cbsizeCtrl->GetValue(); wxGetApp().m_prsize = dialog.m_prsizeCtrl->GetValue(); wxGetApp().m_tsize = dialog.m_tsizeCtrl->GetValue(); wxGetApp().m_torigin = dialog.m_toriginCtrl->GetValue(); wxGetApp().m_progression = dialog.progressionBox->GetSelection(); wxGetApp().m_enablesop = dialog.m_sopCheck->GetValue(); wxGetApp().m_enableeph = dialog.m_ephCheck->GetValue(); wxGetApp().m_enablebypass = dialog.m_enablebypassCheck->GetValue(); wxGetApp().m_enablereset = dialog.m_enableresetCheck->GetValue(); wxGetApp().m_enablerestart = dialog.m_enablerestartCheck->GetValue(); wxGetApp().m_enablevsc = dialog.m_enablevscCheck->GetValue(); wxGetApp().m_enableerterm = dialog.m_enableertermCheck->GetValue(); wxGetApp().m_enablesegmark = dialog.m_enablesegmarkCheck->GetValue(); wxGetApp().m_enableidx = dialog.m_enableidxCheck->GetValue(); wxGetApp().m_index = dialog.m_indexCtrl->GetValue(); wxGetApp().m_enablecomm = dialog.m_enablecommCheck->GetValue(); wxGetApp().m_comment = dialog.m_commentCtrl->GetValue(); wxGetApp().m_enablepoc = dialog.m_enablepocCheck->GetValue(); wxGetApp().m_poc = dialog.m_pocCtrl->GetValue(); #ifdef USE_JPWL wxGetApp().m_enablejpwle = dialog.m_enablejpwlCheck->GetValue(); for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) { wxGetApp().m_hprotsel[n] = dialog.m_hprotChoice[n]->GetSelection(); wxGetApp().m_htileval[n] = dialog.m_htileCtrl[n]->GetValue(); wxGetApp().m_pprotsel[n] = dialog.m_pprotChoice[n]->GetSelection(); wxGetApp().m_ptileval[n] = dialog.m_ptileCtrl[n]->GetValue(); wxGetApp().m_ppackval[n] = dialog.m_ppackCtrl[n]->GetValue(); wxGetApp().m_sensisel[n] = dialog.m_sensiChoice[n]->GetSelection(); wxGetApp().m_stileval[n] = dialog.m_stileCtrl[n]->GetValue(); } #endif // USE_JPWL }; } void OPJFrame::OnSetsDeco(wxCommandEvent& event) { OPJDecoderDialog dialog(this, event.GetId()); if (dialog.ShowModal() == wxID_OK) { // load settings wxGetApp().m_enabledeco = dialog.m_enabledecoCheck->GetValue(); wxGetApp().m_enableparse = dialog.m_enableparseCheck->GetValue(); wxGetApp().m_resizemethod = dialog.m_resizeBox->GetSelection() - 1; wxGetApp().m_reducefactor = dialog.m_reduceCtrl->GetValue(); wxGetApp().m_qualitylayers = dialog.m_layerCtrl->GetValue(); wxGetApp().m_components = dialog.m_numcompsCtrl->GetValue(); wxGetApp().m_framenum = dialog.m_framenumCtrl->GetValue(); #ifdef USE_JPWL wxGetApp().m_enablejpwl = dialog.m_enablejpwlCheck->GetValue(); wxGetApp().m_expcomps = dialog.m_expcompsCtrl->GetValue(); wxGetApp().m_maxtiles = dialog.m_maxtilesCtrl->GetValue(); #endif // USE_JPWL }; } void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event)) { // current frame OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild(); if (!currframe) return; wxCloseEvent e; currframe->OnClose(e); } void OPJFrame::OnFit(wxCommandEvent& event) { OPJChildFrame *currchild; wxString eventstring = event.GetString(); //wxLogMessage(wxT("OnFit:%d:%s"), event.GetInt(), eventstring); // current child if (event.GetInt() >= 1) { currchild = m_childhash[event.GetInt()]; } else { currchild = (OPJChildFrame *) GetActiveChild(); } // problems if (!currchild) return; // current canvas OPJCanvas *currcanvas = currchild->m_canvas; // find a fit-to-width zoom /*int zooml, wzooml, hzooml; wxSize clientsize = currcanvas->GetClientSize(); wzooml = (int) ceil(100.0 * (double) (clientsize.GetWidth() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetWidth())); hzooml = (int) ceil(100.0 * (double) (clientsize.GetHeight() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetHeight())); zooml = wxMin(100, wxMin(wzooml, hzooml));*/ // fit to width Rescale(-1, currchild); } void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event)) { // current frame OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild(); if (!currframe) return; // get the preferred zoom long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"), wxT("Zoom (%)"), wxT("Image scale"), currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition); // rescale current frame image if necessary if (zooml >= 5) { Rescale(zooml, currframe); wxLogMessage(wxT("zoom to %d%%"), zooml); } } void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe) { wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage(); // resizing enabled? if (wxGetApp().m_resizemethod == -1) { zooml = 100; } else { if (zooml < 0) { // find a fit-to-width zoom int wzooml, hzooml; //wxSize clientsize = currframe->m_canvas->GetClientSize(); wxSize clientsize = currframe->m_frame->GetActiveChild()->GetClientSize(); wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + currframe->m_canvas->m_image100.GetWidth())); hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + currframe->m_canvas->m_image100.GetHeight())); zooml = wxMin(100, wxMin(wzooml, hzooml)); } } if (zooml != 100) new_image.Rescale((int) ((double) zooml * (double) new_image.GetWidth() / 100.0), (int) ((double) zooml * (double) new_image.GetHeight() / 100.0), wxGetApp().m_resizemethod ? wxIMAGE_QUALITY_HIGH : wxIMAGE_QUALITY_NORMAL); currframe->m_canvas->m_image = wxBitmap(new_image); currframe->m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) new_image.GetWidth() / 20.0), (int)(0.5 + (double) new_image.GetHeight() / 20.0) ); currframe->m_canvas->Refresh(); wxLogMessage(wxT("Rescale said %d%%"), zooml); // update zoom currframe->m_canvas->m_zooml = zooml; } void OPJFrame::OnReload(wxCommandEvent& event) { OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild(); if (currframe) { OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread(); if (dthread->Run() != wxTHREAD_NO_ERROR) wxLogMessage(wxT("Can't start deco thread!")); else wxLogMessage(wxT("New deco thread started.")); currframe->m_canvas->Refresh(); // update zoom //currframe->m_canvas->m_zooml = zooml; } } void OPJFrame::OnPrevFrame(wxCommandEvent& event) { if (--wxGetApp().m_framenum < 0) wxGetApp().m_framenum = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnHomeFrame(wxCommandEvent& event) { wxGetApp().m_framenum = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnNextFrame(wxCommandEvent& event) { ++wxGetApp().m_framenum; wxCommandEvent e; OnReload(e); } void OPJFrame::OnLessLayers(wxCommandEvent& event) { if (--wxGetApp().m_qualitylayers < 1) wxGetApp().m_qualitylayers = 1; wxCommandEvent e; OnReload(e); } void OPJFrame::OnAllLayers(wxCommandEvent& event) { wxGetApp().m_qualitylayers = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnMoreLayers(wxCommandEvent& event) { ++wxGetApp().m_qualitylayers; wxCommandEvent e; OnReload(e); } void OPJFrame::OnLessRes(wxCommandEvent& event) { ++wxGetApp().m_reducefactor; wxCommandEvent e; OnReload(e); } void OPJFrame::OnFullRes(wxCommandEvent& event) { wxGetApp().m_reducefactor = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnMoreRes(wxCommandEvent& event) { if (--wxGetApp().m_reducefactor < 0) wxGetApp().m_reducefactor = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnPrevComp(wxCommandEvent& event) { if (--wxGetApp().m_components < 1) wxGetApp().m_components = 1; wxCommandEvent e; OnReload(e); } void OPJFrame::OnAllComps(wxCommandEvent& event) { wxGetApp().m_components = 0; wxCommandEvent e; OnReload(e); } void OPJFrame::OnNextComp(wxCommandEvent& event) { ++wxGetApp().m_components; wxCommandEvent e; OnReload(e); } void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event)) { if (markerTreeWindow->IsShown()) markerTreeWindow->Show(false); else markerTreeWindow->Show(true); wxLayoutAlgorithm layout; layout.LayoutMDIFrame(this); wxGetApp().m_showbrowser = markerTreeWindow->IsShown(); // Leaves bits of itself behind sometimes GetClientWindow()->Refresh(); } void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event)) { if (loggingWindow->IsShown()) loggingWindow->Show(false); else loggingWindow->Show(true); wxLayoutAlgorithm layout; layout.LayoutMDIFrame(this); wxGetApp().m_showpeeker = loggingWindow->IsShown(); // Leaves bits of itself behind sometimes GetClientWindow()->Refresh(); } void OPJFrame::OnToggleToolbar(wxCommandEvent& WXUNUSED(event)) { if (tool_bar->IsShown()) tool_bar->Show(false); else tool_bar->Show(true); wxLayoutAlgorithm layout; layout.LayoutMDIFrame(this); wxGetApp().m_showtoolbar = tool_bar->IsShown(); // Leaves bits of itself behind sometimes GetClientWindow()->Refresh(); } void OPJFrame::OnSashDrag(wxSashEvent& event) { int wid, hei; if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE) return; switch (event.GetId()) { case OPJFRAME_BROWSEWIN: { markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000)); break; } case OPJFRAME_LOGWIN: { loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height)); break; } } wxLayoutAlgorithm layout; layout.LayoutMDIFrame(this); // Leaves bits of itself behind sometimes GetClientWindow()->Refresh(); // update dimensions markerTreeWindow->GetSize(&wid, &hei); wxGetApp().m_browserwidth = wid; loggingWindow->GetSize(&wid, &hei); wxGetApp().m_peekerheight = hei; } void OPJFrame::OnThreadLogmsg(wxCommandEvent& event) { #if 1 wxLogMessage(wxT("Frame got message from worker thread: %d"), event.GetInt()); wxLogMessage(event.GetString()); #else int n = event.GetInt(); if ( n == -1 ) { m_dlgProgress->Destroy(); m_dlgProgress = (wxProgressDialog *)NULL; // the dialog is aborted because the event came from another thread, so // we may need to wake up the main event loop for the dialog to be // really closed wxWakeUpIdle(); } else { if ( !m_dlgProgress->Update(n) ) { wxCriticalSectionLocker lock(m_critsectWork); m_cancelled = true; } } #endif } // physically save the file void OPJFrame::SaveFile(wxArrayString paths, wxArrayString filenames) { size_t count = paths.GetCount(); wxString msg, s; if (wxFile::Exists(paths[0].c_str())) { s.Printf(wxT("File %s already exists. Do you want to overwrite it?\n"), filenames[0].c_str()); wxMessageDialog dialog3(this, s, _T("File exists"), wxYES_NO); if (dialog3.ShowModal() == wxID_NO) return; } /*s.Printf(_T("File %d: %s (%s)\n"), (int)0, paths[0].c_str(), filenames[0].c_str()); msg += s; wxMessageDialog dialog2(this, msg, _T("Selected files")); dialog2.ShowModal();*/ if (!GetActiveChild()) return; ((OPJChildFrame *) GetActiveChild())->m_canvas->m_savename = paths[0]; OPJEncoThread *ethread = ((OPJChildFrame *) GetActiveChild())->m_canvas->CreateEncoThread(); if (ethread->Run() != wxTHREAD_NO_ERROR) wxLogMessage(wxT("Can't start enco thread!")); else wxLogMessage(wxT("New enco thread started.")); } // physically open the files void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames) { size_t count = paths.GetCount(); for (size_t n = 0; n < count; n++) { wxString msg, s; s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str()); msg += s; /*wxMessageDialog dialog2(this, msg, _T("Selected files")); dialog2.ShowModal();*/ // Make another frame, containing a canvas OPJChildFrame *subframe = new OPJChildFrame(this, paths[n], winNumber, wxT("Canvas Frame"), wxDefaultPosition, wxSize(300, 300), wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE ); m_childhash[winNumber] = subframe; // create own marker tree m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, subframe, paths[n], wxT("Parsing..."), TreeTest_Ctrl, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER ); m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false); for (unsigned int p = 0; p < m_bookCtrl->GetPageCount(); p++) { if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) { m_bookCtrl->ChangeSelection(p); break; } } winNumber++; } } void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event)) { wxString wildcards = #ifdef __WXMOTIF__ wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.*j*2*"); #else #if wxUSE_LIBOPENJPEG wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2") #endif #if USE_MXF wxT("|MXF JPEG 2000 video (*.mxf)|*.mxf") #endif // USE_MXF #if wxUSE_LIBJPEG wxT("|JPEG files (*.jpg)|*.jpg") #endif #if OPJ_MANYFORMATS wxT("|BMP files (*.bmp)|*.bmp") wxT("|PNG files (*.png)|*.png") wxT("|GIF files (*.gif)|*.gif") wxT("|PNM files (*.pnm)|*.pnm") wxT("|TIFF files (*.tif,*.tiff)|*.tif*") #endif wxT("|All files|*"); #endif wxFileDialog dialog(this, _T("Open image file(s)"), wxEmptyString, wxEmptyString, wildcards, wxFD_OPEN|wxFD_MULTIPLE); if (dialog.ShowModal() == wxID_OK) { wxArrayString paths, filenames; dialog.GetPaths(paths); dialog.GetFilenames(filenames); OpenFiles(paths, filenames); } } void OPJFrame::OnFileSaveAs(wxCommandEvent& WXUNUSED(event)) { wxString wildcards = #ifdef wxUSE_LIBOPENJPEG #ifdef __WXMOTIF__ wxT("JPEG 2000 codestream (*.j2k)|*.*j*2*"); #else wxT("JPEG 2000 codestream (*.j2k)|*.j2k") wxT("|JPEG 2000 file format (*.jp2)|*.jp2"); #endif #else wxT("Houston we have a problem"); #endif wxFileDialog dialog(this, _T("Save image file"), wxEmptyString, wxEmptyString, wildcards, wxFD_SAVE); if (dialog.ShowModal() == wxID_OK) { wxArrayString paths, filenames; dialog.GetPaths(paths); dialog.GetFilenames(filenames); SaveFile(paths, filenames); } } void OPJFrame::OnMemoryOpen(wxCommandEvent& WXUNUSED(event)) { // do nothing return; wxTextEntryDialog dialog(this, wxT("Memory HEX address range: start_address-stop_address"), wxT("Decode a memory buffer"), wxT("0x-0x"), wxOK | wxCANCEL | wxCENTRE, wxDefaultPosition); if (dialog.ShowModal() == wxID_OK) { } } BEGIN_EVENT_TABLE(OPJCanvas, wxScrolledWindow) EVT_MOUSE_EVENTS(OPJCanvas::OnEvent) EVT_MENU(OPJCANVAS_THREADSIGNAL, OPJCanvas::OnThreadSignal) END_EVENT_TABLE() // Define a constructor for my canvas OPJCanvas::OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size) : wxScrolledWindow(parent, wxID_ANY, pos, size, wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) { SetBackgroundColour(OPJ_CANVAS_COLOUR); m_fname = fname; m_childframe = (OPJChildFrame *) parent; // 100% zoom m_zooml = 100; OPJDecoThread *dthread = CreateDecoThread(); if (dthread->Run() != wxTHREAD_NO_ERROR) wxLogMessage(wxT("Can't start deco thread!")); else wxLogMessage(wxT("New deco thread started.")); // 100% zoom //m_zooml = 100; } OPJDecoThread *OPJCanvas::CreateDecoThread(void) { OPJDecoThread *dthread = new OPJDecoThread(this); if (dthread->Create() != wxTHREAD_NO_ERROR) wxLogError(wxT("Can't create deco thread!")); wxCriticalSectionLocker enter(wxGetApp().m_deco_critsect); wxGetApp().m_deco_threads.Add(dthread); return dthread; } OPJEncoThread *OPJCanvas::CreateEncoThread(void) { OPJEncoThread *ethread = new OPJEncoThread(this); if (ethread->Create() != wxTHREAD_NO_ERROR) wxLogError(wxT("Can't create enco thread!")); wxCriticalSectionLocker enter(wxGetApp().m_enco_critsect); wxGetApp().m_enco_threads.Add(ethread); return ethread; } #define activeoverlay 0 // Define the repainting behaviour void OPJCanvas::OnDraw(wxDC& dc) { if (m_image.Ok()) { dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER); if (activeoverlay) { dc.SetPen(*wxRED_PEN); dc.SetBrush(*wxTRANSPARENT_BRUSH); //int tw, th; dc.DrawRectangle(OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER, (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_twidth / 100.0), (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_theight / 100.0)); } } else { dc.SetFont(*wxSWISS_FONT); dc.SetPen(*wxBLACK_PEN); #ifdef __WXGTK__ dc.DrawText(_T("Decoding image, please wait... (press \"Zoom to Fit\" to show the image)"), 40, 50); #else dc.DrawText(_T("Decoding image, please wait..."), 40, 50); #endif } } // This implements a tiny doodling program! Drag the mouse using // the left button. void OPJCanvas::OnEvent(wxMouseEvent& event) { #if USE_PENCIL_ON_CANVAS wxClientDC dc(this); PrepareDC(dc); wxPoint pt(event.GetLogicalPosition(dc)); if ((xpos > -1) && (ypos > -1) && event.Dragging()) { dc.SetPen(*wxRED_PEN); dc.DrawLine(xpos, ypos, pt.x, pt.y); } xpos = pt.x; ypos = pt.y; #endif } void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event)) { wxLayoutAlgorithm layout; layout.LayoutMDIFrame(this); } void OPJCanvas::OnThreadSignal(wxCommandEvent& event) { #if 1 wxLogMessage(wxT("Canvas got signal from deco thread: %d"), event.GetInt()); wxLogMessage(event.GetString()); #else int n = event.GetInt(); if ( n == -1 ) { m_dlgProgress->Destroy(); m_dlgProgress = (wxProgressDialog *)NULL; // the dialog is aborted because the event came from another thread, so // we may need to wake up the main event loop for the dialog to be // really closed wxWakeUpIdle(); } else { if ( !m_dlgProgress->Update(n) ) { wxCriticalSectionLocker lock(m_critsectWork); m_cancelled = true; } } #endif } // Note that OPJFRAME_FILEOPEN and OPJFRAME_HELPABOUT commands get passed // to the parent window for processing, so no need to // duplicate event handlers here. BEGIN_EVENT_TABLE(OPJChildFrame, wxMDIChildFrame) /*EVT_MENU(SASHTEST_CHILD_QUIT, OPJChildFrame::OnQuit)*/ EVT_CLOSE(OPJChildFrame::OnClose) EVT_SET_FOCUS(OPJChildFrame::OnGotFocus) EVT_KILL_FOCUS(OPJChildFrame::OnLostFocus) END_EVENT_TABLE() OPJChildFrame::OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size, const long style): wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style) { m_frame = (OPJFrame *) parent; m_canvas = NULL; //my_children.Append(this); m_fname = fname; m_winnumber = winnumber; SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName()); // Give it an icon (this is ignored in MDI mode: uses resources) #ifdef __WXMSW__ SetIcon(wxIcon(wxT("OPJChild16"))); #endif // Give it a status line /*CreateStatusBar();*/ int width, height; GetClientSize(&width, &height); OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height)); #if USE_PENCIL_ON_CANVAS canvas->SetCursor(wxCursor(wxCURSOR_PENCIL)); #endif m_canvas = canvas; // Give it scrollbars canvas->SetScrollbars(20, 20, 5, 5); Show(true); Maximize(true); /*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/ } OPJChildFrame::~OPJChildFrame(void) { //my_children.DeleteObject(this); } void OPJChildFrame::OnClose(wxCloseEvent& event) { for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) { if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) { m_frame->m_bookCtrl->DeletePage(p); break; } } Destroy(); wxLogMessage(wxT("Closed: %d"), m_winnumber); } void OPJChildFrame::OnActivate(wxActivateEvent& event) { /*if (event.GetActive() && m_canvas) m_canvas->SetFocus();*/ } void OPJChildFrame::OnGotFocus(wxFocusEvent& event) { // we need to check if the notebook is being destroyed or not if (!m_frame->m_bookCtrl) return; for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) { if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) { m_frame->m_bookCtrl->ChangeSelection(p); break; } } //wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow()); } void OPJChildFrame::OnLostFocus(wxFocusEvent& event) { //wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow()); } //////////////////////////////// // drag and drop //////////////////////////////// bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { /*size_t nFiles = filenames.GetCount(); wxString str; str.Printf( _T("%d files dropped\n"), (int)nFiles); for ( size_t n = 0; n < nFiles; n++ ) { str << filenames[n] << wxT("\n"); } wxLogMessage(str);*/ m_pOwner->OpenFiles(filenames, filenames); return true; } openjpeg-1.5.2/applications/OPJViewer/source/OPJThreads.cpp0000644000175000017500000011774312315002075023457 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita'  degli studi di Perugia (UPG), Italy * 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 "OPJViewer.h" ///////////////////////////////////////////////////////////////////// // Encoding thread class ///////////////////////////////////////////////////////////////////// OPJEncoThread::OPJEncoThread(OPJCanvas *canvas) : wxThread() { m_count = 0; m_canvas = canvas; } void OPJEncoThread::WriteText(const wxString& text) { wxString msg; // before doing any GUI calls we must ensure that this thread is the only // one doing it! #ifndef __WXGTK__ wxMutexGuiEnter(); #endif // __WXGTK__ msg << text; m_canvas->WriteText(msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif // __WXGTK__ } void OPJEncoThread::OnExit() { wxCriticalSectionLocker locker(wxGetApp().m_enco_critsect); wxArrayThread& ethreads = wxGetApp().m_enco_threads; ethreads.Remove(this); if (ethreads.IsEmpty() ) { // signal the main thread that there are no more threads left if it is // waiting for us if (wxGetApp().m_enco_waitingUntilAllDone) { wxGetApp().m_enco_waitingUntilAllDone = false; wxGetApp().m_enco_semAllDone.Post(); } } } void *OPJEncoThread::Entry() { wxString text; srand(GetId()); //int m_countnum = rand() % 9; //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."), // GetId(), GetPriority(), m_countnum); text.Printf(wxT("Enco thread %d started"), m_canvas->m_childframe->m_winnumber); WriteText(text); // set handler properties wxJPEG2000Handler *jpeg2000handler = (wxJPEG2000Handler *) wxImage::FindHandler(wxBITMAP_TYPE_JPEG2000); jpeg2000handler->m_subsampling = wxGetApp().m_subsampling; jpeg2000handler->m_origin = wxGetApp().m_origin; jpeg2000handler->m_rates = wxGetApp().m_rates; jpeg2000handler->m_quality = wxGetApp().m_quality; jpeg2000handler->m_enablequality = wxGetApp().m_enablequality; jpeg2000handler->m_multicomp = wxGetApp().m_multicomp; jpeg2000handler->m_irreversible = wxGetApp().m_irreversible; jpeg2000handler->m_resolutions = wxGetApp().m_resolutions; jpeg2000handler->m_progression = wxGetApp().m_progression; jpeg2000handler->m_cbsize = wxGetApp().m_cbsize; jpeg2000handler->m_prsize = wxGetApp().m_prsize; jpeg2000handler->m_tsize = wxGetApp().m_tsize; jpeg2000handler->m_torigin = wxGetApp().m_torigin; jpeg2000handler->m_enablesop = wxGetApp().m_enablesop; jpeg2000handler->m_enableeph = wxGetApp().m_enableeph; jpeg2000handler->m_enablebypass = wxGetApp().m_enablebypass; jpeg2000handler->m_enablerestart = wxGetApp().m_enablerestart; jpeg2000handler->m_enablereset = wxGetApp().m_enablereset; jpeg2000handler->m_enablesegmark = wxGetApp().m_enablesegmark; jpeg2000handler->m_enableerterm = wxGetApp().m_enableerterm; jpeg2000handler->m_enablevsc = wxGetApp().m_enablevsc; jpeg2000handler->m_enableidx = wxGetApp().m_enableidx; jpeg2000handler->m_index = m_canvas->m_savename.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxGetApp().m_index; jpeg2000handler->m_enablecomm = wxGetApp().m_enablecomm; jpeg2000handler->m_comment = wxGetApp().m_comment; jpeg2000handler->m_enablepoc = wxGetApp().m_enablepoc; jpeg2000handler->m_poc = wxGetApp().m_poc; // save the file if (!m_canvas->m_image100.SaveFile(m_canvas->m_savename.GetFullPath(), (wxBitmapType) wxBITMAP_TYPE_JPEG2000)) { WriteText(wxT("Can't save image")); return NULL; } text.Printf(wxT("Enco thread %d finished"), m_canvas->m_childframe->m_winnumber); WriteText(text); return NULL; } ///////////////////////////////////////////////////////////////////// // Decoding thread class ///////////////////////////////////////////////////////////////////// OPJDecoThread::OPJDecoThread(OPJCanvas *canvas) : wxThread() { m_count = 0; m_canvas = canvas; } void OPJDecoThread::WriteText(const wxString& text) { wxString msg; // we use a fake event and post it for inter-thread gui communication wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, OPJFRAME_THREADLOGMSG); event.SetInt(-1); msg << text; event.SetString(msg); wxPostEvent(this->m_canvas->m_childframe->m_frame, event); /* // before doing any GUI calls we must ensure that this thread is the only // one doing it! #ifndef __WXGTK__ wxMutexGuiEnter(); #endif // __WXGTK__ msg << text; m_canvas->WriteText(msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif // __WXGTK__ */ } void OPJDecoThread::OnExit() { wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect); wxArrayThread& dthreads = wxGetApp().m_deco_threads; dthreads.Remove(this); if (dthreads.IsEmpty() ) { // signal the main thread that there are no more threads left if it is // waiting for us if (wxGetApp().m_deco_waitingUntilAllDone) { wxGetApp().m_deco_waitingUntilAllDone = false; wxGetApp().m_deco_semAllDone.Post(); } } } void *OPJDecoThread::Entry() { wxString text; //srand(GetId()); //int m_countnum = rand() % 9; //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."), // GetId(), GetPriority(), m_countnum); // we have started text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber); WriteText(text); // prepare dummy wximage wxBitmap bitmap(100, 100); wxImage image(100, 100, true); //= bitmap.ConvertToImage(); image.Destroy(); // show image full name WriteText(m_canvas->m_fname.GetFullPath()); // set handler properties wxJPEG2000Handler *jpeg2000handler = (wxJPEG2000Handler *) wxImage::FindHandler(wxBITMAP_TYPE_JPEG2000); jpeg2000handler->m_reducefactor = wxGetApp().m_reducefactor; jpeg2000handler->m_qualitylayers = wxGetApp().m_qualitylayers; jpeg2000handler->m_components = wxGetApp().m_components; jpeg2000handler->m_framenum = wxGetApp().m_framenum; #ifdef USE_JPWL jpeg2000handler->m_enablejpwl = wxGetApp().m_enablejpwl; jpeg2000handler->m_expcomps = wxGetApp().m_expcomps; jpeg2000handler->m_maxtiles = wxGetApp().m_maxtiles; #endif // USE_JPWL #ifdef USE_MXF wxMXFHandler *mxfffhandler = (wxMXFHandler *) wxImage::FindHandler(wxBITMAP_TYPE_MXF); mxfffhandler->m_reducefactor = wxGetApp().m_reducefactor; mxfffhandler->m_qualitylayers = wxGetApp().m_qualitylayers; mxfffhandler->m_components = wxGetApp().m_components; mxfffhandler->m_framenum = wxGetApp().m_framenum; mxfffhandler->m_filename = m_canvas->m_fname; #ifdef USE_JPWL mxfffhandler->m_enablejpwl = wxGetApp().m_enablejpwl; mxfffhandler->m_expcomps = wxGetApp().m_expcomps; mxfffhandler->m_maxtiles = wxGetApp().m_maxtiles; #endif // USE_JPWL #endif // USE_MXF // if decoding is enabled... if (wxGetApp().m_enabledeco) { // load the file if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY, 0)) { WriteText(wxT("Can't load image!")); return NULL; } } else { // display a warning if (!image.Create(300, 5, false)) { WriteText(wxT("Can't create image!")); return NULL; } } // assign 100% image m_canvas->m_image100 = wxBitmap(image); // signal the frame to refresh the canvas wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, OPJFRAME_VIEWFIT); event.SetString(wxT("Fit me")); event.SetInt(m_canvas->m_childframe->m_winnumber); wxPostEvent(m_canvas->m_childframe->m_frame, event); // find a fit-to-width zoom /*int zooml, wzooml, hzooml; wxSize clientsize = m_canvas->GetClientSize(); wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth())); hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight())); zooml = wxMin(100, wxMin(wzooml, hzooml));*/ // fit to width #ifndef __WXGTK__ //m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe); #endif // __WXGTK__ //m_canvas->m_image = m_canvas->m_image100; //m_canvas->Refresh(); //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0)); //text.Printf(wxT("Deco thread 0x%lx finished."), GetId()); text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber); WriteText(text); return NULL; } ///////////////////////////////////////////////////////////////////// // Parsing thread class ///////////////////////////////////////////////////////////////////// OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid) : wxThread() { m_count = 0; m_tree = tree; m_parentid = parentid; } void OPJParseThread::WriteText(const wxString& text) { wxString msg; // we use a fake event and post it for inter-thread gui communication wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, OPJFRAME_THREADLOGMSG); event.SetInt(-1); msg << text; event.SetString(msg); wxPostEvent(this->m_tree->m_childframe->m_frame, event); /* // before doing any GUI calls we must ensure that this thread is the only // one doing it! #ifndef __WXGTK__ wxMutexGuiEnter(); #endif // __WXGTK msg << text; m_tree->WriteText(msg); #ifndef __WXGTK__ wxMutexGuiLeave(); #endif // __WXGTK*/ } void OPJParseThread::OnExit() { wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect); wxArrayThread& threads = wxGetApp().m_parse_threads; threads.Remove(this); if (threads.IsEmpty()) { // signal the main thread that there are no more threads left if it is // waiting for us if (wxGetApp().m_parse_waitingUntilAllDone) { wxGetApp().m_parse_waitingUntilAllDone = false; wxGetApp().m_parse_semAllDone.Post(); } } } void *OPJParseThread::Entry() { printf("Entering\n\n"); wxString text; srand(GetId()); int m_countnum = rand() % 9; text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."), GetId(), GetPriority(), m_countnum); WriteText(text); LoadFile(m_tree->m_fname); text.Printf(wxT("Parse thread 0x%lx finished."), GetId()); WriteText(text); //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness //wxBusyCursor wait; //wxBusyInfo wait(wxT("Decoding image ...")); /*for ( m_count = 0; m_count < m_countnum; m_count++ ) { // check if we were asked to exit if ( TestDestroy() ) break; text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId()); WriteText(text); // wxSleep() can't be called from non-GUI thread! wxThread::Sleep(10); }*/ // wxLogMessage(text); -- test wxLog thread safeness printf("Exiting\n\n"); return NULL; } /////////////////////////////////////////// // Parsing hread and related /////////////////////////////////////////// #if USE_GENERIC_TREECTRL BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl) #else BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl) #endif /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag) EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag) EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/ /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit) EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/ /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/ #if 0 // there are so many of those that logging them causes flicker /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/ #endif /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo) EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/ EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding) /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed) EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/ EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged) /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/ /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/ /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/ // so many differents ways to handle right mouse button clicks... /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/ // EVT_TREE_ITEM_MENU is the preferred event for creating context menus // on a tree control, because it includes the point of the click or item, // meaning that no additional placement calculations are required. EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu) /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/ /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown) EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp) EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/ END_EVENT_TABLE() // OPJMarkerTree implementation #if USE_GENERIC_TREECTRL IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl) #else IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl) #endif OPJMarkerTree::OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxTreeCtrl(parent, id, pos, size, style) { m_reverseSort = false; m_fname = fname; m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse; CreateImageList(); // Add some items to the tree //AddTestItemsToTree(5, 5); int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1; wxTreeItemId rootId = AddRoot(name, image, image, new OPJMarkerData(name)); OPJParseThread *pthread = CreateParseThread(0x00, subframe); if (pthread->Run() != wxTHREAD_NO_ERROR) wxLogMessage(wxT("Can't start parse thread!")); else wxLogMessage(wxT("New parse thread started.")); m_childframe = subframe; } void OPJMarkerTree::CreateImageList(int size) { if (size == -1) { SetImageList(NULL); return; } if (size == 0) size = m_imageSize; else m_imageSize = size; // Make an image list containing small icons wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[5]; icons[0] = wxIcon(icon1_xpm); icons[1] = wxIcon(icon2_xpm); icons[2] = wxIcon(icon3_xpm); icons[3] = wxIcon(icon4_xpm); icons[4] = wxIcon(icon5_xpm); int sizeOrig = icons[0].GetWidth(); for (size_t i = 0; i < WXSIZEOF(icons); i++) { if (size == sizeOrig) { images->Add(icons[i]); } else { images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size))); } } AssignImageList(images); } #if USE_GENERIC_TREECTRL || !defined(__WXMSW__) void OPJMarkerTree::CreateButtonsImageList(int size) { if ( size == -1 ) { SetButtonsImageList(NULL); return; } // Make an image list containing small icons wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[4]; icons[0] = wxIcon(icon3_xpm); // closed icons[1] = wxIcon(icon3_xpm); // closed, selected icons[2] = wxIcon(icon5_xpm); // open icons[3] = wxIcon(icon5_xpm); // open, selected for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) { int sizeOrig = icons[i].GetWidth(); if ( size == sizeOrig ) { images->Add(icons[i]); } else { images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size))); } } AssignButtonsImageList(images); #else void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size)) { #endif } void OPJParseThread::LoadFile(wxFileName fname) { wxTreeItemId rootid; // this is the root node int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1; if (this->m_parentid) { // leaf of a tree rootid = m_parentid; m_tree->SetItemText(rootid, wxT("Parsing...")); } else { // delete the existing tree hierarchy m_tree->DeleteAllItems(); // new tree rootid = m_tree->AddRoot(wxT("Parsing..."), image, image, new OPJMarkerData(fname.GetFullPath()) ); //m_tree->SetItemFont(rootid, *wxITALIC_FONT); m_tree->SetItemBold(rootid); } // open the file wxFile m_file(fname.GetFullPath().c_str(), wxFile::read); // parsing enabled? if (wxGetApp().m_enableparse) { // what is the extension? if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) { // parse the file ParseJ2KFile(&m_file, 0, m_file.Length(), rootid); } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) { // parse the file if (this->m_parentid) { //WriteText(wxT("Only a subsection of jp2")); OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid); ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid); m_tree->Expand(rootid); } else { // as usual ParseJP2File(&m_file, 0, m_file.Length(), rootid); } } else { // unknown extension WriteText(wxT("Unknown file format!")); } } // this is the root node if (this->m_parentid) m_tree->SetItemText(rootid, wxT("Codestream")); else //m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length())); m_tree->SetItemText(rootid, fname.GetFullName()); // close the file m_file.Close(); WriteText(wxT("Parsing finished!")); } /*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1, const wxTreeItemId& item2) { if ( m_reverseSort ) { // just exchange 1st and 2nd items return wxTreeCtrl::OnCompareItems(item2, item1); } else { return wxTreeCtrl::OnCompareItems(item1, item2); } }*/ /*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent, size_t numChildren, size_t depth, size_t folder) { if ( depth > 0 ) { bool hasChildren = depth > 1; wxString str; for ( size_t n = 0; n < numChildren; n++ ) { // at depth 1 elements won't have any more children if ( hasChildren ) str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1)); else str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1)); // here we pass to AppendItem() normal and selected item images (we // suppose that selected image follows the normal one in the enum) int image, imageSel; if ( wxGetApp().ShowImages() ) { image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; imageSel = image + 1; } else { image = imageSel = -1; } wxTreeItemId id = AppendItem(idParent, str, image, imageSel, new OPJMarkerData(str)); // and now we also set the expanded one (only for the folders) if ( hasChildren && wxGetApp().ShowImages() ) { SetItemImage(id, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); } // remember the last child for OnEnsureVisible() if ( !hasChildren && n == numChildren - 1 ) { m_lastItem = id; } AddItemsRecursively(id, numChildren, depth - 1, n + 1); } } //else: done! }*/ /*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren, size_t depth) { int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1; wxTreeItemId rootId = AddRoot(wxT("Root"), image, image, new OPJMarkerData(wxT("Root item"))); if ( image != -1 ) { SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); } AddItemsRecursively(rootId, numChildren, depth, 0); // set some colours/fonts for testing SetItemFont(rootId, *wxITALIC_FONT); wxTreeItemIdValue cookie; wxTreeItemId id = GetFirstChild(rootId, cookie); SetItemTextColour(id, *wxBLUE); id = GetNextChild(rootId, cookie); id = GetNextChild(rootId, cookie); SetItemTextColour(id, *wxRED); SetItemBackgroundColour(id, *wxLIGHT_GREY); }*/ /*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent, wxTreeItemIdValue cookie) { wxTreeItemId id; if ( !cookie ) id = GetFirstChild(idParent, cookie); else id = GetNextChild(idParent, cookie); if ( !id.IsOk() ) return; wxString text = GetItemText(id); wxLogMessage(text); if (ItemHasChildren(id)) GetItemsRecursively(id); GetItemsRecursively(idParent, cookie); }*/ /*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item) { int image = (GetItemImage(item) == TreeCtrlIcon_Folder) ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; SetItemImage(item, image, wxTreeItemIcon_Normal); image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected) ? TreeCtrlIcon_FileSelected : TreeCtrlIcon_FolderSelected; SetItemImage(item, image, wxTreeItemIcon_Selected); }*/ void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); wxString text; if ( item.IsOk() ) text << wxT('"') << GetItemText(item).c_str() << wxT('"'); else text = wxT("invalid item"); wxLogMessage(wxT("%s(%s)"), name, text.c_str()); } OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe) { OPJParseThread *pthread = new OPJParseThread(this, parentid); if (pthread->Create() != wxTHREAD_NO_ERROR) wxLogError(wxT("Can't create parse thread!")); wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect); wxGetApp().m_parse_threads.Add(pthread); return pthread; } /*// avoid repetition #define TREE_EVENT_HANDLER(name) \ void OPJMarkerTree::name(wxTreeEvent& event) \ { \ LogEvent(_T(#name), event); \ SetLastItem(wxTreeItemId()); \ event.Skip(); \ }*/ /*TREE_EVENT_HANDLER(OnBeginRDrag)*/ /*TREE_EVENT_HANDLER(OnDeleteItem)*/ /*TREE_EVENT_HANDLER(OnGetInfo) TREE_EVENT_HANDLER(OnSetInfo)*/ /*TREE_EVENT_HANDLER(OnItemExpanded) TREE_EVENT_HANDLER(OnItemExpanding)*/ /*TREE_EVENT_HANDLER(OnItemCollapsed)*/ /*TREE_EVENT_HANDLER(OnSelChanged) TREE_EVENT_HANDLER(OnSelChanging)*/ /*#undef TREE_EVENT_HANDLER*/ void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); OPJMarkerData* data = (OPJMarkerData *) GetItemData(item); wxString text; if (item.IsOk()) text << wxT('"') << GetItemText(item).c_str() << wxT('"'); else text = wxT("invalid item"); if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM"))) return; wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"), text.c_str(), data->GetDesc1(), data->GetDesc2(), data->m_start, data->m_length); // the codestream box is being asked for expansion wxTreeItemIdValue cookie; if (!GetFirstChild(item, cookie).IsOk()) { OPJParseThread *pthread = CreateParseThread(item); if (pthread->Run() != wxTHREAD_NO_ERROR) wxLogMessage(wxT("Can't start parse thread!")); else wxLogMessage(wxT("New parse thread started.")); } } void OPJMarkerTree::OnSelChanged(wxTreeEvent& event) { int bunch_linesize = 16; int bunch_numlines = 7; wxTreeItemId item = event.GetItem(); OPJMarkerData* data = (OPJMarkerData *) GetItemData(item); wxString text; int l, c, pos = 0, pre_pos; m_peektextCtrl->Clear(); /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"), text.c_str(), data->GetDesc1(), data->GetDesc2(), data->m_start, data->m_length) << wxT("\n");*/ // open the file and browse a little wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read); // go to position claimed fp->Seek(data->m_start, wxFromStart); // read a bunch int max_read = wxMin(wxFileOffset(bunch_linesize * bunch_numlines), data->m_length - data->m_start + 1); if (data->m_desc == wxT("MARK (65380)")) { /*wxLogMessage(data->m_desc);*/ max_read = data->m_length - data->m_start + 1; bunch_numlines = (int) ceil((float) max_read / (float) bunch_linesize); } unsigned char *buffer = new unsigned char[bunch_linesize * bunch_numlines]; fp->Read(buffer, max_read); // write the file data between start and stop pos = 0; for (l = 0; l < bunch_numlines; l++) { text << wxString::Format(wxT("%010d:"), data->m_start + pos); pre_pos = pos; // add hex browsing text for (c = 0; c < bunch_linesize; c++) { if (!(c % 8)) text << wxT(" "); if (pos < max_read) { text << wxString::Format(wxT("%02X "), buffer[pos]); } else text << wxT(" "); pos++; } text << wxT(" "); // add char browsing text for (c = 0; c < bunch_linesize; c++) { if (pre_pos < max_read) { if ((buffer[pre_pos] == '\n') || (buffer[pre_pos] == '\t') || (buffer[pre_pos] == '\0') || (buffer[pre_pos] == 0x0D) || (buffer[pre_pos] == 0x0B)) buffer[pre_pos] = ' '; text << wxString::FromAscii((char) buffer[pre_pos]) << wxT("."); } else text << wxT(" "); pre_pos++; } text << wxT("\n"); } // close the file fp->Close(); m_peektextCtrl->WriteText(text); delete buffer; } /*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event) { wxString key; long keycode = event.GetKeyCode(); { switch ( keycode ) { case WXK_BACK: key = wxT("BACK"); break; case WXK_TAB: key = wxT("TAB"); break; case WXK_RETURN: key = wxT("RETURN"); break; case WXK_ESCAPE: key = wxT("ESCAPE"); break; case WXK_SPACE: key = wxT("SPACE"); break; case WXK_DELETE: key = wxT("DELETE"); break; case WXK_START: key = wxT("START"); break; case WXK_LBUTTON: key = wxT("LBUTTON"); break; case WXK_RBUTTON: key = wxT("RBUTTON"); break; case WXK_CANCEL: key = wxT("CANCEL"); break; case WXK_MBUTTON: key = wxT("MBUTTON"); break; case WXK_CLEAR: key = wxT("CLEAR"); break; case WXK_SHIFT: key = wxT("SHIFT"); break; case WXK_ALT: key = wxT("ALT"); break; case WXK_CONTROL: key = wxT("CONTROL"); break; case WXK_MENU: key = wxT("MENU"); break; case WXK_PAUSE: key = wxT("PAUSE"); break; case WXK_CAPITAL: key = wxT("CAPITAL"); break; case WXK_END: key = wxT("END"); break; case WXK_HOME: key = wxT("HOME"); break; case WXK_LEFT: key = wxT("LEFT"); break; case WXK_UP: key = wxT("UP"); break; case WXK_RIGHT: key = wxT("RIGHT"); break; case WXK_DOWN: key = wxT("DOWN"); break; case WXK_SELECT: key = wxT("SELECT"); break; case WXK_PRINT: key = wxT("PRINT"); break; case WXK_EXECUTE: key = wxT("EXECUTE"); break; case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break; case WXK_INSERT: key = wxT("INSERT"); break; case WXK_HELP: key = wxT("HELP"); break; case WXK_NUMPAD0: key = wxT("NUMPAD0"); break; case WXK_NUMPAD1: key = wxT("NUMPAD1"); break; case WXK_NUMPAD2: key = wxT("NUMPAD2"); break; case WXK_NUMPAD3: key = wxT("NUMPAD3"); break; case WXK_NUMPAD4: key = wxT("NUMPAD4"); break; case WXK_NUMPAD5: key = wxT("NUMPAD5"); break; case WXK_NUMPAD6: key = wxT("NUMPAD6"); break; case WXK_NUMPAD7: key = wxT("NUMPAD7"); break; case WXK_NUMPAD8: key = wxT("NUMPAD8"); break; case WXK_NUMPAD9: key = wxT("NUMPAD9"); break; case WXK_MULTIPLY: key = wxT("MULTIPLY"); break; case WXK_ADD: key = wxT("ADD"); break; case WXK_SEPARATOR: key = wxT("SEPARATOR"); break; case WXK_SUBTRACT: key = wxT("SUBTRACT"); break; case WXK_DECIMAL: key = wxT("DECIMAL"); break; case WXK_DIVIDE: key = wxT("DIVIDE"); break; case WXK_F1: key = wxT("F1"); break; case WXK_F2: key = wxT("F2"); break; case WXK_F3: key = wxT("F3"); break; case WXK_F4: key = wxT("F4"); break; case WXK_F5: key = wxT("F5"); break; case WXK_F6: key = wxT("F6"); break; case WXK_F7: key = wxT("F7"); break; case WXK_F8: key = wxT("F8"); break; case WXK_F9: key = wxT("F9"); break; case WXK_F10: key = wxT("F10"); break; case WXK_F11: key = wxT("F11"); break; case WXK_F12: key = wxT("F12"); break; case WXK_F13: key = wxT("F13"); break; case WXK_F14: key = wxT("F14"); break; case WXK_F15: key = wxT("F15"); break; case WXK_F16: key = wxT("F16"); break; case WXK_F17: key = wxT("F17"); break; case WXK_F18: key = wxT("F18"); break; case WXK_F19: key = wxT("F19"); break; case WXK_F20: key = wxT("F20"); break; case WXK_F21: key = wxT("F21"); break; case WXK_F22: key = wxT("F22"); break; case WXK_F23: key = wxT("F23"); break; case WXK_F24: key = wxT("F24"); break; case WXK_NUMLOCK: key = wxT("NUMLOCK"); break; case WXK_SCROLL: key = wxT("SCROLL"); break; case WXK_PAGEUP: key = wxT("PAGEUP"); break; case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break; case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break; case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break; case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break; case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break; case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break; case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break; case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break; case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break; case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break; case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break; case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break; case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break; case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break; case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break; case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break; case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break; case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break; case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break; case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break; case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break; case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break; case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break; case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break; case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break; default: { if ( keycode < 128 && wxIsprint((int)keycode) ) key.Printf(wxT("'%c'"), (char)keycode); else if ( keycode > 0 && keycode < 27 ) key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1); else key.Printf(wxT("unknown (%ld)"), keycode); } } } wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"), name, key.c_str(), event.ControlDown() ? wxT('C') : wxT('-'), event.AltDown() ? wxT('A') : wxT('-'), event.ShiftDown() ? wxT('S') : wxT('-'), event.MetaDown() ? wxT('M') : wxT('-')); } void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event) { LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent()); event.Skip(); }*/ /*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event) { // need to explicitly allow drag if ( event.GetItem() != GetRootItem() ) { m_draggedItem = event.GetItem(); wxLogMessage(wxT("OnBeginDrag: started dragging %s"), GetItemText(m_draggedItem).c_str()); event.Allow(); } else { wxLogMessage(wxT("OnBeginDrag: this item can't be dragged.")); } } void OPJMarkerTree::OnEndDrag(wxTreeEvent& event) { wxTreeItemId itemSrc = m_draggedItem, itemDst = event.GetItem(); m_draggedItem = (wxTreeItemId)0l; // where to copy the item? if ( itemDst.IsOk() && !ItemHasChildren(itemDst) ) { // copy to the parent then itemDst = GetItemParent(itemDst); } if ( !itemDst.IsOk() ) { wxLogMessage(wxT("OnEndDrag: can't drop here.")); return; } wxString text = GetItemText(itemSrc); wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."), text.c_str(), GetItemText(itemDst).c_str()); // just do append here - we could also insert it just before/after the item // on which it was dropped, but this requires slightly more work... we also // completely ignore the client data and icon of the old item but could // copy them as well. // // Finally, we only copy one item here but we might copy the entire tree if // we were dragging a folder. int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1; AppendItem(itemDst, text, image); }*/ /*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event) { wxLogMessage(wxT("OnBeginLabelEdit")); // for testing, prevent this item's label editing wxTreeItemId itemId = event.GetItem(); if ( IsTestItem(itemId) ) { wxMessageBox(wxT("You can't edit this item.")); event.Veto(); } else if ( itemId == GetRootItem() ) { // test that it is possible to change the text of the item being edited SetItemText(itemId, _T("Editing root item")); } } void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event) { wxLogMessage(wxT("OnEndLabelEdit")); // don't allow anything except letters in the labels if ( !event.GetLabel().IsWord() ) { wxMessageBox(wxT("The new label should be a single word.")); event.Veto(); } }*/ /*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event) { wxLogMessage(wxT("OnItemCollapsing")); // for testing, prevent the user from collapsing the first child folder wxTreeItemId itemId = event.GetItem(); if ( IsTestItem(itemId) ) { wxMessageBox(wxT("You can't collapse this item.")); event.Veto(); } }*/ /*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event) { // show some info about this item wxTreeItemId itemId = event.GetItem(); OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId); if ( item != NULL ) { item->ShowInfo(this); } wxLogMessage(wxT("OnItemActivated")); }*/ void OPJMarkerTree::OnItemMenu(wxTreeEvent& event) { /*wxTreeItemId itemId = event.GetItem(); OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId) : NULL; wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc() : _T(""));*/ //wxLogMessage(wxT("EEEEEEEEEE")); //event.Skip(); } /*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event) { wxPoint pt = event.GetPosition(); wxTreeItemId item; wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y); // check if event was generated by keyboard (MSW-specific?) if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it) { if ( !HasFlag(wxTR_MULTIPLE) ) item = GetSelection(); // attempt to guess where to show the menu if ( item.IsOk() ) { // if an item was clicked, show menu to the right of it wxRect rect; GetBoundingRect(item, rect, true );// only the label pt = wxPoint(rect.GetRight(), rect.GetTop()); } else { pt = wxPoint(0, 0); } } else // event was generated by mouse, use supplied coords { pt = ScreenToClient(pt); item = HitTest(pt); } ShowMenu(item, pt); }*/ /*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt) { wxString title; if ( id.IsOk() ) { title << wxT("Menu for ") << GetItemText(id); } else { title = wxT("Menu for no particular item"); } #if wxUSE_MENUS wxMenu menu(title); menu.Append(TreeTest_About, wxT("&About...")); menu.AppendSeparator(); menu.Append(TreeTest_Highlight, wxT("&Highlight item")); menu.Append(TreeTest_Dump, wxT("&Dump")); PopupMenu(&menu, pt); #endif // wxUSE_MENUS }*/ /*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event) { wxTreeItemId itemId = event.GetItem(); OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId) : NULL; wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc() : _T("")); event.Skip(); }*/ /* void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event) { wxLogMessage(wxT("Right mouse button down")); event.Skip(); } void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event) { wxLogMessage(wxT("Right mouse button up")); event.Skip(); } void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event) { wxTreeItemId id = HitTest(event.GetPosition()); if ( !id ) wxLogMessage(wxT("No item under mouse")); else { OPJMarkerData *item = (OPJMarkerData *)GetItemData(id); if ( item ) wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc()); } event.Skip(); } */ static inline const wxChar *Bool2String(bool b) { return b ? wxT("") : wxT("not "); } void OPJMarkerData::ShowInfo(wxTreeCtrl *tree) { wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n") wxT("%u children (%u immediately under this item)."), m_desc.c_str(), Bool2String(tree->IsSelected(GetId())), Bool2String(tree->IsExpanded(GetId())), Bool2String(tree->IsBold(GetId())), unsigned(tree->GetChildrenCount(GetId())), unsigned(tree->GetChildrenCount(GetId(), false))); } openjpeg-1.5.2/applications/OPJViewer/source/readmeafter.txt0000644000175000017500000000267112315002075024021 0ustar mathieumathieuThis viewer is conceived to open and display information and image content of J2K, JP2, and MJ2 files. The viewer application interface is divided into three main panels: - a browsing pane; - a viewing pane; - a log/peek pane. The browsing pane will present the markers or boxes hierarchy, with position (byte number where marker/box starts and stops) and length information (i.e., inner length as signalled by marker/box and total length, with marker/box sign included), in the following form: filename | |_ #000: Marker/Box short name (Hex code) | | | |_ *** Marker/Box long name *** | |_ startbyte > stopbyte, inner_length + marker/box sign length (total length) | |_ Additional info, depending on the marker/box type | |_ ... | |_ #001: Marker/Box short name (Hex code) | | | |_ ... | ... The viewing pane will display the decoded image contained in the JPEG 2000 file. It should display correctly images as large as 4000x2000, provided that a couple of GB of RAM are available. Nothing is known about the display of larger sizes: let us know if you manage to get it working. The log/peek pane is shared among two different subpanels: - the log panel will report a lot of debugging info coming out from the wx GUI as well as from the openjpeg library - the peek pane tries to give a peek on the codestream/file portion which is currently selected in the browsing pane. It shows both hex and ascii values corresponding to the marker/box section. openjpeg-1.5.2/applications/OPJViewer/source/OPJAbout.cpp0000644000175000017500000000611612315002075023126 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita'  degli studi di Perugia (UPG), Italy * 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. */ #ifdef USE_MXF #include "mxflib/mxflib.h" #endif // USE_MXF #include "OPJViewer.h" // about window for the frame void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { #ifdef OPJ_HTMLABOUT #include "about_htm.h" #include "opj_logo.xpm" wxBoxSizer *topsizer; wxHtmlWindow *html; wxDialog dlg(this, wxID_ANY, wxString(_("About"))); wxMemoryFSHandler::AddFile(wxT("opj_logo.xpm"), wxBitmap(opj_logo), wxBITMAP_TYPE_XPM); topsizer = new wxBoxSizer(wxVERTICAL); html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(320, 250), wxHW_SCROLLBAR_NEVER); html->SetBorders(0); //html->LoadPage(wxT("about/about.htm")); //html->SetPage("Hello, world!"); html->SetPage(htmlaboutpage); html->SetSize(html->GetInternalRepresentation()->GetWidth(), html->GetInternalRepresentation()->GetHeight()); topsizer->Add(html, 1, wxALL, 10); topsizer->Add(new wxStaticLine(&dlg, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 10); wxButton *bu1 = new wxButton(&dlg, wxID_OK, wxT("OK")); bu1->SetDefault(); topsizer->Add(bu1, 0, wxALL | wxALIGN_RIGHT, 15); dlg.SetSizer(topsizer); topsizer->Fit(&dlg); dlg.ShowModal(); #else wxMessageBox(wxString::Format(OPJ_APPLICATION_TITLEBAR wxT("\n\n") wxT("Built with %s and OpenJPEG ") wxT(OPENJPEG_VERSION) wxT("\non ") wxT(__DATE__) wxT(", ") wxT(__TIME__) wxT("\nRunning under %s\n\n") OPJ_APPLICATION_COPYRIGHT, wxVERSION_STRING, wxGetOsDescription().c_str()), wxT("About ") OPJ_APPLICATION_NAME, wxOK | wxICON_INFORMATION, this ); #endif } openjpeg-1.5.2/applications/OPJViewer/source/build.h0000644000175000017500000000001412315002075022236 0ustar mathieumathieuwxT("491") openjpeg-1.5.2/applications/OPJViewer/source/OPJChild.ico0000644000175000017500000000206612315002075023067 0ustar mathieumathieu è&(( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõUUUUUUUUUUUU_õU_ÿÿÿÿÿÿÿÿÿÿ_õU_"""""""""/_õU_"""""""""/_õU_"""""""""/_õU_"""""""""/_õU_"""""""""/_õU_/ÿÿÿÿÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/™™™™Ÿ"""/_õU_/ÿÿÿÿÿ"""/_õU_"""""""""/_õU_ÿÿÿÿÿÿÿÿÿÿ_õUUUUUUUUUUUU_õUUUUUUUUUUUU_õUUUUUUUUUUUU_õUUUUUUUUUUUU_õUUUUUUUUUUUU_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðUUUUUUðUÿÿÿÿõðUò"""õðUò"""õðUò/ÿ"õðUò/Ÿ"õðUò/ÿ"õðUò"""õðUò"""õðUÿÿÿÿõðUUUUUUðUUUUUUðÿÿÿÿÿÿðÿÿ€€€€€€€€€€€€€€ÿÿopenjpeg-1.5.2/applications/OPJViewer/source/imagjpeg2000.h0000644000175000017500000001230412315002075023231 0ustar mathieumathieu/* * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy * 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. */ ///////////////////////////////////////////////////////////////////////////// // Name: imagalljpeg2000.h // Purpose: wxImage JPEG 2000 family file format handler // Author: G. Baruffa - based on imagjpeg.h, Vaclav Slavik // RCS-ID: $Id: imagalljpeg2000.h,v 0.0 2008/01/31 11:22:00 VZ Exp $ // Copyright: (c) Giuseppe Baruffa // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_IMAGJPEG2000_H_ #define _WX_IMAGJPEG2000_H_ #include "wx/defs.h" //----------------------------------------------------------------------------- // wxJPEG2000Handler //----------------------------------------------------------------------------- #if wxUSE_LIBOPENJPEG #include "wx/image.h" #include "libopenjpeg/openjpeg.h" #include "codec/index.h" #define wxBITMAP_TYPE_JPEG2000 50 class WXDLLEXPORT wxJPEG2000Handler: public wxImageHandler { public: inline wxJPEG2000Handler() { m_name = wxT("JPEG 2000 family file format"); m_extension = wxT("mj2"); m_type = wxBITMAP_TYPE_JPEG2000; m_mime = wxT("image/mj2"); /* decoding */ m_reducefactor = 0; m_qualitylayers = 0; m_components = 0; #ifdef USE_JPWL m_enablejpwl = true; m_expcomps = JPWL_EXPECTED_COMPONENTS; m_maxtiles = JPWL_MAXIMUM_TILES; #endif // USE_JPWL /* encoding */ m_subsampling = wxT("1,1"); m_origin = wxT("0,0"); m_rates = wxT("20,10,5"); m_quality = wxT("30,35,40"); m_enablequality = false; m_multicomp = false; m_irreversible = false; m_resolutions = 6; m_progression = 0; m_cbsize = wxT("32,32"); m_prsize = wxT("[128,128],[128,128]"); m_tsize = wxT(""); m_torigin = wxT("0,0"); /*m_progression m_resilience*/ m_enablesop = false; m_enableeph = false; m_enablereset = false; m_enablesegmark = false; m_enablevsc = false; m_enablerestart = false; m_enableerterm = false; m_enablebypass = false; /*m_roicompo m_roiup m_indexfname*/ m_enableidx = false; m_index = wxT("index.txt"); m_enablepoc = false; m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"); m_enablecomm = true; #if defined __WXMSW__ m_comment = wxT("Created by OPJViewer Win32 - OpenJPEG version "); #elif defined __WXGTK__ m_comment = wxT("Created by OPJViewer Lin32 - OpenJPEG version "); #else m_comment = wxT("Created by OPJViewer - OpenJPEG version "); #endif #ifdef USE_JPWL m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version()); #else m_comment += wxString::Format(wxT("%s"), (char *) opj_version()); #endif } // decoding engine parameters int m_reducefactor, m_qualitylayers, m_components, m_framenum; #ifdef USE_JPWL bool m_enablejpwl; int m_expcomps, m_maxtiles; #endif // USE_JPWL // encoding engine parameters wxString m_subsampling; wxString m_origin; wxString m_rates; wxString m_quality; bool m_enablequality; bool m_multicomp; bool m_irreversible; int m_resolutions; int m_progression; wxString m_cbsize; wxString m_prsize; wxString m_tsize; wxString m_torigin; /*m_progression m_resilience*/ bool m_enablesop; bool m_enableeph; bool m_enablebypass; bool m_enableerterm; bool m_enablerestart; bool m_enablereset; bool m_enablesegmark; bool m_enablevsc; /*m_roicompo m_roiup m_indexfname*/ bool m_enableidx; wxString m_index; bool m_enablecomm; wxString m_comment; bool m_enablepoc; wxString m_poc; #if wxUSE_STREAMS virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1); virtual bool SaveFile(wxImage *image, wxOutputStream& stream, bool verbose=true); protected: virtual bool DoCanRead(wxInputStream& stream); #endif private: OPJ_PROG_ORDER give_progression(char progression[4]); DECLARE_DYNAMIC_CLASS(wxJPEG2000Handler) }; #endif // wxUSE_LIBOPENJPEG #endif // _WX_IMAGJPEG2000_H_ openjpeg-1.5.2/applications/OPJViewer/source/icon2.xpm0000644000175000017500000000272012315002075022534 0ustar mathieumathieu/* XPM */ static const char *icon2_xpm[] = { /* columns rows colors chars-per-pixel */ "32 32 15 1", ". c Black", "O c #97C4E7", "$ c #63B3DE", "@ c #CAE1F3", "; c #7AC4E5", "* c #74A1BD", "+ c #619BC4", "o c #4B8EBF", " c None", "% c #54A6D8", "= c #FAFCFE", "& c #E9F3FA", "# c #76BAE2", "X c #C00000", "- c #87ABC3", /* pixels */ " ", " ", " ", " ", " ", " ............. ", " .XXXXXXXXXX.o. ", " .XXXXXXXXXX.O+. ", " .XXXXXXXXXX.@O+. ", " .XX##$$$$%$.&@O* ", " .XXXXXXXXXX.=&@O- ", " .XXXXXXXXXX...... ", " .XX;###$$$$$%%XX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XX;;;;###$$$$XX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XX;;;;;;;###$XX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XX;;;;;;;;;;#XX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXX. ", " ................. ", " ", " ", " ", " ", " " }; openjpeg-1.5.2/applications/OPJViewer/source/license.txt0000644000175000017500000000330112315002075023153 0ustar mathieumathieuCopyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium Copyright (c) 2002-2007, Professor Benoit Macq Copyright (c) 2001-2003, David Janssens Copyright (c) 2002-2003, Yannick Verschueren Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe Copyright (c) 2005, Herve Drolon, FreeImage Team Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditionsare 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.openjpeg-1.5.2/applications/OPJViewer/about/0000755000175000017500000000000012315072522020611 5ustar mathieumathieuopenjpeg-1.5.2/applications/OPJViewer/about/opj_logo.png0000644000175000017500000001454412315002076023134 0ustar mathieumathieu‰PNG  IHDRZEÊ(ñL pHYsÃÃÇo¨dIDATxœì›ytÔE¶Ç?½¤ÓÙ:éÎÚY:kg_zAv„EAÂ6ñ¹ ˆ€ãŒ8*â¨<6uÜP\ØDDPPA²ðÞ :êèè\ÊŸªâͦ ï7ù°)È{û*y}S!{Ç'2Íi!HéL¸®ÇuØ%lÝÀ®¡«qöïÑ×<î'³#f¢•$'ÞXù‹³XØä­¶0íG»@sˆ–ûXg£ð"NAB¥(Ý­ÈÖÑ:q:I]ÓIﮯyœšë”­ô±R.Äñψ±R¼$‹ëÛB¡A>ÝQÆ_ï/᥇Jyíé*>l qBý~(À«i ü@P)ɈóhpK(¯ô|4†=p!6Ìm‚nT?Ýv¨~ÝÍ¥N™"¾Ç퉒d§üär3÷@•!ÅOUq|p<ËŠ¢8ßÉÌ<'s‡»Y¾µ”?é›ÑÌ•@PŠ <ðYâu¤)tÞEP’|ž‚PGi&¤jcõ~©r ú<étÞp½$]Â{¤)¢£D'ÊËŸ™ÊÍ!>Qî­à%;ŒF£€Ñ)Œ¿£Fèù^n‚@9P ¤;A¶E@ª$!I~C öʾ:¼ÚX½ŸÈ4Í“)ǤblÝKêq¢É.¹°, p¹5Џ'+y·ÖÍ Aô(`ŒÄXIMA¾Pýoõó40´2‡íêùºn¾9{ZBüS×ïû+xgJ œJ›RfER½8“U‡¼÷-›ä“>nŠ„J ()fÜ‘  Óþ@ -³S¸b%oêBÐâë{Šx4/’ Fx4BØ{’heü:TPöx¯¨[SÀ#QVFÀá’ì:`´$û짪xWõÿ­ŸFù|ĶRŽulX¯Ñ6D[ü‰½üu ‹™@@"´ÑÏ-!>ïÊø ÓÞäÓY)\ ôz-òrE[XØ‹Æ ÿ8àƒ®ŒwsžåaŽE¬W©'BèzLª#†§CeåMACŠ®Íå`¨D-Bu(É œ} Š·5¢›€³€º=¼¬KSw¤µ†øê¬D.¶@3ž¬ä/Ýõ×¾í& Ð纮×~;q’q'R¸Ð*Ö«¤ºÇ‰ŽA/oƒŠ/`—:nÛËxÞ"¤x0XâL‰aÀH·IGB|¥2ÏË`ú„$®i‘ɳA>éæê €q6˜0=…5‡† øE6»mpÖ×=SÅ Óþh9o t±˜(1i]ûÔ˜GÊy³(Š9Iv&¬2ÞµÜÇV—‰À8`\˫๩_×ij¡¢2%Ùq¡ë1¢•4g…iôß\ÌÔÿ&Ÿ§1ˆ®ª%jä³á5ñ,mÑ\¼3ãY Ì^™Í¾V¹a7å󬦓$&×ÄsÅÞ Ž«qË|ìòؘum·Ê÷í,ãÅ™l]àå^‰Í[´ïÛQÆq¿“ù½cùycÿ9¦½-̉Šh.•SÔ×&pÍþJ>8¦ýp€ú¹˜ƒ0Ô>„m:¥DeGRý@)ÏiGs¿Ft50H¢!Õµu®nÕˆîïb¥ν1ÏðFVdó˜‰è)],ÙSÁßÔ¸¥>vd8˜{{!êÙ*ÞÛ\ÌÑ»‹h¾»ˆæ»ŠhÙWÁÑoæ;™7ÐÅŠ&ƒèo|‘ÌÃ8õ£<\ÿL@ÊCÞéëbÖ©&Ú…pyr€²â(Æn-5ôêjAtBM F“j œÙ+–ù[Ky¥-D{kˆo–d²ÓçFq僥‚– _õ‰c50 ˜ Ì´Á¹ç¥rßINSÏÏLà¦)ÉlRs?à‹Û yqmϯ-à9Ž­-àØB/[™—d²MªûJx1ÒÂ,` 09ÚÊôå>v(ø©æL£~~Â-tR¢ó"ñ`)/ªÅ>^Áë6éA Œa‡®N¶3nM>”4ï(ãÂ(~ÌíÇov—ó¾ô>ïÇ*à\Iö¬d;‹ÖæÓ&%°}S!Ètðóù^Rso+å-¿“+c¬\cåâ+ÿ¦aQŒ•æZaöª\ãô\Í»…Àd`R–ƒy;Ëx¡CxòØã¶3è§ :q™(ˉdØ¥üQ}ÔÁïFtC´/’É÷—ð{Õws1/ç8Y œWÏ-{+ù‡$ú33Ñé.¹³H,¾-Lûª<yì\¸0mê}[K9žéà `p!°Pb0˜ ̱[˜}s>mjÊÇ»…„ŠªÏu²à‰JþKS‡ÄÙè‡ð¿³‚ÖãDÇ!nd>9qx¤›yG‚|¦áÏ~[@ãâLî¾0 Wùؾ­”—õ‹Àò,vºíœ̶ÁÏÎ÷²µ%Ä7ê÷KøË„$n?;‘ Ë|ìn ï¿·˜—|‘\ ÌŸÈ:õÞÖ'Öùy¾6[û»¸aN*>^ÁûmaÚùâ/÷Y¡aŒ‡U«„þmñåp7×gc±S“¹Aœ÷êY€ðÕ ´d„­rô$ѼDŒ¢ÿ¹ìÒ ÜIü߯o/¢5ÑιÀT`Fj 7øiV}ùâH¯ÚBâr¢ßUÎßÂ1,EèÓ)Y‘\tG!ÇÔÜm!ÚøôP€ZåÆðùÒ,¶'Ú™aaâ^îU¿í«àµ@  Nàp ö’LîÑNÉKTeˆËY:ⲃð£{ìf¨n…¿²è{YZOrÁЈþò×¹l·HOhðErÑ–Ã;à“Æ.n„Òp=maÒGvÛ™s].O´j§ÁŒgªøxb·X¡Þi¥þ²LP¿í.çùŠÎEï¡ÀË}Æï÷sÌi¡âôæ înÉC^Á¡QBª+¾.#FzX¶ÌÇ–•9ì¹6—ýWç°g™- )ÜXÍ »œˆâYÀ9£<¬R¹·’¿×ÄóË^q¬¸,“Vd³sI÷Hàªäê7MEÊPÄst¢IõI¬^œÅæ_åðØ/²Ù>ßËÆ@ -âF:â°P[˼anV u³¢ Š@_à äÕ¼¿‹ó‡¹¹|˜›ÅXên"Y]Á#¥#ÚØÍ„õõÉ ½y†1<“Î>u Æõ¼îâ îStG!Ï9­L& ôæhIÒ`` Ðq…î-ÿì/ß9ƒ|}Þ9®¿BAù݈Èa™ %‘D/ƒJ=zýFN-'LAèj¿üØ0B:ÔMp°Dµ\ì:3±8‹‡Ñëý´!H‡0N#Ä BÜ!y*ÆÑG>(çT¨Öæí‹AraWª'±á¶•Å&bÄÆUºÍ…ˆ^ªà5•]é”'DXã<„t—ËTj‹QRR.ŸǵßüY}ž—µ—‚‚rl"ˆ•‡¯ÎC†Iä”`V$Ÿûå85ÆwV~¯ *Éà¡s>SÕ£ôx†Ee¾£îžáò¤#v?O.LGžöÜ¢Š\ý›4×p¸›‹0Žy±IÅr¬ üë|/FVÄœ$PÐ3&*a  f¨Ì9©gé{´©œ¡Jgé‰ÙT¹¨l„ôèPÏr1$¿4ÍÀÍ[šÀyu¦sz+ƒ,•ŽRY•ª2gTÒé>#£“iÎ+šó‹*³¢r†=.ͪ™K¿TÉA “£æD§±À„$f!ˆ÷#¤¶Tþé—Ï}¢RäxUá£Í+G×ÉV°8m|Œöž¨“@eãõò‡®²âßkøÞu#Šl¥·#å‡EÉ(¨+bâ%éÉáÙ>„ÞT‰Q¥J_¸šK½_'Ý¥!NûM‘­½Ï©½ÏÙÅ{»"^'½»:½¤Añc®W1oZ—Mß)õRpó"Ô‡Ç!$̓ÖtI®2LªÎÃ#û™‹j]Ì£*¥ÔfÆ™ðCˆ6 ™l½XÓLrWߪ¯ã{ý¿mººQ…z=†.}ºñ1¹è'D««Œ$¾]~ —$òmÕbV{]O¥s©C‚é»Õƺä{Ìzõ IÞŒ2¶:ñ?¨u¥Ûáf‰1W90$MmN‚¶s=GF nœ•{§<óèžL&B•eÓYµ©ñ^Œre‹tb•ÎŒ·‘WCðŒ8úWEŠ·‘‹a”zTÙõˆÀqGÓ‹#uÍÇÊ\§ú)Õ!¹f’Ó%Š$åéäÉ¿+²3éì3ë$«ñ9rŒB†1Ùè§@åd¾´ ‡»8>‰º T§Fà—óèu‡?*Ѫéú]×mºEVº®S}ŸÓBú’,nh“¤e<_EÂe,™œDý‘ _~W€ëP€®Ëå®òhF`\rJo/dÏwÕ±­”Ò±ê< ÀïdÀ/³Y0Àëmán^ß²¦¯Ÿ‹+wË ££aÚÇ$²Æ"ž%1hXO“"z[/:­4DZ˜zK>-êyKˆ¯R#¸hàäD×5c<\®g†.Ê`Ká:ˆÎp0îª6ÞUÌî{KØuy+ éA¢Í±å}¨?Bšó€R„w—ÑÒqäò8€8Ú“mÐð³46·Èr³½ü}‹UIv%ÙY”ÁÅåÑ\uMôúé)Üa…ÙeѬx¸ÄÐÏÏTñᆎ­+à÷ë øõ~ŽnðÓºÑOËF?MÓ“YmI‰á½b™¿³ŒWÛÄIøúò,~ç°0©2¬0:ÉÎÄ Ó2LÍp0%ÃÁÄ ã2ÔEY Ó9'ù£“¬È5ûËJ’SnS1P•ÉðÆ€Q1:#•ß!’¼ ©,ܤ%yø|s1¯ÞVÈ ·òÂEüigo+Üâįs8è¶³øW;çUuð_v“lKvoÌûýÚ * q´I±€‘б-_ÚZûii­b‡:­ôù'çä&!™š¤_rfþÄ»÷œ{ÿçÜsþß9- Ýø™OdÇÇ’þ×Ö§ÒÔF„±äÁT¾/­Œ×Kùs…“o"Fr=P—Á]{ó8v¤˜KGŠù•)¿®v±~²=ÒÎ.§#Œø™Ñ”V8Yà¥&9‚[Y™J êΞë pµ/À§?/ão'½üéH1¿iËâ˜ÛN bþ]cã¾í™¼&ï?\È{Y¾¬Ö˜mHÚT.põ@ƒ;œ¯?“Ï›òÞ.Ò"i6·Xt³µÇÇG=>>êõñ â_,çú³t'G0Î@˜±ªh9fjr¾PÂá^ïw{¹´"a¯ªÛ²9zA¡½G…Ñ"}ªrbÎøù´5£ó\tÌsñÔ\ßž=ƒÇ¼1lJdM¤Àï0•·2+’Öã7«”Ú¾|ÞIg ‚nºñÕ,‡Áy·Î”úøpBû ÔºÑéa U(ºÑü}cb¡r'[Êl©q³û¤WPå|¾1çÎÖ”(:ˆ/ŠÆ{ªLðÌçü£9™6DZk°°=——¥ÁÚÏåH'†€{NWÛ2N•q¥>žv”I·•Y_b* Éü¿yQlîõñm‘ˆg#°HÝŽ–Ø„Tôù)Úlw)°4-’uǼÂÖ(çÚCi<«): ž:ôMG.D0&õæjÏù…ÜëãJ›m@Ð ‹ãÙÖëS;Éàe›rFVéTk§‡†~êµü@:s¦Y ÐJd¿¼·ÏÏgkRøAœoÄÙYg§Ùeg¥ÛN“ÛÎÃNƒÛN}d˜°8œ6šÏæ„4 ßòsum ‡ ;!³ý&`yŒ•M7ñÔ›ÚbþÓR®ÌšÁýˆì¼1GO¨y'cVœdÎŒ¡®¯ŒÌ•ý_{ó8>wkB‰ìþªÇ:^õòÇâhd@”PÏp4Eל-ã×r±{i&ý¡DZÛsèìó ÿí ®÷øømY,­ˆÑ²ÌÆ×ú4gaSÏ£‹ùˆQ\‰b:$î0Xðh†švÆ#gý|rW»®mÁ#o”©Ý¦²ÿþ½BŽoJ§ý9?9ëç²µžn/¿/ˆ¢‘íÏEXY®ÉTt mƒ’Úxx½”õž7Wè/Nxyÿî$žqÚX†p‚v>K·þû[œ„P#Xî_”0ŒD"ŠŸníõ %¯xù°0š¥(pg¡+œe{ré>àëî® åü礗߭Mæ'š gÌ-z;³è0Ÿ±O@˜¶“¦èdSE•ó]<¸5“>‘É]¹t?–Å‹¡$ö•İ6L¹¿ó*;TU8y h°Ã”m±6f#>Çb„}š‰ÊˆÈ |Pd‡²j7[ƒO ö :‚O›Ò4x2h°;hðxР-h°}NEÙÑ´ÛSSµ;œÆzƒ›3x~W¯îÎ¥§-›c-Ét–ƲÁFcŒ¦j7;‚;s,2‚ô %@9኎FÌIƒ›C¿;œù7Ѻ:™Ž{RØ{gmQ¬b¨’%î5˔٨¸²º”{ÌeÚHæ%7è1_t6b±¬C,ž(«Aî™ü î©DŒÄ óï9æõ…n;Kl¾;™}Í)t®Hd/–u(‹eja®dèN7bðMXÑÍ;'CGµ$T+Í—Ê”/0¯KD¢_òß|„Û.SE**»2‘Šæâ£É9(VPï²%ª¦=RtîOÇ ¬ˆ~jBº¥ý,’Ԕ˔Öl·$ŽF:àÄzðÕhìœ[°f×­l‰ÎŠèŒ`‚&ÖŽµ2|:î&Ÿ{4BU¿ß ONú Ö×r³RLò­,Þx`DΖ Fz2Íh,I*kË:¬À¥•NÕïŸÒSmd±Æ§o$Vd4Js¬öFks´ƒ¬Fj<‡gÝèþñ<뤕±0ØÿG›ãiÿËÞ?]¦Ët™.ÓeºL—é2…心k.æX¤àIEND®B`‚openjpeg-1.5.2/applications/OPJViewer/about/about.htm0000644000175000017500000000260412315002076022434 0ustar mathieumathieu


OPJViewer v0.2 alpha
A JPEG 2000 image viewer
OpenJPEG
The OpenJPEG library is an open-source JPEG 2000 codec written in C language. In addition to the basic codec, various other features are under development, among them the JP2 and MJ2 (Motion JPEG 2000) file formats, an indexing tool useful for the JPIP protocol, JPWL-tools for error-resilience, ...
OpenJPEG is © 2002-2007 TELE - Université Catholique de Louvain
OPJViewer is also © 2005-2007 DSPLab - Università degli studi di Perugia
openjpeg-1.5.2/applications/JavaOpenJPEG/0000755000175000017500000000000012315072522020036 5ustar mathieumathieuopenjpeg-1.5.2/applications/JavaOpenJPEG/CMakeLists.txt0000644000175000017500000000360712315002075022600 0ustar mathieumathieu#JavaOpenJPEG/CMakeLists.txt # First thing define the common source: SET(openjpegjni_SRCS JavaOpenJPEGDecoder.c JavaOpenJPEG.c ${OPENJPEG_SOURCE_DIR}/applications/codec/index.c ${OPENJPEG_SOURCE_DIR}/applications/codec/convert.c #${OPENJPEG_SOURCE_DIR}/applications/common/color.c ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c ) # JNI binding: find_package(JNI REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) # required header file: include_directories( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ${OPENJPEG_SOURCE_DIR}/applications/common ${OPENJPEG_SOURCE_DIR}/applications/codec ) add_library(openjpegjni MODULE ${openjpegjni_SRCS} ) # Java module should not have a SONAME: set_property(TARGET openjpegjni PROPERTY NO_SONAME 1) TARGET_LINK_LIBRARIES(openjpegjni ${OPENJPEG_LIBRARY_NAME}) if(UNIX) target_link_libraries(openjpegjni m) endif() INSTALL(TARGETS openjpegjni EXPORT OpenJPEGTargets LIBRARY DESTINATION ${OPENJPEG_INSTALL_JNI_DIR} COMPONENT Libraries ) # build jar: FIND_PACKAGE(Java 1.5 REQUIRED) # javac, jar # build dep list: file(GLOB java_srcs "java-sources/org/openJpeg/*.java") # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes) # Build java ADD_CUSTOM_COMMAND( OUTPUT ${LIBRARY_OUTPUT_PATH}/openjpeg.jar COMMAND ${Java_JAVAC_EXECUTABLE} -sourcepath "${CMAKE_CURRENT_SOURCE_DIR}/java-sources" ${java_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes COMMAND ${Java_JAR_EXECUTABLE} cvf ${LIBRARY_OUTPUT_PATH}/openjpeg.jar org WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes DEPENDS ${java_srcs} COMMENT "javac *.java; jar cvf -> openjpeg.jar" ) # name the target ADD_CUSTOM_TARGET(OpenJPEGJavaJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/openjpeg.jar COMMENT "building openjpeg.jar" ) INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/openjpeg.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) openjpeg-1.5.2/applications/JavaOpenJPEG/java-sources/0000755000175000017500000000000012315072522022440 5ustar mathieumathieuopenjpeg-1.5.2/applications/JavaOpenJPEG/java-sources/org/0000755000175000017500000000000012315072522023227 5ustar mathieumathieuopenjpeg-1.5.2/applications/JavaOpenJPEG/java-sources/org/openJpeg/0000755000175000017500000000000012315072522024776 5ustar mathieumathieuopenjpeg-1.5.2/applications/JavaOpenJPEG/java-sources/org/openJpeg/OpenJPEGJavaDecoder.java0000644000175000017500000002166612315002075031307 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a. * 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. */ package org.openJpeg; import java.util.Vector; /** This class decodes one J2K codestream into an image (width + height + depth + pixels[], * using the OpenJPEG.org library. * To be able to log messages, the called must register a IJavaJ2KDecoderLogger object. */ public class OpenJPEGJavaDecoder { public interface IJavaJ2KDecoderLogger { public void logDecoderMessage(String message); public void logDecoderError(String message); } private static boolean isInitialized = false; // ===== decompression parameters =============> // These value may be changed for each image private String[] decoder_arguments = null; /** number of resolutions decompositions */ private int nbResolutions = -1; /** the quality layers */ private int[] layers = null; /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.

* We store in Java the 8 or 16 bpp version of the image while the decoder uses a 32 bpp version, because

    *
  • the storage capacity required is smaller *
  • the transfer Java <-- C will be faster *
  • the conversion byte/short ==> int will be done faster by the C *
*/ private byte[] image8 = null; /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/ private short[] image16 = null; /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */ private int[] image24 = null; /** Holds the J2K compressed bytecode to decode */ private byte compressedStream[] = null; /** Holds the compressed version of the index file, to be used by the decoder */ private byte compressedIndex[] = null; /** Width and Height of the image */ private int width = -1; private int height = -1; private int depth = -1; /** This parameter is never used in Java but is read by the C library to know the number of resolutions to skip when decoding, * i.e. if there are 5 resolutions and skipped=1 ==> decode until resolution 4. */ private int skippedResolutions = 0; private Vector loggers = new Vector(); public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName, IJavaJ2KDecoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError { this(openJPEGlibraryFullPathAndName); loggers.addElement(messagesAndErrorsLogger); } public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError { if (!isInitialized) { try { System.load(openJPEGlibraryFullPathAndName); isInitialized = true; } catch (Throwable t) { throw new ExceptionInInitializerError("OpenJPEG Java Decoder: probably impossible to find the C library"); } } } public void addLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) { loggers.addElement(messagesAndErrorsLogger); } public void removeLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) { loggers.removeElement(messagesAndErrorsLogger); } public int decodeJ2KtoImage() { if ((image16 == null || (image16 != null && image16.length != width*height)) && (depth==-1 || depth==16)) { image16 = new short[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image16 length = " + image16.length + " (" + width + " x " + height + ") "); } if ((image8 == null || (image8 != null && image8.length != width*height)) && (depth==-1 || depth==8)) { image8 = new byte[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image8 length = " + image8.length + " (" + width + " x " + height + ") "); } if ((image24 == null || (image24 != null && image24.length != width*height)) && (depth==-1 || depth==24)) { image24 = new int[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image24 length = " + image24.length + " (" + width + " x " + height + ") "); } String[] arguments = new String[0 + (decoder_arguments != null ? decoder_arguments.length : 0)]; int offset = 0; if (decoder_arguments != null) { for (int i=0; i // These value may be changed for each image private String[] encoder_arguments = null; /** number of resolutions decompositions */ private int nbResolutions = -1; /** the quality layers, expressed as compression rate */ private float[] ratioLayers = null; /** the quality layers, expressed as PSNR values. This variable, if defined, has priority over the ratioLayers variable */ private float[] psnrLayers = null; /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.

* We store the 8 or 16 bpp version of the original image while the encoder uses a 32 bpp version, because

    *
  • the storage capacity required is smaller *
  • the transfer Java --> C will be faster *
  • the conversion byte/short ==> int will be done faster by the C *
*/ private byte[] image8 = null; /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/ private short[] image16 = null; /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */ private int[] image24 = null; /** Holds the result of the compression, i.e. the J2K compressed bytecode */ private byte compressedStream[] = null; /** Holds the compressed stream length, which may be smaller than compressedStream.length if this byte[] is pre-allocated */ private long compressedStreamLength = -1; /** Holds the compressed version of the index file, returned by the encoder */ private byte compressedIndex[] = null; /** Width and Height of the image */ private int width = -1; private int height = -1; private int depth = -1; /** Tile size. We suppose the same size for the horizontal and vertical tiles. * If size == -1 ==> no tiling */ private int tileSize = -1; // <===== Compression parameters ============= private Vector loggers = new Vector(); public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName, IJavaJ2KEncoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError { this(openJPEGlibraryFullPathAndName); loggers.addElement(messagesAndErrorsLogger); } public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError { if (!isInitialized) { try { String absolutePath = (new File(openJPEGlibraryFullPathAndName)).getCanonicalPath(); System.load(absolutePath); isInitialized = true; } catch (Throwable t) { t.printStackTrace(); throw new ExceptionInInitializerError("OpenJPEG Java Encoder: probably impossible to find the C library"); } } } public void addLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) { loggers.addElement(messagesAndErrorsLogger); } public void removeLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) { loggers.removeElement(messagesAndErrorsLogger); } /** This method compresses the given image.

* It returns the compressed J2K codestream into the compressedStream byte[].

* It also returns the compression index as a compressed form, into the compressedIndex byte[].

* One of the image8, image16 or image24 arrays must be correctly initialized and filled.

* The width, height and depth variables must be correctly filled.

* The nbResolutions, nbLayers and if needed the float[] psnrLayers or ratioLayers must also be filled before calling this method. */ public void encodeImageToJ2K() { // Need to allocate / reallocate the compressed stream buffer ? (size = max possible size = original image size) if (compressedStream== null || (compressedStream.length != width*height*depth/8)) { logMessage("OpenJPEGJavaEncoder.encodeImageToJ2K: (re-)allocating " + (width*height*depth/8) + " bytes for the compressedStream"); compressedStream = new byte[width*height*depth/8]; } // Arguments = // - number of resolutions "-n 5" : 2 // - size of tile "-t 512,512" : 2 // // Image width, height, depth and pixels are directly fetched by C from the Java class int nbArgs = 2 + (tileSize == -1 ? 0 : 2) + (encoder_arguments != null ? encoder_arguments.length : 0); if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0] != 0) // If psnrLayers is defined and doesn't just express "lossless" nbArgs += 2; else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0) nbArgs += 2; String[] arguments = new String[nbArgs]; int offset = 0; arguments[offset] = "-n"; arguments[offset+1] = "" + nbResolutions; offset += 2; if (tileSize!= -1) { arguments[offset++] = "-t"; arguments[offset++] = "" + tileSize + "," + tileSize; } // If PSNR layers are defined, use them to encode the images if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0]!=-1) { arguments[offset++] = "-q"; String s = ""; for (int i=0; i0 && ratioLayers[0]!=0.0) { // Specify quality ratioLayers, as compression ratios arguments[offset++] = "-r"; String s = ""; for (int i=0; i /* Header for class org_openJpeg_OpenJPEGJavaDecoder */ #ifndef _Included_org_openJpeg_OpenJPEGJavaDecoder #define _Included_org_openJpeg_OpenJPEGJavaDecoder #ifdef __cplusplus extern "C" { #endif /* * Class: org_openJpeg_OpenJPEGJavaDecoder * Method: internalDecodeJ2KtoImage * Signature: ([Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage (JNIEnv *, jobject, jobjectArray); #ifdef __cplusplus } #endif #endif openjpeg-1.5.2/applications/JavaOpenJPEG/org_openJpeg_OpenJPEGJavaEncoder.h0000644000175000017500000000110412315002075026346 0ustar mathieumathieu/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class org_openJpeg_OpenJPEGJavaEncoder */ #ifndef _Included_org_openJpeg_OpenJPEGJavaEncoder #define _Included_org_openJpeg_OpenJPEGJavaEncoder #ifdef __cplusplus extern "C" { #endif /* * Class: org_openJpeg_OpenJPEGJavaEncoder * Method: internalEncodeImageToJ2K * Signature: ([Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K (JNIEnv *, jobject, jobjectArray); #ifdef __cplusplus } #endif #endif openjpeg-1.5.2/applications/JavaOpenJPEG/JavaOpenJPEGDecoder.c0000644000175000017500000006776012315002075023655 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2007, Patrick Piscaglia (Telemis) * 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 "openjpeg.h" #include "opj_getopt.h" #include "convert.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaDecoder.h" #ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include "format_defs.h" typedef struct callback_variables { JNIEnv *env; /** 'jclass' object used to call a Java method from the C */ jobject *jobj; /** 'jclass' object used to call a Java method from the C */ jmethodID message_mid; jmethodID error_mid; } callback_variables_t; typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; }img_fol_t; void decode_help_display() { fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "decoder:\n"); /* < \n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, BMP format\n"); fprintf(stdout," -i \n"); fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); fprintf(stdout," is identified based on its suffix.\n"); fprintf(stdout," -o \n"); fprintf(stdout," REQUIRED\n"); fprintf(stdout," Currently accepts PGM-files, PPM-files, PNM-files, PGX-files and\n"); fprintf(stdout," BMP-files. Binary data is written to the file (not ascii). If a PGX\n"); fprintf(stdout," filename is given, there will be as many output files as there are\n"); fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); fprintf(stdout," is given and there are more than one component, only the first component\n"); fprintf(stdout," will be written to the file.\n"); fprintf(stdout," -r \n"); fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); fprintf(stdout," -l \n"); fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); fprintf(stdout," are decoded.\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout," -W \n"); fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n"); fprintf(stdout," Options can be a comma separated list of tokens:\n"); fprintf(stdout," c, c=numcomps\n"); fprintf(stdout," numcomps is the number of expected components in the codestream\n"); fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); #endif /* USE_JPWL */ /* <d_name)==0 || strcmp("..",content->d_name)==0 ) continue; num_images++; } return num_images; } int load_images(dircnt_t *dirptr, char *imgdirpath){ DIR *dir; struct dirent* content; int i = 0; /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); if(!dir){ fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 1; }else { fprintf(stderr,"Folder opened successfully\n"); } while((content=readdir(dir))!=NULL){ if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; strcpy(dirptr->filename[i],content->d_name); i++; } return 0; } int get_file_format(char *filename) { unsigned int i; static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "j2k", "jp2", "jpt", "j2c" }; static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT }; char * ext = strrchr(filename, '.'); if (ext == NULL) return -1; ext++; if(ext) { for(i = 0; i < sizeof(format)/sizeof(*format); i++) { if(strnicmp(ext, extension[i], 3) == 0) { return format[i]; } } } return -1; } /* -------------------------------------------------------------------------- */ int parse_cmdline_decoder(int argc, char * const argv[], opj_dparameters_t *parameters,img_fol_t *img_fol) { /* parse the command line */ int totlen; opj_option_t long_option[]={ {"ImgDir",REQ_ARG, NULL ,'y'}, {"OutFor",REQ_ARG, NULL ,'O'}, }; /* UniPG>> */ const char optlist[] = "i:o:r:l:hx:" #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ ; /*for (i=0; iset_out_format = 0; reset_options_reading(); while (1) { int c = opj_getopt_long(argc, argv,optlist,long_option,totlen); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case J2K_CFMT: case JP2_CFMT: case JPT_CFMT: break; default: fprintf(stderr, "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", infile); return 1; } strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case PGX_DFMT: case PXM_DFMT: case BMP_DFMT: case TIF_DFMT: case RAW_DFMT: case TGA_DFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case PGX_DFMT: img_fol->out_format = "pgx"; break; case PXM_DFMT: img_fol->out_format = "ppm"; break; case BMP_DFMT: img_fol->out_format = "bmp"; break; case TIF_DFMT: img_fol->out_format = "tif"; break; case RAW_DFMT: img_fol->out_format = "raw"; break; case TGA_DFMT: img_fol->out_format = "raw"; break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat); return 1; break; } } break; /* ----------------------------------------------------- */ case 'r': /* reduce option */ { sscanf(opj_optarg, "%d", ¶meters->cp_reduce); } break; /* ----------------------------------------------------- */ case 'l': /* layering option */ { sscanf(opj_optarg, "%d", ¶meters->cp_layer); } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ decode_help_display(); return 1; /* ------------------------------------------------------ */ case 'y': /* Image Directory path */ { img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); if(img_fol->imgdirpath == NULL) return 1; strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ----------------------------------------------------- */ /* UniPG>> */ #ifdef USE_JPWL case 'W': /* activate JPWL correction */ { char *token = NULL; token = strtok(opj_optarg, ","); while(token != NULL) { /* search expected number of components */ if (*token == 'c') { static int compno; compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ if(sscanf(token, "c=%d", &compno) == 1) { /* Specified */ if ((compno < 1) || (compno > 256)) { fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); return 1; } parameters->jpwl_exp_comps = compno; } else if (!strcmp(token, "c")) { /* default */ parameters->jpwl_exp_comps = compno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); return 1; }; } /* search maximum number of tiles */ if (*token == 't') { static int tileno; tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ if(sscanf(token, "t=%d", &tileno) == 1) { /* Specified */ if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); return 1; } parameters->jpwl_max_tiles = tileno; } else if (!strcmp(token, "t")) { /* default */ parameters->jpwl_max_tiles = tileno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; parameters->jpwl_correct = true; fprintf(stdout, "JPWL correction capability activated\n"); fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); } break; #endif /* USE_JPWL */ /* < this option is not valid \"-%c %s\"\n",c, opj_optarg); break; } } /* No check for possible errors before the -i and -o options are of course not mandatory*/ return 0; }/* parse_cmdline_decoder() */ /* -------------------------------------------------------------------------- */ /** error callback returning the message to Java andexpecting a callback_variables_t client object */ void error_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->error_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } /** warning callback returning the message to Java andexpecting a callback_variables_t client object */ void warning_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->message_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } /** information callback returning the message to Java andexpecting a callback_variables_t client object */ void info_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->message_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } #define FAILS -1 #define OK 0 /* -------------------------------------------------------------------------- -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage(JNIEnv *env, jobject obj, jobjectArray javaParameters) { int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ const char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ opj_dparameters_t parameters; /* decompression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; FILE *fsrc = NULL; unsigned char *src = NULL; int file_length; int num_images; int i,j,imageno; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; int w,h; long min_value, max_value; short tempS; unsigned char tempUC, tempUC1, tempUC2; /* ==> Access variables to the Java member variables */ jsize arraySize; jclass cls; jobject object; jboolean isCopy; jfieldID fid; jbyteArray jba; jshortArray jsa; jintArray jia; jbyte *jbBody, *ptrBBody; jshort *jsBody, *ptrSBody; jint *jiBody, *ptrIBody; callback_variables_t msgErrorCallback_vars; /* <=== access variable to Java member variables */ int *ptr, *ptr1, *ptr2;/* <== To transfer the decoded image to Java */ jint retval = FAILS; /* configure the event callbacks */ 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; /* JNI reference to the calling class */ cls = (*env)->GetObjectClass(env, obj); /* Pointers to be able to call a Java method * for all the info and error messages */ msgErrorCallback_vars.env = env; msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V"); /* Get the String[] containing the parameters */ arraySize = (*env)->GetArrayLength(env, javaParameters); argc = (int) arraySize +1; argv = (const char **)malloc(argc*sizeof(char*)); if(argv == NULL) return FAILS; argv[0] = "ProgramName.exe";/* The program name: useless */ j=0; for (i=1; iGetObjectArrayElement(env, javaParameters, i-1); argv[i] = (*env)->GetStringUTFChars(env, object, &isCopy); } /*printf("C: decoder params = "); for (i=0; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); if(j == 1) goto fin; /* failure */ num_images=1; /* Get additional information from the Java object variables */ fid = (*env)->GetFieldID(env, cls,"skippedResolutions", "I"); parameters.cp_reduce = (short) (*env)->GetIntField(env, obj, fid); /*Decoding image one by one*/ for(imageno = 0; imageno < num_images ; imageno++) { image = NULL; fprintf(stderr,"\n"); /* read the input file and put it in memory into the 'src' object, if the -i option is given in JavaParameters. Implemented for debug purpose. */ /* -------------------------------------------------------------- */ if (parameters.infile && parameters.infile[0]!='\0') { /* printf("C: opening [%s]\n", parameters.infile); */ fsrc = fopen(parameters.infile, "rb"); if (!fsrc) { fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); goto fin; } fseek(fsrc, 0, SEEK_END); file_length = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); src = (unsigned char *) malloc(file_length); if(src == NULL) goto fin; fread(src, 1, file_length, fsrc); fclose(fsrc); /* printf("C: %d bytes read from file\n",file_length); */ } else { /* Preparing the transfer of the codestream from Java to C */ /* printf("C: before transfering codestream\n"); */ fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); jba = (*env)->GetObjectField(env, obj, fid); file_length = (*env)->GetArrayLength(env, jba); jbBody = (*env)->GetByteArrayElements(env, jba, &isCopy); src = (unsigned char*)jbBody; } /* decode the code-stream */ /* ---------------------- */ switch(parameters.decod_format) { case J2K_CFMT: { /* JPEG-2000 codestream */ /* 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, &msgErrorCallback_vars); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); goto fin; } /* close the byte stream */ opj_cio_close(cio); } break; case JP2_CFMT: { /* JPEG 2000 compressed image data */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JP2); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, &msgErrorCallback_vars); /* setup the decoder decoding parameters using the current image and user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); goto fin; } /* close the byte stream */ opj_cio_close(cio); } break; case JPT_CFMT: { /* JPEG 2000, JPIP */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JPT); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, &msgErrorCallback_vars); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); goto fin; } /* close the byte stream */ opj_cio_close(cio); } break; default: fprintf(stderr, "skipping file..\n"); continue; } /* free the memory containing the code-stream */ if (parameters.infile && parameters.infile[0]!='\0') { free(src); } else { (*env)->ReleaseByteArrayElements(env, jba, jbBody, 0); } src = NULL; /* create output image. If the -o parameter is given in the JavaParameters, write the decoded version into a file. Implemented for debug purpose. */ /* ---------------------------------- */ switch (parameters.cod_format) { case PXM_DFMT: /* PNM PGM PPM */ if (imagetopnm(image, parameters.outfile)) { fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case PGX_DFMT: /* PGX */ if(imagetopgx(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case BMP_DFMT: /* BMP */ if(imagetobmp(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; } /* ========= Return the image to the Java structure =============== */ #ifdef CHECK_THRESHOLDS printf("C: checking thresholds\n"); #endif /* First compute the real with and height, * in function of the resolutions decoded. */ /*--- wr = (image->comps[0].w + (1 << image->comps[0].factor) -1) >> image->comps[0].factor; hr = (image->comps[0].h + (1 << image->comps[0].factor) -1) >> image->comps[0].factor; ---*/ w = image->comps[0].w; h = image->comps[0].h; if (image->numcomps==3) { /* 3 components color image */ ptr = image->comps[0].data; ptr1 = image->comps[1].data; ptr2 = image->comps[2].data; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -128; max_value = 127; } else { min_value = 0; max_value = 255; } #endif /* Get the pointer to the Java structure where the data must be copied */ fid = (*env)->GetFieldID(env, cls,"image24", "[I"); jia = (*env)->GetObjectField(env, obj, fid); jiBody = (*env)->GetIntArrayElements(env, jia, 0); ptrIBody = jiBody; printf("C: transfering image24: %d int to Java pointer=%d\n",image->numcomps*w*h, ptrIBody); for (i=0; i max_value) tempUC=max_value; if (tempUC1 < min_value) tempUC1=min_value; else if (tempUC1 > max_value) tempUC1=max_value; if (tempUC2 < min_value) tempUC2=min_value; else if (tempUC2 > max_value) tempUC2=max_value; #endif *(ptrIBody++) = (int) ( (tempUC2<<16) + (tempUC1<<8) + tempUC ); } (*env)->ReleaseIntArrayElements(env, jia, jiBody, 0); } else { /* 1 component 8 or 16 bpp image */ ptr = image->comps[0].data; printf("C: before transfering a %d bpp image to java (length = %d)\n",image->comps[0].prec ,w*h); if (image->comps[0].prec<=8) { fid = (*env)->GetFieldID(env, cls,"image8", "[B"); jba = (*env)->GetObjectField(env, obj, fid); jbBody = (*env)->GetByteArrayElements(env, jba, 0); ptrBBody = jbBody; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -128; max_value = 127; } else { min_value = 0; max_value = 255; } #endif /* printf("C: transfering %d shorts to Java image8 pointer = %d\n", wr*hr,ptrSBody); */ for (i=0; i max_value) tempUC = max_value; #endif *(ptrBBody++) = tempUC; } (*env)->ReleaseByteArrayElements(env, jba, jbBody, 0); printf("C: image8 transfered to Java\n"); } else { fid = (*env)->GetFieldID(env, cls,"image16", "[S"); jsa = (*env)->GetObjectField(env, obj, fid); jsBody = (*env)->GetShortArrayElements(env, jsa, 0); ptrSBody = jsBody; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -32768; max_value = 32767; } else { min_value = 0; max_value = 65535; } printf("C: minValue = %d, maxValue = %d\n", min_value, max_value); #endif printf("C: transfering %d shorts to Java image16 pointer = %d\n", w*h,ptrSBody); for (i=0; i max_value) { printf("C: value %d truncated to %d\n", tempS, max_value); tempS = max_value; } #endif *(ptrSBody++) = tempS; } (*env)->ReleaseShortArrayElements(env, jsa, jsBody, 0); printf("C: image16 completely filled\n"); } } /* free remaining structures */ if(dinfo) { opj_destroy_decompress(dinfo); } /* free image data structure */ opj_image_destroy(image); } retval = OK; fin: free(argv); return retval; } /* end main MAIN */ openjpeg-1.5.2/applications/JavaOpenJPEG/JavaOpenJPEG.c0000644000175000017500000021616112315002075022356 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2007, Patrick Piscaglia (Telemis) * 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 "openjpeg.h" #include "opj_getopt.h" #include "convert.h" #include "index.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaEncoder.h" #ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include "format_defs.h" #define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ #define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ #define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/ extern int get_file_format(char *filename); extern void error_callback(const char *msg, void *client_data); extern void warning_callback(const char *msg, void *client_data); extern void info_callback(const char *msg, void *client_data); typedef struct callback_variables { JNIEnv *env; /** 'jclass' object used to call a Java method from the C */ jobject *jobj; /** 'jclass' object used to call a Java method from the C */ jmethodID message_mid; jmethodID error_mid; } callback_variables_t; typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; /** User specified rate stored in case of cinema option*/ float *rates; }img_fol_t; void encode_help_display() { fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "encoder:\n"); /* <> */ #ifdef USE_JPWL fprintf(stdout," * No JPWL protection\n"); #endif /* USE_JPWL */ /* < \n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA formats\n"); fprintf(stdout,"\n"); fprintf(stdout,"-i : source file (-i source.pnm also *.pgm, *.ppm, *.bmp, *.tif, *.raw, *.tga) \n"); fprintf(stdout," When using this option -o must be used\n"); fprintf(stdout,"\n"); fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters:\n"); fprintf(stdout,"\n"); fprintf(stdout,"-h : display the help information \n "); fprintf(stdout,"\n"); fprintf(stdout,"-cinema2K : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n"); fprintf(stdout," Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); fprintf(stdout,"\n"); fprintf(stdout,"-cinema4K : Digital Cinema 4K profile compliant codestream for 4K resolution \n"); fprintf(stdout," Frames per second not required. Default value is 24fps\n"); fprintf(stdout,"\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,"\n"); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\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"); fprintf(stdout,"-n : number of resolutions (-n 3) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-b : size of code block (-b 32,32) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-t : size of tile (-t 512,512) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); fprintf(stdout,"\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,"\n"); fprintf(stdout,"-POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n"); fprintf(stdout," Example: T1=0,0,1,5,3,CPRL \n"); fprintf(stdout," : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n"); fprintf(stdout,"\n"); fprintf(stdout,"-SOP : write SOP marker before each packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); fprintf(stdout,"\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,"\n"); fprintf(stdout,"-TP : devide packets of every tile into tile-parts (-TP R) [R, L, C]\n"); fprintf(stdout,"\n"); fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout,"\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,"\n"); fprintf(stdout,"-d : offset of the origin of the image (-d 150,300) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); fprintf(stdout," NOTICE: currently supports only RPCL order\n"); fprintf(stdout,"\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout,"-W : adoption of JPWL (Part 11) capabilities (-W params)\n"); fprintf(stdout," The parameters can be written and repeated in any order:\n"); fprintf(stdout," [h<=type>,s<=method>,a=,...\n"); fprintf(stdout," ...,z=,g=,p<=type>]\n"); fprintf(stdout,"\n"); fprintf(stdout," h selects the header error protection (EPB): 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main and tile headers\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," p selects the packet error protection (EEP/UEP with EPBs)\n"); fprintf(stdout," to be applied to raw data: 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); fprintf(stdout," if 'tilepart:pack' is present, it applies from that tile\n"); fprintf(stdout," and that packet onwards, up to the next packet spec\n"); fprintf(stdout," or to the last packet in the last tilepart in the stream\n"); fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); fprintf(stdout,"\n"); fprintf(stdout," s enables sensitivity data insertion (ESD): 'method' can be\n"); fprintf(stdout," [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n"); fprintf(stdout," 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main header only\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," g determines the addressing mode: can be\n"); fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); fprintf(stdout,"\n"); fprintf(stdout," a determines the size of data addressing: can be\n"); fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); fprintf(stdout,"\n"); fprintf(stdout," z determines the size of sensitivity values: can be\n"); fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); fprintf(stdout," means\n"); fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n"); fprintf(stdout," relative sensitivity ESD for MH,\n"); fprintf(stdout," TSE ESD from TPH 0 to TPH 2, byte range with automatic\n"); fprintf(stdout," size of addresses and 1 byte for each sensitivity value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,s,p\n"); fprintf(stdout," means\n"); fprintf(stdout," default protection to headers (MH and TPHs) as well as\n"); fprintf(stdout," data packets, one ESD in MH\n"); fprintf(stdout,"\n"); fprintf(stdout," N.B.: use the following recommendations when specifying\n"); fprintf(stdout," the JPWL parameters list\n"); fprintf(stdout," - when you use UEP, always pair the 'p' option with 'h'\n"); fprintf(stdout," \n"); #endif /* USE_JPWL */ /* < * Get logarithm of an integer and round downwards. * */ int int_floorlog2(int a) { int l; for (l=0; a>1; l++) { a>>=1; } return l; } static int initialise_4K_poc(opj_poc_t *POC, int numres){ POC[0].tile = 1; POC[0].resno0 = 0; POC[0].compno0 = 0; POC[0].layno1 = 1; POC[0].resno1 = numres-1; POC[0].compno1 = 3; POC[0].prg1 = CPRL; POC[1].tile = 1; POC[1].resno0 = numres-1; POC[1].compno0 = 0; POC[1].layno1 = 1; POC[1].resno1 = numres; POC[1].compno1 = 3; POC[1].prg1 = CPRL; return 2; } void cinema_parameters(opj_cparameters_t *parameters){ parameters->tile_size_on = OPJ_FALSE; parameters->cp_tdx=1; parameters->cp_tdy=1; /*Tile part*/ parameters->tp_flag = 'C'; parameters->tp_on = 1; /*Tile and Image shall be at (0,0)*/ parameters->cp_tx0 = 0; parameters->cp_ty0 = 0; parameters->image_offset_x0 = 0; parameters->image_offset_y0 = 0; /*Codeblock size= 32*32*/ parameters->cblockw_init = 32; parameters->cblockh_init = 32; parameters->csty |= 0x01; /*The progression order shall be CPRL*/ parameters->prog_order = CPRL; /* No ROI */ parameters->roi_compno = -1; parameters->subsampling_dx = 1; parameters->subsampling_dy = 1; /* 9-7 transform */ parameters->irreversible = 1; } void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){ int i; float temp_rate; opj_poc_t *POC = NULL; switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA2K_48: if(parameters->numresolution > 6){ parameters->numresolution = 6; } if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){ fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3" "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } break; case CINEMA4K_24: if(parameters->numresolution < 1){ parameters->numresolution = 1; }else if(parameters->numresolution > 7){ parameters->numresolution = 7; } if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){ fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution); break; } switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA4K_24: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_24_CS ){ parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_24_CS; break; case CINEMA2K_48: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_48_CS ){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_48_CS; break; } parameters->cp_disto_alloc = 1; } /* ------------------------------------------------------------------------------------ */ int parse_cmdline_encoder(int argc, char * const argv[], opj_cparameters_t *parameters, img_fol_t *img_fol, char *indexfilename) { int i, j,totlen; opj_option_t long_option[]={ {"cinema2K",REQ_ARG, NULL ,'w'}, {"cinema4K",NO_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'z'}, {"TP",REQ_ARG, NULL ,'u'}, {"SOP",NO_ARG, NULL ,'S'}, {"EPH",NO_ARG, NULL ,'E'}, {"OutFor",REQ_ARG, NULL ,'O'}, {"POC",REQ_ARG, NULL ,'P'}, {"ROI",REQ_ARG, NULL ,'R'}, {"jpip",NO_ARG, NULL, 'J'} }; /* parse the command line */ /* UniPG>> */ const char optlist[] = "i:o:hr:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J" #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ ; /*printf("C: parse_cmdline_encoder:"); for (i=0; iset_out_format=0; reset_options_reading(); while (1) { int c = opj_getopt_long(argc, argv, optlist,long_option,totlen); if (c == -1) break; switch (c) { /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: img_fol->out_format = opj_optarg; break; default: fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); return 1; } } break; /* ----------------------------------------------------- */ case 'r': /* rates rates/distorsion */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_disto_alloc = 1; } break; /* ----------------------------------------------------- */ case 'q': /* add fixed_quality */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } 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; char *s = opj_optarg; sscanf(s, "%d", &numlayers); s++; if (numlayers > 9) s++; parameters->tcp_numlayers = numlayers; numresolution = parameters->numresolution; matrix_width = numresolution * 3; parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); if(parameters->cp_matrice == NULL) return 1; s = s + 2; for (i = 0; i < numlayers; i++) { row = ¶meters->cp_matrice[i * matrix_width]; col = row; 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++; } parameters->cp_fixed_alloc = 1; } break; /* ----------------------------------------------------- */ case 't': /* tiles */ { sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); parameters->tile_size_on = OPJ_TRUE; } break; /* ----------------------------------------------------- */ case 'n': /* resolution */ { sscanf(opj_optarg, "%d", ¶meters->numresolution); } break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; char *s = opj_optarg; do { sep = 0; sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], ¶meters->prch_init[res_spec], &sep); parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); parameters->res_spec = res_spec; } break; /* ----------------------------------------------------- */ case 'b': /* code-block dimension */ { int cblockw_init = 0, cblockh_init = 0; sscanf(opj_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; } parameters->cblockw_init = cblockw_init; parameters->cblockh_init = cblockh_init; } break; /* ----------------------------------------------------- */ case 'x': /* creation of index file */ { char *index = opj_optarg; strncpy(indexfilename, index, OPJ_PATH_LEN); } break; /* ----------------------------------------------------- */ case 'p': /* progression order */ { char progression[4]; strncpy(progression, opj_optarg, 4); parameters->prog_order = give_progression(progression); if (parameters->prog_order == -1) { fprintf(stderr, "Unrecognized progression order " "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); return 1; } } break; /* ----------------------------------------------------- */ case 's': /* subsampling factor */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, ¶meters->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(opj_optarg, "%d,%d", ¶meters->image_offset_x0, ¶meters->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 */ encode_help_display(); return 1; /* ----------------------------------------------------- */ 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 = opj_optarg; POC = 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++; } parameters->numpocs = numpocs; } break; /* ------------------------------------------------------ */ case 'S': /* SOP marker */ { parameters->csty |= 0x02; } break; /* ------------------------------------------------------ */ case 'E': /* EPH marker */ { parameters->csty |= 0x04; } break; /* ------------------------------------------------------ */ case 'M': /* Mode switch pas tous au point !! */ { int value = 0; if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 5; i++) { int cache = value & (1 << i); if (cache) parameters->mode |= (1 << i); } } } break; /* ------------------------------------------------------ */ case 'R': /* ROI */ { if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); return 1; } } break; /* ------------------------------------------------------ */ case 'T': /* Tile offset */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); return 1; } } break; /* ------------------------------------------------------ */ case 'C': /* add a comment */ { parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); if(parameters->cp_comment == NULL) return 1; if(parameters->cp_comment) { strcpy(parameters->cp_comment, opj_optarg); } } break; /* ------------------------------------------------------ */ case 'I': /* reversible or not */ { parameters->irreversible = 1; } break; /* ------------------------------------------------------ */ case 'u': /* Tile part generation*/ { parameters->tp_flag = opj_optarg[0]; parameters->tp_on = 1; } break; /* ------------------------------------------------------ */ case 'z': /* Image Directory path */ { img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); if(img_fol->imgdirpath == NULL) return 1; strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ------------------------------------------------------ */ case 'w': /* Digital Cinema 2K profile compliance*/ { int fps=0; sscanf(opj_optarg,"%d",&fps); if(fps == 24){ parameters->cp_cinema = CINEMA2K_24; }else if(fps == 48 ){ parameters->cp_cinema = CINEMA2K_48; }else { fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); return 1; } fprintf(stdout,"CINEMA 2K compliant codestream\n"); parameters->cp_rsiz = CINEMA2K; } break; /* ------------------------------------------------------ */ case 'y': /* Digital Cinema 4K profile compliance*/ { parameters->cp_cinema = CINEMA4K_24; fprintf(stdout,"CINEMA 4K compliant codestream\n"); parameters->cp_rsiz = CINEMA4K; } break; /* ------------------------------------------------------ */ /* UniPG>> */ #ifdef USE_JPWL /* ------------------------------------------------------ */ case 'W': /* JPWL capabilities switched on */ { char *token = NULL; int hprot, pprot, sens, addr, size, range; /* we need to enable indexing */ if (!indexfilename) { strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); } /* search for different protection methods */ /* break the option in comma points and parse the result */ token = strtok(opj_optarg, ","); while(token != NULL) { /* search header error protection method */ if (*token == 'h') { static int tile = 0, tilespec = 0, lasttileno = 0; hprot = 1; /* predefined method */ if(sscanf(token, "h=%d", &hprot) == 1) { /* Main header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); return 1; } parameters->jpwl_hprot_MH = hprot; } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { /* Tile part header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if(sscanf(token, "h%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "h")) { /* Main header, unspecified */ parameters->jpwl_hprot_MH = hprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search packet error protection method */ if (*token == 'p') { static int pack = 0, tile = 0, packspec = 0, lastpackno = 0; pprot = 1; /* predefined method */ if (sscanf(token, "p=%d", &pprot) == 1) { /* Method for all tiles and all packets */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); return 1; } parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { /* method specified from that tile on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { /* method fully specified from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { /* default method from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d", &tile) == 1) { /* default from a tile on */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (!strcmp(token, "p")) { /* all default */ parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search sensitivity method */ if (*token == 's') { static int tile = 0, tilespec = 0, lasttileno = 0; sens = 0; /* predefined: relative error */ if(sscanf(token, "s=%d", &sens) == 1) { /* Main header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens); return 1; } parameters->jpwl_sens_MH = sens; } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) { /* Tile part header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = sens; } } else if(sscanf(token, "s%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "s")) { /* Main header, unspecified */ parameters->jpwl_sens_MH = sens; } else { fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token); return 1; }; parameters->jpwl_sens_size = 2; /* 2 bytes for default size */ } /* search addressing size */ if (*token == 'a') { static int tile = 0, tilespec = 0, lasttileno = 0; addr = 0; /* predefined: auto */ if(sscanf(token, "a=%d", &addr) == 1) { /* Specified */ if ((addr != 0) && (addr != 2) && (addr != 4)) { fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr); return 1; } parameters->jpwl_sens_addr = addr; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_addr = addr; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token); return 1; }; } /* search sensitivity size */ if (*token == 'z') { static int tile = 0, tilespec = 0, lasttileno = 0; size = 1; /* predefined: 1 byte */ if(sscanf(token, "z=%d", &size) == 1) { /* Specified */ if ((size != 0) && (size != 1) && (size != 2)) { fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size); return 1; } parameters->jpwl_sens_size = size; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_size = size; /* 1 for default size */ } else { fprintf(stderr, "ERROR -> invalid size selection = %s\n", token); return 1; }; } /* search range method */ if (*token == 'g') { static int tile = 0, tilespec = 0, lasttileno = 0; range = 0; /* predefined: 0 (packet) */ if(sscanf(token, "g=%d", &range) == 1) { /* Specified */ if ((range < 0) || (range > 3)) { fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range); return 1; } parameters->jpwl_sens_range = range; } else if (!strcmp(token, "g")) { /* default */ parameters->jpwl_sens_range = range; } else { fprintf(stderr, "ERROR -> invalid range selection = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; /* some info */ fprintf(stdout, "Info: JPWL capabilities enabled\n"); parameters->jpwl_epc_on = true; } break; #endif /* USE_JPWL */ /* <jpip_on = OPJ_TRUE; } break; /* ------------------------------------------------------ */ default: fprintf(stderr, "ERROR -> Command line not valid\n"); return 1; } } /* check for possible errors */ if (parameters->cp_cinema){ if(parameters->tcp_numlayers > 1){ parameters->cp_rsiz = STD_RSIZ; fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n"); } } if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ 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 (parameters->tcp_numlayers == 0) { parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ parameters->tcp_numlayers++; parameters->cp_disto_alloc = 1; } if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) { fprintf(stderr, "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0); return 1; } for (i = 0; i < parameters->numpocs; i++) { if (parameters->POC[i].prg == -1) { fprintf(stderr, "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", i + 1); } } return 0; } /** Create the same index as j2k_create_index does, but in an int[] instead of in a file ==> easy to pass it back to Java, to transfer it etc. @param buffer_size, increased by the length of the compressed index, in number of bytes @return a pointer to a char[] Syntax of the index: one char for the version number (1): one byte because no problem with little endian, big endian etc. one int for each of the following informations: Image Width Image Height progression order Tile width Tile height Nb tiles in X Nb tiles in Y Nb of components Nb of layers Nb of resolutions for each resolution: Precinct width Precinct height End main header position codestream size For each tile: tile number tile start pos in codestream tile header end position tile end position in codestream For each LRCP, RLCP etc.: packet number tile number layer number resolution number component number precinct number start position in the codestream end position of this packet */ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer_size) { int tileno, compno, layno, resno, precno, pack_nb, x, y; char* buffer = NULL; int buffer_pos = 0; int prec_max = 0; prec_max = 0; for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { for (resno = 0; resno < cstr_info->numdecompos[0] + 1; resno++) { prec_max = max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]); } } /* Compute the size of the index buffer, in number of bytes*/ *buffer_size = 1 /* version */ + (10 /* image_w until decomposition */ + (cstr_info->numdecompos[0]+1) * 2 /* pdx size for each tile */ + 2 /* main_head_end + codestream_size */ + cstr_info->tw * cstr_info->th * 4 /* tile info, without distorsion info */ + cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8 ) * sizeof(int); /*printf("C: index buffer size = %d bytes\n", *buffer_size); */ buffer = (char*) malloc(*buffer_size); if (!buffer) { /* opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size); */ fprintf(stderr, "failed to allocate index buffer for writing %d int\n", *buffer_size); return 0; } buffer[0] = 1; /* Version stored on a byte */ buffer++; /* Remaining informations are stored on a int. */ ((int*)buffer)[buffer_pos++] = cstr_info->image_w; ((int*)buffer)[buffer_pos++] = cstr_info->image_h; ((int*)buffer)[buffer_pos++] = cstr_info->prog; ((int*)buffer)[buffer_pos++] = cstr_info->tile_x; ((int*)buffer)[buffer_pos++] = cstr_info->tile_y; ((int*)buffer)[buffer_pos++] = cstr_info->tw; ((int*)buffer)[buffer_pos++] = cstr_info->th; ((int*)buffer)[buffer_pos++] = cstr_info->numcomps; ((int*)buffer)[buffer_pos++] = cstr_info->numlayers; ((int*)buffer)[buffer_pos++] = cstr_info->numdecompos[0]; for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { /* based on tile 0 */ ((int*)buffer)[buffer_pos++] = (1 << cstr_info->tile[0].pdx[resno]); ((int*)buffer)[buffer_pos++] = (1 << cstr_info->tile[0].pdx[resno]); } ((int*)buffer)[buffer_pos++] = cstr_info->main_head_end; ((int*)buffer)[buffer_pos++] = cstr_info->codestream_size; for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].tileno; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].start_pos; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].end_header; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].end_pos; } for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { int start_pos, end_pos; int max_numdecompos = 0; pack_nb = 0; for (compno = 0; compno < cstr_info->numcomps; compno++) { if (max_numdecompos < cstr_info->numdecompos[compno]) max_numdecompos = cstr_info->numdecompos[compno]; } if (cstr_info->prog == LRCP) { /* LRCP */ for (layno = 0; layno < cstr_info->numlayers; layno++) { for (resno = 0; resno < max_numdecompos + 1; resno++) { for (compno = 0; compno < cstr_info->numcomps; compno++) { int prec_max; if (resno > cstr_info->numdecompos[compno]) break; prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; for (precno = 0; precno < prec_max; precno++) { start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } } } } /* LRCP */ else if (cstr_info->prog == RLCP) { /* RLCP */ for (resno = 0; resno < max_numdecompos + 1; resno++) { for (layno = 0; layno < cstr_info->numlayers; layno++) { for (compno = 0; compno < cstr_info->numcomps; compno++) { int prec_max; if (resno > cstr_info->numdecompos[compno]) break; prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; for (precno = 0; precno < prec_max; precno++) { start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } } } } /* RLCP */ else if (cstr_info->prog == RPCL) { /* RPCL */ for (resno = 0; resno < max_numdecompos + 1; resno++) { /* I suppose components have same XRsiz, YRsiz */ int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; int x1 = x0 + cstr_info->tile_x; int y1 = y0 + cstr_info->tile_y; for (compno = 0; compno < cstr_info->numcomps; compno++) { int prec_max; if (resno > cstr_info->numdecompos[compno]) break; prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; for (precno = 0; precno < prec_max; precno++) { int pcnx = cstr_info->tile[tileno].pw[resno]; int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; int precno_y = (int) floor( (float)precno/(float)pcnx ); for(y = y0; y < y1; y++) { if (precno_y*pcy == y ) { for (x = x0; x < x1; x++) { if (precno_x*pcx == x ) { for (layno = 0; layno < cstr_info->numlayers; layno++) { start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* compno */ } /* resno */ } /* RPCL */ else if (cstr_info->prog == PCRL) { /* PCRL */ /* I suppose components have same XRsiz, YRsiz */ int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; int x1 = x0 + cstr_info->tile_x; int y1 = y0 + cstr_info->tile_y; for (compno = 0; compno < cstr_info->numcomps; compno++) { for (resno = 0; resno < max_numdecompos + 1; resno++) { int prec_max; if (resno > cstr_info->numdecompos[compno]) break; prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; for (precno = 0; precno < prec_max; precno++) { int pcnx = cstr_info->tile[tileno].pw[resno]; int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; int precno_y = (int) floor( (float)precno/(float)pcnx ); for(y = y0; y < y1; y++) { if (precno_y*pcy == y ) { for (x = x0; x < x1; x++) { if (precno_x*pcx == x ) { for (layno = 0; layno < cstr_info->numlayers; layno++) { start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* resno */ } /* compno */ } /* PCRL */ else { /* CPRL */ for (compno = 0; compno < cstr_info->numcomps; compno++) { /* I suppose components have same XRsiz, YRsiz */ int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x; int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y; int x1 = x0 + cstr_info->tile_x; int y1 = y0 + cstr_info->tile_y; for (resno = 0; resno < max_numdecompos + 1; resno++) { int prec_max; if (resno > cstr_info->numdecompos[compno]) break; prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]; for (precno = 0; precno < prec_max; precno++) { int pcnx = cstr_info->tile[tileno].pw[resno]; int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno ); int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno ); int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx; int precno_y = (int) floor( (float)precno/(float)pcnx ); for(y = y0; y < y1; y++) { if (precno_y*pcy == y ) { for (x = x0; x < x1; x++) { if (precno_x*pcx == x ) { for (layno = 0; layno < cstr_info->numlayers; layno++) { start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* resno */ } /* compno */ } /* CPRL */ } /* tileno */ if (buffer_pos > *buffer_size) { /* opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); */ fprintf(stderr, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); return 0; } return --buffer; } /* -------------------------------------------------------------------------- ------------ Get the image byte[] from the Java object -------------------*/ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, jclass cls) { int i,max,shift,w,h,depth; opj_image_t * img = NULL; int compno, numcomps; opj_image_t * image = NULL; opj_image_comp_t *comp; opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ OPJ_COLOR_SPACE color_space; jfieldID fid; jint ji; jbyteArray jba; jshortArray jsa; jintArray jia; int len; jbyte *jbBody; jshort *jsBody; jint *jiBody; jboolean isCopy; /* Image width, height and depth */ fid = (*env)->GetFieldID(env, cls,"width", "I"); ji = (*env)->GetIntField(env, obj, fid); w = ji; fid = (*env)->GetFieldID(env, cls,"height", "I"); ji = (*env)->GetIntField(env, obj, fid); h = ji; fid = (*env)->GetFieldID(env, cls,"depth", "I"); ji = (*env)->GetIntField(env, obj, fid); depth = ji; /* Read the image */ if (depth <=16) { numcomps = 1; color_space = CLRSPC_GRAY; } else { numcomps = 3; color_space = CLRSPC_SRGB; } memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); if (numcomps == 1) { cmptparm[0].x0 = parameters->image_offset_x0; cmptparm[0].y0 = parameters->image_offset_y0; cmptparm[0].w = !cmptparm[0].x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm[0].x0 + (w - 1) * parameters->subsampling_dx + 1; cmptparm[0].h = !cmptparm[0].y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm[0].y0 + (h - 1) * parameters->subsampling_dy + 1; /* Java types are always signed but we use them as unsigned types * (shift of the negative part of the pixels of the images in * Telemis before entering the encoder). */ cmptparm[0].sgnd = 0; if (depth<=16) cmptparm[0].prec=depth; else cmptparm[0].prec = 8; cmptparm[0].bpp = cmptparm[0].prec; cmptparm[0].dx = parameters->subsampling_dx; cmptparm[0].dy = parameters->subsampling_dy; /*printf("C: component 0 initialised: x0=%d, y0=%d, w=%d, h=%d, sgnd=%d, bpp=%d, dx=%d, dy=%d, color_space=%d\n", cmptparm[0].x0, cmptparm[0].y0, cmptparm[0].w, cmptparm[0].h, cmptparm[0].sgnd, cmptparm[0].bpp, cmptparm[0].dx, cmptparm[0].dy, color_space);*/ } else { for(i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = parameters->subsampling_dx; cmptparm[i].dy = parameters->subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if (!image) return NULL; if (depth <=16) { image->numcomps=1; } else { image->numcomps = 3; } /* set image offset and reference grid */ image->x0 = cmptparm[0].x0; image->y0 = cmptparm[0].x0; image->x1 = cmptparm[0].w; image->y1 = cmptparm[0].h; /* set image data */ for (compno=0; compnocomps[compno]; max = -100000; if (depth == 8) { fid = (*env)->GetFieldID(env, cls,"image8", "[B");/* byteArray []*/ jba = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jba); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, &isCopy); /* printf("C: before transfering 8 bpp image\n"); */ if (comp->sgnd) { for(i=0; i< len;i++) { comp->data[i] = (char) jbBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = (unsigned char) jbBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); } else if(depth == 16) { fid = (*env)->GetFieldID(env, cls,"image16", "[S");/*shortArray []*/ jsa = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jsa); jsBody = (*env)->GetPrimitiveArrayCritical(env, jsa, &isCopy); /*printf("C: before transfering 16 bpp image\n"); */ if (comp->sgnd) { /* Special behaviour to deal with signed elements ?? */ comp->data[i] = (short) jsBody[i]; for(i=0; i< len;i++) { if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = (unsigned short) jsBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jsa, jsBody, 0); } else if (depth == 24) { fid = (*env)->GetFieldID(env, cls,"image24", "[I");/* intArray []*/ jia = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jia); shift = compno*8; jiBody = (*env)->GetPrimitiveArrayCritical(env, jia, &isCopy); /*printf("C: before transfering 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd);*/ if (comp->sgnd) { /* Special behaviour to deal with signed elements ?? XXXXX */ for(i=0; i< len;i++) { comp->data[i] = ( ((int) jiBody[i]) & (0xFF << shift) ) >> shift; if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = ( ((unsigned int) jiBody[i]) & (0xFF << shift) ) >> shift; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jia, jiBody, 0); } comp->bpp = int_floorlog2(max)+1; comp->prec = comp->bpp; /*printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp);*/ } return image; } /* -------------------------------------------------------------------------- -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K(JNIEnv *env, jobject obj, jobjectArray javaParameters) { int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ const char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ opj_bool bSuccess; opj_cparameters_t parameters; /* compression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; int i,j,num_images; int imageno; opj_codestream_info_t cstr_info; /* Codestream information structure */ char indexfilename[OPJ_PATH_LEN]; /* index file name */ int* compressed_index = NULL; int compressed_index_size=-1; /* ==> Access variables to the Java member variables */ jsize arraySize; jclass cls; jobject object; jboolean isCopy; jfieldID fid; jbyteArray jba; jbyte *jbBody; callback_variables_t msgErrorCallback_vars; /* <== access variable to the Java member variables. */ jlong retval = -1; /* For the encoding and storage into the file */ opj_cinfo_t* cinfo; int codestream_length = -1; opj_cio_t *cio = NULL; FILE *f = NULL; /* JNI reference to the calling class */ cls = (*env)->GetObjectClass(env, obj); /* Pointers to be able to call a Java method * for all the info and error messages */ msgErrorCallback_vars.env = env; msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V"); arraySize = (*env)->GetArrayLength(env, javaParameters); argc = (int) arraySize +1; argv = (const char **)malloc(argc*sizeof(char*)); if(argv == NULL) return -1; argv[0] = "ProgramName.exe";/* The program name: useless */ j=0; for (i=1; iGetObjectArrayElement(env, javaParameters, i-1); argv[i] = (*env)->GetStringUTFChars(env, object, &isCopy); } /*printf("C: "); for (i=0; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); if(j == 1) goto fin; /* failure */ if (parameters.cp_cinema){ cinema_parameters(¶meters); } /* Create comment for codestream */ if(parameters.cp_comment == NULL) { const char comment[] = "Created by JavaOpenJPEG version "; const size_t clen = strlen(comment); const char *version = opj_version(); /* UniPG>> */ #ifdef USE_JPWL parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); if(parameters.cp_comment == NULL) goto fin; sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); #else parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); if(parameters.cp_comment == NULL) goto fin; sprintf(parameters.cp_comment,"%s%s", comment, version); #endif /* <numcomps == 3 ? 1 : 0; if(parameters.cp_cinema){ cinema_setup_encoder(¶meters,image,&img_fol); } /* encode the destination image */ /* ---------------------------- */ /* get a J2K compressor handle */ if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ cinfo = opj_create_compress(CODEC_J2K); } else { /* JP2 format output */ cinfo = opj_create_compress(CODEC_JP2); } /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, &msgErrorCallback_vars); /* setup the encoder parameters using the current image and user parameters */ opj_setup_encoder(cinfo, ¶meters, image); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the image */ bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); printf("C: after opj_encode_with_info\n"); if (!bSuccess) { opj_cio_close(cio); fprintf(stderr, "failed to encode image\n"); goto fin; } codestream_length = cio_tell(cio); /* write the index on disk, if needed (-x 'filename') */ if (*indexfilename) { bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); } } compressed_index = (int*) create_index_into_byte_array(&cstr_info, &compressed_index_size); /* Allocates the Java compressedIndex byte[] and sends this index into the Java object */ fid = (*env)->GetFieldID(env, cls,"compressedIndex", "[B"); jba = (*env)->NewByteArray(env, compressed_index_size+1); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0); memcpy(jbBody, compressed_index, compressed_index_size); (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); (*env)->SetObjectField(env, obj, fid, jba); free(compressed_index); /* write the generated codestream to disk ? */ if (parameters.outfile[0]!='\0') { f = fopen(parameters.outfile, "wb"); if (!f) { fprintf(stderr, "failed to open [%s] for writing\n", parameters.outfile); goto fin; } fwrite(cio->buffer, 1, codestream_length, f); fclose(f); fprintf(stdout,"Generated outfile [%s]\n",parameters.outfile); } /* Write the generated codestream to the Java pre-allocated compressedStream byte[] */ fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); jba = (*env)->GetObjectField(env, obj, fid); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0); memcpy(jbBody, cio->buffer, codestream_length); (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); /* close and free the byte stream */ opj_cio_close(cio); /* free remaining compression structures */ opj_destroy_compress(cinfo); opj_destroy_cstr_info(&cstr_info); /* free image data */ opj_image_destroy(image); } /* free user parameters structure */ if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); retval = codestream_length; fin: free(argv); return retval; } openjpeg-1.5.2/libopenjpeg1.pc.cmake0000644000175000017500000000057412315002100017150 0ustar mathieumathieuprefix=@CMAKE_INSTALL_PREFIX@ bindir=${prefix}/@OPENJPEG_INSTALL_BIN_DIR@ datadir=${prefix}/@OPENJPEG_INSTALL_DATA_DIR@ libdir=${prefix}/@OPENJPEG_INSTALL_LIB_DIR@ includedir=${prefix}/@OPENJPEG_INSTALL_INCLUDE_DIR@ Name: openjpeg Description: JPEG2000 files library URL: http://www.openjpeg.org/ Version: @OPENJPEG_VERSION@ Libs: -L${libdir} -lopenjpeg Cflags: -I${includedir} openjpeg-1.5.2/LICENSE0000644000175000017500000000332412315002100014167 0ustar mathieumathieu/* * Copyright (c) 2002-2012, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2012, Professor Benoit Macq * Copyright (c) 2003-2012, Antonin Descampe * Copyright (c) 2003-2009, Francois-Olivier Devaux * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2001-2003, 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. */ openjpeg-1.5.2/CTestConfig.cmake0000644000175000017500000000035212315002100016332 0ustar mathieumathieuset(CTEST_PROJECT_NAME "OPENJPEG") set(CTEST_NIGHTLY_START_TIME "3:00:00 UTC") set(CTEST_DROP_METHOD "http") set(CTEST_DROP_SITE "my.cdash.org") set(CTEST_DROP_LOCATION "/submit.php?project=OPENJPEG") set(CTEST_DROP_SITE_CDASH TRUE) openjpeg-1.5.2/CMakeLists.txt0000644000175000017500000002721512315002100015727 0ustar mathieumathieu# Main CMakeLists.txt to build the OpenJPEG project using CMake (www.cmake.org) # Written by Mathieu Malaterre # This CMake project will by default create a library called openjpeg # But if you want to use this project within your own (CMake) project # you will eventually like to prefix the library to avoid linking confusion # For this purpose you can define a CMake var: OPENJPEG_NAMESPACE to whatever you like # e.g.: # SET(OPENJPEG_NAMESPACE "GDCMOPENJPEG") CMAKE_MINIMUM_REQUIRED(VERSION 2.6) IF(COMMAND CMAKE_POLICY) CMAKE_POLICY(SET CMP0003 NEW) ENDIF(COMMAND CMAKE_POLICY) IF(NOT OPENJPEG_NAMESPACE) SET(OPENJPEG_NAMESPACE "OPENJPEG") SET(OPENJPEG_STANDALONE 1) ENDIF(NOT OPENJPEG_NAMESPACE) # In all cases: STRING(TOLOWER ${OPENJPEG_NAMESPACE} OPENJPEG_LIBRARY_NAME) PROJECT(${OPENJPEG_NAMESPACE} C) # Do full dependency headers. INCLUDE_REGULAR_EXPRESSION("^.*$") #----------------------------------------------------------------------------- # OPENJPEG version number, useful for packaging and doxygen doc: SET(OPENJPEG_VERSION_MAJOR 1) SET(OPENJPEG_VERSION_MINOR 5) SET(OPENJPEG_VERSION_BUILD 2) SET(OPENJPEG_VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}") SET(PACKAGE_VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}") # Because autotools does not support X.Y notation for SOVERSION, we have to use # two numerorations, one for the openjpeg version and one for openjpeg soversion # version | soversion # 1.0 | 0 # 1.1 | 1 # 1.2 | 2 # 1.3 | 3 # 1.4 | 4 # 1.5 | 5 # 1.5.1 | 5 # 2.0 | 6 # above is the recommendation by the OPJ team. If you really need to override this default, # you can specify your own OPENJPEG_SOVERSION at cmake configuration time: # cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg if(NOT OPENJPEG_SOVERSION) SET(OPENJPEG_SOVERSION 5) endif(NOT OPENJPEG_SOVERSION) SET(OPENJPEG_LIBRARY_PROPERTIES VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}" SOVERSION "${OPENJPEG_SOVERSION}" ) # -------------------------------------------------------------------------- # Path to additional CMake modules SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake ${CMAKE_MODULE_PATH}) # -------------------------------------------------------------------------- # On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security # warnings IF(WIN32) IF(NOT BORLAND) IF(NOT CYGWIN) IF(NOT MINGW) IF(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS) ADD_DEFINITIONS( -D_CRT_FAR_MAPPINGS_NO_DEPRECATE -D_CRT_IS_WCTYPE_NO_DEPRECATE -D_CRT_MANAGED_FP_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE_GLOBALS -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE -D_CRT_VCCLRIT_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE ) ENDIF(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS) ENDIF(NOT MINGW) ENDIF(NOT CYGWIN) ENDIF(NOT BORLAND) ENDIF(WIN32) # -------------------------------------------------------------------------- # Install directories STRING(TOLOWER ${PROJECT_NAME} projectname) SET(OPENJPEG_INSTALL_SUBDIR "${projectname}-${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}") IF(NOT OPENJPEG_INSTALL_BIN_DIR) SET(OPENJPEG_INSTALL_BIN_DIR "bin") ENDIF(NOT OPENJPEG_INSTALL_BIN_DIR) IF(NOT OPENJPEG_INSTALL_LIB_DIR) SET(OPENJPEG_INSTALL_LIB_DIR "lib") ENDIF(NOT OPENJPEG_INSTALL_LIB_DIR) # The following will compute the amount of parent dir to go # from include to lib. it works nicely with # OPENJPEG_INSTALL_LIB_DIR=lib # OPENJPEG_INSTALL_LIB_DIR=lib/ # OPENJPEG_INSTALL_LIB_DIR=/lib # OPENJPEG_INSTALL_LIB_DIR=lib/gnu-linux-x64 STRING(REPLACE "/" ";" relative_to_lib ${OPENJPEG_INSTALL_LIB_DIR}) set(relative_parent "..") foreach( elem ${relative_to_lib}) set( relative_parent "${relative_parent}/.." ) endforeach() IF(NOT OPENJPEG_INSTALL_SHARE_DIR) SET(OPENJPEG_INSTALL_SHARE_DIR "share") ENDIF(NOT OPENJPEG_INSTALL_SHARE_DIR) IF(NOT OPENJPEG_INSTALL_DATA_DIR) SET(OPENJPEG_INSTALL_DATA_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}") ENDIF(NOT OPENJPEG_INSTALL_DATA_DIR) IF(NOT OPENJPEG_INSTALL_INCLUDE_DIR) SET(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}") ENDIF(NOT OPENJPEG_INSTALL_INCLUDE_DIR) IF(NOT OPENJPEG_INSTALL_MAN_DIR) SET(OPENJPEG_INSTALL_MAN_DIR "share/man/") ENDIF(NOT OPENJPEG_INSTALL_MAN_DIR) IF(NOT OPENJPEG_INSTALL_DOC_DIR) SET(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}") ENDIF(NOT OPENJPEG_INSTALL_DOC_DIR) if(NOT OPENJPEG_INSTALL_JNI_DIR) if(WIN32) set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_BIN_DIR}) else() set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_LIB_DIR}) endif() endif() IF(NOT OPENJPEG_INSTALL_PACKAGE_DIR) # We could install *.cmake files in share/ however those files contains # hardcoded path to libraries on a multi-arch system (fedora/debian) those # path will be different (lib/i386-linux-gnu vs lib/x86_64-linux-gnu) SET(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}") ENDIF(NOT OPENJPEG_INSTALL_PACKAGE_DIR) #----------------------------------------------------------------------------- # Big endian test: INCLUDE (${CMAKE_ROOT}/Modules/TestBigEndian.cmake) TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN) #----------------------------------------------------------------------------- # Setup file for setting custom ctest vars CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/CMake/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake @ONLY ) #----------------------------------------------------------------------------- # OpenJPEG build configuration options. OPTION(BUILD_SHARED_LIBS "Build OpenJPEG shared library and link executables against it." ON) SET (EXECUTABLE_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all executables.") SET (LIBRARY_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all libraries.") MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH) #----------------------------------------------------------------------------- # configure name mangling to allow multiple libraries to coexist # peacefully IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in) SET(MANGLE_PREFIX ${OPENJPEG_LIBRARY_NAME}) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in ${CMAKE_CURRENT_BINARY_DIR}/openjpeg_mangle.h @ONLY) ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in) #----------------------------------------------------------------------------- # pkgconfig support IF(UNIX) # install in lib and not share (see multi-arch note above) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libopenjpeg1.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc @ONLY) INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc DESTINATION ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig ) INSTALL( CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink \"libopenjpeg1.pc\" \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${OPENJPEG_INSTALL_SHARE_DIR}/pkgconfig/libopenjpeg.pc\")") ENDIF(UNIX) #----------------------------------------------------------------------------- # Compiler specific flags: IF(CMAKE_COMPILER_IS_GNUCC) # For all builds, make sure openjpeg is std99 compliant: # SET(CMAKE_C_FLAGS "-Wall -std=c99 ${CMAKE_C_FLAGS}") # FIXME: this setting prevented us from setting a coverage build. # Do not use ffast-math for all build, it would produce incorrect results, only set for release: SET(CMAKE_C_FLAGS_RELEASE "-ffast-math ${CMAKE_C_FLAGS_RELEASE}") ENDIF(CMAKE_COMPILER_IS_GNUCC) #----------------------------------------------------------------------------- # opj_config.h generation (1/2) INCLUDE (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake) CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H) CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H) CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H) CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H) CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H) CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H) CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) #----------------------------------------------------------------------------- # Build Library INCLUDE_DIRECTORIES(BEFORE ${OPENJPEG_BINARY_DIR}) ADD_SUBDIRECTORY(libopenjpeg) #----------------------------------------------------------------------------- # Build Applications OPTION(BUILD_CODEC "Build the CODEC executables" ON) OPTION(BUILD_MJ2 "Build the MJ2 executables." OFF) OPTION(BUILD_JPWL "Build the JPWL library and executables" OFF) OPTION(BUILD_JPIP "Build the JPIP library and executables." OFF) IF(BUILD_JPIP) OPTION(BUILD_JPIP_SERVER "Build the JPIP server." OFF) ENDIF(BUILD_JPIP) OPTION(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF) OPTION(BUILD_JAVA "Build the openjpeg jar (Java)" OFF) OPTION(USE_SYSTEM_GETOPT "Prefer system installed getopt()" OFF) MARK_AS_ADVANCED(USE_SYSTEM_GETOPT) MARK_AS_ADVANCED(BUILD_VIEWER) MARK_AS_ADVANCED(BUILD_JAVA) IF(BUILD_CODEC OR BUILD_MJ2) # OFF: It will only build 3rd party libs if they are not found on the system # ON: 3rd party libs will ALWAYS be build, and used OPTION(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF) ADD_SUBDIRECTORY(thirdparty) ADD_SUBDIRECTORY(applications) ENDIF (BUILD_CODEC OR BUILD_MJ2) #----------------------------------------------------------------------------- # opj_config.h generation (2/2) CONFIGURE_FILE("${OPENJPEG_SOURCE_DIR}/opj_config.h.cmake.in" "${OPENJPEG_BINARY_DIR}/opj_config.h" @ONLY ) #----------------------------------------------------------------------------- # Build DOCUMENTATION (not in ALL target and only if Doxygen is found) OPTION(BUILD_DOC "Build the HTML documentation (with doxygen if available)." OFF) IF(BUILD_DOC) ADD_SUBDIRECTORY(doc) ENDIF(BUILD_DOC) #----------------------------------------------------------------------------- # Buld Testing OPTION(BUILD_TESTING "Build the tests." OFF) IF(BUILD_TESTING) IF(BUILD_CODEC) ENABLE_TESTING() INCLUDE(CTest) # Search openjpeg data needed for the tests # They could be found via svn on the OpenJPEG google code project # svn checkout http://openjpeg.googlecode.com/svn/data (about 70 Mo) FIND_PATH(OPJ_DATA_ROOT README-OPJ-Data PATHS $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../data ${CMAKE_SOURCE_DIR}/../../data NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH ) # Add repository where to find tests ADD_SUBDIRECTORY(tests) ELSE(BUILD_CODEC) message(FATAL_ERROR "You need build codec to run the tests") ENDIF(BUILD_CODEC) ENDIF(BUILD_TESTING) #----------------------------------------------------------------------------- # install all targets referenced as OPENJPEGTargets INSTALL(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}) CONFIGURE_FILE( ${OPENJPEG_SOURCE_DIR}/CMake/OpenJPEGConfig.cmake.in ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake @ONLY ) INSTALL( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR} ) #----------------------------------------------------------------------------- # install CHANGES and LICENSE IF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES) INSTALL(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR}) ENDIF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES) INSTALL(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR}) INCLUDE (CMake/OpenJPEGCPack.cmake) openjpeg-1.5.2/opj_config.h.cmake.in0000644000175000017500000000211312315002100017127 0ustar mathieumathieu/* create config.h for CMake */ #define PACKAGE_VERSION "@PACKAGE_VERSION@" #cmakedefine HAVE_INTTYPES_H #cmakedefine HAVE_MEMORY_H #cmakedefine HAVE_STDINT_H #cmakedefine HAVE_STDLIB_H #cmakedefine HAVE_STRINGS_H #cmakedefine HAVE_STRING_H #cmakedefine HAVE_SYS_STAT_H #cmakedefine HAVE_SYS_TYPES_H #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_LIBPNG #cmakedefine HAVE_PNG_H #cmakedefine HAVE_LIBTIFF #cmakedefine HAVE_TIFF_H #cmakedefine HAVE_LIBLCMS1 #cmakedefine HAVE_LIBLCMS2 #cmakedefine HAVE_LCMS1_H #cmakedefine HAVE_LCMS2_H #cmakedefine USE_SYSTEM_GETOPT /* Byte order. */ /* All compilers that support Mac OS X define either __BIG_ENDIAN__ or __LITTLE_ENDIAN__ to match the endianness of the architecture being compiled for. This is not necessarily the same as the architecture of the machine doing the building. In order to support Universal Binaries on Mac OS X, we prefer those defines to decide the endianness. On other platforms we use the result of the TRY_RUN. */ #if !defined(__APPLE__) #cmakedefine OPJ_BIG_ENDIAN #elif defined(__BIG_ENDIAN__) # define OPJ_BIG_ENDIAN #endif openjpeg-1.5.2/tests/0000755000175000017500000000000012315072522014341 5ustar mathieumathieuopenjpeg-1.5.2/tests/compareRAWimages.c0000644000175000017500000001537512315002100017667 0ustar mathieumathieu/* * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes * 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. */ /* * compareRAWimages.c * * Created on: 31 August 2011 * Author: mickael */ #include #include #include #include #include "opj_getopt.h" void compareRAWimages_help_display(void); typedef struct test_cmp_parameters { /** */ char* base_filename; /** */ char* test_filename; } test_cmp_parameters; /******************************************************************************* * Command line help function *******************************************************************************/ void compareRAWimages_help_display(void) { fprintf(stdout,"\nList of parameters for the comparePGX function \n"); fprintf(stdout,"\n"); fprintf(stdout," -b \t REQUIRED \t filename to the reference/baseline RAW image \n"); fprintf(stdout," -t \t REQUIRED \t filename to the test RAW image\n"); fprintf(stdout,"\n"); } /******************************************************************************* * Parse command line *******************************************************************************/ int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param) { int sizemembasefile, sizememtestfile; int index; const char optlist[] = "b:t:"; int c; /* Init parameters*/ param->base_filename = NULL; param->test_filename = NULL; opj_opterr = 0; while ((c = opj_getopt(argc, argv, optlist)) != -1) switch (c) { case 'b': sizemembasefile = (int)strlen(opj_optarg)+1; param->base_filename = (char*) malloc(sizemembasefile); param->base_filename[0] = '\0'; strncpy(param->base_filename, opj_optarg, strlen(opj_optarg)); param->base_filename[strlen(opj_optarg)] = '\0'; /*printf("param->base_filename = %s [%d / %d]\n", param->base_filename, strlen(param->base_filename), sizemembasefile );*/ break; case 't': sizememtestfile = (int) strlen(opj_optarg) + 1; param->test_filename = (char*) malloc(sizememtestfile); param->test_filename[0] = '\0'; strncpy(param->test_filename, opj_optarg, strlen(opj_optarg)); param->test_filename[strlen(opj_optarg)] = '\0'; /*printf("param->test_filename = %s [%d / %d]\n", param->test_filename, strlen(param->test_filename), sizememtestfile);*/ break; case '?': if ((opj_optopt == 'b') || (opj_optopt == 't')) fprintf(stderr, "Option -%c requires an argument.\n", opj_optopt); else if (isprint(opj_optopt)) fprintf(stderr, "Unknown option `-%c'.\n", opj_optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", opj_optopt); return 1; default: fprintf(stderr, "WARNING -> this option is not valid \"-%c %s\"\n", c, opj_optarg); break; } if (opj_optind != argc) { for (index = opj_optind; index < argc; index++) fprintf(stderr,"Non-option argument %s\n", argv[index]); return EXIT_FAILURE; } return EXIT_SUCCESS; } /******************************************************************************* * MAIN *******************************************************************************/ int main(int argc, char **argv) { test_cmp_parameters inParam; FILE *file_test=NULL, *file_base=NULL; unsigned char equal = 1; /* Get parameters from command line*/ if (parse_cmdline_cmp(argc, argv, &inParam) == EXIT_FAILURE) { compareRAWimages_help_display(); /* Free Memory */ if (inParam.base_filename){ free(inParam.base_filename); inParam.base_filename = NULL; } if (inParam.test_filename){ free(inParam.test_filename); inParam.test_filename = NULL; } return EXIT_FAILURE; } file_test = fopen(inParam.test_filename, "rb"); if (!file_test) { fprintf(stderr, "Failed to open %s for reading !!\n", inParam.test_filename); /* Free Memory */ if (inParam.base_filename){ free(inParam.base_filename); inParam.base_filename = NULL; } if (inParam.test_filename){ free(inParam.test_filename); inParam.test_filename = NULL; } return EXIT_FAILURE; } file_base = fopen(inParam.base_filename, "rb"); if (!file_base) { fprintf(stderr, "Failed to open %s for reading !!\n", inParam.base_filename); /* Free Memory */ if (inParam.base_filename){ free(inParam.base_filename); inParam.base_filename = NULL; } if (inParam.test_filename){ free(inParam.test_filename); inParam.test_filename = NULL; } fclose(file_test); return EXIT_FAILURE; } /* Read simultaneously the two files*/ while (equal) { unsigned char value_test = 0; unsigned char eof_test = 0; unsigned char value_base = 0; unsigned char eof_base = 0; /* Read one byte*/ if (!fread(&value_test, 1, 1, file_test)) { eof_test = 1; } /* Read one byte*/ if (!fread(&value_base, 1, 1, file_base)) { eof_base = 1;; } /* End of file reached by the two files?*/ if (eof_test && eof_base) break; /* End of file reached only by one file?*/ if (eof_test || eof_base) { fprintf(stdout,"Files have different sizes.\n"); equal = 0; } /* Binary values are equal?*/ if (value_test != value_base) { fprintf(stdout,"Binary values read in the file are different.\n"); equal = 0; } } /* Free Memory */ if (inParam.base_filename){ free(inParam.base_filename); inParam.base_filename = NULL; } if (inParam.test_filename){ free(inParam.test_filename); inParam.test_filename = NULL; } fclose(file_test); fclose(file_base); if (equal) { fprintf(stdout,"---- TEST SUCCEED: Files are equal ----\n"); return EXIT_SUCCESS; } else return EXIT_FAILURE; } openjpeg-1.5.2/tests/unit/0000755000175000017500000000000012315072522015320 5ustar mathieumathieuopenjpeg-1.5.2/tests/unit/CMakeLists.txt0000644000175000017500000000042012315002100020035 0ustar mathieumathieu# UNIT TESTS add_executable(testempty1 testempty1.c) add_executable(testempty2 testempty2.c) target_link_libraries(testempty1 openjpeg) target_link_libraries(testempty2 openjpeg) add_test(NAME testempty1 COMMAND testempty1) add_test(NAME testempty2 COMMAND testempty2) openjpeg-1.5.2/tests/unit/testempty1.c0000644000175000017500000000717212315002100017573 0ustar mathieumathieu/* * Copyright (c) 2012, Mathieu Malaterre * 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 #define J2K_CFMT 0 void error_callback(const char *msg, void *v); void warning_callback(const char *msg, void *v); void info_callback(const char *msg, void *v); void error_callback(const char *msg, void *v) { (void)msg; (void)v; assert(0); } void warning_callback(const char *msg, void *v) { (void)msg; (void)v; puts(msg); } void info_callback(const char *msg, void *v) { (void)msg; (void)v; puts(msg); } int main(int argc, char *argv[]) { const char * v = opj_version(); const OPJ_COLOR_SPACE color_space = CLRSPC_GRAY; int numcomps = 1; int i; int image_width = 256; int image_height = 256; opj_cparameters_t parameters; int subsampling_dx = 0; int subsampling_dy = 0; opj_image_cmptparm_t cmptparm; opj_image_t *image; opj_event_mgr_t event_mgr; opj_cinfo_t* cinfo; opj_cio_t *cio; opj_bool bSuccess; size_t codestream_length; FILE *f; (void)argc; (void)argv; opj_set_default_encoder_parameters(¶meters); parameters.cod_format = J2K_CFMT; puts(v); cmptparm.prec = 8; cmptparm.bpp = 8; cmptparm.sgnd = 0; cmptparm.dx = subsampling_dx; cmptparm.dy = subsampling_dy; cmptparm.w = image_width; cmptparm.h = image_height; image = opj_image_create(numcomps, &cmptparm, color_space); assert( image ); for (i = 0; i < image_width * image_height; i++) { int compno; for(compno = 0; compno < numcomps; compno++) { image->comps[compno].data[i] = 0; } } event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; cinfo = opj_create_compress(CODEC_J2K); opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); opj_setup_encoder(cinfo, ¶meters, image); cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); assert( cio ); bSuccess = opj_encode(cinfo, cio, image, NULL); assert( bSuccess ); codestream_length = (size_t)cio_tell(cio); assert( codestream_length ); strcpy(parameters.outfile, "testempty1.j2k"); f = fopen(parameters.outfile, "wb"); assert( f ); fwrite(cio->buffer, 1, codestream_length, f); fclose(f); opj_cio_close(cio); opj_destroy_compress(cinfo); opj_image_destroy(image); puts( "end" ); return 0; } openjpeg-1.5.2/tests/unit/testempty2.c0000644000175000017500000001131212315002100017563 0ustar mathieumathieu/* * Copyright (c) 2012, Mathieu Malaterre * 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 #define J2K_CFMT 0 void error_callback(const char *msg, void *v); void warning_callback(const char *msg, void *v); void info_callback(const char *msg, void *v); void error_callback(const char *msg, void *v) { (void)msg; (void)v; assert(0); } void warning_callback(const char *msg, void *v) { (void)msg; (void)v; puts(msg); } void info_callback(const char *msg, void *v) { (void)msg; (void)v; puts(msg); } int main(int argc, char *argv[]) { const char * v = opj_version(); const OPJ_COLOR_SPACE color_space = CLRSPC_GRAY; int numcomps = 1; int i; int image_width = 256; int image_height = 256; opj_cparameters_t parameters; int subsampling_dx; int subsampling_dy; const char outputfile[] = "testempty2.j2k"; opj_image_cmptparm_t cmptparm; opj_image_t *image; opj_event_mgr_t event_mgr; opj_cinfo_t* cinfo; opj_cio_t *cio; opj_bool bSuccess; size_t codestream_length; FILE *f; (void)argc; (void)argv; opj_set_default_encoder_parameters(¶meters); parameters.cod_format = J2K_CFMT; puts(v); subsampling_dx = parameters.subsampling_dx; subsampling_dy = parameters.subsampling_dy; cmptparm.prec = 8; cmptparm.bpp = 8; cmptparm.sgnd = 0; cmptparm.dx = subsampling_dx; cmptparm.dy = subsampling_dy; cmptparm.w = image_width; cmptparm.h = image_height; image = opj_image_create(numcomps, &cmptparm, color_space); assert( image ); for (i = 0; i < image_width * image_height; i++) { int compno; for(compno = 0; compno < numcomps; compno++) { image->comps[compno].data[i] = 0; } } event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; cinfo = opj_create_compress(CODEC_J2K); opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); opj_setup_encoder(cinfo, ¶meters, image); cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); assert( cio ); bSuccess = opj_encode(cinfo, cio, image, NULL); assert( bSuccess ); codestream_length = (size_t)cio_tell(cio); assert( codestream_length ); strcpy(parameters.outfile, outputfile); f = fopen(parameters.outfile, "wb"); assert( f ); fwrite(cio->buffer, 1, codestream_length, f); fclose(f); opj_cio_close(cio); opj_destroy_compress(cinfo); opj_image_destroy(image); /* read back the generated file */ { size_t file_length; FILE *fsrc = fopen(outputfile, "rb"); unsigned char *src; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_dparameters_t dparameters; assert( fsrc ); fseek(fsrc, 0, SEEK_END); file_length = (size_t)ftell(fsrc); fseek(fsrc, 0, SEEK_SET); src = (unsigned char *) malloc(file_length); if (fread(src, 1, file_length, fsrc) != file_length) { free(src); fclose(fsrc); return 1; } fclose(fsrc); dinfo = opj_create_decompress(CODEC_J2K); opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); opj_set_default_decoder_parameters(&dparameters); opj_setup_decoder(dinfo, &dparameters); cio = opj_cio_open((opj_common_ptr)dinfo, src, (int)file_length); image = opj_decode(dinfo, cio); if(!image) { opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } opj_destroy_decompress(dinfo); opj_cio_close(cio); } puts( "end" ); return 0; } openjpeg-1.5.2/tests/CMakeLists.txt0000644000175000017500000000416712315002100017072 0ustar mathieumathieu# Tests INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ${OPENJPEG_SOURCE_DIR}/applications/codec ${OPENJPEG_SOURCE_DIR}/applications/common ${Z_INCLUDE_DIRNAME} ${PNG_INCLUDE_DIRNAME} ${TIFF_INCLUDE_DIRNAME} ) # First thing define the common source: SET(comparePGXimages_SRCS comparePGXimages.c ${OPENJPEG_SOURCE_DIR}/applications/codec/convert.c ) SET(compare_dump_files_SRCS compare_dump_files.c) SET(compareRAWimages_SRCS compareRAWimages.c) if(NOT USE_SYSTEM_GETOPT) list(APPEND comparePGXimages_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c) list(APPEND compare_dump_files_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c) list(APPEND compareRAWimages_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c) endif() ADD_EXECUTABLE(comparePGXimages ${comparePGXimages_SRCS}) TARGET_LINK_LIBRARIES(comparePGXimages ${OPENJPEG_LIBRARY_NAME} ${PNG_LIBNAME} ${TIFF_LIBNAME} ) # To support universal exe: IF(ZLIB_FOUND AND APPLE) TARGET_LINK_LIBRARIES(comparePGXimages z) ELSe(ZLIB_FOUND AND APPLE) TARGET_LINK_LIBRARIES(comparePGXimages ${Z_LIBNAME}) ENDIF(ZLIB_FOUND AND APPLE) ADD_EXECUTABLE(compare_dump_files ${compare_dump_files_SRCS}) ADD_EXECUTABLE(compareRAWimages ${compareRAWimages_SRCS}) # No image send to the dashboard if lib PNG is not available. IF(NOT HAVE_LIBPNG) MESSAGE(WARNING "Lib PNG seems to be not available: if you want run the non-regression tests with images reported to the dashboard, you need it (try BUILD_THIRDPARTY)") ENDIF(NOT HAVE_LIBPNG) ADD_SUBDIRECTORY(conformance) ADD_SUBDIRECTORY(nonregression) ADD_SUBDIRECTORY(unit) IF(BUILD_JPIP) IF(JPIP_SERVER) #SET(s "http://jpip.example.com/myFCGI?target=16.jp2&fsiz=170,170&cnew=http&type=jpp-stream") SET(s "${JPIP_SERVER}?target=16.jp2&fsiz=170,170&cnew=http&type=jpp-stream") SET(p "${CMAKE_CURRENT_BINARY_DIR}/jpip.dat") SET(md5 "62b00c620fb0a600c5ffd413cada4674") ADD_TEST(NAME TestJPIP1 COMMAND ${CMAKE_COMMAND} -DD_URL:STRING=${s} -DD_FILE:PATH=${p} -DEXPECTED_MD5=${md5} -P ${PROJECT_SOURCE_DIR}/CMake/JPIPTestDriver.cmake) ENDIF(JPIP_SERVER) ENDIF(BUILD_JPIP) openjpeg-1.5.2/tests/comparePGXimages.c0000644000175000017500000007131412315002100017667 0ustar mathieumathieu/* * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes * 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. */ /* * comparePGXimages.c * * Created on: 8 juil. 2011 * Author: mickael */ #include #include #include #include #include #include "opj_config.h" #include "opj_getopt.h" #include "openjpeg.h" #include "format_defs.h" #include "convert.h" double* parseToleranceValues( char* inArg, const int nbcomp); void comparePGXimages_help_display(void); opj_image_t* readImageFromFilePGX(char* filename, int nbFilenamePGX, char *separator); #ifdef HAVE_LIBPNG int imageToPNG(const opj_image_t* image, const char* filename, int num_comp_select); #endif typedef struct test_cmp_parameters { /** */ char* base_filename; /** */ char* test_filename; /** Number of components */ int nbcomp; /** */ double* tabMSEvalues; /** */ double* tabPEAKvalues; /** */ int nr_flag; /** */ char separator_base[2]; /** */ char separator_test[2]; } test_cmp_parameters; /******************************************************************************* * Command line help function *******************************************************************************/ void comparePGXimages_help_display(void) { fprintf(stdout,"\nList of parameters for the comparePGX function \n"); fprintf(stdout,"\n"); fprintf(stdout," -b \t REQUIRED \t filename to the reference/baseline PGX image \n"); fprintf(stdout," -t \t REQUIRED \t filename to the test PGX image\n"); fprintf(stdout," -n \t REQUIRED \t number of component of the image (used to generate correct filename)\n"); fprintf(stdout," -m \t OPTIONAL \t list of MSE tolerances, separated by : (size must correspond to the number of component) of \n"); fprintf(stdout," -p \t OPTIONAL \t list of PEAK tolerances, separated by : (size must correspond to the number of component) \n"); fprintf(stdout," -s \t OPTIONAL \t 1 or 2 filename separator to take into account PGX image with different components, " "please indicate b or t before separator to indicate respectively the separator " "for ref/base file and for test file. \n"); fprintf(stdout," -r \t OPTIONAL \t indicate if you want to run this function as conformance test or as non regression test\n"); fprintf(stdout,"\n"); } /******************************************************************************* * Parse command line *******************************************************************************/ int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param) { char *MSElistvalues = NULL; char *PEAKlistvalues= NULL; char *separatorList = NULL; int sizemembasefile, sizememtestfile; int index, flagM=0, flagP=0; const char optlist[] = "b:t:n:m:p:s:d"; int c; /* Init parameters*/ param->base_filename = NULL; param->test_filename = NULL; param->nbcomp = 0; param->tabMSEvalues = NULL; param->tabPEAKvalues = NULL; param->nr_flag = 0; opj_opterr = 0; while ((c = opj_getopt(argc, argv, optlist)) != -1) switch (c) { case 'b': sizemembasefile = (int)strlen(opj_optarg)+1; param->base_filename = (char*) malloc(sizemembasefile); param->base_filename[0] = '\0'; strncpy(param->base_filename, opj_optarg, strlen(opj_optarg)); param->base_filename[strlen(opj_optarg)] = '\0'; /*printf("param->base_filename = %s [%d / %d]\n", param->base_filename, strlen(param->base_filename), sizemembasefile );*/ break; case 't': sizememtestfile = (int) strlen(opj_optarg) + 1; param->test_filename = (char*) malloc(sizememtestfile); param->test_filename[0] = '\0'; strncpy(param->test_filename, opj_optarg, strlen(opj_optarg)); param->test_filename[strlen(opj_optarg)] = '\0'; /*printf("param->test_filename = %s [%d / %d]\n", param->test_filename, strlen(param->test_filename), sizememtestfile);*/ break; case 'n': param->nbcomp = atoi(opj_optarg); break; case 'm': MSElistvalues = opj_optarg; flagM = 1; break; case 'p': PEAKlistvalues = opj_optarg; flagP = 1; break; case 'd': param->nr_flag = 1; break; case 's': separatorList = opj_optarg; break; case '?': if ((opj_optopt == 'b') || (opj_optopt == 't') || (opj_optopt == 'n') || (opj_optopt == 'p') || (opj_optopt == 'm') || (opj_optopt == 's')) fprintf(stderr, "Option -%c requires an argument.\n", opj_optopt); else if (isprint(opj_optopt)) fprintf(stderr, "Unknown option `-%c'.\n", opj_optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", opj_optopt); return 1; default: fprintf(stderr, "WARNING -> this option is not valid \"-%c %s\"\n", c, opj_optarg); break; } if (opj_optind != argc) { for (index = opj_optind; index < argc; index++) fprintf(stderr,"Non-option argument %s\n", argv[index]); return EXIT_FAILURE; } if (param->nbcomp == 0) { fprintf(stderr,"Need to indicate the number of components !\n"); return EXIT_FAILURE; } else { if ( flagM && flagP ) { param->tabMSEvalues = parseToleranceValues( MSElistvalues, param->nbcomp); param->tabPEAKvalues = parseToleranceValues( PEAKlistvalues, param->nbcomp); if ( (param->tabMSEvalues == NULL) || (param->tabPEAKvalues == NULL)) { fprintf(stderr,"MSE and PEAK values are not correct (respectively need %d values)\n",param->nbcomp); return EXIT_FAILURE; } } /*else { }*/ } /* Get separators after corresponding letter (b or t)*/ if (separatorList != NULL) { if( (strlen(separatorList) ==2) || (strlen(separatorList) ==4) ) { /* keep original string*/ int sizeseplist = (int)strlen(separatorList)+1; char* separatorList2 = (char*)malloc( sizeseplist ); separatorList2[0] = '\0'; strncpy(separatorList2, separatorList, strlen(separatorList)); separatorList2[strlen(separatorList)] = '\0'; /*printf("separatorList2 = %s [%d / %d]\n", separatorList2, strlen(separatorList2), sizeseplist);*/ if (strlen(separatorList) == 2) /* one separator behind b or t*/ { char *resultT = NULL; resultT = strtok(separatorList2, "t"); if (strlen(resultT) == strlen(separatorList)) /* didn't find t character, try to find b*/ { char *resultB = NULL; resultB = strtok(resultT, "b"); if (strlen(resultB) == 1) { param->separator_base[0] = separatorList[1];param->separator_base[1] = '\0'; param->separator_test[0] ='\0'; } else /* not found b*/ { free(separatorList2); return EXIT_FAILURE; } } else /* found t*/ { param->separator_base[0] ='\0'; param->separator_test[0] = separatorList[1];param->separator_test[1] = '\0'; } /*printf("sep b = %s [%d] and sep t = %s [%d]\n",param->separator_base, strlen(param->separator_base), param->separator_test, strlen(param->separator_test) );*/ } else /* == 4 characters we must found t and b*/ { char *resultT = NULL; resultT = strtok(separatorList2, "t"); if (strlen(resultT) == 3) /* found t in first place*/ { char *resultB = NULL; resultB = strtok(resultT, "b"); if (strlen(resultB) == 1) /* found b after t*/ { param->separator_test[0] = separatorList[1];param->separator_test[1] = '\0'; param->separator_base[0] = separatorList[3];param->separator_base[1] = '\0'; } else /* didn't find b after t*/ { free(separatorList2); return EXIT_FAILURE; } } else /* == 2, didn't find t in first place*/ { char *resultB = NULL; resultB = strtok(resultT, "b"); if (strlen(resultB) == 1) /* found b in first place*/ { param->separator_base[0] = separatorList[1]; param->separator_base[1] = '\0'; param->separator_test[0] = separatorList[3]; param->separator_test[1] = '\0'; } else /* didn't found b in first place => problem*/ { free(separatorList2); return EXIT_FAILURE; } } } free(separatorList2); } else /* wrong number of argument after -s*/ { return EXIT_FAILURE; } } else { if (param->nbcomp == 1) { param->separator_base[0] = '\0'; param->separator_test[0] = '\0'; } else { fprintf(stderr,"If number of component is > 1, we need separator\n"); return EXIT_FAILURE; } } if ( (param->nr_flag) && (flagP || flagM) ) { fprintf(stderr,"Wrong input parameters list: it is non-regression test or tolerance comparison\n"); return EXIT_FAILURE; } if ( (!param->nr_flag) && (!flagP || !flagM) ) { fprintf(stderr,"Wrong input parameters list: it is non-regression test or tolerance comparison\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; } /******************************************************************************* * Parse MSE and PEAK input values ( * separator = ":" *******************************************************************************/ double* parseToleranceValues( char* inArg, const int nbcomp) { double* outArgs= malloc(nbcomp * sizeof(double)); int it_comp = 0; char delims[] = ":"; char *result = NULL; result = strtok( inArg, delims ); while( (result != NULL) && (it_comp < nbcomp )) { outArgs[it_comp] = atof(result); result = strtok( NULL, delims ); it_comp++; } if (it_comp != nbcomp) { free(outArgs); return NULL; } else return outArgs; } /******************************************************************************* * Create filenames from a filename by used separator and nb components * (begin to 0) *******************************************************************************/ char* createMultiComponentsFilename(const char* inFilename, const int indexF, const char* separator) { char s[255]; char *outFilename, *ptr; char token = '.'; int posToken = 0; /*printf("inFilename = %s\n", inFilename);*/ if ((ptr = strrchr(inFilename, token)) != NULL) { posToken = (int) (strlen(inFilename) - strlen(ptr)); /*printf("Position of %c character inside inFilename = %d\n", token, posToken);*/ } else { /*printf("Token %c not found\n", token);*/ outFilename = (char*)malloc(1); outFilename[0] = '\0'; return outFilename; } outFilename = (char*)malloc((posToken + 7) * sizeof(char)); /*6*/ strncpy(outFilename, inFilename, posToken); outFilename[posToken] = '\0'; strcat(outFilename, separator); sprintf(s, "%i", indexF); strcat(outFilename, s); strcat(outFilename, ".pgx"); /*printf("outfilename: %s\n", outFilename);*/ return outFilename; } /******************************************************************************* * *******************************************************************************/ opj_image_t* readImageFromFilePGX(char* filename, int nbFilenamePGX, char *separator) { int it_file; opj_image_t* image_read = NULL; opj_image_t* image = NULL; opj_cparameters_t parameters; opj_image_cmptparm_t* param_image_read; int** data; /* If separator is empty => nb file to read is equal to one*/ if ( strlen(separator) == 0 ) nbFilenamePGX = 1; /* set encoding parameters to default values */ opj_set_default_encoder_parameters(¶meters); parameters.decod_format = PGX_DFMT; strncpy(parameters.infile, filename, sizeof(parameters.infile)-1); /* Allocate memory*/ param_image_read = malloc(nbFilenamePGX * sizeof(opj_image_cmptparm_t)); data = malloc(nbFilenamePGX * sizeof(*data)); it_file = 0; for (it_file = 0; it_file < nbFilenamePGX; it_file++) { /* Create the right filename*/ char *filenameComponentPGX; if (strlen(separator) == 0) { filenameComponentPGX = malloc((strlen(filename) + 1) * sizeof(*filenameComponentPGX)); strcpy(filenameComponentPGX, filename); } else filenameComponentPGX = createMultiComponentsFilename(filename, it_file, separator); /* Read the pgx file corresponding to the component */ image_read = pgxtoimage(filenameComponentPGX, ¶meters); if (!image_read) { int it_free_data; fprintf(stderr, "Unable to load pgx file\n"); free(param_image_read); for (it_free_data = 0; it_free_data < it_file; it_free_data++) { free(data[it_free_data]); } free(data); free(filenameComponentPGX); return NULL; } /* Set the image_read parameters*/ param_image_read[it_file].x0 = 0; param_image_read[it_file].y0 = 0; param_image_read[it_file].dx = 0; param_image_read[it_file].dy = 0; param_image_read[it_file].h = image_read->comps->h; param_image_read[it_file].w = image_read->comps->w; param_image_read[it_file].bpp = image_read->comps->bpp; param_image_read[it_file].prec = image_read->comps->prec; param_image_read[it_file].sgnd = image_read->comps->sgnd; /* Copy data*/ data[it_file] = malloc(param_image_read[it_file].h * param_image_read[it_file].w * sizeof(int)); memcpy(data[it_file], image_read->comps->data, image_read->comps->h * image_read->comps->w * sizeof(int)); /* Free memory*/ opj_image_destroy(image_read); free(filenameComponentPGX); } image = opj_image_create(nbFilenamePGX, param_image_read, CLRSPC_UNSPECIFIED); for (it_file = 0; it_file < nbFilenamePGX; it_file++) { /* Copy data into output image and free memory*/ memcpy(image->comps[it_file].data, data[it_file], image->comps[it_file].h * image->comps[it_file].w * sizeof(int)); free(data[it_file]); } /* Free memory*/ free(param_image_read); free(data); return image; } /******************************************************************************* * *******************************************************************************/ #ifdef HAVE_LIBPNG int imageToPNG(const opj_image_t* image, const char* filename, int num_comp_select) { opj_image_cmptparm_t param_image_write; opj_image_t* image_write = NULL; param_image_write.x0 = 0; param_image_write.y0 = 0; param_image_write.dx = 0; param_image_write.dy = 0; param_image_write.h = image->comps[num_comp_select].h; param_image_write.w = image->comps[num_comp_select].w; param_image_write.bpp = image->comps[num_comp_select].bpp; param_image_write.prec = image->comps[num_comp_select].prec; param_image_write.sgnd = image->comps[num_comp_select].sgnd; image_write = opj_image_create(1, ¶m_image_write, CLRSPC_GRAY); memcpy(image_write->comps->data, image->comps[num_comp_select].data, param_image_write.h * param_image_write.w * sizeof(int)); imagetopng(image_write, filename); opj_image_destroy(image_write); return EXIT_SUCCESS; } #endif /******************************************************************************* * MAIN *******************************************************************************/ int main(int argc, char **argv) { test_cmp_parameters inParam; int it_comp, itpxl; int failed = 0; int nbFilenamePGXbase, nbFilenamePGXtest; char *filenamePNGtest= NULL, *filenamePNGbase = NULL, *filenamePNGdiff = NULL; int memsizebasefilename, memsizetestfilename, memsizedifffilename; int valueDiff = 0, nbPixelDiff = 0; double sumDiff = 0.0; /* Structures to store image parameters and data*/ opj_image_t *imageBase = NULL, *imageTest = NULL, *imageDiff = NULL; opj_image_cmptparm_t* param_image_diff; /* Get parameters from command line*/ if( parse_cmdline_cmp(argc, argv, &inParam) == EXIT_FAILURE ) { comparePGXimages_help_display(); if (inParam.tabMSEvalues) free(inParam.tabMSEvalues); if (inParam.tabPEAKvalues) free(inParam.tabPEAKvalues); if (inParam.base_filename) free(inParam.base_filename); if (inParam.test_filename) free(inParam.test_filename); return EXIT_FAILURE; } /* Display Parameters*/ printf("******Parameters********* \n"); printf(" base_filename = %s\n" " test_filename = %s\n" " nb of Components = %d\n" " Non regression test = %d\n" " separator Base = %s\n" " separator Test = %s\n", inParam.base_filename, inParam.test_filename, inParam.nbcomp, inParam.nr_flag, inParam.separator_base, inParam.separator_test); if ( (inParam.tabMSEvalues != NULL) && (inParam.tabPEAKvalues != NULL)) { printf(" MSE values = ["); for (it_comp = 0; it_comp < inParam.nbcomp; it_comp++) printf(" %f ", inParam.tabMSEvalues[it_comp]); printf("]\n"); printf(" PEAK values = ["); for (it_comp = 0; it_comp < inParam.nbcomp; it_comp++) printf(" %f ", inParam.tabPEAKvalues[it_comp]); printf("]\n"); printf(" Non-regression test = %d\n", inParam.nr_flag); } if (strlen(inParam.separator_base) == 0) nbFilenamePGXbase = 0; else nbFilenamePGXbase = inParam.nbcomp; if (strlen(inParam.separator_test) == 0) nbFilenamePGXtest = 0; else nbFilenamePGXtest = inParam.nbcomp; printf(" NbFilename to generate from base filename = %d\n", nbFilenamePGXbase); printf(" NbFilename to generate from test filename = %d\n", nbFilenamePGXtest); printf("************************* \n"); /*----------BASELINE IMAGE--------*/ memsizebasefilename = (int)strlen(inParam.test_filename) + 1 + 5 + 2 + 4; memsizetestfilename = (int)strlen(inParam.test_filename) + 1 + 5 + 2 + 4; imageBase = readImageFromFilePGX( inParam.base_filename, nbFilenamePGXbase, inParam.separator_base); if ( imageBase != NULL) { filenamePNGbase = (char*) malloc(memsizebasefilename); filenamePNGbase[0] = '\0'; strncpy(filenamePNGbase, inParam.test_filename, strlen(inParam.test_filename)); filenamePNGbase[strlen(inParam.test_filename)] = '\0'; strcat(filenamePNGbase, ".base"); /*printf("filenamePNGbase = %s [%d / %d octets]\n",filenamePNGbase, strlen(filenamePNGbase),memsizebasefilename );*/ } else { if (inParam.tabMSEvalues) free(inParam.tabMSEvalues); if (inParam.tabPEAKvalues) free(inParam.tabPEAKvalues); if (inParam.base_filename) free(inParam.base_filename); if (inParam.test_filename) free(inParam.test_filename); return EXIT_FAILURE; } /*----------TEST IMAGE--------*/ imageTest = readImageFromFilePGX(inParam.test_filename, nbFilenamePGXtest, inParam.separator_test); if ( imageTest != NULL) { filenamePNGtest = (char*) malloc(memsizetestfilename); filenamePNGtest[0] = '\0'; strncpy(filenamePNGtest, inParam.test_filename, strlen(inParam.test_filename)); filenamePNGtest[strlen(inParam.test_filename)] = '\0'; strcat(filenamePNGtest, ".test"); /*printf("filenamePNGtest = %s [%d / %d octets]\n",filenamePNGtest, strlen(filenamePNGtest),memsizetestfilename );*/ } else { if (imageBase) opj_image_destroy(imageBase); if (inParam.tabMSEvalues) free(inParam.tabMSEvalues); if (inParam.tabPEAKvalues) free(inParam.tabPEAKvalues); if (inParam.base_filename) free(inParam.base_filename); if (inParam.test_filename) free(inParam.test_filename); free(filenamePNGbase); return EXIT_FAILURE; } /*----------DIFF IMAGE--------*/ /* Allocate memory*/ param_image_diff = malloc( imageBase->numcomps * sizeof(opj_image_cmptparm_t)); /* Comparison of header parameters*/ printf("Step 1 -> Header comparison\n"); for (it_comp = 0; it_comp < imageBase->numcomps; it_comp++) { param_image_diff[it_comp].x0 = 0; param_image_diff[it_comp].y0 = 0; param_image_diff[it_comp].dx = 0; param_image_diff[it_comp].dy = 0; if (imageBase->comps[it_comp].sgnd != imageTest->comps[it_comp].sgnd) { printf("ERROR: sign mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).sgnd, ((imageTest->comps)[it_comp]).sgnd); failed = 1; } else param_image_diff[it_comp].sgnd = 0 ; if (((imageBase->comps)[it_comp]).prec != ((imageTest->comps)[it_comp]).prec) { printf("ERROR: prec mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).prec, ((imageTest->comps)[it_comp]).prec); failed = 1; } else param_image_diff[it_comp].prec = 8 ; if (((imageBase->comps)[it_comp]).bpp != ((imageTest->comps)[it_comp]).bpp) { printf("ERROR: byte per pixel mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).bpp, ((imageTest->comps)[it_comp]).bpp); failed = 1; } else param_image_diff[it_comp].bpp = 1 ; if (((imageBase->comps)[it_comp]).h != ((imageTest->comps)[it_comp]).h) { printf("ERROR: height mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).h, ((imageTest->comps)[it_comp]).h); failed = 1; } else param_image_diff[it_comp].h = imageBase->comps[it_comp].h ; if (((imageBase->comps)[it_comp]).w != ((imageTest->comps)[it_comp]).w) { printf("ERROR: width mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).w, ((imageTest->comps)[it_comp]).w); failed = 1; } else param_image_diff[it_comp].w = imageBase->comps[it_comp].w ; } /* If only one parameter is different, we stop the test*/ if (failed) { free(inParam.tabMSEvalues); free(inParam.tabPEAKvalues); free(inParam.base_filename); free(inParam.test_filename); free(filenamePNGbase); free(filenamePNGtest); opj_image_destroy(imageBase); opj_image_destroy(imageTest); free(param_image_diff); return EXIT_FAILURE; } imageDiff = opj_image_create(imageBase->numcomps, param_image_diff, CLRSPC_UNSPECIFIED); /* Free memory*/ free(param_image_diff); /* Measurement computation*/ printf("Step 2 -> measurement comparison\n"); memsizedifffilename = strlen(inParam.test_filename) + 1 + 5 + 2 + 4; filenamePNGdiff = (char*) malloc(memsizedifffilename); filenamePNGdiff[0] = '\0'; strncpy(filenamePNGdiff, inParam.test_filename, strlen(inParam.test_filename)); filenamePNGdiff[strlen(inParam.test_filename)] = '\0'; strcat(filenamePNGdiff, ".diff"); /*printf("filenamePNGdiff = %s [%d / %d octets]\n",filenamePNGdiff, strlen(filenamePNGdiff),memsizedifffilename );*/ /* Compute pixel diff*/ for (it_comp = 0; it_comp < imageDiff->numcomps; it_comp++) { double SE=0,PEAK=0; double MSE=0; char *filenamePNGbase_it_comp, *filenamePNGtest_it_comp, *filenamePNGdiff_it_comp; filenamePNGbase_it_comp = (char*) malloc(memsizebasefilename); filenamePNGbase_it_comp[0] = '\0'; strncpy(filenamePNGbase_it_comp,filenamePNGbase,strlen(filenamePNGbase)); filenamePNGbase_it_comp[strlen(filenamePNGbase)] = '\0'; filenamePNGtest_it_comp = (char*) malloc(memsizetestfilename); filenamePNGtest_it_comp[0] = '\0'; strncpy(filenamePNGtest_it_comp,filenamePNGtest,strlen(filenamePNGtest)); filenamePNGtest_it_comp[strlen(filenamePNGtest)] = '\0'; filenamePNGdiff_it_comp = (char*) malloc(memsizedifffilename); filenamePNGdiff_it_comp[0] = '\0'; strncpy(filenamePNGdiff_it_comp,filenamePNGdiff,strlen(filenamePNGdiff)); filenamePNGdiff_it_comp[strlen(filenamePNGdiff)] = '\0'; for (itpxl = 0; itpxl < ((imageDiff->comps)[it_comp]).w * ((imageDiff->comps)[it_comp]).h; itpxl++) { if (abs( ((imageBase->comps)[it_comp]).data[itpxl] - ((imageTest->comps)[it_comp]).data[itpxl] ) > 0) { valueDiff = ((imageBase->comps)[it_comp]).data[itpxl] - ((imageTest->comps)[it_comp]).data[itpxl]; ((imageDiff->comps)[it_comp]).data[itpxl] = abs(valueDiff); sumDiff += (double)valueDiff; nbPixelDiff++; SE += (double)(valueDiff * valueDiff); PEAK = (PEAK > abs(valueDiff)) ? PEAK : abs(valueDiff); } else ((imageDiff->comps)[it_comp]).data[itpxl] = 0; }/* h*w loop */ MSE = SE / ( ((imageDiff->comps)[it_comp]).w * ((imageDiff->comps)[it_comp]).h ); if (!inParam.nr_flag && (inParam.tabMSEvalues != NULL) && (inParam.tabPEAKvalues != NULL)) { /* Conformance test*/ printf(" %f \n", it_comp, PEAK); printf(" %f \n", it_comp, MSE); if ( (MSE > inParam.tabMSEvalues[it_comp]) || (PEAK > inParam.tabPEAKvalues[it_comp]) ) { printf("ERROR: MSE (%f) or PEAK (%f) values produced by the decoded file are greater " "than the allowable error (respectively %f and %f) \n", MSE, PEAK, inParam.tabMSEvalues[it_comp], inParam.tabPEAKvalues[it_comp]); failed = 1; } } else /* Non regression-test */ { if ( nbPixelDiff > 0) { char it_compc[255]; it_compc[0] = '\0'; printf(" %d \n", it_comp, nbPixelDiff); printf(" %f \n", it_comp, sumDiff); #ifdef HAVE_LIBPNG sprintf(it_compc, "_%i", it_comp); strcat(it_compc,".png"); strcat(filenamePNGbase_it_comp, it_compc); /*printf("filenamePNGbase_it = %s [%d / %d octets]\n",filenamePNGbase_it_comp, strlen(filenamePNGbase_it_comp),memsizebasefilename );*/ strcat(filenamePNGtest_it_comp, it_compc); /*printf("filenamePNGtest_it = %s [%d / %d octets]\n",filenamePNGtest_it_comp, strlen(filenamePNGtest_it_comp),memsizetestfilename );*/ strcat(filenamePNGdiff_it_comp, it_compc); /*printf("filenamePNGdiff_it = %s [%d / %d octets]\n",filenamePNGdiff_it_comp, strlen(filenamePNGdiff_it_comp),memsizedifffilename );*/ if ( imageToPNG(imageBase, filenamePNGbase_it_comp, it_comp) == EXIT_SUCCESS ) { printf(" %s \n", it_comp, filenamePNGbase_it_comp); } if ( imageToPNG(imageTest, filenamePNGtest_it_comp, it_comp) == EXIT_SUCCESS ) { printf(" %s \n", it_comp, filenamePNGtest_it_comp); } if ( imageToPNG(imageDiff, filenamePNGdiff_it_comp, it_comp) == EXIT_SUCCESS ) { printf(" %s \n", it_comp, filenamePNGdiff_it_comp); } #endif failed = 1; } } free(filenamePNGbase_it_comp); free(filenamePNGtest_it_comp); free(filenamePNGdiff_it_comp); } /* it_comp loop */ /*-----------------------------*/ /* Free memory */ opj_image_destroy(imageBase); opj_image_destroy(imageTest); opj_image_destroy(imageDiff); free(filenamePNGbase); free(filenamePNGtest); free(filenamePNGdiff); free(inParam.tabMSEvalues); free(inParam.tabPEAKvalues); free(inParam.base_filename); free(inParam.test_filename); if (failed) return EXIT_FAILURE; else { printf("---- TEST SUCCEED ----\n"); return EXIT_SUCCESS; } } openjpeg-1.5.2/tests/conformance/0000755000175000017500000000000012315072522016633 5ustar mathieumathieuopenjpeg-1.5.2/tests/conformance/CMakeLists.txt0000644000175000017500000004515712315002100021370 0ustar mathieumathieu# CONFORMANCE TESTS AND NON-REGRESSION ON THIS DATASET FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Temporary) SET(TEMP ${CMAKE_CURRENT_BINARY_DIR}/Temporary) SET(BASELINE_CONF ${OPJ_DATA_ROOT}/baseline/conformance) SET(BASELINE_NR ${OPJ_DATA_ROOT}/baseline/nonregression) SET(INPUT_CONF ${OPJ_DATA_ROOT}/input/conformance) # List of components by file (normaly p0_13.j2k have 257 components but for this #set of test we consider only 4) SET( CP0_nbC_list "not_used;1;1;1;3;4;4;3;3;1;3;1;1;4;3;1;1") SET( CP0_ignore_list "not_used;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0") SET( CP1_nbC_list "not_used;1;3;4;1;3;3;2") SET( CP1_ignore_list "not_used;0;0;0;0;0;0;0") SET(COMMENTCODEVAR FALSE) #-------------------------------------------------------------------------- # Tests about class 0 profile 0 # try to decode # compare to ref file provided by the Executable Test Suite # non regression comparison # Parameters and tolerances given by Table C.1 SET( C0P0_ResFactor_list "not_used;0;0;0;3;3;3;0;5;2;0;0;0;0;2;0;0") SET( C0P0_PEAK_list "not_used;0;0;0;33;54;109;10;7;4;10;0;0;0;0;0;0") SET( C0P0_MSE_list "not_used;0;0;0;55.8;68;743;0.34;6.72;1.47;2.84;0;0;0;0;0;0") FOREACH(numFileC0P0 RANGE 1 16) list(GET CP0_ignore_list ${numFileC0P0} ignore_test_value) IF(ignore_test_value EQUAL 0) # Build filenames IF(${numFileC0P0} LESS 10) SET( filenameInput p0_0${numFileC0P0}.j2k ) SET( filenameRef c0p0_0${numFileC0P0}.pgx ) ELSE(${numFileC0P0} LESS 10) SET( filenameInput p0_${numFileC0P0}.j2k ) SET( filenameRef c0p0_${numFileC0P0}.pgx ) ENDIF(${numFileC0P0} LESS 10) # Get corresponding tests parameters list(GET C0P0_ResFactor_list ${numFileC0P0} ResFactor) #For Class-0 testing, we always focus on the first component only #list(GET CP0_nbC_list ${numFileC0P0} nbComponents) set( nbComponents "1") list(GET C0P0_PEAK_list ${numFileC0P0} PEAK_limit) list(GET C0P0_MSE_list ${numFileC0P0} MSE_limit) # Manage cases which need to try different resolution reduction IF (numFileC0P0 EQUAL 3 OR numFileC0P0 EQUAL 15) get_filename_component(filenameRefSub ${filenameRef} NAME_WE) #r = 0 ADD_TEST(NAME ETS-C0P0-${filenameInput}-r0-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}-r0.pgx -r 0 ) ADD_TEST(NAME ETS-C0P0-${filenameInput}-r0-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRefSub}r0.pgx -t ${TEMP}/c0${filenameInput}-r0.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P0-${filenameInput}-r0-compare2ref PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-r0-decode) ADD_TEST(NAME NR-C0P0-${filenameInput}-r0-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRefSub}-r0.pgx -t ${TEMP}/c0${filenameInput}-r0.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P0-${filenameInput}-r0-compare2base PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-r0-decode) #r = 1 ADD_TEST(NAME ETS-C0P0-${filenameInput}-r1-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}-r1.pgx -r 1 ) ADD_TEST(NAME ETS-C0P0-${filenameInput}-r1-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRefSub}r1.pgx -t ${TEMP}/c0${filenameInput}-r1.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P0-${filenameInput}-r1-compare2ref PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-r1-decode) ADD_TEST(NAME NR-C0P0-${filenameInput}-r1-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRefSub}-r1.pgx -t ${TEMP}/c0${filenameInput}-r1.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P0-${filenameInput}-r1-compare2base PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-r1-decode) ELSE(numFileC0P0 EQUAL 3 OR numFileC0P0 EQUAL 15) ADD_TEST(NAME ETS-C0P0-${filenameInput}-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}.pgx -r ${ResFactor} ) ADD_TEST(NAME ETS-C0P0-${filenameInput}-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRef} -t ${TEMP}/c0${filenameInput}.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P0-${filenameInput}-compare2ref PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-decode) ADD_TEST(NAME NR-C0P0-${filenameInput}-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRef} -t ${TEMP}/c0${filenameInput}.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P0-${filenameInput}-compare2base PROPERTIES DEPENDS ETS-C0P0-${filenameInput}-decode) ENDIF(numFileC0P0 EQUAL 3 OR numFileC0P0 EQUAL 15) ENDIF(ignore_test_value EQUAL 0) ENDFOREACH(numFileC0P0) #-------------------------------------------------------------------------- # Tests about class 0 profile 1 # try to decode # compare to ref file # non regression comparison # Parameters and tolerances given by Table C.4 SET( C0P1_ResFactor_list "not_used;0;3;3;0;4;1;0") SET( C0P1_PEAK_list "not_used;0;35;28;2;128;128;0") SET( C0P1_MSE_list "not_used;0;74;18.8;0.550;16384;16384;0") FOREACH(numFileC0P1 RANGE 1 7) list(GET CP1_ignore_list ${numFileC0P1} ignore_test_value2) IF(ignore_test_value2 EQUAL 0) # Build filenames SET( filenameInput p1_0${numFileC0P1}.j2k ) SET( filenameRef c0p1_0${numFileC0P1}.pgx ) # Get corresponding tests parameters list(GET C0P1_ResFactor_list ${numFileC0P1} ResFactor) #For Class-0 testing, we always focus on the first component only #list(GET CP0_nbC_list ${numFileC0P0} nbComponents) set( nbComponents "1") list(GET C0P1_PEAK_list ${numFileC0P1} PEAK_limit) list(GET C0P1_MSE_list ${numFileC0P1} MSE_limit) # Manage cases which need to try different resolution reduction IF (numFileC0P1 EQUAL 4 ) get_filename_component(filenameRefSub ${filenameRef} NAME_WE) #r = 0 ADD_TEST(NAME ETS-C0P1-${filenameInput}-r0-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}-r0.pgx -r 0 ) ADD_TEST(NAME ETS-C0P1-${filenameInput}-r0-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRefSub}r0.pgx -t ${TEMP}/c0${filenameInput}-r0.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P1-${filenameInput}-r0-compare2ref PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-r0-decode) ADD_TEST(NAME NR-C0P1-${filenameInput}-r0-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRefSub}-r0.pgx -t ${TEMP}/c0${filenameInput}-r0.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P1-${filenameInput}-r0-compare2base PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-r0-decode) #r = 3 ADD_TEST(NAME ETS-C0P1-${filenameInput}-r3-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}-r3.pgx -r 3 ) ADD_TEST(NAME ETS-C0P1-${filenameInput}-r3-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRefSub}r3.pgx -t ${TEMP}/c0${filenameInput}-r3.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P1-${filenameInput}-r3-compare2ref PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-r3-decode) ADD_TEST(NAME NR-C0P1-${filenameInput}-r3-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRefSub}-r3.pgx -t ${TEMP}/c0${filenameInput}-r3.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P1-${filenameInput}-r3-compare2base PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-r3-decode) ELSE(numFileC0P1 EQUAL 4) ADD_TEST(NAME ETS-C0P1-${filenameInput}-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c0${filenameInput}.pgx -r ${ResFactor} ) ADD_TEST(NAME ETS-C0P1-${filenameInput}-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRef} -t ${TEMP}/c0${filenameInput}.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s t_ ) SET_TESTS_PROPERTIES(ETS-C0P1-${filenameInput}-compare2ref PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-decode) ADD_TEST(NAME NR-C0P1-${filenameInput}-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRef} -t ${TEMP}/c0${filenameInput}.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C0P1-${filenameInput}-compare2base PROPERTIES DEPENDS ETS-C0P1-${filenameInput}-decode) ENDIF(numFileC0P1 EQUAL 4) ENDIF(ignore_test_value2 EQUAL 0) ENDFOREACH(numFileC0P1) #-------------------------------------------------------------------------- # Tests about class 1 profile 0 # try to decode # compare to ref file # non regression comparison # Parameters and tolerances given by Table C.6 SET( C1P0_ResFactor_list "not_used;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0") SET( C1P0_PEAK_list "not_used;0;0;0;5:4:6;2:2:2:0;635:403:378:0;0:0:0;0:0:0;0;0:0:0;0;0;0:0:0:0;0:0:0;0;0") SET( C1P0_MSE_list "not_used;0;0;0;0.776:0.626:1.070;0.302:0.307:0.269:0;11287:6124:3968:0;0:0:0;0:0:0;0;0:0:0;0;0;0:0:0:0;0:0:0;0;0") FOREACH(numFileC1P0 RANGE 1 16) # Build filenames IF(${numFileC1P0} LESS 10) SET( filenameInput p0_0${numFileC1P0}.j2k ) SET( filenameRef c1p0_0${numFileC1P0}.pgx ) ELSE(${numFileC1P0} LESS 10) SET( filenameInput p0_${numFileC1P0}.j2k ) SET( filenameRef c1p0_${numFileC1P0}.pgx ) ENDIF(${numFileC1P0} LESS 10) # Get corresponding tests parameters list(GET CP0_nbC_list ${numFileC1P0} nbComponents) list(GET C1P0_ResFactor_list ${numFileC1P0} ResFactor) list(GET C1P0_PEAK_list ${numFileC1P0} PEAK_limit) list(GET C1P0_MSE_list ${numFileC1P0} MSE_limit) ADD_TEST(NAME ETS-C1P0-${filenameInput}-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c1${filenameInput}.pgx -r ${ResFactor} ) ADD_TEST(NAME ETS-C1P0-${filenameInput}-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRef} -t ${TEMP}/c1${filenameInput}.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s b_t_ ) SET_TESTS_PROPERTIES(ETS-C1P0-${filenameInput}-compare2ref PROPERTIES DEPENDS ETS-C1P0-${filenameInput}-decode) ADD_TEST(NAME NR-C1P0-${filenameInput}-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRef} -t ${TEMP}/c1${filenameInput}.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C1P0-${filenameInput}-compare2base PROPERTIES DEPENDS ETS-C1P0-${filenameInput}-decode) ENDFOREACH(numFileC1P0) #-------------------------------------------------------------------------- # Tests about class 1 profile 1 # try to decode # compare to ref file # non regression comparison # Parameters and tolerances given by Table C.7 SET( C1P1_PEAK_list "not_used;0;5:4:6;2:2:1:0;624;40:40:40;2:2:2;0:0") SET( C1P1_MSE_list "not_used;0;0.765:0.616:1.051;0.3:0.210:0.200:0;3080;8.458:9.816:10.154;0.6:0.6:0.6;0:0") FOREACH(numFileC1P1 RANGE 1 7) # Build filenames SET( filenameInput p1_0${numFileC1P1}.j2k ) SET( filenameRef c1p1_0${numFileC1P1}.pgx ) # Get corresponding tests parameters list(GET CP1_nbC_list ${numFileC1P1} nbComponents) list(GET C1P1_PEAK_list ${numFileC1P1} PEAK_limit) list(GET C1P1_MSE_list ${numFileC1P1} MSE_limit) ADD_TEST(NAME ETS-C1P1-${filenameInput}-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/c1${filenameInput}.pgx -r 0 ) ADD_TEST(NAME ETS-C1P1-${filenameInput}-compare2ref COMMAND comparePGXimages -b ${BASELINE_CONF}/${filenameRef} -t ${TEMP}/c1${filenameInput}.pgx -n ${nbComponents} -p ${PEAK_limit} -m ${MSE_limit} -s b_t_ ) SET_TESTS_PROPERTIES(ETS-C1P1-${filenameInput}-compare2ref PROPERTIES DEPENDS ETS-C1P1-${filenameInput}-decode) ADD_TEST(NAME NR-C1P1-${filenameInput}-compare2base COMMAND comparePGXimages -b ${BASELINE_NR}/opj_${filenameRef} -t ${TEMP}/c1${filenameInput}.pgx -n ${nbComponents} -d -s b_t_ ) SET_TESTS_PROPERTIES(NR-C1P1-${filenameInput}-compare2base PROPERTIES DEPENDS ETS-C1P1-${filenameInput}-decode) ENDFOREACH(numFileC1P1) #-------------------------------------------------------------------------- # Tests about JP2 file # try to decode # compare to ref file # non regression comparison # Tolerances given by Table G.1 FOREACH(numFileJP2 RANGE 1 9) # Build filenames SET( filenameInput "file${numFileJP2}.jp2" ) SET( filenameRef jp2_${numFileJP2}.tif ) # Get corresponding tests parameters list(GET JP2_PEAK_list ${numFileJP2} PEAK_limit) ADD_TEST(NAME ETS-JP2-${filenameInput}-decode COMMAND j2k_to_image -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/${filenameInput}.tif ) # # FIXME: Need to implement a compare tif images function # # ADD_TEST(NAME ETS-JP2-${filenameInput}-compare2ref # COMMAND compareTIFimages # -b ${BASELINE_CONF}/${filenameRef_tif} # -t ${TEMP}/${filenameInput}.pgx # -p 4 # ) # # SET_TESTS_PROPERTIES(ETS-JP2-${filenameInput}-compare2ref # PROPERTIES DEPENDS # ETS-JP2-${filenameInput}-decode) # # ADD_TEST(NAME NR-JP2-${filenameInput}-compare2base # COMMAND compareTIFimages # -b ${BASELINE_NR}/opj_${filenameRef} # -t ${TEMP}/${filenameInput}.tif # -d # ) # # SET_TESTS_PROPERTIES(NR-JP2-${filenameInput}-compare2base # PROPERTIES DEPENDS # ETS-JP2-${filenameInput}-decode) ENDFOREACH(numFileJP2) #--------------------------------------------------------------------------# #--------------------------------------------------------------------------# #--------------------------------------------------------------------------# #-------------------------------------------------------------------------- # Tests about dump of profile 0 file # try to dump image and codestream informations into a file # non regression comparison this file to the baseline FOREACH(numFileP0 RANGE 1 16) # Build filenames IF(${numFileP0} LESS 10) SET( filenameInput p0_0${numFileP0}.j2k ) ELSE(${numFileP0} LESS 10) SET( filenameInput p0_${numFileP0}.j2k ) ENDIF(${numFileP0} LESS 10) get_filename_component(filenameRefSub ${filenameInput} NAME_WE) ADD_TEST(NAME NR-${filenameInput}-dump COMMAND j2k_dump -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/${filenameInput}.txt ) ADD_TEST(NAME NR-${filenameInput}-compare_dump2base COMMAND compare_dump_files -b ${BASELINE_NR}/opj_${filenameRefSub}.txt -t ${TEMP}/${filenameInput}.txt ) SET_TESTS_PROPERTIES(NR-${filenameInput}-compare_dump2base PROPERTIES DEPENDS NR-${filenameInput}-dump) ENDFOREACH(numFileP0) #-------------------------------------------------------------------------- # Tests about dump of profile 1 file # try to dump image and codestream informations into a file # non regression comparison this file to the baseline FOREACH(numFileP1 RANGE 1 7) # Build filenames SET( filenameInput p1_0${numFileP1}.j2k ) get_filename_component(filenameInputSub ${filenameInput} NAME_WE) ADD_TEST(NAME NR-${filenameInput}-dump COMMAND j2k_dump -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/${filenameInput}.txt ) ADD_TEST(NAME NR-${filenameInput}-compare_dump2base COMMAND compare_dump_files -b ${BASELINE_NR}/opj_${filenameInputSub}.txt -t ${TEMP}/${filenameInput}.txt ) SET_TESTS_PROPERTIES(NR-${filenameInput}-compare_dump2base PROPERTIES DEPENDS NR-${filenameInput}-dump) ENDFOREACH(numFileP1) #-------------------------------------------------------------------------- # Tests about dump of JP2 file # try to dump image and codestream informations into a file # non regression comparison this file to the baseline FOREACH(numFileJP2 RANGE 1 9) # Build filenames SET( filenameInput "file${numFileJP2}.jp2" ) get_filename_component(filenameInputSub ${filenameInput} NAME_WE) ADD_TEST(NAME NR-${filenameInput}-dump COMMAND j2k_dump -i ${INPUT_CONF}/${filenameInput} -o ${TEMP}/${filenameInput}.txt ) ADD_TEST(NAME NR-${filenameInput}-compare_dump2base COMMAND compare_dump_files -b ${BASELINE_NR}/opj_${filenameInputSub}.txt -t ${TEMP}/${filenameInput}.txt ) SET_TESTS_PROPERTIES(NR-${filenameInput}-compare_dump2base PROPERTIES DEPENDS NR-${filenameInput}-dump) ENDFOREACH(numFileJP2) openjpeg-1.5.2/tests/compare_dump_files.c0000644000175000017500000001761012315002100020330 0ustar mathieumathieu/* * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes * 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. */ /* * compare_dump_files.c * * Created on: 25 juil. 2011 * Author: mickael * BASELINE MUST BE GENERATED BY UNIX PLATFORM REGARDING TO THE CRLF PROBLEM */ #include #include #include #include #include "opj_getopt.h" typedef struct test_cmp_parameters { /** */ char* base_filename; /** */ char* test_filename; } test_cmp_parameters; /******************************************************************************* * Command line help function *******************************************************************************/ void compare_dump_files_help_display(void) { fprintf(stdout,"\nList of parameters for the compare_dump_files function \n"); fprintf(stdout,"\n"); fprintf(stdout," -b \t REQUIRED \t filename to the reference/baseline dump file \n"); fprintf(stdout," -t \t REQUIRED \t filename to the test dump file image\n"); fprintf(stdout,"\n"); } /******************************************************************************* * Parse command line *******************************************************************************/ int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param) { int sizemembasefile, sizememtestfile; int index; const char optlist[] = "b:t:"; int c; /* Init parameters */ param->base_filename = NULL; param->test_filename = NULL; opj_opterr = 0; while ((c = opj_getopt(argc, argv, optlist)) != -1) switch (c) { case 'b': sizemembasefile = (int)strlen(opj_optarg)+1; param->base_filename = (char*) malloc(sizemembasefile); param->base_filename[0] = '\0'; strncpy(param->base_filename, opj_optarg, strlen(opj_optarg)); param->base_filename[strlen(opj_optarg)] = '\0'; /*printf("param->base_filename = %s [%d / %d]\n", param->base_filename, strlen(param->base_filename), sizemembasefile );*/ break; case 't': sizememtestfile = (int) strlen(opj_optarg) + 1; param->test_filename = (char*) malloc(sizememtestfile); param->test_filename[0] = '\0'; strncpy(param->test_filename, opj_optarg, strlen(opj_optarg)); param->test_filename[strlen(opj_optarg)] = '\0'; /*printf("param->test_filename = %s [%d / %d]\n", param->test_filename, strlen(param->test_filename), sizememtestfile);*/ break; case '?': if ( (opj_optopt == 'b') || (opj_optopt == 't') ) fprintf(stderr, "Option -%c requires an argument.\n", opj_optopt); else if (isprint(opj_optopt)) fprintf(stderr, "Unknown option `-%c'.\n", opj_optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", opj_optopt); return 1; default: fprintf(stderr, "WARNING -> this option is not valid \"-%c %s\"\n", c, opj_optarg); break; } if (opj_optind != argc) { for (index = opj_optind; index < argc; index++) fprintf(stderr,"Non-option argument %s\n", argv[index]); return EXIT_FAILURE; } return EXIT_SUCCESS; } /******************************************************************************* * MAIN *******************************************************************************/ int main(int argc, char **argv) { test_cmp_parameters inParam; FILE *fbase=NULL, *ftest=NULL; int chbase, chtest; int same = 1; unsigned long l=1, pos; if( parse_cmdline_cmp(argc, argv, &inParam) == EXIT_FAILURE ) { compare_dump_files_help_display(); if (!inParam.base_filename) free(inParam.base_filename); if (!inParam.test_filename) free(inParam.test_filename); return EXIT_FAILURE; } /* Display Parameters*/ printf("******Parameters********* \n"); printf(" base_filename = %s\n" " test_filename = %s\n", inParam.base_filename, inParam.test_filename); printf("************************* \n"); /* open base file */ printf("Try to open: %s for reading ... ", inParam.base_filename); if((fbase = fopen(inParam.base_filename, "rb"))==NULL) { printf("Failed.\n"); free(inParam.base_filename); free(inParam.test_filename); return EXIT_FAILURE; } printf("Ok.\n"); /* open test file */ printf("Try to open: %s for reading ... ", inParam.test_filename); if((ftest = fopen(inParam.test_filename, "rb"))==NULL) { printf("Failed.\n"); fclose(fbase); free(inParam.base_filename); free(inParam.test_filename); return EXIT_FAILURE; } printf("Ok.\n"); pos=ftell(fbase); while(!feof(fbase)) { chbase = fgetc(fbase); if(ferror(fbase)) { printf("Error reading base file.\n"); return EXIT_FAILURE; } chtest = fgetc(ftest); if(ferror(ftest)) { printf("Error reading test file.\n"); return EXIT_FAILURE; } /* CRLF problem (Baseline must be always generated by unix platform)*/ if (chbase == '\n' && chtest == '\r') if (fgetc(ftest) == '\n') chtest = '\n'; if(chbase != chtest) { size_t nbytes = 2048; int CRLF_shift=1; char *strbase, *strtest, *strbase_d, *strtest_d; printf("Files differ at line %lu:\n", l); fseek(fbase,pos,SEEK_SET); /* Take into account CRLF characters when we write \n into // dump file when we used WIN platform*/ #ifdef _WIN32 CRLF_shift = 2; fseek(ftest,pos + l - 1,SEEK_SET); #else fseek(ftest,pos,SEEK_SET); #endif strbase = (char *) malloc(nbytes + 1); strtest = (char *) malloc(nbytes + 1); if (fgets(strbase, nbytes, fbase) == NULL) fprintf(stderr,"\nWARNING: fgets return a NULL value"); else { if (fgets(strtest, nbytes, ftest) == NULL) fprintf(stderr,"\nWARNING: fgets return a NULL value"); else { strbase_d = (char *) malloc(strlen(strbase)+1); strtest_d = (char *) malloc(strlen(strtest)+1); strncpy(strbase_d, strbase, strlen(strbase)-1); strncpy(strtest_d, strtest, strlen(strtest)-CRLF_shift); strbase_d[strlen(strbase)-1] = '\0'; strtest_d[strlen(strtest)-CRLF_shift] = '\0'; printf("<%s> vs. <%s>\n", strbase_d, strtest_d); free(strbase_d);free(strtest_d); } } free(strbase);free(strtest); same = 0; break; } else { if (chbase == '\n') { l++; pos = ftell(fbase); } } } /*Close File*/ fclose(fbase); fclose(ftest); /* Free memory*/ free(inParam.base_filename); free(inParam.test_filename); if(same) { printf("\n***** TEST SUCCEED: Files are the same. *****\n"); return EXIT_SUCCESS; } else return EXIT_FAILURE; } openjpeg-1.5.2/tests/nonregression/0000755000175000017500000000000012315072522017234 5ustar mathieumathieuopenjpeg-1.5.2/tests/nonregression/checkmd5refs.cmake0000644000175000017500000000366212315002100022571 0ustar mathieumathieu# Copyright (c) 2014 Mathieu Malaterre # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # check md5 refs # # This script will be used to make sure we never introduce a regression on any # of the nonregression file. # # The approach is relatively simple, we compute a md5sum for each of the decode # file. Anytime the md5sum is different from the reference one, we assume # something went wrong and simply fails. of course if could happen during the # course of openjpeg development that the internals are changed that impact the # decoding process that the output would be bitwise different (while PSNR would # be kept identical). #message("0: ${REFFILE}") #message("1: ${CMAKE_CURRENT_BINARY_DIR}") #message("2: ${FILENAME}") file(GLOB globfiles "Temporary/${FILENAME}*.pgx" ) #message("6: ${globfiles}") # REFFILE follow what md5sum -c would expect as input: file(READ ${REFFILE} variable) #string(REGEX REPLACE "\r?\n" ";" variable "${variable}") foreach(pgxfullpath ${globfiles}) get_filename_component(pgxfile ${pgxfullpath} NAME) #message("8: ${pgxfile}") execute_process( COMMAND ${CMAKE_COMMAND} -E md5sum ${pgxfile} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Temporary RESULT_VARIABLE res OUTPUT_VARIABLE output ERROR_VARIABLE error_output OUTPUT_STRIP_TRAILING_WHITESPACE # important ) # Pass the output back to ctest if(res) message(SEND_ERROR "md5 could not be computed, it failed with value ${res}. Output was: ${error_output}") endif() #message("3: ${output}") #message("4: ${variable}") string(REGEX MATCH "[0-9a-f]+ ${pgxfile}" output_var "${variable}") #message("5: ${output_var}") if("${output_var}" STREQUAL "${output}") #message("6: eqal") else() message(SEND_ERROR "not equal: [${output_var}] vs [${output}]") endif() endforeach() openjpeg-1.5.2/tests/nonregression/CMakeLists.txt0000644000175000017500000002435212315002100021763 0ustar mathieumathieu# NON-REGRESSION TESTS ON THIS DATASET LOCATED ${OPJ_DATA_ROOT}/input/nonregression FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Temporary) SET(TEMP ${CMAKE_CURRENT_BINARY_DIR}/Temporary) SET(BASELINE_NR ${OPJ_DATA_ROOT}/baseline/nonregression) SET(INPUT_NR ${OPJ_DATA_ROOT}/input/nonregression) SET(INPUT_NR_PATH ${INPUT_NR}) SET(TEMP_PATH ${TEMP}) # need kdu_expand if possible find_package(KAKADU) ######################################################################### # GENERATION OF THE TEST SUITE # Read one and more input file(s) (located in ${OPJ_DATA_ROOT}/input/nonregression) # to know which files processed and with which options. # Configure the test suite file: CONFIGURE_FILE("test_suite.ctest.in" "${CMAKE_CURRENT_BINARY_DIR}/test_suite.ctest" @ONLY) # Read the file into a list FILE(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/test_suite.ctest OPJ_TEST_CMD_LINE_LIST) # Try to find and configure and read another test suite file FILE(GLOB TEST_SUITE_FILES *.ctest.in) IF (TEST_SUITE_FILES) FOREACH(TEST_SUITE_FILE ${TEST_SUITE_FILES}) # Avoid to process the official test suite SET(FILE_ALREADY_READ 0) STRING(REGEX MATCH "test_suite.ctest.in$" FILE_ALREADY_READ ${TEST_SUITE_FILE}) IF(NOT FILE_ALREADY_READ) # Configure the additional test suite file: GET_FILENAME_COMPONENT(TEST_SUITE_FILE_SUB ${TEST_SUITE_FILE} NAME_WE) CONFIGURE_FILE("${TEST_SUITE_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${TEST_SUITE_FILE_SUB}.ctest" @ONLY) # Read the additional file into a list FILE(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/${TEST_SUITE_FILE_SUB}.ctest OPJ_TEST_CMD_LINE_LIST_TEMP) # Append the list of command SET(OPJ_TEST_CMD_LINE_LIST ${OPJ_TEST_CMD_LINE_LIST} ${OPJ_TEST_CMD_LINE_LIST_TEMP}) ENDIF(NOT FILE_ALREADY_READ) ENDFOREACH(TEST_SUITE_FILE) ELSE(TEST_SUITE_FILES) MESSAGE(FATAL_ERROR "One test suite should be available (test_suite.ctest.in) !!!") ENDIF(TEST_SUITE_FILES) # Parse the command line found in the file(s) SET(IT_TEST_ENC 0) SET(IT_TEST_DEC 0) FOREACH(OPJ_TEST_CMD_LINE ${OPJ_TEST_CMD_LINE_LIST}) SET(IGNORE_LINE_FOUND 0) # Replace space by ; to generate a list STRING(REPLACE " " ";" CMD_ARG_LIST ${OPJ_TEST_CMD_LINE}) # Check if the first argument begin by the comment sign LIST(GET CMD_ARG_LIST 0 EXE_NAME) STRING(REGEX MATCH "^#" IGNORE_LINE_FOUND ${EXE_NAME}) IF(IGNORE_LINE_FOUND) #MESSAGE( STATUS "Current line is ignored: ${OPJ_TEST_CMD_LINE}") ELSE(IGNORE_LINE_FOUND) # Check if the first argument begin by the failed sign SET(FAILED_TEST_FOUND 0) STRING(REGEX MATCH "^!" FAILED_TEST_FOUND ${EXE_NAME}) IF (FAILED_TEST_FOUND) # Manage the different cases with the failed sign to remove the first argument which must be image_to_j2k SET(FAILED_TEST_FOUND_1 0) STRING(REGEX MATCH "^!image_to_j2k$|^!j2k_to_image$" FAILED_TEST_FOUND_1 ${EXE_NAME}) IF (FAILED_TEST_FOUND_1) LIST(REMOVE_AT CMD_ARG_LIST 0) ELSE (FAILED_TEST_FOUND_1) SET(FAILED_TEST_FOUND_2 0) LIST(GET CMD_ARG_LIST 1 EXE_NAME) STRING(REGEX MATCH "^image_to_j2k$|^j2k_to_image$" FAILED_TEST_FOUND_2 ${EXE_NAME}) IF (FAILED_TEST_FOUND_2) LIST(REMOVE_AT CMD_ARG_LIST 0) LIST(REMOVE_AT CMD_ARG_LIST 0) ELSE (FAILED_TEST_FOUND_2) MESSAGE( FATAL_ERROR "${EXE_NAME} is not the right executable name to encode file (try to use image_to_j2k or j2k_to_image)") ENDIF (FAILED_TEST_FOUND_2) ENDIF (FAILED_TEST_FOUND_1) ELSE (FAILED_TEST_FOUND) # Check if the first argument is equal to image_to_j2k STRING(REGEX MATCH "^image_to_j2k$|^j2k_to_image$" EXE_NAME_FOUND ${EXE_NAME}) IF(EXE_NAME_FOUND) STRING(REGEX MATCH "image_to_j2k" ENC_TEST_FOUND ${EXE_NAME}) ELSE(EXE_NAME_FOUND) MESSAGE( FATAL_ERROR "${EXE_NAME} is not the right executable name to encode file (try to use image_to_j2k)") ENDIF(EXE_NAME_FOUND) LIST(REMOVE_AT CMD_ARG_LIST 0) ENDIF (FAILED_TEST_FOUND) # Parse the argument list to find the input filename and output filename SET(CMD_ARG_LIST_2 "") SET(ARG_POS 0) SET(INPUT_ARG_POS 0) SET(OUTPUT_ARG_POS 0) FOREACH(CMD_ARG_ELT ${CMD_ARG_LIST}) math(EXPR ARG_POS "${ARG_POS}+1" ) STRING(COMPARE EQUAL ${CMD_ARG_ELT} "-i" INPUT_ARG_FOUND) IF(INPUT_ARG_FOUND) SET(INPUT_ARG_POS ${ARG_POS}) SET(INPUT_ARG_FOUND 0) ENDIF(INPUT_ARG_FOUND) STRING(COMPARE EQUAL ${CMD_ARG_ELT} "-o" OUTPUT_ARG_FOUND) IF(OUTPUT_ARG_FOUND) SET(OUTPUT_ARG_POS ${ARG_POS}) SET(OUTPUT_ARG_FOUND 0) ENDIF(OUTPUT_ARG_FOUND) LIST (APPEND CMD_ARG_LIST_2 ${CMD_ARG_ELT}) ENDFOREACH(CMD_ARG_ELT) LIST(GET CMD_ARG_LIST_2 ${INPUT_ARG_POS} INPUT_FILENAME) GET_FILENAME_COMPONENT(INPUT_FILENAME_NAME ${INPUT_FILENAME} NAME) GET_FILENAME_COMPONENT(INPUT_FILENAME_NAME_WE ${INPUT_FILENAME_NAME} NAME_WE) LIST(GET CMD_ARG_LIST_2 ${OUTPUT_ARG_POS} OUTPUT_FILENAME) GET_FILENAME_COMPONENT(OUTPUT_FILENAME_NAME_WE ${OUTPUT_FILENAME} NAME_WE) #----- # Now we can add the test suite corresponding to a line command in the file #----- # ENCODER TEST SUITE IF(ENC_TEST_FOUND) math(EXPR IT_TEST_ENC "${IT_TEST_ENC}+1" ) # Encode an image into the jpeg2000 format ADD_TEST(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode COMMAND image_to_j2k ${CMD_ARG_LIST_2} ) IF(FAILED_TEST_FOUND) SET_TESTS_PROPERTIES(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode PROPERTIES WILL_FAIL TRUE) ELSE(FAILED_TEST_FOUND) # Dump the encoding file ADD_TEST(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump COMMAND j2k_dump -i ${OUTPUT_FILENAME} -o ${OUTPUT_FILENAME}-ENC-${IT_TEST_ENC}.txt ) SET_TESTS_PROPERTIES(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump PROPERTIES DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode) # Compare the dump file with the baseline ADD_TEST(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dump2base COMMAND compare_dump_files -b ${BASELINE_NR}/opj_${OUTPUT_FILENAME_NAME_WE}-ENC-${IT_TEST_ENC}.txt -t ${OUTPUT_FILENAME}-ENC-${IT_TEST_ENC}.txt ) SET_TESTS_PROPERTIES(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dump2base PROPERTIES DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-dump) # Decode the encoding file with kakadu expand command IF (KDU_EXPAND_EXECUTABLE) ADD_TEST(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref COMMAND ${KDU_EXPAND_EXECUTABLE} -i ${OUTPUT_FILENAME} -o ${OUTPUT_FILENAME}.raw ) SET_TESTS_PROPERTIES(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref PROPERTIES DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-encode) # Compare the decoding file with baseline generated from the kdu_expand and baseline.j2k ADD_TEST(NAME NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dec-ref-out2base COMMAND compareRAWimages -b ${BASELINE_NR}/opj_${OUTPUT_FILENAME_NAME_WE}-ENC-${IT_TEST_ENC}.raw -t ${OUTPUT_FILENAME}.raw ) SET_TESTS_PROPERTIES(NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-compare_dec-ref-out2base PROPERTIES DEPENDS NR-ENC-${INPUT_FILENAME_NAME}-${IT_TEST_ENC}-decode-ref) ENDIF() ENDIF(FAILED_TEST_FOUND) # DECODER TEST SUITE ELSE(ENC_TEST_FOUND) math(EXPR IT_TEST_DEC "${IT_TEST_DEC}+1" ) # Decode the input image ADD_TEST(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode COMMAND j2k_to_image ${CMD_ARG_LIST_2} ) IF(FAILED_TEST_FOUND) SET_TESTS_PROPERTIES(NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode PROPERTIES WILL_FAIL TRUE) ELSE(FAILED_TEST_FOUND) # if not failed, check against registered md5: add_test(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-decode-md5 COMMAND ${CMAKE_COMMAND} -DREFFILE:STRING=${CMAKE_CURRENT_SOURCE_DIR}/md5refs.txt -DFILENAME:STRING=${INPUT_FILENAME_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/checkmd5refs.cmake) # FIXME: add a compare2base function base on raw which # can output png diff files if necesary # ADD_TEST(NAME NR-${filename}-compare2base # COMMAND comparePGXimages # -b ${BASELINE_NR}/opj_${filenameRef} # -t ${TEMP}/${filename}.pgx # -n ${nbComponents} # -d # -s b_t_ # ) # # SET_TESTS_PROPERTIES(NR-${filename}-compare2base # PROPERTIES DEPENDS # NR-${filename}-decode) # Dump the input image ADD_TEST(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-dump COMMAND j2k_dump -i ${INPUT_FILENAME} -o ${TEMP}/${INPUT_FILENAME_NAME}.txt ) # Compare the dump output with the baseline ADD_TEST(NAME NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-compare_dump2base COMMAND compare_dump_files -b ${BASELINE_NR}/opj_${INPUT_FILENAME_NAME_WE}.txt -t ${TEMP}/${INPUT_FILENAME_NAME}.txt ) SET_TESTS_PROPERTIES(NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-compare_dump2base PROPERTIES DEPENDS NR-DEC-${INPUT_FILENAME_NAME}-${IT_TEST_DEC}-dump) ENDIF(FAILED_TEST_FOUND) ENDIF(ENC_TEST_FOUND) ENDIF(IGNORE_LINE_FOUND) ENDFOREACH(OPJ_TEST_CMD_LINE) openjpeg-1.5.2/tests/nonregression/md5refs.txt0000644000175000017500000001142112315002100021322 0ustar mathieumathieu6f22c9a9bd474202ac6cd3a066e15200 _00042.j2k_0.pgx a3a0606dfa0779d657c6a923b90e4678 _00042.j2k_1.pgx 106954dc468dfe0884d02268e91f9f5b _00042.j2k_2.pgx 8889def55f1e18dae6002b9b3a6dd152 123.j2c_0.pgx 4a0daf7a9065101379eaebc28e436b1e Bretagne2.j2k_0.pgx 07578fc7bf81d3da694de8ae27308b82 Bretagne2.j2k_1.pgx 3690c42f83bad42f4abea48525d45e0e Bretagne2.j2k_2.pgx 8889def55f1e18dae6002b9b3a6dd152 bug.j2c_0.pgx 22c8d33a956ba83079d1102457bc77a1 buxI.j2k_0.pgx b8f473c07ba5ebfc195bdd53c3b3b97f buxR.j2k_0.pgx 05c062aca83d13b8095460f38a690a08 Cannotreaddatawithnosizeknown.j2k_0.pgx 6276da0ec5fac44d683d3468b290331d cthead1.j2k_0.pgx 8afcac9a696cc8d753b0eb9f4ae692ff CT_Phillips_JPEG2K_Decompr_Problem.j2k_0.pgx 04d35ab6160c9029549f72358df984da file409752_0.pgx 2813bd6fdc2c306b91b3da3688b8bf49 file409752_1.pgx e273e2aaea4a4fc1b2cf7c09c53c3cc6 file409752_2.pgx 05c062aca83d13b8095460f38a690a08 illegalcolortransform.j2k_0.pgx cb28787aa7c223f03e6acad71e244108 issue104_jpxstream.jp2_0.pgx cb28787aa7c223f03e6acad71e244108 issue104_jpxstream.jp2_1.pgx cb28787aa7c223f03e6acad71e244108 issue104_jpxstream.jp2_2.pgx adda4f5e46845b96dd3df14a76aa7229 issue188_beach_64bitsbox.jp2_0.pgx 90a9709c166019d1e101e7b96d257ed9 issue188_beach_64bitsbox.jp2_1.pgx 37e23d2df06ee60bf0f9f5e1c16054d8 issue188_beach_64bitsbox.jp2_2.pgx cb89739232898a823355861d834b5734 issue205.jp2_0.pgx a09d34928fd86e6f2d7e6edc1764d2b7 issue205.jp2_1.pgx 6f712d0685f2c5522f01b238365f4284 issue205.jp2_2.pgx de992d54d59032eb07d21983dbe8155b issue205.jp2_3.pgx 8fae7a39e459409f64e4529d2214087a issue206_image-000.jp2_0.pgx 555a504a93c9a14f61c894da3b393e87 issue206_image-000.jp2_1.pgx 5f06b7c45446ae20c22cada46478a9dc issue206_image-000.jp2_2.pgx e1807db57b5f5192c4b77b83e8b5c477 issue228.j2k_0.pgx 4093cc34d838780b35a8be410247fa7f j2k32.j2k_0.pgx ce4e556aaa0844b92a92c35c200fc43e j2k32.j2k_1.pgx ea926520f990640862f3fe6616097613 j2k32.j2k_2.pgx 66b60e866991e03f9a2de18e80d3102b kakadu_v4-4_openjpegv2_broken.j2k_0.pgx 12a8a4668315d9ae27969991251ce85f kodak_2layers_lrcp.j2c_0.pgx 56d0b0c547d6d5bb12f0c36e88722b11 kodak_2layers_lrcp.j2c_1.pgx 48ba092fb40090c160bbd08bdf7bdbf2 kodak_2layers_lrcp.j2c_2.pgx 05c062aca83d13b8095460f38a690a08 MarkerIsNotCompliant.j2k_0.pgx ff73d2bd32951d9e55b02186aac24aff Marrin.jp2_0.pgx 55ce884dd2346af6a5172a434ee578fa Marrin.jp2_1.pgx 29131264861b4ee21011149b27e4d488 mem-b2ace68c-1381.jp2_0.pgx 29131264861b4ee21011149b27e4d488 mem-b2ace68c-1381.jp2_1.pgx 29131264861b4ee21011149b27e4d488 mem-b2ace68c-1381.jp2_2.pgx df568fe0529219cc2c8f215e236f4b3d mem-b2ace68c-1381.jp2_3.pgx 41ec1a0228c703b10f95388c1160753b mem-b2b86b74-2753.jp2_0.pgx 41ec1a0228c703b10f95388c1160753b mem-b2b86b74-2753.jp2_1.pgx 41ec1a0228c703b10f95388c1160753b mem-b2b86b74-2753.jp2_2.pgx 97557ab9e38a7aff621e583fbb66b099 merged.jp2_0.pgx 386fbdcd294429733e3272d62ed5a15a merged.jp2_1.pgx d3907bbd67be1dae31b4377fa4dc0373 merged.jp2_2.pgx de8bba9ac366eeb2f170f0cf3605cf12 movie_00000.j2k_0.pgx 334bac3285f7138e9dd29d59bdcb22ff movie_00000.j2k_1.pgx 5511d2c96d1d1f2062491e00d5234506 movie_00000.j2k_2.pgx de8bba9ac366eeb2f170f0cf3605cf12 movie_00001.j2k_0.pgx 334bac3285f7138e9dd29d59bdcb22ff movie_00001.j2k_1.pgx 5511d2c96d1d1f2062491e00d5234506 movie_00001.j2k_2.pgx de8bba9ac366eeb2f170f0cf3605cf12 movie_00002.j2k_0.pgx 334bac3285f7138e9dd29d59bdcb22ff movie_00002.j2k_1.pgx 5511d2c96d1d1f2062491e00d5234506 movie_00002.j2k_2.pgx 951a55623a92e97a064a350f11c2637d orb-blue10-lin-j2k.j2k_0.pgx 5033aaf699dfa3dfe041af33c9ad688d orb-blue10-lin-j2k.j2k_1.pgx dbe33d72484caedf9c2cc18fd670884c orb-blue10-lin-j2k.j2k_2.pgx 0fec67d9546171699958c6682e725b79 orb-blue10-lin-j2k.j2k_3.pgx 84462261381b6732ec4f2addb0070d24 orb-blue10-lin-jp2.jp2_0.pgx 6129edf57e5db2344fcde5ce99ae8732 orb-blue10-lin-jp2.jp2_1.pgx fdad26b1e078aa32bd4b77a5f44da43c orb-blue10-lin-jp2.jp2_2.pgx 0fec67d9546171699958c6682e725b79 orb-blue10-lin-jp2.jp2_3.pgx 671feee525e2485060536edbf21380f1 orb-blue10-win-j2k.j2k_0.pgx 912cdee24dd360b7999f7ee4a51083b4 orb-blue10-win-j2k.j2k_1.pgx 64833b4b7557936b9233087e92f8ae28 orb-blue10-win-j2k.j2k_2.pgx 789a299a1523b2d9d3f561d12a2da817 orb-blue10-win-j2k.j2k_3.pgx 671feee525e2485060536edbf21380f1 orb-blue10-win-jp2.jp2_0.pgx 7442756e83571c0e87493e03f12b2d34 orb-blue10-win-jp2.jp2_1.pgx 5f99ff2aeb17e167fe7049bcf339d0b3 orb-blue10-win-jp2.jp2_2.pgx fe028d56d6c7aaee87239a115093412a orb-blue10-win-jp2.jp2_3.pgx 371aa0a7ff40a73b45f1fa41e210d1db pacs.ge.j2k_0.pgx 6ae110e1fb5a869af3dbc5fbc735b0bd relax.jp2_0.pgx 518a8f28dacc034982507f43763b88dd relax.jp2_1.pgx c678b04f4d3e59b9d66a8bce37c553c0 relax.jp2_2.pgx cdb1d69eb48ffd8545751326b86d9d7e test_lossless.j2k_0.pgx a37e7e5811d7c0c7adb61582790ccd33 text_GBR.jp2_0.pgx fc2173be54954a146b4e2887ee14be06 text_GBR.jp2_1.pgx 14108b4fb8d9126750db0424417ed17d text_GBR.jp2_2.pgx openjpeg-1.5.2/tests/nonregression/test_suite.ctest.in0000644000175000017500000003026312315002100023062 0ustar mathieumathieu# This file list all the input commands of the tests run by the ctest command # which are not related to the conformance files. # # For each line of this file (exept line which begin with #) an image_to_j2k # test or a j2k_to_image is run and its related tests. # + For encoder related tests = dump, compare dump to base, decode the # encoded file with reference and compare the decoded file with the baseline # decoded previously with ref decoder. # + For decoder related tests = dump, compare dump to base, (TODO: compare # outpout decoding image to base) # # Line begining with ! should fail (use for bad jpeg2000 file which should # gracefully be rejected) # # You can use @INPUT_NR_PATH@ and @TEMP_PATH@ cmake variable which refers to # OPJ_DATA_ROOT repository. You can use either relative path or absolute path. # However you cannot have space in the path for neither INPUT_NR_PATH nor # TEMP_PATH # ENCODER TEST SUITE image_to_j2k -i @INPUT_NR_PATH@/Bretagne1.ppm -o @TEMP_PATH@/Bretagne1_0.j2k -r 200,50,10 image_to_j2k -i @INPUT_NR_PATH@/Bretagne1.ppm -o @TEMP_PATH@/Bretagne1_1.j2k -q 30,35,40 -n 2 image_to_j2k -i @INPUT_NR_PATH@/Bretagne1.ppm -o @TEMP_PATH@/Bretagne1_2.j2k -q 30,35,40 -b 16,16 -c [64,64] image_to_j2k -i @INPUT_NR_PATH@/Bretagne2.ppm -o @TEMP_PATH@/Bretagne2_0.j2k -c [128,128],[128,128],[128,128] -r 100,20,2 -t 640,480 -b 32,32 image_to_j2k -i @INPUT_NR_PATH@/Bretagne2.ppm -o @TEMP_PATH@/Bretagne2_1.j2k -t 127,127 -p PCRL image_to_j2k -i @INPUT_NR_PATH@/Bretagne2.ppm -o @TEMP_PATH@/Bretagne2_2.j2k -s 2,2 -SOP image_to_j2k -i @INPUT_NR_PATH@/Bretagne2.ppm -o @TEMP_PATH@/Bretagne2_3.j2k -EPH -M 38 image_to_j2k -i @INPUT_NR_PATH@/Bretagne2.ppm -o @TEMP_PATH@/Bretagne2_4.j2k -d 150,300 -r 800 image_to_j2k -i @INPUT_NR_PATH@/Cevennes1.bmp -o @TEMP_PATH@/Cevennes1.j2k -r 10 image_to_j2k -i @INPUT_NR_PATH@/Cevennes2.ppm -o @TEMP_PATH@/Cevennes2.jp2 -r 50 image_to_j2k -i @INPUT_NR_PATH@/Rome.bmp -o @TEMP_PATH@/Rome.jp2 -q 30,35,50 -p LRCP -n 3 image_to_j2k -i @INPUT_NR_PATH@/X_4_2K_24_185_CBR_WB_000.tif -o @TEMP_PATH@/X_4_2K_24_185_CBR_WB_000.j2k -cinema2K 24 image_to_j2k -i @INPUT_NR_PATH@/X_5_2K_24_235_CBR_STEM24_000.tif -o @TEMP_PATH@/X_5_2K_24_235_CBR_STEM24_000.j2k -cinema2K 24 image_to_j2k -i @INPUT_NR_PATH@/X_6_2K_24_FULL_CBR_CIRCLE_000.tif -o @TEMP_PATH@/X_6_2K_24_FULL_CBR_CIRCLE_000.j2k -cinema2K 24 # DECODER TEST SUITE j2k_to_image -i @INPUT_NR_PATH@/Bretagne2.j2k -o @TEMP_PATH@/Bretagne2.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/_00042.j2k -o @TEMP_PATH@/_00042.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/123.j2c -o @TEMP_PATH@/123.j2c.pgx # The 4 following tests should failed (kakadu indicates that they are corrupted) !j2k_to_image -i @INPUT_NR_PATH@/broken.jp2 -o @TEMP_PATH@/broken.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/broken2.jp2 -o @TEMP_PATH@/broken2.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/broken3.jp2 -o @TEMP_PATH@/broken3.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/broken4.jp2 -o @TEMP_PATH@/broken4.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/bug.j2c -o @TEMP_PATH@/bug.j2c.pgx j2k_to_image -i @INPUT_NR_PATH@/buxI.j2k -o @TEMP_PATH@/buxI.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/buxR.j2k -o @TEMP_PATH@/buxR.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/Cannotreaddatawithnosizeknown.j2k -o @TEMP_PATH@/Cannotreaddatawithnosizeknown.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/cthead1.j2k -o @TEMP_PATH@/cthead1.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/CT_Phillips_JPEG2K_Decompr_Problem.j2k -o @TEMP_PATH@/CT_Phillips_JPEG2K_Decompr_Problem.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/illegalcolortransform.j2k -o @TEMP_PATH@/illegalcolortransform.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/j2k32.j2k -o @TEMP_PATH@/j2k32.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/kakadu_v4-4_openjpegv2_broken.j2k -o @TEMP_PATH@/kakadu_v4-4_openjpegv2_broken.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/MarkerIsNotCompliant.j2k -o @TEMP_PATH@/MarkerIsNotCompliant.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/Marrin.jp2 -o @TEMP_PATH@/Marrin.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/merged.jp2 -o @TEMP_PATH@/merged.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/movie_00000.j2k -o @TEMP_PATH@/movie_00000.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/movie_00001.j2k -o @TEMP_PATH@/movie_00001.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/movie_00002.j2k -o @TEMP_PATH@/movie_00002.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/orb-blue10-lin-j2k.j2k -o @TEMP_PATH@/orb-blue10-lin-j2k.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/orb-blue10-lin-jp2.jp2 -o @TEMP_PATH@/orb-blue10-lin-jp2.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/orb-blue10-win-j2k.j2k -o @TEMP_PATH@/orb-blue10-win-j2k.j2k.pgx j2k_to_image -i @INPUT_NR_PATH@/orb-blue10-win-jp2.jp2 -o @TEMP_PATH@/orb-blue10-win-jp2.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/relax.jp2 -o @TEMP_PATH@/relax.jp2.pgx j2k_to_image -i @INPUT_NR_PATH@/test_lossless.j2k -o @TEMP_PATH@/test_lossless.j2k.pgx # text_GBR.jp2 file exhibt a error about a tile part with a index > of the number of tile-part in this tile (related to issue 202, 206, 208) j2k_to_image -i @INPUT_NR_PATH@/text_GBR.jp2 -o @TEMP_PATH@/text_GBR.jp2.pgx # pacs.ge file should throw an error but finally it seems work with v2 j2k_to_image -i @INPUT_NR_PATH@/pacs.ge.j2k -o @TEMP_PATH@/pacs.ge.j2k.pgx # related to issue 135 j2k_to_image -i @INPUT_NR_PATH@/kodak_2layers_lrcp.j2c -o @TEMP_PATH@/kodak_2layers_lrcp.j2c.pgx j2k_to_image -i @INPUT_NR_PATH@/kodak_2layers_lrcp.j2c -o @TEMP_PATH@/kodak_2layers_lrcp.j2c.pgx -l 2 # related to issue 104 and 110 j2k_to_image -i @INPUT_NR_PATH@/issue104_jpxstream.jp2 -o @TEMP_PATH@/issue104_jpxstream.jp2.pgx # File not supported by kakadu (Malformed PCLR box) and not supoprter by openjpeg (problem with value of TPSot) !j2k_to_image -i @INPUT_NR_PATH@/mem-b2ace68c-1381.jp2 -o @TEMP_PATH@/mem-b2ace68c-1381.jp2.pgx # File which produced weird output with kakadu and not supoprter by openjpeg (problem with value of TPSot, issue 202, 206, 208) j2k_to_image -i @INPUT_NR_PATH@/mem-b2b86b74-2753.jp2 -o @TEMP_PATH@/mem-b2b86b74-2753.jp2.pgx # issue 191 raised by the gdal fuzzer test (should properly failed) !j2k_to_image -i @INPUT_NR_PATH@/gdal_fuzzer_unchecked_numresolutions.jp2 -o @TEMP_PATH@/gdal_fuzzer_unchecked_numresolutions.pgx # issue 192 raised by the gdal fuzzer test (should nicely failed) !j2k_to_image -i @INPUT_NR_PATH@/gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc.patch.jp2 -o @TEMP_PATH@/gdal_fuzzer_assert_in_opj_j2k_read_SQcd_SQcc.patch.pgx # issue 193 raised by the gdal fuzzer test (should nicely failed) !j2k_to_image -i @INPUT_NR_PATH@/gdal_fuzzer_check_number_of_tiles.jp2 -o @TEMP_PATH@/gdal_fuzzer_check_number_of_tiles.pgx # issue 194 raised by the gdal fuzzer test (should nicely failed) !j2k_to_image -i @INPUT_NR_PATH@/gdal_fuzzer_check_comp_dx_dy.jp2 -o @TEMP_PATH@/gdal_fuzzer_check_comp_dx_dy.pgx # issue 202 j2k_to_image -i @INPUT_NR_PATH@/file409752.jp2 -o @TEMP_PATH@/file409752.jp2.pgx # issue 188 j2k_to_image -i @INPUT_NR_PATH@/issue188_beach_64bitsbox.jp2 -o @TEMP_PATH@/issue188_beach_64bitsbox.jp2.pgx # issue 206 j2k_to_image -i @INPUT_NR_PATH@/issue206_image-000.jp2 -o @TEMP_PATH@/issue206_image-000.jp2.pgx # issue 205 j2k_to_image -i @INPUT_NR_PATH@/issue205.jp2 -o @TEMP_PATH@/issue205.jp2.pgx # issue 225 (sumatrapdf) !j2k_to_image -i @INPUT_NR_PATH@/451.pdf.SIGSEGV.5b5.3723.jp2 -o @TEMP_PATH@/451.pdf.SIGSEGV.5b5.3723.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/1888.pdf.asan.35.988.jp2 -o @TEMP_PATH@/1888.pdf.asan.35.988.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/2539.pdf.SIGFPE.706.1712.jp2 -o @TEMP_PATH@/2539.pdf.SIGFPE.706.1712.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/2236.pdf.SIGSEGV.398.1376.jp2 -o @TEMP_PATH@/2236.pdf.SIGSEGV.398.1376.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/1336.pdf.asan.47.376.jp2 -o @TEMP_PATH@/1336.pdf.asan.47.376.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/1851.pdf.SIGSEGV.ce9.948.jp2 -o @TEMP_PATH@/1851.pdf.SIGSEGV.ce9.948.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/4149.pdf.SIGSEGV.cf7.3501.jp2 -o @TEMP_PATH@/4149.pdf.SIGSEGV.cf7.3501.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/4035.pdf.SIGSEGV.d8b.3375.jp2 -o @TEMP_PATH@/4035.pdf.SIGSEGV.d8b.3375.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/2977.pdf.asan.67.2198.jp2 -o @TEMP_PATH@/2977.pdf.asan.67.2198.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/451.pdf.SIGSEGV.ce9.3723.jp2 -o @TEMP_PATH@/451.pdf.SIGSEGV.ce9.3723.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/3635.pdf.asan.77.2930.jp2 -o @TEMP_PATH@/3635.pdf.asan.77.2930.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/1802.pdf.SIGSEGV.36e.894.jp2 -o @TEMP_PATH@/1802.pdf.SIGSEGV.36e.894.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/451.pdf.SIGSEGV.f4c.3723.jp2 -o @TEMP_PATH@/451.pdf.SIGSEGV.f4c.3723.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/2.pdf.SIGFPE.706.1112.jp2 -o @TEMP_PATH@/2.pdf.SIGFPE.706.1112.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/147af3f1083de4393666b7d99b01b58b_signal_sigsegv_130c531_6155_5136.jp2 -o @TEMP_PATH@/147af3f1083de4393666b7d99b01b58b_signal_sigsegv_130c531_6155_5136.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/4241ac039aba57e6a9c948d519d94216_asan_heap-oob_14650f2_7469_602.jp2 -o @TEMP_PATH@/4241ac039aba57e6a9c948d519d94216_asan_heap-oob_14650f2_7469_602.jp2 # issue 228 (16bits/lossy) j2k_to_image -i @INPUT_NR_PATH@/issue228.j2k -o @TEMP_PATH@/issue228.j2k.pgx # issue 229 !j2k_to_image -i @INPUT_NR_PATH@/27ac957758a35d00d6765a0c86350d9c.SIGFPE.d25.537.jpc -o @TEMP_PATH@27ac957758a35d00d6765a0c86350d9c.SIGFPE.d25.537.jpc.pgx !j2k_to_image -i @INPUT_NR_PATH@/26ccf3651020967f7778238ef5af08af.SIGFPE.d25.527.jp2 -o @TEMP_PATH@26ccf3651020967f7778238ef5af08af.SIGFPE.d25.527.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/0290cb77c5df21828fa74cf2ab2c84d8.SIGFPE.d25.31.jp2 -o @TEMP_PATH@0290cb77c5df21828fa74cf2ab2c84d8.SIGFPE.d25.31.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/3672da2f1f67bbecad27d7181b4e9d7c.SIGFPE.d25.805.jpc -o @TEMP_PATH@3672da2f1f67bbecad27d7181b4e9d7c.SIGFPE.d25.805.jpc.pgx # issue 254 (loss in quality) j2k_to_image -i @INPUT_NR_PATH@/issue254.jp2 -o @TEMP_PATH@/issue254.jp2.pgx # issue 142 j2k_to_image -i @INPUT_NR_PATH@/issue142.j2k -o @TEMP_PATH@/issue142.j2k.pgx # issue 134 j2k_to_image -i @INPUT_NR_PATH@/issue134.jp2 -o @TEMP_PATH@/issue134.jp2.pgx # issue 135 j2k_to_image -i @INPUT_NR_PATH@/issue135.j2k -o @TEMP_PATH@/issue135.j2k.pgx # issue 208 j2k_to_image -i @INPUT_NR_PATH@/issue208.jp2 -o @TEMP_PATH@/issue208.jp2.pgx # issue 211 j2k_to_image -i @INPUT_NR_PATH@/issue211.jp2 -o @TEMP_PATH@/issue211.jp2.pgx # issue 171 j2k_to_image -i @INPUT_NR_PATH@/issue171.jp2 -o @TEMP_PATH@/issue171.jp2.pgx # issue 171 !j2k_to_image -i @INPUT_NR_PATH@/issue165.jp2 -o @TEMP_PATH@/issue165.jp2.pgx # !j2k_to_image -i @INPUT_NR_PATH@/broken.jpc -o @TEMP_PATH@/broken.jpc.pgx # issue 226 j2k_to_image -i @INPUT_NR_PATH@/issue226.j2k -o @TEMP_PATH@/issue226.j2k.pgx # issue 297 !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1103421.jp2 -o @TEMP_PATH@/edf_c2_1103421.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1178956.jp2 -o @TEMP_PATH@/edf_c2_1178956.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1000290.jp2 -o @TEMP_PATH@/edf_c2_1000290.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1000691.jp2 -o @TEMP_PATH@/edf_c2_1000691.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_20.jp2 -o @TEMP_PATH@/edf_c2_20.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1377017.jp2 -o @TEMP_PATH@/edf_c2_1377017.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1002767.jp2 -o @TEMP_PATH@/edf_c2_1002767.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_10025.jp2 -o @TEMP_PATH@/edf_c2_10025.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1000234.jp2 -o @TEMP_PATH@/edf_c2_1000234.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_225881.jp2 -o @TEMP_PATH@/edf_c2_225881.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1000671.jp2 -o @TEMP_PATH@/edf_c2_1000671.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1013627.jp2 -o @TEMP_PATH@/edf_c2_1013627.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1015644.jp2 -o @TEMP_PATH@/edf_c2_1015644.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_101463.jp2 -o @TEMP_PATH@/edf_c2_101463.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1674177.jp2 -o @TEMP_PATH@/edf_c2_1674177.jp2.pgx !j2k_to_image -i @INPUT_NR_PATH@/edf_c2_1673169.jp2 -o @TEMP_PATH@/edf_c2_1673169.jp2.pgx openjpeg-1.5.2/INSTALL0000644000175000017500000000724412315002100014220 0ustar mathieumathieu How to build and install openjpeg binaries ========================================== UNIX/LINUX similar systems -------------------------- 1) Using autotools It is highly recommended that pkg-config is installed. If needed, you have to properly set the environment variable PKG_CONFIG_PATH so that the .pc files are found. To build from top-level directory, you can simply type: ./bootstrap.sh ./configure make To keep all build files in a separate directory, you can type instead: ./bootstrap.sh mkdir build cd build ../configure make To install: sudo make install To clean: make clean make distclean To build doc (requires 'doxygen' to be found on your system): (this will create an html directory in TOP_LEVEL/doc) make doc Main './configure' options (type './configure --help' for more details) '--enable-mj2' '--enable-jpwl' '--enable-jpip' '--prefix=/path/to/install/directory' (example : '--prefix=$PWD/installed') '--enable-debug' (default : disabled) You can also specify your own CFLAGS and LDFLAGS with (for example): CFLAGS="-O3 -pipe" LDFLAGS="-Wl,-s" ./configure The (optional) dependencies of some binaries are libpng, libtiff, libcms 1 or 2 and FastCGI. Only libtiff and FastCGI have no .pc file. There should be some automatic detection if they are installed in /usr, /usr/local or /opt/local. Otherwise, you can tune their detection (as well as for libpng and libcms1 or 2 too) with the environment variables: TIFF_CFLAGS TIFF_LIBS FCGI_CFLAGS FCGI_LIBS See './configure --help' output for more details. 2) Using cmake (see www.cmake.org) Type: cmake . make If you are root: make install else if you have sudo power: sudo make install else DESTDIR=$HOME/local make install To build the Doxygen documentation (Doxygen needs to be found on the system): (A 'html' directory is generated in the 'doc' directory) make doc Binaries are located in the 'bin' directory. Main available cmake flags: * To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path', or use DESTDIR env variable (see above) * To build the shared libraries and links the executables against it: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON') Note: when using this option, static libraries are not built and executables are dynamically linked. * To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON') * To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF') * To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF') * To build the JPIP library and utilities: '-DBUILD_JPIP:bool=on' (default: 'OFF') * To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG): cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory' make make Experimental Note : JPEG2000 test files are available with 'svn checkout http://openjpeg.googlecode.com/svn/data' (about 70 Mo). If '-DOPJ_DATA_ROOT:PATH' option is omitted, test files will be automatically searched in '${CMAKE_SOURCE_DIR}/../data', corresponding to the location of the data directory when compiling from the trunk (and assuming the data directory has been checked out of course). MACOSX ------ The same building procedures as above (autotools and cmake) work for MACOSX. The xcode project file can also be used. If it does not work, try adding the following flag to the cmake command : '-DCMAKE_OSX_ARCHITECTURES:STRING=i386' WINDOWS ------- If you're using cygwin or MinGW+MSYS, the same procedures as for Unix can be used. Otherwise you can use cmake to generate project files for the IDE you are using (VC2010, etc). Type 'cmake --help' for available generators on your platform. openjpeg-1.5.2/THANKS0000644000175000017500000000120112315002100014065 0ustar mathieumathieuOpenJPEG THANKS file Many people have contributed to OpenJPEG by reporting problems, suggesting various improvements, or submitting actual code. Here is a list of these people. Help me keep it complete and exempt of errors. Mathieu Malaterre Winfried Szukalski Vincent Torri Bob Friesenhahn Callum Lerwick Dzonatas Sol Mickaël Savinaud Julien Malik Jerôme Fimes Herve Drolon Yannick Verschueren Sebastien Lugan Kaori Hagihara Peter Wimmer Francois-Olivier Devaux Antonin Descampe David Janssens Pr. Benoit Macq Luis Ibanez Ben Boeckel Vincent Nicolas Glenn Pearson Giuseppe Baruffa Arnaud Maye Rex Dieter David Burken Parvatha Elangovan openjpeg-1.5.2/bootstrap.sh0000755000175000017500000000005012315002100015527 0ustar mathieumathieu#!/bin/sh autoreconf --install --force openjpeg-1.5.2/Makefile.am0000644000175000017500000000300512315002100015212 0ustar mathieumathieuDISTCHECK_CONFIGURE_FLAGS = --enable-jpip=yes --enable-jpip-server=yes --enable-jpwl=yes --enable-mj2=yes ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libopenjpeg applications doc pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libopenjpeg1.pc if WANT_JPWL pkgconfig_DATA += libopenjpeg-jpwl.pc endif MAINTAINERCLEANFILES = \ Makefile.in \ aclocal.m4 \ config.guess \ opj_config.h.in \ opj_config.h.in~ \ config.sub \ configure \ depcomp \ install-sh \ ltmain.sh \ missing EXTRA_DIST = \ CMake/CTestCustom.cmake.in \ CMake/FindFCGI.cmake \ CMake/FindLCMS2.cmake \ CMake/FindLCMS.cmake \ CMake/OpenJPEGConfig.cmake.in \ CMakeLists.txt \ CTestConfig.cmake \ AUTHORS \ CHANGES \ INSTALL \ LICENSE \ NEWS \ README \ THANKS \ bootstrap.sh \ libopenjpeg1.pc.cmake \ libopenjpeg1.pc.in \ libopenjpeg-jpwl.pc.in \ opj_config.h.cmake.in \ m4/opj_check_lib.m4 \ m4/opj_doxygen.m4 \ m4/pkg.m4 .PHONY: doc # Documentation doc: @echo "entering doc/" @cd doc && make doc install-data-hook: if HAVE_WIN32 $(LN_S) -f libopenjpeg1.pc $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc else $(LN_S) -nf libopenjpeg1.pc $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc endif @echo -e " (PC)\t$(pkgconfigdir)/libopenjpeg1.pc" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(pkgconfigdir)/libopenjpeg.pc" >> $(top_builddir)/report.txt if WANT_JPWL @echo -e " (PC)\t$(pkgconfigdir)/libopenjpeg-jpwl.pc" >> $(top_builddir)/report.txt endif @cat $(top_builddir)/report.txt @rm $(top_builddir)/report.txt uninstall-hook: rm -f $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc openjpeg-1.5.2/README0000644000175000017500000000250512315002100014042 0ustar mathieumathieu OPENJPEG LIBRARY and APPLICATIONS ---------------------------------- Details on folders hierarchy: * libopenjpeg: contains the sources of the openjpeg library * jpwl: contains the additional sources if you want to build a JPWL-flavoured library. * applications: contains all applications that use the openjpeg library * common: common files to all applications * codec: a basic codec * mj2: motion jpeg 2000 executables * JavaOpenJPEG: java jni to use openjpeg in a java program * jpip: complete client-server architecture for remote browsing of jpeg 2000 images. See corresponding README for more details. * OPJViewer: gui for displaying j2k files (based on wxWidget) * thirdparty: thirdparty libraries used by some applications. These libraries will be built only if there are not found on the system. Note that libopenjpeg itself does not have any dependency. * doc: doxygen documentation setup file and man pages * tests: configuration files and utilities for the openjpeg test suite. All test images are located in 'http://openjpeg.googlecode.com/svn/data' folder. * CMake: cmake related files * m4: autotools related files see LICENSE for license and copyright information. see INSTALL for installation procedures. see NEWS for user visible changes in successive releases. see CHANGES for per-revision changes. openjpeg-1.5.2/m4/0000755000175000017500000000000012315072522013517 5ustar mathieumathieuopenjpeg-1.5.2/m4/opj_compiler_flag.m40000644000175000017500000000132012315002074017423 0ustar mathieumathieudnl Copyright (C) 2010 Vincent Torri dnl and Albin Tonnerre dnl That code is public domain and can be freely used or copied. dnl Macro that checks if a compiler flag is supported by the compiler. dnl Usage: OPJ_COMPILER_FLAG(flag) dnl flag is added to CFLAGS if supported. AC_DEFUN([OPJ_COMPILER_FLAG], [ CFLAGS_save="${CFLAGS}" CFLAGS="${CFLAGS} $1" AC_LANG_PUSH([C]) AC_MSG_CHECKING([whether the compiler supports $1]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]])], [have_flag="yes"], [have_flag="no"]) AC_MSG_RESULT([${have_flag}]) if test "x${have_flag}" = "xno" ; then CFLAGS="${CFLAGS_save}" fi AC_LANG_POP([C]) ]) openjpeg-1.5.2/m4/pkg.m40000644000175000017500000001250112315002074014534 0ustar mathieumathieu# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES openjpeg-1.5.2/m4/opj_doxygen.m40000644000175000017500000000524312315002074016305 0ustar mathieumathieudnl Copyright (C) 2008 Vincent Torri dnl That code is public domain and can be freely used or copied. dnl Macro that check if doxygen is available or not. dnl OPJ_CHECK_DOXYGEN([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Test for the doxygen program dnl Defines opj_doxygen dnl Defines the automake conditionnal OPJ_BUILD_DOC dnl AC_DEFUN([OPJ_CHECK_DOXYGEN], [ dnl dnl Disable the build of the documentation dnl AC_ARG_ENABLE([doc], [AC_HELP_STRING( [--disable-doc], [Disable documentation build @<:@default=enabled@:>@])], [ if test "x${enableval}" = "xyes" ; then opj_enable_doc="yes" else opj_enable_doc="no" fi ], [opj_enable_doc="yes"]) AC_MSG_CHECKING([whether to build documentation]) AC_MSG_RESULT([${opj_enable_doc}]) if test "x${opj_enable_doc}" = "xyes" ; then dnl Specify the file name, without path opj_doxygen="doxygen" AC_ARG_WITH([doxygen], [AC_HELP_STRING( [--with-doxygen=FILE], [doxygen program to use @<:@default=doxygen@:>@])], dnl Check the given doxygen program. [opj_doxygen=${withval} AC_CHECK_PROG([opj_have_doxygen], [${opj_doxygen}], [yes], [no]) if test "x${opj_have_doxygen}" = "xno" ; then echo "WARNING:" echo "The doxygen program you specified:" echo "${opj_doxygen}" echo "was not found. Please check the path and make sure " echo "the program exists and is executable." AC_MSG_WARN([no doxygen detected. Documentation will not be built]) fi ], [AC_CHECK_PROG([opj_have_doxygen], [${opj_doxygen}], [yes], [no]) if test "x${opj_have_doxygen}" = "xno" ; then echo "WARNING:" echo "The doxygen program was not found in your execute path." echo "You may have doxygen installed somewhere not covered by your path." echo "" echo "If this is the case make sure you have the packages installed, AND" echo "that the doxygen program is in your execute path (see your" echo "shell manual page on setting the \$PATH environment variable), OR" echo "alternatively, specify the program to use with --with-doxygen." AC_MSG_WARN([no doxygen detected. Documentation will not be built]) fi ]) else opj_have_doxygen="no" fi dnl dnl Substitution dnl AC_SUBST([opj_doxygen]) if ! test "x${opj_have_doxygen}" = "xyes" ; then opj_enable_doc="no" fi AM_CONDITIONAL(OPJ_BUILD_DOC, test "x${opj_have_doxygen}" = "xyes") AS_IF([test "x${opj_have_doxygen}" = "xyes"], [$1], [$2]) ]) dnl End of opj_doxygen.m4 openjpeg-1.5.2/m4/opj_check_lib.m40000644000175000017500000000602512315002074016532 0ustar mathieumathieudnl Copyright (C) 2011 Vincent Torri dnl That code is public domain and can be freely used or copied. dnl Macro that check if a library is in a specified directory. dnl Usage: OPJ_CHECK_LIB_WITH_PREFIX(prefix, header, lib, func [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Call AC_SUBST(THELIB_CFLAGS) dnl Call AC_SUBST(THELIB_LIBS) dnl where THELIB is the uppercase value of 'lib' AC_DEFUN([OPJ_CHECK_LIB_WITH_PREFIX], [ m4_pushdef([UP], m4_toupper([$3])) m4_pushdef([DOWN], m4_tolower([$3])) __opj_prefix=$1 __opj_header=$2 __opj_lib=$3 __opj_func=$4 __opj_have_dep="no" save_CPPFLAGS=${CPPFLAGS} save_LIBS=${LIBS} if test "x$UP[_CFLAGS]" != "x"; then CPPFLAGS="${CPPFLAGS} $UP[_CFLAGS]" else if test "x${__opj_prefix}" != "x" ; then __opj_CPPFLAGS="-I${__opj_prefix}/include" else __opj_CPPFLAGS="" fi CPPFLAGS="${CPPFLAGS} ${__opj_CPPFLAGS}" fi if test "x$UP[_LIBS]" != "x"; then LIBS="${LIBS} $UP[_LIBS]" else if test "x${__opj_prefix}" != "x" ; then __opj_LIBS="-L${__opj_prefix}/lib -l${__opj_lib}" else __opj_LIBS="-l${__opj_lib}" fi LIBS="${LIBS} ${__opj_LIBS}" fi AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include <${__opj_header}> ]], [[ ${__opj_func}(); ]])], [__opj_have_dep="yes"], [__opj_have_dep="no"]) CPPFLAGS=${save_CPPFLAGS} LIBS=${save_LIBS} if test "x${__opj_prefix}" = "x" ; then AC_MSG_CHECKING([whether ]UP[ library is available in standard or predefined directories]) else AC_MSG_CHECKING([whether ]UP[ library is available in ${__opj_prefix}]) fi AC_MSG_RESULT([${__opj_have_dep}]) if test "x${__opj_have_dep}" = "xyes"; then if test "x${UP[]_CFLAGS}" = "x" ; then UP[]_CFLAGS="${__opj_CPPFLAGS}" fi if test "x${UP[]_LIBS}" = "x" ; then UP[]_LIBS="${__opj_LIBS}" fi fi AS_IF([test "x${__opj_have_dep}" = "xyes"], [$5], [$6]) m4_popdef([UP]) m4_popdef([DOWN]) ]) dnl Macro that check if a library is in a set of directories. dnl Usage: OPJ_CHECK_LIB(header, lib, func [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) AC_DEFUN([OPJ_CHECK_LIB], [ m4_pushdef([UP], m4_toupper([$2])) __opj_have_dep="no" OPJ_CHECK_LIB_WITH_PREFIX([], [$1], [$2], [$3], [__opj_have_dep="yes"], [__opj_have_dep="no"]) if ! test "x${__opj_have_dep}" = "xyes" ; then OPJ_CHECK_LIB_WITH_PREFIX([/usr], [$1], [$2], [$3], [__opj_have_dep="yes"], [__opj_have_dep="no"]) fi if ! test "x${__opj_have_dep}" = "xyes" ; then OPJ_CHECK_LIB_WITH_PREFIX([/usr/local], [$1], [$2], [$3], [__opj_have_dep="yes"], [__opj_have_dep="no"]) fi if ! test "x${__opj_have_dep}" = "xyes" ; then OPJ_CHECK_LIB_WITH_PREFIX([/opt/local], [$1], [$2], [$3], [__opj_have_dep="yes"], [__opj_have_dep="no"]) fi AC_ARG_VAR(UP[_CFLAGS], [preprocessor flags for lib$2]) AC_SUBST(UP[_CFLAGS]) AC_ARG_VAR(UP[_LIBS], [linker flags for lib$2]) AC_SUBST(UP[_LIBS]) AS_IF([test "x${__opj_have_dep}" = "xyes"], [$4], [$5]) m4_popdef([UP]) ]) openjpeg-1.5.2/CHANGES0000644000175000017500000001466412315002100014166 0ustar mathieumathieu2012-10-01 Mathieu Malaterre * [r2028] CMakeLists.txt: [1.5] Start opj 1.5.2 * [r2029] libopenjpeg/jp2.c: [1.5] jp2_read_boxhdr() can trigger random pointer memory access Fixes issue 155 2012-10-02 Mathieu Malaterre * [r2031] libopenjpeg/Makefile.am, libopenjpeg/jpwl/Makefile.am: [1.5] int main() in t1_generate_luts.c breaks mplayer Fixes issue 152 * [r2032] libopenjpeg/j2k.c: [1.5] division by zero in j2k_read_siz Fixes issue 169 * [r2033] libopenjpeg/j2k.c: [1.5] missing range check in j2k_read_coc et al. Fixes issue 166 * [r2035] libopenjpeg/CMakeLists.txt: [1.5] Build small internal tools to generate t1_luts.h 2012-10-22 Mathieu Malaterre * [r2107] CMakeLists.txt, applications/JavaOpenJPEG/CMakeLists.txt: [1.5] Fix Java binding issues. Properly link to math lib on UNIX Make JNI install location a user configuration Remove SONAME property from the java module 2012-12-07 Rex Dieter * [r2260] doc/Doxyfile.dox, doc/Doxyfile.dox.cmake.in: backport r2259 Doxyfile: HTML_TIMESTAMP = NO helps when comparing the output of multiple runs, and distros will appreciate avoiding multilib conflicts. 2012-12-18 Mickaël Savinaud * [r2265] applications/codec/convert.c: [1.5] improve the bmp read function for RGB8 case (thanks Winfried). Update issue 203 2013-02-27 Mathieu Malaterre * [r2299] libopenjpeg/opj_includes.h: [1.5] Rework #ifdef checks. We should check for _M_IX86 instead of not(_M_X64). Thanks to Misha Ulyutin for report on ML 2013-03-14 Mickaël Savinaud * [r2305] configure.ac: [b1.5.x] update the micro version into the configure file (thanks to winfried) 2013-07-11 Antonin Descampe * [r2345] tests/conformance/CMakeLists.txt: tests : reactivated conformance tests in openjpeg 1.5 branch to enable comparison with trunk 2013-09-26 Mathieu Malaterre * [r2346] libopenjpeg/image.c: [1.5] Import patch suggested in bug #241 2014-02-24 Mathieu Malaterre * [r2390] libopenjpeg/bio.c: [1.5] Remove some simple warnings * [r2391] CMake/CTestCustom.cmake.in: [1.5] Do not report warning on third party lib 2014-02-25 Mathieu Malaterre * [r2420] tests/nonregression/CMakeLists.txt, tests/nonregression/checkmd5refs.cmake, tests/nonregression/md5refs.txt, tests/nonregression/test_suite.ctest.in: [1.5] Import md5 checker from trunk back onto 1.5 branch * [r2423] libopenjpeg/j2k.c: [1.5] Remove addition from r1702 this introduced a regression as seen in issue 205 Fixes issue 205 2014-02-26 Mathieu Malaterre * [r2437] tests/CMakeLists.txt, tests/conformance/CMakeLists.txt, tests/nonregression/CMakeLists.txt, tests/unit/CMakeLists.txt: [1.5] Use new add_test signature to handle cross compilation and execution using wine * [r2438] applications/codec/convert.c, applications/codec/image_to_j2k.c, applications/codec/j2k_dump.c, applications/codec/j2k_to_image.c, libopenjpeg/jp2.c, libopenjpeg/tcd.c: [1.5] Import first patch (fixes.patch) from issue 249 to fix leaks on error condition. Update issue 249 * [r2439] applications/codec/image_to_j2k.c, applications/codec/j2k_to_image.c: [1.5] Declare functions static to track unused ones. 2014-03-04 Mathieu Malaterre * [r2564] CMakeLists.txt: [1.5] Use improved find_path syntax to help cross-compilation setup find openjpeg data root 2014-03-12 Mathieu Malaterre * [r2696] applications/codec/convert.c, tests/unit/testempty2.c: [1.5] Fix remainings warnings on 1.5 branch * [r2697] applications/jpip/libopenjpip/msgqueue_manager.c: [1.5] Prevent buffer overflow in openjpip code 2014-03-17 Mathieu Malaterre * [r2750] applications/common/opj_getopt.c: [1.5] Update BSD-4 copyright into a BSD-3 copyright Update issue 300 * [r2752] libopenjpeg/jp2.c, libopenjpeg/t1_generate_luts.c: [1.5] Remove simple warning about C++ style comments * [r2753] applications/codec/convert.c, applications/common/color.c, libopenjpeg/j2k.c, libopenjpeg/jp2.c, libopenjpeg/t1_generate_luts.c, libopenjpeg/tcd.c: [1.5] Remove another set of simple warnings 2014-03-18 Mathieu Malaterre * [r2757] libopenjpeg/cio.c, libopenjpeg/j2k.c, libopenjpeg/jp2.c, libopenjpeg/t2.c, libopenjpeg/tcd.c, tests/nonregression/test_suite.ctest.in: [1.5] Import portion of patch from issue 297 Run test suite on new datasets Update issue 297 * [r2758] libopenjpeg/jp2.c, libopenjpeg/tcd.c: [1.5] Import patch from trunk to make test passes. Affects: NR-DEC-2977.pdf.asan.67.2198.jp2-52-decode & NR-DEC-4149.pdf.SIGSEGV.cf7.3501.jp2-50-decode * [r2759] libopenjpeg/j2k.c: [1.5] Check the number of tiles * [r2760] libopenjpeg/tcd.c: [1.5] Rework r2758 the conditions were not quite right. Update checks. * [r2762] applications/codec/convert.c: [1.5] Fix issues with big endian handling Fixes issue 302 * [r2765] applications/jpip/util/CMakeLists.txt: [1.5] Add a way for user to override source/target java version Update issue 303 * [r2768] CMakeLists.txt, applications/codec/CMakeLists.txt, applications/common/opj_getopt.c, applications/common/opj_getopt.h, opj_config.h.cmake.in, tests/CMakeLists.txt: [1.5] Create a new cmake option to choose between convienient copy of getopt and system installed one Udapte issue 301 * [r2769] applications/codec/image_to_j2k.c, applications/codec/j2k_dump.c, applications/codec/j2k_to_image.c, applications/common/opj_getopt.h: [1.5] Rework r2768 in fact getopt_long is slightly different on GNU. Adapt signature to handle BSD signature and GNU one. Update issue 301 2014-03-24 Rex Dieter * [r2780] configure.ac: Calling AC_CANONICAL_SYSTEM implies AC_CANONICAL_TARGET, which gives incorrect results when cross compiling. Calling only AC_CANONICAL_HOST is enough. issue: 129 * [r2781] doc/Makefile.am: Install jpwl man pages only if jpwl is enabled issue: 129 * [r2782] m4/opj_check_lib.m4: Improve check for standard libs Previously, with _LIBS and _CFLAGS undefined, the most basic compile command "$CC conftest.c -l" was not tested. issue: 129 2014-03-25 Mathieu Malaterre * [r2800] applications/codec/Makefile.am, applications/jpip/libopenjpip/CMakeLists.txt: [1.5] Import patch from bug tracker Thanks to winfried Fixes issue 304 2014-03-26 Mathieu Malaterre * [r2807] configure.ac: [1.5] Fix big endian checking with autotools Thanks to winfried for patch Fixes issue 302 openjpeg-1.5.2/AUTHORS0000644000175000017500000000066012315002100014232 0ustar mathieumathieuAuthors of OpenJPEG See also the files THANKS and CHANGES David Janssens designed and implemented the first version of OpenJPEG. Kaori Hagihara designed and implemented the first version of OpenJPIP. Jerome Fimes implemented the alpha version of OpenJPEG v2. Giuseppe Baruffa added the JPWL functionalities. Yannick Verschueren, Herve Drolon, Francois-Olivier Devaux, Antonin Descampe improved the libraries and utilities. openjpeg-1.5.2/CMake/0000755000175000017500000000000012315072522014157 5ustar mathieumathieuopenjpeg-1.5.2/CMake/OpenJPEGConfig.cmake.in0000644000175000017500000000412512315002074020260 0ustar mathieumathieu#----------------------------------------------------------------------------- # # OPENJPEGConfig.cmake - CMake configuration file for external projects. # # This file is configured by OPENJPEG and used by the UseOPENJPEG.cmake # module to load OPENJPEG's settings for an external project. @OPENJPEG_CONFIG_INSTALL_ONLY@ # The OPENJPEG version number. SET(OPENJPEG_MAJOR_VERSION "@OPENJPEG_VERSION_MAJOR@") SET(OPENJPEG_MINOR_VERSION "@OPENJPEG_VERSION_MINOR@") SET(OPENJPEG_BUILD_VERSION "@OPENJPEG_VERSION_BUILD@") # The libraries. SET(OPENJPEG_LIBRARIES "@OPENJPEG_LIBRARY_NAME@") # The CMake macros dir. SET(OPENJPEG_CMAKE_DIR "@OPENJPEG_INSTALL_PACKAGE_DIR@") # The configuration options. SET(OPENJPEG_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@") # The "use" file. SET(OPENJPEG_USE_FILE "@OPENJPEG_USE_FILE_CONFIG@") get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) # The following is inspired from: # http://www.cmake.org/Wiki/CMake/Tutorials/Packaging#Packaging_and_Exporting # However the following is difficult to handle: # get_filename_component(myproj_INCLUDE_DIRS "${SELF_DIR}/../../include/myproj" ABSOLUTE) # it asssumes a non multi-arch system, where 'include' is located '../include' from lib # therefore we need to take into account the number of subdirs in OPENJPEG_INSTALL_LIB_DIR if(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake) # This is an install tree include(${SELF_DIR}/OpenJPEGTargets.cmake) get_filename_component(OPENJPEG_INCLUDE_ROOT "${SELF_DIR}/@relative_parent@/@OPENJPEG_INSTALL_INCLUDE_DIR@" ABSOLUTE) set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_ROOT}) else(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake) if(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake) # This is a build tree SET( OPENJPEG_INCLUDE_DIRS @OPENJPEG_INCLUDE_PATH@) include(${SELF_DIR}/OpenJPEGExports.cmake) else(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake) message(FATAL_ERROR "ooops") endif(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake) endif(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake) set(OPENJPEG_USE_FILE ${SELF_DIR}/UseOPENJPEG.cmake) # Backward compatible part: SET(OPENJPEG_FOUND TRUE) openjpeg-1.5.2/CMake/FindFCGI.cmake0000644000175000017500000000117012315002074016464 0ustar mathieumathieu# Look for the header file. FIND_PATH(FCGI_INCLUDE_DIR NAMES fastcgi.h) # Look for the library. FIND_LIBRARY(FCGI_LIBRARY NAMES fcgi) # Handle the QUIETLY and REQUIRED arguments and set FCGI_FOUND to TRUE if all listed variables are TRUE. INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(FCGI DEFAULT_MSG FCGI_LIBRARY FCGI_INCLUDE_DIR) # Copy the results to the output variables. IF(FCGI_FOUND) SET(FCGI_LIBRARIES ${FCGI_LIBRARY}) SET(FCGI_INCLUDE_DIRS ${FCGI_INCLUDE_DIR}) ELSE(FCGI_FOUND) SET(FCGI_LIBRARIES) SET(FCGI_INCLUDE_DIRS) ENDIF(FCGI_FOUND) MARK_AS_ADVANCED(FCGI_INCLUDE_DIR FCGI_LIBRARY) openjpeg-1.5.2/CMake/FindLCMS.cmake0000644000175000017500000000216512315002074016517 0ustar mathieumathieu# - Find LCMS library # Find the native LCMS includes and library # Once done this will define # # LCMS_INCLUDE_DIR - Where to find lcms.h, etc. # LCMS_LIBRARIES - Libraries to link against to use LCMS. # LCMS_FOUND - If false, do not try to use LCMS. # # also defined, but not for general use are # LCMS_LIBRARY, where to find the LCMS library. #============================================================================= #============================================================================= FIND_PATH(LCMS_INCLUDE_DIR lcms.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include) SET(LCMS_NAMES ${LCMS_NAMES} lcms liblcms liblcms_static) FIND_LIBRARY(LCMS_LIBRARY NAMES ${LCMS_NAMES} ) MARK_AS_ADVANCED(LCMS_INCLUDE_DIR LCMS_LIBRARY) # handle the QUIETLY and REQUIRED arguments and set LCMS_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS DEFAULT_MSG LCMS_LIBRARY LCMS_INCLUDE_DIR) IF(LCMS_FOUND) SET( LCMS_INCLUDE_DIRS ${LCMS_INCLUDE_DIR}) SET( LCMS_LIBRARIES ${LCMS_LIBRARY} ) ENDIF(LCMS_FOUND) openjpeg-1.5.2/CMake/CTestCustom.cmake.in0000644000175000017500000000174112315002074020001 0ustar mathieumathieu#---------------------------------------------------------------------- # # For further details regarding this file, # see http://www.cmake.org/Wiki/CMake_Testing_With_CTest#Customizing_CTest # # and # http://www.kitware.com/blog/home/post/27 # #---------------------------------------------------------------------- SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 1000000) SET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS 50) SET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 2000) SET(CTEST_CUSTOM_COVERAGE_EXCLUDE ${CTEST_CUSTOM_COVERAGE_EXCLUDE} # Exclude files from the Testing directories ".*/tests/.*" # Exclude files from the ThirdParty Utilities directories ".*/thirdparty/.*" ) SET(CTEST_CUSTOM_WARNING_EXCEPTION ${CTEST_CUSTOM_WARNING_EXCEPTION} # Suppress warning caused by intentional messages about deprecation ".*warning,.* is deprecated" # supress warnings caused by 3rd party libs: ".*thirdparty.*" "libtiff.*has no symbols" "libpng.*has no symbols" ) openjpeg-1.5.2/CMake/FindLCMS2.cmake0000644000175000017500000000223412315002074016576 0ustar mathieumathieu# - Find LCMS2 library # Find the native LCMS2 includes and library # Once done this will define # # LCMS2_INCLUDE_DIR - Where to find lcms2.h, etc. # LCMS2_LIBRARIES - Libraries to link against to use LCMS2. # LCMS2_FOUND - If false, do not try to use LCMS2. # # also defined, but not for general use are # LCMS2_LIBRARY - Where to find the LCMS2 library. #============================================================================= #============================================================================= FIND_PATH(LCMS2_INCLUDE_DIR lcms2.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include) SET(LCMS2_NAMES ${LCMS2_NAMES} lcms2 liblcms2 liblcms2_static) FIND_LIBRARY(LCMS2_LIBRARY NAMES ${LCMS2_NAMES} ) MARK_AS_ADVANCED(LCMS2_INCLUDE_DIR LCMS2_LIBRARY) # handle the QUIETLY and REQUIRED arguments and set LCMS2_FOUND to TRUE if # all listed variables are TRUE INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS2 DEFAULT_MSG LCMS2_LIBRARY LCMS2_INCLUDE_DIR) IF(LCMS2_FOUND) SET( LCMS2_INCLUDE_DIRS ${LCMS2_INCLUDE_DIR}) SET( LCMS2_LIBRARIES ${LCMS2_LIBRARY} ) ENDIF(LCMS2_FOUND) openjpeg-1.5.2/CMake/OpenJPEGCPack.cmake0000644000175000017500000000626712315002074017440 0ustar mathieumathieu# package bundler if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") if(EXISTS "${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake") set(CMAKE_INSTALL_MFC_LIBRARIES 0) set(CMAKE_INSTALL_DEBUG_LIBRARIES 0) if(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS) set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON) endif() include(${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake) endif(EXISTS "${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake") set(OPJ_PACKAGE_DESCRIPTION_SUMMARY "OpenJPEG - OpenJPEG a JPEG 2000 implementation.") set(OPJ_PACKAGE_CONTACT "openjpeg users ") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${OPJ_PACKAGE_DESCRIPTION_SUMMARY}) set(CPACK_PACKAGE_VENDOR "OpenJPEG Team") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt" COPYONLY ) # For PackageMaker on MacOSX it is important to have a file extension: set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") set(CPACK_PACKAGE_VERSION_MAJOR "${OPENJPEG_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${OPENJPEG_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${OPENJPEG_VERSION_BUILD}") set(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") set(CPACK_SOURCE_PACKAGE_FILE_NAME "openjpeg-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") # Make this explicit here, rather than accepting the CPack default value, # so we can refer to it: SET(CPACK_PACKAGE_NAME "${OPENJPEG_LIBRARY_NAME}") IF(NOT DEFINED CPACK_SYSTEM_NAME) # make sure package is not Cygwin-unknown, for Cygwin just # cygwin is good for the system name IF("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") SET(CPACK_SYSTEM_NAME Cygwin) ELSE("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") SET(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) ENDIF("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN") ENDIF(NOT DEFINED CPACK_SYSTEM_NAME) IF(${CPACK_SYSTEM_NAME} MATCHES Windows) IF(CMAKE_CL_64) SET(CPACK_SYSTEM_NAME win64-x64) ELSE(CMAKE_CL_64) SET(CPACK_SYSTEM_NAME win32-x86) ENDIF(CMAKE_CL_64) ENDIF(${CPACK_SYSTEM_NAME} MATCHES Windows) IF(NOT DEFINED CPACK_PACKAGE_FILE_NAME) # if the CPACK_PACKAGE_FILE_NAME is not defined by the cache # default to source package - system, on cygwin system is not # needed IF(CYGWIN) SET(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}") ELSE(CYGWIN) SET(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}") ENDIF(CYGWIN) ENDIF(NOT DEFINED CPACK_PACKAGE_FILE_NAME) set(CPACK_BUNDLE_NAME "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") configure_file(${CMAKE_ROOT}/Templates/AppleInfo.plist ${CMAKE_CURRENT_BINARY_DIR}/opj.plist) SET(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/opj.plist) #include(BundleUtilities) include(CPack) endiF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") openjpeg-1.5.2/CMake/JPIPTestDriver.cmake0000644000175000017500000000024512315002074017733 0ustar mathieumathieu# JPIP test driver #message(STATUS "${D_URL}") file(DOWNLOAD "${D_URL}" "${D_FILE}" LOG log EXPECTED_MD5 "${EXPECTED_MD5}" ) message(STATUS "LOG: ${log}") openjpeg-1.5.2/CMake/FindKAKADU.cmake0000644000175000017500000000062012315002074016713 0ustar mathieumathieu# # this module looks for KAKADu # http://www.kakadusoftware.com/ # # # Copyright (c) 2006-2011 Mathieu Malaterre # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # FIND_PROGRAM(KDU_EXPAND_EXECUTABLE kdu_expand ) MARK_AS_ADVANCED( KDU_EXPAND_EXECUTABLE ) openjpeg-1.5.2/libopenjpeg/0000755000175000017500000000000012315072522015475 5ustar mathieumathieuopenjpeg-1.5.2/libopenjpeg/t2.h0000644000175000017500000000777312315002100016172 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file t2.h @brief Implementation of a tier-2 coding (packetization of code-block data) (T2) */ /** @defgroup T2 T2 - Implementation of a tier-2 coding */ /*@{*/ /** Tier-2 coding */ typedef struct opj_t2 { /** codec context */ opj_common_ptr cinfo; /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ opj_image_t *image; /** pointer to the image coding parameters */ opj_cp_t *cp; } opj_t2_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Encode the packets of a tile to a destination buffer @param t2 T2 handle @param tileno number of the tile encoded @param tile the tile for which to write the packets @param maxlayers maximum number of layers @param dest the destination buffer @param len the length of the destination buffer @param cstr_info Codestream information structure @param tpnum Tile part number of the current tile @param tppos The position of the tile part flag in the progression order @param pino @param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass @param cur_totnum_tp The total number of tile parts in the current tile */ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode,int cur_totnum_tp); /** Decode the packets of a tile from a source buffer @param t2 T2 handle @param src the source buffer @param len length of the source buffer @param tileno number that identifies the tile for which to decode the packets @param tile tile for which to decode the packets @param cstr_info Codestream information structure */ int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info); /** Create a T2 handle @param cinfo Codec context info @param image Source or destination image @param cp Image coding parameters @return Returns a new T2 handle if successful, returns NULL otherwise */ opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); /** Destroy a T2 handle @param t2 T2 handle to destroy */ void t2_destroy(opj_t2_t *t2); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __T2_H */ openjpeg-1.5.2/libopenjpeg/cio.c0000644000175000017500000001246712315002100016406 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /* ----------------------------------------------------------------------- */ opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { opj_cp_t *cp = NULL; opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); if(!cio) return NULL; cio->cinfo = cinfo; if(buffer && length) { /* wrap a user buffer containing the encoded image */ cio->openmode = OPJ_STREAM_READ; cio->buffer = buffer; cio->length = length; } else if(!buffer && !length && cinfo) { /* allocate a buffer for the encoded image */ cio->openmode = OPJ_STREAM_WRITE; switch(cinfo->codec_format) { case CODEC_J2K: cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; break; case CODEC_JP2: cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; break; default: opj_free(cio); return NULL; } cio->length = (unsigned int) (0.1625 * cp->img_size + 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */ cio->buffer = (unsigned char *)opj_malloc(cio->length); if(!cio->buffer) { opj_event_msg(cio->cinfo, EVT_ERROR, "Error allocating memory for compressed bitstream\n"); opj_free(cio); return NULL; } } else { opj_free(cio); return NULL; } /* Initialize byte IO */ cio->start = cio->buffer; cio->end = cio->buffer + cio->length; cio->bp = cio->buffer; return cio; } void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) { if(cio) { if(cio->openmode == OPJ_STREAM_WRITE) { /* destroy the allocated buffer */ opj_free(cio->buffer); } /* destroy the cio */ opj_free(cio); } } /* ----------------------------------------------------------------------- */ /* * Get position in byte stream. */ int OPJ_CALLCONV cio_tell(opj_cio_t *cio) { return cio->bp - cio->start; } /* * Set position in byte stream. * * pos : position, in number of bytes, from the beginning of the stream */ void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { assert((cio->start + pos) <= cio->end); cio->bp = cio->start + pos; } /* * Number of bytes left before the end of the stream. */ int cio_numbytesleft(opj_cio_t *cio) { assert((cio->end - cio->bp) >= 0); return cio->end - cio->bp; } /* * Get pointer to the current position in the stream. */ unsigned char *cio_getbp(opj_cio_t *cio) { return cio->bp; } /* * Write a byte. */ opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) { if (cio->bp >= cio->end) { opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); return OPJ_FALSE; } *cio->bp++ = v; return OPJ_TRUE; } /* * Read a byte. */ unsigned char cio_bytein(opj_cio_t *cio) { assert(cio->bp >= cio->start); if (cio->bp >= cio->end) { opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end); return 0; } return *cio->bp++; } /* * Write some bytes. * * v : value to write * n : number of bytes to write */ unsigned int cio_write(opj_cio_t *cio, unsigned int64 v, int n) { int i; for (i = n - 1; i >= 0; i--) { if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) return 0; } return n; } /* * Read some bytes. * * n : number of bytes to read * * return : value of the n bytes read */ unsigned int cio_read(opj_cio_t *cio, int n) { int i; unsigned int v; v = 0; for (i = n - 1; i >= 0; i--) { v += (unsigned int)cio_bytein(cio) << (i << 3); } return v; } /* * Skip some bytes. * * n : number of bytes to skip */ void cio_skip(opj_cio_t *cio, int n) { assert((cio->bp + n) >= cio->bp); if (((cio->bp + n) < cio->start) || ((cio->bp + n) > cio->end)) { assert(0); } cio->bp += n; } openjpeg-1.5.2/libopenjpeg/phix_manager.c0000644000175000017500000001352012315002100020265 0ustar mathieumathieu/* * $Id: phix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.c from 2KAN indexer */ #include #include #include "opj_includes.h" /* * Write faix box of phix * * @param[in] coff offset of j2k codestream * @param[in] compno component number * @param[in] cstr_info codestream information * @param[in] EPHused true if if EPH option used * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of faix box */ int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio) { int len, lenp=0, compno, i; opj_jp2_box_t *box; box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t)); for( i=0;i<2;i++){ if (i) cio_seek( cio, lenp); lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_PHIX, 4); /* PHIX */ write_manf( i, cstr_info.numcomps, box, cio); for( compno=0; compno pow( 2, 32)){ size_of_coding = 8; version = 1; } else{ size_of_coding = 4; version = 0; } lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_FAIX, 4); /* FAIX */ cio_write( cio, version,1); /* Version 0 = 4 bytes */ nmax = 0; for( i=0; i<=cstr_info.numdecompos[compno]; i++) nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers; cio_write( cio, nmax, size_of_coding); /* NMAX */ cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ for( tileno=0; tilenopw[resno]*tile_Idx->ph[resno]; for( precno=0; precnopacket[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; break; case RLCP: packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; break; case RPCL: packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; break; case PCRL: packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; break; case CPRL: packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; break; default: fprintf( stderr, "failed to ppix indexing\n"); } cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */ cio_write( cio, packet.end_ph_pos-packet.start_pos+1, size_of_coding); /* length */ num_packet++; } } } /* PADDING */ while( num_packet < nmax){ cio_write( cio, 0, size_of_coding); /* start position */ cio_write( cio, 0, size_of_coding); /* length */ num_packet++; } } len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); return len; } openjpeg-1.5.2/libopenjpeg/dwt.h0000644000175000017500000001075612315002100016436 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __DWT_H #define __DWT_H /** @file dwt.h @brief Implementation of a discrete wavelet transform (DWT) The functions in DWT.C have for goal to realize forward and inverse discret wavelet transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in DWT.C are used by some function in TCD.C. */ /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ /*@{*/ /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Forward 5-3 wavelet tranform in 2-D. Apply a reversible DWT transform to a component of an image. @param tilec Tile component information (current tile) */ void dwt_encode(opj_tcd_tilecomp_t * tilec); /** Inverse 5-3 wavelet tranform in 2-D. Apply a reversible inverse DWT transform to a component of an image. @param tilec Tile component information (current tile) @param numres Number of resolution levels to decode */ void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres); /** Get the gain of a subband for the reversible 5-3 DWT. @param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) @return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise */ int dwt_getgain(int orient); /** Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT. @param level Level of the wavelet function @param orient Band of the wavelet function @return Returns the norm of the wavelet function */ double dwt_getnorm(int level, int orient); /** Forward 9-7 wavelet transform in 2-D. Apply an irreversible DWT transform to a component of an image. @param tilec Tile component information (current tile) */ void dwt_encode_real(opj_tcd_tilecomp_t * tilec); /** Inverse 9-7 wavelet transform in 2-D. Apply an irreversible inverse DWT transform to a component of an image. @param tilec Tile component information (current tile) @param numres Number of resolution levels to decode */ void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres); /** Get the gain of a subband for the irreversible 9-7 DWT. @param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) @return Returns the gain of the 9-7 wavelet transform */ int dwt_getgain_real(int orient); /** Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT @param level Level of the wavelet function @param orient Band of the wavelet function @return Returns the norm of the 9-7 wavelet */ double dwt_getnorm_real(int level, int orient); /** Explicit calculation of the Quantization Stepsizes @param tccp Tile-component coding parameters @param prec Precint analyzed */ void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __DWT_H */ openjpeg-1.5.2/libopenjpeg/raw.h0000644000175000017500000000667612315002100016437 0ustar mathieumathieu/* * 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 * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file raw.h @brief Implementation of operations for raw encoding (RAW) The functions in RAW.C have for goal to realize the operation of raw encoding linked with the corresponding mode switch. */ /** @defgroup RAW RAW - Implementation of operations for raw encoding */ /*@{*/ /** RAW encoding operations */ typedef struct opj_raw { /** temporary buffer where bits are coded or decoded */ unsigned char c; /** number of bits already read or free to write */ unsigned int ct; /** maximum length to decode */ unsigned int lenmax; /** length decoded */ unsigned int len; /** pointer to the current position in the buffer */ unsigned char *bp; /** pointer to the start of the buffer */ unsigned char *start; /** pointer to the end of the buffer */ unsigned char *end; } opj_raw_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Create a new RAW handle @return Returns a new RAW handle if successful, returns NULL otherwise */ opj_raw_t* raw_create(void); /** Destroy a previously created RAW handle @param raw RAW handle to destroy */ void raw_destroy(opj_raw_t *raw); /** Return the number of bytes written/read since initialisation @param raw RAW handle to destroy @return Returns the number of bytes already encoded */ int raw_numbytes(opj_raw_t *raw); /** Initialize the decoder @param raw RAW handle @param bp Pointer to the start of the buffer from which the bytes will be read @param len Length of the input buffer */ void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); /** Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN @param raw RAW handle @return Returns the decoded symbol (0 or 1) */ int raw_decode(opj_raw_t *raw); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __RAW_H */ openjpeg-1.5.2/libopenjpeg/jpwl/0000755000175000017500000000000012315072522016451 5ustar mathieumathieuopenjpeg-1.5.2/libopenjpeg/jpwl/rs.h0000644000175000017500000000762412315002100017240 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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. */ #ifdef USE_JPWL /** @file rs.h @brief Functions used to compute Reed-Solomon parity and check of byte arrays */ #ifndef __RS_HEADER__ #define __RS_HEADER__ /** Global definitions for Reed-Solomon encoder/decoder * Phil Karn KA9Q, September 1996 * * The parameters MM and KK specify the Reed-Solomon code parameters. * * Set MM to be the size of each code symbol in bits. The Reed-Solomon * block size will then be NN = 2**M - 1 symbols. Supported values are * defined in rs.c. * * Set KK to be the number of data symbols in each block, which must be * less than the block size. The code will then be able to correct up * to NN-KK erasures or (NN-KK)/2 errors, or combinations thereof with * each error counting as two erasures. */ #define MM 8 /* RS code over GF(2**MM) - change to suit */ /* KK defined in rs.c */ #define NN ((1 << MM) - 1) #if (MM <= 8) typedef unsigned char dtype; #else typedef unsigned int dtype; #endif /** Initialization function */ void init_rs(int); /** These two functions *must* be called in this order (e.g., * by init_rs()) before any encoding/decoding */ void generate_gf(void); /* Generate Galois Field */ void gen_poly(void); /* Generate generator polynomial */ /** Reed-Solomon encoding * data[] is the input block, parity symbols are placed in bb[] * bb[] may lie past the end of the data, e.g., for (255,223): * encode_rs(&data[0],&data[223]); */ int encode_rs(dtype data[], dtype bb[]); /** Reed-Solomon erasures-and-errors decoding * The received block goes into data[], and a list of zero-origin * erasure positions, if any, goes in eras_pos[] with a count in no_eras. * * The decoder corrects the symbols in place, if possible and returns * the number of corrected symbols. If the codeword is illegal or * uncorrectible, the data array is unchanged and -1 is returned */ int eras_dec_rs(dtype data[], int eras_pos[], int no_eras); /** Computes the minimum between two integers @param a first integer to compare @param b second integer to compare @return returns the minimum integer between a and b */ #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif /* min */ #endif /* __RS_HEADER__ */ #endif /* USE_JPWL */ openjpeg-1.5.2/libopenjpeg/jpwl/README.txt0000644000175000017500000001333012315002100020130 0ustar mathieumathieu=============================================================================== JPEG2000 Part 11 (ISO/IEC 15444-11 JPWL) Software Version 20061213 =============================================================================== 1. Scope ============= This document describes the installation and use of the JPWL module in the framework of OpenJPEG library. This implementation has been developed from OpenJPEG implementation of JPEG2000 standard, and for this reason it is written in C language. If you find some bugs or if you have problems using the encoder/decoder, please send an e-mail to jpwl@diei.unipg.it 2. Installing the code ========================== The JPWL code is integrated with the standard OpenJPEG library and codecs: it is activated by setting the macro USE_JPWL to defined in the preprocessor configuration options of your preferred C compiler. 2.1. Compiling the source code in Windows ------------------------------------------- The "jpwl" directory is already populated with a couple of Visual C++ 6.0 workspaces * JPWL_image_to_j2k.dsw - Creates the encoder with JPWL functionalities * JPWL_j2k_to_image.dsw - Creates the decoder with JPWL functionalities 2.2. Compiling the source code in Unix-like systems ----------------------------------------------------- Under linux, enter the jpwl directory and type "make clean" and "make". 3. Running the JPWL software ========================= The options available at the command line are exactly the same of the base OpenJPEG codecs. In addition, there is a "-W" switch that activates JPWL functionalities. 3.1. JPWL Encoder ------------------- -W : adoption of JPWL (Part 11) capabilities (-W params) The parameters can be written and repeated in any order: [h<=type>,s<=method>,a=,z=,g=,... ...,p<=type>] h selects the header error protection (EPB): 'type' can be [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] if 'tile' is absent, it applies to main and tile headers if 'tile' is present, it applies from that tile onwards, up to the next h spec, or to the last tile in the codestream (max. 16 specs) p selects the packet error protection (EEP/UEP with EPBs) to be applied to raw data: 'type' can be [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] if 'tile:pack' is absent, it starts from tile 0, packet 0 if 'tile:pack' is present, it applies from that tile and that packet onwards, up to the next packet spec or to the last packet in the last tile in the codestream (max. 16 specs) s enables sensitivity data insertion (ESD): 'method' can be [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED] if 'tile' is absent, it applies to main header only if 'tile' is present, it applies from that tile onwards, up to the next s spec, or to the last tile in the codestream (max. 16 specs) g determines the addressing mode: can be [0=PACKET 1=BYTE RANGE 2=PACKET RANGE] a determines the size of data addressing: can be 2/4 bytes (small/large codestreams). If not set, auto-mode z determines the size of sensitivity values: can be 1/2 bytes, for the transformed pseudo-floating point value ex.: h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,s0=6,s3=-1,a=0,g=1,z=1 means predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2, CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs, UEP rs(78,32) for packets 0 to 23 of tile 0, UEP rs(56,32) for packets 24 to the last of tile 0, UEP rs default for packets of tile 1, no UEP for packets 0 to 19 of tile 3, UEP CRC-32 for packets 20 of tile 3 to last tile, relative sensitivity ESD for MH, TSE ESD from TPH 0 to TPH 2, byte range with automatic size of addresses and 1 byte for each sensitivity value ex.: h,s,p means default protection to headers (MH and TPHs) as well as data packets, one ESD in MH N.B.: use the following recommendations when specifying the JPWL parameters list - when you use UEP, always pair the 'p' option with 'h' 3.2. JPWL Decoder ------------------- -W Activates the JPWL correction capability, if the codestream complies. Options can be a comma separated list of tokens: c, c=numcomps numcomps is the number of expected components in the codestream (search of first EPB rely upon this, default is 3) 4. Known bugs and limitations =============================== 4.1. Bugs ----------- * It is not possible to save a JPWL encoded codestream using the wrapped file format (i.e. JP2): only raw file format (i.e. J2K) is working 4.2. Limitations ------------------ * When specifying an UEP protection, you need to activate even TPH protection for those tiles where there is a protection of the packets * RED insertion is not currently implemented at the decoder * JPWL at entropy coding level is not implemented openjpeg-1.5.2/libopenjpeg/jpwl/CMakeLists.txt0000644000175000017500000000206512315002100021175 0ustar mathieumathieu# Makefile for the main JPWL OpenJPEG codecs: JPWL_ j2k_to_image and JPWL_image_to_j2k ADD_DEFINITIONS(-DUSE_JPWL) SET(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c) IF(APPLE) SET_SOURCE_FILES_PROPERTIES( rs.c PROPERTIES COMPILE_FLAGS -fno-common) ENDIF(APPLE) INCLUDE_DIRECTORIES( ${OPENJPEG_SOURCE_DIR}/libopenjpeg ) # Build the library IF(WIN32) IF(BUILD_SHARED_LIBS) ADD_DEFINITIONS(-DOPJ_EXPORTS) ELSE(BUILD_SHARED_LIBS) ADD_DEFINITIONS(-DOPJ_STATIC) ENDIF(BUILD_SHARED_LIBS) ENDIF(WIN32) ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME}_JPWL ${JPWL_SRCS} ${OPENJPEG_SRCS}) IF(UNIX) TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME}_JPWL m) ENDIF(UNIX) SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME}_JPWL PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) # Install library INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}_JPWL EXPORT OpenJPEGTargets RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) openjpeg-1.5.2/libopenjpeg/jpwl/crc.c0000644000175000017500000002052512315002100017351 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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. */ #ifdef USE_JPWL #include "crc.h" /** @file crc.c @brief Functions used to compute the 16- and 32-bit CRC of byte arrays */ /** file: CRC16.CPP * * CRC - Cyclic Redundancy Check (16-bit) * * A CRC-checksum is used to be sure, the data hasn't changed or is false. * To create a CRC-checksum, initialise a check-variable (unsigned short), * and set this to zero. Than call for every byte in the file (e.g.) the * procedure updateCRC16 with this check-variable as the first parameter, * and the byte as the second. At the end, the check-variable contains the * CRC-checksum. * * implemented by Michael Neumann, 14.06.1998 * */ const unsigned short CRC16_table[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; void updateCRC16(unsigned short *crc, unsigned char data) { *crc = CRC16_table[(*crc >> 8) & 0xFF] ^ (*crc << 8) ^ data; } /** file: CRC32.CPP * * CRC - Cyclic Redundancy Check (32-bit) * * A CRC-checksum is used to be sure, the data hasn't changed or is false. * To create a CRC-checksum, initialise a check-variable (unsigned long), * and set this to zero. Than call for every byte in the file (e.g.) the * procedure updateCRC32 with this check-variable as the first parameter, * and the byte as the second. At the end, the check-variable contains the * CRC-checksum. * * implemented by Michael Neumann, 14.06.1998 * */ const unsigned long CRC32_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; void updateCRC32(unsigned long *crc, unsigned char data) { *crc = CRC32_table[(unsigned char) *crc ^ data] ^ ((*crc >> 8) & 0x00FFFFFF); } #endif /* USE_JPWL */ openjpeg-1.5.2/libopenjpeg/jpwl/rs.c0000644000175000017500000004116712315002100017233 0ustar mathieumathieu /* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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. */ #ifdef USE_JPWL /** @file rs.c @brief Functions used to compute the Reed-Solomon parity and check of byte arrays */ /** * Reed-Solomon coding and decoding * Phil Karn (karn@ka9q.ampr.org) September 1996 * * This file is derived from the program "new_rs_erasures.c" by Robert * Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy * (harit@spectra.eng.hawaii.edu), Aug 1995 * * I've made changes to improve performance, clean up the code and make it * easier to follow. Data is now passed to the encoding and decoding functions * through arguments rather than in global arrays. The decode function returns * the number of corrected symbols, or -1 if the word is uncorrectable. * * This code supports a symbol size from 2 bits up to 16 bits, * implying a block size of 3 2-bit symbols (6 bits) up to 65535 * 16-bit symbols (1,048,560 bits). The code parameters are set in rs.h. * * Note that if symbols larger than 8 bits are used, the type of each * data array element switches from unsigned char to unsigned int. The * caller must ensure that elements larger than the symbol range are * not passed to the encoder or decoder. * */ #include #include #include "rs.h" /* This defines the type used to store an element of the Galois Field * used by the code. Make sure this is something larger than a char if * if anything larger than GF(256) is used. * * Note: unsigned char will work up to GF(256) but int seems to run * faster on the Pentium. */ typedef int gf; /* KK = number of information symbols */ static int KK; /* Primitive polynomials - see Lin & Costello, Appendix A, * and Lee & Messerschmitt, p. 453. */ #if(MM == 2)/* Admittedly silly */ int Pp[MM+1] = { 1, 1, 1 }; #elif(MM == 3) /* 1 + x + x^3 */ int Pp[MM+1] = { 1, 1, 0, 1 }; #elif(MM == 4) /* 1 + x + x^4 */ int Pp[MM+1] = { 1, 1, 0, 0, 1 }; #elif(MM == 5) /* 1 + x^2 + x^5 */ int Pp[MM+1] = { 1, 0, 1, 0, 0, 1 }; #elif(MM == 6) /* 1 + x + x^6 */ int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 1 }; #elif(MM == 7) /* 1 + x^3 + x^7 */ int Pp[MM+1] = { 1, 0, 0, 1, 0, 0, 0, 1 }; #elif(MM == 8) /* 1+x^2+x^3+x^4+x^8 */ int Pp[MM+1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 }; #elif(MM == 9) /* 1+x^4+x^9 */ int Pp[MM+1] = { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; #elif(MM == 10) /* 1+x^3+x^10 */ int Pp[MM+1] = { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }; #elif(MM == 11) /* 1+x^2+x^11 */ int Pp[MM+1] = { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; #elif(MM == 12) /* 1+x+x^4+x^6+x^12 */ int Pp[MM+1] = { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 }; #elif(MM == 13) /* 1+x+x^3+x^4+x^13 */ int Pp[MM+1] = { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; #elif(MM == 14) /* 1+x+x^6+x^10+x^14 */ int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }; #elif(MM == 15) /* 1+x+x^15 */ int Pp[MM+1] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; #elif(MM == 16) /* 1+x+x^3+x^12+x^16 */ int Pp[MM+1] = { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 }; #else #error "MM must be in range 2-16" #endif /* Alpha exponent for the first root of the generator polynomial */ #define B0 0 /* Different from the default 1 */ /* index->polynomial form conversion table */ gf Alpha_to[NN + 1]; /* Polynomial->index form conversion table */ gf Index_of[NN + 1]; /* No legal value in index form represents zero, so * we need a special value for this purpose */ #define A0 (NN) /* Generator polynomial g(x) * Degree of g(x) = 2*TT * has roots @**B0, @**(B0+1), ... ,@^(B0+2*TT-1) */ /*gf Gg[NN - KK + 1];*/ gf Gg[NN - 1]; /* Compute x % NN, where NN is 2**MM - 1, * without a slow divide */ static /*inline*/ gf modnn(int x) { while (x >= NN) { x -= NN; x = (x >> MM) + (x & NN); } return x; } /*#define min(a,b) ((a) < (b) ? (a) : (b))*/ #define CLEAR(a,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = 0;\ } #define COPY(a,b,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = (b)[ci];\ } #define COPYDOWN(a,b,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = (b)[ci];\ } void init_rs(int k) { KK = k; if (KK >= NN) { printf("KK must be less than 2**MM - 1\n"); exit(1); } generate_gf(); gen_poly(); } /* generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m] lookup tables: index->polynomial form alpha_to[] contains j=alpha**i; polynomial form -> index form index_of[j=alpha**i] = i alpha=2 is the primitive element of GF(2**m) HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows: Let @ represent the primitive element commonly called "alpha" that is the root of the primitive polynomial p(x). Then in GF(2^m), for any 0 <= i <= 2^m-2, @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for example the polynomial representation of @^5 would be given by the binary representation of the integer "alpha_to[5]". Similarily, index_of[] can be used as follows: As above, let @ represent the primitive element of GF(2^m) that is the root of the primitive polynomial p(x). In order to find the power of @ (alpha) that has the polynomial representation a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) we consider the integer "i" whose binary representation with a(0) being LSB and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry "index_of[i]". Now, @^index_of[i] is that element whose polynomial representation is (a(0),a(1),a(2),...,a(m-1)). NOTE: The element alpha_to[2^m-1] = 0 always signifying that the representation of "@^infinity" = 0 is (0,0,0,...,0). Similarily, the element index_of[0] = A0 always signifying that the power of alpha which has the polynomial representation (0,0,...,0) is "infinity". */ void generate_gf(void) { register int i, mask; mask = 1; Alpha_to[MM] = 0; for (i = 0; i < MM; i++) { Alpha_to[i] = mask; Index_of[Alpha_to[i]] = i; /* If Pp[i] == 1 then, term @^i occurs in poly-repr of @^MM */ if (Pp[i] != 0) Alpha_to[MM] ^= mask; /* Bit-wise EXOR operation */ mask <<= 1; /* single left-shift */ } Index_of[Alpha_to[MM]] = MM; /* * Have obtained poly-repr of @^MM. Poly-repr of @^(i+1) is given by * poly-repr of @^i shifted left one-bit and accounting for any @^MM * term that may occur when poly-repr of @^i is shifted. */ mask >>= 1; for (i = MM + 1; i < NN; i++) { if (Alpha_to[i - 1] >= mask) Alpha_to[i] = Alpha_to[MM] ^ ((Alpha_to[i - 1] ^ mask) << 1); else Alpha_to[i] = Alpha_to[i - 1] << 1; Index_of[Alpha_to[i]] = i; } Index_of[0] = A0; Alpha_to[NN] = 0; } /* * Obtain the generator polynomial of the TT-error correcting, length * NN=(2**MM -1) Reed Solomon code from the product of (X+@**(B0+i)), i = 0, * ... ,(2*TT-1) * * Examples: * * If B0 = 1, TT = 1. deg(g(x)) = 2*TT = 2. * g(x) = (x+@) (x+@**2) * * If B0 = 0, TT = 2. deg(g(x)) = 2*TT = 4. * g(x) = (x+1) (x+@) (x+@**2) (x+@**3) */ void gen_poly(void) { register int i, j; Gg[0] = Alpha_to[B0]; Gg[1] = 1; /* g(x) = (X+@**B0) initially */ for (i = 2; i <= NN - KK; i++) { Gg[i] = 1; /* * Below multiply (Gg[0]+Gg[1]*x + ... +Gg[i]x^i) by * (@**(B0+i-1) + x) */ for (j = i - 1; j > 0; j--) if (Gg[j] != 0) Gg[j] = Gg[j - 1] ^ Alpha_to[modnn((Index_of[Gg[j]]) + B0 + i - 1)]; else Gg[j] = Gg[j - 1]; /* Gg[0] can never be zero */ Gg[0] = Alpha_to[modnn((Index_of[Gg[0]]) + B0 + i - 1)]; } /* convert Gg[] to index form for quicker encoding */ for (i = 0; i <= NN - KK; i++) Gg[i] = Index_of[Gg[i]]; } /* * take the string of symbols in data[i], i=0..(k-1) and encode * systematically to produce NN-KK parity symbols in bb[0]..bb[NN-KK-1] data[] * is input and bb[] is output in polynomial form. Encoding is done by using * a feedback shift register with appropriate connections specified by the * elements of Gg[], which was generated above. Codeword is c(X) = * data(X)*X**(NN-KK)+ b(X) */ int encode_rs(dtype *data, dtype *bb) { register int i, j; gf feedback; CLEAR(bb,NN-KK); for (i = KK - 1; i >= 0; i--) { #if (MM != 8) if(data[i] > NN) return -1; /* Illegal symbol */ #endif feedback = Index_of[data[i] ^ bb[NN - KK - 1]]; if (feedback != A0) { /* feedback term is non-zero */ for (j = NN - KK - 1; j > 0; j--) if (Gg[j] != A0) bb[j] = bb[j - 1] ^ Alpha_to[modnn(Gg[j] + feedback)]; else bb[j] = bb[j - 1]; bb[0] = Alpha_to[modnn(Gg[0] + feedback)]; } else { /* feedback term is zero. encoder becomes a * single-byte shifter */ for (j = NN - KK - 1; j > 0; j--) bb[j] = bb[j - 1]; bb[0] = 0; } } return 0; } /* * Performs ERRORS+ERASURES decoding of RS codes. If decoding is successful, * writes the codeword into data[] itself. Otherwise data[] is unaltered. * * Return number of symbols corrected, or -1 if codeword is illegal * or uncorrectable. * * First "no_eras" erasures are declared by the calling program. Then, the * maximum # of errors correctable is t_after_eras = floor((NN-KK-no_eras)/2). * If the number of channel errors is not greater than "t_after_eras" the * transmitted codeword will be recovered. Details of algorithm can be found * in R. Blahut's "Theory ... of Error-Correcting Codes". */ int eras_dec_rs(dtype *data, int *eras_pos, int no_eras) { int deg_lambda, el, deg_omega; int i, j, r; gf u,q,tmp,num1,num2,den,discr_r; gf recd[NN]; /* Err+Eras Locator poly and syndrome poly */ /*gf lambda[NN-KK + 1], s[NN-KK + 1]; gf b[NN-KK + 1], t[NN-KK + 1], omega[NN-KK + 1]; gf root[NN-KK], reg[NN-KK + 1], loc[NN-KK];*/ gf lambda[NN + 1], s[NN + 1]; gf b[NN + 1], t[NN + 1], omega[NN + 1]; gf root[NN], reg[NN + 1], loc[NN]; int syn_error, count; /* data[] is in polynomial form, copy and convert to index form */ for (i = NN-1; i >= 0; i--){ #if (MM != 8) if(data[i] > NN) return -1; /* Illegal symbol */ #endif recd[i] = Index_of[data[i]]; } /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x) * namely @**(B0+i), i = 0, ... ,(NN-KK-1) */ syn_error = 0; for (i = 1; i <= NN-KK; i++) { tmp = 0; for (j = 0; j < NN; j++) if (recd[j] != A0) /* recd[j] in index form */ tmp ^= Alpha_to[modnn(recd[j] + (B0+i-1)*j)]; syn_error |= tmp; /* set flag if non-zero syndrome => * error */ /* store syndrome in index form */ s[i] = Index_of[tmp]; } if (!syn_error) { /* * if syndrome is zero, data[] is a codeword and there are no * errors to correct. So return data[] unmodified */ return 0; } CLEAR(&lambda[1],NN-KK); lambda[0] = 1; if (no_eras > 0) { /* Init lambda to be the erasure locator polynomial */ lambda[1] = Alpha_to[eras_pos[0]]; for (i = 1; i < no_eras; i++) { u = eras_pos[i]; for (j = i+1; j > 0; j--) { tmp = Index_of[lambda[j - 1]]; if(tmp != A0) lambda[j] ^= Alpha_to[modnn(u + tmp)]; } } #ifdef ERASURE_DEBUG /* find roots of the erasure location polynomial */ for(i=1;i<=no_eras;i++) reg[i] = Index_of[lambda[i]]; count = 0; for (i = 1; i <= NN; i++) { q = 1; for (j = 1; j <= no_eras; j++) if (reg[j] != A0) { reg[j] = modnn(reg[j] + j); q ^= Alpha_to[reg[j]]; } if (!q) { /* store root and error location * number indices */ root[count] = i; loc[count] = NN - i; count++; } } if (count != no_eras) { printf("\n lambda(x) is WRONG\n"); return -1; } #ifndef NO_PRINT printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); for (i = 0; i < count; i++) printf("%d ", loc[i]); printf("\n"); #endif #endif } for(i=0;i 0; j--) if (reg[j] != A0) { reg[j] = modnn(reg[j] + j); q ^= Alpha_to[reg[j]]; } if (!q) { /* store root (index-form) and error location number */ root[count] = i; loc[count] = NN - i; count++; } } #ifdef DEBUG printf("\n Final error positions:\t"); for (i = 0; i < count; i++) printf("%d ", loc[i]); printf("\n"); #endif if (deg_lambda != count) { /* * deg(lambda) unequal to number of roots => uncorrectable * error detected */ return -1; } /* * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo * x**(NN-KK)). in index form. Also find deg(omega). */ deg_omega = 0; for (i = 0; i < NN-KK;i++){ tmp = 0; j = (deg_lambda < i) ? deg_lambda : i; for(;j >= 0; j--){ if ((s[i + 1 - j] != A0) && (lambda[j] != A0)) tmp ^= Alpha_to[modnn(s[i + 1 - j] + lambda[j])]; } if(tmp != 0) deg_omega = i; omega[i] = Index_of[tmp]; } omega[NN-KK] = A0; /* * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = * inv(X(l))**(B0-1) and den = lambda_pr(inv(X(l))) all in poly-form */ for (j = count-1; j >=0; j--) { num1 = 0; for (i = deg_omega; i >= 0; i--) { if (omega[i] != A0) num1 ^= Alpha_to[modnn(omega[i] + i * root[j])]; } num2 = Alpha_to[modnn(root[j] * (B0 - 1) + NN)]; den = 0; /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ for (i = min(deg_lambda,NN-KK-1) & ~1; i >= 0; i -=2) { if(lambda[i+1] != A0) den ^= Alpha_to[modnn(lambda[i+1] + i * root[j])]; } if (den == 0) { #ifdef DEBUG printf("\n ERROR: denominator = 0\n"); #endif return -1; } /* Apply error to data */ if (num1 != 0) { data[loc[j]] ^= Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - Index_of[den])]; } } return count; } #endif /* USE_JPWL */ openjpeg-1.5.2/libopenjpeg/jpwl/crc.h0000644000175000017500000000620712315002100017357 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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. */ #ifdef USE_JPWL /** @file crc.h @brief Functions used to compute the 16- and 32-bit CRC of byte arrays */ #ifndef __CRC16_HEADER__ #define __CRC16_HEADER__ /** file: CRC16.HPP * * CRC - Cyclic Redundancy Check (16-bit) * * A CRC-checksum is used to be sure, the data hasn't changed or is false. * To create a CRC-checksum, initialise a check-variable (unsigned short), * and set this to zero. Than call for every byte in the file (e.g.) the * procedure updateCRC16 with this check-variable as the first parameter, * and the byte as the second. At the end, the check-variable contains the * CRC-checksum. * * implemented by Michael Neumann, 14.06.1998 * */ void updateCRC16(unsigned short *, unsigned char); #endif /* __CRC16_HEADER__ */ #ifndef __CRC32_HEADER__ #define __CRC32_HEADER__ /** file: CRC32.HPP * * CRC - Cyclic Redundancy Check (32-bit) * * A CRC-checksum is used to be sure, the data hasn't changed or is false. * To create a CRC-checksum, initialise a check-variable (unsigned short), * and set this to zero. Than call for every byte in the file (e.g.) the * procedure updateCRC32 with this check-variable as the first parameter, * and the byte as the second. At the end, the check-variable contains the * CRC-checksum. * * implemented by Michael Neumann, 14.06.1998 * */ void updateCRC32(unsigned long *, unsigned char); #endif /* __CRC32_HEADER__ */ #endif /* USE_JPWL */ openjpeg-1.5.2/libopenjpeg/jpwl/jpwl.c0000644000175000017500000012573112315002100017563 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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" #ifdef USE_JPWL /** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ /*@{*/ /** @name Local static variables */ /*@{*/ /** number of JPWL prepared markers */ static int jwmarker_num; /** properties of JPWL markers to insert */ static jpwl_marker_t jwmarker[JPWL_MAX_NO_MARKERS]; /*@}*/ /*@}*/ /** @name Local static functions */ /*@{*/ /** create an EPC marker segment @param j2k J2K compressor handle @param esd_on true if ESD is activated @param red_on true if RED is activated @param epb_on true if EPB is activated @param info_on true if informative techniques are activated @return returns the freshly created EPC */ jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, opj_bool epb_on, opj_bool info_on); /*@}*/ /** create an EPC marker segment @param j2k J2K compressor handle @param comps considered component (-1=average, 0/1/2/...=component no.) @param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) @param ad_size size of addresses (2/4 bytes) @param senst sensitivity type @param se_size sensitivity values size (1/2 bytes) @param tileno tile where this ESD lies (-1 means MH) @param svalnum number of sensitivity values (if 0, they will be automatically filled) @param sensval pointer to an array of sensitivity values (if NULL, they will be automatically filled) @return returns the freshly created ESD */ jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comps, unsigned char addrm, unsigned char ad_size, unsigned char senst, int se_size, int tileno, unsigned long int svalnum, void *sensval); /** this function is used to compare two JPWL markers based on their relevant wishlist position @param arg1 pointer to first marker @param arg2 pointer to second marker @return 1 if arg1>arg2, 0 if arg1=arg2, -1 if arg1pos_correction = 0; } void j2k_add_marker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { if (!cstr_info) return; /* expand the list? */ if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { cstr_info->maxmarknum += 100; cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum * sizeof(opj_marker_info_t)); } /* add the marker */ cstr_info->marker[cstr_info->marknum].type = type; cstr_info->marker[cstr_info->marknum].pos = pos; cstr_info->marker[cstr_info->marknum].len = len; cstr_info->marknum++; } void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) { unsigned short int socsiz_len = 0; int ciopos = cio_tell(cio), soc_pos = j2k->cstr_info->main_head_start; unsigned char *socp = NULL; int tileno, acc_tpno, tpno, tilespec, hprot, sens, pprot, packspec, lastileno, packno; jpwl_epb_ms_t *epb_mark; jpwl_epc_ms_t *epc_mark; jpwl_esd_ms_t *esd_mark; (void)image; /* find (SOC + SIZ) length */ /* I assume SIZ is always the first marker after SOC */ cio_seek(cio, soc_pos + 4); socsiz_len = (unsigned short int) cio_read(cio, 2) + 4; /* add the 2 marks length itself */ cio_seek(cio, soc_pos + 0); socp = cio_getbp(cio); /* pointer to SOC */ /* EPC MS for Main Header: if we are here it's required */ /* create the EPC */ if ((epc_mark = jpwl_epc_create( j2k, j2k->cp->esd_on, /* is ESD present? */ j2k->cp->red_on, /* is RED present? */ j2k->cp->epb_on, /* is EPB present? */ OPJ_FALSE /* are informative techniques present? */ ))) { /* Add this marker to the 'insertanda' list */ if (epc_mark) { jwmarker[jwmarker_num].id = J2K_MS_EPC; /* its type */ jwmarker[jwmarker_num].m.epcmark = epc_mark; /* the EPC */ jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.1; /* not so first */ jwmarker[jwmarker_num].len = epc_mark->Lepc; /* its length */ jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].parms_ready = OPJ_FALSE; /* not ready */ jwmarker[jwmarker_num].data_ready = OPJ_TRUE; /* ready */ jwmarker_num++; }; opj_event_msg(j2k->cinfo, EVT_INFO, "MH EPC : setting %s%s%s\n", j2k->cp->esd_on ? "ESD, " : "", j2k->cp->red_on ? "RED, " : "", j2k->cp->epb_on ? "EPB, " : "" ); } else { /* ooops, problems */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPC\n"); }; /* ESD MS for Main Header */ /* first of all, must MH have an ESD MS? */ if (j2k->cp->esd_on && (j2k->cp->sens_MH >= 0)) { /* Create the ESD */ if ((esd_mark = jpwl_esd_create( j2k, /* this encoder handle */ -1, /* we are averaging over all components */ (unsigned char) j2k->cp->sens_range, /* range method */ (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing */ (unsigned char) j2k->cp->sens_MH, /* sensitivity method */ j2k->cp->sens_size, /* sensitivity size */ -1, /* this ESD is in main header */ 0 /*j2k->cstr_info->num*/, /* number of packets in codestream */ NULL /*sensval*/ /* pointer to sensitivity data of packets */ ))) { /* Add this marker to the 'insertanda' list */ if (jwmarker_num < JPWL_MAX_NO_MARKERS) { jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* we choose to place it after SIZ */ jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.2; /* not first at all! */ jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* not ready, yet */ jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ jwmarker_num++; } opj_event_msg(j2k->cinfo, EVT_INFO, "MH ESDs: method %d\n", j2k->cp->sens_MH ); } else { /* ooops, problems */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH ESD\n"); }; } /* ESD MSs for Tile Part Headers */ /* cycle through tiles */ sens = -1; /* default spec: no ESD */ tilespec = 0; /* first tile spec */ acc_tpno = 0; for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { opj_event_msg(j2k->cinfo, EVT_INFO, "Tile %d has %d tile part(s)\n", tileno, j2k->cstr_info->tile[tileno].num_tps ); /* for every tile part in the tile */ for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; tpno++, acc_tpno++) { int sot_len, Psot, Psotp, mm; unsigned long sot_pos, post_sod_pos; unsigned long int left_THmarks_len; /******* sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; cio_seek(cio, sot_pos + 2); sot_len = cio_read(cio, 2); /* SOT Len */ cio_skip(cio, 2); Psotp = cio_tell(cio); Psot = cio_read(cio, 4); /* tile length */ /******* post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; left_THmarks_len = post_sod_pos - sot_pos; /* add all the lengths of the markers which are len-ready and stay within SOT and SOD */ for (mm = 0; mm < jwmarker_num; mm++) { if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { if (jwmarker[mm].len_ready) left_THmarks_len += jwmarker[mm].len + 2; else { opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up TH EPB\n", jwmarker[mm].id, jwmarker[mm].dpos); exit(1); } } } /******* if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == tileno)) */ if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == acc_tpno)) /* we got a specification from this tile onwards */ sens = j2k->cp->sens_TPH[tilespec++]; /* must this TPH have an ESD MS? */ if (j2k->cp->esd_on && (sens >= 0)) { /* Create the ESD */ if ((esd_mark = jpwl_esd_create( j2k, /* this encoder handle */ -1, /* we are averaging over all components */ (unsigned char) j2k->cp->sens_range, /* range method */ (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing size */ (unsigned char) sens, /* sensitivity method */ j2k->cp->sens_size, /* sensitivity value size */ tileno, /* this ESD is in a tile */ 0, /* number of packets in codestream */ NULL /* pointer to sensitivity data of packets */ ))) { /* Add this marker to the 'insertanda' list */ if (jwmarker_num < JPWL_MAX_NO_MARKERS) { jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */ jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + 0.2; /* not first at all! */ jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready, yet */ jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* ready */ jwmarker_num++; } /* update Psot of the tile */ cio_seek(cio, Psotp); cio_write(cio, Psot + esd_mark->Lesd + 2, 4); opj_event_msg(j2k->cinfo, EVT_INFO, /******* "TPH ESDs: tile %02d, method %d\n", */ "TPH ESDs: tile %02d, part %02d, method %d\n", /******* tileno, */ tileno, tpno, sens ); } else { /* ooops, problems */ /***** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d\n", tileno); */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d,%d\n", tileno, tpno); }; } } }; /* EPB MS for Main Header */ /* first of all, must MH have an EPB MS? */ if (j2k->cp->epb_on && (j2k->cp->hprot_MH > 0)) { int mm; /* position of SOT */ unsigned int sot_pos = j2k->cstr_info->main_head_end + 1; /* how much space is there between end of SIZ and beginning of SOT? */ int left_MHmarks_len = sot_pos - socsiz_len; /* add all the lengths of the markers which are len-ready and stay within SOC and SOT */ for (mm = 0; mm < jwmarker_num; mm++) { if ( jwmarker[mm].pos < sot_pos) { /* jwmarker[mm].pos >=0 since ulong */ if (jwmarker[mm].len_ready) left_MHmarks_len += jwmarker[mm].len + 2; else { opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up MH EPB\n", jwmarker[mm].id, jwmarker[mm].dpos); exit(1); } } } /* Create the EPB */ if ((epb_mark = jpwl_epb_create( j2k, /* this encoder handle */ OPJ_TRUE, /* is it the latest? */ OPJ_TRUE, /* is it packed? not for now */ -1, /* we are in main header */ 0, /* its index is 0 (first) */ j2k->cp->hprot_MH, /* protection type parameters of data */ socsiz_len, /* pre-data: only SOC+SIZ */ left_MHmarks_len /* post-data: from SOC to SOT, and all JPWL markers within */ ))) { /* Add this marker to the 'insertanda' list */ if (jwmarker_num < JPWL_MAX_NO_MARKERS) { jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos; /* first first first! */ jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ jwmarker_num++; } opj_event_msg(j2k->cinfo, EVT_INFO, "MH EPB : prot. %d\n", j2k->cp->hprot_MH ); } else { /* ooops, problems */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPB\n"); }; } /* EPB MSs for Tile Parts */ /* cycle through TPHs */ hprot = j2k->cp->hprot_MH; /* default spec */ tilespec = 0; /* first tile spec */ lastileno = 0; packspec = 0; pprot = -1; acc_tpno = 0; for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { opj_event_msg(j2k->cinfo, EVT_INFO, "Tile %d has %d tile part(s)\n", tileno, j2k->cstr_info->tile[tileno].num_tps ); /* for every tile part in the tile */ for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; tpno++, acc_tpno++) { int sot_len, Psot, Psotp, mm, epb_index = 0, prot_len = 0; unsigned long sot_pos, post_sod_pos; unsigned long int left_THmarks_len/*, epbs_len = 0*/; int startpack = 0, stoppack = j2k->cstr_info->packno; int first_tp_pack, last_tp_pack; jpwl_epb_ms_t *tph_epb = NULL; /****** sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; cio_seek(cio, sot_pos + 2); sot_len = cio_read(cio, 2); /* SOT Len */ cio_skip(cio, 2); Psotp = cio_tell(cio); Psot = cio_read(cio, 4); /* tile length */ /* a-priori length of the data dwelling between SOT and SOD */ /****** post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; left_THmarks_len = post_sod_pos - (sot_pos + sot_len + 2); /* add all the lengths of the JPWL markers which are len-ready and stay within SOT and SOD */ for (mm = 0; mm < jwmarker_num; mm++) { if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { if (jwmarker[mm].len_ready) left_THmarks_len += jwmarker[mm].len + 2; else { opj_event_msg(j2k->cinfo, EVT_ERROR, "MS %x in %f is not len-ready: could not set up TH EPB\n", jwmarker[mm].id, jwmarker[mm].dpos); exit(1); } } } /****** if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == tileno)) */ if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == acc_tpno)) /* we got a specification from this tile part onwards */ hprot = j2k->cp->hprot_TPH[tilespec++]; /* must this TPH have an EPB MS? */ if (j2k->cp->epb_on && (hprot > 0)) { /* Create the EPB */ if ((epb_mark = jpwl_epb_create( j2k, /* this encoder handle */ OPJ_FALSE, /* is it the latest? in TPH, no for now (if huge data size in TPH, we'd need more) */ OPJ_TRUE, /* is it packed? yes for now */ tileno, /* we are in TPH */ epb_index++, /* its index is 0 (first) */ hprot, /* protection type parameters of following data */ sot_len + 2, /* pre-data length: only SOT */ left_THmarks_len /* post-data length: from SOT end to SOD inclusive */ ))) { /* Add this marker to the 'insertanda' list */ if (jwmarker_num < JPWL_MAX_NO_MARKERS) { jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2; /* after SOT */ jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos; /* first first first! */ jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ jwmarker_num++; } /* update Psot of the tile */ Psot += epb_mark->Lepb + 2; opj_event_msg(j2k->cinfo, EVT_INFO, /***** "TPH EPB : tile %02d, prot. %d\n", */ "TPH EPB : tile %02d, part %02d, prot. %d\n", /***** tileno, */ tileno, tpno, hprot ); /* save this TPH EPB address */ tph_epb = epb_mark; } else { /* ooops, problems */ /****** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB #%d\n", tileno); */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB in #%d,d\n", tileno, tpno); }; } startpack = 0; /* EPB MSs for UEP packet data protection in Tile Parts */ /****** for (packno = 0; packno < j2k->cstr_info->num; packno++) { */ /*first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno - 1].tp_numpacks) : 0;*/ first_tp_pack = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pack; last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks - 1; for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks; packno++) { /******** if ((packspec < JPWL_MAX_NO_PACKSPECS) && (j2k->cp->pprot_tileno[packspec] == tileno) && (j2k->cp->pprot_packno[packspec] == packno)) { */ if ((packspec < JPWL_MAX_NO_PACKSPECS) && (j2k->cp->pprot_tileno[packspec] == acc_tpno) && (j2k->cp->pprot_packno[packspec] == packno)) { /* we got a specification from this tile and packet onwards */ /* print the previous spec */ if (packno > 0) { stoppack = packno - 1; opj_event_msg(j2k->cinfo, EVT_INFO, /***** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", /***** tileno, */ tileno, tpno, startpack, stoppack, /***** j2k->cstr_info->tile[tileno].packet[startpack].start_pos, */ j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, /***** j2k->cstr_info->tile[tileno].packet[stoppack].end_pos, */ j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, pprot); /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos + 1 - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; /* particular case: if this is the last header and the last packet, then it is better to protect even the EOC marker */ /****** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && (stoppack == (j2k->cstr_info->num - 1))) */ if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && (stoppack == last_tp_pack)) /* add the EOC len */ prot_len += 2; /* let's add the EPBs */ Psot += jpwl_epbs_add( j2k, /* J2K handle */ jwmarker, /* pointer to JPWL markers list */ &jwmarker_num, /* pointer to the number of current markers */ OPJ_FALSE, /* latest */ OPJ_TRUE, /* packed */ OPJ_FALSE, /* inside MH */ &epb_index, /* pointer to EPB index */ pprot, /* protection type */ /****** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001, */ /* position */ (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */ tileno, /* number of tile */ 0, /* length of pre-data */ prot_len /*4000*/ /* length of post-data */ ); } startpack = packno; pprot = j2k->cp->pprot[packspec++]; } /*printf("Tile %02d, pack %02d ==> %d\n", tileno, packno, pprot);*/ } /* we are at the end: print the remaining spec */ stoppack = packno - 1; if (pprot >= 0) { opj_event_msg(j2k->cinfo, EVT_INFO, /**** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", /**** tileno, */ tileno, tpno, startpack, stoppack, /***** j2k->image_info->tile[tileno].packet[startpack].start_pos, j2k->image_info->tile[tileno].packet[stoppack].end_pos, */ j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, pprot); /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos + 1 - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; /* particular case: if this is the last header and the last packet, then it is better to protect even the EOC marker */ /***** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && (stoppack == (j2k->cstr_info->num - 1))) */ if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && (stoppack == last_tp_pack)) /* add the EOC len */ prot_len += 2; /* let's add the EPBs */ Psot += jpwl_epbs_add( j2k, /* J2K handle */ jwmarker, /* pointer to JPWL markers list */ &jwmarker_num, /* pointer to the number of current markers */ OPJ_TRUE, /* latest */ OPJ_TRUE, /* packed */ OPJ_FALSE, /* inside MH */ &epb_index, /* pointer to EPB index */ pprot, /* protection type */ /***** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001,*/ /* position */ (double) (j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + 0.0001, /* position */ tileno, /* number of tile */ 0, /* length of pre-data */ prot_len /*4000*/ /* length of post-data */ ); } /* we can now check if the TPH EPB was really the last one */ if (tph_epb && (epb_index == 1)) { /* set the TPH EPB to be the last one in current header */ tph_epb->Depb |= (unsigned char) ((OPJ_TRUE & 0x0001) << 6); tph_epb = NULL; } /* write back Psot */ cio_seek(cio, Psotp); cio_write(cio, Psot, 4); } }; /* reset the position */ cio_seek(cio, ciopos); } void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) { int mm; unsigned long int old_size = j2k->cstr_info->codestream_size; unsigned long int new_size = old_size; int /*ciopos = cio_tell(cio),*/ soc_pos = j2k->cstr_info->main_head_start; unsigned char *jpwl_buf, *orig_buf; unsigned long int orig_pos; double epbcoding_time = 0.0, esdcoding_time = 0.0; (void)image; /* Order JPWL markers according to their wishlist position */ qsort((void *) jwmarker, (size_t) jwmarker_num, sizeof (jpwl_marker_t), jpwl_markcomp); /* compute markers total size */ for (mm = 0; mm < jwmarker_num; mm++) { /*printf("%x, %d, %.10f, %d long\n", jwmarker[mm].id, jwmarker[mm].pos, jwmarker[mm].dpos, jwmarker[mm].len);*/ new_size += jwmarker[mm].len + 2; } /* allocate a new buffer of proper size */ if (!(jpwl_buf = (unsigned char *) opj_malloc((size_t) (new_size + soc_pos) * sizeof(unsigned char)))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for JPWL codestream buffer\n"); exit(1); }; /* copy the jp2 part, if any */ orig_buf = jpwl_buf; memcpy(jpwl_buf, cio->buffer, soc_pos); jpwl_buf += soc_pos; /* cycle through markers */ orig_pos = soc_pos + 0; /* start from the beginning */ cio_seek(cio, soc_pos + 0); /* rewind the original */ for (mm = 0; mm < jwmarker_num; mm++) { /* need to copy a piece of the original codestream if there is such */ memcpy(jpwl_buf, cio_getbp(cio), jwmarker[mm].pos - orig_pos); jpwl_buf += jwmarker[mm].pos - orig_pos; orig_pos = jwmarker[mm].pos; cio_seek(cio, orig_pos); /* then write down the marker */ switch (jwmarker[mm].id) { case J2K_MS_EPB: jpwl_epb_write(j2k, jwmarker[mm].m.epbmark, jpwl_buf); break; case J2K_MS_EPC: jpwl_epc_write(j2k, jwmarker[mm].m.epcmark, jpwl_buf); break; case J2K_MS_ESD: jpwl_esd_write(j2k, jwmarker[mm].m.esdmark, jpwl_buf); break; case J2K_MS_RED: memset(jpwl_buf, 0, jwmarker[mm].len + 2); /* placeholder */ break; default: break; }; /* we update the markers struct */ if (j2k->cstr_info) j2k->cstr_info->marker[j2k->cstr_info->marknum - 1].pos = (jpwl_buf - orig_buf); /* we set the marker dpos to the new position in the JPWL codestream */ jwmarker[mm].dpos = (double) (jpwl_buf - orig_buf); /* advance JPWL buffer position */ jpwl_buf += jwmarker[mm].len + 2; } /* finish remaining original codestream */ memcpy(jpwl_buf, cio_getbp(cio), old_size - (orig_pos - soc_pos)); jpwl_buf += old_size - (orig_pos - soc_pos); cio_seek(cio, soc_pos + old_size); /* update info file based on added markers */ if (!jpwl_update_info(j2k, jwmarker, jwmarker_num)) opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not update OPJ cstr_info structure\n"); /* now we need to repass some markers and fill their data fields */ /* first of all, DL and Pcrc in EPCs */ for (mm = 0; mm < jwmarker_num; mm++) { /* find the EPCs */ if (jwmarker[mm].id == J2K_MS_EPC) { int epc_pos = (int) jwmarker[mm].dpos, pp; unsigned short int mycrc = 0x0000; /* fix and fill the DL field */ jwmarker[mm].m.epcmark->DL = new_size; orig_buf[epc_pos + 6] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 24); orig_buf[epc_pos + 7] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 16); orig_buf[epc_pos + 8] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 8); orig_buf[epc_pos + 9] = (unsigned char) (jwmarker[mm].m.epcmark->DL >> 0); /* compute the CRC field (excluding itself) */ for (pp = 0; pp < 4; pp++) jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); for (pp = 6; pp < (jwmarker[mm].len + 2); pp++) jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); /* fix and fill the CRC */ jwmarker[mm].m.epcmark->Pcrc = mycrc; orig_buf[epc_pos + 4] = (unsigned char) (jwmarker[mm].m.epcmark->Pcrc >> 8); orig_buf[epc_pos + 5] = (unsigned char) (jwmarker[mm].m.epcmark->Pcrc >> 0); } } /* then, sensitivity data in ESDs */ esdcoding_time = opj_clock(); for (mm = 0; mm < jwmarker_num; mm++) { /* find the ESDs */ if (jwmarker[mm].id == J2K_MS_ESD) { /* remember that they are now in a new position (dpos) */ int esd_pos = (int) jwmarker[mm].dpos; jpwl_esd_fill(j2k, jwmarker[mm].m.esdmark, &orig_buf[esd_pos]); } } esdcoding_time = opj_clock() - esdcoding_time; if (j2k->cp->esd_on) opj_event_msg(j2k->cinfo, EVT_INFO, "ESDs sensitivities computed in %f s\n", esdcoding_time); /* finally, RS or CRC parity in EPBs */ epbcoding_time = opj_clock(); for (mm = 0; mm < jwmarker_num; mm++) { /* find the EPBs */ if (jwmarker[mm].id == J2K_MS_EPB) { /* remember that they are now in a new position (dpos) */ int nn, accum_len; /* let's see how many EPBs are following this one, included itself */ /* for this to work, we suppose that the markers are correctly ordered */ /* and, overall, that they are in packed mode inside headers */ accum_len = 0; for (nn = mm; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && (jwmarker[nn].pos == jwmarker[mm].pos); nn++) accum_len += jwmarker[nn].m.epbmark->Lepb + 2; /* fill the current (first) EPB with post-data starting from the computed position */ jpwl_epb_fill(j2k, jwmarker[mm].m.epbmark, &orig_buf[(int) jwmarker[mm].dpos], &orig_buf[(int) jwmarker[mm].dpos + accum_len]); /* fill the remaining EPBs in the header with post-data starting from the last position */ for (nn = mm + 1; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && (jwmarker[nn].pos == jwmarker[mm].pos); nn++) jpwl_epb_fill(j2k, jwmarker[nn].m.epbmark, &orig_buf[(int) jwmarker[nn].dpos], NULL); /* skip all the processed EPBs */ mm = nn - 1; } } epbcoding_time = opj_clock() - epbcoding_time; if (j2k->cp->epb_on) opj_event_msg(j2k->cinfo, EVT_INFO, "EPBs redundancy computed in %f s\n", epbcoding_time); /* free original cio buffer and set it to the JPWL one */ opj_free(cio->buffer); cio->cinfo = cio->cinfo; /* no change */ cio->openmode = cio->openmode; /* no change */ cio->buffer = orig_buf; cio->length = new_size + soc_pos; cio->start = cio->buffer; cio->end = cio->buffer + cio->length; cio->bp = cio->buffer; cio_seek(cio, soc_pos + new_size); } void j2k_read_epc(opj_j2k_t *j2k) { unsigned long int DL, Lepcp, Pcrcp, l; unsigned short int Lepc, Pcrc = 0x0000; unsigned char Pepc; opj_cio_t *cio = j2k->cio; const char *ans1; /* Simply read the EPC parameters */ Lepcp = cio_tell(cio); Lepc = cio_read(cio, 2); Pcrcp = cio_tell(cio); cio_skip(cio, 2); /* Pcrc */ DL = cio_read(cio, 4); Pepc = cio_read(cio, 1); /* compute Pcrc */ cio_seek(cio, Lepcp - 2); /* Marker */ jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* Length */ jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* skip Pcrc */ cio_skip(cio, 2); /* read all remaining */ for (l = 4; l < Lepc; l++) jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* check Pcrc with the result */ cio_seek(cio, Pcrcp); ans1 = (Pcrc == (unsigned short int) cio_read(cio, 2)) ? "crc-ok" : "crc-ko"; /* now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "EPC(%u,%d): %s, DL=%d%s %s %s\n", Lepcp - 2, Lepc, ans1, DL, /* data length this EPC is referring to */ (Pepc & 0x10) ? ", esd" : "", /* ESD is present */ (Pepc & 0x20) ? ", red" : "", /* RED is present */ (Pepc & 0x40) ? ", epb" : ""); /* EPB is present */ cio_seek(cio, Lepcp + Lepc); } void j2k_write_epc(opj_j2k_t *j2k) { unsigned long int DL, Lepcp, Pcrcp, l; unsigned short int Lepc, Pcrc; unsigned char Pepc; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_EPC, 2); /* EPC */ Lepcp = cio_tell(cio); cio_skip(cio, 2); /* CRC-16 word of the EPC */ Pcrc = 0x0000; /* initialize */ Pcrcp = cio_tell(cio); cio_write(cio, Pcrc, 2); /* Pcrc placeholder*/ /* data length of the EPC protection domain */ DL = 0x00000000; /* we leave this set to 0, as if the information is not available */ cio_write(cio, DL, 4); /* DL */ /* jpwl capabilities */ Pepc = 0x00; cio_write(cio, Pepc, 1); /* Pepc */ /* ID section */ /* no ID's, as of now */ Lepc = (unsigned short) (cio_tell(cio) - Lepcp); cio_seek(cio, Lepcp); cio_write(cio, Lepc, 2); /* Lepc */ /* compute Pcrc */ cio_seek(cio, Lepcp - 2); /* Marker */ jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* Length */ jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* skip Pcrc */ cio_skip(cio, 2); /* read all remaining */ for (l = 4; l < Lepc; l++) jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); /* fill Pcrc with the result */ cio_seek(cio, Pcrcp); cio_write(cio, Pcrc, 2); cio_seek(cio, Lepcp + Lepc); /* marker struct update */ j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, Lepcp - 2, Lepc + 2); } void j2k_read_epb(opj_j2k_t *j2k) { unsigned long int LDPepb, Pepb; unsigned short int Lepb; unsigned char Depb; char str1[25] = ""; opj_bool status; static opj_bool first_in_tph = OPJ_TRUE; int type, pre_len, post_len; static unsigned char *redund = NULL; opj_cio_t *cio = j2k->cio; /* B/W = 45, RGB = 51 */ /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ int skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; if (j2k->cp->correct) { /* go back to EPB marker value */ cio_seek(cio, cio_tell(cio) - 2); /* we need to understand where we are */ if (j2k->state == J2K_STATE_MH) { /* we are in MH */ type = 0; /* MH */ pre_len = skipnum; /* SOC+SIZ */ post_len = -1; /* auto */ } else if ((j2k->state == J2K_STATE_TPH) && first_in_tph) { /* we are in TPH */ type = 1; /* TPH */ pre_len = 12; /* SOC+SIZ */ first_in_tph = OPJ_FALSE; post_len = -1; /* auto */ } else { /* we are elsewhere */ type = 2; /* other */ pre_len = 0; /* nada */ post_len = -1; /* auto */ } /* call EPB corrector */ /*printf("before %x, ", redund);*/ status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ cio->bp, /* pointer to EPB in codestream buffer */ type, /* EPB type: MH */ pre_len, /* length of pre-data */ post_len, /* length of post-data: -1 means auto */ NULL, /* do everything auto */ &redund ); /*printf("after %x\n", redund);*/ /* Read the (possibly corrected) EPB parameters */ cio_skip(cio, 2); Lepb = cio_read(cio, 2); Depb = cio_read(cio, 1); LDPepb = cio_read(cio, 4); Pepb = cio_read(cio, 4); if (!status) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL correction could not be performed\n"); /* advance to EPB endpoint */ cio_skip(cio, Lepb + 2); return; } /* last in current header? */ if (Depb & 0x40) { redund = NULL; /* reset the pointer to L4 buffer */ first_in_tph = OPJ_TRUE; } /* advance to EPB endpoint */ cio_skip(cio, Lepb - 11); } else { /* Simply read the EPB parameters */ Lepb = cio_read(cio, 2); Depb = cio_read(cio, 1); LDPepb = cio_read(cio, 4); Pepb = cio_read(cio, 4); /* What does Pepb tells us about the protection method? */ if (((Pepb & 0xF0000000) >> 28) == 0) sprintf(str1, "pred"); /* predefined */ else if (((Pepb & 0xF0000000) >> 28) == 1) sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ else if (((Pepb & 0xF0000000) >> 28) == 2) sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ else if (Pepb == 0xFFFFFFFF) sprintf(str1, "nometh"); /* RS mode */ else sprintf(str1, "unknown"); /* unknown */ /* Now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "EPB(%d): (%sl, %sp, %u), %lu, %s\n", cio_tell(cio) - 13, (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ (Depb & 0x3F), /* EPB index value */ LDPepb, /*length of the data protected by the EPB */ str1); /* protection method */ cio_skip(cio, Lepb - 11); } } void j2k_write_epb(opj_j2k_t *j2k) { unsigned long int LDPepb, Pepb, Lepbp; unsigned short int Lepb; unsigned char Depb; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_EPB, 2); /* EPB */ Lepbp = cio_tell(cio); cio_skip(cio, 2); /* EPB style */ Depb = 0x00; /* test */ cio_write(cio, Depb, 1); /* Depb */ /* length of the data to be protected by this EPB */ LDPepb = 0x00000000; /* test */ cio_write(cio, LDPepb, 4); /* LDPepb */ /* next error correction tool */ Pepb = 0x00000000; /* test */ cio_write(cio, Pepb, 4); /* Pepb */ /* EPB data */ /* no data, as of now */ Lepb = (unsigned short) (cio_tell(cio) - Lepbp); cio_seek(cio, Lepbp); cio_write(cio, Lepb, 2); /* Lepb */ cio_seek(cio, Lepbp + Lepb); /* marker struct update */ j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, Lepbp - 2, Lepb + 2); } void j2k_read_esd(opj_j2k_t *j2k) { unsigned short int Lesd, Cesd; unsigned char Pesd; int cesdsize = (j2k->image->numcomps >= 257) ? 2 : 1; char str1[4][4] = {"p", "br", "pr", "res"}; char str2[8][8] = {"res", "mse", "mse-r", "psnr", "psnr-i", "maxerr", "tse", "res"}; opj_cio_t *cio = j2k->cio; /* Simply read the ESD parameters */ Lesd = cio_read(cio, 2); Cesd = cio_read(cio, cesdsize); Pesd = cio_read(cio, 1); /* Now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "ESD(%d): c%d, %s, %s, %s, %s, %s\n", cio_tell(cio) - (5 + cesdsize), Cesd, /* component number for this ESD */ str1[(Pesd & (unsigned char) 0xC0) >> 6], /* addressing mode */ str2[(Pesd & (unsigned char) 0x38) >> 3], /* sensitivity type */ ((Pesd & (unsigned char) 0x04) >> 2) ? "2Bs" : "1Bs", ((Pesd & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", (Pesd & (unsigned char) 0x01) ? "avgc" : ""); cio_skip(cio, Lesd - (3 + cesdsize)); } void j2k_read_red(opj_j2k_t *j2k) { unsigned short int Lred; unsigned char Pred; char str1[4][4] = {"p", "br", "pr", "res"}; opj_cio_t *cio = j2k->cio; /* Simply read the RED parameters */ Lred = cio_read(cio, 2); Pred = cio_read(cio, 1); /* Now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "RED(%d): %s, %dc, %s, %s\n", cio_tell(cio) - 5, str1[(Pred & (unsigned char) 0xC0) >> 6], /* addressing mode */ (Pred & (unsigned char) 0x38) >> 3, /* corruption level */ ((Pred & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", /* address range */ (Pred & (unsigned char) 0x01) ? "errs" : "free"); /* error free? */ cio_skip(cio, Lred - 3); } opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) { #ifdef oerhgierhgvhreit4u /* we navigate through the tile and find possible invalid parameters: this saves a lot of crashes!!!!! */ int compno, resno, precno, /*layno,*/ bandno, blockno; int numprecincts, numblocks; /* this is the selected tile */ opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[tileno]); /* will keep the component */ opj_tcd_tilecomp_t *comp = NULL; /* will keep the resolution */ opj_tcd_resolution_t *res; /* will keep the subband */ opj_tcd_band_t *band; /* will keep the precinct */ opj_tcd_precinct_t *prec; /* will keep the codeblock */ opj_tcd_cblk_t *block; /* check all tile components */ for (compno = 0; compno < tile->numcomps; compno++) { comp = &(tile->comps[compno]); /* check all component resolutions */ for (resno = 0; resno < comp->numresolutions; resno++) { res = &(comp->resolutions[resno]); numprecincts = res->pw * res->ph; /* check all the subbands */ for (bandno = 0; bandno < res->numbands; bandno++) { band = &(res->bands[bandno]); /* check all the precincts */ for (precno = 0; precno < numprecincts; precno++) { prec = &(band->precincts[precno]); numblocks = prec->ch * prec->cw; /* check all the codeblocks */ for (blockno = 0; blockno < numblocks; blockno++) { block = &(prec->cblks[blockno]); /* x-origin is invalid */ if ((block->x0 < prec->x0) || (block->x0 > prec->x1)) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: wrong x-cord of block origin %d => x-prec is (%d, %d)\n", block->x0, prec->x0, prec->x1); if (!JPWL_ASSUME || JPWL_ASSUME) return OPJ_FALSE; }; } } } } } #else (void)j2k; (void)tcd; (void)tileno; #endif return OPJ_TRUE; } /*@}*/ #endif /* USE_JPWL */ #ifdef USE_JPSEC /** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ /*@{*/ /** @name Local static functions */ /*@{*/ void j2k_read_sec(opj_j2k_t *j2k) { unsigned short int Lsec; opj_cio_t *cio = j2k->cio; /* Simply read the SEC length */ Lsec = cio_read(cio, 2); /* Now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "SEC(%d)\n", cio_tell(cio) - 2 ); cio_skip(cio, Lsec - 2); } void j2k_write_sec(opj_j2k_t *j2k) { unsigned short int Lsec = 24; int i; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_SEC, 2); /* SEC */ cio_write(cio, Lsec, 2); /* write dummy data */ for (i = 0; i < Lsec - 2; i++) cio_write(cio, 0, 1); } void j2k_read_insec(opj_j2k_t *j2k) { unsigned short int Linsec; opj_cio_t *cio = j2k->cio; /* Simply read the INSEC length */ Linsec = cio_read(cio, 2); /* Now we write them to screen */ opj_event_msg(j2k->cinfo, EVT_INFO, "INSEC(%d)\n", cio_tell(cio) - 2 ); cio_skip(cio, Linsec - 2); } /*@}*/ /*@}*/ #endif /* USE_JPSEC */ openjpeg-1.5.2/libopenjpeg/jpwl/jpwl_lib.c0000644000175000017500000014240112315002100020402 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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. */ #ifdef USE_JPWL #include "opj_includes.h" #include /** Minimum and maximum values for the double->pfp conversion */ #define MIN_V1 0.0 #define MAX_V1 17293822569102704640.0 #define MIN_V2 0.000030517578125 #define MAX_V2 131040.0 /** conversion between a double precision floating point number and the corresponding pseudo-floating point used to represent sensitivity values @param V the double precision value @param bytes the number of bytes of the representation @return the pseudo-floating point value (cast accordingly) */ unsigned short int jpwl_double_to_pfp(double V, int bytes); /** conversion between a pseudo-floating point used to represent sensitivity values and the corresponding double precision floating point number @param em the pseudo-floating point value (cast accordingly) @param bytes the number of bytes of the representation @return the double precision value */ double jpwl_pfp_to_double(unsigned short int em, int bytes); /*-------------------------------------------------------------*/ int jpwl_markcomp(const void *arg1, const void *arg2) { /* Compare the two markers' positions */ double diff = (((jpwl_marker_t *) arg1)->dpos - ((jpwl_marker_t *) arg2)->dpos); if (diff == 0.0) return (0); else if (diff < 0) return (-1); else return (+1); } int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, double place_pos, int tileno, unsigned long int pre_len, unsigned long int post_len) { jpwl_epb_ms_t *epb_mark = NULL; int k_pre, k_post, n_pre, n_post; unsigned long int L1, L2, dL4, max_postlen, epbs_len = 0; /* We find RS(n,k) for EPB parms and pre-data, if any */ if (insideMH && (*idx == 0)) { /* First EPB in MH */ k_pre = 64; n_pre = 160; } else if (!insideMH && (*idx == 0)) { /* First EPB in TH */ k_pre = 25; n_pre = 80; } else { /* Following EPBs in MH or TH */ k_pre = 13; n_pre = 40; }; /* Find lengths, Figs. B3 and B4 */ /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ L1 = pre_len + 13; /* size of pre-data redundancy */ /* (redundancy per codeword) * (number of codewords, rounded up) */ L2 = (n_pre - k_pre) * (unsigned long int) ceil((double) L1 / (double) k_pre); /* Find protection type for post data and its associated redundancy field length*/ if ((hprot == 16) || (hprot == 32)) { /* there is a CRC for post-data */ k_post = post_len; n_post = post_len + (hprot >> 3); /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ } else if ((hprot >= 37) && (hprot <= 128)) { /* there is a RS for post-data */ k_post = 32; n_post = hprot; } else { /* Use predefined codes */ n_post = n_pre; k_post = k_pre; }; /* Create the EPB(s) */ while (post_len > 0) { /* maximum postlen in order to respect EPB size (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms)*/ /* (message word size) * (number of containable parity words) */ max_postlen = k_post * (unsigned long int) floor((double) JPWL_MAXIMUM_EPB_ROOM / (double) (n_post - k_post)); /* maximum postlen in order to respect EPB size */ if (*idx == 0) /* (we use (JPWL_MAXIMUM_EPB_ROOM - L2) instead of 65535 for keeping room for EPB parms + pre-data) */ /* (message word size) * (number of containable parity words) */ max_postlen = k_post * (unsigned long int) floor((double) (JPWL_MAXIMUM_EPB_ROOM - L2) / (double) (n_post - k_post)); else /* (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms) */ /* (message word size) * (number of containable parity words) */ max_postlen = k_post * (unsigned long int) floor((double) JPWL_MAXIMUM_EPB_ROOM / (double) (n_post - k_post)); /* null protection case */ /* the max post length can be as large as the LDPepb field can host */ if (hprot == 0) max_postlen = INT_MAX; /* length to use */ dL4 = min(max_postlen, post_len); if ((epb_mark = jpwl_epb_create( j2k, /* this encoder handle */ latest ? (dL4 < max_postlen) : OPJ_FALSE, /* is it the latest? */ packed, /* is it packed? */ tileno, /* we are in TPH */ *idx, /* its index */ hprot, /* protection type parameters of following data */ 0, /* pre-data: nothing for now */ dL4 /* post-data: the stub computed previously */ ))) { /* Add this marker to the 'insertanda' list */ if (*jwmarker_num < JPWL_MAX_NO_MARKERS) { jwmarker[*jwmarker_num].id = J2K_MS_EPB; /* its type */ jwmarker[*jwmarker_num].m.epbmark = epb_mark; /* the EPB */ jwmarker[*jwmarker_num].pos = (int) place_pos; /* after SOT */ jwmarker[*jwmarker_num].dpos = place_pos + 0.0000001 * (double)(*idx); /* not very first! */ jwmarker[*jwmarker_num].len = epb_mark->Lepb; /* its length */ jwmarker[*jwmarker_num].len_ready = OPJ_TRUE; /* ready */ jwmarker[*jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ jwmarker[*jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ jwmarker[*jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ (*jwmarker_num)++; } /* increment epb index */ (*idx)++; /* decrease postlen */ post_len -= dL4; /* increase the total length of EPBs */ epbs_len += epb_mark->Lepb + 2; } else { /* ooops, problems */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB for UEP in tile %d\n", tileno); }; } return epbs_len; } jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, int tileno, int idx, int hprot, unsigned long int pre_len, unsigned long int post_len) { jpwl_epb_ms_t *epb = NULL; /*unsigned short int data_len = 0;*/ unsigned short int L2, L3; unsigned long int L1, L4; /*unsigned char *predata_in = NULL;*/ opj_bool insideMH = (tileno == -1); /* Alloc space */ if (!(epb = (jpwl_epb_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_epb_ms_t)))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for one EPB MS\n"); return NULL; }; /* We set RS(n,k) for EPB parms and pre-data, if any */ if (insideMH && (idx == 0)) { /* First EPB in MH */ epb->k_pre = 64; epb->n_pre = 160; } else if (!insideMH && (idx == 0)) { /* First EPB in TH */ epb->k_pre = 25; epb->n_pre = 80; } else { /* Following EPBs in MH or TH */ epb->k_pre = 13; epb->n_pre = 40; }; /* Find lengths, Figs. B3 and B4 */ /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ L1 = pre_len + 13; epb->pre_len = pre_len; /* size of pre-data redundancy */ /* (redundancy per codeword) * (number of codewords, rounded up) */ L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / (double) epb->k_pre); /* length of post-data */ L4 = post_len; epb->post_len = post_len; /* Find protection type for post data and its associated redundancy field length*/ if ((hprot == 16) || (hprot == 32)) { /* there is a CRC for post-data */ epb->Pepb = 0x10000000 | ((unsigned long int) hprot >> 5); /* 0=CRC-16, 1=CRC-32 */ epb->k_post = post_len; epb->n_post = post_len + (hprot >> 3); /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ } else if ((hprot >= 37) && (hprot <= 128)) { /* there is a RS for post-data */ epb->Pepb = 0x20000020 | (((unsigned long int) hprot & 0x000000FF) << 8); epb->k_post = 32; epb->n_post = hprot; } else if (hprot == 1) { /* Use predefined codes */ epb->Pepb = (unsigned long int) 0x00000000; epb->n_post = epb->n_pre; epb->k_post = epb->k_pre; } else if (hprot == 0) { /* Placeholder EPB: only protects its parameters, no protection method */ epb->Pepb = (unsigned long int) 0xFFFFFFFF; epb->n_post = 1; epb->k_post = 1; } else { opj_event_msg(j2k->cinfo, EVT_ERROR, "Invalid protection value for EPB h = %d\n", hprot); return NULL; } epb->hprot = hprot; /* (redundancy per codeword) * (number of codewords, rounded up) */ L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / (double) epb->k_post); /* private fields */ epb->tileno = tileno; /* Fill some fields of the EPB */ /* total length of the EPB MS (less the EPB marker itself): */ /* Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) + pre_redundancy + post-redundancy */ epb->Lepb = 11 + L2 + L3; /* EPB style */ epb->Depb = ((packed & 0x0001) << 7) | ((latest & 0x0001) << 6) | (idx & 0x003F); /* length of data protected by EPB: */ epb->LDPepb = L1 + L4; return epb; } void jpwl_epb_write(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf) { /* Marker */ *(buf++) = (unsigned char) (J2K_MS_EPB >> 8); *(buf++) = (unsigned char) (J2K_MS_EPB >> 0); /* Lepb */ *(buf++) = (unsigned char) (epb->Lepb >> 8); *(buf++) = (unsigned char) (epb->Lepb >> 0); /* Depb */ *(buf++) = (unsigned char) (epb->Depb >> 0); /* LDPepb */ *(buf++) = (unsigned char) (epb->LDPepb >> 24); *(buf++) = (unsigned char) (epb->LDPepb >> 16); *(buf++) = (unsigned char) (epb->LDPepb >> 8); *(buf++) = (unsigned char) (epb->LDPepb >> 0); /* Pepb */ *(buf++) = (unsigned char) (epb->Pepb >> 24); *(buf++) = (unsigned char) (epb->Pepb >> 16); *(buf++) = (unsigned char) (epb->Pepb >> 8); *(buf++) = (unsigned char) (epb->Pepb >> 0); /* Data */ /*memcpy(buf, epb->data, (size_t) epb->Lepb - 11);*/ memset(buf, 0, (size_t) epb->Lepb - 11); /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, -1, epb->Lepb + 2); } jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, opj_bool epb_on, opj_bool info_on) { jpwl_epc_ms_t *epc = NULL; /* Alloc space */ if (!(epc = (jpwl_epc_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_epc_ms_t)))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for EPC MS\n"); return NULL; }; /* Set the EPC parameters */ epc->esd_on = esd_on; epc->epb_on = epb_on; epc->red_on = red_on; epc->info_on = info_on; /* Fill the EPC fields with default values */ epc->Lepc = 9; epc->Pcrc = 0x0000; epc->DL = 0x00000000; epc->Pepc = ((j2k->cp->esd_on & 0x0001) << 4) | ((j2k->cp->red_on & 0x0001) << 5) | ((j2k->cp->epb_on & 0x0001) << 6) | ((j2k->cp->info_on & 0x0001) << 7); return (epc); } opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf, unsigned char *post_buf) { unsigned long int L1, L2, L3, L4; int remaining; unsigned long int P, NN_P; /* Operating buffer */ static unsigned char codeword[NN], *parityword; unsigned char *L1_buf, *L2_buf; /* these ones are static, since we need to keep memory of the exact place from one call to the other */ static unsigned char *L3_buf, *L4_buf; /* some consistency check */ if (!buf) { opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs\n"); return OPJ_FALSE; } if (!post_buf && !L4_buf) { opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs data\n"); return OPJ_FALSE; } /* * Compute parity bytes on pre-data, ALWAYS present (at least only for EPB parms) */ /* Initialize RS structures */ P = epb->n_pre - epb->k_pre; NN_P = NN - P; memset(codeword, 0, NN); parityword = codeword + NN_P; init_rs(NN_P); /* pre-data begins pre_len bytes before of EPB buf */ L1_buf = buf - epb->pre_len; L1 = epb->pre_len + 13; /* redundancy for pre-data begins immediately after EPB parms */ L2_buf = buf + 13; L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / (double) epb->k_pre); /* post-data the position of L4 buffer can be: 1) passed as a parameter: in that case use it 2) null: in that case use the previous (static) one */ if (post_buf) L4_buf = post_buf; L4 = epb->post_len; /* post-data redundancy begins immediately after pre-data redundancy */ L3_buf = L2_buf + L2; L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / (double) epb->k_post); /* let's check whether EPB length is sufficient to contain all these data */ if (epb->Lepb < (11 + L2 + L3)) opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no room in EPB data field for writing redundancy data\n"); /*printf("Env. %d, nec. %d (%d + %d)\n", epb->Lepb - 11, L2 + L3, L2, L3);*/ /* Compute redundancy of pre-data message words */ remaining = L1; while (remaining) { /* copy message data into codeword buffer */ if (remaining < epb->k_pre) { /* the last message word is zero-padded */ memset(codeword, 0, NN); memcpy(codeword, L1_buf, remaining); L1_buf += remaining; remaining = 0; } else { memcpy(codeword, L1_buf, epb->k_pre); L1_buf += epb->k_pre; remaining -= epb->k_pre; } /* Encode the buffer and obtain parity bytes */ if (encode_rs(codeword, parityword)) opj_event_msg(j2k->cinfo, EVT_WARNING, "Possible encoding error in codeword @ position #%d\n", (L1_buf - buf) / epb->k_pre); /* copy parity bytes only in redundancy buffer */ memcpy(L2_buf, parityword, P); /* advance parity buffer */ L2_buf += P; } /* * Compute parity bytes on post-data, may be absent if there are no data */ /*printf("Hprot is %d (tileno=%d, k_pre=%d, n_pre=%d, k_post=%d, n_post=%d, pre_len=%d, post_len=%d)\n", epb->hprot, epb->tileno, epb->k_pre, epb->n_pre, epb->k_post, epb->n_post, epb->pre_len, epb->post_len);*/ if (epb->hprot < 0) { /* there should be no EPB */ } else if (epb->hprot == 0) { /* no protection for the data */ /* advance anyway */ L4_buf += epb->post_len; } else if (epb->hprot == 16) { /* CRC-16 */ unsigned short int mycrc = 0x0000; /* compute the CRC field (excluding itself) */ remaining = L4; while (remaining--) jpwl_updateCRC16(&mycrc, *(L4_buf++)); /* write the CRC field */ *(L3_buf++) = (unsigned char) (mycrc >> 8); *(L3_buf++) = (unsigned char) (mycrc >> 0); } else if (epb->hprot == 32) { /* CRC-32 */ unsigned long int mycrc = 0x00000000; /* compute the CRC field (excluding itself) */ remaining = L4; while (remaining--) jpwl_updateCRC32(&mycrc, *(L4_buf++)); /* write the CRC field */ *(L3_buf++) = (unsigned char) (mycrc >> 24); *(L3_buf++) = (unsigned char) (mycrc >> 16); *(L3_buf++) = (unsigned char) (mycrc >> 8); *(L3_buf++) = (unsigned char) (mycrc >> 0); } else { /* RS */ /* Initialize RS structures */ P = epb->n_post - epb->k_post; NN_P = NN - P; memset(codeword, 0, NN); parityword = codeword + NN_P; init_rs(NN_P); /* Compute redundancy of post-data message words */ remaining = L4; while (remaining) { /* copy message data into codeword buffer */ if (remaining < epb->k_post) { /* the last message word is zero-padded */ memset(codeword, 0, NN); memcpy(codeword, L4_buf, remaining); L4_buf += remaining; remaining = 0; } else { memcpy(codeword, L4_buf, epb->k_post); L4_buf += epb->k_post; remaining -= epb->k_post; } /* Encode the buffer and obtain parity bytes */ if (encode_rs(codeword, parityword)) opj_event_msg(j2k->cinfo, EVT_WARNING, "Possible encoding error in codeword @ position #%d\n", (L4_buf - buf) / epb->k_post); /* copy parity bytes only in redundancy buffer */ memcpy(L3_buf, parityword, P); /* advance parity buffer */ L3_buf += P; } } return OPJ_TRUE; } opj_bool jpwl_correct(opj_j2k_t *j2k) { opj_cio_t *cio = j2k->cio; opj_bool status; static opj_bool mh_done = OPJ_FALSE; int mark_pos, id, len, skips, sot_pos; unsigned long int Psot = 0; /* go back to marker position */ mark_pos = cio_tell(cio) - 2; cio_seek(cio, mark_pos); if ((j2k->state == J2K_STATE_MHSOC) && !mh_done) { int mark_val = 0, skipnum = 0; /* COLOR IMAGE first thing to do, if we are here, is to look whether 51 (skipnum) positions ahead there is an EPB, in case of MH */ /* B/W IMAGE first thing to do, if we are here, is to look whether 45 (skipnum) positions ahead there is an EPB, in case of MH */ /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; if ((cio->bp + skipnum) < cio->end) { cio_skip(cio, skipnum); /* check that you are not going beyond the end of codestream */ /* call EPB corrector */ status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ cio->bp, /* pointer to EPB in codestream buffer */ 0, /* EPB type: MH */ skipnum, /* length of pre-data */ -1, /* length of post-data: -1 means auto */ NULL, NULL ); /* read the marker value */ mark_val = (*(cio->bp) << 8) | *(cio->bp + 1); if (status && (mark_val == J2K_MS_EPB)) { /* we found it! */ mh_done = OPJ_TRUE; return OPJ_TRUE; } /* Disable correction in case of missing or bad head EPB */ /* We can't do better! */ /* PATCHED: 2008-01-25 */ /* MOVED UP: 2008-02-01 */ if (!status) { j2k->cp->correct = OPJ_FALSE; opj_event_msg(j2k->cinfo, EVT_WARNING, "Couldn't find the MH EPB: disabling JPWL\n"); } } } if (OPJ_TRUE /*(j2k->state == J2K_STATE_TPHSOT) || (j2k->state == J2K_STATE_TPH)*/) { /* else, look if 12 positions ahead there is an EPB, in case of TPH */ cio_seek(cio, mark_pos); if ((cio->bp + 12) < cio->end) { cio_skip(cio, 12); /* call EPB corrector */ status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ cio->bp, /* pointer to EPB in codestream buffer */ 1, /* EPB type: TPH */ 12, /* length of pre-data */ -1, /* length of post-data: -1 means auto */ NULL, NULL ); if (status) /* we found it! */ return OPJ_TRUE; } } return OPJ_FALSE; /* for now, don't use this code */ /* else, look if here is an EPB, in case of other */ if (mark_pos > 64) { /* it cannot stay before the first MH EPB */ cio_seek(cio, mark_pos); cio_skip(cio, 0); /* call EPB corrector */ status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ cio->bp, /* pointer to EPB in codestream buffer */ 2, /* EPB type: TPH */ 0, /* length of pre-data */ -1, /* length of post-data: -1 means auto */ NULL, NULL ); if (status) /* we found it! */ return OPJ_TRUE; } /* nope, no EPBs probably, or they are so damaged that we can give up */ return OPJ_FALSE; return OPJ_TRUE; /* AN ATTEMPT OF PARSER */ /* NOT USED ACTUALLY */ /* go to the beginning of the file */ cio_seek(cio, 0); /* let's begin */ j2k->state = J2K_STATE_MHSOC; /* cycle all over the markers */ while (cio_tell(cio) < cio->length) { /* read the marker */ mark_pos = cio_tell(cio); id = cio_read(cio, 2); /* details */ printf("Marker@%lld: %X\n", cio_tell(cio) - 2, id); /* do an action in response to the read marker */ switch (id) { /* short markers */ /* SOC */ case J2K_MS_SOC: j2k->state = J2K_STATE_MHSIZ; len = 0; skips = 0; break; /* EOC */ case J2K_MS_EOC: j2k->state = J2K_STATE_MT; len = 0; skips = 0; break; /* particular case of SOD */ case J2K_MS_SOD: len = Psot - (mark_pos - sot_pos) - 2; skips = len; break; /* long markers */ /* SOT */ case J2K_MS_SOT: j2k->state = J2K_STATE_TPH; sot_pos = mark_pos; /* position of SOT */ len = cio_read(cio, 2); /* read the length field */ cio_skip(cio, 2); /* this field is unnecessary */ Psot = cio_read(cio, 4); /* tile length */ skips = len - 8; break; /* remaining */ case J2K_MS_SIZ: j2k->state = J2K_STATE_MH; /* read the length field */ len = cio_read(cio, 2); skips = len - 2; break; /* remaining */ default: /* read the length field */ len = cio_read(cio, 2); skips = len - 2; break; } /* skip to marker's end */ cio_skip(cio, skips); } } opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn, unsigned char **L4_bufp) { /* Operating buffer */ unsigned char codeword[NN], *parityword; unsigned long int P, NN_P; unsigned long int L1, L4; int remaining, n_pre, k_pre, n_post, k_post; int status, tt; int orig_pos = cio_tell(j2k->cio); unsigned char *L1_buf, *L2_buf; unsigned char *L3_buf, *L4_buf; unsigned long int LDPepb, Pepb; unsigned short int Lepb; unsigned char Depb; char str1[25] = ""; int myconn, errnum = 0; opj_bool errflag = OPJ_FALSE; opj_cio_t *cio = j2k->cio; /* check for common errors */ if (!buffer) { opj_event_msg(j2k->cinfo, EVT_ERROR, "The EPB pointer is a NULL buffer\n"); return OPJ_FALSE; } /* set bignesses */ L1 = pre_len + 13; /* pre-data correction */ switch (type) { case 0: /* MH EPB */ k_pre = 64; n_pre = 160; break; case 1: /* TPH EPB */ k_pre = 25; n_pre = 80; break; case 2: /* other EPBs */ k_pre = 13; n_pre = 40; break; case 3: /* automatic setup */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Auto. setup not yet implemented\n"); return OPJ_FALSE; break; default: /* unknown type */ opj_event_msg(j2k->cinfo, EVT_ERROR, "Unknown expected EPB type\n"); return OPJ_FALSE; break; } /* Initialize RS structures */ P = n_pre - k_pre; NN_P = NN - P; tt = (int) floor((float) P / 2.0F); /* correction capability of the code */ memset(codeword, 0, NN); parityword = codeword + NN_P; init_rs(NN_P); /* Correct pre-data message words */ L1_buf = buffer - pre_len; L2_buf = buffer + 13; remaining = L1; while (remaining) { /* always zero-pad codewords */ /* (this is required, since after decoding the zeros in the long codeword could change, and keep unchanged in subsequent calls) */ memset(codeword, 0, NN); /* copy codeword buffer into message bytes */ if (remaining < k_pre) memcpy(codeword, L1_buf, remaining); else memcpy(codeword, L1_buf, k_pre); /* copy redundancy buffer in parity bytes */ memcpy(parityword, L2_buf, P); /* Decode the buffer and possibly obtain corrected bytes */ status = eras_dec_rs(codeword, NULL, 0); if (status == -1) { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "Possible decoding error in codeword @ position #%d\n", (L1_buf - buffer) / k_pre);*/ errflag = OPJ_TRUE; /* we can try to safely get out from the function: if we are here, either this is not an EPB or the first codeword is too damaged to be helpful */ /*return OPJ_FALSE;*/ } else if (status == 0) { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ } else if (status <= tt) { /* it has corrected 0 <= errs <= tt */ /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ errnum += status; } else { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); return OPJ_FALSE;*/ errflag = OPJ_TRUE; } /* advance parity buffer */ if ((status >= 0) && (status <= tt)) /* copy back corrected parity only if all is OK */ memcpy(L2_buf, parityword, P); L2_buf += P; /* advance message buffer */ if (remaining < k_pre) { if ((status >= 0) && (status <= tt)) /* copy back corrected data only if all is OK */ memcpy(L1_buf, codeword, remaining); L1_buf += remaining; remaining = 0; } else { if ((status >= 0) && (status <= tt)) /* copy back corrected data only if all is OK */ memcpy(L1_buf, codeword, k_pre); L1_buf += k_pre; remaining -= k_pre; } } /* print summary */ if (!conn) { /*if (errnum) opj_event_msg(j2k->cinfo, EVT_INFO, "+ %d symbol errors corrected (Ps=%.1e)\n", errnum, (float) errnum / ((float) n_pre * (float) L1 / (float) k_pre));*/ if (errflag) { /*opj_event_msg(j2k->cinfo, EVT_INFO, "+ there were unrecoverable errors\n");*/ return OPJ_FALSE; } } /* presumably, now, EPB parameters are correct */ /* let's get them */ /* Simply read the EPB parameters */ if (conn) cio->bp = buffer; cio_skip(cio, 2); /* the marker */ Lepb = cio_read(cio, 2); Depb = cio_read(cio, 1); LDPepb = cio_read(cio, 4); Pepb = cio_read(cio, 4); /* What does Pepb tells us about the protection method? */ if (((Pepb & 0xF0000000) >> 28) == 0) sprintf(str1, "pred"); /* predefined */ else if (((Pepb & 0xF0000000) >> 28) == 1) sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ else if (((Pepb & 0xF0000000) >> 28) == 2) sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ else if (Pepb == 0xFFFFFFFF) sprintf(str1, "nometh"); /* RS mode */ else sprintf(str1, "unknown"); /* unknown */ /* Now we write them to screen */ if (!conn && post_len) opj_event_msg(j2k->cinfo, EVT_INFO, "EPB(%d): (%sl, %sp, %u), %lu, %s\n", cio_tell(cio) - 13, (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ (Depb & 0x3F), /* EPB index value */ LDPepb, /*length of the data protected by the EPB */ str1); /* protection method */ /* well, we need to investigate how long is the connected length of packed EPBs */ myconn = Lepb + 2; if ((Depb & 0x40) == 0) /* not latest in header */ jpwl_epb_correct(j2k, /* J2K decompressor handle */ buffer + Lepb + 2, /* pointer to next EPB in codestream buffer */ 2, /* EPB type: should be of other type */ 0, /* only EPB fields */ 0, /* do not look after */ &myconn, NULL ); if (conn) *conn += myconn; /*if (!conn) printf("connected = %d\n", myconn);*/ /*cio_seek(j2k->cio, orig_pos); return OPJ_TRUE;*/ /* post-data the position of L4 buffer is at the end of currently connected EPBs */ if (!(L4_bufp)) L4_buf = buffer + myconn; else if (!(*L4_bufp)) L4_buf = buffer + myconn; else L4_buf = *L4_bufp; if (post_len == -1) L4 = LDPepb - pre_len - 13; else if (post_len == 0) L4 = 0; else L4 = post_len; L3_buf = L2_buf; /* Do a further check here on the read parameters */ if (L4 > (unsigned long) cio_numbytesleft(j2k->cio)) /* overflow */ return OPJ_FALSE; /* we are ready for decoding the remaining data */ if (((Pepb & 0xF0000000) >> 28) == 1) { /* CRC here */ if ((16 * ((Pepb & 0x00000001) + 1)) == 16) { /* CRC-16 */ unsigned short int mycrc = 0x0000, filecrc = 0x0000; /* compute the CRC field */ remaining = L4; while (remaining--) jpwl_updateCRC16(&mycrc, *(L4_buf++)); /* read the CRC field */ filecrc = *(L3_buf++) << 8; filecrc |= *(L3_buf++); /* check the CRC field */ if (mycrc == filecrc) { if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); } else { if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, mycrc); errflag = OPJ_TRUE; } } if ((16 * ((Pepb & 0x00000001) + 1)) == 32) { /* CRC-32 */ unsigned long int mycrc = 0x00000000, filecrc = 0x00000000; /* compute the CRC field */ remaining = L4; while (remaining--) jpwl_updateCRC32(&mycrc, *(L4_buf++)); /* read the CRC field */ filecrc = *(L3_buf++) << 24; filecrc |= *(L3_buf++) << 16; filecrc |= *(L3_buf++) << 8; filecrc |= *(L3_buf++); /* check the CRC field */ if (mycrc == filecrc) { if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); } else { if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, mycrc); errflag = OPJ_TRUE; } } } else if (Pepb == 0xFFFFFFFF) { /* no method */ /* advance without doing anything */ remaining = L4; while (remaining--) L4_buf++; } else if ((((Pepb & 0xF0000000) >> 28) == 2) || (((Pepb & 0xF0000000) >> 28) == 0)) { /* RS coding here */ if (((Pepb & 0xF0000000) >> 28) == 0) { k_post = k_pre; n_post = n_pre; } else { k_post = 32; n_post = (Pepb & 0x0000FF00) >> 8; } /* Initialize RS structures */ P = n_post - k_post; NN_P = NN - P; tt = (int) floor((float) P / 2.0F); /* again, correction capability */ memset(codeword, 0, NN); parityword = codeword + NN_P; init_rs(NN_P); /* Correct post-data message words */ /*L4_buf = buffer + Lepb + 2;*/ L3_buf = L2_buf; remaining = L4; while (remaining) { /* always zero-pad codewords */ /* (this is required, since after decoding the zeros in the long codeword could change, and keep unchanged in subsequent calls) */ memset(codeword, 0, NN); /* copy codeword buffer into message bytes */ if (remaining < k_post) memcpy(codeword, L4_buf, remaining); else memcpy(codeword, L4_buf, k_post); /* copy redundancy buffer in parity bytes */ memcpy(parityword, L3_buf, P); /* Decode the buffer and possibly obtain corrected bytes */ status = eras_dec_rs(codeword, NULL, 0); if (status == -1) { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "Possible decoding error in codeword @ position #%d\n", (L4_buf - (buffer + Lepb + 2)) / k_post);*/ errflag = OPJ_TRUE; } else if (status == 0) { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ } else if (status <= tt) { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ errnum += status; } else { /*if (conn == NULL) opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); return OPJ_FALSE;*/ errflag = OPJ_TRUE; } /* advance parity buffer */ if ((status >= 0) && (status <= tt)) /* copy back corrected data only if all is OK */ memcpy(L3_buf, parityword, P); L3_buf += P; /* advance message buffer */ if (remaining < k_post) { if ((status >= 0) && (status <= tt)) /* copy back corrected data only if all is OK */ memcpy(L4_buf, codeword, remaining); L4_buf += remaining; remaining = 0; } else { if ((status >= 0) && (status <= tt)) /* copy back corrected data only if all is OK */ memcpy(L4_buf, codeword, k_post); L4_buf += k_post; remaining -= k_post; } } } /* give back the L4_buf address */ if (L4_bufp) *L4_bufp = L4_buf; /* print summary */ if (!conn) { if (errnum) opj_event_msg(j2k->cinfo, EVT_INFO, "- %d symbol errors corrected (Ps=%.1e)\n", errnum, (float) errnum / (float) LDPepb); if (errflag) opj_event_msg(j2k->cinfo, EVT_INFO, "- there were unrecoverable errors\n"); } cio_seek(j2k->cio, orig_pos); return OPJ_TRUE; } void jpwl_epc_write(opj_j2k_t *j2k, jpwl_epc_ms_t *epc, unsigned char *buf) { /* Marker */ *(buf++) = (unsigned char) (J2K_MS_EPC >> 8); *(buf++) = (unsigned char) (J2K_MS_EPC >> 0); /* Lepc */ *(buf++) = (unsigned char) (epc->Lepc >> 8); *(buf++) = (unsigned char) (epc->Lepc >> 0); /* Pcrc */ *(buf++) = (unsigned char) (epc->Pcrc >> 8); *(buf++) = (unsigned char) (epc->Pcrc >> 0); /* DL */ *(buf++) = (unsigned char) (epc->DL >> 24); *(buf++) = (unsigned char) (epc->DL >> 16); *(buf++) = (unsigned char) (epc->DL >> 8); *(buf++) = (unsigned char) (epc->DL >> 0); /* Pepc */ *(buf++) = (unsigned char) (epc->Pepc >> 0); /* Data */ /*memcpy(buf, epc->data, (size_t) epc->Lepc - 9);*/ memset(buf, 0, (size_t) epc->Lepc - 9); /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, -1, epc->Lepc + 2); } int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, int comps, unsigned char addrm, unsigned char ad_size, unsigned char senst, unsigned char se_size, double place_pos, int tileno) { return 0; } jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp, unsigned char addrm, unsigned char ad_size, unsigned char senst, int se_size, int tileno, unsigned long int svalnum, void *sensval) { jpwl_esd_ms_t *esd = NULL; /* Alloc space */ if (!(esd = (jpwl_esd_ms_t *) opj_malloc((size_t) 1 * sizeof (jpwl_esd_ms_t)))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for ESD MS\n"); return NULL; }; /* if relative sensitivity, activate byte range mode */ if (senst == 0) addrm = 1; /* size of sensval's ... */ if ((ad_size != 0) && (ad_size != 2) && (ad_size != 4)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Address size %d for ESD MS is forbidden\n", ad_size); return NULL; } if ((se_size != 1) && (se_size != 2)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Sensitivity size %d for ESD MS is forbidden\n", se_size); return NULL; } /* ... depends on the addressing mode */ switch (addrm) { /* packet mode */ case (0): ad_size = 0; /* as per the standard */ esd->sensval_size = (unsigned int)se_size; break; /* byte range */ case (1): /* auto sense address size */ if (ad_size == 0) /* if there are more than 66% of (2^16 - 1) bytes, switch to 4 bytes (we keep space for possible EPBs being inserted) */ ad_size = (j2k->cstr_info->codestream_size > (1 * 65535 / 3)) ? 4 : 2; esd->sensval_size = ad_size + ad_size + se_size; break; /* packet range */ case (2): /* auto sense address size */ if (ad_size == 0) /* if there are more than 2^16 - 1 packets, switch to 4 bytes */ ad_size = (j2k->cstr_info->packno > 65535) ? 4 : 2; esd->sensval_size = ad_size + ad_size + se_size; break; case (3): opj_event_msg(j2k->cinfo, EVT_ERROR, "Address mode %d for ESD MS is unimplemented\n", addrm); return NULL; default: opj_event_msg(j2k->cinfo, EVT_ERROR, "Address mode %d for ESD MS is forbidden\n", addrm); return NULL; } /* set or unset sensitivity values */ if (svalnum <= 0) { switch (senst) { /* just based on the portions of a codestream */ case (0): /* MH + no. of THs + no. of packets */ svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) * (1 + j2k->cstr_info->packno); break; /* all the ones that are based on the packets */ default: if (tileno < 0) /* MH: all the packets and all the tiles info is written */ svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->packno; else /* TPH: only that tile info is written */ svalnum = j2k->cstr_info->packno; break; } } /* fill private fields */ esd->senst = senst; esd->ad_size = ad_size; esd->se_size = se_size; esd->addrm = addrm; esd->svalnum = svalnum; esd->numcomps = j2k->image->numcomps; esd->tileno = tileno; /* Set the ESD parameters */ /* length, excluding data field */ if (esd->numcomps < 257) esd->Lesd = 4 + (unsigned short int) (esd->svalnum * esd->sensval_size); else esd->Lesd = 5 + (unsigned short int) (esd->svalnum * esd->sensval_size); /* component data field */ if (comp >= 0) esd->Cesd = comp; else /* we are averaging */ esd->Cesd = 0; /* Pesd field */ esd->Pesd = 0x00; esd->Pesd |= (esd->addrm & 0x03) << 6; /* addressing mode */ esd->Pesd |= (esd->senst & 0x07) << 3; /* sensitivity type */ esd->Pesd |= ((esd->se_size >> 1) & 0x01) << 2; /* sensitivity size */ esd->Pesd |= ((esd->ad_size >> 2) & 0x01) << 1; /* addressing size */ esd->Pesd |= (comp < 0) ? 0x01 : 0x00; /* averaging components */ /* if pointer to sensval is NULL, we can fill data field by ourselves */ if (!sensval) { /* old code moved to jpwl_esd_fill() */ esd->data = NULL; } else { /* we set the data field as the sensitivity values poinnter passed to the function */ esd->data = (unsigned char *) sensval; } return (esd); } opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) { int i; unsigned long int vv; unsigned long int addr1 = 0L, addr2 = 0L; double dvalue = 0.0, Omax2, tmp, TSE = 0.0, MSE, oldMSE = 0.0, PSNR, oldPSNR = 0.0; unsigned short int pfpvalue; unsigned long int addrmask = 0x00000000; opj_bool doneMH = OPJ_FALSE, doneTPH = OPJ_FALSE; /* sensitivity values in image info are as follows: - for each tile, distotile is the starting distortion for that tile, sum of all components - for each packet in a tile, disto is the distortion reduction caused by that packet to that tile - the TSE for a single tile should be given by distotile - sum(disto) , for all components - the MSE for a single tile is given by TSE / nbpix , for all components - the PSNR for a single tile is given by 10*log10( Omax^2 / MSE) , for all components (Omax is given by 2^bpp - 1 for unsigned images and by 2^(bpp - 1) - 1 for signed images */ /* browse all components and find Omax */ Omax2 = 0.0; for (i = 0; i < j2k->image->numcomps; i++) { tmp = pow(2.0, (double) (j2k->image->comps[i].sgnd ? (j2k->image->comps[i].bpp - 1) : (j2k->image->comps[i].bpp))) - 1; if (tmp > Omax2) Omax2 = tmp; } Omax2 = Omax2 * Omax2; /* if pointer of esd->data is not null, simply write down all the values byte by byte */ if (esd->data) { for (i = 0; i < (int) esd->svalnum; i++) *(buf++) = esd->data[i]; return OPJ_TRUE; } /* addressing mask */ if (esd->ad_size == 2) addrmask = 0x0000FFFF; /* two bytes */ else addrmask = 0xFFFFFFFF; /* four bytes */ /* set on precise point where sensitivity starts */ if (esd->numcomps < 257) buf += 6; else buf += 7; /* let's fill the data fields */ for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->packno * esd->tileno); vv < esd->svalnum; vv++) { int thistile = vv / j2k->cstr_info->packno, thispacket = vv % j2k->cstr_info->packno; /* skip for the hack some lines below */ if (thistile == j2k->cstr_info->tw * j2k->cstr_info->th) break; /* starting tile distortion */ if (thispacket == 0) { TSE = j2k->cstr_info->tile[thistile].distotile; oldMSE = TSE / j2k->cstr_info->tile[thistile].numpix; oldPSNR = 10.0 * log10(Omax2 / oldMSE); } /* TSE */ TSE -= j2k->cstr_info->tile[thistile].packet[thispacket].disto; /* MSE */ MSE = TSE / j2k->cstr_info->tile[thistile].numpix; /* PSNR */ PSNR = 10.0 * log10(Omax2 / MSE); /* fill the address range */ switch (esd->addrm) { /* packet mode */ case (0): /* nothing, there is none */ break; /* byte range */ case (1): /* start address of packet */ addr1 = (j2k->cstr_info->tile[thistile].packet[thispacket].start_pos) & addrmask; /* end address of packet */ addr2 = (j2k->cstr_info->tile[thistile].packet[thispacket].end_pos) & addrmask; break; /* packet range */ case (2): /* not implemented here */ opj_event_msg(j2k->cinfo, EVT_WARNING, "Addressing mode packet_range is not implemented\n"); break; /* unknown addressing method */ default: /* not implemented here */ opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown addressing mode\n"); break; } /* hack for writing relative sensitivity of MH and TPHs */ if ((esd->senst == 0) && (thispacket == 0)) { /* possible MH */ if ((thistile == 0) && !doneMH) { /* we have to manage MH addresses */ addr1 = 0; /* start of MH */ addr2 = j2k->cstr_info->main_head_end; /* end of MH */ /* set special dvalue for this MH */ dvalue = -10.0; doneMH = OPJ_TRUE; /* don't come here anymore */ vv--; /* wrap back loop counter */ } else if (!doneTPH) { /* we have to manage TPH addresses */ addr1 = j2k->cstr_info->tile[thistile].start_pos; addr2 = j2k->cstr_info->tile[thistile].end_header; /* set special dvalue for this TPH */ dvalue = -1.0; doneTPH = OPJ_TRUE; /* don't come here till the next tile */ vv--; /* wrap back loop counter */ } } else doneTPH = OPJ_FALSE; /* reset TPH counter */ /* write the addresses to the buffer */ switch (esd->ad_size) { case (0): /* do nothing */ break; case (2): /* two bytes */ *(buf++) = (unsigned char) (addr1 >> 8); *(buf++) = (unsigned char) (addr1 >> 0); *(buf++) = (unsigned char) (addr2 >> 8); *(buf++) = (unsigned char) (addr2 >> 0); break; case (4): /* four bytes */ *(buf++) = (unsigned char) (addr1 >> 24); *(buf++) = (unsigned char) (addr1 >> 16); *(buf++) = (unsigned char) (addr1 >> 8); *(buf++) = (unsigned char) (addr1 >> 0); *(buf++) = (unsigned char) (addr2 >> 24); *(buf++) = (unsigned char) (addr2 >> 16); *(buf++) = (unsigned char) (addr2 >> 8); *(buf++) = (unsigned char) (addr2 >> 0); break; default: /* do nothing */ break; } /* let's fill the value field */ switch (esd->senst) { /* relative sensitivity */ case (0): /* we just write down the packet ordering */ if (dvalue == -10) /* MH */ dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ else if (dvalue == -1) /* TPH */ dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ else /* packet: first is most important, and then in decreasing order down to the last, which counts for 1 */ dvalue = jpwl_pfp_to_double((unsigned short) (j2k->cstr_info->packno - thispacket), esd->se_size); break; /* MSE */ case (1): /* !!! WRONG: let's put here disto field of packets !!! */ dvalue = MSE; break; /* MSE reduction */ case (2): dvalue = oldMSE - MSE; oldMSE = MSE; break; /* PSNR */ case (3): dvalue = PSNR; break; /* PSNR increase */ case (4): dvalue = PSNR - oldPSNR; oldPSNR = PSNR; break; /* MAXERR */ case (5): dvalue = 0.0; opj_event_msg(j2k->cinfo, EVT_WARNING, "MAXERR sensitivity mode is not implemented\n"); break; /* TSE */ case (6): dvalue = TSE; break; /* reserved */ case (7): dvalue = 0.0; opj_event_msg(j2k->cinfo, EVT_WARNING, "Reserved sensitivity mode is not implemented\n"); break; default: dvalue = 0.0; break; } /* compute the pseudo-floating point value */ pfpvalue = jpwl_double_to_pfp(dvalue, esd->se_size); /* write the pfp value to the buffer */ switch (esd->se_size) { case (1): /* one byte */ *(buf++) = (unsigned char) (pfpvalue >> 0); break; case (2): /* two bytes */ *(buf++) = (unsigned char) (pfpvalue >> 8); *(buf++) = (unsigned char) (pfpvalue >> 0); break; } } return OPJ_TRUE; } void jpwl_esd_write(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) { /* Marker */ *(buf++) = (unsigned char) (J2K_MS_ESD >> 8); *(buf++) = (unsigned char) (J2K_MS_ESD >> 0); /* Lesd */ *(buf++) = (unsigned char) (esd->Lesd >> 8); *(buf++) = (unsigned char) (esd->Lesd >> 0); /* Cesd */ if (esd->numcomps >= 257) *(buf++) = (unsigned char) (esd->Cesd >> 8); *(buf++) = (unsigned char) (esd->Cesd >> 0); /* Pesd */ *(buf++) = (unsigned char) (esd->Pesd >> 0); /* Data */ if (esd->numcomps < 257) memset(buf, 0xAA, (size_t) esd->Lesd - 4); /*memcpy(buf, esd->data, (size_t) esd->Lesd - 4);*/ else memset(buf, 0xAA, (size_t) esd->Lesd - 5); /*memcpy(buf, esd->data, (size_t) esd->Lesd - 5);*/ /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_ESD, -1, esd->Lesd + 2); } unsigned short int jpwl_double_to_pfp(double V, int bytes) { unsigned short int em, e, m; switch (bytes) { case (1): if (V < MIN_V1) { e = 0x0000; m = 0x0000; } else if (V > MAX_V1) { e = 0x000F; m = 0x000F; } else { e = (unsigned short int) (floor(log(V) * 1.44269504088896) / 4.0); m = (unsigned short int) (0.5 + (V / (pow(2.0, (double) (4 * e))))); } em = ((e & 0x000F) << 4) + (m & 0x000F); break; case (2): if (V < MIN_V2) { e = 0x0000; m = 0x0000; } else if (V > MAX_V2) { e = 0x001F; m = 0x07FF; } else { e = (unsigned short int) floor(log(V) * 1.44269504088896) + 15; m = (unsigned short int) (0.5 + 2048.0 * ((V / (pow(2.0, (double) e - 15.0))) - 1.0)); } em = ((e & 0x001F) << 11) + (m & 0x07FF); break; default: em = 0x0000; break; }; return em; } double jpwl_pfp_to_double(unsigned short int em, int bytes) { double V; switch (bytes) { case 1: V = (double) (em & 0x0F) * pow(2.0, (double) (em & 0xF0)); break; case 2: V = pow(2.0, (double) ((em & 0xF800) >> 11) - 15.0) * (1.0 + (double) (em & 0x07FF) / 2048.0); break; default: V = 0.0; break; } return V; } opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num) { int mm; unsigned long int addlen; opj_codestream_info_t *info = j2k->cstr_info; int tileno, tpno, packno, numtiles = info->th * info->tw, numpacks = info->packno; if (!j2k || !jwmarker ) { opj_event_msg(j2k->cinfo, EVT_ERROR, "J2K handle or JPWL markers list badly allocated\n"); return OPJ_FALSE; } /* main_head_end: how many markers are there before? */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->main_head_end) addlen += jwmarker[mm].len + 2; info->main_head_end += addlen; /* codestream_size: always increment with all markers */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) addlen += jwmarker[mm].len + 2; info->codestream_size += addlen; /* navigate through all the tiles */ for (tileno = 0; tileno < numtiles; tileno++) { /* start_pos: increment with markers before SOT */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].start_pos) addlen += jwmarker[mm].len + 2; info->tile[tileno].start_pos += addlen; /* end_header: increment with markers before of it */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_header) addlen += jwmarker[mm].len + 2; info->tile[tileno].end_header += addlen; /* end_pos: increment with markers before the end of this tile */ /* code is disabled, since according to JPWL no markers can be beyond TPH */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_pos) addlen += jwmarker[mm].len + 2; info->tile[tileno].end_pos += addlen; /* navigate through all the tile parts */ for (tpno = 0; tpno < info->tile[tileno].num_tps; tpno++) { /* start_pos: increment with markers before SOT */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_start_pos) addlen += jwmarker[mm].len + 2; info->tile[tileno].tp[tpno].tp_start_pos += addlen; /* end_header: increment with markers before of it */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_header) addlen += jwmarker[mm].len + 2; info->tile[tileno].tp[tpno].tp_end_header += addlen; /* end_pos: increment with markers before the end of this tile part */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].tp[tpno].tp_end_pos) addlen += jwmarker[mm].len + 2; info->tile[tileno].tp[tpno].tp_end_pos += addlen; } /* navigate through all the packets in this tile */ for (packno = 0; packno < numpacks; packno++) { /* start_pos: increment with markers before the packet */ /* disabled for the same reason as before */ addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos <= (unsigned long int) info->tile[tileno].packet[packno].start_pos) addlen += jwmarker[mm].len + 2; info->tile[tileno].packet[packno].start_pos += addlen; /* end_ph_pos: increment with markers before the packet */ /* disabled for the same reason as before */ /*addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_ph_pos) addlen += jwmarker[mm].len + 2;*/ info->tile[tileno].packet[packno].end_ph_pos += addlen; /* end_pos: increment if marker is before the end of packet */ /* disabled for the same reason as before */ /*addlen = 0; for (mm = 0; mm < jwmarker_num; mm++) if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_pos) addlen += jwmarker[mm].len + 2;*/ info->tile[tileno].packet[packno].end_pos += addlen; } } /* reorder the markers list */ return OPJ_TRUE; } #endif /* USE_JPWL */ openjpeg-1.5.2/libopenjpeg/jpwl/Makefile.am0000644000175000017500000000274212315002100020473 0ustar mathieumathieuMAINTAINERCLEANFILES = Makefile.in lib_LTLIBRARIES = libopenjpeg_JPWL.la OPJ_SRC = \ ../bio.c \ ../cio.c \ ../dwt.c \ ../event.c \ ../image.c \ ../j2k.c \ ../j2k_lib.c \ ../jp2.c \ ../jpt.c \ ../mct.c \ ../mqc.c \ ../openjpeg.c \ ../pi.c \ ../raw.c \ ../t1.c \ ../t2.c \ ../tcd.c \ ../tgt.c \ ../cidx_manager.c \ ../phix_manager.c \ ../ppix_manager.c \ ../thix_manager.c \ ../tpix_manager.c libopenjpeg_JPWL_la_CPPFLAGS = \ -I. \ -I$(top_srcdir)/libopenjpeg \ -I$(top_builddir)/libopenjpeg \ -I$(top_srcdir)/libopenjpeg/jpwl \ -I$(top_builddir)/libopenjpeg/jpwl \ -DUSE_JPWL libopenjpeg_JPWL_la_CFLAGS = libopenjpeg_JPWL_la_LIBADD = -lm libopenjpeg_JPWL_la_LDFLAGS = -no-undefined -version-info @lt_version@ libopenjpeg_JPWL_la_SOURCES = \ $(OPJ_SRC) \ crc.c \ jpwl.c \ jpwl_lib.c \ rs.c \ crc.h \ jpwl.h \ rs.h install-data-hook: @echo -e " (LA)\t$(libdir)/libopenjpeg_JPWL.la" >> $(top_builddir)/report.txt if BUILD_SHARED @( $(call solist) ) >> $(top_builddir)/report.txt endif if BUILD_STATIC @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt endif solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;) get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2) base = $(call get_tok,libdir) so = $(call get_tok,library_names) a = $(call get_tok,old_library) if HAVE_WIN32 SO_PREFIX = (DLL) dll = $(call get_tok,dlname) else if HAVE_DARWIN SO_PREFIX = (DY) dll = else SO_PREFIX = (SO) dll = endif endif openjpeg-1.5.2/libopenjpeg/jpwl/jpwl.h0000644000175000017500000003316012315002100017562 0ustar mathieumathieu/* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy * 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 __JPWL_H #define __JPWL_H #ifdef USE_JPWL #include "crc.h" #include "rs.h" /** @file jpwl.h @brief The JPEG-2000 Part11 (JPWL) marker segments manager The functions in JPWL.C have for goal to read/write the markers added by JPWL. */ /** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ /*@{*/ /** Assume a basic codestream structure, so you can resort better from uncorrected errors */ #define JPWL_ASSUME OPJ_TRUE /** EPB (Error Protection Block) Marker segment */ typedef struct jpwl_epb_ms { /**@name Private fields set by epb_create */ /*@{*/ /** is the latest in header? */ opj_bool latest; /** is it in packed mode? */ opj_bool packed; /** TH where this marker has been placed (-1 means MH) */ int tileno; /** index in current header (0-63) */ unsigned char index; /** error protection method [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */ int hprot; /** message word length of pre-data */ int k_pre; /** code word length of pre-data */ int n_pre; /** length of pre-data */ int pre_len; /** message word length of post-data */ int k_post; /** code word length of post-data */ int n_post; /** length of post-data */ int post_len; /*@}*/ /**@name Marker segment fields */ /*@{*/ /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */ unsigned short int Lepb; /** single byte for the style */ unsigned char Depb; /** four bytes, from 0 to 2^31-1 */ unsigned long int LDPepb; /** four bytes, next error management method */ unsigned long int Pepb; /** EPB data, variable size */ unsigned char *data; /*@}*/ } jpwl_epb_ms_t; /** EPC (Error Protection Capability) Marker segment */ typedef struct jpwl_epc_ms { /** is ESD active? */ opj_bool esd_on; /** is RED active? */ opj_bool red_on; /** is EPB active? */ opj_bool epb_on; /** are informative techniques active? */ opj_bool info_on; /**@name Marker segment fields */ /*@{*/ /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */ unsigned short int Lepc; /** two bytes, CRC for the EPC, excluding Pcrc itself */ unsigned short int Pcrc; /** four bytes, the codestream length from SOC to EOC */ unsigned long int DL; /** one byte, signals JPWL techniques adoption */ unsigned char Pepc; /** EPC data, variable length */ unsigned char *data; /*@}*/ } jpwl_epc_ms_t; /** ESD (Error Sensitivity Descriptor) Marker segment */ typedef struct jpwl_esd_ms { /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */ unsigned char addrm; /** size of codestream addresses [2/4 bytes] */ unsigned char ad_size; /** type of sensitivity [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment, 5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */ unsigned char senst; /** size of sensitivity data (1/2 bytes) */ unsigned char se_size; /**@name Marker segment fields */ /*@{*/ /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */ unsigned short int Lesd; /** two bytes, component of error sensitivity */ unsigned short int Cesd; /** one byte, signals JPWL techniques adoption */ unsigned char Pesd; /** ESD data, variable length */ unsigned char *data; /*@}*/ /**@name Fields set by esd_create (only internal use) */ /*@{*/ /** number of components in the image */ int numcomps; /** tile where this marker has been placed (-1 means MH) */ int tileno; /** number of sensitivity values */ unsigned long int svalnum; /** size of a single sensitivity pair (address+value) */ size_t sensval_size; /*@}*/ } jpwl_esd_ms_t; /** RED (Residual Error Descriptor) Marker segment */ typedef struct jpwl_red_ms { /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */ unsigned short int Lred; /** one byte, signals JPWL techniques adoption */ unsigned char Pred; /** RED data, variable length */ unsigned char *data; } jpwl_red_ms_t; /** Structure used to store JPWL markers temporary position and readyness */ typedef struct jpwl_marker { /** marker value (J2K_MS_EPC, etc.) */ int id; /** union keeping the pointer to the real marker struct */ union jpwl_marks { /** pointer to EPB marker */ jpwl_epb_ms_t *epbmark; /** pointer to EPC marker */ jpwl_epc_ms_t *epcmark; /** pointer to ESD marker */ jpwl_esd_ms_t *esdmark; /** pointer to RED marker */ jpwl_red_ms_t *redmark; } m; /** position where the marker should go, in the pre-JPWL codestream */ unsigned long int pos; /** same as before, only written as a double, so we can sort it better */ double dpos; /** length of the marker segment (marker excluded) */ unsigned short int len; /** the marker length is ready or not? */ opj_bool len_ready; /** the marker position is ready or not? */ opj_bool pos_ready; /** the marker parameters are ready or not? */ opj_bool parms_ready; /** are the written data ready or not */ opj_bool data_ready; } jpwl_marker_t; /** Encode according to JPWL specs @param j2k J2K handle @param cio codestream handle @param image image handle */ void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); /** Prepare the list of JPWL markers, after the Part 1 codestream has been finalized (index struct is full) @param j2k J2K handle @param cio codestream handle @param image image handle */ void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); /** Dump the list of JPWL markers, after it has been prepared @param j2k J2K handle @param cio codestream handle @param image image handle */ void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); /** Read the EPC marker (Error Protection Capability) @param j2k J2K handle */ void j2k_read_epc(opj_j2k_t *j2k); /** Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0 (this simplifies the management of EPBs and it is openly stated in the standard as a possible value, mening that the information is not available) and the informative techniques are not yet implemented @param j2k J2K handle */ void j2k_write_epc(opj_j2k_t *j2k); /** Read the EPB marker (Error Protection Block) @param j2k J2K handle */ void j2k_read_epb(opj_j2k_t *j2k); /** Write the EPB marker (Error Protection Block) @param j2k J2K handle */ void j2k_write_epb(opj_j2k_t *j2k); /** Read the ESD marker (Error Sensitivity Descriptor) @param j2k J2K handle */ void j2k_read_esd(opj_j2k_t *j2k); /** Read the RED marker (Residual Error Descriptor) @param j2k J2K handle */ void j2k_read_red(opj_j2k_t *j2k); /** create an EPB marker segment @param j2k J2K compressor handle @param latest it is the latest EPB in the header @param packed EPB is in packed style @param tileno tile number where the marker has been placed (-1 means MH) @param idx current EPB running index @param hprot applied protection type (-1/0,1,16,32,37-128) @param pre_len length of pre-protected data @param post_len length of post-protected data @return returns the freshly created EPB */ jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, int tileno, int idx, int hprot, unsigned long int pre_len, unsigned long int post_len); /** add a number of EPB marker segments @param j2k J2K compressor handle @param jwmarker pointer to the JPWL markers list @param jwmarker_num pointer to the number of JPWL markers (gets updated) @param latest it is the latest group of EPBs in the header @param packed EPBs are in packed style @param insideMH it is in the MH @param idx pointer to the starting EPB running index (gets updated) @param hprot applied protection type (-1/0,1,16,32,37-128) @param place_pos place in original codestream where EPBs should go @param tileno tile number of these EPBs @param pre_len length of pre-protected data @param post_len length of post-protected data @return returns the length of all added markers */ int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, double place_pos, int tileno, unsigned long int pre_len, unsigned long int post_len); /** add a number of ESD marker segments @param j2k J2K compressor handle @param jwmarker pointer to the JPWL markers list @param jwmarker_num pointer to the number of JPWL markers (gets updated) @param comps considered component (-1=average, 0/1/2/...=component no.) @param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) @param ad_size size of addresses (2/4 bytes) @param senst sensitivity type @param se_size sensitivity values size (1/2 bytes) @param place_pos place in original codestream where EPBs should go @param tileno tile number of these EPBs @return returns the length of all added markers */ int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, int comps, unsigned char addrm, unsigned char ad_size, unsigned char senst, unsigned char se_size, double place_pos, int tileno); /** updates the information structure by modifying the positions and lengths @param j2k J2K compressor handle @param jwmarker pointer to JPWL markers list @param jwmarker_num number of JPWL markers @return returns true in case of success */ opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num); opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, unsigned char *buf); opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, unsigned char *buf, unsigned char *post_buf); void j2k_add_marker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); /** corrects the data in the JPWL codestream @param j2k J2K compressor handle @return true if correction is performed correctly */ opj_bool jpwl_correct(opj_j2k_t *j2k); /** corrects the data protected by an EPB @param j2k J2K compressor handle @param buffer pointer to the EPB position @param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto @param pre_len length of pre-data @param post_len length of post_data @param conn is a pointer to the length of all connected (packed) EPBs @param L4_bufp is a pointer to the buffer pointer of redundancy data @return returns true if correction could be succesfully performed */ opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn, unsigned char **L4_bufp); /** check that a tile and its children have valid data @param j2k J2K decompressor handle @param tcd Tile decompressor handle @param tileno number of the tile to check */ opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno); /** Macro functions for CRC computation */ /** Computes the CRC-16, as stated in JPWL specs @param CRC two bytes containing the CRC value (must be initialized with 0x0000) @param DATA byte for which the CRC is computed; call this on every byte of the sequence and get the CRC at the end */ #define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA) /** Computes the CRC-32, as stated in JPWL specs @param CRC four bytes containing the CRC value (must be initialized with 0x00000000) @param DATA byte for which the CRC is computed; call this on every byte of the sequence and get the CRC at the end */ #define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA) /** Computes the minimum between two integers @param a first integer to compare @param b second integer to compare @return returns the minimum integer between a and b */ #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif /* min */ /*@}*/ #endif /* USE_JPWL */ #ifdef USE_JPSEC /** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ /*@{*/ /** Read the SEC marker (SEcured Codestream) @param j2k J2K handle */ void j2k_read_sec(opj_j2k_t *j2k); /** Write the SEC marker (SEcured Codestream) @param j2k J2K handle */ void j2k_write_sec(opj_j2k_t *j2k); /** Read the INSEC marker (SEcured Codestream) @param j2k J2K handle */ void j2k_read_insec(opj_j2k_t *j2k); /*@}*/ #endif /* USE_JPSEC */ #endif /* __JPWL_H */ openjpeg-1.5.2/libopenjpeg/jp2.h0000644000175000017500000001616212315002100016330 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file jp2.h @brief The JPEG-2000 file format Reader/Writer (JP2) */ /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ /*@{*/ #define JPIP_JPIP 0x6a706970 #define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ #define JP2_FTYP 0x66747970 /**< File type box */ #define JP2_JP2H 0x6a703268 /**< JP2 header box */ #define JP2_IHDR 0x69686472 /**< Image header box */ #define JP2_COLR 0x636f6c72 /**< Colour specification box */ #define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ #define JP2_URL 0x75726c20 /**< URL box */ #define JP2_DTBL 0x6474626c /**< Data Reference box */ #define JP2_BPCC 0x62706363 /**< Bits per component box */ #define JP2_JP2 0x6a703220 /**< File type fields */ #define JP2_PCLR 0x70636c72 /**< Palette box */ #define JP2_CMAP 0x636d6170 /**< Component Mapping box */ #define JP2_CDEF 0x63646566 /**< Channel Definition box */ /* ----------------------------------------------------------------------- */ /** Channel description: channel index, type, assocation */ typedef struct opj_jp2_cdef_info { unsigned short cn, typ, asoc; } opj_jp2_cdef_info_t; /** Channel descriptions and number of descriptions */ typedef struct opj_jp2_cdef { opj_jp2_cdef_info_t *info; unsigned short n; } opj_jp2_cdef_t; /** Component mappings: channel index, mapping type, palette index */ typedef struct opj_jp2_cmap_comp { unsigned short cmp; unsigned char mtyp, pcol; } opj_jp2_cmap_comp_t; /** Palette data: table entries, palette columns */ typedef struct opj_jp2_pclr { unsigned int *entries; unsigned char *channel_sign; unsigned char *channel_size; opj_jp2_cmap_comp_t *cmap; unsigned short nr_entries, nr_channels; } opj_jp2_pclr_t; /** Collector for ICC profile, palette, component mapping, channel description */ typedef struct opj_jp2_color { unsigned char *icc_profile_buf; int icc_profile_len; opj_jp2_cdef_t *jp2_cdef; opj_jp2_pclr_t *jp2_pclr; unsigned char jp2_has_colr; } opj_jp2_color_t; /** JP2 component */ typedef struct opj_jp2_comps { int depth; int sgnd; int bpcc; } opj_jp2_comps_t; /** JPEG-2000 file format reader/writer */ typedef struct opj_jp2 { /** codec context */ opj_common_ptr cinfo; /** handle to the J2K codec */ opj_j2k_t *j2k; 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; opj_jp2_comps_t *comps; unsigned int j2k_codestream_offset; unsigned int j2k_codestream_length; opj_bool jpip_on; opj_bool ignore_pclr_cmap_cdef; } opj_jp2_t; /** JP2 Box */ typedef struct opj_jp2_box { int length; int type; int init_pos; } opj_jp2_box_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** 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 @param ext Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); /** Creates a JP2 decompression structure @param cinfo Codec context info @return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise */ opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); /** Destroy a JP2 decompressor handle @param jp2 JP2 decompressor handle to destroy */ void jp2_destroy_decompress(opj_jp2_t *jp2); /** Setup the decoder decoding parameters using user parameters. Decoding parameters are returned in jp2->j2k->cp. @param jp2 JP2 decompressor handle @param parameters decompression parameters */ void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); /** Decode an image from a JPEG-2000 file stream @param jp2 JP2 decompressor handle @param cio Input buffer stream @param cstr_info Codestream information structure if required, NULL otherwise @return Returns a decoded image if successful, returns NULL otherwise */ opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info); /** Creates a JP2 compression structure @param cinfo Codec context info @return Returns a handle to a JP2 compressor if successful, returns NULL otherwise */ opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); /** Destroy a JP2 compressor handle @param jp2 JP2 compressor handle to destroy */ void jp2_destroy_compress(opj_jp2_t *jp2); /** Setup the encoder parameters using the current image and using user parameters. Coding parameters are returned in jp2->j2k->cp. @param jp2 JP2 compressor handle @param parameters compression parameters @param image input filled image */ void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image); /** Encode an image into a JPEG-2000 file stream @param jp2 JP2 compressor handle @param cio Output buffer stream @param image Image to encode @param cstr_info Codestream information structure if required, NULL otherwise @return Returns true if successful, returns false otherwise */ opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __JP2_H */ openjpeg-1.5.2/libopenjpeg/event.c0000644000175000017500000000733412315002100016752 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" /* ========================================================== Utility functions ==========================================================*/ #ifdef OPJ_CODE_NOT_USED #ifndef _WIN32 static char* i2a(unsigned i, char *a, unsigned r) { if (i/r > 0) a = i2a(i/r,a,r); *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r]; return a+1; } /** Transforms integer i into an ascii string and stores the result in a; string is encoded in the base indicated by r. @param i Number to be converted @param a String result @param r Base of value; must be in the range 2 - 36 @return Returns a */ static char * _itoa(int i, char *a, int r) { r = ((r < 2) || (r > 36)) ? 10 : r; if(i < 0) { *a = '-'; *i2a(-i, a+1, r) = 0; } else *i2a(i, a, r) = 0; return a; } #endif /* !_WIN32 */ #endif /* ----------------------------------------------------------------------- */ opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) { if(cinfo) { opj_event_mgr_t *previous = cinfo->event_mgr; cinfo->event_mgr = event_mgr; cinfo->client_data = context; return previous; } return NULL; } opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) { #define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ opj_msg_callback msg_handler = NULL; opj_event_mgr_t *event_mgr = cinfo->event_mgr; if(event_mgr != NULL) { switch(event_type) { case EVT_ERROR: msg_handler = event_mgr->error_handler; break; case EVT_WARNING: msg_handler = event_mgr->warning_handler; break; case EVT_INFO: msg_handler = event_mgr->info_handler; break; default: break; } if(msg_handler == NULL) { return OPJ_FALSE; } } else { return OPJ_FALSE; } if ((fmt != NULL) && (event_mgr != NULL)) { va_list arg; int str_length/*, i, j*/; /* UniPG */ char message[MSG_SIZE]; /* initialize the optional parameter list */ va_start(arg, fmt); /* parse the format string and put the result in 'message' */ str_length = vsnprintf(message, MSG_SIZE, fmt, arg); /* UniPG */ /* deinitialize the optional parameter list */ va_end(arg); /* output the message to the user program */ if( str_length > -1 && str_length < MSG_SIZE ) msg_handler(message, cinfo->client_data); else return OPJ_FALSE; } return OPJ_TRUE; } openjpeg-1.5.2/libopenjpeg/opj_malloc.h0000644000175000017500000001223112315002100017745 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2007, Callum Lerwick * 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 __OPJ_MALLOC_H #define __OPJ_MALLOC_H /** @file opj_malloc.h @brief Internal functions The functions in opj_malloc.h are internal utilities used for memory management. */ /** @defgroup MISC MISC - Miscellaneous internal functions */ /*@{*/ /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Allocate an uninitialized memory block @param size Bytes to allocate @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ #ifdef ALLOC_PERF_OPT void * OPJ_CALLCONV opj_malloc(size_t size); #else #define opj_malloc(size) malloc(size) #endif /** Allocate a memory block with elements initialized to 0 @param num Blocks to allocate @param size Bytes per block to allocate @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ #ifdef ALLOC_PERF_OPT void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements); #else #define opj_calloc(num, size) calloc(num, size) #endif /** Allocate memory aligned to a 16 byte boundry @param size Bytes to allocate @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available */ /* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ #ifdef _WIN32 /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ #ifdef __GNUC__ #include #define HAVE_MM_MALLOC #else /* MSVC, Intel C++ */ #include #ifdef _mm_malloc #define HAVE_MM_MALLOC #endif #endif #else /* Not _WIN32 */ #if defined(__sun) #define HAVE_MEMALIGN #elif defined(__FreeBSD__) #define HAVE_POSIX_MEMALIGN /* Linux x86_64 and OSX always align allocations to 16 bytes */ #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX) #define HAVE_MEMALIGN #include #endif #endif #define opj_aligned_malloc(size) malloc(size) #define opj_aligned_free(m) free(m) #ifdef HAVE_MM_MALLOC #undef opj_aligned_malloc #define opj_aligned_malloc(size) _mm_malloc(size, 16) #undef opj_aligned_free #define opj_aligned_free(m) _mm_free(m) #endif #ifdef HAVE_MEMALIGN extern void* memalign(size_t, size_t); #undef opj_aligned_malloc #define opj_aligned_malloc(size) memalign(16, (size)) #undef opj_aligned_free #define opj_aligned_free(m) free(m) #endif #ifdef HAVE_POSIX_MEMALIGN #undef opj_aligned_malloc extern int posix_memalign(void**, size_t, size_t); static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){ void* mem = NULL; posix_memalign(&mem, 16, size); return mem; } #undef opj_aligned_free #define opj_aligned_free(m) free(m) #endif #ifdef ALLOC_PERF_OPT #undef opj_aligned_malloc #define opj_aligned_malloc(size) opj_malloc(size) #undef opj_aligned_free #define opj_aligned_free(m) opj_free(m) #endif /** Reallocate memory blocks. @param m Pointer to previously allocated memory block @param s New size in bytes @return Returns a void pointer to the reallocated (and possibly moved) memory block */ #ifdef ALLOC_PERF_OPT void * OPJ_CALLCONV opj_realloc(void * m, size_t s); #else #define opj_realloc(m, s) realloc(m, s) #endif /** Deallocates or frees a memory block. @param m Previously allocated memory block to be freed */ #ifdef ALLOC_PERF_OPT void OPJ_CALLCONV opj_free(void * m); #else #define opj_free(m) free(m) #endif #ifdef __GNUC__ #pragma GCC poison malloc calloc realloc free #endif /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __OPJ_MALLOC_H */ openjpeg-1.5.2/libopenjpeg/CMakeLists.txt0000644000175000017500000000426112315002100020221 0ustar mathieumathieuINCLUDE_REGULAR_EXPRESSION("^.*$") # Defines the source code for the library SET(OPENJPEG_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/bio.c ${CMAKE_CURRENT_SOURCE_DIR}/cio.c ${CMAKE_CURRENT_SOURCE_DIR}/dwt.c ${CMAKE_CURRENT_SOURCE_DIR}/event.c ${CMAKE_CURRENT_SOURCE_DIR}/image.c ${CMAKE_CURRENT_SOURCE_DIR}/j2k.c ${CMAKE_CURRENT_SOURCE_DIR}/j2k_lib.c ${CMAKE_CURRENT_SOURCE_DIR}/jp2.c ${CMAKE_CURRENT_SOURCE_DIR}/jpt.c ${CMAKE_CURRENT_SOURCE_DIR}/mct.c ${CMAKE_CURRENT_SOURCE_DIR}/mqc.c ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c ${CMAKE_CURRENT_SOURCE_DIR}/pi.c ${CMAKE_CURRENT_SOURCE_DIR}/raw.c ${CMAKE_CURRENT_SOURCE_DIR}/t1.c ${CMAKE_CURRENT_SOURCE_DIR}/t2.c ${CMAKE_CURRENT_SOURCE_DIR}/tcd.c ${CMAKE_CURRENT_SOURCE_DIR}/tgt.c ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/phix_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/ppix_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/thix_manager.c ${CMAKE_CURRENT_SOURCE_DIR}/tpix_manager.c ) # Build the library IF(WIN32) IF(BUILD_SHARED_LIBS) ADD_DEFINITIONS(-DOPJ_EXPORTS) ELSE(BUILD_SHARED_LIBS) ADD_DEFINITIONS(-DOPJ_STATIC) ENDIF(BUILD_SHARED_LIBS) ENDIF(WIN32) ADD_LIBRARY(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) IF(UNIX) TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} m) ENDIF(UNIX) SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) # Build the JPWL library ? IF(BUILD_JPWL) ADD_SUBDIRECTORY(jpwl) ENDIF(BUILD_JPWL) # Install library INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME} EXPORT OpenJPEGTargets RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries ) # Install includes files INSTALL(FILES openjpeg.h DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers ) # install man page of the library INSTALL( FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjpeg.3 DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3) # internal utilities to generate t1_luts.h # no need to install: ADD_EXECUTABLE(t1_generate_luts t1_generate_luts.c) IF(UNIX) TARGET_LINK_LIBRARIES(t1_generate_luts m) ENDIF() openjpeg-1.5.2/libopenjpeg/j2k_lib.h0000644000175000017500000000371312315002100017147 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __J2K_LIB_H #define __J2K_LIB_H /** @file j2k_lib.h @brief Internal functions The functions in J2K_LIB.C are internal utilities mainly used for timing. */ /** @defgroup MISC MISC - Miscellaneous internal functions */ /*@{*/ /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Difference in successive opj_clock() calls tells you the elapsed time @return Returns time in seconds */ double opj_clock(void); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __J2K_LIB_H */ openjpeg-1.5.2/libopenjpeg/image.c0000644000175000017500000000614612315002100016713 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" opj_image_t* opj_image_create0(void) { opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t)); return image; } opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) { int compno; opj_image_t *image = NULL; image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t)); if(image) { image->color_space = clrspc; image->numcomps = numcmpts; /* allocate memory for the per-component information */ image->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t)); if(!image->comps) { fprintf(stderr,"Unable to allocate memory for image.\n"); opj_image_destroy(image); return NULL; } /* create the individual image components */ for(compno = 0; compno < numcmpts; compno++) { opj_image_comp_t *comp = &image->comps[compno]; comp->dx = cmptparms[compno].dx; comp->dy = cmptparms[compno].dy; comp->w = cmptparms[compno].w; comp->h = cmptparms[compno].h; comp->x0 = cmptparms[compno].x0; comp->y0 = cmptparms[compno].y0; comp->prec = cmptparms[compno].prec; comp->bpp = cmptparms[compno].bpp; comp->sgnd = cmptparms[compno].sgnd; comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int)); if(!comp->data) { fprintf(stderr,"Unable to allocate memory for image.\n"); opj_image_destroy(image); return NULL; } } } return image; } void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) { int i; if(image) { if(image->comps) { /* image components */ for(i = 0; i < image->numcomps; i++) { opj_image_comp_t *image_comp = &image->comps[i]; if(image_comp->data) { opj_free(image_comp->data); } } opj_free(image->comps); } opj_free(image); } } openjpeg-1.5.2/libopenjpeg/tgt.c0000644000175000017500000001207212315002100016422 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" /* ========================================================== Tag-tree coder interface ========================================================== */ opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { int nplh[32]; int nplv[32]; opj_tgt_node_t *node = NULL; opj_tgt_node_t *parentnode = NULL; opj_tgt_node_t *parentnode0 = NULL; opj_tgt_tree_t *tree = NULL; int i, j, k; int numlvls; int n; tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); if(!tree) return NULL; 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) { opj_free(tree); return NULL; } tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t)); if(!tree->nodes) { opj_free(tree); return NULL; } 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; } void tgt_destroy(opj_tgt_tree_t *tree) { opj_free(tree->nodes); opj_free(tree); } void tgt_reset(opj_tgt_tree_t *tree) { int i; if (NULL == tree) return; for (i = 0; i < tree->numnodes; i++) { tree->nodes[i].value = 999; tree->nodes[i].low = 0; tree->nodes[i].known = 0; } } void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { opj_tgt_node_t *node; node = &tree->nodes[leafno]; while (node && node->value > value) { node->value = value; node = node->parent; } } void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { opj_tgt_node_t *stk[31]; opj_tgt_node_t **stkptr; opj_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(bio, 1, 1); node->known = 1; } break; } bio_write(bio, 0, 1); ++low; } node->low = low; if (stkptr == stk) break; node = *--stkptr; } } int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { opj_tgt_node_t *stk[31]; opj_tgt_node_t **stkptr; opj_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(bio, 1)) { node->value = low; } else { ++low; } } node->low = low; if (stkptr == stk) { break; } node = *--stkptr; } return (node->value < threshold) ? 1 : 0; } openjpeg-1.5.2/libopenjpeg/j2k.c0000644000175000017500000022710612315002100016320 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2010-2011, Kaori Hagihara * 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 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ /*@{*/ /** @name Local static functions */ /*@{*/ /** Write the SOC marker (Start Of Codestream) @param j2k J2K handle */ static void j2k_write_soc(opj_j2k_t *j2k); /** Read the SOC marker (Start of Codestream) @param j2k J2K handle */ static void j2k_read_soc(opj_j2k_t *j2k); /** Write the SIZ marker (image and tile size) @param j2k J2K handle */ static void j2k_write_siz(opj_j2k_t *j2k); /** Read the SIZ marker (image and tile size) @param j2k J2K handle */ static void j2k_read_siz(opj_j2k_t *j2k); /** Write the COM marker (comment) @param j2k J2K handle */ static void j2k_write_com(opj_j2k_t *j2k); /** Read the COM marker (comment) @param j2k J2K handle */ static void j2k_read_com(opj_j2k_t *j2k); /** Write the value concerning the specified component in the marker COD and COC @param j2k J2K handle @param compno Number of the component concerned by the information written */ static void j2k_write_cox(opj_j2k_t *j2k, int compno); /** Read the value concerning the specified component in the marker COD and COC @param j2k J2K handle @param compno Number of the component concerned by the information read */ static void j2k_read_cox(opj_j2k_t *j2k, int compno); /** Write the COD marker (coding style default) @param j2k J2K handle */ static void j2k_write_cod(opj_j2k_t *j2k); /** Read the COD marker (coding style default) @param j2k J2K handle */ static void j2k_read_cod(opj_j2k_t *j2k); /** Write the COC marker (coding style component) @param j2k J2K handle @param compno Number of the component concerned by the information written */ static void j2k_write_coc(opj_j2k_t *j2k, int compno); /** Read the COC marker (coding style component) @param j2k J2K handle */ static void j2k_read_coc(opj_j2k_t *j2k); /** Write the value concerning the specified component in the marker QCD and QCC @param j2k J2K handle @param compno Number of the component concerned by the information written */ static void j2k_write_qcx(opj_j2k_t *j2k, int compno); /** Read the value concerning the specified component in the marker QCD and QCC @param j2k J2K handle @param compno Number of the component concern by the information read @param len Length of the information in the QCX part of the marker QCD/QCC */ static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len); /** Write the QCD marker (quantization default) @param j2k J2K handle */ static void j2k_write_qcd(opj_j2k_t *j2k); /** Read the QCD marker (quantization default) @param j2k J2K handle */ static void j2k_read_qcd(opj_j2k_t *j2k); /** Write the QCC marker (quantization component) @param j2k J2K handle @param compno Number of the component concerned by the information written */ static void j2k_write_qcc(opj_j2k_t *j2k, int compno); /** Read the QCC marker (quantization component) @param j2k J2K handle */ static void j2k_read_qcc(opj_j2k_t *j2k); /** Write the POC marker (progression order change) @param j2k J2K handle */ static void j2k_write_poc(opj_j2k_t *j2k); /** Read the POC marker (progression order change) @param j2k J2K handle */ static void j2k_read_poc(opj_j2k_t *j2k); /** Read the CRG marker (component registration) @param j2k J2K handle */ static void j2k_read_crg(opj_j2k_t *j2k); /** Read the TLM marker (tile-part lengths) @param j2k J2K handle */ static void j2k_read_tlm(opj_j2k_t *j2k); /** Read the PLM marker (packet length, main header) @param j2k J2K handle */ static void j2k_read_plm(opj_j2k_t *j2k); /** Read the PLT marker (packet length, tile-part header) @param j2k J2K handle */ static void j2k_read_plt(opj_j2k_t *j2k); /** Read the PPM marker (packet packet headers, main header) @param j2k J2K handle */ static void j2k_read_ppm(opj_j2k_t *j2k); /** Read the PPT marker (packet packet headers, tile-part header) @param j2k J2K handle */ static void j2k_read_ppt(opj_j2k_t *j2k); /** Write the TLM marker (Mainheader) @param j2k J2K handle */ static void j2k_write_tlm(opj_j2k_t *j2k); /** Write the SOT marker (start of tile-part) @param j2k J2K handle */ static void j2k_write_sot(opj_j2k_t *j2k); /** Read the SOT marker (start of tile-part) @param j2k J2K handle */ static void j2k_read_sot(opj_j2k_t *j2k); /** Write the SOD marker (start of data) @param j2k J2K handle @param tile_coder Pointer to a TCD handle */ static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder); /** Read the SOD marker (start of data) @param j2k J2K handle */ static void j2k_read_sod(opj_j2k_t *j2k); /** Write the RGN marker (region-of-interest) @param j2k J2K handle @param compno Number of the component concerned by the information written @param tileno Number of the tile concerned by the information written */ static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno); /** Read the RGN marker (region-of-interest) @param j2k J2K handle */ static void j2k_read_rgn(opj_j2k_t *j2k); /** Write the EOC marker (end of codestream) @param j2k J2K handle */ static void j2k_write_eoc(opj_j2k_t *j2k); /** Read the EOC marker (end of codestream) @param j2k J2K handle */ static void j2k_read_eoc(opj_j2k_t *j2k); /** Read an unknown marker @param j2k J2K handle */ static void j2k_read_unk(opj_j2k_t *j2k); /** Add main header marker information @param cstr_info Codestream information structure @param type marker type @param pos byte offset of marker segment @param len length of marker segment */ static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); /** Add tile header marker information @param tileno tile index number @param cstr_info Codestream information structure @param type marker type @param pos byte offset of marker segment @param len length of marker segment */ static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len); /*@}*/ /*@}*/ /* ----------------------------------------------------------------------- */ typedef struct j2k_prog_order{ OPJ_PROG_ORDER enum_prog; char str_prog[5]; }j2k_prog_order_t; j2k_prog_order_t j2k_prog_order_list[] = { {CPRL, "CPRL"}, {LRCP, "LRCP"}, {PCRL, "PCRL"}, {RLCP, "RLCP"}, {RPCL, "RPCL"}, {(OPJ_PROG_ORDER)-1, ""} }; char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ j2k_prog_order_t *po; for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){ if(po->enum_prog == prg_order){ break; } } return po->str_prog; } /* ----------------------------------------------------------------------- */ static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){ char *prog; int i; int tpnum=1,tpend=0; opj_tcp_t *tcp = &cp->tcps[tileno]; prog = j2k_convert_progression_order(tcp->prg); if(cp->tp_on == 1){ for(i=0;i<4;i++){ if(tpend!=1){ if( cp->tp_flag == prog[i] ){ tpend=1;cp->tp_pos=i; } switch(prog[i]){ case 'C': tpnum= tpnum * tcp->pocs[pino].compE; break; case 'R': tpnum= tpnum * tcp->pocs[pino].resE; break; case 'P': tpnum= tpnum * tcp->pocs[pino].prcE; break; case 'L': tpnum= tpnum * tcp->pocs[pino].layE; break; } } } }else{ tpnum=1; } return tpnum; } /** mem allocation for TLM marker*/ int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){ int pino,tileno,totnum_tp=0; OPJ_ARG_NOT_USED(img_numcomp); j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int)); for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { int cur_totnum_tp = 0; opj_tcp_t *tcp = &cp->tcps[tileno]; for(pino = 0; pino <= tcp->numpocs; pino++) { int tp_num=0; opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno,FINAL_PASS); if(!pi) { return -1;} tp_num = j2k_get_num_tp(cp,pino,tileno); totnum_tp = totnum_tp + tp_num; cur_totnum_tp = cur_totnum_tp + tp_num; pi_destroy(pi, cp, tileno); } j2k->cur_totnum_tp[tileno] = cur_totnum_tp; /* INDEX >> */ if (j2k->cstr_info) { j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t)); } /* << INDEX */ } return totnum_tp; } static void j2k_write_soc(opj_j2k_t *j2k) { opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_SOC, 2); if(j2k->cstr_info) j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0); /* UniPG>> */ #ifdef USE_JPWL /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); #endif /* USE_JPWL */ /* <state = J2K_STATE_MHSIZ; /* Index */ if (j2k->cstr_info) { j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2; j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - j2k->cstr_info->main_head_start; } } static void j2k_write_siz(opj_j2k_t *j2k) { int i; int lenp, len; opj_cio_t *cio = j2k->cio; opj_image_t *image = j2k->image; opj_cp_t *cp = j2k->cp; cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */ lenp = cio_tell(cio); cio_skip(cio, 2); cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */ cio_write(cio, image->x1, 4); /* Xsiz */ cio_write(cio, image->y1, 4); /* Ysiz */ cio_write(cio, image->x0, 4); /* X0siz */ cio_write(cio, image->y0, 4); /* Y0siz */ cio_write(cio, cp->tdx, 4); /* XTsiz */ cio_write(cio, cp->tdy, 4); /* YTsiz */ cio_write(cio, cp->tx0, 4); /* XT0siz */ cio_write(cio, cp->ty0, 4); /* YT0siz */ cio_write(cio, image->numcomps, 2); /* Csiz */ for (i = 0; i < image->numcomps; i++) { cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1); /* Ssiz_i */ cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */ cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */ } len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lsiz */ cio_seek(cio, lenp + len); if(j2k->cstr_info) j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len); } static void j2k_read_siz(opj_j2k_t *j2k) { int len, i; int n_comps; opj_cio_t *cio = j2k->cio; opj_image_t *image = j2k->image; opj_cp_t *cp = j2k->cp; len = cio_read(cio, 2); /* Lsiz */ 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 */ cp->tdx = cio_read(cio, 4); /* XTsiz */ cp->tdy = cio_read(cio, 4); /* YTsiz */ cp->tx0 = cio_read(cio, 4); /* XT0siz */ cp->ty0 = cio_read(cio, 4); /* YT0siz */ if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n", image->x0,image->x1,image->y0,image->y1); return; } n_comps = (len - 36 - 2 ) / 3; assert( (len - 36 - 2 ) % 3 == 0 ); image->numcomps = cio_read(cio, 2); /* Csiz */ assert( n_comps == image->numcomps ); /* testcase 4035.pdf.SIGSEGV.d8b.3375 */ if (image->x0 > image->x1 || image->y0 > image->y1) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Error with SIZ marker: negative image size (%d x %d)\n", image->x1 - image->x0, image->y1 - image->y0); return; } /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */ if (!(cp->tdx * cp->tdy)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy); return; } /* testcase 1610.pdf.SIGSEGV.59c.681 */ if (((int64)image->x1) * ((int64)image->y1) != (image->x1 * image->y1)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", image->x1, image->y1); return; } #ifdef USE_JPWL if (j2k->cp->correct) { /* if JPWL is on, we check whether TX errors have damaged too much the SIZ parameters */ if (!(image->x1 * image->y1)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad image size (%d x %d)\n", image->x1, image->y1); if (!JPWL_ASSUME || JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } } if (image->numcomps != ((len - 38) / 3)) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", image->numcomps, ((len - 38) / 3)); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"); if (image->numcomps < ((len - 38) / 3)) { len = 38 + 3 * image->numcomps; opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n", len); } else { image->numcomps = ((len - 38) / 3); opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n", image->numcomps); } } /* update components number in the jpwl_exp_comps filed */ cp->exp_comps = image->numcomps; } #else (void)len; #endif /* USE_JPWL */ /* prevent division by zero */ if (!(cp->tdx * cp->tdy)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy); return; } image->comps = (opj_image_comp_t*) opj_calloc(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 */ #ifdef USE_JPWL if (j2k->cp->correct) { /* if JPWL is on, we check whether TX errors have damaged too much the SIZ parameters, again */ if (!(image->comps[i].dx * image->comps[i].dy)) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", i, i, image->comps[i].dx, image->comps[i].dy); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); if (!image->comps[i].dx) { image->comps[i].dx = 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", i, image->comps[i].dx); } if (!image->comps[i].dy) { image->comps[i].dy = 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", i, image->comps[i].dy); } } } #endif /* USE_JPWL */ /* prevent division by zero */ if (!(image->comps[i].dx * image->comps[i].dy)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: invalid component size (dx: %d, dy: %d)\n", image->comps[i].dx, image->comps[i].dy); return; } image->comps[i].resno_decoded = 0; /* number of resolution decoded */ image->comps[i].factor = cp->reduce; /* reducing factor per component */ } cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); /* gdal_fuzzer_check_number_of_tiles.jp2 */ if (cp->tw == 0 || cp->th == 0 || cp->tw > 65535 / cp->th) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n", cp->tw, cp->th); return; } #ifdef USE_JPWL if (j2k->cp->correct) { /* if JPWL is on, we check whether TX errors have damaged too much the SIZ parameters */ if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: bad number of tiles (%d x %d)\n", cp->tw, cp->th); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); if (cp->tw < 1) { cp->tw= 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n", cp->tw); } if (cp->tw > cp->max_tiles) { cp->tw= 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n" "- setting %d tiles in x => HYPOTHESIS!!!\n", cp->max_tiles, cp->tw); } if (cp->th < 1) { cp->th= 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n", cp->th); } if (cp->th > cp->max_tiles) { cp->th= 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n", "- setting %d tiles in y => HYPOTHESIS!!!\n", cp->max_tiles, cp->th); } } } #endif /* USE_JPWL */ cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); if (cp->tcps == NULL) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n"); return; } cp->tileno = (int*) opj_malloc(cp->tw * cp->th * sizeof(int)); if (cp->tileno == NULL) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n"); return; } cp->tileno_size = 0; #ifdef USE_JPWL if (j2k->cp->correct) { if (!cp->tcps) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: could not alloc tcps field of cp\n"); if (!JPWL_ASSUME || JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } } } #endif /* USE_JPWL */ for (i = 0; i < cp->tw * cp->th; i++) { cp->tcps[i].POC = 0; cp->tcps[i].numpocs = 0; cp->tcps[i].first = 1; } /* Initialization for PPM marker */ cp->ppm = 0; cp->ppm_data = NULL; cp->ppm_data_first = NULL; cp->ppm_previous = 0; cp->ppm_store = 0; j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); for (i = 0; i < cp->tw * cp->th; i++) { cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(opj_tccp_t)); } j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, sizeof(unsigned char*)); j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int)); j2k->state = J2K_STATE_MH; /* Index */ if (j2k->cstr_info) { opj_codestream_info_t *cstr_info = j2k->cstr_info; cstr_info->image_w = image->x1 - image->x0; cstr_info->image_h = image->y1 - image->y0; cstr_info->numcomps = image->numcomps; cstr_info->tw = cp->tw; cstr_info->th = cp->th; cstr_info->tile_x = cp->tdx; cstr_info->tile_y = cp->tdy; cstr_info->tile_Ox = cp->tx0; cstr_info->tile_Oy = cp->ty0; cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tile_info_t)); } } static void j2k_write_com(opj_j2k_t *j2k) { unsigned int i; int lenp, len; if(j2k->cp->comment) { opj_cio_t *cio = j2k->cio; char *comment = j2k->cp->comment; cio_write(cio, J2K_MS_COM, 2); lenp = cio_tell(cio); cio_skip(cio, 2); cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */ for (i = 0; i < strlen(comment); i++) { cio_write(cio, comment[i], 1); } len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); cio_seek(cio, lenp + len); if(j2k->cstr_info) j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len); } } static void j2k_read_com(opj_j2k_t *j2k) { int len; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); cio_skip(cio, len - 2); } static void j2k_write_cox(opj_j2k_t *j2k, int compno) { int i; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; opj_tccp_t *tccp = &tcp->tccps[compno]; opj_cio_t *cio = j2k->cio; cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */ cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */ cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */ cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */ cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */ if (tccp->csty & J2K_CCP_CSTY_PRT) { for (i = 0; i < tccp->numresolutions; i++) { cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ } } } static void j2k_read_cox(opj_j2k_t *j2k, int compno) { int i; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_tccp_t *tccp = &tcp->tccps[compno]; opj_cio_t *cio = j2k->cio; tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */ /* If user wants to remove more resolutions than the codestream contains, return error*/ if (cp->reduce >= tccp->numresolutions) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno); j2k->state |= J2K_STATE_ERR; } if( tccp->numresolutions > J2K_MAXRLVLS ) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n", compno, tccp->numresolutions, J2K_MAXRLVLS); j2k->state |= J2K_STATE_ERR; tccp->numresolutions = J2K_MAXRLVLS; } tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */ tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */ if (tccp->csty & J2K_CP_CSTY_PRT) { for (i = 0; i < tccp->numresolutions; i++) { int tmp = cio_read(cio, 1); /* SPcox (I_i) */ tccp->prcw[i] = tmp & 0xf; tccp->prch[i] = tmp >> 4; } } /* INDEX >> */ if(j2k->cstr_info && compno == 0) { for (i = 0; i < tccp->numresolutions; i++) { if (tccp->csty & J2K_CP_CSTY_PRT) { j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i]; j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i]; } else { j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; } } } /* << INDEX */ } static void j2k_write_cod(opj_j2k_t *j2k) { opj_cp_t *cp = NULL; opj_tcp_t *tcp = NULL; int lenp, len; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_COD, 2); /* COD */ lenp = cio_tell(cio); cio_skip(cio, 2); cp = j2k->cp; tcp = &cp->tcps[j2k->curtileno]; cio_write(cio, tcp->csty, 1); /* Scod */ cio_write(cio, tcp->prg, 1); /* SGcod (A) */ cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */ cio_write(cio, tcp->mct, 1); /* SGcod (C) */ j2k_write_cox(j2k, 0); len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lcod */ cio_seek(cio, lenp + len); if(j2k->cstr_info) j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len); } static void j2k_read_cod(opj_j2k_t *j2k) { int len, i, pos; opj_cio_t *cio = j2k->cio; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_image_t *image = j2k->image; len = cio_read(cio, 2); /* Lcod */ (void)len; tcp->csty = cio_read(cio, 1); /* Scod */ tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */ tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */ tcp->mct = cio_read(cio, 1); /* SGcod (C) */ pos = cio_tell(cio); for (i = 0; i < image->numcomps; i++) { tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; cio_seek(cio, pos); j2k_read_cox(j2k, i); } /* Index */ if (j2k->cstr_info) { opj_codestream_info_t *cstr_info = j2k->cstr_info; cstr_info->prog = tcp->prg; cstr_info->numlayers = tcp->numlayers; cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); for (i = 0; i < image->numcomps; i++) { cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1; } } } static void j2k_write_coc(opj_j2k_t *j2k, int compno) { int lenp, len; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; opj_image_t *image = j2k->image; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_COC, 2); /* COC */ lenp = cio_tell(cio); cio_skip(cio, 2); cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ j2k_write_cox(j2k, compno); len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lcoc */ cio_seek(cio, lenp + len); } static void j2k_read_coc(opj_j2k_t *j2k) { int len, compno; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_image_t *image = j2k->image; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); /* Lcoc */ (void)len; compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ if (compno >= image->numcomps) { opj_event_msg(j2k->cinfo, EVT_ERROR, "bad component number in COC (%d out of a maximum of %d)\n", compno, image->numcomps); return; } tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ j2k_read_cox(j2k, compno); } static void j2k_write_qcx(opj_j2k_t *j2k, int compno) { int bandno, numbands; int expn, mant; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; opj_tccp_t *tccp = &tcp->tccps[compno]; opj_cio_t *cio = j2k->cio; cio_write(cio, 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(cio, expn << 3, 1); /* SPqcx_i */ } else { cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ } } } static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) { int tmp; int bandno, numbands; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_tccp_t *tccp = &tcp->tccps[compno]; opj_cio_t *cio = j2k->cio; tmp = cio_read(cio, 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); #ifdef USE_JPWL if (j2k->cp->correct) { /* if JPWL is on, we check whether there are too many subbands */ if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, "JPWL: bad number of subbands in Sqcx (%d)\n", numbands); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ numbands = 1; opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n" "- setting number of bands to %d => HYPOTHESIS!!!\n", numbands); }; }; #else /* We check whether there are too many subbands */ if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { opj_event_msg(j2k->cinfo, EVT_WARNING , "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n" "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n", numbands, J2K_MAXBANDS); /* edf_c2_1013627.jp2 */ numbands = 1; } #endif /* USE_JPWL */ for (bandno = 0; bandno < numbands; bandno++) { int expn, mant; if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ mant = 0; } else { tmp = cio_read(cio, 2); /* SPqcx_i */ expn = tmp >> 11; mant = tmp & 0x7ff; } if (bandno < J2K_MAXBANDS){ 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 */ } static void j2k_write_qcd(opj_j2k_t *j2k) { int lenp, len; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_QCD, 2); /* QCD */ lenp = cio_tell(cio); cio_skip(cio, 2); j2k_write_qcx(j2k, 0); len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lqcd */ cio_seek(cio, lenp + len); if(j2k->cstr_info) j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len); } static void j2k_read_qcd(opj_j2k_t *j2k) { int len, i, pos; opj_cio_t *cio = j2k->cio; opj_image_t *image = j2k->image; len = cio_read(cio, 2); /* Lqcd */ pos = cio_tell(cio); for (i = 0; i < image->numcomps; i++) { cio_seek(cio, pos); j2k_read_qcx(j2k, i, len - 2); } } static void j2k_write_qcc(opj_j2k_t *j2k, int compno) { int lenp, len; opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_QCC, 2); /* QCC */ lenp = cio_tell(cio); cio_skip(cio, 2); cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */ j2k_write_qcx(j2k, compno); len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lqcc */ cio_seek(cio, lenp + len); } static void j2k_read_qcc(opj_j2k_t *j2k) { int len, compno; int numcomp = j2k->image->numcomps; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); /* Lqcc */ compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ #ifdef USE_JPWL if (j2k->cp->correct) { static int backup_compno = 0; /* compno is negative or larger than the number of components!!! */ if ((compno < 0) || (compno >= numcomp)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", compno, numcomp); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ compno = backup_compno % numcomp; opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" "- setting component number to %d\n", compno); } /* keep your private count of tiles */ backup_compno++; } #endif /* USE_JPWL */ if ((compno < 0) || (compno >= numcomp)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "bad component number in QCC (%d out of a maximum of %d)\n", compno, j2k->image->numcomps); return; } j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); } static void j2k_write_poc(opj_j2k_t *j2k) { int len, numpchgs, i; int numcomps = j2k->image->numcomps; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; opj_tccp_t *tccp = &tcp->tccps[0]; opj_cio_t *cio = j2k->cio; numpchgs = 1 + tcp->numpocs; cio_write(cio, J2K_MS_POC, 2); /* POC */ len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; cio_write(cio, len, 2); /* Lpoc */ for (i = 0; i < numpchgs; i++) { opj_poc_t *poc = &tcp->pocs[i]; cio_write(cio, poc->resno0, 1); /* RSpoc_i */ cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ poc->layno1 = int_min(poc->layno1, tcp->numlayers); cio_write(cio, poc->resno1, 1); /* REpoc_i */ poc->resno1 = int_min(poc->resno1, tccp->numresolutions); cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ poc->compno1 = int_min(poc->compno1, numcomps); cio_write(cio, poc->prg, 1); /* Ppoc_i */ } } static void j2k_read_poc(opj_j2k_t *j2k) { int len, numpchgs, i, old_poc; int numcomps = j2k->image->numcomps; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_cio_t *cio = j2k->cio; old_poc = tcp->POC ? tcp->numpocs + 1 : 0; tcp->POC = 1; len = cio_read(cio, 2); /* Lpoc */ numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); if( numpchgs >= 32 ) { /* edf_c2_1103421.jp2 */ opj_event_msg(j2k->cinfo, EVT_ERROR, "bad number of POCS (%d out of a maximum of %d)\n", numpchgs, 32); numpchgs = 0; } for (i = old_poc; i < numpchgs + old_poc; i++) { opj_poc_t *poc; poc = &tcp->pocs[i]; poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */ poc->resno1 = cio_read(cio, 1); /* REpoc_i */ poc->compno1 = int_min( cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps); /* CEpoc_i */ poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ } tcp->numpocs = numpchgs + old_poc - 1; } static void j2k_read_crg(opj_j2k_t *j2k) { int len, i, Xcrg_i, Ycrg_i; opj_cio_t *cio = j2k->cio; int numcomps = j2k->image->numcomps; len = cio_read(cio, 2); /* Lcrg */ (void)len; for (i = 0; i < numcomps; i++) { Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ (void)Xcrg_i; Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ (void)Ycrg_i; } } static void j2k_read_tlm(opj_j2k_t *j2k) { int len, Ztlm, Stlm, ST, SP, tile_tlm, i; long int Ttlm_i, Ptlm_i; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); /* Ltlm */ Ztlm = cio_read(cio, 1); /* Ztlm */ (void)Ztlm; Stlm = cio_read(cio, 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(cio, ST); /* Ttlm_i */ (void)Ttlm_i; Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ (void)Ptlm_i; } } static void j2k_read_plm(opj_j2k_t *j2k) { int len, i, Zplm, Nplm, add, packet_len = 0; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); /* Lplm */ Zplm = cio_read(cio, 1); /* Zplm */ (void)Zplm; len -= 3; while (len > 0) { Nplm = cio_read(cio, 4); /* Nplm */ len -= 4; for (i = Nplm; i > 0; i--) { add = cio_read(cio, 1); len--; packet_len = (packet_len << 7) + add; /* Iplm_ij */ if ((add & 0x80) == 0) { /* New packet */ packet_len = 0; } if (len <= 0) break; } } } static void j2k_read_plt(opj_j2k_t *j2k) { int len, i, Zplt, packet_len = 0, add; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); /* Lplt */ Zplt = cio_read(cio, 1); /* Zplt */ (void)Zplt; for (i = len - 3; i > 0; i--) { add = cio_read(cio, 1); packet_len = (packet_len << 7) + add; /* Iplt_i */ if ((add & 0x80) == 0) { /* New packet */ packet_len = 0; } } } static void j2k_read_ppm(opj_j2k_t *j2k) { int len, Z_ppm, i, j; int N_ppm; opj_cp_t *cp = j2k->cp; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); cp->ppm = 1; Z_ppm = cio_read(cio, 1); /* Z_ppm */ len -= 3; while (len > 0) { if (cp->ppm_previous == 0) { N_ppm = cio_read(cio, 4); /* N_ppm */ len -= 4; } else { N_ppm = cp->ppm_previous; } j = cp->ppm_store; if (Z_ppm == 0) { /* First PPM marker */ cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); cp->ppm_data_first = cp->ppm_data; cp->ppm_len = N_ppm; } else { /* NON-first PPM marker */ cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm + cp->ppm_store) * sizeof(unsigned char)); #ifdef USE_JPWL /* this memory allocation check could be done even in non-JPWL cases */ if (cp->correct) { if (!cp->ppm_data) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", cio_tell(cio)); if (!JPWL_ASSUME || JPWL_ASSUME) { opj_free(cp->ppm_data); opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } } } #endif cp->ppm_data_first = cp->ppm_data; cp->ppm_len = N_ppm + cp->ppm_store; } for (i = N_ppm; i > 0; i--) { /* Read packet header */ cp->ppm_data[j] = cio_read(cio, 1); j++; len--; if (len == 0) break; /* Case of non-finished packet header in present marker but finished in next one */ } cp->ppm_previous = i - 1; cp->ppm_store = j; } } static void j2k_read_ppt(opj_j2k_t *j2k) { int len, Z_ppt, i, j = 0; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = cp->tcps + j2k->curtileno; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); Z_ppt = cio_read(cio, 1); tcp->ppt = 1; if (Z_ppt == 0) { /* First PPT marker */ tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); tcp->ppt_data_first = tcp->ppt_data; tcp->ppt_store = 0; tcp->ppt_len = len - 3; } else { /* NON-first PPT marker */ tcp->ppt_data = (unsigned char *) opj_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; } j = tcp->ppt_store; for (i = len - 3; i > 0; i--) { tcp->ppt_data[j] = cio_read(cio, 1); j++; } tcp->ppt_store = j; } static void j2k_write_tlm(opj_j2k_t *j2k){ int lenp; opj_cio_t *cio = j2k->cio; j2k->tlm_start = cio_tell(cio); cio_write(cio, J2K_MS_TLM, 2);/* TLM */ lenp = 4 + (5*j2k->totnum_tp); cio_write(cio,lenp,2); /* Ltlm */ cio_write(cio, 0,1); /* Ztlm=0*/ cio_write(cio,80,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ cio_skip(cio,5*j2k->totnum_tp); } static void j2k_write_sot(opj_j2k_t *j2k) { int lenp, len; opj_cio_t *cio = j2k->cio; j2k->sot_start = cio_tell(cio); cio_write(cio, J2K_MS_SOT, 2); /* SOT */ lenp = cio_tell(cio); cio_skip(cio, 2); /* Lsot (further) */ cio_write(cio, j2k->curtileno, 2); /* Isot */ cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */ cio_write(cio, j2k->cur_tp_num , 1); /* TPsot */ cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */ len = cio_tell(cio) - lenp; cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lsot */ cio_seek(cio, lenp + len); /* UniPG>> */ #ifdef USE_JPWL /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); #endif /* USE_JPWL */ /* <cstr_info && j2k->cur_tp_num==0){ j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len); } } static void j2k_read_sot(opj_j2k_t *j2k) { int len, tileno, totlen, partno, numparts, i; opj_tcp_t *tcp = NULL; char status = 0; opj_cp_t *cp = j2k->cp; opj_cio_t *cio = j2k->cio; len = cio_read(cio, 2); (void)len; tileno = cio_read(cio, 2); #ifdef USE_JPWL if (j2k->cp->correct) { static int backup_tileno = 0; /* tileno is negative or larger than the number of tiles!!! */ if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad tile number (%d out of a maximum of %d)\n", tileno, (cp->tw * cp->th)); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ tileno = backup_tileno; opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" "- setting tile number to %d\n", tileno); } /* keep your private count of tiles */ backup_tileno++; } else #endif /* USE_JPWL */ { /* tileno is negative or larger than the number of tiles!!! */ if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad tile number (%d out of a maximum of %d)\n", tileno, (cp->tw * cp->th)); return; } } if (cp->tileno_size == 0) { cp->tileno[cp->tileno_size] = tileno; cp->tileno_size++; } else { i = 0; while (i < cp->tileno_size && status == 0) { status = cp->tileno[i] == tileno ? 1 : 0; i++; } if (status == 0) { cp->tileno[cp->tileno_size] = tileno; cp->tileno_size++; } } totlen = cio_read(cio, 4); #ifdef USE_JPWL if (j2k->cp->correct) { /* totlen is negative or larger than the bytes left!!! */ if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", totlen, cio_numbytesleft(cio) + 8); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } /* we try to correct */ totlen = 0; opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" "- setting Psot to %d => assuming it is the last tile\n", totlen); } } else #endif /* USE_JPWL */ { /* totlen is negative or larger than the bytes left!!! */ if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", totlen, cio_numbytesleft(cio) + 8); return; } } if (!totlen) totlen = cio_numbytesleft(cio) + 8; partno = cio_read(cio, 1); numparts = cio_read(cio, 1); if (partno >= numparts) { opj_event_msg(j2k->cinfo, EVT_WARNING, "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n", tileno, partno, numparts); numparts = partno+1; } j2k->curtileno = tileno; j2k->cur_tp_num = partno; j2k->eot = cio_getbp(cio) - 12 + totlen; j2k->state = J2K_STATE_TPH; tcp = &cp->tcps[j2k->curtileno]; /* Index */ if (j2k->cstr_info) { if (tcp->first) { if (tileno == 0) j2k->cstr_info->main_head_end = cio_tell(cio) - 13; j2k->cstr_info->tile[tileno].tileno = tileno; j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12; j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1; } else { j2k->cstr_info->tile[tileno].end_pos += totlen; } j2k->cstr_info->tile[tileno].num_tps = numparts; if (numparts) j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t)); else j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/ j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12; j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; } if (tcp->first == 1) { /* Initialization PPT */ opj_tccp_t *tmp = tcp->tccps; memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t)); tcp->ppt = 0; tcp->ppt_data = NULL; tcp->ppt_data_first = NULL; tcp->tccps = tmp; for (i = 0; i < j2k->image->numcomps; i++) { tcp->tccps[i] = j2k->default_tcp->tccps[i]; } cp->tcps[j2k->curtileno].first = 0; } } static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) { int l, layno; int totlen; opj_tcp_t *tcp = NULL; opj_codestream_info_t *cstr_info = NULL; opj_tcd_t *tcd = (opj_tcd_t*)tile_coder; /* cast is needed because of conflicts in header inclusions */ opj_cp_t *cp = j2k->cp; opj_cio_t *cio = j2k->cio; tcd->tp_num = j2k->tp_num ; tcd->cur_tp_num = j2k->cur_tp_num; cio_write(cio, J2K_MS_SOD, 2); if( j2k->cstr_info && j2k->cur_tp_num==0){ j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0); } if (j2k->curtileno == 0) { j2k->sod_start = cio_tell(cio) + j2k->pos_correction; } /* INDEX >> */ cstr_info = j2k->cstr_info; if (cstr_info) { if (!j2k->cur_tp_num ) { cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno; } else{ if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio)) cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio); } /* UniPG>> */ #ifdef USE_JPWL /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); #endif /* USE_JPWL */ /* <tcps[j2k->curtileno]; for (layno = 0; layno < tcp->numlayers; layno++) { if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) { tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw)); } else if (tcp->rates[layno]) { tcp->rates[layno]=1; } } if(j2k->cur_tp_num == 0){ tcd->tcd_image->tiles->packno = 0; if(cstr_info) cstr_info->packno = 0; } l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, cstr_info); /* Writing Psot in SOT marker */ totlen = cio_tell(cio) + l - j2k->sot_start; cio_seek(cio, j2k->sot_start + 6); cio_write(cio, totlen, 4); cio_seek(cio, j2k->sot_start + totlen); /* Writing Ttlm and Ptlm in TLM marker */ if(cp->cinema){ cio_seek(cio, j2k->tlm_start + 6 + (5*j2k->cur_tp_num)); cio_write(cio, j2k->curtileno, 1); cio_write(cio, totlen, 4); } cio_seek(cio, j2k->sot_start + totlen); } static void j2k_read_sod(opj_j2k_t *j2k) { int len, truncate = 0, i; unsigned char *data = NULL, *data_ptr = NULL; opj_cio_t *cio = j2k->cio; int curtileno = j2k->curtileno; /* Index */ if (j2k->cstr_info) { j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = cio_tell(cio) + j2k->pos_correction - 1; if (j2k->cur_tp_num == 0) j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1; j2k->cstr_info->packno = 0; } len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); if (len == cio_numbytesleft(cio) + 1) { truncate = 1; /* Case of a truncate codestream */ } data = j2k->tile_data[curtileno]; data_ptr = data; /* store in case of failure */ data = (unsigned char*) opj_realloc(data, (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); if( data == NULL ) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not reallocated\n" ); opj_free( data_ptr ); return; } data_ptr = data + j2k->tile_len[curtileno]; for (i = 0; i < len; i++) { data_ptr[i] = cio_read(cio, 1); } j2k->tile_len[curtileno] += len; j2k->tile_data[curtileno] = data; if (!truncate) { j2k->state = J2K_STATE_TPHSOT; } else { j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */ } j2k->cur_tp_num++; } static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) { opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = &cp->tcps[tileno]; opj_cio_t *cio = j2k->cio; int numcomps = j2k->image->numcomps; cio_write(cio, J2K_MS_RGN, 2); /* RGN */ cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ cio_write(cio, 0, 1); /* Srgn */ cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ } static void j2k_read_rgn(opj_j2k_t *j2k) { int len, compno, roisty; opj_cp_t *cp = j2k->cp; opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp; opj_cio_t *cio = j2k->cio; int numcomps = j2k->image->numcomps; len = cio_read(cio, 2); /* Lrgn */ (void)len; compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ roisty = cio_read(cio, 1); /* Srgn */ (void)roisty; #ifdef USE_JPWL if (j2k->cp->correct) { /* totlen is negative or larger than the bytes left!!! */ if (compno >= numcomps) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: bad component number in RGN (%d when there are only %d)\n", compno, numcomps); if (!JPWL_ASSUME || JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } } }; #endif /* USE_JPWL */ if (compno >= numcomps) { opj_event_msg(j2k->cinfo, EVT_ERROR, "bad component number in RGN (%d out of a maximum of %d)\n", compno, j2k->image->numcomps); return; } tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ } static void j2k_write_eoc(opj_j2k_t *j2k) { opj_cio_t *cio = j2k->cio; /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ cio_write(cio, J2K_MS_EOC, 2); /* UniPG>> */ #ifdef USE_JPWL /* update markers struct */ j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); #endif /* USE_JPWL */ /* <cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { opj_tcd_t *tcd = tcd_create(j2k->cinfo); tcd_malloc_decode(tcd, j2k->image, j2k->cp); for (i = 0; i < j2k->cp->tileno_size; i++) { tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); if (j2k->cp->tileno[i] != -1) { tileno = j2k->cp->tileno[i]; success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno, j2k->cstr_info); assert( tileno != -1 ); opj_free(j2k->tile_data[tileno]); j2k->tile_data[tileno] = NULL; tcd_free_decode_tile(tcd, i); } else success = OPJ_FALSE; if (success == OPJ_FALSE) { j2k->state |= J2K_STATE_ERR; break; } } tcd_free_decode(tcd); tcd_destroy(tcd); } /* if packets should not be decoded */ else { for (i = 0; i < j2k->cp->tileno_size; i++) { tileno = j2k->cp->tileno[i]; opj_free(j2k->tile_data[tileno]); j2k->tile_data[tileno] = NULL; } } if (j2k->state & J2K_STATE_ERR) j2k->state = J2K_STATE_MT + J2K_STATE_ERR; else j2k->state = J2K_STATE_MT; } typedef struct opj_dec_mstabent { /** marker value */ int id; /** value of the state when the marker can appear */ int states; /** action linked to the marker */ void (*handler) (opj_j2k_t *j2k); } opj_dec_mstabent_t; opj_dec_mstabent_t j2k_dec_mstab[] = { {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc}, {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot}, {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod}, {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc}, {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz}, {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod}, {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc}, {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn}, {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd}, {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc}, {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc}, {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm}, {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm}, {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt}, {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm}, {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt}, {J2K_MS_SOP, 0, 0}, {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg}, {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com}, #ifdef USE_JPWL {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, #endif /* USE_JPWL */ #ifdef USE_JPSEC {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec}, {J2K_MS_INSEC, 0, j2k_read_insec}, #endif /* USE_JPSEC */ {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk} }; static void j2k_read_unk(opj_j2k_t *j2k) { opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n"); #ifdef USE_JPWL if (j2k->cp->correct) { int m = 0, id, i; int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id; cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); id = cio_read(j2k->cio, 2); opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: really don't know this marker %x\n", id); if (!JPWL_ASSUME) { opj_event_msg(j2k->cinfo, EVT_ERROR, "- possible synch loss due to uncorrectable codestream errors => giving up\n"); return; } /* OK, activate this at your own risk!!! */ /* we look for the marker at the minimum hamming distance from this */ while (j2k_dec_mstab[m].id) { /* 1's where they differ */ tmp_id = j2k_dec_mstab[m].id ^ id; /* compute the hamming distance between our id and the current */ cur_dist = 0; for (i = 0; i < 16; i++) { if ((tmp_id >> i) & 0x0001) { cur_dist++; } } /* if current distance is smaller, set the minimum */ if (cur_dist < min_dist) { min_dist = cur_dist; min_id = j2k_dec_mstab[m].id; } /* jump to the next marker */ m++; } /* do we substitute the marker? */ if (min_dist < JPWL_MAXIMUM_HAMMING) { opj_event_msg(j2k->cinfo, EVT_ERROR, "- marker %x is at distance %d from the read %x\n", min_id, min_dist, id); opj_event_msg(j2k->cinfo, EVT_ERROR, "- trying to substitute in place and crossing fingers!\n"); cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); cio_write(j2k->cio, min_id, 2); /* rewind */ cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); } }; #endif /* USE_JPWL */ } /** Read the lookup table containing all the marker, status and action @param id Marker value */ static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) { opj_dec_mstabent_t *e; for (e = j2k_dec_mstab; e->id != 0; e++) { if (e->id == id) { break; } } return e; } /* ----------------------------------------------------------------------- */ /* J2K / JPT decoder interface */ /* ----------------------------------------------------------------------- */ opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) { opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); if(!j2k) return NULL; j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t)); if(!j2k->default_tcp) { opj_free(j2k); return NULL; } j2k->cinfo = cinfo; j2k->tile_data = NULL; return j2k; } void j2k_destroy_decompress(opj_j2k_t *j2k) { int i = 0; if(j2k->tile_len != NULL) { opj_free(j2k->tile_len); } if(j2k->tile_data != NULL) { if(j2k->cp != NULL) { for (i = 0; i < j2k->cp->tileno_size; i++) { int tileno = j2k->cp->tileno[i]; if( tileno != -1 ) { opj_free(j2k->tile_data[tileno]); j2k->tile_data[tileno] = NULL; } } } opj_free(j2k->tile_data); } if(j2k->default_tcp != NULL) { opj_tcp_t *default_tcp = j2k->default_tcp; if(default_tcp->ppt_data_first != NULL) { opj_free(default_tcp->ppt_data_first); } if(j2k->default_tcp->tccps != NULL) { opj_free(j2k->default_tcp->tccps); } opj_free(j2k->default_tcp); } if(j2k->cp != NULL) { opj_cp_t *cp = j2k->cp; if(cp->tcps != NULL) { for(i = 0; i < cp->tw * cp->th; i++) { if(cp->tcps[i].ppt_data_first != NULL) { opj_free(cp->tcps[i].ppt_data_first); } if(cp->tcps[i].tccps != NULL) { opj_free(cp->tcps[i].tccps); } } opj_free(cp->tcps); } if(cp->ppm_data_first != NULL) { opj_free(cp->ppm_data_first); } if(cp->tileno != NULL) { opj_free(cp->tileno); } if(cp->comment != NULL) { opj_free(cp->comment); } opj_free(cp); } opj_free(j2k); } void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) { if(j2k && parameters) { /* create and initialize the coding parameters structure */ opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); cp->reduce = parameters->cp_reduce; cp->layer = parameters->cp_layer; cp->limit_decoding = parameters->cp_limit_decoding; #ifdef USE_JPWL cp->correct = parameters->jpwl_correct; cp->exp_comps = parameters->jpwl_exp_comps; cp->max_tiles = parameters->jpwl_max_tiles; #endif /* USE_JPWL */ /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */ j2k->cp = cp; } } opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { opj_image_t *image = NULL; opj_common_ptr cinfo = j2k->cinfo; j2k->cio = cio; j2k->cstr_info = cstr_info; if (cstr_info) memset(cstr_info, 0, sizeof(opj_codestream_info_t)); /* create an empty image */ image = opj_image_create0(); j2k->image = image; j2k->state = J2K_STATE_MHSOC; for (;;) { opj_dec_mstabent_t *e; int id = cio_read(cio, 2); #ifdef USE_JPWL /* we try to honor JPWL correction power */ if (j2k->cp->correct) { int orig_pos = cio_tell(cio); opj_bool status; /* call the corrector */ status = jpwl_correct(j2k); /* go back to where you were */ cio_seek(cio, orig_pos - 2); /* re-read the marker */ id = cio_read(cio, 2); /* check whether it begins with ff */ if (id >> 8 != 0xff) { opj_event_msg(cinfo, EVT_ERROR, "JPWL: possible bad marker %x at %d\n", id, cio_tell(cio) - 2); if (!JPWL_ASSUME) { opj_image_destroy(image); opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n"); return 0; } /* we try to correct */ id = id | 0xff00; cio_seek(cio, cio_tell(cio) - 2); cio_write(cio, id, 2); opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n" "- setting marker to %x\n", id); } } #endif /* USE_JPWL */ if (id >> 8 != 0xff) { if(cio_numbytesleft(cio) != 0) /* not end of file reached and no EOC */ { opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); opj_image_destroy(image); return 0; } opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); j2k->state = J2K_STATE_NEOC; break; } e = j2k_dec_mstab_lookup(id); /* Check if the marker is known*/ if (!(j2k->state & e->states)) { opj_image_destroy(image); opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); return 0; } /* Check if the decoding is limited to the main header*/ if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) { opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n"); return image; } if (e->handler) { (*e->handler)(j2k); } if (j2k->state & J2K_STATE_ERR) { opj_image_destroy(image); return NULL; } if (j2k->state == J2K_STATE_MT) { break; } if (j2k->state == J2K_STATE_NEOC) { break; } } if (j2k->state == J2K_STATE_NEOC) { j2k_read_eoc(j2k); /* Check one last time for errors during decoding before returning */ if (j2k->state & J2K_STATE_ERR) { opj_image_destroy(image); return NULL; } } if (j2k->state != J2K_STATE_MT) { opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); } return image; } /* * Read a JPT-stream and decode file * */ opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { opj_image_t *image = NULL; opj_jpt_msg_header_t header; int position; opj_common_ptr cinfo = j2k->cinfo; OPJ_ARG_NOT_USED(cstr_info); j2k->cio = cio; /* create an empty image */ image = opj_image_create0(); j2k->image = image; j2k->state = J2K_STATE_MHSOC; /* Initialize the header */ jpt_init_msg_header(&header); /* Read the first header of the message */ jpt_read_msg_header(cinfo, cio, &header); position = cio_tell(cio); if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ opj_image_destroy(image); opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id); return 0; } for (;;) { opj_dec_mstabent_t *e = NULL; int id; if (!cio_numbytesleft(cio)) { j2k_read_eoc(j2k); return image; } /* data-bin read -> need to read a new header */ if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) { jpt_read_msg_header(cinfo, cio, &header); position = cio_tell(cio); if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ opj_image_destroy(image); opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n"); return 0; } } id = cio_read(cio, 2); if (id >> 8 != 0xff) { if(cio_numbytesleft(cio) != 0) /* no end of file reached and no EOC */ { opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); opj_image_destroy(image); return 0; } opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id); j2k->state = J2K_STATE_NEOC; break; } e = j2k_dec_mstab_lookup(id); if (!(j2k->state & e->states)) { opj_image_destroy(image); opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id); return 0; } if (e->handler) { (*e->handler)(j2k); } if (j2k->state == J2K_STATE_MT) { break; } if (j2k->state == J2K_STATE_NEOC) { break; } } if (j2k->state == J2K_STATE_NEOC) { j2k_read_eoc(j2k); } if (j2k->state != J2K_STATE_MT) { opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); } return image; } /* ----------------------------------------------------------------------- */ /* J2K encoder interface */ /* ----------------------------------------------------------------------- */ opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) { opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); if(j2k) { j2k->cinfo = cinfo; } return j2k; } void j2k_destroy_compress(opj_j2k_t *j2k) { int tileno; if(!j2k) return; if(j2k->cp != NULL) { opj_cp_t *cp = j2k->cp; if(cp->comment) { opj_free(cp->comment); } if(cp->matrice) { opj_free(cp->matrice); } for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { opj_free(cp->tcps[tileno].tccps); } opj_free(cp->tcps); opj_free(cp); } opj_free(j2k); } void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) { int i, j, tileno, numpocs_tile; opj_cp_t *cp = NULL; if(!j2k || !parameters || ! image) { return; } /* create and initialize the coding parameters structure */ cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ j2k->cp = cp; /* set default values for cp */ cp->tw = 1; cp->th = 1; /* copy user encoding parameters */ cp->cinema = parameters->cp_cinema; cp->max_comp_size = parameters->max_comp_size; cp->rsiz = parameters->cp_rsiz; cp->disto_alloc = parameters->cp_disto_alloc; cp->fixed_alloc = parameters->cp_fixed_alloc; cp->fixed_quality = parameters->cp_fixed_quality; /* mod fixed_quality */ if(parameters->cp_matrice) { size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int); cp->matrice = (int *) opj_malloc(array_size); memcpy(cp->matrice, parameters->cp_matrice, array_size); } /* tiles */ cp->tdx = parameters->cp_tdx; cp->tdy = parameters->cp_tdy; /* tile offset */ cp->tx0 = parameters->cp_tx0; cp->ty0 = parameters->cp_ty0; /* comment string */ if(parameters->cp_comment) { cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); if(cp->comment) { strcpy(cp->comment, parameters->cp_comment); } } /* calculate other encoding parameters */ if (parameters->tile_size_on) { cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); } else { cp->tdx = image->x1 - cp->tx0; cp->tdy = image->y1 - cp->ty0; } if(parameters->tp_on){ cp->tp_flag = parameters->tp_flag; cp->tp_on = 1; } cp->img_size = 0; for(i=0;inumcomps ;i++){ cp->img_size += (image->comps[i].w *image->comps[i].h * image->comps[i].prec); } #ifdef USE_JPWL /* calculate JPWL encoding parameters */ if (parameters->jpwl_epc_on) { int i; /* set JPWL on */ cp->epc_on = OPJ_TRUE; cp->info_on = OPJ_FALSE; /* no informative technique */ /* set EPB on */ if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { cp->epb_on = OPJ_TRUE; cp->hprot_MH = parameters->jpwl_hprot_MH; for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; } /* if tile specs are not specified, copy MH specs */ if (cp->hprot_TPH[0] == -1) { cp->hprot_TPH_tileno[0] = 0; cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; } for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; cp->pprot[i] = parameters->jpwl_pprot[i]; } } /* set ESD writing */ if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { cp->esd_on = OPJ_TRUE; cp->sens_size = parameters->jpwl_sens_size; cp->sens_addr = parameters->jpwl_sens_addr; cp->sens_range = parameters->jpwl_sens_range; cp->sens_MH = parameters->jpwl_sens_MH; for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; } } /* always set RED writing to false: we are at the encoder */ cp->red_on = OPJ_FALSE; } else { cp->epc_on = OPJ_FALSE; } #endif /* USE_JPWL */ /* initialize the mutiple tiles */ /* ---------------------------- */ cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { opj_tcp_t *tcp = &cp->tcps[tileno]; tcp->numlayers = parameters->tcp_numlayers; for (j = 0; j < tcp->numlayers; j++) { if(cp->cinema){ if (cp->fixed_quality) { tcp->distoratio[j] = parameters->tcp_distoratio[j]; } tcp->rates[j] = parameters->tcp_rates[j]; }else{ if (cp->fixed_quality) { /* add fixed_quality */ tcp->distoratio[j] = parameters->tcp_distoratio[j]; } else { tcp->rates[j] = parameters->tcp_rates[j]; } } } tcp->csty = parameters->csty; tcp->prg = parameters->prog_order; tcp->mct = parameters->tcp_mct; numpocs_tile = 0; tcp->POC = 0; if (parameters->numpocs) { /* initialisation of POC */ tcp->POC = 1; for (i = 0; i < parameters->numpocs; i++) { if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) { opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; tcp_poc->tile = parameters->POC[numpocs_tile].tile; numpocs_tile++; } } tcp->numpocs = numpocs_tile -1 ; }else{ tcp->numpocs = 0; } tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); for (i = 0; i < image->numcomps; i++) { opj_tccp_t *tccp = &tcp->tccps[i]; tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */ tccp->numresolutions = parameters->numresolution; tccp->cblkw = int_floorlog2(parameters->cblockw_init); tccp->cblkh = int_floorlog2(parameters->cblockh_init); tccp->cblksty = parameters->mode; tccp->qmfbid = parameters->irreversible ? 0 : 1; tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT; tccp->numgbits = 2; if (i == parameters->roi_compno) { tccp->roishift = parameters->roi_shift; } else { tccp->roishift = 0; } if(parameters->cp_cinema) { /*Precinct size for lowest frequency subband=128*/ tccp->prcw[0] = 7; tccp->prch[0] = 7; /*Precinct size at all other resolutions = 256*/ for (j = 1; j < tccp->numresolutions; j++) { tccp->prcw[j] = 8; tccp->prch[j] = 8; } }else{ if (parameters->csty & J2K_CCP_CSTY_PRT) { int p = 0; for (j = tccp->numresolutions - 1; j >= 0; j--) { if (p < parameters->res_spec) { if (parameters->prcw_init[p] < 1) { tccp->prcw[j] = 1; } else { tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]); } if (parameters->prch_init[p] < 1) { tccp->prch[j] = 1; }else { tccp->prch[j] = int_floorlog2(parameters->prch_init[p]); } } else { int res_spec = parameters->res_spec; int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); int size_prch = parameters->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 for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */ } /*end for*/ } else { for (j = 0; j < tccp->numresolutions; j++) { tccp->prcw[j] = 15; tccp->prch[j] = 15; } } } dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); } } } opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { int tileno, compno; opj_cp_t *cp = NULL; opj_tcd_t *tcd = NULL; /* TCD component */ j2k->cio = cio; j2k->image = image; cp = j2k->cp; /* INDEX >> */ j2k->cstr_info = cstr_info; if (cstr_info) { int compno; cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t)); cstr_info->image_w = image->x1 - image->x0; cstr_info->image_h = image->y1 - image->y0; cstr_info->prog = (&cp->tcps[0])->prg; cstr_info->tw = cp->tw; cstr_info->th = cp->th; cstr_info->tile_x = cp->tdx; /* new version parser */ cstr_info->tile_y = cp->tdy; /* new version parser */ cstr_info->tile_Ox = cp->tx0; /* new version parser */ cstr_info->tile_Oy = cp->ty0; /* new version parser */ cstr_info->numcomps = image->numcomps; cstr_info->numlayers = (&cp->tcps[0])->numlayers; cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); for (compno=0; compno < image->numcomps; compno++) { cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1; } cstr_info->D_max = 0.0; /* ADD Marcela */ cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ cstr_info->maxmarknum = 100; cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t)); cstr_info->marknum = 0; } /* << INDEX */ j2k_write_soc(j2k); j2k_write_siz(j2k); j2k_write_cod(j2k); j2k_write_qcd(j2k); if(cp->cinema){ for (compno = 1; compno < image->numcomps; compno++) { j2k_write_coc(j2k, compno); j2k_write_qcc(j2k, compno); } } for (compno = 0; compno < image->numcomps; compno++) { opj_tcp_t *tcp = &cp->tcps[0]; if (tcp->tccps[compno].roishift) j2k_write_rgn(j2k, compno, 0); } if (cp->comment != NULL) { j2k_write_com(j2k); } j2k->totnum_tp = j2k_calculate_tp(cp,image->numcomps,image,j2k); /* TLM Marker*/ if(cp->cinema){ j2k_write_tlm(j2k); if (cp->cinema == CINEMA4K_24) { j2k_write_poc(j2k); } } /* uncomment only for testing JPSEC marker writing */ /* j2k_write_sec(j2k); */ /* INDEX >> */ if(cstr_info) { cstr_info->main_head_end = cio_tell(cio) - 1; } /* << INDEX */ /**** Main Header ENDS here ***/ /* create the tile encoder */ tcd = tcd_create(j2k->cinfo); /* encode each tile */ for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { int pino; int tilepartno=0; /* UniPG>> */ int acc_pack_num = 0; /* <tcps[tileno]; opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th); j2k->curtileno = tileno; j2k->cur_tp_num = 0; tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno]; /* initialisation before tile encoding */ if (tileno == 0) { tcd_malloc_encode(tcd, image, cp, j2k->curtileno); } else { tcd_init_encode(tcd, image, cp, j2k->curtileno); } /* INDEX >> */ if(cstr_info) { cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction; cstr_info->tile[j2k->curtileno].maxmarknum = 10; cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc(cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t)); cstr_info->tile[j2k->curtileno].marknum = 0; } /* << INDEX */ for(pino = 0; pino <= tcp->numpocs; pino++) { int tot_num_tp; tcd->cur_pino=pino; /*Get number of tile parts*/ tot_num_tp = j2k_get_num_tp(cp,pino,tileno); tcd->tp_pos = cp->tp_pos; for(tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++){ j2k->tp_num = tilepartno; /* INDEX >> */ if(cstr_info) cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos = cio_tell(cio) + j2k->pos_correction; /* << INDEX */ j2k_write_sot(j2k); if(j2k->cur_tp_num == 0 && cp->cinema == 0){ for (compno = 1; compno < image->numcomps; compno++) { j2k_write_coc(j2k, compno); j2k_write_qcc(j2k, compno); } if (cp->tcps[tileno].numpocs) { j2k_write_poc(j2k); } } /* INDEX >> */ if(cstr_info) cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = cio_tell(cio) + j2k->pos_correction + 1; /* << INDEX */ j2k_write_sod(j2k, tcd); /* INDEX >> */ if(cstr_info) { cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = cio_tell(cio) + j2k->pos_correction - 1; cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = acc_pack_num; cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = cstr_info->packno - acc_pack_num; acc_pack_num = cstr_info->packno; } /* << INDEX */ j2k->cur_tp_num++; } } if(cstr_info) { cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1; } /* 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"); } */ } /* destroy the tile encoder */ tcd_free_encode(tcd); tcd_destroy(tcd); opj_free(j2k->cur_totnum_tp); j2k_write_eoc(j2k); if(cstr_info) { cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; /* UniPG>> */ /* The following adjustment is done to adjust the codestream size */ /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ /* the first bunch of bytes is not in the codestream */ cstr_info->codestream_size -= cstr_info->main_head_start; /* <epc_on) { /* encode according to JPWL */ jpwl_encode(j2k, cio, image); } #endif /* USE_JPWL */ return OPJ_TRUE; } static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { if (!cstr_info) return; /* expand the list? */ if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { cstr_info->maxmarknum = 100 + (int) ((float) cstr_info->maxmarknum * 1.0F); cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum); } /* add the marker */ cstr_info->marker[cstr_info->marknum].type = type; cstr_info->marker[cstr_info->marknum].pos = pos; cstr_info->marker[cstr_info->marknum].len = len; cstr_info->marknum++; } static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) { opj_marker_info_t *marker; if (!cstr_info) return; /* expand the list? */ if ((cstr_info->tile[tileno].marknum + 1) > cstr_info->tile[tileno].maxmarknum) { cstr_info->tile[tileno].maxmarknum = 100 + (int) ((float) cstr_info->tile[tileno].maxmarknum * 1.0F); cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc(cstr_info->tile[tileno].marker, cstr_info->maxmarknum); } marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]); /* add the marker */ marker->type = type; marker->pos = pos; marker->len = len; cstr_info->tile[tileno].marknum++; } openjpeg-1.5.2/libopenjpeg/pi.c0000644000175000017500000007274212315002100016246 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * 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" /** @defgroup PI PI - Implementation of a packet iterator */ /*@{*/ /** @name Local static functions */ /*@{*/ /** Get next packet in layer-resolution-component-precinct order. @param pi packet iterator to modify @return returns false if pi pointed to the last packet or else returns true */ static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi); /** Get next packet in resolution-layer-component-precinct order. @param pi packet iterator to modify @return returns false if pi pointed to the last packet or else returns true */ static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi); /** Get next packet in resolution-precinct-component-layer order. @param pi packet iterator to modify @return returns false if pi pointed to the last packet or else returns true */ static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi); /** Get next packet in precinct-component-resolution-layer order. @param pi packet iterator to modify @return returns false if pi pointed to the last packet or else returns true */ static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi); /** Get next packet in component-precinct-resolution-layer order. @param pi packet iterator to modify @return returns false if pi pointed to the last packet or else returns true */ static opj_bool pi_next_cprl(opj_pi_iterator_t * pi); /*@}*/ /*@}*/ /* ========================================================== local functions ========================================================== */ static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi) { opj_pi_comp_t *comp = NULL; opj_pi_resolution_t *res = NULL; long index = 0; if (!pi->first) { comp = &pi->comps[pi->compno]; res = &comp->resolutions[pi->resno]; goto LABEL_SKIP; } else { pi->first = 0; } for (pi->layno = pi->poc.layno0; 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]; if (!pi->tp_on){ pi->poc.precno1 = res->pw * res->ph; } for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; if (!pi->include[index]) { pi->include[index] = 1; return OPJ_TRUE; } LABEL_SKIP:; } } } } return OPJ_FALSE; } static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi) { opj_pi_comp_t *comp = NULL; opj_pi_resolution_t *res = NULL; long index = 0; if (!pi->first) { comp = &pi->comps[pi->compno]; res = &comp->resolutions[pi->resno]; goto LABEL_SKIP; } else { pi->first = 0; } for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { for (pi->layno = pi->poc.layno0; 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]; if(!pi->tp_on){ pi->poc.precno1 = res->pw * res->ph; } for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; if (!pi->include[index]) { pi->include[index] = 1; return OPJ_TRUE; } LABEL_SKIP:; } } } } return OPJ_FALSE; } static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi) { opj_pi_comp_t *comp = NULL; opj_pi_resolution_t *res = NULL; long index = 0; if (!pi->first) { goto LABEL_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); } } } if (!pi->tp_on){ pi->poc.ty0 = pi->ty0; pi->poc.tx0 = pi->tx0; pi->poc.ty1 = pi->ty1; pi->poc.tx1 = pi->tx1; } for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->x = pi->poc.tx0; pi->x < pi->poc.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; 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); try1 = int_ceildiv(pi->ty1, comp->dy << levelno); rpx = res->pdx + levelno; rpy = res->pdy + levelno; if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ continue; } if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ continue; } if ((res->pw==0)||(res->ph==0)) continue; if ((trx0==trx1)||(try0==try1)) continue; 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 = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; if (!pi->include[index]) { pi->include[index] = 1; return OPJ_TRUE; } LABEL_SKIP:; } } } } } return OPJ_FALSE; } static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi) { opj_pi_comp_t *comp = NULL; opj_pi_resolution_t *res = NULL; long index = 0; if (!pi->first) { comp = &pi->comps[pi->compno]; goto LABEL_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); } } } if (!pi->tp_on){ pi->poc.ty0 = pi->ty0; pi->poc.tx0 = pi->tx0; pi->poc.ty1 = pi->ty1; pi->poc.tx1 = pi->tx1; } for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->x = pi->poc.tx0; pi->x < pi->poc.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; 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); try1 = int_ceildiv(pi->ty1, comp->dy << levelno); rpx = res->pdx + levelno; rpy = res->pdy + levelno; if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ continue; } if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ continue; } if ((res->pw==0)||(res->ph==0)) continue; if ((trx0==trx1)||(try0==try1)) continue; 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 = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; if (!pi->include[index]) { pi->include[index] = 1; return OPJ_TRUE; } LABEL_SKIP:; } } } } } return OPJ_FALSE; } static opj_bool pi_next_cprl(opj_pi_iterator_t * pi) { opj_pi_comp_t *comp = NULL; opj_pi_resolution_t *res = NULL; long index = 0; if (!pi->first) { comp = &pi->comps[pi->compno]; goto LABEL_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); } if (!pi->tp_on){ pi->poc.ty0 = pi->ty0; pi->poc.tx0 = pi->tx0; pi->poc.ty1 = pi->ty1; pi->poc.tx1 = pi->tx1; } for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->x = pi->poc.tx0; pi->x < pi->poc.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; 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); try1 = int_ceildiv(pi->ty1, comp->dy << levelno); rpx = res->pdx + levelno; rpy = res->pdy + levelno; if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){ continue; } if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ continue; } if ((res->pw==0)||(res->ph==0)) continue; if ((trx0==trx1)||(try0==try1)) continue; 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 = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; if (!pi->include[index]) { pi->include[index] = 1; return OPJ_TRUE; } LABEL_SKIP:; } } } } } return OPJ_FALSE; } /* ========================================================== Packet iterator interface ========================================================== */ opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { int p, q; int compno, resno, pino; opj_pi_iterator_t *pi = NULL; opj_tcp_t *tcp = NULL; opj_tccp_t *tccp = NULL; tcp = &cp->tcps[tileno]; pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); if(!pi) { /* TODO: throw an error */ return NULL; } for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ int maxres = 0; int maxprec = 0; p = tileno % cp->tw; q = tileno / cp->tw; pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); pi[pino].numcomps = image->numcomps; pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); if(!pi[pino].comps) { /* TODO: throw an error */ pi_destroy(pi, cp, tileno); return NULL; } for (compno = 0; compno < pi->numcomps; compno++) { int tcx0, tcy0, tcx1, tcy1; opj_pi_comp_t *comp = &pi[pino].comps[compno]; tccp = &tcp->tccps[compno]; comp->dx = image->comps[compno].dx; comp->dy = image->comps[compno].dy; comp->numresolutions = tccp->numresolutions; comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, sizeof(opj_pi_resolution_t)); if(!comp->resolutions) { /* TODO: throw an error */ pi_destroy(pi, cp, tileno); return NULL; } 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; opj_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); res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); if (res->pw*res->ph > maxprec) { maxprec = res->pw*res->ph; } } } tccp = &tcp->tccps[0]; pi[pino].step_p = 1; pi[pino].step_c = maxprec * pi[pino].step_p; pi[pino].step_r = image->numcomps * pi[pino].step_c; pi[pino].step_l = maxres * pi[pino].step_r; if (pino == 0) { pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * tcp->numlayers * maxprec, sizeof(short int)); if(!pi[pino].include) { /* TODO: throw an error */ pi_destroy(pi, cp, tileno); return NULL; } } 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 = image->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; } pi[pino].poc.layno0 = 0; pi[pino].poc.precno0 = 0; pi[pino].poc.precno1 = maxprec; } return pi; } opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ int p, q, pino; int compno, resno; int maxres = 0; int maxprec = 0; opj_pi_iterator_t *pi = NULL; opj_tcp_t *tcp = NULL; opj_tccp_t *tccp = NULL; tcp = &cp->tcps[tileno]; pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), sizeof(opj_pi_iterator_t)); if(!pi) { return NULL;} pi->tp_on = cp->tp_on; for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ p = tileno % cp->tw; q = tileno / cp->tw; pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); pi[pino].numcomps = image->numcomps; pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t)); if(!pi[pino].comps) { pi_destroy(pi, cp, tileno); return NULL; } for (compno = 0; compno < pi[pino].numcomps; compno++) { int tcx0, tcy0, tcx1, tcy1; opj_pi_comp_t *comp = &pi[pino].comps[compno]; tccp = &tcp->tccps[compno]; comp->dx = image->comps[compno].dx; comp->dy = image->comps[compno].dy; comp->numresolutions = tccp->numresolutions; comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * sizeof(opj_pi_resolution_t)); if(!comp->resolutions) { pi_destroy(pi, cp, tileno); return NULL; } tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); tcy1 = int_ceildiv(pi[pino].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; opj_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); res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); if (res->pw*res->ph > maxprec) { maxprec = res->pw * res->ph; } } } tccp = &tcp->tccps[0]; pi[pino].step_p = 1; pi[pino].step_c = maxprec * pi[pino].step_p; pi[pino].step_r = image->numcomps * pi[pino].step_c; pi[pino].step_l = maxres * pi[pino].step_r; for (compno = 0; compno < pi->numcomps; compno++) { opj_pi_comp_t *comp = &pi->comps[compno]; for (resno = 0; resno < comp->numresolutions; resno++) { int dx, dy; opj_pi_resolution_t *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[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); } } if (pino == 0) { pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, sizeof(short int)); if(!pi[pino].include) { pi_destroy(pi, cp, tileno); return NULL; } } else { pi[pino].include = pi[pino - 1].include; } /* Generation of boundaries for each prog flag*/ if(tcp->POC && ( cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))){ tcp->pocs[pino].compS= tcp->pocs[pino].compno0; tcp->pocs[pino].compE= tcp->pocs[pino].compno1; tcp->pocs[pino].resS = tcp->pocs[pino].resno0; tcp->pocs[pino].resE = tcp->pocs[pino].resno1; tcp->pocs[pino].layE = tcp->pocs[pino].layno1; tcp->pocs[pino].prg = tcp->pocs[pino].prg1; if (pino > 0) tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; }else { tcp->pocs[pino].compS= 0; tcp->pocs[pino].compE= image->numcomps; tcp->pocs[pino].resS = 0; tcp->pocs[pino].resE = maxres; tcp->pocs[pino].layS = 0; tcp->pocs[pino].layE = tcp->numlayers; tcp->pocs[pino].prg = tcp->prg; } tcp->pocs[pino].prcS = 0; tcp->pocs[pino].prcE = maxprec;; tcp->pocs[pino].txS = pi[pino].tx0; tcp->pocs[pino].txE = pi[pino].tx1; tcp->pocs[pino].tyS = pi[pino].ty0; tcp->pocs[pino].tyE = pi[pino].ty1; tcp->pocs[pino].dx = pi[pino].dx; tcp->pocs[pino].dy = pi[pino].dy; } return pi; } void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { int compno, pino; opj_tcp_t *tcp = &cp->tcps[tileno]; if(pi) { for (pino = 0; pino < tcp->numpocs + 1; pino++) { if(pi[pino].comps) { for (compno = 0; compno < pi->numcomps; compno++) { opj_pi_comp_t *comp = &pi[pino].comps[compno]; if(comp->resolutions) { opj_free(comp->resolutions); } } opj_free(pi[pino].comps); } } if(pi->include) { opj_free(pi->include); } opj_free(pi); } } opj_bool pi_next(opj_pi_iterator_t * pi) { switch (pi->poc.prg) { case LRCP: return pi_next_lrcp(pi); case RLCP: return pi_next_rlcp(pi); case RPCL: return pi_next_rpcl(pi); case PCRL: return pi_next_pcrl(pi); case CPRL: return pi_next_cprl(pi); case PROG_UNKNOWN: return OPJ_FALSE; } return OPJ_FALSE; } opj_bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){ char prog[4]; int i; int incr_top=1,resetX=0; opj_tcp_t *tcps =&cp->tcps[tileno]; opj_poc_t *tcp= &tcps->pocs[pino]; pi[pino].first = 1; pi[pino].poc.prg = tcp->prg; switch(tcp->prg){ case CPRL: strncpy(prog, "CPRL",4); break; case LRCP: strncpy(prog, "LRCP",4); break; case PCRL: strncpy(prog, "PCRL",4); break; case RLCP: strncpy(prog, "RLCP",4); break; case RPCL: strncpy(prog, "RPCL",4); break; case PROG_UNKNOWN: return OPJ_TRUE; } if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){ pi[pino].poc.resno0 = tcp->resS; pi[pino].poc.resno1 = tcp->resE; pi[pino].poc.compno0 = tcp->compS; pi[pino].poc.compno1 = tcp->compE; pi[pino].poc.layno0 = tcp->layS; pi[pino].poc.layno1 = tcp->layE; pi[pino].poc.precno0 = tcp->prcS; pi[pino].poc.precno1 = tcp->prcE; pi[pino].poc.tx0 = tcp->txS; pi[pino].poc.ty0 = tcp->tyS; pi[pino].poc.tx1 = tcp->txE; pi[pino].poc.ty1 = tcp->tyE; }else { if( tpnum < cur_totnum_tp){ for(i=3;i>=0;i--){ switch(prog[i]){ case 'C': if (i > tppos){ pi[pino].poc.compno0 = tcp->compS; pi[pino].poc.compno1 = tcp->compE; }else{ if (tpnum == 0){ tcp->comp_t = tcp->compS; pi[pino].poc.compno0 = tcp->comp_t; pi[pino].poc.compno1 = tcp->comp_t+1; tcp->comp_t+=1; }else{ if (incr_top == 1){ if(tcp->comp_t ==tcp->compE){ tcp->comp_t = tcp->compS; pi[pino].poc.compno0 = tcp->comp_t; pi[pino].poc.compno1 = tcp->comp_t+1; tcp->comp_t+=1; incr_top=1; }else{ pi[pino].poc.compno0 = tcp->comp_t; pi[pino].poc.compno1 = tcp->comp_t+1; tcp->comp_t+=1; incr_top=0; } }else{ pi[pino].poc.compno0 = tcp->comp_t-1; pi[pino].poc.compno1 = tcp->comp_t; } } } break; case 'R': if (i > tppos){ pi[pino].poc.resno0 = tcp->resS; pi[pino].poc.resno1 = tcp->resE; }else{ if (tpnum == 0){ tcp->res_t = tcp->resS; pi[pino].poc.resno0 = tcp->res_t; pi[pino].poc.resno1 = tcp->res_t+1; tcp->res_t+=1; }else{ if (incr_top == 1){ if(tcp->res_t==tcp->resE){ tcp->res_t = tcp->resS; pi[pino].poc.resno0 = tcp->res_t; pi[pino].poc.resno1 = tcp->res_t+1; tcp->res_t+=1; incr_top=1; }else{ pi[pino].poc.resno0 = tcp->res_t; pi[pino].poc.resno1 = tcp->res_t+1; tcp->res_t+=1; incr_top=0; } }else{ pi[pino].poc.resno0 = tcp->res_t - 1; pi[pino].poc.resno1 = tcp->res_t; } } } break; case 'L': if (i > tppos){ pi[pino].poc.layno0 = tcp->layS; pi[pino].poc.layno1 = tcp->layE; }else{ if (tpnum == 0){ tcp->lay_t = tcp->layS; pi[pino].poc.layno0 = tcp->lay_t; pi[pino].poc.layno1 = tcp->lay_t+1; tcp->lay_t+=1; }else{ if (incr_top == 1){ if(tcp->lay_t == tcp->layE){ tcp->lay_t = tcp->layS; pi[pino].poc.layno0 = tcp->lay_t; pi[pino].poc.layno1 = tcp->lay_t+1; tcp->lay_t+=1; incr_top=1; }else{ pi[pino].poc.layno0 = tcp->lay_t; pi[pino].poc.layno1 = tcp->lay_t+1; tcp->lay_t+=1; incr_top=0; } }else{ pi[pino].poc.layno0 = tcp->lay_t - 1; pi[pino].poc.layno1 = tcp->lay_t; } } } break; case 'P': switch(tcp->prg){ case LRCP: case RLCP: if (i > tppos){ pi[pino].poc.precno0 = tcp->prcS; pi[pino].poc.precno1 = tcp->prcE; }else{ if (tpnum == 0){ tcp->prc_t = tcp->prcS; pi[pino].poc.precno0 = tcp->prc_t; pi[pino].poc.precno1 = tcp->prc_t+1; tcp->prc_t+=1; }else{ if (incr_top == 1){ if(tcp->prc_t == tcp->prcE){ tcp->prc_t = tcp->prcS; pi[pino].poc.precno0 = tcp->prc_t; pi[pino].poc.precno1 = tcp->prc_t+1; tcp->prc_t+=1; incr_top=1; }else{ pi[pino].poc.precno0 = tcp->prc_t; pi[pino].poc.precno1 = tcp->prc_t+1; tcp->prc_t+=1; incr_top=0; } }else{ pi[pino].poc.precno0 = tcp->prc_t - 1; pi[pino].poc.precno1 = tcp->prc_t; } } } break; default: if (i > tppos){ pi[pino].poc.tx0 = tcp->txS; pi[pino].poc.ty0 = tcp->tyS; pi[pino].poc.tx1 = tcp->txE; pi[pino].poc.ty1 = tcp->tyE; }else{ if (tpnum == 0){ tcp->tx0_t = tcp->txS; tcp->ty0_t = tcp->tyS; pi[pino].poc.tx0 = tcp->tx0_t; pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); pi[pino].poc.ty0 = tcp->ty0_t; pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); tcp->tx0_t = pi[pino].poc.tx1; tcp->ty0_t = pi[pino].poc.ty1; }else{ if (incr_top == 1){ if(tcp->tx0_t >= tcp->txE){ if(tcp->ty0_t >= tcp->tyE){ tcp->ty0_t = tcp->tyS; pi[pino].poc.ty0 = tcp->ty0_t; pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); tcp->ty0_t = pi[pino].poc.ty1; incr_top=1;resetX=1; }else{ pi[pino].poc.ty0 = tcp->ty0_t; pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); tcp->ty0_t = pi[pino].poc.ty1; incr_top=0;resetX=1; } if(resetX==1){ tcp->tx0_t = tcp->txS; pi[pino].poc.tx0 = tcp->tx0_t; pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); tcp->tx0_t = pi[pino].poc.tx1; } }else{ pi[pino].poc.tx0 = tcp->tx0_t; pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); tcp->tx0_t = pi[pino].poc.tx1; pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); pi[pino].poc.ty1 = tcp->ty0_t ; incr_top=0; } }else{ pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); pi[pino].poc.tx1 = tcp->tx0_t ; pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); pi[pino].poc.ty1 = tcp->ty0_t ; } } } break; } break; } } } } return OPJ_FALSE; } openjpeg-1.5.2/libopenjpeg/tcd.h0000644000175000017500000002231012315002100016377 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __TCD_H #define __TCD_H /** @file tcd.h @brief Implementation of a tile coder/decoder (TCD) The functions in TCD.C have for goal to encode or decode each tile independently from each other. The functions in TCD.C are used by some function in J2K.C. */ /** @defgroup TCD TCD - Implementation of a tile coder/decoder */ /*@{*/ /** FIXME: documentation */ typedef struct opj_tcd_seg { unsigned char** data; int dataindex; int numpasses; int len; int maxpasses; int numnewpasses; int newlen; } opj_tcd_seg_t; /** FIXME: documentation */ typedef struct opj_tcd_pass { int rate; double distortiondec; int term, len; } opj_tcd_pass_t; /** FIXME: documentation */ typedef struct opj_tcd_layer { int numpasses; /* Number of passes in the layer */ int len; /* len of information */ double disto; /* add for index (Cfr. Marcela) */ unsigned char *data; /* data */ } opj_tcd_layer_t; /** FIXME: documentation */ typedef struct opj_tcd_cblk_enc { unsigned char* data; /* Data */ opj_tcd_layer_t* layers; /* layer information */ opj_tcd_pass_t* passes; /* information about the passes */ int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ int numbps; int numlenbits; int numpasses; /* number of pass already done for the code-blocks */ int numpassesinlayers; /* number of passes in the layer */ int totalpasses; /* total number of passes */ } opj_tcd_cblk_enc_t; typedef struct opj_tcd_cblk_dec { unsigned char* data; /* Data */ opj_tcd_seg_t* segs; /* segments informations */ int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ int numbps; int numlenbits; int len; /* length */ int numnewpasses; /* number of pass added to the code-blocks */ int numsegs; /* number of segments */ } opj_tcd_cblk_dec_t; /** FIXME: documentation */ typedef struct opj_tcd_precinct { int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ int cw, ch; /* number of precinct in width and heigth */ union{ /* code-blocks informations */ opj_tcd_cblk_enc_t* enc; opj_tcd_cblk_dec_t* dec; } cblks; opj_tgt_tree_t *incltree; /* inclusion tree */ opj_tgt_tree_t *imsbtree; /* IMSB tree */ } opj_tcd_precinct_t; /** FIXME: documentation */ typedef struct opj_tcd_band { int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ int bandno; opj_tcd_precinct_t *precincts; /* precinct information */ int numbps; float stepsize; } opj_tcd_band_t; /** FIXME: documentation */ typedef struct opj_tcd_resolution { int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ int pw, ph; int numbands; /* number sub-band for the resolution level */ opj_tcd_band_t bands[3]; /* subband information */ } opj_tcd_resolution_t; /** FIXME: documentation */ typedef struct opj_tcd_tilecomp { int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ int numresolutions; /* number of resolutions level */ opj_tcd_resolution_t *resolutions; /* resolutions information */ int *data; /* data of the component */ int numpix; /* add fixed_quality */ } opj_tcd_tilecomp_t; /** FIXME: documentation */ typedef struct opj_tcd_tile { int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ int numcomps; /* number of components in tile */ opj_tcd_tilecomp_t *comps; /* Components information */ int numpix; /* add fixed_quality */ double distotile; /* add fixed_quality */ double distolayer[100]; /* add fixed_quality */ /** packet number */ int packno; } opj_tcd_tile_t; /** FIXME: documentation */ typedef struct opj_tcd_image { int tw, th; /* number of tiles in width and heigth */ opj_tcd_tile_t *tiles; /* Tiles information */ } opj_tcd_image_t; /** Tile coder/decoder */ typedef struct opj_tcd { /** Position of the tilepart flag in Progression order*/ int tp_pos; /** Tile part number*/ int tp_num; /** Current tile part number*/ int cur_tp_num; /** Total number of tileparts of the current tile*/ int cur_totnum_tp; /** Current Packet iterator number */ int cur_pino; /** codec context */ opj_common_ptr cinfo; /** info on each image tile */ opj_tcd_image_t *tcd_image; /** image */ opj_image_t *image; /** coding parameters */ opj_cp_t *cp; /** pointer to the current encoded/decoded tile */ opj_tcd_tile_t *tcd_tile; /** coding/decoding parameters common to all tiles */ opj_tcp_t *tcp; /** current encoded/decoded tile */ int tcd_tileno; /** Time taken to encode a tile*/ double encoding_time; } opj_tcd_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Dump the content of a tcd structure */ void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); /** Create a new TCD handle @param cinfo Codec context info @return Returns a new TCD handle if successful returns NULL otherwise */ opj_tcd_t* tcd_create(opj_common_ptr cinfo); /** Destroy a previously created TCD handle @param tcd TCD handle to destroy */ void tcd_destroy(opj_tcd_t *tcd); /** Initialize the tile coder (allocate the memory) @param tcd TCD handle @param image Raw image @param cp Coding parameters @param curtileno Number that identifies the tile that will be encoded */ void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); /** Free the memory allocated for encoding @param tcd TCD handle */ void tcd_free_encode(opj_tcd_t *tcd); /** Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) @param tcd TCD handle @param image Raw image @param cp Coding parameters @param curtileno Number that identifies the tile that will be encoded */ void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); /** Initialize the tile decoder @param tcd TCD handle @param image Raw image @param cp Coding parameters */ void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info); void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); void tcd_rateallocate_fixed(opj_tcd_t *tcd); void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); /** Encode a tile from the raw image into a buffer @param tcd TCD handle @param tileno Number that identifies one of the tiles to be encoded @param dest Destination buffer @param len Length of destination buffer @param cstr_info Codestream information structure @return */ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info); /** Decode a tile from a buffer into a raw image @param tcd TCD handle @param src Source buffer @param len Length of source buffer @param tileno Number that identifies one of the tiles to be decoded @param cstr_info Codestream information structure */ opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info); /** Free the memory allocated for decoding @param tcd TCD handle */ void tcd_free_decode(opj_tcd_t *tcd); void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __TCD_H */ openjpeg-1.5.2/libopenjpeg/int.h0000644000175000017500000000674212315002100016432 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __INT_H #define __INT_H /** @file int.h @brief Implementation of operations on integers (INT) The functions in INT.H have for goal to realize operations on integers. */ /** @defgroup INT INT - Implementation of operations on integers */ /*@{*/ /** @name Exported functions (see also openjpeg.h) */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Get the minimum of two integers @return Returns a if a < b else b */ static INLINE int int_min(int a, int b) { return a < b ? a : b; } /** Get the maximum of two integers @return Returns a if a > b else b */ static INLINE int int_max(int a, int b) { return (a > b) ? a : b; } /** Clamp an integer inside an interval @return

  • Returns a if (min < a < max)
  • Returns max if (a > max)
  • Returns min if (a < min)
*/ static INLINE int int_clamp(int a, int min, int max) { if (a < min) return min; if (a > max) return max; return a; } /** @return Get absolute value of integer */ static INLINE int int_abs(int a) { return a < 0 ? -a : a; } /** Divide an integer and round upwards @return Returns a divided by b */ static INLINE int int_ceildiv(int a, int b) { return (a + b - 1) / b; } /** Divide an integer by a power of 2 and round upwards @return Returns a divided by 2^b */ static INLINE int int_ceildivpow2(int a, int b) { return (a + (1 << b) - 1) >> b; } /** Divide an integer by a power of 2 and round downwards @return Returns a divided by 2^b */ static INLINE int int_floordivpow2(int a, int b) { return a >> b; } /** Get logarithm of an integer and round downwards @return Returns log2(a) */ static INLINE int int_floorlog2(int a) { int l; for (l = 0; a > 1; l++) { a >>= 1; } return l; } /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif openjpeg-1.5.2/libopenjpeg/opj_includes.h0000644000175000017500000000716712315002100020320 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 OPJ_INCLUDES_H #define OPJ_INCLUDES_H /* ========================================================== Standard includes used by the library ========================================================== */ #include #include #include #include #include #include #include #include #include /* ========================================================== OpenJPEG interface ========================================================== */ #include "openjpeg.h" /* ========================================================== OpenJPEG modules ========================================================== */ /* Ignore GCC attributes if this is not GCC */ #ifndef __GNUC__ #define __attribute__(x) /* __attribute__(x) */ #endif /* The inline keyword is supported by C99 but not by C90. Most compilers implement their own version of this keyword ... */ #ifndef INLINE #if defined(_MSC_VER) #define INLINE __forceinline #elif defined(__GNUC__) #define INLINE __inline__ #elif defined(__MWERKS__) #define INLINE inline #else /* add other compilers here ... */ #define INLINE #endif /* defined() */ #endif /* INLINE */ /* Are restricted pointers available? (C99) */ #if (__STDC_VERSION__ != 199901L) /* Not a C99 compiler */ #ifdef __GNUC__ #define restrict __restrict__ #else #define restrict /* restrict */ #endif #endif /* MSVC and Borland C do not have lrintf */ #if defined(_MSC_VER) || defined(__BORLANDC__) static INLINE long lrintf(float f){ #ifdef _M_IX86 long int i; _asm{ fld f fistp i }; return i; #else return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); #endif /* _M_IX86 */ } #endif #include "j2k_lib.h" #include "opj_malloc.h" #include "event.h" #include "bio.h" #include "cio.h" #include "image.h" #include "j2k.h" #include "jp2.h" #include "jpt.h" #include "mqc.h" #include "raw.h" #include "bio.h" #include "tgt.h" #include "pi.h" #include "tcd.h" #include "t1.h" #include "dwt.h" #include "t2.h" #include "mct.h" #include "int.h" #include "fix.h" #include "cidx_manager.h" #include "indexbox_manager.h" /* JPWL>> */ #ifdef USE_JPWL #include "./jpwl/jpwl.h" #endif /* USE_JPWL */ /* <buf = (bio->buf << 8) & 0xffff; bio->ct = bio->buf == 0xff00 ? 7 : 8; if (bio->bp >= bio->end) { return 1; } *bio->bp++ = (unsigned char)(bio->buf >> 8); return 0; } static int bio_bytein(opj_bio_t *bio) { 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; } static void bio_putbit(opj_bio_t *bio, unsigned int b) { if (bio->ct == 0) { bio_byteout(bio); } bio->ct--; bio->buf |= b << bio->ct; } static int bio_getbit(opj_bio_t *bio) { if (bio->ct == 0) { bio_bytein(bio); } bio->ct--; return (bio->buf >> bio->ct) & 1; } /* ========================================================== Bit Input/Output interface ========================================================== */ opj_bio_t* bio_create(void) { opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); return bio; } void bio_destroy(opj_bio_t *bio) { if(bio) { opj_free(bio); } } int bio_numbytes(opj_bio_t *bio) { return (int)(bio->bp - bio->start); } void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { bio->start = bp; bio->end = bp + len; bio->bp = bp; bio->buf = 0; bio->ct = 8; } void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { bio->start = bp; bio->end = bp + len; bio->bp = bp; bio->buf = 0; bio->ct = 0; } void bio_write(opj_bio_t *bio, int v, int n) { int i; for (i = n - 1; i >= 0; i--) { bio_putbit(bio, (v >> i) & 1); } } int bio_read(opj_bio_t *bio, int n) { int i, v; v = 0; for (i = n - 1; i >= 0; i--) { v += bio_getbit(bio) << i; } return v; } int bio_flush(opj_bio_t *bio) { bio->ct = 0; if (bio_byteout(bio)) { return 1; } if (bio->ct == 7) { bio->ct = 0; if (bio_byteout(bio)) { return 1; } } return 0; } int bio_inalign(opj_bio_t *bio) { bio->ct = 0; if ((bio->buf & 0xff) == 0xff) { if (bio_bytein(bio)) { return 1; } bio->ct = 0; } return 0; } openjpeg-1.5.2/libopenjpeg/mct.h0000644000175000017500000000743212315002100016420 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file mct.h @brief Implementation of a multi-component transforms (MCT) The functions in MCT.C have for goal to realize reversible and irreversible multicomponent transform. The functions in MCT.C are used by some function in TCD.C. */ /** @defgroup MCT MCT - Implementation of a multi-component transform */ /*@{*/ /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Apply a reversible multi-component transform to an image @param c0 Samples for red component @param c1 Samples for green component @param c2 Samples blue component @param n Number of samples for each component */ void mct_encode(int *c0, int *c1, int *c2, int n); /** Apply a reversible multi-component inverse transform to an image @param c0 Samples for luminance component @param c1 Samples for red chrominance component @param c2 Samples for blue chrominance component @param n Number of samples for each component */ void mct_decode(int *c0, int *c1, int *c2, int n); /** Get norm of the basis function used for the reversible multi-component transform @param compno Number of the component (0->Y, 1->U, 2->V) @return */ double mct_getnorm(int compno); /** Apply an irreversible multi-component transform to an image @param c0 Samples for red component @param c1 Samples for green component @param c2 Samples blue component @param 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 @param c0 Samples for luminance component @param c1 Samples for red chrominance component @param c2 Samples for blue chrominance component @param n Number of samples for each component */ void mct_decode_real(float* c0, float* c1, float* c2, int n); /** Get norm of the basis function used for the irreversible multi-component transform @param compno Number of the component (0->Y, 1->U, 2->V) @return */ double mct_getnorm_real(int compno); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __MCT_H */ openjpeg-1.5.2/libopenjpeg/j2k.h0000644000175000017500000003711712315002100016326 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * 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 __J2K_H #define __J2K_H /** @file j2k.h @brief The JPEG-2000 Codestream Reader/Writer (J2K) The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. */ /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ /*@{*/ #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 /**< Selective arithmetic coding bypass */ #define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */ #define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */ #define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */ #define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */ #define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */ #define J2K_CCP_QNTSTY_NOQNT 0 #define J2K_CCP_QNTSTY_SIQNT 1 #define J2K_CCP_QNTSTY_SEQNT 2 /* ----------------------------------------------------------------------- */ #define J2K_MS_SOC 0xff4f /**< SOC marker value */ #define J2K_MS_SOT 0xff90 /**< SOT marker value */ #define J2K_MS_SOD 0xff93 /**< SOD marker value */ #define J2K_MS_EOC 0xffd9 /**< EOC marker value */ #define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ #define J2K_MS_COD 0xff52 /**< COD marker value */ #define J2K_MS_COC 0xff53 /**< COC marker value */ #define J2K_MS_RGN 0xff5e /**< RGN marker value */ #define J2K_MS_QCD 0xff5c /**< QCD marker value */ #define J2K_MS_QCC 0xff5d /**< QCC marker value */ #define J2K_MS_POC 0xff5f /**< POC marker value */ #define J2K_MS_TLM 0xff55 /**< TLM marker value */ #define J2K_MS_PLM 0xff57 /**< PLM marker value */ #define J2K_MS_PLT 0xff58 /**< PLT marker value */ #define J2K_MS_PPM 0xff60 /**< PPM marker value */ #define J2K_MS_PPT 0xff61 /**< PPT marker value */ #define J2K_MS_SOP 0xff91 /**< SOP marker value */ #define J2K_MS_EPH 0xff92 /**< EPH marker value */ #define J2K_MS_CRG 0xff63 /**< CRG marker value */ #define J2K_MS_COM 0xff64 /**< COM marker value */ /* UniPG>> */ #ifdef USE_JPWL #define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ #define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ #define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ #define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ #endif /* USE_JPWL */ #ifdef USE_JPSEC #define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ #define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ #endif /* USE_JPSEC */ /* < there was a PPT marker for the present tile */ int ppt; /** used in case of multiple marker PPT (number of info already stored) */ int ppt_store; /** ppmbug1 */ int ppt_len; /** add fixed_quality */ float distoratio[100]; /** tile-component coding parameters */ opj_tccp_t *tccps; } opj_tcp_t; /** Coding parameters */ typedef struct opj_cp { /** Digital cinema profile*/ OPJ_CINEMA_MODE cinema; /** Maximum rate for each component. If == 0, component size limitation is not considered */ int max_comp_size; /** Size of the image in bits*/ int img_size; /** Rsiz*/ OPJ_RSIZ_CAPABILITIES rsiz; /** Enabling Tile part generation*/ char tp_on; /** Flag determining tile part generation*/ char tp_flag; /** Position of tile part flag in progression order*/ int tp_pos; /** allocation by rate/distortion */ int disto_alloc; /** allocation by fixed layer */ int fixed_alloc; /** add fixed_quality */ int fixed_quality; /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ int reduce; /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ int layer; /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ OPJ_LIMIT_DECODING limit_decoding; /** XTOsiz */ int tx0; /** YTOsiz */ int ty0; /** XTsiz */ int tdx; /** YTsiz */ int tdy; /** comment for coding */ char *comment; /** number of tiles in width */ int tw; /** number of tiles in heigth */ int th; /** ID number of the tiles present in the codestream */ int *tileno; /** size of the vector tileno */ int tileno_size; /** packet header store there for futur use in t2_decode_packet */ unsigned char *ppm_data; /** pointer remaining on the first byte of the first header if ppm is used */ unsigned char *ppm_data_first; /** if ppm == 1 --> there was a PPM marker for the present tile */ int ppm; /** use in case of multiple marker PPM (number of info already store) */ int ppm_store; /** use in case of multiple marker PPM (case on non-finished previous info) */ int ppm_previous; /** ppmbug1 */ int ppm_len; /** tile coding parameters */ opj_tcp_t *tcps; /** fixed layer */ int *matrice; /* UniPG>> */ #ifdef USE_JPWL /** enables writing of EPC in MH, thus activating JPWL */ opj_bool epc_on; /** enables writing of EPB, in case of activated JPWL */ opj_bool epb_on; /** enables writing of ESD, in case of activated JPWL */ opj_bool esd_on; /** enables writing of informative techniques of ESD, in case of activated JPWL */ opj_bool info_on; /** enables writing of RED, in case of activated JPWL */ opj_bool red_on; /** error protection method for MH (0,1,16,32,37-128) */ int hprot_MH; /** tile number of header protection specification (>=0) */ int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** error protection methods for TPHs (0,1,16,32,37-128) */ int hprot_TPH[JPWL_MAX_NO_TILESPECS]; /** tile number of packet protection specification (>=0) */ int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; /** packet number of packet protection specification (>=0) */ int pprot_packno[JPWL_MAX_NO_PACKSPECS]; /** error protection methods for packets (0,1,16,32,37-128) */ int pprot[JPWL_MAX_NO_PACKSPECS]; /** enables writing of ESD, (0/2/4 bytes) */ int sens_size; /** sensitivity addressing size (0=auto/2/4 bytes) */ int sens_addr; /** sensitivity range (0-3) */ int sens_range; /** sensitivity method for MH (-1,0-7) */ int sens_MH; /** tile number of sensitivity specification (>=0) */ int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** sensitivity methods for TPHs (-1,0-7) */ int sens_TPH[JPWL_MAX_NO_TILESPECS]; /** enables JPWL correction at the decoder */ opj_bool correct; /** expected number of components at the decoder */ int exp_comps; /** maximum number of tiles at the decoder */ int max_tiles; #endif /* USE_JPWL */ /* <cp. @param j2k J2K decompressor handle @param parameters decompression parameters */ void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); /** Decode an image from a JPEG-2000 codestream @param j2k J2K decompressor handle @param cio Input buffer stream @param cstr_info Codestream information structure if required, NULL otherwise @return Returns a decoded image if successful, returns NULL otherwise */ opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); /** Decode an image form a JPT-stream (JPEG 2000, JPIP) @param j2k J2K decompressor handle @param cio Input buffer stream @param cstr_info Codestream information structure if required, NULL otherwise @return Returns a decoded image if successful, returns NULL otherwise */ opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info); /** Creates a J2K compression structure @param cinfo Codec context info @return Returns a handle to a J2K compressor if successful, returns NULL otherwise */ opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); /** Destroy a J2K compressor handle @param j2k J2K compressor handle to destroy */ void j2k_destroy_compress(opj_j2k_t *j2k); /** Setup the encoder parameters using the current image and using user parameters. Coding parameters are returned in j2k->cp. @param j2k J2K compressor handle @param parameters compression parameters @param image input filled image */ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image); /** Converts an enum type progression order to string type */ char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); /** Encode an image into a JPEG-2000 codestream @param j2k J2K compressor handle @param cio Output buffer stream @param image Image to encode @param cstr_info Codestream information structure if required, NULL otherwise @return Returns true if successful, returns false otherwise */ opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __J2K_H */ openjpeg-1.5.2/libopenjpeg/bio.h0000644000175000017500000000757012315002100016411 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file bio.h @brief Implementation of an individual bit input-output (BIO) The functions in BIO.C have for goal to realize an individual bit input - output. */ /** @defgroup BIO BIO - Individual bit input-output stream */ /*@{*/ /** Individual bit input-output stream (BIO) */ typedef struct opj_bio { /** pointer to the start of the buffer */ unsigned char *start; /** pointer to the end of the buffer */ unsigned char *end; /** pointer to the present position in the buffer */ unsigned char *bp; /** temporary place where each byte is read or written */ unsigned int buf; /** coder : number of bits free to write. decoder : number of bits read */ int ct; } opj_bio_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Create a new BIO handle @return Returns a new BIO handle if successful, returns NULL otherwise */ opj_bio_t* bio_create(void); /** Destroy a previously created BIO handle @param bio BIO handle to destroy */ void bio_destroy(opj_bio_t *bio); /** Number of bytes written. @param bio BIO handle @return Returns the number of bytes written */ int bio_numbytes(opj_bio_t *bio); /** Init encoder @param bio BIO handle @param bp Output buffer @param len Output buffer length */ void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); /** Init decoder @param bio BIO handle @param bp Input buffer @param len Input buffer length */ void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); /** Write bits @param bio BIO handle @param v Value of bits @param n Number of bits to write */ void bio_write(opj_bio_t *bio, int v, int n); /** Read bits @param bio BIO handle @param n Number of bits to read @return Returns the corresponding read number */ int bio_read(opj_bio_t *bio, int n); /** Flush bits @param bio BIO handle @return Returns 1 if successful, returns 0 otherwise */ int bio_flush(opj_bio_t *bio); /** Passes the ending bits (coming from flushing) @param bio BIO handle @return Returns 1 if successful, returns 0 otherwise */ int bio_inalign(opj_bio_t *bio); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __BIO_H */ openjpeg-1.5.2/libopenjpeg/openjpeg.h0000644000175000017500000007045512315002100017451 0ustar mathieumathieu /* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2010-2011, Kaori Hagihara * 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 /* ========================================================== Compiler directives ========================================================== */ #if defined(OPJ_STATIC) || !defined(_WIN32) #define OPJ_API #define OPJ_CALLCONV #else #define OPJ_CALLCONV __stdcall /* The following ifdef block is the standard way of creating macros which make exporting from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS symbol defined on the command line. this symbol should not be defined on any project that uses this DLL. This way any other project whose source files include this file see OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols defined with this macro as being exported. */ #if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) #define OPJ_API __declspec(dllexport) #else #define OPJ_API __declspec(dllimport) #endif /* OPJ_EXPORTS */ #endif /* !OPJ_STATIC || !_WIN32 */ typedef int opj_bool; #define OPJ_TRUE 1 #define OPJ_FALSE 0 /* Avoid compile-time warning because parameter is not used */ #define OPJ_ARG_NOT_USED(x) (void)(x) /* ========================================================== Useful constant definitions ========================================================== */ #define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ #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 */ /* UniPG>> */ #define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ #define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ #define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ #define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ #define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ #define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ #define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ #define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ /* <
  • Error messages
  • Warning messages
  • Debugging messages */ typedef struct opj_event_mgr { /** Error message callback if available, NULL otherwise */ opj_msg_callback error_handler; /** Warning message callback if available, NULL otherwise */ opj_msg_callback warning_handler; /** Debug message callback if available, NULL otherwise */ opj_msg_callback info_handler; } opj_event_mgr_t; /* ========================================================== codec typedef definitions ========================================================== */ /** Progression order changes */ typedef struct opj_poc { /** Resolution num start, Component num start, given by POC */ int resno0, compno0; /** Layer num end,Resolution num end, Component num end, given by POC */ int layno1, resno1, compno1; /** Layer num start,Precinct num start, Precinct num end */ int layno0, precno0, precno1; /** Progression order enum*/ OPJ_PROG_ORDER prg1,prg; /** Progression order string*/ char progorder[5]; /** Tile number */ int tile; /** Start and end values for Tile width and height*/ int tx0,tx1,ty0,ty1; /** Start value, initialised in pi_initialise_encode*/ int layS, resS, compS, prcS; /** End value, initialised in pi_initialise_encode */ int layE, resE, compE, prcE; /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ int txS,txE,tyS,tyE,dx,dy; /** Temporary values for Tile parts, initialised in pi_create_encode */ int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; } opj_poc_t; /** Compression parameters */ typedef struct opj_cparameters { /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ opj_bool tile_size_on; /** XTOsiz */ int cp_tx0; /** YTOsiz */ int cp_ty0; /** XTsiz */ int cp_tdx; /** YTsiz */ int cp_tdy; /** allocation by rate/distortion */ int cp_disto_alloc; /** allocation by fixed layer */ int cp_fixed_alloc; /** add fixed_quality */ int cp_fixed_quality; /** fixed layer */ int *cp_matrice; /** comment for coding */ char *cp_comment; /** csty : coding style */ int csty; /** progression order (default LRCP) */ OPJ_PROG_ORDER prog_order; /** progression order changes */ opj_poc_t POC[32]; /** number of progression order changes (POC), default to 0 */ int numpocs; /** number of layers */ int tcp_numlayers; /** rates of layers */ float tcp_rates[100]; /** different psnr for successive layers */ float tcp_distoratio[100]; /** number of resolutions */ int numresolution; /** initial code block width, default to 64 */ int cblockw_init; /** initial code block height, default to 64 */ int cblockh_init; /** mode switch (cblk_style) */ int mode; /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ int irreversible; /** region of interest: affected component in [0..3], -1 means no ROI */ int roi_compno; /** region of interest: upshift value */ int roi_shift; /* number of precinct size specifications */ int res_spec; /** initial precinct width */ int prcw_init[J2K_MAXRLVLS]; /** initial precinct height */ int prch_init[J2K_MAXRLVLS]; /**@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]; /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ int index_on; /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ char index[OPJ_PATH_LEN]; /** subimage encoding: origin image offset in x direction */ int image_offset_x0; /** subimage encoding: origin image offset in y direction */ int image_offset_y0; /** subsampling value for dx */ int subsampling_dx; /** subsampling value for dy */ int subsampling_dy; /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ int decod_format; /** output file format 0: J2K, 1: JP2, 2: JPT */ int cod_format; /*@}*/ /* UniPG>> */ /**@name JPWL encoding parameters */ /*@{*/ /** enables writing of EPC in MH, thus activating JPWL */ opj_bool jpwl_epc_on; /** error protection method for MH (0,1,16,32,37-128) */ int jpwl_hprot_MH; /** tile number of header protection specification (>=0) */ int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** error protection methods for TPHs (0,1,16,32,37-128) */ int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; /** tile number of packet protection specification (>=0) */ int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; /** packet number of packet protection specification (>=0) */ int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; /** error protection methods for packets (0,1,16,32,37-128) */ int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; /** enables writing of ESD, (0=no/1/2 bytes) */ int jpwl_sens_size; /** sensitivity addressing size (0=auto/2/4 bytes) */ int jpwl_sens_addr; /** sensitivity range (0-3) */ int jpwl_sens_range; /** sensitivity method for MH (-1=no,0-7) */ int jpwl_sens_MH; /** tile number of sensitivity specification (>=0) */ int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; /** sensitivity methods for TPHs (-1=no,0-7) */ int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; /*@}*/ /* <> */ /**@name JPWL decoding parameters */ /*@{*/ /** activates the JPWL correction capabilities */ opj_bool jpwl_correct; /** expected number of components */ int jpwl_exp_comps; /** maximum number of tiles */ int jpwl_max_tiles; /*@}*/ /* <> */ /** Marker structure */ typedef struct opj_marker_info_t { /** marker type */ unsigned short int type; /** position in codestream */ int pos; /** length, marker val included */ int len; } opj_marker_info_t; /* <> */ /** number of markers */ int marknum; /** list of markers */ opj_marker_info_t *marker; /** actual size of markers array */ int maxmarknum; /* <cp. @param dinfo decompressor handle @param parameters decompression parameters */ OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); /** Decode an image from a JPEG-2000 codestream @param dinfo decompressor handle @param cio Input buffer stream @return Returns a decoded image if successful, returns NULL otherwise */ OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); /** Decode an image from a JPEG-2000 codestream and extract the codestream information @param dinfo decompressor handle @param cio Input buffer stream @param cstr_info Codestream information structure if needed afterwards, NULL otherwise @return Returns a decoded image if successful, returns NULL otherwise */ OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info); /** Creates a J2K/JP2 compression structure @param format Coder to select @return Returns a handle to a compressor if successful, returns NULL otherwise */ OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); /** Destroy a compressor handle @param cinfo compressor handle to destroy */ OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); /** Set encoding parameters to default values, that means :
    • Lossless
    • 1 tile
    • Size of precinct : 2^15 x 2^15 (means 1 precinct)
    • Size of code-block : 64 x 64
    • Number of resolutions: 6
    • No SOP marker in the codestream
    • No EPH marker in the codestream
    • No sub-sampling in x or y direction
    • No mode switch activated
    • Progression order: LRCP
    • No index file
    • No ROI upshifted
    • No offset of the origin of the image
    • No offset of the origin of the tiles
    • Reversible DWT 5-3
    @param parameters Compression parameters */ OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); /** Setup the encoder parameters using the current image and using user parameters. @param cinfo Compressor handle @param parameters Compression parameters @param image Input filled image */ OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); /** Encode an image into a JPEG-2000 codestream 3@param cinfo compressor handle @param cio Output buffer stream @param image Image to encode @param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci() @return Returns true if successful, returns false otherwise */ OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); /** Encode an image into a JPEG-2000 codestream and extract the codestream information @param cinfo compressor handle @param cio Output buffer stream @param image Image to encode @param cstr_info Codestream information structure if needed afterwards, NULL otherwise @return Returns true if successful, returns false otherwise */ OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); /** Destroy Codestream information after compression or decompression @param cstr_info Codestream information structure */ OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info); #ifdef __cplusplus } #endif #endif /* OPENJPEG_H */ openjpeg-1.5.2/libopenjpeg/t1.c0000644000175000017500000011463312315002100016156 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2007, Callum Lerwick * 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 "t1_luts.h" /** @defgroup T1 T1 - Implementation of the tier-1 coding */ /*@{*/ /** @name Local static functions */ /*@{*/ static INLINE char t1_getctxno_zc(int f, int orient); static char t1_getctxno_sc(int f); static INLINE int t1_getctxno_mag(int f); static char t1_getspb(int f); static short t1_getnmsedec_sig(int x, int bitpos); static short t1_getnmsedec_ref(int x, int bitpos); static void t1_updateflags(flag_t *flagsp, int s, int stride); /** Encode significant pass */ static void t1_enc_sigpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int bpno, int one, int *nmsedec, char type, int vsc); /** Decode significant pass */ static INLINE void t1_dec_sigpass_step_raw( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int vsc); static INLINE void t1_dec_sigpass_step_mqc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf); static INLINE void t1_dec_sigpass_step_mqc_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int vsc); /** Encode significant pass */ static void t1_enc_sigpass( opj_t1_t *t1, int bpno, int orient, int *nmsedec, char type, int cblksty); /** Decode significant pass */ static void t1_dec_sigpass_raw( opj_t1_t *t1, int bpno, int orient, int cblksty); static void t1_dec_sigpass_mqc( opj_t1_t *t1, int bpno, int orient); static void t1_dec_sigpass_mqc_vsc( opj_t1_t *t1, int bpno, int orient); /** Encode refinement pass */ static void t1_enc_refpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int bpno, int one, int *nmsedec, char type, int vsc); /** Decode refinement pass */ static INLINE void t1_dec_refpass_step_raw( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf, int vsc); static INLINE void t1_dec_refpass_step_mqc( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf); static INLINE void t1_dec_refpass_step_mqc_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf, int vsc); /** Encode refinement pass */ static void t1_enc_refpass( opj_t1_t *t1, int bpno, int *nmsedec, char type, int cblksty); /** Decode refinement pass */ static void t1_dec_refpass_raw( opj_t1_t *t1, int bpno, int cblksty); static void t1_dec_refpass_mqc( opj_t1_t *t1, int bpno); static void t1_dec_refpass_mqc_vsc( opj_t1_t *t1, int bpno); /** Encode clean-up pass */ static void t1_enc_clnpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int bpno, int one, int *nmsedec, int partial, int vsc); /** Decode clean-up pass */ static void t1_dec_clnpass_step_partial( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf); static void t1_dec_clnpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf); static void t1_dec_clnpass_step_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int partial, int vsc); /** Encode clean-up pass */ static void t1_enc_clnpass( opj_t1_t *t1, int bpno, int orient, int *nmsedec, int cblksty); /** Decode clean-up pass */ static void t1_dec_clnpass( opj_t1_t *t1, int bpno, int orient, int cblksty); static double t1_getwmsedec( int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps, int mct); /** Encode 1 code-block @param t1 T1 handle @param cblk Code-block coding parameters @param orient @param compno Component number @param level @param qmfbid @param stepsize @param cblksty Code-block style @param numcomps @param mct @param tile */ static void t1_encode_cblk( opj_t1_t *t1, opj_tcd_cblk_enc_t* cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, int mct, opj_tcd_tile_t * tile); /** Decode 1 code-block @param t1 T1 handle @param cblk Code-block coding parameters @param orient @param roishift Region of interest shifting value @param cblksty Code-block style */ static void t1_decode_cblk( opj_t1_t *t1, opj_tcd_cblk_dec_t* cblk, int orient, int roishift, int cblksty); /*@}*/ /*@}*/ /* ----------------------------------------------------------------------- */ static char t1_getctxno_zc(int f, int orient) { return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; } static char t1_getctxno_sc(int f) { return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; } static int t1_getctxno_mag(int f) { int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; return (tmp2); } static char t1_getspb(int f) { return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; } static short t1_getnmsedec_sig(int x, int bitpos) { if (bitpos > T1_NMSEDEC_FRACBITS) { return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; } return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; } static short t1_getnmsedec_ref(int x, int bitpos) { if (bitpos > T1_NMSEDEC_FRACBITS) { return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; } return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; } static void t1_updateflags(flag_t *flagsp, int s, int stride) { flag_t *np = flagsp - stride; flag_t *sp = flagsp + stride; static const flag_t mod[] = { T1_SIG_S, T1_SIG_S|T1_SGN_S, T1_SIG_E, T1_SIG_E|T1_SGN_E, T1_SIG_W, T1_SIG_W|T1_SGN_W, T1_SIG_N, T1_SIG_N|T1_SGN_N }; np[-1] |= T1_SIG_SE; np[0] |= mod[s]; np[1] |= T1_SIG_SW; flagsp[-1] |= mod[s+2]; flagsp[0] |= T1_SIG; flagsp[1] |= mod[s+4]; sp[-1] |= T1_SIG_NE; sp[0] |= mod[s+6]; sp[1] |= T1_SIG_NW; } static void t1_enc_sigpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int bpno, int one, int *nmsedec, char type, int vsc) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { v = int_abs(*datap) & one ? 1 : 0; mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ mqc_bypass_enc(mqc, v); } else { mqc_encode(mqc, v); } if (v) { v = *datap < 0 ? 1 : 0; *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ mqc_bypass_enc(mqc, v); } else { mqc_encode(mqc, v ^ t1_getspb(flag)); } t1_updateflags(flagsp, v, t1->flags_stride); } *flagsp |= T1_VISIT; } } static INLINE void t1_dec_sigpass_step_raw( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int vsc) { int v, flag; opj_raw_t *raw = t1->raw; /* RAW component */ OPJ_ARG_NOT_USED(orient); flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { if (raw_decode(raw)) { v = raw_decode(raw); /* ESSAI */ *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); } *flagsp |= T1_VISIT; } } /* VSC and BYPASS by Antonin */ static INLINE void t1_dec_sigpass_step_mqc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = *flagsp; if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); if (mqc_decode(mqc)) { mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = mqc_decode(mqc) ^ t1_getspb(flag); *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); } *flagsp |= T1_VISIT; } } /* VSC and BYPASS by Antonin */ static INLINE void t1_dec_sigpass_step_mqc_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int vsc) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); if (mqc_decode(mqc)) { mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = mqc_decode(mqc) ^ t1_getspb(flag); *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); } *flagsp |= T1_VISIT; } } /* VSC and BYPASS by Antonin */ static void t1_enc_sigpass( opj_t1_t *t1, 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 < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_enc_sigpass_step( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], orient, bpno, one, nmsedec, type, vsc); } } } } static void t1_dec_sigpass_raw( opj_t1_t *t1, int bpno, int orient, int cblksty) { int i, j, k, one, half, oneplushalf, vsc; one = 1 << bpno; half = one >> 1; oneplushalf = one | half; for (k = 0; k < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_dec_sigpass_step_raw( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], orient, oneplushalf, vsc); } } } } /* VSC and BYPASS by Antonin */ static void t1_dec_sigpass_mqc( opj_t1_t *t1, int bpno, int orient) { int i, j, k, one, half, oneplushalf; int *data1 = t1->data; flag_t *flags1 = &t1->flags[1]; one = 1 << bpno; half = one >> 1; oneplushalf = one | half; for (k = 0; k < (t1->h & ~3); k += 4) { for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; flags2 += t1->flags_stride; t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; } data1 += t1->w << 2; flags1 += t1->flags_stride << 2; } for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; for (j = k; j < t1->h; ++j) { flags2 += t1->flags_stride; t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; } } } /* VSC and BYPASS by Antonin */ static void t1_dec_sigpass_mqc_vsc( opj_t1_t *t1, int bpno, int orient) { int i, j, k, one, half, oneplushalf, vsc; one = 1 << bpno; half = one >> 1; oneplushalf = one | half; for (k = 0; k < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; t1_dec_sigpass_step_mqc_vsc( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], orient, oneplushalf, vsc); } } } } /* VSC and BYPASS by Antonin */ static void t1_enc_refpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int bpno, int one, int *nmsedec, char type, int vsc) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); v = int_abs(*datap) & one ? 1 : 0; mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ mqc_bypass_enc(mqc, v); } else { mqc_encode(mqc, v); } *flagsp |= T1_REFINE; } } static INLINE void t1_dec_refpass_step_raw( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf, int vsc) { int v, t, flag; opj_raw_t *raw = t1->raw; /* RAW component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { v = raw_decode(raw); t = v ? poshalf : neghalf; *datap += *datap < 0 ? -t : t; *flagsp |= T1_REFINE; } } /* VSC and BYPASS by Antonin */ static INLINE void t1_dec_refpass_step_mqc( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf) { int v, t, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = *flagsp; if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ v = mqc_decode(mqc); t = v ? poshalf : neghalf; *datap += *datap < 0 ? -t : t; *flagsp |= T1_REFINE; } } /* VSC and BYPASS by Antonin */ static INLINE void t1_dec_refpass_step_mqc_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int poshalf, int neghalf, int vsc) { int v, t, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ v = mqc_decode(mqc); t = v ? poshalf : neghalf; *datap += *datap < 0 ? -t : t; *flagsp |= T1_REFINE; } } /* VSC and BYPASS by Antonin */ static void t1_enc_refpass( opj_t1_t *t1, 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 < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_enc_refpass_step( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], bpno, one, nmsedec, type, vsc); } } } } static void t1_dec_refpass_raw( opj_t1_t *t1, int bpno, 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 < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_dec_refpass_step_raw( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], poshalf, neghalf, vsc); } } } } /* VSC and BYPASS by Antonin */ static void t1_dec_refpass_mqc( opj_t1_t *t1, int bpno) { int i, j, k, one, poshalf, neghalf; int *data1 = t1->data; flag_t *flags1 = &t1->flags[1]; one = 1 << bpno; poshalf = one >> 1; neghalf = bpno > 0 ? -poshalf : -1; for (k = 0; k < (t1->h & ~3); k += 4) { for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; flags2 += t1->flags_stride; t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); data2 += t1->w; } data1 += t1->w << 2; flags1 += t1->flags_stride << 2; } for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; for (j = k; j < t1->h; ++j) { flags2 += t1->flags_stride; t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); data2 += t1->w; } } } /* VSC and BYPASS by Antonin */ static void t1_dec_refpass_mqc_vsc( opj_t1_t *t1, int bpno) { int i, j, k, one, poshalf, neghalf; int vsc; one = 1 << bpno; poshalf = one >> 1; neghalf = bpno > 0 ? -poshalf : -1; for (k = 0; k < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { for (j = k; j < k + 4 && j < t1->h; ++j) { vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_dec_refpass_step_mqc_vsc( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], poshalf, neghalf, vsc); } } } } /* VSC and BYPASS by Antonin */ static void t1_enc_clnpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int bpno, int one, int *nmsedec, int partial, int vsc) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if (partial) { goto LABEL_PARTIAL; } if (!(*flagsp & (T1_SIG | T1_VISIT))) { mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); v = int_abs(*datap) & one ? 1 : 0; mqc_encode(mqc, v); if (v) { LABEL_PARTIAL: *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = *datap < 0 ? 1 : 0; mqc_encode(mqc, v ^ t1_getspb(flag)); t1_updateflags(flagsp, v, t1->flags_stride); } } *flagsp &= ~T1_VISIT; } static void t1_dec_clnpass_step_partial( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ OPJ_ARG_NOT_USED(orient); flag = *flagsp; mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = mqc_decode(mqc) ^ t1_getspb(flag); *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); *flagsp &= ~T1_VISIT; } /* VSC and BYPASS by Antonin */ static void t1_dec_clnpass_step( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = *flagsp; if (!(flag & (T1_SIG | T1_VISIT))) { mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); if (mqc_decode(mqc)) { mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = mqc_decode(mqc) ^ t1_getspb(flag); *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); } } *flagsp &= ~T1_VISIT; } /* VSC and BYPASS by Antonin */ static void t1_dec_clnpass_step_vsc( opj_t1_t *t1, flag_t *flagsp, int *datap, int orient, int oneplushalf, int partial, int vsc) { int v, flag; opj_mqc_t *mqc = t1->mqc; /* MQC component */ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); if (partial) { goto LABEL_PARTIAL; } if (!(flag & (T1_SIG | T1_VISIT))) { mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); if (mqc_decode(mqc)) { LABEL_PARTIAL: mqc_setcurctx(mqc, t1_getctxno_sc(flag)); v = mqc_decode(mqc) ^ t1_getspb(flag); *datap = v ? -oneplushalf : oneplushalf; t1_updateflags(flagsp, v, t1->flags_stride); } } *flagsp &= ~T1_VISIT; } static void t1_enc_clnpass( opj_t1_t *t1, int bpno, int orient, int *nmsedec, int cblksty) { int i, j, k, one, agg, runlen, vsc; opj_mqc_t *mqc = t1->mqc; /* MQC component */ *nmsedec = 0; one = 1 << (bpno + T1_NMSEDEC_FRACBITS); for (k = 0; k < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { if (k + 3 < t1->h) { if (cblksty & J2K_CCP_CBLKSTY_VSC) { agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || (MACRO_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 = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_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)*t1->w) + i]) & one) break; } mqc_setcurctx(mqc, T1_CTXNO_AGG); mqc_encode(mqc, runlen != 4); if (runlen == 4) { continue; } mqc_setcurctx(mqc, T1_CTXNO_UNI); mqc_encode(mqc, runlen >> 1); mqc_encode(mqc, runlen & 1); } else { runlen = 0; } for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; t1_enc_clnpass_step( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc); } } } } static void t1_dec_clnpass( opj_t1_t *t1, int bpno, int orient, int cblksty) { int i, j, k, one, half, oneplushalf, agg, runlen, vsc; int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; opj_mqc_t *mqc = t1->mqc; /* MQC component */ one = 1 << bpno; half = one >> 1; oneplushalf = one | half; if (cblksty & J2K_CCP_CBLKSTY_VSC) { for (k = 0; k < t1->h; k += 4) { for (i = 0; i < t1->w; ++i) { if (k + 3 < t1->h) { agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || (MACRO_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 = 0; } if (agg) { mqc_setcurctx(mqc, T1_CTXNO_AGG); if (!mqc_decode(mqc)) { continue; } mqc_setcurctx(mqc, T1_CTXNO_UNI); runlen = mqc_decode(mqc); runlen = (runlen << 1) | mqc_decode(mqc); } else { runlen = 0; } for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; t1_dec_clnpass_step_vsc( t1, &t1->flags[((j+1) * t1->flags_stride) + i + 1], &t1->data[(j * t1->w) + i], orient, oneplushalf, agg && (j == k + runlen), vsc); } } } } else { int *data1 = t1->data; flag_t *flags1 = &t1->flags[1]; for (k = 0; k < (t1->h & ~3); k += 4) { for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); if (agg) { mqc_setcurctx(mqc, T1_CTXNO_AGG); if (!mqc_decode(mqc)) { continue; } mqc_setcurctx(mqc, T1_CTXNO_UNI); runlen = mqc_decode(mqc); runlen = (runlen << 1) | mqc_decode(mqc); flags2 += runlen * t1->flags_stride; data2 += runlen * t1->w; for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { flags2 += t1->flags_stride; if (agg && (j == k + runlen)) { t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); } else { t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); } data2 += t1->w; } } else { flags2 += t1->flags_stride; t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; flags2 += t1->flags_stride; t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; } } data1 += t1->w << 2; flags1 += t1->flags_stride << 2; } for (i = 0; i < t1->w; ++i) { int *data2 = data1 + i; flag_t *flags2 = flags1 + i; for (j = k; j < t1->h; ++j) { flags2 += t1->flags_stride; t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); data2 += t1->w; } } } if (segsym) { int v = 0; mqc_setcurctx(mqc, T1_CTXNO_UNI); v = mqc_decode(mqc); v = (v << 1) | mqc_decode(mqc); v = (v << 1) | mqc_decode(mqc); v = (v << 1) | mqc_decode(mqc); /* if (v!=0xa) { opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); } */ } } /* VSC and BYPASS by Antonin */ /** mod fixed_quality */ static double t1_getwmsedec( int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps, int mct) { double w1, w2, wmsedec; if (qmfbid == 1) { w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0; w2 = dwt_getnorm(level, orient); } else { /* if (qmfbid == 0) */ w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0; w2 = dwt_getnorm_real(level, orient); } wmsedec = w1 * w2 * stepsize * (1 << bpno); wmsedec *= wmsedec * nmsedec / 8192.0; return wmsedec; } static opj_bool allocate_buffers( opj_t1_t *t1, int w, int h) { int datasize=w * h; int flagssize; if(datasize > t1->datasize){ opj_aligned_free(t1->data); t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int)); if(!t1->data){ return OPJ_FALSE; } t1->datasize=datasize; } memset(t1->data,0,datasize * sizeof(int)); t1->flags_stride=w+2; flagssize=t1->flags_stride * (h+2); if(flagssize > t1->flagssize){ opj_aligned_free(t1->flags); t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t)); if(!t1->flags){ return OPJ_FALSE; } t1->flagssize=flagssize; } memset(t1->flags,0,flagssize * sizeof(flag_t)); t1->w=w; t1->h=h; return OPJ_TRUE; } /** mod fixed_quality */ static void t1_encode_cblk( opj_t1_t *t1, opj_tcd_cblk_enc_t* cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, int mct, opj_tcd_tile_t * tile) { double cumwmsedec = 0.0; opj_mqc_t *mqc = t1->mqc; /* MQC component */ int passno, bpno, passtype; int nmsedec = 0; int i, max; char type = T1_TYPE_MQ; double tempwmsedec; max = 0; for (i = 0; i < t1->w * t1->h; ++i) { int tmp = abs(t1->data[i]); max = int_max(max, tmp); } cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; bpno = cblk->numbps - 1; passtype = 2; mqc_resetstates(mqc); mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); mqc_init_enc(mqc, cblk->data); for (passno = 0; bpno >= 0; ++passno) { opj_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(t1, bpno, orient, &nmsedec, type, cblksty); break; case 1: t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); break; case 2: t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); /* code switch SEGMARK (i.e. SEGSYM) */ if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) mqc_segmark_enc(mqc); break; } /* fixed_quality */ tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct); cumwmsedec += tempwmsedec; tile->distotile += tempwmsedec; /* Code switch "RESTART" (i.e. TERMALL) */ if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { if (type == T1_TYPE_RAW) { mqc_flush(mqc); correction = 1; /* correction = mqc_bypass_flush_enc(); */ } else { /* correction = mqc_restart_enc(); */ mqc_flush(mqc); 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(mqc); correction = 1; /* correction = mqc_bypass_flush_enc(); */ } else { /* correction = mqc_restart_enc(); */ mqc_flush(mqc); 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(mqc); else mqc_restart_init_enc(mqc); } pass->distortiondec = cumwmsedec; pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ /* Code-switch "RESET" */ if (cblksty & J2K_CCP_CBLKSTY_RESET) mqc_reset_enc(mqc); } /* Code switch "ERTERM" (i.e. PTERM) */ if (cblksty & J2K_CCP_CBLKSTY_PTERM) mqc_erterm_enc(mqc); else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) mqc_flush(mqc); cblk->totalpasses = passno; for (passno = 0; passnototalpasses; passno++) { opj_tcd_pass_t *pass = &cblk->passes[passno]; if (pass->rate > mqc_numbytes(mqc)) pass->rate = mqc_numbytes(mqc); /*Preventing generation of FF as last data byte of a pass*/ if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ pass->rate--; } pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); } } static void t1_decode_cblk( opj_t1_t *t1, opj_tcd_cblk_dec_t* cblk, int orient, int roishift, int cblksty) { opj_raw_t *raw = t1->raw; /* RAW component */ opj_mqc_t *mqc = t1->mqc; /* MQC component */ int bpno, passtype; int segno, passno; char type = T1_TYPE_MQ; /* BYPASS mode */ if(!allocate_buffers( t1, cblk->x1 - cblk->x0, cblk->y1 - cblk->y0)) { return; } bpno = roishift + cblk->numbps - 1; passtype = 2; mqc_resetstates(mqc); mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); for (segno = 0; segno < cblk->numsegs; ++segno) { opj_tcd_seg_t *seg = &cblk->segs[segno]; /* BYPASS mode */ type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ if(seg->data == NULL){ continue; } if (type == T1_TYPE_RAW) { raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); } else { mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len); } for (passno = 0; passno < seg->numpasses; ++passno) { switch (passtype) { case 0: if (type == T1_TYPE_RAW) { t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty); } else { if (cblksty & J2K_CCP_CBLKSTY_VSC) { t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient); } else { t1_dec_sigpass_mqc(t1, bpno+1, orient); } } break; case 1: if (type == T1_TYPE_RAW) { t1_dec_refpass_raw(t1, bpno+1, cblksty); } else { if (cblksty & J2K_CCP_CBLKSTY_VSC) { t1_dec_refpass_mqc_vsc(t1, bpno+1); } else { t1_dec_refpass_mqc(t1, bpno+1); } } break; case 2: t1_dec_clnpass(t1, bpno+1, orient, cblksty); break; } if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { mqc_resetstates(mqc); mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); } if (++passtype == 3) { passtype = 0; bpno--; } } } } /* ----------------------------------------------------------------------- */ opj_t1_t* t1_create(opj_common_ptr cinfo) { opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); if(!t1) return NULL; t1->cinfo = cinfo; /* create MQC and RAW handles */ t1->mqc = mqc_create(); t1->raw = raw_create(); t1->data=NULL; t1->flags=NULL; t1->datasize=0; t1->flagssize=0; return t1; } void t1_destroy(opj_t1_t *t1) { if(t1) { /* destroy MQC and RAW handles */ mqc_destroy(t1->mqc); raw_destroy(t1->raw); opj_aligned_free(t1->data); opj_aligned_free(t1->flags); opj_free(t1); } } void t1_encode_cblks( opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) { int compno, resno, bandno, precno, cblkno; tile->distotile = 0; /* fixed_quality */ for (compno = 0; compno < tile->numcomps; ++compno) { opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; opj_tccp_t* tccp = &tcp->tccps[compno]; int tile_w = tilec->x1 - tilec->x0; for (resno = 0; resno < tilec->numresolutions; ++resno) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; ++bandno) { opj_tcd_band_t* restrict band = &res->bands[bandno]; int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192)); for (precno = 0; precno < res->pw * res->ph; ++precno) { opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; int* restrict datap; int* restrict tiledp; int cblk_w; int cblk_h; int i, j; int x = cblk->x0 - band->x0; int y = cblk->y0 - band->y0; if (band->bandno & 1) { opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; x += pres->x1 - pres->x0; } if (band->bandno & 2) { opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; y += pres->y1 - pres->y0; } if(!allocate_buffers( t1, cblk->x1 - cblk->x0, cblk->y1 - cblk->y0)) { return; } datap=t1->data; cblk_w = t1->w; cblk_h = t1->h; tiledp=&tilec->data[(y * tile_w) + x]; if (tccp->qmfbid == 1) { for (j = 0; j < cblk_h; ++j) { for (i = 0; i < cblk_w; ++i) { int tmp = tiledp[(j * tile_w) + i]; datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; } } } else { /* if (tccp->qmfbid == 0) */ for (j = 0; j < cblk_h; ++j) { for (i = 0; i < cblk_w; ++i) { int tmp = tiledp[(j * tile_w) + i]; datap[(j * cblk_w) + i] = fix_mul( tmp, bandconst) >> (11 - T1_NMSEDEC_FRACBITS); } } } t1_encode_cblk( t1, cblk, band->bandno, compno, tilec->numresolutions - 1 - resno, tccp->qmfbid, band->stepsize, tccp->cblksty, tile->numcomps, tcp->mct, tile); } /* cblkno */ } /* precno */ } /* bandno */ } /* resno */ } /* compno */ } void t1_decode_cblks( opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp) { int resno, bandno, precno, cblkno; int tile_w = tilec->x1 - tilec->x0; for (resno = 0; resno < tilec->numresolutions; ++resno) { opj_tcd_resolution_t* res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; ++bandno) { opj_tcd_band_t* restrict band = &res->bands[bandno]; for (precno = 0; precno < res->pw * res->ph; ++precno) { opj_tcd_precinct_t* precinct = &band->precincts[precno]; for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; int* restrict datap; int cblk_w, cblk_h; int x, y; int i, j; t1_decode_cblk( t1, cblk, band->bandno, tccp->roishift, tccp->cblksty); x = cblk->x0 - band->x0; y = cblk->y0 - band->y0; if (band->bandno & 1) { opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; x += pres->x1 - pres->x0; } if (band->bandno & 2) { opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; y += pres->y1 - pres->y0; } datap=t1->data; cblk_w = t1->w; cblk_h = t1->h; if (tccp->roishift) { int thresh = 1 << tccp->roishift; for (j = 0; j < cblk_h; ++j) { for (i = 0; i < cblk_w; ++i) { int val = datap[(j * cblk_w) + i]; int mag = abs(val); if (mag >= thresh) { mag >>= tccp->roishift; datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; } } } } if (tccp->qmfbid == 1) { int* restrict tiledp = &tilec->data[(y * tile_w) + x]; for (j = 0; j < cblk_h; ++j) { for (i = 0; i < cblk_w; ++i) { int tmp = datap[(j * cblk_w) + i]; ((int*)tiledp)[(j * tile_w) + i] = tmp / 2; } } } else { /* if (tccp->qmfbid == 0) */ float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x]; for (j = 0; j < cblk_h; ++j) { float* restrict tiledp2 = tiledp; for (i = 0; i < cblk_w; ++i) { float tmp = *datap * band->stepsize; *tiledp2 = tmp; datap++; tiledp2++; } tiledp += tile_w; } } opj_free(cblk->data); opj_free(cblk->segs); } /* cblkno */ opj_free(precinct->cblks.dec); precinct->cblks.dec = NULL; } /* precno */ } /* bandno */ } /* resno */ } openjpeg-1.5.2/libopenjpeg/cio.h0000644000175000017500000000622012315002100016401 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 #if defined(_MSC_VER) || defined(__BORLANDC__) #define int64 __int64 #else #define int64 long long #endif /** @file cio.h @brief Implementation of a byte input-output process (CIO) The functions in CIO.C have for goal to realize a byte input / output process. */ /** @defgroup CIO CIO - byte input-output stream */ /*@{*/ /** @name Exported functions (see also openjpeg.h) */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Number of bytes left before the end of the stream @param cio CIO handle @return Returns the number of bytes before the end of the stream */ int cio_numbytesleft(opj_cio_t *cio); /** Get pointer to the current position in the stream @param cio CIO handle @return Returns a pointer to the current position */ unsigned char *cio_getbp(opj_cio_t *cio); /** Write some bytes @param cio CIO handle @param v Value to write @param n Number of bytes to write @return Returns the number of bytes written or 0 if an error occured */ unsigned int cio_write(opj_cio_t *cio, unsigned int64 v, int n); /** Read some bytes @param cio CIO handle @param n Number of bytes to read @return Returns the value of the n bytes read */ unsigned int cio_read(opj_cio_t *cio, int n); /** Skip some bytes @param cio CIO handle @param n Number of bytes to skip */ void cio_skip(opj_cio_t *cio, int n); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __CIO_H */ openjpeg-1.5.2/libopenjpeg/tcd.c0000644000175000017500000016041712315002100016405 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * 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 _ISOC99_SOURCE /* lrintf is C99 */ #include "opj_includes.h" #include void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) { int tileno, compno, resno, bandno, precno;/*, cblkno;*/ fprintf(fd, "image {\n"); fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1); for (tileno = 0; tileno < img->th * img->tw; tileno++) { opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; fprintf(fd, " tile {\n"); fprintf(fd, " 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++) { opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; fprintf(fd, " tilec {\n"); fprintf(fd, " 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++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; fprintf(fd, "\n res {\n"); fprintf(fd, " 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++) { opj_tcd_band_t *band = &res->bands[bandno]; fprintf(fd, " band {\n"); fprintf(fd, " 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++) { opj_tcd_precinct_t *prec = &band->precincts[precno]; fprintf(fd, " prec {\n"); fprintf(fd, " 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++) { opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; fprintf(fd, " cblk {\n"); fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d\n", cblk->x0, cblk->y0, cblk->x1, cblk->y1); fprintf(fd, " }\n"); } */ fprintf(fd, " }\n"); } fprintf(fd, " }\n"); } fprintf(fd, " }\n"); } fprintf(fd, " }\n"); } fprintf(fd, " }\n"); } fprintf(fd, "}\n"); } /* ----------------------------------------------------------------------- */ /** Create a new TCD handle */ opj_tcd_t* tcd_create(opj_common_ptr cinfo) { /* create the tcd structure */ opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); if(!tcd) return NULL; tcd->cinfo = cinfo; tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); if(!tcd->tcd_image) { opj_free(tcd); return NULL; } return tcd; } /** Destroy a previously created TCD handle */ void tcd_destroy(opj_tcd_t *tcd) { if(tcd) { opj_free(tcd->tcd_image); opj_free(tcd); } } /* ----------------------------------------------------------------------- */ void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { int tileno, compno, resno, bandno, precno, cblkno; tcd->image = image; tcd->cp = cp; tcd->tcd_image->tw = cp->tw; tcd->tcd_image->th = cp->th; tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); for (tileno = 0; tileno < 1; tileno++) { opj_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 */ /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ opj_tcd_tile_t *tile = tcd->tcd_image->tiles; /* 4 borders of the tile rescale on the image if necessary */ tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); tile->numcomps = image->numcomps; /* tile->PPT=image->PPT; */ /* Modification of the RATE >> */ for (j = 0; j < tcp->numlayers; j++) { tcp->rates[j] = tcp->rates[j] ? cp->tp_on ? (((float) (tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * image->comps[0].prec)) /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) : ((float) (tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * image->comps[0].prec))/ (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) : 0; 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; } if(j == (tcp->numlayers-1)){ tcp->rates[j] = tcp->rates[j]- 2; } } } /* << Modification of the RATE */ tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); for (compno = 0; compno < tile->numcomps; compno++) { opj_tccp_t *tccp = &tcp->tccps[compno]; opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; /* border of each tile component (global) */ tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); tilec->numresolutions = tccp->numresolutions; tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_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; opj_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 = (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; } (void)brcbgyend; (void)brcbgxend; 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; opj_stepsize_t *ss = NULL; opj_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 = image->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 = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t)); for (i = 0; i < res->pw * res->ph * 3; i++) { band->precincts[i].imsbtree = NULL; band->precincts[i].incltree = NULL; band->precincts[i].cblks.enc = 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); opj_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.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), sizeof(opj_tcd_cblk_enc_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); opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[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); cblk->data = (unsigned char*) opj_calloc(9728+2, sizeof(unsigned char)); /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ cblk->data[0] = 0; cblk->data[1] = 0; cblk->data += 2; cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); } } } } } } /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ } void tcd_free_encode(opj_tcd_t *tcd) { int tileno, compno, resno, bandno, precno, cblkno; for (tileno = 0; tileno < 1; tileno++) { opj_tcd_tile_t *tile = tcd->tcd_image->tiles; for (compno = 0; compno < tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; for (resno = 0; resno < tilec->numresolutions; resno++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; for (precno = 0; precno < res->pw * res->ph; precno++) { opj_tcd_precinct_t *prc = &band->precincts[precno]; if (prc->incltree != NULL) { tgt_destroy(prc->incltree); prc->incltree = NULL; } if (prc->imsbtree != NULL) { tgt_destroy(prc->imsbtree); prc->imsbtree = NULL; } for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_free(prc->cblks.enc[cblkno].data - 2); opj_free(prc->cblks.enc[cblkno].layers); opj_free(prc->cblks.enc[cblkno].passes); } opj_free(prc->cblks.enc); } /* for (precno */ opj_free(band->precincts); band->precincts = NULL; } /* for (bandno */ } /* for (resno */ opj_free(tilec->resolutions); tilec->resolutions = NULL; } /* for (compno */ opj_free(tile->comps); tile->comps = NULL; } /* for (tileno */ opj_free(tcd->tcd_image->tiles); tcd->tcd_image->tiles = NULL; } void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { int tileno, compno, resno, bandno, precno, cblkno; for (tileno = 0; tileno < 1; tileno++) { opj_tcp_t *tcp = &cp->tcps[curtileno]; int j; /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ int p = curtileno % cp->tw; int q = curtileno / cp->tw; opj_tcd_tile_t *tile = tcd->tcd_image->tiles; /* 4 borders of the tile rescale on the image if necessary */ tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); tile->numcomps = image->numcomps; /* tile->PPT=image->PPT; */ /* Modification of the RATE >> */ for (j = 0; j < tcp->numlayers; j++) { tcp->rates[j] = tcp->rates[j] ? cp->tp_on ? (((float) (tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * image->comps[0].prec)) /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers) : ((float) (tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * image->comps[0].prec))/ (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) : 0; 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=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ for (compno = 0; compno < tile->numcomps; compno++) { opj_tccp_t *tccp = &tcp->tccps[compno]; opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; /* border of each tile component (global) */ tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); tilec->numresolutions = tccp->numresolutions; /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_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; opj_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 = (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; } (void)brcbgyend; (void)brcbgxend; 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; opj_stepsize_t *ss = NULL; opj_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 */ 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 = image->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); opj_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; opj_free(prc->cblks.enc); prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, sizeof(opj_tcd_cblk_enc_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); opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[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); cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char)); /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ cblk->data[0] = 0; cblk->data[1] = 0; cblk->data += 2; cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); } } /* precno */ } /* bandno */ } /* resno */ } /* compno */ } /* tileno */ /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ } void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) { int i, j, tileno, p, q; unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; tcd->image = image; tcd->tcd_image->tw = cp->tw; tcd->tcd_image->th = cp->th; tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(cp->tw * cp->th, sizeof(opj_tcd_tile_t)); /* Allocate place to store the decoded data = final image Place limited by the tile really present in the codestream */ for (j = 0; j < cp->tileno_size; j++) { opj_tcd_tile_t *tile; tileno = cp->tileno[j]; tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); tile->numcomps = image->numcomps; tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, sizeof(opj_tcd_tilecomp_t)); } for (i = 0; i < image->numcomps; i++) { for (j = 0; j < cp->tileno_size; j++) { opj_tcd_tile_t *tile; opj_tcd_tilecomp_t *tilec; /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ tileno = cp->tileno[j]; tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); tilec = &tile->comps[i]; 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, image->x0); tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx); tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy); tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx); tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy); x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0); y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->y0); x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1); y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1); } w = int_ceildivpow2(x1 - x0, image->comps[i].factor); h = int_ceildivpow2(y1 - y0, image->comps[i].factor); image->comps[i].w = w; image->comps[i].h = h; image->comps[i].x0 = x0; image->comps[i].y0 = y0; } } void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info) { int compno, resno, bandno, precno, cblkno; opj_tcp_t *tcp; opj_tcd_tile_t *tile; OPJ_ARG_NOT_USED(cstr_info); tcd->cp = cp; tcp = &(cp->tcps[cp->tileno[tileno]]); tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); tileno = cp->tileno[tileno]; for (compno = 0; compno < tile->numcomps; compno++) { opj_tccp_t *tccp = &tcp->tccps[compno]; opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; if (tccp->numresolutions <= 0) { cp->tileno[tileno] = -1; return; } /* border of each tile component (global) */ tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); tilec->numresolutions = tccp->numresolutions; tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_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; opj_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); res->ph = (res->y0 == res->y1) ? 0 : ((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; } (void)brcbgyend; (void)brcbgxend; 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; opj_stepsize_t *ss = NULL; opj_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 = image->comps[compno].prec + gain; band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)) * 0.5); band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_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); opj_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.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_dec_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); opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; cblk->data = NULL; cblk->segs = NULL; /* 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); cblk->numsegs = 0; } } /* precno */ } /* bandno */ } /* resno */ } /* compno */ /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ } void tcd_makelayer_fixed(opj_tcd_t *tcd, 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; opj_cp_t *cp = tcd->cp; opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; opj_tcp_t *tcd_tcp = tcd->tcp; /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ for (compno = 0; compno < tcd_tile->numcomps; compno++) { opj_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) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] * (float) (tcd->image->comps[compno].prec / 16.0)); } } } for (resno = 0; resno < tilec->numresolutions; resno++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; for (precno = 0; precno < res->pw * res->ph; precno++) { opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; opj_tcd_layer_t *layer = &cblk->layers[layno]; int n; int imsb = tcd->image->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(opj_tcd_t *tcd) { int layno; for (layno = 0; layno < tcd->tcp->numlayers; layno++) { tcd_makelayer_fixed(tcd, layno, 1); } } void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) { int compno, resno, bandno, precno, cblkno, passno; opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; tcd_tile->distolayer[layno] = 0; /* fixed_quality */ for (compno = 0; compno < tcd_tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; for (resno = 0; resno < tilec->numresolutions; resno++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; for (precno = 0; precno < res->pw * res->ph; precno++) { opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; opj_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; opj_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 != 0) 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; /* fixed_quality */ if (final) cblk->numpassesinlayers = n; } } } } } } opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { int compno, resno, bandno, precno, cblkno, passno, layno; double min, max; double cumdisto[100]; /* fixed_quality */ const double K = 1; /* 1.1; fixed_quality */ double maxSE = 0; opj_cp_t *cp = tcd->cp; opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; opj_tcp_t *tcd_tcp = tcd->tcp; min = DBL_MAX; max = 0; tcd_tile->numpix = 0; /* fixed_quality */ for (compno = 0; compno < tcd_tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; tilec->numpix = 0; for (resno = 0; resno < tilec->numresolutions; resno++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; for (precno = 0; precno < res->pw * res->ph; precno++) { opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; for (passno = 0; passno < cblk->totalpasses; passno++) { opj_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 */ /* fixed_quality */ tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); } /* cbklno */ } /* precno */ } /* bandno */ } /* resno */ maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) * ((double)(tilec->numpix)); } /* compno */ /* index file */ if(cstr_info) { opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; tile_info->numpix = tcd_tile->numpix; tile_info->distotile = tcd_tile->distotile; tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); } for (layno = 0; layno < tcd_tcp->numlayers; layno++) { double lo = min; double hi = max; int success = 0; int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len; double goodthresh = 0; double stable_thresh = 0; int i; double distotarget; /* fixed_quality */ /* fixed_quality */ distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10)); /* Don't try to find an optimal threshold but rather take everything not included yet, if -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0) -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0) ==> possible to have some lossy layers and the last layer for sure lossless */ if ( ((cp->disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) { opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); double thresh = 0; for (i = 0; i < 128; i++) { int l = 0; double distoachieved = 0; /* fixed_quality */ thresh = (lo + hi) / 2; tcd_makelayer(tcd, layno, thresh, 0); if (cp->fixed_quality) { /* fixed_quality */ if(cp->cinema){ l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); if (l == -999) { lo = thresh; continue; }else{ distoachieved = layno == 0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; if (distoachieved < distotarget) { hi=thresh; stable_thresh = thresh; continue; }else{ lo=thresh; } } }else{ distoachieved = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); if (distoachieved < distotarget) { hi = thresh; stable_thresh = thresh; continue; } lo = thresh; } } else { l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC, tcd->cur_totnum_tp); /* TODO: what to do with l ??? seek / tell ??? */ /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ if (l == -999) { lo = thresh; continue; } hi = thresh; stable_thresh = thresh; } } success = 1; goodthresh = stable_thresh == 0? thresh : stable_thresh; t2_destroy(t2); } else { success = 1; goodthresh = min; } if (!success) { return OPJ_FALSE; } if(cstr_info) { /* Threshold for Marcela Index */ cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; } tcd_makelayer(tcd, layno, goodthresh, 1); /* fixed_quality */ cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); } return OPJ_TRUE; } int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) { int compno; int l, i, numpacks = 0; opj_tcd_tile_t *tile = NULL; opj_tcp_t *tcd_tcp = NULL; opj_cp_t *cp = NULL; opj_tcp_t *tcp = &tcd->cp->tcps[0]; opj_tccp_t *tccp = &tcp->tccps[0]; opj_image_t *image = tcd->image; opj_t1_t *t1 = NULL; /* T1 component */ opj_t2_t *t2 = NULL; /* T2 component */ tcd->tcd_tileno = tileno; tcd->tcd_tile = tcd->tcd_image->tiles; tcd->tcp = &tcd->cp->tcps[tileno]; tile = tcd->tcd_tile; tcd_tcp = tcd->tcp; cp = tcd->cp; if(tcd->cur_tp_num == 0){ tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ if(cstr_info) { opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ for (i = 0; i < tilec_idx->numresolutions; i++) { opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; cstr_info->tile[tileno].pw[i] = res_idx->pw; cstr_info->tile[tileno].ph[i] = res_idx->ph; numpacks += res_idx->pw * res_idx->ph; cstr_info->tile[tileno].pdx[i] = tccp->prcw[i]; cstr_info->tile[tileno].pdy[i] = tccp->prch[i]; } cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(cstr_info->numcomps * cstr_info->numlayers * numpacks, sizeof(opj_packet_info_t)); } /* << INDEX */ /*---------------TILE-------------------*/ for (compno = 0; compno < tile->numcomps; compno++) { int x, y; int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1); int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; int tw = tilec->x1 - tilec->x0; int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); /* extract tile data */ if (tcd_tcp->tccps[compno].qmfbid == 1) { for (y = tilec->y0; y < tilec->y1; y++) { /* start of the src tile scanline */ int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; /* start of the dst tile scanline */ int *tile_data = &tilec->data[(y - tilec->y0) * tw]; for (x = tilec->x0; x < tilec->x1; x++) { *tile_data++ = *data++ - adjust; } } } else if (tcd_tcp->tccps[compno].qmfbid == 0) { for (y = tilec->y0; y < tilec->y1; y++) { /* start of the src tile scanline */ int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; /* start of the dst tile scanline */ int *tile_data = &tilec->data[(y - tilec->y0) * tw]; for (x = tilec->x0; x < tilec->x1; x++) { *tile_data++ = (*data++ - adjust) << 11; } } } } /*----------------MCT-------------------*/ if (tcd_tcp->mct) { int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); if (tcd_tcp->tccps[0].qmfbid == 0) { mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); } else { mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); } } /*----------------DWT---------------------*/ for (compno = 0; compno < tile->numcomps; compno++) { opj_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); } } /*------------------TIER1-----------------*/ t1 = t1_create(tcd->cinfo); t1_encode_cblks(t1, tile, tcd_tcp); t1_destroy(t1); /*-----------RATE-ALLOCATE------------------*/ /* INDEX */ if(cstr_info) { cstr_info->index_write = 0; } if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ /* Normal Rate/distortion allocation */ tcd_rateallocate(tcd, dest, len, cstr_info); } else { /* Fixed layer allocation */ tcd_rateallocate_fixed(tcd); } } /*--------------TIER2------------------*/ /* INDEX */ if(cstr_info) { cstr_info->index_write = 1; } t2 = t2_create(tcd->cinfo, image, cp); l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, cstr_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS,tcd->cur_totnum_tp); t2_destroy(t2); /*---------------CLEAN-------------------*/ if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){ tcd->encoding_time = opj_clock() - tcd->encoding_time; opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time); /* cleaning memory */ for (compno = 0; compno < tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; opj_aligned_free(tilec->data); } } return l; } opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) { int l; int compno; int eof = 0; double tile_time, t1_time, dwt_time; opj_tcd_tile_t *tile = NULL; opj_t1_t *t1 = NULL; /* T1 component */ opj_t2_t *t2 = NULL; /* T2 component */ tcd->tcd_tileno = tileno; tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); tcd->tcp = &(tcd->cp->tcps[tileno]); tile = tcd->tcd_tile; tile_time = opj_clock(); /* time needed to decode a tile */ opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th); /* INDEX >> */ if(cstr_info) { int resno, compno, numprec = 0; for (compno = 0; compno < cstr_info->numcomps; compno++) { opj_tcp_t *tcp = &tcd->cp->tcps[0]; opj_tccp_t *tccp = &tcp->tccps[compno]; opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno]; for (resno = 0; resno < tilec_idx->numresolutions; resno++) { opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; cstr_info->tile[tileno].pw[resno] = res_idx->pw; cstr_info->tile[tileno].ph[resno] = res_idx->ph; numprec += res_idx->pw * res_idx->ph; if (tccp->csty & J2K_CP_CSTY_PRT) { cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno]; cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno]; } else { cstr_info->tile[tileno].pdx[resno] = 15; cstr_info->tile[tileno].pdy[resno] = 15; } } } cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); cstr_info->packno = 0; } /* << INDEX */ /*--------------TIER2------------------*/ t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info); t2_destroy(t2); if (l == -999) { eof = 1; opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n"); return OPJ_FALSE; } /*------------------TIER1-----------------*/ t1_time = opj_clock(); /* time needed to decode a tile */ t1 = t1_create(tcd->cinfo); if (t1 == NULL) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); t1_destroy(t1); return OPJ_FALSE; } for (compno = 0; compno < tile->numcomps; ++compno) { opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; /* The +3 is headroom required by the vectorized DWT */ tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0))+3) * sizeof(int)); if (tilec->data == NULL) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); t1_destroy(t1); return OPJ_FALSE; } t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]); } t1_destroy(t1); t1_time = opj_clock() - t1_time; opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); /*----------------DWT---------------------*/ dwt_time = opj_clock(); /* time needed to decode a tile */ for (compno = 0; compno < tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; int numres2decode; if (tcd->cp->reduce != 0) { if ( tile->comps[compno].numresolutions < ( tcd->cp->reduce - 1 ) ) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions); return OPJ_FALSE; } else { tcd->image->comps[compno].resno_decoded = tile->comps[compno].numresolutions - tcd->cp->reduce - 1; } } numres2decode = tcd->image->comps[compno].resno_decoded + 1; if(numres2decode > 0){ if (tcd->tcp->tccps[compno].qmfbid == 1) { dwt_decode(tilec, numres2decode); } else { dwt_decode_real(tilec, numres2decode); } } } dwt_time = opj_clock() - dwt_time; opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); /*----------------MCT-------------------*/ if (tcd->tcp->mct) { int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); if (tile->numcomps >= 3 ){ /* testcase 1336.pdf.asan.47.376 */ if ((tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0) < n || ( tile->comps[1].x1 - tile->comps[1].x0) * (tile->comps[1].y1 - tile->comps[1].y0) < n || ( tile->comps[2].x1 - tile->comps[2].x0) * (tile->comps[2].y1 - tile->comps[2].y0) < n) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Tiles don't all have the same dimension. Skip the MCT step.\n"); return OPJ_FALSE; } if (tcd->tcp->tccps[0].qmfbid == 1) { mct_decode( tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, n); } else { mct_decode_real( (float*)tile->comps[0].data, (float*)tile->comps[1].data, (float*)tile->comps[2].data, n); } } else{ opj_event_msg(tcd->cinfo, EVT_WARNING,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",tile->numcomps); } } /*---------------TILE-------------------*/ for (compno = 0; compno < tile->numcomps; ++compno) { opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; opj_image_comp_t* imagec = &tcd->image->comps[compno]; opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded]; int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1); int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0; int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : (1 << imagec->prec) - 1; int tw = tilec->x1 - tilec->x0; int w = imagec->w; int i, j; int offset_x = int_ceildivpow2(imagec->x0, imagec->factor); int offset_y = int_ceildivpow2(imagec->y0, imagec->factor); /* NR-DEC-2977.pdf.asan.67.2198.jp2-52-decode */ if( res->x0 - offset_x < 0 || res->x1 - offset_x < 0 || res->y0 - offset_y < 0 || res->y1 - offset_y < 0 ) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Impossible offsets %d / %d\n", offset_x, offset_y); return OPJ_FALSE; } assert( 0 <= res->x0 - offset_x && 0 <= res->x1 - offset_x ); assert( 0 <= res->y0 - offset_y && 0 <= res->y1 - offset_y ); if(!imagec->data){ imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int)); } if (!imagec->data) { opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); return OPJ_FALSE; } if(tcd->tcp->tccps[compno].qmfbid == 1) { for(j = res->y0; j < res->y1; ++j) { for(i = res->x0; i < res->x1; ++i) { int v = tilec->data[i - res->x0 + (j - res->y0) * tw]; v += adjust; /*assert( (i - offset_x) + (j - offset_y) * w >= 0 );*/ imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); } } }else{ for(j = res->y0; j < res->y1; ++j) { for(i = res->x0; i < res->x1; ++i) { float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw]; int v = lrintf(tmp); v += adjust; /*assert( (i - offset_x) + (j - offset_y) * w >= 0 );*/ imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); } } } opj_aligned_free(tilec->data); } tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); if (eof) { return OPJ_FALSE; } return OPJ_TRUE; } void tcd_free_decode(opj_tcd_t *tcd) { opj_tcd_image_t *tcd_image = tcd->tcd_image; int i = 0; for (i = 0; i < tcd_image->tw * tcd_image->th; i++) { tcd_free_decode_tile(tcd, i); } opj_free(tcd_image->tiles); } void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) { int compno,resno,bandno,precno,cblkno; opj_tcd_image_t *tcd_image = tcd->tcd_image; opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; if (tile->comps != NULL) { for (compno = 0; compno < tile->numcomps; compno++) { opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; for (resno = 0; resno < tilec->numresolutions; resno++) { opj_tcd_resolution_t *res = &tilec->resolutions[resno]; for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; for (precno = 0; precno < res->ph * res->pw; precno++) { opj_tcd_precinct_t *prec = &band->precincts[precno]; if (prec->cblks.dec != NULL) { for (cblkno = 0; cblkno < prec->cw * prec->ch; ++cblkno) { opj_tcd_cblk_dec_t* cblk = &prec->cblks.dec[cblkno]; opj_free(cblk->data); opj_free(cblk->segs); } opj_free(prec->cblks.dec); } if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree); if (prec->incltree != NULL) tgt_destroy(prec->incltree); } opj_free(band->precincts); } } opj_free(tilec->resolutions); } opj_free(tile->comps); tile->comps = NULL; } } openjpeg-1.5.2/libopenjpeg/openjpeg.c0000644000175000017500000002331612315002100017436 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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. */ #ifdef _WIN32 #include #endif /* _WIN32 */ #include "opj_config.h" #include "opj_includes.h" /* ---------------------------------------------------------------------- */ #ifdef _WIN32 #ifndef OPJ_STATIC BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { OPJ_ARG_NOT_USED(lpReserved); OPJ_ARG_NOT_USED(hModule); switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH : break; case DLL_PROCESS_DETACH : break; case DLL_THREAD_ATTACH : case DLL_THREAD_DETACH : break; } return TRUE; } #endif /* OPJ_STATIC */ #endif /* _WIN32 */ /* ---------------------------------------------------------------------- */ const char* OPJ_CALLCONV opj_version(void) { return PACKAGE_VERSION; } opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) { opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t)); if(!dinfo) return NULL; dinfo->is_decompressor = OPJ_TRUE; switch(format) { case CODEC_J2K: case CODEC_JPT: /* get a J2K decoder handle */ dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); if(!dinfo->j2k_handle) { opj_free(dinfo); return NULL; } break; case CODEC_JP2: /* get a JP2 decoder handle */ dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); if(!dinfo->jp2_handle) { opj_free(dinfo); return NULL; } break; case CODEC_UNKNOWN: default: opj_free(dinfo); return NULL; } dinfo->codec_format = format; return dinfo; } void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) { if(dinfo) { /* destroy the codec */ switch(dinfo->codec_format) { case CODEC_J2K: case CODEC_JPT: j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); break; case CODEC_JP2: jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); break; case CODEC_UNKNOWN: default: break; } /* destroy the decompressor */ opj_free(dinfo); } } void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) { if(parameters) { memset(parameters, 0, sizeof(opj_dparameters_t)); /* default decoding parameters */ parameters->cp_layer = 0; parameters->cp_reduce = 0; parameters->cp_limit_decoding = NO_LIMITATION; parameters->decod_format = -1; parameters->cod_format = -1; parameters->flags = 0; /* UniPG>> */ #ifdef USE_JPWL parameters->jpwl_correct = OPJ_FALSE; parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS; parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES; #endif /* USE_JPWL */ /* <codec_format) { case CODEC_J2K: case CODEC_JPT: j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); break; case CODEC_JP2: jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); break; case CODEC_UNKNOWN: default: break; } } } opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) { return opj_decode_with_info(dinfo, cio, NULL); } opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { if(dinfo && cio) { switch(dinfo->codec_format) { case CODEC_J2K: return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); case CODEC_JPT: return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); case CODEC_JP2: return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info); case CODEC_UNKNOWN: default: break; } } return NULL; } opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) { opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t)); if(!cinfo) return NULL; cinfo->is_decompressor = OPJ_FALSE; switch(format) { case CODEC_J2K: /* get a J2K coder handle */ cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); if(!cinfo->j2k_handle) { opj_free(cinfo); return NULL; } break; case CODEC_JP2: /* get a JP2 coder handle */ cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); if(!cinfo->jp2_handle) { opj_free(cinfo); return NULL; } break; case CODEC_JPT: case CODEC_UNKNOWN: default: opj_free(cinfo); return NULL; } cinfo->codec_format = format; return cinfo; } void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) { if(cinfo) { /* destroy the codec */ switch(cinfo->codec_format) { case CODEC_J2K: j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle); break; case CODEC_JP2: jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle); break; case CODEC_JPT: case CODEC_UNKNOWN: default: break; } /* destroy the decompressor */ opj_free(cinfo); } } void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) { if(parameters) { memset(parameters, 0, sizeof(opj_cparameters_t)); /* default coding parameters */ parameters->cp_cinema = OFF; parameters->max_comp_size = 0; parameters->numresolution = 6; parameters->cp_rsiz = STD_RSIZ; parameters->cblockw_init = 64; parameters->cblockh_init = 64; parameters->prog_order = LRCP; parameters->roi_compno = -1; /* no ROI */ parameters->subsampling_dx = 1; parameters->subsampling_dy = 1; parameters->tp_on = 0; parameters->decod_format = -1; parameters->cod_format = -1; parameters->tcp_rates[0] = 0; parameters->tcp_numlayers = 0; parameters->cp_disto_alloc = 0; parameters->cp_fixed_alloc = 0; parameters->cp_fixed_quality = 0; parameters->jpip_on = OPJ_FALSE; /* UniPG>> */ #ifdef USE_JPWL parameters->jpwl_epc_on = OPJ_FALSE; parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */ { int i; for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */ parameters->jpwl_hprot_TPH[i] = 0; /* absent */ } }; { int i; for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */ parameters->jpwl_pprot_packno[i] = -1; /* unassigned */ parameters->jpwl_pprot[i] = 0; /* absent */ } }; parameters->jpwl_sens_size = 0; /* 0 means no ESD */ parameters->jpwl_sens_addr = 0; /* 0 means auto */ parameters->jpwl_sens_range = 0; /* 0 means packet */ parameters->jpwl_sens_MH = -1; /* -1 means unassigned */ { int i; for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */ parameters->jpwl_sens_TPH[i] = -1; /* absent */ } }; #endif /* USE_JPWL */ /* <codec_format) { case CODEC_J2K: j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); break; case CODEC_JP2: jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); break; case CODEC_JPT: case CODEC_UNKNOWN: default: break; } } } opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) { if (index != NULL) opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n" "To extract the index, use the opj_encode_with_info() function.\n" "No index will be generated during this encoding\n"); return opj_encode_with_info(cinfo, cio, image, NULL); } opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { if(cinfo && cio && image) { switch(cinfo->codec_format) { case CODEC_J2K: return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info); case CODEC_JP2: return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info); case CODEC_JPT: case CODEC_UNKNOWN: default: break; } } return OPJ_FALSE; } void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) { if (cstr_info) { int tileno; for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { opj_tile_info_t *tile_info = &cstr_info->tile[tileno]; opj_free(tile_info->thresh); opj_free(tile_info->packet); opj_free(tile_info->tp); opj_free(tile_info->marker); } opj_free(cstr_info->tile); opj_free(cstr_info->marker); opj_free(cstr_info->numdecompos); } } openjpeg-1.5.2/libopenjpeg/tpix_manager.c0000644000175000017500000001212112315002100020275 0ustar mathieumathieu/* * $Id: tpix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.c from 2KAN indexer */ #include #include "opj_includes.h" #define MAX(a,b) ((a)>(b)?(a):(b)) /* * Write faix box of tpix * * @param[in] coff offset of j2k codestream * @param[in] compno component number * @param[in] cstr_info codestream information * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of faix box */ int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio); int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio) { int len, lenp; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_TPIX, 4); /* TPIX */ write_tpixfaix( coff, 0, cstr_info, j2klen, cio); len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); return len; } /* * Get number of maximum tile parts per tile * * @param[in] cstr_info codestream information * @return number of maximum tile parts per tile */ int get_num_max_tile_parts( opj_codestream_info_t cstr_info); int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio) { int len, lenp; int i, j; int Aux; int num_max_tile_parts; int size_of_coding; /* 4 or 8 */ opj_tp_info_t tp; int version; num_max_tile_parts = get_num_max_tile_parts( cstr_info); if( j2klen > pow( 2, 32)){ size_of_coding = 8; version = num_max_tile_parts == 1 ? 1:3; } else{ size_of_coding = 4; version = num_max_tile_parts == 1 ? 0:2; } lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_FAIX, 4); /* FAIX */ cio_write( cio, version, 1); /* Version 0 = 4 bytes */ cio_write( cio, num_max_tile_parts, size_of_coding); /* NMAX */ cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ for (i = 0; i < cstr_info.tw*cstr_info.th; i++){ for (j = 0; j < cstr_info.tile[i].num_tps; j++){ tp = cstr_info.tile[i].tp[j]; cio_write( cio, tp.tp_start_pos-coff, size_of_coding); /* start position */ cio_write( cio, tp.tp_end_pos-tp.tp_start_pos+1, size_of_coding); /* length */ if (version & 0x02){ if( cstr_info.tile[i].num_tps == 1 && cstr_info.numdecompos[compno] > 1) Aux = cstr_info.numdecompos[compno] + 1; else Aux = j + 1; cio_write( cio, Aux,4); /*cio_write(img.tile[i].tile_parts[j].num_reso_AUX,4);*/ /* Aux_i,j : Auxiliary value */ /* fprintf(stderr,"AUX value %d\n",Aux);*/ } /*cio_write(0,4);*/ } /* PADDING */ while (j < num_max_tile_parts){ cio_write( cio, 0, size_of_coding); /* start position */ cio_write( cio, 0, size_of_coding); /* length */ if (version & 0x02) cio_write( cio, 0,4); /* Aux_i,j : Auxiliary value */ j++; } } len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); return len; } int get_num_max_tile_parts( opj_codestream_info_t cstr_info) { int num_max_tp = 0, i; for( i=0; i> $(top_builddir)/report.txt if BUILD_SHARED @( $(call solist) ) >> $(top_builddir)/report.txt endif if BUILD_STATIC @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt endif @echo -e " (H)\t$(includedir)/openjpeg-$(MAJOR_NR).$(MINOR_NR)/openjpeg.h" >> $(top_builddir)/report.txt uninstall-hook: rm -f $(DESTDIR)$(includedir)/openjpeg.h solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;) get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2) base = $(call get_tok,libdir) so = $(call get_tok,library_names) a = $(call get_tok,old_library) if HAVE_WIN32 SO_PREFIX = (DLL) dll = $(call get_tok,dlname) else if HAVE_DARWIN SO_PREFIX = (DY) dll = else SO_PREFIX = (SO) dll = endif endif openjpeg-1.5.2/libopenjpeg/j2k_lib.c0000644000175000017500000000463512315002100017146 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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. */ #ifdef _WIN32 #include #else #include #include #include #endif /* _WIN32 */ #include "opj_includes.h" double opj_clock(void) { #ifdef _WIN32 /* _WIN32: use QueryPerformance (very accurate) */ LARGE_INTEGER freq , t ; /* freq is the clock speed of the CPU */ QueryPerformanceFrequency(&freq) ; /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ /* t is the high resolution performance counter (see MSDN) */ QueryPerformanceCounter ( & t ) ; return ( t.QuadPart /(double) freq.QuadPart ) ; #else /* Unix or Linux: use resource usage */ struct rusage t; double procTime; /* (1) Get the rusage data structure at this moment (man getrusage) */ getrusage(0,&t); /* (2) What is the elapsed time ? - CPU time = User time + System time */ /* (2a) Get the seconds */ procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; /* (2b) More precisely! Get the microseconds part ! */ return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; #endif } openjpeg-1.5.2/libopenjpeg/thix_manager.c0000644000175000017500000001001112315002100020261 0ustar mathieumathieu/* * $Id: thix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.c from 2KAN indexer */ #include #include #include #include "opj_includes.h" /* * Write tile-part headers mhix box * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information * @param[in] tileno tile number * @param[in] cio file output handle * @return length of mhix box */ int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio); int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio) { int len, lenp, i; int tileno; opj_jp2_box_t *box; lenp = 0; box = (opj_jp2_box_t *)opj_calloc( cstr_info.tw*cstr_info.th, sizeof(opj_jp2_box_t)); for ( i = 0; i < 2 ; i++ ){ if (i) cio_seek( cio, lenp); lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_THIX, 4); /* THIX */ write_manf( i, cstr_info.tw*cstr_info.th, box, cio); for (tileno = 0; tileno < cstr_info.tw*cstr_info.th; tileno++){ box[tileno].length = write_tilemhix( coff, cstr_info, tileno, cio); box[tileno].type = JPIP_MHIX; } len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); } opj_free(box); return len; } int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio) { int i; opj_tile_info_t tile; opj_tp_info_t tp; int len, lenp; opj_marker_info_t *marker; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_MHIX, 4); /* MHIX */ tile = cstr_info.tile[tileno]; tp = tile.tp[0]; cio_write( cio, tp.tp_end_header-tp.tp_start_pos+1, 8); /* TLEN */ marker = cstr_info.tile[tileno].marker; for( i=0; iflags[((x)*(t1->flags_stride))+(y)] /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Create a new T1 handle and initialize the look-up tables of the Tier-1 coder/decoder @return Returns a new T1 handle if successful, returns NULL otherwise @see t1_init_luts */ opj_t1_t* t1_create(opj_common_ptr cinfo); /** Destroy a previously created T1 handle @param t1 T1 handle to destroy */ void t1_destroy(opj_t1_t *t1); /** Encode the code-blocks of a tile @param t1 T1 handle @param tile The tile to encode @param tcp Tile coding parameters */ void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); /** Decode the code-blocks of a tile @param t1 T1 handle @param tilec The tile to decode @param tccp Tile coding parameters */ void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __T1_H */ openjpeg-1.5.2/libopenjpeg/mqc.h0000644000175000017500000001363312315002100016415 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file mqc.h @brief Implementation of an MQ-Coder (MQC) The functions in MQC.C have for goal to realize the MQ-coder operations. The functions in MQC.C are used by some function in T1.C. */ /** @defgroup MQC MQC - Implementation of an MQ-Coder */ /*@{*/ /** This struct defines the state of a context. */ typedef struct opj_mqc_state { /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ unsigned int qeval; /** the Most Probable Symbol (0 or 1) */ int mps; /** next state if the next encoded symbol is the MPS */ struct opj_mqc_state *nmps; /** next state if the next encoded symbol is the LPS */ struct opj_mqc_state *nlps; } opj_mqc_state_t; #define MQC_NUMCTXS 19 /** MQ coder */ typedef struct opj_mqc { unsigned int c; unsigned int a; unsigned int ct; unsigned char *bp; unsigned char *start; unsigned char *end; opj_mqc_state_t *ctxs[MQC_NUMCTXS]; opj_mqc_state_t **curctx; #ifdef MQC_PERF_OPT unsigned char *buffer; #endif } opj_mqc_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Create a new MQC handle @return Returns a new MQC handle if successful, returns NULL otherwise */ opj_mqc_t* mqc_create(void); /** Destroy a previously created MQC handle @param mqc MQC handle to destroy */ void mqc_destroy(opj_mqc_t *mqc); /** Return the number of bytes written/read since initialisation @param mqc MQC handle @return Returns the number of bytes already encoded */ int mqc_numbytes(opj_mqc_t *mqc); /** 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) @param mqc MQC handle */ void mqc_resetstates(opj_mqc_t *mqc); /** Set the state of a particular context @param mqc MQC handle @param ctxno Number that identifies the context @param msb The MSB of the new state of the context @param prob Number that identifies the probability of the symbols for the new state of the context */ void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); /** Initialize the encoder @param mqc MQC handle @param bp Pointer to the start of the buffer where the bytes will be written */ void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); /** Set the current context used for coding/decoding @param mqc MQC handle @param ctxno Number that identifies the context */ #define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)] /** Encode a symbol using the MQ-coder @param mqc MQC handle @param d The symbol to be encoded (0 or 1) */ void mqc_encode(opj_mqc_t *mqc, int d); /** Flush the encoder, so that all remaining data is written @param mqc MQC handle */ void mqc_flush(opj_mqc_t *mqc); /** BYPASS mode switch, initialization operation. JPEG 2000 p 505.

    Not fully implemented and tested !!

    @param mqc MQC handle */ void mqc_bypass_init_enc(opj_mqc_t *mqc); /** BYPASS mode switch, coding operation. JPEG 2000 p 505.

    Not fully implemented and tested !!

    @param mqc MQC handle @param d The symbol to be encoded (0 or 1) */ void mqc_bypass_enc(opj_mqc_t *mqc, int d); /** BYPASS mode switch, flush operation

    Not fully implemented and tested !!

    @param mqc MQC handle @return Returns 1 (always) */ int mqc_bypass_flush_enc(opj_mqc_t *mqc); /** RESET mode switch @param mqc MQC handle */ void mqc_reset_enc(opj_mqc_t *mqc); /** RESTART mode switch (TERMALL) @param mqc MQC handle @return Returns 1 (always) */ int mqc_restart_enc(opj_mqc_t *mqc); /** RESTART mode switch (TERMALL) reinitialisation @param mqc MQC handle */ void mqc_restart_init_enc(opj_mqc_t *mqc); /** ERTERM mode switch (PTERM) @param mqc MQC handle */ void mqc_erterm_enc(opj_mqc_t *mqc); /** SEGMARK mode switch (SEGSYM) @param mqc MQC handle */ void mqc_segmark_enc(opj_mqc_t *mqc); /** Initialize the decoder @param mqc MQC handle @param bp Pointer to the start of the buffer from which the bytes will be read @param len Length of the input buffer */ void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); /** Decode a symbol @param mqc MQC handle @return Returns the decoded symbol (0 or 1) */ int mqc_decode(opj_mqc_t *const mqc); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __MQC_H */ openjpeg-1.5.2/libopenjpeg/cidx_manager.h0000644000175000017500000000435612315002100020260 0ustar mathieumathieu/* * $Id: cidx_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.h from 2KAN indexer */ #ifndef CIDX_MANAGER_H_ # define CIDX_MANAGER_H_ #include "openjpeg.h" /* * Write Codestream index box (superbox) * * @param[in] offset offset of j2k codestream * @param[in] cio file output handle * @param[in] image image data * @param[in] cstr_info codestream information * @param[in] j2klen length of j2k codestream * @return length of cidx box */ int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen); #endif /* !CIDX_MANAGER_H_ */ openjpeg-1.5.2/libopenjpeg/fix.h0000644000175000017500000000452012315002100016416 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 #if defined(_MSC_VER) || defined(__BORLANDC__) #define int64 __int64 #else #define int64 long long #endif /** @file fix.h @brief Implementation of operations of specific multiplication (FIX) The functions in FIX.H have for goal to realize specific multiplication. */ /** @defgroup FIX FIX - Implementation of operations of specific multiplication */ /*@{*/ /** Multiply two fixed-precision rational numbers. @param a @param b @return Returns a * b */ static INLINE int fix_mul(int a, int b) { int64 temp = (int64) a * (int64) b ; temp += temp & 4096; return (int) (temp >> 13) ; } /*@}*/ #endif /* __FIX_H */ openjpeg-1.5.2/libopenjpeg/t2.c0000644000175000017500000005740312315002100016160 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @defgroup T2 T2 - Implementation of a tier-2 coding */ /*@{*/ /** @name Local static functions */ /*@{*/ static void t2_putcommacode(opj_bio_t *bio, int n); static int t2_getcommacode(opj_bio_t *bio); /** Variable length code for signalling delta Zil (truncation point) @param bio Bit Input/Output component @param n delta Zil */ static void t2_putnumpasses(opj_bio_t *bio, int n); static int t2_getnumpasses(opj_bio_t *bio); /** Encode a packet of a tile to a destination buffer @param tile Tile for which to write the packets @param tcp Tile coding parameters @param pi Packet identity @param dest Destination buffer @param len Length of the destination buffer @param cstr_info Codestream information structure @param tileno Number of the tile encoded @return */ static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno); /** @param cblk @param index @param cblksty @param first */ static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first); /** Decode a packet of a tile from a source buffer @param t2 T2 handle @param src Source buffer @param len Length of the source buffer @param tile Tile for which to write the packets @param tcp Tile coding parameters @param pi Packet identity @param pack_info Packet information @return */ static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info); /*@}*/ /*@}*/ /* ----------------------------------------------------------------------- */ /* #define RESTART 0x04 */ static void t2_putcommacode(opj_bio_t *bio, int n) { while (--n >= 0) { bio_write(bio, 1, 1); } bio_write(bio, 0, 1); } static int t2_getcommacode(opj_bio_t *bio) { int n; for (n = 0; bio_read(bio, 1); n++) { ; } return n; } static void t2_putnumpasses(opj_bio_t *bio, int n) { if (n == 1) { bio_write(bio, 0, 1); } else if (n == 2) { bio_write(bio, 2, 2); } else if (n <= 5) { bio_write(bio, 0xc | (n - 3), 4); } else if (n <= 36) { bio_write(bio, 0x1e0 | (n - 6), 9); } else if (n <= 164) { bio_write(bio, 0xff80 | (n - 37), 16); } } static int t2_getnumpasses(opj_bio_t *bio) { int n; if (!bio_read(bio, 1)) return 1; if (!bio_read(bio, 1)) return 2; if ((n = bio_read(bio, 2)) != 3) return (3 + n); if ((n = bio_read(bio, 5)) != 31) return (6 + n); return (37 + bio_read(bio, 7)); } static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) { int bandno, cblkno; unsigned char *c = dest; int compno = pi->compno; /* component value */ int resno = pi->resno; /* resolution level value */ int precno = pi->precno; /* precinct value */ int layno = pi->layno; /* quality layer value */ opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; opj_tcd_resolution_t *res = &tilec->resolutions[resno]; opj_bio_t *bio = NULL; /* BIO component */ /* */ if (tcp->csty & J2K_CP_CSTY_SOP) { c[0] = 255; c[1] = 145; c[2] = 0; c[3] = 4; c[4] = (unsigned char)((tile->packno % 65536) / 256); c[5] = (unsigned char)((tile->packno % 65536) % 256); c += 6; } /* */ if (!layno) { for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; tgt_reset(prc->incltree); tgt_reset(prc->imsbtree); for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; cblk->numpasses = 0; tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); } } } bio = bio_create(); bio_init_enc(bio, c, length); bio_write(bio, 1, 1); /* Empty header bit */ /* Writing Packet header */ for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; opj_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++) { opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; opj_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(bio, prc->incltree, cblkno, layno + 1); } else { bio_write(bio, 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(bio, prc->imsbtree, cblkno, 999); } /* number of coding passes included */ t2_putnumpasses(bio, 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++) { opj_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(bio, 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++) { opj_tcd_pass_t *pass = &cblk->passes[passno]; nump++; len += pass->len; if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); len = 0; nump = 0; } } } } if (bio_flush(bio)) { bio_destroy(bio); return -999; /* modified to eliminate longjmp !! */ } c += bio_numbytes(bio); bio_destroy(bio); /* */ if (tcp->csty & J2K_CP_CSTY_EPH) { c[0] = 255; c[1] = 146; c += 2; } /* */ /* << INDEX */ /* End of packet header position. Currently only represents the distance to start of packet // Will be updated later by incrementing with packet start value */ if(cstr_info && cstr_info->index_write) { opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; info_PK->end_ph_pos = (int)(c - dest); } /* INDEX >> */ /* Writing the packet body */ for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; opj_tcd_layer_t *layer = &cblk->layers[layno]; if (!layer->numpasses) { continue; } if (c + layer->len > dest + length) { return -999; } memcpy(c, layer->data, layer->len); cblk->numpasses += layer->numpasses; c += layer->len; /* << INDEX */ if(cstr_info && cstr_info->index_write) { opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; info_PK->disto += layer->disto; if (cstr_info->D_max < info_PK->disto) { cstr_info->D_max = info_PK->disto; } } /* INDEX >> */ } } return (c - dest); } static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, int first) { opj_tcd_seg_t* seg; opj_tcd_seg_t* segs; segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, (index + 1) * sizeof(opj_tcd_seg_t)); if (segs == NULL) { return OPJ_FALSE; } cblk->segs = segs; seg = &cblk->segs[index]; seg->data = NULL; seg->dataindex = 0; 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; } return OPJ_TRUE; } static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) { int bandno, cblkno; unsigned char *c = src; opj_cp_t *cp = t2->cp; int compno = pi->compno; /* component value */ int resno = pi->resno; /* resolution level value */ int precno = pi->precno; /* precinct value */ int layno = pi->layno; /* quality layer value */ unsigned char *hd = NULL; int present; opj_bio_t *bio = NULL; /* BIO component */ opj_tcd_resolution_t* res; assert(&tile->comps[compno] != NULL); res = &tile->comps[compno].resolutions[resno]; if (layno == 0) { for (bandno = 0; bandno < res->numbands; bandno++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; tgt_reset(prc->incltree); tgt_reset(prc->imsbtree); for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; cblk->numsegs = 0; } } } /* SOP markers */ if (tcp->csty & J2K_CP_CSTY_SOP) { if ((*c) != 0xff || (*(c + 1) != 0x91)) { opj_event_msg(t2->cinfo, EVT_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 */ bio = bio_create(); if (cp->ppm == 1) { /* PPM */ hd = cp->ppm_data; bio_init_dec(bio, hd, cp->ppm_len); } else if (tcp->ppt == 1) { /* PPT */ hd = tcp->ppt_data; bio_init_dec(bio, hd, tcp->ppt_len); } else { /* Normal Case */ hd = c; bio_init_dec(bio, hd, src+len-hd); } present = bio_read(bio, 1); if (!present) { bio_inalign(bio); hd += bio_numbytes(bio); bio_destroy(bio); /* EPH markers */ if (tcp->csty & J2K_CP_CSTY_EPH) { if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { printf("Error : expected EPH marker\n"); } else { hd += 2; } } /* << INDEX */ /* End of packet header position. Currently only represents the distance to start of packet // Will be updated later by incrementing with packet start value*/ if(pack_info) { pack_info->end_ph_pos = (int)(c - src); } /* INDEX >> */ 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++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { int included, increment, n, segno; opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; /* if cblk not yet included before --> inclusion tagtree */ if (!cblk->numsegs) { included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); /* else one bit */ } else { included = bio_read(bio, 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(bio, prc->imsbtree, cblkno, i); i++) { ; } numimsbs = i - 1; cblk->numbps = band->numbps - numimsbs; cblk->numlenbits = 3; } /* number of coding passes */ cblk->numnewpasses = t2_getnumpasses(bio); increment = t2_getcommacode(bio); /* length indicator increment */ cblk->numlenbits += increment; segno = 0; if (!cblk->numsegs) { if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1)) { opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); bio_destroy(bio); return -999; } } else { segno = cblk->numsegs - 1; if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) { ++segno; if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) { opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); bio_destroy(bio); return -999; } } } n = cblk->numnewpasses; do { cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - cblk->segs[segno].numpasses, n); cblk->segs[segno].newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses)); n -= cblk->segs[segno].numnewpasses; if (n > 0) { ++segno; if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) { opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); bio_destroy(bio); return -999; } } } while (n > 0); } } if (bio_inalign(bio)) { bio_destroy(bio); return -999; } hd += bio_numbytes(bio); bio_destroy(bio); /* EPH markers */ if (tcp->csty & J2K_CP_CSTY_EPH) { if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); return -999; } else { hd += 2; } } /* << INDEX */ /* End of packet header position. Currently only represents the distance to start of packet // Will be updated later by incrementing with packet start value*/ if(pack_info) { pack_info->end_ph_pos = (int)(hd - src); } /* INDEX >> */ 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++) { opj_tcd_band_t *band = &res->bands[bandno]; opj_tcd_precinct_t *prc = &band->precincts[precno]; if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; opj_tcd_seg_t *seg = NULL; 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; } #ifdef USE_JPWL /* we need here a j2k handle to verify if making a check to the validity of cblocks parameters is selected from user (-W) */ /* let's check that we are not exceeding */ if ((cblk->len + seg->newlen) > 8192) { opj_event_msg(t2->cinfo, EVT_WARNING, "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", seg->newlen, cblkno, precno, bandno, resno, compno); if (!JPWL_ASSUME) { opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); return -999; } seg->newlen = 8192 - cblk->len; opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen); break; }; #endif /* USE_JPWL */ cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char)); memcpy(cblk->data + cblk->len, c, seg->newlen); if (seg->numpasses == 0) { seg->data = &cblk->data; seg->dataindex = 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); } /* ----------------------------------------------------------------------- */ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp){ unsigned char *c = dest; int e = 0; int compno; opj_pi_iterator_t *pi = NULL; int poc; opj_image_t *image = t2->image; opj_cp_t *cp = t2->cp; opj_tcp_t *tcp = &cp->tcps[tileno]; int pocno = cp->cinema == CINEMA4K_24? 2: 1; int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; pi = pi_initialise_encode(image, cp, tileno, t2_mode); if(!pi) { /* TODO: throw an error */ return -999; } if(t2_mode == THRESH_CALC ){ /* Calculating threshold */ for(compno = 0; compno < maxcomp; compno++ ){ for(poc = 0; poc < pocno ; poc++){ int comp_len = 0; int tpnum = compno; if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) { opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n"); pi_destroy(pi, cp, tileno); return -999; } while (pi_next(&pi[poc])) { if (pi[poc].layno < maxlayers) { e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, cstr_info, tileno); comp_len = comp_len + e; if (e == -999) { break; } else { c += e; } } } if (e == -999) break; if (cp->max_comp_size){ if (comp_len > cp->max_comp_size){ e = -999; break; } } } if (e == -999) break; } }else{ /* t2_mode == FINAL_PASS */ pi_create_encode(pi, cp,tileno,pino,tpnum,tppos,t2_mode,cur_totnum_tp); while (pi_next(&pi[pino])) { if (pi[pino].layno < maxlayers) { e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, cstr_info, tileno); if (e == -999) { break; } else { c += e; } /* INDEX >> */ if(cstr_info) { if(cstr_info->index_write) { opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; if (!cstr_info->packno) { info_PK->start_pos = info_TL->end_header + 1; } else { info_PK->start_pos = ((cp->tp_on | tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; } info_PK->end_pos = info_PK->start_pos + e - 1; info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance // to start of packet is incremented by value of start of packet*/ } cstr_info->packno++; } /* << INDEX */ tile->packno++; } } } pi_destroy(pi, cp, tileno); if (e == -999) { return e; } return (c - dest); } int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) { unsigned char *c = src; opj_pi_iterator_t *pi; int pino, e = 0; int n = 0, curtp = 0; int tp_start_packno; opj_image_t *image = t2->image; opj_cp_t *cp = t2->cp; /* create a packet iterator */ pi = pi_create_decode(image, cp, tileno); if(!pi) { /* TODO: throw an error */ return -999; } tp_start_packno = 0; for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { while (pi_next(&pi[pino])) { if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { opj_packet_info_t *pack_info; if (cstr_info) pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno]; else pack_info = NULL; e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], pack_info); } else { e = 0; } if(e == -999) { pi_destroy(pi, cp, tileno); return -999; } /* progression in resolution */ image->comps[pi[pino].compno].resno_decoded = (e > 0) ? int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) : image->comps[pi[pino].compno].resno_decoded; n++; /* INDEX >> */ if(cstr_info) { opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; if (!cstr_info->packno) { info_PK->start_pos = info_TL->end_header + 1; } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ /* New tile part*/ info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part*/ info_TL->tp[curtp].tp_start_pack = tp_start_packno; tp_start_packno = cstr_info->packno; curtp++; info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1; } else { info_PK->start_pos = (cp->tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1; } info_PK->end_pos = info_PK->start_pos + e - 1; info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance // to start of packet is incremented by value of start of packet*/ cstr_info->packno++; } /* << INDEX */ if (e == -999) { /* ADD */ break; } else { c += e; } } } /* INDEX >> */ if(cstr_info) { cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part*/ cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno; } /* << INDEX */ /* don't forget to release pi */ pi_destroy(pi, cp, tileno); if (e == -999) { return e; } return (c - src); } /* ----------------------------------------------------------------------- */ opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) { /* create the tcd structure */ opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); if(!t2) return NULL; t2->cinfo = cinfo; t2->image = image; t2->cp = cp; return t2; } void t2_destroy(opj_t2_t *t2) { if(t2) { opj_free(t2); } } openjpeg-1.5.2/libopenjpeg/jpt.h0000644000175000017500000000521512315002100016427 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __JPT_H #define __JPT_H /** @file jpt.h @brief JPT-stream reader (JPEG 2000, JPIP) JPT-stream functions are implemented in J2K.C. */ /** Message Header JPT stream structure */ typedef struct opj_jpt_msg_header { /** In-class Identifier */ unsigned int Id; /** Last byte information */ unsigned int last_byte; /** Class Identifier */ unsigned int Class_Id; /** CSn : index identifier */ unsigned int CSn_Id; /** Message offset */ unsigned int Msg_offset; /** Message length */ unsigned int Msg_length; /** Auxiliary for JPP case */ unsigned int Layer_nb; } opj_jpt_msg_header_t; /* ----------------------------------------------------------------------- */ /** Initialize the value of the message header structure @param header Message header structure */ void jpt_init_msg_header(opj_jpt_msg_header_t * header); /** Read the message header for a JPP/JPT - stream @param cinfo Codec context info @param cio CIO handle @param header Message header structure */ void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header); #endif openjpeg-1.5.2/libopenjpeg/jp2.c0000644000175000017500000011043312315002100016317 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2010-2011, Kaori Hagihara * 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 /** @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 opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box); /*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/ /** Read the IHDR box - Image Header box @param jp2 JP2 handle @param cio Input buffer stream @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); static opj_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); /** Write the FTYP box - File type box @param jp2 JP2 handle @param cio Output buffer stream */ static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); /** Read the FTYP box - File type box @param jp2 JP2 handle @param cio Input buffer stream @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset); static void jp2_write_jp(opj_cio_t *cio); /** Read the JP box - JPEG 2000 signature @param jp2 JP2 handle @param cio Input buffer stream @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); /** Decode the structure of a JP2 file @param jp2 JP2 handle @param cio Input buffer stream @param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); /** Apply collected palette data @param color Collector for profile, cdef and pclr data @param image */ static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo); /** Collect palette data @param jp2 JP2 handle @param cio Input buffer stream @param box @param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color); /** Collect component mapping data @param jp2 JP2 handle @param cio Input buffer stream @param box @param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color); /** Collect colour specification data @param jp2 JP2 handle @param cio Input buffer stream @param box @param color Collector for profile, cdef and pclr data @return Returns true if successful, returns false otherwise */ static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color); /** Write file Index (superbox) @param[in] offset_jp2c offset of jp2c box @param[in] length_jp2c length of jp2c box @param[in] offset_idx offset of cidx box @param[in] length_idx length of cidx box @param[in] cio file output handle @return length of fidx box */ static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio); /** Write index Finder box @param[in] offset offset of fidx box @param[in] length length of fidx box @param[in] cio file output handle */ static void write_iptr( int offset, int length, opj_cio_t *cio); /** Write proxy box @param[in] offset_jp2c offset of jp2c box @param[in] length_jp2c length of jp2c box @param[in] offset_idx offset of cidx box @param[in] length_idx length of cidx box @param[in] cio file output handle */ static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio); /*@}*/ /*@}*/ /* ----------------------------------------------------------------------- */ static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) { 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(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n"); return OPJ_FALSE; } 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; } else if (box->length < 0) { opj_event_msg(cinfo, EVT_ERROR, "Integer overflow in box->length\n"); return OPJ_FALSE; /* TODO: actually check jp2_read_boxhdr's return value */ } return OPJ_TRUE; } #if 0 static void jp2_write_url(opj_cio_t *cio, char *Idx_file) { unsigned int i; opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_URL, 4); /* DBTL */ cio_write(cio, 0, 1); /* VERS */ cio_write(cio, 0, 3); /* FLAG */ if(Idx_file) { for (i = 0; i < strlen(Idx_file); i++) { cio_write(cio, Idx_file[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); } #endif static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; opj_common_ptr cinfo = jp2->cinfo; if(jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) { opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); return OPJ_FALSE; } if (JP2_IHDR != box.type) { opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n"); return OPJ_FALSE; } jp2->h = cio_read(cio, 4); /* HEIGHT */ jp2->w = cio_read(cio, 4); /* WIDTH */ jp2->numcomps = cio_read(cio, 2); /* NC */ jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); jp2->bpc = cio_read(cio, 1); /* BPC */ jp2->C = cio_read(cio, 1); /* C */ jp2->UnkC = cio_read(cio, 1); /* UnkC */ jp2->IPR = cio_read(cio, 1); /* IPR */ if (cio_tell(cio) - box.init_pos != box.length) { opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n"); return OPJ_FALSE; } return OPJ_TRUE; } static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_IHDR, 4); /* IHDR */ cio_write(cio, jp2->h, 4); /* HEIGHT */ cio_write(cio, jp2->w, 4); /* WIDTH */ cio_write(cio, jp2->numcomps, 2); /* NC */ cio_write(cio, jp2->bpc, 1); /* BPC */ cio_write(cio, jp2->C, 1); /* C : Always 7 */ cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */ cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */ 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); } static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { unsigned int i; opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_BPCC, 4); /* BPCC */ for (i = 0; i < jp2->numcomps; i++) { cio_write(cio, jp2->comps[i].bpcc, 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); } static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) { unsigned int i; opj_jp2_box_t box; opj_common_ptr cinfo = jp2->cinfo; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) { opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); return OPJ_FALSE; } if (JP2_BPCC != box.type) { opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n"); return OPJ_FALSE; } for (i = 0; i < jp2->numcomps; i++) { jp2->comps[i].bpcc = cio_read(cio, 1); } if (cio_tell(cio) - box.init_pos != box.length) { opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); return OPJ_FALSE; } return OPJ_TRUE; } static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_COLR, 4); /* COLR */ cio_write(cio, jp2->meth, 1); /* METH */ cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */ cio_write(cio, jp2->approx, 1); /* APPROX */ if(jp2->meth == 2) jp2->enumcs = 0; cio_write(cio, jp2->enumcs, 4); /* EnumCS */ 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); } static void jp2_free_pclr(opj_jp2_color_t *color) { opj_free(color->jp2_pclr->channel_sign); opj_free(color->jp2_pclr->channel_size); opj_free(color->jp2_pclr->entries); if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap); opj_free(color->jp2_pclr); color->jp2_pclr = NULL; } static void free_color_data(opj_jp2_color_t *color) { if(color->jp2_pclr) { jp2_free_pclr(color); } if(color->jp2_cdef) { if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); opj_free(color->jp2_cdef); } if(color->icc_profile_buf) opj_free(color->icc_profile_buf); } static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo) { opj_image_comp_t *old_comps, *new_comps; unsigned char *channel_size, *channel_sign; unsigned int *entries; opj_jp2_cmap_comp_t *cmap; int *src, *dst; unsigned int j, max; unsigned short i, nr_channels, cmp, pcol; int k, top_k; channel_size = color->jp2_pclr->channel_size; channel_sign = color->jp2_pclr->channel_sign; entries = color->jp2_pclr->entries; cmap = color->jp2_pclr->cmap; nr_channels = color->jp2_pclr->nr_channels; old_comps = image->comps; new_comps = (opj_image_comp_t*) opj_malloc(nr_channels * sizeof(opj_image_comp_t)); for(i = 0; i < nr_channels; ++i) { pcol = cmap[i].pcol; cmp = cmap[i].cmp; if( pcol < nr_channels ) new_comps[pcol] = old_comps[cmp]; else { opj_event_msg(cinfo, EVT_ERROR, "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels); continue; } if(cmap[i].mtyp == 0) /* Direct use */ { old_comps[cmp].data = NULL; continue; } /* Palette mapping: */ new_comps[pcol].data = (int*) opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int)); new_comps[pcol].prec = channel_size[i]; new_comps[pcol].sgnd = channel_sign[i]; } top_k = color->jp2_pclr->nr_entries - 1; for(i = 0; i < nr_channels; ++i) { /* Direct use: */ if(cmap[i].mtyp == 0) continue; /* Palette mapping: */ cmp = cmap[i].cmp; pcol = cmap[i].pcol; src = old_comps[cmp].data; dst = new_comps[pcol].data; max = new_comps[pcol].w * new_comps[pcol].h; for(j = 0; j < max; ++j) { /* The index */ if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k; /* The colour */ dst[j] = entries[k * nr_channels + pcol]; } } max = image->numcomps; for(i = 0; i < max; ++i) { if(old_comps[i].data) opj_free(old_comps[i].data); } opj_free(old_comps); image->comps = new_comps; image->numcomps = nr_channels; jp2_free_pclr(color); }/* apply_pclr() */ static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_pclr_t *jp2_pclr; unsigned char *channel_size, *channel_sign; unsigned int *entries; unsigned short nr_entries, nr_channels; unsigned short i, j; unsigned char uc; OPJ_ARG_NOT_USED(box); OPJ_ARG_NOT_USED(jp2); /* Part 1, I.5.3.4: 'There shall be at most one Palette box inside * a JP2 Header box' : */ if(color->jp2_pclr) return OPJ_FALSE; nr_entries = (unsigned short)cio_read(cio, 2); /* NE */ nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */ entries = (unsigned int*) opj_malloc(nr_channels * nr_entries * sizeof(unsigned int)); channel_size = (unsigned char*)opj_malloc(nr_channels); channel_sign = (unsigned char*)opj_malloc(nr_channels); jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t)); jp2_pclr->channel_sign = channel_sign; jp2_pclr->channel_size = channel_size; jp2_pclr->entries = entries; jp2_pclr->nr_entries = nr_entries; jp2_pclr->nr_channels = nr_channels; jp2_pclr->cmap = NULL; color->jp2_pclr = jp2_pclr; for(i = 0; i < nr_channels; ++i) { uc = cio_read(cio, 1); /* Bi */ channel_size[i] = (uc & 0x7f) + 1; channel_sign[i] = (uc & 0x80)?1:0; } for(j = 0; j < nr_entries; ++j) { for(i = 0; i < nr_channels; ++i) { /* Cji */ *entries++ = cio_read(cio, (channel_size[i]+7)>>3); } } return OPJ_TRUE; }/* jp2_read_pclr() */ static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_cmap_comp_t *cmap; unsigned short i, nr_channels; OPJ_ARG_NOT_USED(box); OPJ_ARG_NOT_USED(jp2); /* Need nr_channels: */ if(color->jp2_pclr == NULL) return OPJ_FALSE; /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box * inside a JP2 Header box' : */ if(color->jp2_pclr->cmap) return OPJ_FALSE; nr_channels = color->jp2_pclr->nr_channels; cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t)); for(i = 0; i < nr_channels; ++i) { cmap[i].cmp = (unsigned short)cio_read(cio, 2); cmap[i].mtyp = cio_read(cio, 1); cmap[i].pcol = cio_read(cio, 1); } color->jp2_pclr->cmap = cmap; return OPJ_TRUE; }/* jp2_read_cmap() */ static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color) { opj_jp2_cdef_info_t *info; unsigned short i, n, cn, typ, asoc, acn; info = color->jp2_cdef->info; n = color->jp2_cdef->n; for(i = 0; i < n; ++i) { /* WATCH: acn = asoc - 1 ! */ if((asoc = info[i].asoc) == 0) continue; cn = info[i].cn; typ = info[i].typ; acn = asoc - 1; (void)typ; if(cn != acn) { opj_image_comp_t saved; memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t)); memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t)); memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t)); info[i].asoc = cn + 1; info[acn].asoc = info[acn].cn + 1; } } if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info); opj_free(color->jp2_cdef); color->jp2_cdef = NULL; }/* jp2_apply_cdef() */ static opj_bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color) { opj_jp2_cdef_info_t *info; unsigned short i, n; OPJ_ARG_NOT_USED(box); OPJ_ARG_NOT_USED(jp2); /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box * inside a JP2 Header box.' */ if(color->jp2_cdef) return OPJ_FALSE; if((n = (unsigned short)cio_read(cio, 2)) == 0) return OPJ_FALSE; /* szukw000: FIXME */ info = (opj_jp2_cdef_info_t*) opj_malloc(n * sizeof(opj_jp2_cdef_info_t)); color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); color->jp2_cdef->info = info; color->jp2_cdef->n = n; for(i = 0; i < n; ++i) { info[i].cn = (unsigned short)cio_read(cio, 2); info[i].typ = (unsigned short)cio_read(cio, 2); info[i].asoc = (unsigned short)cio_read(cio, 2); } return OPJ_TRUE; }/* jp2_read_cdef() */ static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_box_t *box, opj_jp2_color_t *color) { int skip_len; opj_common_ptr cinfo; /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour * Specification boxes after the first.' */ if(color->jp2_has_colr) return OPJ_FALSE; cinfo = jp2->cinfo; jp2->meth = cio_read(cio, 1); /* METH */ jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */ jp2->approx = cio_read(cio, 1); /* APPROX */ if (jp2->meth == 1) { jp2->enumcs = cio_read(cio, 4); /* EnumCS */ } else if (jp2->meth == 2) { /* skip PROFILE */ skip_len = box->init_pos + box->length - cio_tell(cio); if (skip_len < 0) { opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n"); return OPJ_FALSE; } if(skip_len > 0) { unsigned char *start; start = cio_getbp(cio); color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len); color->icc_profile_len = skip_len; cio_skip(cio, box->init_pos + box->length - cio_tell(cio)); memcpy(color->icc_profile_buf, start, skip_len); } } if (cio_tell(cio) - box->init_pos != box->length) { opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n"); return OPJ_FALSE; } color->jp2_has_colr = 1; return OPJ_TRUE; }/* jp2_read_colr() */ opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) { opj_jp2_box_t box; int jp2h_end; opj_common_ptr cinfo = jp2->cinfo; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; do { if (JP2_JP2H != box.type) { if (box.type == JP2_JP2C) { opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n"); return OPJ_FALSE; } if (box.length <= 8) return OPJ_FALSE; cio_skip(cio, box.length - 8); if(cio->bp >= cio->end) return OPJ_FALSE; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; } } while(JP2_JP2H != box.type); if (!jp2_read_ihdr(jp2, cio)) return OPJ_FALSE; jp2h_end = box.init_pos + box.length; if (jp2->bpc == 255) { if (!jp2_read_bpcc(jp2, cio)) return OPJ_FALSE; } if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; while(cio_tell(cio) < jp2h_end) { if(box.type == JP2_COLR) { if( !jp2_read_colr(jp2, cio, &box, color)) { if (box.length <= 8) return OPJ_FALSE; cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); } if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; continue; } if(box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef) { if( !jp2_read_cdef(jp2, cio, &box, color)) { if (box.length <= 8) return OPJ_FALSE; cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); } if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; continue; } if(box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef) { if( !jp2_read_pclr(jp2, cio, &box, color)) { if (box.length <= 8) return OPJ_FALSE; cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); } if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; continue; } if(box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef) { if( !jp2_read_cmap(jp2, cio, &box, color)) { if (box.length <= 8) return OPJ_FALSE; cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); } if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; continue; } if (box.length <= 8) return OPJ_FALSE; cio_seek(cio, box.init_pos + 8); cio_skip(cio, box.length - 8); if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; }/* while(cio_tell(cio) < box_end) */ cio_seek(cio, jp2h_end); /* Part 1, I.5.3.3 : 'must contain at least one' */ return (color->jp2_has_colr == 1); }/* jp2_read_jp2h() */ static opj_bool opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_common_ptr cinfo) { int i; /* testcase 4149.pdf.SIGSEGV.cf7.3501 */ if (color->jp2_cdef) { opj_jp2_cdef_info_t *info = color->jp2_cdef->info; int n = color->jp2_cdef->n; for (i = 0; i < n; i++) { if (info[i].cn >= image->numcomps) { opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, image->numcomps); return OPJ_FALSE; } if (info[i].asoc > 0 && (info[i].asoc - 1) >= image->numcomps) { opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, image->numcomps); return OPJ_FALSE; } } } /* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and 66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */ if (color->jp2_pclr && color->jp2_pclr->cmap) { int nr_channels = color->jp2_pclr->nr_channels; opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap; opj_bool *pcol_usage, is_sane = OPJ_TRUE; /* verify that all original components match an existing one */ for (i = 0; i < nr_channels; i++) { if (cmap[i].cmp >= image->numcomps) { opj_event_msg(cinfo, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps); is_sane = OPJ_FALSE; } } pcol_usage = opj_calloc(nr_channels, sizeof(opj_bool)); if (!pcol_usage) { opj_event_msg(cinfo, EVT_ERROR, "Unexpected OOM.\n"); return OPJ_FALSE; } /* verify that no component is targeted more than once */ for (i = 0; i < nr_channels; i++) { int pcol = cmap[i].pcol; assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1); if (pcol >= nr_channels) { opj_event_msg(cinfo, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol); is_sane = OPJ_FALSE; } else if (pcol_usage[pcol] && cmap[i].mtyp == 1) { opj_event_msg(cinfo, EVT_ERROR, "Component %d is mapped twice.\n", pcol); is_sane = OPJ_FALSE; } else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) { /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then * the value of this field shall be 0. */ opj_event_msg(cinfo, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol); is_sane = OPJ_FALSE; } else pcol_usage[pcol] = OPJ_TRUE; } /* verify that all components are targeted at least once */ for (i = 0; i < nr_channels; i++) { if (!pcol_usage[i] && cmap[i].mtyp != 0) { opj_event_msg(cinfo, EVT_ERROR, "Component %d doesn't have a mapping.\n", i); is_sane = OPJ_FALSE; } } opj_free(pcol_usage); if (!is_sane) { return OPJ_FALSE; } } return OPJ_TRUE; } opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info) { opj_common_ptr cinfo; opj_image_t *image = NULL; opj_jp2_color_t color; if(!jp2 || !cio) { return NULL; } memset(&color, 0, sizeof(opj_jp2_color_t)); cinfo = jp2->cinfo; /* JP2 decoding */ if(!jp2_read_struct(jp2, cio, &color)) { free_color_data(&color); opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); return NULL; } /* J2K decoding */ image = j2k_decode(jp2->j2k, cio, cstr_info); if(!image) { free_color_data(&color); opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); return NULL; } if (!jp2->ignore_pclr_cmap_cdef){ if (!opj_jp2_check_color(image, &color, cinfo)) { opj_event_msg(cinfo, EVT_ERROR, "Failed to decode PCRL box\n"); return NULL; } /* Set Image Color Space */ if (jp2->enumcs == 16) image->color_space = CLRSPC_SRGB; else if (jp2->enumcs == 17) image->color_space = CLRSPC_GRAY; else if (jp2->enumcs == 18) image->color_space = CLRSPC_SYCC; else image->color_space = CLRSPC_UNKNOWN; if(color.jp2_cdef) { jp2_apply_cdef(image, &color); } if(color.jp2_pclr) { /* Part 1, I.5.3.4: Either both or none : */ if( !color.jp2_pclr->cmap) jp2_free_pclr(&color); else jp2_apply_pclr(&color, image, cinfo); } if(color.icc_profile_buf) { image->icc_profile_buf = color.icc_profile_buf; color.icc_profile_buf = NULL; image->icc_profile_len = color.icc_profile_len; } } return image; }/* opj_jp2_decode() */ void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_JP2H, 4); /* JP2H */ jp2_write_ihdr(jp2, cio); if (jp2->bpc == 255) { jp2_write_bpcc(jp2, cio); } jp2_write_colr(jp2, 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); } static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { unsigned int i; opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_FTYP, 4); /* FTYP */ cio_write(cio, jp2->brand, 4); /* BR */ cio_write(cio, jp2->minversion, 4); /* MinV */ for (i = 0; i < jp2->numcl; i++) { cio_write(cio, jp2->cl[i], 4); /* CL */ } 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); } static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) { int i; opj_jp2_box_t box; opj_common_ptr cinfo = jp2->cinfo; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) { opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); return OPJ_FALSE; } if (JP2_FTYP != box.type) { opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n"); return OPJ_FALSE; } jp2->brand = cio_read(cio, 4); /* BR */ jp2->minversion = cio_read(cio, 4); /* MinV */ jp2->numcl = (box.length - 16) / 4; /* edf_c2_1673169.jp2 */ if (cio_numbytesleft(cio) < ((int)jp2->numcl * 4)) { opj_event_msg(cinfo, EVT_ERROR, "Not enough bytes in FTYP Box " "(expected %d, but only %d left)\n", ((int)jp2->numcl * 4), cio_numbytesleft(cio)); return OPJ_FALSE; } jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int)); for (i = 0; i < (int)jp2->numcl; i++) { jp2->cl[i] = cio_read(cio, 4); /* CLi */ } if (cio_tell(cio) - box.init_pos != box.length) { opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n"); return OPJ_FALSE; } return OPJ_TRUE; } static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { unsigned int j2k_codestream_offset, j2k_codestream_length; opj_jp2_box_t box; opj_j2k_t *j2k = jp2->j2k; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_JP2C, 4); /* JP2C */ /* J2K encoding */ j2k_codestream_offset = cio_tell(cio); if(!j2k_encode(j2k, cio, image, cstr_info)) { opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n"); return 0; } j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset; jp2->j2k_codestream_offset = j2k_codestream_offset; jp2->j2k_codestream_length = j2k_codestream_length; box.length = 8 + jp2->j2k_codestream_length; cio_seek(cio, box.init_pos); cio_write(cio, box.length, 4); /* L */ cio_seek(cio, box.init_pos + box.length); return box.length; } static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) { opj_jp2_box_t box; opj_common_ptr cinfo = jp2->cinfo; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) { opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); return OPJ_FALSE; } do { if(JP2_JP2C != box.type) { if (box.length <= 8) return OPJ_FALSE; cio_skip(cio, box.length - 8); if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) return OPJ_FALSE; } } while(JP2_JP2C != box.type); *j2k_codestream_offset = cio_tell(cio); if (box.length <= 8) return OPJ_FALSE; *j2k_codestream_length = box.length - 8; return OPJ_TRUE; } static void jp2_write_jp(opj_cio_t *cio) { opj_jp2_box_t box; box.init_pos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, JP2_JP, 4); /* JP2 signature */ cio_write(cio, 0x0d0a870a, 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); } static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) { opj_jp2_box_t box; opj_common_ptr cinfo = jp2->cinfo; if( jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE ) { opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); return OPJ_FALSE; } if (JP2_JP != box.type) { opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n"); return OPJ_FALSE; } if (0x0d0a870a != cio_read(cio, 4)) { opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n"); return OPJ_FALSE; } if (cio_tell(cio) - box.init_pos != box.length) { opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n"); return OPJ_FALSE; } return OPJ_TRUE; } static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) { if (!jp2_read_jp(jp2, cio)) return OPJ_FALSE; if (!jp2_read_ftyp(jp2, cio)) return OPJ_FALSE; if (!jp2_read_jp2h(jp2, cio, color)) return OPJ_FALSE; if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset)) return OPJ_FALSE; return OPJ_TRUE; } static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio) { int len, lenp; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_FIDX, 4); /* IPTR */ write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio); len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); return len; } static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio) { int len, lenp; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_PRXY, 4); /* IPTR */ cio_write( cio, offset_jp2c, 8); /* OOFF */ cio_write( cio, length_jp2c, 4); /* OBH part 1 */ cio_write( cio, JP2_JP2C, 4); /* OBH part 2 */ cio_write( cio, 1,1); /* NI */ cio_write( cio, offset_idx, 8); /* IOFF */ cio_write( cio, length_idx, 4); /* IBH part 1 */ cio_write( cio, JPIP_CIDX, 4); /* IBH part 2 */ len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); } static void write_iptr( int offset, int length, opj_cio_t *cio) { int len, lenp; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_IPTR, 4); /* IPTR */ cio_write( cio, offset, 8); cio_write( cio, length, 8); len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); } /* ----------------------------------------------------------------------- */ /* JP2 decoder interface */ /* ----------------------------------------------------------------------- */ opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) { opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t)); if(jp2) { jp2->cinfo = cinfo; /* create the J2K codec */ jp2->j2k = j2k_create_decompress(cinfo); if(jp2->j2k == NULL) { jp2_destroy_decompress(jp2); return NULL; } } return jp2; } void jp2_destroy_decompress(opj_jp2_t *jp2) { if(jp2) { /* destroy the J2K codec */ j2k_destroy_decompress(jp2->j2k); if(jp2->comps) { opj_free(jp2->comps); } if(jp2->cl) { opj_free(jp2->cl); } opj_free(jp2); } } void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) { /* setup the J2K codec */ j2k_setup_decoder(jp2->j2k, parameters); /* further JP2 initializations go here */ jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; } /* ----------------------------------------------------------------------- */ /* JP2 encoder interface */ /* ----------------------------------------------------------------------- */ opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) { opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); if(jp2) { memset(jp2, 0, sizeof(opj_jp2_t)); jp2->cinfo = cinfo; /* create the J2K codec */ jp2->j2k = j2k_create_compress(cinfo); if(jp2->j2k == NULL) { jp2_destroy_compress(jp2); return NULL; } } return jp2; } void jp2_destroy_compress(opj_jp2_t *jp2) { if(jp2) { /* destroy the J2K codec */ j2k_destroy_compress(jp2->j2k); if(jp2->comps) { opj_free(jp2->comps); } if(jp2->cl) { opj_free(jp2->cl); } opj_free(jp2); } } void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) { int i; int depth_0, sign; if(!jp2 || !parameters || !image) return; /* setup the J2K codec */ /* ------------------- */ /* Check if number of components respects standard */ if (image->numcomps < 1 || image->numcomps > 16384) { opj_event_msg(jp2->cinfo, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n"); return; } j2k_setup_encoder(jp2->j2k, parameters, image); /* setup the JP2 codec */ /* ------------------- */ /* Profile box */ jp2->brand = JP2_JP2; /* BR */ jp2->minversion = 0; /* MinV */ jp2->numcl = 1; jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int)); jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ /* Image Header box */ jp2->numcomps = image->numcomps; /* NC */ jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t)); jp2->h = image->y1 - image->y0; /* HEIGHT */ jp2->w = image->x1 - image->x0; /* WIDTH */ /* BPC */ depth_0 = image->comps[0].prec - 1; sign = image->comps[0].sgnd; jp2->bpc = depth_0 + (sign << 7); for (i = 1; i < image->numcomps; i++) { int depth = image->comps[i].prec - 1; sign = image->comps[i].sgnd; if (depth_0 != depth) jp2->bpc = 255; } jp2->C = 7; /* C : Always 7 */ jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */ jp2->IPR = 0; /* IPR, no intellectual property */ /* BitsPerComponent box */ for (i = 0; i < image->numcomps; i++) { jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); } jp2->meth = 1; if (image->color_space == 1) jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2.1 */ else if (image->color_space == 2) jp2->enumcs = 17; /* greyscale */ else if (image->color_space == 3) jp2->enumcs = 18; /* YUV */ jp2->precedence = 0; /* PRECEDENCE */ jp2->approx = 0; /* APPROX */ jp2->jpip_on = parameters->jpip_on; } opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) { int pos_iptr, pos_cidx, pos_jp2c, len_jp2c, len_cidx, end_pos, pos_fidx, len_fidx; pos_jp2c = pos_iptr = -1; /* remove a warning */ /* JP2 encoding */ /* JPEG 2000 Signature box */ jp2_write_jp(cio); /* File Type box */ jp2_write_ftyp(jp2, cio); /* JP2 Header box */ jp2_write_jp2h(jp2, cio); if( jp2->jpip_on){ pos_iptr = cio_tell( cio); cio_skip( cio, 24); /* IPTR further ! */ pos_jp2c = cio_tell( cio); } /* J2K encoding */ if(!(len_jp2c = jp2_write_jp2c( jp2, cio, image, cstr_info))){ opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n"); return OPJ_FALSE; } if( jp2->jpip_on){ pos_cidx = cio_tell( cio); len_cidx = write_cidx( pos_jp2c+8, cio, image, *cstr_info, len_jp2c-8); pos_fidx = cio_tell( cio); len_fidx = write_fidx( pos_jp2c, len_jp2c, pos_cidx, len_cidx, cio); end_pos = cio_tell( cio); cio_seek( cio, pos_iptr); write_iptr( pos_fidx, len_fidx, cio); cio_seek( cio, end_pos); } return OPJ_TRUE; } openjpeg-1.5.2/libopenjpeg/t1_luts.h0000644000175000017500000002337112315002100017230 0ustar mathieumathieu/* This file was automatically generated by t1_generate_luts.c */ static char lut_ctxno_zc[1024] = { 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8 }; static char lut_ctxno_sc[256] = { 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd }; static char lut_spb[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680 }; static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00 }; static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = { 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780 }; static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = { 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00 }; openjpeg-1.5.2/libopenjpeg/mqc.c0000644000175000017500000003514412315002100016411 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" /** @defgroup MQC MQC - Implementation of an MQ-Coder */ /*@{*/ /** @name Local static functions */ /*@{*/ /** Output a byte, doing bit-stuffing if necessary. After a 0xff byte, the next byte must be smaller than 0x90. @param mqc MQC handle */ static void mqc_byteout(opj_mqc_t *mqc); /** Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 @param mqc MQC handle */ static void mqc_renorme(opj_mqc_t *mqc); /** Encode the most probable symbol @param mqc MQC handle */ static void mqc_codemps(opj_mqc_t *mqc); /** Encode the most least symbol @param mqc MQC handle */ static void mqc_codelps(opj_mqc_t *mqc); /** Fill mqc->c with 1's for flushing @param mqc MQC handle */ static void mqc_setbits(opj_mqc_t *mqc); /** FIXME: documentation ??? @param mqc MQC handle @return */ static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc); /** FIXME: documentation ??? @param mqc MQC handle @return */ static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc); /** Input a byte @param mqc MQC handle */ static INLINE void mqc_bytein(opj_mqc_t *const mqc); /** Renormalize mqc->a and mqc->c while decoding @param mqc MQC handle */ static INLINE void mqc_renormd(opj_mqc_t *const mqc); /*@}*/ /*@}*/ /* */ /* This array defines all the possible states for a context. */ /* */ static opj_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]}, }; /* ========================================================== local functions ========================================================== */ static void mqc_byteout(opj_mqc_t *mqc) { 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; } } } } static void mqc_renorme(opj_mqc_t *mqc) { do { mqc->a <<= 1; mqc->c <<= 1; mqc->ct--; if (mqc->ct == 0) { mqc_byteout(mqc); } } while ((mqc->a & 0x8000) == 0); } static void mqc_codemps(opj_mqc_t *mqc) { 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(mqc); } else { mqc->c += (*mqc->curctx)->qeval; } } static void mqc_codelps(opj_mqc_t *mqc) { 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(mqc); } static void mqc_setbits(opj_mqc_t *mqc) { unsigned int tempc = mqc->c + mqc->a; mqc->c |= 0xffff; if (mqc->c >= tempc) { mqc->c -= 0x8000; } } static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) { 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; } static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) { 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; } #ifdef MQC_PERF_OPT static INLINE void mqc_bytein(opj_mqc_t *const mqc) { unsigned int i = *((unsigned int *) mqc->bp); mqc->c += i & 0xffff00; mqc->ct = i & 0x0f; mqc->bp += (i >> 2) & 0x04; } #else static void mqc_bytein(opj_mqc_t *const mqc) { 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; } } #endif static INLINE void mqc_renormd(opj_mqc_t *const mqc) { do { if (mqc->ct == 0) { mqc_bytein(mqc); } mqc->a <<= 1; mqc->c <<= 1; mqc->ct--; } while (mqc->a < 0x8000); } /* ========================================================== MQ-Coder interface ========================================================== */ opj_mqc_t* mqc_create(void) { opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); #ifdef MQC_PERF_OPT mqc->buffer = NULL; #endif return mqc; } void mqc_destroy(opj_mqc_t *mqc) { if(mqc) { #ifdef MQC_PERF_OPT if (mqc->buffer) { opj_free(mqc->buffer); } #endif opj_free(mqc); } } int mqc_numbytes(opj_mqc_t *mqc) { return mqc->bp - mqc->start; } void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) { mqc_setcurctx(mqc, 0); mqc->a = 0x8000; mqc->c = 0; mqc->bp = bp - 1; mqc->ct = 12; if (*mqc->bp == 0xff) { mqc->ct = 13; } mqc->start = bp; } void mqc_encode(opj_mqc_t *mqc, int d) { if ((*mqc->curctx)->mps == d) { mqc_codemps(mqc); } else { mqc_codelps(mqc); } } void mqc_flush(opj_mqc_t *mqc) { mqc_setbits(mqc); mqc->c <<= mqc->ct; mqc_byteout(mqc); mqc->c <<= mqc->ct; mqc_byteout(mqc); if (*mqc->bp != 0xff) { mqc->bp++; } } void mqc_bypass_init_enc(opj_mqc_t *mqc) { mqc->c = 0; mqc->ct = 8; /*if (*mqc->bp == 0xff) { mqc->ct = 7; } */ } void mqc_bypass_enc(opj_mqc_t *mqc, 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; } } int mqc_bypass_flush_enc(opj_mqc_t *mqc) { 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; } void mqc_reset_enc(opj_mqc_t *mqc) { mqc_resetstates(mqc); mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); } int mqc_restart_enc(opj_mqc_t *mqc) { int correction = 1; /* */ int n = 27 - 15 - mqc->ct; mqc->c <<= mqc->ct; while (n > 0) { mqc_byteout(mqc); n -= mqc->ct; mqc->c <<= mqc->ct; } mqc_byteout(mqc); return correction; } void mqc_restart_init_enc(opj_mqc_t *mqc) { /* */ mqc_setcurctx(mqc, 0); mqc->a = 0x8000; mqc->c = 0; mqc->ct = 12; mqc->bp--; if (*mqc->bp == 0xff) { mqc->ct = 13; } } void mqc_erterm_enc(opj_mqc_t *mqc) { int k = 11 - mqc->ct + 1; while (k > 0) { mqc->c <<= mqc->ct; mqc->ct = 0; mqc_byteout(mqc); k -= mqc->ct; } if (*mqc->bp != 0xff) { mqc_byteout(mqc); } } void mqc_segmark_enc(opj_mqc_t *mqc) { int i; mqc_setcurctx(mqc, 18); for (i = 1; i < 5; i++) { mqc_encode(mqc, i % 2); } } void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) { mqc_setcurctx(mqc, 0); mqc->start = bp; mqc->end = bp + len; mqc->bp = bp; if (len==0) mqc->c = 0xff << 16; else mqc->c = *mqc->bp << 16; #ifdef MQC_PERF_OPT { unsigned int c; unsigned int *ip; unsigned char *end = mqc->end - 1; mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int)); ip = (unsigned int *) mqc->buffer; while (bp < end) { c = *(bp + 1); if (*bp == 0xff) { if (c > 0x8f) { break; } else { *ip = 0x00000017 | (c << 9); } } else { *ip = 0x00000018 | (c << 8); } bp++; ip++; } /* Handle last byte of data */ c = 0xff; if (*bp == 0xff) { *ip = 0x0000ff18; } else { bp++; *ip = 0x00000018 | (c << 8); } ip++; *ip = 0x0000ff08; mqc->bp = mqc->buffer; } #endif mqc_bytein(mqc); mqc->c <<= 7; mqc->ct -= 7; mqc->a = 0x8000; } int mqc_decode(opj_mqc_t *const mqc) { int d; mqc->a -= (*mqc->curctx)->qeval; if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { d = mqc_lpsexchange(mqc); mqc_renormd(mqc); } else { mqc->c -= (*mqc->curctx)->qeval << 16; if ((mqc->a & 0x8000) == 0) { d = mqc_mpsexchange(mqc); mqc_renormd(mqc); } else { d = (*mqc->curctx)->mps; } } return d; } void mqc_resetstates(opj_mqc_t *mqc) { int i; for (i = 0; i < MQC_NUMCTXS; i++) { mqc->ctxs[i] = mqc_states; } } void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) { mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; } openjpeg-1.5.2/libopenjpeg/cidx_manager.c0000644000175000017500000001524112315002100020246 0ustar mathieumathieu/* * $Id: cidx_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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" /* * Write CPTR Codestream finder box * * @param[in] coff offset of j2k codestream * @param[in] clen length of j2k codestream * @param[in] cio file output handle */ void write_cptr(int coff, int clen, opj_cio_t *cio); /* * Write main header index table (box) * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information * @param[in] cio file output handle * @return length of mainmhix box */ int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio); /* * Check if EPH option is used * * @param[in] coff offset of j2k codestream * @param[in] markers marker information * @param[in] marknum number of markers * @param[in] cio file output handle * @return true if EPH is used */ opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio); int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen) { int len, i, lenp; opj_jp2_box_t *box; int num_box = 0; opj_bool EPHused; (void)image; /* unused ? */ lenp = -1; box = (opj_jp2_box_t *)opj_calloc( 32, sizeof(opj_jp2_box_t)); for (i=0;i<2;i++){ if(i) cio_seek( cio, lenp); lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_CIDX, 4); /* CIDX */ write_cptr( offset, cstr_info.codestream_size, cio); write_manf( i, num_box, box, cio); num_box = 0; box[num_box].length = write_mainmhix( offset, cstr_info, cio); box[num_box].type = JPIP_MHIX; num_box++; box[num_box].length = write_tpix( offset, cstr_info, j2klen, cio); box[num_box].type = JPIP_TPIX; num_box++; box[num_box].length = write_thix( offset, cstr_info, cio); box[num_box].type = JPIP_THIX; num_box++; EPHused = check_EPHuse( offset, cstr_info.marker, cstr_info.marknum, cio); box[num_box].length = write_ppix( offset, cstr_info, EPHused, j2klen, cio); box[num_box].type = JPIP_PPIX; num_box++; box[num_box].length = write_phix( offset, cstr_info, EPHused, j2klen, cio); box[num_box].type = JPIP_PHIX; num_box++; len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); } opj_free( box); return len; } void write_cptr(int coff, int clen, opj_cio_t *cio) { int len, lenp; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_CPTR, 4); /* T */ cio_write( cio, 0, 2); /* DR A PRECISER !! */ cio_write( cio, 0, 2); /* CONT */ cio_write( cio, coff, 8); /* COFF A PRECISER !! */ cio_write( cio, clen, 8); /* CLEN */ len = cio_tell( cio) - lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); } void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio) { int len, lenp, i; lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_MANF,4); /* T */ if (second){ /* Write only during the second pass */ for( i=0; i> 2) & 1)) EPHused = OPJ_TRUE; cio_seek( cio, org_pos); break; } } return EPHused; } openjpeg-1.5.2/libopenjpeg/pi.h0000644000175000017500000001321112315002100016235 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 /** @file pi.h @brief Implementation of a packet iterator (PI) The functions in PI.C have for goal to realize a packet iterator that permits to get the next packet following the progression order and change of it. The functions in PI.C are used by some function in T2.C. */ /** @defgroup PI PI - Implementation of a packet iterator */ /*@{*/ /** FIXME: documentation */ typedef struct opj_pi_resolution { int pdx, pdy; int pw, ph; } opj_pi_resolution_t; /** FIXME: documentation */ typedef struct opj_pi_comp { int dx, dy; /** number of resolution levels */ int numresolutions; opj_pi_resolution_t *resolutions; } opj_pi_comp_t; /** Packet iterator */ typedef struct opj_pi_iterator { /** Enabling Tile part generation*/ char tp_on; /** precise if the packet has been already used (usefull for progression order change) */ short int *include; /** layer step used to localize the packet in the include vector */ int step_l; /** resolution step used to localize the packet in the include vector */ int step_r; /** component step used to localize the packet in the include vector */ int step_c; /** precinct step used to localize the packet in the include vector */ int step_p; /** component that identify the packet */ int compno; /** resolution that identify the packet */ int resno; /** precinct that identify the packet */ int precno; /** layer that identify the packet */ int layno; /** 0 if the first packet */ int first; /** progression order change information */ opj_poc_t poc; /** number of components in the image */ int numcomps; /** Components*/ opj_pi_comp_t *comps; int tx0, ty0, tx1, ty1; int x, y, dx, dy; } opj_pi_iterator_t; /** @name Exported functions */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Create a packet iterator for Encoder @param image Raw image for which the packets will be listed @param cp Coding parameters @param tileno Number that identifies the tile for which to list the packets @param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass @return Returns a packet iterator that points to the first packet of the tile @see pi_destroy */ opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode); /** Modify the packet iterator for enabling tile part generation @param pi Handle to the packet iterator generated in pi_initialise_encode @param cp Coding parameters @param tileno Number that identifies the tile for which to list the packets @param pino Iterator index for pi @param tpnum Tile part number of the current tile @param tppos The position of the tile part flag in the progression order @param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass @param cur_totnum_tp The total number of tile parts in the current tile @return Returns true if an error is detected */ opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp); /** Create a packet iterator for Decoder @param image Raw image for which the packets will be listed @param cp Coding parameters @param tileno Number that identifies the tile for which to list the packets @return Returns a packet iterator that points to the first packet of the tile @see pi_destroy */ opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno); /** Destroy a packet iterator @param pi Previously created packet iterator @param cp Coding parameters @param tileno Number that identifies the tile for which the packets were listed @see pi_create */ void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); /** Modify the packet iterator to point to the next packet @param pi Packet iterator to modify @return Returns false if pi pointed to the last packet or else returns true */ opj_bool pi_next(opj_pi_iterator_t * pi); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __PI_H */ openjpeg-1.5.2/libopenjpeg/event.h0000644000175000017500000000463312315002100016756 0ustar mathieumathieu/* * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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 __EVENT_H #define __EVENT_H /** @file event.h @brief Implementation of a event callback system The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. */ #define EVT_ERROR 1 /**< Error event type */ #define EVT_WARNING 2 /**< Warning event type */ #define EVT_INFO 4 /**< Debug event type */ /** @defgroup EVENT EVENT - Implementation of a event callback system */ /*@{*/ /** @name Exported functions (see also openjpeg.h) */ /*@{*/ /* ----------------------------------------------------------------------- */ /** Write formatted data to a string and send the string to a user callback. @param cinfo Codec context info @param event_type Event type or callback to use to send the message @param fmt Format-control string (plus optionnal arguments) @return Returns true if successful, returns false otherwise */ opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); /* ----------------------------------------------------------------------- */ /*@}*/ /*@}*/ #endif /* __EVENT_H */ openjpeg-1.5.2/libopenjpeg/dwt.c0000644000175000017500000006005112315002100016422 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2007, Jonathan Ballard * Copyright (c) 2007, Callum Lerwick * 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. */ #ifdef __SSE__ #include #endif #include "opj_includes.h" /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ /*@{*/ #define WS(i) v->mem[(i)*2] #define WD(i) v->mem[(1+(i)*2)] /** @name Local data structures */ /*@{*/ typedef struct dwt_local { int* mem; int dn; int sn; int cas; } dwt_t; typedef union { float f[4]; } v4; typedef struct v4dwt_local { v4* wavelet ; int dn ; int sn ; int cas ; } v4dwt_t ; static const float dwt_alpha = 1.586134342f; /* 12994 */ static const float dwt_beta = 0.052980118f; /* 434 */ static const float dwt_gamma = -0.882911075f; /* -7233 */ static const float dwt_delta = -0.443506852f; /* -3633 */ static const float K = 1.230174105f; /* 10078 */ /* FIXME: What is this constant? */ static const float c13318 = 1.625732422f; /*@}*/ /** Virtual function type for wavelet transform in 1-D */ typedef void (*DWT1DFN)(dwt_t* v); /** @name Local static functions */ /*@{*/ /** Forward lazy transform (horizontal) */ static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); /** Forward lazy transform (vertical) */ static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); /** Inverse lazy transform (horizontal) */ static void dwt_interleave_h(dwt_t* h, int *a); /** Inverse lazy transform (vertical) */ static void dwt_interleave_v(dwt_t* v, int *a, int x); /** Forward 5-3 wavelet transform in 1-D */ static void dwt_encode_1(int *a, int dn, int sn, int cas); /** Inverse 5-3 wavelet transform in 1-D */ static void dwt_decode_1(dwt_t *v); /** Forward 9-7 wavelet transform in 1-D */ static void dwt_encode_1_real(int *a, int dn, int sn, int cas); /** Explicit calculation of the Quantization Stepsizes */ static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize); /** Inverse wavelet transform in 2-D. */ static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn); /*@}*/ /*@}*/ #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. */ /* */ static const 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. */ /* */ static const 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} }; /* ========================================================== local functions ========================================================== */ /* */ /* Forward lazy transform (horizontal). */ /* */ static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { int i; for (i=0; i */ /* Forward lazy transform (vertical). */ /* */ static 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). */ /* */ static void dwt_interleave_h(dwt_t* h, int *a) { int *ai = a; int *bi = h->mem + h->cas; int i = h->sn; while( i-- ) { *bi = *(ai++); bi += 2; } ai = a + h->sn; bi = h->mem + 1 - h->cas; i = h->dn ; while( i-- ) { *bi = *(ai++); bi += 2; } } /* */ /* Inverse lazy transform (vertical). */ /* */ static void dwt_interleave_v(dwt_t* v, int *a, int x) { int *ai = a; int *bi = v->mem + v->cas; int i = v->sn; while( i-- ) { *bi = *ai; bi += 2; ai += x; } ai = a + (v->sn * x); bi = v->mem + 1 - v->cas; i = v->dn ; while( i-- ) { *bi = *ai; bi += 2; ai += x; } } /* */ /* Forward 5-3 wavelet transform in 1-D. */ /* */ static 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 transform in 1-D. */ /* */ static 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; } } } /* */ /* Inverse 5-3 wavelet transform in 1-D. */ /* */ static void dwt_decode_1(dwt_t *v) { dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); } /* */ /* Forward 9-7 wavelet transform in 1-D. */ /* */ static 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 */ } } } static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) { int p, n; p = int_floorlog2(stepsize) - 13; n = 11 - int_floorlog2(stepsize); bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; bandno_stepsize->expn = numbps - p; } /* ========================================================== DWT interface ========================================================== */ /* */ /* Forward 5-3 wavelet transform in 2-D. */ /* */ void dwt_encode(opj_tcd_tilecomp_t * tilec) { int i, j, k; int *a = NULL; int *aj = NULL; int *bj = NULL; 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; /* height 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*)opj_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(bj, dn, sn, cas_col); dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); } opj_free(bj); sn = rw1; dn = rw - rw1; bj = (int*)opj_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(bj, dn, sn, cas_row); dwt_deinterleave_h(bj, aj, dn, sn, cas_row); } opj_free(bj); } } /* */ /* Inverse 5-3 wavelet transform in 2-D. */ /* */ void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) { dwt_decode_tile(tilec, numres, &dwt_decode_1); } /* */ /* 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 2-D. */ /* */ void dwt_encode_real(opj_tcd_tilecomp_t * tilec) { int i, j, k; int *a = NULL; int *aj = NULL; int *bj = NULL; 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; /* height 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*)opj_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); } opj_free(bj); sn = rw1; dn = rw - rw1; bj = (int*)opj_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); } opj_free(bj); } } /* */ /* 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]; } void dwt_calc_explicit_stepsizes(opj_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_real[orient][level]; stepsize = (1 << (gain)) / norm; } dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]); } } /* */ /* Determine maximum computed resolution level for inverse wavelet transform */ /* */ static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) { int mr = 1; int w; while( --i ) { r++; if( mr < ( w = r->x1 - r->x0 ) ) mr = w ; if( mr < ( w = r->y1 - r->y0 ) ) mr = w ; } return mr ; } /* */ /* Inverse wavelet transform in 2-D. */ /* */ static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1D) { dwt_t h; dwt_t v; opj_tcd_resolution_t* tr = tilec->resolutions; int rw = tr->x1 - tr->x0; /* width of the resolution level computed */ int rh = tr->y1 - tr->y0; /* height of the resolution level computed */ int w = tilec->x1 - tilec->x0; h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int)); v.mem = h.mem; while( --numres) { int * restrict tiledp = tilec->data; int j; ++tr; h.sn = rw; v.sn = rh; rw = tr->x1 - tr->x0; rh = tr->y1 - tr->y0; h.dn = rw - h.sn; h.cas = tr->x0 % 2; for(j = 0; j < rh; ++j) { dwt_interleave_h(&h, &tiledp[j*w]); (dwt_1D)(&h); memcpy(&tiledp[j*w], h.mem, rw * sizeof(int)); } v.dn = rh - v.sn; v.cas = tr->y0 % 2; for(j = 0; j < rw; ++j){ int k; dwt_interleave_v(&v, &tiledp[j], w); (dwt_1D)(&v); for(k = 0; k < rh; ++k) { tiledp[k * w + j] = v.mem[k]; } } } opj_aligned_free(h.mem); } static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, int size){ float* restrict bi = (float*) (w->wavelet + w->cas); int count = w->sn; int i, k; for(k = 0; k < 2; ++k){ if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) { /* Fast code path */ for(i = 0; i < count; ++i){ int j = i; bi[i*8 ] = a[j]; j += x; bi[i*8 + 1] = a[j]; j += x; bi[i*8 + 2] = a[j]; j += x; bi[i*8 + 3] = a[j]; } } else { /* Slow code path */ for(i = 0; i < count; ++i){ int j = i; bi[i*8 ] = a[j]; j += x; if(j > size) continue; bi[i*8 + 1] = a[j]; j += x; if(j > size) continue; bi[i*8 + 2] = a[j]; j += x; if(j > size) continue; bi[i*8 + 3] = a[j]; } } bi = (float*) (w->wavelet + 1 - w->cas); a += w->sn; size -= w->sn; count = w->dn; } } static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){ v4* restrict bi = v->wavelet + v->cas; int i; for(i = 0; i < v->sn; ++i){ memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); } a += v->sn * x; bi = v->wavelet + 1 - v->cas; for(i = 0; i < v->dn; ++i){ memcpy(&bi[i*2], &a[i*x], 4 * sizeof(float)); } } #ifdef __SSE__ static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){ __m128* restrict vw = (__m128*) w; int i; /* 4x unrolled loop */ for(i = 0; i < count >> 2; ++i){ *vw = _mm_mul_ps(*vw, c); vw += 2; *vw = _mm_mul_ps(*vw, c); vw += 2; *vw = _mm_mul_ps(*vw, c); vw += 2; *vw = _mm_mul_ps(*vw, c); vw += 2; } count &= 3; for(i = 0; i < count; ++i){ *vw = _mm_mul_ps(*vw, c); vw += 2; } } static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){ __m128* restrict vl = (__m128*) l; __m128* restrict vw = (__m128*) w; int i; __m128 tmp1, tmp2, tmp3; tmp1 = vl[0]; for(i = 0; i < m; ++i){ tmp2 = vw[-1]; tmp3 = vw[ 0]; vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); tmp1 = tmp3; vw += 2; } vl = vw - 2; if(m >= k){ return; } c = _mm_add_ps(c, c); c = _mm_mul_ps(c, vl[0]); for(; m < k; ++m){ __m128 tmp = vw[-1]; vw[-1] = _mm_add_ps(tmp, c); vw += 2; } } #else static void v4dwt_decode_step1(v4* w, int count, const float c){ float* restrict fw = (float*) w; int i; for(i = 0; i < count; ++i){ float tmp1 = fw[i*8 ]; float tmp2 = fw[i*8 + 1]; float tmp3 = fw[i*8 + 2]; float tmp4 = fw[i*8 + 3]; fw[i*8 ] = tmp1 * c; fw[i*8 + 1] = tmp2 * c; fw[i*8 + 2] = tmp3 * c; fw[i*8 + 3] = tmp4 * c; } } static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c){ float* restrict fl = (float*) l; float* restrict fw = (float*) w; int i; for(i = 0; i < m; ++i){ float tmp1_1 = fl[0]; float tmp1_2 = fl[1]; float tmp1_3 = fl[2]; float tmp1_4 = fl[3]; float tmp2_1 = fw[-4]; float tmp2_2 = fw[-3]; float tmp2_3 = fw[-2]; float tmp2_4 = fw[-1]; float tmp3_1 = fw[0]; float tmp3_2 = fw[1]; float tmp3_3 = fw[2]; float tmp3_4 = fw[3]; fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); fl = fw; fw += 8; } if(m < k){ float c1; float c2; float c3; float c4; c += c; c1 = fl[0] * c; c2 = fl[1] * c; c3 = fl[2] * c; c4 = fl[3] * c; for(; m < k; ++m){ float tmp1 = fw[-4]; float tmp2 = fw[-3]; float tmp3 = fw[-2]; float tmp4 = fw[-1]; fw[-4] = tmp1 + c1; fw[-3] = tmp2 + c2; fw[-2] = tmp3 + c3; fw[-1] = tmp4 + c4; fw += 8; } } } #endif /* */ /* Inverse 9-7 wavelet transform in 1-D. */ /* */ static void v4dwt_decode(v4dwt_t* restrict dwt){ int a, b; if(dwt->cas == 0) { if(!((dwt->dn > 0) || (dwt->sn > 1))){ return; } a = 0; b = 1; }else{ if(!((dwt->sn > 0) || (dwt->dn > 1))) { return; } a = 1; b = 0; } #ifdef __SSE__ v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(K)); v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(c13318)); v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_delta)); v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_gamma)); v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(dwt_beta)); v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(dwt_alpha)); #else v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, K); v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, c13318); v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_delta); v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_gamma); v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, int_min(dwt->sn, dwt->dn-a), dwt_beta); v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, int_min(dwt->dn, dwt->sn-b), dwt_alpha); #endif } /* */ /* Inverse 9-7 wavelet transform in 2-D. */ /* */ void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){ v4dwt_t h; v4dwt_t v; opj_tcd_resolution_t* res = tilec->resolutions; int rw = res->x1 - res->x0; /* width of the resolution level computed */ int rh = res->y1 - res->y0; /* height of the resolution level computed */ int w = tilec->x1 - tilec->x0; h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, numres)+5) * sizeof(v4)); v.wavelet = h.wavelet; while( --numres) { float * restrict aj = (float*) tilec->data; int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0); int j; h.sn = rw; v.sn = rh; ++res; rw = res->x1 - res->x0; /* width of the resolution level computed */ rh = res->y1 - res->y0; /* height of the resolution level computed */ h.dn = rw - h.sn; h.cas = res->x0 % 2; for(j = rh; j > 3; j -= 4){ int k; v4dwt_interleave_h(&h, aj, w, bufsize); v4dwt_decode(&h); for(k = rw; --k >= 0;){ aj[k ] = h.wavelet[k].f[0]; aj[k+w ] = h.wavelet[k].f[1]; aj[k+w*2] = h.wavelet[k].f[2]; aj[k+w*3] = h.wavelet[k].f[3]; } aj += w*4; bufsize -= w*4; } if (rh & 0x03) { int k; j = rh & 0x03; v4dwt_interleave_h(&h, aj, w, bufsize); v4dwt_decode(&h); for(k = rw; --k >= 0;){ switch(j) { case 3: aj[k+w*2] = h.wavelet[k].f[2]; case 2: aj[k+w ] = h.wavelet[k].f[1]; case 1: aj[k ] = h.wavelet[k].f[0]; } } } v.dn = rh - v.sn; v.cas = res->y0 % 2; aj = (float*) tilec->data; for(j = rw; j > 3; j -= 4){ int k; v4dwt_interleave_v(&v, aj, w); v4dwt_decode(&v); for(k = 0; k < rh; ++k){ memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float)); } aj += 4; } if (rw & 0x03){ int k; j = rw & 0x03; v4dwt_interleave_v(&v, aj, w); v4dwt_decode(&v); for(k = 0; k < rh; ++k){ memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float)); } } } opj_aligned_free(h.wavelet); } openjpeg-1.5.2/libopenjpeg/indexbox_manager.h0000644000175000017500000001124612315002100021145 0ustar mathieumathieu/* * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.c from 2KAN indexer */ #ifndef INDEXBOX_MANAGER_H_ # define INDEXBOX_MANAGER_H_ #include "openjpeg.h" #include "j2k.h" /* needed to use jp2.h */ #include "jp2.h" #define JPIP_CIDX 0x63696478 /* Codestream index */ #define JPIP_CPTR 0x63707472 /* Codestream Finder Box */ #define JPIP_MANF 0x6d616e66 /* Manifest Box */ #define JPIP_FAIX 0x66616978 /* Fragment array Index box */ #define JPIP_MHIX 0x6d686978 /* Main Header Index Table */ #define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */ #define JPIP_THIX 0x74686978 /* Tile header Index Table box */ #define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */ #define JPIP_PHIX 0x70686978 /* Packet Header index Table */ #define JPIP_FIDX 0x66696478 /* File Index */ #define JPIP_FPTR 0x66707472 /* File Finder */ #define JPIP_PRXY 0x70727879 /* Proxy boxes */ #define JPIP_IPTR 0x69707472 /* Index finder box */ #define JPIP_PHLD 0x70686c64 /* Place holder */ /* * Write tile-part Index table box (superbox) * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of tpix box */ int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio); /* * Write tile header index table box (superbox) * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information pointer * @param[in] cio file output handle * @return length of thix box */ int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio); /* * Write precinct packet index table box (superbox) * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information * @param[in] EPHused true if EPH option used * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of ppix box */ int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); /* * Write packet header index table box (superbox) * * @param[in] coff offset of j2k codestream * @param[in] cstr_info codestream information * @param[in] EPHused true if EPH option used * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of ppix box */ int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); /* * Wriet manifest box (box) * * @param[in] second number to be visited * @param[in] v number of boxes * @param[in] box box to be manifested * @param[in] cio file output handle */ void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio); #endif /* !INDEXBOX_MANAGER_H_ */ openjpeg-1.5.2/libopenjpeg/mct.c0000644000175000017500000001160312315002100016406 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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. */ #ifdef __SSE__ #include #endif #include "opj_includes.h" /* */ /* This table contains the norms of the basis function of the reversible MCT. */ /* */ static const double mct_norms[3] = { 1.732, .8292, .8292 }; /* */ /* This table contains the norms of the basis function of the irreversible MCT. */ /* */ static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; /* */ /* Foward reversible MCT. */ /* */ void mct_encode( int* restrict c0, int* restrict c1, int* restrict c2, int n) { int i; for(i = 0; i < n; ++i) { int r = c0[i]; int g = c1[i]; int b = c2[i]; int y = (r + (g * 2) + b) >> 2; int u = b - g; int v = r - g; c0[i] = y; c1[i] = u; c2[i] = v; } } /* */ /* Inverse reversible MCT. */ /* */ void mct_decode( int* restrict c0, int* restrict c1, int* restrict c2, int n) { int i; for (i = 0; i < n; ++i) { int y = c0[i]; int u = c1[i]; int v = c2[i]; int g = y - ((u + v) >> 2); int r = v + g; int 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* restrict c0, int* restrict c1, int* restrict c2, int n) { int i; for(i = 0; i < n; ++i) { int r = c0[i]; int g = c1[i]; int b = c2[i]; int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); int 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( float* restrict c0, float* restrict c1, float* restrict c2, int n) { int i; #ifdef __SSE__ __m128 vrv, vgu, vgv, vbu; vrv = _mm_set1_ps(1.402f); vgu = _mm_set1_ps(0.34413f); vgv = _mm_set1_ps(0.71414f); vbu = _mm_set1_ps(1.772f); for (i = 0; i < (n >> 3); ++i) { __m128 vy, vu, vv; __m128 vr, vg, vb; vy = _mm_load_ps(c0); vu = _mm_load_ps(c1); vv = _mm_load_ps(c2); vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); _mm_store_ps(c0, vr); _mm_store_ps(c1, vg); _mm_store_ps(c2, vb); c0 += 4; c1 += 4; c2 += 4; vy = _mm_load_ps(c0); vu = _mm_load_ps(c1); vv = _mm_load_ps(c2); vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); _mm_store_ps(c0, vr); _mm_store_ps(c1, vg); _mm_store_ps(c2, vb); c0 += 4; c1 += 4; c2 += 4; } n &= 7; #endif for(i = 0; i < n; ++i) { float y = c0[i]; float u = c1[i]; float v = c2[i]; float r = y + (v * 1.402f); float g = y - (u * 0.34413f) - (v * (0.71414f)); float b = y + (u * 1.772f); 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]; } openjpeg-1.5.2/libopenjpeg/raw.c0000644000175000017500000000514112315002100016414 0ustar mathieumathieu/* * 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 * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" /* ========================================================== local functions ========================================================== */ /* ========================================================== RAW encoding interface ========================================================== */ opj_raw_t* raw_create(void) { opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); return raw; } void raw_destroy(opj_raw_t *raw) { if(raw) { opj_free(raw); } } int raw_numbytes(opj_raw_t *raw) { return raw->bp - raw->start; } void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { raw->start = bp; raw->lenmax = len; raw->len = 0; raw->c = 0; raw->ct = 0; } int raw_decode(opj_raw_t *raw) { 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; } openjpeg-1.5.2/libopenjpeg/t1_generate_luts.c0000644000175000017500000001607212315002100021075 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2007, Callum Lerwick * 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 static 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); } static 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); } static 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 dump_array16(int array[],int size){ int i; --size; for (i = 0; i < size; ++i) { printf("0x%04x, ", array[i]); if(!((i+1)&0x7)) printf("\n "); } printf("0x%04x\n};\n\n", array[size]); } int main(){ int i, j; double u, v, t; int lut_ctxno_zc[1024]; int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; printf("/* This file was automatically generated by t1_generate_luts.c */\n\n"); /* lut_ctxno_zc */ for (j = 0; j < 4; ++j) { for (i = 0; i < 256; ++i) { int orient = j; if (orient == 2) { orient = 1; } else if (orient == 1) { orient = 2; } lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j); } } printf("static char lut_ctxno_zc[1024] = {\n "); for (i = 0; i < 1023; ++i) { printf("%i, ", lut_ctxno_zc[i]); if(!((i+1)&0x1f)) printf("\n "); } printf("%i\n};\n\n", lut_ctxno_zc[1023]); /* lut_ctxno_sc */ printf("static char lut_ctxno_sc[256] = {\n "); for (i = 0; i < 255; ++i) { printf("0x%x, ", t1_init_ctxno_sc(i << 4)); if(!((i+1)&0xf)) printf("\n "); } printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4)); /* lut_spb */ printf("static char lut_spb[256] = {\n "); for (i = 0; i < 255; ++i) { printf("%i, ", t1_init_spb(i << 4)); if(!((i+1)&0x1f)) printf("\n "); } printf("%i\n};\n\n", t1_init_spb(255 << 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; 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)); 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; } 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)); 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)); } printf("static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n "); dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n "); dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n "); dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS); printf("static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n "); dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS); return 0; } openjpeg-1.5.2/libopenjpeg/jpt.c0000644000175000017500000001106312315002100016420 0ustar mathieumathieu/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2005, Herve Drolon, FreeImage Team * 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" /* * Read the information contains in VBAS [JPP/JPT stream message header] * Store information (7 bits) in value * */ unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) { unsigned char elmt; elmt = cio_read(cio, 1); while ((elmt >> 7) == 1) { value = (value << 7); value |= (elmt & 0x7f); elmt = cio_read(cio, 1); } value = (value << 7); value |= (elmt & 0x7f); return value; } /* * Initialize the value of the message header structure * */ void jpt_init_msg_header(opj_jpt_msg_header_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(opj_jpt_msg_header_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(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) { unsigned char elmt, Class = 0, CSn = 0; jpt_reinit_msg_header(header); /* ------------- */ /* VBAS : Bin-ID */ /* ------------- */ elmt = cio_read(cio, 1); /* See for Class and CSn */ switch ((elmt >> 5) & 0x03) { case 0: opj_event_msg(cinfo, EVT_ERROR, "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(cio, header->Id); /* ------------ */ /* VBAS : Class */ /* ------------ */ if (Class == 1) { header->Class_Id = 0; header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); } /* ---------- */ /* VBAS : CSn */ /* ---------- */ if (CSn == 1) { header->CSn_Id = 0; header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); } /* ----------------- */ /* VBAS : Msg_offset */ /* ----------------- */ header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); /* ----------------- */ /* VBAS : Msg_length */ /* ----------------- */ header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); /* ---------- */ /* VBAS : Aux */ /* ---------- */ if ((header->Class_Id & 0x01) == 1) { header->Layer_nb = 0; header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); } } openjpeg-1.5.2/libopenjpeg/ppix_manager.c0000644000175000017500000001366212315002100020304 0ustar mathieumathieu/* * $Id: ppix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $ * * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2011, Professor Benoit Macq * Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2010-2011, Kaori Hagihara * 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. */ /*! \file * \brief Modification of jpip.c from 2KAN indexer */ #include #include #include #include "opj_includes.h" /* * Write faix box of ppix * * @param[in] coff offset of j2k codestream * @param[in] compno component number * @param[in] cstr_info codestream information * @param[in] EPHused true if if EPH option used * @param[in] j2klen length of j2k codestream * @param[in] cio file output handle * @return length of faix box */ int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio); int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio) { int len, lenp, compno, i; opj_jp2_box_t *box; /* printf("cstr_info.packno %d\n", cstr_info.packno); //NMAX? */ lenp = -1; box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t)); for (i=0;i<2;i++){ if (i) cio_seek( cio, lenp); lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_PPIX, 4); /* PPIX */ write_manf( i, cstr_info.numcomps, box, cio); for (compno=0; compno pow( 2, 32)){ size_of_coding = 8; version = 1; } else{ size_of_coding = 4; version = 0; } lenp = cio_tell( cio); cio_skip( cio, 4); /* L [at the end] */ cio_write( cio, JPIP_FAIX, 4); /* FAIX */ cio_write( cio, version, 1); /* Version 0 = 4 bytes */ nmax = 0; for( i=0; i<=cstr_info.numdecompos[compno]; i++) nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers; cio_write( cio, nmax, size_of_coding); /* NMAX */ cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding); /* M */ for( tileno=0; tilenopw[resno]*tile_Idx->ph[resno]; for( precno=0; precnopacket[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; break; case RLCP: packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; break; case RPCL: packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; break; case PCRL: packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; break; case CPRL: packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; break; default: fprintf( stderr, "failed to ppix indexing\n"); } cio_write( cio, packet.start_pos-coff, size_of_coding); /* start position */ cio_write( cio, packet.end_pos-packet.start_pos+1, size_of_coding); /* length */ num_packet++; } } } while( num_packet < nmax){ /* PADDING */ cio_write( cio, 0, size_of_coding); /* start position */ cio_write( cio, 0, size_of_coding); /* length */ num_packet++; } } len = cio_tell( cio)-lenp; cio_seek( cio, lenp); cio_write( cio, len, 4); /* L */ cio_seek( cio, lenp+len); return len; } openjpeg-1.5.2/thirdparty/0000755000175000017500000000000012315072522015371 5ustar mathieumathieuopenjpeg-1.5.2/libopenjpeg1.pc.in0000644000175000017500000000050412315002100016467 0ustar mathieumathieuprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@/openjpeg-@MAJOR_NR@.@MINOR_NR@ Name: openjpeg Description: JPEG2000 library URL: http://www.openjpeg.org/ Version: @VERSION@ @pkgconfig_requires_private@: @requirements@ Libs: -L${libdir} -lopenjpeg Libs.private: -lm Cflags: -I${includedir} openjpeg-1.5.2/libopenjpeg-jpwl.pc.in0000644000175000017500000000054312315002100017363 0ustar mathieumathieuprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@/openjpeg-@MAJOR_NR@.@MINOR_NR@ Name: openjpeg Description: JPEG2000 Wireless (Part 11 - JPWL) library URL: http://www.openjpeg.org/ Version: @VERSION@ @pkgconfig_requires_private@: @requirements@ Libs: -L${libdir} -lopenjpeg_JPWL Libs.private: -lm Cflags: -I${includedir} openjpeg-1.5.2/NEWS0000644000175000017500000000115412315002100013660 0ustar mathieumathieu OpenJPEG NEWS - user visible changes ==================================== Changes from OpenJPEG 1.5.1 to OpenJPEG 1.5.0 ---------------------------------------------- Security: * Fixes: CVE-2012-3535 * Fixes: CVE-2012-3358 New Features: * Use a new API scheme and solve the SOVERSIONing in OpenJPEG * Allow better integration with multi-arch system * Compile & Install Java bindings (CMake) * Install required addXMLinJP2 (JPIP) Misc: * fix linker error by resolving all symbols (eg. missing -lm) * fix some man page typos * Huge amount of bug fixes. See CHANGES for details.