Remove AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM (#2904)

Always support some Sample Transform schemes as
defined in the version 1.2 of the AVIF specification.
diff --git a/.github/workflows/ci-fuzztest.yml b/.github/workflows/ci-fuzztest.yml
index 6e888c8..acfda4d 100644
--- a/.github/workflows/ci-fuzztest.yml
+++ b/.github/workflows/ci-fuzztest.yml
@@ -46,7 +46,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_FUZZTEST=LOCAL
           -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
diff --git a/.github/workflows/ci-linux-coverage.yml b/.github/workflows/ci-linux-coverage.yml
index bc34c5d..227b499 100644
--- a/.github/workflows/ci-linux-coverage.yml
+++ b/.github/workflows/ci-linux-coverage.yml
@@ -42,7 +42,6 @@
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_YCGCO_R=ON
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON -DAVIF_ENABLE_COVERAGE=ON
           -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
diff --git a/.github/workflows/ci-unix-shared-local.yml b/.github/workflows/ci-unix-shared-local.yml
index 15985de..4a00704 100644
--- a/.github/workflows/ci-unix-shared-local.yml
+++ b/.github/workflows/ci-unix-shared-local.yml
@@ -54,7 +54,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON
       - name: Build libavif
diff --git a/.github/workflows/ci-unix-static.yml b/.github/workflows/ci-unix-static.yml
index 4758668..9e95c70 100644
--- a/.github/workflows/ci-unix-static.yml
+++ b/.github/workflows/ci-unix-static.yml
@@ -60,7 +60,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON
       - name: Build libavif
diff --git a/.github/workflows/ci-windows-installed.yml b/.github/workflows/ci-windows-installed.yml
index f2fea68..8ca2b7c 100644
--- a/.github/workflows/ci-windows-installed.yml
+++ b/.github/workflows/ci-windows-installed.yml
@@ -68,7 +68,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON $env:AVIF_CMAKE_C_COMPILER $env:AVIF_CMAKE_CXX_COMPILER
       - name: Build libavif
diff --git a/.github/workflows/ci-windows-shared-local.yml b/.github/workflows/ci-windows-shared-local.yml
index 7499fe0..557de20 100644
--- a/.github/workflows/ci-windows-shared-local.yml
+++ b/.github/workflows/ci-windows-shared-local.yml
@@ -55,7 +55,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON $env:AVIF_CMAKE_C_COMPILER $env:AVIF_CMAKE_CXX_COMPILER
       - name: Build libavif
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml
index e6a20a2..6780beb 100644
--- a/.github/workflows/ci-windows.yml
+++ b/.github/workflows/ci-windows.yml
@@ -67,7 +67,6 @@
           -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
           -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL
           -DAVIF_ENABLE_EXPERIMENTAL_MINI=ON
-          -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=ON
           -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=ON
           -DAVIF_ENABLE_WERROR=ON
       - name: Build libavif
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d4e106..f3e5097 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,8 @@
 ### Added since 1.3.0
 
 * Allow avifenc to read png or jpeg files through stdin using --stdin-format.
+* Support some Sample Transform schemes as defined in the version 1.2 of the
+  AVIF specification.
 
 ### Changed since 1.3.0
 
@@ -37,6 +39,7 @@
 ### Removed since 1.3.0
 
 * Remove ext/avm.cmd.
+* Remove the AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM CMake flag.
 
 ## [1.3.0] - 2025-05-09
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index af7027f..78bfa7f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,7 +71,6 @@
 option(AVIF_ENABLE_WERROR "Treat all compiler warnings as errors" OFF)
 
 option(AVIF_ENABLE_EXPERIMENTAL_MINI "Enable experimental reduced header" OFF)
-option(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM "Enable experimental sample transform code" OFF)
 option(AVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI "Enable experimental PixelInformationProperty syntax from HEIF 3rd Ed. Amd2" OFF)
 
 set(AVIF_PKG_CONFIG_EXTRA_LIBS_PRIVATE "")
@@ -352,10 +351,6 @@
     add_compile_definitions(AVIF_ENABLE_EXPERIMENTAL_MINI)
 endif()
 
-if(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-    add_compile_definitions(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-endif()
-
 if(AVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI)
     add_compile_definitions(AVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI)
 endif()
@@ -377,14 +372,12 @@
     src/reformat.c
     src/reformat_libsharpyuv.c
     src/reformat_libyuv.c
+    src/sampletransform.c
     src/scale.c
     src/stream.c
     src/utils.c
     src/write.c
 )
-if(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-    list(APPEND AVIF_SRCS src/sampletransform.c)
-endif()
 
 if(AVIF_ENABLE_COMPLIANCE_WARDEN)
     if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ext/ComplianceWarden")
diff --git a/include/avif/avif.h b/include/avif/avif.h
index 35764b4..97eea86 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -196,10 +196,8 @@
     AVIF_RESULT_ENCODE_GAIN_MAP_FAILED = 30,
     AVIF_RESULT_DECODE_GAIN_MAP_FAILED = 31,
     AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE = 32,
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     AVIF_RESULT_ENCODE_SAMPLE_TRANSFORM_FAILED = 33,
     AVIF_RESULT_DECODE_SAMPLE_TRANSFORM_FAILED = 34,
-#endif
 
     // Kept for backward compatibility; please use the symbols above instead.
     AVIF_RESULT_NO_AV1_ITEMS_FOUND = AVIF_RESULT_MISSING_IMAGE_ITEM
@@ -721,13 +719,12 @@
 
 // ---------------------------------------------------------------------------
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-// Sample Transforms are a HIGHLY EXPERIMENTAL FEATURE. The format might still
-// change and images containing a sample transform item encoded with the current
-// version of libavif might not decode with a future version of libavif.
-// Use at your own risk.
-// This is based on a proposal from the Alliance for Open Media.
-
+// Sample Transforms are a mechanism introduced in the version 1.2.0 of the
+// AVIF specification. They enable the creation of derived images that are
+// constructed from multiple input images according to a mathematical formula.
+// This can for example be used to enable higher bit depths even when the
+// underlying codec does not natively support 16-bit or higher precision.
+// See https://aomediacodec.github.io/av1-avif/v1.2.0.html#sample-transform.
 typedef enum avifSampleTransformRecipe
 {
     AVIF_SAMPLE_TRANSFORM_NONE,
@@ -758,7 +755,6 @@
     // truncation and/or compression.
     AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B
 } avifSampleTransformRecipe;
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 // ---------------------------------------------------------------------------
 // Opaque image item properties
@@ -1612,10 +1608,8 @@
     // time to the current time.
     uint64_t modificationTime;
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     // Perform extra steps at encoding and decoding to extend AV1 features using bundled additional image items.
     avifSampleTransformRecipe sampleTransformRecipe; // Changeable encoder setting.
-#endif
 } avifEncoder;
 
 // Creates an encoder initialized with default settings values.
diff --git a/include/avif/internal.h b/include/avif/internal.h
index 4b4c341..c559381 100644
--- a/include/avif/internal.h
+++ b/include/avif/internal.h
@@ -163,7 +163,6 @@
 
 // ---------------------------------------------------------------------------
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 // Mapping used in the coding of Sample Transform metadata.
 typedef enum avifSampleTransformBitDepth
 {
@@ -241,8 +240,6 @@
                                     const avifImage * inputImageItems[],
                                     avifPlanesFlags planes);
 
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
-
 // ---------------------------------------------------------------------------
 // Alpha
 
@@ -405,20 +402,17 @@
     AVIF_ITEM_COLOR,
     AVIF_ITEM_ALPHA,
     AVIF_ITEM_GAIN_MAP,
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     AVIF_ITEM_SAMPLE_TRANSFORM, // Sample Transform derived image item 'sato'.
     // Extra input image items for AVIF_ITEM_SAMPLE_TRANSFORM. "Extra" because AVIF_ITEM_COLOR could be one too.
     AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_COLOR,
     AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_1_COLOR,
     AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_ALPHA,
     AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_1_ALPHA,
-#endif
     AVIF_ITEM_CATEGORY_COUNT
 } avifItemCategory;
 
 avifBool avifIsAlpha(avifItemCategory itemCategory);
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 // AVIF allows up to 32 inputs for sample transforms but we only support a smaller number.
 #define AVIF_SAMPLE_TRANSFORM_MAX_NUM_EXTRA_INPUT_IMAGE_ITEMS \
     (AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_ALPHA - AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_COLOR)
@@ -428,7 +422,6 @@
 #define AVIF_SAMPLE_TRANSFORM_MIN_CATEGORY AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_COLOR
 #define AVIF_SAMPLE_TRANSFORM_MAX_CATEGORY \
     (AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_ALPHA + AVIF_SAMPLE_TRANSFORM_MAX_NUM_EXTRA_INPUT_IMAGE_ITEMS - 1)
-#endif
 
 // ---------------------------------------------------------------------------
 // Grid AVIF images
diff --git a/src/avif.c b/src/avif.c
index a87710b..93bd1b1 100644
--- a/src/avif.c
+++ b/src/avif.c
@@ -75,42 +75,40 @@
 {
     // clang-format off
     switch (result) {
-        case AVIF_RESULT_OK:                            return "OK";
-        case AVIF_RESULT_INVALID_FTYP:                  return "Invalid ftyp";
-        case AVIF_RESULT_NO_CONTENT:                    return "No content";
-        case AVIF_RESULT_NO_YUV_FORMAT_SELECTED:        return "No YUV format selected";
-        case AVIF_RESULT_REFORMAT_FAILED:               return "Reformat failed";
-        case AVIF_RESULT_UNSUPPORTED_DEPTH:             return "Unsupported depth";
-        case AVIF_RESULT_ENCODE_COLOR_FAILED:           return "Encoding of color planes failed";
-        case AVIF_RESULT_ENCODE_ALPHA_FAILED:           return "Encoding of alpha plane failed";
-        case AVIF_RESULT_BMFF_PARSE_FAILED:             return "BMFF parsing failed";
-        case AVIF_RESULT_MISSING_IMAGE_ITEM:            return "Missing or empty image item";
-        case AVIF_RESULT_DECODE_COLOR_FAILED:           return "Decoding of color planes failed";
-        case AVIF_RESULT_DECODE_ALPHA_FAILED:           return "Decoding of alpha plane failed";
-        case AVIF_RESULT_COLOR_ALPHA_SIZE_MISMATCH:     return "Color and alpha planes size mismatch";
-        case AVIF_RESULT_ISPE_SIZE_MISMATCH:            return "Plane sizes don't match ispe values";
-        case AVIF_RESULT_NO_CODEC_AVAILABLE:            return "No codec available";
-        case AVIF_RESULT_NO_IMAGES_REMAINING:           return "No images remaining";
-        case AVIF_RESULT_INVALID_EXIF_PAYLOAD:          return "Invalid Exif payload";
-        case AVIF_RESULT_INVALID_IMAGE_GRID:            return "Invalid image grid";
-        case AVIF_RESULT_INVALID_CODEC_SPECIFIC_OPTION: return "Invalid codec-specific option";
-        case AVIF_RESULT_TRUNCATED_DATA:                return "Truncated data";
-        case AVIF_RESULT_IO_NOT_SET:                    return "IO not set";
-        case AVIF_RESULT_IO_ERROR:                      return "IO Error";
-        case AVIF_RESULT_WAITING_ON_IO:                 return "Waiting on IO";
-        case AVIF_RESULT_INVALID_ARGUMENT:              return "Invalid argument";
-        case AVIF_RESULT_NOT_IMPLEMENTED:               return "Not implemented";
-        case AVIF_RESULT_OUT_OF_MEMORY:                 return "Out of memory";
-        case AVIF_RESULT_CANNOT_CHANGE_SETTING:         return "Cannot change some setting during encoding";
-        case AVIF_RESULT_INCOMPATIBLE_IMAGE:            return "The image is incompatible with already encoded images";
-        case AVIF_RESULT_INTERNAL_ERROR:                return "Internal error";
-        case AVIF_RESULT_ENCODE_GAIN_MAP_FAILED:        return "Encoding of gain map planes failed";
-        case AVIF_RESULT_DECODE_GAIN_MAP_FAILED:        return "Decoding of gain map planes failed";
-        case AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE:     return "Invalid tone mapped image item";
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
+        case AVIF_RESULT_OK:                             return "OK";
+        case AVIF_RESULT_INVALID_FTYP:                   return "Invalid ftyp";
+        case AVIF_RESULT_NO_CONTENT:                     return "No content";
+        case AVIF_RESULT_NO_YUV_FORMAT_SELECTED:         return "No YUV format selected";
+        case AVIF_RESULT_REFORMAT_FAILED:                return "Reformat failed";
+        case AVIF_RESULT_UNSUPPORTED_DEPTH:              return "Unsupported depth";
+        case AVIF_RESULT_ENCODE_COLOR_FAILED:            return "Encoding of color planes failed";
+        case AVIF_RESULT_ENCODE_ALPHA_FAILED:            return "Encoding of alpha plane failed";
+        case AVIF_RESULT_BMFF_PARSE_FAILED:              return "BMFF parsing failed";
+        case AVIF_RESULT_MISSING_IMAGE_ITEM:             return "Missing or empty image item";
+        case AVIF_RESULT_DECODE_COLOR_FAILED:            return "Decoding of color planes failed";
+        case AVIF_RESULT_DECODE_ALPHA_FAILED:            return "Decoding of alpha plane failed";
+        case AVIF_RESULT_COLOR_ALPHA_SIZE_MISMATCH:      return "Color and alpha planes size mismatch";
+        case AVIF_RESULT_ISPE_SIZE_MISMATCH:             return "Plane sizes don't match ispe values";
+        case AVIF_RESULT_NO_CODEC_AVAILABLE:             return "No codec available";
+        case AVIF_RESULT_NO_IMAGES_REMAINING:            return "No images remaining";
+        case AVIF_RESULT_INVALID_EXIF_PAYLOAD:           return "Invalid Exif payload";
+        case AVIF_RESULT_INVALID_IMAGE_GRID:             return "Invalid image grid";
+        case AVIF_RESULT_INVALID_CODEC_SPECIFIC_OPTION:  return "Invalid codec-specific option";
+        case AVIF_RESULT_TRUNCATED_DATA:                 return "Truncated data";
+        case AVIF_RESULT_IO_NOT_SET:                     return "IO not set";
+        case AVIF_RESULT_IO_ERROR:                       return "IO Error";
+        case AVIF_RESULT_WAITING_ON_IO:                  return "Waiting on IO";
+        case AVIF_RESULT_INVALID_ARGUMENT:               return "Invalid argument";
+        case AVIF_RESULT_NOT_IMPLEMENTED:                return "Not implemented";
+        case AVIF_RESULT_OUT_OF_MEMORY:                  return "Out of memory";
+        case AVIF_RESULT_CANNOT_CHANGE_SETTING:          return "Cannot change some setting during encoding";
+        case AVIF_RESULT_INCOMPATIBLE_IMAGE:             return "The image is incompatible with already encoded images";
+        case AVIF_RESULT_INTERNAL_ERROR:                 return "Internal error";
+        case AVIF_RESULT_ENCODE_GAIN_MAP_FAILED:         return "Encoding of gain map planes failed";
+        case AVIF_RESULT_DECODE_GAIN_MAP_FAILED:         return "Decoding of gain map planes failed";
+        case AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE:      return "Invalid tone mapped image item";
         case AVIF_RESULT_ENCODE_SAMPLE_TRANSFORM_FAILED: return "Encoding of sample transformed image failed";
         case AVIF_RESULT_DECODE_SAMPLE_TRANSFORM_FAILED: return "Decoding of sample transformed image failed";
-#endif
         case AVIF_RESULT_UNKNOWN_ERROR:
         default:
             break;
@@ -1017,12 +1015,10 @@
     if (itemCategory == AVIF_ITEM_ALPHA) {
         return AVIF_TRUE;
     }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (itemCategory >= AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_ALPHA &&
         itemCategory < AVIF_ITEM_SAMPLE_TRANSFORM_INPUT_0_ALPHA + AVIF_SAMPLE_TRANSFORM_MAX_NUM_EXTRA_INPUT_IMAGE_ITEMS) {
         return AVIF_TRUE;
     }
-#endif
     return AVIF_FALSE;
 }
 
diff --git a/src/read.c b/src/read.c
index 8a3ed82..fdbbc10 100644
--- a/src/read.c
+++ b/src/read.c
@@ -832,16 +832,14 @@
     // Contents of grpl box, which signal groups of entities (items or tracks).
     avifEntityToGroups entityToGroups;
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_MINI)
-    // If true, the fields above were extracted from a MinimizedImageBox.
-    avifBool fromMiniBox;
-#endif
-
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     // Parsed from Sample Transform metadata if present, otherwise empty.
     avifSampleTransformExpression sampleTransformExpression;
     // Bit depth extracted from the pixi property of the Sample Transform derived image item, if any.
     uint32_t sampleTransformDepth;
+
+#if defined(AVIF_ENABLE_EXPERIMENTAL_MINI)
+    // If true, the fields above were extracted from a MinimizedImageBox.
+    avifBool fromMiniBox;
 #endif
 } avifMeta;
 
