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.29.0.tar.gz (135.3 kB view details)

Uploaded Source

Built Distributions

crackle_codec-0.29.0-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.0-cp313-cp313-macosx_11_0_arm64.whl (434.6 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.29.0-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.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (460.9 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.0-cp312-cp312-macosx_11_0_arm64.whl (434.7 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.29.0-cp312-cp312-macosx_10_13_x86_64.whl (483.6 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.29.0-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.0-cp311-cp311-macosx_11_0_arm64.whl (435.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.29.0-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.0-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.0-cp310-cp310-macosx_11_0_arm64.whl (434.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl (481.1 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.29.0-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.0-cp39-cp39-macosx_11_0_arm64.whl (434.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.29.0-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.0-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.0-cp38-cp38-macosx_11_0_arm64.whl (434.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.29.0-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.0-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.0-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.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (462.5 kB view details)

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

crackle_codec-0.29.0-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.0.tar.gz.

File metadata

  • Download URL: crackle_codec-0.29.0.tar.gz
  • Upload date:
  • Size: 135.3 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.29.0.tar.gz
Algorithm Hash digest
SHA256 0b8a322c6f7228c438879fa66db7fc34735b7f956d6e06df57c8e121cd02ce35
MD5 2fe7625ce4282f6aef3c7934ec245662
BLAKE2b-256 5f0aa7f31ae39c48769ba2bae83a865ddc732d88e9ed2decb45657c38ddc8f7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 35382fe85c61fceb5b8e88f248fd51ea1b871417d8be86dd56cb7082b5800c17
MD5 33fdfee4159c6cee576b742a5277cf4b
BLAKE2b-256 9f39d8021609a2e05500e4add2c78469301faa5b545cfd90480d065a7d4c7639

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f91bfdbc405204643c6cb08f95dded8d5838fb4434526b4ea1dad6a0cac2b890
MD5 74d90b34e72d2d0390bdba27e65bf546
BLAKE2b-256 32ff275b3fe9f81e3f4d44c7bb1ec78c0766332650d0e84e3278a892c96377f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f124c94fc3216ec2e111cafc6057b9e62112bb80e794b4d08dfd87e3f4bd0a67
MD5 41d484c89a7ab0f6258cfb8e94cfa637
BLAKE2b-256 d9e5e8a593504a9798ced322ba9b2be5931aa3302df5c85447d1284d12210ed9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4c2ffcb28e3755eb82933ac4097eb632997ce7f8e4e527708152145f02117f99
MD5 85ec77814cb343714cd0eb4df6f6404e
BLAKE2b-256 fe3f9e2c9863b168df50dea79058709faa6e051cc97c6bce90f7b6d6c44b447e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 95c66e29c4fc767a14dd5ec5267a4b1a16974e231835b387ee15626cf75ae2a0
MD5 3ae4b857ffe905249af097b5e87344f3
BLAKE2b-256 7f9249d567d17eb28a2ceef47e9c219db4b3c6a6297accf6a27eebf55de203f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 60a72c526dbbbb869e2ed7b76ef349e000ddaa7dd4e9a6a706d10984bdbc0a97
MD5 f2e1b326f937aa345f5b35c659e1b0d0
BLAKE2b-256 823b8df5ce2ed6c4a83af1546317810499b0a502b92c74d26f72f430277ef280

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6d1563acf678eb9ff9a7093d023efcd27d4b19c3ad11857a92dc50176e22a2af
MD5 bf5649076bee87f3483c31d78ed5109d
BLAKE2b-256 9b779ec65cfa445b4b3ff50d8bf9d0ac7e1d7fc8e5c865a2b7346aa99cf08b73

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0779d7fbd09bab0ce9f48c3d49e7ec29837fc0f4a65dcd61250096128345479b
MD5 8163d90341256d9d9c55726fbe9e3d2a
BLAKE2b-256 6e83492b5caaea88ac5daa52b36de4f2a1807fd691e8ff8753d96f99a3edb75a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2ce180298c9dcbf79a6ce4b3d3ce5c7eb54e6810402f755fea8e0d138be9c6fc
MD5 cb25ffce170bb72e967352bc3dc04e3c
BLAKE2b-256 1e9028f016fed2f0909e2dd85274f22a02578081394692df82b934232ae7518f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b02c179d92bd9488ffc37a4f189eebcbd36cac77296d5a4c610a9b4d7955f69
MD5 357e87f9319e4462270e45d48d5f871d
BLAKE2b-256 0e0bbdd01b18c2a0839ecb1dfee63ecd339d952f556213b7e9cbf3ff27c028c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8a602216fb17844f828106527b531633535df9776128c4839082c583ce439a19
MD5 091fc6318149d7af6390dd1e1895f43c
BLAKE2b-256 b7954e6de406ca5b5555ba4591e44a6c8789b6924e0f6cda39df437c1ef63b46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4b85076f175839aa924225b8a957e4b738b39eaf5b4e4a9da91cc39e5a5ca0e1
MD5 2ab8559b2e4045afdbb6c646ab2ebe45
BLAKE2b-256 b537eee2654441cc7f6e0730c166d6d75701e8f5891d8675ed107c921caf7787

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9ae3eb1a03be7d100025ee132c12d171d5544688a8f33959e9545eadc643e19e
MD5 7f97619c890e7f30fe74633de4eee2c0
BLAKE2b-256 05582293e0ceb8ce19604927d66716a814cc2ee374cb2c5e2c77f4bc376a060a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4f7002c191950505973ad669d0245979f4826431ba554b6518e0ad70b742fed3
MD5 a3d40d1acbfe07962464dbbd4f6b0f96
BLAKE2b-256 7295fc2bf9fe5d4358ab19b38f875c15d6de12a3d091ac9e8b2968ab2fbe4f72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4274b8a45d09c4010c66fbea46859c605367f91cf69bd17788d21f69e1aedf8e
MD5 42507f168db5787c6a178620b17e2e8a
BLAKE2b-256 713a3f58a6f46b6bb678f4dd97e5bd1902565623e7ca496087266faf9a631e4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f13109dd0dc4d2691ec63957538b10450b8379e12a4e77c292d7261a27f000f
MD5 ba9cbb77794c3a90029fa521b86c707f
BLAKE2b-256 89288dd4943e7a66b04f9d81a2244395376e3b0172d84cbbdf6126daa9f2c7f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b36bd1cbb1089dddecdabd1cd06d9de58faa9b2176462f3fe1a38ceba16151a
MD5 8a4cc74a008298358342b40022b70765
BLAKE2b-256 588e652d4bbbb27ecb325eb2736b0bba3e79204402aca2aef34742ab37d42367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4b254c283ef0f21bec153e3b68c1785eefbd3195387ddb889b9aa320942215cc
MD5 c6027b145f9e1ff662bb6608e9cdd3dc
BLAKE2b-256 6e4225273c067c97034f1d28683f26043501ceab623c20f41c72bfaf3b0a7210

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 76c03686eb54d1ba4bec4076ace8ed3d40debcfba4269c9de7b161abca0e60e0
MD5 da0d6ddff626d6d51b86db648c44013e
BLAKE2b-256 bf2161fd9c73056298fa77f4d14bfd13a5273130ace3420ce02c724228fbf489

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6306d8d8c88c96e8329a642f557ecaf55092135221df8b8a8b82072f5708c869
MD5 ea8a8c045c977c044b271efe9ca838f4
BLAKE2b-256 40f2e14648ddd654d4d82aa90643771886310b966f87afe61e826f6b13e808ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 850494fa5bc6ae727a69259a443eba88720092ebced5cf5bdf288fa1fdfc43df
MD5 8073184cf41392c9e9ed329984501e1f
BLAKE2b-256 dbcd84cb8476c1873e9f99e53056023cc2d47d323689cc39d6009e16718f5a72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 be0c8b9e0050ce9fd794a5812fdc9f24708303c9f07dbcfb9224d19466f5f60f
MD5 b96ec3a3d617914123b112bec09c5f2f
BLAKE2b-256 d4c3ec07d71cea13dc1b4174d0ecee51223038406c6edd2d83c64ab3f7cba963

See more details on using hashes here.

Supported by

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