* Bug fixed in jpt decoding

* Bug fixed in pcrl progression order (profile-1 compliance)
* Change in tcd_dump
This commit is contained in:
Antonin Descampe 2004-07-20 05:40:55 +00:00
parent aa6c1d28ad
commit d38080aa00
3 changed files with 85 additions and 56 deletions

View File

@ -48,14 +48,13 @@ int main(int argc, char **argv)
j2k_cp_t cp;
int w, wr, wrr, h, hr, hrr, max;
int i, image_type = -1, compno, pad,j;
int i, image_type = -1, compno, pad, j;
int adjust;
jp2_struct_t * jp2_struct;
jp2_struct_t *jp2_struct;
if (argc < 3) {
fprintf(stderr,
"usage: %s j2k-file image-file [-reduce n]\n",
argv[0]);
"usage: %s j2k-file image-file [-reduce n]\n", argv[0]);
return 1;
}
@ -141,40 +140,48 @@ int main(int argc, char **argv)
S1 = *src_name;
/* J2K format */
if ((S1 == 'j' && S2 == '2' && S3 == 'k') || (S1 == 'J' && S2 == '2' && S3 == 'K')) {
if ((S1 == 'j' && S2 == '2' && S3 == 'k')
|| (S1 == 'J' && S2 == '2' && S3 == 'K') || (S1 == 'j' && S2 == '2'
&& S3 == 'c')
|| (S1 == 'J' && S2 == '2' && S3 == 'C')) {
if (!j2k_decode(src, len, &img, &cp)) {
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
return 1;
}
}
/* JP2 format */
else if ((S1 == 'j' && S2 == 'p' && S3 == '2') || (S1 == 'J' && S2 == 'P' && S3 == '2')) {
else if ((S1 == 'j' && S2 == 'p' && S3 == '2')
|| (S1 == 'J' && S2 == 'P' && S3 == '2')) {
jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t));
jp2_struct->image=&img;
jp2_struct->image = &img;
if (jp2_decode(src,len,jp2_struct,&cp)) {
if (jp2_decode(src, len, jp2_struct, &cp)) {
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
return 1;
}
/* Insert code here if you want to create actions on jp2_struct before deleting it */
free(jp2_struct);
}
/* JPT format */
else if ((S1 == 'j' && S2 == 'p' && S3 == 't') || (S1 == 'J' && S2 == 'P' && S3 == 'T')){
if (!j2k_decode_jpt_stream(src, len, &img, &cp)) {
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
return 1;
}
else {
fprintf(stderr,
"j2k_to_image : Unknown format image *.%c%c%c [only *.j2k, *.jp2 or *.jpt]!! \n",
S1, S2, S3);
else if ((S1 == 'j' && S2 == 'p' && S3 == 't')
|| (S1 == 'J' && S2 == 'P' && S3 == 'T')) {
if (!j2k_decode_jpt_stream(src, len, &img, &cp)) {
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
return 1;
}
}
/* otherwise : error */
else {
fprintf(stderr,
"j2k_to_image : Unknown format image *.%c%c%c [only *.j2k, *.jp2, *.jpc or *.jpt]!! \n",
S1, S2, S3);
return 1;
}
free(src);
/* ------------------ CREATE OUT IMAGE WITH THE RIGHT FORMAT ----------------------- */
@ -305,43 +312,44 @@ int main(int argc, char **argv)
j2k_comp_t *comp = &img.comps[compno];
char name[256];
int nbytes=0;
int nbytes = 0;
//if (img.numcomps > 1)
sprintf(name, "%s-%d.pgx", argv[2], compno);
sprintf(name, "%s-%d.pgx", argv[2], compno);
//else
//sprintf(name, "%s.pgx", argv[2]);
//sprintf(name, "%s.pgx", argv[2]);
f = fopen(name, "wb");
// w = ceildiv(img.x1 - img.x0, comp->dx);
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), comp->dx);
w = img.comps[compno].w;
wr = int_ceildivpow2(img.comps[compno].w,
img.comps[compno].factor);
wr = int_ceildivpow2(img.comps[compno].w, img.comps[compno].factor);
// h = ceildiv(img.y1 - img.y0, comp->dy);
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), comp->dy);
h = img.comps[compno].h;
hr = int_ceildivpow2(img.comps[compno].h,
img.comps[compno].factor);
hr = int_ceildivpow2(img.comps[compno].h, img.comps[compno].factor);
fprintf(f, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+',
comp->prec, wr, hr);
if (comp->prec <= 8) nbytes=1;
if (comp->prec <= 8)
nbytes = 1;
else if (comp->prec <= 16) nbytes=2;
else if (comp->prec <= 16)
nbytes = 2;
else nbytes=4;
else
nbytes = 4;
for (i = 0; i < wr * hr; i++) {
int v = img.comps[compno].data[i / wr * w + i % wr];
for (j=nbytes-1 ; j>=0 ; j--) {
for (j = nbytes - 1; j >= 0; j--) {
char byte=(char)(v>>(j*8));
char byte = (char) (v >> (j * 8));
fwrite(&byte, 1, 1, f);
fwrite(&byte, 1, 1, f);
}
}
@ -530,7 +538,7 @@ int main(int argc, char **argv)
// fprintf(f, "%c", img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]);
fprintf(f, "%c",
img.comps[0].data[w * hr - ((i) / (wr) + 1) * w +
(i) % (wr)]);
(i) % (wr)]);
/*if (((i + 1) % w == 0 && w % 2))
fprintf(f, "%c", 0); */
if ((i + 1) % wr == 0) {

View File

@ -269,6 +269,7 @@ int pi_next_rpcl(pi_iterator_t * pi)
pi->compno < pi->poc.compno1; pi->compno++) {
int levelno;
int trx0, try0;
int trx1, try1;// Add antonin pcrl
int rpx, rpy;
int prci, prcj;
comp = &pi->comps[pi->compno];
@ -279,6 +280,8 @@ int pi_next_rpcl(pi_iterator_t * pi)
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!
@ -296,6 +299,10 @@ int pi_next_rpcl(pi_iterator_t * pi)
if ((res->pw==0)||(res->pw==0)) continue;
//ddA
//Add Antonin : pcrl
if ((trx0==trx1)||(try0==try1)) continue;
//ddA
prci =
int_floordivpow2(int_ceildiv
(pi->x, comp->dx << levelno),
@ -358,62 +365,69 @@ int pi_next_pcrl(pi_iterator_t * pi)
}
}
for (pi->y = pi->ty0; pi->y < pi->ty1;
pi->y += pi->dy - (pi->y % pi->dy)) {
pi->y += pi->dy - (pi->y % pi->dy)) {
for (pi->x = pi->tx0; pi->x < pi->tx1;
pi->x += pi->dx - (pi->x % pi->dx)) {
pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->compno = pi->poc.compno0;
pi->compno < pi->poc.compno1; pi->compno++) {
pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
for (pi->resno = pi->poc.resno0;
pi->resno < int_min(pi->poc.resno1,
comp->numresolutions); pi->resno++) {
pi->resno < int_min(pi->poc.resno1,
comp->numresolutions); pi->resno++) {
int levelno;
int trx0, try0;
int trx1, try1;// Add antonin pcrl
int rpx, rpy;
int prci, prcj;
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!
(pi->x % (comp->dx << rpx) == 0
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
(pi->x % (comp->dx << rpx) == 0
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue;
}
if (!
(pi->y % (comp->dy << rpy) == 0
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
(pi->y % (comp->dy << rpy) == 0
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue;
}
//Add Antonin : sizebug1
if ((res->pw==0)||(res->pw==0)) continue;
//ddA
//Add Antonin : pcrl
if ((trx0==trx1)||(try0==try1)) continue;
//ddA
prci =
int_floordivpow2(int_ceildiv
(pi->x, comp->dx << levelno),
res->pdx) - int_floordivpow2(trx0, res->pdx);
(pi->x, comp->dx << levelno),
res->pdx) - int_floordivpow2(trx0, res->pdx);
prcj =
int_floordivpow2(int_ceildiv
(pi->y, comp->dy << levelno),
res->pdy) - int_floordivpow2(try0, res->pdy);
(pi->y, comp->dy << levelno),
res->pdy) - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
if (!pi->
include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p]) {
include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p]) {
pi->include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
return 1;
}
skip:;
skip:;
}
}
}
@ -460,12 +474,15 @@ int pi_next_cprl(pi_iterator_t * pi)
comp->numresolutions); pi->resno++) {
int levelno;
int trx0, try0;
int trx1, try1;// Add antonin pcrl
int rpx, rpy;
int prci, prcj;
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!
@ -483,6 +500,10 @@ int pi_next_cprl(pi_iterator_t * pi)
if ((res->pw==0)||(res->pw==0)) continue;
//ddA
//Add Antonin : pcrl
if ((trx0==trx1)||(try0==try1)) continue;
//ddA
prci =
int_floordivpow2(int_ceildiv
(pi->x, comp->dx << levelno),

View File

@ -64,8 +64,8 @@ void tcd_dump(tcd_image_t * img, int curtileno)
fprintf(stderr, "image {\n");
fprintf(stderr, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", img->tw, img->th,
tcd_img->x0, tcd_img->x1, tcd_img->y0, tcd_img->y1);
for (tileno = 0; tileno < 1; tileno++) {
tcd_tile_t *tile = &tcd_image.tiles[curtileno];
for (tileno = 0; tileno < img->th*img->tw; tileno++) {
tcd_tile_t *tile = &tcd_image.tiles[tileno];
fprintf(stderr, " tile {\n");
fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
for (compno = 0; compno < tile->numcomps; compno++) {