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);