diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-04-14 23:41:57 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-04-14 23:41:57 +0100 |
| commit | 9fcaaf1cc7582598b06f5a43878cbd9aa2b4ff17 (patch) | |
| tree | 2f596a2e2f977d303a10025f48e4da1a9c3c0fd3 /src/lib | |
| parent | ea7b50b1b1f42e3a722f2efdca6fa2c3184d2105 (diff) | |
Add Trimmer class; not linked in.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/trimmer.cc | 100 | ||||
| -rw-r--r-- | src/lib/trimmer.h | 39 | ||||
| -rw-r--r-- | src/lib/writer.cc | 13 | ||||
| -rw-r--r-- | src/lib/wscript | 1 |
4 files changed, 150 insertions, 3 deletions
diff --git a/src/lib/trimmer.cc b/src/lib/trimmer.cc new file mode 100644 index 000000000..68364e50a --- /dev/null +++ b/src/lib/trimmer.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <boost/shared_ptr.hpp> +#include "trimmer.h" + +using std::cout; +using std::max; +using boost::shared_ptr; + +/** @param audio_sample_rate Audio sampling rate, or 0 if there is no audio */ +Trimmer::Trimmer ( + shared_ptr<Log> log, + int video_trim_start, + int video_trim_end, int video_length, + int audio_sample_rate, + float frames_per_second, + int dcp_frames_per_second + ) + : AudioVideoProcessor (log) + , _video_start (video_trim_start) + , _video_end (video_length - video_trim_end) + , _video_in (0) + , _audio_in (0) +{ + FrameRateConversion frc (frames_per_second, dcp_frames_per_second); + + if (frc.skip) { + _video_start /= 2; + _video_end /= 2; + } else if (frc.repeat) { + _video_start *= 2; + _video_end *= 2; + } + + if (audio_sample_rate) { + _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); + } +} + +void +Trimmer::process_video (shared_ptr<Image> image, bool same, shared_ptr<Subtitle> sub) +{ + if (_video_in >= _video_start && _video_in <= _video_end) { + Video (image, same, sub); + } + + ++_video_in; +} + +void +Trimmer::process_audio (shared_ptr<AudioBuffers> audio) +{ + int64_t offset = _audio_start - _audio_in; + if (offset > audio->frames()) { + _audio_in += audio->frames (); + return; + } + + if (offset < 0) { + offset = 0; + } + + int64_t length = _audio_end - max (_audio_in, _audio_start); + if (length < 0) { + _audio_in += audio->frames (); + return; + } + + if (length > (audio->frames() - offset)) { + length = audio->frames () - offset; + } + + _audio_in += audio->frames (); + + if (offset != 0 || length != audio->frames ()) { + audio->move (offset, 0, length); + audio->set_frames (length); + } + + Audio (audio); +} + diff --git a/src/lib/trimmer.h b/src/lib/trimmer.h new file mode 100644 index 000000000..ff7e9514d --- /dev/null +++ b/src/lib/trimmer.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "processor.h" + +class Trimmer : public AudioVideoProcessor +{ +public: + Trimmer (boost::shared_ptr<Log>, int, int, int, int, float, int); + + void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s); + void process_audio (boost::shared_ptr<AudioBuffers>); + +private: + friend class trimmer_test; + + int _video_start; + int _video_end; + int _video_in; + int64_t _audio_start; + int64_t _audio_end; + int64_t _audio_in; +}; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index c6ce4711d..ad81686d1 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -259,9 +259,14 @@ Writer::finish () } int const frames = _last_written_frame + 1; - int const duration = frames - _film->trim_start() - _film->trim_end(); + int duration = 0; + if (_film->trim_type() == Film::CPL) { + duration = frames - _film->trim_start() - _film->trim_end(); + _picture_asset->set_entry_point (_film->trim_start ()); + } else { + duration = frames; + } - _picture_asset->set_entry_point (_film->trim_start ()); _picture_asset->set_duration (duration); /* Hard-link the video MXF into the DCP */ @@ -288,7 +293,9 @@ Writer::finish () _picture_asset->set_file_name (_film->dcp_video_mxf_filename ()); if (_sound_asset) { - _sound_asset->set_entry_point (_film->trim_start ()); + if (_film->trim_type() == Film::CPL) { + _sound_asset->set_entry_point (_film->trim_start ()); + } _sound_asset->set_duration (duration); } diff --git a/src/lib/wscript b/src/lib/wscript index 8e9d34706..51b103afd 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -45,6 +45,7 @@ sources = """ timer.cc transcode_job.cc transcoder.cc + trimmer.cc ui_signaller.cc util.cc video_decoder.cc |
