Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Installation

pip install crackle-codec 

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

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

Versions

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

Stream Format

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

A Note on CRCs

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

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

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

All crcs are stored little endian.

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

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

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

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

Error Detection and (Limited, Human Assisted) Correction

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

Header

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

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

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

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

Flat Label Format

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

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

Encoding flat labels is fast.

Condensed (Variable Width) Pins Label Format

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

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

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

Both num_pins and num_single_labels use the num_pins_width.

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

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

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

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

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

Fixed Width Pins (disabled)

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

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

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

Crack Code Format

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

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

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

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

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

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

Boundary Structure: Crack Code

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

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

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

Label Map: Method of Pins

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

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

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

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

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

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

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

References

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

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

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

Project details


Download files

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

Source Distribution

crackle_codec-0.25.0.tar.gz (126.0 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.25.0-cp313-cp313-win_amd64.whl (276.6 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.25.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (440.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp313-cp313-macosx_11_0_arm64.whl (398.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl (454.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.25.0-cp312-cp312-win_amd64.whl (276.6 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.25.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (439.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp312-cp312-macosx_11_0_arm64.whl (398.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl (454.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.25.0-cp311-cp311-win_amd64.whl (276.5 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (438.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp311-cp311-macosx_11_0_arm64.whl (400.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl (453.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.25.0-cp310-cp310-win_amd64.whl (275.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (437.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp310-cp310-macosx_11_0_arm64.whl (397.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl (452.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.25.0-cp39-cp39-win_amd64.whl (274.8 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.25.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (437.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp39-cp39-macosx_11_0_arm64.whl (397.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl (452.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.25.0-cp38-cp38-win_amd64.whl (275.4 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.25.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (437.3 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp38-cp38-macosx_11_0_arm64.whl (397.3 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.25.0-cp38-cp38-macosx_10_9_x86_64.whl (452.0 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.25.0-cp37-cp37m-win_amd64.whl (276.5 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.25.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (440.0 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp37-cp37m-macosx_10_9_x86_64.whl (451.7 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.25.0-cp36-cp36m-win_amd64.whl (276.3 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.25.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (441.7 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.25.0-cp36-cp36m-macosx_10_9_x86_64.whl (450.9 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.25.0.tar.gz
Algorithm Hash digest
SHA256 6ebcd584772e1239145abfbf5c8f5d148fe0a45aa622372bfe4a6ff9aafbebc9
MD5 a62ce95e1ead03c61a76c5d794714c06
BLAKE2b-256 ef6b7c54f30de29e76545f28a94aade237f21aac0200a89a165e901a8b62274d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 966e7b08c0d9813b4f10398b8d8dfab52573db9c946022900800c1f7d65b52b4
MD5 86c123eee7169a0ed97d0d73988f6db4
BLAKE2b-256 151b06239b0801b980b30f8ca63753758be8dbdbf7b23303bb59ce5c276d53af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bc6ba01704b8cc7be8f65d18e65b00a1342d9e3ed86f3d4a3197323c2217f6f4
MD5 396e8b2ff81889e514817f784441f21d
BLAKE2b-256 64cb9ca064cb4d39aa099c3eccaeae421a6fd1c69443b20fdb128e44e18865d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f0a4c138ed5fef7b9722bc28aed0e595220a8b8367f79fd1f06e8866a50449f
MD5 ed60e50b7a1dc0f0c90a40eccb1b2ff6
BLAKE2b-256 21acdfc3fef076218f8bd4c0e00a16ef4d57b86192dbf0fbc42d44a04b8cf583

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 00ef19c88392b3b7a0122cb3ac9294cc12f4517528e36be30dc6a745b233d562
MD5 75833ce1095eab944f18ee3f510c7bee
BLAKE2b-256 4ceefc451fe28698c8ffb54b242e3d6a9aada3e8515c43f4dde7116d17ec48f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 991ac93ae281a030ee22ccc0d44e2545afc3de6697d26579904affed18824cec
MD5 6ea68dc4b769b7aeffa8400a55c99bfb
BLAKE2b-256 e7d7a0009f6d74c556aecac8e7823b7e0e55656c9e7174264e96f4d7685ceda1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e256691b6ca99fe9dc0ef7eb16723d7bdc23e61141699eeb9064d58002ebb827
MD5 a9fbc3c7f600d7c989ef3c41efb38729
BLAKE2b-256 b645db00e88688c33f3631e32a24a6a05f4fe0182e2e6c1c12eb97f74e53f036

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85ed49cf88bc74f0a23583d63bd5351963e15a94bb08be4f0c4ed8e720f0c041
MD5 e43dc4da69fcc315dc2d7d0a1180d4ad
BLAKE2b-256 6ffaa1b3372d9c6c1d4fc8826448ebf74d5cd64244d2b0c619eaa1e02c9c8cff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 30b33380492e559e5679a8153594faee0fe330e73b0f34a85b9834fcafdb7899
MD5 a05b573a7543cc427eaa65d653409560
BLAKE2b-256 c960037899ea57cc433bf20c4b7624915f6802b6ddae9a98b6e2102c4e30381b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1b6e509ba619bc21ef5b18c445a202f020caa8c28137713aa441ed12e14b5af4
MD5 d7ea24b2b31f02e5c42bfb994175f63c
BLAKE2b-256 e9b9da5973ae345a7dc18fbe58cc68a74788d2b48d081a1893a4176faec2d6ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5ff82b6812593515d351607eec8c791fbe8ee28fecedbddaa402117a44a48e8b
MD5 b99d376320b9c76139ef104e8507e4c8
BLAKE2b-256 3a673dc976bc26f9ce0e699ca8527152009cebba88c4460aac9d3f517fbf8c74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b662da9240fe92acfe647b265dee6ae2cba259ab6a926953f43761767521b363
MD5 025df73582b190b111d9e616065e54d0
BLAKE2b-256 e714a9ba923ebd9a02ab40faf0b466e3e7d7b89d9b94749d31f7aeee6ec78971

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b0ed37d428fc3b5c3bce8bb08da8459bff74039563c52e761524efd5275c616e
MD5 038625af40e6e49110816e848f2daadd
BLAKE2b-256 dad0de5c69cebb4cc80dc88cdc2699f9b94eab2dc03178a0976054db9941bf44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6264ccbe97c858e818c8fe22cee26820d97224e5a0fa443c2a75194b77598375
MD5 f729ececaad3d5f3056843b9461b6fec
BLAKE2b-256 f5f6677d58dbb4ca21d1712a3d901d00e3f8e6f909c804fbcd7a165e5d04a42b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ef6313ac0f1a78529a8935746e4297c3f6351ee0353bddd54bb5a6ebdde84e03
MD5 bde649dc82f4aa7c2bc867b530562e3b
BLAKE2b-256 6a004781f69a385ee7555990e99cf9b1df899930b8148f8034916e738adf4b8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d5d672b34a27d46801e5d289a9f4f3da1c69cffb3630fe2af7cc1476a302410c
MD5 e69a5fb7b6080ecd6f8b4c9b7770e0a3
BLAKE2b-256 6fb41139dbb5a73407f8d136137c6c702f8f59708b20320243addc94f0c9f4bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4769b0b69ef415273221e140e618a08a960c18449fe78ca956f4df98c659dc73
MD5 21e584c497daca6b8ecd2f11fa6cd3f0
BLAKE2b-256 afc0da6c3ca63dcc4b0d38f44277111511e6bfb7afabf1730755acb14bdf2843

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 177b65b1f4e2dc741c3dab1c9f6907f4a4719568195c564ee9b782fde276c28e
MD5 9eb010940f164f67bb07179d890eebe9
BLAKE2b-256 56b6c21b1c4c569246accc2922c0546e8fba4693d1dce4af09a17c6eeac7bf41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a36b1c1e4c4397791aef6339f0b2f89839e8974d305376827bbc527055c1ae8c
MD5 1046b10d84210e73f0491903d1c19953
BLAKE2b-256 0efecaedf597741773021952cb453ed6b7d612af0260ffb61b6791153e95debc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 59d1b6b4842de48e096b1654722247e71d3e30f4de9f76ce3e913cd052e2bdd5
MD5 315c9cff6611a53e084ef207c831de57
BLAKE2b-256 a9d18dc1fbf1b3dbae528927170694ff47b53cb2c688429259be40b213447c9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b58ed9a2f90c82d0d6cb5831e9bb5c61d81be60182014905e19395893690f995
MD5 9d19fa94b217b6ac0b14c1e8c8e37f5d
BLAKE2b-256 9bf09976603af64497ff729d75333383d62a823e8e796beeab92ef03716192ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b4fc03f4f6a6f17dc547de439abf3ed42a92bf7d9802d18690308ec4a4e933b4
MD5 e7f5bc8e97b1d515964896b32899167c
BLAKE2b-256 9a999314ce777aa7a20433c46fbb79da9e2fb30da939e5ff40cd621562545a12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5af80ff4ae25135cff51035d0270dc2284097c72b6ad48ed8dedd92406713be6
MD5 92907e193b151b7a782e12b933220cce
BLAKE2b-256 f9f871c9405a653a2b591ca71b43666a45143a4b1910d161b92cdd42dbc0afdf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ea3d96ea39cfb1e18fdf6f2a2870b318eb47136c70ead45eba82bee2b0caf98
MD5 f392b8cae314e5dcb3502a1636a5b3ae
BLAKE2b-256 f29dee611489bbb3ecd85bb8b0b4ccf4a166884e97573a875198cfc8d49d3e18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fed4d3d5ad9a7fb02b07ba0575f0db75a4eac9e03a3c31a0c6a8d1254f8bf066
MD5 b04b450229fbc38a81f284ce1ae87707
BLAKE2b-256 5ef463922e4a0d352c6d3d92874140a2bfb633b822b26301db601927cda3d942

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 664963050c920fade83374ca118c3ef1bbffb6d750787b1f04b0ea98d995c501
MD5 a916ad54da3752363595a48680c1a66f
BLAKE2b-256 722b26ce9175f56b529267f312fd27fb2d85630d66f5e27d9ffe6bcb71b0a172

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4303bbcbc8312b5492094e81afe64dc558c143a10fbfa6b92f9571ad5dc40af4
MD5 819e5589ac90a6df5d1306e7a8efd476
BLAKE2b-256 4d7aec6ce8f01e8b530132caddce3369fd7a2be065c97bebed0192c9e9c475b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 480f3fc1f8ec6957d91490dc14e8c973daa89defd5999ba2fc78d76d33be1414
MD5 75945441e61a7e79f3b02ededbf36bb1
BLAKE2b-256 2c4aefbf582bf1119b7a9273c39081642318e7f24103dba5bb8697268f9ec8a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 2ee5cb01e86ba2b986ea88139596aed95a8ddcaa675b01cf90bd390e6d405711
MD5 e86c70dec18da98b1b7d787537bc3f5a
BLAKE2b-256 f2c0a0be702e1621ff8be402e32305f543f5efade65a629aaffc58124acfa0f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 942f8f0e08c519dca1ab26f85622fbecdcb26ab905da962741a99c46db168a20
MD5 ea3e0d4ffe830b717bfb745a43f2de50
BLAKE2b-256 1176a8e2089a998de7b3b1bb3ead9474281259dd77c38b1ffdd578bb1cec7ab9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.25.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5d4bf864f52a53e96ff9b1a07960dcf7c5b28bbef492c528f924a100944cd78d
MD5 fa7c7e9807fdf770609f3a02048d598d
BLAKE2b-256 afc831f9463690805d5664df499f3aaa57e2b8300fe21f3de3a722b4b1359c0b

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