Merge pull request #1192 from rouault/poc_fixes
[openjpeg.git] / tests / compare_images.c
index 88d874bada6332d05e631927a20f2958c579cd53..b2ef00db73b2b1cbe8105c1d8efe4d8110ee5d5e 100644 (file)
@@ -85,7 +85,7 @@ static void compare_images_help_display(void)
   fprintf(stdout,"\n");
   fprintf(stdout,"  -b \t REQUIRED \t filename to the reference/baseline PGX/TIF/PNM image \n");
   fprintf(stdout,"  -t \t REQUIRED \t filename to the test PGX/TIF/PNM image\n");
-  fprintf(stdout,"  -n \t REQUIRED \t number of component of the image (used to generate correct filename)\n");
+  fprintf(stdout,"  -n \t REQUIRED \t number of component of the image (used to generate correct filename, not used when both input files are TIF)\n");
   fprintf(stdout,"  -m \t OPTIONAL \t list of MSE tolerances, separated by : (size must correspond to the number of component) of \n");
   fprintf(stdout,"  -p \t OPTIONAL \t list of PEAK tolerances, separated by : (size must correspond to the number of component) \n");
   fprintf(stdout,"  -s \t OPTIONAL \t 1 or 2 filename separator to take into account PGX/PNM image with different components, "
@@ -115,13 +115,13 @@ static char* createMultiComponentsFilename(const char* inFilename, const int ind
   char s[255];
   char *outFilename, *ptr;
   const char token = '.';
-  int posToken = 0;
+  size_t posToken = 0;
   int decod_format;
 
   /*printf("inFilename = %s\n", inFilename);*/
   if ((ptr = strrchr(inFilename, token)) != NULL)
     {
-    posToken = (int) (strlen(inFilename) - strlen(ptr));
+    posToken = strlen(inFilename) - strlen(ptr);
     /*printf("Position of %c character inside inFilename = %d\n", token, posToken);*/
     }
   else
@@ -132,14 +132,11 @@ static char* createMultiComponentsFilename(const char* inFilename, const int ind
     return outFilename;
     }
 
-  outFilename = (char*)malloc((size_t)(posToken + 7) * sizeof(char)); /*6*/
-
-  strncpy(outFilename, inFilename, (size_t)posToken);
+  outFilename = (char*)malloc((posToken + 7) * sizeof(char)); /*6*/
 
+  strncpy(outFilename, inFilename, posToken);
   outFilename[posToken] = '\0';
-
   strcat(outFilename, separator);
-
   sprintf(s, "%i", indexF);
   strcat(outFilename, s);
 
@@ -199,7 +196,7 @@ static opj_image_t* readImageFromFilePPM(const char* filename, int nbFilenamePGX
     if (!image_read)
       {
       int it_free_data;
-      fprintf(stderr, "Unable to load pgx file\n");
+      fprintf(stderr, "Unable to load ppm file: %s\n", filenameComponentPGX);
 
       free(param_image_read);
 
@@ -250,12 +247,10 @@ static opj_image_t* readImageFromFilePPM(const char* filename, int nbFilenamePGX
 
 static opj_image_t* readImageFromFileTIF(const char* filename, int nbFilenamePGX, const char *separator)
 {
-  int it_file;
   opj_image_t* image_read = NULL;
-  opj_image_t* image = NULL;
   opj_cparameters_t parameters;
-  opj_image_cmptparm_t* param_image_read;
-  int** data;
+  (void)nbFilenamePGX;
+  (void)separator;
 
   /* conformance test suite produce annoying warning/error:
    * TIFFReadDirectory: Warning, /.../data/baseline/conformance/jp2_1.tif: unknown field with tag 37724 (0x935c) encountered.
@@ -267,85 +262,24 @@ static opj_image_t* readImageFromFileTIF(const char* filename, int nbFilenamePGX
   TIFFSetErrorHandler(NULL);
 #endif
 
-  /* If separator is empty => nb file to read is equal to one*/
-  if ( strlen(separator) == 0 )
-    nbFilenamePGX = 1;
+  if ( strlen(separator) != 0 ) return NULL;
 
   /* set encoding parameters to default values */
   opj_set_default_encoder_parameters(&parameters);
   parameters.decod_format = TIF_DFMT;
   strcpy(parameters.infile, filename);
 
-  /* Allocate memory*/
-  param_image_read = malloc((size_t)nbFilenamePGX * sizeof(opj_image_cmptparm_t));
-  data = malloc((size_t)nbFilenamePGX * sizeof(*data));
-
-  for (it_file = 0; it_file < nbFilenamePGX; it_file++)
-    {
-    /* Create the right filename*/
-    char *filenameComponentPGX;
-    if (strlen(separator) == 0)
-      {
-      filenameComponentPGX = malloc((strlen(filename) + 1) * sizeof(*filenameComponentPGX));
-      strcpy(filenameComponentPGX, filename);
-      }
-    else
-      filenameComponentPGX = createMultiComponentsFilename(filename, it_file, separator);
-
-    /* Read the tif file corresponding to the component */
+  /* Read the tif file corresponding to the component */
 #ifdef OPJ_HAVE_LIBTIFF
-    image_read = tiftoimage(filenameComponentPGX, &parameters);
+  image_read = tiftoimage(filename, &parameters);
 #endif
-    if (!image_read)
-      {
-      int it_free_data;
-      fprintf(stderr, "Unable to load TIF file\n");
-
-      free(param_image_read);
-
-      for (it_free_data = 0; it_free_data < it_file; it_free_data++) {
-        free(data[it_free_data]);
-      }
-      free(data);
-
-      free(filenameComponentPGX);
-
-      return NULL;
-      }
-
-    /* Set the image_read parameters*/
-    param_image_read[it_file].x0 = 0;
-    param_image_read[it_file].y0 = 0;
-    param_image_read[it_file].dx = 0;
-    param_image_read[it_file].dy = 0;
-    param_image_read[it_file].h = image_read->comps->h;
-    param_image_read[it_file].w = image_read->comps->w;
-    param_image_read[it_file].bpp = image_read->comps->bpp;
-    param_image_read[it_file].prec = image_read->comps->prec;
-    param_image_read[it_file].sgnd = image_read->comps->sgnd;
-
-    /* Copy data*/
-    data[it_file] = malloc(param_image_read[it_file].h * param_image_read[it_file].w * sizeof(int));
-    memcpy(data[it_file], image_read->comps->data, image_read->comps->h * image_read->comps->w * sizeof(int));
-
-    /* Free memory*/
-    opj_image_destroy(image_read);
-    free(filenameComponentPGX);
-    }
-
-  image = opj_image_create((OPJ_UINT32)nbFilenamePGX, param_image_read, OPJ_CLRSPC_UNSPECIFIED);
-  for (it_file = 0; it_file < nbFilenamePGX; it_file++)
+  if (!image_read)
     {
-    /* Copy data into output image and free memory*/
-    memcpy(image->comps[it_file].data, data[it_file], image->comps[it_file].h * image->comps[it_file].w * sizeof(int));
-    free(data[it_file]);
+    fprintf(stderr, "Unable to load TIF file\n");
+    return NULL;
     }
 
-  /* Free memory*/
-  free(param_image_read);
-  free(data);
-
-  return image;
+  return image_read;
 }
 
 static opj_image_t* readImageFromFilePGX(const char* filename, int nbFilenamePGX, const char *separator)
@@ -504,7 +438,7 @@ static int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param)
 {
   char *MSElistvalues = NULL;  char *PEAKlistvalues= NULL;
   char *separatorList = NULL;
-  int sizemembasefile, sizememtestfile;
+  size_t sizemembasefile, sizememtestfile;
   int index, flagM=0, flagP=0;
   const char optlist[] = "b:t:n:m:p:s:d";
   int c;
@@ -525,19 +459,15 @@ static int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param)
     switch (c)
       {
       case 'b':
-        sizemembasefile = (int)strlen(opj_optarg)+1;
-        param->base_filename = (char*) malloc((size_t)sizemembasefile);
-        param->base_filename[0] = '\0';
-        strncpy(param->base_filename, opj_optarg, strlen(opj_optarg));
-        param->base_filename[strlen(opj_optarg)] = '\0';
+        sizemembasefile = strlen(opj_optarg) + 1;
+        param->base_filename = (char*) malloc(sizemembasefile);
+        strcpy(param->base_filename, opj_optarg);
         /*printf("param->base_filename = %s [%d / %d]\n", param->base_filename, strlen(param->base_filename), sizemembasefile );*/
         break;
       case 't':
-        sizememtestfile = (int) strlen(opj_optarg) + 1;
-        param->test_filename = (char*) malloc((size_t)sizememtestfile);
-        param->test_filename[0] = '\0';
-        strncpy(param->test_filename, opj_optarg, strlen(opj_optarg));
-        param->test_filename[strlen(opj_optarg)] = '\0';
+        sizememtestfile = strlen(opj_optarg) + 1;
+        param->test_filename = (char*) malloc(sizememtestfile);
+        strcpy(param->test_filename, opj_optarg);
         /*printf("param->test_filename = %s [%d / %d]\n", param->test_filename, strlen(param->test_filename), sizememtestfile);*/
        break;
       case 'n':
@@ -600,11 +530,9 @@ static int parse_cmdline_cmp(int argc, char **argv, test_cmp_parameters* param)
     if( (strlen(separatorList) ==2) || (strlen(separatorList) ==4) )
       {
       /* keep original string*/
-      int sizeseplist = (int)strlen(separatorList)+1;
-      char* separatorList2 = (char*)malloc( (size_t)sizeseplist );
-      separatorList2[0] = '\0';
-      strncpy(separatorList2, separatorList, strlen(separatorList));
-      separatorList2[strlen(separatorList)] = '\0';
+      size_t sizeseplist = strlen(separatorList)+1;
+      char* separatorList2 = (char*)malloc( sizeseplist );
+      strcpy(separatorList2, separatorList);
       /*printf("separatorList2 = %s [%d / %d]\n", separatorList2, strlen(separatorList2), sizeseplist);*/
 
       if (strlen(separatorList) == 2) /* one separator behind b or t*/
@@ -720,7 +648,7 @@ int main(int argc, char **argv)
   int failed = 1;
   int nbFilenamePGXbase = 0, nbFilenamePGXtest = 0;
   char *filenamePNGtest= NULL, *filenamePNGbase = NULL, *filenamePNGdiff = NULL;
-  int memsizebasefilename, memsizetestfilename;
+  size_t memsizebasefilename, memsizetestfilename;
   size_t memsizedifffilename;
   int valueDiff = 0, nbPixelDiff = 0;
   double sumDiff = 0.0;
@@ -772,8 +700,8 @@ int main(int argc, char **argv)
   printf("************************* \n");
 
   /*----------BASELINE IMAGE--------*/
-  memsizebasefilename = (int)strlen(inParam.test_filename) + 1 + 5 + 2 + 4;
-  memsizetestfilename = (int)strlen(inParam.test_filename) + 1 + 5 + 2 + 4;
+  memsizebasefilename = strlen(inParam.test_filename) + 1 + 5 + 2 + 4;
+  memsizetestfilename = strlen(inParam.test_filename) + 1 + 5 + 2 + 4;
 
   decod_format = get_decod_format(&inParam);
   if( decod_format == -1 )
@@ -802,7 +730,7 @@ int main(int argc, char **argv)
       goto cleanup;
     }
 
-  filenamePNGbase = (char*) malloc((size_t)memsizebasefilename);
+  filenamePNGbase = (char*) malloc(memsizebasefilename);
   strcpy(filenamePNGbase, inParam.test_filename);
   strcat(filenamePNGbase, ".base");
   /*printf("filenamePNGbase = %s [%d / %d octets]\n",filenamePNGbase, strlen(filenamePNGbase),memsizebasefilename );*/
@@ -828,7 +756,7 @@ int main(int argc, char **argv)
       goto cleanup;
     }
 
-  filenamePNGtest = (char*) malloc((size_t)memsizetestfilename);
+  filenamePNGtest = (char*) malloc(memsizetestfilename);
   strcpy(filenamePNGtest, inParam.test_filename);
   strcat(filenamePNGtest, ".test");
   /*printf("filenamePNGtest = %s [%d / %d octets]\n",filenamePNGtest, strlen(filenamePNGtest),memsizetestfilename );*/
@@ -841,6 +769,13 @@ int main(int argc, char **argv)
   /* Comparison of header parameters*/
   printf("Step 1 -> Header comparison\n");
 
+  /* check dimensions (issue 286)*/
+  if(imageBase->numcomps != imageTest->numcomps )
+    {
+    printf("ERROR: dim mismatch (%d><%d)\n", imageBase->numcomps, imageTest->numcomps);
+    goto cleanup;
+    }
+
   for (it_comp = 0; it_comp < imageBase->numcomps; it_comp++)
     {
     param_image_diff[it_comp].x0 = 0;
@@ -942,15 +877,17 @@ int main(int argc, char **argv)
 
          printf("<DartMeasurement name=\"NumberOfPixelsWithDifferences_%d\" type=\"numeric/int\"> %d </DartMeasurement> \n", it_comp, nbPixelDiff);
          printf("<DartMeasurement name=\"ComponentError_%d\" type=\"numeric/double\"> %f </DartMeasurement> \n", it_comp, sumDiff);
+         printf("<DartMeasurement name=\"PEAK_%d\" type=\"numeric/double\"> %f </DartMeasurement> \n", it_comp, PEAK);
+         printf("<DartMeasurement name=\"MSE_%d\" type=\"numeric/double\"> %f </DartMeasurement> \n", it_comp, MSE);
 
 #ifdef OPJ_HAVE_LIBPNG
            {
            char *filenamePNGbase_it_comp, *filenamePNGtest_it_comp, *filenamePNGdiff_it_comp;
 
-           filenamePNGbase_it_comp = (char*) malloc((size_t)memsizebasefilename);
+           filenamePNGbase_it_comp = (char*) malloc(memsizebasefilename);
            strcpy(filenamePNGbase_it_comp,filenamePNGbase);
 
-           filenamePNGtest_it_comp = (char*) malloc((size_t)memsizetestfilename);
+           filenamePNGtest_it_comp = (char*) malloc(memsizetestfilename);
            strcpy(filenamePNGtest_it_comp,filenamePNGtest);
 
            filenamePNGdiff_it_comp = (char*) malloc(memsizedifffilename);