modifications for v2.5
diff --git a/python/basisu_py/codec.py b/python/basisu_py/codec.py
index e12b22c..7702d66 100644
--- a/python/basisu_py/codec.py
+++ b/python/basisu_py/codec.py
@@ -101,6 +101,7 @@
 
         params = enc.new_params()
 
+        buf_ptr = None
         try:
             buf_ptr = enc.alloc(len(bytes_data))
 
@@ -137,6 +138,7 @@
 
         params = enc.new_params()
 
+        buf_ptr = None
         try:
             buf_ptr = enc.alloc(len(bytes_data))
             enc.write_bytes(buf_ptr, bytes_data)
diff --git a/python/basisu_py/constants.py b/python/basisu_py/constants.py
index 04be0b0..6ea0976 100644
--- a/python/basisu_py/constants.py
+++ b/python/basisu_py/constants.py
@@ -46,6 +46,9 @@
     cASTC_LDR_12x10= 31
     cASTC_LDR_12x12= 32
 
+    # Supercompressed BC7
+    cXUBC7 = 33
+
 # ============================================================
 # Unified quality level: 1-100 (higher=better quality, 100 disables some codec options)
 # ============================================================
@@ -106,6 +109,17 @@
     TEXTURE_TYPE_SHIFT          = 25
     TEXTURE_TYPE_MASK           = 3
 
+    # ASTC/XUASTC LDR deblocking control (default: deblock block sizes >= 80 texels/block)
+    DISABLE_DEBLOCKING          = 1 << 27
+    FORCE_DEBLOCKING            = 1 << 28
+
+    # XUBC7 only: BC7 base-encoder selection, packed into a 3-bit field.
+    # Field 0 = bc7f (default fast packer); 1-7 = bc7e_scalar at level 0-6 (field = level + 1).
+    # Build a bc7e_scalar value as: ((level + 1) << XUBC7_BASE_ENCODER_SHIFT)
+    XUBC7_BASE_ENCODER_BC7F     = 0 << 29
+    XUBC7_BASE_ENCODER_SHIFT    = 29
+    XUBC7_BASE_ENCODER_MASK     = 7
+
     VERBOSE = PRINT_STATS | PRINT_STATUS
     MIPMAP_CLAMP = GEN_MIPS_CLAMP
     MIPMAP_WRAP  = GEN_MIPS_WRAP
@@ -175,9 +189,8 @@
     TRANSCODE_ALPHA_TO_OPAQUE               = 4
     BC1_FORBID_THREE_COLOR_BLOCKS           = 8
     OUTPUT_HAS_ALPHA_INDICES                = 16
-    HIGH_QUALITY                             = 32
-    NO_ETC1S_CHROMA_FILTERING                = 64
+    HIGH_QUALITY                            = 32
+    NO_ETC1S_CHROMA_FILTERING               = 64
     NO_DEBLOCK_FILTERING                    = 128
-    STRONGER_DEBLOCK_FILTERING              = 256
     FORCE_DEBLOCK_FILTERING                 = 512
     XUASTC_LDR_DISABLE_FAST_BC7_TRANSCODING = 1024
diff --git a/python/basisu_py/transcoder.py b/python/basisu_py/transcoder.py
index 948b516..4d3a1f8 100644
--- a/python/basisu_py/transcoder.py
+++ b/python/basisu_py/transcoder.py
@@ -103,6 +103,7 @@
             # basis_tex_format helpers
             ("basis_tex_format_is_xuastc_ldr", "basis_tex_format_is_xuastc_ldr"),
             ("basis_tex_format_is_astc_ldr",   "basis_tex_format_is_astc_ldr"),
+            ("basis_tex_format_is_xubc7",      "basis_tex_format_is_xubc7"),
             ("basis_tex_format_get_block_width",  "basis_tex_format_get_block_width"),
             ("basis_tex_format_get_block_height", "basis_tex_format_get_block_height"),
             ("basis_tex_format_is_hdr", "basis_tex_format_is_hdr"),
