opencodecs 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. {opencodecs-0.3.0 → opencodecs-0.4.0}/CHANGES.rst +149 -0
  2. {opencodecs-0.3.0/src/opencodecs.egg-info → opencodecs-0.4.0}/PKG-INFO +33 -2
  3. {opencodecs-0.3.0 → opencodecs-0.4.0}/README.md +32 -1
  4. {opencodecs-0.3.0 → opencodecs-0.4.0}/bench/build_libjxl.sh +1 -0
  5. {opencodecs-0.3.0 → opencodecs-0.4.0}/pyproject.toml +1 -1
  6. {opencodecs-0.3.0 → opencodecs-0.4.0}/setup.py +350 -633
  7. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/__init__.py +11 -5
  8. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_cms_codec.py +4 -2
  9. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_czi_reader.py +129 -33
  10. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_czi_writer.py +213 -25
  11. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dicom_codec.py +2 -1
  12. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ndtiff.py +6 -35
  13. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ndtiff_writer.py +28 -154
  14. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_omezarr.py +2 -1
  15. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_tiff_codec.py +125 -4
  16. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_tiff_http.py +3 -28
  17. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_tiff_writer.py +16 -90
  18. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/__init__.py +38 -19
  19. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_avif.pyx +23 -12
  20. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_deflate.pyx +59 -0
  21. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_isal.pyx +6 -7
  22. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_jxl.pyx +67 -1
  23. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_tiff.pyx +291 -0
  24. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_uhdr.pyx +24 -16
  25. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_zstd.pyx +47 -0
  26. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/byteplanes.h +3 -7
  27. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/isal_shim.c +6 -18
  28. opencodecs-0.4.0/src/opencodecs/codecs/oc_decoder_vtable.h +28 -0
  29. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/_write_helpers.py +75 -0
  30. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/io.py +197 -0
  31. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/parallel.py +161 -18
  32. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/pipeline.py +6 -7
  33. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/parallel.py +15 -16
  34. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/tiff_reader.py +8 -8
  35. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/uhdr.py +25 -25
  36. {opencodecs-0.3.0 → opencodecs-0.4.0/src/opencodecs.egg-info}/PKG-INFO +33 -2
  37. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs.egg-info/SOURCES.txt +9 -0
  38. opencodecs-0.4.0/tests/test_czi_mixed_subblocks.py +82 -0
  39. opencodecs-0.4.0/tests/test_czi_read_dispatch.py +199 -0
  40. opencodecs-0.4.0/tests/test_czi_recompress.py +240 -0
  41. opencodecs-0.4.0/tests/test_fd_writes.py +94 -0
  42. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_omezarr_sharded_range.py +8 -1
  43. opencodecs-0.4.0/tests/test_platform_branches.py +122 -0
  44. opencodecs-0.4.0/tests/test_read_file_into.py +117 -0
  45. opencodecs-0.4.0/tests/test_threading_policy.py +283 -0
  46. opencodecs-0.4.0/tests/test_tiff_fused_decode.py +126 -0
  47. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_parallel_decode.py +12 -0
  48. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/VENDOR.toml +0 -0
  49. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bcdec/LICENSE +0 -0
  50. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bcdec/README.md +0 -0
  51. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bcdec/bcdec.h +0 -0
  52. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/LICENSE +0 -0
  53. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/README.rst +0 -0
  54. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/bitshuffle.c +0 -0
  55. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/bitshuffle.h +0 -0
  56. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/bitshuffle_core.c +0 -0
  57. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/bitshuffle_core.h +0 -0
  58. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/bitshuffle_internals.h +0 -0
  59. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/iochain.c +0 -0
  60. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/bitshuffle/iochain.h +0 -0
  61. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/License.txt +0 -0
  62. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/fits_hcompress.c +0 -0
  63. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/fits_hdecompress.c +0 -0
  64. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/fits_hdecompress_api.h +0 -0
  65. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/fitsio2.h +0 -0
  66. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/pliocomp.c +0 -0
  67. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/ricecomp.c +0 -0
  68. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/cfitsio/ricecomp.h +0 -0
  69. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/libspng/LICENSE +0 -0
  70. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/libspng/spng.c +0 -0
  71. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/libspng/spng.h +0 -0
  72. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_eer/LICENSE +0 -0
  73. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_eer/oc_eer.c +0 -0
  74. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_eer/oc_eer.h +0 -0
  75. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_giflzw/LICENSE +0 -0
  76. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_giflzw/oc_giflzw.c +0 -0
  77. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_giflzw/oc_giflzw.h +0 -0
  78. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_tifflzw/LICENSE +0 -0
  79. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_tifflzw/oc_tifflzw.c +0 -0
  80. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/oc_tifflzw/oc_tifflzw.h +0 -0
  81. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/qoi/LICENSE +0 -0
  82. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/qoi/qoi.h +0 -0
  83. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/rgbe/rgbe.c +0 -0
  84. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/rgbe/rgbe.h +0 -0
  85. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/rgbe/rgbe.txt +0 -0
  86. {opencodecs-0.3.0 → opencodecs-0.4.0}/3rdparty/vendor_hashes.json +0 -0
  87. {opencodecs-0.3.0 → opencodecs-0.4.0}/LICENSE +0 -0
  88. {opencodecs-0.3.0 → opencodecs-0.4.0}/MANIFEST.in +0 -0
  89. {opencodecs-0.3.0 → opencodecs-0.4.0}/THIRD-PARTY.md +0 -0
  90. {opencodecs-0.3.0 → opencodecs-0.4.0}/patches/libjxl/README.md +0 -0
  91. {opencodecs-0.3.0 → opencodecs-0.4.0}/setup.cfg +0 -0
  92. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_aec_codec.py +0 -0
  93. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_avif_codec.py +0 -0
  94. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_b2nd_codec.py +0 -0
  95. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_bcn_codec.py +0 -0
  96. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_bitshuffle_codec.py +0 -0
  97. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_blosc2_codec.py +0 -0
  98. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_bmp_codec.py +0 -0
  99. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_brotli_codec.py +0 -0
  100. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_brunsli_codec.py +0 -0
  101. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_byteshuffle_codec.py +0 -0
  102. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_bz2_codec.py +0 -0
  103. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_czi_codec.py +0 -0
  104. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_deflate_codec.py +0 -0
  105. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dicom.py +0 -0
  106. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dicom_pyramid.py +0 -0
  107. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dicomrle_codec.py +0 -0
  108. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dicomweb.py +0 -0
  109. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dm.py +0 -0
  110. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_dm_codec.py +0 -0
  111. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_eer_reader.py +0 -0
  112. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_emd.py +0 -0
  113. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_emd_codec.py +0 -0
  114. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ets.py +0 -0
  115. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_fits.py +0 -0
  116. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_fits_codec.py +0 -0
  117. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_fits_compressed.py +0 -0
  118. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_gif_codec.py +0 -0
  119. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_gzip_codec.py +0 -0
  120. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_h5_common.py +0 -0
  121. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_hdf5_codec.py +0 -0
  122. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_hdf5_http.py +0 -0
  123. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_heif_codec.py +0 -0
  124. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_htj2k_codec.py +0 -0
  125. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_htj2k_pyramid.py +0 -0
  126. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_imaris.py +0 -0
  127. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jpeg2k_codec.py +0 -0
  128. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jpeg2k_pyramid.py +0 -0
  129. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jpeg_codec.py +0 -0
  130. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jpeg_pyramid.py +0 -0
  131. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jpegls_codec.py +0 -0
  132. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_jxl_codec.py +0 -0
  133. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_lerc_codec.py +0 -0
  134. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_lif_codec.py +0 -0
  135. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_lif_native.py +0 -0
  136. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_lz4_codec.py +0 -0
  137. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_lzma_codec.py +0 -0
  138. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_mozjpeg_codec.py +0 -0
  139. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_mozjpeg_pyramid.py +0 -0
  140. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_mrc.py +0 -0
  141. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_mrc_codec.py +0 -0
  142. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_mrc_writer.py +0 -0
  143. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_n5.py +0 -0
  144. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nd2_codec.py +0 -0
  145. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nd2_native.py +0 -0
  146. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ndtiff_pyramid.py +0 -0
  147. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nifti.py +0 -0
  148. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nifti_codec.py +0 -0
  149. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nifti_writer.py +0 -0
  150. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_none_codec.py +0 -0
  151. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nrrd.py +0 -0
  152. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_nrrd_codec.py +0 -0
  153. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_numpy_codec.py +0 -0
  154. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_numpy_reader.py +0 -0
  155. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_oib_codec.py +0 -0
  156. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_oib_native.py +0 -0
  157. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_oir_codec.py +0 -0
  158. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ole2.py +0 -0
  159. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ome_xml.py +0 -0
  160. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_omezarr_writer.py +0 -0
  161. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_packints_codec.py +0 -0
  162. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_pcodec_codec.py +0 -0
  163. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_png_codec.py +0 -0
  164. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_predictor_codec.py +0 -0
  165. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_pyramid_build.py +0 -0
  166. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_qoi_codec.py +0 -0
  167. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_quantize_codec.py +0 -0
  168. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_rcomp_codec.py +0 -0
  169. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_rgbe.py +0 -0
  170. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_rgbe_codec.py +0 -0
  171. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_scaled_pyramid.py +0 -0
  172. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_snappy_codec.py +0 -0
  173. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_sperr_codec.py +0 -0
  174. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_sz3_codec.py +0 -0
  175. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_tiff_pyramid.py +0 -0
  176. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_ultrahdr_codec.py +0 -0
  177. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_vsi_codec.py +0 -0
  178. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_vsi_pyramid.py +0 -0
  179. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_webp_codec.py +0 -0
  180. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_zarr_codecs.py +0 -0
  181. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_zfp_codec.py +0 -0
  182. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/_zstd_codec.py +0 -0
  183. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_aec.pyx +0 -0
  184. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_b2nd.pyx +0 -0
  185. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_bcdec.pyx +0 -0
  186. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_bitshuffle.pyx +0 -0
  187. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_blosc2.pyx +0 -0
  188. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_bmp.pyx +0 -0
  189. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_brotli.pyx +0 -0
  190. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_brunsli.pyx +0 -0
  191. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_bytetools.pyx +0 -0
  192. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_charls.pyx +0 -0
  193. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_eer.pyx +0 -0
  194. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_gif.pyx +0 -0
  195. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_hcomp.pyx +0 -0
  196. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_heif.pyx +0 -0
  197. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_jpeg.pyx +0 -0
  198. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_jpeg2k.pyx +0 -0
  199. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_jpegxr.pyx +0 -0
  200. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_lerc.pyx +0 -0
  201. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_lz4.pyx +0 -0
  202. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_mozjpeg.pyx +0 -0
  203. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_ndtiff.pyx +0 -0
  204. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_openjph.pyx +0 -0
  205. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_pcodec.pyx +0 -0
  206. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_plio.pyx +0 -0
  207. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_png.pyx +0 -0
  208. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_qoi.pyx +0 -0
  209. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_rcomp.pyx +0 -0
  210. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_registry.py +0 -0
  211. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_rgbe.pyx +0 -0
  212. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_snappy.pyx +0 -0
  213. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_sperr.pyx +0 -0
  214. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_sz3.pyx +0 -0
  215. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_webp.pyx +0 -0
  216. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/_zfp.pyx +0 -0
  217. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/avif.pxd +0 -0
  218. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/b2nd.pxd +0 -0
  219. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/b2nd_helpers.c +0 -0
  220. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/b2nd_helpers.h +0 -0
  221. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/bcdec.pxd +0 -0
  222. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/bitshuffle.pxd +0 -0
  223. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/blosc2.pxd +0 -0
  224. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/brotli.pxd +0 -0
  225. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/brunsli.pxd +0 -0
  226. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/charls.pxd +0 -0
  227. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/eer.pxd +0 -0
  228. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/giflib.pxd +0 -0
  229. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/heif.pxd +0 -0
  230. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/heif_shim.h +0 -0
  231. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/jpegxr_shim.c +0 -0
  232. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/jpegxr_shim.h +0 -0
  233. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/lerc.pxd +0 -0
  234. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/libaec.pxd +0 -0
  235. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/libjxl.pxd +0 -0
  236. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/libuhdr.pxd +0 -0
  237. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/lz4.pxd +0 -0
  238. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/mozjpeg.pxd +0 -0
  239. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/openjpeg.pxd +0 -0
  240. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/openjph.pxd +0 -0
  241. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/openjph_shim.cpp +0 -0
  242. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/openjph_shim.h +0 -0
  243. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/pcodec.pxd +0 -0
  244. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/qoi.pxd +0 -0
  245. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/rgbe.pxd +0 -0
  246. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/snappy.pxd +0 -0
  247. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/sperr.pxd +0 -0
  248. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/spng.pxd +0 -0
  249. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/sz3c.pxd +0 -0
  250. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/turbojpeg.pxd +0 -0
  251. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/webp.pxd +0 -0
  252. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/webp_shim.c +0 -0
  253. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/webp_shim.h +0 -0
  254. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/zfp.pxd +0 -0
  255. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/zlib_h.pxd +0 -0
  256. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/codecs/zstd.pxd +0 -0
  257. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/__init__.py +0 -0
  258. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/_io_helpers.py +0 -0
  259. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/_optional_backend.py +0 -0
  260. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/_range_index.py +0 -0
  261. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/_sidecar_header.py +0 -0
  262. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/buffers.py +0 -0
  263. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/checksums.py +0 -0
  264. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/codec.py +0 -0
  265. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/color.py +0 -0
  266. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/errors.py +0 -0
  267. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/native_source.py +0 -0
  268. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/pyramid.py +0 -0
  269. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/rows.py +0 -0
  270. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/scratch.py +0 -0
  271. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/segment_compression.py +0 -0
  272. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/streaming.py +0 -0
  273. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/tile_cache.py +0 -0
  274. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/core/verification.py +0 -0
  275. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/jxl.py +0 -0
  276. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/tifffile_patch.py +0 -0
  277. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs/zarr.py +0 -0
  278. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs.egg-info/dependency_links.txt +0 -0
  279. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs.egg-info/requires.txt +0 -0
  280. {opencodecs-0.3.0 → opencodecs-0.4.0}/src/opencodecs.egg-info/top_level.txt +0 -0
  281. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_auto_pyramid.py +0 -0
  282. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_avif_sequence.py +0 -0
  283. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_b2nd_file_reader.py +0 -0
  284. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_bcdec.py +0 -0
  285. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_bcn_bands.py +0 -0
  286. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_blosc2_partial.py +0 -0
  287. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_blosc2_threads.py +0 -0
  288. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_bounded_pipeline.py +0 -0
  289. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_brunsli.py +0 -0
  290. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_capability_manifest.py +0 -0
  291. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_charls.py +0 -0
  292. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_chunked_means_cheap.py +0 -0
  293. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_codec_registry.py +0 -0
  294. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_container_pipeline.py +0 -0
  295. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_container_streaming.py +0 -0
  296. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_core_codec_api.py +0 -0
  297. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus.py +0 -0
  298. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_codec_decode.py +0 -0
  299. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_manifest.py +0 -0
  300. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_native_fixtures.py +0 -0
  301. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_other.py +0 -0
  302. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_png.py +0 -0
  303. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_tiff.py +0 -0
  304. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_corpus_vendors.py +0 -0
  305. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_coverage_final.py +0 -0
  306. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_coverage_finishing.py +0 -0
  307. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_coverage_last.py +0 -0
  308. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_coverage_more.py +0 -0
  309. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_coverage_push.py +0 -0
  310. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_bounded_iteration.py +0 -0
  311. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_direct_decode.py +0 -0
  312. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_fixture.py +0 -0
  313. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_parallel_write.py +0 -0
  314. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_pyramid.py +0 -0
  315. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_read_out.py +0 -0
  316. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_region_index.py +0 -0
  317. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_region_windows.py +0 -0
  318. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_segment_parts.py +0 -0
  319. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_slide_geometry.py +0 -0
  320. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_verification.py +0 -0
  321. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_write_pipeline.py +0 -0
  322. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_writer.py +0 -0
  323. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_czi_writer_shuffle.py +0 -0
  324. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_data_source.py +0 -0
  325. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_decode_releases_gil.py +0 -0
  326. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_deflate.py +0 -0
  327. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_delta_parity.py +0 -0
  328. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicom.py +0 -0
  329. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicom_encodings.py +0 -0
  330. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicom_parallel.py +0 -0
  331. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicom_slide_selection.py +0 -0
  332. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicom_wsi_pyramid.py +0 -0
  333. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dicomweb.py +0 -0
  334. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_direct_filter_outputs.py +0 -0
  335. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dm.py +0 -0
  336. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dm_offsets.py +0 -0
  337. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_dm_synthetic.py +0 -0
  338. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_edge_cases.py +0 -0
  339. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_eer.py +0 -0
  340. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_eer_parallel.py +0 -0
  341. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_eer_worker_budget.py +0 -0
  342. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_emd.py +0 -0
  343. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_encode_comprehensive.py +0 -0
  344. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_error_handling.py +0 -0
  345. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_filter_scratch.py +0 -0
  346. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_fits.py +0 -0
  347. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_fits_parallel.py +0 -0
  348. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_gif.py +0 -0
  349. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_gzip_presized.py +0 -0
  350. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_hdf5_http.py +0 -0
  351. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_hdf5_local.py +0 -0
  352. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_hdf5_parallel.py +0 -0
  353. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_hdf5_remote.py +0 -0
  354. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_heif_avif_features.py +0 -0
  355. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_heif_multi_image.py +0 -0
  356. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_htj2k_conformance.py +0 -0
  357. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_http_byte_savings.py +0 -0
  358. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_http_prefetch.py +0 -0
  359. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_http_unified.py +0 -0
  360. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_imaris.py +0 -0
  361. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_incremental_byte_codecs.py +0 -0
  362. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_io_chunked.py +0 -0
  363. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_isal.py +0 -0
  364. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_jpeg2k_region.py +0 -0
  365. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_jpegxr.py +0 -0
  366. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_jxl.py +0 -0
  367. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_lif_indexing.py +0 -0
  368. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_lif_native.py +0 -0
  369. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_live_archives.py +0 -0
  370. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_mozjpeg.py +0 -0
  371. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_mrc.py +0 -0
  372. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_mrc_mrcz_http.py +0 -0
  373. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_mrc_nifti_writers.py +0 -0
  374. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_n5.py +0 -0
  375. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_native_output_sinks.py +0 -0
  376. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_native_parity.py +0 -0
  377. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_native_source_callbacks.py +0 -0
  378. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_nd2_native.py +0 -0
  379. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_ndtiff.py +0 -0
  380. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_nifti.py +0 -0
  381. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_nrrd.py +0 -0
  382. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_nrrd_iteration.py +0 -0
  383. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_nrrd_slices.py +0 -0
  384. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_offset_readers.py +0 -0
  385. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_oib_indexing.py +0 -0
  386. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_oib_native.py +0 -0
  387. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_ome_xml.py +0 -0
  388. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_omezarr.py +0 -0
  389. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_open_pyramid.py +0 -0
  390. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_openjph.py +0 -0
  391. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_optional_backend.py +0 -0
  392. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_owned_color_context.py +0 -0
  393. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_owned_image_decoders.py +0 -0
  394. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_parallel_jxl.py +0 -0
  395. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_phase4_filters.py +0 -0
  396. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_phase5_icc.py +0 -0
  397. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_phase6_codecs.py +0 -0
  398. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_phase7_cms.py +0 -0
  399. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_pipeline_budget.py +0 -0
  400. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_pipeline_catalog.py +0 -0
  401. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_pipeline_executor.py +0 -0
  402. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_png_row_sessions.py +0 -0
  403. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_public_output_buffers.py +0 -0
  404. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_pyramid_batched_regions.py +0 -0
  405. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_range_pipeline_completion.py +0 -0
  406. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_rcomp_truncated_input.py +0 -0
  407. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_reader_contract.py +0 -0
  408. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_reader_source_kinds.py +0 -0
  409. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_reader_streaming.py +0 -0
  410. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_reference_parity.py +0 -0
  411. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_rgbe.py +0 -0
  412. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_scaled_pyramid.py +0 -0
  413. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_segment_encoder_binding.py +0 -0
  414. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_shared_io_regressions.py +0 -0
  415. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_sidecar_header.py +0 -0
  416. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_snappy.py +0 -0
  417. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_source_pool_lifetime.py +0 -0
  418. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_streaming_means_streaming.py +0 -0
  419. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tier1_scientific.py +0 -0
  420. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_codec_encode.py +0 -0
  421. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_http.py +0 -0
  422. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_native.py +0 -0
  423. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_pipeline.py +0 -0
  424. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_pyramid.py +0 -0
  425. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_read_path.py +0 -0
  426. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_reader.py +0 -0
  427. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_spool.py +0 -0
  428. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_writer.py +0 -0
  429. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_writer_float_predictor.py +0 -0
  430. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tiff_writer_verification.py +0 -0
  431. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tifffile_patch.py +0 -0
  432. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_tile_cache.py +0 -0
  433. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_uhdr.py +0 -0
  434. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_unified_api.py +0 -0
  435. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_url_sources.py +0 -0
  436. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_vendor_provenance.py +0 -0
  437. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_verified_encoding.py +0 -0
  438. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_version_consistency.py +0 -0
  439. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_vsi_oir.py +0 -0
  440. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_vsi_pyramid.py +0 -0
  441. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_webp_animation.py +0 -0
  442. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_writer_contract.py +0 -0
  443. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_writer_pipeline_completion.py +0 -0
  444. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_writer_verification.py +0 -0
  445. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_zarr_adapters.py +0 -0
  446. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_zarr_region_fast_path.py +0 -0
  447. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_zfp_blocks.py +0 -0
  448. {opencodecs-0.3.0 → opencodecs-0.4.0}/tests/test_zstd_owned_output.py +0 -0
