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.26.0.tar.gz (126.3 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.26.0-cp313-cp313-win_amd64.whl (281.1 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (448.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp313-cp313-macosx_11_0_arm64.whl (409.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl (465.1 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.26.0-cp312-cp312-win_amd64.whl (281.1 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (446.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp312-cp312-macosx_11_0_arm64.whl (409.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl (465.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.26.0-cp311-cp311-win_amd64.whl (280.9 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (448.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp311-cp311-macosx_11_0_arm64.whl (410.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.26.0-cp311-cp311-macosx_10_9_x86_64.whl (464.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.26.0-cp310-cp310-win_amd64.whl (280.0 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (447.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp310-cp310-macosx_11_0_arm64.whl (408.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.26.0-cp310-cp310-macosx_10_9_x86_64.whl (462.9 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.26.0-cp39-cp39-win_amd64.whl (279.1 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (447.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp39-cp39-macosx_11_0_arm64.whl (408.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.26.0-cp39-cp39-macosx_10_9_x86_64.whl (463.0 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.26.0-cp38-cp38-win_amd64.whl (279.9 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.26.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (447.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp38-cp38-macosx_11_0_arm64.whl (408.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.26.0-cp38-cp38-macosx_10_9_x86_64.whl (462.7 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.26.0-cp37-cp37m-win_amd64.whl (280.8 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.26.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.9 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp37-cp37m-macosx_10_9_x86_64.whl (461.8 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.26.0-cp36-cp36m-win_amd64.whl (280.6 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.26.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (444.3 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.26.0-cp36-cp36m-macosx_10_9_x86_64.whl (461.0 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.26.0.tar.gz
  • Upload date:
  • Size: 126.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.26.0.tar.gz
Algorithm Hash digest
SHA256 3e22305bddbebe687f37a501300e0ba577d45d0d38bca7509ef70e1d6956e577
MD5 e122429fbb26673d0a97fdde7a45e7e3
BLAKE2b-256 6d5e434aee0534a72cd29b6f0a1efdb7044e7d5e94e9bed114b630683fb2699d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 76760af0ad70ea7b7852e42c392784c564bc0dc47291b8684e4059fbff48fd45
MD5 9661569a6d4e48c89831cf1a057a36f2
BLAKE2b-256 3991a5460c5ea980502e344ad92249c7ebd73dd9716c0836c265e9713cec1203

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2f2925c373cf2ba77b87e88920efa454fcd629e0b80228cfb865e4e18d1575e5
MD5 8ea61e492fc5256da3db9bfb3a4a1c30
BLAKE2b-256 62eb3d6c3ad060d1c2b7f8426b30cfefc7bea60284dd22a095980fe1902ac67c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acb771e83f99f6bdc832e47a0bc5aa29c04aaeb5eb73289602d1ee406d0e6199
MD5 d911712225fd40ece16ba0c57dd8f5c3
BLAKE2b-256 085d2a5edf12e98e4416690275fd45e52be392b7488ae9847771fdfb57431b6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7a74b114cfd2fb39a3fece833a814ad582ad238649cd0a3cb65b2123cfd3f67b
MD5 c747e14184431d50442e6e3ba982247e
BLAKE2b-256 fed6d33e2e136095a864218316106a62b1678b2c89959a644c3b18628f1fdb03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8767a852a56bc2917ae664d7e07264e13ecc9ab08f558920d89aeaabca926f78
MD5 c66ecacc2c84866f1004308227264f5b
BLAKE2b-256 dbc2e07018eb0286b4c7fc59b8c8a8331c5c823af1e8b0e97dad11742e80a90b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 634d7fa73d5f7cd2951525c2dadebb332434b3fc70911643691d13c62caec64c
MD5 c453f2d11c2438bb6244600e40fe7688
BLAKE2b-256 2ab1a418e51a4c682ccc29312412e61c7ffb299a31c05440b97011e59dffeb59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f2c3eef0377c62536acc177352dfa07a6a815c6cea8bfb1344d9813e1a5f368b
MD5 6e70aa967f33e9973c0deb61574ce8c7
BLAKE2b-256 605b2de2c05476e81bb2927886616a70cf323ebd154d456cef050c7789e42cd4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b18ee6f980c0660c25ebb534a06fb4fbab1e1e3f07b2504cbca73fb757bd68b9
MD5 07f4f8471e99060070ad7c9036a76f2d
BLAKE2b-256 8206bfcbc8370739599aca4d88c0175c988617ac8137ba5b022101c603716187

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4325b50ff5cab1c7478cd3cd7f3a5c1670f2a5ef02ebd68dfb3f33a04652df53
MD5 63442e6bbf599c787dfc13b5a31a1b6c
BLAKE2b-256 f783f65cb7bce26e8b415af72c728c63f65f809b08577b2516cbf8b4fd1a64b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 32d2d3e98bba1d777426001952ea22f927f325a03b0cfeae614f400c4dcf1fcc
MD5 d0a937cb6b9a0f20108791709b3888a2
BLAKE2b-256 f010de1cf637de2f84e08a8632adbb0d8079cd95193b5c75fab3450d18e5d257

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c155b50cfb5c2cb1ef056c2c0450d9d358177d6be9fb0196c502487cf88a7de
MD5 e41e2dc735cbde113116d16d4b2fb459
BLAKE2b-256 ee328b74cba75df4d13f6bdae9614a8f4374afaba8fbfceed065883e9db73cc6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 848a03f3141b2d9d3d7b133cb92323f6ac943892ca7bf83fd4d22d859d4af17a
MD5 c35f5db6297985d1ed460500473da27a
BLAKE2b-256 bc7f57bb89ff16dae196d6c7b04b593de4e37ed4a4b1a353b07f7b536a3acddb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 447a88b54f094dd304d0e12981bfabb08d5261fba659828610b22eb88210749d
MD5 08160fc1459890ad9488a38c047e6b3f
BLAKE2b-256 6084c9bb515bdd5b66a00bc428c68c05e7c2ab3ecb0ad69b6c1e1111c69b34d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b56d81de28df8b85333e2ed54b6450d744523bb0676f555b92a3f3b888375683
MD5 962fac5a9edfd0681502b24ed5a3e15f
BLAKE2b-256 9d34275068cc4e4a753e7f2a67dde9b3ec8b168309deff0598d1ee2e833add0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 de8e5f5a802b3216581a0caafae9417adcdda932552a6a051aaa7a374eb27ffc
MD5 a20b5316aa09be11f7416d63d8d9e1ac
BLAKE2b-256 d706bd7ff87e9665c751d624728b4fd8fcce409d37e8f372f6f034412d7a0140

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 16e6798f215751b142f5719eb515e8340acc8653ce9395996be19502a3b5cc4a
MD5 f14009256572bc45c809397005afedec
BLAKE2b-256 a67c18d223ca6b9c6b710e554df8ada90316c6ee1f65512233a1dda5f99f19bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0ac4008276fb0cd45357eaa177c642142bfba9004a5419de5ec244b49bb0e092
MD5 ae2c3c1e7bcbf99b996fb327567654f5
BLAKE2b-256 08e334461ef72d42e0699750a9bd23eadf450e2782065cc9b4cc4b862f6dcc61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0cf16ba18eabf6d32249ef562072bd17be98551522b93033e8a1e8f9e684224c
MD5 8d21a2fef942e68a65fbc5a63d869a1c
BLAKE2b-256 6bd58cd5d66f234ae57a0afaed1d6d1fed7bff3fc3971b08ba5a0798de98126e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4b7d3114d5a9039630a1f6fb9417acc88cb19700c79f02cb5b7f7fd203bcfa9d
MD5 47092f3d8eee1a0d7276f9263d43ad19
BLAKE2b-256 ff41de937087a285c3cd91c919f913d183206fc0d282f3ec2aa38de8388f5bb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7029d56d4fa5d0686ec354b586a5e5948d8aa78e80080207af4d175f967297b9
MD5 c39f8ddd41d59147e454680b1ec50169
BLAKE2b-256 473e6166dc41136fe3796f5a08dfc6320d651c3dda22205a22e4f6921d9a6dd5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 04109d91706d19733c37420e2fcd9ad3c47167bd2ff17c3ea95eb7dde26b1195
MD5 dde912b077406a6843d280bd08e03d68
BLAKE2b-256 1413cf592ea954756a71ade5b62ec1e613d1f152e544154ece0c6ad785b7e8a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c1dcc377ebe51598d12141ef390568b4abeae4e13214838a4422705db78922ab
MD5 9a1bec4cc206b568debea539667c9d1a
BLAKE2b-256 bb5e25bc23d61b8f2333983a1c9153439d2c50884c246d16d51b3b2447187e1c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29e4df31a81b9584d4c6f6b10e9ea22865a426b6e14ebd3642aa8e1bd7f952ca
MD5 54e2ccfde91644e691b92916b1772469
BLAKE2b-256 18d620d61db0b274af6d3aab8626862b9b77a68176d25748bcd5f7a4042bd5e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 856bd45d64d1e5738c22d6837966594da80a424462b1c962ab4fa03bb2d99d23
MD5 57f7cbe4728dcb89b2ebb9ebe3be01e6
BLAKE2b-256 c2d0eb96ec1014241397140ccd6f8b47342b6b1d61801a13313ccd8160643e7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6f4fc62e9de30b6b17bc34184aa1f742aa6ac0e53111d20393690727989d2e42
MD5 8c3439719d7b3f14cd1beee2d4847eed
BLAKE2b-256 76829105ff18cb76a6d5ca2ef986a05c861b50afc9b8ae0691359d56104a90e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 54855733b7cc44fc5be0ea5373b052d4c1cfa106caed9ba7a2888f7f8b4d8b15
MD5 c586f749b101fdbe9e72233f48d804ed
BLAKE2b-256 e431b8b24b2d27d71105b884ab749415fdae1a000150c56fc9266b819816c469

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c215459a582eb070760c15c20b653f99ae8672c4fd69487f53130c63aa76f601
MD5 38a5d69b7747e27b2fa24ebfd661daa9
BLAKE2b-256 27cbb0e6c601b643e7ced3532c01660636e52db4f536acc4b275d1d4553ea35d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 241248f43a491854cc4a2a1a15c80ba3f57b6204ba4c06814acc6cac9e57a2cb
MD5 41f45a2adfe31915abefb0756212c19e
BLAKE2b-256 f119d1c6de1208cfffa3cdb9f7ec54b18b8e5b82807fbce372c403c15d949192

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 71c45d8a73be09ade2b7b19e3b7a8b8923b42a94068dc645e9e3dc642a2d4f29
MD5 83ea364d108d5e618de32b3f2fd47507
BLAKE2b-256 b4ae4d2c93ce38c992bda03ef0eb123aeecf03f32bec138defb4cfe8d4fc6146

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.26.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8ff4c6b91db9f0f90e3f46bb739d50089b05be75d44ae9bcc8e3c3fa3caa2522
MD5 587d326dec64821094481974852ac019
BLAKE2b-256 7ac1a4b1857d7de800248bea6805828458a0f88473170d1af8345af22a4b1409

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