Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

# Command Line Interface
crackle data.npy # creates data.ckl
crackle -m 5 data.npy # use a 5th order context model
crackle -p data.npy # use pin encoding for labels
crackle -p -m 5 data.npy # use pins and markov model
crackle -d data.ckl # recovers data.npy
crackle -m 0 data.ckl # change markov model order
crackle -t data.ckl # check for file corruption
import crackle
import numpy

labels = np.load("example.npy") # a 2D or 3D dense segmentation

binary = crackle.compress(labels, allow_pins=False, markov_model_order=0)
labels = crackle.decompress(binary, parallel=0) # use all cores (default)

# faster extraction of binary images
binary_image = crackle.decompress(binary, label=1241)

# get unique labels without decompressing
uniq = crackle.labels(binary) 
# get num labels without decompressing
N = crackle.num_labels(binary) 
# get min and max without decompressing
mn = crackle.min(binary)
mx = crackle.max(binary)
# check if label in array in log(N) time
has_label = crackle.contains(binary, label)

# iterate over all binary images rapidly. crop
# close crops to the ROI and makes iteration a bit faster
for label, binimg in crackle.each(binary, crop=True):
  pass

# Remap labels without decompressing. Could
# be useful for e.g. proofreading.
remapped = crackle.remap(
  binary, { 1: 2, 2: 3, ... },
  preserve_missing_labels=True
)

# change dtype to smallest possible w/o precision loss
remapped = crackle.refit(binary)
# renumber array and change dtype to smallest possible
remapped = crackle.renumber(binary, start=0)

# for working with files
# if .gz is appended to the filename, the file will be
# automatically gzipped (or ungzipped)
crackle.save(labels, "example.ckl.gz")
labels = crackle.load("example.ckl.gz")

# Save a crackle array as a numpy array
# in a memory efficient manner.
crackle.save(binary, "example.npy.gz")

arr = crackle.CrackleArray(binary, parallel=0) # 0 means use all cores (default)
res = arr[:10,:10,:10] # array slicing (efficient z ranges)
arr[:,:,30] = 20 # write to a crackle array (whole z slices write faster)
20 in arr # log(N) check
arr = arr.numpy() # convert to a numpy array

# low memory extraction of point clouds
ptc = crackle.point_cloud(binary) # { label: np.ndarray, ... }
ptc = crackle.point_cloud(binary, label=777)
ptc = crackle.point_cloud(binary) 

# rapid and low memory
voxel_counts = crackle.voxel_counts(binary)
centroids = crackle.centroids(binary)
bbxes = crackle.bounding_boxes(binary)

# low memory CCL, the more memory you provide, the faster it goes
ccl_binary = crackle.connected_components(
  binary, 
  connectivity=26, # 6 (faces) & 26 (faces,edges,corners) supported
  memory_target=int(1e9), # bytes
  progress=True,
  return_mapping = False, # can also return { cc label: original label }
)

# building big arrays with low memory
binary = crackle.zeros([5000,5000,5000], dtype=np.uint64, order='F')

part1 = np.zeros([1000, 1000, 1000], dtype=np.uint32)
part2 = crackle.ones([1000, 1000, 1000], dtype=np.uint32)

binary = crackle.asfortranarray(binary)
binary = crackle.ascontiguousarray(binary)

# creates a crackle binary with part1 stacked atop part2
# in the z dimension. x and y dimensions must match
# without needing to decompress anything.
binary = crackle.zstack([ part1, part2 ])

# splits a crackle binary into before, middle (single slice),
# and after sections without decompressing.
before, middle, after = crackle.zsplit(binary, z=742)

# splits binary into individual z slices
sections = crackle.zshatter(binary)

This repository is currently Beta. It works and the format is reasonably fixed. There may be some improvements down the line (such as 3d compression of crack codes), but they will be a new format version number.

Crackle is a compression codec for 3D dense segmentation (labeled) images. The algorithm accepts both signed and unsigned integer labels (though the implementation currently has some restrictions on signed integers). It is written in C++ and has Python bindings. Crackle uses a two pass compression strategy where the output of crackle may be further comrpessed with a bitstream compressor like gzip, bzip2, zstd, or lzma. However, if the Crackle binary, which is already small, is not further compressed, it supports several efficient operations:

  • Query if a label exists in the image
  • Extract unique labels
  • Remap labels
  • Decode by Z-Range

