* @return Number of bytes written
*/
static int writtenBytes(LZWEncodeState *s){
- int ret = (put_bits_count(&s->pb)) >> 3;
+ int ret = put_bits_count(&s->pb) >> 3;
ret -= s->output_bytes;
s->output_bytes += ret;
return ret;
int ff_lzw_encode(LZWEncodeState * s, const uint8_t * inbuf, int insize)
{
int i;
- int code_prefix = s->last_code;
if(insize * 3 > (s->bufsize - s->output_bytes) * 2){
return -1;
}
- if (code_prefix == LZW_PREFIX_EMPTY)
+ if (s->last_code == LZW_PREFIX_EMPTY)
clearTable(s);
for (i = 0; i < insize; i++) {
uint8_t c = *inbuf++;
- int code = findCode(s, c, code_prefix);
- if (s->tab[code].hash_prefix != LZW_PREFIX_FREE) {
- code_prefix = s->tab[code].code;
- } else {
- writeCode(s, code_prefix);
- addCode(s, c, code_prefix, code);
- code_prefix = s->tab[hash(0, c)].code;
+ int code = findCode(s, c, s->last_code);
+ if (s->tab[code].hash_prefix == LZW_PREFIX_FREE) {
+ writeCode(s, s->last_code);
+ addCode(s, c, s->last_code, code);
+ code= hash(0, c);
}
+ s->last_code = s->tab[code].code;
if (s->tabsize >= s->maxcode - 1) {
clearTable(s);
}
}
- s->last_code = code_prefix;
return writtenBytes(s);
}