diff options
| -rw-r--r-- | common/bitstream.h | 31 | 
1 files changed, 17 insertions, 14 deletions
| diff --git a/common/bitstream.h b/common/bitstream.h index 6b9ab97237..c5226d5124 100644 --- a/common/bitstream.h +++ b/common/bitstream.h @@ -50,7 +50,8 @@ private:  	uint32 _value;   ///< Current value.  	uint8  _inValue; ///< Position within the current value. -	uint32 _size; +	uint32 _size;    ///< Total bitstream size (in bits) +	uint32 _pos;     ///< Current bitstream position (in bits)  	/** Read a data value. */  	inline uint32 readData() { @@ -76,7 +77,7 @@ private:  	/** Read the next data value. */  	inline void readValue() { -		if ((_size - pos()) < valueBits) +		if (_size - _pos < valueBits)  			error("BitStreamImpl::readValue(): End of bit stream reached");  		_value = readData(); @@ -91,7 +92,7 @@ private:  public:  	/** Create a bit stream using this input data stream and optionally delete it on destruction. */  	BitStreamImpl(STREAM *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO) : -		_stream(stream), _disposeAfterUse(disposeAfterUse), _value(0), _inValue(0) { +		_stream(stream), _disposeAfterUse(disposeAfterUse), _value(0), _inValue(0), _pos(0) {  		if ((valueBits != 8) && (valueBits != 16) && (valueBits != 32))  			error("BitStreamImpl: Invalid memory layout %d, %d, %d", valueBits, isLE, isMSB2LSB); @@ -101,7 +102,7 @@ public:  	/** Create a bit stream using this input data stream. */  	BitStreamImpl(STREAM &stream) : -		_stream(&stream), _disposeAfterUse(DisposeAfterUse::NO), _value(0), _inValue(0) { +		_stream(&stream), _disposeAfterUse(DisposeAfterUse::NO), _value(0), _inValue(0), _pos(0) {  		if ((valueBits != 8) && (valueBits != 16) && (valueBits != 32))  			error("BitStreamImpl: Invalid memory layout %d, %d, %d", valueBits, isLE, isMSB2LSB); @@ -135,6 +136,7 @@ public:  		// Increase the position within the current value  		_inValue = (_inValue + 1) % valueBits; +		_pos++;  		return b;  	} @@ -176,11 +178,13 @@ public:  	uint32 peekBit() {  		uint32 value   = _value;  		uint8  inValue = _inValue; -		uint32 curPos  = _stream->pos(); +		uint32 curStreamPos  = _stream->pos(); +		uint32 curPos = _pos;  		uint32 v = getBit(); -		_stream->seek(curPos); +		_pos     = curPos; +		_stream->seek(curStreamPos);  		_inValue = inValue;  		_value   = value; @@ -195,11 +199,13 @@ public:  	uint32 peekBits(uint8 n) {  		uint32 value   = _value;  		uint8  inValue = _inValue; -		uint32 curPos  = _stream->pos(); +		uint32 curStreamPos  = _stream->pos(); +		uint32 curPos = _pos;  		uint32 v = getBits(n); -		_stream->seek(curPos); +		_pos     = curPos; +		_stream->seek(curStreamPos);  		_inValue = inValue;  		_value   = value; @@ -233,6 +239,7 @@ public:  		_value   = 0;  		_inValue = 0; +		_pos     = 0;  	}  	/** Skip the specified amount of bits. */ @@ -249,11 +256,7 @@ public:  	/** Return the stream position in bits. */  	uint32 pos() const { -		if (_stream->pos() == 0) -			return 0; - -		uint32 p = (_inValue == 0) ? _stream->pos() : ((_stream->pos() - 1) & ~((uint32) ((valueBits >> 3) - 1))); -		return p * 8 + _inValue; +		return _pos;  	}  	/** Return the stream size in bits. */ @@ -262,7 +265,7 @@ public:  	}  	bool eos() const { -		return _stream->eos() || (pos() >= _size); +		return _stream->eos() || (_pos >= _size);  	}  }; | 
