diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2017-06-12 17:15:23 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2017-06-12 18:38:11 +0200 |
| commit | 2609fb8077125b5b31f1bcc2f98c12ff1e6572d7 (patch) | |
| tree | 3e074f10f3f0aa887dbfb17e8eeec60169d53c71 | |
| parent | 73d1510d473b7dcfccfdee57e0e511e6791d5091 (diff) | |
Packet header writing: set empty packet header bit to 0 when appropriate (small optimization)fix_bypass_pterm_termall_and_lossless_decomposition_issue
| -rw-r--r-- | src/lib/openjp2/t2.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/lib/openjp2/t2.c b/src/lib/openjp2/t2.c index f7395dfc..9b28a3e0 100644 --- a/src/lib/openjp2/t2.c +++ b/src/lib/openjp2/t2.c @@ -611,6 +611,7 @@ static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno, opj_tcd_resolution_t *res = &tilec->resolutions[resno]; opj_bio_t *bio = 00; /* BIO component */ + OPJ_BOOL packet_empty = OPJ_TRUE; /* <SOP 0xff91> */ if (tcp->csty & J2K_CP_CSTY_SOP) { @@ -661,11 +662,42 @@ static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno, return OPJ_FALSE; } opj_bio_init_enc(bio, c, length); - opj_bio_write(bio, 1, 1); /* Empty header bit */ + + /* Check if the packet is empty */ + /* Note: we could also skip that step and always write a packet header */ + band = res->bands; + for (bandno = 0; bandno < res->numbands; ++bandno, ++band) { + opj_tcd_precinct_t *prc; + /* Skip empty bands */ + if (opj_tcd_is_band_empty(band)) { + continue; + } + + prc = &band->precincts[precno]; + l_nb_blocks = prc->cw * prc->ch; + cblk = prc->cblks.enc; + for (cblkno = 0; cblkno < l_nb_blocks; cblkno++, ++cblk) { + opj_tcd_layer_t *layer = &cblk->layers[layno]; + + /* if cblk not included, go to the next cblk */ + if (!layer->numpasses) { + continue; + } + packet_empty = OPJ_FALSE; + break; + } + if (!packet_empty) { + break; + } + } + + opj_bio_write(bio, packet_empty ? 0 : 1, 1); /* Empty header bit */ + /* Writing Packet header */ band = res->bands; - for (bandno = 0; bandno < res->numbands; ++bandno, ++band) { + for (bandno = 0; !packet_empty && + bandno < res->numbands; ++bandno, ++band) { opj_tcd_precinct_t *prc; /* Skip empty bands */ @@ -789,7 +821,7 @@ static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno, /* Writing the packet body */ band = res->bands; - for (bandno = 0; bandno < res->numbands; bandno++, ++band) { + for (bandno = 0; !packet_empty && bandno < res->numbands; bandno++, ++band) { opj_tcd_precinct_t *prc; /* Skip empty bands */ |
