Skip to content

Commit 189f381

Browse files
remove AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS flag
1 parent 5851a6d commit 189f381

8 files changed

Lines changed: 44 additions & 35 deletions

File tree

include/avif/avif.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ typedef enum avifResult
147147
AVIF_RESULT_INVALID_ARGUMENT, // an argument passed into this function is invalid
148148
AVIF_RESULT_NOT_IMPLEMENTED, // a requested code path is not (yet) implemented
149149
AVIF_RESULT_OUT_OF_MEMORY,
150-
AVIF_RESULT_CANNOT_CHANGE_SETTING, // a setting that can't change is changed during encoding
150+
AVIF_RESULT_CANNOT_CHANGE_SETTING // a setting that can't change is changed during encoding
151151
} avifResult;
152152

153153
AVIF_API const char * avifResultToString(avifResult result);
@@ -1084,10 +1084,6 @@ typedef enum avifAddImageFlag
10841084
// tweaks various compression rules. This is enabled automatically when using the
10851085
// avifEncoderWrite() single-image encode path.
10861086
AVIF_ADD_IMAGE_FLAG_SINGLE = (1 << 1),
1087-
1088-
// Use this flag to update encode settings of AV1 encoder.
1089-
// This is enabled automatically if encoder settings is changed.
1090-
AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS = (1 << 2)
10911087
} avifAddImageFlag;
10921088
typedef uint32_t avifAddImageFlags;
10931089

include/avif/internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ typedef avifResult (*avifCodecEncodeImageFunc)(struct avifCodec * codec,
265265
avifEncoder * encoder,
266266
const avifImage * image,
267267
avifBool alpha,
268+
avifBool updateConfig,
268269
avifAddImageFlags addImageFlags,
269270
avifCodecEncodeOutput * output);
270271
typedef avifBool (*avifCodecEncodeFinishFunc)(struct avifCodec * codec, avifCodecEncodeOutput * output);

src/avif.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ const char * avifResultToString(avifResult result)
9696
case AVIF_RESULT_INVALID_ARGUMENT: return "Invalid argument";
9797
case AVIF_RESULT_NOT_IMPLEMENTED: return "Not implemented";
9898
case AVIF_RESULT_OUT_OF_MEMORY: return "Out of memory";
99-
case AVIF_RESULT_CANNOT_CHANGE_SETTING: return "Can not change some settings during encoding";
99+
case AVIF_RESULT_CANNOT_CHANGE_SETTING: return "Can not change some settings during encoding";
100100
case AVIF_RESULT_UNKNOWN_ERROR:
101101
default:
102102
break;

