📄 timestatus.c
字号:
/* * time status related function source file * * Copyright (c) 1999 Mark Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* $Id: timestatus.c,v 1.40 2005/02/25 01:21:54 robert Exp $ */#ifdef HAVE_CONFIG_H# include <config.h>#endif/* Hope it works now, otherwise complain or flame ;-) */#if 1# define SPEED_CHAR "x" /* character x */# define SPEED_MULT 1.#else# define SPEED_CHAR "%%"# define SPEED_MULT 100.#endif#include <assert.h>#include <time.h>#include "lame.h"#include "main.h"#include "lametime.h"#include "timestatus.h"#if defined(BRHIST)# include "brhist.h"#endif#ifdef WITH_DMALLOC#include <dmalloc.h>#endiftypedef struct { double last_time; /* result of last call to clock */ double elapsed_time; /* total time */ double estimated_time; /* estimated total duration time [s] */ double speed_index; /* speed relative to realtime coding [100%] */} timestatus_t;/* * Calculates from the input (see below) the following values: * - total estimated time * - a speed index */static voidts_calc_times(timestatus_t * const tstime, /* tstime->elapsed_time: elapsed time */ const int sample_freq, /* sample frequency [Hz/kHz] */ const int frameNum, /* Number of the current Frame */ const int totalframes, /* total umber of Frames */ const int framesize){ /* Size of a frame [bps/kbps] */ assert(sample_freq >= 8000 && sample_freq <= 48000); if (frameNum > 0 && tstime->elapsed_time > 0) { tstime->estimated_time = tstime->elapsed_time * totalframes / frameNum; tstime->speed_index = framesize * frameNum / (sample_freq * tstime->elapsed_time); } else { tstime->estimated_time = 0.; tstime->speed_index = 0.; }}/* Decomposes a given number of seconds into a easy to read hh:mm:ss format * padded with an additional character */static voidts_time_decompose(const unsigned long time_in_sec, const char padded_char){ const unsigned long hour = time_in_sec / 3600; const unsigned int min = time_in_sec / 60 % 60; const unsigned int sec = time_in_sec % 60; if (hour == 0) fprintf(stderr, " %2u:%02u%c", min, sec, padded_char); else if (hour < 100) fprintf(stderr, "%2lu:%02u:%02u%c", hour, min, sec, padded_char); else fprintf(stderr, "%6lu h%c", hour, padded_char);}voidtimestatus(int samp_rate, int frameNum, int totalframes, int framesize){ static timestatus_t real_time; static timestatus_t proc_time; int percent; static int init = 0; /* What happens here? A work around instead of a bug fix ??? */ double tmx, delta; if (totalframes < frameNum) { totalframes = frameNum; } if (frameNum == 0) { real_time.last_time = GetRealTime(); proc_time.last_time = GetCPUTime(); real_time.elapsed_time = 0; proc_time.elapsed_time = 0; } /* we need rollover protection for GetCPUTime, and maybe GetRealTime(): */ tmx = GetRealTime(); delta = tmx - real_time.last_time; if (delta < 0) delta = 0; /* ignore, clock has rolled over */ real_time.elapsed_time += delta; real_time.last_time = tmx; tmx = GetCPUTime(); delta = tmx - proc_time.last_time; if (delta < 0) delta = 0; /* ignore, clock has rolled over */ proc_time.elapsed_time += delta; proc_time.last_time = tmx; if (frameNum == 0 && init == 0) { fprintf(stderr, "\r" " Frame | CPU time/estim | REAL time/estim | play/CPU | ETA \n" " 0/ ( 0%%)| 0:00/ : | 0:00/ : | " SPEED_CHAR "| : \r" /* , Console_IO.str_clreoln, Console_IO.str_clreoln */ ); init = 1; return; } /* reset init counter for next time we are called with frameNum==0 */ if (frameNum > 0) init = 0; ts_calc_times(&real_time, samp_rate, frameNum, totalframes, framesize); ts_calc_times(&proc_time, samp_rate, frameNum, totalframes, framesize); if (frameNum < totalframes) { percent = (int) (100. * frameNum / totalframes + 0.5); } else { percent = 100; } fprintf(stderr, "\r%6i/%-6i", frameNum, totalframes); fprintf(stderr, percent < 100 ? " (%2d%%)|" : "(%3.3d%%)|", percent); ts_time_decompose((unsigned long) proc_time.elapsed_time, '/'); ts_time_decompose((unsigned long) proc_time.estimated_time, '|'); ts_time_decompose((unsigned long) real_time.elapsed_time, '/'); ts_time_decompose((unsigned long) real_time.estimated_time, '|'); fprintf(stderr, proc_time.speed_index <= 1. ? "%9.4f" SPEED_CHAR "|" : "%#9.5g" SPEED_CHAR "|", SPEED_MULT * proc_time.speed_index); ts_time_decompose((unsigned long) (real_time.estimated_time - real_time.elapsed_time), ' '); fflush(stderr);}voidtimestatus_finish(void){ fprintf(stderr, "\n"); fflush(stderr);}voidtimestatus_klemm(const lame_global_flags * const gfp){ static double last_time = 0.; if (silent <= 0) if (lame_get_frameNum(gfp) == 0 || lame_get_frameNum(gfp) == 9 || GetRealTime() - last_time >= update_interval || GetRealTime() - last_time < 0) {#ifdef BRHIST brhist_jump_back();#endif timestatus(lame_get_out_samplerate(gfp), lame_get_frameNum(gfp), lame_get_totalframes(gfp), lame_get_framesize(gfp));#ifdef BRHIST if (brhist) { brhist_disp(gfp); }#endif last_time = GetRealTime(); /* from now! disp_time seconds */ }}/* these functions are used in get_audio.c */voiddecoder_progress(const lame_global_flags * const gfp, const mp3data_struct * const mp3data){ static int last; fprintf(stderr, "\rFrame#%6i/%-6i %3i kbps", mp3data->framenum, mp3data->totalframes, mp3data->bitrate); /* Programmed with a single frame hold delay */ /* Attention: static data */ /* MP2 Playback is still buggy. */ /* "'00' subbands 4-31 in intensity_stereo, bound==4" */ /* is this really intensity_stereo or is it MS stereo? */ if (mp3data->mode == JOINT_STEREO) { int curr = mp3data->mode_ext; fprintf(stderr, " %s %c", curr & 2 ? last & 2 ? " MS " : "LMSR" : last & 2 ? "LMSR" : "L R", curr & 1 ? last & 1 ? 'I' : 'i' : last & 1 ? 'i' : ' '); last = curr; } else { fprintf(stderr, " "); last = 0; }/* fprintf ( stderr, "%s", Console_IO.str_clreoln ); */ fprintf(stderr, " \b\b\b\b\b\b\b\b"); fflush(stderr);}voiddecoder_progress_finish(const lame_global_flags * const gfp){ fprintf(stderr, "\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -