Ticket #6406: mpegpspatch

File mpegpspatch, 2.5 KB (added by Josh Mastronarde <jmastron@…>, 17 years ago)

Patch for mpeg.c

Line 
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 {