diff --git a/src/mux/muxedit.c b/src/mux/muxedit.c
index f50eb06f..848df856 100644
--- a/src/mux/muxedit.c
+++ b/src/mux/muxedit.c
@@ -355,52 +355,63 @@ static WebPMuxError MuxAddFrameTileInternal(WebPMux* const mux, uint32_t nth,
   err = GetImageData(data, size, &vp8_data, &vp8_size, NULL, NULL);
   if (err != WEBP_MUX_OK) return err;
 
+  ChunkInit(&chunk);
   MuxImageInit(&wpi);
 
   if (has_alpha) {
     // Add alpha chunk.
-    ChunkInit(&chunk);
     err = ChunkAssignDataImageInfo(&chunk, alpha_data, alpha_size, NULL,
                                    copy_data, kChunks[ALPHA_ID].chunkTag);
     if (err != WEBP_MUX_OK) return err;
     err = ChunkSetNth(&chunk, &wpi.alpha_, 1);
     if (err != WEBP_MUX_OK) return err;
+    ChunkInit(&chunk);  // chunk owned by wpi.alpha_ now.
   }
 
   // Create image_info object.
   image_info = CreateImageInfo(x_offset, y_offset, duration, vp8_data,
                                vp8_size);
-  if (image_info == NULL) return WEBP_MUX_MEMORY_ERROR;
+  if (image_info == NULL) {
+    MuxImageRelease(&wpi);
+    return WEBP_MUX_MEMORY_ERROR;
+  }
 
   // Add image chunk.
-  ChunkInit(&chunk);
   err = ChunkAssignDataImageInfo(&chunk, vp8_data, vp8_size, image_info,
                                  copy_data, kChunks[IMAGE_ID].chunkTag);
   if (err != WEBP_MUX_OK) goto Err;
+  image_info = NULL;  // Owned by 'chunk' now.
   err = ChunkSetNth(&chunk, &wpi.vp8_, 1);
   if (err != WEBP_MUX_OK) goto Err;
+  ChunkInit(&chunk);  // chunk owned by wpi.vp8_ now.
 
   // Create frame/tile data from image_info.
-  err = CreateDataFromImageInfo(image_info, is_frame, &frame_tile_data,
-                                &frame_tile_data_size);
+  err = CreateDataFromImageInfo(wpi.vp8_->image_info_, is_frame,
+                                &frame_tile_data, &frame_tile_data_size);
   if (err != WEBP_MUX_OK) goto Err;
 
   // Add frame/tile chunk (with copy_data = 1).
-  ChunkInit(&chunk);
   err = ChunkAssignDataImageInfo(&chunk, frame_tile_data, frame_tile_data_size,
                                  NULL, 1, tag);
   if (err != WEBP_MUX_OK) goto Err;
+  free(frame_tile_data);
+  frame_tile_data = NULL;
   err = ChunkSetNth(&chunk, &wpi.header_, 1);
   if (err != WEBP_MUX_OK) goto Err;
-
-  free(frame_tile_data);
+  ChunkInit(&chunk);  // chunk owned by wpi.header_ now.
 
   // Add this WebPMuxImage to mux.
-  return MuxImageSetNth(&wpi, &mux->images_, nth);
+  err = MuxImageSetNth(&wpi, &mux->images_, nth);
+  if (err != WEBP_MUX_OK) goto Err;
+
+  // All is well.
+  return WEBP_MUX_OK;
 
  Err:  // Something bad happened.
   free(image_info);
   free(frame_tile_data);
+  ChunkRelease(&chunk);
+  MuxImageRelease(&wpi);
   return err;
 }
 
diff --git a/src/mux/muxi.h b/src/mux/muxi.h
index c1c86d3a..95b8c55b 100644
--- a/src/mux/muxi.h
+++ b/src/mux/muxi.h
@@ -153,6 +153,9 @@ WebPMuxError ChunkAssignDataImageInfo(WebPChunk* chunk, const uint8_t* data,
 WebPMuxError ChunkSetNth(const WebPChunk* chunk, WebPChunk** chunk_list,
                          uint32_t nth);
 
+// Releases chunk and returns chunk->next_.
+WebPChunk* ChunkRelease(WebPChunk* const chunk);
+
 // Deletes given chunk & returns chunk->next_.
 WebPChunk* ChunkDelete(WebPChunk* const chunk);
 
@@ -174,6 +177,9 @@ uint8_t* ChunkListEmit(const WebPChunk* chunk_list, uint8_t* dst);
 // Initialize.
 void MuxImageInit(WebPMuxImage* const wpi);
 
+// Releases image 'wpi' and returns wpi->next.
+WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi);
+
 // Delete image 'wpi' and return the next image in the list or NULL.
 // 'wpi' can be NULL.
 WebPMuxImage* MuxImageDelete(WebPMuxImage* const wpi);
diff --git a/src/mux/muxinternal.c b/src/mux/muxinternal.c
index 8795cd17..ec13e934 100644
--- a/src/mux/muxinternal.c
+++ b/src/mux/muxinternal.c
@@ -47,8 +47,7 @@ void ChunkInit(WebPChunk* const chunk) {
   chunk->next_ = NULL;
 }
 
-// Releases chunk and returns chunk->next_.
-static WebPChunk* ChunkRelease(WebPChunk* const chunk) {
+WebPChunk* ChunkRelease(WebPChunk* const chunk) {
   WebPChunk* next;
   if (chunk == NULL) return NULL;
   free(chunk->image_info_);
@@ -239,7 +238,7 @@ void MuxImageInit(WebPMuxImage* const wpi) {
   wpi->next_ = NULL;
 }
 
-static WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) {
+WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) {
   WebPMuxImage* next;
   if (wpi == NULL) return NULL;
   ChunkDelete(wpi->header_);