/*******************************************************************************
 * MAIN
 *******************************************************************************/
int main(int argc, char **argv)
{
  test_cmp_parameters inParam;
  FILE *fbase=NULL, *ftest=NULL;
  int chbase, chtest;
  int same = 1;
  unsigned long l=1, pos;

  if( parse_cmdline_cmp(argc, argv, &inParam) == EXIT_FAILURE )
    {
    compare_dump_files_help_display();
    if (!inParam.base_filename) free(inParam.base_filename);
    if (!inParam.test_filename) free(inParam.test_filename);
    return EXIT_FAILURE;
    }

  /* Display Parameters*/
  printf("******Parameters********* \n");
  printf(" base_filename = %s\n"
          " test_filename = %s\n",
          inParam.base_filename, inParam.test_filename);
  printf("************************* \n");

  /* open base file */
  printf("Try to open: %s for reading ... ", inParam.base_filename);
  if((fbase = fopen(inParam.base_filename, "rb"))==NULL)
    {
    printf("Failed.\n");
    free(inParam.base_filename);
    free(inParam.test_filename);
    return EXIT_FAILURE;
    }
  printf("Ok.\n");

  /* open test file */
  printf("Try to open: %s for reading ... ", inParam.test_filename);
  if((ftest = fopen(inParam.test_filename, "rb"))==NULL)
    {
    printf("Failed.\n");
    fclose(fbase);
    free(inParam.base_filename);
    free(inParam.test_filename);
    return EXIT_FAILURE;
    }
  printf("Ok.\n");

  pos=ftell(fbase);

  while(!feof(fbase))
    {
    chbase = fgetc(fbase);
    if(ferror(fbase))
      {
      printf("Error reading base file.\n");
      return EXIT_FAILURE;
      }

    chtest = fgetc(ftest);
    if(ferror(ftest))
      {
      printf("Error reading test file.\n");
      return EXIT_FAILURE;
      }

    /* CRLF problem (Baseline must be always generated by unix platform)*/
    if (chbase == '\n' && chtest == '\r')
      if (fgetc(ftest) == '\n')
        chtest = '\n';

    if(chbase != chtest)
      {
      size_t nbytes = 2048;
      int CRLF_shift=1;
      char *strbase, *strtest, *strbase_d, *strtest_d;

      printf("Files differ at line %lu:\n", l);
      fseek(fbase,pos,SEEK_SET);

      /* Take into account CRLF characters when we write \n into
      // dump file when we used WIN platform*/
#ifdef _WIN32
      CRLF_shift = 2;
      fseek(ftest,pos + l - 1,SEEK_SET);
#else
      fseek(ftest,pos,SEEK_SET);
#endif

      strbase = (char *) malloc(nbytes + 1);
      strtest = (char *) malloc(nbytes + 1);

	if (fgets(strbase, nbytes, fbase) == NULL)
		fprintf(stderr,"\nWARNING: fgets return a NULL value");
	else
	{
		if (fgets(strtest, nbytes, ftest) == NULL)
			fprintf(stderr,"\nWARNING: fgets return a NULL value");
		else
		{
			strbase_d = (char *) malloc(strlen(strbase)+1);
			strtest_d = (char *) malloc(strlen(strtest)+1);
			strncpy(strbase_d, strbase, strlen(strbase)-1);
			strncpy(strtest_d, strtest, strlen(strtest)-CRLF_shift);
			strbase_d[strlen(strbase)-1] = '\0';
			strtest_d[strlen(strtest)-CRLF_shift] = '\0';
			printf("<%s> vs. <%s>\n", strbase_d, strtest_d);
			free(strbase_d);free(strtest_d);
		}
	}

	free(strbase);free(strtest);
	
	same = 0;

      break;
      }
    else
      {
      if (chbase == '\n')
        {
        l++;
        pos = ftell(fbase);
        }
      }
    }

  /*Close File*/
  fclose(fbase);
  fclose(ftest);

  /* Free memory*/
  free(inParam.base_filename);
  free(inParam.test_filename);

  if(same)
    {
      printf("\n***** TEST SUCCEED: Files are the same. *****\n");
      return EXIT_SUCCESS;
    }
  else return EXIT_FAILURE;
}
예제 #2
0
/*******************************************************************************
 * MAIN
 *******************************************************************************/
