import sys
import _msrtc_rans
from .types import RansVariant
__all__ = ["RansVariant", "RansEncoderStream", "RansDecoderStream", "EntropyEncoder", "EntropyDecoder"]
RansEncoderStream = _msrtc_rans.RansEncoderStream
RansDecoderStream = _msrtc_rans.RansDecoderStream
class EntropyEncoder:
__slots__ = "_impl", "_variant"
def __init__(
self,
*,
pmfLengths,
pmfOffsets,
pmfTable,
variant: RansVariant = RansVariant.RansByte,
symbolBits=16,
bypassBits=4,
):
if symbolBits <= 1 or symbolBits > sys.maxsize:
raise ValueError("invalid symbolBits value")
if bypassBits <= 1 or bypassBits > sys.maxsize:
raise ValueError("invalid bypassBits value")
self._impl = _msrtc_rans.EntropyEncoder(
pmfLengths=pmfLengths,
pmfOffsets=pmfOffsets,
pmfTable=pmfTable,
variant=variant,
symbolBits=symbolBits,
bypassBits=bypassBits,
)
self._variant = variant
@property
def variant(self):
return self._variant
def encode(self, indices, values):
stream = RansEncoderStream(self._variant)
self._impl.encode(stream, indices, values)
return stream.flush()
def push(self, stream: RansEncoderStream, indices, values) -> None:
return self._impl.encode(stream, indices, values)
def __copy__(self):
return self
def __deepcopy__(self, memo):
_ = memo
return self.__copy__()
class EntropyDecoder:
def __init__(
self,
*,
pmfLengths,
pmfOffsets,
pmfTable,
variant: RansVariant = RansVariant.RansByte,
symbolBits=16,
bypassBits=4,
):
if symbolBits <= 1 or symbolBits > sys.maxsize:
raise ValueError("invalid symbolBits value")
if bypassBits <= 1 or bypassBits > sys.maxsize:
raise ValueError("invalid bypassBits value")
self._impl = _msrtc_rans.EntropyDecoder(
pmfLengths=pmfLengths,
pmfOffsets=pmfOffsets,
pmfTable=pmfTable,
variant=variant,
symbolBits=symbolBits,
bypassBits=bypassBits,
)
def decode(self, values, indices, stream) -> None:
return self._impl.decode(values, indices, stream)
def __copy__(self):
return self
def __deepcopy__(self, memo):
_ = memo
return self.__copy__()