summaryrefslogtreecommitdiff
path: root/server/livefilter.c
diff options
context:
space:
mode:
authorlordjaxom <lordjaxom>2004-12-30 22:43:55 +0000
committerlordjaxom <lordjaxom>2004-12-30 22:43:55 +0000
commit302fa2e67276bd0674e81e2a9a01b9e91dd45d8c (patch)
treea454884a16e0ffa48b5ce3e4ce1a66eb874a9de0 /server/livefilter.c
downloadvdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.gz
vdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.bz2
Initial revision
Diffstat (limited to 'server/livefilter.c')
-rw-r--r--server/livefilter.c64
1 files changed, 64 insertions, 0 deletions
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