diff --git a/examples/webpmux.c b/examples/webpmux.c index 112f5041..7fe67703 100644 --- a/examples/webpmux.c +++ b/examples/webpmux.c @@ -797,7 +797,7 @@ static int Process(const WebPMuxConfig* config) { WebPDataClear(&webpdata); ERROR_GOTO1("ERROR: Could not parse frame properties.\n", Err2); } - err = WebPMuxSetFrame(mux, 0, &webpdata, x_offset, y_offset, + err = WebPMuxPushFrame(mux, &webpdata, x_offset, y_offset, duration, 1); WebPDataClear(&webpdata); if (err != WEBP_MUX_OK) { @@ -825,7 +825,7 @@ static int Process(const WebPMuxConfig* config) { WebPDataClear(&webpdata); ERROR_GOTO1("ERROR: Could not parse tile properties.\n", Err2); } - err = WebPMuxSetTile(mux, 0, &webpdata, x_offset, y_offset, 1); + err = WebPMuxPushTile(mux, &webpdata, x_offset, y_offset, 1); WebPDataClear(&webpdata); if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR#%d: Could not add a tile at index %d.\n", diff --git a/src/mux/muxedit.c b/src/mux/muxedit.c index d66d34db..293e769e 100644 --- a/src/mux/muxedit.c +++ b/src/mux/muxedit.c @@ -273,7 +273,7 @@ WebPMuxError WebPMuxSetImage(WebPMux* const mux, if (err != WEBP_MUX_OK) goto Err; // Add this image to mux. - err = MuxImageSetNth(&wpi, &mux->images_, 1); + err = MuxImagePush(&wpi, &mux->images_); if (err != WEBP_MUX_OK) goto Err; // All OK. @@ -343,10 +343,9 @@ WebPMuxError WebPMuxSetLoopCount(WebPMux* const mux, uint32_t loop_count) { return err; } -static WebPMuxError MuxSetFrameTileInternal( - WebPMux* const mux, uint32_t nth, const WebPData* const bitstream, - uint32_t x_offset, uint32_t y_offset, uint32_t duration, - int copy_data, uint32_t tag) { +static WebPMuxError MuxPushFrameTileInternal( + WebPMux* const mux, const WebPData* const bitstream, uint32_t x_offset, + uint32_t y_offset, uint32_t duration, int copy_data, uint32_t tag) { WebPChunk chunk; WebPData image; WebPData alpha; @@ -418,7 +417,7 @@ static WebPMuxError MuxSetFrameTileInternal( ChunkInit(&chunk); // chunk owned by wpi.header_ now. // Add this WebPMuxImage to mux. - err = MuxImageSetNth(&wpi, &mux->images_, nth); + err = MuxImagePush(&wpi, &mux->images_); if (err != WEBP_MUX_OK) goto Err; // All is well. @@ -432,21 +431,19 @@ static WebPMuxError MuxSetFrameTileInternal( return err; } -// TODO(urvang): Think about whether we need 'nth' while adding a frame or tile. - -WebPMuxError WebPMuxSetFrame(WebPMux* const mux, uint32_t nth, +WebPMuxError WebPMuxPushFrame(WebPMux* const mux, const WebPData* const bitstream, uint32_t x_offset, uint32_t y_offset, uint32_t duration, int copy_data) { - return MuxSetFrameTileInternal(mux, nth, bitstream, x_offset, y_offset, + return MuxPushFrameTileInternal(mux, bitstream, x_offset, y_offset, duration, copy_data, kChunks[IDX_FRAME].tag); } -WebPMuxError WebPMuxSetTile(WebPMux* const mux, uint32_t nth, +WebPMuxError WebPMuxPushTile(WebPMux* const mux, const WebPData* const bitstream, uint32_t x_offset, uint32_t y_offset, int copy_data) { - return MuxSetFrameTileInternal(mux, nth, bitstream, x_offset, y_offset, + return MuxPushFrameTileInternal(mux, bitstream, x_offset, y_offset, 1 /* unused duration*/, copy_data, kChunks[IDX_TILE].tag); } diff --git a/src/mux/muxi.h b/src/mux/muxi.h index 3c04f411..b4882d1e 100644 --- a/src/mux/muxi.h +++ b/src/mux/muxi.h @@ -215,10 +215,8 @@ static WEBP_INLINE WebPChunk** MuxImageGetListFromId(WebPMuxImage* wpi, } } -// Sets 'wpi' at nth position in the 'wpi_list'. -// nth = 0 has the special meaning "last of the list". -WebPMuxError MuxImageSetNth(const WebPMuxImage* wpi, WebPMuxImage** wpi_list, - uint32_t nth); +// Pushes 'wpi' at the end of 'wpi_list'. +WebPMuxError MuxImagePush(const WebPMuxImage* wpi, WebPMuxImage** wpi_list); // Delete nth image in the image list with given tag id. WebPMuxError MuxImageDeleteNth(WebPMuxImage** wpi_list, uint32_t nth, diff --git a/src/mux/muxinternal.c b/src/mux/muxinternal.c index e74bd4f1..1ed0f391 100644 --- a/src/mux/muxinternal.c +++ b/src/mux/muxinternal.c @@ -275,27 +275,6 @@ int MuxImageCount(WebPMuxImage* const wpi_list, WebPChunkId id) { return count; } -// Outputs a pointer to 'prev_wpi->next_', -// where 'prev_wpi' is the pointer to the image at position (nth - 1). -// Returns 1 if nth image was found, 0 otherwise. -static int SearchImageToSet(WebPMuxImage** wpi_list, uint32_t nth, - WebPMuxImage*** const location) { - uint32_t count = 0; - assert(wpi_list); - *location = wpi_list; - - while (*wpi_list) { - WebPMuxImage* const cur_wpi = *wpi_list; - ++count; - if (count == nth) return 1; // Found. - wpi_list = &cur_wpi->next_; - *location = wpi_list; - } - - // *chunk_list is ok to be NULL if adding at last location. - return (nth == 0 || (count == nth - 1)) ? 1 : 0; -} - // Outputs a pointer to 'prev_wpi->next_', // where 'prev_wpi' is the pointer to the image at position (nth - 1). // Returns 1 if nth image with given id was found, 0 otherwise. @@ -335,19 +314,25 @@ static int SearchImageToGetOrDelete(WebPMuxImage** wpi_list, uint32_t nth, //------------------------------------------------------------------------------ // MuxImage writer methods. -WebPMuxError MuxImageSetNth(const WebPMuxImage* wpi, WebPMuxImage** wpi_list, - uint32_t nth) { +WebPMuxError MuxImagePush(const WebPMuxImage* wpi, WebPMuxImage** wpi_list) { WebPMuxImage* new_wpi; - if (!SearchImageToSet(wpi_list, nth, &wpi_list)) { - return WEBP_MUX_NOT_FOUND; + while (*wpi_list != NULL) { + WebPMuxImage* const cur_wpi = *wpi_list; + if (cur_wpi->next_ == NULL) break; + wpi_list = &cur_wpi->next_; } new_wpi = (WebPMuxImage*)malloc(sizeof(*new_wpi)); if (new_wpi == NULL) return WEBP_MUX_MEMORY_ERROR; *new_wpi = *wpi; - new_wpi->next_ = *wpi_list; + new_wpi->next_ = NULL; + + if (*wpi_list != NULL) { + (*wpi_list)->next_ = new_wpi; + } else { *wpi_list = new_wpi; + } return WEBP_MUX_OK; } diff --git a/src/mux/muxread.c b/src/mux/muxread.c index 5fc04c3e..43cdbfc2 100644 --- a/src/mux/muxread.c +++ b/src/mux/muxread.c @@ -151,7 +151,7 @@ WebPMux* WebPMuxCreateInternal(const WebPData* const bitstream, int copy_data, if (id == WEBP_CHUNK_IMAGE) { wpi->is_partial_ = 0; // wpi is completely filled. // Add this to mux->images_ list. - if (MuxImageSetNth(wpi, &mux->images_, 0) != WEBP_MUX_OK) goto Err; + if (MuxImagePush(wpi, &mux->images_) != WEBP_MUX_OK) goto Err; MuxImageInit(wpi); // Reset for reading next image. } else { wpi->is_partial_ = 1; // wpi is only partially filled. diff --git a/src/webp/mux.h b/src/webp/mux.h index c86fd5a9..25ad3113 100644 --- a/src/webp/mux.h +++ b/src/webp/mux.h @@ -267,11 +267,9 @@ WEBP_EXTERN(WebPMuxError) WebPMuxDeleteColorProfile(WebPMux* const mux); //------------------------------------------------------------------------------ // Animation. -// Adds an animation frame to the mux object. -// nth=0 has a special meaning - last position. +// Adds an animation frame at the end of the mux object. // Parameters: // mux - (in/out) object to which an animation frame is to be added -// nth - (in) The position at which the frame is to be added. // bitstream - (in) the image data corresponding to the frame. It can either // be a raw VP8/VP8L bitstream or a single-image WebP file // (non-animated and non-tiled) @@ -282,17 +280,15 @@ WEBP_EXTERN(WebPMuxError) WebPMuxDeleteColorProfile(WebPMux* const mux); // value 0 indicates data will NOT be copied. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL -// WEBP_MUX_NOT_FOUND - If we have less than (nth-1) frames before adding. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. -WEBP_EXTERN(WebPMuxError) WebPMuxSetFrame( - WebPMux* const mux, uint32_t nth, const WebPData* const bitstream, +WEBP_EXTERN(WebPMuxError) WebPMuxPushFrame( + WebPMux* const mux, const WebPData* const bitstream, uint32_t x_offset, uint32_t y_offset, uint32_t duration, int copy_data); // TODO(urvang): Create a struct as follows to reduce argument list size: // typedef struct { -// int nth; // WebPData image; // WebPData alpha; // uint32_t x_offset, y_offset; @@ -360,11 +356,9 @@ WEBP_EXTERN(WebPMuxError) WebPMuxGetLoopCount(const WebPMux* const mux, //------------------------------------------------------------------------------ // Tiling. -// Adds a tile to the mux object. -// nth=0 has a special meaning - last position. +// Adds a tile at the end of the mux object. // Parameters: -// mux - (in/out) object to which a tile is to be added -// nth - (in) The position at which the tile is to be added. +// mux - (in/out) object to which a tile is to be added. // bitstream - (in) the image data corresponding to the frame. It can either // be a raw VP8/VP8L bitstream or a single-image WebP file // (non-animated and non-tiled) @@ -374,11 +368,10 @@ WEBP_EXTERN(WebPMuxError) WebPMuxGetLoopCount(const WebPMux* const mux, // value 0 indicates data will NOT be copied. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL -// WEBP_MUX_NOT_FOUND - If we have less than (nth-1) tiles before adding. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. -WEBP_EXTERN(WebPMuxError) WebPMuxSetTile( - WebPMux* const mux, uint32_t nth, const WebPData* const bitstream, +WEBP_EXTERN(WebPMuxError) WebPMuxPushTile( + WebPMux* const mux, const WebPData* const bitstream, uint32_t x_offset, uint32_t y_offset, int copy_data); // Gets the nth tile from the mux object.