/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this license. // If you do not agree to this license, do not download, install, // copy or use the software. // // // Intel License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000, Intel Corporation, all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistribution's of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * The name of Intel Corporation may not be used to endorse or promote products // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and // any express or implied warranties, including, but not limited to, the implied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the Intel Corporation or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages // (including, but not limited to, procurement of substitute goods or services; // loss of use, data, or profits; or business interruption) however caused // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. // //M*/ #include #include #include #include #include #include #include #include #define PROC_PX 0 #define PROC_M5 (1<<23) /* mmx */ #define PROC_M6 ((1<<15)|(1<<23)) /* cmov + mmx */ #define PROC_A6 ((1<<25)|PROC_M6) /* --||-- + xmm */ #define PROC_W7 ((1<<26)|PROC_A6) /* --||-- + emm */ #define PROC_M7 -1 #if _MSC_VER >= 1300 #pragma warning( disable: 4996 ) #endif /* determine processor type */ static int get_processor_type( void ) { int proc_type; #ifdef WIN64 proc_type = PROC_M7; #else proc_type = PROC_PX; SYSTEM_INFO sys; GetSystemInfo( &sys ); if( sys.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL && sys.dwProcessorType == PROCESSOR_INTEL_PENTIUM ) { int version = 0, features = 0, family = 0; #if _MSC_VER >= 1200 || defined __ICL || defined __BORLANDC__ __asm { push ebx push esi push edi mov eax, 1 #ifndef __BORLANDC__ _emit 0x0f _emit 0xa2 #else db 0fh db 0a2h #endif pop edi pop esi pop ebx mov version, eax mov features, edx } #elif defined __GNUC__ __asm__ __volatile__ ( "push %%ebx\n\t" "push %%esi\n\t" "push %%edi\n\t" "movl $1, %%eax\n\t" "cpuid\n\t" "movl %%eax, %0\n\t" "movl %%edx, %1\n\t" "pop %%edi\n\t" "pop %%esi\n\t" "pop %%ebx\n\t" : "=a" (version), "=d" (features) : ); #endif family = (version >> 8) & 15; if( family >= 5 && (features & PROC_M6) != 0 ) /* Pentium II or higher */ { proc_type = features & PROC_W7; } } #endif return proc_type; } static const char* get_flavor( const char* name ) { const char* ptr = strrchr( name, '.' ); char buffer[3]; assert( ptr != 0 ); strncpy( buffer, ptr - 2, 2 ); buffer[0] = (char)toupper(buffer[0]); buffer[1] = (char)toupper(buffer[1]); buffer[2] = '\0'; if( !strcmp( buffer, "PL" )) return "Switcher"; if( !strcmp( buffer, "W7" )) return "PIV-optimized"; else if( !strcmp( buffer, "A6" )) return "PIII-optimized"; else if( !strcmp( buffer, "M6" )) return "PII-optimized"; else if( !strcmp( buffer, "M5" )) return "Pentium MMX-optimized"; else if( !strcmp( buffer, "P6" )) return "Pentium Pro-optimized"; else if( !strcmp( buffer, "P5" )) return "Pentium-optimized"; else if( !strcmp( buffer, "PX" )) return "Generic IA32"; else if( !strcmp( buffer, "IX" )) return "Generic IA64"; else if( !strcmp( buffer, "I7" )) return "Itanium-optimized"; else return "UNKNOWN"; } static const char* tryLoadOpenCV( const char* name ) { const char* version = 0; HINSTANCE dll = LoadLibrary( name ); if( dll ) { if( GetProcAddress( dll, "cvAccMask" ) != 0 ) // alpha 3 had cvAccMask function version = "alpha 3.x"; else if( GetProcAddress( dll, "cvmAdd" ) != 0 ) // till beta 2.x OpenCV had separate cvm* functions version = "beta 1.5 (a.k.a. 0.0.7)"; else if( GetProcAddress( dll, "cvHoughLinesP" ) != 0 ) version = "beta 2.x (a.k.a. 0.9.3)"; // beta 2 had separate functions for different variations of Hough transform else if( GetProcAddress( dll, "cvEigenProjection" ) != 0 ) version = "beta 3 (a.k.a 0.9.4) or beta 3.1 (a.k.a 0.9.5)"; // beta 3.x had cvEigenProjection and related functions else if( GetProcAddress( dll, "cvHoughCircles" ) == 0 ) version = "beta 4.x (a.k.a. 0.9.5 or 0.9.6)"; else if( GetProcAddress( dll, "cvWatershed" ) == 0 ) version = "beta 5.x (a.k.a. 0.9.7)"; else if( GetProcAddress( dll, "cvInpaint" ) == 0 ) version = "1.0rc1 (a.k.a. 0.9.9)"; else version = "1.0 or later"; FreeLibrary( dll ); } return version; } typedef struct _IPLLibVersion { int major; /*e.g. 2 */ int minor; /*e.g. 0 */ int build; /*e.g. 1 */ const char* Name; /*"ipl6l.lib","iplm5.dll"*/ const char* Version; /*e.g."v2.00" */ const char* InternalVersion; /*e.g. "[2.00.01.023,01/01/99]" */ const char* BuildDate;/*e.g. "Jan199"*/ const char* CallConv; } IPLLibVersion; typedef const IPLLibVersion* (__stdcall* IplGetLibVersion)(void); static char* load_file( const char* name, int* _size ) { FILE* f = fopen( name, "rb" ); int size = 0; char* buffer = 0; if( f ) { fseek( f, 0, SEEK_END ); size = ftell( f ); fseek( f, 0, SEEK_SET ); buffer = (char*)malloc( size ); if( fread( buffer, 1, size, f ) != (unsigned)size ) { free( buffer ); buffer = 0; size = 0; } fclose( f ); } if( _size ) *_size = size; return buffer; } static int find_signature( char* buffer, int size, const char* signature ) { char* ptr = buffer; int sig_length = (int)strlen(signature); while( ptr < buffer + size ) { ptr = (char*)memchr( ptr, signature[0], buffer + size - ptr ); if( !ptr || buffer + size - ptr < sig_length ) { ptr = 0; break; } if( !memcmp( ptr, signature, sig_length )) // found! break; ptr++; } return ptr != 0; } // convert date from string "/mm/dd/yyyy" or "mm/dd/yy" to time_t. static time_t date( const char* str ) { tm t; int month, day, year; if( sscanf( str, "%d/%d/%d", &month, &day, &year ) != 3 ) return 0; memset( &t, 0, sizeof(t)); t.tm_mday = day; t.tm_mon = month - 1; t.tm_year = year - (year > 100 ? 1900 : 0); return mktime( &t ); } static const char* tryLoadIPL( const char* name ) { //time_t ipl_2_1_date = date("01/01/2000"); //time_t ipl_2_2_date = date("01/20/2000"); //time_t ipl_2_5_date = date("10/09/2000"); HINSTANCE dll; const char* version = 0; const char* dotptr = strrchr( name, '.' ); assert( dotptr != 0 ); if( dotptr[-1] == 'l' || dotptr[-1] == 'L' ) // switcher { int size = 0; char* buffer = load_file( name, &size ); if( find_signature( buffer, size, "IPLW7.DLL" )) version = "2.5 or later"; else if( find_signature( buffer, size, "iplNoiseImage" )) version = "2.2"; else version = "2.1 or earlier"; free( buffer ); return version; } else { dll = LoadLibrary( name ); if( dll ) // if it is not just a switcher, we can use iplGetLibVersion { IplGetLibVersion getLibVersion = (IplGetLibVersion)GetProcAddress(dll, "iplGetLibVersion"); if( getLibVersion ) version = getLibVersion()->InternalVersion; else version = "[ERROR - iplGetLibVersion could not be found]"; } else version = "[ERROR - dll could not be loaded]"; } return version; } static const char* tryLoadIppCV( const char* /*name*/, _finddata_t* finddata ) { // // IppCV and OptCV: functionality is approximately the same, // so the function checks modification time of the DLL to determine its version. // time_t ippcv_alpha_3_4 = date("01/01/2001"); time_t ippcv_beta_1_5 = date("06/01/2000"); time_t ippcv_beta_2 = date("01/10/2000"); if( finddata->time_write < ippcv_alpha_3_4 ) return "alpha 3.4"; else if( finddata->time_write < ippcv_beta_1_5 ) return "beta 1.5"; else if( finddata->time_write < ippcv_beta_2 ) return "beta 2"; else return "beta 2+"; } void scan_folder( char* folder, int length ) { const char* cv_names[] = { "cv", "cv096", "cv097", "cv099", "cv100", 0 }; _finddata_t finddata; #ifdef WIN64 intptr_t #else int #endif search_id; int i; const char* version = 0; if( folder[length - 1] != '/' && folder[length - 1] != '\\' ) { folder[length] = '\\'; folder[++length] = '0'; } for( i = 0; cv_names[i] != 0; i++ ) { // find OpenCV sprintf( folder + length, "%s.dll", cv_names[i] ); version = tryLoadOpenCV( folder ); if( version != 0 ) { printf("%s:\n\t OpenCV version %s\n", folder, version ); } sprintf( folder + length, "%sd.dll", cv_names[i] ); version = tryLoadOpenCV( folder ); if( version != 0 ) { printf("%s:\n\t OpenCV (Debug) version %s\n", folder, version ); } } // find IPL strcpy( folder + length, "ipl*.dll" ); search_id = _findfirst( folder, &finddata ); if( search_id >= 0 ) { do { strcpy( folder + length, finddata.name ); version = tryLoadIPL( folder ); if( version != 0 ) { printf("%s:\n\t IPL %s version %s\n", folder, get_flavor( folder ), version ); } } while( _findnext( search_id, &finddata ) >= 0 ); } // find IppCV strcpy( folder + length, "ippcv*.dll" ); search_id = _findfirst( folder, &finddata ); if( search_id >= 0 ) { do { strcpy( folder + length, finddata.name ); version = tryLoadIppCV( folder, &finddata ); if( version != 0 ) { printf("%s:\n\t IppCV %s version %s\n", folder, get_flavor( folder ), version ); } } while( _findnext( search_id, &finddata ) >= 0 ); } // find OptCV strcpy( folder + length, "optcv*.dll" ); search_id = _findfirst( folder, &finddata ); if( search_id >= 0 ) { do { strcpy( folder + length, finddata.name ); version = tryLoadIppCV( folder, &finddata ); if( version != 0 ) { printf("%s:\n\t IppCV %s version %s\n", folder, get_flavor( folder ), version ); } } while( _findnext( search_id, &finddata ) >= 0 ); } } int main( void ) { char* path = getenv( "PATH" ); char* folder_start = path; char folder[1024]; int proc_type = get_processor_type(); printf("Processor: %s or compatible\n", proc_type == PROC_M7 ? "EM64T-compatible" : proc_type == PROC_W7 ? "Pentium IV" : proc_type == PROC_A6 ? "Pentium III" : proc_type == PROC_M6 ? "Pentium II" : "Generic IA32 processor" ); for( ; *path != '\0'; path++ ) { if( *path == ';' ) { int length = (int)(path - folder_start); strncpy( folder, folder_start, length ); folder[length] = '\0'; //printf( "%s\n", buffer ); scan_folder( folder, length ); folder_start = path + 1; } } return 0; } /* End of file. */