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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1.  /******************************************************************************
  2.   *                                                                            *
  3.   *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *
  4.   *                                                                            *
  5.   *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *
  6.   *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  7.   *  software module in hardware or software products are advised that its     *
  8.   *  use may infringe existing patents or copyrights, and any such use         *
  9.   *  would be at such party's own risk.  The original developer of this        *
  10.   *  software module and his/her company, and subsequent editors and their     *
  11.   *  companies, will have no liability for use of this software or             *
  12.   *  modifications or derivatives thereof.                                     *
  13.   *                                                                            *
  14.   *  XviD is free software; you can redistribute it and/or modify it           *
  15.   *  under the terms of the GNU General Public License as published by         *
  16.   *  the Free Software Foundation; either version 2 of the License, or         *
  17.   *  (at your option) any later version.                                       *
  18.   *                                                                            *
  19.   *  XviD is distributed in the hope that it will be useful, but               *
  20.   *  WITHOUT ANY WARRANTY; without even the implied warranty of                *
  21.   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
  22.   *  GNU General Public License for more details.                              *
  23.   *                                                                            *
  24.   *  You should have received a copy of the GNU General Public License         *
  25.   *  along with this program; if not, write to the Free Software               *
  26.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *
  27.   *                                                                            *
  28.   ******************************************************************************/
  29.  /******************************************************************************
  30.   *                                                                            *
  31.   *  timer.c, some timing functions                                            *
  32.   *                                                                            *
  33.   *  Copyright (C) 2001 - Michael Militzer <isibaar@xvid.org>                  *
  34.   *                                                                            *
  35.   *  For more information visit the XviD homepage: http://www.xvid.org         *
  36.   *                                                                            *
  37.   ******************************************************************************/
  38.  /******************************************************************************
  39.   *                                                                            *
  40.   *  Revision history:                                                         *
  41.   *       
  42.   *  26.03.2002 interlacing timer added
  43.   *  21.12.2001 edges error fixed
  44.   *  17.11.2001 small clean up (Isibaar)                                       *
  45.   *  13.11.2001 inlined rdtsc call and moved to portab.h (Isibaar)             *
  46.   *  02.11.2001 initial version (Isibaar)                                      *
  47.   *                                                                            *
  48.   ******************************************************************************/
  49. #include <stdio.h>
  50. #include <time.h>
  51. #include "timer.h"
  52. #if defined(_PROFILING_)
  53. struct ts {
  54. int64_t current;
  55. int64_t global;
  56. int64_t overall;
  57. int64_t dct;
  58. int64_t idct;
  59. int64_t quant;
  60. int64_t iquant;
  61. int64_t motion;
  62. int64_t comp;
  63. int64_t edges;
  64. int64_t inter;
  65. int64_t conv;
  66. int64_t trans;
  67. int64_t prediction;
  68. int64_t coding;
  69. int64_t interlacing;
  70. };
  71. struct ts tim;
  72. double frequency = 0.0;
  73. /* 
  74.     determine cpu frequency
  75. not very precise but sufficient
  76. */
  77. double get_freq() {
  78.     int64_t x,y;
  79.     int32_t i;
  80. i = time(NULL);
  81.     while(i == time(NULL));
  82.     
  83. x = read_counter();
  84.     i++;
  85.     while(i == time(NULL));
  86.     y = read_counter();
  87.     return (double) (y - x) / 1000.;
  88. }
  89. // set everything to zero //
  90. void init_timer() {
  91. frequency = get_freq();
  92. count_frames = 0;
  93.     tim.dct = tim.quant = tim.idct = tim.iquant =
  94. tim.motion = tim.conv = tim.edges = tim.inter = tim.interlacing =
  95. tim.trans = tim.trans = tim.coding = tim.global = tim.overall = 0;
  96. }
  97. void start_timer() {
  98.     tim.current = read_counter();
  99. }
  100. void start_global_timer() {
  101. tim.global = read_counter();
  102. }
  103. void stop_dct_timer() {
  104.     tim.dct += (read_counter() - tim.current);
  105. }
  106. void stop_idct_timer() {
  107.     tim.idct += (read_counter() - tim.current);
  108. }
  109. void stop_quant_timer() {
  110.     tim.quant += (read_counter() - tim.current);
  111. }
  112. void stop_iquant_timer() {
  113.     tim.iquant += (read_counter() - tim.current);
  114. }
  115. void stop_motion_timer() {
  116.     tim.motion += (read_counter() - tim.current);
  117. }
  118. void stop_comp_timer() {
  119. tim.comp += (read_counter() - tim.current);
  120. }
  121. void stop_edges_timer() {
  122.     tim.edges += (read_counter() - tim.current);
  123. }
  124. void stop_inter_timer() {
  125.     tim.inter += (read_counter() - tim.current);
  126. }
  127. void stop_conv_timer() {
  128.     tim.conv += (read_counter() - tim.current);
  129. }
  130. void stop_transfer_timer() {
  131.     tim.trans += (read_counter() - tim.current);
  132. }
  133. void stop_prediction_timer() {
  134.     tim.prediction += (read_counter() - tim.current);
  135. }
  136. void stop_coding_timer() {
  137.     tim.coding += (read_counter() - tim.current);
  138. }
  139. void stop_interlacing_timer() {
  140. tim.interlacing += (read_counter() - tim.current);
  141. }
  142. void stop_global_timer() {
  143.     tim.overall += (read_counter() - tim.global);
  144. }
  145. /*
  146.     write log file with some timer information
  147. */
  148. void write_timer() {
  149. float dct_per, quant_per, idct_per, iquant_per, mot_per, comp_per, interlacing_per;
  150. float edges_per, inter_per, conv_per, trans_per, pred_per, cod_per, measured;
  151. int64_t sum_ticks = 0;
  152. count_frames++;
  153. // only write log file every 50 processed frames //
  154. if(count_frames % 50) {
  155. FILE *fp;
  156. fp = fopen("encoder.log", "w+");
  157. dct_per = (float) (((float) ((float) tim.dct / (float) tim.overall)) * 100.0);
  158. quant_per = (float) (((float) ((float) tim.quant / (float) tim.overall)) * 100.0);
  159. idct_per = (float) (((float) ((float) tim.idct / (float) tim.overall)) * 100.0);
  160. iquant_per = (float) (((float) ((float) tim.iquant / (float) tim.overall)) * 100.0);
  161. mot_per = (float) (((float) ((float) tim.motion / (float) tim.overall)) * 100.0);
  162. comp_per = (float) (((float) ((float) tim.comp / (float) tim.overall)) * 100.0);
  163. edges_per = (float) (((float) ((float) tim.edges / (float) tim.overall)) * 100.0);
  164. inter_per = (float) (((float) ((float) tim.inter / (float) tim.overall)) * 100.0);
  165. conv_per = (float) (((float) ((float) tim.conv / (float) tim.overall)) * 100.0);
  166. trans_per = (float) (((float) ((float) tim.trans / (float) tim.overall)) * 100.0);
  167. pred_per = (float) (((float) ((float) tim.prediction / (float) tim.overall)) * 100.0);
  168. cod_per = (float) (((float) ((float) tim.coding / (float) tim.overall)) * 100.0);
  169. interlacing_per = (float) (((float) ((float) tim.interlacing / (float) tim.overall)) * 100.0);
  170. sum_ticks = tim.coding + tim.conv + tim.dct + tim.idct + tim.interlacing +
  171. tim.edges + tim.inter + tim.iquant + tim.motion + tim.trans + tim.quant + tim.trans;
  172. measured = (float) (((float) ((float) sum_ticks / (float) tim.overall)) * 100.0);
  173. fprintf(fp, "DCT:nTotal time: %f ms (%3f percent of total encoding time)nn"
  174. "Quant:nTotal time: %f ms (%3f percent of total encoding time)nn"
  175. "IDCT:nTotal time: %f ms (%3f percent of total encoding time)nn"
  176. "IQuant:nTotal time: %f ms (%3f percent of total encoding time)nn"
  177. "Mot estimation:nTotal time: %f ms (%3f percent of total encoding time)nn"
  178. "Mot compensation:nTotal time: %f ms (%3f percent of total encoding time)nn"
  179. "Edges:nTotal time: %f ms (%3f percent of total encoding time)nn"
  180. "Interpolation:nTotal time: %f ms (%3f percent of total encoding time)nn"
  181. "RGB2YUV:nTotal time: %f ms (%3f percent of total encoding time)nn"
  182. "Transfer:nTotal time: %f ms (%3f percent of total encoding time)nn"
  183. "Prediction:nTotal time: %f ms (%3f percent of total encoding time)nn"
  184. "Coding:nTotal time: %f ms (%3f percent of total encoding time)nnn"
  185. "Interlacing:nTotal time: %f ms (%3f percent of total encoding time)nnn"
  186. "Overall encoding time: %f ms, we measured %f ms (%3f percent)n",
  187. (float) (tim.dct / frequency), dct_per,
  188. (float) (tim.quant / frequency), quant_per,
  189. (float) (tim.idct / frequency), idct_per,
  190. (float) (tim.iquant / frequency), iquant_per,
  191. (float) (tim.motion / frequency), mot_per,
  192. (float) (tim.comp / frequency), comp_per,
  193. (float) (tim.edges / frequency), edges_per,
  194. (float) (tim.inter / frequency), inter_per,
  195. (float) (tim.conv / frequency), conv_per,
  196. (float) (tim.trans / frequency), trans_per,
  197. (float) (tim.prediction / frequency), pred_per,
  198. (float) (tim.coding / frequency), cod_per,
  199. (float) (tim.interlacing / frequency), interlacing_per,
  200. (float) (tim.overall / frequency), (float) (sum_ticks / frequency), measured); 
  201. fclose(fp);
  202. }
  203. }
  204. #endif