Home | History | Annotate | Download | only in libjasper
      1 /*
      2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
      3  *   British Columbia.
      4  * Copyright (c) 2001-2002 Michael David Adams.
      5  * All rights reserved.
      6  */
      7 
      8 /* __START_OF_JASPER_LICENSE__
      9  *
     10  * JasPer License Version 2.0
     11  *
     12  * Copyright (c) 2001-2006 Michael David Adams
     13  * Copyright (c) 1999-2000 Image Power, Inc.
     14  * Copyright (c) 1999-2000 The University of British Columbia
     15  *
     16  * All rights reserved.
     17  *
     18  * Permission is hereby granted, free of charge, to any person (the
     19  * "User") obtaining a copy of this software and associated documentation
     20  * files (the "Software"), to deal in the Software without restriction,
     21  * including without limitation the rights to use, copy, modify, merge,
     22  * publish, distribute, and/or sell copies of the Software, and to permit
     23  * persons to whom the Software is furnished to do so, subject to the
     24  * following conditions:
     25  *
     26  * 1.  The above copyright notices and this permission notice (which
     27  * includes the disclaimer below) shall be included in all copies or
     28  * substantial portions of the Software.
     29  *
     30  * 2.  The name of a copyright holder shall not be used to endorse or
     31  * promote products derived from the Software without specific prior
     32  * written permission.
     33  *
     34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
     35  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
     36  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
     37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
     38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
     39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
     40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
     41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
     42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
     43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
     45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
     46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
     47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
     48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
     49  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
     50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
     51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
     52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
     53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
     54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
     55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
     56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
     57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
     58  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
     59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
     60  *
     61  * __END_OF_JASPER_LICENSE__
     62  */
     63 
     64 /*
     65  * JPEG-2000 Code Stream Library
     66  *
     67  * $Id: jpc_cs.h,v 1.2 2008-05-26 09:40:52 vp153 Exp $
     68  */
     69 
     70 #ifndef JPC_CS_H
     71 #define JPC_CS_H
     72 
     73 /******************************************************************************\
     74 * Includes.
     75 \******************************************************************************/
     76 
     77 #include "jasper/jas_image.h"
     78 #include "jasper/jas_stream.h"
     79 
     80 #include "jpc_cod.h"
     81 
     82 /******************************************************************************\
     83 * Constants and Types.
     84 \******************************************************************************/
     85 
     86 /* The maximum number of resolution levels. */
     87 #define	JPC_MAXRLVLS	33
     88 
     89 /* The maximum number of bands. */
     90 #define	JPC_MAXBANDS	(3 * JPC_MAXRLVLS + 1)
     91 
     92 /* The maximum number of layers. */
     93 #define JPC_MAXLYRS	16384
     94 
     95 /**************************************\
     96 * Code stream.
     97 \**************************************/
     98 
     99 /*
    100  * Code stream states.
    101  */
    102 
    103 /* Initial. */
    104 #define	JPC_CS_INIT	0
    105 /* Main header. */
    106 #define	JPC_CS_MHDR	1
    107 /* Tile-part header. */
    108 #define	JPC_CS_THDR	2
    109 /* Main trailer. */
    110 #define	JPC_CS_MTLR	3
    111 /* Tile-part data. */
    112 #define	JPC_CS_TDATA	4
    113 
    114 /*
    115  * Unfortunately, the code stream syntax was not designed in such a way that
    116  * any given marker segment can be correctly decoded without additional state
    117  * derived from previously decoded marker segments.
    118  * For example, a RGN/COC/QCC marker segment cannot be decoded unless the
    119  * number of components is known.
    120  */
    121 
    122 /*
    123  * Code stream state information.
    124  */
    125 
    126 typedef struct {
    127 
    128     /* The number of components. */
    129     uint_fast16_t numcomps;
    130 
    131 } jpc_cstate_t;
    132 
    133 /**************************************\
    134 * SOT marker segment parameters.
    135 \**************************************/
    136 
    137 typedef struct {
    138 
    139     /* The tile number. */
    140     uint_fast16_t tileno;
    141 
    142     /* The combined length of the marker segment and its auxilary data
    143       (i.e., packet data). */
    144     uint_fast32_t len;
    145 
    146     /* The tile-part instance. */
    147     uint_fast8_t partno;
    148 
    149     /* The number of tile-parts. */
    150     uint_fast8_t numparts;
    151 
    152 } jpc_sot_t;
    153 
    154 /**************************************\
    155 * SIZ marker segment parameters.
    156 \**************************************/
    157 
    158 /* Per component information. */
    159 
    160 typedef struct {
    161 
    162     /* The precision of the samples. */
    163     uint_fast8_t prec;
    164 
    165     /* The signedness of the samples. */
    166     uint_fast8_t sgnd;
    167 
    168     /* The horizontal separation of samples with respect to the reference
    169       grid. */
    170     uint_fast8_t hsamp;
    171 
    172     /* The vertical separation of samples with respect to the reference
    173       grid. */
    174     uint_fast8_t vsamp;
    175 
    176 } jpc_sizcomp_t;
    177 
    178 /* SIZ marker segment parameters. */
    179 
    180 typedef struct {
    181 
    182     /* The code stream capabilities. */
    183     uint_fast16_t caps;
    184 
    185     /* The width of the image in units of the reference grid. */
    186     uint_fast32_t width;
    187 
    188     /* The height of the image in units of the reference grid. */
    189     uint_fast32_t height;
    190 
    191     /* The horizontal offset from the origin of the reference grid to the
    192       left side of the image area. */
    193     uint_fast32_t xoff;
    194 
    195     /* The vertical offset from the origin of the reference grid to the
    196       top side of the image area. */
    197     uint_fast32_t yoff;
    198 
    199     /* The nominal width of a tile in units of the reference grid. */
    200     uint_fast32_t tilewidth;
    201 
    202     /* The nominal height of a tile in units of the reference grid. */
    203     uint_fast32_t tileheight;
    204 
    205     /* The horizontal offset from the origin of the reference grid to the
    206       left side of the first tile. */
    207     uint_fast32_t tilexoff;
    208 
    209     /* The vertical offset from the origin of the reference grid to the
    210       top side of the first tile. */
    211     uint_fast32_t tileyoff;
    212 
    213     /* The number of components. */
    214     uint_fast16_t numcomps;
    215 
    216     /* The per-component information. */
    217     jpc_sizcomp_t *comps;
    218 
    219 } jpc_siz_t;
    220 
    221 /**************************************\
    222 * COD marker segment parameters.
    223 \**************************************/
    224 
    225 /*
    226  * Coding style constants.
    227  */
    228 
    229 /* Precincts may be used. */
    230 #define	JPC_COX_PRT	0x01
    231 /* SOP marker segments may be used. */
    232 #define	JPC_COD_SOP	0x02
    233 /* EPH marker segments may be used. */
    234 #define	JPC_COD_EPH	0x04
    235 
    236 /*
    237  * Progression order constants.
    238  */
    239 
    240 /* Layer-resolution-component-precinct progressive
    241   (i.e., progressive by fidelity). */
    242 #define	JPC_COD_LRCPPRG	0
    243 /* Resolution-layer-component-precinct progressive
    244   (i.e., progressive by resolution). */
    245 #define	JPC_COD_RLCPPRG	1
    246 /* Resolution-precinct-component-layer progressive. */
    247 #define	JPC_COD_RPCLPRG	2
    248 /* Precinct-component-resolution-layer progressive. */
    249 #define	JPC_COD_PCRLPRG	3
    250 /* Component-position-resolution-layer progressive. */
    251 #define	JPC_COD_CPRLPRG	4
    252 
    253 /*
    254  * Code block style constants.
    255  */
    256 
    257 #define	JPC_COX_LAZY	0x01 /* Selective arithmetic coding bypass. */
    258 #define	JPC_COX_RESET	0x02 /* Reset context probabilities. */
    259 #define	JPC_COX_TERMALL	0x04 /* Terminate all coding passes. */
    260 #define	JPC_COX_VSC		0x08 /* Vertical stripe causal context formation. */
    261 #define	JPC_COX_PTERM	0x10 /* Predictable termination. */
    262 #define	JPC_COX_SEGSYM	0x20 /* Use segmentation symbols. */
    263 
    264 /* Transform constants. */
    265 #define	JPC_COX_INS	0x00 /* Irreversible 9/7. */
    266 #define	JPC_COX_RFT	0x01 /* Reversible 5/3. */
    267 
    268 /* Multicomponent transform constants. */
    269 #define	JPC_COD_NOMCT	0x00 /* No multicomponent transform. */
    270 #define	JPC_COD_MCT		0x01 /* Multicomponent transform. */
    271 
    272 /* Get the code block size value from the code block size exponent. */
    273 #define	JPC_COX_CBLKSIZEEXPN(x)		((x) - 2)
    274 /* Get the code block size exponent from the code block size value. */
    275 #define	JPC_COX_GETCBLKSIZEEXPN(x)	((x) + 2)
    276 
    277 /* Per resolution-level information. */
    278 
    279 typedef struct {
    280 
    281     /* The packet partition width. */
    282     uint_fast8_t parwidthval;
    283 
    284     /* The packet partition height. */
    285     uint_fast8_t parheightval;
    286 
    287 } jpc_coxrlvl_t;
    288 
    289 /* Per component information. */
    290 
    291 typedef struct {
    292 
    293     /* The coding style. */
    294     uint_fast8_t csty;
    295 
    296     /* The number of decomposition levels. */
    297     uint_fast8_t numdlvls;
    298 
    299     /* The nominal code block width specifier. */
    300     uint_fast8_t cblkwidthval;
    301 
    302     /* The nominal code block height specifier. */
    303     uint_fast8_t cblkheightval;
    304 
    305     /* The style of coding passes. */
    306     uint_fast8_t cblksty;
    307 
    308     /* The QMFB employed. */
    309     uint_fast8_t qmfbid;
    310 
    311     /* The number of resolution levels. */
    312     int numrlvls;
    313 
    314     /* The per-resolution-level information. */
    315     jpc_coxrlvl_t rlvls[JPC_MAXRLVLS];
    316 
    317 } jpc_coxcp_t;
    318 
    319 /* COD marker segment parameters. */
    320 
    321 typedef struct {
    322 
    323     /* The general coding style. */
    324     uint_fast8_t csty;
    325 
    326     /* The progression order. */
    327     uint_fast8_t prg;
    328 
    329     /* The number of layers. */
    330     uint_fast16_t numlyrs;
    331 
    332     /* The multicomponent transform. */
    333     uint_fast8_t mctrans;
    334 
    335     /* Component-related parameters. */
    336     jpc_coxcp_t compparms;
    337 
    338 } jpc_cod_t;
    339 
    340 /* COC marker segment parameters. */
    341 
    342 typedef struct {
    343 
    344     /* The component number. */
    345     uint_fast16_t compno;
    346 
    347     /* Component-related parameters. */
    348     jpc_coxcp_t compparms;
    349 
    350 } jpc_coc_t;
    351 
    352 /**************************************\
    353 * RGN marker segment parameters.
    354 \**************************************/
    355 
    356 /* The maxshift ROI style. */
    357 #define	JPC_RGN_MAXSHIFT	0x00
    358 
    359 typedef struct {
    360 
    361     /* The component to which the marker applies. */
    362     uint_fast16_t compno;
    363 
    364     /* The ROI style. */
    365     uint_fast8_t roisty;
    366 
    367     /* The ROI shift value. */
    368     uint_fast8_t roishift;
    369 
    370 } jpc_rgn_t;
    371 
    372 /**************************************\
    373 * QCD/QCC marker segment parameters.
    374 \**************************************/
    375 
    376 /*
    377  * Quantization style constants.
    378  */
    379 
    380 #define	JPC_QCX_NOQNT	0 /* No quantization. */
    381 #define	JPC_QCX_SIQNT	1 /* Scalar quantization, implicit. */
    382 #define	JPC_QCX_SEQNT	2 /* Scalar quantization, explicit. */
    383 
    384 /*
    385  * Stepsize manipulation macros.
    386  */
    387 
    388 #define	JPC_QCX_GETEXPN(x)	((x) >> 11)
    389 #define	JPC_QCX_GETMANT(x)	((x) & 0x07ff)
    390 #define	JPC_QCX_EXPN(x)		(assert(!((x) & (~0x1f))), (((x) & 0x1f) << 11))
    391 #define	JPC_QCX_MANT(x)		(assert(!((x) & (~0x7ff))), ((x) & 0x7ff))
    392 
    393 /* Per component information. */
    394 
    395 typedef struct {
    396 
    397     /* The quantization style. */
    398     uint_fast8_t qntsty;
    399 
    400     /* The number of step sizes. */
    401     int numstepsizes;
    402 
    403     /* The step sizes. */
    404     uint_fast16_t *stepsizes;
    405 
    406     /* The number of guard bits. */
    407     uint_fast8_t numguard;
    408 
    409 } jpc_qcxcp_t;
    410 
    411 /* QCC marker segment parameters. */
    412 
    413 typedef struct {
    414 
    415     /* The component associated with this marker segment. */
    416     uint_fast16_t compno;
    417 
    418     /* The parameters. */
    419     jpc_qcxcp_t compparms;
    420 
    421 } jpc_qcc_t;
    422 
    423 /* QCD marker segment parameters. */
    424 
    425 typedef struct {
    426 
    427     /* The parameters. */
    428     jpc_qcxcp_t compparms;
    429 
    430 } jpc_qcd_t;
    431 
    432 /**************************************\
    433 * POD marker segment parameters.
    434 \**************************************/
    435 
    436 typedef struct {
    437 
    438     /* The progression order. */
    439     uint_fast8_t prgord;
    440 
    441     /* The lower bound (inclusive) on the resolution level for the
    442       progression order volume. */
    443     uint_fast8_t rlvlnostart;
    444 
    445     /* The upper bound (exclusive) on the resolution level for the
    446       progression order volume. */
    447     uint_fast8_t rlvlnoend;
    448 
    449     /* The lower bound (inclusive) on the component for the progression
    450       order volume. */
    451     uint_fast16_t compnostart;
    452 
    453     /* The upper bound (exclusive) on the component for the progression
    454       order volume. */
    455     uint_fast16_t compnoend;
    456 
    457     /* The upper bound (exclusive) on the layer for the progression
    458       order volume. */
    459     uint_fast16_t lyrnoend;
    460 
    461 } jpc_pocpchg_t;
    462 
    463 /* An alias for the above type. */
    464 typedef jpc_pocpchg_t jpc_pchg_t;
    465 
    466 /* POC marker segment parameters. */
    467 
    468 typedef struct {
    469 
    470     /* The number of progression order changes. */
    471     int numpchgs;
    472 
    473     /* The per-progression-order-change information. */
    474     jpc_pocpchg_t *pchgs;
    475 
    476 } jpc_poc_t;
    477 
    478 /**************************************\
    479 * PPM/PPT marker segment parameters.
    480 \**************************************/
    481 
    482 /* PPM marker segment parameters. */
    483 
    484 typedef struct {
    485 
    486     /* The index. */
    487     uint_fast8_t ind;
    488 
    489     /* The length. */
    490     uint_fast16_t len;
    491 
    492     /* The data. */
    493     uchar *data;
    494 
    495 } jpc_ppm_t;
    496 
    497 /* PPT marker segment parameters. */
    498 
    499 typedef struct {
    500 
    501     /* The index. */
    502     uint_fast8_t ind;
    503 
    504     /* The length. */
    505     uint_fast32_t len;
    506 
    507     /* The data. */
    508     unsigned char *data;
    509 
    510 } jpc_ppt_t;
    511 
    512 /**************************************\
    513 * COM marker segment parameters.
    514 \**************************************/
    515 
    516 /*
    517  * Registration IDs.
    518  */
    519 
    520 #define	JPC_COM_BIN		0x00
    521 #define	JPC_COM_LATIN	0x01
    522 
    523 typedef struct {
    524 
    525     /* The registration ID. */
    526     uint_fast16_t regid;
    527 
    528     /* The length of the data in bytes. */
    529     uint_fast16_t len;
    530 
    531     /* The data. */
    532     uchar *data;
    533 
    534 } jpc_com_t;
    535 
    536 /**************************************\
    537 * SOP marker segment parameters.
    538 \**************************************/
    539 
    540 typedef struct {
    541 
    542     /* The sequence number. */
    543     uint_fast16_t seqno;
    544 
    545 } jpc_sop_t;
    546 
    547 /**************************************\
    548 * CRG marker segment parameters.
    549 \**************************************/
    550 
    551 /* Per component information. */
    552 
    553 typedef struct {
    554 
    555     /* The horizontal offset. */
    556     uint_fast16_t hoff;
    557 
    558     /* The vertical offset. */
    559     uint_fast16_t voff;
    560 
    561 } jpc_crgcomp_t;
    562 
    563 typedef struct {
    564 
    565     /* The number of components. */
    566     int numcomps;
    567 
    568     /* Per component information. */
    569     jpc_crgcomp_t *comps;
    570 
    571 } jpc_crg_t;
    572 
    573 /**************************************\
    574 * Marker segment parameters for unknown marker type.
    575 \**************************************/
    576 
    577 typedef struct {
    578 
    579     /* The data. */
    580     uchar *data;
    581 
    582     /* The length. */
    583     uint_fast16_t len;
    584 
    585 } jpc_unk_t;
    586 
    587 /**************************************\
    588 * Generic marker segment parameters.
    589 \**************************************/
    590 
    591 typedef union {
    592     int soc;	/* unused */
    593     jpc_sot_t sot;
    594     int sod;	/* unused */
    595     int eoc;	/* unused */
    596     jpc_siz_t siz;
    597     jpc_cod_t cod;
    598     jpc_coc_t coc;
    599     jpc_rgn_t rgn;
    600     jpc_qcd_t qcd;
    601     jpc_qcc_t qcc;
    602     jpc_poc_t poc;
    603     /* jpc_plm_t plm; */
    604     /* jpc_plt_t plt; */
    605     jpc_ppm_t ppm;
    606     jpc_ppt_t ppt;
    607     jpc_sop_t sop;
    608     int eph;	/* unused */
    609     jpc_com_t com;
    610     jpc_crg_t crg;
    611     jpc_unk_t unk;
    612 } jpc_msparms_t;
    613 
    614 /**************************************\
    615 * Marker segment.
    616 \**************************************/
    617 
    618 /* Marker segment IDs. */
    619 
    620 /* The smallest valid marker value. */
    621 #define	JPC_MS_MIN	0xff00
    622 
    623 /* The largest valid marker value. */
    624 #define	JPC_MS_MAX	0xffff
    625 
    626 /* The minimum marker value that cannot occur within packet data. */
    627 #define	JPC_MS_INMIN	0xff80
    628 /* The maximum marker value that cannot occur within packet data. */
    629 #define	JPC_MS_INMAX	0xffff
    630 
    631 /* Delimiting marker segments. */
    632 #define	JPC_MS_SOC	0xff4f /* Start of code stream (SOC). */
    633 #define	JPC_MS_SOT	0xff90 /* Start of tile-part (SOT). */
    634 #define	JPC_MS_SOD	0xff93 /* Start of data (SOD). */
    635 #define	JPC_MS_EOC	0xffd9 /* End of code stream (EOC). */
    636 
    637 /* Fixed information marker segments. */
    638 #define	JPC_MS_SIZ	0xff51 /* Image and tile size (SIZ). */
    639 
    640 /* Functional marker segments. */
    641 #define	JPC_MS_COD	0xff52 /* Coding style default (COD). */
    642 #define JPC_MS_COC	0xff53 /* Coding style component (COC). */
    643 #define	JPC_MS_RGN	0xff5e /* Region of interest (RGN). */
    644 #define JPC_MS_QCD	0xff5c /* Quantization default (QCD). */
    645 #define JPC_MS_QCC	0xff5d /* Quantization component (QCC). */
    646 #define JPC_MS_POC	0xff5f /* Progression order default (POC). */
    647 
    648 /* Pointer marker segments. */
    649 #define	JPC_MS_TLM	0xff55 /* Tile-part lengths, main header (TLM). */
    650 #define	JPC_MS_PLM	0xff57 /* Packet length, main header (PLM). */
    651 #define	JPC_MS_PLT	0xff58 /* Packet length, tile-part header (PLT). */
    652 #define	JPC_MS_PPM	0xff60 /* Packed packet headers, main header (PPM). */
    653 #define	JPC_MS_PPT	0xff61 /* Packet packet headers, tile-part header (PPT). */
    654 
    655 /* In bit stream marker segments. */
    656 #define	JPC_MS_SOP	0xff91	/* Start of packet (SOP). */
    657 #define	JPC_MS_EPH	0xff92	/* End of packet header (EPH). */
    658 
    659 /* Informational marker segments. */
    660 #define	JPC_MS_CRG	0xff63 /* Component registration (CRG). */
    661 #define JPC_MS_COM	0xff64 /* Comment (COM). */
    662 
    663 /* Forward declaration. */
    664 struct jpc_msops_s;
    665 
    666 /* Generic marker segment class. */
    667 
    668 typedef struct {
    669 
    670     /* The type of marker segment. */
    671     uint_fast16_t id;
    672 
    673     /* The length of the marker segment. */
    674     uint_fast16_t len;
    675 
    676     /* The starting offset within the stream. */
    677     uint_fast32_t off;
    678 
    679     /* The parameters of the marker segment. */
    680     jpc_msparms_t parms;
    681 
    682     /* The marker segment operations. */
    683     struct jpc_msops_s *ops;
    684 
    685 } jpc_ms_t;
    686 
    687 /* Marker segment operations (which depend on the marker segment type). */
    688 
    689 typedef struct jpc_msops_s {
    690 
    691     /* Destroy the marker segment parameters. */
    692     void (*destroyparms)(jpc_ms_t *ms);
    693 
    694     /* Get the marker segment parameters from a stream. */
    695     int (*getparms)(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in);
    696 
    697     /* Put the marker segment parameters to a stream. */
    698     int (*putparms)(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out);
    699 
    700     /* Dump the marker segment parameters (for debugging). */
    701     int (*dumpparms)(jpc_ms_t *ms, FILE *out);
    702 
    703 } jpc_msops_t;
    704 
    705 /******************************************************************************\
    706 * Macros/Functions.
    707 \******************************************************************************/
    708 
    709 /* Create a code-stream state object. */
    710 jpc_cstate_t *jpc_cstate_create(void);
    711 
    712 /* Destroy a code-stream state object. */
    713 void jpc_cstate_destroy(jpc_cstate_t *cstate);
    714 
    715 /* Create a marker segment. */
    716 jpc_ms_t *jpc_ms_create(int type);
    717 
    718 /* Destroy a marker segment. */
    719 void jpc_ms_destroy(jpc_ms_t *ms);
    720 
    721 /* Does a marker segment have parameters? */
    722 #define	JPC_MS_HASPARMS(x) \
    723     (!((x) == JPC_MS_SOC || (x) == JPC_MS_SOD || (x) == JPC_MS_EOC || \
    724       (x) == JPC_MS_EPH || ((x) >= 0xff30 && (x) <= 0xff3f)))
    725 
    726 /* Get the marker segment type. */
    727 #define	jpc_ms_gettype(ms) \
    728     ((ms)->id)
    729 
    730 /* Read a marker segment from a stream. */
    731 jpc_ms_t *jpc_getms(jas_stream_t *in, jpc_cstate_t *cstate);
    732 
    733 /* Write a marker segment to a stream. */
    734 int jpc_putms(jas_stream_t *out, jpc_cstate_t *cstate, jpc_ms_t *ms);
    735 
    736 /* Copy code stream data from one stream to another. */
    737 int jpc_getdata(jas_stream_t *in, jas_stream_t *out, long n);
    738 
    739 /* Copy code stream data from one stream to another. */
    740 int jpc_putdata(jas_stream_t *out, jas_stream_t *in, long n);
    741 
    742 /* Dump a marker segment (for debugging). */
    743 void jpc_ms_dump(jpc_ms_t *ms, FILE *out);
    744 
    745 /* Read a 8-bit unsigned integer from a stream. */
    746 int jpc_getuint8(jas_stream_t *in, uint_fast8_t *val);
    747 
    748 /* Read a 16-bit unsigned integer from a stream. */
    749 int jpc_getuint16(jas_stream_t *in, uint_fast16_t *val);
    750 
    751 /* Read a 32-bit unsigned integer from a stream. */
    752 int jpc_getuint32(jas_stream_t *in, uint_fast32_t *val);
    753 
    754 /* Write a 8-bit unsigned integer to a stream. */
    755 int jpc_putuint8(jas_stream_t *out, uint_fast8_t val);
    756 
    757 /* Write a 16-bit unsigned integer to a stream. */
    758 int jpc_putuint16(jas_stream_t *out, uint_fast16_t val);
    759 
    760 /* Write a 32-bit unsigned integer to a stream. */
    761 int jpc_putuint32(jas_stream_t *out, uint_fast32_t val);
    762 
    763 #endif
    764