" gl_FragColor = texture2D(cbcr_tex, tc0); \n"
"} \n";
cbcr_program_num = resource_pool->compile_glsl_program(cbcr_vert_shader, cbcr_frag_shader);
+
+ r128_state = ebur128_init(2, 48000, EBUR128_MODE_TRUE_PEAK | EBUR128_MODE_M | EBUR128_MODE_S | EBUR128_MODE_I | EBUR128_MODE_LRA);
}
Mixer::~Mixer()
}
cards[card_index].usb->stop_dequeue_thread();
}
+
+ ebur128_destroy(&r128_state);
}
namespace {
}
}
if (card_index == 0) {
+ ebur128_add_frames_float(r128_state, samples_out.data(), samples_out.size() / 2);
h264_encoder->add_audio(pts_int, move(samples_out));
}
}
}
}
+ if (audio_level_callback != nullptr) {
+ double loudness_s, loudness_i, peak_level_l, peak_level_r;
+ double lra;
+ ebur128_loudness_shortterm(r128_state, &loudness_s);
+ ebur128_loudness_global(r128_state, &loudness_i);
+ ebur128_loudness_range(r128_state, &lra);
+ ebur128_true_peak(r128_state, 0, &peak_level_l);
+ ebur128_true_peak(r128_state, 1, &peak_level_r);
+
+ // FIXME: This is wrong. We need proper support from libebur128 for this.
+ double loudness_range_low = loudness_i - 0.5 * lra;
+ double loudness_range_high = loudness_i + 0.5 * lra;
+
+ audio_level_callback(loudness_s, 20.0 * log10(max(peak_level_l, peak_level_r)),
+ loudness_i, loudness_range_low, loudness_range_high);
+ }
+
// If the first card is reporting a corrupted or otherwise dropped frame,
// just increase the pts (skipping over this frame) and don't try to compute anything new.
if (card_copy[0].new_frame->len == 0) {