@@ -876,9 +874,7 @@
     avifArrayDestroy(&meta->items);
     avifPropertyArrayDestroy(&meta->properties);
     avifRWDataFree(&meta->idat);
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     avifArrayDestroy(&meta->sampleTransformExpression);
-#endif
     for (uint32_t i = 0; i < meta->entityToGroups.count; ++i) {
         avifArrayDestroy(&meta->entityToGroups.groups[i].entityIDs);
     }
@@ -984,12 +980,10 @@
                                                //   in the image bitstream, i.e. if the property is present, colour information in
                                                //   the bitstream shall be ignored.
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     // Remember the dimg association order to the Sample Transform derived image item.
     // Colour items only. The alpha items are implicit.
     uint8_t sampleTransformNumInputImageItems; // At most AVIF_SAMPLE_TRANSFORM_MAX_NUM_INPUT_IMAGE_ITEMS.
     avifItemCategory sampleTransformInputImageItems[AVIF_SAMPLE_TRANSFORM_MAX_NUM_INPUT_IMAGE_ITEMS];
-#endif
 } avifDecoderData;
 
 static void avifDecoderDataDestroy(avifDecoderData * data);
@@ -2222,7 +2216,6 @@
     return AVIF_RESULT_OK;
 }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 // bit_depth is assumed to be 2 (32-bit).
 static avifResult avifParseSampleTransformTokens(avifROStream * s, avifSampleTransformExpression * expression)
 {
@@ -2335,7 +2328,6 @@
     AVIF_CHECKERR(avifPropertyArrayFind(&item->properties, "clap") == NULL, AVIF_RESULT_NOT_IMPLEMENTED);
     return AVIF_RESULT_OK;
 }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 // Extracts the codecType from the item type or from its children.
 // Also parses and outputs grid information if the item is a grid.
