Mercurial > libavcodec.hg
comparison h263dec.c @ 1003:c2c116876fd7 libavcodec
better padding/stuffing bug autodetection
author | michaelni |
---|---|
date | Mon, 13 Jan 2003 12:57:39 +0000 |
parents | e162c09efbe7 |
children | 3b9c2ac59ec4 |
comparison
equal
deleted
inserted
replaced
1002:e89b11e07ee7 | 1003:c2c116876fd7 |
---|---|
142 return pos; | 142 return pos; |
143 } | 143 } |
144 } | 144 } |
145 | 145 |
146 static int decode_slice(MpegEncContext *s){ | 146 static int decode_slice(MpegEncContext *s){ |
147 const int workaround_bugs= s->workaround_bugs; | |
148 | |
147 s->last_resync_gb= s->gb; | 149 s->last_resync_gb= s->gb; |
148 s->first_slice_line= 1; | 150 s->first_slice_line= 1; |
149 | 151 |
150 s->resync_mb_x= s->mb_x; | 152 s->resync_mb_x= s->mb_x; |
151 s->resync_mb_y= s->mb_y; | 153 s->resync_mb_y= s->mb_y; |
255 && !s->data_partitioning){ | 257 && !s->data_partitioning){ |
256 | 258 |
257 const int bits_count= get_bits_count(&s->gb); | 259 const int bits_count= get_bits_count(&s->gb); |
258 const int bits_left = s->gb.size*8 - bits_count; | 260 const int bits_left = s->gb.size*8 - bits_count; |
259 | 261 |
260 if(bits_left==0 || bits_left>8){ | 262 if(bits_left==0){ |
263 s->padding_bug_score+=16; | |
264 }else if(bits_left>8){ | |
261 s->padding_bug_score++; | 265 s->padding_bug_score++; |
262 } else if(bits_left != 1){ | 266 } else if(bits_left != 1){ |
263 int v= show_bits(&s->gb, 8); | 267 int v= show_bits(&s->gb, 8); |
264 v|= 0x7F >> (7-(bits_count&7)); | 268 v|= 0x7F >> (7-(bits_count&7)); |
265 | 269 |
266 if(v==0x7F) | 270 if(v==0x7F) |
267 s->padding_bug_score--; | 271 s->padding_bug_score--; |
268 else | 272 else |
269 s->padding_bug_score++; | 273 s->padding_bug_score++; |
270 } | 274 } |
271 | 275 |
272 if(s->padding_bug_score > -2) | 276 if(s->padding_bug_score > -2) |
273 s->workaround_bugs |= FF_BUG_NO_PADDING; | 277 s->workaround_bugs |= FF_BUG_NO_PADDING; |
274 else | 278 else |
275 s->workaround_bugs &= ~FF_BUG_NO_PADDING; | 279 s->workaround_bugs &= ~FF_BUG_NO_PADDING; |
276 } | 280 } |
277 | 281 |
278 // handle formats which dont have unique end markers | 282 // handle formats which dont have unique end markers |
279 if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly | 283 if(s->msmpeg4_version || (workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly |
280 int left= s->gb.size*8 - get_bits_count(&s->gb); | 284 int left= s->gb.size*8 - get_bits_count(&s->gb); |
281 int max_extra=7; | 285 int max_extra=7; |
282 | 286 |
283 /* no markers in M$ crap */ | 287 /* no markers in M$ crap */ |
284 if(s->msmpeg4_version && s->pict_type==I_TYPE) | 288 if(s->msmpeg4_version && s->pict_type==I_TYPE) |
285 max_extra+= 17; | 289 max_extra+= 17; |
286 | 290 |
287 /* buggy padding but the frame should still end approximately at the bitstream end */ | 291 /* buggy padding but the frame should still end approximately at the bitstream end */ |
288 if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3) | 292 if((workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3) |
289 max_extra+= 48; | 293 max_extra+= 48; |
290 else if((s->workaround_bugs&FF_BUG_NO_PADDING)) | 294 else if((workaround_bugs&FF_BUG_NO_PADDING)) |
291 max_extra+= 256*256*256*64; | 295 max_extra+= 256*256*256*64; |
292 | 296 |
293 if(left>max_extra){ | 297 if(left>max_extra){ |
294 fprintf(stderr, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24)); | 298 fprintf(stderr, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24)); |
295 } | 299 } |