]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add support for some obscure PES packaging that VLC produces. See Ticket #235
authorAndreas Öman <andreas@lonelycoder.com>
Thu, 19 Aug 2010 19:47:30 +0000 (19:47 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Thu, 19 Aug 2010 19:47:30 +0000 (19:47 +0000)
src/parsers.c
src/tvhead.h

index 9a503f973c94ea054ad88d2867bb6e43248ac7a9..5ae0c38f04ec81e99d068efec68527acac1651e3 100644 (file)
@@ -280,7 +280,9 @@ parse_sc(th_transport_t *t, th_stream_t *st, const uint8_t *data, int len,
 
       if(st->st_ssc_ptr < 5)
        continue;
-
+      uint16_t plen = st->st_ssc_buf[0] << 8 | st->st_ssc_buf[1];
+      if(plen >= 0xffdf)st->st_incomplete=1;
+      else st->st_incomplete=0;
       int hlen = st->st_ssc_buf[4];
 
       if(st->st_ssc_ptr < hlen + 5)
@@ -288,6 +290,8 @@ parse_sc(th_transport_t *t, th_stream_t *st, const uint8_t *data, int len,
       
       parse_pes_header(t, st, st->st_ssc_buf + 2, hlen + 3);
       st->st_ssc_intercept = 0;
+      if(st->st_buf.sb_ptr > 2) sc = st->st_buf.sb_data[st->st_buf.sb_ptr-3] << 16 | st->st_buf.sb_data[st->st_buf.sb_ptr-2] << 8 | st->st_buf.sb_data[st->st_buf.sb_ptr-1];
+
       continue;
     }
 
@@ -296,6 +300,11 @@ 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];
+        if(tempsc == 0x1e0)continue;
+    }
 
     r = st->st_buf.sb_ptr - st->st_startcode_offset - 4;
 
@@ -951,9 +960,11 @@ parse_h264(th_transport_t *t, th_stream_t *st, size_t len,
 
   if(sc >= 0x000001e0 && sc <= 0x000001ef) {
     /* System start codes for video */
-    if(len >= 9)
+    if(len >= 9){
+      uint16_t plen = buf[4] << 8 | buf[5];
+      if(plen >= 0xffe9) st->st_incomplete =1;
       parse_pes_header(t, st, buf + 6, len - 6);
-
+    }
     if(st->st_prevdts != PTS_UNSET && st->st_curdts != PTS_UNSET) {
       d = (st->st_curdts - st->st_prevdts) & 0x1ffffffffLL;
 
@@ -1023,7 +1034,7 @@ parse_h264(th_transport_t *t, th_stream_t *st, size_t len,
 
   if(next_startcode >= 0x000001e0 && next_startcode <= 0x000001ef) {
     /* Complete frame */
-
+    if (st->st_incomplete) return 4;
     th_pkt_t *pkt = st->st_curpkt;
     
     if(pkt != NULL) {
index cea3f092ee2a0e1fc70880794ee2b3fcf179a1b8..f208936a26559914b978019a51245e231e5ba230 100644 (file)
@@ -426,7 +426,7 @@ typedef struct th_stream {
 
   uint8_t *st_global_data;
   int st_global_data_len;
-
+  int st_incomplete;
   int st_ssc_intercept;
   int st_ssc_ptr;
   uint8_t st_ssc_buf[32];