@@ -2376,9 +2368,8 @@
         *codecType = avifGetCodecType(item->type);
         AVIF_ASSERT_OR_RETURN(*codecType != AVIF_CODEC_TYPE_UNKNOWN);
     }
-    // TODO(yguyon): If AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM is defined, backward-incompatible
-    //               files with a primary 'sato' Sample Transform derived image item could be
-    //               handled here (compared to backward-compatible files with a 'sato' item in the
+    // TODO(yguyon): Backward-incompatible files with a primary 'sato' Sample Transform derived image item
+    //               could be handled here (compared to backward-compatible files with a 'sato' item in the
     //               same 'altr' group as the primary regular color item which are handled in
     //               avifDecoderDataFindSampleTransformImageItem() below).
     return AVIF_RESULT_OK;
@@ -5302,13 +5293,11 @@
         if (data->tileInfos[c].tileCount > 0) {
             ++numImageBuffers;
         }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         // The sample operations require multiple buffers for compositing so no plane is stolen
         // when there is a 'sato' Sample Transform derived image item.
         if (c >= AVIF_SAMPLE_TRANSFORM_MIN_CATEGORY && c <= AVIF_SAMPLE_TRANSFORM_MAX_CATEGORY && data->tileInfos[c].tileCount > 0) {
             continue;
         }
