cTSBuffer::Skip() no longer immediately deletes the given number of bytes from the TS buffer

This commit is contained in:
Klaus Schmidinger 2017-04-15 09:55:32 +02:00
parent 1a160e7afe
commit 1f541487e0
3 changed files with 14 additions and 9 deletions

View File

@ -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().

View File

@ -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;
}

View File

@ -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: