VIDEO: Fix Smacker crash, as per madmoose's suggestion

Apparently, in some movies the Smacker decoder would peek ahead
past the end of the bitstream, even though it didn't necessarily
use all of those bits later. Fix that by first checking how many
bits are still available. (This was originally reported for the
mg1shoot.smk cutscene in the 4 CD version of The Feeble Files.)
This commit is contained in:
Torbjörn Andersson 2013-02-18 20:12:35 +01:00
parent f70905d979
commit 21ed47ce13
2 changed files with 3 additions and 2 deletions

1
NEWS
View file

@ -22,6 +22,7 @@ For a more comprehensive changelog of the latest experimental code, see:
change it at all. change it at all.
- Updated MT-32 emulation code to latest munt project snapshot. - Updated MT-32 emulation code to latest munt project snapshot.
- Added FluidSynth settings dialog, mainly for reverb and chorus settings. - Added FluidSynth settings dialog, mainly for reverb and chorus settings.
- Fixed crash on certain Smacker movies.
Cine: Cine:
- Improved audio support for Amiga and AtariST versions of Future Wars. - Improved audio support for Amiga and AtariST versions of Future Wars.

View file

@ -119,7 +119,7 @@ uint16 SmallHuffmanTree::decodeTree(uint32 prefix, int length) {
} }
uint16 SmallHuffmanTree::getCode(Common::BitStream &bs) { uint16 SmallHuffmanTree::getCode(Common::BitStream &bs) {
byte peek = bs.peekBits(8); byte peek = bs.peekBits(MIN<uint32>(bs.size() - bs.pos(), 8));
uint16 *p = &_tree[_prefixtree[peek]]; uint16 *p = &_tree[_prefixtree[peek]];
bs.skip(_prefixlength[peek]); bs.skip(_prefixlength[peek]);
@ -257,7 +257,7 @@ uint32 BigHuffmanTree::decodeTree(uint32 prefix, int length) {
} }
uint32 BigHuffmanTree::getCode(Common::BitStream &bs) { uint32 BigHuffmanTree::getCode(Common::BitStream &bs) {
byte peek = bs.peekBits(8); byte peek = bs.peekBits(MIN<uint32>(bs.size() - bs.pos(), 8));
uint32 *p = &_tree[_prefixtree[peek]]; uint32 *p = &_tree[_prefixtree[peek]];
bs.skip(_prefixlength[peek]); bs.skip(_prefixlength[peek]);