rav1e codec support (encode-only), all codecs can coexist peacefully now, and can be queried for availability or specifically chosen at encode/decode time
diff --git a/include/avif/avif.h b/include/avif/avif.h
index 576587f..29cd4a3 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -335,6 +335,27 @@
 avifBool avifPrepareReformatState(avifImage * image, avifReformatState * state);
 
 // ---------------------------------------------------------------------------
+// Codec selection
+
+typedef enum avifCodecChoice
+{
+    AVIF_CODEC_CHOICE_AUTO = 0,
+    AVIF_CODEC_CHOICE_AOM,
+    AVIF_CODEC_CHOICE_DAV1D, // Decode only
+    AVIF_CODEC_CHOICE_RAV1E  // Encode only
+} avifCodecChoice;
+
+typedef enum avifCodecFlags
+{
+    AVIF_CODEC_FLAG_CAN_DECODE = (1 << 0),
+    AVIF_CODEC_FLAG_CAN_ENCODE = (1 << 1)
+} avifCodecFlags;
+
+// If this returns NULL, the codec choice/flag combination is unavailable
+const char * avifCodecName(avifCodecChoice choice, uint32_t requiredFlags);
+avifCodecChoice avifCodecChoiceFromName(const char * name);
+
+// ---------------------------------------------------------------------------
 // avifDecoder
 
 // Useful stats related to a read/write
@@ -375,6 +396,9 @@
 
 typedef struct avifDecoder
 {
+    // Defaults to AVIF_CODEC_CHOICE_AUTO: Preference determined by order in availableCodecs table (avif.c)
+    avifCodecChoice codecChoice;
+
     // avifs can have multiple sets of images in them. This specifies which to decode.
     // Set this via avifDecoderSetSource().
     avifDecoderSource requestedSource;
@@ -463,6 +487,9 @@
 //   Tiling values range [0-6], where the value indicates a request for 2^n tiles in that dimension.
 typedef struct avifEncoder
 {
+    // Defaults to AVIF_CODEC_CHOICE_AUTO: Preference determined by order in availableCodecs table (avif.c)
+    avifCodecChoice codecChoice;
+
     // settings
     int maxThreads;
     int minQuantizer;
diff --git a/include/avif/internal.h b/include/avif/internal.h
index 846a91d..a8de61c 100644
--- a/include/avif/internal.h
+++ b/include/avif/internal.h
@@ -145,12 +145,16 @@
     avifCodecDestroyInternalFunc destroyInternal;
 } avifCodec;
 
-const char * avifCodecVersionAOM(void);   // requires AVIF_CODEC_AOM
-avifCodec * avifCodecCreateAOM(void);     // requires AVIF_CODEC_AOM
-const char * avifCodecVersionDav1d(void); // requires AVIF_CODEC_DAV1D
-avifCodec * avifCodecCreateDav1d(void);   // requires AVIF_CODEC_DAV1D
+avifCodec * avifCodecCreate(avifCodecChoice choice, uint32_t requiredFlags);
 void avifCodecDestroy(avifCodec * codec);
 
+avifCodec * avifCodecCreateAOM(void);     // requires AVIF_CODEC_AOM (codec_aom.c)
+const char * avifCodecVersionAOM(void);   // requires AVIF_CODEC_AOM (codec_aom.c)
+avifCodec * avifCodecCreateDav1d(void);   // requires AVIF_CODEC_DAV1D (codec_dav1d.c)
+const char * avifCodecVersionDav1d(void); // requires AVIF_CODEC_DAV1D (codec_dav1d.c)
+avifCodec * avifCodecCreateRav1e(void);   // requires AVIF_CODEC_RAV1E (codec_rav1e.c)
+const char * avifCodecVersionRav1e(void); // requires AVIF_CODEC_RAV1E (codec_rav1e.c)
+
 // ---------------------------------------------------------------------------
 // avifStream