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