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 }