-#endif
         if (data->tileInfos[c].tileCount == 1) {
             ++numStolenImageBuffers;
         }
@@ -5880,7 +5869,6 @@
     return AVIF_RESULT_OK;
 }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 // Finds a 'sato' Sample Transform derived image item box.
 // If found, fills 'sampleTransformItem'. Otherwise, sets 'sampleTransformItem' to NULL.
 // Returns AVIF_RESULT_OK on success (whether or not a 'sato' box was found).
@@ -5903,7 +5891,6 @@
     *sampleTransformItem = NULL;
     return AVIF_RESULT_OK;
 }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 static avifResult avifDecoderGenerateImageTiles(avifDecoder * decoder, avifTileInfo * info, avifDecoderItem * item, avifItemCategory itemCategory)
 {
@@ -6218,7 +6205,6 @@
             }
         }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         // AVIF_ITEM_SAMPLE_TRANSFORM (not used through mainItems because not a coded item (well grids are not coded items either but it's different)).
         avifDecoderItem * sampleTransformItem = NULL;
         AVIF_CHECKRES(avifDecoderDataFindSampleTransformImageItem(data, &sampleTransformItem));
@@ -6317,7 +6303,6 @@
             AVIF_ASSERT_OR_RETURN(pixiProp != NULL);
             data->meta->sampleTransformDepth = pixiProp->u.pixi.planeDepths[0];
         }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
         // Find Exif and/or XMP metadata, if any
         AVIF_CHECKRES(avifDecoderFindMetadata(decoder, data->meta, decoder->image, mainItems[AVIF_ITEM_COLOR]->id));
