summaryrefslogtreecommitdiff
path: root/remux.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2001-08-19 14:37:17 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2001-08-19 14:37:17 +0200
commit73870fc90706ced04a25f19ee72595eb3a9e4d2b (patch)
treeb2b78fb4cd0370d294aea56a58a3876dd867e6b1 /remux.c
parente994e3a4fef46bcd17aae84f04b552d2b32f7469 (diff)
downloadvdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.gz
vdr-73870fc90706ced04a25f19ee72595eb3a9e4d2b.tar.bz2
Fixed broken recordings after a driver buffer overflow
Diffstat (limited to 'remux.c')
-rw-r--r--remux.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/remux.c b/remux.c
index 3c7ec6e6..f89b897b 100644
--- a/remux.c
+++ b/remux.c
@@ -8,7 +8,7 @@
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
* VDR's needs.
*
- * $Id: remux.c 1.5 2001/06/24 16:37:23 kls Exp $
+ * $Id: remux.c 1.6 2001/08/19 11:52:05 kls Exp $
*/
/* The calling interface of the 'cRemux::Process()' function is defined
@@ -489,6 +489,8 @@ void cRemux::SetAudioPid(int APid)
resultCount = resultDelivered = 0;
}
+#define TS_SYNC_BYTE 0x47
+
const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType)
{
uchar dummyPictureType;
@@ -511,12 +513,27 @@ XXX*/
resultDelivered = 0;
}
+ int used = 0;
+
+ // Make sure we are looking at a TS packet:
+
+ while (Count > TS_SIZE) {
+ if (Data[0] == TS_SYNC_BYTE && Data[TS_SIZE] == TS_SYNC_BYTE)
+ break;
+ Data++;
+ Count--;
+ used++;
+ }
+ if (used)
+ esyslog(LOG_ERR, "ERROR: skipped %d byte to sync on TS packet", used);
+
// Convert incoming TS data into multiplexed PES:
- int used = 0;
for (int i = 0; i < Count; i += TS_SIZE) {
if (Count - i < TS_SIZE)
break;
+ if (Data[i] != TS_SYNC_BYTE)
+ break;
int pid = GetPid(Data + i + 1);
if (Data[i + 3] & 0x10) { // got payload
if (pid == vPid) vTS2PES->ts_to_pes(Data + i);