summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2017-04-26 23:37:11 +0300
committerMartin Storsjo <martin@martin.st>2017-04-26 23:37:11 +0300
commit50922e3dbd5d099a67d879c4ec1d7535ebfa30a8 (patch)
tree8fd82f6533d5b5c9d4459c8bb896e2c58bba40aa
parent6b0d8201b1ef4be11b028e7c635dfe6a9c919380 (diff)
Try to properly handle the case when the bitstream reader runs out of bits to read
-rw-r--r--libFDK/include/FDK_bitstream.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/libFDK/include/FDK_bitstream.h b/libFDK/include/FDK_bitstream.h
index d2a7e7d..d47a750 100644
--- a/libFDK/include/FDK_bitstream.h
+++ b/libFDK/include/FDK_bitstream.h
@@ -223,7 +223,15 @@ FDK_INLINE UINT FDKreadBits(HANDLE_FDK_BITSTREAM hBitStream,
else
{
hBitStream->CacheWord = FDK_get (&hBitStream->hBitBuf,validBits) ;
- hBitStream->BitsInCache = validBits - missingBits;
+ if (validBits >= missingBits)
+ {
+ hBitStream->BitsInCache = validBits - missingBits;
+ }
+ else
+ {
+ hBitStream->BitsInCache = 0;
+ hBitStream->CacheWord <<= missingBits - validBits;
+ }
}
return ( bits | (hBitStream->CacheWord >> hBitStream->BitsInCache)) & BitMask[numberOfBits];
@@ -243,6 +251,12 @@ FDK_INLINE UINT FDKreadBits(HANDLE_FDK_BITSTREAM hBitStream,
hBitStream->CacheWord = (hBitStream->CacheWord << bitsToRead) | FDK_get (&hBitStream->hBitBuf,bitsToRead) ;
hBitStream->BitsInCache += bitsToRead ;
+ if (hBitStream->BitsInCache < numberOfBits)
+ {
+ hBitStream->CacheWord <<= numberOfBits - hBitStream->BitsInCache;
+ hBitStream->BitsInCache = 0;
+ return (hBitStream->CacheWord >> hBitStream->BitsInCache) & validMask ;
+ }
}
hBitStream->BitsInCache -= numberOfBits ;