lzw: Add function for decoding multiple LZW codes at a time.
This commit is contained in:
parent
ed3363b899
commit
5426e9b81a
@ -437,3 +437,29 @@ lzw_result lzw_decode(struct lzw_ctx *ctx,
|
||||
return lzw__decode(ctx, ctx->stack_base, sizeof(ctx->stack_base),
|
||||
lzw__write_pixels, used);
|
||||
}
|
||||
|
||||
/* Exported function, documented in lzw.h */
|
||||
lzw_result lzw_decode_continuous(struct lzw_ctx *ctx,
|
||||
const uint8_t ** const data,
|
||||
uint32_t *restrict used)
|
||||
{
|
||||
*used = 0;
|
||||
*data = ctx->stack_base;
|
||||
|
||||
if (ctx->output_left != 0) {
|
||||
*used += lzw__write_pixels(ctx,
|
||||
ctx->stack_base, sizeof(ctx->stack_base), *used,
|
||||
ctx->output_code, ctx->output_left);
|
||||
}
|
||||
|
||||
while (*used != sizeof(ctx->stack_base)) {
|
||||
lzw_result res = lzw__decode(ctx,
|
||||
ctx->stack_base, sizeof(ctx->stack_base),
|
||||
lzw__write_pixels, used);
|
||||
if (res != LZW_OK) {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
return LZW_OK;
|
||||
}
|
||||
|
@ -91,4 +91,19 @@ lzw_result lzw_decode(struct lzw_ctx *ctx,
|
||||
const uint8_t *restrict *const restrict data,
|
||||
uint32_t *restrict used);
|
||||
|
||||
/**
|
||||
* Read input codes until end of lzw context owned output buffer.
|
||||
*
|
||||
* Ensure anything in output is used before calling this, as anything
|
||||
* on the there before this call will be trampled.
|
||||
*
|
||||
* \param[in] ctx LZW reading context, updated.
|
||||
* \param[out] data Returns pointer to array of output values.
|
||||
* \param[out] used Returns the number of values written to data.
|
||||
* \return LZW_OK on success, or appropriate error code otherwise.
|
||||
*/
|
||||
lzw_result lzw_decode_continuous(struct lzw_ctx *ctx,
|
||||
const uint8_t ** const data,
|
||||
uint32_t *restrict used);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user