Bugs corrected in decoding of command line (getopt.c), in the handling of 16 bit files (t1.c and tcd.c) and the calculation of elapsed time for multiple tiles parts (tcd.c and tdc.h).
This commit is contained in:
parent
adc1aacb60
commit
ea9335ff48
|
@ -5,6 +5,9 @@ What's New for OpenJPEG
|
||||||
! : changed
|
! : changed
|
||||||
+ : added
|
+ : added
|
||||||
|
|
||||||
|
May 4, 2007
|
||||||
|
* [FOD] Bugs corrected in decoding of command line (getopt.c), in the handling of 16 bit files (t1.c and tcd.c) and the calculation of elapsed time for multiple tiles parts (tcd.c and tdc.h).
|
||||||
|
|
||||||
June 2, 2007
|
June 2, 2007
|
||||||
+ [GB] OPJViewer opens now BMP, PNG, GIF, PNM, TIFF (with wxWidgets internals); added an encoder settings tab, for future integration with "save file as..." in JPEG 2000 format
|
+ [GB] OPJViewer opens now BMP, PNG, GIF, PNM, TIFF (with wxWidgets internals); added an encoder settings tab, for future integration with "save file as..." in JPEG 2000 format
|
||||||
|
|
||||||
|
|
|
@ -129,11 +129,27 @@ struct option *longopts, int totlen) {
|
||||||
static int lastidx,lastofs;
|
static int lastidx,lastofs;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
int i,len;
|
int i,len;
|
||||||
|
char param = 1;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
|
if (optind>argc || !argv[optind] || *argv[optind]!='-')
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (argv[optind][0]=='-' && argv[optind][1]==0) {
|
if (argv[optind][0]=='-' && argv[optind][1]==0) {
|
||||||
|
if(optind >= (argc - 1)){ /* no more input parameters */
|
||||||
|
param = 0;
|
||||||
|
}
|
||||||
|
else{ /* more input parameters */
|
||||||
|
if(argv[optind + 1][0] == '-'){
|
||||||
|
param = 0; /* Missing parameter after '-' */
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
param = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == 0) {
|
||||||
++optind;
|
++optind;
|
||||||
return (BADCH);
|
return (BADCH);
|
||||||
}
|
}
|
||||||
|
@ -144,11 +160,18 @@ again:
|
||||||
o=longopts;
|
o=longopts;
|
||||||
len=sizeof(longopts[0]);
|
len=sizeof(longopts[0]);
|
||||||
|
|
||||||
|
if (param > 1){
|
||||||
|
arg = argv[optind+1];
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
arg = argv[optind]+1;
|
||||||
|
|
||||||
if(strlen(arg)>1){
|
if(strlen(arg)>1){
|
||||||
for (i=0;i<totlen;i=i+len,o++) {
|
for (i=0;i<totlen;i=i+len,o++) {
|
||||||
if (!strcmp(o->name,arg)) { /* match */
|
if (!strcmp(o->name,arg)) { /* match */
|
||||||
if (o->has_arg == 0) {
|
if (o->has_arg == 0) {
|
||||||
if (!(argv[optind+1][0]=='-')){
|
if ((argv[optind+1])&&(!(argv[optind+1][0]=='-'))){
|
||||||
fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[optind+1]);
|
fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[optind+1]);
|
||||||
++optind;
|
++optind;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1278,7 +1278,7 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
|
||||||
/* initialize image components*/
|
/* initialize image components*/
|
||||||
memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
|
memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
|
||||||
for(j = 0; j < numcomps; j++) {
|
for(j = 0; j < numcomps; j++) {
|
||||||
if ((parameters->cp_cinema) & (Info.tiBps== 16)){
|
if (parameters->cp_cinema) {
|
||||||
cmptparm[j].prec = 12;
|
cmptparm[j].prec = 12;
|
||||||
cmptparm[j].bpp = 12;
|
cmptparm[j].bpp = 12;
|
||||||
}else{
|
}else{
|
||||||
|
@ -1335,7 +1335,7 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
|
||||||
image->comps[0].data[index] = (image->comps[0].data[index] + 0x08) >> 4 ;
|
image->comps[0].data[index] = (image->comps[0].data[index] + 0x08) >> 4 ;
|
||||||
image->comps[1].data[index] = (image->comps[1].data[index] + 0x08) >> 4 ;
|
image->comps[1].data[index] = (image->comps[1].data[index] + 0x08) >> 4 ;
|
||||||
image->comps[2].data[index] = (image->comps[2].data[index] + 0x08) >> 4 ;
|
image->comps[2].data[index] = (image->comps[2].data[index] + 0x08) >> 4 ;
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1344,6 +1344,11 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
|
||||||
image->comps[0].data[index] = dat8[i+0]; // R
|
image->comps[0].data[index] = dat8[i+0]; // R
|
||||||
image->comps[1].data[index] = dat8[i+1]; // G
|
image->comps[1].data[index] = dat8[i+1]; // G
|
||||||
image->comps[2].data[index] = dat8[i+2]; // B
|
image->comps[2].data[index] = dat8[i+2]; // B
|
||||||
|
if(parameters->cp_cinema){/* Rounding to 12 bits*/
|
||||||
|
image->comps[0].data[index] = image->comps[0].data[index] << 4 ;
|
||||||
|
image->comps[1].data[index] = image->comps[1].data[index] << 4 ;
|
||||||
|
image->comps[2].data[index] = image->comps[2].data[index] << 4 ;
|
||||||
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -483,7 +483,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
|
||||||
parameters->numresolution = 6;
|
parameters->numresolution = 6;
|
||||||
}
|
}
|
||||||
if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){
|
if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){
|
||||||
fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nDCI 2K compliance requires that atleast one of coordinates match 2048 x 1080\n",image->comps[0].w,image->comps[0].h);
|
fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 (2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n",image->comps[0].w,image->comps[0].h);
|
||||||
parameters->cp_rsiz = STD_RSIZ;
|
parameters->cp_rsiz = STD_RSIZ;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -495,7 +495,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
|
||||||
parameters->numresolution = 7;
|
parameters->numresolution = 7;
|
||||||
}
|
}
|
||||||
if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){
|
if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){
|
||||||
fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nDCI 4K compliance requires that atleast one of coordinates match 4096 x 2160\n",image->comps[0].w,image->comps[0].h);
|
fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\JPEG Digital Cinema Profile-4 (4K profile) compliance requires that atleast one of coordinates match 4096 x 2160\n",image->comps[0].w,image->comps[0].h);
|
||||||
parameters->cp_rsiz = STD_RSIZ;
|
parameters->cp_rsiz = STD_RSIZ;
|
||||||
}
|
}
|
||||||
parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution);
|
parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution);
|
||||||
|
|
|
@ -1086,7 +1086,7 @@ void t1_encode_cblks(
|
||||||
t1->data[(j * t1->w) + i] =
|
t1->data[(j * t1->w) + i] =
|
||||||
fix_mul(
|
fix_mul(
|
||||||
tilec->data[x + i + (y + j) * w],
|
tilec->data[x + i + (y + j) * w],
|
||||||
8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 - T1_NMSEDEC_FRACBITS);
|
8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1107,7 +1107,6 @@ bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_in
|
||||||
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info) {
|
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info) {
|
||||||
int compno;
|
int compno;
|
||||||
int l, i, npck = 0;
|
int l, i, npck = 0;
|
||||||
double encoding_time;
|
|
||||||
opj_tcd_tile_t *tile = NULL;
|
opj_tcd_tile_t *tile = NULL;
|
||||||
opj_tcp_t *tcd_tcp = NULL;
|
opj_tcp_t *tcd_tcp = NULL;
|
||||||
opj_cp_t *cp = NULL;
|
opj_cp_t *cp = NULL;
|
||||||
|
@ -1127,104 +1126,105 @@ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, op
|
||||||
tcd_tcp = tcd->tcp;
|
tcd_tcp = tcd->tcp;
|
||||||
cp = tcd->cp;
|
cp = tcd->cp;
|
||||||
|
|
||||||
encoding_time = opj_clock(); /* time needed to encode a tile */
|
|
||||||
if(tcd->cur_tp_num == 0){
|
if(tcd->cur_tp_num == 0){
|
||||||
/* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
|
tcd->encoding_time = opj_clock(); /* time needed to encode a tile */
|
||||||
if(image_info && image_info->index_on) {
|
/* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
|
||||||
opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
|
if(image_info && image_info->index_on) {
|
||||||
for (i = 0; i < tilec_idx->numresolutions; i++) {
|
opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
|
||||||
opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
|
for (i = 0; i < tilec_idx->numresolutions; i++) {
|
||||||
|
opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
|
||||||
|
|
||||||
image_info->tile[tileno].pw[i] = res_idx->pw;
|
image_info->tile[tileno].pw[i] = res_idx->pw;
|
||||||
image_info->tile[tileno].ph[i] = res_idx->ph;
|
image_info->tile[tileno].ph[i] = res_idx->ph;
|
||||||
|
|
||||||
npck += res_idx->pw * res_idx->ph;
|
npck += res_idx->pw * res_idx->ph;
|
||||||
|
|
||||||
image_info->tile[tileno].pdx[i] = tccp->prcw[i];
|
image_info->tile[tileno].pdx[i] = tccp->prcw[i];
|
||||||
image_info->tile[tileno].pdy[i] = tccp->prch[i];
|
image_info->tile[tileno].pdy[i] = tccp->prch[i];
|
||||||
}
|
|
||||||
image_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(image_info->comp * image_info->layer * npck * sizeof(opj_packet_info_t));
|
|
||||||
}
|
|
||||||
/* << INDEX */
|
|
||||||
|
|
||||||
/*---------------TILE-------------------*/
|
|
||||||
|
|
||||||
for (compno = 0; compno < tile->numcomps; compno++) {
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
|
|
||||||
int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
|
|
||||||
int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
|
|
||||||
|
|
||||||
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
|
||||||
int tw = tilec->x1 - tilec->x0;
|
|
||||||
int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
|
|
||||||
|
|
||||||
/* extract tile data */
|
|
||||||
|
|
||||||
if (tcd_tcp->tccps[compno].qmfbid == 1) {
|
|
||||||
for (y = tilec->y0; y < tilec->y1; y++) {
|
|
||||||
/* start of the src tile scanline */
|
|
||||||
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
|
|
||||||
/* start of the dst tile scanline */
|
|
||||||
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
|
|
||||||
for (x = tilec->x0; x < tilec->x1; x++) {
|
|
||||||
*tile_data++ = *data++ - adjust;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
|
image_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(image_info->comp * image_info->layer * npck * sizeof(opj_packet_info_t));
|
||||||
for (y = tilec->y0; y < tilec->y1; y++) {
|
}
|
||||||
/* start of the src tile scanline */
|
/* << INDEX */
|
||||||
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
|
|
||||||
/* start of the dst tile scanline */
|
/*---------------TILE-------------------*/
|
||||||
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
|
|
||||||
for (x = tilec->x0; x < tilec->x1; x++) {
|
for (compno = 0; compno < tile->numcomps; compno++) {
|
||||||
*tile_data++ = (*data++ - adjust) << 13;
|
int x, y;
|
||||||
|
|
||||||
|
int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
|
||||||
|
int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
|
||||||
|
int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
|
||||||
|
|
||||||
|
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
||||||
|
int tw = tilec->x1 - tilec->x0;
|
||||||
|
int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
|
||||||
|
|
||||||
|
/* extract tile data */
|
||||||
|
|
||||||
|
if (tcd_tcp->tccps[compno].qmfbid == 1) {
|
||||||
|
for (y = tilec->y0; y < tilec->y1; y++) {
|
||||||
|
/* start of the src tile scanline */
|
||||||
|
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
|
||||||
|
/* start of the dst tile scanline */
|
||||||
|
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
|
||||||
|
for (x = tilec->x0; x < tilec->x1; x++) {
|
||||||
|
*tile_data++ = *data++ - adjust;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
|
||||||
|
for (y = tilec->y0; y < tilec->y1; y++) {
|
||||||
|
/* start of the src tile scanline */
|
||||||
|
int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
|
||||||
|
/* start of the dst tile scanline */
|
||||||
|
int *tile_data = &tilec->data[(y - tilec->y0) * tw];
|
||||||
|
for (x = tilec->x0; x < tilec->x1; x++) {
|
||||||
|
*tile_data++ = (*data++ - adjust) << 11;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------MCT-------------------*/
|
/*----------------MCT-------------------*/
|
||||||
if (tcd_tcp->mct) {
|
if (tcd_tcp->mct) {
|
||||||
int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
|
int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
|
||||||
if (tcd_tcp->tccps[0].qmfbid == 0) {
|
if (tcd_tcp->tccps[0].qmfbid == 0) {
|
||||||
mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
|
mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
|
||||||
|
} else {
|
||||||
|
mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------DWT---------------------*/
|
||||||
|
|
||||||
|
for (compno = 0; compno < tile->numcomps; compno++) {
|
||||||
|
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
||||||
|
if (tcd_tcp->tccps[compno].qmfbid == 1) {
|
||||||
|
dwt_encode(tilec);
|
||||||
|
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
|
||||||
|
dwt_encode_real(tilec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------TIER1-----------------*/
|
||||||
|
t1 = t1_create(tcd->cinfo);
|
||||||
|
t1_encode_cblks(t1, tile, tcd_tcp);
|
||||||
|
t1_destroy(t1);
|
||||||
|
|
||||||
|
/*-----------RATE-ALLOCATE------------------*/
|
||||||
|
|
||||||
|
/* INDEX */
|
||||||
|
if(image_info) {
|
||||||
|
image_info->index_write = 0;
|
||||||
|
}
|
||||||
|
if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */
|
||||||
|
/* Normal Rate/distortion allocation */
|
||||||
|
tcd_rateallocate(tcd, dest, len, image_info);
|
||||||
} else {
|
} else {
|
||||||
mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
|
/* Fixed layer allocation */
|
||||||
|
tcd_rateallocate_fixed(tcd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------DWT---------------------*/
|
|
||||||
|
|
||||||
for (compno = 0; compno < tile->numcomps; compno++) {
|
|
||||||
opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
|
|
||||||
if (tcd_tcp->tccps[compno].qmfbid == 1) {
|
|
||||||
dwt_encode(tilec);
|
|
||||||
} else if (tcd_tcp->tccps[compno].qmfbid == 0) {
|
|
||||||
dwt_encode_real(tilec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------TIER1-----------------*/
|
|
||||||
t1 = t1_create(tcd->cinfo);
|
|
||||||
t1_encode_cblks(t1, tile, tcd_tcp);
|
|
||||||
t1_destroy(t1);
|
|
||||||
|
|
||||||
/*-----------RATE-ALLOCATE------------------*/
|
|
||||||
|
|
||||||
/* INDEX */
|
|
||||||
if(image_info) {
|
|
||||||
image_info->index_write = 0;
|
|
||||||
}
|
|
||||||
if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */
|
|
||||||
/* Normal Rate/distortion allocation */
|
|
||||||
tcd_rateallocate(tcd, dest, len, image_info);
|
|
||||||
} else {
|
|
||||||
/* Fixed layer allocation */
|
|
||||||
tcd_rateallocate_fixed(tcd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*--------------TIER2------------------*/
|
/*--------------TIER2------------------*/
|
||||||
|
|
||||||
/* INDEX */
|
/* INDEX */
|
||||||
|
@ -1240,8 +1240,8 @@ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, op
|
||||||
|
|
||||||
|
|
||||||
if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
|
if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){
|
||||||
encoding_time = opj_clock() - encoding_time;
|
tcd->encoding_time = opj_clock() - tcd->encoding_time;
|
||||||
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", encoding_time);
|
opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
|
||||||
|
|
||||||
/* cleaning memory */
|
/* cleaning memory */
|
||||||
for (compno = 0; compno < tile->numcomps; compno++) {
|
for (compno = 0; compno < tile->numcomps; compno++) {
|
||||||
|
|
|
@ -183,6 +183,8 @@ typedef struct opj_tcd {
|
||||||
opj_tcp_t *tcp;
|
opj_tcp_t *tcp;
|
||||||
/** current encoded/decoded tile */
|
/** current encoded/decoded tile */
|
||||||
int tcd_tileno;
|
int tcd_tileno;
|
||||||
|
/** Time taken to encode a tile*/
|
||||||
|
double encoding_time;
|
||||||
} opj_tcd_t;
|
} opj_tcd_t;
|
||||||
|
|
||||||
/** @name Exported functions */
|
/** @name Exported functions */
|
||||||
|
|
Loading…
Reference in New Issue