@@ -10,6 +10,155 @@ Versions follow the same ``YYYY.M.D`` cadence as upstream when we
10
10
  publish; the entries below cluster work by date rather than by
11
11
  release because most of it has shipped continuously to ``main``.
12
12
 
13
+ 0.4.0 (2026-09-29)
14
+ ------------------
15
+
16
+ How opencodecs spends threads, especially when several of your threads
17
+ call it at once, and one place for each thing it does differently by
18
+ operating system. Figures compare against 0.3.1 on a 20-core arm64 Mac and
19
+ a 64-core x86-64 Linux workstation: both builds in fresh processes,
20
+ alternating, each process one sample, identical decoded pixels required.
21
+
22
+ - **One shared pool.** ``run_batched``, ``map_batches`` and ``map_bounded``
23
+ (under TIFF, DICOM, EER, FITS, HDF5, CZI, Zarr and more) built a
24
+ ThreadPoolExecutor per call. They now share one process-wide pool. A
25
+ 144-tile TIFF reads 1.34x faster on Linux (9.2 to 6.9 ms) and 1.11x on
26
+ the Mac.
27
+ - **Concurrent callers share instead of multiplying.** A call counts as
28
+ in flight for its whole duration, and an automatic worker count is its
29
+ share of what the calls in flight divide: the pool helpers' workers,
30
+ which hand the GIL back and forth, share 32 between calls (each call
31
+ still takes at most 16), and native codec threads share the CPU count.
32
+ A lone call keeps full width and an explicit ``numthreads`` is honored
33
+ as given. With the TIFF work below, two and eight threads reading a
34
+ tiled deflate TIFF at once: 3.46x and 4.63x on Linux, 3.61x and 4.01x
35
+ on the Mac; eight JPEG XL readers 1.86x on Linux and 1.03x on the Mac.
36
+ - **JPEG XL sizes its threads to the image.** One-shot ``decode`` used
37
+ libjxl's default of one thread per hardware thread, all created for
38
+ each call whatever the image size. It now reads the size from the
39
+ header and uses about one thread per 64K pixels, up to 20. 512 x 512:
40
+ 2.54x faster on Linux (12.9 to 5.1 ms, 5 threads instead of 129) and
41
+ 1.24x on the Mac; 2048 x 2048: 1.10x for one caller and 1.56x for
42
+ eight on Linux, parity on the Mac.
43
+ - **AVIF decode uses up to 8 threads by default** instead of one per
44
+ core: AV1 decodes in parallel across tiles, and past 8 threads there
45
+ was nothing left to gain. 1.07 to 1.13x on Linux, 1.00 to 1.03x on the
46
+ Mac. ``numthreads=0`` still means every core.
47
+ - **TIFF segments decode, un-predict and land in one native call.** A
48
+ tile used to be inflated in one call, un-predicted in a second and
49
+ copied into the output with numpy, with a GIL handoff between each,
50
+ which is what capped concurrent readers. Now a batch of segments goes
51
+ through all three under one GIL release (``_tiff.decode_segments_into``),
52
+ for no compression, deflate, zstd, LZW and PackBits with predictors 1
53
+ to 3, and a whole strip decompresses straight into its output rows.
54
+ zlib and zstd are reached through a C table their own modules export,
55
+ so ``_tiff`` links neither. Separate planes, bilevel and byte-swapped
56
+ files keep the general path, as does any segment the native call
57
+ rejects, which also keeps its exact error. Against 0.3.1, a tiled 4096 x
58
+ 4096 uint16 image with the horizontal predictor: one reader 2.94x on the
59
+ Mac and 2.38x on Linux, eight readers 3.65x on both; a 144-tile image
60
+ 1.98x and 1.96x; the same pixels in strips 1.28x and 1.37x for one
61
+ reader, 1.59x and 1.94x for eight. Serial reads are unchanged or faster.
62
+ - **Uncompressed TIFF strips laid out end to end go straight into the
63
+ output** (``core.io.read_file_into``): positioned reads split across
64
+ the shared pool, where one thread used to copy them out of the file
65
+ mapping. One reader 2.29x on the Mac and 3.79x on Linux; with
66
+ ``numthreads=1``, 1.65x on the Mac and level on Linux; eight readers
67
+ 1.66x on Linux and level on the Mac, where both versions copy from the
68
+ mapping. One choice depends on the kernel, and is named for it: macOS
69
+ copies one thread's worth of bytes out of the reader's file mapping
70
+ faster than it reads them, and Linux reads faster, alone and with
71
+ eight readers alike, so that is what each does.
72
+ - The README compares TIFF reads directly with tifffile: 2.7 to 4.3x
73
+ faster on the Mac and 4.0 to 7.7x on Linux for one reader of a tiled
74
+ compressed image, up to 13.4x for eight concurrent readers.
75
+ - **Ultra HDR** runs its kernels on the shared pool and its encode and
76
+ decode steps on a persistent pool of their own, instead of building up
77
+ to five pools per call: encode 1.06x on the Mac and 1.30x on Linux,
78
+ decode 1.09x on both.
79
+ - **Each operating-system difference is named once.** ``setup.py``
80
+ states its platform conventions in one place and links the library
81
+ files it finds by path on every platform; descriptor reads and writes,
82
+ Windows' binary-mode flag and uncached opens each have one
83
+ implementation; capabilities are probed instead of inferred from the
84
+ platform. A test lists the nine operating-system branches left in the
85
+ package and ``setup.py``, each with the reason it cannot be a probe,
86
+ and fails on a new one.
87
+ - **A CZI file's compression can be rewritten without losing its
88
+ container.** ``czi_recompress(src, dst)`` re-encodes every sub-block
89
+ and keeps its dimensions, scene, mosaic index and pyramid level, and
90
+ the metadata XML; ``write_frame`` and ``write_many`` take a sub-block's
91
+ own dimension list, and ``subblock_dims`` builds one from a reader's
92
+ entry. libCZI reads the output of a 481 sub-block slide scan and
93
+ agrees with the input. 185 MB takes 122 ms against 340 ms for ZEISS's
94
+ czicompress, and 297 ms with ``verify=True``, which decodes every
95
+ sub-block back before it is written.
96
+ - **Windows wheels use libdeflate**, as macOS and Linux wheels already
97
+ did. conda-forge names its import library ``deflate.lib``, which the
98
+ old probe did not recognize, so Windows fell back to zlib. On a Windows
99
+ VM, against 0.3.1: deflate encode 2.79x and decode 1.79x, PNG encode
100
+ 2.82x (decode stays on zlib, level), a tiled deflate TIFF read 1.33x;
101
+ output at the default level is 0.7% (deflate) to 1.5% (PNG) larger,
102
+ the same trade macOS and Linux make.
103
+ - ``import opencodecs`` on macOS ran ``mount`` once per extension, about
104
+ 4.5 ms each; the mount table is now read once, about 200 ms per import.
105
+ - Fix: the DICOM codec dropped ``numthreads``, so ``numthreads=1`` still
106
+ decoded on several threads.
107
+ - Fix: the NDTiff writer counted the buffers after a partial ``writev``
108
+ twice, so its position ran ahead of the file, and ``tiff_reader`` took
109
+ one ``os.pread`` as complete even when it returned short.
110
+ - Fix (building from source): with a per-user cache of source-built
111
+ libraries present, a Windows build handed MSVC ``.so`` paths and
112
+ ``-Wl,-rpath`` flags; the MozJPEG extension on Linux had no rpath to its
113
+ own library, so the loader could take the system's libturbojpeg for it;
114
+ ``bench/build_codec_libs.sh`` passed ``-mcpu=apple-m1`` on Intel Macs.
115
+ - Fix: pools created before ``os.fork()`` hung in the child, which
116
+ inherits the pool object but none of its threads (the first submit
117
+ in a forked DataLoader-style worker waited forever). A forked child
118
+ now builds fresh pools.
119
+
120
+ 0.3.1 (2026-09-28)
121
+ ------------------
122
+
123
+ A CZI read scheduling fix, and a clear refusal for the files that cannot
124
+ stack. Figures compare against 0.3.0 on the same machines.
125
+
126
+ **CZI whole-stack reads hand out work by bytes**
127
+
128
+ ``read`` derived its batch size from the worker count, giving each worker
129
+ ``ceil(n/workers)`` consecutive sub-blocks. That makes the read wait on
130
+ that many sub-blocks even when most workers have already finished: nine
131
+ 8 MiB sub-blocks over eight workers is two rounds, and measured 15.1 ms
132
+ against 7.9 ms for nine one-sub-block tasks. Tasks are now sized by
133
+ output bytes, about 8 MiB each, so a large sub-block gets a task to
134
+ itself and small ones ride together. That keeps the reason batching
135
+ existed, which is that a 0.7 MiB tile cannot pay for its own future,
136
+ without paying the rounding. ``_READ_MAX_WORKERS`` goes 8 to 32: the old
137
+ value was measured against the dispatch above, where extra workers could
138
+ not help. With byte-sized tasks, 20 to 32 measured fastest on both a
139
+ 20-core arm64 Mac and a 128-core x86-64 Linux host, and past 32 the Linux
140
+ host gives it back to memory-bandwidth contention. A semaphore keeps the
141
+ resolved worker count a real bound when the byte sizing yields more tasks
142
+ than that.
143
+
144
+ Eight files of 2000 x 2000 uint16 ZSTDHDR sub-blocks, read back to back:
145
+ 22.1 to about 15 ms per file on macOS, which moves a whole-stack read
146
+ from a little behind aicspylibczi to about 1.3x ahead of it.
147
+
148
+ **A mixed sub-block CZI says so, instead of failing inside the codec**
149
+
150
+ ``read`` stacks every sub-block into one array, and sized that array from
151
+ the first sub-block, which is wrong for any file whose sub-blocks differ:
152
+ a pyramidal slide scan interleaves down-scaled sub-blocks with
153
+ full-resolution ones, and a mosaic can clip its edge tiles. The decode
154
+ destination check then failed with an element count the caller never
155
+ chose, naming neither the file's shape mix nor a way forward. It now
156
+ refuses up front, listing the shapes it cannot stack and the APIs that do
157
+ work (``CziPyramidReader.read_region``, ``entries_at_level``,
158
+ ``read_tile`` and ``iter_tiles``), and the new ``CziReader.is_uniform``
159
+ lets a caller branch before asking. Decoding was never at fault: JPEG XR
160
+ sub-blocks are pixel-exact against aicspylibczi.
161
+
13
162
  0.3.0 (2026-09-27)
