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.21.0.tar.gz (123.0 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.21.0-cp313-cp313-win_amd64.whl (254.6 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.21.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.21.0-cp313-cp313-macosx_11_0_arm64.whl (333.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl (400.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.21.0-cp312-cp312-win_amd64.whl (254.6 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (390.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp312-cp312-macosx_11_0_arm64.whl (333.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl (400.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.21.0-cp311-cp311-win_amd64.whl (254.5 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp311-cp311-macosx_11_0_arm64.whl (334.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl (400.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.21.0-cp310-cp310-win_amd64.whl (253.6 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (388.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp310-cp310-macosx_11_0_arm64.whl (332.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl (399.0 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.21.0-cp39-cp39-win_amd64.whl (252.9 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (388.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp39-cp39-macosx_11_0_arm64.whl (332.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl (399.1 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.21.0-cp38-cp38-win_amd64.whl (253.5 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (387.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp38-cp38-macosx_11_0_arm64.whl (332.4 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl (398.8 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.21.0-cp37-cp37m-win_amd64.whl (254.6 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.21.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (393.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp37-cp37m-macosx_10_9_x86_64.whl (398.1 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.21.0-cp36-cp36m-win_amd64.whl (254.4 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.21.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (391.7 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.21.0-cp36-cp36m-macosx_10_9_x86_64.whl (397.3 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.21.0.tar.gz
  • Upload date:
  • Size: 123.0 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.21.0.tar.gz
Algorithm Hash digest
SHA256 c084fb4ae5103e16731fa890ca31deff43727943bad7030e0720d10cd3003789
MD5 9074c5c75ed65a47567648a82c5dca9b
BLAKE2b-256 f593f305e6f9d5734548d45cdaedfec41307656d8a57fb8d3a71bcc1497d4817

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 16f3956d40821f78827ab5bbe70166ff400b131e7650178096e72fa8c64fa1ec
MD5 b73e35ea3a992518f6304fdff429ad5f
BLAKE2b-256 cae440d57105074ed5ea9cbb30f84d47e02737b5b2843a9838016e0d1e7fc5c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db75ccc6dcb4b60af2681920ba5dba3c8b789970001686902223bfb24856df1f
MD5 49be6a3c10afb49e8da997483188f125
BLAKE2b-256 cf6c7ee6d06d2692ee0c4c2083e2f65463f0f731baca9c9ddc33b631118663a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e52e7713469495ff7a253f81d2796354f72d3fa2bdfdbf7b1c7b53b5827dc68d
MD5 a07165da2a8adcd07d2626eda4a538bb
BLAKE2b-256 faefb53e8e71a9ced8a82f84859c30d24c0fa9d64c6a0d8295abe7159d98351a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 03e7630ece9ac759c913dd47cbfbd605c915d329dd42a6a963f914fd6ca8ecb8
MD5 51cce4a94c6b6a040ac995e0f69a5622
BLAKE2b-256 63b680ce28d1a25c62dd1f786992103a1b5412761d5af6cf370a916c7019d89c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ec507cda9c00c1b293d77abd1f58be83fdd327204c5639d5cd0e155285dfbc02
MD5 33e09ca2d8651c7667e8ef82692972c0
BLAKE2b-256 31b715f688edf1d90e170463dd552f1de7f6547f706293662f9cc8ee819d8682

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc40c9340d53fb60ccf091a790bf4d39cc61473cb2d678303b59a276f209d875
MD5 cfcaa796f889afa510d787b8dfeac598
BLAKE2b-256 b61a9e182c183a7a8960202124551a2ebfe8446d861bea43f7aeac21af90c263

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 35bfaeba391e47bc2b657774256b2492b061795edf26f034ca92d4cc487cb1bd
MD5 3eb0dc327f959b54e595e26c00b5cee1
BLAKE2b-256 bd30d4005783107c6545e7fdef8881e02e5bbcaee884315910d3318f222212ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d5bae6b3a83cb6d4e0e7d70c117944025e28c9d3b8d57f47500b6f285962488a
MD5 7dacdbba2be77914f200eeeafe89d06f
BLAKE2b-256 ae6274e03954e7e78a2b3f39dfd28a0006e575bc2d6256f42a891bf8b14f7263

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ec32378d718e8ae5ed7d152344a7c137a9ee087ab528870077f4d4062e2a8b64
MD5 384e2f01d5bc1aaa06a343220dd2205c
BLAKE2b-256 c795a2b53275a1dd4f02704769d1dd74ccbecffc19b94cf3a99f973ba60150c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f5c01e0e0fbabff758302c28dc9a668161ef328400906575a507d6f3521be39b
MD5 4f749f3fe6d0504d63535f29f69cbfd5
BLAKE2b-256 6264e89117f5782539a4181b5123754abb9e2743ad86546f7e5d58e8f8a458bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 67e52209cb47f0977e6a855d88fe0b98bd16aeeecc9de6aaf67092050bce214d
MD5 b2a549cf3cc1f92059c7d872d75fd6a1
BLAKE2b-256 a5a1e205384ece84d749c290d7325ca9b873c6a1dc1b6eb4d34fd970d1f9074c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 66dcbfc84611a9ecdef7609713a4f9387c658a906b2b870a27b4a3b2c02f040a
MD5 bd9dac574ddd6d5e36e10dd2a89f6c34
BLAKE2b-256 fd83844e453bed35e6e6b29fca00f993f36f1b682638aed2667d01c9c68fd196

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6a08ea8767d099d2e1b67d4fd35eb3a4789972e4e63e02c6619749ddd6720660
MD5 74eae6c6e025e6c379c985d538d41e4c
BLAKE2b-256 2500f3d11196c10e50cc930a1f2248359ef812ac0cd9dc2a3bd8ce0feadc0777

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a78d5e261defd6adac32d2b9a537dc93be6f4b54e85235aaf53db3df8c63b7d7
MD5 c1e37d30f1d47b4b00ff5ba7361afee2
BLAKE2b-256 0b2f3f97847f672b161c31f40bfd05e8303f124ec8f87da1b2d8564280e539c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d1a16ea981592b113f3d420977b7dee6b44e80bcf7afc786c4faf6e9d020ad4
MD5 fbf444e951724975489456be61815beb
BLAKE2b-256 5f23a6709f50990eb2d963e689228d34cf126a862fc5ed65761cec481571a2e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 714c06789dcfd6b5c3331acbf32ebfc2fed31a634866e3b31ee381ae6a82f31c
MD5 db06e66ec5cfaae68e654bef208e03ef
BLAKE2b-256 5e845d764d404985c38d50db8b322d1144383f2f9621ed0309d641c4685d9080

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 34cb17698309d053bda279400f2c9e8a04408c8ea67936ce4adbec22e9bed9e5
MD5 9bedc6fb008c8a0e00bd8e57b75ffccd
BLAKE2b-256 84ae509ab17866f7b5264231a4bafca0a5bcc5841d17c9592f584d292d68373c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f622b823f56ca2f5ba55988be55c6bf215fa0e0ad175012a648f5af72fe83544
MD5 c1586ac160d61bd2cfdc273e5fa7433e
BLAKE2b-256 bf26c496616ce04b18a58347eef3e960f1a678308127f24ddeeda1d2ea8d27c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b57fca7aec9dc2fd9faf37102a5ece5dd248aeab71c57a342a6c510b29838688
MD5 0ec898d3fc9729ab209c7754c4f7e903
BLAKE2b-256 10008704c42e564445598583749e8bc30fd723a200c4968418ea6031929cfc4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c8bcf0c6e6e45cedaf262be08a8029797a3e7e347ba70b3576bf255a90e0bcce
MD5 c7b72b04e1953ad207673ac56e7379f0
BLAKE2b-256 dbbcee0513fef53a9a19768cb5ee25331d3acb1812d7caba02b4a0e008240035

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 dad4105f3137d15f3f69ed6ab65da3c20f37fe64d91f3bee4c6a0d0c1de98cc6
MD5 be5ff95837c68e80fbb136496f8f6c95
BLAKE2b-256 f00e2318265b296cd1c48509c53bebae31a04971327a3e48fc06adf437affc58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 41372c73a28b712e1e52b25e5f1ec2306cd2d16426967539bcd15064f9b19cce
MD5 e5de3280cbc49aae6c16bd09853b2496
BLAKE2b-256 1374e21761507b7db2166f149538ed3c9f24f0ef7810660dad20dd0eb6cb1015

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 01e4637bac481dbb8332ea1af406f2a350868d15b9035d7f6a84d3dd02f4e1be
MD5 90aefe05dce460fad603d1b75659fa2a
BLAKE2b-256 d42e8a6157a53c0e95471f3e21d097024045c8b8432af81a98cf7e48c193711d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ee67d04e20fddaef0921e655899bc8472e79c94a46f45340a6c411847bcb40dc
MD5 7fddff536dab04237a60b18551a11281
BLAKE2b-256 b7345bce11cf0a36d19bb01de57415732e71c5049c1edd5659c64d2b531338d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 be81669022a6eebdd2e5b5410dc3d3de9761fa5670ea0a02555a69ca9b1431c6
MD5 3a8a312c58a8a763550574c1951f7af0
BLAKE2b-256 6ba45a2e913cdf11f01bb6c7bebc4eda554b1743e90bf887c6da54d7d483be6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b984c65d347984f350bf70f5130e7054b3cbd723f2eead15de2517198c7d86d0
MD5 d0ac5eb518923fd941ff4b3690c1b73e
BLAKE2b-256 c00b443971d2760a5290399965f52fff623e3230213ed7362242e9c852c91d7c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a9886be23488b3b9b9bb2c8deaf0fa70a9f5713ff3b33f8aa1f2e3a17d307f0d
MD5 33fd4ea5a667ce32cb1da746ca086d43
BLAKE2b-256 8bafb68643612f86105f9ab52d8ed8adf76b3b1f6d65cb1cdbbe6931c9600d7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 8338e9abba059379a5615e51041fddf79ed1fd45573bf8e7804ae10fa4233f74
MD5 46217a8b02372c0dd83e34a7b23243ff
BLAKE2b-256 a45e692cf53f357fb68ee995b117c3fc2b21c3630ad8c3a5cda26b3e4a3700e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb1a54186171ba095e7f464cdbcff5c2db0d016ccf9bfdcbaeff61c414a386ab
MD5 2644c0ed3a68471ebaea431482af96ca
BLAKE2b-256 97611ffd5ec620a393a5ee8dc2d724ebc0897af2af2f12225ef8e14704235cc6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.21.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 004e42c1d98f17f49d2ea42088a6bac954ff069aea6fc5b38f0dd50713cff779
MD5 caf6a23a9c7119e29b61af4d7ca63e3d
BLAKE2b-256 5e0c8d3697b3030f00c3cf864f0575e64053ed581ba4cabe0367e82d2c58f143

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