blob: ed3b421ad8111cc046671c1f9b4f564d8bced23e
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 FFmpeg. |
7 | * |
8 | * FFmpeg 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 | * FFmpeg 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 FFmpeg; 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 | |
26 | /** |
27 | * @file |
28 | * JPEG 2000 structures and defines common |
29 | * to encoder and decoder |
30 | */ |
31 | |
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 | #define JPEG2000_SOP_FIXED_BYTES 0xFF910004 |
62 | #define JPEG2000_SOP_BYTE_LENGTH 6 |
63 | |
64 | enum Jpeg2000Quantsty { // quantization style |
65 | JPEG2000_QSTY_NONE, // no quantization |
66 | JPEG2000_QSTY_SI, // scalar derived |
67 | JPEG2000_QSTY_SE // scalar expounded |
68 | }; |
69 | |
70 | #define JPEG2000_MAX_DECLEVELS 33 |
71 | #define JPEG2000_MAX_RESLEVELS (JPEG2000_MAX_DECLEVELS + 1) |
72 | |
73 | #define JPEG2000_MAX_PASSES 100 |
74 | |
75 | // T1 flags |
76 | // flags determining significance of neighbor coefficients |
77 | #define JPEG2000_T1_SIG_N 0x0001 |
78 | #define JPEG2000_T1_SIG_E 0x0002 |
79 | #define JPEG2000_T1_SIG_W 0x0004 |
80 | #define JPEG2000_T1_SIG_S 0x0008 |
81 | #define JPEG2000_T1_SIG_NE 0x0010 |
82 | #define JPEG2000_T1_SIG_NW 0x0020 |
83 | #define JPEG2000_T1_SIG_SE 0x0040 |
84 | #define JPEG2000_T1_SIG_SW 0x0080 |
85 | #define JPEG2000_T1_SIG_NB (JPEG2000_T1_SIG_N | JPEG2000_T1_SIG_E | \ |
86 | JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_W | \ |
87 | JPEG2000_T1_SIG_NE | JPEG2000_T1_SIG_NW | \ |
88 | JPEG2000_T1_SIG_SE | JPEG2000_T1_SIG_SW) |
89 | // flags determining sign bit of neighbor coefficients |
90 | #define JPEG2000_T1_SGN_N 0x0100 |
91 | #define JPEG2000_T1_SGN_S 0x0200 |
92 | #define JPEG2000_T1_SGN_W 0x0400 |
93 | #define JPEG2000_T1_SGN_E 0x0800 |
94 | |
95 | #define JPEG2000_T1_VIS 0x1000 |
96 | #define JPEG2000_T1_SIG 0x2000 |
97 | #define JPEG2000_T1_REF 0x4000 |
98 | |
99 | #define JPEG2000_T1_SGN 0x8000 |
100 | |
101 | // Codeblock coding styles |
102 | #define JPEG2000_CBLK_BYPASS 0x01 // Selective arithmetic coding bypass |
103 | #define JPEG2000_CBLK_RESET 0x02 // Reset context probabilities |
104 | #define JPEG2000_CBLK_TERMALL 0x04 // Terminate after each coding pass |
105 | #define JPEG2000_CBLK_VSC 0x08 // Vertical stripe causal context formation |
106 | #define JPEG2000_CBLK_PREDTERM 0x10 // Predictable termination |
107 | #define JPEG2000_CBLK_SEGSYM 0x20 // Segmentation symbols present |
108 | |
109 | // Coding styles |
110 | #define JPEG2000_CSTY_PREC 0x01 // Precincts defined in coding style |
111 | #define JPEG2000_CSTY_SOP 0x02 // SOP marker present |
112 | #define JPEG2000_CSTY_EPH 0x04 // EPH marker present |
113 | |
114 | // Progression orders |
115 | #define JPEG2000_PGOD_LRCP 0x00 // Layer-resolution level-component-position progression |
116 | #define JPEG2000_PGOD_RLCP 0x01 // Resolution level-layer-component-position progression |
117 | #define JPEG2000_PGOD_RPCL 0x02 // Resolution level-position-component-layer progression |
118 | #define JPEG2000_PGOD_PCRL 0x03 // Position-component-resolution level-layer progression |
119 | #define JPEG2000_PGOD_CPRL 0x04 // Component-position-resolution level-layer progression |
120 | |
121 | typedef struct Jpeg2000T1Context { |
122 | int data[6144]; |
123 | uint16_t flags[6156]; |
124 | MqcState mqc; |
125 | int stride; |
126 | } Jpeg2000T1Context; |
127 | |
128 | typedef struct Jpeg2000TgtNode { |
129 | uint8_t val; |
130 | uint8_t vis; |
131 | struct Jpeg2000TgtNode *parent; |
132 | } Jpeg2000TgtNode; |
133 | |
134 | typedef struct Jpeg2000CodingStyle { |
135 | int nreslevels; // number of resolution levels |
136 | int nreslevels2decode; // number of resolution levels to decode |
137 | uint8_t log2_cblk_width, |
138 | log2_cblk_height; // exponent of codeblock size |
139 | uint8_t transform; // DWT type |
140 | uint8_t csty; // coding style |
141 | uint8_t nlayers; // number of layers |
142 | uint8_t mct; // multiple component transformation |
143 | uint8_t cblk_style; // codeblock coding style |
144 | uint8_t prog_order; // progression order |
145 | uint8_t log2_prec_widths[JPEG2000_MAX_RESLEVELS]; // precincts size according resolution levels |
146 | uint8_t log2_prec_heights[JPEG2000_MAX_RESLEVELS]; // TODO: initialize prec_size array with 0? |
147 | } Jpeg2000CodingStyle; |
148 | |
149 | typedef struct Jpeg2000QuantStyle { |
150 | uint8_t expn[JPEG2000_MAX_DECLEVELS * 3]; // quantization exponent |
151 | uint16_t mant[JPEG2000_MAX_DECLEVELS * 3]; // quantization mantissa |
152 | uint8_t quantsty; // quantization style |
153 | uint8_t nguardbits; // number of guard bits |
154 | } Jpeg2000QuantStyle; |
155 | |
156 | typedef struct Jpeg2000Pass { |
157 | uint16_t rate; |
158 | int64_t disto; |
159 | uint8_t flushed[4]; |
160 | int flushed_len; |
161 | } Jpeg2000Pass; |
162 | |
163 | typedef struct Jpeg2000Cblk { |
164 | uint8_t npasses; |
165 | uint8_t ninclpasses; // number coding of passes included in codestream |
166 | uint8_t nonzerobits; |
167 | uint16_t length; |
168 | uint16_t lengthinc[JPEG2000_MAX_PASSES]; |
169 | uint8_t nb_lengthinc; |
170 | uint8_t lblock; |
171 | uint8_t zero; |
172 | uint8_t data[8192]; |
173 | int nb_terminations; |
174 | int nb_terminationsinc; |
175 | int data_start[JPEG2000_MAX_PASSES]; |
176 | Jpeg2000Pass passes[JPEG2000_MAX_PASSES]; |
177 | int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} |
178 | } Jpeg2000Cblk; // code block |
179 | |
180 | typedef struct Jpeg2000Prec { |
181 | int nb_codeblocks_width; |
182 | int nb_codeblocks_height; |
183 | Jpeg2000TgtNode *zerobits; |
184 | Jpeg2000TgtNode *cblkincl; |
185 | Jpeg2000Cblk *cblk; |
186 | int decoded_layers; |
187 | int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} |
188 | } Jpeg2000Prec; // precinct |
189 | |
190 | typedef struct Jpeg2000Band { |
191 | int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} |
192 | uint16_t log2_cblk_width, log2_cblk_height; |
193 | int i_stepsize; // quantization stepsize |
194 | float f_stepsize; // quantization stepsize |
195 | Jpeg2000Prec *prec; |
196 | } Jpeg2000Band; // subband |
197 | |
198 | typedef struct Jpeg2000ResLevel { |
199 | uint8_t nbands; |
200 | int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} |
201 | int num_precincts_x, num_precincts_y; // number of precincts in x/y direction |
202 | uint8_t log2_prec_width, log2_prec_height; // exponent of precinct size |
203 | Jpeg2000Band *band; |
204 | } Jpeg2000ResLevel; // resolution level |
205 | |
206 | typedef struct Jpeg2000Component { |
207 | Jpeg2000ResLevel *reslevel; |
208 | DWTContext dwt; |
209 | float *f_data; |
210 | int *i_data; |
211 | int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- can be reduced with lowres option |
212 | int coord_o[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- original values from jpeg2000 headers |
213 | } Jpeg2000Component; |
214 | |
215 | /* misc tools */ |
216 | static inline int ff_jpeg2000_ceildivpow2(int a, int b) |
217 | { |
218 | return -(((int64_t)(-a)) >> b); |
219 | } |
220 | |
221 | static inline int ff_jpeg2000_ceildiv(int a, int b) |
222 | { |
223 | return (a + b - 1) / b; |
224 | } |
225 | |
226 | /* TIER-1 routines */ |
227 | |
228 | /* Set up lookup tables used in TIER-1. */ |
229 | void ff_jpeg2000_init_tier1_luts(void); |
230 | |
231 | /* Update significance of a coefficient at current position (x,y) and |
232 | * for neighbors. */ |
233 | void ff_jpeg2000_set_significance(Jpeg2000T1Context *t1, |
234 | int x, int y, int negative); |
235 | |
236 | extern uint8_t ff_jpeg2000_sigctxno_lut[256][4]; |
237 | |
238 | /* Get context label (number in range[0..8]) of a coefficient for significance |
239 | * propagation and cleanup coding passes. */ |
240 | static inline int ff_jpeg2000_getsigctxno(int flag, int bandno) |
241 | { |
242 | return ff_jpeg2000_sigctxno_lut[flag & 255][bandno]; |
243 | } |
244 | |
245 | static const uint8_t refctxno_lut[2][2] = { { 14, 15 }, { 16, 16 } }; |
246 | |
247 | /* Get context label (number in range[14..16]) of a coefficient for magnitude |
248 | * refinement pass. */ |
249 | static inline int ff_jpeg2000_getrefctxno(int flag) |
250 | { |
251 | return refctxno_lut[(flag >> 14) & 1][(flag & 255) != 0]; |
252 | } |
253 | |
254 | extern uint8_t ff_jpeg2000_sgnctxno_lut[16][16]; |
255 | extern uint8_t ff_jpeg2000_xorbit_lut[16][16]; |
256 | |
257 | /* Get context label (number in range[9..13]) for sign decoding. */ |
258 | static inline int ff_jpeg2000_getsgnctxno(int flag, int *xorbit) |
259 | { |
260 | *xorbit = ff_jpeg2000_xorbit_lut[flag & 15][(flag >> 8) & 15]; |
261 | return ff_jpeg2000_sgnctxno_lut[flag & 15][(flag >> 8) & 15]; |
262 | } |
263 | |
264 | int ff_jpeg2000_init_component(Jpeg2000Component *comp, |
265 | Jpeg2000CodingStyle *codsty, |
266 | Jpeg2000QuantStyle *qntsty, |
267 | int cbps, int dx, int dy, |
268 | AVCodecContext *ctx); |
269 | |
270 | void ff_jpeg2000_reinit(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); |
271 | |
272 | void ff_jpeg2000_cleanup(Jpeg2000Component *comp, Jpeg2000CodingStyle *codsty); |
273 | |
274 | static inline int needs_termination(int style, int passno) { |
275 | if (style & JPEG2000_CBLK_BYPASS) { |
276 | int type = passno % 3; |
277 | passno /= 3; |
278 | if (type == 0 && passno > 2) |
279 | return 2; |
280 | if (type == 2 && passno > 2) |
281 | return 1; |
282 | if (style & JPEG2000_CBLK_TERMALL) { |
283 | return passno > 2 ? 2 : 1; |
284 | } |
285 | } |
286 | if (style & JPEG2000_CBLK_TERMALL) |
287 | return 1; |
288 | return 0; |
289 | } |
290 | |
291 | #endif /* AVCODEC_JPEG2000_H */ |
292 |