Crackle is inspired by Compresso [1]. Compresso innovated by separating labels from boundary structures. There were conceptually four (but really five) elements in the format: header, labels, bit packed and RLE encoded binary image boundaries, and indeterminate boundary locations.

Crackle improves upon Compresso by replacing the bit-packed boundary map with a "crack code" and can also use 3D information to reduce redundancy in labels using "pins".

See benchmarks for more information on Crackle's size and compute effiency.

Installation

pip install crackle-codec 

Building from source (requires cmake and a c++ compiler):

git clone https://github.com/seung-lab/crackle.git
cd crackle
git submodule update --init --recursive # fetches google/crc32c library
python setup.py develop

Versions

Format Version Description
0 Initial release w/ flat, pins, crack codes with finite context modeling. Beta.
1 Incr. header to 29 bytes from 24. num_label_bytes u32->u64, adds crcs to protect stream components.

Stream Format

Section Bytes Description
Header v0: 24, v1: 29 Metadata incl. length of fields.
Crack Index header.sz * sizeof(uint32), v1: +4 Number of bytes for the crack codes in each slice + CRC32c(le)
Labels header.num_label_bytes Can be either "flat" labels or "pins". Describes how to color connected components.
Crack Codes Variable length. Instructions for drawing crack boundaries.
Labels crc32c (v1 only) 4(le) v0: n/a, v1: crc32c of the labels binary.
Labels crc32c (v1 only) header.sz * 4(le) v0: n/a, v1: crc32c of the uncompressed uint32_t fortran order connected component labeling of each z-slice.

A Note on CRCs

CRCs protect each step of the decoding process. The fixed width header is protected by crc8, which contains information for decoding the crack index. The crack index is in turn protected by a crc32c. This is not overkill because a very large volume or a volume that is randomly accessible in XY as well as Z would need a crc32 vs a crc16.

The crack index is used for decoding the structural information (the connected components for each slice). We store a crc32c for each z-slice. This allows random z access to be validated while balancing against the storage cost of creating too many crc (e.g. vs. once per a grid).

We also store a crc32c for the labels binary independently of the crack codes.

All crcs are stored little endian.

Why not store a single crc for the entire uncompressed image? This would make it difficult to validate as a single crackle file could represent many terabytes of data. It would also make it difficult to edit the labels (remap) independently of the structure. Storing a crc32c per a z-slice also allows for z-stacking independent slices without recalculating crcs.

The downside to this strategy is a small increase in the file size and an increase in false positives for crc32s. This is the price of having the format be more of a random-access array format than a bitstream format. However, as crackle is designed to be two stage compressed, for example, with lzip, an LZMA variant with error correction properties, these issues are mitigated when archived.

crc8 (0xe7, initialized with 0xFF) was selected due to its ability to reliably detect two bit flips in up to 247 bits of message data, the best available for our header length.

crc32c was selected as the polynomial due to the availability of high performance implementations. This is important to avoid CRC calculation being a significant cost to the codec.

Error Detection and (Limited, Human Assisted) Correction

Due to this mutli-crc strategy, it is possible to narrow down corruptions to the section of the binary where they occur. For example, if you are concerned with only z=1-100 and the error occurs at z=200, you're ok. If the error occurs in the labels_binary, but you were planning on applying a full new mapping anyway, you can get away with discarding the extant labeling. Certain bit flips in the labels binary will create out of range keys, which will aid in identifying exactly where the error occured. Headers can be repaired potentially be human inspection (if they know the dataset).

Header

Attribute Value Type Description
magic crkl char[4] File magic number.
format_version 0 or 1 u8 Stream version.
format_field bitfield u16 See below.
sx, sy, sz >= 0 u32 x 3 Size of array dimensions.
grid_size log2(grid_size) u8 Stores log2 of grid dimensions in voxels.
num_label_bytes Any. u64 Number of bytes of the labels section. Note the labels come in at least two format types.
crc8 Any. u8 CRC8 of format_field thru num_label_bytes using polynomial 0xe7 (implicit) and 0xFF initialization.

Format Field (u16): DDSSCLLFGOOOOURR (each letter represents a bit, left is LSB)

DD: 2^(DD) = byte width of returned array (1,2,4,8 bytes)
SS: 2^(SS) = byte width of stored labels (sometimes you can store values in 2 bytes when the final array is 8 bytes)
C: 1: crack codes denote impermissible boundaries 0: they denote permissible boundaries.
LL: 0: "flat" label format, 1: fixed width pins (unused?) 2: variable width pins 3: reserved
F: whether the array is to be rendered as C (0) or F (1) order
G: Signed (if (1), data are signed int, otherwise unsigned int)
OOOO: Nth-Order of Markov Chain (as an unsigned integer, typical values 0, or 3 to 7). If 0, markov compression is disabled.
U: if 0, unique labels are sorted, else, unsorted
R: Reserved