int main(int argc, char **argv)
{
  test_cmp_parameters inParam;
  OPJ_UINT32 it_comp, itpxl;
  int failed = 1;
  int nbFilenamePGXbase = 0, nbFilenamePGXtest = 0;
  char *filenamePNGtest= NULL, *filenamePNGbase = NULL, *filenamePNGdiff = NULL;
  size_t memsizebasefilename, memsizetestfilename;
  size_t memsizedifffilename;
  int valueDiff = 0, nbPixelDiff = 0;
  double sumDiff = 0.0;
  /* Structures to store image parameters and data*/
  opj_image_t *imageBase = NULL, *imageTest = NULL, *imageDiff = NULL;
  opj_image_cmptparm_t* param_image_diff = NULL;
  int decod_format;

  /* Get parameters from command line*/
  if( parse_cmdline_cmp(argc, argv, &inParam) )
    {
    compare_images_help_display();
    goto cleanup;
    }

  /* Display Parameters*/
  printf("******Parameters********* \n");
  printf(" base_filename = %s\n"
         " test_filename = %s\n"
         " nb of Components = %d\n"
         " Non regression test = %d\n"
         " separator Base = %s\n"
         " separator Test = %s\n",
         inParam.base_filename, inParam.test_filename, inParam.nbcomp,
         inParam.nr_flag, inParam.separator_base, inParam.separator_test);

  if ( (inParam.tabMSEvalues != NULL) && (inParam.tabPEAKvalues != NULL))
    {
    int it_comp2;
    printf(" MSE values = [");
    for (it_comp2 = 0; it_comp2 < inParam.nbcomp; it_comp2++)
      printf(" %f ", inParam.tabMSEvalues[it_comp2]);
    printf("]\n");
    printf(" PEAK values = [");
    for (it_comp2 = 0; it_comp2 < inParam.nbcomp; it_comp2++)
      printf(" %f ", inParam.tabPEAKvalues[it_comp2]);
    printf("]\n");
    printf(" Non-regression test = %d\n", inParam.nr_flag);
    }

  if (strlen(inParam.separator_base) != 0)
    nbFilenamePGXbase = inParam.nbcomp;

  if (strlen(inParam.separator_test) != 0)
    nbFilenamePGXtest = inParam.nbcomp;

  printf(" NbFilename to generate from base filename = %d\n", nbFilenamePGXbase);
  printf(" NbFilename to generate from test filename = %d\n", nbFilenamePGXtest);
  printf("************************* \n");

  /*----------BASELINE IMAGE--------*/
  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 )
    {
    fprintf( stderr, "Unhandled file format\n" );
    goto cleanup;
    }
  assert( decod_format == PGX_DFMT || decod_format == TIF_DFMT || decod_format == PXM_DFMT );

  if( decod_format == PGX_DFMT )
    {
    imageBase = readImageFromFilePGX( inParam.base_filename, nbFilenamePGXbase, inParam.separator_base);
    if ( imageBase == NULL )
      goto cleanup;
    }
  else if( decod_format == TIF_DFMT )
    {
    imageBase = readImageFromFileTIF( inParam.base_filename, nbFilenamePGXbase, "");
    if ( imageBase == NULL )
      goto cleanup;
    }
  else if( decod_format == PXM_DFMT )
    {
    imageBase = readImageFromFilePPM( inParam.base_filename, nbFilenamePGXbase, inParam.separator_base);
    if ( imageBase == NULL )
      goto cleanup;
    }

  filenamePNGbase = (char*) malloc(memsizebasefilename);
  strcpy(filenamePNGbase, inParam.test_filename);
  strcat(filenamePNGbase, ".base");
  /*printf("filenamePNGbase = %s [%d / %d octets]\n",filenamePNGbase, strlen(filenamePNGbase),memsizebasefilename );*/

  /*----------TEST IMAGE--------*/

  if( decod_format == PGX_DFMT )
    {
    imageTest = readImageFromFilePGX(inParam.test_filename, nbFilenamePGXtest, inParam.separator_test);
    if ( imageTest == NULL )
      goto cleanup;
    }
  else if( decod_format == TIF_DFMT )
    {
    imageTest = readImageFromFileTIF(inParam.test_filename, nbFilenamePGXtest, "");
    if ( imageTest == NULL )
      goto cleanup;
    }
  else if( decod_format == PXM_DFMT )
    {
    imageTest = readImageFromFilePPM(inParam.test_filename, nbFilenamePGXtest, inParam.separator_test);
    if ( imageTest == NULL )
      goto cleanup;
    }

  filenamePNGtest = (char*) malloc(memsizetestfilename);
  strcpy(filenamePNGtest, inParam.test_filename);
  strcat(filenamePNGtest, ".test");
  /*printf("filenamePNGtest = %s [%d / %d octets]\n",filenamePNGtest, strlen(filenamePNGtest),memsizetestfilename );*/

  /*----------DIFF IMAGE--------*/

  /* Allocate memory*/
  param_image_diff = malloc( imageBase->numcomps * sizeof(opj_image_cmptparm_t));

  /* 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;
    param_image_diff[it_comp].y0 = 0;
    param_image_diff[it_comp].dx = 0;
    param_image_diff[it_comp].dy = 0;
    param_image_diff[it_comp].sgnd = 0;
    param_image_diff[it_comp].prec = 8;
    param_image_diff[it_comp].bpp = 1;
    param_image_diff[it_comp].h = imageBase->comps[it_comp].h;
    param_image_diff[it_comp].w = imageBase->comps[it_comp].w;

    if (imageBase->comps[it_comp].sgnd != imageTest->comps[it_comp].sgnd)
      {
      printf("ERROR: sign mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).sgnd, ((imageTest->comps)[it_comp]).sgnd);
      goto cleanup;
      }

    if (((imageBase->comps)[it_comp]).prec != ((imageTest->comps)[it_comp]).prec)
      {
      printf("ERROR: prec mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).prec, ((imageTest->comps)[it_comp]).prec);
      goto cleanup;
      }

    if (((imageBase->comps)[it_comp]).bpp != ((imageTest->comps)[it_comp]).bpp)
      {
      printf("ERROR: byte per pixel mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).bpp, ((imageTest->comps)[it_comp]).bpp);
      goto cleanup;
      }

    if (((imageBase->comps)[it_comp]).h != ((imageTest->comps)[it_comp]).h)
      {
      printf("ERROR: height mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).h, ((imageTest->comps)[it_comp]).h);
      goto cleanup;
      }

    if (((imageBase->comps)[it_comp]).w != ((imageTest->comps)[it_comp]).w)
      {
      printf("ERROR: width mismatch [comp %d] (%d><%d)\n", it_comp, ((imageBase->comps)[it_comp]).w, ((imageTest->comps)[it_comp]).w);
      goto cleanup;
      }
    }

   imageDiff = opj_image_create(imageBase->numcomps, param_image_diff, OPJ_CLRSPC_UNSPECIFIED);
   /* Free memory*/
   free(param_image_diff); param_image_diff = NULL;

   /* Measurement computation*/
   printf("Step 2 -> measurement comparison\n");

   memsizedifffilename = strlen(inParam.test_filename) + 1 + 5 + 2 + 4;
   filenamePNGdiff = (char*) malloc(memsizedifffilename);
   strcpy(filenamePNGdiff, inParam.test_filename);
   strcat(filenamePNGdiff, ".diff");
   /*printf("filenamePNGdiff = %s [%d / %d octets]\n",filenamePNGdiff, strlen(filenamePNGdiff),memsizedifffilename );*/

   /* Compute pixel diff*/
   for (it_comp = 0; it_comp < imageDiff->numcomps; it_comp++)
     {
     double SE=0,PEAK=0;
     double MSE=0;
     for (itpxl = 0; itpxl < ((imageDiff->comps)[it_comp]).w * ((imageDiff->comps)[it_comp]).h; itpxl++)
       {
       if (abs( ((imageBase->comps)[it_comp]).data[itpxl] - ((imageTest->comps)[it_comp]).data[itpxl] ) > 0)
         {
         valueDiff = ((imageBase->comps)[it_comp]).data[itpxl] - ((imageTest->comps)[it_comp]).data[itpxl];
         ((imageDiff->comps)[it_comp]).data[itpxl] = abs(valueDiff);
         sumDiff += valueDiff;
         nbPixelDiff++;

         SE += (double)valueDiff * valueDiff;
         PEAK = (PEAK > abs(valueDiff)) ? PEAK : abs(valueDiff);
         }
       else
         ((imageDiff->comps)[it_comp]).data[itpxl] = 0;
       }/* h*w loop */

     MSE = SE / ( ((imageDiff->comps)[it_comp]).w * ((imageDiff->comps)[it_comp]).h );

     if (!inParam.nr_flag && (inParam.tabMSEvalues != NULL) && (inParam.tabPEAKvalues != NULL))
       { /* Conformance test*/
       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);

       if ( (MSE > inParam.tabMSEvalues[it_comp]) || (PEAK > inParam.tabPEAKvalues[it_comp]) )
         {
         printf("ERROR: MSE (%f) or PEAK (%f) values produced by the decoded file are greater "
           "than the allowable error (respectively %f and %f) \n",
           MSE, PEAK, inParam.tabMSEvalues[it_comp], inParam.tabPEAKvalues[it_comp]);
         goto cleanup;
         }
       }
     else  /* Non regression-test */
       {
       if ( nbPixelDiff > 0)
         {
         char it_compc[255];
         it_compc[0] = 0;

         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);

#ifdef OPJ_HAVE_LIBPNG
           {
           char *filenamePNGbase_it_comp, *filenamePNGtest_it_comp, *filenamePNGdiff_it_comp;

           filenamePNGbase_it_comp = (char*) malloc(memsizebasefilename);
           strcpy(filenamePNGbase_it_comp,filenamePNGbase);

           filenamePNGtest_it_comp = (char*) malloc(memsizetestfilename);
           strcpy(filenamePNGtest_it_comp,filenamePNGtest);

           filenamePNGdiff_it_comp = (char*) malloc(memsizedifffilename);
           strcpy(filenamePNGdiff_it_comp,filenamePNGdiff);

           sprintf(it_compc, "_%i", it_comp);
           strcat(it_compc,".png");
           strcat(filenamePNGbase_it_comp, it_compc);
           /*printf("filenamePNGbase_it = %s [%d / %d octets]\n",filenamePNGbase_it_comp, strlen(filenamePNGbase_it_comp),memsizebasefilename );*/
           strcat(filenamePNGtest_it_comp, it_compc);
           /*printf("filenamePNGtest_it = %s [%d / %d octets]\n",filenamePNGtest_it_comp, strlen(filenamePNGtest_it_comp),memsizetestfilename );*/
           strcat(filenamePNGdiff_it_comp, it_compc);
           /*printf("filenamePNGdiff_it = %s [%d / %d octets]\n",filenamePNGdiff_it_comp, strlen(filenamePNGdiff_it_comp),memsizedifffilename );*/

           /*
           if ( imageToPNG(imageBase, filenamePNGbase_it_comp, it_comp) == EXIT_SUCCESS )
           {
           printf("<DartMeasurementFile name=\"BaselineImage_%d\" type=\"image/png\"> %s </DartMeasurementFile> \n", it_comp, filenamePNGbase_it_comp);
           }

           if ( imageToPNG(imageTest, filenamePNGtest_it_comp, it_comp) == EXIT_SUCCESS )
           {
           printf("<DartMeasurementFile name=\"TestImage_%d\" type=\"image/png\"> %s </DartMeasurementFile> \n", it_comp, filenamePNGtest_it_comp);
           }

           if ( imageToPNG(imageDiff, filenamePNGdiff_it_comp, it_comp) == EXIT_SUCCESS )
           {
           printf("<DartMeasurementFile name=\"DiffferenceImage_%d\" type=\"image/png\"> %s </DartMeasurementFile> \n", it_comp, filenamePNGdiff_it_comp);
           }
            */

           free(filenamePNGbase_it_comp);
           free(filenamePNGtest_it_comp);
           free(filenamePNGdiff_it_comp);
           }
#endif
         goto cleanup;
         }
       }
     } /* it_comp loop */

   printf("---- TEST SUCCEED ----\n");
   failed = 0;
cleanup:
  /*-----------------------------*/
  free(param_image_diff);
  /* Free memory */
  opj_image_destroy(imageBase);
  opj_image_destroy(imageTest);
  opj_image_destroy(imageDiff);

  free(filenamePNGbase);
  free(filenamePNGtest);
  free(filenamePNGdiff);

  free(inParam.tabMSEvalues);
  free(inParam.tabPEAKvalues);
  free(inParam.base_filename);
  free(inParam.test_filename);

  return failed ? EXIT_FAILURE : EXIT_SUCCESS;
}