private static unsafe HeifIntegerEncoderParameter CreateIntegerParameter(SafeHeifEncoder encoder, heif_encoder_parameter nativeParameter, string name, bool hasDefaultValue) { int defaultValue = 0; if (hasDefaultValue) { // The error value is ignored because some encoders return an error // when getting the value of a valid command. _ = LibHeifNative.heif_encoder_get_parameter_integer(encoder, name, out defaultValue); } bool haveMinimumMaximum; int minimum = 0; int maximum = 0; var validValues = new List <int>(); if (LibHeifVersion.Is1Point10OrLater) { var error = LibHeifNative.heif_encoder_parameter_get_valid_integer_values(nativeParameter, out bool haveMinimum, out bool haveMaximum, ref minimum, ref maximum, out int numValidValues, out var validValuesArray); error.ThrowIfError(); haveMinimumMaximum = haveMinimum && haveMaximum; if (numValidValues > 0 && validValuesArray != IntPtr.Zero) { validValues.Capacity = numValidValues; int *integerArray = (int *)validValuesArray; for (int i = 0; i < numValidValues; i++) { validValues.Add(integerArray[i]); } } } else { var error = LibHeifNative.heif_encoder_parameter_get_valid_integer_range(nativeParameter, out haveMinimumMaximum, ref minimum, ref maximum); error.ThrowIfError(); } return(new HeifIntegerEncoderParameter(name, hasDefaultValue, defaultValue, haveMinimumMaximum, minimum, maximum, validValues.AsReadOnly())); }