+ drop = p->win_samples[p->win_pos];
+ p->win_samples[p->win_pos] = nd;
+ index = av_clip(FFABS(nd) * HISTOGRAM_MAX, 0, HISTOGRAM_MAX);
+ p->max_index = FFMAX(p->max_index, index);
+ p->histogram[index]++;
+ if (!isnan(p->noise_floor))
+ p->histogram[av_clip(FFABS(drop) * HISTOGRAM_MAX, 0, HISTOGRAM_MAX)]--;
+ p->win_pos++;
+
+ while (p->histogram[p->max_index] == 0)
+ p->max_index--;
+ if (p->win_pos >= s->tc_samples || !isnan(p->noise_floor)) {
+ double noise_floor = 1.;
+
+ for (int i = p->max_index; i >= 0; i--) {
+ if (p->histogram[i]) {
+ noise_floor = i / (double)HISTOGRAM_MAX;
+ break;
+ }
+ }
+
+ if (isnan(p->noise_floor)) {
+ p->noise_floor = noise_floor;
+ p->noise_floor_count = 1;
+ } else {
+ if (noise_floor < p->noise_floor) {
+ p->noise_floor = noise_floor;
+ p->noise_floor_count = 1;
+ } else if (noise_floor == p->noise_floor) {
+ p->noise_floor_count++;
+ }
+ }
+ }
+
+ if (p->win_pos >= s->tc_samples) {
+ p->win_pos = 0;
+ }
+