diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-03-22 16:51:05 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-03-22 16:51:05 +0000 |
| commit | 6e7a497e9802635de713e350593b12c783a0f64c (patch) | |
| tree | fbf1f0652ca173644d557c45a889f380cf66f6ce /src/lib | |
| parent | 604ef9902b6b2256adea97a20195cdb68b3a4aa6 (diff) | |
Give SndfileContent a video frame rate so that it can be specified by the user.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/sndfile_content.cc | 29 | ||||
| -rw-r--r-- | src/lib/sndfile_content.h | 21 |
2 files changed, 43 insertions, 7 deletions
diff --git a/src/lib/sndfile_content.cc b/src/lib/sndfile_content.cc index 98171a843..a8388ab77 100644 --- a/src/lib/sndfile_content.cc +++ b/src/lib/sndfile_content.cc @@ -33,6 +33,8 @@ using std::cout; using boost::shared_ptr; using boost::lexical_cast; +int const SndfileContentProperty::VIDEO_FRAME_RATE = 600; + SndfileContent::SndfileContent (shared_ptr<const Film> f, boost::filesystem::path p) : Content (f, p) , AudioContent (f, p) @@ -147,13 +149,11 @@ SndfileContent::full_length () const shared_ptr<const Film> film = _film.lock (); assert (film); - OutputAudioFrame const len = divide_with_round (audio_length() * output_audio_frame_rate(), content_audio_frame_rate ()); - - /* XXX: this depends on whether, alongside this audio, we are running video slower or faster than - it should be. The calculation above works out the output audio frames assuming that we are just - resampling the audio: it would be incomplete if, for example, we were running this audio alongside - 25fps video that was being run at 24fps. - */ + float const rate = _video_frame_rate.get_value_or (film->video_frame_rate ()); + OutputAudioFrame const len = divide_with_round ( + audio_length() * output_audio_frame_rate() * rate, + content_audio_frame_rate() * film->video_frame_rate() + ); return film->audio_frames_to_time (len); } @@ -177,3 +177,18 @@ SndfileContent::set_audio_mapping (AudioMapping m) signal_changed (AudioContentProperty::AUDIO_MAPPING); } + +float +SndfileContent::video_frame_rate () const +{ + { + boost::mutex::scoped_lock lm (_mutex); + if (_video_frame_rate) { + return _video_frame_rate.get (); + } + } + + shared_ptr<const Film> film = _film.lock (); + assert (film); + return film->video_frame_rate (); +} diff --git a/src/lib/sndfile_content.h b/src/lib/sndfile_content.h index 701ff16b2..a79fb99b6 100644 --- a/src/lib/sndfile_content.h +++ b/src/lib/sndfile_content.h @@ -29,6 +29,12 @@ namespace cxml { class Node; } +class SndfileContentProperty +{ +public: + static int const VIDEO_FRAME_RATE; +}; + class SndfileContent : public AudioContent { public: @@ -69,6 +75,17 @@ public: return _audio_mapping; } + void set_video_frame_rate (float r) { + { + boost::mutex::scoped_lock lm (_mutex); + _video_frame_rate = r; + } + + signal_changed (SndfileContentProperty::VIDEO_FRAME_RATE); + } + + float video_frame_rate () const; + void set_audio_mapping (AudioMapping); static bool valid_file (boost::filesystem::path); @@ -78,6 +95,10 @@ private: AudioContent::Frame _audio_length; int _audio_frame_rate; AudioMapping _audio_mapping; + /** Video frame rate that this audio has been prepared for, + if specified. + */ + boost::optional<float> _video_frame_rate; }; #endif |
