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)
centroids = crackle.centroids(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.29.2.tar.gz (130.3 kB view details)

Uploaded Source

Built Distributions

crackle_codec-0.29.2-cp313-cp313-win_amd64.whl (286.9 kB view details)

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.29.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.6 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp313-cp313-macosx_11_0_arm64.whl (434.7 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp313-cp313-macosx_10_13_x86_64.whl (483.7 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

crackle_codec-0.29.2-cp312-cp312-win_amd64.whl (286.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.29.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp312-cp312-macosx_11_0_arm64.whl (434.8 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp312-cp312-macosx_10_13_x86_64.whl (483.7 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.29.2-cp311-cp311-win_amd64.whl (286.7 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.29.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp311-cp311-macosx_11_0_arm64.whl (435.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp311-cp311-macosx_10_9_x86_64.whl (483.0 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

crackle_codec-0.29.2-cp310-cp310-win_amd64.whl (286.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.29.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp310-cp310-macosx_11_0_arm64.whl (434.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp310-cp310-macosx_10_9_x86_64.whl (481.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.29.2-cp39-cp39-win_amd64.whl (285.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.29.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (460.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp39-cp39-macosx_11_0_arm64.whl (434.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp39-cp39-macosx_10_9_x86_64.whl (481.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

crackle_codec-0.29.2-cp38-cp38-win_amd64.whl (285.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

crackle_codec-0.29.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.2-cp38-cp38-macosx_11_0_arm64.whl (434.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.29.2-cp38-cp38-macosx_10_9_x86_64.whl (481.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

crackle_codec-0.29.2-cp37-cp37m-win_amd64.whl (286.7 kB view details)

Uploaded CPython 3.7m Windows x86-64

crackle_codec-0.29.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (471.7 kB view details)

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

crackle_codec-0.29.2-cp37-cp37m-macosx_10_9_x86_64.whl (480.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

crackle_codec-0.29.2-cp36-cp36m-win_amd64.whl (286.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

crackle_codec-0.29.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (462.6 kB view details)

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

crackle_codec-0.29.2-cp36-cp36m-macosx_10_9_x86_64.whl (479.0 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.29.2.tar.gz
  • Upload date:
  • Size: 130.3 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.29.2.tar.gz
Algorithm Hash digest
SHA256 3a3fa6b10a8db01df8b6a1b8e8ab2eaaca9e455177c131f6e408fdf19b5cffad
MD5 dc14d60034b8a985b1d683e0b0ce37f5
BLAKE2b-256 233018f070d9695d6c39cc85321b3b8c260559a082b7b8d52ae138e7fa67fb79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c23f78720551910e9718a3ae2059e3afbbde6416dee9435d7b7f4dd3f4b7da3c
MD5 7a7b95f7ab8ec1d5e53d8759fce586c1
BLAKE2b-256 77ceff7eb7fa0547d6706f5496452ac591bce7e73ce1c31d1a2873b2cb4543b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb25e62f5802527e9b3c2fda4db40fd6196912a1b77fcb753f5cc1e2baf1ca0d
MD5 31e5dddee74ac60cd5230718caedb5b1
BLAKE2b-256 c0c6730dbde074d40e1ba271e699af05d52c7188cd5ade1651eb59f62b3786e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66b54e3ea5bdae9986b27b41c2d69417ec6a640fe96d7e8b1a96fbb91cd55995
MD5 1d3c2c6cc1f320973740a135225f5017
BLAKE2b-256 7070e3bab2b6e1012dc702a1ce6c0ab56d3225ad827126bf0a8922e95a60677c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4fb8c64351a32b8cd10b75de32ea753e0c7d8c309bc0711888213029e8b3375e
MD5 88a05b6b3312aac47b90281631044dce
BLAKE2b-256 a0c6e9eee2561eb7e8a279a3b3ca9c4fbf446c8fc74bc641cfde4ce13d0026d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 088a665cb047ccf79af90d1d4893f52fc3351f2acd3ed98e0e98d55652e9c7cd
MD5 4fa8b4506211a77d2b7e026436745523
BLAKE2b-256 f7e2eac2980333d6408c5716fa8907349b419c8176e180ee2e99bca188a593df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1cdaff0b0d7fad74baa0e07e4771c9ce6617e30e5ecf9f4ed0db93c266389f0a
MD5 6de1d87a45a40b37e39daaf800c2e15e
BLAKE2b-256 0081f8dc639c393d3fb09214c41e251dba9643dbd8b96ffe8578fb6d8b0b89d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 956d556a230fbc7ca4710ca689df064933a77cf056682d236e4d6a82c51cedfe
MD5 2f8d4fc72f42a8e82fffb66527cc4769
BLAKE2b-256 224987a2e7a677bf578c835bc600f9aa16cb7dee999384584d75e9d5c8121fbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a6938cf3eb3b1b123cc0fa360fd293ca71ba9aedf221d3deb55cb4fa102b3af9
MD5 d3994400ece739e780ae4ef8e80a94a9
BLAKE2b-256 e3aeddffc199970c467f528da7f747f6cc87cb39ac91bdb943f96e1a9c763057

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9fd3f6243a49ed6c559263dd69ba6d6d60d25d9601cf43f2f4e1aa1d22e4ae12
MD5 05d54e00ad64013aa831c3520cea8f71
BLAKE2b-256 297fa50407d9af363eeef51e503e6276a7b83ff64414cc1f5b88dc7c9b400f90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7e44b08b2547d2fe315e75918b0951614b5fe3e58ef8416b637c45d6a4b3ffbe
MD5 4865651b2f9b96900cee928a46987d0d
BLAKE2b-256 2ab87f00b00accb6804ea20d1cbdfe562354c21441b99adc7126772b67cc9bc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ccf7c0c7a7a9cff902e27005e5736b5162a045aba0332f9943494d70d908764f
MD5 ba9b9b0af50e9e8694de6f06d127304e
BLAKE2b-256 1402785332930920eb90b7924db3e204bb67c16df80aab34168513d95675008b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 77483dc6a316df33d4fe5a07de08ac78b2ded32fdb95ab37c1cfd0f45f84d06e
MD5 d9e125c19bf638c16fa395c94f36680d
BLAKE2b-256 69816d29570ef65b7aaa5f5b9397543cde055f3ff2acfa49e364115a818cf103

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d86ba87f505466c658be5114ca0d7b7187d38d5fb4481e1a8ff46956c7c32bd3
MD5 03820dac0d78a5aca9c43c4ce8a50a6b
BLAKE2b-256 94932a6a40065441f3ad8ae42f34a1e2d65ccb8c323df29314136317999089dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d781845f5af753cb203342d3a4600b49c7f168d603648085dbffeb4052825d0f
MD5 519a8386ea7061f10b74366b4279bc3f
BLAKE2b-256 da5625edd1c956ec321a97bfa4c0cec2835be19fbca90e37762d5408897287f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f85db8c4453ed1de5b922ab033f2c1195a8a4267f4c10b451316839c4123e265
MD5 ad5533633a90523a0efcfd0fb8138663
BLAKE2b-256 8880efecb8d59b672507b632deab289473e759d147d92bf728fbfcf9fc863f44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 aebf2f9caf617848436f975dca22213280c9f55cc5298fe7c40c45136ea08e05
MD5 4867b8b8357bb21aa7a8002e4df667b0
BLAKE2b-256 cf20766a8ac2c6dffbf9556096233aeec8b2614e850bcdfa6b1fb3b53d99173a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8ced34d09eebf46afc83cd42f40da4b10c2175606187288d1ffa6a1140bf1cb6
MD5 ba92e2577e9ef5b7fd0e8a2b00ab5795
BLAKE2b-256 393147e9128413580443bc980bd4233a95e1a74bbf42020e8f20ac86b76219dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b0b52f8c356d6746bf9e5d3bd6b4c8f6f7c6c7f68dee6000aa9cef19472bbdde
MD5 e0c83a4ebeaba319227fb1f74b5f0ec4
BLAKE2b-256 175d2699c56ed2564c235a7a5204dad0cb3ad9620be5ac189502c4c0a91af014

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 666a7b61f5e58559a72c141e7995453b2d3846174166fb7d9385ebb923724f27
MD5 fa6d6d82d1b13c71e7aeddc228533ce8
BLAKE2b-256 eb67c739901ee92dea4f4ea0d7e33a5ae52161c60b2c4a813b7681517c0ebe1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 78c83b162cc8ef7699b3682fdb9598b550262f655452af0105007d37fb3758b1
MD5 ad51d550d3378adc44b2d4b9c70fbeb7
BLAKE2b-256 87c8bee74905c384eaebf40209394b4845f3230439b528827ef1f836076f80f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d40d4f591f5493f5a02209dbcc50464bf3ca9bffc2e769303819d4c070244908
MD5 1af8f931005b4f2975df1c22755ed477
BLAKE2b-256 53cfe992d831f9e10ea607526f88a8f1fd1b60d4c79de5e3f58ce4f478658c5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b84d90128c0625a0bb473a7a628c9d48f4920a78b01b229db5d7520cfbfe82dd
MD5 655821ca44abd78f854c8cebf26d3343
BLAKE2b-256 cd5d22ef99d64f596c27cb1227b98c9b27c2ad179ebe5e62587ee157404f184a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 837a0ef018aaf59117c7d4a036d564e44dd7667f1c302528a0da13a80d20aa5a
MD5 2a63e4483990d25545b7d91aee67129e
BLAKE2b-256 52603d3a23d2cb79988152a585c1becd4cefed4e98c31488a9ada0b42978cb41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 911a4aac794eef1bd747e30204fd3f50de1518cc836f0818619a7a8a7aeb4231
MD5 bdb617acd63e9512c6c8d41df302162f
BLAKE2b-256 8b20ae12f55f03cadb285cdf529083c8de9c76be90e272b7afec4aa17fe2fd8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 748374c388798fa521e69d2bb49b01d2f0e1b921a1c4d1d98b5ccec1385128dc
MD5 9ee5d3e8e986469f3aad3074f4895c9e
BLAKE2b-256 b78237a9edb3b1c203f24aa634525429f4c55b221be3b95fc580aed3fd1c106d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a96e0a8c5c2b6800d852a2929033c1a85a2ce13f8b85f8a7805358e01cff2891
MD5 566ad073287a69871f6e95d409766f77
BLAKE2b-256 45a1f4932b2b2606da41773dcd81befc29a40d47751eecd87a13c791806d0563

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 abbeb9d9c485d690c54589dcba67154e7e26a88dfc7a110f07f1db17961f8a52
MD5 1924088fe43f752e57915fe9ce372396
BLAKE2b-256 ef8e5c970822ffe0c7a370fdfc66d5b9315f40861a4374b1243f0a6e2b7c2ebc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 18a43d9f1b033cfec1cc1f1a056c70fe9d5234845f7813caeb2c604433b440aa
MD5 459bb99b89811654d54183aa380e5f04
BLAKE2b-256 bcb494a0a3f791f96ee50f9469a52510db7a3b09803feb61789744f6ec74dadf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e67bcd9fabdc8c45911f5512b00ceb5f41d5eed9bcef717bdff8dbc4d856b987
MD5 489a6e7bd4072a99535854b281d24a72
BLAKE2b-256 e94ae652679d20f8f9818362d6e09ceff793da12c077557cc66258daba80f31e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 944d2d91d0bb9ceb126c5147e4781e8fb600ca761b4b34ff5cb59ce7db9306c6
MD5 67b446cf817a5b0537fa59a7f5200e42
BLAKE2b-256 6d02d61be8ac9290ccc07a6ac8c2791b1c192f94e22860ebb35d2e5e1dd860f2

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