blob: 168e7c48e38a07de0f676ca2323c3d35611008a0 [file] [log] [blame]
/* 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 <gst/gst.h>
#include <gst/base/gstbytereader.h>
#include <gst/base/gstbitreader.h>
#include <gst/base/gstbytewriter.h>
#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__ */