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)

# iterate over all binary images rapidly. crop
# close crops to the ROI and makes iteration a bit faster
for label, binimg in crackle.each(binary, crop=True):
  pass

# iterate over 255 labels at a time. Useful if your downstream
# processing supports multilabel images but you need an 8x reduction
# in memory usage compared to a uint64 image. Much faster than binary
# image iteration. img is reused for 255 iterations before being replaced.
for label, tmp_label, img in crackle.each(binary, multi=True):
  pass

# 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)
bbxes = crackle.bounding_boxes(binary)

# low memory CCL, the more memory you provide, the faster it goes
ccl_binary = crackle.connected_components(
  binary, 
  connectivity=26, # 6 (faces) & 26 (faces,edges,corners) supported
  memory_target=int(1e9), # bytes
  progress=True,
  return_mapping = False, # can also return { cc label: original label }
)

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

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

crackle_codec-0.36.0-cp313-cp313-win_amd64.whl (311.9 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.36.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (478.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.36.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (456.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.36.0-cp313-cp313-macosx_11_0_arm64.whl (432.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.36.0-cp313-cp313-macosx_10_13_x86_64.whl (494.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.36.0-cp312-cp312-win_amd64.whl (311.9 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.36.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (476.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.36.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (460.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.36.0-cp312-cp312-macosx_11_0_arm64.whl (432.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.36.0-cp312-cp312-macosx_10_13_x86_64.whl (494.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.36.0-cp311-cp311-win_amd64.whl (312.1 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.36.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (474.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.36.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (458.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.36.0-cp311-cp311-macosx_11_0_arm64.whl (431.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.36.0-cp311-cp311-macosx_10_9_x86_64.whl (492.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.36.0-cp310-cp310-win_amd64.whl (311.0 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.36.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (473.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.36.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (457.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.36.0-cp310-cp310-macosx_11_0_arm64.whl (430.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.36.0-cp310-cp310-macosx_10_9_x86_64.whl (490.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.36.0-cp39-cp39-win_amd64.whl (312.9 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.36.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (472.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.36.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (456.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.36.0-cp39-cp39-macosx_11_0_arm64.whl (430.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for crackle_codec-0.36.0.tar.gz
Algorithm Hash digest
SHA256 d6e619853dd6debceecbbd252515da00fddb08c588fa64abacbf5950d34785d2
MD5 111b63c569b196a6ba870fcc4078c110
BLAKE2b-256 a0a53eb3f748f2a9e80911511af967b8e69721288b56096af50982eea5e5476d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a8fbb93863db66802b25f8b5cdb36272ed2ca5367b0e441427917b3c0a87920a
MD5 e69c1e6d8ed7d5928c699642ad2e9fb5
BLAKE2b-256 e4daf88dba806e5900e95b3bfe9b2142615f8839313def09f67928f59449c4c8

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 31452901664e7fd2b603fd563f83ba2396f9672e1a12724a67bdf93c591dbe26
MD5 86ad5fba584fbfe416afaeb221a78a15
BLAKE2b-256 1671b52f0c6bda40195b15ad13fdf907039be7366e2e1a0bb9da4344e9d15503

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 21964f2c66f3e3120dda1e139c6406da25105202a4289b1dbbb52491b54a08b2
MD5 b2cb05145fd6c8b306a83926654b1d9a
BLAKE2b-256 45b689f07c8d85b46d3a448b8dac93d9ee5200eb7db6477f7b5c98c252605fde

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 563bc055d414bc2c9d5840434161b3ee43a478238fefee8bef4266c924d2d393
MD5 127c0e97c0635b2454a29a0f127073ce
BLAKE2b-256 ca26b44bc2af8a1319da490cc535f9222a68620d107eb89fbad79a64ad505462

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 12f24dceded78900a076eae7517293ae9f8bdc7cb1f72286c77a38fa9902aae2
MD5 91de3402b086ebf8a1764ec6ebba08d0
BLAKE2b-256 cc2dc9629d4b06e78d0f5f8af5307391ed2d1115d97f37ef52776fdb08b2401a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6403504daa5ec116e54422ae650caecf40f67184be569a905a886298a131dece
MD5 312578707cc6f7a83e38275746cb4187
BLAKE2b-256 c5ef9e19697d0fcd841d1f283981222887d6f6a89e3620e5b6b776c87a1dd20a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c220b33946ecbaa120f95599c01ec7a23ea2480128484e30d6e09268ba2238d4
MD5 5ca231d688d1c7e1fe9099c04fa2c406
BLAKE2b-256 8f88e72d0b0ed560a9f1800de01bc2e529f25638081dfa4bc79c947afd82c188

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 252a5048accdbd980a95c22bf2de1ef04432f8a5dc61322cb54b2dc13f904ac6
MD5 0890057504a83dfb3c3a79189cb2ad89
BLAKE2b-256 ae042e905a92fb34e7257cf9332fa3d5f6f5e1b49faf3a97111d36d15eaeaf13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f4c1b5d60bed90a0506f439d78f0170f009e794a8c39c17891eb9af62daf0449
MD5 4d2e265d20e22823cb5c1521107faadf
BLAKE2b-256 9fe7df81b0447ecad6f93db837ed0d172239027ca2fa3e850f6c0d95147a463a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fe4bc89606234784b7e98d96fd6992f2f6dcc39b823acf6f21b1fef618c9eddf
MD5 7ced0e651f3ff9e462edd9cf4e40115d
BLAKE2b-256 0ba5e32588c3f6b122cbfe668044601621f5adf06ad85a1b7c27c9ec3ca0cfab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 aa99fbce3754dad6c081b8f522baf527bbc4811f437da4f0d2aa2f50a7d02b85
MD5 821936f48dd5be25210da4d4b6d801eb
BLAKE2b-256 ad96c24bc14609103b1bc22ca1031e5ba8edfbeb8e1b8464fe113332c124863f

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8594a9b111eb2f2ab0fb99b657af2ce8d753b85844f085785e7a28aa23e8a2f0
MD5 f597b5e3b259c5116514052c0ff37bcc
BLAKE2b-256 b37092a9ce9a17536a411b3397e881ce90a3efff918515fcc47db6eb6709dbe9

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b34e6fed19085f421dacd3533083e35965622dfa166b8a96ba4a82a2a67fd264
MD5 e109690196fa778148545e4976320b5c
BLAKE2b-256 a8ff0381a71f5c00fda001bab35bc6b48e91c86a389545cbeb5cf3fc38b0a8f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c5423887f92613d18a103560d1ef883c2a2db6ef9d5c3c95e979b12bd70bb82
MD5 7a38d21a283b082b4873968fbf76d8c2
BLAKE2b-256 70dbf979460d39527f598d463267281eded150631f62365f3cc946b860cd27cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0b40719622e37501eb1c2c496a3d134a5f00fe663029cad42eb6a826ec2dfe30
MD5 ad704c4a5a2f104b6e8de562dfc85c7a
BLAKE2b-256 14acf75225bb5be2828e9246686d71aaea3200345a47b6b644db2642f033c280

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 57db09c1536df847788c1d8048f8979301d88194d8a3017e5a82f2b575b3e7e0
MD5 ca6c3c3abcba7fe0c0aab2085f9f17c6
BLAKE2b-256 e39c3c4d243147ffaeff3cac1e4e3bf05b3446c2bff96aa1155a88ffcdb07b88

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8df2097131f9fe143574b79c21982325f48459cac0ef2d2a015c0eb52e1db906
MD5 97939996aa00684a28761212b6214e08
BLAKE2b-256 6da5976085448663d057f59f4baa0afd06ab1348b3193eabfde093d8a603eb29

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 592f68b4bb4001c13a75e4f7ed6c073b78be2175c29665a82344d490dd130ad5
MD5 7d9a99722e578f2b93fcdafece70075a
BLAKE2b-256 43826025c118d700be2c6e5bec4ec7444c10fd54dd36a06d3b7a0805eacc8d3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c480056d10249137b737541f889637b8017d06449d35721a74324774188bd4e8
MD5 bd65ed1fef88acbe36f6ab2f5c0e9d97
BLAKE2b-256 98facfaa5e54d78022c787cdb4b143ddd8354dabf871301c5d3335767cf03e42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b536a8ccf8830c05ca740888e30cd5f8d88724ec0f911b6df05dabc53fe6b779
MD5 3d21f099c596cc76e28bd4da2164cf72
BLAKE2b-256 7e90d92b3d4bdc7c231991cd1534092447781e42b6ada71ede9e3a7d7d31af2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d6e7ae212187ed9d0f76647978ac28f5a0c6f767071f6822f573d61b4f9b4001
MD5 5dbc78e8ade28b78ff70a49c7e6d0038
BLAKE2b-256 d9649b555ddc125d42fa923628b1d6a987944ad4fa146dc3e42703b9a0b227a9

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c1e5a024bcc46f0f1283e57ba4673a7236aa1d26bc037cc4681c8d3c71bc7a17
MD5 e25ba6f7f599e7f18377c29b15035e80
BLAKE2b-256 ad7ebcfa0f2ba5c4d68a557e2063d1dd1490a88c480c8352ec2bb2db5d6aa8dd

See more details on using hashes here.

File details

Details for the file crackle_codec-0.36.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1761bee9501a86c027901ba20d531f32378a0b9c070843ef8056d2cc6ca8e6ee
MD5 c24994d307e938b98cfd52115fa950e7
BLAKE2b-256 948fae593d3fca4c1338d6c3e434710e21b68ef3cf2ea672a90dc6e45f9eb79d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 93429374661a002b9283f4dc6d40f209d54244a28bfdd542da3ddc157b5b02c1
MD5 362c60ed0f06229026f5d5b9b6878d56
BLAKE2b-256 a1992363f71ce655904707a990c1c37c5d397034cf346f914850c4bf7f54f237

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d229f7620fee6e00947403c049ad61470e5e70445479565566fccb6276d57d62
MD5 95ac009a579d68a5ad09fdab107a4384
BLAKE2b-256 1dd866006957d0b51267bd9e8d5ea4143c2de2a2aec264a5ed299df979eab979

See more details on using hashes here.

Supported by

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