summaryrefslogtreecommitdiff
path: root/libavformat/raw.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2009-09-14 21:29:19 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-09-14 21:29:19 +0000
commit89c4e176f6b22ddfadaea2ff698a7c479ede474e (patch)
treeb8817cc37b85f922f85cae91320ac1e4defcbd60 /libavformat/raw.c
parent05bdd33a128dea4cea31d8b77072901f29e9ffff (diff)
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
Diffstat (limited to 'libavformat/raw.c')
-rw-r--r--libavformat/raw.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/libavformat/raw.c b/libavformat/raw.c
index a935ce56cd..a3227cd453 100644
--- a/libavformat/raw.c
+++ b/libavformat/raw.c
@@ -489,14 +489,36 @@ static int h263_probe(AVProbeData *p)
#if CONFIG_H261_DEMUXER
static int h261_probe(AVProbeData *p)
{
- int code;
- const uint8_t *d;
-
- d = p->buf;
- code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4);
- if (code == 0x10) {
- return 50;
+ uint32_t code= -1;
+ int i;
+ int valid_psc=0;
+ int invalid_psc=0;
+ int next_gn=0;
+ int src_fmt=0;
+ 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;
}
#endif