opencodecs 0.1.5__tar.gz → 0.1.7__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 (207) hide show
  1. {opencodecs-0.1.5 → opencodecs-0.1.7}/CHANGES.rst +141 -0
  2. {opencodecs-0.1.5/src/opencodecs.egg-info → opencodecs-0.1.7}/PKG-INFO +1 -1
  3. {opencodecs-0.1.5 → opencodecs-0.1.7}/pyproject.toml +3 -3
  4. {opencodecs-0.1.5 → opencodecs-0.1.7}/setup.py +129 -47
  5. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/__init__.py +1 -1
  6. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_bcdec.c +152 -152
  7. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_bmp.c +152 -152
  8. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_eer.c +152 -152
  9. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_hcomp.c +152 -152
  10. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_plio.c +152 -152
  11. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_png.c +152 -152
  12. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_qoi.c +152 -152
  13. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_rcomp.c +152 -152
  14. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_rgbe.c +152 -152
  15. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/uhdr.py +169 -6
  16. {opencodecs-0.1.5 → opencodecs-0.1.7/src/opencodecs.egg-info}/PKG-INFO +1 -1
  17. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_uhdr.py +141 -1
  18. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/bcdec/bcdec.h +0 -0
  19. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/bitshuffle/bitshuffle_core.c +0 -0
  20. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/bitshuffle/iochain.c +0 -0
  21. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/cfitsio/fits_hdecompress.c +0 -0
  22. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/cfitsio/pliocomp.c +0 -0
  23. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/cfitsio/ricecomp.c +0 -0
  24. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/imcd_eer/eer.c +0 -0
  25. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/imcd_eer/eer.h +0 -0
  26. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/imcd_lzw/lzw.c +0 -0
  27. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/imcd_lzw/lzw.h +0 -0
  28. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/libspng/spng.c +0 -0
  29. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/oc_tifflzw/oc_tifflzw.c +0 -0
  30. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/oc_tifflzw/oc_tifflzw.h +0 -0
  31. {opencodecs-0.1.5 → opencodecs-0.1.7}/3rdparty/rgbe/rgbe.c +0 -0
  32. {opencodecs-0.1.5 → opencodecs-0.1.7}/MANIFEST.in +0 -0
  33. {opencodecs-0.1.5 → opencodecs-0.1.7}/README.md +0 -0
  34. {opencodecs-0.1.5 → opencodecs-0.1.7}/bench/build_libjxl.sh +0 -0
  35. {opencodecs-0.1.5 → opencodecs-0.1.7}/patches/libjxl/README.md +0 -0
  36. {opencodecs-0.1.5 → opencodecs-0.1.7}/setup.cfg +0 -0
  37. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_aec_codec.py +0 -0
  38. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_avif_codec.py +0 -0
  39. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_b2nd_codec.py +0 -0
  40. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_bcn_codec.py +0 -0
  41. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_bitshuffle_codec.py +0 -0
  42. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_blosc2_codec.py +0 -0
  43. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_bmp_codec.py +0 -0
  44. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_brotli_codec.py +0 -0
  45. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_brunsli_codec.py +0 -0
  46. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_byteshuffle_codec.py +0 -0
  47. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_bz2_codec.py +0 -0
  48. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_cms_codec.py +0 -0
  49. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_czi_codec.py +0 -0
  50. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_czi_reader.py +0 -0
  51. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_czi_writer.py +0 -0
  52. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_deflate_codec.py +0 -0
  53. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_dicomrle_codec.py +0 -0
  54. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_dicomweb.py +0 -0
  55. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_eer_reader.py +0 -0
  56. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ets.py +0 -0
  57. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_fits.py +0 -0
  58. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_fits_codec.py +0 -0
  59. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_fits_compressed.py +0 -0
  60. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_gif_codec.py +0 -0
  61. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_gzip_codec.py +0 -0
  62. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_hdf5_codec.py +0 -0
  63. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_hdf5_http.py +0 -0
  64. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_heif_codec.py +0 -0
  65. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_htj2k_codec.py +0 -0
  66. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_jpeg2k_codec.py +0 -0
  67. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_jpeg_codec.py +0 -0
  68. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_jpegls_codec.py +0 -0
  69. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_jxl_codec.py +0 -0
  70. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_lerc_codec.py +0 -0
  71. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_lif_codec.py +0 -0
  72. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_lif_native.py +0 -0
  73. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_lz4_codec.py +0 -0
  74. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_lzma_codec.py +0 -0
  75. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_mozjpeg_codec.py +0 -0
  76. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_nd2_codec.py +0 -0
  77. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_nd2_native.py +0 -0
  78. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ndtiff.py +0 -0
  79. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ndtiff_pyramid.py +0 -0
  80. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ndtiff_writer.py +0 -0
  81. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_none_codec.py +0 -0
  82. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_numpy_codec.py +0 -0
  83. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_oib_codec.py +0 -0
  84. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_oib_native.py +0 -0
  85. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_oir_codec.py +0 -0
  86. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ole2.py +0 -0
  87. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ome_xml.py +0 -0
  88. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_omezarr.py +0 -0
  89. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_omezarr_writer.py +0 -0
  90. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_packints_codec.py +0 -0
  91. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_pcodec_codec.py +0 -0
  92. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_png_codec.py +0 -0
  93. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_predictor_codec.py +0 -0
  94. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_pyramid_build.py +0 -0
  95. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_qoi_codec.py +0 -0
  96. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_quantize_codec.py +0 -0
  97. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_rcomp_codec.py +0 -0
  98. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_rgbe.py +0 -0
  99. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_rgbe_codec.py +0 -0
  100. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_snappy_codec.py +0 -0
  101. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_sperr_codec.py +0 -0
  102. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_sz3_codec.py +0 -0
  103. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_tiff_codec.py +0 -0
  104. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_tiff_http.py +0 -0
  105. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_tiff_pyramid.py +0 -0
  106. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_tiff_writer.py +0 -0
  107. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_ultrahdr_codec.py +0 -0
  108. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_vsi_codec.py +0 -0
  109. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_webp_codec.py +0 -0
  110. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_zarr_codecs.py +0 -0
  111. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_zfp_codec.py +0 -0
  112. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/_zstd_codec.py +0 -0
  113. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/__init__.py +0 -0
  114. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_bitshuffle.c +0 -0
  115. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_bytetools.c +0 -0
  116. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_deflate.c +0 -0
  117. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_lz4.c +0 -0
  118. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_ndtiff.c +0 -0
  119. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_registry.py +0 -0
  120. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_tiff.c +0 -0
  121. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/codecs/_zstd.c +0 -0
  122. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/__init__.py +0 -0
  123. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/_io_helpers.py +0 -0
  124. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/_optional_backend.py +0 -0
  125. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/codec.py +0 -0
  126. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/color.py +0 -0
  127. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/errors.py +0 -0
  128. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/io.py +0 -0
  129. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/pyramid.py +0 -0
  130. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/core/segment_compression.py +0 -0
  131. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/jxl.py +0 -0
  132. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/parallel.py +0 -0
  133. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/tiff_reader.py +0 -0
  134. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/tifffile_patch.py +0 -0
  135. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs/zarr.py +0 -0
  136. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs.egg-info/SOURCES.txt +0 -0
  137. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs.egg-info/dependency_links.txt +0 -0
  138. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs.egg-info/requires.txt +0 -0
  139. {opencodecs-0.1.5 → opencodecs-0.1.7}/src/opencodecs.egg-info/top_level.txt +0 -0
  140. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_auto_pyramid.py +0 -0
  141. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_bcdec.py +0 -0
  142. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_brunsli.py +0 -0
  143. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_charls.py +0 -0
  144. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_core_codec_api.py +0 -0
  145. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus.py +0 -0
  146. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus_codec_decode.py +0 -0
  147. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus_other.py +0 -0
  148. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus_png.py +0 -0
  149. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus_tiff.py +0 -0
  150. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_corpus_vendors.py +0 -0
  151. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_coverage_final.py +0 -0
  152. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_coverage_finishing.py +0 -0
  153. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_coverage_last.py +0 -0
  154. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_coverage_more.py +0 -0
  155. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_coverage_push.py +0 -0
  156. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_czi_fixture.py +0 -0
  157. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_czi_pyramid.py +0 -0
  158. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_czi_writer.py +0 -0
  159. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_data_source.py +0 -0
  160. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_deflate.py +0 -0
  161. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_dicomweb.py +0 -0
  162. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_edge_cases.py +0 -0
  163. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_eer.py +0 -0
  164. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_encode_comprehensive.py +0 -0
  165. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_error_handling.py +0 -0
  166. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_fits.py +0 -0
  167. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_gif.py +0 -0
  168. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_hdf5_http.py +0 -0
  169. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_hdf5_local.py +0 -0
  170. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_heif_avif_features.py +0 -0
  171. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_http_byte_savings.py +0 -0
  172. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_http_prefetch.py +0 -0
  173. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_http_unified.py +0 -0
  174. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_io_chunked.py +0 -0
  175. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_isal.py +0 -0
  176. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_jxl.py +0 -0
  177. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_lif_native.py +0 -0
  178. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_live_archives.py +0 -0
  179. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_mozjpeg.py +0 -0
  180. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_native_parity.py +0 -0
  181. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_nd2_native.py +0 -0
  182. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_ndtiff.py +0 -0
  183. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_oib_native.py +0 -0
  184. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_ome_xml.py +0 -0
  185. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_omezarr.py +0 -0
  186. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_omezarr_sharded_range.py +0 -0
  187. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_open_pyramid.py +0 -0
  188. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_openjph.py +0 -0
  189. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_optional_backend.py +0 -0
  190. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_parallel_jxl.py +0 -0
  191. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_phase4_filters.py +0 -0
  192. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_phase5_icc.py +0 -0
  193. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_phase6_codecs.py +0 -0
  194. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_phase7_cms.py +0 -0
  195. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_rgbe.py +0 -0
  196. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_snappy.py +0 -0
  197. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tier1_scientific.py +0 -0
  198. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_codec_encode.py +0 -0
  199. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_http.py +0 -0
  200. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_native.py +0 -0
  201. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_pyramid.py +0 -0
  202. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_reader.py +0 -0
  203. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tiff_writer.py +0 -0
  204. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_tifffile_patch.py +0 -0
  205. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_unified_api.py +0 -0
  206. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_vsi_oir.py +0 -0
  207. {opencodecs-0.1.5 → opencodecs-0.1.7}/tests/test_zarr_adapters.py +0 -0
