- transfer

This commit is contained in:
lordjaxom 2005-02-09 19:47:09 +00:00
parent 78b9b7c6ba
commit c1cb77c3f8
3 changed files with 68 additions and 12 deletions

View File

@ -33,10 +33,12 @@ cStreamdevLiveStreamer::cStreamdevLiveStreamer(int Priority):
cStreamdevStreamer("streamdev-livestreaming") { cStreamdevStreamer("streamdev-livestreaming") {
m_Priority = Priority; m_Priority = Priority;
m_NumPids = 0; m_NumPids = 0;
m_StreamType = stTSPIDS;
m_Channel = NULL; m_Channel = NULL;
m_Device = NULL; m_Device = NULL;
m_Receiver = NULL; m_Receiver = NULL;
m_Remux = NULL; m_Remux = NULL;
m_PESRemux = NULL;
} }
cStreamdevLiveStreamer::~cStreamdevLiveStreamer() { cStreamdevLiveStreamer::~cStreamdevLiveStreamer() {
@ -103,7 +105,8 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, eStreamType Str
Dprintf("Initializing Remuxer for full channel transfer\n"); Dprintf("Initializing Remuxer for full channel transfer\n");
printf("ca pid: %d\n", Channel->Ca()); printf("ca pid: %d\n", Channel->Ca());
m_Channel = Channel; m_Channel = Channel;
switch (StreamType) { m_StreamType = StreamType;
switch (m_StreamType) {
case stES: case stES:
{ {
int pid = ISRADIO(Channel) ? Channel->Apid(0) : Channel->Vpid(); int pid = ISRADIO(Channel) ? Channel->Apid(0) : Channel->Vpid();
@ -112,8 +115,8 @@ bool cStreamdevLiveStreamer::SetChannel(const cChannel *Channel, eStreamType Str
} }
case stPES: case stPES:
m_Remux = new cTS2PSRemux(Channel->Vpid(), Channel->Apid(0), Channel->Apid(1), m_PESRemux = new cRemux(Channel->Vpid(), Channel->Apids(), Channel->Dpids(),
Channel->Dpid(0), 0, false); Channel->Spids(), false);
return SetPid(Channel->Vpid(), true) return SetPid(Channel->Vpid(), true)
&& SetPid(Channel->Apid(0), true) && SetPid(Channel->Apid(0), true)
&& SetPid(Channel->Apid(1), true) && SetPid(Channel->Apid(1), true)
@ -156,6 +159,51 @@ bool cStreamdevLiveStreamer::SetFilter(u_short Pid, u_char Tid, u_char Mask,
#endif #endif
} }
int cStreamdevLiveStreamer::Put(const uchar *Data, int Count)
{
switch (m_StreamType) {
case stTS:
case stTSPIDS:
return cStreamdevStreamer::Put(Data, Count);
case stPES:
return m_PESRemux->Put(Data, Count);
default:
abort();
}
}
uchar *cStreamdevLiveStreamer::Get(int &Count)
{
switch (m_StreamType) {
case stTS:
case stTSPIDS:
return cStreamdevStreamer::Get(Count);
case stPES:
return m_PESRemux->Get(Count);
default:
abort();
}
}
void cStreamdevLiveStreamer::Del(int Count)
{
switch (m_StreamType) {
case stTS:
case stTSPIDS:
cStreamdevStreamer::Del(Count);
case stPES:
m_PESRemux->Del(Count);
default:
abort();
}
}
// TODO: Remuxer einbinden // TODO: Remuxer einbinden
#if 0 #if 0
uchar *cStreamdevLiveStreamer::Process(const uchar *Data, int &Count, int &Result) { uchar *cStreamdevLiveStreamer::Process(const uchar *Data, int &Count, int &Result) {

View File

@ -13,6 +13,7 @@
#endif #endif
class cTSRemux; class cTSRemux;
class cRemux;
class cStreamdevLiveReceiver: public cReceiver { class cStreamdevLiveReceiver: public cReceiver {
friend class cStreamdevLiveStreamer; friend class cStreamdevLiveStreamer;
@ -35,15 +36,14 @@ private:
int m_Priority; int m_Priority;
int m_Pids[MAXRECEIVEPIDS + 1]; int m_Pids[MAXRECEIVEPIDS + 1];
int m_NumPids; int m_NumPids;
eStreamType m_StreamType;
const cChannel *m_Channel; const cChannel *m_Channel;
cDevice *m_Device; cDevice *m_Device;
cStreamdevLiveReceiver *m_Receiver; cStreamdevLiveReceiver *m_Receiver;
cRemux *m_PESRemux;
cTSRemux *m_Remux; cTSRemux *m_Remux;
uchar *m_Buffer; uchar *m_Buffer;
protected:
//virtual uchar *Process(const uchar *Data, int &Count, int &Result);
public: public:
cStreamdevLiveStreamer(int Priority); cStreamdevLiveStreamer(int Priority);
virtual ~cStreamdevLiveStreamer(); virtual ~cStreamdevLiveStreamer();
@ -53,6 +53,10 @@ public:
bool SetChannel(const cChannel *Channel, eStreamType StreamType); bool SetChannel(const cChannel *Channel, eStreamType StreamType);
bool SetFilter(u_short Pid, u_char Tid, u_char Mask, bool On); bool SetFilter(u_short Pid, u_char Tid, u_char Mask, bool On);
virtual int Put(const uchar *Data, int Count);
virtual uchar *Get(int &Count);
virtual void Del(int Count);
virtual void Detach(void); virtual void Detach(void);
virtual void Attach(void); virtual void Attach(void);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: streamer.c,v 1.4 2005/02/08 19:54:52 lordjaxom Exp $ * $Id: streamer.c,v 1.5 2005/02/09 19:47:09 lordjaxom Exp $
*/ */
#include <vdr/ringbuffer.h> #include <vdr/ringbuffer.h>
@ -35,11 +35,15 @@ void cStreamdevWriter::Action(void)
int count; int count;
uchar *block = m_Streamer->Get(count); uchar *block = m_Streamer->Get(count);
if (!m_Socket->SafeWrite(block, count)) { if (block) {
esyslog("ERROR: streamdev-server: couldn't send data: %m"); if (!m_Socket->TimedWrite(block, count, 2000)) {
break; esyslog("ERROR: streamdev-server: couldn't send data: %m");
break;
}
if (count > max)
max = count;
m_Streamer->Del(count);
} }
m_Streamer->Del(count);
} }
m_Active = false; m_Active = false;
Dprintf("Max. Transmit Blocksize was: %d\n", max); Dprintf("Max. Transmit Blocksize was: %d\n", max);
@ -112,7 +116,7 @@ void cStreamdevStreamer::Action(void)
int got; int got;
uchar *block = m_RingBuffer->Get(got); uchar *block = m_RingBuffer->Get(got);
if (block && got > 0) { if (block) {
int count = Put(block, got); int count = Put(block, got);
if (count) if (count)
m_RingBuffer->Del(count); m_RingBuffer->Del(count);