vdr-1.7.1 video stream format

Message ID 20081125090903.M58921@linogate.de
State New
Headers

Commit Message

Frank Schmirler Nov. 25, 2008, 9:15 a.m. UTC
  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
  

Comments

Stefan Lucke Nov. 26, 2008, 8:06 p.m. UTC | #1
On Tuesday 25 November 2008, Frank Schmirler wrote:
> 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.

Sorry, but this version does not help much.

Without patch ffplay & mplayer can play dumped TS packets.
With patch mplayer plays fine whereas ffplay only plays audio (no video),
and softdevice only has some audible clicks.

My main concern is that softdevice  PlayTs*() never gets called and
while writing these lines, I found the typo PlayTS vs PlayTs.
  

Patch

--- 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)