Class: PureJPEG::BitReader

Inherits:
Object
  • Object
show all
Defined in:
lib/pure_jpeg/bit_reader.rb

Instance Method Summary collapse

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_bitObject



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

#resetObject

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