Beispiel #1
0
static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_codestream_info_t *cstr_info, int tileno) {
	int bandno, cblkno;
	unsigned char *c = dest;

	int compno = pi->compno;	/* component value */
	int resno  = pi->resno;		/* resolution level value */
	int precno = pi->precno;	/* precinct value */
	int layno  = pi->layno;		/* quality layer value */

	opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
	opj_tcd_resolution_t *res = &tilec->resolutions[resno];
	
	opj_bio_t *bio = NULL;	/* BIO component */
	
	/* <SOP 0xff91> */
	if (tcp->csty & J2K_CP_CSTY_SOP) {
		c[0] = 255;
		c[1] = 145;
		c[2] = 0;
		c[3] = 4;
		c[4] = (unsigned char)((tile->packno % 65536) / 256);
		c[5] = (unsigned char)((tile->packno % 65536) % 256);
		c += 6;
	}
	/* </SOP> */
	
	if (!layno) {
		for (bandno = 0; bandno < res->numbands; bandno++) {
			opj_tcd_band_t *band = &res->bands[bandno];
			opj_tcd_precinct_t *prc = &band->precincts[precno];
			tgt_reset(prc->incltree);
			tgt_reset(prc->imsbtree);
			for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
				opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
				cblk->numpasses = 0;
				tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
			}
		}
	}
	
	bio = bio_create();
	bio_init_enc(bio, c, length);
	bio_write(bio, 1, 1);		/* Empty header bit */
	
	/* Writing Packet header */
	for (bandno = 0; bandno < res->numbands; bandno++) {
		opj_tcd_band_t *band = &res->bands[bandno];
		opj_tcd_precinct_t *prc = &band->precincts[precno];
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			if (!cblk->numpasses && layer->numpasses) {
				tgt_setvalue(prc->incltree, cblkno, layno);
			}
		}
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			int increment = 0;
			int nump = 0;
			int len = 0, passno;
			/* cblk inclusion bits */
			if (!cblk->numpasses) {
				tgt_encode(bio, prc->incltree, cblkno, layno + 1);
			} else {
				bio_write(bio, layer->numpasses != 0, 1);
			}
			/* if cblk not included, go to the next cblk  */
			if (!layer->numpasses) {
				continue;
			}
			/* if first instance of cblk --> zero bit-planes information */
			if (!cblk->numpasses) {
				cblk->numlenbits = 3;
				tgt_encode(bio, prc->imsbtree, cblkno, 999);
			}
			/* number of coding passes included */
			t2_putnumpasses(bio, layer->numpasses);
			
			/* computation of the increase of the length indicator and insertion in the header     */
			for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
				opj_tcd_pass_t *pass = &cblk->passes[passno];
				nump++;
				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)));
					len = 0;
					nump = 0;
				}
			}
			t2_putcommacode(bio, increment);

			/* computation of the new Length indicator */
			cblk->numlenbits += increment;

			/* insertion of the codeword segment length */
			for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
				opj_tcd_pass_t *pass = &cblk->passes[passno];
				nump++;
				len += pass->len;
				if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
					bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
					len = 0;
					nump = 0;
				}
			}
		}
	}

	if (bio_flush(bio)) {
		bio_destroy(bio);
		return -999;		/* modified to eliminate longjmp !! */
	}

	c += bio_numbytes(bio);
	bio_destroy(bio);
	
	/* <EPH 0xff92> */
	if (tcp->csty & J2K_CP_CSTY_EPH) {
		c[0] = 255;
		c[1] = 146;
		c += 2;
	}
	/* </EPH> */

	/* << INDEX */
	/* End of packet header position. Currently only represents the distance to start of packet
	// Will be updated later by incrementing with packet start value */
	if(cstr_info && cstr_info->index_write) {
		opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
		info_PK->end_ph_pos = (int)(c - dest);
	}
	/* INDEX >> */
	
	/* Writing the packet body */
	
	for (bandno = 0; bandno < res->numbands; bandno++) {
		opj_tcd_band_t *band = &res->bands[bandno];
		opj_tcd_precinct_t *prc = &band->precincts[precno];
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			if (!layer->numpasses) {
				continue;
			}
			if (c + layer->len > dest + length) {
				return -999;
			}
			
			memcpy(c, layer->data, layer->len);
			cblk->numpasses += layer->numpasses;
			c += layer->len;
			/* << INDEX */ 
			if(cstr_info && cstr_info->index_write) {
				opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
				info_PK->disto += layer->disto;
				if (cstr_info->D_max < info_PK->disto) {
					cstr_info->D_max = info_PK->disto;
				}
			}
			/* INDEX >> */
		}
	}
	
	return (c - dest);
}
Beispiel #2
0
static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_image_info_t * image_info, int tileno) {
	int bandno, cblkno;
	unsigned char *sop = 0, *eph = 0;
	unsigned char *c = dest;

	int compno = pi->compno;	/* component value */
	int resno  = pi->resno;		/* resolution level value */
	int precno = pi->precno;	/* precinct value */
	int layno  = pi->layno;		/* quality layer value */

	opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
	opj_tcd_resolution_t *res = &tilec->resolutions[resno];
	
	opj_bio_t *bio = NULL;	/* BIO component */
	
	/* <SOP 0xff91> */
	if (tcp->csty & J2K_CP_CSTY_SOP) {
		sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char));
		sop[0] = 255;
		sop[1] = 145;
		sop[2] = 0;
		sop[3] = 4;
		sop[4] = (image_info->num % 65536) / 256;
		sop[5] = (image_info->num % 65536) % 256;
		memcpy(c, sop, 6);
		opj_free(sop);
		c += 6;
	}
	/* </SOP> */
	
	if (!layno) {
		for (bandno = 0; bandno < res->numbands; bandno++) {
			opj_tcd_band_t *band = &res->bands[bandno];
			opj_tcd_precinct_t *prc = &band->precincts[precno];
			tgt_reset(prc->incltree);
			tgt_reset(prc->imsbtree);
			for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
				opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
				cblk->numpasses = 0;
				tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
			}
		}
	}
	
	bio = bio_create();
	bio_init_enc(bio, c, length);
	bio_write(bio, 1, 1);		/* Empty header bit */
	
	/* Writing Packet header */
	for (bandno = 0; bandno < res->numbands; bandno++) {
		opj_tcd_band_t *band = &res->bands[bandno];
		opj_tcd_precinct_t *prc = &band->precincts[precno];
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			if (!cblk->numpasses && layer->numpasses) {
				tgt_setvalue(prc->incltree, cblkno, layno);
			}
		}
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			int increment = 0;
			int nump = 0;
			int len = 0, passno;
			/* cblk inclusion bits */
			if (!cblk->numpasses) {
				tgt_encode(bio, prc->incltree, cblkno, layno + 1);
			} else {
				bio_write(bio, layer->numpasses != 0, 1);
			}
			/* if cblk not included, go to the next cblk  */
			if (!layer->numpasses) {
				continue;
			}
			/* if first instance of cblk --> zero bit-planes information */
			if (!cblk->numpasses) {
				cblk->numlenbits = 3;
				tgt_encode(bio, prc->imsbtree, cblkno, 999);
			}
			/* number of coding passes included */
			t2_putnumpasses(bio, layer->numpasses);
			
			/* computation of the increase of the length indicator and insertion in the header     */
			for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
				opj_tcd_pass_t *pass = &cblk->passes[passno];
				nump++;
				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)));
					len = 0;
					nump = 0;
				}
			}
			t2_putcommacode(bio, increment);

			/* computation of the new Length indicator */
			cblk->numlenbits += increment;

			/* insertion of the codeword segment length */
			for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {
				opj_tcd_pass_t *pass = &cblk->passes[passno];
				nump++;
				len += pass->len;
				if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
					bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
					len = 0;
					nump = 0;
				}
			}
		}
	}
	
	if (bio_flush(bio)) {
		return -999;		/* modified to eliminate longjmp !! */
	}
	
	c += bio_numbytes(bio);

	bio_destroy(bio);
	
	/* <EPH 0xff92> */
	if (tcp->csty & J2K_CP_CSTY_EPH) {
		eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char));
		eph[0] = 255;
		eph[1] = 146;
		memcpy(c, eph, 2);
		opj_free(eph);
		c += 2;
	}
	/* </EPH> */
	
	/* Writing the packet body */
	
	for (bandno = 0; bandno < res->numbands; bandno++) {
		opj_tcd_band_t *band = &res->bands[bandno];
		opj_tcd_precinct_t *prc = &band->precincts[precno];
		for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
			opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
			opj_tcd_layer_t *layer = &cblk->layers[layno];
			if (!layer->numpasses) {
				continue;
			}
			if (c + layer->len > dest + length) {
				return -999;
			}
			
			memcpy(c, layer->data, layer->len);
			cblk->numpasses += layer->numpasses;
			c += layer->len;
			/* ADD for index Cfr. Marcela --> delta disto by packet */
			if(image_info && image_info->index_write && image_info->index_on) {
				opj_tile_info_t *info_TL = &image_info->tile[tileno];
				opj_packet_info_t *info_PK = &info_TL->packet[image_info->num];
				info_PK->disto += layer->disto;
				if (image_info->D_max < info_PK->disto) {
					image_info->D_max = info_PK->disto;
				}
			}
			/* </ADD> */
		}
	}
	
	return (c - dest);
}
Beispiel #3
0
static bool 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,
               OPJ_UINT32 length,
               opj_codestream_info_t *cstr_info)
{
  OPJ_UINT32 bandno, cblkno;
  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 l_nb_blocks;
  opj_tcd_band_t *band = 00;
  opj_tcd_cblk_enc_t* cblk = 00;
  opj_tcd_pass_t *pass = 00;

  opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
  opj_tcd_resolution_t *res = &tilec->resolutions[resno];

  opj_bio_t *bio = 00;  /* BIO component */

  /* <SOP 0xff91> */
  if (tcp->csty & J2K_CP_CSTY_SOP) {
    c[0] = 255;
    c[1] = 145;
    c[2] = 0;
    c[3] = 4;
    c[4] = (tile->packno % 65536) / 256;
    c[5] = (tile->packno % 65536) % 256;
    c += 6;
    length -= 6;
  }
  /* </SOP> */

  if (!layno) {
    band = res->bands;
    for
      (bandno = 0; bandno < res->numbands; ++bandno)
    {
      opj_tcd_precinct_t *prc = &band->precincts[precno];
      tgt_reset(prc->incltree);
      tgt_reset(prc->imsbtree);
      l_nb_blocks = prc->cw * prc->ch;
      for
        (cblkno = 0; cblkno < l_nb_blocks; ++cblkno)
      {
        opj_tcd_cblk_enc_t* cblk_v = &prc->cblks.enc[cblkno];
        cblk_v->numpasses = 0;
        tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk_v->numbps);
      }
      ++band;
    }
  }

  bio = bio_create();
  bio_init_enc(bio, c, length);
  bio_write(bio, 1, 1);    /* Empty header bit */

  /* Writing Packet header */
  band = res->bands;
  for
    (bandno = 0; bandno < res->numbands; ++bandno)
  {
    opj_tcd_precinct_t *prc = &band->precincts[precno];
    l_nb_blocks = prc->cw * prc->ch;
    cblk = prc->cblks.enc;
    for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno)
    {
      opj_tcd_layer_t *layer = &cblk->layers[layno];
      if
        (!cblk->numpasses && layer->numpasses)
      {
        tgt_setvalue(prc->incltree, cblkno, layno);
      }
      ++cblk;
    }
    cblk = prc->cblks.enc;
    for
      (cblkno = 0; cblkno < l_nb_blocks; cblkno++)
    {
      opj_tcd_layer_t *layer = &cblk->layers[layno];
      OPJ_UINT32 increment = 0;
      OPJ_UINT32 nump = 0;
      OPJ_UINT32 len = 0, passno;
      OPJ_UINT32 l_nb_passes;
      /* cblk inclusion bits */
      if (!cblk->numpasses) {
        tgt_encode(bio, prc->incltree, cblkno, layno + 1);
      } else {
        bio_write(bio, layer->numpasses != 0, 1);
      }
      /* if cblk not included, go to the next cblk  */
      if
        (!layer->numpasses)
      {
        ++cblk;
        continue;
      }
      /* if first instance of cblk --> zero bit-planes information */
      if
        (!cblk->numpasses)
      {
        cblk->numlenbits = 3;
        tgt_encode(bio, prc->imsbtree, cblkno, 999);
      }
      /* number of coding passes included */
      t2_putnumpasses(bio, layer->numpasses);
      l_nb_passes = cblk->numpasses + layer->numpasses;
      pass = cblk->passes +  cblk->numpasses;
      /* computation of the increase of the length indicator and insertion in the header     */
      for
        (passno = cblk->numpasses; passno < l_nb_passes; ++passno)
      {
        ++nump;
        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)));
          len = 0;
          nump = 0;
        }
        ++pass;
      }
      t2_putcommacode(bio, increment);

      /* computation of the new Length indicator */
      cblk->numlenbits += increment;

      pass = cblk->passes +  cblk->numpasses;
      /* insertion of the codeword segment length */
      for
        (passno = cblk->numpasses; passno < l_nb_passes; ++passno)
      {
        nump++;
        len += pass->len;
        if
          (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1)
        {
          bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
          len = 0;
          nump = 0;
        }
        ++pass;
      }
      ++cblk;
    }
    ++band;
  }

  if
    (bio_flush(bio))
  {
    bio_destroy(bio);
    return false;    /* modified to eliminate longjmp !! */
  }
  l_nb_bytes = bio_numbytes(bio);
  c += l_nb_bytes;
  length -= l_nb_bytes;
  bio_destroy(bio);

  /* <EPH 0xff92> */
  if (tcp->csty & J2K_CP_CSTY_EPH) {
    c[0] = 255;
    c[1] = 146;
    c += 2;
    length -= 2;
  }
  /* </EPH> */

  /* << INDEX */
  // End of packet header position. Currently only represents the distance to start of packet
  // Will be updated later by incrementing with packet start value
  if(cstr_info && cstr_info->index_write) {
    opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
    info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
  }
  /* INDEX >> */

  /* Writing the packet body */
  band = res->bands;
  for
    (bandno = 0; bandno < res->numbands; bandno++)
  {
    opj_tcd_precinct_t *prc = &band->precincts[precno];
    l_nb_blocks = prc->cw * prc->ch;
    cblk = prc->cblks.enc;
    for
      (cblkno = 0; cblkno < l_nb_blocks; ++cblkno)
    {
      opj_tcd_layer_t *layer = &cblk->layers[layno];
      if
        (!layer->numpasses)
      {
        ++cblk;
        continue;
      }
      if
        (layer->len > length)
      {
        return false;
      }
      memcpy(c, layer->data, layer->len);
      cblk->numpasses += layer->numpasses;
      c += layer->len;
      length -= layer->len;
      /* << INDEX */
      if(cstr_info && cstr_info->index_write) {
        opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
        info_PK->disto += layer->disto;
        if (cstr_info->D_max < info_PK->disto) {
          cstr_info->D_max = info_PK->disto;
        }
      }
      ++cblk;
      /* INDEX >> */
    }
    ++band;
  }
  * p_data_written += (c - dest);
  return true;
}
Beispiel #4
0
int t2_encode_packet(tcd_tile_t *tile, j2k_tcp_t *tcp, int compno, int resno, int precno, int layno, unsigned char *dest, int len) {
    int bandno, cblkno;
    tcd_tilecomp_t *tilec=&tile->comps[compno];
    tcd_resolution_t *res=&tilec->resolutions[resno];
    unsigned char *c=dest;
    if (!layno) {
        for (bandno=0; bandno<res->numbands; bandno++) {
            tcd_band_t *band=&res->bands[bandno];
            tcd_precinct_t *prc=&band->precincts[precno];
            tgt_reset(prc->incltree);
            tgt_reset(prc->imsbtree);
            for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
                tcd_cblk_t *cblk=&prc->cblks[cblkno];
                cblk->numpasses=0;
                tgt_setvalue(prc->imsbtree, cblkno, band->numbps-cblk->numbps);
            }
        }
    }
    bio_init_enc(c, len);
    bio_write(1, 1);
    for (bandno=0; bandno<res->numbands; bandno++) {
        tcd_band_t *band=&res->bands[bandno];
        tcd_precinct_t *prc=&band->precincts[precno];
        for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
            tcd_cblk_t *cblk=&prc->cblks[cblkno];
            tcd_layer_t *layer=&cblk->layers[layno];
            if (!cblk->numpasses && layer->numpasses) {
                tgt_setvalue(prc->incltree, cblkno, layno);
            }
        }
        for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
            tcd_cblk_t *cblk=&prc->cblks[cblkno];
            tcd_layer_t *layer=&cblk->layers[layno];
            int increment;
            if (!cblk->numpasses) {
                tgt_encode(prc->incltree, cblkno, layno+1);
            } else {
                bio_write(layer->numpasses!=0, 1);
            }
            if (!layer->numpasses) {
                continue;
            }
            if (!cblk->numpasses) {
                cblk->numlenbits=3;
                tgt_encode(prc->imsbtree, cblkno, 999);
            }
            t2_putnumpasses(layer->numpasses);
            increment=int_max(0, int_floorlog2(layer->len)+1-(cblk->numlenbits+int_floorlog2(layer->numpasses)));
            t2_putcommacode(increment);
            cblk->numlenbits+=increment;
            bio_write(layer->len, cblk->numlenbits+int_floorlog2(layer->numpasses));
        }
    }
    bio_flush();
    c+=bio_numbytes();
    for (bandno=0; bandno<res->numbands; bandno++) {
        tcd_band_t *band=&res->bands[bandno];
        tcd_precinct_t *prc=&band->precincts[precno];
        for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
            tcd_cblk_t *cblk=&prc->cblks[cblkno];
            tcd_layer_t *layer=&cblk->layers[layno];
            if (!layer->numpasses) continue;
            if (c+layer->len>dest+len) {
                longjmp(j2k_error, 1);
            }
            memcpy(c, layer->data, layer->len);
            cblk->numpasses+=layer->numpasses;
            c+=layer->len;
        }
    }
    return c-dest;
}