Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Installation

pip install crackle-codec 

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

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

Versions

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

Stream Format

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

A Note on CRCs

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

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

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

All crcs are stored little endian.

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

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

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

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

Error Detection and (Limited, Human Assisted) Correction

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

Header

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

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

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

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

Flat Label Format

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

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

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

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

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

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

Both num_pins and num_single_labels use the num_pins_width.

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

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

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

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

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

Fixed Width Pins (disabled)

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

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

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

Crack Code Format

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

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

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

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

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

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

Boundary Structure: Crack Code

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

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

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

Label Map: Method of Pins

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

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

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

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

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

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

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

References

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

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

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

Project details


Download files

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

Source Distribution

crackle_codec-0.28.1.tar.gz (128.9 kB view details)

Uploaded Source

Built Distributions

crackle_codec-0.28.1-cp313-cp313-win_amd64.whl (281.5 kB view details)

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.28.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (451.1 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp313-cp313-macosx_11_0_arm64.whl (423.9 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp313-cp313-macosx_10_13_x86_64.whl (475.9 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

crackle_codec-0.28.1-cp312-cp312-win_amd64.whl (281.5 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.28.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (450.6 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp312-cp312-macosx_11_0_arm64.whl (423.8 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp312-cp312-macosx_10_13_x86_64.whl (475.8 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.28.1-cp311-cp311-win_amd64.whl (281.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.28.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (448.7 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp311-cp311-macosx_11_0_arm64.whl (425.0 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp311-cp311-macosx_10_9_x86_64.whl (475.4 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

crackle_codec-0.28.1-cp310-cp310-win_amd64.whl (280.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.28.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (447.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp310-cp310-macosx_11_0_arm64.whl (422.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp310-cp310-macosx_10_9_x86_64.whl (474.4 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.28.1-cp39-cp39-win_amd64.whl (279.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.28.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (448.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp39-cp39-macosx_11_0_arm64.whl (422.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp39-cp39-macosx_10_9_x86_64.whl (474.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

crackle_codec-0.28.1-cp38-cp38-win_amd64.whl (280.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

crackle_codec-0.28.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (447.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp38-cp38-macosx_11_0_arm64.whl (422.5 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.28.1-cp38-cp38-macosx_10_9_x86_64.whl (474.2 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

crackle_codec-0.28.1-cp37-cp37m-win_amd64.whl (281.2 kB view details)

Uploaded CPython 3.7m Windows x86-64

crackle_codec-0.28.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.0 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp37-cp37m-macosx_10_9_x86_64.whl (473.6 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

crackle_codec-0.28.1-cp36-cp36m-win_amd64.whl (281.1 kB view details)

Uploaded CPython 3.6m Windows x86-64

crackle_codec-0.28.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.5 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

crackle_codec-0.28.1-cp36-cp36m-macosx_10_9_x86_64.whl (472.8 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.28.1.tar.gz
Algorithm Hash digest
SHA256 dd6536d29b952a65274c69d861709cc113ec05a2bac948446feac26af2bcfa60
MD5 529a9c8cf33f9718f66a263d6909c196
BLAKE2b-256 ada7d13caa9c6848c96af97cbc65bd14c6d01b6049a1918dffd336d63755d609

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d35fc371015c83f17ba8fbb6ab6c1af06155e63347a557321c7174e0f880c40f
MD5 d4d9d839e1143c58bf355a3a8fd38578
BLAKE2b-256 b60110718bb509f7d776b38a8dc0c232687b4694bfd336a99b8ad8107929101d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1dcfa2f5b7d6829d3882d287ed47db2512df29f91467fa1a15448b6323f35b67
MD5 c06713a0a81351c05f551d8a33e76b41
BLAKE2b-256 b7e97a8573eec27f0e5d24741f822239894f10e3d3711df19b02f34e8e37bccf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 74477511507fe32337329e28e875aec3049c74f39a808b9b0c7f3c4d456af760
MD5 841d562ea39205f9717675796733f373
BLAKE2b-256 e1d46b0f174ac794b558733679ee3144d5ef71e556e437ebbb9f26e67f63af49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 027331c3129f19cca053b828f869a70e26f6e3a066a10ca7047f6b1acbc6518b
MD5 0a1f17c8648136f3f4345c6ef95da323
BLAKE2b-256 0da87116876dd50f0db9a6a93a8d6ce9b1f3602de44e78062cd228d3e65f4834

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 69f96990181bdd6dab9d0d4ce2ee4a340410001c30b82514fecce4b46c508d70
MD5 4c07283f481e4e0fbb94b4ae569ecb9d
BLAKE2b-256 4830aadf6b176d222f47c2976703578c38d7fdd4134c517f5b6dda5bbbeb472c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ce099854d480de93312e42f6cad6c998d7beff6f761061c6905648d2f361cb9a
MD5 e7d231352a4daa3c7b97077db513e830
BLAKE2b-256 c73547c95cd42fe24e6815406aa4dae692a759d0fa4de945f280f7ba4fac86bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad2b36ba36cd1bb3b49f49511966ccb02f3408530fee836df53a1c651add33ce
MD5 a6d2e55e8d5407231d3b17a7c05c173d
BLAKE2b-256 7b9c8e6b9ebd53e2306402b47b626d0921519846c7349706b54dc9569ad9c0e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8a4d0f735e25346038736e9dcd7d550bd63a0d23a17918e9150c7150c6b8beeb
MD5 51c92569cb7d3e0b328a732d5595279d
BLAKE2b-256 3280d464c39468f6175636632f49c5ada6809845696dca1bb19d506f62297c74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6263f24c757120371c2448cc147ecd984fa92b71052934d61986f5722c9b1992
MD5 91b32db385662a3dadfd788f5c507aa2
BLAKE2b-256 cf4f45cb44009e804b3528d397b4dab9973c24b9afd34ee0e46cb5ff42010684

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 62bf18736b924f1c14442e3e62b4e8e7019322403557b795e8429cfa70d2bf6d
MD5 32a4ca6edc6c1fb8076e892d48868845
BLAKE2b-256 f5b5129aa24f2ce6127c7242b049def356922322b2622ccdf4e9ce786c05c282

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1c70baafba6453bdea7ad6155559755062df602aa05103c1057007aee8ad3e3e
MD5 d74309fbec3abe0688b5df218a8d1e27
BLAKE2b-256 50a0de4c8fddce18036124e9aad3d611208cab45d3c134d1ceecaaad6124cd1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e5cc6ddc82ba250118a99e1c31e5b75e00a65a084d81d55c66b6af8f49113dd8
MD5 1eb2ed0cc5dd6ea78135f7101981d596
BLAKE2b-256 5ddcaf5f7cc673ecd9885198a89656d7253807535826d451636cb03dbbb6e885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fc7e65a6d936e1f163a4f158981e0e0bd944140edd2d5804ad6057f40f689dea
MD5 2af94e4cc66f2f4c2bd4b22e1353c5e3
BLAKE2b-256 b3f4132711a37afa8e4ddb24c54dde5fd4cd1e114a36a75efffda1fc8e93f608

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf39804d71793b73cf755f336b68fc01e4a31d4ce68dbe09681ee0e581cafaed
MD5 151ec97824cfce05aded9b5078849258
BLAKE2b-256 643f21f4a18bd9a4114a595a4634d9ab6656851ec2c53b7a66e035c6400b5b3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f9e30e87a3bb76b9378463ee80ae0be67fc1db8281956559fcb6104f086cc545
MD5 a6f206a58dad6ffe0351affe368476e9
BLAKE2b-256 676b93495eeaeb9e398fc02e581096c85eb0618d36c0cd665174b4c01c48d163

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9c0f8640b7c73318d20527308f6d0afb3213a30a97e0b2027cae501482eda2f5
MD5 29d8e5503c1eabfdd08af7b2c4a8a0dd
BLAKE2b-256 89575cdb85adc37d51c0217d0d8858b0173017a0cdf5db8a6ab821c3112215be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0c446279c958e39f3a1336a8af10ab359b48628df6d56e6c55aa7bcc72b49920
MD5 a8dc425311a85f35b0de6ff389146a3a
BLAKE2b-256 4129b2a62d6fd1de55e6faffb37010e0ab86087c0366bc90a24583809053608e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 705640f31e0da8f6bf99d9e7b174214fe9d5b05574e39293690d6f770326af96
MD5 747fdd215571284244defed63fb52a70
BLAKE2b-256 8c2464fb155358a7cc04b223b56dbc3ad0c737bd03c8519e852f593af01dd435

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f58336ef8988917626314aea702cebb3b3cae22d0a5a9187505c56430056ded9
MD5 93e4ac366d6aa2008e68def581059865
BLAKE2b-256 5086c1d6a80c28b3fa35be6fee0d6ab0998d14b4ccc8880c84847a4fe9916318

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 553d58777cdbe9a89d14a736d086ccca901e03b08c19beeab5135516b6eb96f3
MD5 7762e6fd3aa94b1f2192be48c3ef7305
BLAKE2b-256 9b947cb63c92a8d84bb793934883479e1a5ba81c5a7fa7f476d73f1d1ba75872

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 f48c5a235c09d1f4f4c81807dc20dfd0d1ff85ee6cb7a97a86fd1648fb610a9f
MD5 194dac9ef429b8f790c24e8a1bb13a76
BLAKE2b-256 576e41b523cf8c25ce95a4aa26e29c0182295c7f0fb7c32c4836fe95fb5cb59e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 74e20267c482066ade4a01eab12f88a4463b9cca2f3d18bf03e3a30e22aa3110
MD5 5b37dacbc40dae4f41c40f0f8c8a83a2
BLAKE2b-256 728eaad31d76c3959b8ec3fa5e38134483e77408b10589678c7b24d8e6ffaa79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e82bd6f49da886619a514e9db19ba7bcdbe6a8ca24a4787d2aceb95098a4d6b4
MD5 ef1d151a4443216e6f87746e18a89d82
BLAKE2b-256 245af5eb40d3f64f701c32940d764e68821a6fa03b10b863ef10482a2ecccc0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4a65fa3b3e1215b37269ad4e2db3c9c4a4630f095c12ef632171e593419aee98
MD5 fac6ec15d64718d63bc2131ab46e7a8f
BLAKE2b-256 73378772b557917acc08c586fb9a2f3d5f00d971769bc2e2df6850e41445170c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 64f77fbcf661dad67ea90a7ba3cee2baafcdbf7cc79315639e6491c2ad519a92
MD5 42c74ef84390a51282af92d5396160fa
BLAKE2b-256 cb870672e6182e30ebdb0ac90abd2bfcb1072d9b804d78484aeddde809d0e6b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 56f644d3337b7b3009b160dc46230b03e8a87ea8fb217b3728b5b69cad756c33
MD5 391dea859c4f8b1a42090497fb02174f
BLAKE2b-256 54d6d54dfe5cd0b8b05775a2189d468524a18cdce03a091ae9430bd53d532277

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3a6ad0bf27e9ff0abd60e0e5e3ddd8612e6d8806d35b79b9abaa181f55f99fc5
MD5 c7d5550c7b18eb4cbb398cb90f30eae6
BLAKE2b-256 bdaffd7c3db977b99ac0c3f5372711d08b3544de8b05338e35e5793a3963cc2c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 d95cee0727b59dd7e6c8caf6d0502228e97ea772850f4d41a96f0fdee0ead7c0
MD5 6fabb0204fe2c8a9ba58ef3d44b5ec18
BLAKE2b-256 0311b573a461e27a6f03711db5a2065ae0c0e2ce9b4871ced78b29966dc00e12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a05fa81ce970f5127adc37b471c68849fcd5197ab452614dce1b0009993cbf54
MD5 48e504898a45a4dc150a9d4d12b1333c
BLAKE2b-256 781777ba7f83d980e18efcf0950bf5bec83deaa2afdb522efee59ba0a2960878

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 bcddd96aaba1df6a2566962e463f6e555280b97476acb645b379407340fe3e94
MD5 2d1b6e2e945f42ec14fe1d61154c8c0e
BLAKE2b-256 0539d2c3c739e1faf5173ca64ea4baf8216b9e6f52579def3498abdc11c8c1cf

See more details on using hashes here.

Supported by

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