Skip to content

Instantly share code, notes, and snippets.

@mic159
Created March 18, 2018 13:57
Show Gist options
  • Save mic159/4369eaff79970599df84c7a18f0b9bfd to your computer and use it in GitHub Desktop.
Save mic159/4369eaff79970599df84c7a18f0b9bfd to your computer and use it in GitHub Desktop.
Exponential-Golomb coding in hachoir
from hachoir.field import Field
class UExponentialGolomb(Field):
def __init__(self, parent, name, description=None):
super(UExponentialGolomb, self).__init__(parent, name, description=description)
self._zeros = None
self.determine_size()
def determine_size(self):
zeros = 0
# Find the first 1
while self._parent.stream.readBits(
self.absolute_address + zeros,
1,
self._parent.endian,
) == 0:
zeros += 1
self._size = zeros + 1 + zeros
self._zeros = zeros
def createValue(self):
if self._zeros == 0:
return 0
data = self._parent.stream.readBits(
self.absolute_address + self._zeros,
self._zeros + 1,
self._parent.endian,
)
return data - 1
def createRawDisplay(self):
return str(int(self.value))
def hasValue(self):
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment