diff --git a/HISTORY b/HISTORY index 1c35633e..15793e93 100644 --- a/HISTORY +++ b/HISTORY @@ -8972,3 +8972,9 @@ Video Disk Recorder Revision History plugins that implement a derived cDevice need to call Decrypt() in their GetTSPacket() function even if the incoming buffer is currently empty (see cDvbDevice::GetTSPacket()). +- cTSBuffer::Skip() no longer immediately deletes the given number of bytes from the + TS buffer, but rather stores the number for later deletion in the next call to + Get(). This is necessary because in cDvbDevice::GetTSPacket() tsBuffer->Skip() + is called, but the actual TS packet returned (pointed to by Data) may well be + (and typically is, unless the CAM copies the data) in the area of the buffer that + would be deleted by Skip(). diff --git a/device.c b/device.c index 38eb77f3..42cd21f9 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 4.13 2017/04/14 09:38:42 kls Exp $ + * $Id: device.c 4.14 2017/04/15 09:44:50 kls Exp $ */ #include "device.h" @@ -1824,7 +1824,7 @@ cTSBuffer::cTSBuffer(int File, int Size, int CardIndex) SetDescription("device %d TS buffer", CardIndex); f = File; cardIndex = CardIndex; - delivered = false; + delivered = 0; ringBuffer = new cRingBufferLinear(Size, TS_SIZE, true, "TS"); ringBuffer->SetTimeouts(100, 100); ringBuffer->SetIoThrottle(); @@ -1864,8 +1864,8 @@ uchar *cTSBuffer::Get(int *Available, bool CheckAvailable) { int Count = 0; if (delivered) { - ringBuffer->Del(TS_SIZE); - delivered = false; + ringBuffer->Del(delivered); + delivered = 0; } if (CheckAvailable && ringBuffer->Available() < TS_SIZE) return NULL; @@ -1882,7 +1882,7 @@ uchar *cTSBuffer::Get(int *Available, bool CheckAvailable) esyslog("ERROR: skipped %d bytes to sync on TS packet on device %d", Count, cardIndex); return NULL; } - delivered = true; + delivered = TS_SIZE; if (Available) *Available = Count; return p; @@ -1892,6 +1892,5 @@ uchar *cTSBuffer::Get(int *Available, bool CheckAvailable) void cTSBuffer::Skip(int Count) { - ringBuffer->Del(Count); - delivered = false; + delivered = Count; } diff --git a/device.h b/device.h index 97d8ad91..3f50e6b7 100644 --- a/device.h +++ b/device.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 4.6 2017/04/14 09:59:20 kls Exp $ + * $Id: device.h 4.7 2017/04/15 09:41:34 kls Exp $ */ #ifndef __DEVICE_H @@ -840,7 +840,7 @@ class cTSBuffer : public cThread { private: int f; int cardIndex; - bool delivered; + int delivered; cRingBufferLinear *ringBuffer; virtual void Action(void); public: