]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mpeg.c
Dont give up after 100kb of zero bytes but returnd EAGAIN
[ffmpeg] / libavformat / mpeg.c
index 40202e0652f9668108b557ae9b22556b2d87be35..2b1cc34349bebc846b69dfd5f004fcefadf1f537 100644 (file)
@@ -76,15 +76,16 @@ static int mpegps_probe(AVProbeData *p)
     if(vid+audio > invalid)     /* invalid VDR files nd short PES streams */
         score= AVPROBE_SCORE_MAX/4;
 
-//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, p->buf_size);
+//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, invalid, p->buf_size);
     if(sys>invalid && sys*9 <= pspack*10)
-        return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
-    if(priv1 + vid + audio > invalid && (priv1+vid+audio)*9 <= pspack*10)
-        return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
-    if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048) /* PES stream */
-        return AVPROBE_SCORE_MAX/2+2;
+        return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
+    if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
+        return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
+    if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */
+        return (audio > 12 || vid > 3) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4;
 
     //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
+    //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
     return score;
 }
 
@@ -112,6 +113,8 @@ static int mpegps_read_header(AVFormatContext *s,
         m->sofdec++;
     } while (v == sofdec[i] && i++ < 6);
 
+    m->sofdec = (m->sofdec == 6) ? 1 : 0;
+
     /* no need to do more */
     return 0;
 }
@@ -244,8 +247,13 @@ static int mpegps_read_pes_header(AVFormatContext *s,
         startcode = find_next_start_code(s->pb, &size, &m->header_state);
         last_sync = url_ftell(s->pb);
     //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(s->pb));
-    if (startcode < 0)
-        return AVERROR(EIO);
+    if (startcode < 0){
+        if(url_feof(s->pb))
+            return AVERROR_EOF;
+        //FIXME we should remember header_state
+        return AVERROR(EAGAIN);
+    }
+
     if (startcode == PACK_START_CODE)
         goto redo;
     if (startcode == SYSTEM_HEADER_START_CODE)
@@ -554,6 +562,7 @@ static int mpegps_read_packet(AVFormatContext *s,
     get_buffer(s->pb, pkt->data, pkt->size);
     pkt->pts = pts;
     pkt->dts = dts;
+    pkt->pos = dummy_pos;
     pkt->stream_index = st->index;
 #if 0
     av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",