14
163
  ------------------
15
164
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencodecs
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)
5
5
  Author: Kevin Cutler
6
6
  License-Expression: BSD-3-Clause
@@ -325,6 +325,37 @@ z = zarr.create_array(
325
325
 
326
326
  ## Performance
327
327
 
328
+ ### TIFF against tifffile
329
+
330
+ Reading the same files, all written by tifffile, and requiring identical
331
+ pixels from both. "1 reader" is each library's default call; "1 thread"
332
+ forces both to a single thread (`numthreads=1`, `maxworkers=1`); "8
333
+ readers" is eight threads each reading at once, both on defaults. Each
334
+ number is how many times faster opencodecs is, the median over fresh
335
+ processes alternating the two libraries, on a 20-core Apple silicon Mac
336
+ (tifffile 2026.3.3) and a 64-core x86-64 Linux workstation (tifffile
337
+ 2026.5.2).
338
+
339
+ | 4096 x 4096 uint16 | Mac, 1 reader | Mac, 1 thread | Mac, 8 readers | Linux, 1 reader | Linux, 1 thread | Linux, 8 readers |
340
+ |---|---:|---:|---:|---:|---:|---:|
341
+ | Tiled, deflate + predictor | 3.2x | 1.0x | 4.0x | 5.7x | 1.3x | 9.9x |
342
+ | Tiled, zstd | 4.3x | 1.1x | 5.1x | 7.7x | 1.7x | 10.0x |
343
+ | Tiled, LZW + predictor | 2.7x | 1.3x | 2.8x | 4.0x | 1.3x | 6.5x |
344
+ | Strips, deflate + predictor | 2.0x | 1.0x | 2.0x | 5.2x | 1.3x | 5.1x |
345
+ | Strips, uncompressed | 3.2x | 2.3x | 1.6x | 3.7x | 1.0x | 1.0x |
346
+ | 3072 x 3072 uint8, 144 tiles, deflate | 2.1x | 1.0x | 4.7x | 4.5x | 1.1x | 13.4x |
347
+
348
+ A tiled deflate image with the predictor takes 6.3 ms against 20.4 ms on
349
+ the Mac and 10.1 ms against 57.6 ms on Linux. Most of the gap is how the
350
+ work is spread: a batch of tiles decompresses, has its predictor undone
351
+ and lands in the output in one native call that releases the GIL once,
352
+ so threads spend their time decoding rather than queuing for it, and
353
+ concurrent readers share the machine instead of each taking all of it.
354
+ Uncompressed strips are a copy for both libraries; opencodecs splits it
355
+ into positioned reads on several threads, and for one thread's worth
356
+ does whichever its kernel does faster: macOS copies out of the file
357
+ mapping, Linux reads.
358
+
328
359
  ### 0.3.0 against 0.2.0
329
360
 
330
361
  0.3.0 is mostly a speed release. Each row below ran both versions in fresh
@@ -637,7 +668,7 @@ build).
637
668
 
