WIP: begin to test opj_read_tile_header with V2 style
[openjpeg.git] / applications / codec / image_to_j2k.c
index 66d2bf4a1d0bef35ac19d94a09d68d905cb4b4d4..4ab7445b3089e460d3352b8e7d387901ec7bf308 100644 (file)
@@ -51,7 +51,7 @@
 
 #include "opj_config.h"
 #include "openjpeg.h"
-#include "getopt.h"
+#include "opj_getopt.h"
 #include "convert.h"
 #include "index.h"
 
@@ -82,7 +82,7 @@ typedef struct img_folder{
        float *rates;
 }img_fol_t;
 
-void encode_help_display() {
+void encode_help_display(void) {
        fprintf(stdout,"HELP for image_to_j2k\n----\n\n");
        fprintf(stdout,"- the -h option displays this help information on screen\n\n");
 
@@ -209,6 +209,9 @@ void encode_help_display() {
        fprintf(stdout,"               -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
        fprintf(stdout,"               Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
        fprintf(stdout,"\n");
+       fprintf(stdout,"-jpip        : write jpip codestream index box in JP2 output file\n");
+       fprintf(stdout,"               NOTICE: currently supports only RPCL order\n");
+       fprintf(stdout,"\n");
 /* UniPG>> */
 #ifdef USE_JPWL
        fprintf(stdout,"-W           : adoption of JPWL (Part 11) capabilities (-W params)\n");
@@ -454,7 +457,7 @@ static int initialise_4K_poc(opj_poc_t *POC, int numres){
 }
 
 void cinema_parameters(opj_cparameters_t *parameters){
-       parameters->tile_size_on = false;
+       parameters->tile_size_on = OPJ_FALSE;
        parameters->cp_tdx=1;
        parameters->cp_tdy=1;
 
@@ -573,8 +576,8 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_
 
 int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                                                                        img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) {
-       int i, j,totlen;
-       option_t long_option[]={
+       int i, j, totlen, c;
+       opj_option_t long_option[]={
                {"cinema2K",REQ_ARG, NULL ,'w'},
                {"cinema4K",NO_ARG, NULL ,'y'},
                {"ImgDir",REQ_ARG, NULL ,'z'},
@@ -584,6 +587,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                {"OutFor",REQ_ARG, NULL ,'O'},
                {"POC",REQ_ARG, NULL ,'P'},
                {"ROI",REQ_ARG, NULL ,'R'},
+               {"jpip",NO_ARG, NULL, 'J'}
        };
 
        /* parse the command line */
@@ -597,14 +601,14 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
        img_fol->set_out_format=0;
        raw_cp->rawWidth = 0;
 
-       while (1) {
-    int c = getopt_long(argc, argv, optlist,long_option,totlen);
+       do{
+               c = opj_getopt_long(argc, argv, optlist,long_option,totlen);
                if (c == -1)
                        break;
                switch (c) {
                        case 'i':                       /* input file */
                        {
-                               char *infile = optarg;
+                               char *infile = opj_optarg;
                                parameters->decod_format = get_file_format(infile);
                                switch(parameters->decod_format) {
                                        case PGX_DFMT:
@@ -630,7 +634,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'o':                       /* output file */
                        {
-                               char *outfile = optarg;
+                               char *outfile = opj_optarg;
                                parameters->cod_format = get_file_format(outfile);
                                switch(parameters->cod_format) {
                                        case J2K_CFMT:
@@ -648,14 +652,14 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'O':                       /* output format */
                                {
                                        char outformat[50];
-                                       char *of = optarg;
+                                       char *of = opj_optarg;
                                        sprintf(outformat,".%s",of);
                                        img_fol->set_out_format = 1;
                                        parameters->cod_format = get_file_format(outformat);
                                        switch(parameters->cod_format) {
                                                case J2K_CFMT:
                                                case JP2_CFMT:
-                                                       img_fol->out_format = optarg;
+                                                       img_fol->out_format = opj_optarg;
                                                        break;
                                                default:
                                                        fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n");
@@ -670,7 +674,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'r':                       /* rates rates/distorsion */
                        {
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                parameters->tcp_numlayers = 0;
                                while (sscanf(s, "%f", &parameters->tcp_rates[parameters->tcp_numlayers]) == 1) {
                                        parameters->tcp_numlayers++;
@@ -691,14 +695,14 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'F':                       /* Raw image format parameters */
                        {
                                char signo;
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) {
                                        if (signo == 's') {
-                                               raw_cp->rawSigned = true;
+                                               raw_cp->rawSigned = OPJ_TRUE;
                                                fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth);
                                        }
                                        else if (signo == 'u') {
-                                               raw_cp->rawSigned = false;
+                                               raw_cp->rawSigned = OPJ_FALSE;
                                                fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Unsigned\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth);
                                        }
                                        else {
@@ -724,7 +728,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'q':                       /* add fixed_quality */
                        {
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                while (sscanf(s, "%f", &parameters->tcp_distoratio[parameters->tcp_numlayers]) == 1) {
                                        parameters->tcp_numlayers++;
                                        while (*s && *s != ',') {
@@ -746,7 +750,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                int *row = NULL, *col = NULL;
                                int numlayers = 0, numresolution = 0, matrix_width = 0;
 
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                sscanf(s, "%d", &numlayers);
                                s++;
                                if (numlayers > 9)
@@ -790,8 +794,8 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 't':                       /* tiles */
                        {
-                               sscanf(optarg, "%d,%d", &parameters->cp_tdx, &parameters->cp_tdy);
-                               parameters->tile_size_on = true;
+                               sscanf(opj_optarg, "%d,%d", &parameters->cp_tdx, &parameters->cp_tdy);
+                               parameters->tile_size_on = OPJ_TRUE;
                        }
                        break;
 
@@ -799,7 +803,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'n':                       /* resolution */
                        {
-                               sscanf(optarg, "%d", &parameters->numresolution);
+                               sscanf(opj_optarg, "%d", &parameters->numresolution);
                        }
                        break;
 
@@ -809,7 +813,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                char sep;
                                int res_spec = 0;
 
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                do {
                                        sep = 0;
                                        sscanf(s, "[%d,%d]%c", &parameters->prcw_init[res_spec],
@@ -828,7 +832,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'b':                       /* code-block dimension */
                        {
                                int cblockw_init = 0, cblockh_init = 0;
-                               sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init);
+                               sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init);
                                if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024
                                        || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {
                                        fprintf(stderr,
@@ -845,7 +849,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'x':                       /* creation of index file */
                        {
-                               char *index = optarg;
+                               char *index = opj_optarg;
                                strncpy(indexfilename, index, OPJ_PATH_LEN);
                        }
                        break;
@@ -856,7 +860,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        {
                                char progression[4];
 
-                               strncpy(progression, optarg, 4);
+                               strncpy(progression, opj_optarg, 4);
                                parameters->prog_order = give_progression(progression);
                                if (parameters->prog_order == -1) {
                                        fprintf(stderr, "Unrecognized progression order "
@@ -870,7 +874,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 's':                       /* subsampling factor */
                        {
-                               if (sscanf(optarg, "%d,%d", &parameters->subsampling_dx,
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->subsampling_dx,
                                     &parameters->subsampling_dy) != 2) {
                                        fprintf(stderr, "'-s' sub-sampling argument error !  [-s dx,dy]\n");
                                        return 1;
@@ -882,7 +886,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'd':                       /* coordonnate of the reference grid */
                        {
-                               if (sscanf(optarg, "%d,%d", &parameters->image_offset_x0,
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->image_offset_x0,
                                     &parameters->image_offset_y0) != 2) {
                                        fprintf(stderr, "-d 'coordonnate of the reference grid' argument "
             "error !! [-d x0,y0]\n");
@@ -904,7 +908,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                int numpocs = 0;                /* number of progression order change (POC) default 0 */
                                opj_poc_t *POC = NULL;  /* POC : used in case of Progression order change */
 
-                               char *s = optarg;
+                               char *s = opj_optarg;
                                POC = parameters->POC;
 
                                while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile,
@@ -946,7 +950,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'M':                       /* Mode switch pas tous au point !! */
                        {
                                int value = 0;
-                               if (sscanf(optarg, "%d", &value) == 1) {
+                               if (sscanf(opj_optarg, "%d", &value) == 1) {
                                        for (i = 0; i <= 5; i++) {
                                                int cache = value & (1 << i);
                                                if (cache)
@@ -960,7 +964,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'R':                       /* ROI */
                        {
-                               if (sscanf(optarg, "c=%d,U=%d", &parameters->roi_compno,
+                               if (sscanf(opj_optarg, "c=%d,U=%d", &parameters->roi_compno,
                                            &parameters->roi_shift) != 2) {
                                        fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n");
                                        return 1;
@@ -972,7 +976,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'T':                       /* Tile offset */
                        {
-                               if (sscanf(optarg, "%d,%d", &parameters->cp_tx0, &parameters->cp_ty0) != 2) {
+                               if (sscanf(opj_optarg, "%d,%d", &parameters->cp_tx0, &parameters->cp_ty0) != 2) {
                                        fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");
                                        return 1;
                                }
@@ -983,9 +987,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'C':                       /* add a comment */
                        {
-                               parameters->cp_comment = (char*)malloc(strlen(optarg) + 1);
+                               parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);
                                if(parameters->cp_comment) {
-                                       strcpy(parameters->cp_comment, optarg);
+                                       strcpy(parameters->cp_comment, opj_optarg);
                                }
                        }
                        break;
@@ -1003,7 +1007,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'v':                       /* Tile part generation*/
                        {
-                               parameters->tp_flag = optarg[0];
+                               parameters->tp_flag = opj_optarg[0];
                                parameters->tp_on = 1;
                        }
                        break;
@@ -1012,8 +1016,8 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'z':                       /* Image Directory path */
                        {
-                               img_fol->imgdirpath = (char*)malloc(strlen(optarg) + 1);
-                               strcpy(img_fol->imgdirpath,optarg);
+                               img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
+                               strcpy(img_fol->imgdirpath,opj_optarg);
                                img_fol->set_imgdir=1;
                        }
                        break;
@@ -1023,7 +1027,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'w':                       /* Digital Cinema 2K profile compliance*/
                        {
                                int fps=0;
-                               sscanf(optarg,"%d",&fps);
+                               sscanf(opj_optarg,"%d",&fps);
                                if(fps == 24){
                                        parameters->cp_cinema = CINEMA2K_24;
                                }else if(fps == 48 ){
@@ -1067,7 +1071,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                /* search for different protection methods */
 
                                /* break the option in comma points and parse the result */
-                               token = strtok(optarg, ",");
+                               token = strtok(opj_optarg, ",");
                                while(token != NULL) {
 
                                        /* search header error protection method */
@@ -1363,20 +1367,27 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                                /* some info */
                                fprintf(stdout, "Info: JPWL capabilities enabled\n");
-                               parameters->jpwl_epc_on = true;
+                               parameters->jpwl_epc_on = OPJ_TRUE;
 
                        }
                        break;
 #endif /* USE_JPWL */
 /* <<UniPG */
-
+/* ------------------------------------------------------ */
+                       
+                       case 'J':                       /* jpip on */
+                       {
+                         parameters->jpip_on = OPJ_TRUE;
+                       }
+                       break;
                                /* ------------------------------------------------------ */
 
+
                        default:
                                fprintf(stderr, "ERROR -> Command line not valid\n");
                                return 1;
                }
-       }
+       }while(c != -1);
 
        /* check for possible errors */
        if (parameters->cp_cinema){
@@ -1475,14 +1486,14 @@ void info_callback(const char *msg, void *client_data) {
 /* -------------------------------------------------------------------------- */
 
 int main(int argc, char **argv) {
-       bool bSuccess;
+       opj_bool bSuccess;
        opj_cparameters_t parameters;   /* compression parameters */
        img_fol_t img_fol;
        opj_event_mgr_t event_mgr;              /* event manager */
        opj_image_t *image = NULL;
        int i,num_images;
        int imageno;
-       dircnt_t *dirptr;
+       dircnt_t *dirptr = NULL;
        raw_cparameters_t raw_cp;
        opj_codestream_info_t cstr_info;                /* Codestream information structure */
        char indexfilename[OPJ_PATH_LEN];       /* index file name */
@@ -1686,7 +1697,7 @@ int main(int argc, char **argv) {
 
                                /* encode the image */
                                if (*indexfilename)                                     // If need to extract codestream information
-                                       bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
+                                 bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
                                else
                                        bSuccess = opj_encode(cinfo, cio, image, NULL);
                                if (!bSuccess) {
@@ -1725,9 +1736,10 @@ int main(int argc, char **argv) {
                                int codestream_length;
                                opj_cio_t *cio = NULL;
                                FILE *f = NULL;
+                               opj_cinfo_t *cinfo = NULL;
 
-                               /* get a JP2 compressor handle */
-                               opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
+                               /* get a JP2 compressor handle */                               
+                               cinfo = opj_create_compress(CODEC_JP2);
 
                                /* catch events using our callbacks and give a local context */
                                opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
@@ -1740,8 +1752,8 @@ int main(int argc, char **argv) {
                                cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
 
                                /* encode the image */
-                               if (*indexfilename)                                     // If need to extract codestream information
-                                       bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
+                               if (*indexfilename || parameters.jpip_on) // If need to extract codestream information
+                                 bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
                                else
                                        bSuccess = opj_encode(cinfo, cio, image, NULL);
                                if (!bSuccess) {