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)

# 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.27.0.tar.gz (127.8 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.27.0-cp313-cp313-win_amd64.whl (277.9 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (440.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp313-cp313-macosx_11_0_arm64.whl (413.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.27.0-cp313-cp313-macosx_10_13_x86_64.whl (468.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.27.0-cp312-cp312-win_amd64.whl (277.9 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (441.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp312-cp312-macosx_11_0_arm64.whl (413.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.27.0-cp312-cp312-macosx_10_13_x86_64.whl (468.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.27.0-cp311-cp311-win_amd64.whl (277.8 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (440.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp311-cp311-macosx_11_0_arm64.whl (414.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.27.0-cp311-cp311-macosx_10_9_x86_64.whl (467.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.27.0-cp310-cp310-win_amd64.whl (276.9 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (439.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp310-cp310-macosx_11_0_arm64.whl (413.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.27.0-cp310-cp310-macosx_10_9_x86_64.whl (466.0 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.27.0-cp39-cp39-win_amd64.whl (275.9 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (437.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp39-cp39-macosx_11_0_arm64.whl (413.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.27.0-cp39-cp39-macosx_10_9_x86_64.whl (466.1 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

crackle_codec-0.27.0-cp38-cp38-win_amd64.whl (276.7 kB view details)

Uploaded CPython 3.8Windows x86-64

