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)

# iterate over all binary images rapidly. crop
# close crops to the ROI and makes iteration a bit faster
for label, binimg in crackle.each(binary, crop=True):
  pass

# Remap labels without decompressing. Could
# be useful for e.g. proofreading.
remapped = crackle.remap(
  binary, { 1: 2, 2: 3, ... },
  preserve_missing_labels=True
)

# change dtype to smallest possible w/o precision loss
remapped = crackle.refit(binary)
# renumber array and change dtype to smallest possible
remapped = crackle.renumber(binary, start=0)

# for working with files
# if .gz is appended to the filename, the file will be
# automatically gzipped (or ungzipped)
crackle.save(labels, "example.ckl.gz")
labels = crackle.load("example.ckl.gz")

# Save a crackle array as a numpy array
# in a memory efficient manner.
crackle.save(binary, "example.npy.gz")

arr = crackle.CrackleArray(binary, parallel=0) # 0 means use all cores (default)
res = arr[:10,:10,:10] # array slicing (efficient z ranges)
arr[:,:,30] = 20 # write to a crackle array (whole z slices write faster)
20 in arr # log(N) check
arr = arr.numpy() # convert to a numpy array

# low memory extraction of point clouds
ptc = crackle.point_cloud(binary) # { label: np.ndarray, ... }
ptc = crackle.point_cloud(binary, label=777)
ptc = crackle.point_cloud(binary) 

# rapid and low memory
voxel_counts = crackle.voxel_counts(binary)
centroids = crackle.centroids(binary)
bbxes = crackle.bounding_boxes(binary)

# low memory CCL, the more memory you provide, the faster it goes
ccl_binary = crackle.connected_components(
  binary, 
  connectivity=26, # 6 (faces) & 26 (faces,edges,corners) supported
  memory_target=int(1e9), # bytes
  progress=True,
  return_mapping = False, # can also return { cc label: original label }
)

