deflate() compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush.
The detailed semantics are as follows.
deflate() performs one or both of the following actions:
Compress more input starting at
next_in and update
next_in and
avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer),
next_in and
avail_in are updated and processing will resume at this point for the next call to
deflate().
Provide more output starting at
next_out and update
next_out and
avail_out accordingly. This action is forced if the parameter
flush is non-zero. Forcing
flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if
flush is not set.
Before the call to
deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating
avail_in or
avail_out accordingly;
avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call to
deflate(). If
deflate() returns
Z_OK and with zero
avail_out, it must be called again after making room in the output buffer because there might be more output pending.
If the parameter
flush is set to
Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular,
avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary.
If
flush is set to
Z_FULL_FLUSH, all output is flushed as with
Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using
Z_FULL_FLUSH too often can seriously degrade the compression.
If
deflate() returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated
avail_out), until the flush is complete (
deflate() returns with non-zero
avail_out).
If the parameter
flush is set to
Z_FINISH, pending input is processed, pending output is flushed and
deflate() returns with
Z_STREAM_END if there was enough output space; if
deflate() returns with
Z_OK, this function must be called again with
Z_FINISH and more output space (updated
avail_out but no more input data, until it returns with
Z_STREAM_END or an error. After
deflate() has returned
Z_STREAM_END, the only possible operations on the stream are
deflateReset() or
deflateEnd().
Z_FINISH can be used immediately after
deflateInit() if all the compression is to be done in a single step. In this case,
avail_out must be at least 0.1% larger than
avail_in plus 12 bytes. If
deflate() does not return
Z_STREAM_END, then it must be called again as described above.
deflate() sets strm->adler to the Adler-32 checksum of all input read so far (that is,
total_in bytes).
deflate() may update
data_type if it can make a good guess about the input data type (Z_ASCII or Z_BINARY). If in doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner.
deflate() returns
Z_OK if some progress has been made (more input processed or more output produced),
Z_STREAM_END if all input has been consumed and all output has been produced (only when
flush is set to
Z_FINISH),
Z_STREAM_ERROR if the stream state was inconsistent (for example, if
next_in or
next_out was
NULL),
Z_BUF_ERROR if no progress is possible (for example,
avail_in or
avail_out was zero).