diff --git a/src/bin/jp2/opj_compress.c b/src/bin/jp2/opj_compress.c index e9f3eedf..9ad6175f 100644 --- a/src/bin/jp2/opj_compress.c +++ b/src/bin/jp2/opj_compress.c @@ -57,6 +57,9 @@ #define strncasecmp _strnicmp #else #include +#include +#include +#include #endif /* _WIN32 */ #include "opj_apps_config.h" @@ -1535,6 +1538,31 @@ static void info_callback(const char *msg, void *client_data) { fprintf(stdout, "[INFO] %s", msg); } +OPJ_FLOAT64 opj_clock(void) { +#ifdef _WIN32 + /* _WIN32: use QueryPerformance (very accurate) */ + LARGE_INTEGER freq , t ; + /* freq is the clock speed of the CPU */ + QueryPerformanceFrequency(&freq) ; + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* t is the high resolution performance counter (see MSDN) */ + QueryPerformanceCounter ( & t ) ; + return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ; +#else + /* Unix or Linux: use resource usage */ + struct rusage t; + OPJ_FLOAT64 procTime; + /* (1) Get the rusage data structure at this moment (man getrusage) */ + getrusage(0,&t); + /* (2) What is the elapsed time ? - CPU time = User time + System time */ + /* (2a) Get the seconds */ + procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec); + /* (2b) More precisely! Get the microseconds part ! */ + return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; +#endif +} + + /* -------------------------------------------------------------------------- */ /** * OPJ_COMPRESS MAIN @@ -1548,6 +1576,7 @@ int main(int argc, char **argv) { opj_codec_t* l_codec = 00; opj_image_t *image = NULL; raw_cparameters_t raw_cp; + OPJ_SIZE_T num_compressed_files = 0; char indexfilename[OPJ_PATH_LEN]; /* index file name */ @@ -1558,6 +1587,7 @@ int main(int argc, char **argv) { OPJ_BOOL bSuccess; OPJ_BOOL bUseTiles = OPJ_FALSE; /* OPJ_TRUE */ OPJ_UINT32 l_nb_tiles = 4; + OPJ_FLOAT64 t = opj_clock(); /* set encoding parameters to default values */ opj_set_default_encoder_parameters(¶meters); @@ -1822,6 +1852,7 @@ int main(int argc, char **argv) { return 1; } + num_compressed_files++; fprintf(stdout,"[INFO] Generated outfile %s\n",parameters.outfile); /* close and free the byte stream */ opj_stream_destroy(l_stream); @@ -1838,6 +1869,10 @@ int main(int argc, char **argv) { if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); if(raw_cp.rawComps) free(raw_cp.rawComps); + + t = opj_clock() - t; + fprintf(stdout, "encode time: %d ms \n", (int)((t * 1000)/num_compressed_files)); + scanf("%d"); return 0; } diff --git a/src/bin/jp2/opj_decompress.c b/src/bin/jp2/opj_decompress.c index 136cc9c1..cfc04a9e 100644 --- a/src/bin/jp2/opj_decompress.c +++ b/src/bin/jp2/opj_decompress.c @@ -56,6 +56,9 @@ #define strncasecmp _strnicmp #else #include +#include +#include +#include #endif /* _WIN32 */ #include "openjpeg.h" @@ -840,6 +843,30 @@ int parse_DA_values( char* inArg, unsigned int *DA_x0, unsigned int *DA_y0, unsi } } +OPJ_FLOAT64 opj_clock(void) { +#ifdef _WIN32 + /* _WIN32: use QueryPerformance (very accurate) */ + LARGE_INTEGER freq , t ; + /* freq is the clock speed of the CPU */ + QueryPerformanceFrequency(&freq) ; + /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ + /* t is the high resolution performance counter (see MSDN) */ + QueryPerformanceCounter ( & t ) ; + return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ; +#else + /* Unix or Linux: use resource usage */ + struct rusage t; + OPJ_FLOAT64 procTime; + /* (1) Get the rusage data structure at this moment (man getrusage) */ + getrusage(0,&t); + /* (2) What is the elapsed time ? - CPU time = User time + System time */ + /* (2a) Get the seconds */ + procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec); + /* (2b) More precisely! Get the microseconds part ! */ + return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; +#endif +} + /* -------------------------------------------------------------------------- */ /** @@ -1135,6 +1162,8 @@ int main(int argc, char **argv) img_fol_t img_fol; dircnt_t *dirptr = NULL; int failed = 0; + OPJ_FLOAT64 t, tCumulative = 0; + OPJ_UINT32 numDecompressedImages = 0; /* set decoding parameters to default values */ set_default_parameters(¶meters); @@ -1239,6 +1268,8 @@ int main(int argc, char **argv) opj_set_warning_handler(l_codec, warning_callback,00); opj_set_error_handler(l_codec, error_callback,00); + t = opj_clock(); + /* Setup the decoder decoding parameters using user parameters */ if ( !opj_setup_decoder(l_codec, &(parameters.core)) ){ fprintf(stderr, "ERROR -> opj_decompress: failed to setup the decoder\n"); @@ -1303,6 +1334,9 @@ int main(int argc, char **argv) fprintf(stdout, "tile %d is decoded!\n\n", parameters.tile_index); } + tCumulative += opj_clock() - t; + numDecompressedImages++; + /* Close the byte stream */ opj_stream_destroy(l_stream); @@ -1501,6 +1535,8 @@ int main(int argc, char **argv) if(failed) remove(parameters.outfile); } destroy_parameters(¶meters); + fprintf(stdout, "decode time: %d ms \n", (int)( (tCumulative * 1000) / numDecompressedImages)); + scanf("%d"); return failed ? EXIT_FAILURE : EXIT_SUCCESS; } /*end main*/