# 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.35.1.tar.gz (145.1 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.35.1-cp313-cp313-win_amd64.whl (311.4 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.35.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.35.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (456.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.35.1-cp313-cp313-macosx_11_0_arm64.whl (431.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.35.1-cp313-cp313-macosx_10_13_x86_64.whl (493.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.35.1-cp312-cp312-win_amd64.whl (311.4 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.35.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (475.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.35.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (459.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.35.1-cp312-cp312-macosx_11_0_arm64.whl (431.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.35.1-cp312-cp312-macosx_10_13_x86_64.whl (493.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.35.1-cp311-cp311-win_amd64.whl (311.7 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.35.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (473.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.35.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.35.1-cp311-cp311-macosx_11_0_arm64.whl (430.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.35.1-cp311-cp311-macosx_10_9_x86_64.whl (492.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.35.1-cp310-cp310-win_amd64.whl (310.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.35.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (473.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.35.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.35.1-cp310-cp310-macosx_11_0_arm64.whl (429.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.35.1-cp310-cp310-macosx_10_9_x86_64.whl (490.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.35.1-cp39-cp39-win_amd64.whl (312.4 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.35.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (471.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.35.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (456.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.35.1-cp39-cp39-macosx_11_0_arm64.whl (429.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.35.1-cp39-cp39-macosx_10_9_x86_64.whl (490.0 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.35.1.tar.gz
Algorithm Hash digest
SHA256 b82fd3e4105653e1d69c938a533241cadfbf75192a7e000ebbf7bb1d36fc40f3
MD5 3de6617d60e983e4f916eaaecb0e00a0
BLAKE2b-256 55eb8425e64e4fd83a99dcf9a9c8e969503f7838b0b39d2fdc63733a4950f38b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 818c83db0932404dd4ece9b2410953862a7d396576180f49fbebd4ec39cd1cce
MD5 60dab8642134338bf3b580480f76b306
BLAKE2b-256 5444cc6f608af7234bf72b7d5c0c9544e01d3e6f8d8188c042dc1a02f58acef5

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3033ca7b9f8c97c1f185af7018197d2cebc2bea51ec9a030b8825bcd850ea33a
MD5 7ae6c314d8d179dac7d0a0a325f03216
BLAKE2b-256 2cce70ca79ad18933ece3d900333a622eb927ddf215e3a75db2f947bc9f82273

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 821ecd23648d4becbc69194f9c73cfce0e8416a6dd8b38b3f2b29f93a61c250c
MD5 4fe33dfb0aa03b5a9a1090d6eb5d605a
BLAKE2b-256 616056413a5bf50db409c817b2770eea1884120bde23062868b597463609bfe7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e3cb9089ae1d1d983eda73126d3863240f6b26b7d84ae1e6e5f496415c625d59
MD5 632f32169bc8e802e459d6d0fd1e9461
BLAKE2b-256 0df9cf2d58c4561201a86143c2414205ab0ceb82ed9428dc2ab219dd379b0b6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 529729b8feabed0b1e34718e4553a32f19b724c310f897907a9640054c0978ac
MD5 3b74f629e58f200ab837afe02bb430de
BLAKE2b-256 e805778979a5c247d965a594a6c9af4033696e734f67e1b1d1f2b223789f6589

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6a15ca72d0550a3a91804eed3244c8baebcc39abce72bcdca2bc4110c0c1d817
MD5 8186d1fc696dea89bc554e873c6b30e0
BLAKE2b-256 7425ef0f20bc03b5c6aba58aa21c007e889e5ec7e49da63b87bcac173387745a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 55f778817a0ea38cfbb6f355f9cf1d60f84c1b8a23879c3df692d26e1a309f18
MD5 752af6cd556f93c0beb503de54ab73fa
BLAKE2b-256 b76c362857ca1a9a42bd6eed7e21c205dc585690374f6c93b249a14f8dda8604

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 66637b54ab03091d95d8274aaec8b3f103ff3f4ca652a6c539ace871412e0042
MD5 bdab3bb3813129df44777279240c64df
BLAKE2b-256 0b6d9b7927ddf6b8ab7875cb6fb74098884e9beb968622944b8024f707afaeb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 980b8a1053c7887e79ca8be3d030f15276669c2c478d951abd2072febce668d9
MD5 b1364ef5add5e6338b6a2a1617ded1bf
BLAKE2b-256 2e51b9d5e4268dd9a0315e510588eeeebe23cc69949dd1e22c46a6aacaef9652

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0fb4ba738ef035314ef71a30df8bbc968d9cc34925e921f59a962343771adb8a
MD5 c31963cdebc7b0a91e981664a0d8b944
BLAKE2b-256 54ec966e91d8c0c36216beaaabcd75d016c12d6c34b0442131af8e031006ca50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d87daff497edfda835c1f187230d836f0d89b676575cf7d8bec877f46d9f5e6c
MD5 16bd05cfece8f760aba6d1fd9cecd690
BLAKE2b-256 78fea23ddcbfbfdc738ba372da7a5190afafa1a29a14ff6b52e624e242edcbe0

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ad5c901cf9bcd7f4da26c9491962d9ebb6e307e5af58a5cda788629a95519334
MD5 6154963d581d2b6a2d794a8f3106dbeb
BLAKE2b-256 1b5aec9a13ec30040c45aa564f04b388e7012e96d9e0be9c226eed31389a6857

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 724b7651abcd217c7e72212292be93c7ad23f5ef1dce171299a0103e5344817d
MD5 d4ed6bf269d323c3b85c480c637c3e5e
BLAKE2b-256 fb14d6673bda8e13408a581e3cd967658cab0efe9e51093b8f66b97ff0fb5e09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a7ef9fda8fd376af4afbc69414a0d70a2017e4a0273ff97d619a092bd995c2b9
MD5 a6031e199bf8e5b214bf845a8f557973
BLAKE2b-256 ab775bb7babddab7d018ed00ab5b6fcd5b7063fd4ce28e4da7e5f84625638db9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4e4fdee7eb41ba9773facc71c94ef5c748d8f704af3a66a90e2e26d6f2dd4407
MD5 2361ff29381bb3349ff0ec7c4bd06e7c
BLAKE2b-256 c2baa753deaf946752589cdd2f8033d7ff67b6bd865219cec9b21e1f7b0db6cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4b5f4d2452d58309f8dfc7b0c314500ab7e50acde024587881368e06bd194c74
MD5 437810090a57f73b7acf53adfc2e4819
BLAKE2b-256 1e1b66ec07980ba1c4709f978b2ef6c16a749ef3dc6aedf7506ff9e8c8fb1cfd

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 eee4166e686ad5e8c1e4bd7dd4141b31d638edafcf8ab8bb1710d98ddb27da1f
MD5 2e27fa6d9465910efce7f8a97059ca21
BLAKE2b-256 b42a38f663adeb4249e9783078d530baf8cc5d0eb87aef986a4688b0e2c3a2f1

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e03ca9d3d2f35787eb07a290a038fe55975ddcf318b26686cfbd519a7b727b67
MD5 1c5f0df01badfec0deaf2074c8a0b5f0
BLAKE2b-256 56d55d32e408f49ee318228b33454b7ea3c176ed56653f77452ab11ac371fb22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 823422912dd0054b53d57bea9626a21d35e7ef89a0db2c9f059c0676d8a2213b
MD5 3b387e5a86a292e30df0a84a98acb74c
BLAKE2b-256 6bf9adabd30dbd29170ca99ee76be3baf1cb0bbce8fc99f240e5c9c76027def8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2d68da9bef7bee3c9ad88ab8547772065baf3a140888b2fbc5c6658c844f757f
MD5 024a39c85f55b6c4af3f95ab37211798
BLAKE2b-256 a74a66a3f9cc42a5f54c7cb527cd5d4266eb793ece049371b336eb9723a35710

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a959209b5324884b607920ae24aa50133d0a4ef7981b4fa036db4df7bea45e7e
MD5 d00c8fd17b31b7120c65f20ba5333fed
BLAKE2b-256 588a9175733727b186237c41635283ecd64d75fcc5600bb8fe9fb58ca32dc7b5

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c844f927346db5764860e76ee60ebb2b17d1f774f5b1899a5fefaaf78b936af9
MD5 12aedd735dc12926ac09d3d536ac7b4a
BLAKE2b-256 f530bee10388ec4312ad5ea49de56a34d960bec853c7ed0f8d758c6ebbfb1fa9

See more details on using hashes here.

File details

Details for the file crackle_codec-0.35.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6dc4064ffe30b49340299056d614c31a33e17f4cadc286ed30eefd1a5b7ece02
MD5 1212987027748276a06ea23643891c10
BLAKE2b-256 b1c790ac5fed379e186bc6a708353d6a8cdaa331c6e3f0017adad71a989f0de6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36459c91fafa59ef8699c7c222150d1ff948e6ba92ef1a36ccd7de440f472549
MD5 8185f9cd92aaa3546196a8ea9d84ab56
BLAKE2b-256 053d2ffd980d534c25815b198eca177fad960c97120317c261927251d4210c15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.35.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fc881b0723b0645af858452fde5d8d52f3721e694bc5f2e5af4a831b428361cf
MD5 99996ff5609af84ec8e96899bd47b975
BLAKE2b-256 a6cfa74b65e89a59da2c03bd201df1975696dbe7a7595d3276677cf13e21acf2

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