summaryrefslogtreecommitdiff
path: root/server/streamer.c
diff options
context:
space:
mode:
authorschmirl <schmirl>2009-02-13 10:39:40 +0000
committerschmirl <schmirl>2009-02-13 10:39:40 +0000
commite3599df3083ec6aa9b8656589a171e2c5d3d7e7a (patch)
tree875d67c52b228d945bf95e640ef57f1270319f72 /server/streamer.c
parentfa06a6068bd47868fe65b24af8f0a469ae6b46a6 (diff)
downloadvdr-plugin-streamdev-e3599df3083ec6aa9b8656589a171e2c5d3d7e7a.tar.gz
vdr-plugin-streamdev-e3599df3083ec6aa9b8656589a171e2c5d3d7e7a.tar.bz2
Added IGMP Multicast server
Modified Files: Tag: v0_4 CONTRIBUTORS HISTORY Makefile README i18n.c server/component.c server/component.h server/connection.c server/connection.h server/livefilter.c server/server.c server/setup.c server/setup.h server/streamer.c server/streamer.h streamdev/streamdevhosts.conf tools/socket.c tools/socket.h Added Files: Tag: v0_4 patches/vdr-cap_net_raw.diff server/componentIGMP.c server/componentIGMP.h server/connectionIGMP.c server/connectionIGMP.h
Diffstat (limited to 'server/streamer.c')
-rw-r--r--server/streamer.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/server/streamer.c b/server/streamer.c
index 7ee7f12..7c5cb50 100644
--- a/server/streamer.c
+++ b/server/streamer.c
@@ -1,5 +1,5 @@
/*
- * $Id: streamer.c,v 1.16.2.1 2008/10/22 11:59:37 schmirl Exp $
+ * $Id: streamer.c,v 1.16.2.2 2009/02/13 10:39:42 schmirl Exp $
*/
#include <vdr/ringbuffer.h>
@@ -55,16 +55,33 @@ void cStreamdevWriter::Action(void)
if (sel.CanWrite(*m_Socket)) {
int written;
- if ((written = m_Socket->Write(block + offset, count)) == -1) {
- esyslog("ERROR: streamdev-server: couldn't send data: %m");
+ int pkgsize = count;
+ // SOCK_DGRAM indicates multicast
+ if (m_Socket->Type() == SOCK_DGRAM) {
+ // don't fragment multicast packets
+ // max. payload on standard local ethernet is 1416 to 1456 bytes
+ // and some STBs expect complete TS packets
+ // so let's always limit to 7 * TS_SIZE = 1316
+ if (pkgsize > 7 * TS_SIZE)
+ pkgsize = 7 * TS_SIZE;
+ else
+ pkgsize -= pkgsize % TS_SIZE;
+ }
+ if ((written = m_Socket->Write(block + offset, pkgsize)) == -1) {
+ esyslog("ERROR: streamdev-server: couldn't send %d bytes: %m", pkgsize);
break;
}
+
+ // statistics
if (count > max)
max = count;
offset += written;
count -= written;
- if (count == 0) {
+
+ // less than one TS packet left:
+ // delete what we've written so far and get next chunk
+ if (count < TS_SIZE) {
m_Streamer->Del(offset);
block = NULL;
}