summaryrefslogtreecommitdiff
path: root/server/livefilter.c
blob: 14f20fa40eb3556dce183971f4dd7b2561ca3016 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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