@@ -6497,12 +6482,10 @@
     }
 
     AVIF_CHECKRES(avifReadCodecConfigProperty(decoder->image, colorProperties, colorCodecType));
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (decoder->data->meta->sampleTransformExpression.count > 0) {
         AVIF_ASSERT_OR_RETURN(decoder->data->meta->sampleTransformDepth != 0);
         decoder->image->depth = decoder->data->meta->sampleTransformDepth;
     }
-#endif
 
     // Expose as raw bytes all other properties that libavif does not care about.
     for (size_t i = 0; i < colorProperties->count; ++i) {
@@ -6596,11 +6579,9 @@
     if (itemCategory == AVIF_ITEM_GAIN_MAP) {
         return AVIF_RESULT_DECODE_GAIN_MAP_FAILED;
     }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (itemCategory >= AVIF_SAMPLE_TRANSFORM_MIN_CATEGORY && itemCategory <= AVIF_SAMPLE_TRANSFORM_MAX_CATEGORY) {
         return AVIF_RESULT_DECODE_SAMPLE_TRANSFORM_FAILED;
     }
-#endif
     return avifIsAlpha(itemCategory) ? AVIF_RESULT_DECODE_ALPHA_FAILED : AVIF_RESULT_DECODE_COLOR_FAILED;
 }
 
@@ -6673,7 +6654,6 @@
 
         const avifBool isGrid = (info->grid.rows > 0) && (info->grid.columns > 0);
         avifBool stealPlanes = !isGrid;
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         if (decoder->data->meta->sampleTransformExpression.count > 0) {
             // Keep everything as a copy for now.
             stealPlanes = AVIF_FALSE;
@@ -6684,7 +6664,6 @@
             // The expression will be applied in avifDecoderNextImage() below instead, once all the tiles are available.
             continue;
         }
-#endif
 
         if (!stealPlanes) {
             avifImage * dstImage = decoder->image;
@@ -6746,7 +6725,6 @@
     return AVIF_TRUE;
 }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 static avifResult avifDecoderApplySampleTransform(const avifDecoder * decoder, avifImage * dstImage)
 {
     if (dstImage->depth != decoder->data->meta->sampleTransformDepth) {
@@ -6802,7 +6780,6 @@
     }
     return AVIF_RESULT_OK;
 }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 avifResult avifDecoderNextImage(avifDecoder * decoder)
 {
@@ -6872,12 +6849,10 @@
         AVIF_ASSERT_OR_RETURN(prepareTileResult[c] == AVIF_RESULT_OK);
     }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (decoder->data->meta->sampleTransformExpression.count > 0) {
         // TODO(yguyon): Add a field in avifDecoder and only perform sample transformations upon request.
         AVIF_CHECKRES(avifDecoderApplySampleTransform(decoder, decoder->image));
     }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
     // Only advance decoder->imageIndex once the image is completely decoded, so that
     // avifDecoderNthImage(decoder, decoder->imageIndex + 1) is equivalent to avifDecoderNextImage(decoder)
