mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
193 lines
4.7 KiB
C
193 lines
4.7 KiB
C
/* 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__ */
|