summaryrefslogtreecommitdiff
path: root/src/lib/decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-09-24 13:12:34 +0100
committerCarl Hetherington <cth@carlh.net>2012-09-24 13:12:34 +0100
commitb8b9800d1022fe0912b180e8b3b41fd4b616478a (patch)
tree699fd2b2a457b8d716fbabad4ac7f44e6b32b595 /src/lib/decoder.cc
parent13d997b1e39ce12415b47f8ccb7f0e51b01ab8ea (diff)
Fix problems with overflow on long films.
Diffstat (limited to 'src/lib/decoder.cc')
-rw-r--r--src/lib/decoder.cc26
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;
+ }
}
}