@@ -7030,12 +7005,10 @@
         return 0;
     }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (decoder->data->meta->sampleTransformExpression.count > 0) {
         // TODO(yguyon): Support incremental Sample Transforms
         return 0;
     }
-#endif
 
     if ((info->grid.rows > 0) && (info->grid.columns > 0)) {
         // Grid of AVIF tiles (not to be confused with AV1 tiles).
diff --git a/src/write.c b/src/write.c
index 1720bc7..28eefa3 100644
--- a/src/write.c
+++ b/src/write.c
@@ -496,9 +496,7 @@
     encoder->headerFormat = AVIF_HEADER_DEFAULT;
     encoder->creationTime = 0;
     encoder->modificationTime = 0;
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     encoder->sampleTransformRecipe = AVIF_SAMPLE_TRANSFORM_NONE;
-#endif
     return encoder;
 }
 
@@ -541,9 +539,7 @@
     encoder->data->lastTileRowsLog2 = encoder->data->tileRowsLog2;
     encoder->data->lastTileColsLog2 = encoder->data->tileColsLog2;
     lastEncoder->scalingMode = encoder->scalingMode;
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     lastEncoder->sampleTransformRecipe = encoder->sampleTransformRecipe;
-#endif
 }
 
 // This function detects changes made on avifEncoder. It returns true on success (i.e., if every
@@ -597,11 +593,9 @@
         *encoderChanges |= AVIF_ENCODER_CHANGE_CODEC_SPECIFIC;
     }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (lastEncoder->sampleTransformRecipe != encoder->sampleTransformRecipe) {
         return AVIF_FALSE;
     }
-#endif
 
     return AVIF_TRUE;
 }
@@ -1067,7 +1061,6 @@
     return AVIF_RESULT_OK;
 }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 static avifResult avifEncoderWriteSampleTransformTokens(avifRWStream * s, const avifSampleTransformExpression * expression)
 {
     AVIF_ASSERT_OR_RETURN(expression->count <= 255);
@@ -1112,7 +1105,6 @@
     avifRWStreamFinishWrite(&s);
     return AVIF_RESULT_OK;
 }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 static avifResult avifEncoderDataCreateExifItem(avifEncoderData * data, const avifRWData * exif)
 {
@@ -1230,9 +1222,7 @@
 static const char infeNameColor[] = "Color";
 static const char infeNameAlpha[] = "Alpha";
 static const char infeNameGainMap[] = "GMap";
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 static const char infeNameSampleTransform[] = "SampleTransform";
-#endif
 
 static const char * getInfeName(avifItemCategory itemCategory)
 {
@@ -1242,11 +1232,9 @@
     if (itemCategory == AVIF_ITEM_GAIN_MAP) {
         return infeNameGainMap;
     }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (itemCategory >= AVIF_SAMPLE_TRANSFORM_MIN_CATEGORY && itemCategory <= AVIF_SAMPLE_TRANSFORM_MAX_CATEGORY) {
         return infeNameSampleTransform;
     }
-#endif
     return infeNameColor;
 }
 
@@ -1297,7 +1285,6 @@
     return AVIF_RESULT_OK;
 }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 static avifResult avifEncoderCreateBitDepthExtensionItems(avifEncoder * encoder,
                                                           uint32_t gridCols,
                                                           uint32_t gridRows,
@@ -1546,7 +1533,6 @@
     }
     return result;
 }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 static avifCodecType avifEncoderGetCodecType(const avifEncoder * encoder)
 {
@@ -1590,12 +1576,10 @@
     if (itemCategory == AVIF_ITEM_GAIN_MAP) {
         return AVIF_RESULT_ENCODE_GAIN_MAP_FAILED;
     }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (itemCategory == AVIF_ITEM_SAMPLE_TRANSFORM ||
         (itemCategory >= AVIF_SAMPLE_TRANSFORM_MIN_CATEGORY && itemCategory <= AVIF_SAMPLE_TRANSFORM_MAX_CATEGORY)) {
         return AVIF_RESULT_ENCODE_SAMPLE_TRANSFORM_FAILED;
     }
-#endif
     return avifIsAlpha(itemCategory) ? AVIF_RESULT_ENCODE_ALPHA_FAILED : AVIF_RESULT_ENCODE_COLOR_FAILED;
 }
 
@@ -1724,13 +1708,9 @@
 
     const avifImage * firstCell = cellImages[0];
     const avifImage * bottomRightCell = cellImages[cellCount - 1];
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     AVIF_CHECKERR(firstCell->depth == 8 || firstCell->depth == 10 || firstCell->depth == 12 ||
                       (firstCell->depth == 16 && encoder->sampleTransformRecipe != AVIF_SAMPLE_TRANSFORM_NONE),
                   AVIF_RESULT_UNSUPPORTED_DEPTH);
