diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2005-03-13 12:05:30 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2005-03-13 12:05:30 +0100 |
commit | 76ca67473cea85b87343794a7acca65164d56981 (patch) | |
tree | 4bb9fab8819e0c7f5f328be6ac1f024238c03e36 /remux.c | |
parent | 57e34f624058da34f2fa677e5e9af6b98a74c07f (diff) | |
download | vdr-76ca67473cea85b87343794a7acca65164d56981.tar.gz vdr-76ca67473cea85b87343794a7acca65164d56981.tar.bz2 |
Fixed cDolbyRepacker to allow recording ProSieben HD broadcasts
Diffstat (limited to 'remux.c')
-rw-r--r-- | remux.c | 25 |
1 files changed, 16 insertions, 9 deletions
@@ -11,7 +11,7 @@ * The cDolbyRepacker code was originally written by Reinhard Nissl <rnissl@gmx.de>, * and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de. * - * $Id: remux.c 1.31 2005/02/13 14:36:23 kls Exp $ + * $Id: remux.c 1.32 2005/03/13 12:02:15 kls Exp $ */ #include "remux.h" @@ -46,6 +46,8 @@ private: int fragmentTodo; uchar pesHeader[6 + 3 + 255 + 4 + 4]; int pesHeaderLen; + uchar pesHeaderBackup[6 + 3 + 255]; + int pesHeaderBackupLen; uchar chk1; uchar chk2; int ac3todo; @@ -131,6 +133,7 @@ void cDolbyRepacker::Reset(void) chk2 = 0; fragmentLen = 0; fragmentTodo = 0; + pesHeaderBackupLen = 0; } bool cDolbyRepacker::FinishRemainder(cRingBufferLinear *ResultBuffer, const uchar *const Data, const int Todo, int &Done, int &Bite) @@ -229,12 +232,17 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int if ((Data[6] & 0xC0) != 0x80) return 0; + // backup PES header + if (Data[6] != 0x80 || Data[7] != 0x00 || Data[8] != 0x00) { + pesHeaderBackupLen = 6 + 3 + Data[8]; + memcpy(pesHeaderBackup, Data, pesHeaderBackupLen); + } + // skip PES header int done = 6 + 3 + Data[8]; int todo = Count - done; const uchar *data = Data + done; - bool headerCopied = false; - + // look for 0x0B 0x77 <chk1> <chk2> <frameSize> while (todo > 0) { switch (state) { @@ -242,10 +250,10 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int if (*data == 0x0B) { ++(int &)state; // copy header information once for later use - if (!headerCopied) { - headerCopied = true; - pesHeaderLen = 6 + 3 + Data[8]; - memcpy(pesHeader, Data, pesHeaderLen); + if (pesHeaderBackupLen > 0) { + pesHeaderLen = pesHeaderBackupLen; + pesHeaderBackupLen = 0; + memcpy(pesHeader, pesHeaderBackup, pesHeaderLen); AppendSubStreamID(); } } @@ -279,9 +287,8 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int ac3todo = 2 * frameSizes[*data]; // frameSizeCode was invalid => restart searching if (ac3todo <= 0) { - // reset PES header instead of using/copying a wrong one + // reset PES header instead of using a wrong one ResetPesHeader(); - headerCopied = true; if (chk1 == 0x0B) { if (chk2 == 0x77) { state = store_chk1; |