projects
/
dcpomatic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
11a6dec
)
Fix odd behaviour when analysing single bits of audio which start at non-zero positio...
author
Carl Hetherington
<cth@carlh.net>
Sat, 10 Feb 2018 02:05:14 +0000
(
02:05
+0000)
committer
Carl Hetherington
<cth@carlh.net>
Sat, 10 Feb 2018 02:05:14 +0000
(
02:05
+0000)
src/lib/analyse_audio_job.cc
patch
|
blob
|
history
src/lib/analyse_audio_job.h
patch
|
blob
|
history
src/lib/film.cc
patch
|
blob
|
history
src/lib/job_manager.cc
patch
|
blob
|
history
src/lib/job_manager.h
patch
|
blob
|
history
src/wx/audio_dialog.cc
patch
|
blob
|
history
test/audio_analysis_test.cc
patch
|
blob
|
history
test/audio_processor_test.cc
patch
|
blob
|
history
diff --git
a/src/lib/analyse_audio_job.cc
b/src/lib/analyse_audio_job.cc
index fe56b3b6c9265005f8ba9c6e9dd427a6250246e1..b96c7047b727007b8f5799c9b9da2e4dd4c83e9c 100644
(file)
--- a/
src/lib/analyse_audio_job.cc
+++ b/
src/lib/analyse_audio_job.cc
@@
-1,5
+1,5
@@
/*
/*
- Copyright (C) 2012-201
5
Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-201
8
Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
This file is part of DCP-o-matic.
@@
-50,9
+50,11
@@
using boost::dynamic_pointer_cast;
int const AnalyseAudioJob::_num_points = 1024;
int const AnalyseAudioJob::_num_points = 1024;
-AnalyseAudioJob::AnalyseAudioJob (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist)
+/** @param from_zero true to analyse audio from time 0 in the playlist, otherwise begin at Playlist::start */
+AnalyseAudioJob::AnalyseAudioJob (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist, bool from_zero)
: Job (film)
, _playlist (playlist)
: Job (film)
, _playlist (playlist)
+ , _from_zero (from_zero)
, _done (0)
, _samples_per_point (1)
, _current (0)
, _done (0)
, _samples_per_point (1)
, _current (0)
@@
-71,6
+73,10
@@
AnalyseAudioJob::AnalyseAudioJob (shared_ptr<const Film> film, shared_ptr<const
_sample_peak[i] = 0;
_sample_peak_frame[i] = 0;
}
_sample_peak[i] = 0;
_sample_peak_frame[i] = 0;
}
+
+ if (!_from_zero) {
+ _start = _playlist->start().get_value_or(DCPTime());
+ }
}
AnalyseAudioJob::~AnalyseAudioJob ()
}
AnalyseAudioJob::~AnalyseAudioJob ()
@@
-105,10
+111,9
@@
AnalyseAudioJob::run ()
player->set_play_referenced ();
player->Audio.connect (bind (&AnalyseAudioJob::analyse, this, _1, _2));
player->set_play_referenced ();
player->Audio.connect (bind (&AnalyseAudioJob::analyse, this, _1, _2));
- DCPTime const start = _playlist->start().get_value_or (DCPTime ());
DCPTime const length = _playlist->length ();
DCPTime const length = _playlist->length ();
- Frame const len = DCPTime (length - start).frames_round (_film->audio_frame_rate());
+ Frame const len = DCPTime (length -
_
start).frames_round (_film->audio_frame_rate());
_samples_per_point = max (int64_t (1), len / _num_points);
delete[] _current;
_samples_per_point = max (int64_t (1), len / _num_points);
delete[] _current;
@@
-123,6
+128,7
@@
AnalyseAudioJob::run ()
}
if (has_any_audio) {
}
if (has_any_audio) {
+ player->seek (_start, true);
_done = 0;
while (!player->pass ()) {}
}
_done = 0;
while (!player->pass ()) {}
}
@@
-166,6
+172,8
@@
AnalyseAudioJob::run ()
void
AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b, DCPTime time)
{
void
AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b, DCPTime time)
{
+ DCPOMATIC_ASSERT (time >= _start);
+
#ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG
if (Config::instance()->analyse_ebur128 ()) {
_ebur128->process (b);
#ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG
if (Config::instance()->analyse_ebur128 ()) {
_ebur128->process (b);
@@
-203,7
+211,6
@@
AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b, DCPTime time)
_done += frames;
_done += frames;
- DCPTime const start = _playlist->start().get_value_or (DCPTime ());
DCPTime const length = _playlist->length ();
DCPTime const length = _playlist->length ();
- set_progress ((time.seconds() -
start.seconds()) / (length.seconds() -
start.seconds()));
+ set_progress ((time.seconds() -
_start.seconds()) / (length.seconds() - _
start.seconds()));
}
}
diff --git
a/src/lib/analyse_audio_job.h
b/src/lib/analyse_audio_job.h
index 7e5ea4719112aceb753cb02608838167bccdf317..d8dcda2f19c43b8d18b22a53cb5ce81c96d70e4c 100644
(file)
--- a/
src/lib/analyse_audio_job.h
+++ b/
src/lib/analyse_audio_job.h
@@
-1,5
+1,5
@@
/*
/*
- Copyright (C) 2012-201
5
Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-201
8
Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
This file is part of DCP-o-matic.
@@
-44,7
+44,7
@@
class Filter;
class AnalyseAudioJob : public Job
{
public:
class AnalyseAudioJob : public Job
{
public:
- AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>);
+ AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>
, bool from_zero
);
~AnalyseAudioJob ();
std::string name () const;
~AnalyseAudioJob ();
std::string name () const;
@@
-59,6
+59,8
@@
private:
void analyse (boost::shared_ptr<const AudioBuffers>, DCPTime time);
boost::shared_ptr<const Playlist> _playlist;
void analyse (boost::shared_ptr<const AudioBuffers>, DCPTime time);
boost::shared_ptr<const Playlist> _playlist;
+ DCPTime _start;
+ bool _from_zero;
int64_t _done;
int64_t _samples_per_point;
int64_t _done;
int64_t _samples_per_point;
diff --git
a/src/lib/film.cc
b/src/lib/film.cc
index db1cb39aaad5b90075b6aaaca5eb67c118bf852f..d5af889c55acc588ed4ae8a5e458e1481c2a9e50 100644
(file)
--- a/
src/lib/film.cc
+++ b/
src/lib/film.cc
@@
-1067,7
+1067,7
@@
Film::maybe_add_content (weak_ptr<Job> j, weak_ptr<Content> c, bool disable_audi
playlist->add (content);
boost::signals2::connection c;
JobManager::instance()->analyse_audio (
playlist->add (content);
boost::signals2::connection c;
JobManager::instance()->analyse_audio (
- shared_from_this
(), playlist
, c, bind (&Film::audio_analysis_finished, this)
+ shared_from_this
(), playlist, false
, c, bind (&Film::audio_analysis_finished, this)
);
_audio_analysis_connections.push_back (c);
}
);
_audio_analysis_connections.push_back (c);
}
diff --git
a/src/lib/job_manager.cc
b/src/lib/job_manager.cc
index 3992e685ed4fe76c9ee4c5912ae7cd41fcaac873..d76f86056fe9d4dc278768a7d6442d522bb757d3 100644
(file)
--- a/
src/lib/job_manager.cc
+++ b/
src/lib/job_manager.cc
@@
-1,5
+1,5
@@
/*
/*
- Copyright (C) 2012-201
5
Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-201
8
Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
This file is part of DCP-o-matic.
@@
-182,6
+182,7
@@
void
JobManager::analyse_audio (
shared_ptr<const Film> film,
shared_ptr<const Playlist> playlist,
JobManager::analyse_audio (
shared_ptr<const Film> film,
shared_ptr<const Playlist> playlist,
+ bool from_zero,
boost::signals2::connection& connection,
function<void()> ready
)
boost::signals2::connection& connection,
function<void()> ready
)
@@
-203,7
+204,7
@@
JobManager::analyse_audio (
{
boost::mutex::scoped_lock lm (_mutex);
{
boost::mutex::scoped_lock lm (_mutex);
- job.reset (new AnalyseAudioJob (film, playlist));
+ job.reset (new AnalyseAudioJob (film, playlist
, from_zero
));
connection = job->Finished.connect (ready);
_jobs.push_back (job);
}
connection = job->Finished.connect (ready);
_jobs.push_back (job);
}
diff --git
a/src/lib/job_manager.h
b/src/lib/job_manager.h
index c623b6ef98d7f7fd5831b9644281a10946b58084..9cba0fd094a46bd44796532543e6e7ac9ebce4ac 100644
(file)
--- a/
src/lib/job_manager.h
+++ b/
src/lib/job_manager.h
@@
-1,5
+1,5
@@
/*
/*
- Copyright (C) 2012-201
5
Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-201
8
Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
This file is part of DCP-o-matic.
@@
-50,6
+50,7
@@
public:
void analyse_audio (
boost::shared_ptr<const Film> film,
boost::shared_ptr<const Playlist> playlist,
void analyse_audio (
boost::shared_ptr<const Film> film,
boost::shared_ptr<const Playlist> playlist,
+ bool from_zero,
boost::signals2::connection& connection,
boost::function<void()> ready
);
boost::signals2::connection& connection,
boost::function<void()> ready
);
diff --git
a/src/wx/audio_dialog.cc
b/src/wx/audio_dialog.cc
index 73ddd4c01221aa0792b40cd9d688a234d8bd96e5..a08d29ad8c7663ab99d9e36a13468507a26c9c3d 100644
(file)
--- a/
src/wx/audio_dialog.cc
+++ b/
src/wx/audio_dialog.cc
@@
-169,11
+169,15
@@
AudioDialog::try_to_load_analysis ()
shared_ptr<const Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
shared_ptr<const Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
+ shared_ptr<Content> check = _content.lock();
+
boost::filesystem::path const path = film->audio_analysis_path (_playlist);
if (!boost::filesystem::exists (path)) {
_plot->set_analysis (shared_ptr<AudioAnalysis> ());
_analysis.reset ();
boost::filesystem::path const path = film->audio_analysis_path (_playlist);
if (!boost::filesystem::exists (path)) {
_plot->set_analysis (shared_ptr<AudioAnalysis> ());
_analysis.reset ();
- JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
+ JobManager::instance()->analyse_audio (
+ film, _playlist, !static_cast<bool>(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)
+ );
return;
}
return;
}
@@
-181,11
+185,15
@@
AudioDialog::try_to_load_analysis ()
_analysis.reset (new AudioAnalysis (path));
} catch (OldFormatError& e) {
/* An old analysis file: recreate it */
_analysis.reset (new AudioAnalysis (path));
} catch (OldFormatError& e) {
/* An old analysis file: recreate it */
- JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
+ JobManager::instance()->analyse_audio (
+ film, _playlist, !static_cast<bool>(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)
+ );
return;
} catch (xmlpp::exception& e) {
/* Probably a (very) old-style analysis file: recreate it */
return;
} catch (xmlpp::exception& e) {
/* Probably a (very) old-style analysis file: recreate it */
- JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
+ JobManager::instance()->analyse_audio (
+ film, _playlist, !static_cast<bool>(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)
+ );
return;
}
return;
}
diff --git
a/test/audio_analysis_test.cc
b/test/audio_analysis_test.cc
index 64081b89ca7c71679430f745d43ca2772c4cb5e7..b461680c398bdc0ccef88c5faf31267ffbe36525 100644
(file)
--- a/
test/audio_analysis_test.cc
+++ b/
test/audio_analysis_test.cc
@@
-111,7
+111,7
@@
BOOST_AUTO_TEST_CASE (audio_analysis_test)
film->examine_and_add_content (c);
wait_for_jobs ();
film->examine_and_add_content (c);
wait_for_jobs ();
- shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
()
));
+ shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
(), false
));
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
@@
-128,7
+128,7
@@
BOOST_AUTO_TEST_CASE (audio_analysis_negative_delay_test)
c->audio->set_delay (-250);
c->audio->set_delay (-250);
- shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
()
));
+ shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
(), false
));
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
@@
-143,7
+143,7
@@
BOOST_AUTO_TEST_CASE (audio_analysis_test2)
film->examine_and_add_content (c);
wait_for_jobs ();
film->examine_and_add_content (c);
wait_for_jobs ();
- shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
()
));
+ shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
(), false
));
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
job->Finished.connect (boost::bind (&finished));
JobManager::instance()->add (job);
wait_for_jobs ();
@@
-174,7
+174,7
@@
BOOST_AUTO_TEST_CASE (audio_analysis_test3)
film->set_audio_channels (12);
boost::signals2::connection connection;
film->set_audio_channels (12);
boost::signals2::connection connection;
- JobManager::instance()->analyse_audio (film, film->playlist(), connection, boost::bind (&analysis_finished));
+ JobManager::instance()->analyse_audio (film, film->playlist(),
false,
connection, boost::bind (&analysis_finished));
wait_for_jobs ();
BOOST_CHECK (done);
}
wait_for_jobs ();
BOOST_CHECK (done);
}
@@
-193,6
+193,6
@@
BOOST_AUTO_TEST_CASE (analyse_audio_test4)
shared_ptr<Playlist> playlist (new Playlist);
playlist->add (content);
boost::signals2::connection c;
shared_ptr<Playlist> playlist (new Playlist);
playlist->add (content);
boost::signals2::connection c;
- JobManager::instance()->analyse_audio (film, playlist, c, boost::bind (&finished));
+ JobManager::instance()->analyse_audio (film, playlist,
false,
c, boost::bind (&finished));
BOOST_CHECK (!wait_for_jobs ());
}
BOOST_CHECK (!wait_for_jobs ());
}
diff --git
a/test/audio_processor_test.cc
b/test/audio_processor_test.cc
index e3917af421bb7215f10109906d2719dd142d755f..de212f611352abf7ba51de08d1ed8a1f9fe08231 100644
(file)
--- a/
test/audio_processor_test.cc
+++ b/
test/audio_processor_test.cc
@@
-48,7
+48,7
@@
BOOST_AUTO_TEST_CASE (audio_processor_test)
film->set_audio_processor (AudioProcessor::from_id ("mid-side-decoder"));
/* Analyse the audio and check it doesn't crash */
film->set_audio_processor (AudioProcessor::from_id ("mid-side-decoder"));
/* Analyse the audio and check it doesn't crash */
- shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
()
));
+ shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist
(), false
));
JobManager::instance()->add (job);
wait_for_jobs ();
JobManager::instance()->add (job);
wait_for_jobs ();