WebPMuxError WebPFrameCacheFlush(WebPFrameCache* const cache, int verbose, WebPMux* const mux) { while (cache->flush_count > 0) { WebPMuxFrameInfo* info; WebPMuxError err; EncodedFrame* const curr = CacheGetFrame(cache, 0); // Pick frame or full canvas. if (cache->keyframe == 0) { info = &curr->key_frame; info->blend_method = WEBP_MUX_NO_BLEND; cache->keyframe = KEYFRAME_NONE; cache->best_delta = DELTA_INFINITY; } else { info = &curr->sub_frame; info->blend_method = WEBP_MUX_BLEND; } // Add to mux. err = WebPMuxPushFrame(mux, info, 1); if (err != WEBP_MUX_OK) return err; if (verbose) { printf("Added frame. offset:%d,%d duration:%d dispose:%d blend:%d\n", info->x_offset, info->y_offset, info->duration, info->dispose_method, info->blend_method); } FrameRelease(curr); ++cache->start; --cache->flush_count; --cache->count; if (cache->keyframe != KEYFRAME_NONE) --cache->keyframe; } if (cache->count == 0) CacheReset(cache); return WEBP_MUX_OK; }
void WebPFrameCacheDelete(WebPFrameCache* const cache) { if (cache != NULL) { size_t i; for (i = 0; i < cache->size; ++i) { FrameRelease(&cache->encoded_frames[i]); } free(cache->encoded_frames); free(cache); } }
void WebPAnimEncoderDelete(WebPAnimEncoder* enc) { if (enc != NULL) {; WebPPictureFree(&enc->curr_canvas_copy_); WebPPictureFree(&enc->prev_canvas_); WebPPictureFree(&enc->prev_canvas_disposed_); if (enc->encoded_frames_ != NULL) { size_t i; for (i = 0; i < enc->size_; ++i) { FrameRelease(&enc->encoded_frames_[i]); } WebPSafeFree(enc->encoded_frames_); } WebPMuxDelete(enc->mux_); WebPSafeFree(enc); } }