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)

# 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.18.0.tar.gz (121.8 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.18.0-cp313-cp313-win_amd64.whl (249.8 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (388.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp313-cp313-macosx_11_0_arm64.whl (336.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl (409.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.18.0-cp312-cp312-win_amd64.whl (249.8 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (388.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp312-cp312-macosx_11_0_arm64.whl (336.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl (409.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.18.0-cp311-cp311-win_amd64.whl (249.6 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp311-cp311-macosx_11_0_arm64.whl (336.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl (409.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.18.0-cp310-cp310-win_amd64.whl (248.8 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (388.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp310-cp310-macosx_11_0_arm64.whl (335.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl (407.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.18.0-cp39-cp39-win_amd64.whl (248.1 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp39-cp39-macosx_11_0_arm64.whl (335.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl (407.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.18.0-cp38-cp38-win_amd64.whl (248.6 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (389.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp38-cp38-macosx_11_0_arm64.whl (335.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl (406.9 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.18.0-cp37-cp37m-win_amd64.whl (249.7 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (386.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl (406.3 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.18.0-cp36-cp36m-win_amd64.whl (249.6 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.18.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (386.7 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl (405.3 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.18.0.tar.gz
  • Upload date:
  • Size: 121.8 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.18.0.tar.gz
Algorithm Hash digest
SHA256 64509da86fe1b282faaa550fcf4542888c4b22782ef4ebda138a993b89134e5b
MD5 98177041b4b13bf0c21962d950acf0f0
BLAKE2b-256 e3e7e08e6f5c021256a0b3599c1d13d9410d79425d7adce5d78843b72997a269

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e5fdb9ba0883eefaf22599559d9dfde1756aa50d277e213a96a3733f92c27586
MD5 2b8d2bfd9cec0bf9bfd51b61d15f7884
BLAKE2b-256 491dbf47f5ed79f8557e2660582094adb53d44424c1f87219e1c0da6072b3064

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae055e12315be9461ccac9e4c13768a6940edf3fc49bbabb49dd059cdafa3291
MD5 5a29600b3e679370b833c7d3df74b745
BLAKE2b-256 e8e28afc7af855de58e90f06377b3fb37ddfcd54a0460216f845a2c333603220

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cdcfafef488449b15bfa15417b9722bc3de502e709e1e7b0d330f077a9b5c748
MD5 cbb374f800ba086341e8d5c9f4747c77
BLAKE2b-256 84f50857faaf92b8af59c3d6694bb3f0daa6b81a79fc350a4364fc43c8a748a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 60955d1c5310962334f129cd8cf7b93d1207f64d8d366f8651a74a7be6fed199
MD5 8883ee9367bba00c860acb30b2767d4e
BLAKE2b-256 5f04eb8e719c7b2a0d7b430b26008123fb584fdd74792525e83273acaab5561f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 83c4fe8e19200c4b18a2a01012e6cfd88a12feeb0af8e1e3ab4f99aba16b0e2f
MD5 9f65259ec639a5a2ea8da70ba5626153
BLAKE2b-256 0ab7836c417763bedd588cec2ff3ed4376827d69950337fc0b0a0d20093df17b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e786000a203d92435cf26414c1e19a6f21c107434f19df581ee5ce91a33badf3
MD5 27ad2bec8ae7cba13ac0d625bcb93284
BLAKE2b-256 becb91fe6cd0ed4462fdb19f1af238dd73cda0b4780d243a4a808f74cd4bf198

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98cfe266c67d60843ba61fdc870e116a01580fb20651ac60e05f031f8d1cb768
MD5 3ec60eb2bfef103318ea0aab33223400
BLAKE2b-256 ae0cc2a6f0701b3ce530f314e67521e899b528bab2602ce88ebf708b795d184f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c9f8218ee61ce6c8b2b2ea625864a63b2f26a381ca84e44b39dcdc109bc1fede
MD5 93980c2f0625b8dd924e37bc6d2cc161
BLAKE2b-256 f5234c3820c62e3b52010abf56e0190ce69523a458afc565751f5d46b5a9684a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7286641cf658ea59741b68608f9130cd02b02aeba0ccde9908b8690e2c7d056b
MD5 be21f7270d3f2cb6eaea8080bdd5a7f2
BLAKE2b-256 52ab38af92b9641b1f655848748a82396cb4b9b98ae13d57a23e7e642f8e569b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b9e3425f4707da60eb5a985ae482f7b1fcc565136d17d3798a37c96fd412e2f7
MD5 f615958eff08b23680bf7bdf1b19b6e5
BLAKE2b-256 60fc896e142b4a4a6134c6f481a8a7e519168e05eb0c8fdf6faf71f6db52231f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5eb071fcd939665fdd67a342cd8c473df7eeeb7ac050bde0ea933fa17396c545
MD5 1a73be5bc3e2af37cf5a2df02a31ca2e
BLAKE2b-256 6183d229f7a226b12e8567339256a6a5a97477b21622608189e324b043c1b72b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 be606b488ab64e6e51814516934029692c55f5ebebceb89b580b0f5b3566e91e
MD5 ad68db478a74703f23402c5afbeedd8d
BLAKE2b-256 1cf362cfa89d5684ae38043e6b7f61d8f248c46acaba08e7ba8c6af58126a059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e479769443b1e1222fed7613b671fdecafe01280be2c1789fe3523d116bf0af1
MD5 475b11b819cec9a1b3ccdd04581dbf59
BLAKE2b-256 b0326fc87fee2c23c72956d69b913d706f52f103205e751f637c78c068f86a7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1eb49d5fda249421fae3257ce8c1b1eaa5a79a10d262514df79f2604f97a3f7f
MD5 0859688681dcb2c6484bc6797af61e1b
BLAKE2b-256 f80a27251a4e79099c7e79e0ebeb71e3062826b92d64d024861d29ecbde0bba7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4479cd8d40fa1e7f1230dd9eab9e884c4c1f8de7fdb09e71a17728880fb2cb35
MD5 65988c6ed9cff15c2b8e92b51d6ede9d
BLAKE2b-256 0ec4f97e4e8a58f18469b742fe07b6ad492852801e4a175cb72f7718faa13922

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 147eb6f268ffaec31977226d11dbd910395f7d5d5a4fbba8e39b915f9d6f848f
MD5 2fc3dcb6d2ce6e748c6aee9e36e0c43b
BLAKE2b-256 4268bda8366a3d6ce24b1548e9b8ebc322da7279a03baaf61c82a3e93bd50f23

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 46b080e446cedc8e75b7af7cf8f6a43f432331d6e85d0fd24dbae8c065bee2da
MD5 4f59ca6f8b9bdf0c8001b13e03f33be8
BLAKE2b-256 c9085a3b3d4dc36936ce336825dce18fbb1758222614d475bddedf8cc48c95f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6300ccebf8045ce68ead0b224391b25848bd461824a2cf08d72c3d07098e9126
MD5 565f4d06b52de9f1e02cb4daca34863a
BLAKE2b-256 b9c2bc9dc50f3fd33b92cdf3f4dfeccd46ca02dbc498757f350edb73d35eabb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34413f09156de8db368a0fa7e617fed64d44afdaf9589d72005f7495dcbcf442
MD5 bc014f6b4965d963b9d1911182ab3598
BLAKE2b-256 93c96b26e0f58e7711df5e992194358b2b8b57f9980bd5c3ba735c6811d3fae3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 adab2bbd04702ee32daa66bac7e84ec1d93670614bb9063352712d449a394a4a
MD5 2d94bd4200b9830f9c9f79ca0ae8d451
BLAKE2b-256 85a1dcba5610a535682c1d8dc9ed9644be9a804adadc2cbc4f04d785545a07bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 43dd67357ee98e3533e0c68ed975742565b48d80e19d7aa172e720644b994c62
MD5 9285b6f35d754365f5a655f6bbde6a3a
BLAKE2b-256 bb90782b359d20b6768b443abac030a1d9e7991919ba5fb5a81803e3e924632b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0ea0ce4222451c0c94ed5a7bd59a694d680adc45496f55c1732e6fca6512b72b
MD5 f826ee2cb4ff663b6c4075f6c3b297f1
BLAKE2b-256 01a379cf5987964c13930ac48c8761882319337c0f702e42600b7e89a1ef42d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 baa70915380ec45e608a3aaa47fb1b5ef436236e2b1248413f51b98ad4ed7e15
MD5 83c057eae77295ab076027faea8d2610
BLAKE2b-256 241c74245d6e6d8ebc74d6588194503b983f4c428a4b0e889b31268a9e379c57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2cc861451c1d1f1b25deecb15f6e35bb7895fc252a4fa876b73d3542597edb8b
MD5 d58124195ff1ef561680d6359002ec47
BLAKE2b-256 cf48df23257b21516ad99f81f056530e1dc4f4522c86b72bbb42b3f5f87e2cf2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 7408ee41f38f9f25c742014c0588b34a9004bca8736f890829d5649b505b942a
MD5 ef0fe1f8a1af96ca5654d86a148ac275
BLAKE2b-256 744afebc00906383c623d9df882106fe28f74764d984ca8fecd4fbdf34008035

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dbed591b22ded25489fb49b638d90773bc59e6463699009b6d19ea7d50fe5a6c
MD5 15be94a3f473dddc03316c2df7f6cfaf
BLAKE2b-256 bf4f1e1f9fa9d802a0206196fa9731e145a3d6c11bdb71f26aa0ec1bc13de601

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ed5e738e168c67e09d11f97c04feeac3cdfa17fe10564b1212c6c070375d40c2
MD5 8119676ec7a9e6cece79aaadceecd50d
BLAKE2b-256 57f612d3129e83e6f95c037623052721ed4c1bd02022bb93dbdba14f0ef33c28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 11d3b972b5e9a0067288f4afb01cf884de5df7964c0ded037a16a6c91c8add10
MD5 454371feee21cee0fd99e406c7133725
BLAKE2b-256 53278d9eb893872073ece67c8254d96fac4e016f4eb04b5ccb0d97cffe7d7d26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 60c72d9d2f215140955be47b1598f6b14f175b730414fd14c8d840039af894c6
MD5 b5b7613064f819b3d5796b48257e6cb4
BLAKE2b-256 3fb8bb47fe7a599592ada65a0152562ca5bbf294726bbf0a2831b7fee4a4adc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 83af25a9e1026bcdf08eabc775a10388e033bfc6423cdc93559b718261ec215f
MD5 2b8c682abb6cc59f1b07cc69ff0e3845
BLAKE2b-256 47d56d165fc80d4e3d18271776c63c1e5d15e7015473bc151e456043e52d7ef3

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