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

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

crackle_codec-0.24.0-cp313-cp313-win_amd64.whl (272.4 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (424.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp313-cp313-macosx_11_0_arm64.whl (370.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl (440.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.24.0-cp312-cp312-win_amd64.whl (272.4 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (425.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp312-cp312-macosx_11_0_arm64.whl (370.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl (439.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.24.0-cp311-cp311-win_amd64.whl (272.3 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (424.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp311-cp311-macosx_11_0_arm64.whl (371.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl (439.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.24.0-cp310-cp310-win_amd64.whl (271.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (424.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp310-cp310-macosx_11_0_arm64.whl (369.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl (438.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.24.0-cp39-cp39-win_amd64.whl (270.7 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (426.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp39-cp39-macosx_11_0_arm64.whl (370.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl (438.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.24.0-cp38-cp38-win_amd64.whl (271.4 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (424.3 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp38-cp38-macosx_11_0_arm64.whl (369.8 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.24.0-cp38-cp38-macosx_10_9_x86_64.whl (437.9 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.24.0-cp37-cp37m-win_amd64.whl (272.2 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.24.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (431.0 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp37-cp37m-macosx_10_9_x86_64.whl (437.4 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.24.0-cp36-cp36m-win_amd64.whl (272.0 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.24.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (430.3 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.24.0-cp36-cp36m-macosx_10_9_x86_64.whl (436.6 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.24.0.tar.gz
Algorithm Hash digest
SHA256 631872479a8966e2d674abe994d0b656a6cb45070e55b8319ac3fc4b5963f7a6
MD5 d974c3a58c2f69b077f969bca501c3b4
BLAKE2b-256 20599780414192faf633a3d402e18c5b52ad3831b78ad1872bcb5a2eae53cdb7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 01cb5b549862d4447480c14bc6bfce80635dc9fc1b98df30f3ee60ee2e9e0ffe
MD5 b617c08e2f32f8242a1e45d8b745cb30
BLAKE2b-256 f6d30739304c30c00b05110028fd1f194d36e9eda45f7923f6a257121c1dd415

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 642fec964ad858451c18ed8dcb4328f316b018ef417533d84ebfb9119f25d29f
MD5 2862f90cfaaaf18b418a9ab004c8d20d
BLAKE2b-256 d75308748088b52e3159281bb083a76994e3f2462a2c7e4ce61cfae2d3d3904b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 972a1ae9d8d8b5ab6c1b6c9bcae0008d0818408e9a6a466c91bea94dd80d9362
MD5 cb032f21660b4141d7fcb18d382693ed
BLAKE2b-256 df226dc4b9c75221c3b728afb70ef3f3004a2355a633c9aa273b729bd8b761bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d215e340270a4e0434c8a4d9da32f63651b5fbea417607d9d73d1031a2ffa429
MD5 65479f6657626cc94ec99c8f4f8ed35c
BLAKE2b-256 a8c17ed69abb05079dc697d92f94da61d3cb7a28aea51cd1a6d3eb8c8f93bb79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5e4239c87d4a1c698c62efd483c25e905daaa0d76ff716c8add45cba663ac476
MD5 a25967aac4a832d597d4be3140e7adde
BLAKE2b-256 4f67b68f3ed34f861b7b0ba2b880725cfc3c69a8816f3fb01a270f5269bfb2e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ca99460cad619bc8dd39e9c1c2601bcf43de2b62beb5c94161da9c267dd8d9f
MD5 f5b618493d7c6d5e6dffb4804b48161e
BLAKE2b-256 8d02f97bd4d2789c0ec29c0ced1e3fcf4de74ab7dae50689568c2f90fbc7f7fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0df03258b928ba71e1d7353a1f9c34793dce26780ebee37f334535c28e1baca8
MD5 008c011e775ab56734c25125b4fbbbd8
BLAKE2b-256 68122272cc8849de7761e466115a830d84a391359c1dd366404a82d2fd00e596

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 793c4cea56c3ad12f968d066f481f936d87b0f24457ca013cebbc6b71dfc6a6a
MD5 3826ff970ae6e5528143e42e0758f2e5
BLAKE2b-256 63d6535af076c53ce9d38a69d0a2d78e0d1b2978c494852517592d1c1329987d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fdc953da356284ad98c75fafb497d8614c482f0251aac996a08809356708bf31
MD5 4430919ec59452886e0d51b0be0fde85
BLAKE2b-256 0bed38eb46343732babac29cf2fe526bb93ec9c5625b07617f56e52ac3a0ef0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7165590fbe1e926c491027c2e36bd0d868131366b37319437254b83eb5730bde
MD5 bc427a83bbdedfe36898cb257fa63932
BLAKE2b-256 9376f26b6028a869cbcd5b1cb701328de9f1c7301c589b6e238f1042816bcb45

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9874355dae65f44a61527a4484ecdd9e19a9fa757baa983eeaa56fb56863b885
MD5 4df1651b81c5a8175fe6928a6ff097d8
BLAKE2b-256 7d53303c6d4ecaf6c3341d505bb8f6cedf61d2a9183f0fa9a8a161a444d50a8b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d4dad3a148d9e461ad661a0cc5ffb9e075ab3f88489999090cefd4dcec97d7ec
MD5 f0062df7e6b9f58d241bfa47debabe6a
BLAKE2b-256 61ec684be2f103f3ba1db5a077a43dd4871cdd30943ae6f6c033240d8196eae2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3065de13d9c44c1f27d92133df8056964d97561bf4b4be884635a46cfb0f2878
MD5 8fc5efcc16f3f5ee819d9c0ff623b133
BLAKE2b-256 705192569cefb5a02cae86a2bf316070bfe05e1725f0afa946fe8d46c8dde60c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e1db24051c4476365776f5f9cfc9480057c13efd951efb59aa708e8b3084530e
MD5 bf9a3cb7f804580266ae5a4df22fc6b2
BLAKE2b-256 9d7f8992199458c5ede1535b81ccd99f1706395ba228e410bd8d277ad6b40607

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a4353e5b5f0d44d013f67f05c11cdf542de8206ba3c3cafdde9884db6341214
MD5 e5a982e8dc5e203fb1af1408c2be3a1f
BLAKE2b-256 1a0e31b4bb875b2cd4ca2103c83233ed146f7fc4b885989d6ef309a94034355d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f8268080dafee8f87832733b9fc9dc3a20e94fbdc00f84eebdbf1076ddc1c011
MD5 77fb5ae61c05848adde21865e8358c82
BLAKE2b-256 e58e480afdd36c39b94e15462568bac3007b6990c9b9bb3702ed6b9628eed1d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 42492e76b38255a473c4953af1f9ea8b4f490901f78bde816974706d0ad90396
MD5 bf5894aa657f6ae52af0c439e9b3a2f7
BLAKE2b-256 3385035c8f0d1cb14060afe922694ed8ec661623cf43f293b105ccd75aec354e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fced5794ef4539ef5dab5046265e26ade035eb8c912574ba808bacf67cb6c03b
MD5 10d302f6351dae52e223cd8e06cff14e
BLAKE2b-256 5607978e85d91669eace4f72b1f21972ddf72d2fcdd95c6271a3e31b9b540811

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe71c101e0e0a848e2a113da13c3741cd6896c9e060610e4f8ccf8345c883a15
MD5 267b3ffa21853284aa9a87e7e28d1a1d
BLAKE2b-256 1bf36482f56d25b57077224b26b6e007da1d3a575db7e365f600624ccb077ffe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8a746c3eea83532d6ad7d4a7f945b010c8ca2588830c8fedfb98a550ff89b5ce
MD5 3b04a595dfbee30b5ed7721c71c2247c
BLAKE2b-256 b75ae5f3f757d03760f4d729ddfd7bf53bc77bd4acb0aaf1a12a1ad81deabfa9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 0f9122d66fbb698c30232413afa6d86146497906e6e10be6ef6041f4341b8504
MD5 28130f317e7ce84b5281ac68373b302f
BLAKE2b-256 805876d2a4ba7ab2951ad0ad7cb58c25d58c26a397f38207153a7b2fc68638b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3c0e5c7206d184c9e1fbeeb87a1244f3aa9c3906ba0dcb474e368b69cdef0d35
MD5 deb0489050695e491764620f19cdc4eb
BLAKE2b-256 55610291f656d999bba8bfa6852463ecd63daf0c895f109a532da54eeddc777d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 78a6e041780925dda29af077e909e19a83bce0a439dae5ce73ad04e90708b468
MD5 3a2dbbf8d5b1b8efb74c2eae3bfce333
BLAKE2b-256 28e53117796ca8f0bd028cd4e507358e5d396cff844409643e34c9a58f91a396

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 045bf5d7256b76535f0752bdbcee6521b3e94c509b42d7918938a52eda2de99d
MD5 b06d136642f96e499b425cf71bff0ea4
BLAKE2b-256 ef1a3c7b9d587edd3f71f2b6dd18420d2d6474ecc9f86b4af96054a067a5ea9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5d0d64213ca775397187e6684f67f2c72aeb35fff1d89397ba8b015e44698a06
MD5 76964460fc584d5fb370a1f419d05def
BLAKE2b-256 08c2eba4bfd62dfb006f90ed319d4464e13700d72028fe759a39903096718290

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8166d8c55823bb69982868b9dc9ced7f79be058b5ce71a1bf8e1c5d925a42b7d
MD5 4271cecf7d920879df4e16179ff9e2bc
BLAKE2b-256 90fa677befd52970d6b13e836c4d6b97104e22c9a8fe3bd528dba0e726182f9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 28cfffde77ee968b96ec774eff24751bfb156dc221fd004784aab911700be662
MD5 0a914dc9570dfbee660e1fab56eccbcb
BLAKE2b-256 64a7d8e84813422f7a4cc956e1a8c3c3b219839bc4a3766633fc22deb319010f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 8ae23d4479ff7e0c59fd58d3c84286be646a9a30f6e6b4c583f7b76f189702dd
MD5 5ca4410cb56b66aeec9ec5a5b3f7810b
BLAKE2b-256 0b1292b51dafba278746a44ee88760826e371932adf2c49fd72c2712a5abdda0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d5df981932f182e1e0c4cec7829aef8157536be25b64cc277d5c9bcf8f569320
MD5 955b7420cd4d0ea8f3de9b58618fc56f
BLAKE2b-256 7a7d8bf265a899ecd101177a17053510ebe165d9065c8f97c0785ed0544018a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.24.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4abc944f436798b98b09e4f306c42ab67d041e53aac9a205f9b3907649e10512
MD5 aa7344b8017726bea3eaa9278e55f26b
BLAKE2b-256 12ca9d4a613a43d1eb2104a4a8beaf45f0d63af6016c879a1f1dd03d9fc01edb

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