1 | --- orig_mpeg.c 2009-03-23 11:26:22.000000000 -0700 |
---|
2 | +++ mpeg.c 2009-03-23 11:28:09.000000000 -0700 |
---|
3 | @@ -66,35 +66,40 @@ |
---|
4 | |
---|
5 | static int mpegps_probe(AVProbeData *p) |
---|
6 | { |
---|
7 | + uint32_t code= -1; |
---|
8 | + int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0; |
---|
9 | int i; |
---|
10 | - int size= FFMIN(2048, p->buf_size); |
---|
11 | - uint32_t code=0xFF; |
---|
12 | + int score=0; |
---|
13 | |
---|
14 | - /* we search the first start code. If it is a packet start code, |
---|
15 | - then we decide it is mpeg ps. We do not send highest value to |
---|
16 | - give a chance to mpegts */ |
---|
17 | - /* NOTE: the search range was restricted to avoid too many false |
---|
18 | - detections */ |
---|
19 | - |
---|
20 | - for (i = 0; i < size; i++) { |
---|
21 | - code = (code << 8) | p->buf[i]; |
---|
22 | + for(i=0; i<p->buf_size; i++){ |
---|
23 | + code = (code<<8) + p->buf[i]; |
---|
24 | if ((code & 0xffffff00) == 0x100) { |
---|
25 | - if (code == PACK_START_CODE || |
---|
26 | - code == SYSTEM_HEADER_START_CODE || |
---|
27 | - (code >= 0x1e0 && code <= 0x1ef) || |
---|
28 | - (code >= 0x1c0 && code <= 0x1df) || |
---|
29 | - code == PRIVATE_STREAM_2 || |
---|
30 | - code == PROGRAM_STREAM_MAP || |
---|
31 | - code == PRIVATE_STREAM_1 || |
---|
32 | - code == PADDING_STREAM || |
---|
33 | - code >= 0x100 && code <= 0x1b0) |
---|
34 | - return AVPROBE_SCORE_MAX - 2; |
---|
35 | - else |
---|
36 | - return 0; |
---|
37 | + int pes= check_pes(p->buf+i, p->buf+p->buf_size); |
---|
38 | + |
---|
39 | + if(code == SYSTEM_HEADER_START_CODE) sys++; |
---|
40 | + else if(code == PRIVATE_STREAM_1) priv1++; |
---|
41 | + else if(code == PACK_START_CODE) pspack++; |
---|
42 | + else if((code & 0xf0) == VIDEO_ID && pes) vid++; |
---|
43 | + else if((code & 0xe0) == AUDIO_ID && pes) audio++; |
---|
44 | + |
---|
45 | + else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; |
---|
46 | + else if((code & 0xe0) == AUDIO_ID && !pes) invalid++; |
---|
47 | } |
---|
48 | } |
---|
49 | |
---|
50 | - return 0; |
---|
51 | + if(vid+audio > invalid) /* invalid VDR files nd short PES streams */ |
---|
52 | + score= AVPROBE_SCORE_MAX/4; |
---|
53 | + |
---|
54 | +//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, p->buf_size); |
---|
55 | + if(sys>invalid && sys*9 <= pspack*10) |
---|
56 | + return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
---|
57 | + if(priv1 + vid + audio > invalid && (priv1+vid+audio)*9 <= pspack*10) |
---|
58 | + return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
---|
59 | + if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048) /* PES stream */ |
---|
60 | + return AVPROBE_SCORE_MAX/2+2; |
---|
61 | + |
---|
62 | + //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 |
---|
63 | + return score; |
---|
64 | } |
---|
65 | |
---|
66 | typedef struct MpegDemuxContext { |
---|