summaryrefslogtreecommitdiff
path: root/client/device.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 /client/device.c
downloadvdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.gz
vdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.bz2
Initial revision
Diffstat (limited to 'client/device.c')
-rw-r--r--client/device.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/client/device.c b/client/device.c
new file mode 100644
index 0000000..50510e2
--- /dev/null
+++ b/client/device.c
@@ -0,0 +1,185 @@
+/*
+ * $Id: device.c,v 1.1 2004/12/30 22:44:00 lordjaxom Exp $
+ */
+
+#include "client/device.h"
+#include "client/setup.h"
+#include "client/assembler.h"
+#include "client/filter.h"
+
+#include "tools/select.h"
+#include "tools/string.h"
+
+#include <vdr/channels.h>
+#include <vdr/ringbuffer.h>
+#include <vdr/eit.h>
+#include <vdr/timers.h>
+
+#include <time.h>
+#include <iostream>
+
+using namespace std;
+
+#define VIDEOBUFSIZE MEGABYTE(3)
+
+cStreamdevDevice *cStreamdevDevice::m_Device = NULL;
+
+cStreamdevDevice::cStreamdevDevice(void) {
+ m_Channel = NULL;
+ m_TSBuffer = NULL;
+ m_Assembler = NULL;
+
+#if VDRVERSNUM < 10300
+# if defined(HAVE_AUTOPID)
+ (void)new cSIProcessor(new cSectionsScanner(""));
+# else
+ (void)new cSIProcessor("");
+# endif
+ cSIProcessor::Read();
+#else
+ m_Filters = new cStreamdevFilters;
+ StartSectionHandler();
+ cSchedules::Read();
+#endif
+
+ m_Device = this;
+
+ if (StreamdevClientSetup.SyncEPG)
+ ClientSocket.SynchronizeEPG();
+}
+
+cStreamdevDevice::~cStreamdevDevice() {
+ Dprintf("Device gets destructed\n");
+ m_Device = NULL;
+ delete m_TSBuffer;
+ delete m_Assembler;
+#if VDRVERSNUM >= 10300
+ delete m_Filters;
+#endif
+}
+
+bool cStreamdevDevice::ProvidesSource(int Source) const {
+ Dprintf("ProvidesSource, Source=%d\n", Source);
+ return false;
+}
+
+bool cStreamdevDevice::ProvidesChannel(const cChannel *Channel, int Priority,
+ bool *NeedsDetachReceivers) const {
+ bool res = false;
+ bool prio = Priority < 0 || Priority > this->Priority();
+ bool ndr = false;
+ Dprintf("ProvidesChannel, Channel=%s, Prio=%d\n", Channel->Name(), Priority);
+
+ if (ClientSocket.DataSocket(siLive) != NULL
+ && TRANSPONDER(Channel, m_Channel))
+ res = true;
+ else {
+ res = prio && ClientSocket.ProvidesChannel(Channel, Priority);
+ ndr = true;
+ }
+
+ if (NeedsDetachReceivers)
+ *NeedsDetachReceivers = ndr;
+ Dprintf("prov res = %d, ndr = %d\n", res, ndr);
+ return res;
+}
+
+bool cStreamdevDevice::SetChannelDevice(const cChannel *Channel,
+ bool LiveView) {
+ Dprintf("SetChannelDevice Channel: %s, LiveView: %s\n", Channel->Name(),
+ LiveView ? "true" : "false");
+
+ if (LiveView)
+ return false;
+
+ if (ClientSocket.DataSocket(siLive) != NULL
+ && TRANSPONDER(Channel, m_Channel))
+ return true;
+
+ m_Channel = Channel;
+ return ClientSocket.SetChannelDevice(m_Channel);
+}
+
+bool cStreamdevDevice::SetPid(cPidHandle *Handle, int Type, bool On) {
+ Dprintf("SetPid, Pid=%d, Type=%d, On=%d, used=%d\n", Handle->pid, Type, On,
+ Handle->used);
+ if (Handle->pid && (On || !Handle->used))
+ return ClientSocket.SetPid(Handle->pid, On);
+ return true;
+}
+
+bool cStreamdevDevice::OpenDvr(void) {
+ Dprintf("OpenDvr\n");
+ if (ClientSocket.CreateDataConnection(siLive)) {
+ m_Assembler = new cStreamdevAssembler(ClientSocket.DataSocket(siLive));
+ m_TSBuffer = new cTSBuffer(m_Assembler->ReadPipe(), MEGABYTE(2),
+ CardIndex() + 1);
+ Dprintf("waiting\n");
+ m_Assembler->WaitForFill();
+ Dprintf("resuming\n");
+ return true;
+ }
+ return false;
+}
+
+void cStreamdevDevice::CloseDvr(void) {
+ Dprintf("CloseDvr\n");
+
+ ClientSocket.CloseDvr();
+ DELETENULL(m_TSBuffer);
+ DELETENULL(m_Assembler);
+}
+
+bool cStreamdevDevice::GetTSPacket(uchar *&Data) {
+ if (m_TSBuffer) {
+ int r;
+ while ((r = m_TSBuffer->Read()) >= 0) {
+ Data = m_TSBuffer->Get();
+#if VDRVERSNUM >= 10300
+ if (Data != NULL) {
+ u_short pid = (((u_char)Data[1] & PID_MASK_HI) << 8) | Data[2];
+ u_char tid = Data[3];
+ if (m_Filters->Matches(pid, tid)) {
+ m_Filters->Put(Data);
+ continue;
+ }
+ }
+#endif
+ return true;
+ }
+ if (FATALERRNO) {
+ LOG_ERROR;
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+#if VDRVERSNUM >= 10300
+int cStreamdevDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) {
+ Dprintf("OpenFilter\n");
+ if (StreamdevClientSetup.StreamFilters
+ && ClientSocket.SetFilter(Pid, Tid, Mask, true)) {
+ return m_Filters->OpenFilter(Pid, Tid, Mask);
+ } else
+ return -1;
+}
+#endif
+
+bool cStreamdevDevice::Init(void) {
+ if (m_Device == NULL && StreamdevClientSetup.StartClient)
+ new cStreamdevDevice;
+ return true;
+}
+
+bool cStreamdevDevice::ReInit(void) {
+ ClientSocket.Quit();
+ ClientSocket.Reset();
+ if (m_Device != NULL) {
+ DELETENULL(m_Device->m_TSBuffer);
+ DELETENULL(m_Device->m_Assembler);
+ }
+ return StreamdevClientSetup.StartClient ? Init() : true;
+}
+