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)
# extract a range of labels in something like log(N) time
labels = crackle.contains_range(binary, low, high)

# 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)

is_equal = crackle.array_equal(binary1, binary2)
arr == arr2 # syntactic sugar for CrackleArrays
arr.array_equal(arr2) # method call for CrackleArrays

# 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)

# extract the 4-way or 6-way voxel connectivity graph
# note: 4-way is stored in the format so is extremely fast
vcg = crackle.voxel_connectivity_graph(binary, connectivity=6)

# surface area for 6-connected region contacts
contacts = crackle.contacts(binary, anisotropy=(32,32,40))

# 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.
Crack 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.37.0.tar.gz (149.4 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.37.0-cp314-cp314t-win_amd64.whl (345.5 kB view details)

Uploaded CPython 3.14tWindows x86-64

crackle_codec-0.37.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (498.4 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

crackle_codec-0.37.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

crackle_codec-0.37.0-cp314-cp314t-macosx_11_0_arm64.whl (458.6 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

crackle_codec-0.37.0-cp314-cp314t-macosx_10_15_x86_64.whl (518.8 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

crackle_codec-0.37.0-cp314-cp314-win_amd64.whl (332.3 kB view details)

Uploaded CPython 3.14Windows x86-64

crackle_codec-0.37.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (498.4 kB view details)

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

crackle_codec-0.37.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.7 kB view details)

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

crackle_codec-0.37.0-cp314-cp314-macosx_11_0_arm64.whl (451.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

crackle_codec-0.37.0-cp314-cp314-macosx_10_15_x86_64.whl (511.8 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

crackle_codec-0.37.0-cp313-cp313-win_amd64.whl (324.8 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.37.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (498.0 kB view details)

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

crackle_codec-0.37.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.2 kB view details)

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

crackle_codec-0.37.0-cp313-cp313-macosx_11_0_arm64.whl (450.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.37.0-cp313-cp313-macosx_10_13_x86_64.whl (511.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.37.0-cp312-cp312-win_amd64.whl (324.8 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.37.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (498.5 kB view details)

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

crackle_codec-0.37.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.4 kB view details)

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

crackle_codec-0.37.0-cp312-cp312-macosx_11_0_arm64.whl (450.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.37.0-cp312-cp312-macosx_10_13_x86_64.whl (511.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.37.0-cp311-cp311-win_amd64.whl (322.9 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.37.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (492.1 kB view details)

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

crackle_codec-0.37.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (473.3 kB view details)

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

crackle_codec-0.37.0-cp311-cp311-macosx_11_0_arm64.whl (449.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.37.0-cp311-cp311-macosx_10_9_x86_64.whl (509.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.37.0-cp310-cp310-win_amd64.whl (321.9 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.37.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (493.2 kB view details)

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

crackle_codec-0.37.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (472.6 kB view details)

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

crackle_codec-0.37.0-cp310-cp310-macosx_11_0_arm64.whl (448.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.37.0-cp310-cp310-macosx_10_9_x86_64.whl (507.9 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.37.0-cp39-cp39-win_amd64.whl (323.9 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.37.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (492.2 kB view details)

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

crackle_codec-0.37.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (471.5 kB view details)

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

crackle_codec-0.37.0-cp39-cp39-macosx_11_0_arm64.whl (449.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.37.0-cp39-cp39-macosx_10_9_x86_64.whl (507.8 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.37.0.tar.gz
  • Upload date:
  • Size: 149.4 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.37.0.tar.gz
Algorithm Hash digest
SHA256 e07339dbd98cf828db6e384390928f30ceb4e4701191ab7a077374d5b56b3c3d
MD5 c9854b3655dab9cf2d846094ee6bae79
BLAKE2b-256 83c61e1a0ece19f596b545340c3f7ff6ca3effb005d0677b54b05cd802f16cb0

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 b10dd59950adcdd1cf61e924545403a199c91cebe8b41da64dd85243c8125f9e
MD5 f23a0e1779032349b04ea75ac9c6a8cf
BLAKE2b-256 078c91216b8d4680c63184e730d4a38e1e05ae0d808ef3d36962312d3513663b

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 41d54108f088bfe2f71f99410e9c8f27903d821b4f5a70e6772c7e6e0731e342
MD5 94bfd4022c65670e1f2c48d5ebbb2a35
BLAKE2b-256 8cb1f5890e80d3036fdd95d5e76a9b58acabc9192e08961ce8594a3aeb7ce515

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9c36b6bbd32c92584e14032644e4b6e093a666b6ea62848ce899d2ad51477ee1
MD5 84e6771ce6b3242f43027e2c3a9ea438
BLAKE2b-256 dbf2019e1f5c72bec7ab01c5ce6abd5bb3b0df38439b77b28148d3b5749c2764

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e8edfc85c9acc1ed9ea96e43c0e3b08b95405a1d2c8d854361c86c1fc14b4ef1
MD5 c6d18421f9ed80c30e036929b81481a5
BLAKE2b-256 93027e5d879908d4e44937b1897a186ecf772156ea805e0389416be076543806

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 52fe528aca15e0946d7108b6db96dcac7835a38b65beef031b309ad73a195189
MD5 4992ced7bf678df7b8a1d403a47f4556
BLAKE2b-256 25e3c4b32ecf6608d75bac12a6c6985fbb82668d96a04734d46867c8e094bc93

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 80c6ccaa6e1b955646abc372eee97beb6b8a8774f15f27f52f936093567630ef
MD5 70c6926f000e7284a248225ba483b993
BLAKE2b-256 937dff798d6d88dc306ebc4a0dfda2faecdd6638be933a434861f3a849dcf624

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5992558505af97aaa9b4d39e789da50810c678ed2e34848881d356c8378d523a
MD5 8e3c05304d8cf33b413a45ade32057e4
BLAKE2b-256 6cd9da562d9f61dfcdae42db758aae135ab85f5ce2fda0fc5d8cde10e5615a80

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 83b247439e170d3f8edf8392c39b15e73dbb7d13df7e1176dfd4d46ccf9f1dc3
MD5 3ebd154bd53634ac991db29fedb8d4e5
BLAKE2b-256 6ed885af09ac0d2588abaf34aad5d5148cf237b0b8c09ed1cfdea58b4b0fef0a

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a7c1d98732a04d5e88b8c71a57315d476971892d72f3c92413720f22a83e4c3c
MD5 1c25f5fa3a36b6e5ce57d9492741bd97
BLAKE2b-256 8c2ff905a54946e5e8dbf22d6db116fe0d1a4f5e0f59b4e792d5ce248c69f8ca

See more details on using hashes here.

File details

Details for the file crackle_codec-0.37.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5a71c4a4f4dfb2c57e59ed093e7e5a6e1616e9b5cd72a3d08a61cc51ee09823d
MD5 2d676c361d48dfa211bc8a3f3cb91e2a
BLAKE2b-256 a0f212f17bbc8c64e0865eb0a9437c11ad6fdec5a67dc6128bb27354b3834116

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8d3eda2d31cc8b9aeb0b7a73101b47e9f0db94b10a3b0d5e29558873750eb6ca
MD5 173e8753fcd5d27002e30d1a0e08b07e
BLAKE2b-256 e6e72ff4b8c1d012217cf038e8f2eda3e65b97d1dca639ab25811c39cfba14d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d15e016e68c5961ac7bc9ed8aca2cece5162135bd26782bea2d19ed8cfc742d6
MD5 3628d39d27e46da8d0d19e9d122f9173
BLAKE2b-256 2e0474619fb5a8bfc8c4a9affb74ee046caef804b76fd778c9ddf45c4066097b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8d0611dfce1eec64a5b102acb1816b27d8cd6977e7e5f8e1f96bda5d4b5f8402
MD5 bd59fa809479c589bdf90bd3784fb667
BLAKE2b-256 78082cf8d195927bcbdfd81fbb67d6783d29a63745f634038d144e759a17930b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 67b34f157f949822d0db28453d9b5534c97b35aaddfc9d144f8dea98228684b1
MD5 8e48b9358aad6a6bcad39d505f74b63e
BLAKE2b-256 65d35ac8fae0926fa4ee7bcf2089f504d26da572a522fc69a6280613a00e97f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b014644e61a56ec02d73e7d5f12862981e0738e91ecb6da5e75d5bbb52bc656f
MD5 c8bab5c7b44995747900737a90125c4e
BLAKE2b-256 4124d08523f03bf65bca299d86495ff47414f8ef909ff4f80fba0207fa399592

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d706cb68c7611e4f35d65171678bf598315ac67a3ad48833bb2f239d5d8cba0d
MD5 b6152aef5f8d034e2b6c38f71246b6d6
BLAKE2b-256 549be12d45d4ffd4718045f824a5209f3ab9ea5f64092a414b32ef785a7afdcd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 162e4edff01512b021a437aac11b6f75d7f070b9fd298b6d1d0c3b9601721ea9
MD5 0d3546402c10b87bf53d8a0ac4ff3096
BLAKE2b-256 b6f785e5bd50e0fb6383931e01ed9ad7d6388245af83d921cc760eb61d54dcee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c4ec3af471e2a87ad6d5fa1d943dbd92dea61a5b886eb8ed9a83f4867e66edbd
MD5 f0799a70e200fc8afa7bbd7e6605198b
BLAKE2b-256 0ae555d8cd7a6d5ca502c4ff4542bcfb9ac63b4a7f5e18b11ee940455b00433e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 afe6aa7a4d34e4e5c1b91790877719a8084a1724cda4403ef2e3d19e0d23c4b2
MD5 d98b15817372e13865c300b360d4cbe4
BLAKE2b-256 86b51d94a78e02d6f18b31ea3751f9a6d0ecc4880a8babce0aa74382f75c77ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6eda20ede1179c66fe394e23bebc121095187b8ecc1267378264484a6b32324d
MD5 52f119fa9beb2e3624ea2af574713233
BLAKE2b-256 ef66d948d4e716cba14b1bfe2386300712ac60c76918698294bff3e45d68f261

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 26a698071372473fd3e7cd0db2ed664fd0b48afe35c7ff17ba9d4f5c6042e47e
MD5 b069531bf0da3c2d768874881f987ae6
BLAKE2b-256 0d7c6367c6760a1809562f5d9789ce6683ee4ddaf5dfef3c2b55b3aba68894ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d4bcf8d7d0519e6373652d64b4ee9cc98797422cf3ca574b12fa111d464e01f7
MD5 f138d754dbdc960dce84468cd98541ad
BLAKE2b-256 829ec27ec823b4bad072eeb9c63fcb1c46871f575c92289159f03761d0cd4d75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c1451bfad279f7bdd5bc57a103d07fbd0cc8b9a2802dd4df4870173139cccd02
MD5 7761119314a1e5bf77fb638e3c9f3719
BLAKE2b-256 44d24bd45160c8a723e09eea1fa481f4f49b2ded32183cccee6ae29e47a445f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a0bdb9c23cae4feef77c380bf3c1298b045fed414cf9d805f468d82aa5b364ae
MD5 61ac819c9cfacea77e4030255135e8e3
BLAKE2b-256 562a1200d4664a37dc328fec39b6fd5a475a32eef2cdb886ae0bd3320f36b773

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 240d43ac962598682a89785e4035ddfcf97efaf8b0dc66abb0106c60a7e49e92
MD5 3276ae4d8c331026d4de940132add3f2
BLAKE2b-256 49b14cf716248b9acf825fadbfe870e47325e1137f0dad70f8182cce5df89185

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 53a2f1ac1b5c9dde8a160c4bd7073fadc4b3c19b5f16ba6f88e697980fdd384f
MD5 3d574fe6442410972ca9a2c31f957871
BLAKE2b-256 e23ef5d2c2ac06f8bf1e07785e5a62f8510c68cba5b913dc1904ee4df3d4e903

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f2a0c35bfd21d12701d624feff2a1ca4a8fcbd09ca943f93ae03bd4f41c557aa
MD5 2c9b509164a6982ad94c3444e86cf10c
BLAKE2b-256 1d452bafee296d17d234a0b52a619d60865d370f58ba43f9c138a5f2a9b87be4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b6d45b2f0ab94a966eeb2f4b8adf4355144c48f8e504cc22eea31301d4174593
MD5 965dd0b819124e93fde8f7407a37333f
BLAKE2b-256 c5dc7aa53d8a2948f1dc14e2a27f296dcd290b3cb4fcb91668338a089b6dc988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4aa5d65c7c73d421ddab68f0a840511be87e7fcaf5c15ca193cf07a40f79c1cb
MD5 2283f6002d8d7b490b0bbd79a0a7de39
BLAKE2b-256 b9d3f7985315f01ed36d6572a0ffc326ff036690456b246637419a74cdf5513d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ad4b1c5ab91621a9a73e3d37ed94dad6c8ba61398d9162874cdb646b3164f417
MD5 cad630216ac759f1918ca2a07de36c88
BLAKE2b-256 84d4d6b50fe0b58452d91555e1e686056bab9b28a4ffa4903503ab1aa6c3d520

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6d79eee2ec09075eb126968bffff4db825d289461977abeff72df1832b13dae2
MD5 0175c188305df3bfe18b4e32dd15699e
BLAKE2b-256 60a994640812f44d6d92d2bc175dd06078a1b086b8c4d3f014ca93482dce0c23

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ed82274b6f4229cf79bd5e8a65813dd0f6e9b50272db441e301efab77412f2f8
MD5 41e02a1b1d94ae684281c8a42407ef64
BLAKE2b-256 3171a82a1cf1263f5d35f664a6b73bfecad01128bb3ce25b64b641950849d9cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 23b397a062893198dfb4a2572ba4133d53ae56602db03a15914a669ccca4a570
MD5 13d5308622e6a11fe3c8884712056f1d
BLAKE2b-256 f222296522247b3f7d9937c347f520292e80b7fce7e697af9117801a9ced3cb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f7aab7c73c70070343cf8edcce1bffeba42bed167e8fa001648ee69c98336104
MD5 8d7760ec15eee9ad428cac7fca518bd1
BLAKE2b-256 64f0645dfa3ce4f70eb95d6370218749e7c99d2e0e5b7d770f59eddf61cbfbee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.37.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7a222db75c1e446d735c164233b304154ccd8ebcf8f11c2bc73c75b3cef02adb
MD5 fbf25427350a357a0cde461cefd85817
BLAKE2b-256 913c531f70a0def3e3765ac3e6fd57db81d0d779804348559827d03f88816682

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