Trimmer::Trimmer (
shared_ptr<Log> log,
int video_trim_start,
- int video_trim_end, int video_length,
+ int video_trim_end,
+ int video_length,
int audio_sample_rate,
float frames_per_second,
int dcp_frames_per_second
_audio_start = video_frames_to_audio_frames (_video_start, audio_sample_rate, frames_per_second);
_audio_end = video_frames_to_audio_frames (_video_end, audio_sample_rate, frames_per_second);
}
+
+ /* XXX: this is a hack; this flag means that no trim is happening at the end of the film, and I'm
+ using that to prevent audio trim being rounded to video trim, which breaks the current set
+ of regression tests. This could be removed if a) the regression tests are regenerated and b)
+ I can work out what DCP length should be.
+ */
+ _no_trim = (_video_start == 0) && (_video_end == (video_length - video_trim_end));
}
void
-Trimmer::process_video (shared_ptr<Image> image, bool same, shared_ptr<Subtitle> sub)
+Trimmer::process_video (shared_ptr<const Image> image, bool same, shared_ptr<Subtitle> sub)
{
- if (_video_in >= _video_start && _video_in <= _video_end) {
+ if (_no_trim || (_video_in >= _video_start && _video_in <= _video_end)) {
Video (image, same, sub);
}
}
void
-Trimmer::process_audio (shared_ptr<AudioBuffers> audio)
+Trimmer::process_audio (shared_ptr<const AudioBuffers> audio)
{
+ if (_no_trim) {
+ Audio (audio);
+ return;
+ }
+
int64_t offset = _audio_start - _audio_in;
if (offset > audio->frames()) {
_audio_in += audio->frames ();
_audio_in += audio->frames ();
if (offset != 0 || length != audio->frames ()) {
- audio->move (offset, 0, length);
- audio->set_frames (length);
+ shared_ptr<AudioBuffers> copy (new AudioBuffers (audio));
+ copy->move (offset, 0, length);
+ copy->set_frames (length);
+ audio = copy;
}
Audio (audio);