Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

# Command Line Interface
crackle data.npy # creates data.ckl
crackle -m 5 data.npy # use a 5th order context model
crackle -p data.npy # use pin encoding for labels
crackle -p -m 5 data.npy # use pins and markov model
crackle -d data.ckl # recovers data.npy
crackle -m 0 data.ckl # change markov model order
crackle -t data.ckl # check for file corruption
import crackle
import numpy

labels = np.load("example.npy") # a 2D or 3D dense segmentation

binary = crackle.compress(labels, allow_pins=False, markov_model_order=0)
labels = crackle.decompress(binary, parallel=0) # use all cores (default)

# faster extraction of binary images
binary_image = crackle.decompress(binary, label=1241)

# get unique labels without decompressing
uniq = crackle.labels(binary) 
# get num labels without decompressing
N = crackle.num_labels(binary) 
# get min and max without decompressing
mn = crackle.min(binary)
mx = crackle.max(binary)
# check if label in array in log(N) time
has_label = crackle.contains(binary, label)

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

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

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

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

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

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

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

# building big arrays with low memory
binary = crackle.zeros([5000,5000,5000], dtype=np.uint64, order='F')

part1 = np.zeros([1000, 1000, 1000], dtype=np.uint32)
part2 = crackle.ones([1000, 1000, 1000], dtype=np.uint32)

binary = crackle.asfortranarray(binary)
binary = crackle.ascontiguousarray(binary)

# creates a crackle binary with part1 stacked atop part2
# in the z dimension. x and y dimensions must match
# without needing to decompress anything.
binary = crackle.zstack([ part1, part2 ])

# splits a crackle binary into before, middle (single slice),
# and after sections without decompressing.
before, middle, after = crackle.zsplit(binary, z=742)

# splits binary into individual z slices
sections = crackle.zshatter(binary)

This repository is currently Beta. It works and the format is reasonably fixed. There may be some improvements down the line (such as 3d compression of crack codes), but they will be a new format version number.

Crackle is a compression codec for 3D dense segmentation (labeled) images. The algorithm accepts both signed and unsigned integer labels (though the implementation currently has some restrictions on signed integers). It is written in C++ and has Python bindings. Crackle uses a two pass compression strategy where the output of crackle may be further comrpessed with a bitstream compressor like gzip, bzip2, zstd, or lzma. However, if the Crackle binary, which is already small, is not further compressed, it supports several efficient operations:

  • Query if a label exists in the image
  • Extract unique labels
  • Remap labels
  • Decode by Z-Range

Crackle is inspired by Compresso [1]. Compresso innovated by separating labels from boundary structures. There were conceptually four (but really five) elements in the format: header, labels, bit packed and RLE encoded binary image boundaries, and indeterminate boundary locations.

Crackle improves upon Compresso by replacing the bit-packed boundary map with a "crack code" and can also use 3D information to reduce redundancy in labels using "pins".

See benchmarks for more information on Crackle's size and compute effiency.

Installation

pip install crackle-codec 

Building from source (requires cmake and a c++ compiler):

git clone https://github.com/seung-lab/crackle.git
cd crackle
git submodule update --init --recursive # fetches google/crc32c library
python setup.py develop

Versions

Format Version Description
0 Initial release w/ flat, pins, crack codes with finite context modeling. Beta.
1 Incr. header to 29 bytes from 24. num_label_bytes u32->u64, adds crcs to protect stream components.

Stream Format

Section Bytes Description
Header v0: 24, v1: 29 Metadata incl. length of fields.
Crack Index header.sz * sizeof(uint32), v1: +4 Number of bytes for the crack codes in each slice + CRC32c(le)
Labels header.num_label_bytes Can be either "flat" labels or "pins". Describes how to color connected components.
Crack Codes Variable length. Instructions for drawing crack boundaries.
Labels crc32c (v1 only) 4(le) v0: n/a, v1: crc32c of the labels binary.
Labels crc32c (v1 only) header.sz * 4(le) v0: n/a, v1: crc32c of the uncompressed uint32_t fortran order connected component labeling of each z-slice.

A Note on CRCs

