New upstream version 1.0.0
[fdkaac.git] / src / progress.c
1 /*
2 * Copyright (C) 2013 nu774
3 * For conditions of distribution and use, see copyright notice in COPYING
4 */
5 #if HAVE_CONFIG_H
6 # include "config.h"
7 #endif
8 #include <stdio.h>
9 #include <limits.h>
10 #include <float.h>
11 #include <time.h>
12 #if HAVE_STDINT_H
13 # include <stdint.h>
14 #endif
15 #if HAVE_INTTYPES_H
16 # include <inttypes.h>
17 #elif defined _MSC_VER
18 # define PRId64 "I64d"
19 #endif
20 #include "compat.h"
21 #include "progress.h"
22
23 static
24 void seconds_to_hms(double seconds, int *h, int *m, int *s, int *millis)
25 {
26 *h = (int)(seconds / 3600.0);
27 seconds -= *h * 3600;
28 *m = (int)(seconds / 60.0);
29 seconds -= *m * 60;
30 *s = (int)seconds;
31 *millis = (int)((seconds - *s) * 1000.0 + 0.5);
32 }
33
34 static
35 void print_seconds(FILE *fp, double seconds)
36 {
37 int h, m, s, millis;
38 seconds_to_hms(seconds, &h, &m, &s, &millis);
39 if (h)
40 fprintf(stderr, "%d:%02d:%02d.%03d", h, m, s, millis);
41 else
42 fprintf(stderr, "%02d:%02d.%03d", m, s, millis);
43 }
44
45 void aacenc_progress_init(aacenc_progress_t *progress, int64_t total,
46 int32_t timescale)
47 {
48 progress->start = aacenc_timer();
49 progress->timescale = timescale;
50 progress->total = total;
51 }
52
53 void aacenc_progress_update(aacenc_progress_t *progress, int64_t current,
54 int period)
55 {
56 double seconds = current / progress->timescale;
57 double ellapsed = (aacenc_timer() - progress->start) / 1000.0;
58 double speed = ellapsed ? seconds / ellapsed : 1.0;
59 int percent = progress->total ? 100.0 * current / progress->total + .5
60 : 100;
61 double eta = current ? ellapsed * (progress->total / (double)current - 1.0)
62 : progress->total ? DBL_MAX : 0;
63
64 if (current < progress->processed + period)
65 return;
66
67 if (progress->total == INT64_MAX) {
68 putc('\r', stderr);
69 print_seconds(stderr, seconds);
70 fprintf(stderr, " (%.0fx) ", speed);
71 } else {
72 fprintf(stderr, "\r[%d%%] ", percent);
73 print_seconds(stderr, seconds);
74 putc('/', stderr);
75 print_seconds(stderr, progress->total / progress->timescale);
76 fprintf(stderr, " (%.0fx), ETA ", speed);
77 print_seconds(stderr, eta);
78 fputs(" ", stderr);
79 }
80 progress->processed = current;
81 }
82
83 void aacenc_progress_finish(aacenc_progress_t *progress, int64_t current)
84 {
85 double ellapsed = (aacenc_timer() - progress->start) / 1000.0;
86 aacenc_progress_update(progress, current, 0);
87 if (progress->total == INT64_MAX)
88 fprintf(stderr, "\n%" PRId64 " samples processed in ", current);
89 else
90 fprintf(stderr, "\n%" PRId64 "/%" PRId64 " samples processed in ",
91 current, progress->total);
92 print_seconds(stderr, ellapsed);
93 putc('\n', stderr);
94 }
This page took 0.025072 seconds and 4 git commands to generate.