Mercurial > libavcodec.hg
comparison lzw.c @ 4725:74caca70e2b3 libavcodec
simplify
author | michael |
---|---|
date | Sun, 25 Mar 2007 13:41:14 +0000 |
parents | 8c00d22d45a0 |
children | ecb663d00b6b |
comparison
equal
deleted
inserted
replaced
4724:ea97803884e1 | 4725:74caca70e2b3 |
---|---|
53 int codesize; | 53 int codesize; |
54 int clear_code; | 54 int clear_code; |
55 int end_code; | 55 int end_code; |
56 int newcodes; ///< First available code | 56 int newcodes; ///< First available code |
57 int top_slot; ///< Highest code for current size | 57 int top_slot; ///< Highest code for current size |
58 int top_slot2; ///< Highest possible code for current size (<=top_slot) | 58 int extra_slot; |
59 int slot; ///< Last read code | 59 int slot; ///< Last read code |
60 int fc, oc; | 60 int fc, oc; |
61 uint8_t *sp; | 61 uint8_t *sp; |
62 uint8_t stack[LZW_SIZTABLE]; | 62 uint8_t stack[LZW_SIZTABLE]; |
63 uint8_t suffix[LZW_SIZTABLE]; | 63 uint8_t suffix[LZW_SIZTABLE]; |
156 s->sp = s->stack; | 156 s->sp = s->stack; |
157 | 157 |
158 s->mode = mode; | 158 s->mode = mode; |
159 switch(s->mode){ | 159 switch(s->mode){ |
160 case FF_LZW_GIF: | 160 case FF_LZW_GIF: |
161 s->top_slot2 = s->top_slot; | 161 s->extra_slot= 0; |
162 break; | 162 break; |
163 case FF_LZW_TIFF: | 163 case FF_LZW_TIFF: |
164 s->top_slot2 = s->top_slot - 1; | 164 s->extra_slot= 1; |
165 break; | 165 break; |
166 default: | 166 default: |
167 return -1; | 167 return -1; |
168 } | 168 } |
169 return 0; | 169 return 0; |
206 } else if (c == s->clear_code) { | 206 } else if (c == s->clear_code) { |
207 s->cursize = s->codesize + 1; | 207 s->cursize = s->codesize + 1; |
208 s->curmask = mask[s->cursize]; | 208 s->curmask = mask[s->cursize]; |
209 s->slot = s->newcodes; | 209 s->slot = s->newcodes; |
210 s->top_slot = 1 << s->cursize; | 210 s->top_slot = 1 << s->cursize; |
211 s->top_slot2 = s->top_slot; | |
212 if(s->mode == FF_LZW_TIFF) | |
213 s->top_slot2--; | |
214 while ((c = lzw_get_code(s)) == s->clear_code); | 211 while ((c = lzw_get_code(s)) == s->clear_code); |
215 if (c == s->end_code) { | 212 if (c == s->end_code) { |
216 s->end_code = -1; | 213 s->end_code = -1; |
217 break; | 214 break; |
218 } | 215 } |
237 if (s->slot < s->top_slot) { | 234 if (s->slot < s->top_slot) { |
238 s->suffix[s->slot] = fc = code; | 235 s->suffix[s->slot] = fc = code; |
239 s->prefix[s->slot++] = oc; | 236 s->prefix[s->slot++] = oc; |
240 oc = c; | 237 oc = c; |
241 } | 238 } |
242 if (s->slot >= s->top_slot2) { | 239 if (s->slot >= s->top_slot - s->extra_slot) { |
243 if (s->cursize < LZW_MAXBITS) { | 240 if (s->cursize < LZW_MAXBITS) { |
244 s->top_slot <<= 1; | 241 s->top_slot <<= 1; |
245 s->top_slot2 = s->top_slot; | |
246 if(s->mode == FF_LZW_TIFF) | |
247 s->top_slot2--; | |
248 s->curmask = mask[++s->cursize]; | 242 s->curmask = mask[++s->cursize]; |
249 } | 243 } |
250 } | 244 } |
251 while (sp > s->stack) { | 245 while (sp > s->stack) { |
252 *buf++ = *(--sp); | 246 *buf++ = *(--sp); |