CRCs protect each step of the decoding process. The fixed width header is protected by crc8, which contains information for decoding the crack index. The crack index is in turn protected by a crc32c. This is not overkill because a very large volume or a volume that is randomly accessible in XY as well as Z would need a crc32 vs a crc16.

The crack index is used for decoding the structural information (the connected components for each slice). We store a crc32c for each z-slice. This allows random z access to be validated while balancing against the storage cost of creating too many crc (e.g. vs. once per a grid).

We also store a crc32c for the labels binary independently of the crack codes.

All crcs are stored little endian.

Why not store a single crc for the entire uncompressed image? This would make it difficult to validate as a single crackle file could represent many terabytes of data. It would also make it difficult to edit the labels (remap) independently of the structure. Storing a crc32c per a z-slice also allows for z-stacking independent slices without recalculating crcs.

The downside to this strategy is a small increase in the file size and an increase in false positives for crc32s. This is the price of having the format be more of a random-access array format than a bitstream format. However, as crackle is designed to be two stage compressed, for example, with lzip, an LZMA variant with error correction properties, these issues are mitigated when archived.

crc8 (0xe7, initialized with 0xFF) was selected due to its ability to reliably detect two bit flips in up to 247 bits of message data, the best available for our header length.

crc32c was selected as the polynomial due to the availability of high performance implementations. This is important to avoid CRC calculation being a significant cost to the codec.

Error Detection and (Limited, Human Assisted) Correction

Due to this mutli-crc strategy, it is possible to narrow down corruptions to the section of the binary where they occur. For example, if you are concerned with only z=1-100 and the error occurs at z=200, you're ok. If the error occurs in the labels_binary, but you were planning on applying a full new mapping anyway, you can get away with discarding the extant labeling. Certain bit flips in the labels binary will create out of range keys, which will aid in identifying exactly where the error occured. Headers can be repaired potentially be human inspection (if they know the dataset).

Header

Attribute Value Type Description
magic crkl char[4] File magic number.
format_version 0 or 1 u8 Stream version.
format_field bitfield u16 See below.
sx, sy, sz >= 0 u32 x 3 Size of array dimensions.
grid_size log2(grid_size) u8 Stores log2 of grid dimensions in voxels.
num_label_bytes Any. u64 Number of bytes of the labels section. Note the labels come in at least two format types.
crc8 Any. u8 CRC8 of format_field thru num_label_bytes using polynomial 0xe7 (implicit) and 0xFF initialization.

Format Field (u16): DDSSCLLFGOOOOURR (each letter represents a bit, left is LSB)

DD: 2^(DD) = byte width of returned array (1,2,4,8 bytes)
SS: 2^(SS) = byte width of stored labels (sometimes you can store values in 2 bytes when the final array is 8 bytes)
C: 1: crack codes denote impermissible boundaries 0: they denote permissible boundaries.
LL: 0: "flat" label format, 1: fixed width pins (unused?) 2: variable width pins 3: reserved
F: whether the array is to be rendered as C (0) or F (1) order
G: Signed (if (1), data are signed int, otherwise unsigned int)
OOOO: Nth-Order of Markov Chain (as an unsigned integer, typical values 0, or 3 to 7). If 0, markov compression is disabled.
U: if 0, unique labels are sorted, else, unsorted
R: Reserved

CRC8 only covers the header. It doesn't cover the magic number or format version since those are easily human correctable if needed.

Flat Label Format

Attribute Type Description
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
cc_to_labels smallest_type(num_labels)[sum(cc_per_grid)] Array mapping CCL IDs to their proper value by indexing the unique labels array.

Flat labels are random access read, allow efficient reading of unique labels, efficient remapping, and efficient search for a given label's existence. Since the connected component labels can often use a smaller byte width than the unique values, even noise arrays can see some value from compression.

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

Attribute Type Description
background_color stored_data_width Background color of image.
num_unique u64 Number of unique labels in this volume.
unique_labels stored_type[num_unique] Sorted ascending array of all unique values in image, stored in the smallest data type that will hold them.
cc_per_grid smallest_type(sx * sy)[sz] Array containing the number of CCL IDs in each grid (usually a z-slice).
fmt_byte u8 00CCDDNN DD: 2^(DD) is the depth width NN: 2^(NN) is the num pins width, CC: 2^(CC) is the single components width.
pin_section Bitstream to end of labels section. Contains pin information.

