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

Uploaded Source

Built Distributions

crackle_codec-0.29.1-cp313-cp313-win_amd64.whl (286.9 kB view details)

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.29.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.6 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp313-cp313-macosx_11_0_arm64.whl (434.7 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp313-cp313-macosx_10_13_x86_64.whl (483.7 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

crackle_codec-0.29.1-cp312-cp312-win_amd64.whl (286.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.29.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (461.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp312-cp312-macosx_11_0_arm64.whl (434.8 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp312-cp312-macosx_10_13_x86_64.whl (483.7 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.29.1-cp311-cp311-win_amd64.whl (286.7 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.29.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp311-cp311-macosx_11_0_arm64.whl (435.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp311-cp311-macosx_10_9_x86_64.whl (483.0 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

crackle_codec-0.29.1-cp310-cp310-win_amd64.whl (286.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.29.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp310-cp310-macosx_11_0_arm64.whl (434.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp310-cp310-macosx_10_9_x86_64.whl (481.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.29.1-cp39-cp39-win_amd64.whl (285.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.29.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (460.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp39-cp39-macosx_11_0_arm64.whl (434.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp39-cp39-macosx_10_9_x86_64.whl (481.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

crackle_codec-0.29.1-cp38-cp38-win_amd64.whl (285.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

crackle_codec-0.29.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

crackle_codec-0.29.1-cp38-cp38-macosx_11_0_arm64.whl (434.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.29.1-cp38-cp38-macosx_10_9_x86_64.whl (481.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

crackle_codec-0.29.1-cp37-cp37m-win_amd64.whl (286.7 kB view details)

Uploaded CPython 3.7m Windows x86-64

crackle_codec-0.29.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (471.7 kB view details)

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

crackle_codec-0.29.1-cp37-cp37m-macosx_10_9_x86_64.whl (480.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

crackle_codec-0.29.1-cp36-cp36m-win_amd64.whl (286.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

crackle_codec-0.29.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (462.6 kB view details)

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

crackle_codec-0.29.1-cp36-cp36m-macosx_10_9_x86_64.whl (479.0 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.29.1.tar.gz
  • Upload date:
  • Size: 135.4 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.29.1.tar.gz
Algorithm Hash digest
SHA256 d326d7accb3e723600c2438aca918842b31476e6f483dfa3fd57007f0134ae40
MD5 a3ca257f438fc5674b80007ae490b2a7
BLAKE2b-256 eebf0bdd67dd97adb73a832f72da1c3db544ef77eea7d73b24dbed18291811b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 edc8651a6810ea4a2b69814e1e7a0bba021c9c8ed7aa7f0cc1d1a19d3c9aced0
MD5 9397039132f0d2a8f530dcd3283e66d5
BLAKE2b-256 976d6310a6790b60a8bae78fb125788faad7f0086801369f32a39b13c315cc13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9b6de6192b2997f1caecbd9fa7022d623540153e05da6d7c8bc7eb01d8c9dcc
MD5 9bcb0f7eb2afbb99fe68da336b27cd12
BLAKE2b-256 6329f59fd580c50dad76ed722a6e313e7b5533b70a409d0c0e2104da0d9ded01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dfeaf398ce1915439c18bfd545ef66ca7b3f0de5db3a1660f19ca796a1cdd78e
MD5 67c3367e47cb73ca3724353ae8f76e71
BLAKE2b-256 8a3ec94345db7b283b5326f140cc84593279a9b7e2e82938209f595cd8d747f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 66c75fe84c899e371f2228162e9c06742e337dbc9638bceb4625f4f85ec5a340
MD5 e4ebe9ed8b0f1a3d08ca83a1fa6bc499
BLAKE2b-256 125680723448b95f631926bf9259306ac6012f6110dd45eb5d6d7a1c9f8eb6ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 79c2016b7aace45d30ae6dead7ccca0cd8ae9e4f4c062266a457be8795ccf044
MD5 b843101a5bf8356251361d8f16ee2610
BLAKE2b-256 458f10e1b027f1f70fa4e49113409ee1fcda89fa75a8468c3ab4ccd47e1d138b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ab36e455224459970e9227f3fa574669632e00822bbebc6ff9f4b7f25fd7fe3
MD5 72df59c65fa4e2f0606d5698cd85d3c8
BLAKE2b-256 12112eb78da9f781fe8d6b6e8b937a9d117bbea2cbe3a4c2b371339ba0391068

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff1fa852ea25b2bea1965a9d6a0d98ddb00f6d305b8ed7b66fbe019636a9b4a0
MD5 0412ecb2a25797e543fe1aee63b7e468
BLAKE2b-256 c007cb5170edb984bcc1f6a2785d54d9b572596693a96eb0c581450404cd297f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fb309f815a361f47eb5ccece81df04bb05273f5e6fd3ece230dba67958f1cacc
MD5 07a552d89d8dc0910b4bfc7aa63acd5b
BLAKE2b-256 49e2f114133f86f9d3c11aa639ed329eea05066bdd727dabb905289751bde3b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9cb2817c03d3ce19bfa90b7894ac68037843bd151dfdc96614d92d2114c3497e
MD5 f000cba40f859be37f65443ce87ce855
BLAKE2b-256 3b780ca13894a254743ec975ec403f45c3eede2ca19bb3e047ba6bb5b771cb46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8bee9d50d2fe39d8ffa198fe7289715bc5d2ede21f525db58e8b01b0ae763ff6
MD5 40e7a39d4109f112e87baaeaf36833a7
BLAKE2b-256 9bc67952883028fac238c5c70c0750d83cec8821d16eaf82b08610b5fa547039

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9921efd5b9225505fc1e4b3230eba473da14f4c7d5d78f1b95758dc3bdb20a84
MD5 4428572ec40378a2bd121f784cfe5e86
BLAKE2b-256 5f14c42bacae4b82e7332ca12f391d368d774dcd50c1b6de0a2242a995097d01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f093bfc176c8ca51b77e9e15cc66b691eb9369e5e6499a19add11047ab6e6c5d
MD5 b1c3ff4be6ca8ec525d2df38216c7a3a
BLAKE2b-256 b182e34c7459187166c1f91beb174538359cdf7008d3cce9fcba62740cdbee25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7d3a8fa5cd4f0efcee9390985a46241afeb582f8d8c673ec4166bcd9b0100d47
MD5 9960edf15a83424df7426c59baed1256
BLAKE2b-256 e3e9ee9867224fa328ee7428e29c1804c666dd5354a764a33aa322b4b67b13e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9daeb6e87ac1f56ed1292ea55dd11d6bc0e6f2443457e8b352656c51170b56f8
MD5 c89299537622e9ff23ff4a8bba6902a5
BLAKE2b-256 861fd5b28401429159e144141c9ef0ffd59ebde0ee191a078833fc763913887c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 efa29c65f9d1e99e78e26811ccd7bc60c42917be496a6b2692303ca44830bcd2
MD5 498c257d49602c36f695e24e12421055
BLAKE2b-256 37a3b99422c93501bd79edd3517fdf95f782a249070bb9837bebe2510a6b3ee5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4c0e4eeb23a0db01a3a257b7afa650fa808a474734007d2c053ce758e18718f8
MD5 fb469f88aace3069267aa27359bf329d
BLAKE2b-256 0c912f62acfd6c9862a260678e71a4a90f635461acd28f3fa629cb6e92232402

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8e8c4cf6ee499fa793ed082655b5f4578b01f0a7c3312d287e7624df77884594
MD5 2740a51bc3c2e4a07d7d9c9d5b099270
BLAKE2b-256 401a94d6a29c1739b3dd89d5e2435db225605d01f818ac7671ecc3470ca0f23d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b0147064d044f48bc9f0a6cd07a827f1ca3eae8830e94fce93a5c59fb6560d06
MD5 de044c64548f8e3da23b975f4f7e4214
BLAKE2b-256 31d5dfe308990d1ab0de8c968a91cd20cd2f7d4041d4c391b5d65ebf97a5c3b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 91dada6b4eb73b08b78a65837858d572e84fdfe987e99bca4daeb5ad196b8395
MD5 c861ae48ed6083c3358c22dcbcf75359
BLAKE2b-256 db6d10fb7922c0445b23b95ba371e32b76b7bd78e9ebd6ef11a8132c0c7f0382

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f0822d70df8741b72ffcbc0edd4e3a0158742fccd25e38e49745899e06192f64
MD5 29ca64513b0c90b430f0d4e5aba2435c
BLAKE2b-256 32cd15bb605477577a83ef5342afd00b67336cce9cc67bc658c39e68be68c182

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 92b84acc10fada830172adf0ae4e7215adb7baba1d3723dad528f1d2fe617146
MD5 323e6baec87b689178dbaac6177dc938
BLAKE2b-256 7f6d24e82d874de94a29cd3508ba8ebc375657f276640454dfe44aef9c687ef0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6839aa66701a0972886f108889a27e2716dcfca06f43acb3f6d3b7e9314f9cb
MD5 17063c0bc4f45dc55bade9b60006deba
BLAKE2b-256 274ceafa596516af59d628ccbebdcc160e4858c5c6237187b805b54e30b8f607

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f7f7e11cd227fa0e754286696b28015e3da42950f33428a96c18b24be86ac9d
MD5 3ba04f1d0d81ec4fe5d01364a52e6bbe
BLAKE2b-256 e41c0d7ce697f6bb449a861d5d6e81dcbccaf149aca0f11222e2c3ef08b8e857

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5fdba83f6e0ebd3fb93564910c921023582894d7cbf81959597700b175209b7a
MD5 0b34f853e2cb5167c054128a442ae4d7
BLAKE2b-256 cfb9a727d3e9c8884c712fbf53cad902af2c955a4b7552c14f356affda0b52e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 4582e6363928fa48205c04e713f855031b275ee989ffb95216b0332ec589fc0d
MD5 723fd102c1ef902775ffb21162976610
BLAKE2b-256 8f46861b7d5a2c9d79472b87b528f23750eea53f90f7e4f6bebea9c2a30d390f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ecb0023daa4c30bc274fb10d5bc610c749c567dc0b0a7305d0ea1278fe7209f8
MD5 7954d805f2a5a2db9c3946e57af7b68a
BLAKE2b-256 86722da3f516707f5e054e68575ff4460e30672a706ac2aef9d593225c1aacac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d614caf873a65012c4a37e4fa077801fce99c68b5760dc6a9ce6c7bd811aeecd
MD5 ec8e45888243a158416655e087265467
BLAKE2b-256 c03759c6e8960fb6b8526f0c1940643ed6fc0d9fdd4552209d8c669d580e63c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 75115b446ede806e4de3c8edc8132b2580bb2318e560e1e0d907c0e0b952f94c
MD5 59453a98f3ef462721506d366cce61f4
BLAKE2b-256 1e9db7ddd410d89104155d03a2565e638e1239edd625e0287e2c18d1efb2d087

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df65683b70cdd8f6683e6321023524a0fd0de28e89d8070bbc7d778933d8e079
MD5 979cd2e32c367b4762edc8ad9619656f
BLAKE2b-256 c5154dfa5b0ea82e869e9562eacd29aaf45b256ea091192d29167223ef262395

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.29.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5426561c31196ce159cda8e6d34796f53d5f7fc4fc4e1716a6ad9cb3c75f768f
MD5 963496a65d63eaa093829aba11bc4a7d
BLAKE2b-256 8718bf8758265f0b3e7ddb1e2fe16946ca9486c71414495390a46d5e5ac27d83

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