mirror of
https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
synced 2023-10-10 19:16:51 +02:00
server_connectionVTP-add-filter-stream.patch by Petri Hintukainen
- Add new stream for section filters data
This commit is contained in:
parent
9994ecfd08
commit
d012504c3a
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: connectionVTP.c,v 1.11 2007/04/24 11:03:41 schmirl Exp $
|
||||
* $Id: connectionVTP.c,v 1.12 2007/04/24 11:40:35 schmirl Exp $
|
||||
*/
|
||||
|
||||
#include "server/connectionVTP.h"
|
||||
@ -482,6 +482,8 @@ cConnectionVTP::~cConnectionVTP()
|
||||
free(m_LastCommand);
|
||||
delete m_LiveStreamer;
|
||||
delete m_LiveSocket;
|
||||
delete m_FilterStreamer;
|
||||
delete m_FilterSocket;
|
||||
delete m_LSTTHandler;
|
||||
delete m_LSTCHandler;
|
||||
delete m_LSTEHandler;
|
||||
@ -505,12 +507,14 @@ void cConnectionVTP::Reject(void)
|
||||
|
||||
void cConnectionVTP::Detach(void)
|
||||
{
|
||||
if (m_LiveStreamer != NULL) m_LiveStreamer->Detach();
|
||||
if (m_LiveStreamer) m_LiveStreamer->Detach();
|
||||
if (m_FilterStreamer) m_FilterStreamer->Detach();
|
||||
}
|
||||
|
||||
void cConnectionVTP::Attach(void)
|
||||
{
|
||||
if (m_LiveStreamer != NULL) m_LiveStreamer->Attach();
|
||||
if (m_LiveStreamer) m_LiveStreamer->Attach();
|
||||
if (m_FilterStreamer) m_FilterStreamer->Attach();
|
||||
}
|
||||
|
||||
bool cConnectionVTP::Command(char *Cmd)
|
||||
@ -578,6 +582,14 @@ bool cConnectionVTP::CmdCAPS(char *Opts)
|
||||
return Respond(220, "Capability \"%s\" accepted", Opts);
|
||||
}
|
||||
|
||||
#if VDRVERSNUM >= 10300
|
||||
//
|
||||
// Deliver section filters data in separate, channel-independent data stream
|
||||
//
|
||||
if (strcasecmp(Opts, "FILTERS") == 0)
|
||||
return Respond(220, "Capability \"%s\" accepted", Opts);
|
||||
#endif
|
||||
|
||||
return Respond(561, "Capability \"%s\" not known", Opts);
|
||||
}
|
||||
|
||||
@ -610,9 +622,14 @@ bool cConnectionVTP::CmdPORT(char *Opts)
|
||||
id = strtoul(Opts, &ep, 10);
|
||||
if (ep == Opts || !isspace(*ep))
|
||||
return Respond(500, "Use: PORT Id Destination");
|
||||
|
||||
if (id != 0)
|
||||
|
||||
#if VDRVERSNUM >= 10300
|
||||
if (id != siLive && id != siLiveFilter)
|
||||
return Respond(501, "Wrong connection id %d", id);
|
||||
#else
|
||||
if (id != siLive)
|
||||
return Respond(501, "Wrong connection id %d", id);
|
||||
#endif
|
||||
|
||||
Opts = skipspace(ep);
|
||||
n = 0;
|
||||
@ -639,6 +656,33 @@ bool cConnectionVTP::CmdPORT(char *Opts)
|
||||
|
||||
isyslog("Streamdev: Setting data connection to %s:%d", dataip, dataport);
|
||||
|
||||
#if VDRVERSNUM >= 10300
|
||||
if (id == siLiveFilter) {
|
||||
if(m_FilterStreamer)
|
||||
m_FilterStreamer->Stop();
|
||||
delete m_FilterSocket;
|
||||
|
||||
m_FilterSocket = new cTBSocket(SOCK_STREAM);
|
||||
if (!m_FilterSocket->Connect(dataip, dataport)) {
|
||||
esyslog("ERROR: Streamdev: Couldn't open data connection to %s:%d: %s",
|
||||
dataip, dataport, strerror(errno));
|
||||
DELETENULL(m_FilterSocket);
|
||||
return Respond(551, "Couldn't open data connection");
|
||||
}
|
||||
|
||||
if(!m_FilterStreamer)
|
||||
m_FilterStreamer = new cStreamdevFilterStreamer;
|
||||
m_FilterStreamer->Start(m_FilterSocket);
|
||||
m_FilterStreamer->Activate(true);
|
||||
|
||||
return Respond(220, "Port command ok, data connection opened");
|
||||
}
|
||||
#endif
|
||||
|
||||
if(m_LiveSocket && m_LiveStreamer)
|
||||
m_LiveStreamer->Stop();
|
||||
delete m_LiveSocket;
|
||||
|
||||
if(m_LiveSocket && m_LiveStreamer)
|
||||
m_LiveStreamer->Stop();
|
||||
delete m_LiveSocket;
|
||||
@ -677,7 +721,16 @@ bool cConnectionVTP::CmdTUNE(char *Opts)
|
||||
m_LiveStreamer->SetDevice(dev);
|
||||
if(m_LiveSocket)
|
||||
m_LiveStreamer->Start(m_LiveSocket);
|
||||
if(m_LiveSocket)
|
||||
m_LiveStreamer->Start(m_LiveSocket);
|
||||
|
||||
#if VDRVERSNUM >= 10300
|
||||
if(!m_FilterStreamer)
|
||||
m_FilterStreamer = new cStreamdevFilterStreamer;
|
||||
m_FilterStreamer->SetDevice(dev);
|
||||
//m_FilterStreamer->SetChannel(chan);
|
||||
#endif
|
||||
|
||||
return Respond(220, "Channel tuned");
|
||||
}
|
||||
|
||||
@ -715,8 +768,8 @@ bool cConnectionVTP::CmdADDF(char *Opts)
|
||||
int pid, tid, mask;
|
||||
char *ep;
|
||||
|
||||
if (m_LiveStreamer == NULL)
|
||||
return Respond(560, "Can't set filters without a stream");
|
||||
if (m_FilterStreamer == NULL)
|
||||
return Respond(560, "Can't set filters without a filter stream");
|
||||
|
||||
pid = strtol(Opts, &ep, 10);
|
||||
if (ep == Opts || (*ep != ' '))
|
||||
@ -730,7 +783,7 @@ bool cConnectionVTP::CmdADDF(char *Opts)
|
||||
if (ep == Opts || (*ep != '\0' && *ep != ' '))
|
||||
return Respond(500, "Use: ADDF Pid Tid Mask");
|
||||
|
||||
return m_LiveStreamer->SetFilter(pid, tid, mask, true)
|
||||
return m_FilterStreamer->SetFilter(pid, tid, mask, true)
|
||||
? Respond(220, "Filter %d transferring", pid)
|
||||
: Respond(560, "Filter %d not available", pid);
|
||||
#else
|
||||
@ -744,7 +797,7 @@ bool cConnectionVTP::CmdDELF(char *Opts)
|
||||
int pid, tid, mask;
|
||||
char *ep;
|
||||
|
||||
if (m_LiveStreamer == NULL)
|
||||
if (m_FilterStreamer == NULL)
|
||||
return Respond(560, "Can't delete filters without a stream");
|
||||
|
||||
pid = strtol(Opts, &ep, 10);
|
||||
@ -759,9 +812,8 @@ bool cConnectionVTP::CmdDELF(char *Opts)
|
||||
if (ep == Opts || (*ep != '\0' && *ep != ' '))
|
||||
return Respond(500, "Use: DELF Pid Tid Mask");
|
||||
|
||||
return m_LiveStreamer->SetFilter(pid, tid, mask, false)
|
||||
? Respond(220, "Filter %d stopped", pid)
|
||||
: Respond(560, "Filter %d not transferring", pid);
|
||||
m_FilterStreamer->SetFilter(pid, tid, mask, false);
|
||||
return Respond(220, "Filter %d stopped", pid);
|
||||
#else
|
||||
return Respond(500, "DELF known but unimplemented with VDR < 1.3.0");
|
||||
#endif
|
||||
@ -777,10 +829,22 @@ bool cConnectionVTP::CmdABRT(char *Opts)
|
||||
return Respond(500, "Use: ABRT Id");
|
||||
|
||||
switch (id) {
|
||||
case 0: DELETENULL(m_LiveStreamer); break;
|
||||
case siLive:
|
||||
DELETENULL(m_LiveStreamer);
|
||||
DELETENULL(m_LiveSocket);
|
||||
break;
|
||||
#if VDRVERSNUM >= 10300
|
||||
case siLiveFilter:
|
||||
DELETENULL(m_FilterStreamer);
|
||||
DELETENULL(m_FilterSocket);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return Respond(501, "Wrong connection id %d", id);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DELETENULL(m_LiveSocket);
|
||||
return Respond(220, "Data connection closed");
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user