diff options
Diffstat (limited to 'server/livefilter.c')
-rw-r--r-- | server/livefilter.c | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/server/livefilter.c b/server/livefilter.c index 67b0e37..113789b 100644 --- a/server/livefilter.c +++ b/server/livefilter.c @@ -2,14 +2,36 @@ * $Id: livefilter.c,v 1.7 2009/02/13 13:02:40 schmirl Exp $ */ +#include <vdr/filter.h> + #include "server/livefilter.h" -#include "server/streamer.h" #include "common.h" #ifndef TS_SYNC_BYTE # define TS_SYNC_BYTE 0x47 #endif + +// --- cStreamdevLiveFilter ------------------------------------------------- + +class cStreamdevLiveFilter: public cFilter { +private: + cStreamdevStreamer *m_Streamer; + +protected: + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length); + +public: + cStreamdevLiveFilter(cStreamdevStreamer *Streamer); + + void Set(u_short Pid, u_char Tid, u_char Mask) { + cFilter::Set(Pid, Tid, Mask); + } + void Del(u_short Pid, u_char Tid, u_char Mask) { + cFilter::Del(Pid, Tid, Mask); + } +}; + cStreamdevLiveFilter::cStreamdevLiveFilter(cStreamdevStreamer *Streamer) { m_Streamer = Streamer; } @@ -37,3 +59,68 @@ void cStreamdevLiveFilter::Process(u_short Pid, u_char Tid, const u_char *Data, m_Streamer->ReportOverflow(TS_SIZE - p); } } + +// --- cStreamdevFilterStreamer ------------------------------------------------- + +cStreamdevFilterStreamer::cStreamdevFilterStreamer(): + cStreamdevStreamer("streamdev-filterstreaming"), + m_Device(NULL), + m_Filter(NULL)/*, + m_Channel(NULL)*/ +{ +} + +cStreamdevFilterStreamer::~cStreamdevFilterStreamer() +{ + Dprintf("Desctructing Filter streamer\n"); + Detach(); + m_Device = NULL; + DELETENULL(m_Filter); + Stop(); +} + +void cStreamdevFilterStreamer::Attach(void) +{ + Dprintf("cStreamdevFilterStreamer::Attach()\n"); + LOCK_THREAD; + if(m_Device && m_Filter) + m_Device->AttachFilter(m_Filter); +} + +void cStreamdevFilterStreamer::Detach(void) +{ + Dprintf("cStreamdevFilterStreamer::Detach()\n"); + LOCK_THREAD; + if(m_Device && m_Filter) + m_Device->Detach(m_Filter); +} + +void cStreamdevFilterStreamer::SetDevice(cDevice *Device) +{ + Dprintf("cStreamdevFilterStreamer::SetDevice()\n"); + LOCK_THREAD; + Detach(); + m_Device = Device; + Attach(); +} + +bool cStreamdevFilterStreamer::SetFilter(u_short Pid, u_char Tid, u_char Mask, bool On) +{ + Dprintf("cStreamdevFilterStreamer::SetFilter(%u,0x%x,0x%x,%s)\n", Pid, Tid, Mask, On?"On":"Off"); + + if(!m_Device) + return false; + + if (On) { + if (m_Filter == NULL) { + m_Filter = new cStreamdevLiveFilter(this); + Dprintf("attaching filter to device\n"); + Attach(); + } + m_Filter->Set(Pid, Tid, Mask); + } else if (m_Filter != NULL) + m_Filter->Del(Pid, Tid, Mask); + + return true; +} + |