diff options
| author | Giuseppe Baruffa <gbaruffa@users.noreply.github.com> | 2007-11-05 13:05:07 +0000 |
|---|---|---|
| committer | Giuseppe Baruffa <gbaruffa@users.noreply.github.com> | 2007-11-05 13:05:07 +0000 |
| commit | 95d760a1735517347355ff875549d85ebbc72eb7 (patch) | |
| tree | e1e1dfeca50f06b1161db44bd66ebd8780337f2e /libopenjpeg | |
| parent | 123a680669995d50f354dd0159c83e7803a70ef3 (diff) | |
Fixed a bug which prevented JPWL from working on multi-tiled images; added some more fields in the interface info structures (keep a list of markers, save start packet number for each tile)
Diffstat (limited to 'libopenjpeg')
| -rw-r--r-- | libopenjpeg/j2k.c | 44 | ||||
| -rw-r--r-- | libopenjpeg/openjpeg.c | 1 | ||||
| -rw-r--r-- | libopenjpeg/openjpeg.h | 4 |
3 files changed, 44 insertions, 5 deletions
diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index 114ee9ec..dfa8286c 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -434,6 +434,15 @@ int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t * static void j2k_write_soc(opj_j2k_t *j2k) { opj_cio_t *cio = j2k->cio; cio_write(cio, J2K_MS_SOC, 2); + +/* UniPG>> */ +#ifdef USE_JPWL + + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); + +#endif /* USE_JPWL */ +/* <<UniPG */ } static void j2k_read_soc(opj_j2k_t *j2k) { @@ -1199,7 +1208,7 @@ static void j2k_read_ppm(opj_j2k_t *j2k) { "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", cio_tell(cio)); if (!JPWL_ASSUME || JPWL_ASSUME) { - free(cp->ppm_data); + opj_free(cp->ppm_data); opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); return; } @@ -1279,6 +1288,13 @@ static void j2k_write_sot(opj_j2k_t *j2k) { cio_seek(cio, lenp); cio_write(cio, len, 2); /* Lsot */ cio_seek(cio, lenp + len); + + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); +#endif /* USE_JPWL */ + /* <<UniPG */ } static void j2k_read_sot(opj_j2k_t *j2k) { @@ -1436,6 +1452,12 @@ static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) { if(cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < cio_tell(cio)) cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(cio); } + /* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); +#endif /* USE_JPWL */ + /* <<UniPG */ } /* << INDEX */ @@ -1557,6 +1579,13 @@ static void j2k_write_eoc(opj_j2k_t *j2k) { opj_cio_t *cio = j2k->cio; /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ cio_write(cio, J2K_MS_EOC, 2); + +/* UniPG>> */ +#ifdef USE_JPWL + /* update markers struct */ + j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); +#endif /* USE_JPWL */ +/* <<UniPG */ } static void j2k_read_eoc(opj_j2k_t *j2k) { @@ -2276,10 +2305,6 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre opj_tcd_t *tcd = NULL; /* TCD component */ - /* UniPG>> */ - int acc_pack_num = 0; - /* <<UniPG */ - j2k->cio = cio; j2k->image = image; @@ -2309,6 +2334,9 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre } cstr_info->D_max = 0.0; /* ADD Marcela */ cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ + cstr_info->maxmarknum = 100; + cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * sizeof(opj_marker_info_t)); + cstr_info->marknum = 0; } /* << INDEX */ @@ -2359,6 +2387,10 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { int pino; int tilepartno=0; + /* UniPG>> */ + int acc_pack_num = 0; + /* <<UniPG */ + opj_tcp_t *tcp = &cp->tcps[tileno]; opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th); @@ -2418,6 +2450,8 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre if(cstr_info) { cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = cio_tell(cio) + j2k->pos_correction - 1; + cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = + acc_pack_num; cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = cstr_info->packno - acc_pack_num; acc_pack_num = cstr_info->packno; diff --git a/libopenjpeg/openjpeg.c b/libopenjpeg/openjpeg.c index 356d2ca9..96fa0ad5 100644 --- a/libopenjpeg/openjpeg.c +++ b/libopenjpeg/openjpeg.c @@ -324,5 +324,6 @@ void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) { opj_free(tile_info->tp); } opj_free(cstr_info->tile); + opj_free(cstr_info->marker); } } diff --git a/libopenjpeg/openjpeg.h b/libopenjpeg/openjpeg.h index b58d39f9..015c2554 100644 --- a/libopenjpeg/openjpeg.h +++ b/libopenjpeg/openjpeg.h @@ -606,6 +606,8 @@ typedef struct opj_tp_info { int tp_end_header; /** end position of tile part */ int tp_end_pos; + /** start packet of tile part */ + int tp_start_pack; /** number of packets of tile part */ int tp_numpacks; } opj_tp_info_t; @@ -697,6 +699,8 @@ typedef struct opj_codestream_info { int marknum; /** list of markers */ opj_marker_info_t *marker; + /** actual size of markers array */ + int maxmarknum; /* <<UniPG */ /** main header position */ int main_head_start; |
