Mercurial > libavformat.hg
changeset 924:6a9265af0009 libavformat
improve mpeg1/2-es detection
author | michael |
---|---|
date | Thu, 02 Feb 2006 13:56:42 +0000 |
parents | 76c5dfe0b805 |
children | 2d9a65a1d9ea |
files | raw.c |
diffstat | 1 files changed, 17 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/raw.c Thu Feb 02 13:07:30 2006 +0000 +++ b/raw.c Thu Feb 02 13:56:42 2006 +0000 @@ -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; }