PIN SECTION: | PINS FOR LABEL 0 | PINS FOR LABEL 1 | ... | PINS FOR LABEL N |

PINS: | num_pins | INDEX_0 | INDEX_1 | ... | INDEX_N | DEPTH_0 | DEPTH_1 | ... | DEPTH_N | num_single_labels | CC 0 | CC 1 | ... | CC N |

Both num_pins and num_single_labels use the num_pins_width.

Note that INDEX_0 to INDEX_N are stored with a difference filter applied to improve compressibility.

A pin (color, position, depth) is a line segment that joins together multiple connected component IDs and labels them with a color (an index into UNIQUE LABELS) in order to use 3D information to compress the labels as compared with the flat label format. Pins are slow to compute but fast to decode, however random access is lost (a full scan of the labels section is needed to decode a subset of crack codes). The most frequent pin is replaced with a background color. Like with flat, efficient reading of unique labels, efficient remapping, and search are supported.

Depending on the image statistics and quality of the pin solver, pins can be much smaller than flat or larger (some heuristics are used to avoid this case). An excellent example of where pins do well is a binary image where remarkable savings can be achieved in the labels section (though overall it is probably a small part of the file).

For very short pins (e.g. depth 0 or 1) that take more bytes to record than simply listing the corresponding CC label, we list the CC label instead. This calculation is made depending on the dimensions of the image and the max pin depth, and the byte width of the CCL labels.

Example calculation. For a 512 x 512 x 32 file with an average of 1000 CCL's per a slice and a maximum pin depth of 30, a pin takes 4 index + 1 depth = 5 bytes while a CCL takes 2 bytes. Therefore, depth 1 and 2 pins can be efficiently replaced with 1 and 2 CCL labels for a 60% and 20% savings respectively. CCLs are also difference coded to enhance second stage compressibility.

Fixed Width Pins (disabled)

| BACKGROUND COLOR (STORED_DATA_WIDTH) | NUM_LABELS (u64) | UNIQUE LABELS (NUM_LABELS \* STORED_DATA_WIDTH) | PIN SECTION |

PIN SECTION: |PIN0|PIN1|PIN2|...|PINN| PIN: |LABEL|INDEX|DEPTH|

A fixed width variant of pins has also been developed but is not enabled. It frequently is not significantly smaller than flat outside of special circumstances such as a binary image. An advantage this format would have over condensed is that the pins can be sorted and searched rapidly by index, which reduces the amount of reading one might have to do on an mmapped file. Please raise an issue if this seems like something that might be useful to you.

Crack Code Format

CRACK CODE: MARKOV MODEL | CHAIN 0 | CHAIN 1 | ... | CHAIN N |

CHAIN: | BEGINNING OF CHAIN INDEX (sizeof(sx * sy)) | BIT PACKED MOVES (2 bits each) |

MARKOV MODEL (if enabled): priority order of moves UDLR packed per a byte. 4^order bytes.

The BEGINNING OF CHAIN INDEX (BOC) locates the grid vertex where the crack code will begin. Vertices are the corners of the pixel grid, with 0 at the top left and sx*sy-1 at the bottom right (fortran order).

The crack code is a NEWS code (up,right,left,down). Impossible combinations of directions are used to signal branching and branch termination. The next chain begins in the next byte when a termination signal causes the current branch count to reach zero.

There may be ways to further improve the design of the crack code. For example, by applying a difference filter a few more percent compression under gzip can be obtained. In the literature, there are other shorter codes such as a left,right,straight (LRS) code and fancy large context compressors that can achieve fewer than one bit per a move.

Boundary Structure: Crack Code

Our different approach is partially inspired by the work of Zingaretti et al. [2]. We represent the boundary not by border voxels, but by a "crack code" that represents the edges between voxels. This code can be thought of as directions to draw edges on a graph where the vertices are where the corners of four pixels touch and the edges are the cracks in between them.

Since this regular graph is 4-connected, each "move" in a cardinal direction can be described using two bits. To represent special symbols such as "branch" and "terminate", an impossible set of instructions on an undirected graph such as "left-right" or "up-down" can be used (occupying 4 bits). In order to avoid creating palendromic sequences such as (3, 0, 3) meaning (down, branch) but can be read (terminate, down), we can use the left-right impossible directions to rewrite it as (3, 2, 1).

