[Ffmpeg-cvslog] CVS: ffmpeg/libavformat raw.c,1.62,1.63

Michael Niedermayer CVS michael
Thu Feb 2 14:56:44 CET 2006


Update of /cvsroot/ffmpeg/ffmpeg/libavformat
In directory mail:/var2/tmp/cvs-serv9090

Modified Files:
	raw.c 
Log Message:
improve mpeg1/2-es detection


Index: raw.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/raw.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -d -r1.62 -r1.63
--- raw.c	12 Jan 2006 22:43:25 -0000	1.62
+++ raw.c	2 Feb 2006 13:56:42 -0000	1.63
@@ -286,31 +286,28 @@
 #define SEQ_START_CODE          0x000001b3
 #define GOP_START_CODE          0x000001b8
 #define PICTURE_START_CODE      0x00000100
+#define SLICE_START_CODE        0x00000101
+#define PACK_START_CODE         0x000001ba
 
-/* XXX: improve that by looking at several start codes */
 static int mpegvideo_probe(AVProbeData *p)
 {
-    int code;
-    const uint8_t *d;
-
-    /* we search the first start code. If it is a sequence, gop or
-       picture start code then we decide it is an mpeg video
-       stream. We do not send highest value to give a chance to mpegts */
-    /* NOTE: the search range was restricted to avoid too many false
-       detections */
+    uint32_t code= -1;
+    int pic=0, seq=0, slice=0, pspack=0;
+    int i;
 
-    if (p->buf_size < 6)
-        return 0;
-    d = p->buf;
-    code = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | (d[3]);
-    if ((code & 0xffffff00) == 0x100) {
-        if (code == SEQ_START_CODE ||
-            code == GOP_START_CODE ||
-            code == PICTURE_START_CODE)
-            return 50 - 1;
-        else
-            return 0;
+    for(i=0; i<p->buf_size; i++){
+        code = (code<<8) + p->buf[i];
+        if ((code & 0xffffff00) == 0x100) {
+            switch(code){
+            case     SEQ_START_CODE:   seq++; break;
+            case PICTURE_START_CODE:   pic++; break;
+            case   SLICE_START_CODE: slice++; break;
+            case    PACK_START_CODE: pspack++; break;
+            }
+        }
     }
+    if(seq && pic && slice && seq<pic && (ABS(pic-slice)-1)*10 < pic && !pspack)
+        return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
     return 0;
 }
 





More information about the ffmpeg-cvslog mailing list