Mercurial > libavformat.hg
comparison mpeg.c @ 1140:2cfb5e02b299 libavformat
detect audio-only program streams and broken files made by VDR
author | mru |
---|---|
date | Thu, 29 Jun 2006 19:03:53 +0000 |
parents | 36ce24677f96 |
children | 11a8f0c50814 |
comparison
equal
deleted
inserted
replaced
1139:ff241582890f | 1140:2cfb5e02b299 |
---|---|
1267 int i; | 1267 int i; |
1268 | 1268 |
1269 for(i=0; i<p->buf_size; i++){ | 1269 for(i=0; i<p->buf_size; i++){ |
1270 code = (code<<8) + p->buf[i]; | 1270 code = (code<<8) + p->buf[i]; |
1271 if ((code & 0xffffff00) == 0x100) { | 1271 if ((code & 0xffffff00) == 0x100) { |
1272 switch(code){ | 1272 if(code == SYSTEM_HEADER_START_CODE) sys++; |
1273 case SYSTEM_HEADER_START_CODE: sys++; break; | 1273 else if(code == PRIVATE_STREAM_1) priv1++; |
1274 case PRIVATE_STREAM_1: priv1++; break; | 1274 else if(code == PACK_START_CODE) pspack++; |
1275 case PACK_START_CODE: pspack++; break; | 1275 else if((code & 0xf0) == VIDEO_ID) vid++; |
1276 case (VIDEO_ID + 0x100): vid++; break; | 1276 else if((code & 0xe0) == AUDIO_ID) audio++; |
1277 case (AUDIO_ID + 0x100): audio++; break; | |
1278 } | |
1279 } | 1277 } |
1280 } | 1278 } |
1281 if(sys && sys*9 <= pspack*10) | 1279 if(sys && sys*9 <= pspack*10) |
1282 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg | 1280 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
1283 if((priv1 || vid) && (priv1+vid)*9 <= pspack*10) | 1281 if((priv1 || vid || audio) && (priv1+vid+audio)*9 <= pspack*10) |
1284 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg | 1282 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
1285 if((!!vid ^ !!audio) && !sys && !pspack) /* PES stream */ | 1283 if((!!vid ^ !!audio) && !sys && !pspack) /* PES stream */ |
1286 return AVPROBE_SCORE_MAX/2; | 1284 return AVPROBE_SCORE_MAX/2+2; |
1285 if(vid || audio) /* invalid VDR files */ | |
1286 return AVPROBE_SCORE_MAX/2+2; | |
1287 return 0; | 1287 return 0; |
1288 } | 1288 } |
1289 | 1289 |
1290 | 1290 |
1291 typedef struct MpegDemuxContext { | 1291 typedef struct MpegDemuxContext { |