638
669
  ## Status
639
670
 
640
- - **v0.3.0** on PyPI (September 2026). Every wheel carries the same 40
671
+ - **v0.4.0** on PyPI (September 2026). Every wheel carries the same 40
641
672
  compiled extensions, and `ci/check_wheel_contents.py` fails the
642
673
  release build if one goes missing.
643
674
  - About 4,000 tests locally, including a 40-dataset conformance corpus;
@@ -273,6 +273,37 @@ z = zarr.create_array(
273
273
 
274
274
  ## Performance
275
275
 
276
+ ### TIFF against tifffile
277
+
278
+ Reading the same files, all written by tifffile, and requiring identical
279
+ pixels from both. "1 reader" is each library's default call; "1 thread"
280
+ forces both to a single thread (`numthreads=1`, `maxworkers=1`); "8
281
+ readers" is eight threads each reading at once, both on defaults. Each
282
+ number is how many times faster opencodecs is, the median over fresh
283
+ processes alternating the two libraries, on a 20-core Apple silicon Mac
284
+ (tifffile 2026.3.3) and a 64-core x86-64 Linux workstation (tifffile
285
+ 2026.5.2).
286
+
287
+ | 4096 x 4096 uint16 | Mac, 1 reader | Mac, 1 thread | Mac, 8 readers | Linux, 1 reader | Linux, 1 thread | Linux, 8 readers |
288
+ |---|---:|---:|---:|---:|---:|---:|
289
+ | Tiled, deflate + predictor | 3.2x | 1.0x | 4.0x | 5.7x | 1.3x | 9.9x |
290
+ | Tiled, zstd | 4.3x | 1.1x | 5.1x | 7.7x | 1.7x | 10.0x |
291
+ | Tiled, LZW + predictor | 2.7x | 1.3x | 2.8x | 4.0x | 1.3x | 6.5x |
292
+ | Strips, deflate + predictor | 2.0x | 1.0x | 2.0x | 5.2x | 1.3x | 5.1x |
293
+ | Strips, uncompressed | 3.2x | 2.3x | 1.6x | 3.7x | 1.0x | 1.0x |
294
+ | 3072 x 3072 uint8, 144 tiles, deflate | 2.1x | 1.0x | 4.7x | 4.5x | 1.1x | 13.4x |
295
+
296
+ A tiled deflate image with the predictor takes 6.3 ms against 20.4 ms on
297
+ the Mac and 10.1 ms against 57.6 ms on Linux. Most of the gap is how the
298
+ work is spread: a batch of tiles decompresses, has its predictor undone
299
+ and lands in the output in one native call that releases the GIL once,
300
+ so threads spend their time decoding rather than queuing for it, and
301
+ concurrent readers share the machine instead of each taking all of it.
302
+ Uncompressed strips are a copy for both libraries; opencodecs splits it
303
+ into positioned reads on several threads, and for one thread's worth
304
+ does whichever its kernel does faster: macOS copies out of the file
305
+ mapping, Linux reads.
306
+
276
307
  ### 0.3.0 against 0.2.0
277
308
 
278
309
  0.3.0 is mostly a speed release. Each row below ran both versions in fresh
@@ -585,7 +616,7 @@ build).
585
616
 
586
617
  ## Status
587
618
 
588
- - **v0.3.0** on PyPI (September 2026). Every wheel carries the same 40
619
+ - **v0.4.0** on PyPI (September 2026). Every wheel carries the same 40
589
620
  compiled extensions, and `ci/check_wheel_contents.py` fails the
590
621
  release build if one goes missing.
591
622
  - About 4,000 tests locally, including a 40-dataset conformance corpus;
@@ -39,6 +39,7 @@ VENDOR="$REPO/vendor"
39
39
  if [ -n "${OPENCODECS_LIBJXL_PREFIX:-}" ]; then
40
40
  PREFIX="$OPENCODECS_LIBJXL_PREFIX"
41
41
  elif [ "$(uname)" = "Darwin" ]; then
42
+ # The per-user cache, as in build_codec_libs.sh and setup.py.
42
43
  PREFIX="${HOME}/Library/Caches/opencodecs/libjxl"
43
44
  else
44
45
  PREFIX="${XDG_CACHE_HOME:-$HOME/.cache}/opencodecs/libjxl"
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "opencodecs"
10
- version = "0.3.0"
10
+ version = "0.4.0"
11
11
  description = "Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"