@@ -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 }
0 commit comments