/******************************************************************************* * 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; }
/******************************************************************************* * 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; }