@@ -138,6 +139,7 @@
 
             ("ktx2_get_block_width",  "ktx2_get_block_width"),
             ("ktx2_get_block_height", "ktx2_get_block_height"),
+            ("ktx2_get_deblocking_filter_index", "ktx2_get_deblocking_filter_index"),
             
             ("ktx2_has_alpha",        "ktx2_has_alpha"),
 
@@ -151,6 +153,7 @@
             ("ktx2_is_uastc_ldr_4x4",  "ktx2_is_uastc_ldr_4x4"),
             ("ktx2_is_xuastc_ldr",     "ktx2_is_xuastc_ldr"),
             ("ktx2_is_astc_ldr",       "ktx2_is_astc_ldr"),
+            ("ktx2_is_xubc7",          "ktx2_is_xubc7"),
             ("ktx2_is_video",          "ktx2_is_video"),
             ("ktx2_get_ldr_hdr_upconversion_nit_multiplier", "ktx2_get_ldr_hdr_upconversion_nit_multiplier"),
             
@@ -250,6 +253,7 @@
     def is_uastc_ldr_4x4(self, ktx2_handle):  return bool(self.ktx2_is_uastc_ldr_4x4(ktx2_handle.handle))
     def is_xuastc_ldr(self, ktx2_handle): return bool(self.ktx2_is_xuastc_ldr(ktx2_handle.handle))
     def is_astc_ldr(self, ktx2_handle):   return bool(self.ktx2_is_astc_ldr(ktx2_handle.handle))
+    def is_xubc7(self, ktx2_handle):      return bool(self.ktx2_is_xubc7(ktx2_handle.handle))
     
     # ---- DFD access
     def get_dfd_flags(self, ktx2_handle):   return self.ktx2_get_dfd_flags(ktx2_handle.handle)
@@ -263,6 +267,7 @@
     # ---- Block dimensions ----
     def get_block_width(self, ktx2_handle):  return self.ktx2_get_block_width(ktx2_handle.handle)
     def get_block_height(self, ktx2_handle): return self.ktx2_get_block_height(ktx2_handle.handle)
+    def get_deblocking_filter_index(self, ktx2_handle): return self.ktx2_get_deblocking_filter_index(ktx2_handle.handle)
     
     # -----------------------------------------------------------------------
     # Explicit: start transcoding on an already-open KTX2 file
@@ -502,7 +507,7 @@
           "PVRTC1", "PVRTC2",
           "ETC1", "ETC2", "ETC2_EAC_R11", "ETC2_EAC_RG11",
           "ATC", "FXT1",
-          "RGBA32", "RGB_HALF", "RGBA_HALF", "RGB_FLOAT", "RGBA_FLOAT",
+          "RGBA32", "RGB_HALF", "RGBA_HALF",
           "RGB_9E5"
 
         Returns:
@@ -522,10 +527,10 @@
         if s in ("RGBA32", "RGBA8", "UNCOMPRESSED"):
             tfmt = TranscoderTextureFormat.TF_RGBA32
 
-        elif s in ("RGBHALF", "RGB16F", "RGB_FLOAT", "RGBFLOAT"):
+        elif s in ("RGBHALF", "RGB16F"):
             tfmt = TranscoderTextureFormat.TF_RGB_HALF
 
-        elif s in ("RGBAHALF", "RGBA16F", "RGBA_FLOAT", "RGBAFLOAT"):
+        elif s in ("RGBAHALF", "RGBA16F"):
             tfmt = TranscoderTextureFormat.TF_RGBA_HALF
 
         elif s in ("RGB9E5", "RGB_9E5"):
diff --git a/python/basisu_py/wasm/wasm_transcoder.py b/python/basisu_py/wasm/wasm_transcoder.py
index 01e96ee..cd0e40c 100644
--- a/python/basisu_py/wasm/wasm_transcoder.py
+++ b/python/basisu_py/wasm/wasm_transcoder.py
@@ -103,6 +103,9 @@
     def basis_tex_format_is_astc_ldr(self, basis_tex_fmt_u32: int) -> bool:
         return bool(self.exports["bt_basis_tex_format_is_astc_ldr"](self.store, basis_tex_fmt_u32))
 
