]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix parsing of PS MPEG audio. Ticket #260
authorAndreas Öman <andreas@lonelycoder.com>
Sun, 5 Sep 2010 10:18:13 +0000 (10:18 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Sun, 5 Sep 2010 10:18:13 +0000 (10:18 +0000)
src/parsers.c

index 124941f20123bf59eff0a894422d5b3f1ba8e91f..61cd12df7e5b58d96cf4942f35c9bdf71536184d 100644 (file)
@@ -105,6 +105,8 @@ static void parse_subtitles(th_transport_t *t, th_stream_t *st,
 static int parse_mpa(th_transport_t *t, th_stream_t *st, size_t len,
                     uint32_t next_startcode, int sc_offset);
 
+static int parse_mpa2(th_transport_t *t, th_stream_t *st);
+
 static int parse_ac3(th_transport_t *t, th_stream_t *st, size_t len,
                     uint32_t next_startcode, int sc_offset);
 
@@ -166,7 +168,7 @@ parse_mpeg_ps(th_transport_t *t, th_stream_t *st, uint8_t *data, int len)
   int hlen;
 
   hlen = parse_pes_header(t, st, data, len);
-#if 0  
+#if 0
   int i;
   for(i = 0; i < 16; i++)
     printf("%02x.", data[i]);
@@ -180,7 +182,8 @@ parse_mpeg_ps(th_transport_t *t, th_stream_t *st, uint8_t *data, int len)
 
   switch(st->st_type) {
   case SCT_MPEG2AUDIO:
-    parse_sc(t, st, data, len, parse_mpa);
+    sbuf_append(&st->st_buf_a, data, len);
+    parse_mpa2(t, st);
     break;
 
   case SCT_MPEG2VIDEO:
@@ -300,6 +303,7 @@ parse_sc(th_transport_t *t, th_stream_t *st, const uint8_t *data, int len,
 
     if((sc & 0xffffff00) != 0x00000100)
       continue;
+
     if(sc == 0x100 && (len-i)>3) {
 
         uint32_t tempsc = data[i+1]<< 16 | data [i+2] << 8 | data [i+3];
@@ -431,16 +435,15 @@ mpa_valid_frame(const uint8_t *buf)
 }
 
 
-static int 
-parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen,
-         uint32_t next_startcode, int sc_offset)
+/**
+ *
+ */
+static int
+parse_mpa2(th_transport_t *t, th_stream_t *st)
 {
   int i, len;
   const uint8_t *buf;
 
-  if((i = depacketize(t, st, ilen, next_startcode, sc_offset)) != 0)
-    return i;
-
  again:
   buf = st->st_buf_a.sb_data;
   len = st->st_buf_a.sb_ptr;
@@ -474,6 +477,20 @@ parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen,
   return 1;
 }
 
+/**
+ *
+ */
+static int 
+parse_mpa(th_transport_t *t, th_stream_t *st, size_t ilen,
+         uint32_t next_startcode, int sc_offset)
+{
+  int r;
+  
+  if((r = depacketize(t, st, ilen, next_startcode, sc_offset)) != 0)
+    return r;
+  return parse_mpa2(t, st);
+}
+
 
 /**
  * AC3 audio parser