src/codec_aom.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,10 +526,11 @@ static avifResult aomCodecEncodeImage(avifCodec * codec,
526526
avifEncoder * encoder,
527527
const avifImage * image,
528528
avifBool alpha,
529+
avifBool updateConfig,
529530
avifAddImageFlags addImageFlags,
530531
avifCodecEncodeOutput * output)
531532
{
532-
if (!codec->internal->encoderInitialized || (addImageFlags & AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS)) {
533+
if (!codec->internal->encoderInitialized || updateConfig) {
533534
// Map encoder speed to AOM usage + CpuUsed:
534535
// Speed 0: GoodQuality CpuUsed 0
535536
// Speed 1: GoodQuality CpuUsed 1

src/codec_rav1e.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ static avifResult rav1eCodecEncodeImage(avifCodec * codec,
5151
avifEncoder * encoder,
5252
const avifImage * image,
5353
avifBool alpha,
54+
avifBool updateConfig,
5455
uint32_t addImageFlags,
5556
avifCodecEncodeOutput * output)
5657
{
57-
if (addImageFlags & AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS) {
58+
if (updateConfig) {
5859
return AVIF_RESULT_NOT_IMPLEMENTED;
5960
}
6061

src/codec_svt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ static avifResult svtCodecEncodeImage(avifCodec * codec,
4646
avifEncoder * encoder,
4747
const avifImage * image,
4848
avifBool alpha,
49+
avifBool updateConfig,
4950
uint32_t addImageFlags,
5051
avifCodecEncodeOutput * output)
5152
{
52-
if (addImageFlags & AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS) {
53+
if (updateConfig) {
5354
return AVIF_RESULT_NOT_IMPLEMENTED;
5455
}
5556

src/write.c

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -322,14 +322,34 @@ void avifEncoderSetCodecSpecificOption(avifEncoder * encoder, const char * key,
322322
encoder->data->csOptionsUpdated = AVIF_TRUE;
323323
}
324324

325-
avifBool avifEncoderCheckSettingsChange(avifEncoder * encoder, avifAddImageFlag * flags)
326-
{
325+
static void avifBackupSettings(avifEncoder * encoder) {
327326
avifEncoder * lastEncoder = &encoder->data->lastEncoder;
328327

329328
// lastEncoder->data is used to mark that lastEncoder is initialized.
329+
lastEncoder->data = encoder->data;
330+
lastEncoder->codecChoice = encoder->codecChoice;
331+
lastEncoder->keyframeInterval = encoder->keyframeInterval;
332+
lastEncoder->timescale = encoder->timescale;
333+
lastEncoder->maxThreads = encoder->maxThreads;
334+
lastEncoder->minQuantizer = encoder->minQuantizer;
335+
lastEncoder->maxQuantizer = encoder->maxQuantizer;
336+
lastEncoder->minQuantizerAlpha = encoder->minQuantizerAlpha;
337+
lastEncoder->maxQuantizerAlpha = encoder->maxQuantizerAlpha;
338+
lastEncoder->tileRowsLog2 = encoder->tileRowsLog2;
339+
lastEncoder->tileColsLog2 = encoder->tileColsLog2;
340+
lastEncoder->speed = encoder->speed;
341+
encoder->data->csOptionsUpdated = AVIF_FALSE;
342+
}
343+
344+
// This function detect changes made on avifEncoder.
345+
// It reports if the change is valid, i.e. if any setting that can't change was changed.
346+
// It also sets needUpdate to true if valid changes are detected.
347+
static avifBool avifEncoderSettingsChanged(const avifEncoder * encoder, avifBool * needUpdate)
348+
{
349+
const avifEncoder * lastEncoder = &encoder->data->lastEncoder;
350+
330351
if (lastEncoder->data == NULL) {
331-
lastEncoder->data = encoder->data;
332-
goto copy;
352+
return AVIF_TRUE;
333353
}
334354

335355
if ((lastEncoder->codecChoice != encoder->codecChoice) || (lastEncoder->keyframeInterval != encoder->keyframeInterval) ||
@@ -342,23 +362,9 @@ avifBool avifEncoderCheckSettingsChange(avifEncoder * encoder, avifAddImageFlag
342362
(lastEncoder->maxQuantizerAlpha != encoder->maxQuantizerAlpha) || (lastEncoder->tileRowsLog2 != encoder->tileRowsLog2) ||
343363
(lastEncoder->tileColsLog2 != encoder->tileColsLog2) || (lastEncoder->speed != encoder->speed) ||
344364
(encoder->data->csOptionsUpdated)) {
345-
*flags |= AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS;
346-
goto copy;
365+
*needUpdate = AVIF_TRUE;
347366
}
348367

349-
copy:
350-
lastEncoder->codecChoice = encoder->codecChoice;
351-
lastEncoder->keyframeInterval = encoder->keyframeInterval;
352-
lastEncoder->timescale = encoder->timescale;
353-
lastEncoder->maxThreads = encoder->maxThreads;
354-
lastEncoder->minQuantizer = encoder->minQuantizer;
355-
lastEncoder->maxQuantizer = encoder->maxQuantizer;
356-
lastEncoder->minQuantizerAlpha = encoder->minQuantizerAlpha;
357-
lastEncoder->maxQuantizerAlpha = encoder->maxQuantizerAlpha;
358-
lastEncoder->tileRowsLog2 = encoder->tileRowsLog2;
359-
lastEncoder->tileColsLog2 = encoder->tileColsLog2;
360-
lastEncoder->speed = encoder->speed;
361-
encoder->data->csOptionsUpdated = AVIF_FALSE;
362368
return AVIF_TRUE;
363369
}
364370

@@ -649,8 +655,11 @@ static avifResult avifEncoderAddImageInternal(avifEncoder * encoder,
649655
return AVIF_RESULT_NO_CODEC_AVAILABLE;
650656
}
651657

652-
if (!avifEncoderCheckSettingsChange(encoder, &addImageFlags)) {
658+
avifBool updateConfig = AVIF_FALSE;
659+
if (!avifEncoderSettingsChanged(encoder, &updateConfig)) {
653660
return AVIF_RESULT_CANNOT_CHANGE_SETTING;
661+
} else {
662+
avifBackupSettings(encoder);
654663
}
655664

656665
// -----------------------------------------------------------------------
@@ -872,7 +881,7 @@ static avifResult avifEncoderAddImageInternal(avifEncoder * encoder,
872881
if (item->codec) {
873882
const avifImage * cellImage = cellImages[item->cellIndex];
874883
avifResult encodeResult =
875-
item->codec->encodeImage(item->codec, encoder, cellImage, item->alpha, addImageFlags, item->encodeOutput);
884+
item->codec->encodeImage(item->codec, encoder, cellImage, item->alpha, updateConfig, addImageFlags, item->encodeOutput);
876885
if (encodeResult == AVIF_RESULT_UNKNOWN_ERROR) {
877886
encodeResult = item->alpha ? AVIF_RESULT_ENCODE_ALPHA_FAILED : AVIF_RESULT_ENCODE_COLOR_FAILED;
878887
}

tests/gtest/avifchangesettingtest.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ void TestEncodeDecode(avifCodecChoice codec,
9696
}
9797

9898
TEST(ChangeSettingTest, AOM) {
99+
// Test if changes to AV1 encode settings are detected.
99100
TestEncodeDecode(AVIF_CODEC_CHOICE_AOM, {{"end-usage", "cbr"}}, true, false);
101+
102+
// Test if changes to codec specific options are detected.
103+
TestEncodeDecode(AVIF_CODEC_CHOICE_AOM, {}, true, true);
100104
}
101105

102106
TEST(ChangeSettingTest, RAV1E) {
@@ -107,11 +111,7 @@ TEST(ChangeSettingTest, SVT) {
107111
TestEncodeDecode(AVIF_CODEC_CHOICE_SVT, {}, false, false);
108112
}
109113

110-
TEST(ChangeSettingTest, ChangeCsOptions) {
111-
TestEncodeDecode(AVIF_CODEC_CHOICE_AOM, {}, true, true);
112-
}
113-
114-
TEST(ChangeSettingTest, UnchangableSetting) {
114+
TEST(ChangeSettingTest, UnchangeableSetting) {
115115
if (avifCodecName(AVIF_CODEC_CHOICE_AOM, AVIF_CODEC_FLAG_CAN_ENCODE) ==
116116
nullptr) {
117117
GTEST_SKIP() << "Codec unavailable, skip test.";

0 commit comments

Comments
 (0)