summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorlordjaxom <lordjaxom>2005-02-08 13:59:16 +0000
committerlordjaxom <lordjaxom>2005-02-08 13:59:16 +0000
commit8e4556b0a982dab75d8ba3bb388965ecf47fa0b0 (patch)
treecda6583f76af5967c634fffe454b003052baf521 /server
parent04a5985dcc0a24a1ff7b8debd5e88d4de46bb989 (diff)
downloadvdr-plugin-streamdev-8e4556b0a982dab75d8ba3bb388965ecf47fa0b0.tar.gz
vdr-plugin-streamdev-8e4556b0a982dab75d8ba3bb388965ecf47fa0b0.tar.bz2
- first adoptions (transfer-commit)
Diffstat (limited to 'server')
-rw-r--r--server/connectionHTTP.c4
-rw-r--r--server/connectionVTP.c16
-rw-r--r--server/livefilter.c33
-rw-r--r--server/livestreamer.c99
-rw-r--r--server/livestreamer.h10
-rw-r--r--server/streamer.c4
-rw-r--r--server/streamer.h3
7 files changed, 56 insertions, 113 deletions
diff --git a/server/connectionHTTP.c b/server/connectionHTTP.c
index 7d20f80..0d3a039 100644
--- a/server/connectionHTTP.c
+++ b/server/connectionHTTP.c
@@ -1,5 +1,5 @@
/*
- * $Id: connectionHTTP.c,v 1.1 2004/12/30 22:44:19 lordjaxom Exp $
+ * $Id: connectionHTTP.c,v 1.2 2005/02/08 13:59:16 lordjaxom Exp $
*/
#include "server/connectionHTTP.h"
@@ -99,7 +99,7 @@ void cConnectionHTTP::Flushed(void) {
else
line.Format("<li><a href=\"http://%s:%d/%s\">%s</a></li>",
(const char*)LocalIp(), StreamdevServerSetup.HTTPServerPort,
- m_ListChannel->GetChannelID().ToString(), m_ListChannel->Name());
+ (const char*)m_ListChannel->GetChannelID().ToString(), m_ListChannel->Name());
if (!Respond(line))
DeferClose();
m_ListChannel = Channels.Next(m_ListChannel);
diff --git a/server/connectionVTP.c b/server/connectionVTP.c
index 2177905..092bd26 100644
--- a/server/connectionVTP.c
+++ b/server/connectionVTP.c
@@ -1,5 +1,5 @@
/*
- * $Id: connectionVTP.c,v 1.1 2004/12/30 22:44:21 lordjaxom Exp $
+ * $Id: connectionVTP.c,v 1.2 2005/02/08 13:59:16 lordjaxom Exp $
*/
#include "server/connectionVTP.h"
@@ -284,11 +284,11 @@ bool cConnectionVTP::CmdABRT(char *Opts) {
if (ep == Opts || (*ep != '\0' && *ep != ' '))
return Respond(500, "Use: ABRT Id");
- time_t st = time_ms();
+ cTimeMs starttime;
if (id == siLive)
DELETENULL(m_LiveStreamer);
- Dprintf("ABRT took %ld ms\n", time_ms() - st);
+ Dprintf("ABRT took %ld ms\n", starttime.Elapsed());
DELETENULL(m_DataSockets[id]);
return Respond(220, "Data connection closed");
}
@@ -422,7 +422,7 @@ bool cConnectionVTP::CmdLSTT(char *Option) {
if (isnumber(Option)) {
cTimer *timer = Timers.Get(strtol(Option, NULL, 10) - 1);
if (timer)
- Reply(250, "%d %s", timer->Index() + 1, timer->ToText(true));
+ Reply(250, "%d %s", timer->Index() + 1, (const char*)timer->ToText(true));
else
Reply(501, "Timer \"%s\" not defined", Option);
}
@@ -433,7 +433,7 @@ bool cConnectionVTP::CmdLSTT(char *Option) {
for (int i = 0; i < Timers.Count(); i++) {
cTimer *timer = Timers.Get(i);
if (timer)
- Reply(i < Timers.Count() - 1 ? -250 : 250, "%d %s", timer->Index() + 1, timer->ToText(true));
+ Reply(i < Timers.Count() - 1 ? -250 : 250, "%d %s", timer->Index() + 1, (const char*)timer->ToText(true));
else
Reply(501, "Timer \"%d\" not found", i + 1);
}
@@ -478,7 +478,7 @@ bool cConnectionVTP::CmdMODT(char *Option) {
isyslog("timer %d modified (%s)", timer->Index() + 1,
timer->HasFlags(tfActive) ? "active" : "inactive");
#endif
- Reply(250, "%d %s", timer->Index() + 1, timer->ToText(true));
+ Reply(250, "%d %s", timer->Index() + 1, (const char*)timer->ToText(true));
}
else
Reply(501, "Timer \"%d\" not defined", n);
@@ -501,11 +501,11 @@ bool cConnectionVTP::CmdNEWT(char *Option) {
Timers.Add(timer);
Timers.Save();
isyslog("timer %d added", timer->Index() + 1);
- Reply(250, "%d %s", timer->Index() + 1, timer->ToText(true));
+ Reply(250, "%d %s", timer->Index() + 1, (const char*)timer->ToText(true));
EXIT_WRAPPER();
}
else
- Reply(550, "Timer already defined: %d %s", t->Index() + 1, t->ToText(true));
+ Reply(550, "Timer already defined: %d %s", t->Index() + 1, (const char*)t->ToText(true));
}
else
Reply(501, "Error in timer settings");
diff --git a/server/livefilter.c b/server/livefilter.c
index 14f20fa..4524a88 100644
--- a/server/livefilter.c
+++ b/server/livefilter.c
@@ -1,5 +1,5 @@
/*
- * $Id: livefilter.c,v 1.1 2004/12/30 22:44:27 lordjaxom Exp $
+ * $Id: livefilter.c,v 1.2 2005/02/08 13:59:16 lordjaxom Exp $
*/
#include "server/livefilter.h"
@@ -15,12 +15,8 @@ cStreamdevLiveFilter::cStreamdevLiveFilter(cStreamdevLiveStreamer *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;
-
+void cStreamdevLiveFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
+{
uchar buffer[TS_SIZE];
int length = Length;
int pos = 0;
@@ -37,27 +33,8 @@ void cStreamdevLiveFilter::Process(u_short Pid, u_char Tid, const u_char *Data,
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();
- }
+ if (p != TS_SIZE)
+ m_Streamer->ReportOverflow(TS_SIZE - p);
}
}
diff --git a/server/livestreamer.c b/server/livestreamer.c
index 4204ea3..7848d3f 100644
--- a/server/livestreamer.c
+++ b/server/livestreamer.c
@@ -5,55 +5,29 @@
#include "remux/ts2es.h"
#include "common.h"
-cStreamdevLiveReceiver::cStreamdevLiveReceiver(cStreamdevLiveStreamer *Streamer,
- int Ca, int Priority,
- int Pid1, int Pid2, int Pid3, int Pid4,
- int Pid5, int Pid6, int Pid7, int Pid8,
- int Pid9, int Pid10, int Pid11, int Pid12,
- int Pid13, int Pid14, int Pid15, int Pid16):
- cReceiver(Ca, Priority, 16,
- Pid1, Pid2, Pid3, Pid4, Pid5, Pid6, Pid7, Pid8,
- Pid9, Pid10, Pid11, Pid12, Pid13, Pid14, Pid15, Pid16) {
- m_Streamer = Streamer;
+cStreamdevLiveReceiver::cStreamdevLiveReceiver(cStreamdevLiveStreamer *Streamer, int Ca,
+ int Priority, const int *Pids):
+ cReceiver(Ca, Priority, 0, Pids),
+ m_Streamer(Streamer)
+{
}
-cStreamdevLiveReceiver::~cStreamdevLiveReceiver() {
+cStreamdevLiveReceiver::~cStreamdevLiveReceiver()
+{
Dprintf("Killing live receiver\n");
Detach();
}
void cStreamdevLiveReceiver::Receive(uchar *Data, int Length) {
- static time_t firsterr = 0;
- static int errcnt = 0;
- static bool showerr = true;
-
int p = m_Streamer->Put(Data, Length);
- if (p != Length) {
- ++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)", Length - p);
- else
- firsterr = time_ms();
- }
+ if (p != Length)
+ m_Streamer->ReportOverflow(Length - p);
}
cStreamdevLiveStreamer::cStreamdevLiveStreamer(int Priority):
cStreamdevStreamer("Live streamer") {
m_Priority = Priority;
+ m_NumPids = 0;
m_Channel = NULL;
m_Device = NULL;
m_Receiver = NULL;
@@ -91,40 +65,33 @@ void cStreamdevLiveStreamer::Start(cTBSocket *Socket) {
bool cStreamdevLiveStreamer::SetPid(int Pid, bool On) {
int idx;
- bool haspids = false;
if (On) {
- for (idx = 0; idx < MAXRECEIVEPIDS; ++idx) {
+ for (idx = 0; idx < m_NumPids; ++idx) {
if (m_Pids[idx] == Pid)
return true; // No change needed
- else if (m_Pids[idx] == 0) {
- m_Pids[idx] = Pid;
- haspids = true;
- break;
- }
}
- if (idx == MAXRECEIVEPIDS) {
+ if (m_NumPids == MAXRECEIVEPIDS) {
esyslog("ERROR: Streamdev: No free slot to receive pid %d\n", Pid);
return false;
}
+
+ m_Pids[m_NumPids++] = Pid;
+ m_Pids[m_NumPids] = 0;
} else {
- for (idx = 0; idx < MAXRECEIVEPIDS; ++idx) {
- if (m_Pids[idx] == Pid)
- m_Pids[idx] = 0;
- else if (m_Pids[idx] != 0)
- haspids = true;
+ for (idx = 0; idx < m_NumPids; ++idx) {
+ if (m_Pids[idx] == Pid) {
+ --m_NumPids;
+ memmove(&m_Pids[idx], &m_Pids[idx + 1], sizeof(int) * (m_NumPids - idx));
+ }
}
}
DELETENULL(m_Receiver);
- if (haspids) {
+ if (m_NumPids > 0) {
Dprintf("Creating Receiver to respect changed pids\n");
- m_Receiver = new cStreamdevLiveReceiver(this, m_Channel->Ca(), m_Priority,
- m_Pids[0], m_Pids[1], m_Pids[2], m_Pids[3],
- m_Pids[4], m_Pids[5], m_Pids[6], m_Pids[7],
- m_Pids[8], m_Pids[9], m_Pids[10], m_Pids[11],
- m_Pids[12], m_Pids[13], m_Pids[14], m_Pids[15]);
+ m_Receiver = new cStreamdevLiveReceiver(this, m_Channel->Ca(), m_Priority, m_Pids);
if (m_Device != NULL) {
Dprintf("Attaching new receiver\n");
m_Device->AttachReceiver(m_Receiver);
@@ -141,32 +108,32 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, int StreamType,
switch (StreamType) {
case stES:
{
- int pid = ISRADIO(Channel) ? Channel->Apid1() : Channel->Vpid();
+ int pid = ISRADIO(Channel) ? Channel->Apid(0) : Channel->Vpid();
m_Remux = new cTS2ESRemux(pid);
return SetPid(pid, true);
}
case stPES:
- m_Remux = new cTS2PSRemux(Channel->Vpid(), Channel->Apid1(),
- Channel->Apid2(), Channel->Dpid1(), 0, false);
+ m_Remux = new cTS2PSRemux(Channel->Vpid(), Channel->Apid(0), Channel->Apid(1),
+ Channel->Dpid(0), 0, false);
return SetPid(Channel->Vpid(), true)
- && SetPid(Channel->Apid1(), true)
- && SetPid(Channel->Apid2(), true)
- && SetPid(Channel->Dpid1(), true);
+ && SetPid(Channel->Apid(0), true)
+ && SetPid(Channel->Apid(1), true)
+ && SetPid(Channel->Dpid(0), true);
break;
case stPS:
- m_Remux = new cTS2PSRemux(Channel->Vpid(), Channel->Apid1(), 0, 0, 0, true);
+ m_Remux = new cTS2PSRemux(Channel->Vpid(), Channel->Apid(0), 0, 0, 0, true);
return SetPid(Channel->Vpid(), true)
- && SetPid(Channel->Apid1(), true);
+ && SetPid(Channel->Apid(0), true);
break;
case stTS:
if (!StreamPIDS) {
return SetPid(Channel->Vpid(), true)
- && SetPid(Channel->Apid1(), true)
- && SetPid(Channel->Apid2(), true)
- && SetPid(Channel->Dpid1(), true);
+ && SetPid(Channel->Apid(0), true)
+ && SetPid(Channel->Apid(1), true)
+ && SetPid(Channel->Dpid(0), true);
}
Dprintf("pid streaming mode\n");
return true;
diff --git a/server/livestreamer.h b/server/livestreamer.h
index 7682206..62137d1 100644
--- a/server/livestreamer.h
+++ b/server/livestreamer.h
@@ -24,18 +24,16 @@ protected:
virtual void Receive(uchar *Data, int Length);
public:
- cStreamdevLiveReceiver(cStreamdevLiveStreamer *Streamer, int Priority, int Ca,
- int Pid1 = 0, int Pid2 = 0, int Pid3 = 0, int Pid4 = 0,
- int Pid5 = 0, int Pid6 = 0, int Pid7 = 0, int Pid8 = 0,
- int Pid9 = 0, int Pid10 = 0, int Pid11 = 0, int Pid12 = 0,
- int Pid13 = 0, int Pid14 = 0, int Pid15 = 0, int Pid16 = 0);
+ cStreamdevLiveReceiver(cStreamdevLiveStreamer *Streamer, int Ca, int Priority,
+ const int *Pids);
virtual ~cStreamdevLiveReceiver();
};
class cStreamdevLiveStreamer: public cStreamdevStreamer {
private:
int m_Priority;
- int m_Pids[MAXRECEIVEPIDS];
+ int m_Pids[MAXRECEIVEPIDS + 1];
+ int m_NumPids;
const cChannel *m_Channel;
cDevice *m_Device;
cStreamdevLiveReceiver *m_Receiver;
diff --git a/server/streamer.c b/server/streamer.c
index 2ffd1cd..d26f518 100644
--- a/server/streamer.c
+++ b/server/streamer.c
@@ -1,5 +1,5 @@
/*
- * $Id: streamer.c,v 1.1 2004/12/30 22:44:21 lordjaxom Exp $
+ * $Id: streamer.c,v 1.2 2005/02/08 13:59:16 lordjaxom Exp $
*/
#include <vdr/ringbuffer.h>
@@ -13,7 +13,7 @@
#include "tools/socket.h"
#include "common.h"
-#define VIDEOBUFSIZE MEGABYTE(3)
+#define VIDEOBUFSIZE MEGABYTE(4)
#define MAXBLOCKSIZE TS_SIZE*10
cStreamdevStreamer::cStreamdevStreamer(const char *Name)
diff --git a/server/streamer.h b/server/streamer.h
index 1bfcc47..0f374b5 100644
--- a/server/streamer.h
+++ b/server/streamer.h
@@ -1,5 +1,5 @@
/*
- * $Id: streamer.h,v 1.1 2004/12/30 22:44:21 lordjaxom Exp $
+ * $Id: streamer.h,v 1.2 2005/02/08 13:59:16 lordjaxom Exp $
*/
#ifndef VDR_STREAMDEV_STREAMER_H
@@ -34,6 +34,7 @@ public:
virtual void Stop(void);
int Put(uchar *Data, int Length) { return m_RingBuffer->Put(Data, Length); }
+ void ReportOverflow(int Bytes) { m_RingBuffer->ReportOverflow(Bytes); }
virtual void Detach(void) = 0;
virtual void Attach(void) = 0;