On Mon, 24 Nov 2008 17:42:28 +0100, Stefan Lucke wrote
> On Monday 24 November 2008, Frank Schmirler wrote:
> > Unless I've overlooked some section repacker somewhere, there's a bug in
> > cPatPmtGenerator. I've already sent the attached patch to Klaus, but he 
> > didn't
> > have time to look at it yet.
> 
> Thanks,
> 
> but things went worse with that on my system:
> audio disappeared and nothing more to dump in PlayVideo() :-( .

Problem seems to be that my patch fixes the generator, but the same mistake is
made while parsing the TS packet. I attached an extended patch which fixes
parsing, too.

According to the dumps you sent me (thanks!), vdr-1.7.1 cPatPmtGenerator *is*
broken.

Frank
--- remux.c.orig	2008-11-13 13:39:48.000000000 +0100
+++ remux.c	2008-11-13 16:32:57.000000000 +0100
@@ -2298,6 +2298,7 @@
   p[i++] = 0x40; // flags (3), pid hi (5)
   p[i++] = 0x00; // pid lo
   p[i++] = 0x10; // flags (4), continuity counter (4)
+  p[i++] = 0x00; // pointer field (payload unit start indicator is set)
   int PayloadStart = i;
   p[i++] = 0x00; // table id
   p[i++] = 0xB0; // section syntax indicator (1), dummy (3), section length hi (4)
@@ -2367,13 +2368,18 @@
      MakeCRC(buf + i, buf, i);
      // split the PMT section into several TS packets:
      uchar *q = buf;
+     bool pusi = true;
      while (i > 0) {
            uchar *p = pmt[numPmtPackets++];
            int j = 0;
            p[j++] = 0x47; // TS indicator
-           p[j++] = 0x40 | (P_PNR >> 8); // flags (3), pid hi (5)
+           p[j++] = (pusi ? 0x40 : 0) | (P_PNR >> 8); // flags (3), pid hi (5)
            p[j++] = P_PNR & 0xFF; // pid lo
            p[j++] = 0x10; // flags (4), continuity counter (4)
+           if (pusi) {
+              p[j++] = 0x00; // pointer field (payload unit start indicator is set)
+              pusi = false;
+              }
            int l = TS_SIZE - j;
            memcpy(p + j, q, l);
            q += l;
--- remux.h.orig	2008-11-25 09:48:58.000000000 +0100
+++ remux.h	2008-11-25 10:05:41.000000000 +0100
@@ -114,7 +114,8 @@
 
 inline int TsPayloadOffset(const uchar *p)
 {
-  return (p[3] & TS_ADAPT_FIELD_EXISTS) ? p[4] + 5 : 4;
+  int o = (p[3] & TS_ADAPT_FIELD_EXISTS) ? p[4] + 5 : 4;
+  return TsPayloadStart(p) ? o + p[o] + 1 : o;
 }
 
 inline int TsGetPayload(const uchar **p)
_______________________________________________
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr

Reply via email to