diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-09-24 13:12:34 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-09-24 13:12:34 +0100 |
| commit | b8b9800d1022fe0912b180e8b3b41fd4b616478a (patch) | |
| tree | 699fd2b2a457b8d716fbabad4ac7f44e6b32b595 /src/lib/decoder.cc | |
| parent | 13d997b1e39ce12415b47f8ccb7f0e51b01ab8ea (diff) | |
Fix problems with overflow on long films.
Diffstat (limited to 'src/lib/decoder.cc')
| -rw-r--r-- | src/lib/decoder.cc | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/lib/decoder.cc b/src/lib/decoder.cc index 9332511bc..2f02147e3 100644 --- a/src/lib/decoder.cc +++ b/src/lib/decoder.cc @@ -165,20 +165,22 @@ Decoder::process_end () in to get it to the right length. */ - int const audio_short_by_frames = - (decoding_frames() * dcp_audio_sample_rate (_fs->audio_sample_rate) / _fs->frames_per_second) + int64_t const audio_short_by_frames = + ((int64_t) decoding_frames() * dcp_audio_sample_rate (_fs->audio_sample_rate) / _fs->frames_per_second) - _audio_frames_processed; - int bytes = audio_short_by_frames * _fs->audio_channels * _fs->bytes_per_sample(); - - int const silence_size = 64 * 1024; - uint8_t silence[silence_size]; - memset (silence, 0, silence_size); - - while (bytes) { - int const t = min (bytes, silence_size); - Audio (silence, t); - bytes -= t; + if (audio_short_by_frames >= 0) { + int bytes = audio_short_by_frames * _fs->audio_channels * _fs->bytes_per_sample(); + + int const silence_size = 64 * 1024; + uint8_t silence[silence_size]; + memset (silence, 0, silence_size); + + while (bytes) { + int const t = min (bytes, silence_size); + Audio (silence, t); + bytes -= t; + } } } |
