From 302fa2e67276bd0674e81e2a9a01b9e91dd45d8c Mon Sep 17 00:00:00 2001 From: lordjaxom Date: Thu, 30 Dec 2004 22:43:55 +0000 Subject: Initial revision --- server/livefilter.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 server/livefilter.c (limited to 'server/livefilter.c') diff --git a/server/livefilter.c b/server/livefilter.c new file mode 100644 index 0000000..14f20fa --- /dev/null +++ b/server/livefilter.c @@ -0,0 +1,64 @@ +/* + * $Id: livefilter.c,v 1.1 2004/12/30 22:44:27 lordjaxom Exp $ + */ + +#include "server/livefilter.h" +#include "server/livestreamer.h" +#include "common.h" + +#if VDRVERSNUM >= 10300 + +cStreamdevLiveFilter::cStreamdevLiveFilter(cStreamdevLiveStreamer *Streamer) { + m_Streamer = Streamer; +} + +cStreamdevLiveFilter::~cStreamdevLiveFilter() { +} + +void cStreamdevLiveFilter::Process(u_short Pid, u_char Tid, const u_char *Data, + int Length) { + static time_t firsterr = 0; + static int errcnt = 0; + static bool showerr = true; + + uchar buffer[TS_SIZE]; + int length = Length; + int pos = 0; + + while (length > 0) { + int chunk = min(length, TS_SIZE - 5); + buffer[0] = TS_SYNC_BYTE; + buffer[1] = (Pid >> 8) & 0xff; + buffer[2] = Pid & 0xff; + buffer[3] = Tid; + buffer[4] = (uchar)chunk; + memcpy(buffer + 5, Data + pos, chunk); + length -= chunk; + pos += chunk; + + int p = m_Streamer->Put(buffer, TS_SIZE); + if (p != TS_SIZE) { + ++errcnt; + if (showerr) { + if (firsterr == 0) + firsterr = time_ms(); + else if (firsterr + BUFOVERTIME > time_ms() && errcnt > BUFOVERCOUNT) { + esyslog("ERROR: too many buffer overflows, logging stopped"); + showerr = false; + firsterr = time_ms(); + } + } else if (firsterr + BUFOVERTIME < time_ms()) { + showerr = true; + firsterr = 0; + errcnt = 0; + } + + if (showerr) + esyslog("ERROR: ring buffer overflow (%d bytes dropped)", TS_SIZE - p); + else + firsterr = time_ms(); + } + } +} + +#endif // VDRVERSNUM >= 10300 -- cgit v1.2.3