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.34.0.tar.gz (144.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.34.0-cp313-cp313-win_amd64.whl (311.3 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.34.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (481.0 kB view details)

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

crackle_codec-0.34.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (459.1 kB view details)

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

crackle_codec-0.34.0-cp313-cp313-macosx_11_0_arm64.whl (431.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.34.0-cp313-cp313-macosx_10_13_x86_64.whl (489.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.34.0-cp312-cp312-win_amd64.whl (311.3 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.34.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (482.1 kB view details)

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

crackle_codec-0.34.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (459.6 kB view details)

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

crackle_codec-0.34.0-cp312-cp312-macosx_11_0_arm64.whl (431.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.34.0-cp312-cp312-macosx_10_13_x86_64.whl (489.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.34.0-cp311-cp311-win_amd64.whl (311.5 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.34.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (481.8 kB view details)

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

crackle_codec-0.34.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.7 kB view details)

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

crackle_codec-0.34.0-cp311-cp311-macosx_11_0_arm64.whl (430.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.34.0-cp311-cp311-macosx_10_9_x86_64.whl (487.9 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

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

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.34.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.5 kB view details)

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

crackle_codec-0.34.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (458.0 kB view details)

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

crackle_codec-0.34.0-cp310-cp310-macosx_11_0_arm64.whl (429.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.34.0-cp310-cp310-macosx_10_9_x86_64.whl (486.7 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

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

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.34.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (480.4 kB view details)

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

crackle_codec-0.34.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.0 kB view details)

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

crackle_codec-0.34.0-cp39-cp39-macosx_11_0_arm64.whl (429.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.34.0-cp39-cp39-macosx_10_9_x86_64.whl (486.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.34.0.tar.gz
Algorithm Hash digest
SHA256 1744a71d633498424ddfc4fcbd822f335694a8c5c89acd3d5532afa56fc9d373
MD5 763bedf8f6100f1b1064f75fb2e8588a
BLAKE2b-256 fd9e4247cade21ff876551c482e0a984ddc1b6aab97d83981dba67ced523de32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d432cdd5b944905a79f73288f83bf6617515f9772d7f9f40a8276ad90799863b
MD5 5308df7bac7c7ee39c51e7a5af054ac0
BLAKE2b-256 5a4febf22c64237183d3a556354d2cc9bfd277daa6e5984891aec6808eeba300

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c9c5a8935723440b6db13a167c48113820376b3352bb63b9edd4dd3616994436
MD5 fc585120a49e6e6370aeb36a04a48a63
BLAKE2b-256 9723ffd5ea9c5a29ad500f5f3c642cf086098cfe4eb138c4d170c93c4caf38c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d2b73c4b52071e1e89988ba3202d97539526455f112773bdb05391de355aa7a4
MD5 c2cb7e0fd530ffd272b685322dc377e7
BLAKE2b-256 e37a1a074ed64b83b429a89c28da2983d604fdac9b1ed30c0db28b057aa86eaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 336fe3e32b72cdc2096a67acab6dfdea86d1c47513b6781788ec627aaef96f64
MD5 1bf56ecf9e11e09c81c0144fdfddf388
BLAKE2b-256 d44307832679e1b303f25e2fc3ea1e07a4061bbb54ffa17ffb6730aed9851987

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ad64b3da41deef89a2ccd1810a0a39e738ffe713add0425860a10edcac4bbc8b
MD5 c4d710b23260b35dde8a6a03286624cd
BLAKE2b-256 2278bccb99a84a94cdf72f85d2b8febc424bbf4579ada6761f9555e9983f719b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 50649afd89acf22349002e3508477be5e93aabb8d9f59638710185b91274820a
MD5 d8a57e4c2eb9bd2214b0fb113e8c49cb
BLAKE2b-256 3c5615f876dc1f79ce452930796c4ead50bb9183e3e454ed14123f4e8e24aa0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b5f58a6930bfef2dca0c0b0a7df85b1fb9980adf780e572b7e84d15e02764ed0
MD5 27b7a87c80d498d27fc8209874815831
BLAKE2b-256 60d5accce4bca13c746d515a673173d9c32aace7c920b05c13913563db2d2dc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c634ad42b2b788e8b836770b99d1ae9a83d8daa313d080fe713c73527ad44b44
MD5 6927e1492c06fe226314b07b2bf6dd07
BLAKE2b-256 45d8539613bacf5360187ded553330ef2fcf2016786b28aba15b9ad4438b2d86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 788c0e8dc52f4a24cf844a1247b582c25ae553aa2a8cedd4daa39d463a5bc461
MD5 604046455ffd17c3c54eb545d422a82e
BLAKE2b-256 f10488d44b5d55828b2e6226248e90dc725bd6e673339e77a20b4f141bf8f110

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5af86d5c77618d970380047edd8cff098ba235de2dea97acb35aa367ada3611d
MD5 0d19d54e71bc32915fea097640f8c3e7
BLAKE2b-256 0d27b6ff330eb618d3fa26e5f59b642c356e6739c6e2fd3e996c074fc0021ed7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 987097486914b5661523b1cd43fabcd2e564e343dbdd2b6aeb1005449accec93
MD5 60c3eeec33e254223afc32b5ffdf2355
BLAKE2b-256 9c254e7e3dbf3d4430c1e1c6141ce242f39ead1a0f9b7c4227cd2971a70240f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 55607493d8473768c60a3cb3537f76bfabc1ffa5c1fd08dcc4bc3916b1c534f0
MD5 daef86c8489b14751783874e6bc2b67b
BLAKE2b-256 cd9a9e14f1ea9c271b90d0c37ffd154dd06f0e840ddaa6c6c4c88e7c0f28f600

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8899cf6772770775eca2dd44fee44dab0dabba01ae53460b62e8bbb85fcec4f2
MD5 4c3b463b10688acf85bb562404b74bd0
BLAKE2b-256 1b4310b828f5d94829faa04ba4a7ecee5d6263f93fe8eb7c24af1f36f54ce4c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 06b2e46694c59f425d79309c4de6bbcdb09714f849f389d430456b169cd6a56b
MD5 010248e9ae936c97cdd21d5a2e6519fc
BLAKE2b-256 d24fc5868b378ed5d74fcdef0c0996b2fa24689d2a7fa33d0dd2b94e58f35eed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e3a8c0e22e752f455a95f31f5e0cd07109f8da6f1921b406f066676a3a645a9c
MD5 1ce8e1808119bad096fc4b938e39c724
BLAKE2b-256 5ce9a09c04fa85080e0c39764b78af768053e6016f226e68956bfeef86dd907d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3fbcbe909affffc054e8f9e421d3f40ec8a6b019adf72ae1ba15075c8ec0c322
MD5 227aa639476beec1d0f8bb49b3c50f6f
BLAKE2b-256 b159ead9fad38dc7d00f3056ac9f1e1354abd51356e1da7fd03a18351394341e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 db5fd8a70909b044707a2f511987645bf6801e143a62a76ac8e9205ddfdbc572
MD5 61b7508722e434421ab003ebcc3b714d
BLAKE2b-256 ee01f0425d21a1f13be13afc1ab6f912382f00f0dd013041bebef802e62ae7b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fdc6135e00ef00d362c9c19a31c3ace1d31d05920a4eb9ae36678ece6807d75f
MD5 fa5fb8d06889747abfebb83f2edfa6b1
BLAKE2b-256 dbcc9c1f78f8b0a91a9f1d901a7656d5dcd6707f984f3fbe261a42d8bef34403

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36d3e9e46b422d4d732167423c750e87c3495ea758c39d40bc32a8131731c6a8
MD5 cf440cdac7d066923594283c7e07b120
BLAKE2b-256 f89033e4aa2e29258cf0a70554564eb39735962e2085f18ce8149cd771dd1d31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8a8986583cb0aee49e7af90abd72a299e688e4426b73482ca2c25929066dfbd1
MD5 7276a861875214fc3e53f17ba5d93cd7
BLAKE2b-256 5da4d8d490f5ff68331567ec8dc37032aaf91dcf2874bcb91f89a548deb4ff0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1d6d0124eb7c832be88412a39c45735e6a1d5397320719f5d6a5b69872b29e72
MD5 37df3ad49df8a70d99449120c10eb39a
BLAKE2b-256 e26c4f41126ddc9b57757773a4b9950118acb33ed10e638c3983dae661b87148

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7b6396b4cd5c680a66ee86fcb171c9d8758736171e577857249f42bb6825f860
MD5 c12b22bab05b9acf40447cf164243035
BLAKE2b-256 8a64298789c67198c51e6f0e9cc58505d96fd38e3abb968c09b17083a371134e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 090c34b725f28549f69896cd8cf046bc3b6a2bde79d86ceaa27c05d3f43a42a0
MD5 2ea8367f5a839c30a6b8c314fd3332d6
BLAKE2b-256 0b53b5b0c9b129e9cb735b88283417a9a93a0d20c47eaa89eba45dd68656e74c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f751e4c1a7312390ba2bdf30d3925cd4cc721632aed567855be5cdc7543b173
MD5 981caf8349bb2f18903e1f7950657f4a
BLAKE2b-256 14f9848c2e1080b83461b50bbb3bbc0b176b0c8b7d508d8716a0f5b462bca610

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.34.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2a7fdcca34ab0a667c7a56c7cac6842e07926199f24774b90dd818f675c15582
MD5 97b91e3eb7e12be5817a5d009718b8e9
BLAKE2b-256 6bd0956d4b5bd60c224d6f30d1d5f164a1427694627fdbf181e4149c8e6f80c7

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