Skip to main content

Crackle 3D dense segmentation compression codec.

Project description

PyPI version

Crackle: Next gen. 3D segmentation compression codec.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Uploaded Source

Built Distributions

crackle_codec-0.23.0-cp313-cp313-win_amd64.whl (262.6 kB view details)

Uploaded CPython 3.13 Windows x86-64

crackle_codec-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (413.3 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp313-cp313-macosx_11_0_arm64.whl (347.6 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl (416.1 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

crackle_codec-0.23.0-cp312-cp312-win_amd64.whl (262.6 kB view details)

Uploaded CPython 3.12 Windows x86-64

crackle_codec-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (412.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp312-cp312-macosx_11_0_arm64.whl (347.6 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp312-cp312-macosx_10_13_x86_64.whl (416.0 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

crackle_codec-0.23.0-cp311-cp311-win_amd64.whl (262.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

crackle_codec-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (412.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp311-cp311-macosx_11_0_arm64.whl (348.1 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl (415.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

crackle_codec-0.23.0-cp310-cp310-win_amd64.whl (261.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

crackle_codec-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (411.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp310-cp310-macosx_11_0_arm64.whl (346.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl (414.5 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

crackle_codec-0.23.0-cp39-cp39-win_amd64.whl (260.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

crackle_codec-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (411.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp39-cp39-macosx_11_0_arm64.whl (346.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl (414.6 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

crackle_codec-0.23.0-cp38-cp38-win_amd64.whl (261.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

crackle_codec-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (411.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

crackle_codec-0.23.0-cp38-cp38-macosx_11_0_arm64.whl (346.6 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

crackle_codec-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl (414.3 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

crackle_codec-0.23.0-cp37-cp37m-win_amd64.whl (262.5 kB view details)

Uploaded CPython 3.7m Windows x86-64

crackle_codec-0.23.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (416.3 kB view details)

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

crackle_codec-0.23.0-cp37-cp37m-macosx_10_9_x86_64.whl (413.9 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

crackle_codec-0.23.0-cp36-cp36m-win_amd64.whl (262.3 kB view details)

Uploaded CPython 3.6m Windows x86-64

crackle_codec-0.23.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (416.7 kB view details)

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

crackle_codec-0.23.0-cp36-cp36m-macosx_10_9_x86_64.whl (412.8 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.23.0.tar.gz
  • Upload date:
  • Size: 125.4 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.23.0.tar.gz
Algorithm Hash digest
SHA256 874226de7e1406e3b2d7d784f2f5bac610973c820bd7a00c29fb8066f5ba6001
MD5 8aa8ce364258ded18f64020ed2b08cf9
BLAKE2b-256 2ca7fabe844f117adcc0597277c7f1dc19c2a05c55d2ac758076a5bebf9045c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6427779d0a7dc6a1d3a4d49fd4dfeda36f940035cdfc7ba8d4d657c3a5481866
MD5 69beca21ae1356a562d1f7d09dcc4282
BLAKE2b-256 7be9f33eb668fca5dfd600dff2c4f90744860991c0a9e17758c8f2eb2ba3218d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b4ee29aa9a1fb01fc99ccd3e623f9b109b53cbb57d449ed4685be4bf265f1225
MD5 b1196871b2ddbe3cb95df963c7d9fe57
BLAKE2b-256 2fd3d381bb3757af705b7938d88a4f1530a58c2b7c460c196808df566a0458a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 61b526de8ad8ea7f6f86ad7f45a1960b5ca8687ea44f076bdab21ecd6ac2ba79
MD5 afb43501469de12dc7ff6828e3d552cb
BLAKE2b-256 fa3e851634b4a24e6c712e8de8de47bd4ee3d1293616e30f407759c083412a7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ea09fae6dbbd9f871073b8c16d12d4240f79acfc5d35a261fc90eef1ca15d794
MD5 e41fa93df6221d8da3af196db0037f2a
BLAKE2b-256 9c78613e476963655e8c077ec40724302c1a711884c104aa261fe320ef036e6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 25e735f92829a664afa7b97c424bb098afc986b6cc99715edb283229ba129dbc
MD5 943730dd13c47529e3687e35abfeb7a9
BLAKE2b-256 b772f29b6e4980f1ba92d86c55d6dde24a23309a4014c2e33665904ea2428b4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db6996f71e65ef118dc8f1d52af0f719e196f590400443943f01d1fb64b01cd2
MD5 84ad18df6241bbabd2c3d5e3a9f40d22
BLAKE2b-256 2d3b8f1650859da1a44aa7e353f5b42de90156bcad09f4fd09ce6b9db5209f02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 60e85cd78378efce4970c5c9abcb1e14bf7111bc877dc78425b4d3d402b7dbd8
MD5 f3fb3f0e278cc31f38bd6b374c626afb
BLAKE2b-256 57af4dfaea8393a9a2531a6d0de4fa0e4849b0abd98759061ebf6333d330f037

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0cdea4226e3f7bebd5d7db44ba089ba3350ef4b309fe595d626c10eaabca46c6
MD5 8bf1dfa0d1354e023cddee490eda76b2
BLAKE2b-256 147427053f2658cd531ef263a03d4b86d7ec2c15300d487f0841d2872d221745

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 37819febe854ccab65a7756f58802f956a7e9cc22fd2f4920251c20f9ae37ea2
MD5 e7b1ecb48acca82d8d9f099c5c4011ab
BLAKE2b-256 c1a3ef800f56ccbe9696cd2e8e6f4e82936e3e5f93d32f0e5be2a36d65fc258c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 13add8505945eac08cdf85db829dedcd027e11f0b521c9e631953a3546034c2b
MD5 1d6d5c2d5985ab42cb465311ca4314a2
BLAKE2b-256 f45913e0dca636861e93cf37bea2649056955f400ad158b03ef24f4003e5397d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e6a7b85e62f64c29eb864282a43f781447d1f0eaa306666f814a558a57bcb8f
MD5 ec87018ea317d114ee6504358d883c6a
BLAKE2b-256 a9aaea18cf4a1b6354325a2548b22ae0e1648cd3a69d44f00b4f4a969d7f1f3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 568dbdc1b2c2dc20f3f4a2530b1953831ecc9fdd7f1f2b713e4575b0cca6e2fc
MD5 bce770e8c21202543aaeee2cf07a83c8
BLAKE2b-256 f083a1cfdf29a1677b4151cfb44efb1803a933e99b0a18e3eeeba6a118a8192e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 48ba5cd5f3444e2ee5e837c7d3c4a1a62d43b92d4349b753b31407d5fd834b43
MD5 d76f86eb55252407da96362f5e9446ed
BLAKE2b-256 3341c5320937aaea8ed262d53dc0e473b152f4af877381744a36067363cffb63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a8e40b49d689e0c75c00aa6ed206e1e40a4f550d1cab1d3628d5a5aeba15c153
MD5 b43e4c4f9cb37dfa57c97f32d6ed19d5
BLAKE2b-256 30b9ef44ea14375b5d742a0eb259abb5e627e14305a4e081f01b052a5d988cfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85a5ce70e3a239e618f25ee09425fff2db7cb4076fcb4b835d495912ed74b194
MD5 6104b07d2a8a8463ff1b0e42229febbe
BLAKE2b-256 15b3a62510b8b41285e5cd779aa5c26c83d8cc62e0db797e6a5abb27b40cd212

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6010d3a7f153eb5242418d7b25685f871e56063e1e9ec0f020a0a212f7fa7c45
MD5 fce1007fe109d7dd48999a506a984ed2
BLAKE2b-256 16460554803f662216e1ef4d576b67c08d16915379a9c5cbb673a1cac77013dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 499603e0bea35308c8bf6c841cfcc0899790f2b49fc9d3bd4cd39afcc738808c
MD5 e4f3424b7f5cee9f65dab5d960fbb121
BLAKE2b-256 c29e4ca606287c39e574fa0695c929d5c4a4e558f968ae839844dc8bbd0d214f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b74ad8b2abc0a4742697855e540f328a2d328fd60901b775fcc8dd0cb45c180
MD5 85c9d8f5f6ad5c2780369f689e40e4e6
BLAKE2b-256 e5230cab98e80d8c0210f7168f5de0bea38fdd521c3ede381cfaf5ef7d4f2bd1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64c781e7d19b7b42f231cc7c7c59e6e79e062f029438d0c453b886aaa4b5070c
MD5 2465b3f63729fbe863098cddb181a4a1
BLAKE2b-256 98e31fd8f428c9fc4491605b01d4b57694d9330ebf073f398ea3dbcd7d8e325e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 71795f2d02ed90391c34d53fdce79d1fbe960317ab4c06bbe6fb4799d9d7ff5e
MD5 0788a79326ff7e3a005703da49228dbc
BLAKE2b-256 1bf9d999d12f94bb3e63493deac13b8c4ba29ee4da7d7d00baf284eeb4b97f55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 f1d6e245625d26e29b228361f13e9bdffe45b2e738ed5d59ee2751eb8b093632
MD5 2e96ade97faf61b22cd7bf8278609491
BLAKE2b-256 fbda4a2e4d9af8f1673e78e60922e4208c099eaa0da6807196927c4c6f7f7699

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 33bd1de4c567c2b2e366b07b1a8c03568c7d1fc403f6e75750a203ffb6790c07
MD5 133e73acf8c3316960881def9fda738f
BLAKE2b-256 a61db27f534812451022ee7a736c90c62062432abcb2b502dc3bf35bf90d5b5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc40bf2ecc09784a1a5c9ecec16185f10106f7d8423cfb869a552c3838016459
MD5 a17770dcfa1ebe50a81ff039ecd992a0
BLAKE2b-256 3d808c71e6037aeba3e5c542ca361b7638166e93a0a32fd97f6c68e228368cbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d1f41085bea0a744ac1f1204216fe9d7e27c3289caafcb471ba011ea543c8cc2
MD5 67a2d25a22a261a403e6df7b4f45ef6e
BLAKE2b-256 d24d7c76291e6287d0ece59f5f704de1f0f69af452d9ff3b6da5760539af0a4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 e5cdd2ac7b82035299e79fbba7faa3457d55b2bd51ed752730314bace928ebb8
MD5 e14316761f99ff7a41633041a3b7f1c1
BLAKE2b-256 cef6fc056275fad9efb9559b101f164e145f2455ca5fd191cf13c8978f3d3ab6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 071b5efddc8017f9af207a7b4af8aad475968396c263a4c0d42ce29e432b2e6b
MD5 d8cef20967828e17a62281400b442c9e
BLAKE2b-256 cbfa16175d71ce1fe36d2643538ed9ad8ae88a1d4b0c0da8568025266ac2b84b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a6b1e7d4e9231e23f856973bc682f9eb9df9b8cceda9c253f9d66e98411462b7
MD5 150cdbf9a5a7ced5796850c098ac7428
BLAKE2b-256 42219804be176b8c10ebd8788ab318c7aca7188f66c9f2118fccd4db5f7a9003

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 cc164be82dfaeaa34809e61e5c0f47de542b638e4afb02ec56e722bc1d58c288
MD5 80d4681ec41ab1cd04ebe23c5e324fe0
BLAKE2b-256 b79384c569d8982fb62f004d9592c502aab488cb221beb9a7817e61fcc60dedf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b1c490f99150def9eb7652950f8be4145f3f419c9da6a68a72d2c612e619ff2b
MD5 72cafc7ae4e5c85fd12f2e4656be763b
BLAKE2b-256 0ad196916952136f5570af945fcc8a518b26190058501bd716f3888d5b2cd95c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.23.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3bc2876e8c6b2cb1b9fa65fba420a100ba927f844fcdedbaf4a85b724c5eb1ca
MD5 fe91524da8c7f63f5fb48a906d36efc6
BLAKE2b-256 95fb69471ea020deb257c88426ca31b05619eddce95662a0a94c725e9c0a11d5

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