[FFmpeg-devel] [PATCH] mpeg: fix dvdaudio with multiple private streams

Baptiste Coudurier baptiste.coudurier at gmail.com
Mon Aug 29 20:35:22 CEST 2011


---
 libavformat/mpeg.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c
index 364473a..e6e5cfb 100644
--- a/libavformat/mpeg.c
+++ b/libavformat/mpeg.c
@@ -425,14 +425,16 @@ static int mpegps_read_packet(AVFormatContext *s,
     enum AVMediaType type;
     int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
     uint8_t av_uninit(dvdaudio_substream_type);
+    int sub_id;
 
  redo:
     len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
     if (len < 0)
         return len;
 
+    sub_id = startcode;
     if(startcode == 0x1bd) {
-        dvdaudio_substream_type = get_byte(s->pb);
+        sub_id = dvdaudio_substream_type = get_byte(s->pb);
         url_fskip(s->pb, 3);
         len -= 4;
     }
@@ -440,7 +442,7 @@ static int mpegps_read_packet(AVFormatContext *s,
     /* now find stream */
     for(i=0;i<s->nb_streams;i++) {
         st = s->streams[i];
-        if (st->id == startcode)
+        if (st->id == sub_id)
             goto found;
     }
 
@@ -515,6 +517,8 @@ static int mpegps_read_packet(AVFormatContext *s,
         switch(dvdaudio_substream_type & 0xe0) {
         case 0xa0:  codec_id = CODEC_ID_PCM_DVD;
                     break;
+        case 0xa1:  codec_id = CODEC_ID_PCM_DVD;
+                    break;
         case 0x80:  if((dvdaudio_substream_type & 0xf8) == 0x88)
                          codec_id = CODEC_ID_DTS;
                     else codec_id = CODEC_ID_AC3;
@@ -529,7 +533,7 @@ static int mpegps_read_packet(AVFormatContext *s,
         goto redo;
     }
     /* no stream found: add a new stream */
-    st = av_new_stream(s, startcode);
+    st = av_new_stream(s, sub_id);
     if (!st)
         goto skip;
     st->codec->codec_type = type;
-- 
1.7.5.4



More information about the ffmpeg-devel mailing list