+    def basis_tex_format_is_xubc7(self, basis_tex_fmt_u32: int) -> bool:
+        return bool(self.exports["bt_basis_tex_format_is_xubc7"](self.store, basis_tex_fmt_u32))
+
     def basis_tex_format_get_block_width(self, basis_tex_fmt_u32: int) -> int:
         return self.exports["bt_basis_tex_format_get_block_width"](self.store, basis_tex_fmt_u32)
 
@@ -211,12 +214,18 @@
     def ktx2_is_xuastc_ldr(self, handle: int) -> bool:
         return bool(self.exports["bt_ktx2_is_xuastc_ldr"](self.store, handle))
 
+    def ktx2_is_xubc7(self, handle: int) -> bool:
+        return bool(self.exports["bt_ktx2_is_xubc7"](self.store, handle))
+
     def ktx2_get_block_width(self, handle: int) -> int:
         return self.exports["bt_ktx2_get_block_width"](self.store, handle)
 
     def ktx2_get_block_height(self, handle: int) -> int:
         return self.exports["bt_ktx2_get_block_height"](self.store, handle)
 
+    def ktx2_get_deblocking_filter_index(self, handle: int) -> int:
+        return self.exports["bt_ktx2_get_deblocking_filter_index"](self.store, handle)
+
     def ktx2_has_alpha(self, handle: int) -> bool:
         return bool(self.exports["bt_ktx2_has_alpha"](self.store, handle))
 
diff --git a/python/basisu_transcoder_pybind11.cpp b/python/basisu_transcoder_pybind11.cpp
index 4d4aa0f..167df61 100644
--- a/python/basisu_transcoder_pybind11.cpp
+++ b/python/basisu_transcoder_pybind11.cpp
@@ -8,7 +8,7 @@
 
 namespace py = pybind11;
 