-#else
-    AVIF_CHECKERR(firstCell->depth == 8 || firstCell->depth == 10 || firstCell->depth == 12, AVIF_RESULT_UNSUPPORTED_DEPTH);
-#endif
     AVIF_CHECKERR(firstCell->yuvFormat != AVIF_PIXEL_FORMAT_NONE, AVIF_RESULT_NO_YUV_FORMAT_SELECTED);
     if (!firstCell->width || !firstCell->height || !bottomRightCell->width || !bottomRightCell->height) {
         return AVIF_RESULT_NO_CONTENT;
@@ -1961,7 +1941,6 @@
             gainMapItem->dimgFromID = toneMappedItemID;
         }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         if (encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ||
             encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_4B ||
             encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B) {
@@ -1972,7 +1951,6 @@
         } else {
             AVIF_CHECKERR(encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_NONE, AVIF_RESULT_NOT_IMPLEMENTED);
         }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
         // -----------------------------------------------------------------------
         // Create metadata items (Exif, XMP)
@@ -2066,7 +2044,6 @@
                             : (item->itemCategory == AVIF_ITEM_GAIN_MAP) ? encoder->data->quantizerGainMap
                                                                          : encoder->data->quantizer;
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
             // Remember original quantizer values in case they change, to reset them afterwards.
             int * encoderMinQuantizer = isAlpha ? &encoder->minQuantizerAlpha : &encoder->minQuantizer;
             int * encoderMaxQuantizer = isAlpha ? &encoder->maxQuantizerAlpha : &encoder->maxQuantizer;
@@ -2099,7 +2076,6 @@
                 cellImagePlaceholder = sampleTransformedImage; // Transfer ownership.
                 cellImage = cellImagePlaceholder;
             }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
             // If alpha channel is present, set disableLaggedOutput to AVIF_TRUE. If the encoder supports it, this enables
             // avifEncoderDataShouldForceKeyframeForAlpha to force a keyframe in the alpha channel whenever a keyframe has been
@@ -2115,14 +2091,12 @@
                                                                /*disableLaggedOutput=*/encoder->data->alphaPresent,
                                                                addImageFlags,
                                                                item->encodeOutput);
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
             // Revert quality settings if they changed.
             if (*encoderMinQuantizer != originalMinQuantizer || *encoderMaxQuantizer != originalMaxQuantizer) {
                 avifEncoderBackupSettings(encoder); // Remember last encoding settings for next avifEncoderDetectChanges().
                 *encoderMinQuantizer = originalMinQuantizer;
                 *encoderMaxQuantizer = originalMaxQuantizer;
             }
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
             if (cellImagePlaceholder) {
                 avifImageDestroy(cellImagePlaceholder);
             }
@@ -2366,11 +2340,9 @@
         return AVIF_FALSE;
     }
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
     if (encoder->sampleTransformRecipe != AVIF_SAMPLE_TRANSFORM_NONE) {
         return AVIF_FALSE;
     }
-#endif
 
     // Check for maximum field values and maximum chunk sizes.
 
@@ -2881,12 +2853,10 @@
         if (isToneMappedImage) {
             hasIpmaToWrite = AVIF_TRUE;
         }
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         const avifBool isSampleTransformImage = !memcmp(item->type, "sato", 4);
         if (isSampleTransformImage) {
             hasIpmaToWrite = AVIF_TRUE;
         }
-#endif
         item->associations.count = 0;
         if (!hasIpmaToWrite) {
             continue;
@@ -2959,7 +2929,6 @@
         }
         const avifBool isAlpha = avifIsAlpha(item->itemCategory);
         uint8_t depth = (uint8_t)itemMetadata->depth;
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
         if (encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ||
             encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_4B ||
             encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B) {
@@ -2981,7 +2950,7 @@
             AVIF_CHECKERR(encoder->sampleTransformRecipe == AVIF_SAMPLE_TRANSFORM_NONE, AVIF_RESULT_NOT_IMPLEMENTED);
         }
         assert(isSampleTransformImage == (item->itemCategory == AVIF_ITEM_SAMPLE_TRANSFORM));
