Bugs corrected in decoding of command line (getopt.c), in the handling of 16 bit...
authorFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Mon, 4 Jun 2007 13:23:26 +0000 (13:23 +0000)
committerFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Mon, 4 Jun 2007 13:23:26 +0000 (13:23 +0000)
ChangeLog
codec/compat/getopt.c
codec/convert.c
codec/image_to_j2k.c
libopenjpeg/t1.c
libopenjpeg/tcd.c
libopenjpeg/tcd.h

index 3c6914603b5a00807040fff03eee6eb915bb3351..0953061770cc924b4183d46591feb924ba7ffe62 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : 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
 + [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
 
index 3ecbde153807ad8718274a7203e9d3b4dbc672ce..1491bf039a768a55f8a2ad511f9e89a1bfd99e27 100644 (file)
@@ -129,11 +129,27 @@ struct option *longopts, int totlen) {
        static int lastidx,lastofs;
        char *tmp;
        int i,len;
+       char param = 1;
+
 again:
-       if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
+       if (optind>argc || !argv[optind] || *argv[optind]!='-')
                return -1;
 
        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;
                return (BADCH);
        }
@@ -144,11 +160,18 @@ again:
                o=longopts;
                len=sizeof(longopts[0]);
 
+               if (param > 1){
+                       arg = argv[optind+1];
+                       optind++;
+               }
+               else
+                       arg = argv[optind]+1;
+
                if(strlen(arg)>1){
                        for (i=0;i<totlen;i=i+len,o++) {
                                if (!strcmp(o->name,arg)) {     /* match */
                                        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]);
                                                        ++optind;
                                                }
index 936d5a48f7c172496060757845edc5932e954fc0..4aafaae870d882e4b4e60ba1484b268ecd73f92f 100644 (file)
@@ -1278,7 +1278,7 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
                /* initialize image components*/ 
                memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
                for(j = 0; j < numcomps; j++) {
-                       if ((parameters->cp_cinema) & (Info.tiBps== 16)){
+                       if (parameters->cp_cinema) {
                                cmptparm[j].prec = 12;
                                cmptparm[j].bpp = 12;
                        }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[1].data[index] = (image->comps[1].data[index] + 0x08) >> 4 ;
                                                image->comps[2].data[index] = (image->comps[2].data[index] + 0x08) >> 4 ;
-                    }
+                                       }
                                        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[1].data[index] = dat8[i+1];        // G 
                                        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 d54fe383d8f877b03a41308e88b3b8fc319a0ba1..242760288754d888fbc6362dc402084f1bf06150 100644 (file)
@@ -483,7 +483,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
                        parameters->numresolution = 6;
                }
                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;
                }
        break;
@@ -495,7 +495,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
                                parameters->numresolution = 7;
                        }
                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->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution);
index 8f8a7eebb774f9ce34b1a68f16e594821c4bbcf7..b5d9599425192810b7bd8ba89a1f503f969479c9 100644 (file)
@@ -1086,7 +1086,7 @@ void t1_encode_cblks(
                                                                        t1->data[(j * t1->w) + i] = 
                                                                                fix_mul(
                                                                                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);
                                                                }
                                                        }
                                                }
index 06f021b3bcf17f38bcadfc7a60a1cc83f8967882..525ec91d53efb4df44ba596e36d08d3be6cedd31 100644 (file)
@@ -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 compno;
        int l, i, npck = 0;
-       double encoding_time;
        opj_tcd_tile_t *tile = NULL;
        opj_tcp_t *tcd_tcp = NULL;
        opj_cp_t *cp = NULL;
@@ -1127,103 +1126,104 @@ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, op
        tcd_tcp = tcd->tcp;
        cp = tcd->cp;
 
-       encoding_time = opj_clock();    /* time needed to encode a tile */
        if(tcd->cur_tp_num == 0){
-       /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
-       if(image_info && image_info->index_on) {
-               opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0];        /* based on component 0 */
-               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].ph[i] = res_idx->ph;
-
-                       npck += res_idx->pw * res_idx->ph;
-
-                       image_info->tile[tileno].pdx[i] = tccp->prcw[i];
-                       image_info->tile[tileno].pdy[i] = tccp->prch[i];
+               tcd->encoding_time = opj_clock();       /* time needed to encode a tile */
+               /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
+               if(image_info && image_info->index_on) {
+                       opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0];        /* based on component 0 */
+                       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].ph[i] = res_idx->ph;
+                               
+                               npck += res_idx->pw * res_idx->ph;
+                               
+                               image_info->tile[tileno].pdx[i] = tccp->prcw[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));
                }
-               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);
+               /* << INDEX */
                
-               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;
+               /*---------------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) {
-                       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) << 13;
+                       } 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-------------------*/
-       if (tcd_tcp->mct) {
-               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) {
-                       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);
+               
+               /*----------------MCT-------------------*/
+               if (tcd_tcp->mct) {
+                       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) {
+                               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);
+               
+               /*----------------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);
                }
-       }
-
-       /*------------------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------------------*/
 
@@ -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){
-               encoding_time = opj_clock() - encoding_time;
-               opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", encoding_time);
+               tcd->encoding_time = opj_clock() - tcd->encoding_time;
+               opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time);
        
                /* cleaning memory */
                for (compno = 0; compno < tile->numcomps; compno++) {
index b81a94a6384b81e7cb517e47cedb01efeb7ada4e..ae667098c99a523905432b7a756abaccc8c96232 100644 (file)
@@ -183,6 +183,8 @@ typedef struct opj_tcd {
        opj_tcp_t *tcp;
        /** current encoded/decoded tile */
        int tcd_tileno;
+       /** Time taken to encode a tile*/
+       double encoding_time;
 } opj_tcd_t;
 
 /** @name Exported functions */