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)

# 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)

# 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.30.2.tar.gz (139.9 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.30.2-cp313-cp313-win_amd64.whl (304.0 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.30.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (470.3 kB view details)

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

crackle_codec-0.30.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (449.0 kB view details)

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

crackle_codec-0.30.2-cp313-cp313-macosx_11_0_arm64.whl (423.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.30.2-cp313-cp313-macosx_10_13_x86_64.whl (480.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.30.2-cp312-cp312-win_amd64.whl (304.0 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.30.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (471.8 kB view details)

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

crackle_codec-0.30.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (447.9 kB view details)

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

crackle_codec-0.30.2-cp312-cp312-macosx_11_0_arm64.whl (423.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.30.2-cp312-cp312-macosx_10_13_x86_64.whl (480.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.30.2-cp311-cp311-win_amd64.whl (304.0 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.30.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (467.9 kB view details)

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

crackle_codec-0.30.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (447.8 kB view details)

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

crackle_codec-0.30.2-cp311-cp311-macosx_11_0_arm64.whl (422.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.30.2-cp311-cp311-macosx_10_9_x86_64.whl (479.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.30.2-cp310-cp310-win_amd64.whl (302.9 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.30.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (467.3 kB view details)

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

crackle_codec-0.30.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (446.6 kB view details)

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

crackle_codec-0.30.2-cp310-cp310-macosx_11_0_arm64.whl (422.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.30.2-cp310-cp310-macosx_10_9_x86_64.whl (478.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.30.2-cp39-cp39-win_amd64.whl (305.0 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.30.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (467.7 kB view details)

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

crackle_codec-0.30.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (446.3 kB view details)

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

crackle_codec-0.30.2-cp39-cp39-macosx_11_0_arm64.whl (422.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.30.2-cp39-cp39-macosx_10_9_x86_64.whl (478.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.30.2.tar.gz
Algorithm Hash digest
SHA256 0434f7d1c39b3063c6effa763aefbc750078e7164f48bfdb3cd904d5a607739e
MD5 e300e8c00491c331aa2e9dd2cc72c27d
BLAKE2b-256 3d07fe6ab4fb6bae3490905a20893981f8d9c09a7e3042fd893f1ea769a2f439

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5f07f6f9adfbd3353488d83a44dca7e234be886c289f0177df8f53a15db2a5ac
MD5 fc4d467b8380b18d0740a262c1a55e24
BLAKE2b-256 fd486e3d40ff7eb1c561168666be6ae3059b89c8df0327ec76b5b8f29c61a410

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 73964dae09f90ed32212a8ffac746902aff9864412d1544ea553d399277fc711
MD5 144724509f68b20c0d83577712f3e4c0
BLAKE2b-256 8e4d6043cefcd19be12a0cc0b87f4e04e1b2bf362cd575cf05c097d1358e27e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e1af72759708ef23c36134df1b243cdd34317ab4a3f41787f58ae82be94fbc3c
MD5 455e2edce3b5b2b9a6de70445cd51d4e
BLAKE2b-256 bdd034ad4af011711eb9a9a698208965ca520f11d9734954b3d7389c07852319

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54113a3259edaa3b355ba411f546f52a8770649ca6da977d49de160423f2c807
MD5 f470962209fff9367bac7e28eb66bc75
BLAKE2b-256 ef1e5ad0d900bf1bb08cb32d4bd43ab88ec0e79bd88ee4069e6f7b928c74c0b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 48970d137d1ed884964bae86ba81c7341286a3d01c517d66da794572f5db1878
MD5 b5f94138afbfd5633b1dfbfbb058fe99
BLAKE2b-256 da7f5d2078ba3a342af8bb55e314e44e04e1f24000199eab20f108b2e97c4ef1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4aa56d86f0c1ed6b01f70c15b346b7f59990e344d7dd28136d84e5ba00b419cf
MD5 88cedb5b5f3988b03bf2393cfe7760e5
BLAKE2b-256 82b01223acadee23baad4285869a70f51b9ae8bed62a91fc27c907528a5c6c2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f56ebcbea850114788e9e1017d6b7a626f865bcacc2c5cb8a00fe066f7c6e767
MD5 f718924bbe7ca4a7897352b42a039fb8
BLAKE2b-256 614c6424013f40d4333455d8ce163a35e5792d6d1e0cf492a727f025767255a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4a41f7219d3539aae3b1232edb0c3a2b7892f1849f8a4a6c9a376d25c30d1c90
MD5 5aa921aa283d4364be12eec65bdc7e19
BLAKE2b-256 2361f0f537055cbdcd8fdc660b561b84d241eeb2a7494f4e222b1c437d240535

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0e3201630464e7a5b94af594e8f54643730de727035cbf3611854565a677684
MD5 991c81bcd7a726f7f10d495d5cfde1dd
BLAKE2b-256 4355034ac9d7df3b2e81128b8bb8c1642e817ae4b6762388392cbf12d8d88ec7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5b3e1d4d66c04c4482ebb0382be7800926301a2d7d335789e8bdd6156deffa69
MD5 132fd22c100e9e6efb9067b5135709cf
BLAKE2b-256 e0fb02f058e87d635b92d4e8de371f96dbc265e5998d55fb63743f229b3d060e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7dd901fcf089ac96c978a76eda4bc3fc079a0eaee7d7e8ce522a3d121b474b72
MD5 39f60098f13b6facb913781afa5ea3c5
BLAKE2b-256 ead79b275b4853fc7e708989fd62cd53110ace586b2f114475bc4dc7ab829f10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e7f2f96d8c21ed84863644678b3f7900b6c2d7085bdab1bd06fad740db1ec258
MD5 baa80834e9b04ea76eeb3b7c4e7ac776
BLAKE2b-256 4a2a0f8ffb77612481efbfa0e8e0b736e383ac971a71ad21019cb19f9e2c6f7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f49dd74d99908d4b369aceb2d8bb0d2fdb1709ab364cef8c1bdfa51634cb280f
MD5 7b915e6dfe605042878ec3224b65ca00
BLAKE2b-256 1d9963fec0d7d1b804f25fa2ae7b825502fb9b2c8d80c8fba23b04ad28489cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 637d2a850cebf0184ed4f97e34732d6792e99385d97e5dff5a968378c831ca06
MD5 3c1b486709678bc944d013639b976d2d
BLAKE2b-256 426fb96ce35ecf42a4fc261acf93576b7b7fcfebfcba9733812bde613eaf6245

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2f7e508bb2edf42b35d66f39d633026f533e4e8bcefef68cbd8b066e7021693d
MD5 1741748f5ce57b64deda6adf4df5abe8
BLAKE2b-256 c1f72a871b7de0fd7639c0558c8fc12af01629b3639b03e73968456f96f0d06b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d964461c3e555e340e154c22daa18b6b37a2d93bf675f81af5dea66f8fd5c105
MD5 3fa2fa67e15f3e67931d5db46361240e
BLAKE2b-256 8004bb10de3e27a4a373568d8e0ab34169406d6b5acfcf89706c4df1b4561742

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fa080fa7cc9a9e39d95172c19e11a7e5da51c7b21e76f7eed25d897278a2e0a1
MD5 935bcafba4a9669d00a9af91d03ef3da
BLAKE2b-256 182b63980581441b6b115a870c9874023baa76da121c37a868de42593dcfc270

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 00e5507cf5c01a971b032db665813c282eac17f608576d3ddbe5e731bbe06974
MD5 bc0b1cb6d0cd279a44f7aaf3e9793a06
BLAKE2b-256 d580f94c6207821728d3917993c37d3c2f9d2fb73dca419b7514c89bf549fb0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1f4a4df251fb7c3191536d806def019b0f186e6dfe455ab8a0b920b86e91d838
MD5 a10a8962c76bb6ee3c5dc607a1efe071
BLAKE2b-256 1d3c46e587421acccaa90ef3689798bd264627d6deac67627a56dcd91b9aa118

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 461e3249010b8cba306a1f37525fcc722908a547289d0172ae979bcb5fccb006
MD5 c6af42ed4424bd83a008e363fc7eb401
BLAKE2b-256 1ec864dcdfeb0204e22857779c5caf848c1d6d954dc37c645514b47107279347

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0e74a9b3ebcbbf22c088ae682c7ae89b6ebcb5ec99fed29ed4129ef3a6820b65
MD5 8131d255c4b96b5b3c50fccb890cef92
BLAKE2b-256 d0c49e06ca2863062a07ef802096b37b8c8d842d0d3116ca08d5ed2b24e5f94e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4bccaad914e5b9e11b77446ae30a2b432116b4c6003c829079d546233e822dc1
MD5 d331e200394d3991e30c2efa39f66f39
BLAKE2b-256 c9f4f12feae36b9d005840c9f3540225608a650e9b1a741cf034aac6a81a5b7a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5e39060ca2323960db2691d74dd252e80c4c5ab850c295eca1f44c5652f61e55
MD5 4a6ef086508eec5545eeb363eefcc566
BLAKE2b-256 78f440df8e6508bd8f855256cb5f74503ba111682d55f23c52fe19da56c4c367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ff39be99b7149cbee784a61b4118c02da5b1ed0bea655bb5224684482044fd9
MD5 82c8f5d0bd8c6eac04408942142a891b
BLAKE2b-256 dcc97b9fb2cef564f81b9c9d11d590a3ed4cc0b0b353aa0cad74e873753bbd57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3b34141018fb3d39afd12ce2409036a4fa57a8c7d3a646033ffa62f639354bab
MD5 1cde13c47201d6d103dc2683d3d6e6bc
BLAKE2b-256 1837de12add57417a740c48fd0acab166468175353de097bc3e85b967a1f02c3

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