-// wasm_bool_t is uint32_t — convert to Python bool
+// wasm_bool_t is uint32_t - convert to Python bool
 static inline bool to_bool(wasm_bool_t v) { return v != 0; }
 
 PYBIND11_MODULE(basisu_transcoder_python, m) {
@@ -42,6 +42,9 @@
     m.def("basis_tex_format_is_astc_ldr",
           [](uint32_t fmt) { return to_bool(bt_basis_tex_format_is_astc_ldr(fmt)); });
 
+    m.def("basis_tex_format_is_xubc7",
+          [](uint32_t fmt) { return to_bool(bt_basis_tex_format_is_xubc7(fmt)); });
+
     m.def("basis_tex_format_get_block_width",
           &bt_basis_tex_format_get_block_width);
 
@@ -138,10 +141,15 @@
     m.def("ktx2_is_xuastc_ldr",
           [](uint64_t h) { return to_bool(bt_ktx2_is_xuastc_ldr(h)); });
 
+    m.def("ktx2_is_xubc7",
+          [](uint64_t h) { return to_bool(bt_ktx2_is_xubc7(h)); });
+
     m.def("ktx2_get_block_width", &bt_ktx2_get_block_width);
 	
     m.def("ktx2_get_block_height", &bt_ktx2_get_block_height);
 
+    m.def("ktx2_get_deblocking_filter_index", &bt_ktx2_get_deblocking_filter_index);
+
     m.def("ktx2_has_alpha",
           [](uint64_t h) { return to_bool(bt_ktx2_has_alpha(h)); });
 
diff --git a/python/lowlevel_test_native/example_capi_python.py b/python/lowlevel_test_native/example_capi_python.py
index d24f48e..a74472d 100644
--- a/python/lowlevel_test_native/example_capi_python.py
+++ b/python/lowlevel_test_native/example_capi_python.py
@@ -271,11 +271,13 @@
     basis_tex_format = bt.ktx2_get_basis_tex_format(ktx2_handle)
     block_width  = bt.ktx2_get_block_width(ktx2_handle)
     block_height = bt.ktx2_get_block_height(ktx2_handle)
+    deblocking_filter_index = bt.ktx2_get_deblocking_filter_index(ktx2_handle)
     is_srgb = bt.ktx2_is_srgb(ktx2_handle)
 
     print(f"KTX2 Dimensions: {width}x{height}, Levels={levels}, Faces={faces}, Layers={layers}")
     print(f"basis_tex_format: {basis_tex_format}")
     print(f"Block dimensions: {block_width}x{block_height}")
+    print(f"deblocking_filter_index: {deblocking_filter_index}")
     print(f"is sRGB: {is_srgb}")
 
     if layers < 1:
@@ -314,12 +316,16 @@
                 rgba_ofs = bt.alloc(trans_size_rgba)
                 print(f"  RGBA buf ofs=0x{rgba_ofs:x}, size={trans_size_rgba}")
 
+                # The transcoder wants the output buffer size in blocks (GPU formats) or pixels (uncompressed),
+                # NOT bytes -- it's used as a buffer-overrun guard. For RGBA32 that's the pixel count.
+                rgba_buf_pixels = trans_size_rgba // bt.basis_get_bytes_per_block_or_pixel(TF.TF_RGBA32)
+
                 decode_flags = 0
                 ok = bt.ktx2_transcode_image_level(
                     ktx2_handle,
                     level_index, layer_index, face_index,
                     rgba_ofs,
-                    trans_size_rgba,
+                    rgba_buf_pixels,
                     TF.TF_RGBA32,
                     decode_flags,
                     0, 0, -1, -1,
@@ -346,11 +352,14 @@
                 astc_ofs = bt.alloc(trans_size_astc)
                 print(f"  ASTC buf ofs=0x{astc_ofs:x}, size={trans_size_astc}")
 
+                # Buffer size in blocks (not bytes) -- ASTC is 16 bytes/block.
+                astc_buf_blocks = trans_size_astc // bt.basis_get_bytes_per_block_or_pixel(target_tf)
+
                 ok = bt.ktx2_transcode_image_level(
                     ktx2_handle,
                     level_index, layer_index, face_index,
                     astc_ofs,
-                    trans_size_astc,
+                    astc_buf_blocks,
                     target_tf,
                     0, 0, 0, -1, -1,
                     trans_state
diff --git a/python/tests/test_transcoder_helpers.py b/python/tests/test_transcoder_helpers.py
index 31245c0..8332555 100644
--- a/python/tests/test_transcoder_helpers.py
+++ b/python/tests/test_transcoder_helpers.py
@@ -80,7 +80,9 @@
         print(f"  is_uastc_ldr_4x4  = {t.is_uastc_ldr_4x4(raw)}")
         print(f"  is_xuastc_ldr = {t.is_xuastc_ldr(raw)}")
         print(f"  is_astc_ldr   = {t.is_astc_ldr(raw)}")
+        print(f"  is_xubc7      = {t.is_xubc7(raw)}")
         print(f"  block dims = {t.get_block_width(raw)} x {t.get_block_height(raw)}")
+        print(f"  deblocking_filter_index = {t.get_deblocking_filter_index(raw)}")
 
     except Exception as e:
         print("  [FAIL] get_* metadata error:", e)
@@ -113,6 +115,7 @@
     try:
         print(f"    is_xuastc_ldr = {t.basis_tex_format_is_xuastc_ldr(fmt)}")
         print(f"    is_astc_ldr   = {t.basis_tex_format_is_astc_ldr(fmt)}")
+        print(f"    is_xubc7      = {t.basis_tex_format_is_xubc7(fmt)}")
         print(f"    block W/H     = {t.basis_tex_format_get_block_width(fmt)} x "
               f"{t.basis_tex_format_get_block_height(fmt)}")
         print(f"    is_hdr        = {t.basis_tex_format_is_hdr(fmt)}")