]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mpeg.c
Remove check for @ in tcp.c which removes the authorization data from the
[ffmpeg] / libavformat / mpeg.c
index aca9db2bb926019c558e3017f94fe7e9cc9307b4..fc98ab82b2c0704c9a1d9c74c69b35cfa016e586 100644 (file)
@@ -334,15 +334,20 @@ static int mpegps_read_pes_header(AVFormatContext *s,
                 header_len -= 5;
             }
         }
+        if (flags & 0x3f && header_len == 0){
+            flags &= 0xC0;
+            av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n");
+        }
         if (flags & 0x01) { /* PES extension */
             pes_ext = get_byte(s->pb);
             header_len--;
-            if (pes_ext & 0x40) { /* pack header - should be zero in PS */
-                goto error_redo;
-            }
             /* Skip PES private data, program packet sequence counter and P-STD buffer */
             skip = (pes_ext >> 4) & 0xb;
             skip += skip & 0x9;
+            if (pes_ext & 0x40 || skip > header_len){
+                av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext);
+                pes_ext=skip=0;
+            }
             url_fskip(s->pb, skip);
             header_len -= skip;
 
@@ -385,7 +390,8 @@ static int mpegps_read_pes_header(AVFormatContext *s,
     if(dts != AV_NOPTS_VALUE && ppos){
         int i;
         for(i=0; i<s->nb_streams; i++){
-            if(startcode == s->streams[i]->id) {
+            if(startcode == s->streams[i]->id &&
+               !url_is_streamed(s->pb) /* index useless on streams anyway */) {
                 ff_reduce_index(s, i);
                 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
             }
@@ -453,7 +459,7 @@ static int mpegps_read_packet(AVFormatContext *s,
         if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
             codec_id = CODEC_ID_CAVS;
         else
-            codec_id = CODEC_ID_MPEG2VIDEO;
+            codec_id = CODEC_ID_PROBE;
         type = CODEC_TYPE_VIDEO;
     } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
         type = CODEC_TYPE_AUDIO;
@@ -468,7 +474,8 @@ static int mpegps_read_packet(AVFormatContext *s,
         codec_id = CODEC_ID_DTS;
     } else if (startcode >= 0xa0 && startcode <= 0xaf) {
         type = CODEC_TYPE_AUDIO;
-        codec_id = CODEC_ID_PCM_S16BE;
+        /* 16 bit form will be handled as CODEC_ID_PCM_S16BE */
+        codec_id = CODEC_ID_PCM_DVD;
     } else if (startcode >= 0xb0 && startcode <= 0xbf) {
         type = CODEC_TYPE_AUDIO;
         codec_id = CODEC_ID_MLP;
@@ -513,7 +520,14 @@ static int mpegps_read_packet(AVFormatContext *s,
         freq = (b1 >> 4) & 3;
         st->codec->sample_rate = lpcm_freq_tab[freq];
         st->codec->channels = 1 + (b1 & 7);
-        st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
+        st->codec->bits_per_sample = 16 + ((b1 >> 6) & 3) * 4;
+        st->codec->bit_rate = st->codec->channels *
+                              st->codec->sample_rate *
+                              st->codec->bits_per_sample;
+        if (st->codec->bits_per_sample == 16)
+            st->codec->codec_id = CODEC_ID_PCM_S16BE;
+        else if (st->codec->bits_per_sample == 28)
+            return AVERROR(EINVAL);
     }
     av_new_packet(pkt, len);
     get_buffer(s->pb, pkt->data, pkt->size);
@@ -528,11 +542,6 @@ static int mpegps_read_packet(AVFormatContext *s,
     return 0;
 }
 
-static int mpegps_read_close(AVFormatContext *s)
-{
-    return 0;
-}
-
 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
                                int64_t *ppos, int64_t pos_limit)
 {
@@ -543,7 +552,9 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
 #ifdef DEBUG_SEEK
     printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next);
 #endif
-    url_fseek(s->pb, pos, SEEK_SET);
+    if (url_fseek(s->pb, pos, SEEK_SET) < 0)
+        return AV_NOPTS_VALUE;
+
     for(;;) {
         len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
         if (len < 0) {
@@ -567,13 +578,13 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
 
 AVInputFormat mpegps_demuxer = {
     "mpeg",
-    "MPEG PS format",
+    NULL_IF_CONFIG_SMALL("MPEG-PS format"),
     sizeof(MpegDemuxContext),
     mpegps_probe,
     mpegps_read_header,
     mpegps_read_packet,
-    mpegps_read_close,
+    NULL,
     NULL, //mpegps_read_seek,
     mpegps_read_dts,
-    .flags = AVFMT_SHOW_IDS,
+    .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT,
 };