| #include "timestatus.h" |
| #include "util.h" |
| #include <time.h> |
| |
| #if defined(CLOCKS_PER_SEC) |
| /* ANSI/ISO systems */ |
| # define TS_CLOCKS_PER_SEC CLOCKS_PER_SEC |
| #elif defined(CLK_TCK) |
| /* Non-standard systems */ |
| # define TS_CLOCKS_PER_SEC CLK_TCK |
| #elif defined(HZ) |
| /* Older BSD systems */ |
| # define TS_CLOCKS_PER_SEC HZ |
| #else |
| # error no suitable value for TS_CLOCKS_PER_SEC |
| #endif |
| |
| /*********************************************************/ |
| /* ts_real_time: real time elapsed in seconds */ |
| /*********************************************************/ |
| FLOAT ts_real_time(long frame) { |
| |
| static time_t initial_time; |
| time_t current_time; |
| |
| time(¤t_time); |
| |
| if (frame==0) { |
| initial_time = current_time; |
| } |
| |
| return (FLOAT) difftime(current_time, initial_time); |
| } |
| |
| /*********************************************************/ |
| /* ts_process_time: process time elapsed in seconds */ |
| /*********************************************************/ |
| FLOAT ts_process_time(long frame) { |
| static clock_t initial_time; |
| clock_t current_time; |
| |
| #if ( defined(_MSC_VER) || defined(__BORLANDC__) ) |
| |
| { static HANDLE hProcess; |
| FILETIME Ignored1, Ignored2, KernelTime, UserTime; |
| |
| if ( frame==0 ) { |
| hProcess = GetCurrentProcess(); |
| } |
| |
| /* GetProcessTimes() always fails under Win9x */ |
| if (GetProcessTimes(hProcess, &Ignored1, &Ignored2, &KernelTime, &UserTime)) { |
| LARGE_INTEGER Kernel = { KernelTime.dwLowDateTime, KernelTime.dwHighDateTime }; |
| LARGE_INTEGER User = { UserTime.dwLowDateTime, UserTime.dwHighDateTime }; |
| |
| current_time = (clock_t)((FLOAT)(Kernel.QuadPart + User.QuadPart) * TS_CLOCKS_PER_SEC / 10000000); |
| } else { |
| current_time = clock(); |
| } |
| } |
| #else |
| current_time = clock(); |
| #endif |
| |
| if (frame==0) { |
| initial_time = current_time; |
| } |
| |
| return (FLOAT)(current_time - initial_time) / TS_CLOCKS_PER_SEC; |
| } |
| |
| #undef TS_CLOCKS_PER_SEC |
| |
| typedef struct ts_times { |
| FLOAT so_far; |
| FLOAT estimated; |
| FLOAT speed; |
| FLOAT eta; |
| } ts_times; |
| |
| /*********************************************************/ |
| /* ts_calc_times: calculate time info (eta, speed, etc.) */ |
| /*********************************************************/ |
| void ts_calc_times(ts_times *time, int samp_rate, long frame, long frames,int framesize) |
| { |
| if (frame > 0) { |
| time->estimated = time->so_far * frames / frame; |
| if (samp_rate * time->estimated > 0) { |
| time->speed = frames * framesize / (samp_rate * time->estimated); |
| } else { |
| time->speed = 0; |
| } |
| time->eta = time->estimated - time->so_far; |
| } else { |
| time->estimated = 0; |
| time->speed = 0; |
| time->eta = 0; |
| } |
| } |
| |
| /*********************************************************/ |
| /* timestatus: display encoding process time information */ |
| /*********************************************************/ |
| void timestatus(int samp_rate,long frameNum,long totalframes,int framesize) |
| { |
| ts_times real_time, process_time; |
| int percent; |
| |
| real_time.so_far = ts_real_time(frameNum); |
| process_time.so_far = ts_process_time(frameNum); |
| |
| if (frameNum == 0) { |
| fprintf(stderr, " Frame | CPU/estimated | time/estimated | play/CPU | ETA\n"); |
| return; |
| } |
| |
| ts_calc_times(&real_time, samp_rate, frameNum, totalframes, framesize); |
| ts_calc_times(&process_time, samp_rate, frameNum, totalframes, framesize); |
| |
| if (totalframes > 1) { |
| percent = (int)(100.0 * frameNum / (totalframes - 1)); |
| } else { |
| percent = 100; |
| } |
| |
| # define TS_TIME_DECOMPOSE(time) \ |
| (int)((long)(time+.5) / 3600), \ |
| (int)((long)((time+.5) / 60) % 60), \ |
| (int)((long)(time+.5) % 60) |
| |
| fprintf(stderr, |
| "\r%6ld/%6ld(%3d%%)|%2d:%02d:%02d/%2d:%02d:%02d|%2d:%02d:%02d/%2d:%02d:%02d|%10.4f|%2d:%02d:%02d ", |
| frameNum, |
| totalframes - 1, |
| percent, |
| TS_TIME_DECOMPOSE(process_time.so_far), |
| TS_TIME_DECOMPOSE(process_time.estimated), |
| TS_TIME_DECOMPOSE(real_time.so_far), |
| TS_TIME_DECOMPOSE(real_time.estimated), |
| process_time.speed, |
| TS_TIME_DECOMPOSE(real_time.eta) |
| ); |
| |
| fflush(stderr); |
| } |
| |