crackle_codec-0.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (438.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp38-cp38-macosx_11_0_arm64.whl (412.8 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

crackle_codec-0.27.0-cp38-cp38-macosx_10_9_x86_64.whl (465.8 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

crackle_codec-0.27.0-cp37-cp37m-win_amd64.whl (277.7 kB view details)

Uploaded CPython 3.7mWindows x86-64

crackle_codec-0.27.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (440.9 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp37-cp37m-macosx_10_9_x86_64.whl (464.9 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

crackle_codec-0.27.0-cp36-cp36m-win_amd64.whl (277.5 kB view details)

Uploaded CPython 3.6mWindows x86-64

crackle_codec-0.27.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (443.5 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

crackle_codec-0.27.0-cp36-cp36m-macosx_10_9_x86_64.whl (463.9 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.27.0.tar.gz
  • Upload date:
  • Size: 127.8 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.27.0.tar.gz
Algorithm Hash digest
SHA256 3f9afea313614f535ea86f63a8a5f462e433b173f0e7d5f334aac6bc9ecc243e
MD5 d9ab888d78b51ed4b3f8f7adf7288c22
BLAKE2b-256 e4c0ef389866173aeceee7a146d80b965faea86af177390056f5c7bee8102732

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1ebddb54fef4b6092205497ba93f08fde5520138069e57eefaab06025cfbd489
MD5 74408447e3319866c66158858b3b0a35
BLAKE2b-256 150095c3ded51be7d9cbfc9c8c63de5d20294b3f02a66581287f5e280ee29d81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b8aa93a1b9ac8a1164f71ed09c9d156ef3065c432a23ab9d6f036d41da2babf9
MD5 13cb1f126779bb70a719e4576ce52bed
BLAKE2b-256 ce4c0a83a0d93e16c3330f7056054ef7c2d5ea506a87d29bee2ec49b8410c447

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 351b8bfc834ffa4a0b2cc99b4362aaa8b244e7c20437c0f3ea7e6503228922b0
MD5 284937db2d4cf06ca5bdf0379a3fa501
BLAKE2b-256 dff25881037c467049d5aaf2eb419a1ca9f8b6be5d92fb9e84db336fea910ecb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e6ce290ef9709f943482cb6eb7fd94e2b5cad18c3ae4c8da0be493128d00dc3d
MD5 1b8056a1c68a8d230c51fe9d65df27e5
BLAKE2b-256 7e3b205308a3eef55402e97116b9baa8d71d5bf9c0c96d4e43400fa2e878fb09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 20c6dadd7198c1802a92ae56d259c5102a04c278980b9ceddadf8184288cca50
MD5 a0db862c040465e4e67626fbb0063d40
BLAKE2b-256 a4d0bf476004c22fb4b1617c45362b72bdd30f20b414e8215adb75da2d1643ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 81c3b0c6dc80f8738d27f0849009f5f8f05809f09c180c088de7525ce7165d1c
MD5 9daa9bedf729c38dabcfb4698d29d9ed
BLAKE2b-256 ce07c4d42d39f7304f856c60ffbbd1744805de70a43886d719aa728edd92a329

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 56f7979e9615b382870da333f15fa64f823b94052f1b2da8e9dc87fc35c63dd0
MD5 82edd56738d13610bf1875477713c68c
BLAKE2b-256 60cd27e7e83715d492b7d38b6d497f1c8c9e34f969022089000e21c7e23977e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 67b7c16a69e6af1c913f95f2b421b56c9afb561420016886ffcc35c896ac194f
MD5 92b7f0c2c8fc09dce60efa6f3c8b9396
BLAKE2b-256 9f62f97b38cb2a580d1e77d1e4a6ff5d9172a7a6787bf8663cfaef6bed46e744

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8c3b707e5ccf677e8a00204aca06d038f985894da2a876558494aef428d453cd
MD5 942b6d34edeea4b2b0ff0c37e2556a22
BLAKE2b-256 742e53ae00d70c26b206cb9f52be5c7ea39cebeb892e4bd716b76c2a5f253bfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 023a85dbd7df8af8aab351330f1263b72e35fd03c4c86e59e8578b34755935be
MD5 505bd6cddbd73b1382048c59883cb505
BLAKE2b-256 28ba5bae268b7ebd92e42dc334f8e9d312b79c6cb93a4103bc66c2ea5b4d12b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72f453b87d13a42b503028e3f46212e49de1947bf8d36599d6ace865f0b898c4
MD5 865d561a3a0b590fce4739f9f90de299
BLAKE2b-256 1a6cabdd5fa79b62818b2499d36c4de1ed09fd946bb0a68e3163728ff205edfd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 edd4cda8803a30a098a429608a5f936879499a66649f6602ed5606f5cb5e1f74
MD5 dd290b488402fe7af2a8a9d767828696
BLAKE2b-256 fea57b79ac31d583ead8bae65a57d8ab598f1ee8facfaed700588e8ccb282de2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 cce81193637eb74728ce01ba6adf31cbdb0ae73d6d39ab6e3dac105386c5798d
MD5 d42a0c7488c772e5f530f0fab97a1e1d
BLAKE2b-256 22eef3f22f0ca97b2633c2b0ef55f808c05a1e35feb26fbf454b24307215a46c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f42538480fd755c1d6bfb8965fe79ed91c12b4f4172a865cda6264469bb6b9cd
MD5 1bf5504701e4c0185bc6131d49333aae
BLAKE2b-256 edf302a8602c945b8e9a951ff58e86a4e20c71f690d61c560b1d1b8c722d5445

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b23cf0ab5fd986389a433361e27e482c1b934f57deb66dce8934fbd8467d9b34
MD5 dd7146b49087929255fa646f80dab00a
BLAKE2b-256 66f66abfa268bdac669d16d544266f3853227abe86c0f5969f870f257a891fe2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e0e0b436432e8b5f7091f46e654c850ae2e2f7ddd3f1ae0157de61f79c1d2914
MD5 72bcccb572dec2bd7bc971b678d008e0
BLAKE2b-256 7bcb49ac80f7c327ab3e85ed3ac08a7e5b5451a4e0c550e3dd13379c2392b20f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d50f1451d738653708db477898d69e5d8489df6f6c5bd6c830d351de23b4c381
MD5 b48216abec5bea45d923b8ceaa584869
BLAKE2b-256 19ef27ee03bd07b322d76124721af33aac0869eb60517f15ca8c3848a7d7947d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 62306edb4d014dfe4e6f5eac754fc642b8791bd7b073678390dac240e10ffa75
MD5 75a6a709914f6c8763944b39fca3874c
BLAKE2b-256 df00a97f0d63aab03b444cbd7a392d8a9c75cc4b9f0b55faef36475c98c5cdd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d8ce88cdbab267e9bbe191ad114d39725288505f01434069fa82ed91cb414097
MD5 62b1d8d4e6ec18ccd61c8ae810e4ee3e
BLAKE2b-256 164e972acd740e819c8b0dc969631ac4f101082d0dad489a9d9df04cc78f16d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cb54d89c42696a7354e4dd5218fb3f6676825cfccdb6c642ce2d9cb2a66de2cd
MD5 76e80bceb785e135061e5ca3a764a230
BLAKE2b-256 62e99793c09698c1a4f13c886dd55038feb0c4f6211574957dcfd4e1c1672594

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 5a0c2c89c15d24d52f4b2a5fc5904490f813c4da7c6d1339a8afaa4c3704a077
MD5 0567b98ebb05bbd4b5aca1a789da8589
BLAKE2b-256 f1df5e69e8d2d447fbb8be8135a63400c7a9412a419f2eda5a02a3adc76461fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 095952e104d0c695cadea6ad4b628fd3a2c220460455ef380486d14e4a308d04
MD5 d1cb95ebc0cf0e770ff38261ff43185b
BLAKE2b-256 10f7d204bb604233ce99955d2ced11c5c725ea209d16201e1ede42d156c0c0c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d635fb21d2efdbb48af8eb167872ab5ab9d20ebb8205a2d458f7fc3f2c77076
MD5 bd21c8bac135bc4ec14482304ff5dd93
BLAKE2b-256 6e33700d5069f3adc3aa64481d51d443eaf2540b52d04d589a48b54f4e430291

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d598bfd5fad710c1f9d2195fa05da0f1be0df48596376421fb430c059bfb3f60
MD5 c33f9529ba3d8afd29776fa5ad953efa
BLAKE2b-256 30f72a830f1bd9b6c01b527aca6b13181142241a3848f3a98fee1b0c20a80cc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 1c94e92876c203543c30a8a1645ebcc1161029d330442784f7679fd5729a4912
MD5 ab0a856e71513a46f0ffa2fd1d02d99f
BLAKE2b-256 7737d817a7cecdaca2c980007585949dce99da70710d7debba448d9c5484eee6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 90a8a526aea512f8bfecff848a6feaaddd9019135f0334697a2730e5bf512ccd
MD5 110b17c10068fbee9beda4a37dd2b796
BLAKE2b-256 ada9a392ddb7ce0ec67e14e77f44e2e69b726c432dee328cf2df477727cb2c47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8e554e7950fe91090cb381ebc990e795a87dd9b49d11682db17b767b64e1172e
MD5 6e957914b7e26be8445ae35df882f51f
BLAKE2b-256 7379cb011e528ab320c16081083f19623e0e6456a2823d70b9383a1ddba3ff2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 34796546f437c138d033a598a70acf649d7246669d66bc164458a8f3978d1710
MD5 41297b5dbc1afac2046d1dd6318dc26a
BLAKE2b-256 cfe27872c3e810b75d21ccf2a22171fe092a20d7aabf9ba7f8e8f3da8d64ed32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f9bbe3dbfcb12d9764f9d81bea913a02e0be56ce1f30760c719d5441f475eafc
MD5 147f5d8501bf732be6298f4fa7f58401
BLAKE2b-256 3d578e6ba070ee154db40109914fd1c4e40f6c0930f3d37dd2933e976cd9b970

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.27.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4ef1ade2299c8f4bf36fc6e5e4db67b14dc1584e8bf12dd93a7e1b7eff459cd3
MD5 0101dddbf0dceacb8c103975d5eb5fe3
BLAKE2b-256 5b9ccc623c9f706cb805f84256cb4299bb4ef7d610cea19472fb3f0b044b1466

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