CRC8 only covers the header. It doesn't cover the magic number or format version since those are easily human correctable if needed.

Flat Label Format

Attribute Type Description
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
cc_to_labels smallest_type(num_labels)[sum(cc_per_grid)] Array mapping CCL IDs to their proper value by indexing the unique labels array.

Flat labels are random access read, allow efficient reading of unique labels, efficient remapping, and efficient search for a given label's existence. Since the connected component labels can often use a smaller byte width than the unique values, even noise arrays can see some value from compression.

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

Attribute Type Description
background_color stored_data_width Background color of image.
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
fmt_byte u8 00CCDDNN DD: 2^(DD) is the depth width NN: 2^(NN) is the num pins width, CC: 2^(CC) is the single components width.
pin_section Bitstream to end of labels section. Contains pin information.

PIN SECTION: | PINS FOR LABEL 0 | PINS FOR LABEL 1 | ... | PINS FOR LABEL N |

PINS: | num_pins | INDEX_0 | INDEX_1 | ... | INDEX_N | DEPTH_0 | DEPTH_1 | ... | DEPTH_N | num_single_labels | CC 0 | CC 1 | ... | CC N |

Both num_pins and num_single_labels use the num_pins_width.

Note that INDEX_0 to INDEX_N are stored with a difference filter applied to improve compressibility.

A pin (color, position, depth) is a line segment that joins together multiple connected component IDs and labels them with a color (an index into UNIQUE LABELS) in order to use 3D information to compress the labels as compared with the flat label format. Pins are slow to compute but fast to decode, however random access is lost (a full scan of the labels section is needed to decode a subset of crack codes). The most frequent pin is replaced with a background color. Like with flat, efficient reading of unique labels, efficient remapping, and search are supported.

Depending on the image statistics and quality of the pin solver, pins can be much smaller than flat or larger (some heuristics are used to avoid this case). An excellent example of where pins do well is a binary image where remarkable savings can be achieved in the labels section (though overall it is probably a small part of the file).

For very short pins (e.g. depth 0 or 1) that take more bytes to record than simply listing the corresponding CC label, we list the CC label instead. This calculation is made depending on the dimensions of the image and the max pin depth, and the byte width of the CCL labels.

Example calculation. For a 512 x 512 x 32 file with an average of 1000 CCL's per a slice and a maximum pin depth of 30, a pin takes 4 index + 1 depth = 5 bytes while a CCL takes 2 bytes. Therefore, depth 1 and 2 pins can be efficiently replaced with 1 and 2 CCL labels for a 60% and 20% savings respectively. CCLs are also difference coded to enhance second stage compressibility.

Fixed Width Pins (disabled)

| BACKGROUND COLOR (STORED_DATA_WIDTH) | NUM_LABELS (u64) | UNIQUE LABELS (NUM_LABELS \* STORED_DATA_WIDTH) | PIN SECTION |

PIN SECTION: |PIN0|PIN1|PIN2|...|PINN| PIN: |LABEL|INDEX|DEPTH|

A fixed width variant of pins has also been developed but is not enabled. It frequently is not significantly smaller than flat outside of special circumstances such as a binary image. An advantage this format would have over condensed is that the pins can be sorted and searched rapidly by index, which reduces the amount of reading one might have to do on an mmapped file. Please raise an issue if this seems like something that might be useful to you.

Crack Code Format

CRACK CODE: MARKOV MODEL | CHAIN 0 | CHAIN 1 | ... | CHAIN N |

CHAIN: | BEGINNING OF CHAIN INDEX (sizeof(sx * sy)) | BIT PACKED MOVES (2 bits each) |

MARKOV MODEL (if enabled): priority order of moves UDLR packed per a byte. 4^order bytes.

The BEGINNING OF CHAIN INDEX (BOC) locates the grid vertex where the crack code will begin. Vertices are the corners of the pixel grid, with 0 at the top left and sx*sy-1 at the bottom right (fortran order).

The crack code is a NEWS code (up,right,left,down). Impossible combinations of directions are used to signal branching and branch termination. The next chain begins in the next byte when a termination signal causes the current branch count to reach zero.