While the image is 3D, we treat the image in layers because working in 3D introduces a large increase in geometric complexity (a cube has 6 faces, 12 edges, and 8 corners while a square has 4 edges and 4 corners). This increase in complexity would inflate the size of the crack code and make the implementation more difficult.

Label Map: Method of Pins

Each 2D CCL region must has a label assigned. Due to the 2D nature of the crack code, we cannot use 3D CCL. However, for example, a solid cube of height 100 would need 100 labels to represent the same color on every slice as in Compresso.

It is still possible to reduce the amount of redundant information even without 3D CCL. For each label, we find a set of vertical line segments ("pins") that fully cover the label's 2D CCL regions. Sharp readers may note that this is the NP-hard set cover problem.

Once a reasonably small or minimal set of pins are found, they can be encoded in two forms:

Condensed Form: [label][num_pins][pin_1][pin_2]...[pin_N] Fixed Width Form: [label][pin_1][label][pin_2]...[label][pin_N] Pin Format: [linear index of pin top][number of voxels to bottom]

Fixed width example with label 1 with a pin between (1,1,1) and (1,1,5) on a 10x10x10 image: [1][111][4]

An alternative formulation [label][idx1][idx2] was shown in an experiment on connectomics.npy.cpso to compress slightly worse than Compresso labels. However, this alternative formulation theoretically allows arbitrary pin orientations and so might be useful for reducing the overall number of pins.

The condensed format is a bit smaller than the fixed width format, but the fixed width format enables rapid searches if the set of pins are sorted by either the label (enables fast label in file) or the likely more useful sorting by top index to filter candidate pins when performing random access to a z-slice.

References

  1. Matejek, B., Haehn, D., Lekschas, F., Mitzenmacher, M., Pfister, H., 2017. Compresso: Efficient Compression of Segmentation Data for Connectomics, in: Descoteaux, M., Maier-Hein, L., Franz, A., Jannin, P., Collins, D.L., Duchesne, S. (Eds.), Medical Image Computing and Computer Assisted Intervention − MICCAI 2017, Lecture Notes in Computer Science. Springer International Publishing, Cham, pp. 781–788. https://doi.org/10.1007/978-3-319-66182-7_89

  2. Zingaretti, P., Gasparroni, M., Vecci, L., 1998. Fast chain coding of region boundaries. IEEE Transactions on Pattern Analysis and Machine Intelligence 20, 407–415. https://doi.org/10.1109/34.677272

  3. Freeman, H., 1974. Computer Processing of Line-Drawing Images. ACM Comput. Surv. 6, 57–97. https://doi.org/10.1145/356625.356627

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crackle_codec-0.31.0.tar.gz (141.3 kB view details)

Uploaded Source

Built Distributions

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

crackle_codec-0.31.0-cp313-cp313-win_amd64.whl (309.2 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.31.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.9 kB view details)

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

crackle_codec-0.31.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.0 kB view details)

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

