/* GStreamer * Copyright (C) 2010 Oblong Industries, Inc. * Copyright (C) 2010 Collabora Multimedia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __JP2K_CODESTREAM_H__ #define __JP2K_CODESTREAM_H__ #include #include #include #include #include "gstjp2kdecimator.h" /* Used to represent codestream packets */ typedef struct { gboolean sop; gboolean eph; guint16 seqno; const guint8 *data; guint length; } Packet; /* Used to represent unparsed markers for passthrough */ typedef struct { const guint8 *data; guint length; } Buffer; typedef struct { guint8 s; /* sample precision */ guint8 xr, yr; /* resolution */ } ComponentSize; /* SIZ */ typedef struct { guint16 caps; /* capabilities */ guint32 x, y; /* reference grid size */ guint32 xo, yo; /* origin */ ComponentSize *components; guint16 n_components; guint32 xt, yt; /* tile sizes */ guint32 xto, yto; /* tile origin */ } ImageSize; /* Progression orders * L - layer * R - resolution/decomposition level * C - component * P - position/precinct */ typedef enum { PROGRESSION_ORDER_LRCP = 0, PROGRESSION_ORDER_RLCP, PROGRESSION_ORDER_RPCL, PROGRESSION_ORDER_PCRL, PROGRESSION_ORDER_CPRL, PROGRESSION_ORDER_MAX } ProgressionOrder; /* COD */ typedef struct { /* Scod */ gboolean sop, eph; /* SGcod */ ProgressionOrder progression_order; guint16 n_layers; guint8 multi_component_transform; /* SPcod */ guint8 n_decompositions; guint8 xcb, ycb; /* code block dimensions */ guint8 code_block_style; guint8 transformation; guint8 *PPx, *PPy; /* precinct sizes (default:15, * otherwise n_decompositions+1 elements) */ } CodingStyleDefault; /* SOT */ typedef struct { guint16 tile_index; guint32 tile_part_size; guint8 tile_part_index, n_tile_parts; } StartOfTile; /* PLT */ typedef struct { guint8 index; GArray *packet_lengths; /* array of guint32 */ } PacketLengthTilePart; typedef struct { StartOfTile sot; CodingStyleDefault *cod; Buffer *qcd; GList *qcc; /* list of Buffer */ GList *plt; /* list of PacketLengthTilePart */ GList *com; /* list of Buffer */ GList *packets; /* list of Packet, codestream */ /* TODO: COC, PPT */ /* Calculated value */ gint tile_x, tile_y; gint tx0, tx1, ty0, ty1; /* tile dimensions */ } Tile; typedef struct { /* Parsed values */ ImageSize siz; CodingStyleDefault cod; Buffer qcd; GList *qcc; /* list of Buffer */ GList *crg, *com; /* lists of Buffer */ /* TODO: COC, PPM, TLM, PLM */ guint n_tiles_x, n_tiles_y, n_tiles; /* calculated */ Tile *tiles; } MainHeader; typedef struct _PacketIterator PacketIterator; struct _PacketIterator { gboolean (*next) (PacketIterator * it); const MainHeader *header; const Tile *tile; gboolean first; gint cur_layer; gint cur_resolution; gint cur_component; gint cur_precinct; gint cur_x, cur_y; gint n_layers; gint n_resolutions; gint n_components; gint n_precincts, n_precincts_w, n_precincts_h; gint tx0, tx1, ty0, ty1; gint x_step, y_step; /* cached calculated values */ /* depends on resolution and component */ gint tcx0, tcx1, tcy0, tcy1; gint trx0, trx1, try0, try1; gint tpx0, tpx1, tpy0, tpy1; gint yr, xr; gint two_nl_r, two_ppx, two_ppy; gint cur_packet; }; GstFlowReturn parse_main_header (GstJP2kDecimator * self, GstByteReader * reader, MainHeader * header); guint sizeof_main_header (GstJP2kDecimator * self, const MainHeader * header); void reset_main_header (GstJP2kDecimator * self, MainHeader * header); GstFlowReturn write_main_header (GstJP2kDecimator * self, GstByteWriter * writer, const MainHeader * header); GstFlowReturn decimate_main_header (GstJP2kDecimator * self, MainHeader * header); #endif /* __JP2K_CODESTREAM_H__ */