@@ -322,14 +322,35 @@ void avifEncoderSetCodecSpecificOption(avifEncoder * encoder, const char * key,
322322 encoder -> data -> csOptionsUpdated = AVIF_TRUE ;
323323}
324324
325- avifBool avifEncoderCheckSettingsChange (avifEncoder * encoder , avifAddImageFlag * flags )
325+ static void avifBackupSettings (avifEncoder * encoder )
326326{
327327 avifEncoder * lastEncoder = & encoder -> data -> lastEncoder ;
328328
329329 // lastEncoder->data is used to mark that lastEncoder is initialized.
330+ lastEncoder -> data = encoder -> data ;
331+ lastEncoder -> codecChoice = encoder -> codecChoice ;
332+ lastEncoder -> keyframeInterval = encoder -> keyframeInterval ;
333+ lastEncoder -> timescale = encoder -> timescale ;
334+ lastEncoder -> maxThreads = encoder -> maxThreads ;
335+ lastEncoder -> minQuantizer = encoder -> minQuantizer ;
336+ lastEncoder -> maxQuantizer = encoder -> maxQuantizer ;
337+ lastEncoder -> minQuantizerAlpha = encoder -> minQuantizerAlpha ;
338+ lastEncoder -> maxQuantizerAlpha = encoder -> maxQuantizerAlpha ;
339+ lastEncoder -> tileRowsLog2 = encoder -> tileRowsLog2 ;
340+ lastEncoder -> tileColsLog2 = encoder -> tileColsLog2 ;
341+ lastEncoder -> speed = encoder -> speed ;
342+ encoder -> data -> csOptionsUpdated = AVIF_FALSE ;
343+ }
344+
345+ // This function detect changes made on avifEncoder.
346+ // It reports if the change is valid, i.e. if any setting that can't change was changed.
347+ // It also sets needUpdate to true if valid changes are detected.
348+ static avifBool avifEncoderSettingsChanged (const avifEncoder * encoder , avifBool * needUpdate )
349+ {
350+ const avifEncoder * lastEncoder = & encoder -> data -> lastEncoder ;
351+
330352 if (lastEncoder -> data == NULL ) {
331- lastEncoder -> data = encoder -> data ;
332- goto copy ;
353+ return AVIF_TRUE ;
333354 }
334355
335356 if ((lastEncoder -> codecChoice != encoder -> codecChoice ) || (lastEncoder -> keyframeInterval != encoder -> keyframeInterval ) ||
@@ -342,23 +363,9 @@ avifBool avifEncoderCheckSettingsChange(avifEncoder * encoder, avifAddImageFlag
342363 (lastEncoder -> maxQuantizerAlpha != encoder -> maxQuantizerAlpha ) || (lastEncoder -> tileRowsLog2 != encoder -> tileRowsLog2 ) ||
343364 (lastEncoder -> tileColsLog2 != encoder -> tileColsLog2 ) || (lastEncoder -> speed != encoder -> speed ) ||
344365 (encoder -> data -> csOptionsUpdated )) {
345- * flags |= AVIF_ADD_IMAGE_FLAG_UPDATE_SETTINGS ;
346- goto copy ;
366+ * needUpdate = AVIF_TRUE ;
347367 }
348368
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 ;
362369 return AVIF_TRUE ;
363370}
364371
@@ -649,8 +656,11 @@ static avifResult avifEncoderAddImageInternal(avifEncoder * encoder,
649656 return AVIF_RESULT_NO_CODEC_AVAILABLE ;
650657 }
651658
652- if (!avifEncoderCheckSettingsChange (encoder , & addImageFlags )) {
659+ avifBool updateConfig = AVIF_FALSE ;
660+ if (!avifEncoderSettingsChanged (encoder , & updateConfig )) {
653661 return AVIF_RESULT_CANNOT_CHANGE_SETTING ;
662+ } else {
663+ avifBackupSettings (encoder );
654664 }
655665
656666 // -----------------------------------------------------------------------
@@ -872,7 +882,7 @@ static avifResult avifEncoderAddImageInternal(avifEncoder * encoder,
872882 if (item -> codec ) {
873883 const avifImage * cellImage = cellImages [item -> cellIndex ];
874884 avifResult encodeResult =
875- item -> codec -> encodeImage (item -> codec , encoder , cellImage , item -> alpha , addImageFlags , item -> encodeOutput );
885+ item -> codec -> encodeImage (item -> codec , encoder , cellImage , item -> alpha , updateConfig , addImageFlags , item -> encodeOutput );
876886 if (encodeResult == AVIF_RESULT_UNKNOWN_ERROR ) {
877887 encodeResult = item -> alpha ? AVIF_RESULT_ENCODE_ALPHA_FAILED : AVIF_RESULT_ENCODE_COLOR_FAILED ;
878888 }
0 commit comments