Mercurial > libavcodec.hg
changeset 4728:5db8e9e8f71d libavcodec
move eob_reached logic into ff_lzw_decode_tail() which simplifies the code, avoids some checks in the innermost loop and also gets rid of the controversal break while hopefully retaining the last byte in a valid bytestream, invalid bytestreams still can have very significant overread
author | michael |
---|---|
date | Sun, 25 Mar 2007 15:43:46 +0000 |
parents | 23f8f6efc870 |
children | 8342af7feb90 |
files | lzw.c |
diffstat | 1 files changed, 8 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/lzw.c Sun Mar 25 15:09:16 2007 +0000 +++ b/lzw.c Sun Mar 25 15:43:46 2007 +0000 @@ -42,7 +42,6 @@ }; struct LZWState { - int eob_reached; uint8_t *pbuf, *ebuf; int bbits; unsigned int bbuf; @@ -74,10 +73,6 @@ while (s->bbits < s->cursize) { if (!s->bs) { s->bs = *s->pbuf++; - if(!s->bs) { - s->eob_reached = 1; - break; - } } s->bbuf |= (*s->pbuf++) << s->bbits; s->bbits += 8; @@ -87,9 +82,6 @@ s->bbuf >>= s->cursize; } else { // TIFF while (s->bbits < s->cursize) { - if (s->pbuf >= s->ebuf) { - s->eob_reached = 1; - } s->bbuf = (s->bbuf << 8) | (*s->pbuf++); s->bbits += 8; } @@ -107,8 +99,14 @@ void ff_lzw_decode_tail(LZWState *p) { struct LZWState *s = (struct LZWState *)p; - while(!s->eob_reached) - lzw_get_code(s); + + if(s->mode == FF_LZW_GIF) { + while(s->pbuf < s->ebuf && s->bs>0){ + s->pbuf += s->bs; + s->bs = *s->pbuf++; + } + }else + s->pbuf= s->ebuf; } void ff_lzw_decode_open(LZWState **p) @@ -136,7 +134,6 @@ if(csize < 1 || csize > LZW_MAXBITS) return -1; /* read buffer */ - s->eob_reached = 0; s->pbuf = buf; s->ebuf = s->pbuf + buf_size; s->bbuf = 0;