#ifndef AVIF_INTERNAL_H
#define AVIF_INTERNAL_H
#include "avif/avif.h"
#ifdef __cplusplus
extern "C" {
#endif
#define AVIF_CLAMP(x, low, high) (((x) < (low)) ? (low) : (((high) < (x)) ? (high) : (x)))
#define AVIF_MIN(a, b) (((a) < (b)) ? (a) : (b))
#define AVIF_MAX(a, b) (((a) > (b)) ? (a) : (b))
#define AVIF_CHECK(A) \
do { \
if (!(A)) \
return AVIF_FALSE; \
} while (0)
#define AVIF_CHECKERR(A, ERR) \
do { \
if (!(A)) \
return ERR; \
} while (0)
#define AVIF_CHECKRES(A) \
do { \
const avifResult result__ = (A); \
if (result__ != AVIF_RESULT_OK) \
return result__; \
} while (0)
#define AVIF_URN_ALPHA0 "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha"
#define AVIF_URN_ALPHA1 "urn:mpeg:hevc:2015:auxid:1"
#define AVIF_CONTENT_TYPE_XMP "application/rdf+xml"
float avifRoundf(float v);
uint16_t avifHTONS(uint16_t s);
uint16_t avifNTOHS(uint16_t s);
uint16_t avifCTOHS(uint16_t s);
uint32_t avifHTONL(uint32_t l);
uint32_t avifNTOHL(uint32_t l);
uint32_t avifCTOHL(uint32_t l);
uint64_t avifHTON64(uint64_t l);
uint64_t avifNTOH64(uint64_t l);
void avifCalcYUVCoefficients(const avifImage * image, float * outR, float * outG, float * outB);
#define AVIF_ARRAY_DECLARE(TYPENAME, ITEMSTYPE, ITEMSNAME) \
typedef struct TYPENAME \
{ \
ITEMSTYPE * ITEMSNAME; \
uint32_t elementSize; \
uint32_t count; \
uint32_t capacity; \
} TYPENAME
avifBool avifArrayCreate(void * arrayStruct, uint32_t elementSize, uint32_t initialCapacity);
uint32_t avifArrayPushIndex(void * arrayStruct);
void * avifArrayPushPtr(void * arrayStruct);
void avifArrayPush(void * arrayStruct, void * element);
void avifArrayPop(void * arrayStruct);
void avifArrayDestroy(void * arrayStruct);
void avifFractionSimplify(avifFraction * f);
avifBool avifFractionCD(avifFraction * a, avifFraction * b);
avifBool avifFractionAdd(avifFraction a, avifFraction b, avifFraction * result);
avifBool avifFractionSub(avifFraction a, avifFraction b, avifFraction * result);
void avifImageSetDefaults(avifImage * image);
void avifImageCopyNoAlloc(avifImage * dstImage, const avifImage * srcImage);
void avifImageCopySamples(avifImage * dstImage, const avifImage * srcImage, avifPlanesFlags planes);
typedef struct avifAlphaParams
{
uint32_t width;
uint32_t height;
uint32_t srcDepth;
const uint8_t * srcPlane;
uint32_t srcRowBytes;
uint32_t srcOffsetBytes;
uint32_t srcPixelBytes;
uint32_t dstDepth;
uint8_t * dstPlane;
uint32_t dstRowBytes;
uint32_t dstOffsetBytes;
uint32_t dstPixelBytes;
} avifAlphaParams;
avifBool avifFillAlpha(const avifAlphaParams * params);
avifBool avifReformatAlpha(const avifAlphaParams * params);
typedef enum avifReformatMode
{
AVIF_REFORMAT_MODE_YUV_COEFFICIENTS = 0, AVIF_REFORMAT_MODE_IDENTITY, AVIF_REFORMAT_MODE_YCGCO, #if defined(AVIF_ENABLE_EXPERIMENTAL_YCGCO_R)
AVIF_REFORMAT_MODE_YCGCO_RE, AVIF_REFORMAT_MODE_YCGCO_RO, #endif
} avifReformatMode;
typedef enum avifAlphaMultiplyMode
{
AVIF_ALPHA_MULTIPLY_MODE_NO_OP = 0,
AVIF_ALPHA_MULTIPLY_MODE_MULTIPLY,
AVIF_ALPHA_MULTIPLY_MODE_UNMULTIPLY
} avifAlphaMultiplyMode;
typedef struct avifReformatState
{
float kr;
float kg;
float kb;
uint32_t yuvChannelBytes;
uint32_t rgbChannelBytes;
uint32_t rgbPixelBytes;
uint32_t rgbOffsetBytesR;
uint32_t rgbOffsetBytesG;
uint32_t rgbOffsetBytesB;
uint32_t rgbOffsetBytesA;
uint32_t yuvDepth;
avifRange yuvRange;
int yuvMaxChannel;
int rgbMaxChannel;
float rgbMaxChannelF;
float biasY; float biasUV; float rangeY; float rangeUV;
avifPixelFormatInfo formatInfo;
avifReformatMode mode;
} avifReformatState;
avifResult avifImageRGBToYUVLibYUV(avifImage * image, const avifRGBImage * rgb);
avifResult avifImageYUVToRGBLibYUV(const avifImage * image, avifRGBImage * rgb, avifBool reformatAlpha, avifBool * alphaReformattedWithLibYUV);
avifResult avifImageRGBToYUVLibSharpYUV(avifImage * image, const avifRGBImage * rgb, const avifReformatState * state);
avifResult avifRGBImageToF16LibYUV(avifRGBImage * rgb);
avifResult avifRGBImagePremultiplyAlphaLibYUV(avifRGBImage * rgb);
avifResult avifRGBImageUnpremultiplyAlphaLibYUV(avifRGBImage * rgb);
avifBool avifDimensionsTooLarge(uint32_t width, uint32_t height, uint32_t imageSizeLimit, uint32_t imageDimensionLimit);
void avifSetTileConfiguration(int threads, uint32_t width, uint32_t height, int * tileRowsLog2, int * tileColsLog2);
avifBool avifImageScale(avifImage * image,
uint32_t dstWidth,
uint32_t dstHeight,
uint32_t imageSizeLimit,
uint32_t imageDimensionLimit,
avifDiagnostics * diag);
typedef enum avifItemCategory
{
AVIF_ITEM_COLOR = 0,
AVIF_ITEM_ALPHA = 1
} avifItemCategory;
avifBool avifAreGridDimensionsValid(avifPixelFormat yuvFormat, uint32_t imageW, uint32_t imageH, uint32_t tileW, uint32_t tileH, avifDiagnostics * diag);
avifResult avifImageExtractExifOrientationToIrotImir(avifImage * image);
#define AVIF_SPATIAL_ID_UNSET 0xff
typedef struct avifDecodeSample
{
avifROData data;
avifBool ownsData;
avifBool partialData;
uint32_t itemID; uint64_t offset; size_t size; uint8_t spatialID; avifBool sync; } avifDecodeSample;
AVIF_ARRAY_DECLARE(avifDecodeSampleArray, avifDecodeSample, sample);
typedef struct avifCodecDecodeInput
{
avifDecodeSampleArray samples;
avifBool allLayers; avifItemCategory itemCategory; } avifCodecDecodeInput;
avifCodecDecodeInput * avifCodecDecodeInputCreate(void);
void avifCodecDecodeInputDestroy(avifCodecDecodeInput * decodeInput);
typedef struct avifEncodeSample
{
avifRWData data;
avifBool sync; } avifEncodeSample;
AVIF_ARRAY_DECLARE(avifEncodeSampleArray, avifEncodeSample, sample);
typedef struct avifCodecEncodeOutput
{
avifEncodeSampleArray samples;
} avifCodecEncodeOutput;
avifCodecEncodeOutput * avifCodecEncodeOutputCreate(void);
avifResult avifCodecEncodeOutputAddSample(avifCodecEncodeOutput * encodeOutput, const uint8_t * data, size_t len, avifBool sync);
void avifCodecEncodeOutputDestroy(avifCodecEncodeOutput * encodeOutput);
typedef struct avifCodecSpecificOption
{
char * key; char * value; } avifCodecSpecificOption;
AVIF_ARRAY_DECLARE(avifCodecSpecificOptions, avifCodecSpecificOption, entries);
avifCodecSpecificOptions * avifCodecSpecificOptionsCreate(void);
void avifCodecSpecificOptionsClear(avifCodecSpecificOptions * csOptions);
void avifCodecSpecificOptionsDestroy(avifCodecSpecificOptions * csOptions);
avifResult avifCodecSpecificOptionsSet(avifCodecSpecificOptions * csOptions, const char * key, const char * value);
typedef enum avifCodecType
{
AVIF_CODEC_TYPE_UNKNOWN,
AVIF_CODEC_TYPE_AV1,
#if defined(AVIF_CODEC_AVM)
AVIF_CODEC_TYPE_AV2, #endif
} avifCodecType;
avifCodecType avifCodecTypeFromChoice(avifCodecChoice choice, avifCodecFlags requiredFlags);
struct avifCodec;
struct avifCodecInternal;
typedef enum avifEncoderChange
{
AVIF_ENCODER_CHANGE_MIN_QUANTIZER = (1u << 0),
AVIF_ENCODER_CHANGE_MAX_QUANTIZER = (1u << 1),
AVIF_ENCODER_CHANGE_MIN_QUANTIZER_ALPHA = (1u << 2),
AVIF_ENCODER_CHANGE_MAX_QUANTIZER_ALPHA = (1u << 3),
AVIF_ENCODER_CHANGE_TILE_ROWS_LOG2 = (1u << 4),
AVIF_ENCODER_CHANGE_TILE_COLS_LOG2 = (1u << 5),
AVIF_ENCODER_CHANGE_QUANTIZER = (1u << 6),
AVIF_ENCODER_CHANGE_QUANTIZER_ALPHA = (1u << 7),
AVIF_ENCODER_CHANGE_SCALING_MODE = (1u << 8),
AVIF_ENCODER_CHANGE_CODEC_SPECIFIC = (1u << 31)
} avifEncoderChange;
typedef uint32_t avifEncoderChanges;
typedef avifBool (*avifCodecGetNextImageFunc)(struct avifCodec * codec,
struct avifDecoder * decoder,
const avifDecodeSample * sample,
avifBool alpha,
avifBool * isLimitedRangeAlpha,
avifImage * image);
typedef avifResult (*avifCodecEncodeImageFunc)(struct avifCodec * codec,
avifEncoder * encoder,
const avifImage * image,
avifBool alpha,
int tileRowsLog2,
int tileColsLog2,
int quantizer,
avifEncoderChanges encoderChanges,
avifBool disableLaggedOutput,
avifAddImageFlags addImageFlags,
avifCodecEncodeOutput * output);
typedef avifBool (*avifCodecEncodeFinishFunc)(struct avifCodec * codec, avifCodecEncodeOutput * output);
typedef void (*avifCodecDestroyInternalFunc)(struct avifCodec * codec);
typedef struct avifCodec
{
avifCodecSpecificOptions * csOptions; struct avifCodecInternal * internal; avifDiagnostics * diag; uint8_t operatingPoint; avifBool allLayers;
avifCodecGetNextImageFunc getNextImage;
avifCodecEncodeImageFunc encodeImage;
avifCodecEncodeFinishFunc encodeFinish;
avifCodecDestroyInternalFunc destroyInternal;
} avifCodec;
avifCodec * avifCodecCreate(avifCodecChoice choice, avifCodecFlags requiredFlags);
void avifCodecDestroy(avifCodec * codec);
avifCodec * avifCodecCreateAOM(void); const char * avifCodecVersionAOM(void); avifCodec * avifCodecCreateDav1d(void); const char * avifCodecVersionDav1d(void); avifCodec * avifCodecCreateGav1(void); const char * avifCodecVersionGav1(void); avifCodec * avifCodecCreateRav1e(void); const char * avifCodecVersionRav1e(void); avifCodec * avifCodecCreateSvt(void); const char * avifCodecVersionSvt(void); avifCodec * avifCodecCreateAVM(void); const char * avifCodecVersionAVM(void);
#ifdef __clang__
__attribute__((__format__(__printf__, 2, 3)))
#endif
void avifDiagnosticsPrintf(avifDiagnostics * diag, const char * format, ...);
typedef size_t avifBoxMarker;
typedef struct avifBoxHeader
{
size_t size;
uint8_t type[4];
} avifBoxHeader;
typedef struct avifROStream
{
avifROData * raw;
size_t offset;
size_t numUsedBitsInPartialByte;
avifDiagnostics * diag;
const char * diagContext;
} avifROStream;
const uint8_t * avifROStreamCurrent(avifROStream * stream);
void avifROStreamStart(avifROStream * stream, avifROData * raw, avifDiagnostics * diag, const char * diagContext);
size_t avifROStreamOffset(const avifROStream * stream);
void avifROStreamSetOffset(avifROStream * stream, size_t offset);
avifBool avifROStreamHasBytesLeft(const avifROStream * stream, size_t byteCount);
size_t avifROStreamRemainingBytes(const avifROStream * stream);
avifBool avifROStreamSkip(avifROStream * stream, size_t byteCount);
avifBool avifROStreamRead(avifROStream * stream, uint8_t * data, size_t size);
avifBool avifROStreamReadU16(avifROStream * stream, uint16_t * v);
avifBool avifROStreamReadU16Endianness(avifROStream * stream, uint16_t * v, avifBool littleEndian);
avifBool avifROStreamReadU32(avifROStream * stream, uint32_t * v);
avifBool avifROStreamReadU32Endianness(avifROStream * stream, uint32_t * v, avifBool littleEndian);
avifBool avifROStreamReadUX8(avifROStream * stream, uint64_t * v, uint64_t factor); avifBool avifROStreamReadU64(avifROStream * stream, uint64_t * v);
avifBool avifROStreamReadString(avifROStream * stream, char * output, size_t outputSize);
avifBool avifROStreamReadBoxHeader(avifROStream * stream, avifBoxHeader * header); avifBool avifROStreamReadBoxHeaderPartial(avifROStream * stream, avifBoxHeader * header); avifBool avifROStreamReadVersionAndFlags(avifROStream * stream, uint8_t * version, uint32_t * flags); avifBool avifROStreamReadAndEnforceVersion(avifROStream * stream, uint8_t enforcedVersion); avifBool avifROStreamReadBits8(avifROStream * stream, uint8_t * v, size_t bitCount);
avifBool avifROStreamReadBits(avifROStream * stream, uint32_t * v, size_t bitCount);
avifBool avifROStreamReadVarInt(avifROStream * stream, uint32_t * v);
typedef struct avifRWStream
{
avifRWData * raw;
size_t offset;
size_t numUsedBitsInPartialByte;
} avifRWStream;
void avifRWStreamStart(avifRWStream * stream, avifRWData * raw);
size_t avifRWStreamOffset(const avifRWStream * stream);
void avifRWStreamSetOffset(avifRWStream * stream, size_t offset);
void avifRWStreamFinishWrite(avifRWStream * stream);
avifResult avifRWStreamWrite(avifRWStream * stream, const void * data, size_t size);
avifResult avifRWStreamWriteChars(avifRWStream * stream, const char * chars, size_t size);
avifResult avifRWStreamWriteBox(avifRWStream * stream, const char * type, size_t contentSize, avifBoxMarker * marker);
avifResult avifRWStreamWriteFullBox(avifRWStream * stream, const char * type, size_t contentSize, int version, uint32_t flags, avifBoxMarker * marker);
void avifRWStreamFinishBox(avifRWStream * stream, avifBoxMarker marker);
avifResult avifRWStreamWriteU8(avifRWStream * stream, uint8_t v);
avifResult avifRWStreamWriteU16(avifRWStream * stream, uint16_t v);
avifResult avifRWStreamWriteU32(avifRWStream * stream, uint32_t v);
avifResult avifRWStreamWriteU64(avifRWStream * stream, uint64_t v);
avifResult avifRWStreamWriteZeros(avifRWStream * stream, size_t byteCount);
avifResult avifRWStreamWriteBits(avifRWStream * stream, uint32_t v, size_t bitCount);
avifResult avifRWStreamWriteVarInt(avifRWStream * stream, uint32_t v);
#define AVIF_BOX_SIZE_TBD 0
typedef struct avifCodecConfigurationBox
{
uint8_t seqProfile; uint8_t seqLevelIdx0; uint8_t seqTier0; uint8_t highBitdepth; uint8_t twelveBit; uint8_t monochrome; uint8_t chromaSubsamplingX; uint8_t chromaSubsamplingY; uint8_t chromaSamplePosition;
} avifCodecConfigurationBox;
typedef struct avifSequenceHeader
{
uint8_t reduced_still_picture_header;
uint32_t maxWidth;
uint32_t maxHeight;
uint32_t bitDepth;
avifPixelFormat yuvFormat;
avifChromaSamplePosition chromaSamplePosition;
avifColorPrimaries colorPrimaries;
avifTransferCharacteristics transferCharacteristics;
avifMatrixCoefficients matrixCoefficients;
avifRange range;
avifCodecConfigurationBox av1C; } avifSequenceHeader;
avifBool avifSequenceHeaderParse(avifSequenceHeader * header, const avifROData * sample, avifCodecType codecType);
#define AVIF_INDEFINITE_DURATION64 UINT64_MAX
#define AVIF_INDEFINITE_DURATION32 UINT32_MAX
#ifdef __cplusplus
} #endif
#endif