There may be ways to further improve the design of the crack code. For example, by applying a difference filter a few more percent compression under gzip can be obtained. In the literature, there are other shorter codes such as a left,right,straight (LRS) code and fancy large context compressors that can achieve fewer than one bit per a move.

Boundary Structure: Crack Code

Our different approach is partially inspired by the work of Zingaretti et al. [2]. We represent the boundary not by border voxels, but by a "crack code" that represents the edges between voxels. This code can be thought of as directions to draw edges on a graph where the vertices are where the corners of four pixels touch and the edges are the cracks in between them.

Since this regular graph is 4-connected, each "move" in a cardinal direction can be described using two bits. To represent special symbols such as "branch" and "terminate", an impossible set of instructions on an undirected graph such as "left-right" or "up-down" can be used (occupying 4 bits). In order to avoid creating palendromic sequences such as (3, 0, 3) meaning (down, branch) but can be read (terminate, down), we can use the left-right impossible directions to rewrite it as (3, 2, 1).

While the image is 3D, we treat the image in layers because working in 3D introduces a large increase in geometric complexity (a cube has 6 faces, 12 edges, and 8 corners while a square has 4 edges and 4 corners). This increase in complexity would inflate the size of the crack code and make the implementation more difficult.

Label Map: Method of Pins

Each 2D CCL region must has a label assigned. Due to the 2D nature of the crack code, we cannot use 3D CCL. However, for example, a solid cube of height 100 would need 100 labels to represent the same color on every slice as in Compresso.

It is still possible to reduce the amount of redundant information even without 3D CCL. For each label, we find a set of vertical line segments ("pins") that fully cover the label's 2D CCL regions. Sharp readers may note that this is the NP-hard set cover problem.

Once a reasonably small or minimal set of pins are found, they can be encoded in two forms:

Condensed Form: [label][num_pins][pin_1][pin_2]...[pin_N] Fixed Width Form: [label][pin_1][label][pin_2]...[label][pin_N] Pin Format: [linear index of pin top][number of voxels to bottom]

Fixed width example with label 1 with a pin between (1,1,1) and (1,1,5) on a 10x10x10 image: [1][111][4]

An alternative formulation [label][idx1][idx2] was shown in an experiment on connectomics.npy.cpso to compress slightly worse than Compresso labels. However, this alternative formulation theoretically allows arbitrary pin orientations and so might be useful for reducing the overall number of pins.

The condensed format is a bit smaller than the fixed width format, but the fixed width format enables rapid searches if the set of pins are sorted by either the label (enables fast label in file) or the likely more useful sorting by top index to filter candidate pins when performing random access to a z-slice.

