| From f9694097dd69354b03cb8af959094c7f260db0a1 Mon Sep 17 00:00:00 2001 |
| From: Mark Adler <madler@alumni.caltech.edu> |
| Date: Mon, 16 Jan 2017 09:49:35 -0800 |
| Subject: [PATCH] Permit a deflateParams() parameter change as soon as |
| possible. |
| |
| This commit allows a parameter change even if the input data has |
| not all been compressed and copied to the application output |
| buffer, so long as all of the input data has been compressed to |
| the internal pending output buffer. This also allows an immediate |
| deflateParams change so long as there have been no deflate calls |
| since initialization or reset. |
| --- |
| deflate.c | 6 +++--- |
| zlib.h | 11 ++++++----- |
| 2 files changed, 9 insertions(+), 8 deletions(-) |
| |
| diff --git a/deflate.c b/deflate.c |
| index b63311a5..20bda4f6 100644 |
| --- a/deflate.c |
| +++ b/deflate.c |
| @@ -494,7 +494,7 @@ int ZEXPORT deflateResetKeep (strm) |
| s->wrap == 2 ? crc32(0L, Z_NULL, 0) : |
| #endif |
| adler32(0L, Z_NULL, 0); |
| - s->last_flush = Z_NO_FLUSH; |
| + s->last_flush = -2; |
| |
| _tr_init(s); |
| |
| @@ -587,12 +587,12 @@ int ZEXPORT deflateParams(strm, level, strategy) |
| func = configuration_table[s->level].func; |
| |
| if ((strategy != s->strategy || func != configuration_table[level].func) && |
| - s->high_water) { |
| + s->last_flush != -2) { |
| /* Flush the last buffer: */ |
| int err = deflate(strm, Z_BLOCK); |
| if (err == Z_STREAM_ERROR) |
| return err; |
| - if (strm->avail_out == 0) |
| + if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) |
| return Z_BUF_ERROR; |
| } |
| if (s->level != level) { |
| diff --git a/zlib.h b/zlib.h |
| index 5daf4f28..577d81e3 100644 |
| --- a/zlib.h |
| +++ b/zlib.h |
| @@ -712,11 +712,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, |
| used to switch between compression and straight copy of the input data, or |
| to switch to a different kind of input data requiring a different strategy. |
| If the compression approach (which is a function of the level) or the |
| - strategy is changed, and if any input has been consumed in a previous |
| - deflate() call, then the input available so far is compressed with the old |
| - level and strategy using deflate(strm, Z_BLOCK). There are three approaches |
| - for the compression levels 0, 1..3, and 4..9 respectively. The new level |
| - and strategy will take effect at the next call of deflate(). |
| + strategy is changed, and if there have been any deflate() calls since the |
| + state was initialized or reset, then the input available so far is |
| + compressed with the old level and strategy using deflate(strm, Z_BLOCK). |
| + There are three approaches for the compression levels 0, 1..3, and 4..9 |
| + respectively. The new level and strategy will take effect at the next call |
| + of deflate(). |
| |
| If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does |
| not have enough output space to complete, then the parameter change will not |