www.pudn.com > lame3(mp3编码程序和资料).zip > brhist.c
#include#include "brhist.h" #include "util.h" #if (defined(BRHIST) && !defined(NOTERMCAP)) #include #endif #define BRHIST_BARMAX 50 long brhist_count[15]; int brhist_vbrmin; int brhist_vbrmax; long brhist_max; char brhist_bps[15][5]; char brhist_backcur[200]; char brhist_bar[BRHIST_BARMAX+10]; char brhist_spc[BRHIST_BARMAX+1]; char stderr_buff[BUFSIZ]; #ifdef _WIN32 COORD Pos; HANDLE CH; CONSOLE_SCREEN_BUFFER_INFO CSBI; #endif #ifdef NOTERMCAP /* tgetstr */ char * tgetstr(char id[2], char **area) { char *result; result = NULL; if (strncmp(id, "up", 2) == 0) { result = "\033[A"; } *area = result; return result; } #endif /* NOTERMCAP */ void brhist_init(lame_global_flags *gfp,int br_min, int br_max) { int i; char term_buff[1024]; char *termname; char *tp; char tc[10]; for(i = 0; i < 15; i++) { sprintf(brhist_bps[i], "%3d", bitrate_table[gfp->version][i]); brhist_count[i] = 0; } brhist_vbrmin = br_min; brhist_vbrmax = br_max; brhist_max = 0; #ifdef BRHIST memset(&brhist_bar[0], '*', BRHIST_BARMAX); brhist_bar[BRHIST_BARMAX] = '\0'; memset(&brhist_spc[0], ' ', BRHIST_BARMAX); brhist_spc[BRHIST_BARMAX] = '\0'; brhist_backcur[0] = '\0'; #ifndef NOTERMCAP if ((termname = getenv("TERM")) == NULL) { ERRORF("can't get TERM environment string.\n"); gfp->brhist_disp = 0; return; } if (tgetent(term_buff, termname) != 1) { ERRORF("can't find termcap entry: %s\n", termname); gfp->brhist_disp = 0; return; } #endif /* !NOTERMCAP */ tc[0] = '\0'; tp = &tc[0]; tp=tgetstr("up", &tp); brhist_backcur[0] = '\0'; #ifdef _WIN32 CH= GetStdHandle(STD_ERROR_HANDLE); #else for(i = br_min-1; i <= br_max; i++) strcat(brhist_backcur, tp); setbuf(stderr, stderr_buff); #endif #endif } void brhist_add_count(int i) { ++brhist_count[i]; if (brhist_count[i] > brhist_max) brhist_max = brhist_count[i]; } void brhist_disp(long totalframes) { int i; long full; int barlen; char brpercent[10]; #ifdef BRHIST full = (brhist_max < BRHIST_BARMAX) ? BRHIST_BARMAX : brhist_max; fputc('\n', stderr); for(i = brhist_vbrmin; i <= brhist_vbrmax; i++) { barlen = (brhist_count[i]*BRHIST_BARMAX+full-1) / full; fputs(brhist_bps[i], stderr); sprintf(brpercent,"[%3i%%]",(int)(100*brhist_count[i]/totalframes)); fputs(brpercent, stderr); fputs(&brhist_bar[BRHIST_BARMAX - barlen], stderr); fputs(&brhist_spc[barlen], stderr); fputc('\n', stderr); } #ifdef _WIN32 //fflush is not needed if(GetFileType(CH)!= FILE_TYPE_PIPE) { GetConsoleScreenBufferInfo(CH, &CSBI); Pos.Y= CSBI.dwCursorPosition.Y-(brhist_vbrmax- brhist_vbrmin)- 2; Pos.X= 0; SetConsoleCursorPosition(CH, Pos); } #else fputs(brhist_backcur, stderr); fflush(stderr); #endif #endif } void brhist_disp_total(lame_global_flags *gfp) { int i; FLOAT ave; /* lame_internal_flags *gfc=gfp->internal_flags;*/ #ifdef BRHIST for(i = brhist_vbrmin; i <= brhist_vbrmax; i++) fputc('\n', stderr); #else fprintf(stderr, "\n----- bitrate statistics -----\n"); fprintf(stderr, " [kbps] frames\n"); for(i = brhist_vbrmin; i <= brhist_vbrmax; i++) { fprintf(stderr, " %3d %8ld (%.1f%%)\n", bitrate_table[gfp->version][i], brhist_count[i], (FLOAT)brhist_count[i] / gfp->totalframes * 100.0); } #endif ave=0; for(i = brhist_vbrmin; i <= brhist_vbrmax; i++) ave += bitrate_table[gfp->version][i]* (FLOAT)brhist_count[i] / gfp->totalframes; fprintf(stderr, "\naverage: %2.0f kbs\n",ave); fflush(stderr); }