vdr-1.7.1 video stream format

Message ID 20081124152720.M50222@linogate.de
State New
Headers

Commit Message

Frank Schmirler Nov. 24, 2008, 3:31 p.m. UTC
  On Mon, 24 Nov 2008 14:41:44 +0100, Stefan Lucke wrote
> - dumping the data I got via PlayVideo() to a file neither ffplay nor
>   mplayer can identify stream info from dumped data.

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.

Frank
  

Comments

Stefan Lucke Nov. 24, 2008, 4:42 p.m. UTC | #1
On Monday 24 November 2008, Frank Schmirler wrote:
> On Mon, 24 Nov 2008 14:41:44 +0100, Stefan Lucke wrote
> > - dumping the data I got via PlayVideo() to a file neither ffplay nor
> >   mplayer can identify stream info from dumped data.
> 
> 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() :-( .
  

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;