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