-#endif // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
+
         if (hasPixi) {
             avifItemPropertyDedupStart(dedup);
             uint8_t channelCount = (isAlpha || (itemMetadata->yuvFormat == AVIF_PIXEL_FORMAT_YUV400)) ? 1 : 3;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 329af41..dab2c74 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -75,11 +75,7 @@
 endif()
 
 if(AVIF_GTEST)
-    if(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-        add_avif_gtest_with_data(avif16bittest)
-        add_avif_gtest(avifsampletransformtest)
-    endif()
-
+    add_avif_gtest_with_data(avif16bittest)
     add_avif_gtest(avifallocationtest)
     add_avif_gtest_with_data(avifalphanoispetest)
     add_avif_gtest(avifalphapremtest)
@@ -132,6 +128,7 @@
     add_avif_gtest(avifrgbtest)
     add_avif_gtest(avifrgbtoyuvtest)
     add_avif_gtest(avifrgbtoyuvthreadingtest)
+    add_avif_gtest(avifsampletransformtest)
     add_avif_gtest_with_data(avifscaletest)
     add_avif_gtest_with_data(avifsize0test)
     add_avif_gtest(avifstreamtest)
@@ -146,12 +143,21 @@
     add_avif_gtest(avify4mtest)
 
     if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE)
-        # These tests are supported with aom being the encoder. If the aom encoder is unavailable,
-        # these tests are disabled because other codecs may not implement all the necessary features.
-        # For example, SVT-AV1 requires 4:2:0 images with even dimensions of at least 64x64 px.
         set_tests_properties(
-            avifallocationtest avifgridapitest avifincrtest aviflosslesstest avifmetadatatest avifpixitest PROPERTIES DISABLED
-                                                                                                                      True
+            # These tests are supported with aom being the encoder. If the aom encoder is unavailable,
+            # these tests are disabled because other codecs may not implement all the necessary features.
+            # For example, SVT-AV1 requires 4:2:0 images with even dimensions of at least 64x64 px.
+            avifallocationtest
+            avifgridapitest
+            avifincrtest
+            aviflosslesstest
+            avifmetadatatest
+            avifpixitest
+            # rav1e and svt do not support encoder changes (potentially different bit depth between
+            # primary item and bit depth extension).
+            avif16bittest
+            avifaltrtest
+            PROPERTIES DISABLED True
         )
 
         message(STATUS "Some tests are disabled because aom is unavailable for encoding.")
@@ -328,6 +334,7 @@
         set_tests_properties(aviftest PROPERTIES DISABLED True)
         if(AVIF_GTEST)
             set_tests_properties(
+                avif16bittest
                 avifallocationtest
                 avifaltrtest
                 avifbasictest
@@ -356,9 +363,6 @@
             if(AVIF_ENABLE_JPEG_GAIN_MAP_CONVERSION)
                 set_tests_properties(avifjpeggainmaptest PROPERTIES DISABLED True)
             endif()
-            if(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-                set_tests_properties(avif16bittest PROPERTIES DISABLED True)
-            endif()
         endif()
 
         if(AVIF_BUILD_APPS)
diff --git a/tests/gtest/avifaltrtest.cc b/tests/gtest/avifaltrtest.cc
index cd40b5e..2889504 100644
--- a/tests/gtest/avifaltrtest.cc
+++ b/tests/gtest/avifaltrtest.cc
@@ -11,12 +11,6 @@
 #include "aviftest_helpers.h"
 #include "gtest/gtest.h"
 
-#if !defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
-// Make sure this test is compiled with
-// AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM enabled when libavif is.
-enum avifSampleTransformRecipe {};  // Redefinition error otherwise.
-#endif
-
 namespace avif {
 namespace {
 
@@ -25,7 +19,6 @@
 
 //------------------------------------------------------------------------------
 
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
 // Verifies that avifDecoderParse() takes the 'sato' image item from the same
 // 'atlr' group as the primary item into account.
 TEST(AltrTest, SampleTransformDepthEqualToInput) {
@@ -57,7 +50,6 @@
   // std::ofstream("weld_sato_12B_8B_q0.avif", std::ios::binary)
   //     .write(reinterpret_cast<char*>(encoded.data), encoded.size);
 }
-#endif  // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
 // Verifies that avifDecoderNextImage() returns the same sample bit depth as
 // avifDecoderParse().
@@ -72,11 +64,7 @@
 
   ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
   const uint32_t depth = decoder->image->depth;
-#if defined(AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM)
   EXPECT_EQ(depth, 16);
-#else
-  EXPECT_EQ(depth, 12);
-#endif  // AVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM
 
   ASSERT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
   EXPECT_EQ(decoder->image->depth, depth);
diff --git a/tests/test_all_configurations.sh b/tests/test_all_configurations.sh
index e9a95ec..14d479d 100755
--- a/tests/test_all_configurations.sh
+++ b/tests/test_all_configurations.sh
@@ -33,7 +33,6 @@
        -DAVIF_ENABLE_NODISCARD=ON \
        -DAVIF_ENABLE_WERROR=ON \
        -DAVIF_ENABLE_EXPERIMENTAL_MINI=${EXPERIMENTAL} \
-       -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=${EXPERIMENTAL} \
        -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=${EXPERIMENTAL} \
        -DAVIF_BUILD_APPS=ON -DAVIF_BUILD_EXAMPLES=ON \
        -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL \
@@ -55,7 +54,6 @@
          -DAVIF_ENABLE_NODISCARD=ON \
          -DAVIF_ENABLE_WERROR=ON \
          -DAVIF_ENABLE_EXPERIMENTAL_MINI=${EXPERIMENTAL} \
-         -DAVIF_ENABLE_EXPERIMENTAL_SAMPLE_TRANSFORM=${EXPERIMENTAL} \
          -DAVIF_ENABLE_EXPERIMENTAL_EXTENDED_PIXI=${EXPERIMENTAL} \
          -DAVIF_BUILD_APPS=ON -DAVIF_BUILD_EXAMPLES=ON \
          -DAVIF_BUILD_TESTS=ON -DAVIF_GTEST=LOCAL \