diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-11-05 10:36:55 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-11-05 10:36:55 +0000 |
| commit | ca4d051ceafb77c281583c4e50b391f230544313 (patch) | |
| tree | f3bb8a080dd87feae70ed90cb93d99e4bdd7e4a2 /src/lib/encoder.cc | |
| parent | 10a001a0c7cf33d384d9613168d80c0c5a07426c (diff) | |
Move trimming into the encoder; seems to be cleaner.
Diffstat (limited to 'src/lib/encoder.cc')
| -rw-r--r-- | src/lib/encoder.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index bb23c9e59..b322be04c 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -23,7 +23,9 @@ #include "encoder.h" #include "util.h" +#include "options.h" +using std::pair; using namespace boost; int const Encoder::_history_size = 25; @@ -101,3 +103,51 @@ Encoder::frame_skipped () boost::mutex::scoped_lock lock (_history_mutex); _just_skipped = true; } + +void +Encoder::process_video (shared_ptr<const Image> i, SourceFrame f, boost::shared_ptr<Subtitle> s) +{ + if (_opt->decode_video_skip != 0 && (f % _opt->decode_video_skip) != 0) { + return; + } + + if (_opt->video_decode_range) { + pair<SourceFrame, SourceFrame> const r = _opt->video_decode_range.get(); + if (f < r.first || f >= r.second) { + return; + } + } + + do_process_video (i, f, s); +} + +void +Encoder::process_audio (shared_ptr<const AudioBuffers> data, int64_t f) +{ + if (_opt->audio_decode_range) { + + shared_ptr<AudioBuffers> trimmed (new AudioBuffers (*data.get ())); + + /* Range that we are encoding */ + pair<int64_t, int64_t> required_range = _opt->audio_decode_range.get(); + /* Range of this block of data */ + pair<int64_t, int64_t> this_range (f, f + trimmed->frames()); + + if (this_range.second < required_range.first || required_range.second < this_range.first) { + /* No part of this audio is within the required range */ + return; + } else if (required_range.first >= this_range.first && required_range.first < this_range.second) { + /* Trim start */ + int64_t const shift = required_range.first - this_range.first; + trimmed->move (shift, 0, trimmed->frames() - shift); + trimmed->set_frames (trimmed->frames() - shift); + } else if (required_range.second >= this_range.first && required_range.second < this_range.second) { + /* Trim end */ + trimmed->set_frames (required_range.second - this_range.first); + } + + data = trimmed; + } + + do_process_audio (data); +} |
