Don't delete gain map metadata if ignore_gain_map In avif::ReadImage(), if ignore_gain_map is true, don't delete gain map metadata. Let the caller do that.
diff --git a/apps/avifgainmaputil/combine_command.cc b/apps/avifgainmaputil/combine_command.cc index 97925f9..420a193 100644 --- a/apps/avifgainmaputil/combine_command.cc +++ b/apps/avifgainmaputil/combine_command.cc
@@ -135,9 +135,12 @@ << gain_map_height << "\n"; // Because base_image is read with ignore_gain_map=true, there is no - // preexisting gain map. Otherwise, overwriting the pointer would cause a - // memory leak. - assert(base_image->gainMap == nullptr); + // preexisting gain map but there may be preexisting gain map metadata. + if (base_image->gainMap) { + assert(base_image->gainMap->image == nullptr); + avifGainMapDestroy(base_image->gainMap); + base_image->gainMap = nullptr; + } base_image->gainMap = avifGainMapCreate(); base_image->gainMap->image = avifImageCreate(gain_map_width, gain_map_height, arg_gain_map_depth_,
diff --git a/apps/avifgainmaputil/imageio.cc b/apps/avifgainmaputil/imageio.cc index 7aae803..25a1b49 100644 --- a/apps/avifgainmaputil/imageio.cc +++ b/apps/avifgainmaputil/imageio.cc
@@ -214,8 +214,10 @@ if (!view) { return AVIF_RESULT_OUT_OF_MEMORY; } + // When ignore_gain_map is true, decoder->image won't have a gain map but + // may have gain map metadata. It is fine to copy gain map metadata. result = avifImageCreateView(view.get(), decoder->image, ignore_profile, - ignore_alpha, ignore_gain_map); + ignore_alpha, /*ignoreGainMap=*/false); if (result != AVIF_RESULT_OK) { return result; }