yading@10
|
1 /*
|
yading@10
|
2 * JPEG2000 image encoder
|
yading@10
|
3 * Copyright (c) 2007 Kamil Nowosad
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 /**
|
yading@10
|
23 * JPEG2000 image encoder
|
yading@10
|
24 * @file
|
yading@10
|
25 * @author Kamil Nowosad
|
yading@10
|
26 */
|
yading@10
|
27
|
yading@10
|
28 #include <float.h>
|
yading@10
|
29 #include "avcodec.h"
|
yading@10
|
30 #include "internal.h"
|
yading@10
|
31 #include "bytestream.h"
|
yading@10
|
32 #include "j2k.h"
|
yading@10
|
33 #include "libavutil/common.h"
|
yading@10
|
34
|
yading@10
|
35 #define NMSEDEC_BITS 7
|
yading@10
|
36 #define NMSEDEC_FRACBITS (NMSEDEC_BITS-1)
|
yading@10
|
37 #define WMSEDEC_SHIFT 13 ///< must be >= 13
|
yading@10
|
38 #define LAMBDA_SCALE (100000000LL << (WMSEDEC_SHIFT - 13))
|
yading@10
|
39
|
yading@10
|
40 static int lut_nmsedec_ref [1<<NMSEDEC_BITS],
|
yading@10
|
41 lut_nmsedec_ref0[1<<NMSEDEC_BITS],
|
yading@10
|
42 lut_nmsedec_sig [1<<NMSEDEC_BITS],
|
yading@10
|
43 lut_nmsedec_sig0[1<<NMSEDEC_BITS];
|
yading@10
|
44
|
yading@10
|
45 static const int dwt_norms[2][4][10] = { // [dwt_type][band][rlevel] (multiplied by 10000)
|
yading@10
|
46 {{10000, 19650, 41770, 84030, 169000, 338400, 676900, 1353000, 2706000, 5409000},
|
yading@10
|
47 {20220, 39890, 83550, 170400, 342700, 686300, 1373000, 2746000, 5490000},
|
yading@10
|
48 {20220, 39890, 83550, 170400, 342700, 686300, 1373000, 2746000, 5490000},
|
yading@10
|
49 {20800, 38650, 83070, 171800, 347100, 695900, 1393000, 2786000, 5572000}},
|
yading@10
|
50
|
yading@10
|
51 {{10000, 15000, 27500, 53750, 106800, 213400, 426700, 853300, 1707000, 3413000},
|
yading@10
|
52 {10380, 15920, 29190, 57030, 113300, 226400, 452500, 904800, 1809000},
|
yading@10
|
53 {10380, 15920, 29190, 57030, 113300, 226400, 452500, 904800, 1809000},
|
yading@10
|
54 { 7186, 9218, 15860, 30430, 60190, 120100, 240000, 479700, 959300}}
|
yading@10
|
55 };
|
yading@10
|
56
|
yading@10
|
57 typedef struct {
|
yading@10
|
58 J2kComponent *comp;
|
yading@10
|
59 } J2kTile;
|
yading@10
|
60
|
yading@10
|
61 typedef struct {
|
yading@10
|
62 AVCodecContext *avctx;
|
yading@10
|
63 AVFrame picture;
|
yading@10
|
64
|
yading@10
|
65 int width, height; ///< image width and height
|
yading@10
|
66 uint8_t cbps[4]; ///< bits per sample in particular components
|
yading@10
|
67 int chroma_shift[2];
|
yading@10
|
68 uint8_t planar;
|
yading@10
|
69 int ncomponents;
|
yading@10
|
70 int tile_width, tile_height; ///< tile size
|
yading@10
|
71 int numXtiles, numYtiles;
|
yading@10
|
72
|
yading@10
|
73 uint8_t *buf_start;
|
yading@10
|
74 uint8_t *buf;
|
yading@10
|
75 uint8_t *buf_end;
|
yading@10
|
76 int bit_index;
|
yading@10
|
77
|
yading@10
|
78 int64_t lambda;
|
yading@10
|
79
|
yading@10
|
80 J2kCodingStyle codsty;
|
yading@10
|
81 J2kQuantStyle qntsty;
|
yading@10
|
82
|
yading@10
|
83 J2kTile *tile;
|
yading@10
|
84 } J2kEncoderContext;
|
yading@10
|
85
|
yading@10
|
86
|
yading@10
|
87 /* debug */
|
yading@10
|
88 #if 0
|
yading@10
|
89 #undef ifprintf
|
yading@10
|
90 #undef printf
|
yading@10
|
91
|
yading@10
|
92 static void nspaces(FILE *fd, int n)
|
yading@10
|
93 {
|
yading@10
|
94 while(n--) putc(' ', fd);
|
yading@10
|
95 }
|
yading@10
|
96
|
yading@10
|
97 static void printcomp(J2kComponent *comp)
|
yading@10
|
98 {
|
yading@10
|
99 int i;
|
yading@10
|
100 for (i = 0; i < comp->y1 - comp->y0; i++)
|
yading@10
|
101 ff_j2k_printv(comp->data + i * (comp->x1 - comp->x0), comp->x1 - comp->x0);
|
yading@10
|
102 }
|
yading@10
|
103
|
yading@10
|
104 static void dump(J2kEncoderContext *s, FILE *fd)
|
yading@10
|
105 {
|
yading@10
|
106 int tileno, compno, reslevelno, bandno, precno;
|
yading@10
|
107 fprintf(fd, "XSiz = %d, YSiz = %d, tile_width = %d, tile_height = %d\n"
|
yading@10
|
108 "numXtiles = %d, numYtiles = %d, ncomponents = %d\n"
|
yading@10
|
109 "tiles:\n",
|
yading@10
|
110 s->width, s->height, s->tile_width, s->tile_height,
|
yading@10
|
111 s->numXtiles, s->numYtiles, s->ncomponents);
|
yading@10
|
112 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
|
yading@10
|
113 J2kTile *tile = s->tile + tileno;
|
yading@10
|
114 nspaces(fd, 2);
|
yading@10
|
115 fprintf(fd, "tile %d:\n", tileno);
|
yading@10
|
116 for(compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
117 J2kComponent *comp = tile->comp + compno;
|
yading@10
|
118 nspaces(fd, 4);
|
yading@10
|
119 fprintf(fd, "component %d:\n", compno);
|
yading@10
|
120 nspaces(fd, 4);
|
yading@10
|
121 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d\n",
|
yading@10
|
122 comp->x0, comp->x1, comp->y0, comp->y1);
|
yading@10
|
123 for(reslevelno = 0; reslevelno < s->nreslevels; reslevelno++){
|
yading@10
|
124 J2kResLevel *reslevel = comp->reslevel + reslevelno;
|
yading@10
|
125 nspaces(fd, 6);
|
yading@10
|
126 fprintf(fd, "reslevel %d:\n", reslevelno);
|
yading@10
|
127 nspaces(fd, 6);
|
yading@10
|
128 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d, nbands = %d\n",
|
yading@10
|
129 reslevel->x0, reslevel->x1, reslevel->y0,
|
yading@10
|
130 reslevel->y1, reslevel->nbands);
|
yading@10
|
131 for(bandno = 0; bandno < reslevel->nbands; bandno++){
|
yading@10
|
132 J2kBand *band = reslevel->band + bandno;
|
yading@10
|
133 nspaces(fd, 8);
|
yading@10
|
134 fprintf(fd, "band %d:\n", bandno);
|
yading@10
|
135 nspaces(fd, 8);
|
yading@10
|
136 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d,"
|
yading@10
|
137 "codeblock_width = %d, codeblock_height = %d cblknx = %d cblkny = %d\n",
|
yading@10
|
138 band->x0, band->x1,
|
yading@10
|
139 band->y0, band->y1,
|
yading@10
|
140 band->codeblock_width, band->codeblock_height,
|
yading@10
|
141 band->cblknx, band->cblkny);
|
yading@10
|
142 for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++){
|
yading@10
|
143 J2kPrec *prec = band->prec + precno;
|
yading@10
|
144 nspaces(fd, 10);
|
yading@10
|
145 fprintf(fd, "prec %d:\n", precno);
|
yading@10
|
146 nspaces(fd, 10);
|
yading@10
|
147 fprintf(fd, "xi0 = %d, xi1 = %d, yi0 = %d, yi1 = %d\n",
|
yading@10
|
148 prec->xi0, prec->xi1, prec->yi0, prec->yi1);
|
yading@10
|
149 }
|
yading@10
|
150 }
|
yading@10
|
151 }
|
yading@10
|
152 }
|
yading@10
|
153 }
|
yading@10
|
154 }
|
yading@10
|
155 #endif
|
yading@10
|
156
|
yading@10
|
157 /* bitstream routines */
|
yading@10
|
158
|
yading@10
|
159 /** put n times val bit */
|
yading@10
|
160 static void put_bits(J2kEncoderContext *s, int val, int n) // TODO: optimize
|
yading@10
|
161 {
|
yading@10
|
162 while (n-- > 0){
|
yading@10
|
163 if (s->bit_index == 8)
|
yading@10
|
164 {
|
yading@10
|
165 s->bit_index = *s->buf == 0xff;
|
yading@10
|
166 *(++s->buf) = 0;
|
yading@10
|
167 }
|
yading@10
|
168 *s->buf |= val << (7 - s->bit_index++);
|
yading@10
|
169 }
|
yading@10
|
170 }
|
yading@10
|
171
|
yading@10
|
172 /** put n least significant bits of a number num */
|
yading@10
|
173 static void put_num(J2kEncoderContext *s, int num, int n)
|
yading@10
|
174 {
|
yading@10
|
175 while(--n >= 0)
|
yading@10
|
176 put_bits(s, (num >> n) & 1, 1);
|
yading@10
|
177 }
|
yading@10
|
178
|
yading@10
|
179 /** flush the bitstream */
|
yading@10
|
180 static void j2k_flush(J2kEncoderContext *s)
|
yading@10
|
181 {
|
yading@10
|
182 if (s->bit_index){
|
yading@10
|
183 s->bit_index = 0;
|
yading@10
|
184 s->buf++;
|
yading@10
|
185 }
|
yading@10
|
186 }
|
yading@10
|
187
|
yading@10
|
188 /* tag tree routines */
|
yading@10
|
189
|
yading@10
|
190 /** code the value stored in node */
|
yading@10
|
191 static void tag_tree_code(J2kEncoderContext *s, J2kTgtNode *node, int threshold)
|
yading@10
|
192 {
|
yading@10
|
193 J2kTgtNode *stack[30];
|
yading@10
|
194 int sp = 1, curval = 0;
|
yading@10
|
195 stack[0] = node;
|
yading@10
|
196
|
yading@10
|
197 node = node->parent;
|
yading@10
|
198 while(node){
|
yading@10
|
199 if (node->vis){
|
yading@10
|
200 curval = node->val;
|
yading@10
|
201 break;
|
yading@10
|
202 }
|
yading@10
|
203 node->vis++;
|
yading@10
|
204 stack[sp++] = node;
|
yading@10
|
205 node = node->parent;
|
yading@10
|
206 }
|
yading@10
|
207 while(--sp >= 0){
|
yading@10
|
208 if (stack[sp]->val >= threshold){
|
yading@10
|
209 put_bits(s, 0, threshold - curval);
|
yading@10
|
210 break;
|
yading@10
|
211 }
|
yading@10
|
212 put_bits(s, 0, stack[sp]->val - curval);
|
yading@10
|
213 put_bits(s, 1, 1);
|
yading@10
|
214 curval = stack[sp]->val;
|
yading@10
|
215 }
|
yading@10
|
216 }
|
yading@10
|
217
|
yading@10
|
218 /** update the value in node */
|
yading@10
|
219 static void tag_tree_update(J2kTgtNode *node)
|
yading@10
|
220 {
|
yading@10
|
221 int lev = 0;
|
yading@10
|
222 while (node->parent){
|
yading@10
|
223 if (node->parent->val <= node->val)
|
yading@10
|
224 break;
|
yading@10
|
225 node->parent->val = node->val;
|
yading@10
|
226 node = node->parent;
|
yading@10
|
227 lev++;
|
yading@10
|
228 }
|
yading@10
|
229 }
|
yading@10
|
230
|
yading@10
|
231 static int put_siz(J2kEncoderContext *s)
|
yading@10
|
232 {
|
yading@10
|
233 int i;
|
yading@10
|
234
|
yading@10
|
235 if (s->buf_end - s->buf < 40 + 3 * s->ncomponents)
|
yading@10
|
236 return -1;
|
yading@10
|
237
|
yading@10
|
238 bytestream_put_be16(&s->buf, J2K_SIZ);
|
yading@10
|
239 bytestream_put_be16(&s->buf, 38 + 3 * s->ncomponents); // Lsiz
|
yading@10
|
240 bytestream_put_be16(&s->buf, 0); // Rsiz
|
yading@10
|
241 bytestream_put_be32(&s->buf, s->width); // width
|
yading@10
|
242 bytestream_put_be32(&s->buf, s->height); // height
|
yading@10
|
243 bytestream_put_be32(&s->buf, 0); // X0Siz
|
yading@10
|
244 bytestream_put_be32(&s->buf, 0); // Y0Siz
|
yading@10
|
245
|
yading@10
|
246 bytestream_put_be32(&s->buf, s->tile_width); // XTSiz
|
yading@10
|
247 bytestream_put_be32(&s->buf, s->tile_height); // YTSiz
|
yading@10
|
248 bytestream_put_be32(&s->buf, 0); // XT0Siz
|
yading@10
|
249 bytestream_put_be32(&s->buf, 0); // YT0Siz
|
yading@10
|
250 bytestream_put_be16(&s->buf, s->ncomponents); // CSiz
|
yading@10
|
251
|
yading@10
|
252 for (i = 0; i < s->ncomponents; i++){ // Ssiz_i XRsiz_i, YRsiz_i
|
yading@10
|
253 bytestream_put_byte(&s->buf, 7);
|
yading@10
|
254 bytestream_put_byte(&s->buf, i?1<<s->chroma_shift[0]:1);
|
yading@10
|
255 bytestream_put_byte(&s->buf, i?1<<s->chroma_shift[1]:1);
|
yading@10
|
256 }
|
yading@10
|
257 return 0;
|
yading@10
|
258 }
|
yading@10
|
259
|
yading@10
|
260 static int put_cod(J2kEncoderContext *s)
|
yading@10
|
261 {
|
yading@10
|
262 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
263
|
yading@10
|
264 if (s->buf_end - s->buf < 14)
|
yading@10
|
265 return -1;
|
yading@10
|
266
|
yading@10
|
267 bytestream_put_be16(&s->buf, J2K_COD);
|
yading@10
|
268 bytestream_put_be16(&s->buf, 12); // Lcod
|
yading@10
|
269 bytestream_put_byte(&s->buf, 0); // Scod
|
yading@10
|
270 // SGcod
|
yading@10
|
271 bytestream_put_byte(&s->buf, 0); // progression level
|
yading@10
|
272 bytestream_put_be16(&s->buf, 1); // num of layers
|
yading@10
|
273 if(s->avctx->pix_fmt == AV_PIX_FMT_YUV444P){
|
yading@10
|
274 bytestream_put_byte(&s->buf, 2); // ICT
|
yading@10
|
275 }else{
|
yading@10
|
276 bytestream_put_byte(&s->buf, 0); // unspecified
|
yading@10
|
277 }
|
yading@10
|
278 // SPcod
|
yading@10
|
279 bytestream_put_byte(&s->buf, codsty->nreslevels - 1); // num of decomp. levels
|
yading@10
|
280 bytestream_put_byte(&s->buf, codsty->log2_cblk_width-2); // cblk width
|
yading@10
|
281 bytestream_put_byte(&s->buf, codsty->log2_cblk_height-2); // cblk height
|
yading@10
|
282 bytestream_put_byte(&s->buf, 0); // cblk style
|
yading@10
|
283 bytestream_put_byte(&s->buf, codsty->transform); // transformation
|
yading@10
|
284 return 0;
|
yading@10
|
285 }
|
yading@10
|
286
|
yading@10
|
287 static int put_qcd(J2kEncoderContext *s, int compno)
|
yading@10
|
288 {
|
yading@10
|
289 int i, size;
|
yading@10
|
290 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
291 J2kQuantStyle *qntsty = &s->qntsty;
|
yading@10
|
292
|
yading@10
|
293 if (qntsty->quantsty == J2K_QSTY_NONE)
|
yading@10
|
294 size = 4 + 3 * (codsty->nreslevels-1);
|
yading@10
|
295 else // QSTY_SE
|
yading@10
|
296 size = 5 + 6 * (codsty->nreslevels-1);
|
yading@10
|
297
|
yading@10
|
298 if (s->buf_end - s->buf < size + 2)
|
yading@10
|
299 return -1;
|
yading@10
|
300
|
yading@10
|
301 bytestream_put_be16(&s->buf, J2K_QCD);
|
yading@10
|
302 bytestream_put_be16(&s->buf, size); // LQcd
|
yading@10
|
303 bytestream_put_byte(&s->buf, (qntsty->nguardbits << 5) | qntsty->quantsty); // Sqcd
|
yading@10
|
304 if (qntsty->quantsty == J2K_QSTY_NONE)
|
yading@10
|
305 for (i = 0; i < codsty->nreslevels * 3 - 2; i++)
|
yading@10
|
306 bytestream_put_byte(&s->buf, qntsty->expn[i] << 3);
|
yading@10
|
307 else // QSTY_SE
|
yading@10
|
308 for (i = 0; i < codsty->nreslevels * 3 - 2; i++)
|
yading@10
|
309 bytestream_put_be16(&s->buf, (qntsty->expn[i] << 11) | qntsty->mant[i]);
|
yading@10
|
310 return 0;
|
yading@10
|
311 }
|
yading@10
|
312
|
yading@10
|
313 static uint8_t *put_sot(J2kEncoderContext *s, int tileno)
|
yading@10
|
314 {
|
yading@10
|
315 uint8_t *psotptr;
|
yading@10
|
316
|
yading@10
|
317 if (s->buf_end - s->buf < 12)
|
yading@10
|
318 return NULL;
|
yading@10
|
319
|
yading@10
|
320 bytestream_put_be16(&s->buf, J2K_SOT);
|
yading@10
|
321 bytestream_put_be16(&s->buf, 10); // Lsot
|
yading@10
|
322 bytestream_put_be16(&s->buf, tileno); // Isot
|
yading@10
|
323
|
yading@10
|
324 psotptr = s->buf;
|
yading@10
|
325 bytestream_put_be32(&s->buf, 0); // Psot (filled in later)
|
yading@10
|
326
|
yading@10
|
327 bytestream_put_byte(&s->buf, 0); // TPsot
|
yading@10
|
328 bytestream_put_byte(&s->buf, 1); // TNsot
|
yading@10
|
329 return psotptr;
|
yading@10
|
330 }
|
yading@10
|
331
|
yading@10
|
332 /**
|
yading@10
|
333 * compute the sizes of tiles, resolution levels, bands, etc.
|
yading@10
|
334 * allocate memory for them
|
yading@10
|
335 * divide the input image into tile-components
|
yading@10
|
336 */
|
yading@10
|
337 static int init_tiles(J2kEncoderContext *s)
|
yading@10
|
338 {
|
yading@10
|
339 int tileno, tilex, tiley, compno;
|
yading@10
|
340 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
341 J2kQuantStyle *qntsty = &s->qntsty;
|
yading@10
|
342
|
yading@10
|
343 s->numXtiles = ff_j2k_ceildiv(s->width, s->tile_width);
|
yading@10
|
344 s->numYtiles = ff_j2k_ceildiv(s->height, s->tile_height);
|
yading@10
|
345
|
yading@10
|
346 s->tile = av_malloc(s->numXtiles * s->numYtiles * sizeof(J2kTile));
|
yading@10
|
347 if (!s->tile)
|
yading@10
|
348 return AVERROR(ENOMEM);
|
yading@10
|
349 for (tileno = 0, tiley = 0; tiley < s->numYtiles; tiley++)
|
yading@10
|
350 for (tilex = 0; tilex < s->numXtiles; tilex++, tileno++){
|
yading@10
|
351 J2kTile *tile = s->tile + tileno;
|
yading@10
|
352
|
yading@10
|
353 tile->comp = av_malloc(s->ncomponents * sizeof(J2kComponent));
|
yading@10
|
354 if (!tile->comp)
|
yading@10
|
355 return AVERROR(ENOMEM);
|
yading@10
|
356 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
357 J2kComponent *comp = tile->comp + compno;
|
yading@10
|
358 int ret, i, j;
|
yading@10
|
359
|
yading@10
|
360 comp->coord[0][0] = tilex * s->tile_width;
|
yading@10
|
361 comp->coord[0][1] = FFMIN((tilex+1)*s->tile_width, s->width);
|
yading@10
|
362 comp->coord[1][0] = tiley * s->tile_height;
|
yading@10
|
363 comp->coord[1][1] = FFMIN((tiley+1)*s->tile_height, s->height);
|
yading@10
|
364 if (compno > 0)
|
yading@10
|
365 for (i = 0; i < 2; i++)
|
yading@10
|
366 for (j = 0; j < 2; j++)
|
yading@10
|
367 comp->coord[i][j] = ff_j2k_ceildivpow2(comp->coord[i][j], s->chroma_shift[i]);
|
yading@10
|
368
|
yading@10
|
369 if (ret = ff_j2k_init_component(comp, codsty, qntsty, s->cbps[compno], compno?1<<s->chroma_shift[0]:1, compno?1<<s->chroma_shift[1]:1))
|
yading@10
|
370 return ret;
|
yading@10
|
371 }
|
yading@10
|
372 }
|
yading@10
|
373 return 0;
|
yading@10
|
374 }
|
yading@10
|
375
|
yading@10
|
376 static void copy_frame(J2kEncoderContext *s)
|
yading@10
|
377 {
|
yading@10
|
378 int tileno, compno, i, y, x;
|
yading@10
|
379 uint8_t *line;
|
yading@10
|
380 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
|
yading@10
|
381 J2kTile *tile = s->tile + tileno;
|
yading@10
|
382 if (s->planar){
|
yading@10
|
383 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
384 J2kComponent *comp = tile->comp + compno;
|
yading@10
|
385 int *dst = comp->data;
|
yading@10
|
386 line = s->picture.data[compno]
|
yading@10
|
387 + comp->coord[1][0] * s->picture.linesize[compno]
|
yading@10
|
388 + comp->coord[0][0];
|
yading@10
|
389 for (y = comp->coord[1][0]; y < comp->coord[1][1]; y++){
|
yading@10
|
390 uint8_t *ptr = line;
|
yading@10
|
391 for (x = comp->coord[0][0]; x < comp->coord[0][1]; x++)
|
yading@10
|
392 *dst++ = *ptr++ - (1 << 7);
|
yading@10
|
393 line += s->picture.linesize[compno];
|
yading@10
|
394 }
|
yading@10
|
395 }
|
yading@10
|
396 } else{
|
yading@10
|
397 line = s->picture.data[0] + tile->comp[0].coord[1][0] * s->picture.linesize[0]
|
yading@10
|
398 + tile->comp[0].coord[0][0] * s->ncomponents;
|
yading@10
|
399
|
yading@10
|
400 i = 0;
|
yading@10
|
401 for (y = tile->comp[0].coord[1][0]; y < tile->comp[0].coord[1][1]; y++){
|
yading@10
|
402 uint8_t *ptr = line;
|
yading@10
|
403 for (x = tile->comp[0].coord[0][0]; x < tile->comp[0].coord[0][1]; x++, i++){
|
yading@10
|
404 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
405 tile->comp[compno].data[i] = *ptr++ - (1 << 7);
|
yading@10
|
406 }
|
yading@10
|
407 }
|
yading@10
|
408 line += s->picture.linesize[0];
|
yading@10
|
409 }
|
yading@10
|
410 }
|
yading@10
|
411 }
|
yading@10
|
412 }
|
yading@10
|
413
|
yading@10
|
414 static void init_quantization(J2kEncoderContext *s)
|
yading@10
|
415 {
|
yading@10
|
416 int compno, reslevelno, bandno;
|
yading@10
|
417 J2kQuantStyle *qntsty = &s->qntsty;
|
yading@10
|
418 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
419
|
yading@10
|
420 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
421 int gbandno = 0;
|
yading@10
|
422 for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){
|
yading@10
|
423 int nbands, lev = codsty->nreslevels - reslevelno - 1;
|
yading@10
|
424 nbands = reslevelno ? 3 : 1;
|
yading@10
|
425 for (bandno = 0; bandno < nbands; bandno++, gbandno++){
|
yading@10
|
426 int expn, mant;
|
yading@10
|
427
|
yading@10
|
428 if (codsty->transform == FF_DWT97){
|
yading@10
|
429 int bandpos = bandno + (reslevelno>0),
|
yading@10
|
430 ss = 81920000 / dwt_norms[0][bandpos][lev],
|
yading@10
|
431 log = av_log2(ss);
|
yading@10
|
432 mant = (11 - log < 0 ? ss >> log - 11 : ss << 11 - log) & 0x7ff;
|
yading@10
|
433 expn = s->cbps[compno] - log + 13;
|
yading@10
|
434 } else
|
yading@10
|
435 expn = ((bandno&2)>>1) + (reslevelno>0) + s->cbps[compno];
|
yading@10
|
436
|
yading@10
|
437 qntsty->expn[gbandno] = expn;
|
yading@10
|
438 qntsty->mant[gbandno] = mant;
|
yading@10
|
439 }
|
yading@10
|
440 }
|
yading@10
|
441 }
|
yading@10
|
442 }
|
yading@10
|
443
|
yading@10
|
444 static void init_luts(void)
|
yading@10
|
445 {
|
yading@10
|
446 int i, a,
|
yading@10
|
447 mask = ~((1<<NMSEDEC_FRACBITS)-1);
|
yading@10
|
448
|
yading@10
|
449 for (i = 0; i < (1 << NMSEDEC_BITS); i++){
|
yading@10
|
450 lut_nmsedec_sig[i] = FFMAX(6*i - (9<<NMSEDEC_FRACBITS-1) << 12-NMSEDEC_FRACBITS, 0);
|
yading@10
|
451 lut_nmsedec_sig0[i] = FFMAX((i*i + (1<<NMSEDEC_FRACBITS-1) & mask) << 1, 0);
|
yading@10
|
452
|
yading@10
|
453 a = (i >> (NMSEDEC_BITS-2)&2) + 1;
|
yading@10
|
454 lut_nmsedec_ref[i] = FFMAX((-2*i + (1<<NMSEDEC_FRACBITS) + a*i - (a*a<<NMSEDEC_FRACBITS-2))
|
yading@10
|
455 << 13-NMSEDEC_FRACBITS, 0);
|
yading@10
|
456 lut_nmsedec_ref0[i] = FFMAX(((i*i + (1-4*i << NMSEDEC_FRACBITS-1) + (1<<2*NMSEDEC_FRACBITS)) & mask)
|
yading@10
|
457 << 1, 0);
|
yading@10
|
458 }
|
yading@10
|
459 }
|
yading@10
|
460
|
yading@10
|
461 /* tier-1 routines */
|
yading@10
|
462 static int getnmsedec_sig(int x, int bpno)
|
yading@10
|
463 {
|
yading@10
|
464 if (bpno > NMSEDEC_FRACBITS)
|
yading@10
|
465 return lut_nmsedec_sig[(x >> (bpno - NMSEDEC_FRACBITS)) & ((1 << NMSEDEC_BITS) - 1)];
|
yading@10
|
466 return lut_nmsedec_sig0[x & ((1 << NMSEDEC_BITS) - 1)];
|
yading@10
|
467 }
|
yading@10
|
468
|
yading@10
|
469 static int getnmsedec_ref(int x, int bpno)
|
yading@10
|
470 {
|
yading@10
|
471 if (bpno > NMSEDEC_FRACBITS)
|
yading@10
|
472 return lut_nmsedec_ref[(x >> (bpno - NMSEDEC_FRACBITS)) & ((1 << NMSEDEC_BITS) - 1)];
|
yading@10
|
473 return lut_nmsedec_ref0[x & ((1 << NMSEDEC_BITS) - 1)];
|
yading@10
|
474 }
|
yading@10
|
475
|
yading@10
|
476 static void encode_sigpass(J2kT1Context *t1, int width, int height, int bandno, int *nmsedec, int bpno)
|
yading@10
|
477 {
|
yading@10
|
478 int y0, x, y, mask = 1 << (bpno + NMSEDEC_FRACBITS);
|
yading@10
|
479 int vert_causal_ctx_csty_loc_symbol;
|
yading@10
|
480 for (y0 = 0; y0 < height; y0 += 4)
|
yading@10
|
481 for (x = 0; x < width; x++)
|
yading@10
|
482 for (y = y0; y < height && y < y0+4; y++){
|
yading@10
|
483 if (!(t1->flags[y+1][x+1] & J2K_T1_SIG) && (t1->flags[y+1][x+1] & J2K_T1_SIG_NB)){
|
yading@10
|
484 int ctxno = ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno, vert_causal_ctx_csty_loc_symbol),
|
yading@10
|
485 bit = t1->data[y][x] & mask ? 1 : 0;
|
yading@10
|
486 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, bit);
|
yading@10
|
487 if (bit){
|
yading@10
|
488 int xorbit;
|
yading@10
|
489 int ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
yading@10
|
490 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit);
|
yading@10
|
491 *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
yading@10
|
492 ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15);
|
yading@10
|
493 }
|
yading@10
|
494 t1->flags[y+1][x+1] |= J2K_T1_VIS;
|
yading@10
|
495 }
|
yading@10
|
496 }
|
yading@10
|
497 }
|
yading@10
|
498
|
yading@10
|
499 static void encode_refpass(J2kT1Context *t1, int width, int height, int *nmsedec, int bpno)
|
yading@10
|
500 {
|
yading@10
|
501 int y0, x, y, mask = 1 << (bpno + NMSEDEC_FRACBITS);
|
yading@10
|
502 for (y0 = 0; y0 < height; y0 += 4)
|
yading@10
|
503 for (x = 0; x < width; x++)
|
yading@10
|
504 for (y = y0; y < height && y < y0+4; y++)
|
yading@10
|
505 if ((t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)) == J2K_T1_SIG){
|
yading@10
|
506 int ctxno = ff_j2k_getrefctxno(t1->flags[y+1][x+1]);
|
yading@10
|
507 *nmsedec += getnmsedec_ref(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
yading@10
|
508 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0);
|
yading@10
|
509 t1->flags[y+1][x+1] |= J2K_T1_REF;
|
yading@10
|
510 }
|
yading@10
|
511 }
|
yading@10
|
512
|
yading@10
|
513 static void encode_clnpass(J2kT1Context *t1, int width, int height, int bandno, int *nmsedec, int bpno)
|
yading@10
|
514 {
|
yading@10
|
515 int y0, x, y, mask = 1 << (bpno + NMSEDEC_FRACBITS);
|
yading@10
|
516 int vert_causal_ctx_csty_loc_symbol;
|
yading@10
|
517 for (y0 = 0; y0 < height; y0 += 4)
|
yading@10
|
518 for (x = 0; x < width; x++){
|
yading@10
|
519 if (y0 + 3 < height && !(
|
yading@10
|
520 (t1->flags[y0+1][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
|
yading@10
|
521 (t1->flags[y0+2][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
|
yading@10
|
522 (t1->flags[y0+3][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
|
yading@10
|
523 (t1->flags[y0+4][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG))))
|
yading@10
|
524 {
|
yading@10
|
525 // aggregation mode
|
yading@10
|
526 int rlen;
|
yading@10
|
527 for (rlen = 0; rlen < 4; rlen++)
|
yading@10
|
528 if (t1->data[y0+rlen][x] & mask)
|
yading@10
|
529 break;
|
yading@10
|
530 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL, rlen != 4);
|
yading@10
|
531 if (rlen == 4)
|
yading@10
|
532 continue;
|
yading@10
|
533 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI, rlen >> 1);
|
yading@10
|
534 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI, rlen & 1);
|
yading@10
|
535 for (y = y0 + rlen; y < y0 + 4; y++){
|
yading@10
|
536 if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS))){
|
yading@10
|
537 int ctxno = ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno, vert_causal_ctx_csty_loc_symbol);
|
yading@10
|
538 if (y > y0 + rlen)
|
yading@10
|
539 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0);
|
yading@10
|
540 if (t1->data[y][x] & mask){ // newly significant
|
yading@10
|
541 int xorbit;
|
yading@10
|
542 int ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
yading@10
|
543 *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
yading@10
|
544 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit);
|
yading@10
|
545 ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15);
|
yading@10
|
546 }
|
yading@10
|
547 }
|
yading@10
|
548 t1->flags[y+1][x+1] &= ~J2K_T1_VIS;
|
yading@10
|
549 }
|
yading@10
|
550 } else{
|
yading@10
|
551 for (y = y0; y < y0 + 4 && y < height; y++){
|
yading@10
|
552 if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS))){
|
yading@10
|
553 int ctxno = ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno, vert_causal_ctx_csty_loc_symbol);
|
yading@10
|
554 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, t1->data[y][x] & mask ? 1:0);
|
yading@10
|
555 if (t1->data[y][x] & mask){ // newly significant
|
yading@10
|
556 int xorbit;
|
yading@10
|
557 int ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
|
yading@10
|
558 *nmsedec += getnmsedec_sig(t1->data[y][x], bpno + NMSEDEC_FRACBITS);
|
yading@10
|
559 ff_mqc_encode(&t1->mqc, t1->mqc.cx_states + ctxno, (t1->flags[y+1][x+1] >> 15) ^ xorbit);
|
yading@10
|
560 ff_j2k_set_significant(t1, x, y, t1->flags[y+1][x+1] >> 15);
|
yading@10
|
561 }
|
yading@10
|
562 }
|
yading@10
|
563 t1->flags[y+1][x+1] &= ~J2K_T1_VIS;
|
yading@10
|
564 }
|
yading@10
|
565 }
|
yading@10
|
566 }
|
yading@10
|
567 }
|
yading@10
|
568
|
yading@10
|
569 static void encode_cblk(J2kEncoderContext *s, J2kT1Context *t1, J2kCblk *cblk, J2kTile *tile,
|
yading@10
|
570 int width, int height, int bandpos, int lev)
|
yading@10
|
571 {
|
yading@10
|
572 int pass_t = 2, passno, x, y, max=0, nmsedec, bpno;
|
yading@10
|
573 int64_t wmsedec = 0;
|
yading@10
|
574
|
yading@10
|
575 for (y = 0; y < height+2; y++)
|
yading@10
|
576 memset(t1->flags[y], 0, (width+2)*sizeof(int));
|
yading@10
|
577
|
yading@10
|
578 for (y = 0; y < height; y++){
|
yading@10
|
579 for (x = 0; x < width; x++){
|
yading@10
|
580 if (t1->data[y][x] < 0){
|
yading@10
|
581 t1->flags[y+1][x+1] |= J2K_T1_SGN;
|
yading@10
|
582 t1->data[y][x] = -t1->data[y][x];
|
yading@10
|
583 }
|
yading@10
|
584 max = FFMAX(max, t1->data[y][x]);
|
yading@10
|
585 }
|
yading@10
|
586 }
|
yading@10
|
587
|
yading@10
|
588 if (max == 0){
|
yading@10
|
589 cblk->nonzerobits = 0;
|
yading@10
|
590 bpno = 0;
|
yading@10
|
591 } else{
|
yading@10
|
592 cblk->nonzerobits = av_log2(max) + 1 - NMSEDEC_FRACBITS;
|
yading@10
|
593 bpno = cblk->nonzerobits - 1;
|
yading@10
|
594 }
|
yading@10
|
595
|
yading@10
|
596 ff_mqc_initenc(&t1->mqc, cblk->data);
|
yading@10
|
597
|
yading@10
|
598 for (passno = 0; bpno >= 0; passno++){
|
yading@10
|
599 nmsedec=0;
|
yading@10
|
600
|
yading@10
|
601 switch(pass_t){
|
yading@10
|
602 case 0: encode_sigpass(t1, width, height, bandpos, &nmsedec, bpno);
|
yading@10
|
603 break;
|
yading@10
|
604 case 1: encode_refpass(t1, width, height, &nmsedec, bpno);
|
yading@10
|
605 break;
|
yading@10
|
606 case 2: encode_clnpass(t1, width, height, bandpos, &nmsedec, bpno);
|
yading@10
|
607 break;
|
yading@10
|
608 }
|
yading@10
|
609
|
yading@10
|
610 cblk->passes[passno].rate = 3 + ff_mqc_length(&t1->mqc);
|
yading@10
|
611 wmsedec += (int64_t)nmsedec << (2*bpno);
|
yading@10
|
612 cblk->passes[passno].disto = wmsedec;
|
yading@10
|
613
|
yading@10
|
614 if (++pass_t == 3){
|
yading@10
|
615 pass_t = 0;
|
yading@10
|
616 bpno--;
|
yading@10
|
617 }
|
yading@10
|
618 }
|
yading@10
|
619 cblk->npasses = passno;
|
yading@10
|
620 cblk->ninclpasses = passno;
|
yading@10
|
621
|
yading@10
|
622 // TODO: optional flush on each pass
|
yading@10
|
623 cblk->passes[passno-1].rate = ff_mqc_flush(&t1->mqc);
|
yading@10
|
624 }
|
yading@10
|
625
|
yading@10
|
626 /* tier-2 routines: */
|
yading@10
|
627
|
yading@10
|
628 static void putnumpasses(J2kEncoderContext *s, int n)
|
yading@10
|
629 {
|
yading@10
|
630 if (n == 1)
|
yading@10
|
631 put_num(s, 0, 1);
|
yading@10
|
632 else if (n == 2)
|
yading@10
|
633 put_num(s, 2, 2);
|
yading@10
|
634 else if (n <= 5)
|
yading@10
|
635 put_num(s, 0xc | (n-3), 4);
|
yading@10
|
636 else if (n <= 36)
|
yading@10
|
637 put_num(s, 0x1e0 | (n-6), 9);
|
yading@10
|
638 else
|
yading@10
|
639 put_num(s, 0xff80 | (n-37), 16);
|
yading@10
|
640 }
|
yading@10
|
641
|
yading@10
|
642
|
yading@10
|
643 static int encode_packet(J2kEncoderContext *s, J2kResLevel *rlevel, int precno,
|
yading@10
|
644 uint8_t *expn, int numgbits)
|
yading@10
|
645 {
|
yading@10
|
646 int bandno, empty = 1;
|
yading@10
|
647
|
yading@10
|
648 // init bitstream
|
yading@10
|
649 *s->buf = 0;
|
yading@10
|
650 s->bit_index = 0;
|
yading@10
|
651
|
yading@10
|
652 // header
|
yading@10
|
653
|
yading@10
|
654 // is the packet empty?
|
yading@10
|
655 for (bandno = 0; bandno < rlevel->nbands; bandno++){
|
yading@10
|
656 if (rlevel->band[bandno].coord[0][0] < rlevel->band[bandno].coord[0][1]
|
yading@10
|
657 && rlevel->band[bandno].coord[1][0] < rlevel->band[bandno].coord[1][1]){
|
yading@10
|
658 empty = 0;
|
yading@10
|
659 break;
|
yading@10
|
660 }
|
yading@10
|
661 }
|
yading@10
|
662
|
yading@10
|
663 put_bits(s, !empty, 1);
|
yading@10
|
664 if (empty){
|
yading@10
|
665 j2k_flush(s);
|
yading@10
|
666 return 0;
|
yading@10
|
667 }
|
yading@10
|
668
|
yading@10
|
669 for (bandno = 0; bandno < rlevel->nbands; bandno++){
|
yading@10
|
670 J2kBand *band = rlevel->band + bandno;
|
yading@10
|
671 J2kPrec *prec = band->prec + precno;
|
yading@10
|
672 int yi, xi, pos;
|
yading@10
|
673 int cblknw = prec->xi1 - prec->xi0;
|
yading@10
|
674
|
yading@10
|
675 if (band->coord[0][0] == band->coord[0][1]
|
yading@10
|
676 || band->coord[1][0] == band->coord[1][1])
|
yading@10
|
677 continue;
|
yading@10
|
678
|
yading@10
|
679 for (pos=0, yi = prec->yi0; yi < prec->yi1; yi++){
|
yading@10
|
680 for (xi = prec->xi0; xi < prec->xi1; xi++, pos++){
|
yading@10
|
681 prec->cblkincl[pos].val = band->cblk[yi * cblknw + xi].ninclpasses == 0;
|
yading@10
|
682 tag_tree_update(prec->cblkincl + pos);
|
yading@10
|
683 prec->zerobits[pos].val = expn[bandno] + numgbits - 1 - band->cblk[yi * cblknw + xi].nonzerobits;
|
yading@10
|
684 tag_tree_update(prec->zerobits + pos);
|
yading@10
|
685 }
|
yading@10
|
686 }
|
yading@10
|
687
|
yading@10
|
688 for (pos=0, yi = prec->yi0; yi < prec->yi1; yi++){
|
yading@10
|
689 for (xi = prec->xi0; xi < prec->xi1; xi++, pos++){
|
yading@10
|
690 int pad = 0, llen, length;
|
yading@10
|
691 J2kCblk *cblk = band->cblk + yi * cblknw + xi;
|
yading@10
|
692
|
yading@10
|
693 if (s->buf_end - s->buf < 20) // approximately
|
yading@10
|
694 return -1;
|
yading@10
|
695
|
yading@10
|
696 // inclusion information
|
yading@10
|
697 tag_tree_code(s, prec->cblkincl + pos, 1);
|
yading@10
|
698 if (!cblk->ninclpasses)
|
yading@10
|
699 continue;
|
yading@10
|
700 // zerobits information
|
yading@10
|
701 tag_tree_code(s, prec->zerobits + pos, 100);
|
yading@10
|
702 // number of passes
|
yading@10
|
703 putnumpasses(s, cblk->ninclpasses);
|
yading@10
|
704
|
yading@10
|
705 length = cblk->passes[cblk->ninclpasses-1].rate;
|
yading@10
|
706 llen = av_log2(length) - av_log2(cblk->ninclpasses) - 2;
|
yading@10
|
707 if (llen < 0){
|
yading@10
|
708 pad = -llen;
|
yading@10
|
709 llen = 0;
|
yading@10
|
710 }
|
yading@10
|
711 // length of code block
|
yading@10
|
712 put_bits(s, 1, llen);
|
yading@10
|
713 put_bits(s, 0, 1);
|
yading@10
|
714 put_num(s, length, av_log2(length)+1+pad);
|
yading@10
|
715 }
|
yading@10
|
716 }
|
yading@10
|
717 }
|
yading@10
|
718 j2k_flush(s);
|
yading@10
|
719 for (bandno = 0; bandno < rlevel->nbands; bandno++){
|
yading@10
|
720 J2kBand *band = rlevel->band + bandno;
|
yading@10
|
721 J2kPrec *prec = band->prec + precno;
|
yading@10
|
722 int yi, cblknw = prec->xi1 - prec->xi0;
|
yading@10
|
723 for (yi = prec->yi0; yi < prec->yi1; yi++){
|
yading@10
|
724 int xi;
|
yading@10
|
725 for (xi = prec->xi0; xi < prec->xi1; xi++){
|
yading@10
|
726 J2kCblk *cblk = band->cblk + yi * cblknw + xi;
|
yading@10
|
727 if (cblk->ninclpasses){
|
yading@10
|
728 if (s->buf_end - s->buf < cblk->passes[cblk->ninclpasses-1].rate)
|
yading@10
|
729 return -1;
|
yading@10
|
730 bytestream_put_buffer(&s->buf, cblk->data, cblk->passes[cblk->ninclpasses-1].rate);
|
yading@10
|
731 }
|
yading@10
|
732 }
|
yading@10
|
733 }
|
yading@10
|
734 }
|
yading@10
|
735 return 0;
|
yading@10
|
736 }
|
yading@10
|
737
|
yading@10
|
738 static int encode_packets(J2kEncoderContext *s, J2kTile *tile, int tileno)
|
yading@10
|
739 {
|
yading@10
|
740 int compno, reslevelno, ret;
|
yading@10
|
741 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
742 J2kQuantStyle *qntsty = &s->qntsty;
|
yading@10
|
743
|
yading@10
|
744 av_log(s->avctx, AV_LOG_DEBUG, "tier2\n");
|
yading@10
|
745 // lay-rlevel-comp-pos progression
|
yading@10
|
746 for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){
|
yading@10
|
747 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
748 int precno;
|
yading@10
|
749 J2kResLevel *reslevel = s->tile[tileno].comp[compno].reslevel + reslevelno;
|
yading@10
|
750 for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++){
|
yading@10
|
751 if (ret = encode_packet(s, reslevel, precno, qntsty->expn + (reslevelno ? 3*reslevelno-2 : 0),
|
yading@10
|
752 qntsty->nguardbits))
|
yading@10
|
753 return ret;
|
yading@10
|
754 }
|
yading@10
|
755 }
|
yading@10
|
756 }
|
yading@10
|
757 av_log(s->avctx, AV_LOG_DEBUG, "after tier2\n");
|
yading@10
|
758 return 0;
|
yading@10
|
759 }
|
yading@10
|
760
|
yading@10
|
761 static int getcut(J2kCblk *cblk, int64_t lambda, int dwt_norm)
|
yading@10
|
762 {
|
yading@10
|
763 int passno, res = 0;
|
yading@10
|
764 for (passno = 0; passno < cblk->npasses; passno++){
|
yading@10
|
765 int dr;
|
yading@10
|
766 int64_t dd;
|
yading@10
|
767
|
yading@10
|
768 dr = cblk->passes[passno].rate
|
yading@10
|
769 - (res ? cblk->passes[res-1].rate:0);
|
yading@10
|
770 dd = cblk->passes[passno].disto
|
yading@10
|
771 - (res ? cblk->passes[res-1].disto:0);
|
yading@10
|
772
|
yading@10
|
773 if (((dd * dwt_norm) >> WMSEDEC_SHIFT) * dwt_norm >= dr * lambda)
|
yading@10
|
774 res = passno+1;
|
yading@10
|
775 }
|
yading@10
|
776 return res;
|
yading@10
|
777 }
|
yading@10
|
778
|
yading@10
|
779 static void truncpasses(J2kEncoderContext *s, J2kTile *tile)
|
yading@10
|
780 {
|
yading@10
|
781 int compno, reslevelno, bandno, cblkno, lev;
|
yading@10
|
782 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
783
|
yading@10
|
784 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
785 J2kComponent *comp = tile->comp + compno;
|
yading@10
|
786
|
yading@10
|
787 for (reslevelno = 0, lev = codsty->nreslevels-1; reslevelno < codsty->nreslevels; reslevelno++, lev--){
|
yading@10
|
788 J2kResLevel *reslevel = comp->reslevel + reslevelno;
|
yading@10
|
789
|
yading@10
|
790 for (bandno = 0; bandno < reslevel->nbands ; bandno++){
|
yading@10
|
791 int bandpos = bandno + (reslevelno > 0);
|
yading@10
|
792 J2kBand *band = reslevel->band + bandno;
|
yading@10
|
793
|
yading@10
|
794 for (cblkno = 0; cblkno < band->cblknx * band->cblkny; cblkno++){
|
yading@10
|
795 J2kCblk *cblk = band->cblk + cblkno;
|
yading@10
|
796
|
yading@10
|
797 cblk->ninclpasses = getcut(cblk, s->lambda,
|
yading@10
|
798 (int64_t)dwt_norms[codsty->transform][bandpos][lev] * (int64_t)band->stepsize >> 13);
|
yading@10
|
799 }
|
yading@10
|
800 }
|
yading@10
|
801 }
|
yading@10
|
802 }
|
yading@10
|
803 }
|
yading@10
|
804
|
yading@10
|
805 static int encode_tile(J2kEncoderContext *s, J2kTile *tile, int tileno)
|
yading@10
|
806 {
|
yading@10
|
807 int compno, reslevelno, bandno, ret;
|
yading@10
|
808 J2kT1Context t1;
|
yading@10
|
809 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
810 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
811 J2kComponent *comp = s->tile[tileno].comp + compno;
|
yading@10
|
812
|
yading@10
|
813 av_log(s->avctx, AV_LOG_DEBUG,"dwt\n");
|
yading@10
|
814 if (ret = ff_j2k_dwt_encode(&comp->dwt, comp->data))
|
yading@10
|
815 return ret;
|
yading@10
|
816 av_log(s->avctx, AV_LOG_DEBUG,"after dwt -> tier1\n");
|
yading@10
|
817
|
yading@10
|
818 for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){
|
yading@10
|
819 J2kResLevel *reslevel = comp->reslevel + reslevelno;
|
yading@10
|
820
|
yading@10
|
821 for (bandno = 0; bandno < reslevel->nbands ; bandno++){
|
yading@10
|
822 J2kBand *band = reslevel->band + bandno;
|
yading@10
|
823 int cblkx, cblky, cblkno=0, xx0, x0, xx1, y0, yy0, yy1, bandpos;
|
yading@10
|
824 yy0 = bandno == 0 ? 0 : comp->reslevel[reslevelno-1].coord[1][1] - comp->reslevel[reslevelno-1].coord[1][0];
|
yading@10
|
825 y0 = yy0;
|
yading@10
|
826 yy1 = FFMIN(ff_j2k_ceildiv(band->coord[1][0] + 1, band->codeblock_height) * band->codeblock_height,
|
yading@10
|
827 band->coord[1][1]) - band->coord[1][0] + yy0;
|
yading@10
|
828
|
yading@10
|
829 if (band->coord[0][0] == band->coord[0][1] || band->coord[1][0] == band->coord[1][1])
|
yading@10
|
830 continue;
|
yading@10
|
831
|
yading@10
|
832 bandpos = bandno + (reslevelno > 0);
|
yading@10
|
833
|
yading@10
|
834 for (cblky = 0; cblky < band->cblkny; cblky++){
|
yading@10
|
835 if (reslevelno == 0 || bandno == 1)
|
yading@10
|
836 xx0 = 0;
|
yading@10
|
837 else
|
yading@10
|
838 xx0 = comp->reslevel[reslevelno-1].coord[0][1] - comp->reslevel[reslevelno-1].coord[0][0];
|
yading@10
|
839 x0 = xx0;
|
yading@10
|
840 xx1 = FFMIN(ff_j2k_ceildiv(band->coord[0][0] + 1, band->codeblock_width) * band->codeblock_width,
|
yading@10
|
841 band->coord[0][1]) - band->coord[0][0] + xx0;
|
yading@10
|
842
|
yading@10
|
843 for (cblkx = 0; cblkx < band->cblknx; cblkx++, cblkno++){
|
yading@10
|
844 int y, x;
|
yading@10
|
845 if (codsty->transform == FF_DWT53){
|
yading@10
|
846 for (y = yy0; y < yy1; y++){
|
yading@10
|
847 int *ptr = t1.data[y-yy0];
|
yading@10
|
848 for (x = xx0; x < xx1; x++){
|
yading@10
|
849 *ptr++ = comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS;
|
yading@10
|
850 }
|
yading@10
|
851 }
|
yading@10
|
852 } else{
|
yading@10
|
853 for (y = yy0; y < yy1; y++){
|
yading@10
|
854 int *ptr = t1.data[y-yy0];
|
yading@10
|
855 for (x = xx0; x < xx1; x++){
|
yading@10
|
856 *ptr = (comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x]);
|
yading@10
|
857 *ptr = (int64_t)*ptr * (int64_t)(8192 * 8192 / band->stepsize) >> 13 - NMSEDEC_FRACBITS;
|
yading@10
|
858 ptr++;
|
yading@10
|
859 }
|
yading@10
|
860 }
|
yading@10
|
861 }
|
yading@10
|
862 encode_cblk(s, &t1, band->cblk + cblkno, tile, xx1 - xx0, yy1 - yy0,
|
yading@10
|
863 bandpos, codsty->nreslevels - reslevelno - 1);
|
yading@10
|
864 xx0 = xx1;
|
yading@10
|
865 xx1 = FFMIN(xx1 + band->codeblock_width, band->coord[0][1] - band->coord[0][0] + x0);
|
yading@10
|
866 }
|
yading@10
|
867 yy0 = yy1;
|
yading@10
|
868 yy1 = FFMIN(yy1 + band->codeblock_height, band->coord[1][1] - band->coord[1][0] + y0);
|
yading@10
|
869 }
|
yading@10
|
870 }
|
yading@10
|
871 }
|
yading@10
|
872 av_log(s->avctx, AV_LOG_DEBUG, "after tier1\n");
|
yading@10
|
873 }
|
yading@10
|
874
|
yading@10
|
875 av_log(s->avctx, AV_LOG_DEBUG, "rate control\n");
|
yading@10
|
876 truncpasses(s, tile);
|
yading@10
|
877 if (ret = encode_packets(s, tile, tileno))
|
yading@10
|
878 return ret;
|
yading@10
|
879 av_log(s->avctx, AV_LOG_DEBUG, "after rate control\n");
|
yading@10
|
880 return 0;
|
yading@10
|
881 }
|
yading@10
|
882
|
yading@10
|
883 static void cleanup(J2kEncoderContext *s)
|
yading@10
|
884 {
|
yading@10
|
885 int tileno, compno;
|
yading@10
|
886 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
887
|
yading@10
|
888 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
|
yading@10
|
889 for (compno = 0; compno < s->ncomponents; compno++){
|
yading@10
|
890 J2kComponent *comp = s->tile[tileno].comp + compno;
|
yading@10
|
891 ff_j2k_cleanup(comp, codsty);
|
yading@10
|
892 }
|
yading@10
|
893 av_freep(&s->tile[tileno].comp);
|
yading@10
|
894 }
|
yading@10
|
895 av_freep(&s->tile);
|
yading@10
|
896 }
|
yading@10
|
897
|
yading@10
|
898 static void reinit(J2kEncoderContext *s)
|
yading@10
|
899 {
|
yading@10
|
900 int tileno, compno;
|
yading@10
|
901 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
|
yading@10
|
902 J2kTile *tile = s->tile + tileno;
|
yading@10
|
903 for (compno = 0; compno < s->ncomponents; compno++)
|
yading@10
|
904 ff_j2k_reinit(tile->comp + compno, &s->codsty);
|
yading@10
|
905 }
|
yading@10
|
906 }
|
yading@10
|
907
|
yading@10
|
908 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
yading@10
|
909 const AVFrame *pict, int *got_packet)
|
yading@10
|
910 {
|
yading@10
|
911 int tileno, ret;
|
yading@10
|
912 J2kEncoderContext *s = avctx->priv_data;
|
yading@10
|
913
|
yading@10
|
914 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*9 + FF_MIN_BUFFER_SIZE)) < 0)
|
yading@10
|
915 return ret;
|
yading@10
|
916
|
yading@10
|
917 // init:
|
yading@10
|
918 s->buf = s->buf_start = pkt->data;
|
yading@10
|
919 s->buf_end = pkt->data + pkt->size;
|
yading@10
|
920
|
yading@10
|
921 s->picture = *pict;
|
yading@10
|
922 avctx->coded_frame= &s->picture;
|
yading@10
|
923
|
yading@10
|
924 s->lambda = s->picture.quality * LAMBDA_SCALE;
|
yading@10
|
925
|
yading@10
|
926 copy_frame(s);
|
yading@10
|
927 reinit(s);
|
yading@10
|
928
|
yading@10
|
929 if (s->buf_end - s->buf < 2)
|
yading@10
|
930 return -1;
|
yading@10
|
931 bytestream_put_be16(&s->buf, J2K_SOC);
|
yading@10
|
932 if (ret = put_siz(s))
|
yading@10
|
933 return ret;
|
yading@10
|
934 if (ret = put_cod(s))
|
yading@10
|
935 return ret;
|
yading@10
|
936 if (ret = put_qcd(s, 0))
|
yading@10
|
937 return ret;
|
yading@10
|
938
|
yading@10
|
939 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
|
yading@10
|
940 uint8_t *psotptr;
|
yading@10
|
941 if (!(psotptr = put_sot(s, tileno)))
|
yading@10
|
942 return -1;
|
yading@10
|
943 if (s->buf_end - s->buf < 2)
|
yading@10
|
944 return -1;
|
yading@10
|
945 bytestream_put_be16(&s->buf, J2K_SOD);
|
yading@10
|
946 if (ret = encode_tile(s, s->tile + tileno, tileno))
|
yading@10
|
947 return ret;
|
yading@10
|
948 bytestream_put_be32(&psotptr, s->buf - psotptr + 6);
|
yading@10
|
949 }
|
yading@10
|
950 if (s->buf_end - s->buf < 2)
|
yading@10
|
951 return -1;
|
yading@10
|
952 bytestream_put_be16(&s->buf, J2K_EOC);
|
yading@10
|
953
|
yading@10
|
954 av_log(s->avctx, AV_LOG_DEBUG, "end\n");
|
yading@10
|
955 pkt->size = s->buf - s->buf_start;
|
yading@10
|
956 pkt->flags |= AV_PKT_FLAG_KEY;
|
yading@10
|
957 *got_packet = 1;
|
yading@10
|
958
|
yading@10
|
959 return 0;
|
yading@10
|
960 }
|
yading@10
|
961
|
yading@10
|
962 static av_cold int j2kenc_init(AVCodecContext *avctx)
|
yading@10
|
963 {
|
yading@10
|
964 int i, ret;
|
yading@10
|
965 J2kEncoderContext *s = avctx->priv_data;
|
yading@10
|
966 J2kCodingStyle *codsty = &s->codsty;
|
yading@10
|
967 J2kQuantStyle *qntsty = &s->qntsty;
|
yading@10
|
968
|
yading@10
|
969 s->avctx = avctx;
|
yading@10
|
970 av_log(s->avctx, AV_LOG_DEBUG, "init\n");
|
yading@10
|
971
|
yading@10
|
972 // defaults:
|
yading@10
|
973 // TODO: implement setting non-standard precinct size
|
yading@10
|
974 codsty->log2_prec_width = 15;
|
yading@10
|
975 codsty->log2_prec_height = 15;
|
yading@10
|
976 codsty->nreslevels = 7;
|
yading@10
|
977 codsty->log2_cblk_width = 4;
|
yading@10
|
978 codsty->log2_cblk_height = 4;
|
yading@10
|
979 codsty->transform = 1;
|
yading@10
|
980
|
yading@10
|
981 qntsty->nguardbits = 1;
|
yading@10
|
982
|
yading@10
|
983 s->tile_width = 256;
|
yading@10
|
984 s->tile_height = 256;
|
yading@10
|
985
|
yading@10
|
986 if (codsty->transform == FF_DWT53)
|
yading@10
|
987 qntsty->quantsty = J2K_QSTY_NONE;
|
yading@10
|
988 else
|
yading@10
|
989 qntsty->quantsty = J2K_QSTY_SE;
|
yading@10
|
990
|
yading@10
|
991 s->width = avctx->width;
|
yading@10
|
992 s->height = avctx->height;
|
yading@10
|
993
|
yading@10
|
994 for (i = 0; i < 3; i++)
|
yading@10
|
995 s->cbps[i] = 8;
|
yading@10
|
996
|
yading@10
|
997 if (avctx->pix_fmt == AV_PIX_FMT_RGB24){
|
yading@10
|
998 s->ncomponents = 3;
|
yading@10
|
999 } else if (avctx->pix_fmt == AV_PIX_FMT_GRAY8){
|
yading@10
|
1000 s->ncomponents = 1;
|
yading@10
|
1001 } else{ // planar YUV
|
yading@10
|
1002 s->planar = 1;
|
yading@10
|
1003 s->ncomponents = 3;
|
yading@10
|
1004 avcodec_get_chroma_sub_sample(avctx->pix_fmt,
|
yading@10
|
1005 s->chroma_shift, s->chroma_shift + 1);
|
yading@10
|
1006 }
|
yading@10
|
1007
|
yading@10
|
1008 ff_j2k_init_tier1_luts();
|
yading@10
|
1009
|
yading@10
|
1010 init_luts();
|
yading@10
|
1011
|
yading@10
|
1012 init_quantization(s);
|
yading@10
|
1013 if (ret=init_tiles(s))
|
yading@10
|
1014 return ret;
|
yading@10
|
1015
|
yading@10
|
1016 av_log(s->avctx, AV_LOG_DEBUG, "after init\n");
|
yading@10
|
1017
|
yading@10
|
1018 return 0;
|
yading@10
|
1019 }
|
yading@10
|
1020
|
yading@10
|
1021 static int j2kenc_destroy(AVCodecContext *avctx)
|
yading@10
|
1022 {
|
yading@10
|
1023 J2kEncoderContext *s = avctx->priv_data;
|
yading@10
|
1024
|
yading@10
|
1025 cleanup(s);
|
yading@10
|
1026 return 0;
|
yading@10
|
1027 }
|
yading@10
|
1028
|
yading@10
|
1029 AVCodec ff_jpeg2000_encoder = {
|
yading@10
|
1030 .name = "j2k",
|
yading@10
|
1031 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
1032 .id = AV_CODEC_ID_JPEG2000,
|
yading@10
|
1033 .priv_data_size = sizeof(J2kEncoderContext),
|
yading@10
|
1034 .init = j2kenc_init,
|
yading@10
|
1035 .encode2 = encode_frame,
|
yading@10
|
1036 .close = j2kenc_destroy,
|
yading@10
|
1037 .capabilities = CODEC_CAP_EXPERIMENTAL,
|
yading@10
|
1038 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
|
yading@10
|
1039 .pix_fmts = (const enum AVPixelFormat[]) {
|
yading@10
|
1040 AV_PIX_FMT_RGB24, AV_PIX_FMT_YUV444P, AV_PIX_FMT_GRAY8,
|
yading@10
|
1041 /* AV_PIX_FMT_YUV420P,
|
yading@10
|
1042 AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
|
yading@10
|
1043 AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,*/
|
yading@10
|
1044 AV_PIX_FMT_NONE
|
yading@10
|
1045 }
|
yading@10
|
1046 };
|