Rewrite h261_probe().

New code can detect h261 startcodes even when the first is damaged or not at the
begin. It also passes probetest v2 & v3.

Originally committed as revision 19845 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Michael Niedermayer 16 years ago
parent 05bdd33a12
commit 89c4e176f6
  1. 36
      libavformat/raw.c

@ -489,14 +489,36 @@ static int h263_probe(AVProbeData *p)
#if CONFIG_H261_DEMUXER #if CONFIG_H261_DEMUXER
static int h261_probe(AVProbeData *p) static int h261_probe(AVProbeData *p)
{ {
int code; uint32_t code= -1;
const uint8_t *d; int i;
int valid_psc=0;
d = p->buf; int invalid_psc=0;
code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4); int next_gn=0;
if (code == 0x10) { int src_fmt=0;
return 50; GetBitContext gb;
init_get_bits(&gb, p->buf, p->buf_size*8);
for(i=0; i<p->buf_size*8; i++){
code = (code<<1) + get_bits1(&gb);
if ((code & 0xffff0000) == 0x10000) {
int gn= (code>>12)&0xf;
if(!gn)
src_fmt= code&8;
if(gn != next_gn) invalid_psc++;
else valid_psc++;
if(src_fmt){ // CIF
next_gn= (gn+1 )%13;
}else{ //QCIF
next_gn= (gn+1+!!gn)% 7;
}
}
} }
if(valid_psc > 2*invalid_psc + 4){
return 50;
}else if(valid_psc > 2*invalid_psc + 2)
return 25;
return 0; return 0;
} }
#endif #endif

Loading…
Cancel
Save