References

  1. Matejek, B., Haehn, D., Lekschas, F., Mitzenmacher, M., Pfister, H., 2017. Compresso: Efficient Compression of Segmentation Data for Connectomics, in: Descoteaux, M., Maier-Hein, L., Franz, A., Jannin, P., Collins, D.L., Duchesne, S. (Eds.), Medical Image Computing and Computer Assisted Intervention − MICCAI 2017, Lecture Notes in Computer Science. Springer International Publishing, Cham, pp. 781–788. https://doi.org/10.1007/978-3-319-66182-7_89

  2. Zingaretti, P., Gasparroni, M., Vecci, L., 1998. Fast chain coding of region boundaries. IEEE Transactions on Pattern Analysis and Machine Intelligence 20, 407–415. https://doi.org/10.1109/34.677272

  3. Freeman, H., 1974. Computer Processing of Line-Drawing Images. ACM Comput. Surv. 6, 57–97. https://doi.org/10.1145/356625.356627

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crackle_codec-0.33.0.tar.gz (143.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

crackle_codec-0.33.0-cp313-cp313-win_amd64.whl (310.9 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.33.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (480.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.33.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (458.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.33.0-cp313-cp313-macosx_11_0_arm64.whl (431.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.33.0-cp313-cp313-macosx_10_13_x86_64.whl (488.9 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.33.0-cp312-cp312-win_amd64.whl (310.9 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.33.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (481.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.33.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (459.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.33.0-cp312-cp312-macosx_11_0_arm64.whl (430.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.33.0-cp312-cp312-macosx_10_13_x86_64.whl (488.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.33.0-cp311-cp311-win_amd64.whl (311.1 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.33.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (481.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.33.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.33.0-cp311-cp311-macosx_11_0_arm64.whl (430.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.33.0-cp311-cp311-macosx_10_9_x86_64.whl (487.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.33.0-cp310-cp310-win_amd64.whl (310.1 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.33.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.33.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.33.0-cp310-cp310-macosx_11_0_arm64.whl (428.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.33.0-cp310-cp310-macosx_10_9_x86_64.whl (486.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.33.0-cp39-cp39-win_amd64.whl (312.1 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.33.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (480.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.33.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (456.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.33.0-cp39-cp39-macosx_11_0_arm64.whl (428.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.33.0-cp39-cp39-macosx_10_9_x86_64.whl (486.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file crackle_codec-0.33.0.tar.gz.

File metadata

  • Download URL: crackle_codec-0.33.0.tar.gz
  • Upload date:
  • Size: 143.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.3

File hashes

Hashes for crackle_codec-0.33.0.tar.gz
Algorithm Hash digest
SHA256 c874ea03935bbba62a011802b0dfe9a4f04a7847988fe519514fc31d54b5a3f4
MD5 3bcca361713bb592d234fc9c33231e24
BLAKE2b-256 9ece486eb06469aa59a215015018d243397a27ac060554b4d41d816dd3e0739b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 67d0636580d4c030636ba79be5f47725bd1d30ef031e4c79464cd9353378124f
MD5 829c64ff2bab29de72e15fa7823f0295
BLAKE2b-256 0447a63d7641a9e37cd57c564da425327b5ffcf4856487e27f6f2972fc579e84

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 38aeebb0da77201985ac439924664d1aac289501658b4d29c57625be3c1b1da7
MD5 ed28b6e84e0c57b2b0aeb04fc14e80c1
BLAKE2b-256 fc5d63a0195da7bec2f6d906cecd8f26e5bc94fd46bfe5f51d8597ecb8645001

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c7821b4eede27363f5c5eb5376b15b61a5aa6a882365dff1ba86f1a21060246e
MD5 5acf371e8d16e2ad0c5bc86f4e06595b
BLAKE2b-256 ace7093a6739a19bcb7be43ffbd5f7d0a8e39b428df0b8dbf0f7df41b12b301e

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 576ac4fea89b316deeb711c45c728bc3247b1613a0d2ad8b0741a6734b9711d1
MD5 aec792d7f3d65c0593bf0d597808f98d
BLAKE2b-256 3b4115a729384275eb78699ad78f75b24892592bd4e5648caf0bcfa557c36ef1

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7e6ece4660ac9078bb10fbc5e5c60492bd4c45a08d323fe93c41af588b60f75f
MD5 bc74ab8277398d0b4dbdc85d7b06b504
BLAKE2b-256 b3e7708f151b6801659564f2e01e1f829057963e14d25597810ed975dbca637b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a5c6c09bd628a5bcf6079cc5c8cbdef87dc199581b31311f49b669665231038a
MD5 bec4782debb43baf640d7394062ffd0e
BLAKE2b-256 5c4c2b89ef826202a3179d49b3d6f435c63cde67f5af464e843ec5f2f018a725

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 47ae98d42fade069c314776eb202cac6a56ed977c6c37d54915275878853ca66
MD5 44073cd585b7c97d367d279a2654bd32
BLAKE2b-256 f0b96e0b9d4742c3e21f30dba015790f61c7d364dcf3cec1a4123cc4bfc1740b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4af96e9bef8f33a3a7c3351290bc42cefde6a467969f401106c798e046675612
MD5 d3fd8c903f96113001157a5d3b6ec1d5
BLAKE2b-256 37f74f8b5edbea60487f8bedb66082eac9a07ce283154a04b99c5e3c8efa8c93

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a37a91220a7e589215bae6ba126928b323ea87463792e84756948fdbd8d31cd9
MD5 4c372f02c1526759f7fdaff69b38e796
BLAKE2b-256 29d5f54eae64e4b316b1b4d19806531d71e67de7ae5967d2c83ff9e04e971591

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3a0f903d750bd4fac1de3f99328996a0fc88fb8c2a034604434ef6e6850029cc
MD5 59023a4eac3fef7148d15a384b2b70a7
BLAKE2b-256 be2b9992e6662ca54624b321a2ba37735578586e89ffecb6a409e05a254ce12f

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f87fd185a5e4651b573626651de7e98a0257279113b5374f8dd112c2e5ae0bfe
MD5 7927474fb37a4e4170a56bfe3dfe052b
BLAKE2b-256 e7999063478b9fa440beecb777ee48117559e7bf0ec59aa6c2b1a1fd1e0e05b7

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aa52e431c261d5176ad60d686ba235dbd2f96715b85b3e95ddcb0f3459d05f7e
MD5 177e2029c3c6228df27e0ef98ce55fc5
BLAKE2b-256 d5959042bff98571d484210bd4749f27be65cb3fccc9f178f46846dd2d7ec350

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bd6384be3577caab4dcac6066c72a8e916df4081ff7fd16859ea81690cd722c8
MD5 7b052e9931fad186f505295964c9289f
BLAKE2b-256 b0fa2481b4da28f0b9f47aece4a041a18db9cf105376f9e07785ec839d895528

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bb095f830d8c5da1c204d9ce68141b744d1b92d0fc5d43438afec26bd3734c27
MD5 6135fba98bf9d0b91e8cc600204fc4eb
BLAKE2b-256 59b388fe5835398ab711f3e8725df486488595ce87baf7b7f657aac4b8e47475

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c4ff333c921f48da7524a2a567bf9ed516cd0996ce316b397ac0b3f6b47ca213
MD5 fbea012fe946b38990afc54cfbdc1ea3
BLAKE2b-256 6c56b8b762071792e56c54a336e32e9440e79e94f42d603acade3462e9cb0bbb

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8445d478fcafc0bec0d0b11c17efdc9fb68e3c90021f93f5b4faa07f0a1ae29c
MD5 8e1fae5ad5474b33dbbc5b1ef61eaa27
BLAKE2b-256 a60b5e21439f84c52eafc76113337dd74eec67b0d051acc7dd02bf3d0dd31623

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 316610c41b5f7607732835afb755c0c146a66630b6aeb69e6de90aaf0e570dab
MD5 40037ab901a27e787aab5d806be74105
BLAKE2b-256 2e09a8e94d625a9dab7c603883e7e89030bd66bc27ea198431506ca347ca6bf1

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 591058f5199ecb34b46dbbbb6b23775abf48fd7b82bd1bc421dc9ed15e3610d9
MD5 8c27c43a89ec8ffb28b304131555f5bf
BLAKE2b-256 f798cce31356563cbe0ac2ea5d18eb8f37481f3f426ea2580faa11724d6c5f0e

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a99c322e6105f656197d87607fb687bc05482049a21f21b33ebf1de795b19a1e
MD5 f76a814e06c465ab6af3863b391107b4
BLAKE2b-256 541bc15ac27d30ee565a0a86b1f4be1adfc4b3dd3b0e462d2a5f6ad207c5df65

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2dea82a5c63d57fcdd16176fbfda9de0b6aef1d2223569a2f629cdb7c160c133
MD5 258266848bb8789d232bc0e4ca713f8c
BLAKE2b-256 dbcb82e56df64d2b4803dd9c5cb92545cd375808bf6393bf49e40e9f3048156a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 55dc63c96ab7a915f185c1e3cb2c4f1370a3b9d3e5a28a1778e2f98b1ab3c953
MD5 2fff703f8fde9c1fe513c2529ae93fa4
BLAKE2b-256 5958dfb5c082653f9ded8ad480c5ea00a03556cafddebbb30db57aa6c044a717

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5d73125f14e6252c134888babae810ac33f906d01418e3bfc6061eddd06bea40
MD5 83c1962efad5218de970f771b5af0934
BLAKE2b-256 3f13e540ffc1423edf634649e04a66da0e47b59cbedf6e1a9c280bc33e50ff3b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fca288dab6ca01ad1f3d07bcbca04f59f7a28ff11a2cbdf8d173d3a1d71a7127
MD5 8478b7382575c4f125bf7b2c8100de26
BLAKE2b-256 4eb88bd236a634efaaa1bfbdbbeb732275c1c8b9a8bb763ad90fe1d30b293053

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4f318722c09ed93fdd86a2f649cad13ac68c4560f10e506152fec137d4620c41
MD5 eb2bbaec557bf577f6783dd6ba9f06cd
BLAKE2b-256 74664fdab190c64fc661e914e10ec1549599116e64b2fa723ce7b1a207a0f60c

See more details on using hashes here.

File details

Details for the file crackle_codec-0.33.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.33.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 457c81e34cdc9c940c1ca0da2ade597a26eca2a81486db6d62bfe04dee78ab24
MD5 15be3652a27bbd4b2647c0bd77748240
BLAKE2b-256 d739d1a41ac9d008901e47ab555fb1e64ca5a44cae3ee272e86fbeaed8d4a63d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page