Skip to content

Commit

Permalink
Packet header writing: set empty packet header bit to 0 when appropri…
Browse files Browse the repository at this point in the history
…ate (small optimization)
  • Loading branch information
rouault committed Jun 12, 2017
1 parent 73d1510 commit 2609fb8
Showing 1 changed file with 35 additions and 3 deletions.
38 changes: 35 additions & 3 deletions src/lib/openjp2/t2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 2609fb8

Please sign in to comment.