Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
jpeg2000.h
Go to the documentation of this file.
1
/*
2
* JPEG 2000 common defines, structures and functions
3
* Copyright (c) 2007 Kamil Nowosad
4
* Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
5
*
6
* This file is part of Libav.
7
*
8
* Libav is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* Libav is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#ifndef AVCODEC_JPEG2000_H
24
#define AVCODEC_JPEG2000_H
25
32
#include <stdint.h>
33
34
#include "
avcodec.h
"
35
#include "
mqc.h
"
36
#include "
jpeg2000dwt.h
"
37
38
enum
Jpeg2000Markers
{
39
JPEG2000_SOC
= 0xff4f,
// start of codestream
40
JPEG2000_SIZ
= 0xff51,
// image and tile size
41
JPEG2000_COD
,
// coding style default
42
JPEG2000_COC
,
// coding style component
43
JPEG2000_TLM
= 0xff55,
// packed packet headers, tile-part header
44
JPEG2000_PLM
= 0xff57,
// tile-part lengths
45
JPEG2000_PLT
,
// packet length, main header
46
JPEG2000_QCD
= 0xff5c,
// quantization default
47
JPEG2000_QCC
,
// quantization component
48
JPEG2000_RGN
,
// region of interest
49
JPEG2000_POC
,
// progression order change
50
JPEG2000_PPM
,
// packet length, tile-part header
51
JPEG2000_PPT
,
// packed packet headers, main header
52
JPEG2000_CRG
= 0xff63,
// component registration
53
JPEG2000_COM
,
// comment
54
JPEG2000_SOT
= 0xff90,
// start of tile-part
55
JPEG2000_SOP
,
// start of packet
56
JPEG2000_EPH
,
// end of packet header
57
JPEG2000_SOD
,
// start of data
58
JPEG2000_EOC
= 0xffd9,
// end of codestream
59
};
60
61
enum
Jpeg2000Quantsty
{
// quantization style
62
JPEG2000_QSTY_NONE
,
// no quantization
63
JPEG2000_QSTY_SI
,
// scalar derived
64
JPEG2000_QSTY_SE
// scalar expounded
65
};
66
67
#define JPEG2000_MAX_CBLKW 64
68
#define JPEG2000_MAX_CBLKH 64
69
70
71
#define JPEG2000_MAX_DECLEVELS 32
72
#define JPEG2000_MAX_RESLEVELS (JPEG2000_MAX_DECLEVELS + 1)
73
74
// T1 flags
75
// flags determining significance of neighbor coefficients
76
#define JPEG2000_T1_SIG_N 0x0001
77
#define JPEG2000_T1_SIG_E 0x0002
78
#define JPEG2000_T1_SIG_W 0x0004
79
#define JPEG2000_T1_SIG_S 0x0008
80
#define JPEG2000_T1_SIG_NE 0x0010
81
#define JPEG2000_T1_SIG_NW 0x0020
82
#define JPEG2000_T1_SIG_SE 0x0040
83
#define JPEG2000_T1_SIG_SW 0x0080
84
#define JPEG2000_T1_SIG_NB (JPEG2000_T1_SIG_N | JPEG2000_T1_SIG_E | \
85
JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_W | \
86
JPEG2000_T1_SIG_NE | JPEG2000_T1_SIG_NW | \
87
JPEG2000_T1_SIG_SE | JPEG2000_T1_SIG_SW)
88
// flags determining sign bit of neighbor coefficients
89
#define JPEG2000_T1_SGN_N 0x0100
90
#define JPEG2000_T1_SGN_S 0x0200
91
#define JPEG2000_T1_SGN_W 0x0400
92
#define JPEG2000_T1_SGN_E 0x0800
93
94
#define JPEG2000_T1_VIS 0x1000
95
#define JPEG2000_T1_SIG 0x2000
96
#define JPEG2000_T1_REF 0x4000
97
98
#define JPEG2000_T1_SGN 0x8000
99
100
// Codeblock coding styles
101
#define JPEG2000_CBLK_BYPASS 0x01 // Selective arithmetic coding bypass
102
#define JPEG2000_CBLK_RESET 0x02 // Reset context probabilities
103
#define JPEG2000_CBLK_TERMALL 0x04 // Terminate after each coding pass
104
#define JPEG2000_CBLK_VSC 0x08 // Vertical stripe causal context formation
105
#define JPEG2000_CBLK_PREDTERM 0x10 // Predictable termination
106
#define JPEG2000_CBLK_SEGSYM 0x20 // Segmentation symbols present
107
108
// Coding styles
109
#define JPEG2000_CSTY_PREC 0x01 // Precincts defined in coding style
110
#define JPEG2000_CSTY_SOP 0x02 // SOP marker present
111
#define JPEG2000_CSTY_EPH 0x04 // EPH marker present
112
113
// Progression orders
114
#define JPEG2000_PGOD_LRCP 0x00 // Layer-resolution level-component-position progression
115
#define JPEG2000_PGOD_RLCP 0x01 // Resolution level-layer-component-position progression
116
#define JPEG2000_PGOD_RPCL 0x02 // Resolution level-position-component-layer progression
117
#define JPEG2000_PGOD_PCRL 0x03 // Position-component-resolution level-layer progression
118
#define JPEG2000_PGOD_CPRL 0x04 // Component-position-resolution level-layer progression
119
120
typedef
struct
Jpeg2000T1Context
{
121
int
data
[
JPEG2000_MAX_CBLKW
][
JPEG2000_MAX_CBLKH
];
122
int
flags
[
JPEG2000_MAX_CBLKW
+ 2][
JPEG2000_MAX_CBLKH
+ 2];
123
MqcState
mqc
;
124
}
Jpeg2000T1Context
;
125
126
typedef
struct
Jpeg2000TgtNode
{
127
uint8_t
val
;
128
uint8_t
vis
;
129
struct
Jpeg2000TgtNode
*
parent
;
130
}
Jpeg2000TgtNode
;
131
132
typedef
struct
Jpeg2000CodingStyle
{
133
uint8_t
nreslevels
;
// number of resolution levels
134
uint8_t
nreslevels2decode
;
// number of resolution levels to decode
135
uint8_t
log2_cblk_width
,
136
log2_cblk_height
;
// exponent of codeblock size
137
uint8_t
transform
;
// DWT type
138
uint8_t
csty
;
// coding style
139
uint8_t
nlayers
;
// number of layers
140
uint8_t
mct
;
// multiple component transformation
141
uint8_t
cblk_style
;
// codeblock coding style
142
uint8_t
prog_order
;
// progression order
143
uint8_t
log2_prec_widths
[
JPEG2000_MAX_RESLEVELS
];
// precincts size according resolution levels
144
uint8_t
log2_prec_heights
[
JPEG2000_MAX_RESLEVELS
];
// TODO: initialize prec_size array with 0?
145
}
Jpeg2000CodingStyle
;
146
147
typedef
struct
Jpeg2000QuantStyle
{
148
uint8_t
expn
[
JPEG2000_MAX_DECLEVELS
* 3];
// quantization exponent
149
uint32_t
mant
[
JPEG2000_MAX_DECLEVELS
* 3];
// quantization mantissa
150
uint8_t
quantsty
;
// quantization style
151
uint8_t
nguardbits
;
// number of guard bits
152
}
Jpeg2000QuantStyle
;
153
154
typedef
struct
Jpeg2000Cblk
{
155
uint8_t
npasses
;
156
uint8_t
ninclpasses
;
// number coding of passes included in codestream
157
uint8_t
nonzerobits
;
158
uint16_t
length
;
159
uint16_t
lengthinc
;
160
uint8_t
lblock
;
161
uint8_t
zero
;
162
uint8_t
data
[8192];
163
uint16_t
coord
[2][2];
// border coordinates {{x0, x1}, {y0, y1}}
164
}
Jpeg2000Cblk
;
// code block
165
166
typedef
struct
Jpeg2000Prec
{
167
uint16_t
nb_codeblocks_width
;
168
uint16_t
nb_codeblocks_height
;
169
Jpeg2000TgtNode
*
zerobits
;
170
Jpeg2000TgtNode
*
cblkincl
;
171
Jpeg2000Cblk
*
cblk
;
172
uint16_t
coord
[2][2];
// border coordinates {{x0, x1}, {y0, y1}}
173
}
Jpeg2000Prec
;
// precinct
174
175
typedef
struct
Jpeg2000Band
{
176
uint16_t
coord
[2][2];
// border coordinates {{x0, x1}, {y0, y1}}
177
uint16_t
log2_cblk_width
,
log2_cblk_height
;
178
int
i_stepsize
;
// quantization stepsize
179
float
f_stepsize
;
// quantization stepsize
180
Jpeg2000Prec
*
prec
;
181
}
Jpeg2000Band
;
// subband
182
183
typedef
struct
Jpeg2000ResLevel
{
184
uint8_t
nbands
;
185
uint16_t
coord
[2][2];
// border coordinates {{x0, x1}, {y0, y1}}
186
uint16_t
num_precincts_x
,
num_precincts_y
;
// number of precincts in x/y direction
187
uint8_t
log2_prec_width
,
log2_prec_height
;
// exponent of precinct size
188
Jpeg2000Band
*
band
;
189
}
Jpeg2000ResLevel
;
// resolution level
190
191
typedef
struct
Jpeg2000Component
{
192
Jpeg2000ResLevel
*
reslevel
;
193
DWTContext
dwt
;
194
float
*
f_data
;
195
int
*
i_data
;
196
uint16_t
coord
[2][2];
// border coordinates {{x0, x1}, {y0, y1}} -- can be reduced with lowres option
197
uint16_t
coord_o
[2][2];
// border coordinates {{x0, x1}, {y0, y1}} -- original values from jpeg2000 headers
198
}
Jpeg2000Component
;
199
200
/* misc tools */
201
static
inline
int
ff_jpeg2000_ceildivpow2
(
int
a
,
int
b
)
202
{
203
return
(a + (1 << b) - 1) >>
b
;
204
}
205
206
static
inline
int
ff_jpeg2000_ceildiv
(
int
a
,
int
b
)
207
{
208
return
(a + b - 1) /
b
;
209
}
210
211
/* TIER-1 routines */
212
213
/* Set up lookup tables used in TIER-1. */
214
void
ff_jpeg2000_init_tier1_luts
(
void
);
215
216
/* Update significance of a coefficient at current position (x,y) and
217
* for neighbors. */
218
void
ff_jpeg2000_set_significance
(
Jpeg2000T1Context
*t1,
219
int
x,
int
y,
int
negative);
220
221
extern
uint8_t
ff_jpeg2000_sigctxno_lut
[256][4];
222
223
/* Get context label (number in range[0..8]) of a coefficient for significance
224
* propagation and cleanup coding passes. */
225
static
inline
int
ff_jpeg2000_getsigctxno
(
int
flag,
int
bandno)
226
{
227
return
ff_jpeg2000_sigctxno_lut
[flag & 255][bandno];
228
}
229
230
static
const
uint8_t
refctxno_lut
[2][2] = { { 14, 15 }, { 16, 16 } };
231
232
/* Get context label (number in range[14..16]) of a coefficient for magnitude
233
* refinement pass. */
234
static
inline
int
ff_jpeg2000_getrefctxno
(
int
flag)
235
{
236
return
refctxno_lut
[(flag >> 14) & 1][(flag & 255) != 0];
237
}
238
239
extern
uint8_t
ff_jpeg2000_sgnctxno_lut
[16][16];
240
extern
uint8_t
ff_jpeg2000_xorbit_lut
[16][16];
241
242
/* Get context label (number in range[9..13]) for sign decoding. */
243
static
inline
int
ff_jpeg2000_getsgnctxno
(
int
flag,
int
*xorbit)
244
{
245
*xorbit =
ff_jpeg2000_xorbit_lut
[flag & 15][(flag >> 8) & 15];
246
return
ff_jpeg2000_sgnctxno_lut
[flag & 15][(flag >> 8) & 15];
247
}
248
249
int
ff_jpeg2000_init_component
(
Jpeg2000Component
*
comp
,
250
Jpeg2000CodingStyle
*codsty,
251
Jpeg2000QuantStyle
*qntsty,
252
int
cbps,
int
dx,
int
dy,
253
AVCodecContext
*ctx);
254
255
void
ff_jpeg2000_cleanup
(
Jpeg2000Component
*
comp
,
Jpeg2000CodingStyle
*codsty);
256
257
#endif
/* AVCODEC_JPEG2000_H */
Generated on Tue Mar 1 2016 21:14:35 for Libav by
1.8.4