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)

# 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.30.1.tar.gz (138.6 kB view details)

Uploaded Source

Built Distributions

crackle_codec-0.30.1-cp313-cp313-win_amd64.whl (289.5 kB view details)

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.30.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (464.9 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (451.4 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

crackle_codec-0.30.1-cp313-cp313-macosx_11_0_arm64.whl (441.8 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.30.1-cp313-cp313-macosx_10_13_x86_64.whl (492.1 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

crackle_codec-0.30.1-cp312-cp312-win_amd64.whl (289.5 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.30.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (464.6 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (451.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

crackle_codec-0.30.1-cp312-cp312-macosx_11_0_arm64.whl (441.9 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.30.1-cp312-cp312-macosx_10_13_x86_64.whl (492.1 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.30.1-cp311-cp311-win_amd64.whl (289.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.30.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (463.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (452.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

crackle_codec-0.30.1-cp311-cp311-macosx_11_0_arm64.whl (442.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.30.1-cp311-cp311-macosx_10_9_x86_64.whl (491.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

crackle_codec-0.30.1-cp310-cp310-win_amd64.whl (288.7 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.30.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (463.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (450.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

crackle_codec-0.30.1-cp310-cp310-macosx_11_0_arm64.whl (441.2 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.30.1-cp310-cp310-macosx_10_9_x86_64.whl (490.3 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.30.1-cp39-cp39-win_amd64.whl (287.1 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.30.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (462.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (450.4 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

crackle_codec-0.30.1-cp39-cp39-macosx_11_0_arm64.whl (441.3 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.30.1-cp39-cp39-macosx_10_9_x86_64.whl (490.2 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.30.1.tar.gz
Algorithm Hash digest
SHA256 39193d149249da7c3dd20bf3c5f3b2e4d0b87320346eabbc27017cd6ed1b5f07
MD5 fc87ed6cba15de37a78add087575673f
BLAKE2b-256 31ff2927ddd5a5816a8d5526db208f1e1ad5d8a00f7b6b54b00f3a149aec145d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 684a440160f0de2e6830776487f6ffbc5dd7ca7bb0aa4c3aef8da974a0af947a
MD5 4682a39fbc06aae00d9012f23bbc1518
BLAKE2b-256 d618bdae1b17dff5d5f327ef0ff89ec17e9aeb286304ff46670294dffd463905

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb1ec24e1a3df0f95eb7e1c38f0274d3d18c4f3c233aea3ce898c8fa99cd7781
MD5 ac9adb4261cccaafe5850ce5c7835808
BLAKE2b-256 cb0db585198be401512e59e3af38658a2e0a43af91ccae2e55f516424d8c5107

See more details on using hashes here.

File details

Details for the file crackle_codec-0.30.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 932c7c7b73cbaab2e35a83f2aab9b6cd0722145fec694dc8d17df32afa42bf82
MD5 64235b1c6ea79eb01328e895e5858a29
BLAKE2b-256 4a45e8553e9ab1cbe333b44dde5432bb96f17cd736a3867c949b592172f96b31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2e839cccb9e3abe0cc57e86d03351785d0ea9d3c49dbe2115a178ea71f0002df
MD5 04a8b7be68087519f863d66efae6d0df
BLAKE2b-256 d7026494ed2d331339a8873227828d52ced167ba6b46318bc1ba2790ba25ef93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3c9fec5574152cbf0e62ded7c75434b55b907ae442d3cdc65e94f692d7052ec1
MD5 e780cd2533c1e56b0efacc072da2b81a
BLAKE2b-256 2fbdb90a5b1433f9811d51a26b05614b6531a7f9d8de868a808cfee426adfbe6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7ba5d62e2a38ee76aafccbaac4f83bd2771a31bd5ea7b0a6d3f36710fcf66ed0
MD5 8feac93255a2c89d7f63dbefa811aa81
BLAKE2b-256 75d8d16443be5fffae05f83fb18359685c9ef97d558832a44d1033363a591579

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3108fc35fc9049380d541626edb66e3a522da8855a12f8fd2dd2d9186de7bf2c
MD5 fb0c973d324e1704ed9c0adba50f2fdf
BLAKE2b-256 57487c228a0c209fdd5578ceed54a0f91e585b140fae55922432cb9048cb918c

See more details on using hashes here.

File details

Details for the file crackle_codec-0.30.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a9da33367d833b8d4bb8120422f2eca8ed212ff947cc799f352def51a122e281
MD5 41b2cc67de51755f6f00214b9c71f2d2
BLAKE2b-256 f2401b10b42cb78ed6aed79e7c02686f6666771fb60466ebdc819e313bf00815

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3643a8b46d9d22e801f866233001291e417a8d795ea79b70f57c54e88f064860
MD5 6f2e2e56da643768e36a6fd02bbcd6e8
BLAKE2b-256 a8611536c9da11c9a6495b679601e8de04aad48417825645e0015dc83479b4cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 794ad00a2a82245d2620793c20623fade4c9aef870cafa804f2270738d371e2f
MD5 4d29fefed3d42aa39cec76359604414d
BLAKE2b-256 1e2ea872b9ed7bbc76fdf6ae6a36ec36807d4dd77204b7d637bc7dda254dc670

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3c469f808d306e154ca9a08dfdc97fab00f830e5e8c0f73b73a70e0f1d71ec5c
MD5 e009750602af7b5272feb165d24e9dd2
BLAKE2b-256 0a4310b213625d72551e1e93302ee145b5467a6fc7ef6d64fe14a650810ebacf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8b13191cf6cc63c7e1c7429c75e870d10ecc30004c1a5c099af6f750fb9a11df
MD5 63c01d09fca643a9db5d6b5c35d2c948
BLAKE2b-256 4a64c1f6b75377015e68ce0ef527cd5c4bfe6c598a726bbea5297677482d6fa4

See more details on using hashes here.

File details

Details for the file crackle_codec-0.30.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 53ec6fb74d2eca9d350c5f8ea7ec44e341e98a25fa5c77045640c9f668316c43
MD5 985769f6672fe2a4e0283cc1096b25d1
BLAKE2b-256 a3d376720fd2c0a36d8102b3d70912461ea3103d61dc08e02a04de69fd71bbec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4cf6fc5326695f7e4864d320fc13073961f593ebd1fba0f8ec1e6a4845c3777c
MD5 c406d92c01249abf508065e59e61e038
BLAKE2b-256 c02e3049490b99ff58c314e9fc3152e2513c009b4fcd0c595b66a833eb1e9c0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8fe4ec7dfcf6139ca1a6553d42ff04ed38e9c3bc2267197fbe9204dfdee5baf6
MD5 99e3fa37d296208b9781ded84eab68f8
BLAKE2b-256 9e731953ff9246d82f50175b36f1f5fe016bccdb8bd78b6a4361802b6c8c89a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ae87bc95f3c1832d62183d6e94b6a6f4a35aed054b7c4dfa403382cc0590c5b8
MD5 b2eb431c0cdcbc9edb5618a5082dd352
BLAKE2b-256 c32ab20272202ae3f9e0acf256f68adfa6384cba188393e39b4d886ae4421cf6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04bfc0409819afa76f46a3941b8474cafe0f8da705ddaf90bc41624d3ec2d537
MD5 4802a7ec4b50859e2bdf425487476e8f
BLAKE2b-256 b21cf3d02ba8063312751f85427f8f448706774f4212e359a28c41367cb4c4e2

See more details on using hashes here.

File details

Details for the file crackle_codec-0.30.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e059fc1ab8727d635336b2016ba721d17883616c4ef04b774225d4525658d111
MD5 cf9daac51d098c520335a3b10a185669
BLAKE2b-256 d3ada45179cb0603d0bd408e1868744df99aa4809919403ee3c0f380abf2b9ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 598954cc1d327d269e07d0469fb2ef1d2e757a14905803bfdd4b1ca0800963cb
MD5 55bde9d86f939b38f00425a0678c202a
BLAKE2b-256 6f3b58b98de106d6329996dfc4d4ffae6ffbbab402be3509543759fbe9647b91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ac215b717337c1da1bf3562e0b6a32200ba635a6029b2e7c4df5f0b682f50cbe
MD5 d9a6f0064f072ebda2c7f265a21b9b5d
BLAKE2b-256 7ec59c763e71db37b74b04c23a1185bbd126ab5cc704bf92db234195f303cac3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5c111c279d5a123bde376bb2a090479cb0eeea39fbe8ffe89ad0dc92962d628d
MD5 5f356fcc85f2d7a7050573f812d4f6b0
BLAKE2b-256 5f0cb9090168ae94c022c30b663463c4104b1f1d3dc7d6d640d5f2962cc79f8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a81d8917ad33021326a520ac326fd8aad8f0fe7e773b8746a405371dbd95562a
MD5 24c6ee45ec6d33f9e123f9c56e4fccae
BLAKE2b-256 e7394d5a4e3c13e5e7b4944fd0d9d7ce1c60ed6797c4767f0f1674c0723c5e5d

See more details on using hashes here.

File details

Details for the file crackle_codec-0.30.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2c14bddb22d4f6a4a9573ed1d43f89853207179be359033a8611eabc6c35b64b
MD5 e9dae6c5d5c078dfbaf3477dc680a7a1
BLAKE2b-256 e7f3681b97350ec986a290a940e8bd9dff32978ff8227e2bb12a56661092f01b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4b48b23ddb11de84bcc1e8d55d164530f1315656539558cf68736d8042bca6eb
MD5 3d78409812f06b136c410ec4f0ee67da
BLAKE2b-256 f05c6e11e751ece321a9ac00c0f76a2499dffaf969c4ffe5ecd902521fb5bd1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c6fcd4c583ebfe2d475b216be2c687aec099183320f56de260836d596b17e39c
MD5 726068ab940c42ce36875cca637ccd7a
BLAKE2b-256 67a1690871dc3148df8c51eba044bcfb9a42d3164d0755efef74049cf5ca57f6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page