X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fanalyse_audio_job.cc;h=6ba6b5ecfe62999243f84f4b1516bafcaccb49c7;hp=9d0882b3ad22b3061f243d53ae78f91146042d3d;hb=c04fec82d25127fafa73c3daff87bece9aa8c8e8;hpb=c4403784febdbdd42e9c32e67fadb147f11fe566 diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index 9d0882b3a..6ba6b5ecf 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -23,6 +23,7 @@ #include "analyse_audio_job.h" #include "audio_content.h" #include "compose.hpp" +#include "dcpomatic_log.h" #include "film.h" #include "player.h" #include "playlist.h" @@ -30,6 +31,7 @@ #include "audio_filter_graph.h" #include "config.h" extern "C" { +#include #include #ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG #include @@ -48,9 +50,19 @@ using std::cout; using boost::shared_ptr; using boost::dynamic_pointer_cast; using namespace dcpomatic; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif int const AnalyseAudioJob::_num_points = 1024; +static void add_if_required(vector& v, size_t i, double db) +{ + if (v.size() > i) { + v[i] = pow(10, db / 20); + } +} + /** @param from_zero true to analyse audio from time 0 in the playlist, otherwise begin at Playlist::start */ AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptr playlist, bool from_zero) : Job (film) @@ -66,6 +78,8 @@ AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptraudio_frame_rate(), film->audio_channels())) #endif { + LOG_DEBUG_AUDIO_ANALYSIS_NC("AnalyseAudioJob::AnalyseAudioJob"); + #ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG _filters.push_back (new Filter ("ebur128", "ebur128", "audio", "ebur128=peak=true")); _ebur128->setup (_filters); @@ -79,10 +93,36 @@ AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptrstart().get_value_or(DCPTime()); } + + /* XXX: is this right? Especially for more than 5.1? */ + vector channel_corrections(film->audio_channels(), 1); + add_if_required (channel_corrections, 4, -3); // Ls + add_if_required (channel_corrections, 5, -3); // Rs + add_if_required (channel_corrections, 6, -144); // HI + add_if_required (channel_corrections, 7, -144); // VI + add_if_required (channel_corrections, 8, -3); // Lc + add_if_required (channel_corrections, 9, -3); // Rc + add_if_required (channel_corrections, 10, -3); // Lc + add_if_required (channel_corrections, 11, -3); // Rc + add_if_required (channel_corrections, 12, -144); // DBox + add_if_required (channel_corrections, 13, -144); // Sync + add_if_required (channel_corrections, 14, -144); // Sign Language + add_if_required (channel_corrections, 15, -144); // Unused + + _leqm.reset(new leqm_nrt::Calculator( + film->audio_channels(), + film->audio_frame_rate(), + 24, + channel_corrections, + 850, // suggested by leqm_nrt CLI source + 64, // suggested by leqm_nrt CLI source + boost::thread::hardware_concurrency() + )); } AnalyseAudioJob::~AnalyseAudioJob () { + stop_thread (); BOOST_FOREACH (Filter const * i, _filters) { delete const_cast (i); } @@ -106,7 +146,9 @@ AnalyseAudioJob::json_name () const void AnalyseAudioJob::run () { - shared_ptr player (new Player (_film, _playlist)); + LOG_DEBUG_AUDIO_ANALYSIS_NC("AnalyseAudioJob::run"); + + shared_ptr player (new Player(_film, _playlist)); player->set_ignore_video (); player->set_ignore_text (); player->set_fast (); @@ -130,11 +172,15 @@ AnalyseAudioJob::run () } if (has_any_audio) { + LOG_DEBUG_AUDIO_ANALYSIS("Seeking to %1", to_string(_start)); player->seek (_start, true); _done = 0; + LOG_DEBUG_AUDIO_ANALYSIS("Starting loop for playlist of length %1", to_string(length)); while (!player->pass ()) {} } + LOG_DEBUG_AUDIO_ANALYSIS_NC("Loop complete"); + vector sample_peak; for (int i = 0; i < _film->audio_channels(); ++i) { sample_peak.push_back ( @@ -168,8 +214,10 @@ AnalyseAudioJob::run () _analysis->set_samples_per_point (_samples_per_point); _analysis->set_sample_rate (_film->audio_frame_rate ()); + _analysis->set_leqm (_leqm->leq_m()); _analysis->write (_path); + LOG_DEBUG_AUDIO_ANALYSIS_NC("Job finished"); set_progress (1); set_state (FINISHED_OK); } @@ -177,6 +225,7 @@ AnalyseAudioJob::run () void AnalyseAudioJob::analyse (shared_ptr b, DCPTime time) { + LOG_DEBUG_AUDIO_ANALYSIS("Received %1 frames at %2", b->frames(), to_string(time)); DCPOMATIC_ASSERT (time >= _start); #ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG @@ -187,11 +236,15 @@ AnalyseAudioJob::analyse (shared_ptr b, DCPTime time) int const frames = b->frames (); int const channels = b->channels (); + vector interleaved(frames * channels); for (int j = 0; j < channels; ++j) { float* data = b->data(j); for (int i = 0; i < frames; ++i) { float s = data[i]; + + interleaved[i * channels + j] = s; + float as = fabsf (s); if (as < 10e-7) { /* We may struggle to serialise and recover inf or -inf, so prevent such @@ -214,8 +267,11 @@ AnalyseAudioJob::analyse (shared_ptr b, DCPTime time) } } + _leqm->add(interleaved); + _done += frames; DCPTime const length = _playlist->length (_film); set_progress ((time.seconds() - _start.seconds()) / (length.seconds() - _start.seconds())); + LOG_DEBUG_AUDIO_ANALYSIS_NC("Frames processed"); }