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.0.tar.gz (128.7 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.28.0-cp313-cp313-win_amd64.whl (281.5 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.13+ x86-64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.13+ x86-64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.9+ x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.9+ x86-64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.9macOS 10.9+ x86-64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.8macOS 11.0+ ARM64

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

Uploaded CPython 3.8macOS 10.9+ x86-64

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

Uploaded CPython 3.7mWindows x86-64

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

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.28.0-cp36-cp36m-win_amd64.whl (281.0 kB view details)

Uploaded CPython 3.6mWindows x86-64

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

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.28.0.tar.gz
Algorithm Hash digest
SHA256 4fd2eb9ab0ad97c37a01852129a7544501e183ab267cb104321a22e241f98c48
MD5 c93fecff59ccb787b9ec22c6f619140f
BLAKE2b-256 2eeb2865d0d0f96dc3fbb2e1cd3bf375f2fa7722dafb166f7de032b35da41a88

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d02f4f7f42342ec83e4b8e50d23f2d0d6b066c485d5c9fbeec8bc81219a0c4fd
MD5 107936e71fa73c3763e81b80a89d7c60
BLAKE2b-256 57657cf1942ba2e37c2afd74765dfecc13bfa347c450fd73a51b63c457bb6f14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 12e44a6f206c635b762b179ba2cd0e7d62431dac4200c9c1b79eef4565dcca41
MD5 5c7e18bb099825fe79e8cc35ae49ed2b
BLAKE2b-256 a7e676387b1572c1b0a2880303cfc8d48058811ab2b96ad7d568cf4ee2369098

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aaa57bf8b014153c584ffa0175f77ebfb20ed83a3f568dbd13e87299da63e67f
MD5 3e8ce4f40cb2838fec27a03220ee55d6
BLAKE2b-256 a8ce84fe73059c1e6773621e3a46852b1d2f7b9b060afd1ee0fd5230b249ef22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 920faded1b4719562ef006b908b9f41ea9070e161cdc84f5a8b9453f9fe1e939
MD5 ad717bdedd96dc07e7a157ece51f77b5
BLAKE2b-256 52a29d39d95e69cf8c01c12b09c329bdf953cbd9bd9c985f7f1d53c3756abeb7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d0d441721d1e0a4af8f0385ffca869134f3518c7c015634c0e43253c832a6329
MD5 f165bca994636d0f94e832ac1dea5108
BLAKE2b-256 91f15c959dd25d33e8860aaf3c45175dca4c66381be9c1a51b99e0116dbd8f2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b4c3e6b97e08c5985264526595306cd355f2bccf7fb79186d7768c60c851ab9
MD5 500ce82cb592a780c5926477a449a207
BLAKE2b-256 c2e0d8211dfe9978abf28491a8f6e0a5a0913ed158fe89299f29df67c2f826b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a545edf8bb443b9d71330a50d9f7c93ee2e31896940dafd2f67ab05830a109f0
MD5 c0cb6890e05bbfd44720da853339c50d
BLAKE2b-256 c07fc88b685b51decc384129d3e42453377e99708e64d3d85b82cced1ab7365a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eca15fe998fb9320080df9f2c6c4819f64905f5b2eca8842e372e7227a05c24b
MD5 d56baecf6b97ecd2f77cd4c1a8c8e671
BLAKE2b-256 48bbbdbcf1112ca2037ae411ceb949a2f6d4ab15d8919de63661b6b8b9eec220

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 50c0139e158fa93554e8317fd34b2894e9cad5fc037475739cc8ecbe45a4644a
MD5 d0719ab52149e132b73b91e62516bab7
BLAKE2b-256 fc6c5434e0a2443412c36e3f84235e95f9453c8625513792a6937659b73c72d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d373e9745eac44a8d149367341acd7cb19c3ceb22ea8d28c0b8df0fa89d4ceac
MD5 b336f5dc2d0304c7cc1218186eda43cb
BLAKE2b-256 89f865d3776d9b0948e3eb93b4f2f5c31f1798ec511003fb18376d170ef7ccc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8d6cb9ddc2cde4ebb42b57153fe6c80e8ebb75a5c6b8d3508eb9c1b5a294bd21
MD5 05c3f65ea87559fd91f99b72c027c57f
BLAKE2b-256 b404ad7f57c21b8e156e600b2af09ad6de95740398d45f794e8b82d42e4ad1e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8dcc5782f57b2e868968be14155f90a482a4378feb28b927aed5715fca9726b6
MD5 1c18eda34cffec43a28b98ea842334ed
BLAKE2b-256 c3714104a8b15ec837c5c955c63dbf3f405e7d34fb7169922e051f85c09ccc73

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 532de5e59a9a88dd98cd2f3b3e5556d341b05cbb3b18529569c254b0e5c1b5c3
MD5 2d1403fa3ba61dc90b21187f69819044
BLAKE2b-256 a6bd1012e062927b7ca6f8dfb2fb643a9fef688251a3c55d786aa093159f82d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5ae033243d311b9b9466f9b1231c7613f4d1685aa11050a1f162d12d6496c888
MD5 49a866fd7910126611a31aff060cd35d
BLAKE2b-256 1b9ba61d0deeb9a16322203a206e81238d932a120e9906c954291b4d64c7f4b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 17fe7fec5c269102eb5c8b8e9d5c91f814f58dd9cd1772b63ab7bd6f8b0f9973
MD5 16ff5ae388eeace39bc8e367836f7ca2
BLAKE2b-256 387ebf13fa74c5a59a0f5dcdacb1e8c3bd57d3adbce730c0495a3a5729e9e1dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f1dda204cf8dd3bdd7872710b980a9c16976ec09d959f00905cb74543596ef31
MD5 7e62d759a3d4147871a9358fc2b56599
BLAKE2b-256 0f2af0b931a44227c316b0e07e5090fbb7c23c14a3bd7f9841ac648fe8ec99fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9b9a3de67ccc5cf815aaa23f2cf9bc7fde1196966cc9fc22c0288f28992adcfa
MD5 6d8bcd508d84511fd4b9e60cc1de3b26
BLAKE2b-256 b3fc769f741b51ca06b8967c8499a696f2b72cb2cd789cb3a83c2288b9b03988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c274f39e57fc6a039dc6099ce9e33b6ffc7f93fd03bb716be7ac063050b1c49
MD5 694b428dd3bace428d1806ec86c1e71a
BLAKE2b-256 f3b6fc8e7128519bc3e9d0759885d41a95a41042db6b9db372b5916200f3397b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6a9eac8802a858c165ac2f94d2917a9f84bec630a5382b79b74beb9ba7d560e1
MD5 41d646d3dd84fa1bfd1186b5264baef9
BLAKE2b-256 81da4ce0855fe76311d279b2c41e518b582624369eefb6d347a66de641dda259

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d3dec61a290c1aff86d1ae568eb141ea19a790ba726af4683b693bf85259da74
MD5 3fc8a6ddd2f92b083c43de69899741b1
BLAKE2b-256 e0f0a03bda33233c800d9e57de3af0d66b002e1461f7ce57141f0d072d2d94bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b15ca3435686abb7efd5af44bdde91f4ddd88167843de824c0f88366615f0d0c
MD5 0edc859edc61f935482f098b0c8aeb0b
BLAKE2b-256 865848b0cf4585dce75348438e31dd08cf5b12521ddf3cd469694405a5319ef2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ea044ff3979fcc95e1d8691962fa8b9681926f0f8d13ac828e6ab66c8b249901
MD5 4dac4e112c99a19cc8ee8d4f8d29ef6a
BLAKE2b-256 af68dbc13bcc8f905d918f39b12a214337e409227b3a2533af240ae8808520ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 638e4d774367a1227bb5883b95858fca882f0b80b5b87e8cf27bf0f677bb78d1
MD5 2efba24dbb6eac3e91c289c27c3dc96d
BLAKE2b-256 46c8aee13f70fc0766a3bac33fa0f31bc46a1f4165bde1a9cef2284f398f6ee0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5b32ff43bc31dc8555015eb268fb777086c56f5ccbda74fdbc68361d78cb7125
MD5 daef0140e6f7259a851926c303473968
BLAKE2b-256 159de6c87a545818149a227e3e7c11d2af923b7252ff4ad4bacb169a018924d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 051f0784149a7eec71a1d149fd492252db7a3fbf3dd5021d745f0d5f3113f09c
MD5 fea2ab6c3c6ca9ee83191601b6fa1372
BLAKE2b-256 3a2e4c32fba570989d54e0e68c2e535ccf2d2d47fbb6bbc0579ccc177e8f4444

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d4d959fa3d1b821d2d36479debc3486f7ecd4f84a77de6a4cf79817cf1936bdf
MD5 146d4a01eb27d353505162fa50837ae0
BLAKE2b-256 48aa75046d3d8eb6c60d5f3a291eb239f17f6c7babb7a81f0dfb428d6841e6e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c1b8fb14f83ff62b4571c06c1bd69d5d7350226c1f023a55e76331558f78bc5c
MD5 e0dbeeaeeceee0c043c84e338c711cac
BLAKE2b-256 00c1ca9d04eb496f9b7fec21411f50a5b0029ee90b972468fcb702be306a3125

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 dcbe98c97f6c05eabefb85d9e500d29d7a63093543b5d376b28ea658d3d5bad2
MD5 c85987b740ad61d42de4b125fd1b7f4a
BLAKE2b-256 3bdf1a3213a152b47a0fc09a0cf2df352630217bb32252df6db5bbef29ba34fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c0b1aaebb6140eab9f290b4a3df5d2b6e59407307aa250e581486502ae39b3b
MD5 41ea1df3e386c1a9952200d5a535b064
BLAKE2b-256 c20c6151464f8fcf9b5bc0caf1f5e7add8f5a9b5832bc68cfa0bda91b3997b4c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.28.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d3a8714315db9f5717169d1c85008b79c501a2df9b1b2da96e2ad361b207fce4
MD5 a9b729f64e444020fa208b8b3b87a8b3
BLAKE2b-256 6a05936ccb37697cd05dc86abd5f52c4520521ea71de4dd6ed310872367c4457

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