crackle_codec-0.31.0-cp313-cp313-macosx_11_0_arm64.whl (429.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.31.0-cp313-cp313-macosx_10_13_x86_64.whl (487.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.31.0-cp312-cp312-win_amd64.whl (309.2 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.31.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (480.0 kB view details)

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

crackle_codec-0.31.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.5 kB view details)

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

crackle_codec-0.31.0-cp312-cp312-macosx_11_0_arm64.whl (429.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.31.0-cp312-cp312-macosx_10_13_x86_64.whl (487.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.31.0-cp311-cp311-win_amd64.whl (309.4 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.31.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (479.7 kB view details)

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

crackle_codec-0.31.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (455.6 kB view details)

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

crackle_codec-0.31.0-cp311-cp311-macosx_11_0_arm64.whl (428.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.31.0-cp311-cp311-macosx_10_9_x86_64.whl (485.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.31.0-cp310-cp310-win_amd64.whl (308.3 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.31.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (476.4 kB view details)

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

crackle_codec-0.31.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (455.9 kB view details)

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

crackle_codec-0.31.0-cp310-cp310-macosx_11_0_arm64.whl (426.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.31.0-cp310-cp310-macosx_10_9_x86_64.whl (484.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.31.0-cp39-cp39-win_amd64.whl (310.3 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.31.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.3 kB view details)

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

crackle_codec-0.31.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (454.9 kB view details)

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

crackle_codec-0.31.0-cp39-cp39-macosx_11_0_arm64.whl (427.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.31.0-cp39-cp39-macosx_10_9_x86_64.whl (484.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.31.0.tar.gz
  • Upload date:
  • Size: 141.3 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.31.0.tar.gz
Algorithm Hash digest
SHA256 e291a2617c48cd61110dc55c1bc320e7a00c9deb481384095dfb43be67eb1cd7
MD5 4fb4a050c14f243dc8a3ef1c098c520e
BLAKE2b-256 c19b55abc59b56ef9663029761baca8cf06ce250481058ddc690273cc022fb0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 630f47d6206cbe2fe601fef888d54a474e2facc786b6df96cb77b99191fb2fb6
MD5 8c77acf1f8c48093971aecc367b7ecfd
BLAKE2b-256 257ff3bc720445d928aad2494e2963e6b4c9bd1d7f403e28128551744ccfb889

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a814710ee1dbc5fce4d97848865ff383d5fd334eb8c258a29135da2901d57740
MD5 662149bae31c473b313534811ae62ac6
BLAKE2b-256 937b050d4cda14028ead296417edbc19745be383cf9f14c6cc7a38c856548ccb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e5b2e297f6eda49f1d049a99ab7b107ae6aa55be2464d2a8c129e89917c43f29
MD5 0cf40cfc3132739bd89d6bf024be80c1
BLAKE2b-256 e97bfee1e659822f7eb1c29330bb2e244be5c1de8bef6841c79a8becf403624f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d66be162700efbb449d599b38054b7eb8a3f95d1301f557567e1d735d5c2a37
MD5 7b9e0ff8acda92f86699743044f48447
BLAKE2b-256 01efd88a17b66a5cc7e8230b403fd8f50c7ae75e13ff45a3ae132770f90e38fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b0cfd9426d04d7039ff1563a863755e80100ae895fb58a0bbd9835e7d2cdb35a
MD5 b3e19e7be1e1b8ae1e7948c1c324e98b
BLAKE2b-256 5f5feb3b6354a07f695cc943ac12295455e8811df8687e2fa75db55f6ac1a5f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0e0fc5c641febc801b0ab101a9479bba183b002c1fb9b22acd93f24f08b1c7db
MD5 28cf9c9fd92a5e22bdf5d6620660abf1
BLAKE2b-256 1c381b7c6e54a137e529ffc5539851cca0a12adf2519e0410477464f6946e2e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fe288087387ef33f5f6ac1d2661de4f90ce1d329e927c578c105848b272cd402
MD5 401f3e14c42056ac58943baa9e77475f
BLAKE2b-256 f2d454fa2f2e75bc987fbe048522ee77a5b4b1464304fe7696c6b785466beee5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9626651d0552a91d9585678a674a29f986237ab099e5002d7c2a382d4715e065
MD5 e6cb523d729c37534a7351ec882e584a
BLAKE2b-256 65750b322ac94e8e829ca15db8d1939a1865599a9af5dd76d09b051901805e79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7751f2b3a462a6399ddf8ff1d922ed5d3a40bd325caad18d213b3625a98781ab
MD5 532905a778a5aa348952a5eed380fbc2
BLAKE2b-256 850aed466214f4147e791d53c61ad00e8b6aad631835320ccdfbb864e214f985

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 459fbba99d9ceb732fd50e327ac02150c12dc8bf2ce6eda698e838672b79dc30
MD5 010a2dc61382bb2ef0e47a0b42fce3ab
BLAKE2b-256 ca7732d1056237b90b0939ea6a516f51dc63c26ebd1fd877b42198d294342d9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d61d7a5e7fbd07583cccab6e34ad37695ac6581b47be7366e3d2816119fef9fa
MD5 7d5e6977da910eb85416f9a0d6305e6c
BLAKE2b-256 435fe4882853e509420f7be5e7af5485990d93c5b5784aec7ec656fe19d65820

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cd7b6481243981c1aa58ec5cc5cce10928574972cdc7c7b38524caa4bce6374e
MD5 ba48e9c54ae775698eae64866f03a18c
BLAKE2b-256 08106cb8cb616b445faacc1b3a6bc93d983fff389129f245fae84e0404688de3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e126b07966b97f6ff9fa1fe8d96fe606462ffe207b105fa2dff0a1660fc431d7
MD5 2c53cd76a86bfd0e8411117a070e1a45
BLAKE2b-256 c7f89641663c6dad7bc235f85310fd158b60f586ce755a3bee1761d2399e14b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0734d53eff2f086e423c96aa8f6405ca651969871736c0302f607433a3702d49
MD5 fe7cba897a2f65f9f36f9fac36d21e25
BLAKE2b-256 00351c39d1f97071a9aed3309e871c87acc008a75b1e3067cd455f2921c874f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e232503341d9995e5edf2e3b369313596c511e2a6f2b1bc36640e5bf32a6ab1b
MD5 7a9ee53c0ddc8baa62e65177a01a08b4
BLAKE2b-256 c9dd1c80e97ebf29482752e23b64c356ee1884df416a5cdc0f543624f611b1af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a7cf78d812c4d43a4a6153013a7bc164df74341dd9b30e22b092efb597eb0b4c
MD5 ba35f01758ab8f3003205b37a6a4c071
BLAKE2b-256 500c1612923983f1ce1d2df8ccac664d762f615cfcf4ce33150bcb232a79bd1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ef171038e315e558b7a3ec349b2727f998deb46d4b988259343e996820fe87e1
MD5 abcfed1bc463bd4c5261491bfa0dd6ac
BLAKE2b-256 d3eee594d7cfa8492ba0dcc737c11899953503996bb3e7c2c6b60150f47bb313

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 904aa5ba90240ddc02852b3210c35aa6cb241b13f3ffda3beac6791d22e3cdc4
MD5 78d2badad64b3172142d2e43d4bd5f52
BLAKE2b-256 5810086b3766d272a651e77294a8c3ce9de07070041a0b21dee6b395c3ac2d69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 146e105cc04d311a5c464457a27e2b2639b352dea78e514aab4bc70d216e6734
MD5 d910c4d86f966bfbc40b0adc9b9cce51
BLAKE2b-256 6f3884739046753b0fd43bccf90564d3e941de8925982a620092524094fdeba3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 28ef761b8910d3e6b9a1dc985ba9ee644671b895cc7806d005fa29d9183fac0e
MD5 57772ba83b346a08ab7d4484dcffc8be
BLAKE2b-256 caad25cf012aa6210821af69eb9729826619b0583b5f67dac58d1b238bb93799

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 278302f7a34848badccee5cf026074f4df852618052cc7186e3228e3c7589811
MD5 4c98a75d0ab7aa333d6fb2302adacaaf
BLAKE2b-256 4198363b1bc361b3a1dae7806ea61f107304625bb3cee36054b07370e7a2a22c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dadfc696a8663ac4a4df3c37b61cb816325ab56a81088d23aa2646c83c206b5f
MD5 2df2842b809e975b303533cdd4f7fcb7
BLAKE2b-256 3b47d5723c2f4be64b57beaf5d16176cecb8723722cf937fd94800bca13060ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a1941d9a4f3a9c0e26d0223a0681f2dedf452e2cbeee50a834e9fcabdc267cfe
MD5 bb69d407a006f98b0f658636ea41481b
BLAKE2b-256 c86011f66cead14dde16e0f00d687ef20c538ad5ccd582f2228feb5ce463b3bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a6b5060952404443fcf68fbc0eff1ecd8e2d586ef9b41afcbf871b523642239c
MD5 133ec02630ecb953e37f89b9d25c024c
BLAKE2b-256 1d7cbfb5d310f5fc969e1297be57877eb787c1e1fb9627f64f2917f18907a1d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.31.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 99bcee70720d1ac23b85fbbf77d9b761b7e2f57b04560111528027fe07a7f13d
MD5 3e5acf9fa9d4dfc1c481cbdad8bcae92
BLAKE2b-256 2fb280c61484bba9d616d4a2cbc65ff3fe4cfa73c6ee3b927e7b53a71bed923e

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