Class: PureJPEG::BitReader
- Inherits:
-
Object
- Object
- PureJPEG::BitReader
- Defined in:
- lib/pure_jpeg/bit_reader.rb
Instance Method Summary collapse
-
#initialize(data) ⇒ BitReader
constructor
A new instance of BitReader.
- #read_bit ⇒ Object
- #read_bits(n) ⇒ Object
-
#receive_extend(size) ⇒ Object
Read additional bits and sign-extend per JPEG spec (receive/extend).
-
#reset ⇒ Object
Discard remaining bits in the buffer (for restart marker boundaries).
Constructor Details
#initialize(data) ⇒ BitReader
Returns a new instance of BitReader.
5 6 7 8 9 10 11 |
# File 'lib/pure_jpeg/bit_reader.rb', line 5 def initialize(data) @data = data @pos = 0 @length = data.bytesize @buffer = 0 @bits_in_buffer = 0 end |
Instance Method Details
#read_bit ⇒ Object
13 14 15 16 17 |
# File 'lib/pure_jpeg/bit_reader.rb', line 13 def read_bit fill_buffer if @bits_in_buffer == 0 @bits_in_buffer -= 1 (@buffer >> @bits_in_buffer) & 1 end |
#read_bits(n) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/pure_jpeg/bit_reader.rb', line 19 def read_bits(n) return 0 if n == 0 # Fast path: enough bits already in the buffer if @bits_in_buffer >= n @bits_in_buffer -= n return (@buffer >> @bits_in_buffer) & ((1 << n) - 1) end # Slow path: need to refill value = 0 n.times { value = (value << 1) | read_bit } value end |
#receive_extend(size) ⇒ Object
Read additional bits and sign-extend per JPEG spec (receive/extend).
39 40 41 42 43 44 45 46 47 |
# File 'lib/pure_jpeg/bit_reader.rb', line 39 def receive_extend(size) return 0 if size == 0 bits = read_bits(size) if bits < (1 << (size - 1)) bits - (1 << size) + 1 else bits end end |
#reset ⇒ Object
Discard remaining bits in the buffer (for restart marker boundaries).
33 34 35 36 |
# File 'lib/pure_jpeg/bit_reader.rb', line 33 def reset @bits_in_buffer = 0 @buffer = 0 end |