@@ -10,6 +10,147 @@ 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.1.7 (2026-06-02)
14
+ ------------------
15
+
16
+ **Patched libultrahdr bundle**
17
+
18
+ Since v0.1.6 we build libuhdr ourselves; v0.1.7 starts carrying
19
+ local patches via ``patches/libultrahdr/*.patch``, applied by
20
+ ``bench/build_codec_libs.sh::build_libultrahdr`` after the source
21
+ fetch. Five upstream post-v1.4.0 cherry-picks land first:
22
+
23
+ * ``5ed39d6`` — fix ``CLIP3`` parameter order in libuhdr's own
24
+ ``applyGainMap``. The bug clamped a constant ``0.0f`` instead of
25
+ the gainmap weight whenever ``display_boost ≠ hdr_capacity_max``,
26
+ silently producing wrong HDR output on libuhdr's wrapped
27
+ ``decode()`` path. ``opencodecs.uhdr.decode_native`` is unaffected
28
+ (it uses our own Cython gain-application kernel).
29
+ * ``7088ca7`` — error-message typo in ``jpegr.cpp``.
30
+ * ``13a058f`` — ``icc.h`` Endian_Swap macros now respect actual
31
+ host endianness instead of an unconditionally-true ``USE_BIG_ENDIAN_IN_ICC``.
32
+ No effect on x86_64/aarch64 (little-endian); fixes PowerPC/s390x.
33
+ * ``5fa99b5`` — add missing ``<cstdint>`` include for GCC 15.
34
+ * ``8cbc983`` — same ``CLIP3`` fix as ``5ed39d6`` in the GPU path
35
+ (we don't link the GPU path; carried for hygiene).
36
+
37
+ **New API: ``opencodecs.uhdr.probe(data) -> dict``**
38
+
39
+ Parse an Ultra-HDR container's MPF metadata without any pixel
40
+ decode. Returns base + gainmap dimensions plus the gainmap
41
+ metadata block (``max_content_boost`` / ``min_content_boost`` /
42
+ ``gamma`` / capacity). Wraps libuhdr's existing ``uhdr_dec_probe``
43
+ + accessors. ~180× faster than ``decode()`` for any HDR-aware
44
+ flow that only needs dimensions or capacity — image indexing,
45
+ thumbnail generation, HTTP HEAD-style inspection, routing batches
46
+ by content-boost.
47
+
48
+ **Gain-map tunables on ``encode_native``: ``gain_quality`` + ``gain_scale``**
49
+
50
+ Two new kwargs let callers shrink the gain-map layer
51
+ independently of the SDR base:
52
+
53
+ * ``gain_quality`` — JPEG quality for the gain-map layer only
54
+ (defaults to track ``quality``). The gain map is heavily
55
+ band-limited so ``gain_quality=70`` is visually equivalent to
56
+ ``q95`` and cuts ~30% off the gain-map bytes.
57
+ * ``gain_scale`` — integer power-of-2 downsample factor for the
58
+ gain-map raster (``1`` keeps full resolution, ``2`` halves both
59
+ axes for quarter-area, etc.). Stride decimation; ~5 ms on a 2k²
60
+ uint8 gain map. Round-trips through ``probe`` / ``decode_native``
61
+ cleanly — the container records the actual gain-map dimensions
62
+ and the decoder upscales on apply.
63
+
64
+ **True streaming encode: ``encode_native(..., out=fp)``**
65
+
66
+ The old ``encode_to(fp, hdr, ...)`` was a forward-compatible
67
+ ``fp.write(encode_native(hdr, **kw))`` wrapper. v0.1.7 makes both
68
+ genuinely streaming: ``encode_assembled`` (and by extension
69
+ ``encode_native`` / ``encode_to``) now accept an ``out=`` file-
70
+ like, and when given they hand a zero-copy ``memoryview`` over
71
+ libuhdr's internal output buffer to ``out.write()``. Skips the
72
+ final ``PyBytes_FromStringAndSize`` allocation + memcpy. Saves
73
+ ~1× output-size peak memory and ~3 ms wall-clock on a 5 MB encode.
74
+ ``encode_to`` now returns ``None`` instead of the byte count.
75
+
76
+ 0.1.6 (2026-06-01)
77
+ ------------------
78
+
79
+ **libultrahdr now bundled (fixes missing ``_uhdr`` on PyPI wheels)**
80
+
81
+ * ``bench/build_codec_libs.sh::build_libultrahdr`` builds libuhdr
82
+ v1.4.0 (Apache-2.0) into ``$OPENCODECS_LIBS_PREFIX/{include,lib}``
83
+ alongside the other source-built codec libs. The Linux + Windows
84
+ CI ``--only=...`` lists pick it up; the macOS ``before-all`` brew
85
+ install now includes ``libultrahdr`` as well.
86
+ * setup.py's ``_uhdr`` Extension is now built by a probe
87
+ (``_maybe_build_uhdr_ext``) that finds the cached prefix, sets
88
+ ``library_dirs``, and bakes the rpath into the resulting ``.so``
89
+ so delocate / auditwheel / delvewheel can bundle ``libuhdr``'s
90
+ dylib/.so/.dll into the wheel.
91
+ * ``_uhdr`` is now in ``MUST_SHIP_ALL_PLATFORMS`` in
92
+ ``ci/check_wheel_contents.py``; a wheel without the Ultra-HDR
93
+ extension fails the wheel-coverage step.
94
+ * The stale ``_ultrahdr.pyx`` source file (orphaned in commit
95
+ ``c9347f5`` when the direct libuhdr binding shipped as ``_uhdr``)
96
+ is removed.
97
+
98
+ **New API: ``opencodecs.uhdr.decode_native``**
99
+
100
+ Fused-Cython fast-path Ultra-HDR decoder. Uses libuhdr's parser to
101
+ pull out the compressed SDR base + gain-map JPEGs + metadata (no
102
+ pixel decode), then decodes both JPEGs in parallel via
103
+ ``imagecodecs.jpeg_decode`` (libjpeg-turbo SIMD, GIL released) and
104
+ applies the gain map in a Cython kernel that uses the same sRGB
105
+ EOTF LUT + IEEE-754 polynomial ``exp2`` the encoder uses. ~1.4×
106
+ faster than libuhdr's reference decode on a 2k² float HDR (M-series
107
+ Mac: ~52 ms vs ~72 ms). Output matches libuhdr's decode to within
108
+ JPEG-q95 + 8-bit gain-quantisation noise. ``display_boost`` kwarg
109
+ exposes the ISO 21496-1 headroom scaler — default is full HDR
110
+ (``hdr_capacity_max``), pass ``1.0`` to match libuhdr's default
111
+ SDR-equivalent decode.
112
+
113
+ Backed by two new Cython helpers exposed for advanced callers:
114
+
115
+ * ``opencodecs.codecs._uhdr.extract_layers(data)`` — parse the
116
+ container, return ``{base_jpeg, gainmap_jpeg, gainmap_metadata,
117
+ width, height, gainmap_{width,height}}`` without decoding pixels.
118
+ * ``opencodecs.codecs._uhdr.apply_gainmap_fp32(sdr_u8, gain_u8,
119
+ metadata, display_boost=...)`` — the per-pixel gain-application
120
+ kernel.
121
+
122
+ **New API: ``opencodecs.uhdr.encode_to``**
123
+
124
+ Streaming variant of :func:`encode_native` — writes Ultra-HDR bytes
125
+ directly to a file-like (anything with ``write(bytes)``: open file,
126
+ ``io.BytesIO``, HTTP upload streamer). Returns the byte count.
127
+ Forward-compatible alias: the libuhdr api-4 path we currently use
128
+ for container assembly doesn't expose a streaming writer, so the
129
+ function is ``fp.write(encode_native(...))`` today; the API exists
130
+ so callers can adopt it now and pick up any future libuhdr
131
+ streaming write-out without changing their code.
132
+
133
+ **CI / build robustness**
134
+
135
+ * ``_uhdr`` extension's ``-ffast-math`` is now narrowed to
136
+ ``-ffast-math -fno-finite-math-only
137
+ -fno-unsafe-math-optimizations -fno-math-errno
138
+ -fno-trapping-math``. The ``-funsafe-math-optimizations``
139
+ sub-flag is what tells GCC to replace libm calls with libmvec's
140
+ vectorised ``_ZGV*`` variants, which link-fail on Ubuntu (Ubuntu's
141
+ default gcc doesn't auto-link libmvec like manylinux_2_28 does)
142
+ and aren't available at all on aarch64. Same flag set the edt
143
+ extension uses for the same reason. Keeps FMA + reordering
144
+ perf; eliminates the libmvec dependency entirely.
145
+ * The libaec source URL moved from ``gitlab.dkrz.de`` (now
146
+ auth-gated; anonymous requests redirect to ``/users/sign_in``)
147
+ to DKRZ's GitHub mirror at
148
+ ``github.com/Deutsches-Klimarechenzentrum/libaec``.
149
+ * ``fetch_tar`` now has a 4-attempt shell retry loop with empty-
150
+ extract detection — covers transient mirror outages that
151
+ curl's own ``--retry`` doesn't see (e.g. 200 OK with a
152
+ truncated body).
153
+
13
154
  0.1.5 (2026-05-31)
14
155
  ------------------
15
156
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencodecs
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)
5
5
  Author: Kevin Cutler
6
6
  License: BSD-3-Clause
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "opencodecs"
7
- version = "0.1.5"
7
+ version = "0.1.7"
8
8
  description = "Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -142,7 +142,7 @@ before-all = [
142
142
  # bench/build_codec_libs.sh into the cached /cibw-jxl-prefix mount.
143
143
  # Skips encoders (aom, x265) — wheel ships decode-only AVIF/HEIF to
144
144
  # keep build < 12 min cold + avoid GPL x265.
145
- "bash -c 'PATH=$HOME/.cargo/bin:$PATH bash bench/build_codec_libs.sh --only=libjpeg-turbo,c-blosc2,libde265,dav1d,libavif,libheif,libaec,lerc,zfp,SZ3,pcodec,SPERR,brunsli,mozjpeg'",
145
+ "bash -c 'PATH=$HOME/.cargo/bin:$PATH bash bench/build_codec_libs.sh --only=libjpeg-turbo,c-blosc2,libde265,dav1d,libavif,libheif,libaec,lerc,zfp,SZ3,pcodec,SPERR,brunsli,mozjpeg,libultrahdr'",
146
146
  "bash bench/build_libjxl.sh",
147
147
  ]
148
148
  # Don't set OPENCODECS_*_PREFIX here — build_wheels.yml's
@@ -162,7 +162,7 @@ before-all = [
162
162
  # mozjpeg removed from this brew install — the formula ships libjpeg
163
163
  # only, not libturbojpeg, so the _mozjpeg probe couldn't find what it
164
164
  # needed. Source-build via build_codec_libs.sh produces both libs.
165
- "brew install jpeg-xl libavif libheif webp libpng jpeg-turbo openjpeg zstd brotli c-blosc2 lz4 libdeflate libaec liblerc zfp rust cmake ninja",
165
+ "brew install jpeg-xl libavif libheif webp libpng jpeg-turbo openjpeg zstd brotli c-blosc2 lz4 libdeflate libaec liblerc zfp rust cmake ninja libultrahdr",
166
166
  "bash bench/build_codec_libs.sh --only=SZ3,pcodec,SPERR,brunsli,mozjpeg",
167
167
  ]
168
168
  # macos-latest is now macOS 15 (Sequoia) on arm64. Homebrew formulas are
@@ -626,6 +626,123 @@ def _maybe_build_ext_simple(
626
626
  return []
627
627
 
628
628
 
629
+ def _maybe_build_uhdr_ext() -> list[Extension]:
630
+ """Build the ``_uhdr`` (libultrahdr / Ultra-HDR JPEG) extension when
631
+ libuhdr is on the system. Probes the cibuildwheel cached prefix,
632
+ the per-user opencodecs cache (from ``build_codec_libs.sh``),
633
+ homebrew's keg, and the standard system prefixes. Bakes an rpath
634
+ into the resulting ``.so`` so the linked ``libuhdr`` dylib is
635
+ findable at import time without ``LD_LIBRARY_PATH``.
636
+
637
+ Apache-2.0; bundled into the wheel by the standard
638
+ delocate/auditwheel/delvewheel repair step.
639
+ """
640
+ candidates: list[Path] = []
641
+ # 1. Explicit codec-libs prefix wins (set in CI to /cibw-jxl-prefix
642
+ # on Linux, $CONDA_PREFIX on Windows).
643
+ _libs_prefix_env = os.environ.get("OPENCODECS_CODEC_LIBS_PREFIX")
644
+ if _libs_prefix_env:
645
+ candidates.append(Path(_libs_prefix_env))
646
+ # Conda's Windows layout puts headers under <prefix>/Library/.
647
+ candidates.append(Path(_libs_prefix_env) / "Library")
648
+ # 2. Standalone CMake-built libuhdr from build_codec_libs.sh on a
649
+ # dev machine (installs into the per-user `libs` cache root).
650
+ candidates.append(_OC_USER_CACHE / "libs")
651
+ # 3. Homebrew keg (macOS).
652
+ candidates.extend([
653
+ Path("/opt/homebrew/opt/libultrahdr"),
654
+ Path("/usr/local/opt/libultrahdr"),
655
+ ])
656
+ # 4. Generic system prefixes.
657
+ candidates.extend([Path("/usr/local"), Path("/usr")])
658
+
659
+ prefix = None
660
+ lib_subdir = None # "lib" or "lib64" or "Library/lib"
661
+ lib_filename = None
662
+ lib_candidates = [
663
+ ("lib", "libuhdr.dylib"),
664
+ ("lib", "libuhdr.so"),
665
+ ("lib", "libuhdr.so.1"),
666
+ ("lib64", "libuhdr.so"),
667
+ ("lib64", "libuhdr.so.1"),
668
+ ("lib", "libuhdr.1.dylib"),
669
+ # Windows (conda-forge / build_codec_libs.sh layout): the
670
+ # CMake build emits uhdr.lib alongside uhdr.dll under bin/.
671
+ ("lib", "uhdr.lib"),
672
+ ("Library/lib", "uhdr.lib"),
673
+ ]
674
+ for c in candidates:
675
+ if not (c / "include" / "ultrahdr_api.h").is_file() \
676
+ and not (c / "Library" / "include" / "ultrahdr_api.h").is_file():
677
+ continue
678
+ # If Library/ subdir holds the headers, that's the real prefix.
679
+ if (c / "Library" / "include" / "ultrahdr_api.h").is_file():
680
+ c = c / "Library"
681
+ for subdir, name in lib_candidates:
682
+ if (c / subdir / name).is_file():
683
+ prefix = c
684
+ lib_subdir = subdir
685
+ lib_filename = name
686
+ break
687
+ if prefix is not None:
688
+ break
689
+ if prefix is None:
690
+ return []
691
+
692
+ extra_link_args: list[str] = []
693
+ if sys.platform == "darwin":
694
+ # Absolute-path link + rpath fallback. libuhdr's
695
+ # install_name is @rpath/libuhdr.X.dylib, so delocate needs
696
+ # the rpath to be present to resolve LC_LOAD_DYLIB.
697
+ extra_link_args = [
698
+ str(prefix / lib_subdir / lib_filename),
699
+ f"-Wl,-rpath,{prefix / lib_subdir}",
700
+ ]
701
+ libraries = []
702
+ else:
703
+ libraries = ["uhdr"]
704
+ if sys.platform == "linux":
705
+ extra_link_args = [f"-Wl,-rpath,{prefix / lib_subdir}"]
706
+
707
+ return [Extension(
708
+ name="opencodecs.codecs._uhdr",
709
+ sources=["src/opencodecs/codecs/_uhdr.pyx"],
710
+ include_dirs=[
711
+ str(PKG_CODECS),
712
+ numpy.get_include(),
713
+ str(prefix / "include"),
714
+ ],
715
+ library_dirs=[str(prefix / lib_subdir)],
716
+ libraries=libraries,
717
+ extra_link_args=extra_link_args,
718
+ define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
719
+ # Aggressive optimisation for the gain-map / SDR-base kernels
720
+ # to auto-vectorise (NEON on Apple Silicon, AVX2 on x86). The
721
+ # polynomial log2 in _gain_map_kernel only beats numpy's
722
+ # vectorised log2 when the compiler turns it into SIMD.
723
+ #
724
+ # The fno-finite-math-only / fno-unsafe-math-optimizations pair
725
+ # subtracts back the two sub-flags of -ffast-math that bite us:
726
+ # ``-funsafe-math-optimizations`` is what tells GCC to replace
727
+ # libm calls with libmvec's vectorised ``_ZGV*`` variants, which
728
+ # link-fail on Ubuntu and aren't present at all on aarch64.
729
+ # ``-ffinite-math-only`` breaks our clip-to-[0,1] paths by
730
+ # assuming no NaN/Inf can appear. Same flag set that the edt
731
+ # extension uses for the same reason — keeps FMA + reordering
732
+ # speed without the libmvec dependency.
733
+ extra_compile_args=(
734
+ [
735
+ "-O3", "-ffast-math",
736
+ "-fno-finite-math-only",
737
+ "-fno-unsafe-math-optimizations",
738
+ "-fno-math-errno", "-fno-trapping-math",
739
+ ]
740
+ if sys.platform != "win32" else ["/O2"]
741
+ ),
742
+ language="c",
743
+ )]
744
+
745
+
629
746
  def _maybe_build_mozjpeg_ext() -> list[Extension]:
630
747
  """Build the optional ``_mozjpeg`` extension when MozJPEG is
631
748
  installed. MozJPEG ships its libturbojpeg under a keg-only prefix
@@ -1125,36 +1242,14 @@ extensions = [
1125
1242
  extra_link_args=extra_link_args,
1126
1243
  language="c",
1127
1244
  ),
1128
- # libultrahdr (Ultra-HDR / ISO 21496-1). Links against system libuhdr.
1129
- # macOS: `brew install libultrahdr` -> /opt/homebrew/{include,lib}.
1130
- # Linux: build from https://github.com/google/libultrahdr.
1131
- # If the header/dylib aren't present, the Extension still appears in
1132
- # the wheel build plan -- the public opencodecs.uhdr module catches
1133
- # ImportError and substitutes a clear "install libultrahdr" stub.
1134
- Extension(
1135
- name="opencodecs.codecs._uhdr",
1136
- sources=["src/opencodecs/codecs/_uhdr.pyx"],
1137
- include_dirs=[
1138
- str(PKG_CODECS),
1139
- numpy.get_include(),
1140
- *_resolve_include_dirs("ultrahdr_api.h"),
1141
- ],
1142
- library_dirs=[],
1143
- libraries=["uhdr"],
1144
- define_macros=[
1145
- ("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"),
1146
- ],
1147
- # Aggressive optimisation is critical for the gain-map kernel
1148
- # to auto-vectorise (NEON on Apple Silicon, AVX2 on x86). The
1149
- # polynomial log2 in _gain_map_kernel only beats numpy's
1150
- # vectorised log2 when the compiler turns it into SIMD.
1151
- extra_compile_args=[
1152
- "-O3",
1153
- "-ffast-math", # fine for gain-map output (uint8, ~1% tolerance)
1154
- "-fno-math-errno",
1155
- ],
1156
- language="c",
1157
- ),
1245
+ # libultrahdr (Ultra-HDR / ISO 21496-1). Bundled via
1246
+ # bench/build_codec_libs.sh::build_libultrahdr (Apache-2.0). The
1247
+ # _maybe_build_uhdr_ext probe finds the cached install prefix
1248
+ # (homebrew keg, $OPENCODECS_LIBS_PREFIX, per-user cache, or the
1249
+ # cibuildwheel mount) and bakes in the matching rpath so delocate /
1250
+ # auditwheel / delvewheel can bundle libuhdr's dylib/.so/.dll into
1251
+ # the wheel.
1252
+ *_maybe_build_uhdr_ext(),
1158
1253
  # QOI: vendored single-header (3rdparty/qoi/qoi.h). Compile the impl
1159
1254
  # via QOI_IMPLEMENTATION; no external library needed.
1160
1255
  Extension(
@@ -1410,23 +1505,10 @@ extensions = [
1410
1505
  )]
1411
1506
  if _has_header("isa-l/igzip_lib.h") else []
1412
1507
  ),
1413
- # Ultra HDR (gainmap JPEG, ISO 21496) via Google's libultrahdr.
1414
- # Optional; the prebuilt brew bottle is fine because the codec is
1415
- # bottlenecked by libjpeg-turbo's SIMD encoders (which we tune
1416
- # separately). depends on libjpeg-turbo, no C++ runtime visible at
1417
- # our ABI.
1418
- *_maybe_build_ext_simple(
1419
- name="opencodecs.codecs._ultrahdr",
1420
- source="src/opencodecs/codecs/_ultrahdr.pyx",
1421
- prefixes=[
1422
- str(_OC_USER_CACHE / "libs"),
1423
- "/opt/homebrew/opt/libultrahdr",
1424
- "/usr/local/opt/libultrahdr",
1425
- "/usr/local", "/usr",
1426
- ],
1427
- probe_header="ultrahdr_api.h",
1428
- libname="uhdr",
1429
- ),
1508
+ # Ultra HDR is now wired via _maybe_build_uhdr_ext() above (see
1509
+ # the `_uhdr` extension probe). The old stale `_ultrahdr` block
1510
+ # was orphaned when commit c9347f5 replaced the Python wrapper
1511
+ # with the direct libuhdr binding.
1430
1512
  # EER (Thermo Fisher Electron Event Representation) — cryo-EM
1431
1513
  # event-list decoder, vendored from imagecodecs imcd.c (BSD-3).
1432
1514
  # No external deps; always built.
@@ -191,4 +191,4 @@ __all__ = [
191
191
  "CziWriter", "CziPyramidWriter",
192
192
  ]
193
193
 
194
- __version__ = "0.1.5"
194
+ __version__ = "0.1.7"