timestatus.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "timestatus.h"
  2. #include "util.h"
  3. #include <time.h>
  4. #if defined(CLOCKS_PER_SEC)
  5. /* ANSI/ISO systems */
  6. # define TS_CLOCKS_PER_SEC CLOCKS_PER_SEC
  7. #elif defined(CLK_TCK)
  8. /* Non-standard systems */
  9. # define TS_CLOCKS_PER_SEC CLK_TCK
  10. #elif defined(HZ)
  11. /* Older BSD systems */
  12. # define TS_CLOCKS_PER_SEC HZ
  13. #else
  14. # error no suitable value for TS_CLOCKS_PER_SEC
  15. #endif
  16. /*********************************************************/
  17. /* ts_real_time: real time elapsed in seconds            */
  18. /*********************************************************/
  19. FLOAT ts_real_time(long frame) {
  20.   static time_t initial_time;
  21.   time_t current_time;
  22.   time(&current_time);
  23.   if (frame==0) {
  24.     initial_time = current_time;
  25.   }
  26.   return (FLOAT) difftime(current_time, initial_time);
  27. }
  28. /*********************************************************/
  29. /* ts_process_time: process time elapsed in seconds      */
  30. /*********************************************************/
  31. FLOAT ts_process_time(long frame) {
  32.   static clock_t initial_time;
  33.   clock_t current_time;
  34. #if ( defined(_MSC_VER) || defined(__BORLANDC__) ) 
  35.   { static HANDLE hProcess;
  36.     FILETIME Ignored1, Ignored2, KernelTime, UserTime;
  37.     if ( frame==0 ) {
  38.       hProcess = GetCurrentProcess();
  39.     }
  40.         
  41.     /* GetProcessTimes() always fails under Win9x */
  42.     if (GetProcessTimes(hProcess, &Ignored1, &Ignored2, &KernelTime, &UserTime)) {
  43.       LARGE_INTEGER Kernel = { KernelTime.dwLowDateTime, KernelTime.dwHighDateTime };
  44.       LARGE_INTEGER User = { UserTime.dwLowDateTime, UserTime.dwHighDateTime };
  45.       current_time = (clock_t)((FLOAT)(Kernel.QuadPart + User.QuadPart) * TS_CLOCKS_PER_SEC / 10000000);
  46.     } else {
  47.       current_time = clock();
  48. }
  49.   }
  50. #else
  51.   current_time = clock();
  52. #endif
  53.   if (frame==0) {
  54.     initial_time = current_time;
  55.   }
  56.   return (FLOAT)(current_time - initial_time) / TS_CLOCKS_PER_SEC;
  57. }
  58. #undef TS_CLOCKS_PER_SEC
  59. typedef struct ts_times {
  60.   FLOAT so_far;
  61.   FLOAT estimated;
  62.   FLOAT speed;
  63.   FLOAT eta;
  64. } ts_times;
  65. /*********************************************************/
  66. /* ts_calc_times: calculate time info (eta, speed, etc.) */
  67. /*********************************************************/
  68. void ts_calc_times(ts_times *time, int samp_rate, long frame, long frames,int framesize)
  69. {
  70.   if (frame > 0) {
  71.     time->estimated = time->so_far * frames / frame;
  72.     if (samp_rate * time->estimated > 0) {
  73.       time->speed = frames * framesize / (samp_rate * time->estimated);
  74.     } else {
  75.       time->speed = 0;
  76.     }
  77.     time->eta = time->estimated - time->so_far;
  78.   } else {
  79.     time->estimated = 0;
  80. time->speed = 0;
  81. time->eta = 0;
  82.   }
  83. }
  84. /*********************************************************/
  85. /* timestatus: display encoding process time information */
  86. /*********************************************************/
  87. void timestatus(int samp_rate,long frameNum,long totalframes,int framesize)
  88. {
  89.   ts_times real_time, process_time;
  90.   int percent;
  91.   real_time.so_far = ts_real_time(frameNum);
  92.   process_time.so_far = ts_process_time(frameNum);
  93.   if (frameNum == 0) {
  94.     fprintf(stderr, "    Frame          |  CPU/estimated  |  time/estimated | play/CPU |   ETAn");
  95.     return;
  96.   }  
  97.   ts_calc_times(&real_time, samp_rate, frameNum, totalframes, framesize);
  98.   ts_calc_times(&process_time, samp_rate, frameNum, totalframes, framesize);
  99.   if (totalframes > 1) {
  100.     percent = (int)(100.0 * frameNum / (totalframes - 1));
  101.   } else {
  102.     percent = 100;
  103.   }
  104. #  define TS_TIME_DECOMPOSE(time) 
  105.     (int)((long)(time+.5) / 3600), 
  106.     (int)((long)((time+.5) / 60) % 60), 
  107.     (int)((long)(time+.5) % 60)
  108.   fprintf(stderr,
  109.     "r%6ld/%6ld(%3d%%)|%2d:%02d:%02d/%2d:%02d:%02d|%2d:%02d:%02d/%2d:%02d:%02d|%10.4f|%2d:%02d:%02d ",
  110.     frameNum,
  111.     totalframes - 1,
  112.     percent,
  113.     TS_TIME_DECOMPOSE(process_time.so_far),
  114.     TS_TIME_DECOMPOSE(process_time.estimated),
  115.     TS_TIME_DECOMPOSE(real_time.so_far),
  116. TS_TIME_DECOMPOSE(real_time.estimated),
  117.     process_time.speed,
  118.     TS_TIME_DECOMPOSE(real_time.eta)
  119.   );
  120.   fflush(stderr);
  121. }