Range (limited/full) cleanup and refactor
* Having two enums that meant the same thing but had slightly different values was awful
* No need to lose type safety in avifNclxColorProfile for read convenience
* This is a breaking change, but hopefully easy for maintainers to adjust to
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 08d4a83..b05b7e9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,9 @@
### Added
- Added simple `avifdump` tool for aiding in AVIF debugging
+### Changed
+- avifRange cleanup/refactor
+
## [0.6.4] - 2020-04-14
### Added
- Added `avifDecoderNthImageTiming()` for querying frame timing without needing to decode the frame
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 2ed8cd4..c9561fd 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -31,7 +31,7 @@
printf(" P = enum avifNclxColourPrimaries\n");
printf(" T = enum avifNclxTransferCharacteristics\n");
printf(" M = enum avifNclxMatrixCoefficients\n");
- printf(" R = avifNclxRangeFlag (any nonzero value becomes AVIF_NCLX_FULL_RANGE)\n");
+ printf(" R = range (0 = limited range, nonzero = full range)\n");
printf(" --min Q : Set min quantizer for color (%d-%d, where %d is lossless)\n",
AVIF_QUANTIZER_BEST_QUALITY,
AVIF_QUANTIZER_WORST_QUALITY,
@@ -99,7 +99,7 @@
nclx->colourPrimaries = (uint16_t)values[0];
nclx->transferCharacteristics = (uint16_t)values[1];
nclx->matrixCoefficients = (uint16_t)values[2];
- nclx->fullRangeFlag = values[3] ? AVIF_NCLX_FULL_RANGE : AVIF_NCLX_LIMITED_RANGE;
+ nclx->range = values[3] ? AVIF_RANGE_FULL : AVIF_RANGE_LIMITED;
return AVIF_TRUE;
}
return AVIF_FALSE;
diff --git a/apps/shared/avifutil.c b/apps/shared/avifutil.c
index db7dee9..91d0add 100644
--- a/apps/shared/avifutil.c
+++ b/apps/shared/avifutil.c
@@ -24,7 +24,7 @@
avif->nclx.colourPrimaries,
avif->nclx.transferCharacteristics,
avif->nclx.matrixCoefficients,
- avif->nclx.fullRangeFlag ? "Full" : "Limited");
+ (avif->nclx.range == AVIF_RANGE_FULL) ? "Full" : "Limited");
break;
}
diff --git a/apps/shared/y4m.c b/apps/shared/y4m.c
index 85d58bc..0e326e3 100644
--- a/apps/shared/y4m.c
+++ b/apps/shared/y4m.c
@@ -157,7 +157,7 @@
int depth = -1;
avifBool hasAlpha = AVIF_FALSE;
avifPixelFormat format = AVIF_PIXEL_FORMAT_NONE;
- avifNclxRangeFlag rangeFlag = AVIF_NCLX_LIMITED_RANGE;
+ avifRange range = AVIF_RANGE_LIMITED;
while (p != end) {
switch (*p) {
case 'W': // width
@@ -182,7 +182,7 @@
goto cleanup;
}
if (!strcmp(tmpBuffer, "XCOLORRANGE=FULL")) {
- rangeFlag = AVIF_NCLX_FULL_RANGE;
+ range = AVIF_RANGE_FULL;
}
break;
default:
@@ -238,7 +238,7 @@
avif->height = height;
avif->depth = depth;
avif->yuvFormat = format;
- avif->yuvRange = (rangeFlag == AVIF_NCLX_LIMITED_RANGE) ? AVIF_RANGE_LIMITED : AVIF_RANGE_FULL;
+ avif->yuvRange = range;
avifImageAllocatePlanes(avif, AVIF_PLANES_YUV);
avifPixelFormatInfo info;
@@ -364,7 +364,7 @@
}
const char * rangeString = "XCOLORRANGE=FULL";
- if ((avif->profileFormat == AVIF_PROFILE_FORMAT_NCLX) && !avif->nclx.fullRangeFlag) {
+ if ((avif->yuvRange == AVIF_RANGE_LIMITED)) {
rangeString = "XCOLORRANGE=LIMITED";
}
diff --git a/include/avif/avif.h b/include/avif/avif.h
index 0516fac..d59151e 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -146,6 +146,15 @@
void avifGetPixelFormatInfo(avifPixelFormat format, avifPixelFormatInfo * info);
// ---------------------------------------------------------------------------
+// avifRange
+
+typedef enum avifRange
+{
+ AVIF_RANGE_LIMITED = 0,
+ AVIF_RANGE_FULL = 0x80
+} avifRange;
+
+// ---------------------------------------------------------------------------
// avifNclxColorProfile
typedef enum avifNclxColourPrimaries
@@ -234,31 +243,15 @@
AVIF_NCLX_MATRIX_COEFFICIENTS_ICTCP = 14
} avifNclxMatrixCoefficients;
-// for fullRangeFlag
-typedef enum avifNclxRangeFlag
-{
- AVIF_NCLX_LIMITED_RANGE = 0,
- AVIF_NCLX_FULL_RANGE = 0x80
-} avifNclxRangeFlag;
-
typedef struct avifNclxColorProfile
{
- uint16_t colourPrimaries;
- uint16_t transferCharacteristics;
- uint16_t matrixCoefficients;
- uint8_t fullRangeFlag;
+ avifNclxColourPrimaries colourPrimaries;
+ avifNclxTransferCharacteristics transferCharacteristics;
+ avifNclxMatrixCoefficients matrixCoefficients;
+ avifRange range;
} avifNclxColorProfile;
// ---------------------------------------------------------------------------
-// avifRange
-
-typedef enum avifRange
-{
- AVIF_RANGE_LIMITED = 0,
- AVIF_RANGE_FULL,
-} avifRange;
-
-// ---------------------------------------------------------------------------
// avifProfileFormat
typedef enum avifProfileFormat
diff --git a/src/codec_aom.c b/src/codec_aom.c
index 1f131cd..640f56a 100644
--- a/src/codec_aom.c
+++ b/src/codec_aom.c
@@ -142,7 +142,7 @@
nclx.colourPrimaries = (uint16_t)codec->internal->image->cp;
nclx.transferCharacteristics = (uint16_t)codec->internal->image->tc;
nclx.matrixCoefficients = (uint16_t)codec->internal->image->mc;
- nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+ nclx.range = image->yuvRange;
avifImageSetProfileNCLX(image, &nclx);
}
diff --git a/src/codec_dav1d.c b/src/codec_dav1d.c
index d3c45bf..fef0642 100644
--- a/src/codec_dav1d.c
+++ b/src/codec_dav1d.c
@@ -150,7 +150,7 @@
nclx.colourPrimaries = (uint16_t)dav1dImage->seq_hdr->pri;
nclx.transferCharacteristics = (uint16_t)dav1dImage->seq_hdr->trc;
nclx.matrixCoefficients = (uint16_t)dav1dImage->seq_hdr->mtrx;
- nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+ nclx.range = image->yuvRange;
avifImageSetProfileNCLX(image, &nclx);
}
diff --git a/src/codec_libgav1.c b/src/codec_libgav1.c
index eb61c97..547138e 100644
--- a/src/codec_libgav1.c
+++ b/src/codec_libgav1.c
@@ -112,7 +112,7 @@
nclx.colourPrimaries = (uint16_t)gav1Image->color_primary;
nclx.transferCharacteristics = (uint16_t)gav1Image->transfer_characteristics;
nclx.matrixCoefficients = (uint16_t)gav1Image->matrix_coefficients;
- nclx.fullRangeFlag = (image->yuvRange == AVIF_RANGE_LIMITED) ? AVIF_NCLX_LIMITED_RANGE : AVIF_NCLX_FULL_RANGE;
+ nclx.range = image->yuvRange;
avifImageSetProfileNCLX(image, &nclx);
}
diff --git a/src/read.c b/src/read.c
index 882a689..bae84cd 100644
--- a/src/read.c
+++ b/src/read.c
@@ -576,8 +576,7 @@
((tileProfile == AVIF_PROFILE_FORMAT_NCLX) &&
((tile->image->profileFormat != tileProfile) || (tile->image->nclx.colourPrimaries != tileNCLX->colourPrimaries) ||
(tile->image->nclx.transferCharacteristics != tileNCLX->transferCharacteristics) ||
- (tile->image->nclx.matrixCoefficients != tileNCLX->matrixCoefficients) ||
- (tile->image->nclx.fullRangeFlag != tileNCLX->fullRangeFlag)))) {
+ (tile->image->nclx.matrixCoefficients != tileNCLX->matrixCoefficients) || (tile->image->nclx.range != tileNCLX->range)))) {
return AVIF_FALSE;
}
}
@@ -848,16 +847,21 @@
data->properties.prop[propertyIndex].colr.icc = avifROStreamCurrent(&s);
data->properties.prop[propertyIndex].colr.iccSize = avifROStreamRemainingBytes(&s);
} else if (!memcmp(colourType, "nclx", 4)) {
+ uint16_t tmp16;
// unsigned int(16) colour_primaries;
- CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.colourPrimaries));
+ CHECK(avifROStreamReadU16(&s, &tmp16));
+ data->properties.prop[propertyIndex].colr.nclx.colourPrimaries = (avifNclxColourPrimaries)tmp16;
// unsigned int(16) transfer_characteristics;
- CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.transferCharacteristics));
+ CHECK(avifROStreamReadU16(&s, &tmp16));
+ data->properties.prop[propertyIndex].colr.nclx.transferCharacteristics = (avifNclxTransferCharacteristics)tmp16;
// unsigned int(16) matrix_coefficients;
- CHECK(avifROStreamReadU16(&s, &data->properties.prop[propertyIndex].colr.nclx.matrixCoefficients));
+ CHECK(avifROStreamReadU16(&s, &tmp16));
+ data->properties.prop[propertyIndex].colr.nclx.matrixCoefficients = (avifNclxMatrixCoefficients)tmp16;
// unsigned int(1) full_range_flag;
// unsigned int(7) reserved = 0;
- CHECK(avifROStreamRead(&s, &data->properties.prop[propertyIndex].colr.nclx.fullRangeFlag, 1));
- data->properties.prop[propertyIndex].colr.nclx.fullRangeFlag |= 0x80;
+ uint8_t tmp8;
+ CHECK(avifROStreamRead(&s, &tmp8, 1));
+ data->properties.prop[propertyIndex].colr.nclx.range = (avifRange)(tmp8 | 0x80);
data->properties.prop[propertyIndex].colr.format = AVIF_PROFILE_FORMAT_NCLX;
}
return AVIF_TRUE;
diff --git a/src/write.c b/src/write.c
index d50436d..41b3865 100644
--- a/src/write.c
+++ b/src/write.c
@@ -401,7 +401,7 @@
avifRWStreamWriteU16(&s, item->image->nclx.colourPrimaries); // unsigned int(16) colour_primaries;
avifRWStreamWriteU16(&s, item->image->nclx.transferCharacteristics); // unsigned int(16) transfer_characteristics;
avifRWStreamWriteU16(&s, item->image->nclx.matrixCoefficients); // unsigned int(16) matrix_coefficients;
- avifRWStreamWriteU8(&s, item->image->nclx.fullRangeFlag & 0x80); // unsigned int(1) full_range_flag;
+ avifRWStreamWriteU8(&s, item->image->nclx.range & 0x80); // unsigned int(1) full_range_flag;
// unsigned int(7) reserved = 0;
avifRWStreamFinishBox(&s, colr);
ipmaPush(&item->ipma, ++itemPropertyIndex);