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.38.0.tar.gz (149.7 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.38.0-cp314-cp314t-win_amd64.whl (346.2 kB view details)

Uploaded CPython 3.14tWindows x86-64

crackle_codec-0.38.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (500.1 kB view details)

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

crackle_codec-0.38.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (480.2 kB view details)

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

crackle_codec-0.38.0-cp314-cp314t-macosx_11_0_arm64.whl (459.0 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

crackle_codec-0.38.0-cp314-cp314t-macosx_10_15_x86_64.whl (519.0 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

crackle_codec-0.38.0-cp314-cp314-win_amd64.whl (333.0 kB view details)

Uploaded CPython 3.14Windows x86-64

crackle_codec-0.38.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (500.0 kB view details)

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

crackle_codec-0.38.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (479.4 kB view details)

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

crackle_codec-0.38.0-cp314-cp314-macosx_11_0_arm64.whl (451.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

crackle_codec-0.38.0-cp314-cp314-macosx_10_15_x86_64.whl (512.1 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

crackle_codec-0.38.0-cp313-cp313-win_amd64.whl (325.5 kB view details)

Uploaded CPython 3.13Windows x86-64

crackle_codec-0.38.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (499.6 kB view details)

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

crackle_codec-0.38.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (478.6 kB view details)

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

crackle_codec-0.38.0-cp313-cp313-macosx_11_0_arm64.whl (451.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

crackle_codec-0.38.0-cp313-cp313-macosx_10_13_x86_64.whl (511.7 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

crackle_codec-0.38.0-cp312-cp312-win_amd64.whl (325.5 kB view details)

Uploaded CPython 3.12Windows x86-64

crackle_codec-0.38.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (499.4 kB view details)

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

crackle_codec-0.38.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (478.4 kB view details)

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

crackle_codec-0.38.0-cp312-cp312-macosx_11_0_arm64.whl (451.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

crackle_codec-0.38.0-cp312-cp312-macosx_10_13_x86_64.whl (511.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

crackle_codec-0.38.0-cp311-cp311-win_amd64.whl (323.5 kB view details)

Uploaded CPython 3.11Windows x86-64

crackle_codec-0.38.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (495.4 kB view details)

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

crackle_codec-0.38.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (476.1 kB view details)

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

crackle_codec-0.38.0-cp311-cp311-macosx_11_0_arm64.whl (450.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

crackle_codec-0.38.0-cp311-cp311-macosx_10_9_x86_64.whl (509.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

crackle_codec-0.38.0-cp310-cp310-win_amd64.whl (322.5 kB view details)

Uploaded CPython 3.10Windows x86-64

crackle_codec-0.38.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (493.4 kB view details)

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

crackle_codec-0.38.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (474.3 kB view details)

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

crackle_codec-0.38.0-cp310-cp310-macosx_11_0_arm64.whl (449.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

crackle_codec-0.38.0-cp310-cp310-macosx_10_9_x86_64.whl (508.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

crackle_codec-0.38.0-cp39-cp39-win_amd64.whl (324.6 kB view details)

Uploaded CPython 3.9Windows x86-64

crackle_codec-0.38.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (493.0 kB view details)

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

crackle_codec-0.38.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (474.5 kB view details)

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

crackle_codec-0.38.0-cp39-cp39-macosx_11_0_arm64.whl (449.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

crackle_codec-0.38.0-cp39-cp39-macosx_10_9_x86_64.whl (508.1 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: crackle_codec-0.38.0.tar.gz
  • Upload date:
  • Size: 149.7 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.38.0.tar.gz
Algorithm Hash digest
SHA256 bc08ee018cbf02881c50c24d846c8ffee71fef6d79e0d79df938efab059f823c
MD5 c7d1ee37c1a0454ac693a85429b31353
BLAKE2b-256 dafb62fdd10c07ed24a2cbffcccbfca39fab5523e3532c681b30f60b984af196

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 88657b08acff00eacb38cc788c9ebb40a02c17daa2464f5fe39d2359a8cc3e6d
MD5 7e4b8848ace5393d7e1610d9e10aa589
BLAKE2b-256 c85bd7d6d435810a73f34c06126149d585f2aeb03d95f1347fedce8d79023fea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cac482ab57b3f5bd3c1296796ca2a407c10bf191008657642584765e82ec54ab
MD5 94719dc8fb6a00ce55e439d2a3cd0e4f
BLAKE2b-256 1645a38a6c04388f069909e6c24152e1b9df04ec24331f19a9eea9e2c84f49f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 174bd050df4b024fe482d376aee920c300434f60427b3d5f082b46cbba8f68b9
MD5 43c79da1393b8271bab6a94524297bbb
BLAKE2b-256 6aa8c9c796a08b60a64ccf72197239fc51c45727aceff6b7a3eee1e47b127f26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8f9f0417b732636e7e02f2215e8202cdc2d00051218ec2f7ecaf40bb297810c
MD5 63b76bcabe33147347f8bcfd46ebed58
BLAKE2b-256 a45c5d251b8057bd01429aa6b7fb81fa66023efdda2f09cd091f498fac53c46f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cfd8dad236360b5031806ae058f96d4213dc98edc4c115b927f8a3509e62587b
MD5 524f8b01362e61cdccaa73bfac40f3f7
BLAKE2b-256 a57de767cc226309c373950defb0904cf05b9293b1154ab1f8b7ade70b5ca895

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 becda45286e31eb5351d50af94285b6f836863b5990a07152a82a9f87042c111
MD5 234ba93c04641ab856434c55b86090db
BLAKE2b-256 274cb070ed449617db54ce4b1b2dfcff23007a2a016f9b8c0f4bb2debd694017

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1902c289db4dde816abda883b39d363b0d63f981304e14b1ec9613e0cb57f7f2
MD5 c3975ac16188709f9c1c95cbbaca2532
BLAKE2b-256 e80a327a75b734f1f25c931434e44d27e51e927dfb924ed5cac05b4bbd871c28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dd5b534b6a12b449026e92db754a200f922633ae890d00cb7171e337220ac466
MD5 2de543c62e28c08b1959960167dd4d5e
BLAKE2b-256 e9c0d9dc90ac6f2322634a92932187e54fa0f5ce500ebb6639d51c693e888b56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29dc3369cca8ed27192ac666567b985855b6e1749f51e4262a7d6faebb83d368
MD5 f874566e537015c659a84d0318fe8fe8
BLAKE2b-256 d40134f25f993c5f9d91ff401e3d10c2553836c47583f5dd0d7eda4cc14cd2fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a16295d657163db740fcc82080a22685f9b30ae7762acfffe5d7aa97bf87a93c
MD5 c2236a94bf0423f423de9f2aa9fc50bf
BLAKE2b-256 cf4a94f49a7fa779211343d062ae0e22e89ebd3a3f7f1cc64ec80a0b48275049

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 59532b65a6005a42c0e8e526c6caebc4e6b6b91c7194f3bcc16b7c162d6fa260
MD5 f726a13f356db446810dbe53e98d0040
BLAKE2b-256 16abebddffed9703a69bd8994f8afbb95620e88ca3601b692d54172542c8fcd7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d282116a976a8adafc1447a96aec55a867461e03e3b6d0c19d414f18abf170d4
MD5 a5d22bf54b64f2a87b0ef0027719ae03
BLAKE2b-256 26dfb1f52df12a973698ab418055d7ba32ee6a6e224737239aaa96a0f907a682

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f1d25e4e57586fcb20d130a68344c1c6433cdd1d2ca92ad0571e30d836241108
MD5 8cefb4bead6c1cdcaf710f7caf006578
BLAKE2b-256 faa1cce7471501153d4c8cd5b90d164ec4df299340d4e62dc2845dbd591977f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c48ba93b2b5a00c97c4da4bcb9a9e1ec967abae1dfe0932ae7a94059cbedd36a
MD5 f1b9c272a66f2688b582de531c41c77c
BLAKE2b-256 2cd266f81e42c269a7e4aaf51a84c21ede4aa43453389c9aaed82f2d28f3b45a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3edd1968a1fb47defd16466a953f40256dec589d32165c91e2cf7ea0db58c8d7
MD5 ff5f89514988a7c4141d2a0219c4ac7c
BLAKE2b-256 4a47c1599b4a374292b1358eefb5331196f1e9d56e2646847968a95de9c3ce0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3aaf644bf907491b127f2442403b538ce0da15850c8550ef8794974c458a237a
MD5 574891a3bacb69d160a299fb90ca28ee
BLAKE2b-256 a996b8625849d4776732766425044a243340e4b6bd873008a573f5c29df2f7f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 49b3793b1ed9a6f8ca4dc9590c0b14b83324a91ff78ddb9e9a0c48911e600bc7
MD5 44bf6ce63fee3e0b0e35fc5a7607a983
BLAKE2b-256 f3eeb07eafac679dffb331f8ad9d55ed419cb17ce6ae1478197c9a294de3fe60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d3c9d581a7bcea08888037f0348ce9c265d853ff9dc2201acabdd2bf68a73af2
MD5 97b56600c77abbb96ff2fd61003f2d81
BLAKE2b-256 3e1588f455b28659060f0f5f5249fdc4bdd7883a9b8fe0e33fb092e4d17d64e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ada558d60c4e895ddc92df0caaeb4b1d6268c155f79240ba2e70737306009004
MD5 90ca4917ff150c691216f40e8c71cabf
BLAKE2b-256 196f1f99c127a8f251714b3374155879bd52d1add855ff65b2e7310006ef8519

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7de0a2d278f798f3e296df50d9d64841674ad9b49150806c4d9d5fe843f4cfa9
MD5 27fd1615b472fa9e4147a30b188ae1be
BLAKE2b-256 f2777af93967fd25353c5ef277f40a50e9c9fbbfb33d3851e9534f956d604357

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4b4165ebb1a10558cd6afb729b650cbd895821d0c1b0c4840c9bd9c5c360bf1e
MD5 5026861d9265a5929868bf5d02c284d0
BLAKE2b-256 9cc2685239503a72519360c3af13c8a6bbe42c433a487db5f169a6490f135935

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a7bde958fcdd9058dbebfaf5bd11980457386e9c053c929c9a2cfe9ec212ad1
MD5 0c15ab9c68923ed9fa7968cd48414c1f
BLAKE2b-256 90c9c0f16476f0f266b1831e61fbf6a3efbf2a132fed4191f798b3140ab0c2b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d88f00601e71bbc2470e49439a3f2e065079053aec516510417ec50d760e6d70
MD5 1a7a72d6884259f3892bdddd14e3af2a
BLAKE2b-256 6847b1048cef0cdf65f310fbf558dc0a953c05ebd63c9b52ef77e7bb733ebea0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f0eedb50439b25897ceaeb4a0a1dd65130843979a3cf2768e165a78c9df452d
MD5 8b78a29ff69903a5844e30fa4c49d6b5
BLAKE2b-256 47b7ba3c311e81eb2977bcec929a1e4ad85f129151533938d7318ed1a9616127

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 00d75f79b9540a5eb5c07c0000589e1f0b0be12413b33b5cae2c74ca4ec11bc2
MD5 d7332607824c869506dc9a1fc0886747
BLAKE2b-256 47da2dfb60e379c1cc96009b4b1a4e50e6e169a464410553dd4a0b8b9d4630e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ab96e964c5254838e6a33ccb71373f4311bfbc5e34ca405605f1c4591b49eb66
MD5 1faeed9da3bbecedc50eea48262bdece
BLAKE2b-256 af9f5cf5e77bd5a83172891cbdaa3eb094ad7c2770aec34258503936a536ff1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b1c0afb1f324f3085771a6a8535f826be1f1f86a065d2b3591bfc3a9cda455e9
MD5 d003a84efecdf90f0bd50499d8f87976
BLAKE2b-256 4fbdd25c8604edc512fb997bb7102bedd4ae068e7da91a03f7e3b63f33a31221

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b1bf7900e18b171cdf0f833575a6e41982e99c811f0d243648c1cb31da71f370
MD5 c13e455b77bde73bd85a86837170f99b
BLAKE2b-256 c8740d4df6b6d813c2f74cca9ce86898601292943cc35f4ac042597daa654aef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7421f86fea2aa6f59ed3b7736c644d3f0c4d9e87af1b5f3b0a5a1f2b525ae51
MD5 b5a1300e512e744cf375f3d5a0194558
BLAKE2b-256 12e80d1a375871133b0a4a824087a89c5303967a232290df9b5e6ab3ea708a62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f52e37527ab4fb6e3cd942c37f2cce1d4e9d040bfaedda56fde82bceea16d4c8
MD5 f10d955299974e0aab02da302fa46d82
BLAKE2b-256 f0e442a157a2eabe08a3d6fe606288395ce61c8782ef5db46dd1e42a5a3205a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3f3095bc3c7bc25e31581d64e727c81e0ba5c0556262e5d0ae473057ad714844
MD5 140b5f1aa055d061b43f81ff87bb4e73
BLAKE2b-256 13d09b8a2bdb7ba1a34566f86f9d7cce15972be6347db455f942b3f3cdcfcf08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 62cbbf57618fb19d62ab91e48d8ae89e102c27ace8960913ed4227564cde11cb
MD5 2dc52e1b7779d0872873fa78704e9a78
BLAKE2b-256 d35a25cd93119dedefc422ecec7775fd240299c0d0eeb7eb5c8e9cf15c46fce8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c03d09d82d597e5fdf0e8860de9f6c61993618f82b8cec007e6e60112aeec2bb
MD5 3ec8dd3302109c307eddcef7eef77aa2
BLAKE2b-256 35bd119e7a6b0f674e16f88a6522da55c1c4e004ad6d6e6e3ca0116790019275

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 02c580330a4e127a977b34fd5a69e2295d9337984f6a6ecb255be6d9bb5d7875
MD5 4abb2b21b399411db54c80aaab527d08
BLAKE2b-256 bb175abbfb1e3500d44bd6349f97e6062764431a29e73793674698f6f128299d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for crackle_codec-0.38.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0656ddbbc7138c2dab965086b5f74374b302f42620c6c9654cdaf1374500a86c
MD5 b4fbeddfaf232577e37770a40f3ec0c2
BLAKE2b-256 6b5abe6993972702c85b900160d08c88b937df3daa8b5a4aa26ddb6b99a27eda

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