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)

# 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)
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)
# use 4 threads (but also more RAM for scratch space)
ptc = crackle.point_cloud(binary, parallel=4) 

# 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)

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.22.0.tar.gz (125.2 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.22.0-cp313-cp313-win_amd64.whl (261.6 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.22.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp313-cp313-macosx_11_0_arm64.whl (342.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.22.0-cp313-cp313-macosx_10_13_x86_64.whl (411.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.22.0-cp312-cp312-win_amd64.whl (261.5 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (410.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp312-cp312-macosx_11_0_arm64.whl (342.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.22.0-cp312-cp312-macosx_10_13_x86_64.whl (411.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.22.0-cp311-cp311-win_amd64.whl (261.3 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp311-cp311-macosx_11_0_arm64.whl (342.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl (411.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.22.0-cp310-cp310-win_amd64.whl (260.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp310-cp310-macosx_11_0_arm64.whl (341.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl (409.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.22.0-cp39-cp39-win_amd64.whl (259.7 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (410.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp39-cp39-macosx_11_0_arm64.whl (341.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.22.0-cp39-cp39-macosx_10_9_x86_64.whl (409.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.22.0-cp38-cp38-win_amd64.whl (260.3 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp38-cp38-macosx_11_0_arm64.whl (341.2 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.22.0-cp38-cp38-macosx_10_9_x86_64.whl (409.0 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.22.0-cp37-cp37m-win_amd64.whl (261.4 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.22.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (413.8 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp37-cp37m-macosx_10_9_x86_64.whl (408.4 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.22.0-cp36-cp36m-win_amd64.whl (261.2 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.22.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (414.4 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.22.0-cp36-cp36m-macosx_10_9_x86_64.whl (407.3 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.22.0.tar.gz
  • Upload date:
  • Size: 125.2 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.22.0.tar.gz
Algorithm Hash digest
SHA256 72fddaae8e3b300deafeb7f8a0a5ec3ed2d8316d3e999e4b95308e8ae859741b
MD5 94803ce952783eaf3cec7849e59e88d8
BLAKE2b-256 c57d9e7ecc84a8ae90f5968bb2d10ce40c1b94047f2dec653d265b32394d6ef9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3e76a8f22db2546fecf4c96aa0d65800991474a07699c0c378e402f0c5307537
MD5 e6b31f05810e43ac8e279c110f311bd3
BLAKE2b-256 a69c6b43dd1ddf94cf28b1e64a47a4569cd32cddbdfd9551340be8b8e53a8980

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b85efc45d72a60f4e24ddcbf56ccc037c186144dcfa05a7bd3393b342b712b9e
MD5 ed945e7fe4c4d36e7070df31a19fbab9
BLAKE2b-256 28c87ef363ffbb640b66fc07e326023f1bbbd3c77288bb433d41a5046a6293de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9df17234558a43de65b95ccda8ad61c375456a668501b967baa6b8936892fe68
MD5 43b85b02417ac5544b016a2a46375902
BLAKE2b-256 cde617c530bbaff88c9cf96326855255b8ccdc3ec222b91e3230afeeb3778ada

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6c7e28d18df4f42aaef7e70520905e6a21e14807ff2653dc23d8289e20aba62f
MD5 c2c18e98b609b9caf6509966e8a0d0b8
BLAKE2b-256 eca2bd407eb5cd03eafdb36fa7645554388c5642dd505d289158d55bb1c112c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2c1d3cd6782eade327b5cb7e8f4d50072827f32b4029acab034511a6a82e020f
MD5 8ecf079ddd8be87b4582ae420ff6dd4d
BLAKE2b-256 66332468070e5e6079ec89a6dae2cc6c2ba3bc03768729bf39ce55d3a823d7ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0940fe772a2003b4257f6d27d0a81b582e6a8c1aa17c60948e53439c338788b7
MD5 c3c22a8de47f5210d0286ddd42edc81a
BLAKE2b-256 a4090549fa23c99cd6030c382c555847e79530b4319f47bef431535165578d1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 af16b6aac12ba330a60560b620b44198e97f2920f487f95ce9a0ba17285b6818
MD5 9918d329aee2cb4652e97456c47f01d9
BLAKE2b-256 4383e38f013bf54c6bcff22b242a9ace24ed940fbffb66bb9feb7b393e45d85d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7d23124a7beffa4a567d58a7d5b77fd2628dd14f07fdf7f97f83916ac1fd6234
MD5 b5476b235427a3aae4de5321bcc6f0b7
BLAKE2b-256 73edd48ee9d97acd9a154270b942e67c304fc621fbdbe930b229f431f0967d0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5a37fc1dd90a118cb45f55d1e23c33a78d32a50a14189451975d00d087a10cf7
MD5 a81375a7baf88488ea62985972b7848f
BLAKE2b-256 52f660d8b6087a07830daee32e9d01ae71ff6af4caee35e9b6e5a627aca9b0ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d57cb66fd6489c4f3923ea180b02e3a963aa648a85d6aab2572e83f05cd94234
MD5 b2e2d95b2d0c65fe7c6e4a0faad51d88
BLAKE2b-256 3e1702381d16db65e2bf5203f55ce0541006637ba4d63a46c549822239d5254f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2e7ffd706e537c5e346b90c9a1b2020a98d2fd4f2d54d5743d1e417fff53b9a
MD5 57eaa23ec6982dcd7cce30afd47162f9
BLAKE2b-256 fc1d4254d6f1b9db83df8518b61e67a2d57f66b520c9690363f79693b41955a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4e652f11443602803853a8155183a1f3c3b09042dccd1345f5baada7dee48df5
MD5 cd8aa67ebbc9dcf6a99895e68861343c
BLAKE2b-256 9d5cc8267f562803a376f4768e851283ffd136dc6a9ad376e1728e996388b265

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 522f5611158633efe822b2d2bd72428e358f7974e4e5aee31f6faf01b8e992df
MD5 029915e90b95980548f1478cd6d7347c
BLAKE2b-256 2168ea3f3d2fe079db930636978d2b704236f06f3b8b1454a755d001047ef828

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0cdf2a79f74b0a13a81fb42fd7205cbaf695418a159143cc9ff508d2c0324204
MD5 0f613019dadf6e2533e29d7e3c8543be
BLAKE2b-256 11b4d58962bbc599c3adfaf6587a99b9b179e36be63b22656ece2ff2c7897f13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0023216211a6d76f1ffa0e048c525e000297a72728fd91e49021387ea67df250
MD5 d4d5e7cfb25b99772016f71aed66dfeb
BLAKE2b-256 36c0c593694fc26ae3e5d9c51be38c54e89419511a7b7b2a39fc989288432960

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 120225630f73ac88ef0ed8cc201032745de8fdb4e90e6da14076e9cda153e838
MD5 85fa4b7586968bdccd92659549c96d6d
BLAKE2b-256 ab69aa51eb030203e29dd84f8ffa153829da2a4749701cc5443bc0882a55ca27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 af6f19ac904289ae6ef76a4dc8096bb47186eef8ec57fb9d5d1442e2271ad6fe
MD5 3ca7d9ee5dedc8d79c1f811acc0bb0a9
BLAKE2b-256 19261048cd6e89b06efe93ae653c02a47064a5ce0d24390a36767357e07f2206

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1efe4b2f2652036412b966ca8438a22fc73de9274842e85ae0b7765c54aef6e9
MD5 868d299cb2c7f5fe844adad84d341ebf
BLAKE2b-256 4d4321a93b82cddcef06e6c07fd0ccd61e293af29a50a05744255be50ce6463a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2abe71502f9b6c732db9af2a38bb2c25f02fd78ebb5e165c59dd438127c10a1c
MD5 716b0ee405e26065bde8f2f35f29cabd
BLAKE2b-256 bd5682886c19011b84b245c5de139aa77b2b75e3436177e6c6973f1a06dfe24b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 44a6812b06df1c09bb6fd6187611290a84f7b0649b567c762217d8a2201470df
MD5 8dd96a29f7bf48ee8a747554ed4abeae
BLAKE2b-256 e1bef67461db6550e7dd1581c8634e7a90a48449ca358755637fa4609bf8713a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ae9d024421f16897cb809ad50e2b86921bfb11db3f24d5bab3ed8162564b6afe
MD5 e06310198818f76147d952f72eda2494
BLAKE2b-256 f568e638c77435fdfc21f5fb1d1d91d942f454be65a5a2020430e1b7ff06df08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 522fa22899a11774d7ebe0e81c814e0bcbdb012a8f4122f75406564e68e10694
MD5 5bd042e2eb814545223189c9552a59a3
BLAKE2b-256 922a33f7118099bdd6aa35ca04d5eb18ca21683105d1e1ebd3f7e82bef0058b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d40ffff3669c48d52193f5bac7b4f551fb0cf3b147b688c1ac43ed00029aa5c4
MD5 85f734e8655c54f56369b98b36b015fe
BLAKE2b-256 ac24fcdd2529f55fb8f66727e8fba33df15616b3b45c21ceec4074b828547c09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 55dc6346f4d02cca58c5d853b875dc9651e0a2b11b86605a112fc8dd7036e7ba
MD5 1bafe2196fca61f90adca20ac5cc185f
BLAKE2b-256 8497cb63ff77ea5912e82f63d9bf7e135ee2baecfe88b41b3508bad030e02334

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 cce37fe9b37b52ef371b54ec826149dfadab07fb1ecc1109244d269f96a9e2b6
MD5 296645268e38633adc0bd39b021f3f28
BLAKE2b-256 eabcb421d466543471cce8daa0b01f8f15c3c5bffb72d1793cd1334c4c30d059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e6cb1a0ac339928f99f66574af6e0b0e850a7ff35514b0eaff3359bd49151ca9
MD5 3fbe54b868499ad775205cb61392ee82
BLAKE2b-256 83e9cea8c00722efa5d07d6bd65dbda1db009f37d81031e40233b7b5c99a483a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6f62af6b8cf368c2f6c236f45b2458b2f343e08349ce4fc568dde786b55f6fb4
MD5 933e0a51ab41d10d0da7431e4b0631fd
BLAKE2b-256 d8d8f58aa9e965f67186cb6a2209e8df198417258108a21743d4a4660324cc82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 fdc9e829dc8f3d58781e08acec7606e84a2d3dcac4b48398838c03ca9ef6a96f
MD5 752e0b839c6ff9c3cfdbbfbb57f454e2
BLAKE2b-256 de82cfec16410626e5569baec0a4879b5b30c1db042dd147d0d643f9ec7adb71

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0b3eff9c652426f4730f2e258578812d34fb6738d9e443424c76756cb94c3427
MD5 d9b73753b59ec287101cbf44800758c3
BLAKE2b-256 87ad0f237d811e05654fdde273f3d519d222f4aa619c10394a9127399e3dca5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.22.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ed3b5038667e9d1668a84c6216dca0000c4f5859bd23b33d0ecc65259c2e298c
MD5 5ad864b834c6d6a7d7a4e7ade9aab889
BLAKE2b-256 7676e4679ff51864bf236d23b3d48e7187af0690436b2b075338a29261aa42df

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