Better fix for still (no sound) DCP crash.
authorCarl Hetherington <cth@carlh.net>
Wed, 8 May 2013 15:58:19 +0000 (16:58 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 8 May 2013 15:58:19 +0000 (16:58 +0100)
src/lib/encoder.cc
src/lib/sndfile_decoder.cc
src/lib/transcoder.cc

index cff9899acb6151cc19990f372c0a091c7d63968f..8549962ff01807505683266e778d16c4c8eaef43 100644 (file)
@@ -296,6 +296,10 @@ Encoder::process_video (shared_ptr<const Image> image, bool same, boost::shared_
 void
 Encoder::process_audio (shared_ptr<const AudioBuffers> data)
 {
+       if (!data->frames ()) {
+               return;
+       }
+       
 #if HAVE_SWRESAMPLE
        /* Maybe sample-rate convert */
        if (_swr_context) {
index d70478a1bb7c0c698ef3484ebad4694a0add6055..fdaf2eeaaf4397ad5d1cb1430ebc6d006607a5b7 100644 (file)
@@ -102,20 +102,14 @@ SndfileDecoder::pass ()
        sf_count_t const block = _audio_stream->sample_rate() / 2;
        shared_ptr<AudioBuffers> audio (new AudioBuffers (_audio_stream->channels(), block));
        sf_count_t const this_time = min (block, _frames - _done);
-       bool have_sound = false;
        for (size_t i = 0; i < _sndfiles.size(); ++i) {
                if (!_sndfiles[i]) {
                        audio->make_silent (i);
                } else {
                        sf_read_float (_sndfiles[i], audio->data(i), this_time);
-                       have_sound = true;
                }
        }
 
-       if (!have_sound) {
-               return true;
-       }
-
        audio->set_frames (this_time);
        Audio (audio, double(_done) / _audio_stream->sample_rate());
        _done += this_time;
index faafcaf8b593821fd6b5600f82f48b758192eeba..48cf402d77bac4f36ababbac36adff4fb880d5e9 100644 (file)
@@ -56,7 +56,7 @@ Transcoder::Transcoder (shared_ptr<Film> f, DecodeOptions o, Job* j, shared_ptr<
        assert (_encoder);
 
        shared_ptr<AudioStream> st = f->audio_stream();
-       if (st) {
+       if (st && st->sample_rate ()) {
                _matcher.reset (new Matcher (f->log(), st->sample_rate(), f->source_frame_rate()));
        }
        _delay_line.reset (new DelayLine (f->log(), f->audio_delay() / 1000.0f));