annotate ffmpeg/libavcodec/j2kdec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * JPEG2000 image decoder
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 decoder
yading@10 24 * @file
yading@10 25 * @author Kamil Nowosad
yading@10 26 */
yading@10 27
yading@10 28 // #define DEBUG
yading@10 29
yading@10 30 #include "avcodec.h"
yading@10 31 #include "bytestream.h"
yading@10 32 #include "internal.h"
yading@10 33 #include "j2k.h"
yading@10 34 #include "libavutil/common.h"
yading@10 35
yading@10 36 #define JP2_SIG_TYPE 0x6A502020
yading@10 37 #define JP2_SIG_VALUE 0x0D0A870A
yading@10 38 #define JP2_CODESTREAM 0x6A703263
yading@10 39
yading@10 40 #define HAD_COC 0x01
yading@10 41 #define HAD_QCC 0x02
yading@10 42
yading@10 43 typedef struct {
yading@10 44 J2kComponent *comp;
yading@10 45 uint8_t properties[4];
yading@10 46 J2kCodingStyle codsty[4];
yading@10 47 J2kQuantStyle qntsty[4];
yading@10 48 } J2kTile;
yading@10 49
yading@10 50 typedef struct {
yading@10 51 AVCodecContext *avctx;
yading@10 52 AVFrame *picture;
yading@10 53 GetByteContext g;
yading@10 54
yading@10 55 int width, height; ///< image width and height
yading@10 56 int image_offset_x, image_offset_y;
yading@10 57 int tile_offset_x, tile_offset_y;
yading@10 58 uint8_t cbps[4]; ///< bits per sample in particular components
yading@10 59 uint8_t sgnd[4]; ///< if a component is signed
yading@10 60 uint8_t properties[4];
yading@10 61 int cdx[4], cdy[4];
yading@10 62 int precision;
yading@10 63 int ncomponents;
yading@10 64 int tile_width, tile_height; ///< tile size
yading@10 65 int numXtiles, numYtiles;
yading@10 66 int maxtilelen;
yading@10 67
yading@10 68 J2kCodingStyle codsty[4];
yading@10 69 J2kQuantStyle qntsty[4];
yading@10 70
yading@10 71 int bit_index;
yading@10 72
yading@10 73 int curtileno;
yading@10 74
yading@10 75 J2kTile *tile;
yading@10 76 } J2kDecoderContext;
yading@10 77
yading@10 78 static int get_bits(J2kDecoderContext *s, int n)
yading@10 79 {
yading@10 80 int res = 0;
yading@10 81
yading@10 82 while (--n >= 0){
yading@10 83 res <<= 1;
yading@10 84 if (s->bit_index == 0) {
yading@10 85 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
yading@10 86 }
yading@10 87 s->bit_index--;
yading@10 88 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
yading@10 89 }
yading@10 90 return res;
yading@10 91 }
yading@10 92
yading@10 93 static void j2k_flush(J2kDecoderContext *s)
yading@10 94 {
yading@10 95 if (bytestream2_get_byte(&s->g) == 0xff)
yading@10 96 bytestream2_skip(&s->g, 1);
yading@10 97 s->bit_index = 8;
yading@10 98 }
yading@10 99 #if 0
yading@10 100 void printcomp(J2kComponent *comp)
yading@10 101 {
yading@10 102 int i;
yading@10 103 for (i = 0; i < comp->y1 - comp->y0; i++)
yading@10 104 ff_j2k_printv(comp->data + i * (comp->x1 - comp->x0), comp->x1 - comp->x0);
yading@10 105 }
yading@10 106
yading@10 107 static void nspaces(FILE *fd, int n)
yading@10 108 {
yading@10 109 while(n--) putc(' ', fd);
yading@10 110 }
yading@10 111
yading@10 112 static void dump(J2kDecoderContext *s, FILE *fd)
yading@10 113 {
yading@10 114 int tileno, compno, reslevelno, bandno, precno;
yading@10 115 fprintf(fd, "XSiz = %d, YSiz = %d, tile_width = %d, tile_height = %d\n"
yading@10 116 "numXtiles = %d, numYtiles = %d, ncomponents = %d\n"
yading@10 117 "tiles:\n",
yading@10 118 s->width, s->height, s->tile_width, s->tile_height,
yading@10 119 s->numXtiles, s->numYtiles, s->ncomponents);
yading@10 120 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
yading@10 121 J2kTile *tile = s->tile + tileno;
yading@10 122 nspaces(fd, 2);
yading@10 123 fprintf(fd, "tile %d:\n", tileno);
yading@10 124 for(compno = 0; compno < s->ncomponents; compno++){
yading@10 125 J2kComponent *comp = tile->comp + compno;
yading@10 126 nspaces(fd, 4);
yading@10 127 fprintf(fd, "component %d:\n", compno);
yading@10 128 nspaces(fd, 4);
yading@10 129 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d\n",
yading@10 130 comp->x0, comp->x1, comp->y0, comp->y1);
yading@10 131 for(reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){
yading@10 132 J2kResLevel *reslevel = comp->reslevel + reslevelno;
yading@10 133 nspaces(fd, 6);
yading@10 134 fprintf(fd, "reslevel %d:\n", reslevelno);
yading@10 135 nspaces(fd, 6);
yading@10 136 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d, nbands = %d\n",
yading@10 137 reslevel->x0, reslevel->x1, reslevel->y0,
yading@10 138 reslevel->y1, reslevel->nbands);
yading@10 139 for(bandno = 0; bandno < reslevel->nbands; bandno++){
yading@10 140 J2kBand *band = reslevel->band + bandno;
yading@10 141 nspaces(fd, 8);
yading@10 142 fprintf(fd, "band %d:\n", bandno);
yading@10 143 nspaces(fd, 8);
yading@10 144 fprintf(fd, "x0 = %d, x1 = %d, y0 = %d, y1 = %d,"
yading@10 145 "codeblock_width = %d, codeblock_height = %d cblknx = %d cblkny = %d\n",
yading@10 146 band->x0, band->x1,
yading@10 147 band->y0, band->y1,
yading@10 148 band->codeblock_width, band->codeblock_height,
yading@10 149 band->cblknx, band->cblkny);
yading@10 150 for (precno = 0; precno < reslevel->num_precincts_x * reslevel->num_precincts_y; precno++){
yading@10 151 J2kPrec *prec = band->prec + precno;
yading@10 152 nspaces(fd, 10);
yading@10 153 fprintf(fd, "prec %d:\n", precno);
yading@10 154 nspaces(fd, 10);
yading@10 155 fprintf(fd, "xi0 = %d, xi1 = %d, yi0 = %d, yi1 = %d\n",
yading@10 156 prec->xi0, prec->xi1, prec->yi0, prec->yi1);
yading@10 157 }
yading@10 158 }
yading@10 159 }
yading@10 160 }
yading@10 161 }
yading@10 162 }
yading@10 163 #endif
yading@10 164
yading@10 165 /** decode the value stored in node */
yading@10 166 static int tag_tree_decode(J2kDecoderContext *s, J2kTgtNode *node, int threshold)
yading@10 167 {
yading@10 168 J2kTgtNode *stack[30];
yading@10 169 int sp = -1, curval = 0;
yading@10 170
yading@10 171 if(!node)
yading@10 172 return AVERROR(EINVAL);
yading@10 173
yading@10 174 while(node && !node->vis){
yading@10 175 stack[++sp] = node;
yading@10 176 node = node->parent;
yading@10 177 }
yading@10 178
yading@10 179 if (node)
yading@10 180 curval = node->val;
yading@10 181 else
yading@10 182 curval = stack[sp]->val;
yading@10 183
yading@10 184 while(curval < threshold && sp >= 0){
yading@10 185 if (curval < stack[sp]->val)
yading@10 186 curval = stack[sp]->val;
yading@10 187 while (curval < threshold){
yading@10 188 int ret;
yading@10 189 if ((ret = get_bits(s, 1)) > 0){
yading@10 190 stack[sp]->vis++;
yading@10 191 break;
yading@10 192 } else if (!ret)
yading@10 193 curval++;
yading@10 194 else
yading@10 195 return ret;
yading@10 196 }
yading@10 197 stack[sp]->val = curval;
yading@10 198 sp--;
yading@10 199 }
yading@10 200 return curval;
yading@10 201 }
yading@10 202
yading@10 203 /* marker segments */
yading@10 204 /** get sizes and offsets of image, tiles; number of components */
yading@10 205 static int get_siz(J2kDecoderContext *s)
yading@10 206 {
yading@10 207 int i, ret;
yading@10 208
yading@10 209 if (bytestream2_get_bytes_left(&s->g) < 36)
yading@10 210 return AVERROR(EINVAL);
yading@10 211
yading@10 212 bytestream2_get_be16u(&s->g); // Rsiz (skipped)
yading@10 213 s->width = bytestream2_get_be32u(&s->g); // width
yading@10 214 s->height = bytestream2_get_be32u(&s->g); // height
yading@10 215 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
yading@10 216 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
yading@10 217
yading@10 218 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
yading@10 219 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
yading@10 220 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
yading@10 221 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
yading@10 222 s->ncomponents = bytestream2_get_be16u(&s->g); // CSiz
yading@10 223
yading@10 224 if(s->ncomponents <= 0 || s->ncomponents > 4) {
yading@10 225 av_log(s->avctx, AV_LOG_ERROR, "unsupported/invalid ncomponents: %d\n", s->ncomponents);
yading@10 226 return AVERROR(EINVAL);
yading@10 227 }
yading@10 228 if(s->tile_width<=0 || s->tile_height<=0)
yading@10 229 return AVERROR(EINVAL);
yading@10 230
yading@10 231 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents)
yading@10 232 return AVERROR(EINVAL);
yading@10 233
yading@10 234 for (i = 0; i < s->ncomponents; i++){ // Ssiz_i XRsiz_i, YRsiz_i
yading@10 235 uint8_t x = bytestream2_get_byteu(&s->g);
yading@10 236 s->cbps[i] = (x & 0x7f) + 1;
yading@10 237 s->precision = FFMAX(s->cbps[i], s->precision);
yading@10 238 s->sgnd[i] = !!(x & 0x80);
yading@10 239 s->cdx[i] = bytestream2_get_byteu(&s->g);
yading@10 240 s->cdy[i] = bytestream2_get_byteu(&s->g);
yading@10 241 }
yading@10 242
yading@10 243 s->numXtiles = ff_j2k_ceildiv(s->width - s->tile_offset_x, s->tile_width);
yading@10 244 s->numYtiles = ff_j2k_ceildiv(s->height - s->tile_offset_y, s->tile_height);
yading@10 245
yading@10 246 if(s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(J2kTile))
yading@10 247 return AVERROR(EINVAL);
yading@10 248
yading@10 249 s->tile = av_mallocz(s->numXtiles * s->numYtiles * sizeof(J2kTile));
yading@10 250 if (!s->tile)
yading@10 251 return AVERROR(ENOMEM);
yading@10 252
yading@10 253 for (i = 0; i < s->numXtiles * s->numYtiles; i++){
yading@10 254 J2kTile *tile = s->tile + i;
yading@10 255
yading@10 256 tile->comp = av_mallocz(s->ncomponents * sizeof(J2kComponent));
yading@10 257 if (!tile->comp)
yading@10 258 return AVERROR(ENOMEM);
yading@10 259 }
yading@10 260
yading@10 261 s->avctx->width = s->width - s->image_offset_x;
yading@10 262 s->avctx->height = s->height - s->image_offset_y;
yading@10 263
yading@10 264 switch(s->ncomponents){
yading@10 265 case 1:
yading@10 266 if (s->precision > 8) {
yading@10 267 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
yading@10 268 } else {
yading@10 269 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
yading@10 270 }
yading@10 271 break;
yading@10 272 case 3:
yading@10 273 if (s->precision > 8) {
yading@10 274 s->avctx->pix_fmt = AV_PIX_FMT_RGB48;
yading@10 275 } else {
yading@10 276 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
yading@10 277 }
yading@10 278 break;
yading@10 279 case 4:
yading@10 280 s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
yading@10 281 break;
yading@10 282 }
yading@10 283
yading@10 284
yading@10 285 if ((ret = ff_get_buffer(s->avctx, s->picture, 0)) < 0)
yading@10 286 return ret;
yading@10 287
yading@10 288 s->picture->pict_type = AV_PICTURE_TYPE_I;
yading@10 289 s->picture->key_frame = 1;
yading@10 290
yading@10 291 return 0;
yading@10 292 }
yading@10 293
yading@10 294 /** get common part for COD and COC segments */
yading@10 295 static int get_cox(J2kDecoderContext *s, J2kCodingStyle *c)
yading@10 296 {
yading@10 297 if (bytestream2_get_bytes_left(&s->g) < 5)
yading@10 298 return AVERROR(EINVAL);
yading@10 299 c->nreslevels = bytestream2_get_byteu(&s->g) + 1; // num of resolution levels - 1
yading@10 300 c->log2_cblk_width = bytestream2_get_byteu(&s->g) + 2; // cblk width
yading@10 301 c->log2_cblk_height = bytestream2_get_byteu(&s->g) + 2; // cblk height
yading@10 302
yading@10 303 c->cblk_style = bytestream2_get_byteu(&s->g);
yading@10 304 if (c->cblk_style != 0){ // cblk style
yading@10 305 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
yading@10 306 }
yading@10 307 c->transform = bytestream2_get_byteu(&s->g); // transformation
yading@10 308 if (c->csty & J2K_CSTY_PREC) {
yading@10 309 int i;
yading@10 310
yading@10 311 for (i = 0; i < c->nreslevels; i++)
yading@10 312 bytestream2_get_byte(&s->g);
yading@10 313 }
yading@10 314 return 0;
yading@10 315 }
yading@10 316
yading@10 317 /** get coding parameters for a particular tile or whole image*/
yading@10 318 static int get_cod(J2kDecoderContext *s, J2kCodingStyle *c, uint8_t *properties)
yading@10 319 {
yading@10 320 J2kCodingStyle tmp;
yading@10 321 int compno;
yading@10 322
yading@10 323 if (bytestream2_get_bytes_left(&s->g) < 5)
yading@10 324 return AVERROR(EINVAL);
yading@10 325
yading@10 326 tmp.log2_prec_width =
yading@10 327 tmp.log2_prec_height = 15;
yading@10 328
yading@10 329 tmp.csty = bytestream2_get_byteu(&s->g);
yading@10 330
yading@10 331 if (bytestream2_get_byteu(&s->g)){ // progression level
yading@10 332 av_log(s->avctx, AV_LOG_ERROR, "only LRCP progression supported\n");
yading@10 333 return -1;
yading@10 334 }
yading@10 335
yading@10 336 tmp.nlayers = bytestream2_get_be16u(&s->g);
yading@10 337 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
yading@10 338
yading@10 339 get_cox(s, &tmp);
yading@10 340 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 341 if (!(properties[compno] & HAD_COC))
yading@10 342 memcpy(c + compno, &tmp, sizeof(J2kCodingStyle));
yading@10 343 }
yading@10 344 return 0;
yading@10 345 }
yading@10 346
yading@10 347 /** get coding parameters for a component in the whole image on a particular tile */
yading@10 348 static int get_coc(J2kDecoderContext *s, J2kCodingStyle *c, uint8_t *properties)
yading@10 349 {
yading@10 350 int compno;
yading@10 351
yading@10 352 if (bytestream2_get_bytes_left(&s->g) < 2)
yading@10 353 return AVERROR(EINVAL);
yading@10 354
yading@10 355 compno = bytestream2_get_byteu(&s->g);
yading@10 356
yading@10 357 c += compno;
yading@10 358 c->csty = bytestream2_get_byte(&s->g);
yading@10 359 get_cox(s, c);
yading@10 360
yading@10 361 properties[compno] |= HAD_COC;
yading@10 362 return 0;
yading@10 363 }
yading@10 364
yading@10 365 /** get common part for QCD and QCC segments */
yading@10 366 static int get_qcx(J2kDecoderContext *s, int n, J2kQuantStyle *q)
yading@10 367 {
yading@10 368 int i, x;
yading@10 369
yading@10 370 if (bytestream2_get_bytes_left(&s->g) < 1)
yading@10 371 return AVERROR(EINVAL);
yading@10 372
yading@10 373 x = bytestream2_get_byteu(&s->g); // Sqcd
yading@10 374
yading@10 375 q->nguardbits = x >> 5;
yading@10 376 q->quantsty = x & 0x1f;
yading@10 377
yading@10 378 if (q->quantsty == J2K_QSTY_NONE){
yading@10 379 n -= 3;
yading@10 380 if (bytestream2_get_bytes_left(&s->g) < n || 32*3 < n)
yading@10 381 return AVERROR(EINVAL);
yading@10 382 for (i = 0; i < n; i++)
yading@10 383 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
yading@10 384 } else if (q->quantsty == J2K_QSTY_SI){
yading@10 385 if (bytestream2_get_bytes_left(&s->g) < 2)
yading@10 386 return AVERROR(EINVAL);
yading@10 387 x = bytestream2_get_be16u(&s->g);
yading@10 388 q->expn[0] = x >> 11;
yading@10 389 q->mant[0] = x & 0x7ff;
yading@10 390 for (i = 1; i < 32 * 3; i++){
yading@10 391 int curexpn = FFMAX(0, q->expn[0] - (i-1)/3);
yading@10 392 q->expn[i] = curexpn;
yading@10 393 q->mant[i] = q->mant[0];
yading@10 394 }
yading@10 395 } else{
yading@10 396 n = (n - 3) >> 1;
yading@10 397 if (bytestream2_get_bytes_left(&s->g) < 2 * n || 32*3 < n)
yading@10 398 return AVERROR(EINVAL);
yading@10 399 for (i = 0; i < n; i++){
yading@10 400 x = bytestream2_get_be16u(&s->g);
yading@10 401 q->expn[i] = x >> 11;
yading@10 402 q->mant[i] = x & 0x7ff;
yading@10 403 }
yading@10 404 }
yading@10 405 return 0;
yading@10 406 }
yading@10 407
yading@10 408 /** get quantization parameters for a particular tile or a whole image */
yading@10 409 static int get_qcd(J2kDecoderContext *s, int n, J2kQuantStyle *q, uint8_t *properties)
yading@10 410 {
yading@10 411 J2kQuantStyle tmp;
yading@10 412 int compno;
yading@10 413
yading@10 414 if (get_qcx(s, n, &tmp))
yading@10 415 return -1;
yading@10 416 for (compno = 0; compno < s->ncomponents; compno++)
yading@10 417 if (!(properties[compno] & HAD_QCC))
yading@10 418 memcpy(q + compno, &tmp, sizeof(J2kQuantStyle));
yading@10 419 return 0;
yading@10 420 }
yading@10 421
yading@10 422 /** get quantization parameters for a component in the whole image on in a particular tile */
yading@10 423 static int get_qcc(J2kDecoderContext *s, int n, J2kQuantStyle *q, uint8_t *properties)
yading@10 424 {
yading@10 425 int compno;
yading@10 426
yading@10 427 if (bytestream2_get_bytes_left(&s->g) < 1)
yading@10 428 return AVERROR(EINVAL);
yading@10 429
yading@10 430 compno = bytestream2_get_byteu(&s->g);
yading@10 431 properties[compno] |= HAD_QCC;
yading@10 432 return get_qcx(s, n-1, q+compno);
yading@10 433 }
yading@10 434
yading@10 435 /** get start of tile segment */
yading@10 436 static uint8_t get_sot(J2kDecoderContext *s)
yading@10 437 {
yading@10 438 if (bytestream2_get_bytes_left(&s->g) < 8)
yading@10 439 return AVERROR(EINVAL);
yading@10 440
yading@10 441 s->curtileno = bytestream2_get_be16u(&s->g); ///< Isot
yading@10 442 if((unsigned)s->curtileno >= s->numXtiles * s->numYtiles){
yading@10 443 s->curtileno=0;
yading@10 444 return AVERROR(EINVAL);
yading@10 445 }
yading@10 446
yading@10 447 bytestream2_skipu(&s->g, 4); ///< Psot (ignored)
yading@10 448
yading@10 449 if (!bytestream2_get_byteu(&s->g)){ ///< TPsot
yading@10 450 J2kTile *tile = s->tile + s->curtileno;
yading@10 451
yading@10 452 /* copy defaults */
yading@10 453 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(J2kCodingStyle));
yading@10 454 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(J2kQuantStyle));
yading@10 455 }
yading@10 456 bytestream2_get_byteu(&s->g); ///< TNsot
yading@10 457
yading@10 458 return 0;
yading@10 459 }
yading@10 460
yading@10 461 static int init_tile(J2kDecoderContext *s, int tileno)
yading@10 462 {
yading@10 463 int compno,
yading@10 464 tilex = tileno % s->numXtiles,
yading@10 465 tiley = tileno / s->numXtiles;
yading@10 466 J2kTile *tile = s->tile + tileno;
yading@10 467
yading@10 468 if (!tile->comp)
yading@10 469 return AVERROR(ENOMEM);
yading@10 470 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 471 J2kComponent *comp = tile->comp + compno;
yading@10 472 J2kCodingStyle *codsty = tile->codsty + compno;
yading@10 473 J2kQuantStyle *qntsty = tile->qntsty + compno;
yading@10 474 int ret; // global bandno
yading@10 475
yading@10 476 comp->coord[0][0] = FFMAX(tilex * s->tile_width + s->tile_offset_x, s->image_offset_x);
yading@10 477 comp->coord[0][1] = FFMIN((tilex+1)*s->tile_width + s->tile_offset_x, s->width);
yading@10 478 comp->coord[1][0] = FFMAX(tiley * s->tile_height + s->tile_offset_y, s->image_offset_y);
yading@10 479 comp->coord[1][1] = FFMIN((tiley+1)*s->tile_height + s->tile_offset_y, s->height);
yading@10 480
yading@10 481 if (ret = ff_j2k_init_component(comp, codsty, qntsty, s->cbps[compno], s->cdx[compno], s->cdy[compno]))
yading@10 482 return ret;
yading@10 483 }
yading@10 484 return 0;
yading@10 485 }
yading@10 486
yading@10 487 /** read the number of coding passes */
yading@10 488 static int getnpasses(J2kDecoderContext *s)
yading@10 489 {
yading@10 490 int num;
yading@10 491 if (!get_bits(s, 1))
yading@10 492 return 1;
yading@10 493 if (!get_bits(s, 1))
yading@10 494 return 2;
yading@10 495 if ((num = get_bits(s, 2)) != 3)
yading@10 496 return num < 0 ? num : 3 + num;
yading@10 497 if ((num = get_bits(s, 5)) != 31)
yading@10 498 return num < 0 ? num : 6 + num;
yading@10 499 num = get_bits(s, 7);
yading@10 500 return num < 0 ? num : 37 + num;
yading@10 501 }
yading@10 502
yading@10 503 static int getlblockinc(J2kDecoderContext *s)
yading@10 504 {
yading@10 505 int res = 0, ret;
yading@10 506 while (ret = get_bits(s, 1)){
yading@10 507 if (ret < 0)
yading@10 508 return ret;
yading@10 509 res++;
yading@10 510 }
yading@10 511 return res;
yading@10 512 }
yading@10 513
yading@10 514 static int decode_packet(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kResLevel *rlevel, int precno,
yading@10 515 int layno, uint8_t *expn, int numgbits)
yading@10 516 {
yading@10 517 int bandno, cblkny, cblknx, cblkno, ret;
yading@10 518
yading@10 519 if (!(ret = get_bits(s, 1))){
yading@10 520 j2k_flush(s);
yading@10 521 return 0;
yading@10 522 } else if (ret < 0)
yading@10 523 return ret;
yading@10 524
yading@10 525 for (bandno = 0; bandno < rlevel->nbands; bandno++){
yading@10 526 J2kBand *band = rlevel->band + bandno;
yading@10 527 J2kPrec *prec = band->prec + precno;
yading@10 528 int pos = 0;
yading@10 529
yading@10 530 if (band->coord[0][0] == band->coord[0][1]
yading@10 531 || band->coord[1][0] == band->coord[1][1])
yading@10 532 continue;
yading@10 533
yading@10 534 for (cblkny = prec->yi0; cblkny < prec->yi1; cblkny++)
yading@10 535 for(cblknx = prec->xi0, cblkno = cblkny * band->cblknx + cblknx; cblknx < prec->xi1; cblknx++, cblkno++, pos++){
yading@10 536 J2kCblk *cblk = band->cblk + cblkno;
yading@10 537 int incl, newpasses, llen;
yading@10 538
yading@10 539 if (cblk->npasses)
yading@10 540 incl = get_bits(s, 1);
yading@10 541 else
yading@10 542 incl = tag_tree_decode(s, prec->cblkincl + pos, layno+1) == layno;
yading@10 543 if (!incl)
yading@10 544 continue;
yading@10 545 else if (incl < 0)
yading@10 546 return incl;
yading@10 547
yading@10 548 if (!cblk->npasses)
yading@10 549 cblk->nonzerobits = expn[bandno] + numgbits - 1 - tag_tree_decode(s, prec->zerobits + pos, 100);
yading@10 550 if ((newpasses = getnpasses(s)) < 0)
yading@10 551 return newpasses;
yading@10 552 if ((llen = getlblockinc(s)) < 0)
yading@10 553 return llen;
yading@10 554 cblk->lblock += llen;
yading@10 555 if ((ret = get_bits(s, av_log2(newpasses) + cblk->lblock)) < 0)
yading@10 556 return ret;
yading@10 557 cblk->lengthinc = ret;
yading@10 558 cblk->npasses += newpasses;
yading@10 559 }
yading@10 560 }
yading@10 561 j2k_flush(s);
yading@10 562
yading@10 563 if (codsty->csty & J2K_CSTY_EPH) {
yading@10 564 if (bytestream2_peek_be16(&s->g) == J2K_EPH) {
yading@10 565 bytestream2_skip(&s->g, 2);
yading@10 566 } else {
yading@10 567 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found.\n");
yading@10 568 }
yading@10 569 }
yading@10 570
yading@10 571 for (bandno = 0; bandno < rlevel->nbands; bandno++){
yading@10 572 J2kBand *band = rlevel->band + bandno;
yading@10 573 int yi, cblknw = band->prec[precno].xi1 - band->prec[precno].xi0;
yading@10 574 for (yi = band->prec[precno].yi0; yi < band->prec[precno].yi1; yi++){
yading@10 575 int xi;
yading@10 576 for (xi = band->prec[precno].xi0; xi < band->prec[precno].xi1; xi++){
yading@10 577 J2kCblk *cblk = band->cblk + yi * cblknw + xi;
yading@10 578 if (bytestream2_get_bytes_left(&s->g) < cblk->lengthinc)
yading@10 579 return AVERROR(EINVAL);
yading@10 580 bytestream2_get_bufferu(&s->g, cblk->data, cblk->lengthinc);
yading@10 581 cblk->length += cblk->lengthinc;
yading@10 582 cblk->lengthinc = 0;
yading@10 583 }
yading@10 584 }
yading@10 585 }
yading@10 586 return 0;
yading@10 587 }
yading@10 588
yading@10 589 static int decode_packets(J2kDecoderContext *s, J2kTile *tile)
yading@10 590 {
yading@10 591 int layno, reslevelno, compno, precno, ok_reslevel;
yading@10 592 s->bit_index = 8;
yading@10 593 for (layno = 0; layno < tile->codsty[0].nlayers; layno++){
yading@10 594 ok_reslevel = 1;
yading@10 595 for (reslevelno = 0; ok_reslevel; reslevelno++){
yading@10 596 ok_reslevel = 0;
yading@10 597 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 598 J2kCodingStyle *codsty = tile->codsty + compno;
yading@10 599 J2kQuantStyle *qntsty = tile->qntsty + compno;
yading@10 600 if (reslevelno < codsty->nreslevels){
yading@10 601 J2kResLevel *rlevel = tile->comp[compno].reslevel + reslevelno;
yading@10 602 ok_reslevel = 1;
yading@10 603 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++){
yading@10 604 if (decode_packet(s, codsty, rlevel, precno, layno, qntsty->expn +
yading@10 605 (reslevelno ? 3*(reslevelno-1)+1 : 0), qntsty->nguardbits))
yading@10 606 return -1;
yading@10 607 }
yading@10 608 }
yading@10 609 }
yading@10 610 }
yading@10 611 }
yading@10 612 return 0;
yading@10 613 }
yading@10 614
yading@10 615 /* TIER-1 routines */
yading@10 616 static void decode_sigpass(J2kT1Context *t1, int width, int height, int bpno, int bandno, int bpass_csty_symbol,
yading@10 617 int vert_causal_ctx_csty_symbol)
yading@10 618 {
yading@10 619 int mask = 3 << (bpno - 1), y0, x, y;
yading@10 620
yading@10 621 for (y0 = 0; y0 < height; y0 += 4)
yading@10 622 for (x = 0; x < width; x++)
yading@10 623 for (y = y0; y < height && y < y0+4; y++){
yading@10 624 if ((t1->flags[y+1][x+1] & J2K_T1_SIG_NB)
yading@10 625 && !(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS))){
yading@10 626 int vert_causal_ctx_csty_loc_symbol = vert_causal_ctx_csty_symbol && (x == 3 && y == 3);
yading@10 627 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno,
yading@10 628 vert_causal_ctx_csty_loc_symbol))){
yading@10 629 int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
yading@10 630 if (bpass_csty_symbol)
yading@10 631 t1->data[y][x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
yading@10 632 else
yading@10 633 t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
yading@10 634 -mask : mask;
yading@10 635
yading@10 636 ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0);
yading@10 637 }
yading@10 638 t1->flags[y+1][x+1] |= J2K_T1_VIS;
yading@10 639 }
yading@10 640 }
yading@10 641 }
yading@10 642
yading@10 643 static void decode_refpass(J2kT1Context *t1, int width, int height, int bpno)
yading@10 644 {
yading@10 645 int phalf, nhalf;
yading@10 646 int y0, x, y;
yading@10 647
yading@10 648 phalf = 1 << (bpno - 1);
yading@10 649 nhalf = -phalf;
yading@10 650
yading@10 651 for (y0 = 0; y0 < height; y0 += 4)
yading@10 652 for (x = 0; x < width; x++)
yading@10 653 for (y = y0; y < height && y < y0+4; y++){
yading@10 654 if ((t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)) == J2K_T1_SIG){
yading@10 655 int ctxno = ff_j2k_getrefctxno(t1->flags[y+1][x+1]);
yading@10 656 int r = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? phalf : nhalf;
yading@10 657 t1->data[y][x] += t1->data[y][x] < 0 ? -r : r;
yading@10 658 t1->flags[y+1][x+1] |= J2K_T1_REF;
yading@10 659 }
yading@10 660 }
yading@10 661 }
yading@10 662
yading@10 663 static void decode_clnpass(J2kDecoderContext *s, J2kT1Context *t1, int width, int height,
yading@10 664 int bpno, int bandno, int seg_symbols)
yading@10 665 {
yading@10 666 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
yading@10 667
yading@10 668 for (y0 = 0; y0 < height; y0 += 4) {
yading@10 669 for (x = 0; x < width; x++){
yading@10 670 if (y0 + 3 < height && !(
yading@10 671 (t1->flags[y0+1][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
yading@10 672 (t1->flags[y0+2][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
yading@10 673 (t1->flags[y0+3][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)) ||
yading@10 674 (t1->flags[y0+4][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS | J2K_T1_SIG)))){
yading@10 675 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
yading@10 676 continue;
yading@10 677 runlen = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 678 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 679 dec = 1;
yading@10 680 } else{
yading@10 681 runlen = 0;
yading@10 682 dec = 0;
yading@10 683 }
yading@10 684
yading@10 685 for (y = y0 + runlen; y < y0 + 4 && y < height; y++){
yading@10 686 if (!dec){
yading@10 687 if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)))
yading@10 688 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_j2k_getnbctxno(t1->flags[y+1][x+1],
yading@10 689 bandno, 0));
yading@10 690 }
yading@10 691 if (dec){
yading@10 692 int xorbit, ctxno = ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
yading@10 693 t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ? -mask : mask;
yading@10 694 ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0);
yading@10 695 }
yading@10 696 dec = 0;
yading@10 697 t1->flags[y+1][x+1] &= ~J2K_T1_VIS;
yading@10 698 }
yading@10 699 }
yading@10 700 }
yading@10 701 if (seg_symbols) {
yading@10 702 int val;
yading@10 703 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 704 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 705 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 706 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
yading@10 707 if (val != 0xa) {
yading@10 708 av_log(s->avctx, AV_LOG_ERROR,"Segmentation symbol value incorrect\n");
yading@10 709 }
yading@10 710 }
yading@10 711 }
yading@10 712
yading@10 713 static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty, J2kT1Context *t1, J2kCblk *cblk,
yading@10 714 int width, int height, int bandpos)
yading@10 715 {
yading@10 716 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1, y, clnpass_cnt = 0;
yading@10 717 int bpass_csty_symbol = J2K_CBLK_BYPASS & codsty->cblk_style;
yading@10 718 int vert_causal_ctx_csty_symbol = J2K_CBLK_VSC & codsty->cblk_style;
yading@10 719
yading@10 720 for (y = 0; y < height+2; y++)
yading@10 721 memset(t1->flags[y], 0, (width+2)*sizeof(int));
yading@10 722
yading@10 723 for (y = 0; y < height; y++)
yading@10 724 memset(t1->data[y], 0, width*sizeof(int));
yading@10 725
yading@10 726 cblk->data[cblk->length] = 0xff;
yading@10 727 cblk->data[cblk->length+1] = 0xff;
yading@10 728 ff_mqc_initdec(&t1->mqc, cblk->data);
yading@10 729
yading@10 730 while(passno--){
yading@10 731 switch(pass_t){
yading@10 732 case 0: decode_sigpass(t1, width, height, bpno+1, bandpos,
yading@10 733 bpass_csty_symbol && (clnpass_cnt >= 4), vert_causal_ctx_csty_symbol);
yading@10 734 break;
yading@10 735 case 1: decode_refpass(t1, width, height, bpno+1);
yading@10 736 if (bpass_csty_symbol && clnpass_cnt >= 4)
yading@10 737 ff_mqc_initdec(&t1->mqc, cblk->data);
yading@10 738 break;
yading@10 739 case 2: decode_clnpass(s, t1, width, height, bpno+1, bandpos,
yading@10 740 codsty->cblk_style & J2K_CBLK_SEGSYM);
yading@10 741 clnpass_cnt = clnpass_cnt + 1;
yading@10 742 if (bpass_csty_symbol && clnpass_cnt >= 4)
yading@10 743 ff_mqc_initdec(&t1->mqc, cblk->data);
yading@10 744 break;
yading@10 745 }
yading@10 746
yading@10 747 pass_t++;
yading@10 748 if (pass_t == 3){
yading@10 749 bpno--;
yading@10 750 pass_t = 0;
yading@10 751 }
yading@10 752 }
yading@10 753 return 0;
yading@10 754 }
yading@10 755
yading@10 756 static void mct_decode(J2kDecoderContext *s, J2kTile *tile)
yading@10 757 {
yading@10 758 int i, *src[3], i0, i1, i2, csize = 1;
yading@10 759
yading@10 760 for (i = 0; i < 3; i++)
yading@10 761 src[i] = tile->comp[i].data;
yading@10 762
yading@10 763 for (i = 0; i < 2; i++)
yading@10 764 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
yading@10 765
yading@10 766 if (tile->codsty[0].transform == FF_DWT97){
yading@10 767 for (i = 0; i < csize; i++){
yading@10 768 i0 = *src[0] + (*src[2] * 46802 >> 16);
yading@10 769 i1 = *src[0] - (*src[1] * 22553 + *src[2] * 46802 >> 16);
yading@10 770 i2 = *src[0] + (116130 * *src[1] >> 16);
yading@10 771 *src[0]++ = i0;
yading@10 772 *src[1]++ = i1;
yading@10 773 *src[2]++ = i2;
yading@10 774 }
yading@10 775 } else{
yading@10 776 for (i = 0; i < csize; i++){
yading@10 777 i1 = *src[0] - (*src[2] + *src[1] >> 2);
yading@10 778 i0 = i1 + *src[2];
yading@10 779 i2 = i1 + *src[1];
yading@10 780 *src[0]++ = i0;
yading@10 781 *src[1]++ = i1;
yading@10 782 *src[2]++ = i2;
yading@10 783 }
yading@10 784 }
yading@10 785 }
yading@10 786
yading@10 787 static int decode_tile(J2kDecoderContext *s, J2kTile *tile)
yading@10 788 {
yading@10 789 int compno, reslevelno, bandno;
yading@10 790 int x, y, *src[4];
yading@10 791 uint8_t *line;
yading@10 792 J2kT1Context t1;
yading@10 793
yading@10 794 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 795 J2kComponent *comp = tile->comp + compno;
yading@10 796 J2kCodingStyle *codsty = tile->codsty + compno;
yading@10 797
yading@10 798 for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++){
yading@10 799 J2kResLevel *rlevel = comp->reslevel + reslevelno;
yading@10 800 for (bandno = 0; bandno < rlevel->nbands; bandno++){
yading@10 801 J2kBand *band = rlevel->band + bandno;
yading@10 802 int cblkx, cblky, cblkno=0, xx0, x0, xx1, y0, yy0, yy1, bandpos;
yading@10 803
yading@10 804 bandpos = bandno + (reslevelno > 0);
yading@10 805
yading@10 806 yy0 = bandno == 0 ? 0 : comp->reslevel[reslevelno-1].coord[1][1] - comp->reslevel[reslevelno-1].coord[1][0];
yading@10 807 y0 = yy0;
yading@10 808 yy1 = FFMIN(ff_j2k_ceildiv(band->coord[1][0] + 1, band->codeblock_height) * band->codeblock_height,
yading@10 809 band->coord[1][1]) - band->coord[1][0] + yy0;
yading@10 810
yading@10 811 if (band->coord[0][0] == band->coord[0][1] || band->coord[1][0] == band->coord[1][1])
yading@10 812 continue;
yading@10 813
yading@10 814 for (cblky = 0; cblky < band->cblkny; cblky++){
yading@10 815 if (reslevelno == 0 || bandno == 1)
yading@10 816 xx0 = 0;
yading@10 817 else
yading@10 818 xx0 = comp->reslevel[reslevelno-1].coord[0][1] - comp->reslevel[reslevelno-1].coord[0][0];
yading@10 819 x0 = xx0;
yading@10 820 xx1 = FFMIN(ff_j2k_ceildiv(band->coord[0][0] + 1, band->codeblock_width) * band->codeblock_width,
yading@10 821 band->coord[0][1]) - band->coord[0][0] + xx0;
yading@10 822
yading@10 823 for (cblkx = 0; cblkx < band->cblknx; cblkx++, cblkno++){
yading@10 824 int y, x;
yading@10 825 decode_cblk(s, codsty, &t1, band->cblk + cblkno, xx1 - xx0, yy1 - yy0, bandpos);
yading@10 826 if (codsty->transform == FF_DWT53){
yading@10 827 for (y = yy0; y < yy1; y+=s->cdy[compno]){
yading@10 828 int *ptr = t1.data[y-yy0];
yading@10 829 for (x = xx0; x < xx1; x+=s->cdx[compno]){
yading@10 830 comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] = *ptr++ >> 1;
yading@10 831 }
yading@10 832 }
yading@10 833 } else{
yading@10 834 for (y = yy0; y < yy1; y+=s->cdy[compno]){
yading@10 835 int *ptr = t1.data[y-yy0];
yading@10 836 for (x = xx0; x < xx1; x+=s->cdx[compno]){
yading@10 837 int tmp = ((int64_t)*ptr++) * ((int64_t)band->stepsize) >> 13, tmp2;
yading@10 838 tmp2 = FFABS(tmp>>1) + (tmp&1);
yading@10 839 comp->data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] = tmp < 0 ? -tmp2 : tmp2;
yading@10 840 }
yading@10 841 }
yading@10 842 }
yading@10 843 xx0 = xx1;
yading@10 844 xx1 = FFMIN(xx1 + band->codeblock_width, band->coord[0][1] - band->coord[0][0] + x0);
yading@10 845 }
yading@10 846 yy0 = yy1;
yading@10 847 yy1 = FFMIN(yy1 + band->codeblock_height, band->coord[1][1] - band->coord[1][0] + y0);
yading@10 848 }
yading@10 849 }
yading@10 850 }
yading@10 851 ff_j2k_dwt_decode(&comp->dwt, comp->data);
yading@10 852 src[compno] = comp->data;
yading@10 853 }
yading@10 854 if (tile->codsty[0].mct)
yading@10 855 mct_decode(s, tile);
yading@10 856
yading@10 857 if (s->precision <= 8) {
yading@10 858 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 859 y = tile->comp[compno].coord[1][0] - s->image_offset_y;
yading@10 860 line = s->picture->data[0] + y * s->picture->linesize[0];
yading@10 861 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y += s->cdy[compno]){
yading@10 862 uint8_t *dst;
yading@10 863
yading@10 864 x = tile->comp[compno].coord[0][0] - s->image_offset_x;
yading@10 865 dst = line + x * s->ncomponents + compno;
yading@10 866
yading@10 867 for (; x < tile->comp[compno].coord[0][1] - s->image_offset_x; x += s->cdx[compno]) {
yading@10 868 *src[compno] += 1 << (s->cbps[compno]-1);
yading@10 869 if (*src[compno] < 0)
yading@10 870 *src[compno] = 0;
yading@10 871 else if (*src[compno] >= (1 << s->cbps[compno]))
yading@10 872 *src[compno] = (1 << s->cbps[compno]) - 1;
yading@10 873 *dst = *src[compno]++;
yading@10 874 dst += s->ncomponents;
yading@10 875 }
yading@10 876 line += s->picture->linesize[0];
yading@10 877 }
yading@10 878 }
yading@10 879 } else {
yading@10 880 for (compno = 0; compno < s->ncomponents; compno++) {
yading@10 881 y = tile->comp[compno].coord[1][0] - s->image_offset_y;
yading@10 882 line = s->picture->data[0] + y * s->picture->linesize[0];
yading@10 883 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y += s->cdy[compno]) {
yading@10 884 uint16_t *dst;
yading@10 885
yading@10 886 x = tile->comp[compno].coord[0][0] - s->image_offset_x;
yading@10 887 dst = (uint16_t *)(line + (x * s->ncomponents + compno) * 2);
yading@10 888 for (; x < tile->comp[compno].coord[0][1] - s->image_offset_x; x += s-> cdx[compno]) {
yading@10 889 int32_t val;
yading@10 890
yading@10 891 val = *src[compno]++ << (16 - s->cbps[compno]);
yading@10 892 val += 1 << 15;
yading@10 893 val = av_clip(val, 0, (1 << 16) - 1);
yading@10 894 *dst = val;
yading@10 895 dst += s->ncomponents;
yading@10 896 }
yading@10 897 line += s->picture->linesize[0];
yading@10 898 }
yading@10 899 }
yading@10 900 }
yading@10 901 return 0;
yading@10 902 }
yading@10 903
yading@10 904 static void cleanup(J2kDecoderContext *s)
yading@10 905 {
yading@10 906 int tileno, compno;
yading@10 907 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++){
yading@10 908 for (compno = 0; compno < s->ncomponents; compno++){
yading@10 909 J2kComponent *comp = s->tile[tileno].comp + compno;
yading@10 910 J2kCodingStyle *codsty = s->tile[tileno].codsty + compno;
yading@10 911
yading@10 912 ff_j2k_cleanup(comp, codsty);
yading@10 913 }
yading@10 914 av_freep(&s->tile[tileno].comp);
yading@10 915 }
yading@10 916 av_freep(&s->tile);
yading@10 917 }
yading@10 918
yading@10 919 static int decode_codestream(J2kDecoderContext *s)
yading@10 920 {
yading@10 921 J2kCodingStyle *codsty = s->codsty;
yading@10 922 J2kQuantStyle *qntsty = s->qntsty;
yading@10 923 uint8_t *properties = s->properties;
yading@10 924
yading@10 925 for (;;){
yading@10 926 int oldpos, marker, len, ret = 0;
yading@10 927
yading@10 928 if (bytestream2_get_bytes_left(&s->g) < 2){
yading@10 929 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
yading@10 930 break;
yading@10 931 }
yading@10 932
yading@10 933 marker = bytestream2_get_be16u(&s->g);
yading@10 934 av_dlog(s->avctx, "marker 0x%.4X at pos 0x%x\n", marker, bytestream2_tell(&s->g) - 4);
yading@10 935 oldpos = bytestream2_tell(&s->g);
yading@10 936
yading@10 937 if (marker == J2K_SOD){
yading@10 938 J2kTile *tile = s->tile + s->curtileno;
yading@10 939 if (ret = init_tile(s, s->curtileno)) {
yading@10 940 av_log(s->avctx, AV_LOG_ERROR, "tile initialization failed\n");
yading@10 941 return ret;
yading@10 942 }
yading@10 943 if (ret = decode_packets(s, tile)) {
yading@10 944 av_log(s->avctx, AV_LOG_ERROR, "packets decoding failed\n");
yading@10 945 return ret;
yading@10 946 }
yading@10 947 continue;
yading@10 948 }
yading@10 949 if (marker == J2K_EOC)
yading@10 950 break;
yading@10 951
yading@10 952 if (bytestream2_get_bytes_left(&s->g) < 2)
yading@10 953 return AVERROR(EINVAL);
yading@10 954 len = bytestream2_get_be16u(&s->g);
yading@10 955 switch (marker){
yading@10 956 case J2K_SIZ:
yading@10 957 ret = get_siz(s);
yading@10 958 break;
yading@10 959 case J2K_COC:
yading@10 960 ret = get_coc(s, codsty, properties);
yading@10 961 break;
yading@10 962 case J2K_COD:
yading@10 963 ret = get_cod(s, codsty, properties);
yading@10 964 break;
yading@10 965 case J2K_QCC:
yading@10 966 ret = get_qcc(s, len, qntsty, properties);
yading@10 967 break;
yading@10 968 case J2K_QCD:
yading@10 969 ret = get_qcd(s, len, qntsty, properties);
yading@10 970 break;
yading@10 971 case J2K_SOT:
yading@10 972 if (!(ret = get_sot(s))){
yading@10 973 codsty = s->tile[s->curtileno].codsty;
yading@10 974 qntsty = s->tile[s->curtileno].qntsty;
yading@10 975 properties = s->tile[s->curtileno].properties;
yading@10 976 }
yading@10 977 break;
yading@10 978 case J2K_COM:
yading@10 979 // the comment is ignored
yading@10 980 bytestream2_skip(&s->g, len - 2);
yading@10 981 break;
yading@10 982 default:
yading@10 983 av_log(s->avctx, AV_LOG_ERROR, "unsupported marker 0x%.4X at pos 0x%x\n", marker, bytestream2_tell(&s->g) - 4);
yading@10 984 bytestream2_skip(&s->g, len - 2);
yading@10 985 break;
yading@10 986 }
yading@10 987 if (bytestream2_tell(&s->g) - oldpos != len || ret){
yading@10 988 av_log(s->avctx, AV_LOG_ERROR, "error during processing marker segment %.4x\n", marker);
yading@10 989 return ret ? ret : -1;
yading@10 990 }
yading@10 991 }
yading@10 992 return 0;
yading@10 993 }
yading@10 994
yading@10 995 static int jp2_find_codestream(J2kDecoderContext *s)
yading@10 996 {
yading@10 997 uint32_t atom_size, atom;
yading@10 998 int found_codestream = 0, search_range = 10;
yading@10 999
yading@10 1000 while(!found_codestream && search_range && bytestream2_get_bytes_left(&s->g) >= 8) {
yading@10 1001 atom_size = bytestream2_get_be32u(&s->g);
yading@10 1002 atom = bytestream2_get_be32u(&s->g);
yading@10 1003 if (atom == JP2_CODESTREAM) {
yading@10 1004 found_codestream = 1;
yading@10 1005 } else {
yading@10 1006 if (bytestream2_get_bytes_left(&s->g) < atom_size - 8)
yading@10 1007 return 0;
yading@10 1008 bytestream2_skipu(&s->g, atom_size - 8);
yading@10 1009 search_range--;
yading@10 1010 }
yading@10 1011 }
yading@10 1012
yading@10 1013 if (found_codestream)
yading@10 1014 return 1;
yading@10 1015 return 0;
yading@10 1016 }
yading@10 1017
yading@10 1018 static int decode_frame(AVCodecContext *avctx,
yading@10 1019 void *data, int *got_frame,
yading@10 1020 AVPacket *avpkt)
yading@10 1021 {
yading@10 1022 J2kDecoderContext *s = avctx->priv_data;
yading@10 1023 AVFrame *picture = data;
yading@10 1024 int tileno, ret;
yading@10 1025
yading@10 1026 s->picture = picture;
yading@10 1027
yading@10 1028 bytestream2_init(&s->g, avpkt->data, avpkt->size);
yading@10 1029 s->curtileno = -1;
yading@10 1030
yading@10 1031 if (bytestream2_get_bytes_left(&s->g) < 2) {
yading@10 1032 ret = AVERROR(EINVAL);
yading@10 1033 goto err_out;
yading@10 1034 }
yading@10 1035
yading@10 1036 // check if the image is in jp2 format
yading@10 1037 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
yading@10 1038 (bytestream2_get_be32u(&s->g) == 12) &&
yading@10 1039 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
yading@10 1040 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
yading@10 1041 if(!jp2_find_codestream(s)) {
yading@10 1042 av_log(avctx, AV_LOG_ERROR, "couldn't find jpeg2k codestream atom\n");
yading@10 1043 ret = -1;
yading@10 1044 goto err_out;
yading@10 1045 }
yading@10 1046 } else {
yading@10 1047 bytestream2_seek(&s->g, 0, SEEK_SET);
yading@10 1048 }
yading@10 1049
yading@10 1050 if (bytestream2_get_be16u(&s->g) != J2K_SOC){
yading@10 1051 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
yading@10 1052 ret = -1;
yading@10 1053 goto err_out;
yading@10 1054 }
yading@10 1055 if (ret = decode_codestream(s))
yading@10 1056 goto err_out;
yading@10 1057
yading@10 1058 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++)
yading@10 1059 if (ret = decode_tile(s, s->tile + tileno))
yading@10 1060 goto err_out;
yading@10 1061
yading@10 1062 cleanup(s);
yading@10 1063
yading@10 1064 *got_frame = 1;
yading@10 1065
yading@10 1066 return bytestream2_tell(&s->g);
yading@10 1067
yading@10 1068 err_out:
yading@10 1069 cleanup(s);
yading@10 1070 return ret;
yading@10 1071 }
yading@10 1072
yading@10 1073 static av_cold int j2kdec_init(AVCodecContext *avctx)
yading@10 1074 {
yading@10 1075 J2kDecoderContext *s = avctx->priv_data;
yading@10 1076
yading@10 1077 s->avctx = avctx;
yading@10 1078
yading@10 1079 ff_j2k_init_tier1_luts();
yading@10 1080
yading@10 1081 return 0;
yading@10 1082 }
yading@10 1083
yading@10 1084 AVCodec ff_jpeg2000_decoder = {
yading@10 1085 .name = "j2k",
yading@10 1086 .type = AVMEDIA_TYPE_VIDEO,
yading@10 1087 .id = AV_CODEC_ID_JPEG2000,
yading@10 1088 .priv_data_size = sizeof(J2kDecoderContext),
yading@10 1089 .init = j2kdec_init,
yading@10 1090 .decode = decode_frame,
yading@10 1091 .capabilities = CODEC_CAP_EXPERIMENTAL,
yading@10 1092 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
yading@10 1093 };