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)

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

# rapid and low memory
voxel_counts = crackle.voxel_counts(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)

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.20.0.tar.gz (122.6 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.20.0-cp313-cp313-win_amd64.whl (253.7 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (390.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl (340.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl (414.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.20.0-cp312-cp312-win_amd64.whl (253.6 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp312-cp312-macosx_11_0_arm64.whl (340.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.20.0-cp312-cp312-macosx_10_13_x86_64.whl (414.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.20.0-cp311-cp311-win_amd64.whl (253.6 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl (340.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl (413.9 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.20.0-cp310-cp310-win_amd64.whl (252.6 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (386.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp310-cp310-macosx_11_0_arm64.whl (339.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl (412.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.20.0-cp39-cp39-win_amd64.whl (252.0 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (387.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp39-cp39-macosx_11_0_arm64.whl (339.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl (412.7 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.20.0-cp38-cp38-win_amd64.whl (252.5 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (385.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp38-cp38-macosx_11_0_arm64.whl (339.2 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl (412.2 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.20.0-cp37-cp37m-win_amd64.whl (253.5 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (393.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp37-cp37m-macosx_10_9_x86_64.whl (411.6 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.20.0-cp36-cp36m-win_amd64.whl (253.3 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.20.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (391.3 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.20.0-cp36-cp36m-macosx_10_9_x86_64.whl (410.6 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.20.0.tar.gz
Algorithm Hash digest
SHA256 987342748097380a0ae5d5882d174901576acd3ad7689f1dc1f57378dbce7ab9
MD5 70fce15e592c3b3259912f2283051575
BLAKE2b-256 276dd7f67385922236218cced39563b6d0f3ff5ef6b2cacdcde33e9a1e9a1ffa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ec73346f11c83dc55edaa733b0f3b6ffa4a53f870e8b64e73ee6717582bd9f4e
MD5 f92dc9368df71bda270426fa1c58ae8f
BLAKE2b-256 4445fec54ac7278f8610472fb36401ddc8c594ee611e266426fc146fa8416e40

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab0d59dfb367e15659bdb7fb5b8fcf70d1818646c04c7182c6f2eb56a3934108
MD5 6ff6fe02af765330e8719981a2171cdd
BLAKE2b-256 02410daae3ff2dc57a8138df6ce37f65948a54eb1eadaaed9572c60a9b8c4a4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 073a8debd0a8d7a7da8438f9a447eeb076271914443586d230ce38b1c603936e
MD5 700582ec3044f8682b82e9c2b0e6cc5b
BLAKE2b-256 6f09083a73f2cf8afb0a68ac62567b44c937433344846bc9415ce72eeca0a39c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bde78c86c7465a2242457785586be3ddbb8807b2163e3c0b60708c0ccdc79717
MD5 9dd6a8eeccdb5e94e87db87399f83ef8
BLAKE2b-256 a9a7193309618275e5c7d13963d913b0db7936756350f7c58db81180aecf162e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 96bd30ea860b86e578b836a9ade10df9000c24674dc2f13f2b6c62bfc0edd27a
MD5 c3cff383d0cf7d3f02e5b632ec6f19ab
BLAKE2b-256 3c9bcc527d73193d3a444c84c3ceda40a06399974173b5f5e6714f77e21b232f

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0816c8c673798b760e8eb44864cec048d12595e7d430edfd4241e15c7ee95e29
MD5 49b2235bcf311b2c22c0c25774dea333
BLAKE2b-256 a2ee4a9e58cc093ed3377c04a3cda42ce942d0705e6e20281aa3a66e307b55ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e15fc2fd35d1e1340e0c4198f6600f3c6468d65b71dadc99e93d0d8cdd5c2fd1
MD5 ffd39b95b04b51d663d799316f422210
BLAKE2b-256 d71570bf1304aff083088e1589cbbcbeb233bf0151fa5c7a53ad93f07e99afdf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9bc04e3fcc96489d1348d72c2de7a6d04708de62528ac13fcc7c7b635ca373a7
MD5 6d985b607b8ac0736a6cdeabacfcd927
BLAKE2b-256 a9e88566dda5013bcdd6de11609adee9cc7ece9eedf5813d474b68dca9cb0f95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 bf168a257c06ffb139cab74958ea83526a228295ec1324cc74208802f4c23e86
MD5 4bec09584c66b51682adb27b975886f4
BLAKE2b-256 4af5449c9908f48ac923e3ae0a12029fe1789934a04bdd7bf97a4ec62286e4dc

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 26644325a45fe3469db1e7ef6731c96f6ee9a237bb3ed128edb843a0e4ed6e0b
MD5 f5bee5d032b0b6ef69d2640f72d8c322
BLAKE2b-256 8a7e52933a99d2b2402c938e7a170c62d5b0f8d11da7747827f83d607830d28e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb1061ad038617e9e9cf214ee9658af2d062a8a1a54cc2791ec648721ff966af
MD5 b4bbce0b99315a3eaad2b144f6211b6c
BLAKE2b-256 31f693441331c4c1036b5554d98299d9d5fc6144fa01319fb6ca2b7925f0f7ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fd2093a20fb4af6f50db13a9fa7b2a323ea17ab2d7dde087d2dfe5176b8cc774
MD5 114c3c909a57af8be11dfb707bc3909c
BLAKE2b-256 fb485c2f1d5a35b5029e94e4dc3aa960ed7627815953bb77f9be6078c0561283

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8f83fd0b301ff1ffcbb768d8e10d0dd8c977932f1183f98154da73d640fa75b3
MD5 883cf471378b02535e0bfe6279cfacb1
BLAKE2b-256 692fc91dd0d0b04bd3e39e20f59ea2d1dba9caf299ee142a9282c73a888bbadd

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d45989d8905f71dd8107b72a2f0a7a8283b75f855342e6436dcaf04db5640c38
MD5 8ff098f71df49997127e9060fa3c56a2
BLAKE2b-256 076f5367bfa489bfdedeeb3854c64fa11dad5631188c647edde98954cf92d32a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44c6300abf27eb527ed520c34a3f9c0e4cac621e3d7927fe8dbf17b71e9c9ef2
MD5 a54c9a98bf69e707b8ef39fa6f92bef3
BLAKE2b-256 9d073763b1d3151a4e51bc91ae0e34e90e5c55b0b1631b5cea58f15b39796bbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d3606b037cf4b41900532c5804b54cb76d06f48095d79ba7615940ee2d0c3438
MD5 3825d7a1f9e10589810a5e683d2eb6dc
BLAKE2b-256 f988281621864ed3d498da532027e274bf0fb1e398f4c45b8d3264595022e753

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a1b58d58b1b7e0729987fc90303f6fa5249e20351bd5eeb7cbd7346875970714
MD5 e6a5736c0eb840e2099e838183eb489e
BLAKE2b-256 49b687ffccfe890841ee876ed1fb22872f1a9132557645accf7c04750b41f858

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5db8d6d238125affb5ee1467c701048a7cc2d897bb0b7af87ef615c49f6880dd
MD5 1cf7ba5b9004807ba0467e4489fe25fb
BLAKE2b-256 25401fb72bfa947e440af8b5401089f0ea9b39075fd7b7414292e5974c10225a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d543c06080455d66d5790333d298a858702ed642e41c6236215e09eb3e7c1a5f
MD5 a080f8d00258eaee6c3fe1fb764f3c42
BLAKE2b-256 4e36f1ec551f3a53266fa15dd9e882c6ab86838a228b6a23e951bee3250fb1b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 05ab8ee0c3ad8e17c1a016e82e594ea0da56e613754803190b09933fea7a29d3
MD5 0583e9eb51be402b8041853e7209f214
BLAKE2b-256 9ae1cb671fa2943730e9b3fcba06c898a783286d3f2112f26de57d256cd01cb8

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e04e9e865b1f83b28d3404d01c39421d176f9127bf7f282d74f5ca4dbede8173
MD5 935bb01042b6211e7033484a5ff2ec9d
BLAKE2b-256 7bb0899c2c0ceb72b0f6f4ce82d90c3e00b66e5f0f7306617b6f6db88f6c3b64

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 57019be04ac8b8591bfeffc2e0751d764c427ac22b7dff74936d2855109737ae
MD5 f715a32d2fa1de82aba17db07f56213b
BLAKE2b-256 954cdcb16bd3e377956465e5070d965787709e897fd628b8c7f43e95aa4b0843

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e223caa28dfd7a46612aad00498641592df0e80b463c888263f129ff18323459
MD5 1448c3933a470efcc0c2dd0ea5b50d0f
BLAKE2b-256 56ed699cdebe42a4a6b3dee96353310c18820c6be5bee9c9ba1d41118e251fec

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c37e8fe723097517c989d147039f5259e4450b47e9eddd5dc03d46642135de39
MD5 52da434d4a69fe64a1de959babc063a8
BLAKE2b-256 802b90c09cd3d5361200acba876c37e243eef74894a42e8251ecd651380b92ce

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ec44af4f4c17b0e75639f854cc6b15fd9c5760814a339e906a5b341452296125
MD5 692171d5199882ae1385446cb5b9bec5
BLAKE2b-256 92dba1e08a06d2783bb2432c29c0d647e9b7919e6c815d0b915929843c163bdc

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 80766bed9022c35f9b5d8ae58528d7b87061446bf8165f8f7976009444f2b7ca
MD5 bc69ce3e3b910a7304595adb8fbd59aa
BLAKE2b-256 a20ff7e7093712fb4eb5c5d0e0a9a003df1f1a55c24db3d510bc0ffa0f06cfcd

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e50ca33e3bfc2c0ae8c2bbb8a3c98713b68e780b7d01a4855f631f5fea3d995b
MD5 dd82ac36893ce8812590f78f0b049874
BLAKE2b-256 b5f57bb9e1fec4ef3cbb19409b36acc45953d40131597b17bd4dc0ef81889779

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 e0d95cc55582c96f2d0c7db944cf41dfa5ba76755fb52315058ef4ce7ddcd7bf
MD5 ccd929ccb6535cc18ab3e3088daf36f1
BLAKE2b-256 c9385339773330084eab859ed0645d4c9e040426287a433c903908509a3fd4f2

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 510525bc83e8f4e202e0da7611a62ec9f82321dda64226f99bfe372d7e7dbbbb
MD5 40272f7bfedca582616481045137f6f6
BLAKE2b-256 8ed8e20f95928b1eacf3cc3e1bafef7ebc1130048ada35fd21aebe76fbbc1988

See more details on using hashes here.

File details

Details for the file crackle_codec-0.20.0-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.20.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c8b4512a1f8e9bba811f1a44ac5dbd763c0c7738ed6b7d174fafdfc2d06b640e
MD5 9f796a0df8b6faac36b8a088b90e642b
BLAKE2b-256 c6b9dafb86bcbce35766c49639066ee86052cdac6337042f816c805ae5b6da3c

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