From 6f18f12f99072ceb3287b100fe82e09d19327773 Mon Sep 17 00:00:00 2001 From: James Zern Date: Mon, 25 Mar 2013 23:33:38 -0700 Subject: [PATCH] demux: keep a frame tail pointer; used in AddFrame this speeds up the parse of a file with a large number of frames. Change-Id: Ibc61324eb50a04438f811a6f7787d378d763c104 --- src/demux/demux.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/demux/demux.c b/src/demux/demux.c index 8e8ca393..5d4dcf54 100644 --- a/src/demux/demux.c +++ b/src/demux/demux.c @@ -69,6 +69,7 @@ struct WebPDemuxer { uint32_t bgcolor_; int num_frames_; Frame* frames_; + Frame** frames_tail_; Chunk* chunks_; // non-image chunks }; @@ -183,15 +184,12 @@ static void AddChunk(WebPDemuxer* const dmux, Chunk* const chunk) { // Add a frame to the end of the list, ensuring the last frame is complete. // Returns true on success, false otherwise. static int AddFrame(WebPDemuxer* const dmux, Frame* const frame) { - const Frame* last_frame = NULL; - Frame** f = &dmux->frames_; - while (*f != NULL) { - last_frame = *f; - f = &(*f)->next_; - } + const Frame* const last_frame = *dmux->frames_tail_; if (last_frame != NULL && !last_frame->complete_) return 0; - *f = frame; + + *dmux->frames_tail_ = frame; frame->next_ = NULL; + dmux->frames_tail_ = &frame->next_; return 1; } @@ -660,6 +658,7 @@ static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) { dmux->bgcolor_ = 0xFFFFFFFF; // White background by default. dmux->canvas_width_ = -1; dmux->canvas_height_ = -1; + dmux->frames_tail_ = &dmux->frames_; dmux->mem_ = *mem; }