X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fopenjp2%2Ft2.c;h=480944dedacb82736fbec0bebbe6683fe9634d1d;hb=a8eb122c1f4331b5bfe9c3476390cad4d9616a52;hp=926007c658434b9b15791e47d8a473a24e94058e;hpb=df870e52413f10f042cca0d2c2507135477aa964;p=openjpeg.git diff --git a/src/lib/openjp2/t2.c b/src/lib/openjp2/t2.c index 926007c6..480944de 100644 --- a/src/lib/openjp2/t2.c +++ b/src/lib/openjp2/t2.c @@ -5,6 +5,8 @@ * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2008;2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,7 +39,7 @@ /** @name Local static functions */ /*@{*/ -static void t2_putcommacode(opj_bio_t *bio, int n); +static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n); static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio); /** @@ -60,9 +62,9 @@ Encode a packet of a tile to a destination buffer @param cstr_info Codestream information structure @return */ -static opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, - opj_tcd_tile_v2_t *tile, - opj_tcp_v2_t *tcp, +static OPJ_BOOL opj_t2_encode_packet( OPJ_UINT32 tileno, + opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, OPJ_BYTE *dest, OPJ_UINT32 * p_data_written, @@ -82,44 +84,44 @@ Decode a packet of a tile from a source buffer @return FIXME DOC */ -static opj_bool opj_t2_decode_packet( opj_t2_v2_t* t2, - opj_tcd_tile_v2_t *tile, - opj_tcp_v2_t *tcp, +static OPJ_BOOL opj_t2_decode_packet( opj_t2_t* t2, + opj_tcd_tile_t *tile, + opj_tcp_t *tcp, opj_pi_iterator_t *pi, OPJ_BYTE *src, OPJ_UINT32 * data_read, OPJ_UINT32 max_length, opj_packet_info_t *pack_info); -static opj_bool opj_t2_skip_packet( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, - opj_tcp_v2_t *p_tcp, +static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, + opj_tcp_t *p_tcp, opj_pi_iterator_t *p_pi, OPJ_BYTE *p_src, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, opj_packet_info_t *p_pack_info); -static opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, - opj_tcp_v2_t *p_tcp, +static OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, + opj_tcp_t *p_tcp, opj_pi_iterator_t *p_pi, - opj_bool * p_is_data_present, + OPJ_BOOL * p_is_data_present, OPJ_BYTE *p_src_data, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, opj_packet_info_t *p_pack_info); -static opj_bool opj_t2_read_packet_data(opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, +static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, opj_pi_iterator_t *p_pi, OPJ_BYTE *p_src_data, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, opj_packet_info_t *pack_info); -static opj_bool opj_t2_skip_packet_data(opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, +static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, opj_pi_iterator_t *p_pi, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, @@ -131,7 +133,7 @@ static opj_bool opj_t2_skip_packet_data(opj_t2_v2_t* p_t2, @param cblksty @param first */ -static opj_bool opj_t2_init_seg( opj_tcd_cblk_dec_v2_t* cblk, +static OPJ_BOOL opj_t2_init_seg( opj_tcd_cblk_dec_t* cblk, OPJ_UINT32 index, OPJ_UINT32 cblksty, OPJ_UINT32 first); @@ -143,8 +145,7 @@ static opj_bool opj_t2_init_seg( opj_tcd_cblk_dec_v2_t* cblk, /* ----------------------------------------------------------------------- */ /* #define RESTART 0x04 */ -/* TODO MSD->LHE */ -static void t2_putcommacode(opj_bio_t *bio, int n) { +static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) { while (--n >= 0) { opj_bio_write(bio, 1, 1); } @@ -189,9 +190,9 @@ OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) { /* ----------------------------------------------------------------------- */ -opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, +OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2, OPJ_UINT32 p_tile_no, - opj_tcd_tile_v2_t *p_tile, + opj_tcd_tile_t *p_tile, OPJ_UINT32 p_maxlayers, OPJ_BYTE *p_dest, OPJ_UINT32 * p_data_written, @@ -209,13 +210,13 @@ opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, opj_pi_iterator_t *l_pi = 00; opj_pi_iterator_t *l_current_pi = 00; opj_image_t *l_image = p_t2->image; - opj_cp_v2_t *l_cp = p_t2->cp; - opj_tcp_v2_t *l_tcp = &l_cp->tcps[p_tile_no]; - OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == CINEMA4K_24? 2: 1; + opj_cp_t *l_cp = p_t2->cp; + opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no]; + OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1; OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1; OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1; - l_pi = pi_initialise_encode_v2(l_image, l_cp, p_tile_no, p_t2_mode); + l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode); if (!l_pi) { return OPJ_FALSE; } @@ -233,14 +234,14 @@ opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, OPJ_UINT32 l_tp_num = compno; /* TODO MSD : check why this function cannot fail (cf. v1) */ - pi_create_encode_v2(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode); + opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode); - while (pi_next(l_current_pi)) { + while (opj_pi_next(l_current_pi)) { if (l_current_pi->layno < p_maxlayers) { l_nb_bytes = 0; if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) { - pi_destroy_v2(l_pi, l_nb_pocs); + opj_pi_destroy(l_pi, l_nb_pocs); return OPJ_FALSE; } @@ -254,7 +255,7 @@ opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, if (l_cp->m_specific_param.m_enc.m_max_comp_size) { if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) { - pi_destroy_v2(l_pi, l_nb_pocs); + opj_pi_destroy(l_pi, l_nb_pocs); return OPJ_FALSE; } } @@ -264,16 +265,16 @@ opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, } } else { /* t2_mode == FINAL_PASS */ - pi_create_encode_v2(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode); + opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode); l_current_pi = &l_pi[p_pino]; - while (pi_next(l_current_pi)) { + while (opj_pi_next(l_current_pi)) { if (l_current_pi->layno < p_maxlayers) { l_nb_bytes=0; if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) { - pi_destroy_v2(l_pi, l_nb_pocs); + opj_pi_destroy(l_pi, l_nb_pocs); return OPJ_FALSE; } @@ -305,14 +306,14 @@ opj_bool opj_t2_encode_packets( opj_t2_v2_t* p_t2, } } - pi_destroy_v2(l_pi, l_nb_pocs); + opj_pi_destroy(l_pi, l_nb_pocs); return OPJ_TRUE; } -opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, +OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2, OPJ_UINT32 p_tile_no, - opj_tcd_tile_v2_t *p_tile, + opj_tcd_tile_t *p_tile, OPJ_BYTE *p_src, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_len, @@ -322,17 +323,20 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, opj_pi_iterator_t *l_pi = 00; OPJ_UINT32 pino; opj_image_t *l_image = p_t2->image; - opj_cp_v2_t *l_cp = p_t2->cp; - opj_cp_v2_t *cp = p_t2->cp; - opj_tcp_v2_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]); + opj_cp_t *l_cp = p_t2->cp; + opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]); OPJ_UINT32 l_nb_bytes_read; OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1; opj_pi_iterator_t *l_current_pi = 00; +#ifdef TODO_MSD OPJ_UINT32 curtp = 0; OPJ_UINT32 tp_start_packno; +#endif opj_packet_info_t *l_pack_info = 00; opj_image_comp_t* l_img_comp = 00; + OPJ_ARG_NOT_USED(p_cstr_index); + #ifdef TODO_MSD if (p_cstr_index) { l_pack_info = p_cstr_index->tile_index[p_tile_no].packet; @@ -340,12 +344,12 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, #endif /* create a packet iterator */ - l_pi = pi_create_decode_v2(l_image, l_cp, p_tile_no); + l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no); if (!l_pi) { return OPJ_FALSE; } - tp_start_packno = 0; + l_current_pi = l_pi; for (pino = 0; pino <= l_tcp->numpocs; ++pino) { @@ -355,10 +359,15 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions * and no l_img_comp->resno_decoded are computed */ - opj_bool* first_pass_failed = (opj_bool*)opj_malloc(l_image->numcomps * sizeof(opj_bool)); - memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(opj_bool)); + OPJ_BOOL* first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL)); + if (!first_pass_failed) + { + opj_pi_destroy(l_pi,l_nb_pocs); + return OPJ_FALSE; + } + memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL)); - while (pi_next(l_current_pi)) { + while (opj_pi_next(l_current_pi)) { if (l_tcp->num_layers_to_decode > l_current_pi->layno @@ -368,17 +377,19 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, first_pass_failed[l_current_pi->compno] = OPJ_FALSE; if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) { - pi_destroy_v2(l_pi,l_nb_pocs); + opj_pi_destroy(l_pi,l_nb_pocs); + opj_free(first_pass_failed); return OPJ_FALSE; } l_img_comp = &(l_image->comps[l_current_pi->compno]); - l_img_comp->resno_decoded = uint_max(l_current_pi->resno, l_img_comp->resno_decoded); + l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded); } else { l_nb_bytes_read = 0; if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) { - pi_destroy_v2(l_pi,l_nb_pocs); + opj_pi_destroy(l_pi,l_nb_pocs); + opj_free(first_pass_failed); return OPJ_FALSE; } } @@ -397,6 +408,7 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, if(p_cstr_info) { opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no]; opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno]; + tp_start_packno = 0; if (!p_cstr_info->packno) { info_PK->start_pos = info_TL->end_header + 1; } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */ @@ -405,7 +417,7 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, curtp++; info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1; } else { - info_PK->start_pos = (cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1; + info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1; } info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1; info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance */ @@ -428,8 +440,9 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, /* << INDEX */ /* don't forget to release pi */ - pi_destroy_v2(l_pi,l_nb_pocs); - *p_data_read = l_current_data - p_src; + opj_pi_destroy(l_pi,l_nb_pocs); + assert( l_current_data - p_src < UINT32_MAX ); + *p_data_read = (OPJ_UINT32)(l_current_data - p_src); return OPJ_TRUE; } @@ -442,14 +455,14 @@ opj_bool opj_t2_decode_packets( opj_t2_v2_t *p_t2, * @param p_cp Image coding parameters. * @return a new T2 handle if successful, NULL otherwise. */ -opj_t2_v2_t* opj_t2_create(opj_image_t *p_image, opj_cp_v2_t *p_cp) +opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp) { /* create the t2 structure */ - opj_t2_v2_t *l_t2 = (opj_t2_v2_t*)opj_malloc(sizeof(opj_t2_v2_t)); + opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); if (!l_t2) { return NULL; } - memset(l_t2,0,sizeof(opj_t2_v2_t)); + memset(l_t2,0,sizeof(opj_t2_t)); l_t2->image = p_image; l_t2->cp = p_cp; @@ -457,22 +470,22 @@ opj_t2_v2_t* opj_t2_create(opj_image_t *p_image, opj_cp_v2_t *p_cp) return l_t2; } -void opj_t2_destroy(opj_t2_v2_t *t2) { +void opj_t2_destroy(opj_t2_t *t2) { if(t2) { opj_free(t2); } } -opj_bool opj_t2_decode_packet( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, - opj_tcp_v2_t *p_tcp, +OPJ_BOOL opj_t2_decode_packet( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, + opj_tcp_t *p_tcp, opj_pi_iterator_t *p_pi, OPJ_BYTE *p_src, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, opj_packet_info_t *p_pack_info) { - opj_bool l_read_data; + OPJ_BOOL l_read_data; OPJ_UINT32 l_nb_bytes_read = 0; OPJ_UINT32 l_nb_total_bytes_read = 0; @@ -502,9 +515,9 @@ opj_bool opj_t2_decode_packet( opj_t2_v2_t* p_t2, return OPJ_TRUE; } -opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, - opj_tcd_tile_v2_t * tile, - opj_tcp_v2_t * tcp, +OPJ_BOOL opj_t2_encode_packet( OPJ_UINT32 tileno, + opj_tcd_tile_t * tile, + opj_tcp_t * tcp, opj_pi_iterator_t *pi, OPJ_BYTE *dest, OPJ_UINT32 * p_data_written, @@ -512,19 +525,19 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, opj_codestream_info_t *cstr_info) { OPJ_UINT32 bandno, cblkno; - OPJ_BYTE *c = dest; + OPJ_BYTE* c = dest; OPJ_UINT32 l_nb_bytes; - OPJ_UINT32 compno = pi->compno; /* component value */ - OPJ_UINT32 resno = pi->resno; /* resolution level value */ - OPJ_UINT32 precno = pi->precno; /* precinct value */ - OPJ_UINT32 layno = pi->layno; /* quality layer value */ + OPJ_UINT32 compno = pi->compno; /* component value */ + OPJ_UINT32 resno = pi->resno; /* resolution level value */ + OPJ_UINT32 precno = pi->precno; /* precinct value */ + OPJ_UINT32 layno = pi->layno; /* quality layer value */ OPJ_UINT32 l_nb_blocks; - opj_tcd_band_v2_t *band = 00; - opj_tcd_cblk_enc_v2_t* cblk = 00; - opj_tcd_pass_v2_t *pass = 00; + opj_tcd_band_t *band = 00; + opj_tcd_cblk_enc_t* cblk = 00; + opj_tcd_pass_t *pass = 00; - opj_tcd_tilecomp_v2_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_v2_t *res = &tilec->resolutions[resno]; + opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; + opj_tcd_resolution_t *res = &tilec->resolutions[resno]; opj_bio_t *bio = 00; /* BIO component */ @@ -534,8 +547,13 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, c[1] = 145; c[2] = 0; c[3] = 4; +#if 0 c[4] = (tile->packno % 65536) / 256; c[5] = (tile->packno % 65536) % 256; +#else + c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */ + c[5] = tile->packno & 0xff; +#endif c += 6; length -= 6; } @@ -545,17 +563,17 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, band = res->bands; for(bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *prc = &band->precincts[precno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); + opj_tgt_reset(prc->incltree); + opj_tgt_reset(prc->imsbtree); l_nb_blocks = prc->cw * prc->ch; for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) { - opj_tcd_cblk_enc_v2_t* cblk = &prc->cblks.enc[cblkno]; + cblk = &prc->cblks.enc[cblkno]; cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); + opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); } ++band; } @@ -568,7 +586,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, /* Writing Packet header */ band = res->bands; for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *prc = &band->precincts[precno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; l_nb_blocks = prc->cw * prc->ch; cblk = prc->cblks.enc; @@ -577,7 +595,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, opj_tcd_layer_t *layer = &cblk->layers[layno]; if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); + opj_tgt_setvalue(prc->incltree, cblkno, layno); } ++cblk; @@ -593,7 +611,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, /* cblk inclusion bits */ if (!cblk->numpasses) { - tgt_encode(bio, prc->incltree, cblkno, layno + 1); + opj_tgt_encode(bio, prc->incltree, cblkno, layno + 1); } else { opj_bio_write(bio, layer->numpasses != 0, 1); } @@ -607,7 +625,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, /* if first instance of cblk --> zero bit-planes information */ if (!cblk->numpasses) { cblk->numlenbits = 3; - tgt_encode(bio, prc->imsbtree, cblkno, 999); + opj_tgt_encode(bio, prc->imsbtree, cblkno, 999); } /* number of coding passes included */ @@ -621,14 +639,14 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, len += pass->len; if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); + increment = opj_int_max(increment, opj_int_floorlog2(len) + 1 - (cblk->numlenbits + opj_int_floorlog2(nump))); len = 0; nump = 0; } ++pass; } - t2_putcommacode(bio, increment); + opj_t2_putcommacode(bio, increment); /* computation of the new Length indicator */ cblk->numlenbits += increment; @@ -640,7 +658,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, len += pass->len; if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - opj_bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); + opj_bio_write(bio, len, cblk->numlenbits + opj_int_floorlog2(nump)); len = 0; nump = 0; } @@ -658,7 +676,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, return OPJ_FALSE; /* modified to eliminate longjmp !! */ } - l_nb_bytes = opj_bio_numbytes(bio); + l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio); c += l_nb_bytes; length -= l_nb_bytes; @@ -685,7 +703,7 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, /* Writing the packet body */ band = res->bands; for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_precinct_v2_t *prc = &band->precincts[precno]; + opj_tcd_precinct_t *prc = &band->precincts[precno]; l_nb_blocks = prc->cw * prc->ch; cblk = prc->cblks.enc; @@ -722,21 +740,22 @@ opj_bool opj_t2_encode_packet( OPJ_UINT32 tileno, ++band; } - * p_data_written += (c - dest); + assert( c >= dest ); + * p_data_written += (OPJ_UINT32)(c - dest); return OPJ_TRUE; } -static opj_bool opj_t2_skip_packet( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, - opj_tcp_v2_t *p_tcp, +static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, + opj_tcp_t *p_tcp, opj_pi_iterator_t *p_pi, OPJ_BYTE *p_src, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, opj_packet_info_t *p_pack_info) { - opj_bool l_read_data; + OPJ_BOOL l_read_data; OPJ_UINT32 l_nb_bytes_read = 0; OPJ_UINT32 l_nb_total_bytes_read = 0; @@ -767,11 +786,11 @@ static opj_bool opj_t2_skip_packet( opj_t2_v2_t* p_t2, -opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, - opj_tcp_v2_t *p_tcp, +OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, + opj_tcp_t *p_tcp, opj_pi_iterator_t *p_pi, - opj_bool * p_is_data_present, + OPJ_BOOL * p_is_data_present, OPJ_BYTE *p_src_data, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, @@ -785,11 +804,11 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, OPJ_UINT32 l_header_length; OPJ_UINT32 * l_modified_length_ptr = 00; OPJ_BYTE *l_current_data = p_src_data; - opj_cp_v2_t *l_cp = p_t2->cp; + opj_cp_t *l_cp = p_t2->cp; opj_bio_t *l_bio = 00; /* BIO component */ - opj_tcd_band_v2_t *l_band = 00; - opj_tcd_cblk_dec_v2_t* l_cblk = 00; - opj_tcd_resolution_v2_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; + opj_tcd_band_t *l_band = 00; + opj_tcd_cblk_dec_t* l_cblk = 00; + opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; OPJ_BYTE *l_header_data = 00; OPJ_BYTE **l_header_data_start = 00; @@ -801,11 +820,11 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* reset tagtrees */ for (bandno = 0; bandno < l_res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *l_prc = &l_band->precincts[p_pi->precno]; + opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno]; if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) { - tgt_reset(l_prc->incltree); - tgt_reset(l_prc->imsbtree); + opj_tgt_reset(l_prc->incltree); + opj_tgt_reset(l_prc->imsbtree); l_cblk = l_prc->cblks.dec; l_nb_code_blocks = l_prc->cw * l_prc->ch; @@ -858,7 +877,7 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, else { /* Normal Case */ l_header_data_start = &(l_current_data); l_header_data = *l_header_data_start; - l_remaining_length = p_src_data+p_max_length-l_header_data; + l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data); l_modified_length_ptr = &(l_remaining_length); } @@ -873,14 +892,16 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* EPH markers */ if (p_tcp->csty & J2K_CP_CSTY_EPH) { - if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { + if (p_max_length < 2) { + fprintf(stderr, "Not enough space for expected EPH marker\n"); + } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { printf("Error : expected EPH marker\n"); } else { l_header_data += 2; } } - l_header_length = (l_header_data - *l_header_data_start); + l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start); *l_modified_length_ptr -= l_header_length; *l_header_data_start += l_header_length; @@ -893,13 +914,13 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* INDEX >> */ * p_is_data_present = OPJ_FALSE; - *p_data_read = l_current_data - p_src_data; + *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data); return OPJ_TRUE; } l_band = l_res->bands; for (bandno = 0; bandno < l_res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *l_prc = &(l_band->precincts[p_pi->precno]); + opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]); if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) { ++l_band; @@ -914,7 +935,7 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* if cblk not yet included before --> inclusion tagtree */ if (!l_cblk->numsegs) { - l_included = tgt_decode(l_bio, l_prc->incltree, cblkno, p_pi->layno + 1); + l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, p_pi->layno + 1); /* else one bit */ } else { @@ -932,7 +953,7 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, if (!l_cblk->numsegs) { OPJ_UINT32 i = 0; - while (!tgt_decode(l_bio, l_prc->imsbtree, cblkno, i)) { + while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, i)) { ++i; } @@ -967,8 +988,8 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, n = l_cblk->numnewpasses; do { - l_cblk->segs[l_segno].numnewpasses = int_min(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses, n); - l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + uint_floorlog2(l_cblk->segs[l_segno].numnewpasses)); + l_cblk->segs[l_segno].numnewpasses = opj_int_min(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses, n); + l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses)); n -= l_cblk->segs[l_segno].numnewpasses; if (n > 0) { @@ -997,14 +1018,16 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* EPH markers */ if (p_tcp->csty & J2K_CP_CSTY_EPH) { - if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { + if (p_max_length < 2) { + fprintf(stderr, "Not enough space for expected EPH marker\n"); + } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) { /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */ } else { l_header_data += 2; } } - l_header_length = (l_header_data - *l_header_data_start); + l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start); *l_modified_length_ptr -= l_header_length; *l_header_data_start += l_header_length; @@ -1017,13 +1040,13 @@ opj_bool opj_t2_read_packet_header( opj_t2_v2_t* p_t2, /* INDEX >> */ *p_is_data_present = OPJ_TRUE; - *p_data_read = l_current_data - p_src_data; + *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data); return OPJ_TRUE; } -opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, +OPJ_BOOL opj_t2_read_packet_data( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, opj_pi_iterator_t *p_pi, OPJ_BYTE *p_src_data, OPJ_UINT32 * p_data_read, @@ -1033,13 +1056,16 @@ opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, OPJ_UINT32 bandno, cblkno; OPJ_UINT32 l_nb_code_blocks; OPJ_BYTE *l_current_data = p_src_data; - opj_tcd_band_v2_t *l_band = 00; - opj_tcd_cblk_dec_v2_t* l_cblk = 00; - opj_tcd_resolution_v2_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; + opj_tcd_band_t *l_band = 00; + opj_tcd_cblk_dec_t* l_cblk = 00; + opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; + + OPJ_ARG_NOT_USED(p_t2); + OPJ_ARG_NOT_USED(pack_info); l_band = l_res->bands; for (bandno = 0; bandno < l_res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *l_prc = &l_band->precincts[p_pi->precno]; + opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno]; if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) { ++l_band; @@ -1061,7 +1087,7 @@ opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, if (!l_cblk->numsegs) { l_seg = l_cblk->segs; ++l_cblk->numsegs; - l_cblk->len = 0; + l_cblk->data_current_size = 0; } else { l_seg = &l_cblk->segs[l_cblk->numsegs - 1]; @@ -1096,16 +1122,24 @@ opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, }; #endif /* USE_JPWL */ - - if ((l_cblk->len + l_seg->newlen) > 8192) { + /* Check if the cblk->data have allocated enough memory */ + if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) { + OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen); + if(! new_cblk_data) { + opj_free(l_cblk->data); + l_cblk->data_max_size = 0; + /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */ return OPJ_FALSE; + } + l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen; + l_cblk->data = new_cblk_data; } - memcpy(l_cblk->data + l_cblk->len, l_current_data, l_seg->newlen); + memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen); if (l_seg->numpasses == 0) { l_seg->data = &l_cblk->data; - l_seg->dataindex = l_cblk->len; + l_seg->dataindex = l_cblk->data_current_size; } l_current_data += l_seg->newlen; @@ -1113,7 +1147,7 @@ opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, l_cblk->numnewpasses -= l_seg->numnewpasses; l_seg->real_num_passes = l_seg->numpasses; - l_cblk->len += l_seg->newlen; + l_cblk->data_current_size += l_seg->newlen; l_seg->len += l_seg->newlen; if (l_cblk->numnewpasses > 0) { @@ -1124,18 +1158,18 @@ opj_bool opj_t2_read_packet_data( opj_t2_v2_t* p_t2, l_cblk->real_num_segs = l_cblk->numsegs; ++l_cblk; - } + } /* next code_block */ ++l_band; } - *(p_data_read) = l_current_data - p_src_data; + *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data); return OPJ_TRUE; } -opj_bool opj_t2_skip_packet_data( opj_t2_v2_t* p_t2, - opj_tcd_tile_v2_t *p_tile, +OPJ_BOOL opj_t2_skip_packet_data( opj_t2_t* p_t2, + opj_tcd_tile_t *p_tile, opj_pi_iterator_t *p_pi, OPJ_UINT32 * p_data_read, OPJ_UINT32 p_max_length, @@ -1143,15 +1177,18 @@ opj_bool opj_t2_skip_packet_data( opj_t2_v2_t* p_t2, { OPJ_UINT32 bandno, cblkno; OPJ_UINT32 l_nb_code_blocks; - opj_tcd_band_v2_t *l_band = 00; - opj_tcd_cblk_dec_v2_t* l_cblk = 00; - opj_tcd_resolution_v2_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; + opj_tcd_band_t *l_band = 00; + opj_tcd_cblk_dec_t* l_cblk = 00; + opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno]; + + OPJ_ARG_NOT_USED(p_t2); + OPJ_ARG_NOT_USED(pack_info); *p_data_read = 0; l_band = l_res->bands; for (bandno = 0; bandno < l_res->numbands; ++bandno) { - opj_tcd_precinct_v2_t *l_prc = &l_band->precincts[p_pi->precno]; + opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno]; if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) { ++l_band; @@ -1173,7 +1210,7 @@ opj_bool opj_t2_skip_packet_data( opj_t2_v2_t* p_t2, if (!l_cblk->numsegs) { l_seg = l_cblk->segs; ++l_cblk->numsegs; - l_cblk->len = 0; + l_cblk->data_current_size = 0; } else { l_seg = &l_cblk->segs[l_cblk->numsegs - 1]; @@ -1229,7 +1266,7 @@ opj_bool opj_t2_skip_packet_data( opj_t2_v2_t* p_t2, } -opj_bool opj_t2_init_seg( opj_tcd_cblk_dec_v2_t* cblk, +OPJ_BOOL opj_t2_init_seg( opj_tcd_cblk_dec_t* cblk, OPJ_UINT32 index, OPJ_UINT32 cblksty, OPJ_UINT32 first) @@ -1239,14 +1276,14 @@ opj_bool opj_t2_init_seg( opj_tcd_cblk_dec_v2_t* cblk, if (l_nb_segs > cblk->m_current_max_segs) { opj_tcd_seg_t* new_segs; - cblk->m_current_max_segs += J2K_DEFAULT_NB_SEGS; + cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS; new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t)); if(! new_segs) { opj_free(cblk->segs); cblk->segs = NULL; cblk->m_current_max_segs = 0; - /* opj_event_msg_v2(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */ + /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */ return OPJ_FALSE; } cblk->segs = new_segs;