annotate libaf/af_stats.c @ 33263:5f527a9a9521

Add an exit function. This function will allow performing clean-up operations. (MPlayer calls guiDone() before exiting, but only if the GUI has been initialized, i.e. if guiInit() has been called successfully. Any exit_player()/exit_player_with_rc() after GUI's cfg_read() until guiInit(), or any exit_player() during guiInit() itself will end the GUI without calling guiDone(). This exit function will at least handle abortions during guiInit() itself. It will be called twice in case of an guiExit() after GUI initialization - first directly, next by guiDone() via MPlayer's exit_player_with_rc().)
author ib
date Tue, 03 May 2011 12:19:22 +0000
parents 8e9f6dfd7580
children a93891202051
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
1 /*
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
2 * Copyright (C) 2009 Nicolas George <nicolas.george@normalesup.org>
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
3 *
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
4 * This file is part of MPlayer.
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
5 *
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
9 * (at your option) any later version.
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
10 *
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
14 * GNU General Public License for more details.
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
15 *
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License along
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
19 */
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
20
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
21 #include <stdio.h>
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
22 #include <stdlib.h>
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
23 #include <inttypes.h>
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
24 #include <math.h>
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
25
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
26 #include "af.h"
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
27
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
28 #define MAX_DB 80
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
29 #define MIN_VAL 1E-8
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
30
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
31 struct af_stats {
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
32 long long n_samples;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
33 double tsquare;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
34 int max;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
35 long long histogram[65536];
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
36 };
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
37
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
38 static inline int logdb(double v)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
39 {
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
40 if (v > 1)
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
41 return 0;
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
42 if (v <= MIN_VAL)
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
43 return MAX_DB - 1;
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
44 return log(v) / -0.23025850929940456840179914546843642076;
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
45 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
46
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
47 static int stats_init(af_instance_t *af, struct af_stats *s, af_data_t *data)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
48 {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
49 int i;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
50
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
51 if (!data)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
52 return AF_ERROR;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
53 *(af->data) = *data;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
54 af->data->format = AF_FORMAT_S16_NE;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
55 af->data->bps = 2;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
56 s->n_samples = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
57 s->tsquare = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
58 s->max = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
59 for (i = 0; i < 65536; i++)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
60 s->histogram[i] = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
61 return af_test_output(af, data);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
62 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
63
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
64 static void stats_print(struct af_stats *s)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
65 {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
66 int i;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
67 long long sum;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
68 float v;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
69 long long h[MAX_DB];
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
70
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
71 s->tsquare /= 32768 * 32768;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
72 mp_msg(MSGT_AFILTER, MSGL_INFO, "stats: n_samples: %lld\n", s->n_samples);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
73 if (s->n_samples == 0)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
74 return;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
75 mp_msg(MSGT_AFILTER, MSGL_INFO, "stats: mean_volume: -%d dB\n",
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
76 logdb(s->tsquare / s->n_samples));
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
77 mp_msg(MSGT_AFILTER, MSGL_INFO, "stats: max_volume: -%d dB\n",
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
78 logdb(s->max / (32768.0 * 32768.0)));
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
79 for (i = 0; i < MAX_DB; i++)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
80 h[i] = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
81 for (i = 0; i < 65536; i++) {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
82 v = (i - 32768) / 32768.0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
83 h[logdb(v * v)] += s->histogram[i];
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
84 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
85 for (i = 0; i < MAX_DB; i++)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
86 if (h[i] != 0)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
87 break;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
88 sum = 0;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
89 for (; i < MAX_DB; i++) {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
90 sum += h[i];
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
91 mp_msg(MSGT_AFILTER, MSGL_INFO, "stats: histogram_%ddb: %lld\n",
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
92 i, h[i]);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
93 if (sum > s->n_samples / 1000)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
94 break;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
95 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
96 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
97
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
98 static int control(struct af_instance_s *af, int cmd, void *arg)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
99 {
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
100 struct af_stats *s = af->setup;
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
101
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
102 switch(cmd) {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
103 case AF_CONTROL_REINIT:
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
104 return stats_init(af, s, arg);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
105
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
106 case AF_CONTROL_PRE_DESTROY:
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
107 stats_print(s);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
108 return AF_OK;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
109 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
110 return AF_UNKNOWN;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
111 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
112
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
113 static void uninit(struct af_instance_s *af)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
114 {
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
115 free(af->data);
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
116 free(af->setup);
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
117 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
118
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
119 static af_data_t *play(struct af_instance_s *af, af_data_t *data)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
120 {
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
121 struct af_stats *s = af->setup;
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
122 int16_t *a, *aend;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
123 int v, v2;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
124
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
125 a = data->audio;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
126 aend = (int16_t *)((char *)data->audio + data->len);
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
127 s->n_samples += aend - a;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
128 for (; a < aend; a++) {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
129 v = *a;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
130 v2 = v * v;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
131 s->tsquare += v2;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
132 s->histogram[v + 32768]++;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
133 if (v2 > s->max)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
134 s->max = v2;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
135 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
136 return data;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
137 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
138
28663
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
139 static int af_open(af_instance_t *af)
8e9f6dfd7580 af_stats: Some fixes to the new filter
uau
parents: 28661
diff changeset
140 {
28661
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
141 af->control = control;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
142 af->uninit = uninit;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
143 af->play = play;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
144 af->mul = 1;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
145 af->data = malloc(sizeof(af_data_t));
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
146 af->setup = malloc(sizeof(struct af_stats));
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
147 if (af->data == NULL || af->setup == NULL)
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
148 return AF_ERROR;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
149 return AF_OK;
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
150 }
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
151
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
152 af_info_t af_info_stats = {
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
153 "Statistics audio filter",
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
154 "stats",
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
155 "Nicolas George",
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
156 "",
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
157 0,
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
158 af_open
20787bd5c506 Add statistics audio filter that prints information about the audio stream.
diego
parents:
diff changeset
159 };