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