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.0.tar.gz (131.1 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.30.0-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.0-cp313-cp313-macosx_11_0_arm64.whl (441.8 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.30.0-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.0-cp312-cp312-win_amd64.whl (289.5 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.30.0-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.0-cp312-cp312-macosx_11_0_arm64.whl (441.9 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.30.0-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.0-cp311-cp311-win_amd64.whl (289.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.30.0-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.0-cp311-cp311-macosx_11_0_arm64.whl (442.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.30.0-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.0-cp310-cp310-win_amd64.whl (288.7 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.30.0-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.0-cp310-cp310-macosx_11_0_arm64.whl (441.2 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.30.0-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.0-cp39-cp39-win_amd64.whl (287.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.30.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (463.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.0-cp39-cp39-macosx_11_0_arm64.whl (441.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.30.0-cp39-cp39-macosx_10_9_x86_64.whl (490.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

crackle_codec-0.30.0-cp38-cp38-win_amd64.whl (288.4 kB view details)

Uploaded CPython 3.8 Windows x86-64

crackle_codec-0.30.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (462.9 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.0-cp38-cp38-macosx_11_0_arm64.whl (441.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.30.0-cp38-cp38-macosx_10_9_x86_64.whl (490.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

crackle_codec-0.30.0-cp37-cp37m-win_amd64.whl (289.4 kB view details)

Uploaded CPython 3.7m Windows x86-64

crackle_codec-0.30.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (471.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.0-cp37-cp37m-macosx_10_9_x86_64.whl (489.2 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

crackle_codec-0.30.0-cp36-cp36m-win_amd64.whl (289.2 kB view details)

Uploaded CPython 3.6m Windows x86-64

crackle_codec-0.30.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (466.6 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

crackle_codec-0.30.0-cp36-cp36m-macosx_10_9_x86_64.whl (488.1 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.30.0.tar.gz
  • Upload date:
  • Size: 131.1 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.0.tar.gz
Algorithm Hash digest
SHA256 ecfea298bb220ef5873d7b32e8e7fc4dada5ff97928d1a3f5588d97d7394cba3
MD5 ce227be202f493f76a0ed4bc22421ec8
BLAKE2b-256 f55cbf8cceccd4e7b7121c7adfbb6b138012cc064fdbe07b9f6ac0b597ef1b21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0494338dfaaacab620ace2c104581897863e224a6bba951d2c20b4795a016bc2
MD5 83b9c7b44f483017cf565a027c961128
BLAKE2b-256 463ae785898fcda0097d3ae1e402c7db69b2e50f558690b14c59999f352eb292

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 193f63ab897d5671f44629d09c8c36036c9694eca75c648a30e063dcb327b00b
MD5 64bd4ea0c2197c3f4f82c7d83aabef72
BLAKE2b-256 b87921865a71c4435cff6414df2c657b073b3b6189f790c0b73e7b882da449d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 31a1d90e7fad8524195b700ce394de3653d687eecbed2122c4ad468b298d2b11
MD5 2e3d18a0bac81237de9866139b6f1d6b
BLAKE2b-256 8978c5afce1670efca967e673e0f215e67809ca5399b8e40946f1940cfe4db16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fa045843f4436cc99b4def191a81fed416f5ba022d23f720a1052a6c77e0b0b1
MD5 bc22508a536b052042536d618c571213
BLAKE2b-256 822b5c4ace15f808ed99d63171c493033a18a0c23713b3460915a7abcd8b396d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2826d9cb8c1af4fd855e4607889d3d4b314cc63a82d1cf0c2cfe0ef248dd11ae
MD5 1bc7dd6f801d6a417fc79dd560c32f94
BLAKE2b-256 87244b11b0644710424e87bfb17d7283c6c5638eae5b742dd1555fd47a28e14a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 89d4bec573072866ea12fad478f49b4d53e28d8fa016de2ef9d842e3cdecb80d
MD5 c37d59a54b1e6d83cb1d9cc28c76014e
BLAKE2b-256 8b496dbc4d48c052c44309e5c33da5671f8da0cab5129d97b5523190f50d4114

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 95cf4a67ca1a3c80178839cca051c80c04e60b1e748c2431c1f21edecf17cb11
MD5 1b519ef5a211ae3b58861dc93d23f033
BLAKE2b-256 8774e1bb19b9605d90ede362ce6d87ee3ce2f86a4291442952e58c02728355a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8543aba961c52dd339f71ff5ae420dc1c894fc44d76e06b53ee476466bbd3fbe
MD5 bd07afed080ea10542d684a61f81228e
BLAKE2b-256 7aa67762e984ab2923c4049aa800a962982435eeaa442253a3bb5f9d7c4ce71e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b0a70ce73798951cebf3369f9662c351cf1c56cf5218b47fc8c1c9f58e8af50d
MD5 bf4c2fccf307d8da7487935db47a3e82
BLAKE2b-256 cb0af05b3a74f05983006bb716c5d0047b3cd14811fd71a001b693dbb4357463

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d6931c7ad820f6b63cc442ae9d6a0b2e163a327c2c3a01f4f936f2d3f5653858
MD5 1cfbfe84de77c9a1db080e0903b9c6de
BLAKE2b-256 693a45feb867f70f53a0c4c7877524e590489e1682cf5a2765ae31b1c750d61a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9c6d15e4a1f873f17f8e328f3329620ae53ab98acac1e8eadaa9a8cd4c698138
MD5 79a9848896c7d777643efe052ae0aa7e
BLAKE2b-256 d1005d64725d241a54c51df99a690dcbae9a32ed4dfe4224915e1dfc27aa7aa7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6ed3101a015e5cd3223fb46b9d0230ef87dc07b3b71a4cc664bf4eba3fc16df2
MD5 db9b21a4837be0ef9905e5d127d6e4fe
BLAKE2b-256 770c14276fbfb35b9c469339fccae5417cec194824863e837c54854f31043cdc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7749e79fee457954428ff18e195344582f61ecd3f9929d1910ff99fbdeba231e
MD5 4423cff112aea11662d100c38392c7be
BLAKE2b-256 6955ca11de7386f7ca3647d2b47a84000ee9e43bc9d3bdb774a19d7e0d532551

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d5c0a0df9dda687775425b11d480f634ecb5f676b6e3f8668e8b5408fede9a52
MD5 a3a503241044e17139c1d91a9ca55c0f
BLAKE2b-256 298ef853f6272eb0ef81db2bfcb3aae91c009ceb3559e50c0deb949c4daa81f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29ad18cf0543f0ad1a3a2accbf16e631f1a65c08def0a6ea5b3df17b89eba4b6
MD5 443281c953b2d84b3675bd1c7f0cbfac
BLAKE2b-256 e307d32d64eec41f8148e3a441d1a32d380100006b90de6145776bc9b57889a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 162c22ee25fcae75272aa68f0f4b4c4e8cc48ae5c0d454dcc9cb03f9a933054c
MD5 6d06cdd1af42189fbde654c8854dc912
BLAKE2b-256 37a9fd5c4a2f33b5351c959a09ee89adff1bd3e94627292cd2584b2272ebea42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 af1fafb34e44dbb44de7e09ee0a5272fc3f1272acf0e77ba63b8abf5de91a5e4
MD5 3ab5bb9d20219daff8d126a2f368f817
BLAKE2b-256 86851b34f2b3a3c0b92ff94644e4434733b0def5667e7a4c52b22803d0f818f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a3228137aac47e4c023662db35578551ce8b66099985d41e8d37d6bae1a865aa
MD5 cd692e40c8ea73646c960c695592ee6f
BLAKE2b-256 e4cd1a25e205ab3e747f29e551509fb8c71985cc950522370882be5ec8b3b32c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 666f1c2076bb05fa826728de4b9830b2befc79224fb2f857445422b0c1d007cc
MD5 60426001c530d603ec774feb2b46cb91
BLAKE2b-256 5da12655948432126dda7a54bf6667ad1087255186a9bb24fde5ba905f7b50b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8c5b24f604d73f1c33285ae644222913eb28bc9f2d789d577ae63956c7d19057
MD5 01f8ea0abd10fe6e8c7676b28d64cb98
BLAKE2b-256 0dd2548a82881391f4388c7546cdca40c25ae12e7a8a0839e69e387ab8974de2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 014385776af00b24fa348841b2a7657a4e4c1fb8a2a5db57f86af36ae4a7904d
MD5 3a8873284c56f357bcbbdc3aa02a8421
BLAKE2b-256 f3f1222dd2ea780f48b2e7ca131204ad096bf3b14aee93fa222032338c7b0b8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f6d9110de90e400530156e67892523c3f41fbd2e54a978dc4ff7fc397dffaa3
MD5 4882468f7002e7be0b7ea183e6ce8c74
BLAKE2b-256 fa30cadd149be5e5cd356dd8dc02329f2603f0b7f1479547de6c79aed3cda1fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acbd846abf63df2aa845f366c0bed89a19b03df4f2697ecde20adc996fac7c15
MD5 2be04b76a7a3b93b2384cb5f9500e08d
BLAKE2b-256 562668cbc8563c0509ad71cb7c2fa7e5f16e9545d97a6188d6b3e95160dc71ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ed53e2a73636f510afb31c9c808bfa36e85a9d46950b51aeff1b9f81b216df3f
MD5 d3d779fcbcb21b1cb8d2f255ba69fcde
BLAKE2b-256 590871e9ea4cf77c96d5565bf8ecbee35115fa4c2f65b843371e5c4b207be57e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ced356fab35ea1e980d9be77ab165a421614ca3aaf34637104f40f4de26dfbaf
MD5 75f837383de4197dde6a290f954ab630
BLAKE2b-256 83588add247ac5fdb76883a3daa683341fe3e7fa5ee762d8c97ed3822fdc94e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 11492b02c7656904f5bb49750bc5212862d278f3559432080b57ed067761d26e
MD5 c36566c2ed8426b9bd2463c460a02dc2
BLAKE2b-256 53d35847d3fb1efb00b994ee3fb11fefc1a0e280d7da1b4a90e754c500aac188

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 64eec1e3106659772555638f9251e6907865c732bda269e7a824edcffe2d9f47
MD5 12035bc217ea2a33ca4d420cabbb9aff
BLAKE2b-256 65234f6944e2a8ae6c7fe488a40780e2c925aceef1529d5be0c337e61cfbe877

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 9b6959407093e1f2803c22e446522aab569f1ddb9e95ae24c28e6e0f0aca26bf
MD5 0cfcaf075ce16637092cc4dfeb5eaccd
BLAKE2b-256 8aef093a37ea5edf9662051a648cf97fc04e60659fbfe1275cc8e89ec74eb7af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 449255f6ec521a1c525ccf49e14b5010d5210474560152a73627e52fc63b15d4
MD5 4d5bdd8494eee4872ce3f21652349f02
BLAKE2b-256 c1cfdd0e3962994229ebd160ebe18d22587d5afebafb54c6a5b4bff0e3a9249a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.30.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f6ae87bdd57bc9f43d5b414f0a7414e4d0c85d249ea49717c71fc6cdb916e174
MD5 8a0f6b79bc064b090da8214a82fbfe7e
BLAKE2b-256 4bf65f4a655bca8df4f6bca49b1d199738a1f2f8b6e316c55756b0a2ec7ce90d

See more details on using hashes here.

Supported by

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