diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-11-12 21:04:06 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-11-12 21:04:06 +0000 |
| commit | 17cea71c34ed6bdba67aac8614572c7511844c2a (patch) | |
| tree | 41464576c5e2e6ab360789faf4b5fcc4358ee556 /src/lib/decoder.cc | |
| parent | 13b935067e892875ea9e76c3d63fcc11d2c429b0 (diff) | |
Untested; more movement of stuff out of decoder.
Diffstat (limited to 'src/lib/decoder.cc')
| -rw-r--r-- | src/lib/decoder.cc | 89 |
1 files changed, 2 insertions, 87 deletions
diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc index eb9667471..73e17e7ea 100644 --- a/src/lib/decoder.cc +++ b/src/lib/decoder.cc @@ -56,89 +56,14 @@ Decoder::Decoder (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, , _opt (o) , _job (j) , _video_frame (0) - , _audio_frame (0) - , _delay_line (0) - , _delay_in_frames (0) { } -Decoder::~Decoder () -{ - delete _delay_line; -} - -/** Start off a decode processing run. This should only be called once on - * a given Decoder object. - */ -void -Decoder::process_begin () -{ - if (_audio_stream) { - _delay_in_frames = _film->audio_delay() * _audio_stream.get().sample_rate() / 1000; - _delay_line = new DelayLine (_audio_stream.get().channels(), _delay_in_frames); - } -} - -/** Finish off a decode processing run */ -void -Decoder::process_end () -{ - if (_delay_in_frames < 0 && _opt->decode_audio && _audio_stream) { - shared_ptr<AudioBuffers> b (new AudioBuffers (_audio_stream.get().channels(), -_delay_in_frames)); - b->make_silent (); - emit_audio (b); - } - - if (_opt->decode_audio && _audio_stream) { - - /* Ensure that our video and audio emissions are the same length */ - - int64_t audio_short_by_frames = video_frames_to_audio_frames (_video_frame, _audio_stream.get().sample_rate(), frames_per_second()) - _audio_frame; - - _film->log()->log ( - String::compose ( - "Decoder has emitted %1 video frames (which equals %2 audio frames) and %3 audio frames", - _video_frame, - video_frames_to_audio_frames (_video_frame, _audio_stream.get().sample_rate(), frames_per_second()), - _audio_frame - ) - ); - - if (audio_short_by_frames < 0) { - - _film->log()->log (String::compose ("Emitted %1 too many audio frames", -audio_short_by_frames)); - - /* We have emitted more audio than video. Emit enough black video frames so that we reverse this */ - int const black_video_frames = ceil (-audio_short_by_frames * frames_per_second() / _audio_stream.get().sample_rate()); - - _film->log()->log (String::compose ("Emitting %1 frames of black video", black_video_frames)); - - shared_ptr<Image> black (new CompactImage (pixel_format(), native_size())); - black->make_black (); - for (int i = 0; i < black_video_frames; ++i) { - emit_video (black, shared_ptr<Subtitle> ()); - } - - /* Now recompute our check value */ - audio_short_by_frames = video_frames_to_audio_frames (_video_frame, _audio_stream.get().sample_rate(), frames_per_second()) - _audio_frame; - } - - if (audio_short_by_frames > 0) { - _film->log()->log (String::compose ("Emitted %1 too few audio frames", audio_short_by_frames)); - shared_ptr<AudioBuffers> b (new AudioBuffers (_audio_stream.get().channels(), audio_short_by_frames)); - b->make_silent (); - emit_audio (b); - } - } -} - /** Start decoding */ void Decoder::go () { - process_begin (); - if (_job && !_film->dcp_length()) { _job->set_progress_unknown (); } @@ -148,8 +73,6 @@ Decoder::go () _job->set_progress (float (_video_frame) / _film->length().get()); } } - - process_end (); } /** Called to tell the world that some audio data is ready @@ -168,8 +91,7 @@ Decoder::process_audio (shared_ptr<AudioBuffers> audio) } } - _delay_line->feed (audio); - emit_audio (audio); + Audio (audio); } /** Called by subclasses to tell the world that some video data is ready. @@ -221,7 +143,7 @@ void Decoder::emit_video (shared_ptr<Image> image, shared_ptr<Subtitle> sub) { TIMING ("Decoder emits %1", _video_frame); - Video (image, _video_frame, sub); + Video (image, sub); ++_video_frame; _last_image = image; @@ -229,13 +151,6 @@ Decoder::emit_video (shared_ptr<Image> image, shared_ptr<Subtitle> sub) } void -Decoder::emit_audio (shared_ptr<AudioBuffers> audio) -{ - Audio (audio, _audio_frame); - _audio_frame += audio->frames (); -} - -void Decoder::process_subtitle (shared_ptr<TimedSubtitle> s) { _timed_subtitle = s; |
