mirror of
https://github.com/rofafor/vdr-plugin-iptv.git
synced 2023-10-10 13:37:03 +02:00
Channel parameter refactoring.
This commit is contained in:
parent
5ed04a6e72
commit
8e3956cbeb
4
README
4
README
@ -101,8 +101,8 @@ Configuration:
|
||||
TV1;IPTV:1:IPTV|UDP|127.0.0.1|1234:P:0:512:650:2321:0:1:0:0:0
|
||||
^ ^ ^ ^ ^ ^
|
||||
| | | | | Source type ("P")
|
||||
| | | | IP Port Number or File delay (ms)
|
||||
| | | IP Address or File Location
|
||||
| | | | IP Port Number, File delay (ms), Script parameter
|
||||
| | | IP Address, File location, Script location
|
||||
| | Protocol ("UDP", "HTTP", "FILE", "EXT")
|
||||
| Plugin ID ("IPTV")
|
||||
Unique enumeration
|
||||
|
22
device.c
22
device.c
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: device.c,v 1.69 2007/10/15 20:06:38 ajhseppa Exp $
|
||||
* $Id: device.c,v 1.70 2007/10/19 21:36:27 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -155,26 +155,26 @@ cString cIptvDevice::GetInformation(unsigned int Page)
|
||||
return info;
|
||||
}
|
||||
|
||||
cString cIptvDevice::GetChannelSettings(const char *Param, int *IpPort, cIptvProtocolIf* *Protocol)
|
||||
cString cIptvDevice::GetChannelSettings(const char *IptvParam, int *Parameter, cIptvProtocolIf* *Protocol)
|
||||
{
|
||||
debug("cIptvDevice::GetChannelSettings(%d)\n", deviceIndex);
|
||||
char *loc = NULL;
|
||||
if (sscanf(Param, "IPTV|UDP|%a[^|]|%u", &loc, IpPort) == 2) {
|
||||
if (sscanf(IptvParam, "IPTV|UDP|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = pUdpProtocol;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|HTTP|%a[^|]|%u", &loc, IpPort) == 2) {
|
||||
else if (sscanf(IptvParam, "IPTV|HTTP|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = pHttpProtocol;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|FILE|%a[^|]|%u", &loc, IpPort) == 2) {
|
||||
else if (sscanf(IptvParam, "IPTV|FILE|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = pFileProtocol;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|EXT|%a[^|]|%u", &loc, IpPort) == 2) {
|
||||
else if (sscanf(IptvParam, "IPTV|EXT|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = pExtProtocol;
|
||||
return addr;
|
||||
@ -215,17 +215,17 @@ bool cIptvDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *N
|
||||
|
||||
bool cIptvDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
{
|
||||
int port;
|
||||
cString addr;
|
||||
int parameter;
|
||||
cString location;
|
||||
cIptvProtocolIf *protocol;
|
||||
|
||||
debug("cIptvDevice::SetChannelDevice(%d)\n", deviceIndex);
|
||||
addr = GetChannelSettings(Channel->PluginParam(), &port, &protocol);
|
||||
if (isempty(addr)) {
|
||||
location = GetChannelSettings(Channel->PluginParam(), ¶meter, &protocol);
|
||||
if (isempty(location)) {
|
||||
error("ERROR: Unrecognized IPTV channel settings: %s", Channel->PluginParam());
|
||||
return false;
|
||||
}
|
||||
pIptvStreamer->Set(addr, port, protocol);
|
||||
pIptvStreamer->Set(location, parameter, protocol);
|
||||
if (pSidScanner && IptvConfig.GetSectionFiltering() && IptvConfig.GetSidScanning())
|
||||
pSidScanner->SetChannel(Channel);
|
||||
return true;
|
||||
|
4
device.h
4
device.h
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: device.h,v 1.33 2007/10/15 21:03:45 rahrenbe Exp $
|
||||
* $Id: device.h,v 1.34 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_DEVICE_H
|
||||
@ -61,7 +61,7 @@ private:
|
||||
|
||||
// for channel parsing & buffering
|
||||
private:
|
||||
cString GetChannelSettings(const char *Param, int *IpPort, cIptvProtocolIf* *Protocol);
|
||||
cString GetChannelSettings(const char *IptvParam, int *Parameter, cIptvProtocolIf* *Protocol);
|
||||
bool ProvidesIptv(const char *Param) const;
|
||||
void ResetBuffering(void);
|
||||
bool IsBuffering(void);
|
||||
|
@ -1,5 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
logger "$0: error: Invalid parameter count '$#' $*"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Channels.conf parameter
|
||||
PARAMETER=${1}
|
||||
|
||||
# Iptv plugin listens this port
|
||||
PORT=${2}
|
||||
|
||||
# Define stream address
|
||||
URL=""
|
||||
|
||||
if [ -z "${URL}" ]; then
|
||||
@ -7,9 +19,5 @@ if [ -z "${URL}" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
logger "$0: error: Invalid parameter count '$#' $*"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
exec vlc "${URL}" --sout "#transcode{vcodec=mp2v,acodec=mpga,vb=800,ab=192}:standard{access=udp,mux=ts,dst=127.0.0.1:${1}}" --intf dummy
|
||||
# Use 'exec' for capturing script pid
|
||||
exec vlc "${URL}" --sout "#transcode{vcodec=mp2v,acodec=mpga,vb=800,ab=192}:standard{access=udp,mux=ts,dst=127.0.0.1:${PORT}}" --intf dummy
|
||||
|
12
po/fi_FI.po
12
po/fi_FI.po
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2007-10-17 00:19+0300\n"
|
||||
"POT-Creation-Date: 2007-10-19 23:10+0300\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -57,12 +57,18 @@ msgstr "Protokolla"
|
||||
msgid "Delay (ms)"
|
||||
msgstr "Viive (ms)"
|
||||
|
||||
msgid "Port"
|
||||
msgstr "Portti"
|
||||
msgid "Script"
|
||||
msgstr "Skripti"
|
||||
|
||||
msgid "Parameter"
|
||||
msgstr "Parametri"
|
||||
|
||||
msgid "Address"
|
||||
msgstr "Osoite"
|
||||
|
||||
msgid "Port"
|
||||
msgstr "Portti"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Verkko-ID"
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolext.c,v 1.6 2007/10/19 18:26:27 ajhseppa Exp $
|
||||
* $Id: protocolext.c,v 1.7 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <sys/wait.h>
|
||||
@ -23,12 +23,12 @@
|
||||
cIptvProtocolExt::cIptvProtocolExt()
|
||||
: pid(-1),
|
||||
listenPort(4321),
|
||||
scriptParameter(0),
|
||||
socketDesc(-1),
|
||||
readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount()),
|
||||
isActive(false)
|
||||
readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount())
|
||||
{
|
||||
debug("cIptvProtocolExt::cIptvProtocolExt()\n");
|
||||
streamAddr = strdup("");
|
||||
scriptFile = strdup("");
|
||||
listenAddr = strdup("127.0.0.1");
|
||||
// Allocate receive buffer
|
||||
readBuffer = MALLOC(unsigned char, readBufferLen);
|
||||
@ -42,7 +42,7 @@ cIptvProtocolExt::~cIptvProtocolExt()
|
||||
// Drop the multicast group and close the socket
|
||||
Close();
|
||||
// Free allocated memory
|
||||
free(streamAddr);
|
||||
free(scriptFile);
|
||||
free(listenAddr);
|
||||
free(readBuffer);
|
||||
}
|
||||
@ -104,13 +104,17 @@ void cIptvProtocolExt::CloseSocket(void)
|
||||
void cIptvProtocolExt::ExecuteCommand(void)
|
||||
{
|
||||
debug("cIptvProtocolExt::ExecuteCommand()\n");
|
||||
// Check if already executing
|
||||
if (pid > 0) {
|
||||
error("ERROR: Cannot execute command!");
|
||||
return;
|
||||
}
|
||||
// Let's fork
|
||||
if ((pid = fork()) == -1) {
|
||||
char tmp[64];
|
||||
error("ERROR: fork(): %s", strerror_r(errno, tmp, sizeof(tmp)));
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if child process
|
||||
if (pid == 0) {
|
||||
// Close all dup'ed filedescriptors
|
||||
@ -119,18 +123,17 @@ void cIptvProtocolExt::ExecuteCommand(void)
|
||||
close(i);
|
||||
// Execute the external script
|
||||
char* cmd = NULL;
|
||||
asprintf(&cmd, "%s %d", streamAddr, listenPort);
|
||||
asprintf(&cmd, "%s %d %d", scriptFile, scriptParameter, listenPort);
|
||||
debug("cIptvProtocolExt::ExecuteCommand(child): %s\n", cmd);
|
||||
if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1) {
|
||||
error("ERROR: Command failed: %s", cmd);
|
||||
free(cmd);
|
||||
error("ERROR: Command failed: %s", streamAddr);
|
||||
_exit(-1);
|
||||
}
|
||||
free(cmd);
|
||||
_exit(0);
|
||||
}
|
||||
else {
|
||||
isActive = true;
|
||||
debug("cIptvProtocolExt::ExecuteCommand(): pid=%d\n", pid);
|
||||
}
|
||||
}
|
||||
@ -150,18 +153,17 @@ void cIptvProtocolExt::TerminateCommand(void)
|
||||
error("ERROR: kill(): %s", strerror_r(errno, tmp, sizeof(tmp)));
|
||||
waitOver = true;
|
||||
}
|
||||
|
||||
while (!waitOver) {
|
||||
retval = 0;
|
||||
waitms += timeoutms;
|
||||
if ((waitms % 2000) == 0) {
|
||||
error("ERROR: Script '%s' won't terminate - killing it", streamAddr);
|
||||
error("ERROR: Script '%s' won't terminate - killing it!", scriptFile);
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
// Clear wait status to make sure child exit status is accessible
|
||||
memset(&waitStatus, '\0', sizeof(waitStatus));
|
||||
// Wait for child termination
|
||||
retval = waitid(P_PID, pid, &waitStatus, WNOHANG | WEXITED);
|
||||
retval = waitid(P_PID, pid, &waitStatus, (WNOHANG | WEXITED));
|
||||
if (retval < 0) {
|
||||
char tmp[64];
|
||||
error("ERROR: waitid(): %s", strerror_r(errno, tmp, sizeof(tmp)));
|
||||
@ -169,20 +171,16 @@ void cIptvProtocolExt::TerminateCommand(void)
|
||||
}
|
||||
// These are the acceptable conditions under which child exit is
|
||||
// regarded as successful
|
||||
if (!retval && waitStatus.si_pid && waitStatus.si_pid == pid
|
||||
&& (waitStatus.si_code == CLD_EXITED
|
||||
|| waitStatus.si_code == CLD_KILLED)) {
|
||||
if (!retval && waitStatus.si_pid && (waitStatus.si_pid == pid) &&
|
||||
((waitStatus.si_code == CLD_EXITED) || (waitStatus.si_code == CLD_KILLED))) {
|
||||
debug("Child (%d) exited as expected\n", pid);
|
||||
waitOver = true;
|
||||
}
|
||||
|
||||
// Unsuccessful wait, avoid busy looping
|
||||
if (!waitOver)
|
||||
cCondWait::SleepMs(timeoutms);
|
||||
}
|
||||
|
||||
}
|
||||
pid = -1;
|
||||
isActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -250,34 +248,34 @@ int cIptvProtocolExt::Read(unsigned char* *BufferAddr)
|
||||
|
||||
bool cIptvProtocolExt::Open(void)
|
||||
{
|
||||
debug("cIptvProtocolExt::Open(): streamAddr=%s listenPort=%d\n", streamAddr, listenPort);
|
||||
// Reject completely empty stream addresses
|
||||
if (!strlen(streamAddr))
|
||||
debug("cIptvProtocolExt::Open()\n");
|
||||
// Reject empty script files
|
||||
if (!strlen(scriptFile))
|
||||
return false;
|
||||
// Create the listening socket
|
||||
OpenSocket();
|
||||
if (!isActive)
|
||||
ExecuteCommand();
|
||||
return isActive;
|
||||
// Execute the external command
|
||||
ExecuteCommand();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvProtocolExt::Close(void)
|
||||
{
|
||||
debug("cIptvProtocolExt::Close(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolExt::Close()\n");
|
||||
// Close the socket
|
||||
CloseSocket();
|
||||
if (isActive)
|
||||
TerminateCommand();
|
||||
return !isActive;
|
||||
// Terminate the external script
|
||||
TerminateCommand();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvProtocolExt::Set(const char* Address, const int Port)
|
||||
bool cIptvProtocolExt::Set(const char* Location, const int Parameter)
|
||||
{
|
||||
debug("cIptvProtocolExt::Set(): %s:%d\n", Address, Port);
|
||||
if (!isempty(Address)) {
|
||||
debug("cIptvProtocolExt::Set(): Location=%s Parameter=%d\n", Location, Parameter);
|
||||
if (!isempty(Location)) {
|
||||
// Update stream address and port
|
||||
streamAddr = strcpyrealloc(streamAddr, Address);
|
||||
listenPort = Port;
|
||||
scriptFile = strcpyrealloc(scriptFile, Location);
|
||||
scriptParameter = Parameter;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -285,5 +283,5 @@ bool cIptvProtocolExt::Set(const char* Address, const int Port)
|
||||
cString cIptvProtocolExt::GetInformation(void)
|
||||
{
|
||||
//debug("cIptvProtocolExt::GetInformation()");
|
||||
return cString::sprintf("ext://%s:%d", streamAddr, listenPort);
|
||||
return cString::sprintf("ext://%s:%d", scriptFile, scriptParameter);
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolext.h,v 1.3 2007/10/18 19:33:15 rahrenbe Exp $
|
||||
* $Id: protocolext.h,v 1.4 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_PROTOCOLEXT_H
|
||||
@ -17,7 +17,8 @@ private:
|
||||
int pid;
|
||||
char* listenAddr;
|
||||
int listenPort;
|
||||
char* streamAddr;
|
||||
char* scriptFile;
|
||||
int scriptParameter;
|
||||
int socketDesc;
|
||||
unsigned char* readBuffer;
|
||||
unsigned int readBufferLen;
|
||||
@ -34,7 +35,7 @@ public:
|
||||
cIptvProtocolExt();
|
||||
virtual ~cIptvProtocolExt();
|
||||
virtual int Read(unsigned char* *BufferAddr);
|
||||
virtual bool Set(const char* Address, const int Port);
|
||||
virtual bool Set(const char* Location, const int Parameter);
|
||||
virtual bool Open(void);
|
||||
virtual bool Close(void);
|
||||
virtual cString GetInformation(void);
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolfile.c,v 1.10 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocolfile.c,v 1.11 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
@ -16,11 +16,12 @@
|
||||
#include "protocolfile.h"
|
||||
|
||||
cIptvProtocolFile::cIptvProtocolFile()
|
||||
: readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount()),
|
||||
: fileDelay(0),
|
||||
readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount()),
|
||||
isActive(false)
|
||||
{
|
||||
debug("cIptvProtocolFile::cIptvProtocolFile()\n");
|
||||
streamAddr = strdup("");
|
||||
fileLocation = strdup("");
|
||||
// Allocate receive buffer
|
||||
readBuffer = MALLOC(unsigned char, readBufferLen);
|
||||
if (!readBuffer)
|
||||
@ -33,7 +34,7 @@ cIptvProtocolFile::~cIptvProtocolFile()
|
||||
// Drop open handles
|
||||
Close();
|
||||
// Free allocated memory
|
||||
free(streamAddr);
|
||||
free(fileLocation);
|
||||
free(readBuffer);
|
||||
}
|
||||
|
||||
@ -41,8 +42,8 @@ bool cIptvProtocolFile::OpenFile(void)
|
||||
{
|
||||
debug("cIptvProtocolFile::OpenFile()\n");
|
||||
// Check that stream address is valid
|
||||
if (!isActive && !isempty(streamAddr)) {
|
||||
fileStream = fopen(streamAddr, "rb");
|
||||
if (!isActive && !isempty(fileLocation)) {
|
||||
fileStream = fopen(fileLocation, "rb");
|
||||
if (ferror(fileStream) || !fileStream) {
|
||||
char tmp[64];
|
||||
error("ERROR: fopen(): %s", strerror_r(errno, tmp, sizeof(tmp)));
|
||||
@ -58,7 +59,7 @@ void cIptvProtocolFile::CloseFile(void)
|
||||
{
|
||||
debug("cIptvProtocolFile::CloseFile()\n");
|
||||
// Check that file stream is valid
|
||||
if (isActive && !isempty(streamAddr)) {
|
||||
if (isActive && !isempty(fileLocation)) {
|
||||
fclose(fileStream);
|
||||
// Update active flag
|
||||
isActive = false;
|
||||
@ -79,8 +80,8 @@ int cIptvProtocolFile::Read(unsigned char* *BufferAddr)
|
||||
rewind(fileStream);
|
||||
// Sleep before reading the file stream to prevent aggressive busy looping
|
||||
// and prevent transfer ringbuffer overflows
|
||||
if (streamPort)
|
||||
cCondWait::SleepMs(streamPort);
|
||||
if (fileDelay)
|
||||
cCondWait::SleepMs(fileDelay);
|
||||
// This check is to prevent a race condition where file may be switched off
|
||||
// during the sleep and buffers are disposed. Check here that the plugin is
|
||||
// still active before accessing the buffers
|
||||
@ -91,7 +92,7 @@ int cIptvProtocolFile::Read(unsigned char* *BufferAddr)
|
||||
|
||||
bool cIptvProtocolFile::Open(void)
|
||||
{
|
||||
debug("cIptvProtocolFile::Open(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolFile::Open()\n");
|
||||
// Open the file stream
|
||||
OpenFile();
|
||||
return true;
|
||||
@ -99,21 +100,21 @@ bool cIptvProtocolFile::Open(void)
|
||||
|
||||
bool cIptvProtocolFile::Close(void)
|
||||
{
|
||||
debug("cIptvProtocolFile::Close(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolFile::Close()\n");
|
||||
// Close the file stream
|
||||
CloseFile();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvProtocolFile::Set(const char* Address, const int Port)
|
||||
bool cIptvProtocolFile::Set(const char* Location, const int Parameter)
|
||||
{
|
||||
debug("cIptvProtocolFile::Set(): %s:%d\n", Address, Port);
|
||||
if (!isempty(Address)) {
|
||||
debug("cIptvProtocolFile::Set(): Location=%s Parameter=%d\n", Location, Parameter);
|
||||
if (!isempty(Location)) {
|
||||
// Close the file stream
|
||||
CloseFile();
|
||||
// Update stream address and port
|
||||
streamAddr = strcpyrealloc(streamAddr, Address);
|
||||
streamPort = Port;
|
||||
fileLocation = strcpyrealloc(fileLocation, Location);
|
||||
fileDelay = Parameter;
|
||||
// Open the file for input
|
||||
OpenFile();
|
||||
}
|
||||
@ -123,5 +124,5 @@ bool cIptvProtocolFile::Set(const char* Address, const int Port)
|
||||
cString cIptvProtocolFile::GetInformation(void)
|
||||
{
|
||||
//debug("cIptvProtocolFile::GetInformation()");
|
||||
return cString::sprintf("file://%s:%d", streamAddr, streamPort);
|
||||
return cString::sprintf("file://%s:%d", fileLocation, fileDelay);
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolfile.h,v 1.5 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocolfile.h,v 1.6 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_PROTOCOLFILE_H
|
||||
@ -14,8 +14,8 @@
|
||||
|
||||
class cIptvProtocolFile : public cIptvProtocolIf {
|
||||
private:
|
||||
char* streamAddr;
|
||||
int streamPort;
|
||||
char* fileLocation;
|
||||
int fileDelay;
|
||||
FILE* fileStream;
|
||||
unsigned char* readBuffer;
|
||||
unsigned int readBufferLen;
|
||||
@ -29,7 +29,7 @@ public:
|
||||
cIptvProtocolFile();
|
||||
virtual ~cIptvProtocolFile();
|
||||
virtual int Read(unsigned char* *BufferAddr);
|
||||
virtual bool Set(const char* Address, const int Port);
|
||||
virtual bool Set(const char* Location, const int Parameter);
|
||||
virtual bool Open(void);
|
||||
virtual bool Close(void);
|
||||
virtual cString GetInformation(void);
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolhttp.c,v 1.10 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocolhttp.c,v 1.11 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -336,27 +336,27 @@ int cIptvProtocolHttp::Read(unsigned char* *BufferAddr)
|
||||
|
||||
bool cIptvProtocolHttp::Open(void)
|
||||
{
|
||||
debug("cIptvProtocolHttp::Open(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolHttp::Open()\n");
|
||||
// Connect the socket
|
||||
return Connect();
|
||||
}
|
||||
|
||||
bool cIptvProtocolHttp::Close(void)
|
||||
{
|
||||
debug("cIptvProtocolHttp::Close(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolHttp::Close()\n");
|
||||
// Disconnect the current stream
|
||||
Disconnect();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvProtocolHttp::Set(const char* Address, const int Port)
|
||||
bool cIptvProtocolHttp::Set(const char* Location, const int Parameter)
|
||||
{
|
||||
debug("cIptvProtocolHttp::Set(): %s:%d\n", Address, Port);
|
||||
if (!isempty(Address)) {
|
||||
debug("cIptvProtocolHttp::Set(): Location=%s Parameter=%d\n", Location, Parameter);
|
||||
if (!isempty(Location)) {
|
||||
// Disconnect the current socket
|
||||
Disconnect();
|
||||
// Update stream address, path and port
|
||||
streamAddr = strcpyrealloc(streamAddr, Address);
|
||||
streamAddr = strcpyrealloc(streamAddr, Location);
|
||||
char *path = strstr(streamAddr, "/");
|
||||
if (path) {
|
||||
streamPath = strcpyrealloc(streamPath, path);
|
||||
@ -364,7 +364,7 @@ bool cIptvProtocolHttp::Set(const char* Address, const int Port)
|
||||
}
|
||||
else
|
||||
streamPath = strcpyrealloc(streamPath, "/");
|
||||
streamPort = Port;
|
||||
streamPort = Parameter;
|
||||
debug("http://%s:%d%s\n", streamAddr, streamPort, streamPath);
|
||||
// Re-connect the socket
|
||||
Connect();
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolhttp.h,v 1.7 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocolhttp.h,v 1.8 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_PROTOCOLHTTP_H
|
||||
@ -36,7 +36,7 @@ public:
|
||||
cIptvProtocolHttp();
|
||||
virtual ~cIptvProtocolHttp();
|
||||
virtual int Read(unsigned char* *BufferAddr);
|
||||
virtual bool Set(const char* Address, const int Port);
|
||||
virtual bool Set(const char* Location, const int Parameter);
|
||||
virtual bool Open(void);
|
||||
virtual bool Close(void);
|
||||
virtual cString GetInformation(void);
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocolif.h,v 1.5 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocolif.h,v 1.6 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_PROTOCOLIF_H
|
||||
@ -14,7 +14,7 @@ public:
|
||||
cIptvProtocolIf() {}
|
||||
virtual ~cIptvProtocolIf() {}
|
||||
virtual int Read(unsigned char* *BufferAddr) = 0;
|
||||
virtual bool Set(const char* Address, const int Port) = 0;
|
||||
virtual bool Set(const char* Location, const int Parameter) = 0;
|
||||
virtual bool Open(void) = 0;
|
||||
virtual bool Close(void) = 0;
|
||||
virtual cString GetInformation(void) = 0;
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocoludp.c,v 1.11 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocoludp.c,v 1.12 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -216,7 +216,7 @@ int cIptvProtocolUdp::Read(unsigned char* *BufferAddr)
|
||||
|
||||
bool cIptvProtocolUdp::Open(void)
|
||||
{
|
||||
debug("cIptvProtocolUdp::Open(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolUdp::Open()\n");
|
||||
// Join a new multicast group
|
||||
JoinMulticast();
|
||||
return true;
|
||||
@ -224,7 +224,7 @@ bool cIptvProtocolUdp::Open(void)
|
||||
|
||||
bool cIptvProtocolUdp::Close(void)
|
||||
{
|
||||
debug("cIptvProtocolUdp::Close(): streamAddr=%s\n", streamAddr);
|
||||
debug("cIptvProtocolUdp::Close()\n");
|
||||
// Drop the multicast group
|
||||
DropMulticast();
|
||||
// Close the socket
|
||||
@ -232,15 +232,15 @@ bool cIptvProtocolUdp::Close(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvProtocolUdp::Set(const char* Address, const int Port)
|
||||
bool cIptvProtocolUdp::Set(const char* Location, const int Parameter)
|
||||
{
|
||||
debug("cIptvProtocolUdp::Set(): %s:%d\n", Address, Port);
|
||||
if (!isempty(Address)) {
|
||||
debug("cIptvProtocolUdp::Set(): Location=%s Parameter=%d\n", Location, Parameter);
|
||||
if (!isempty(Location)) {
|
||||
// Drop the multicast group
|
||||
DropMulticast();
|
||||
// Update stream address and port
|
||||
streamAddr = strcpyrealloc(streamAddr, Address);
|
||||
streamPort = Port;
|
||||
streamAddr = strcpyrealloc(streamAddr, Location);
|
||||
streamPort = Parameter;
|
||||
// Join a new multicast group
|
||||
JoinMulticast();
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: protocoludp.h,v 1.8 2007/10/07 22:54:09 rahrenbe Exp $
|
||||
* $Id: protocoludp.h,v 1.9 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_PROTOCOLUDP_H
|
||||
@ -32,7 +32,7 @@ public:
|
||||
cIptvProtocolUdp();
|
||||
virtual ~cIptvProtocolUdp();
|
||||
virtual int Read(unsigned char* *BufferAddr);
|
||||
virtual bool Set(const char* Address, const int Port);
|
||||
virtual bool Set(const char* Location, const int Parameter);
|
||||
virtual bool Open(void);
|
||||
virtual bool Close(void);
|
||||
virtual cString GetInformation(void);
|
||||
|
48
setup.c
48
setup.c
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: setup.c,v 1.37 2007/10/19 17:49:35 rahrenbe Exp $
|
||||
* $Id: setup.c,v 1.38 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
@ -34,14 +34,14 @@ private:
|
||||
eProtocolCount
|
||||
};
|
||||
struct tIptvChannel {
|
||||
int frequency, source, protocol, port, vpid, ppid, tpid, sid, nid, tid, rid;
|
||||
int frequency, source, protocol, parameter, vpid, ppid, tpid, sid, nid, tid, rid;
|
||||
int apid[MAXAPIDS + 1], dpid[MAXDPIDS + 1], spid[MAXSPIDS + 1], caids[MAXCAIDS + 1];
|
||||
char name[256], location[256];
|
||||
} data;
|
||||
cChannel *channel;
|
||||
const char *protocols[eProtocolCount];
|
||||
void Setup(void);
|
||||
cString GetIptvSettings(const char *Param, int *Port, int *Protocol);
|
||||
cString GetIptvSettings(const char *Param, int *Parameter, int *Protocol);
|
||||
void GetChannelData(cChannel *Channel);
|
||||
void SetChannelData(cChannel *Channel);
|
||||
|
||||
@ -68,25 +68,25 @@ cIptvMenuEditChannel::cIptvMenuEditChannel(cChannel *Channel, bool New)
|
||||
Setup();
|
||||
}
|
||||
|
||||
cString cIptvMenuEditChannel::GetIptvSettings(const char *Param, int *Port, int *Protocol)
|
||||
cString cIptvMenuEditChannel::GetIptvSettings(const char *Param, int *Parameter, int *Protocol)
|
||||
{
|
||||
char *loc = NULL;
|
||||
if (sscanf(Param, "IPTV|UDP|%a[^|]|%u", &loc, Port) == 2) {
|
||||
if (sscanf(Param, "IPTV|UDP|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = eProtocolUDP;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|HTTP|%a[^|]|%u", &loc, Port) == 2) {
|
||||
else if (sscanf(Param, "IPTV|HTTP|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = eProtocolHTTP;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|FILE|%a[^|]|%u", &loc, Port) == 2) {
|
||||
else if (sscanf(Param, "IPTV|FILE|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = eProtocolFILE;
|
||||
return addr;
|
||||
}
|
||||
else if (sscanf(Param, "IPTV|EXT|%a[^|]|%u", &loc, Port) == 2) {
|
||||
else if (sscanf(Param, "IPTV|EXT|%a[^|]|%u", &loc, Parameter) == 2) {
|
||||
cString addr(loc, true);
|
||||
*Protocol = eProtocolEXT;
|
||||
return addr;
|
||||
@ -97,7 +97,7 @@ cString cIptvMenuEditChannel::GetIptvSettings(const char *Param, int *Port, int
|
||||
void cIptvMenuEditChannel::GetChannelData(cChannel *Channel)
|
||||
{
|
||||
if (Channel) {
|
||||
int port, protocol;
|
||||
int parameter, protocol;
|
||||
data.frequency = Channel->Frequency();
|
||||
data.source = Channel->Source();
|
||||
data.vpid = Channel->Vpid();
|
||||
@ -116,9 +116,9 @@ void cIptvMenuEditChannel::GetChannelData(cChannel *Channel)
|
||||
data.tid = Channel->Tid();
|
||||
data.rid = Channel->Rid();
|
||||
strn0cpy(data.name, Channel->Name(), sizeof(data.name));
|
||||
strn0cpy(data.location, *GetIptvSettings(Channel->PluginParam(), &port, &protocol), sizeof(data.location));
|
||||
strn0cpy(data.location, *GetIptvSettings(Channel->PluginParam(), ¶meter, &protocol), sizeof(data.location));
|
||||
data.protocol = protocol;
|
||||
data.port = port;
|
||||
data.parameter = parameter;
|
||||
}
|
||||
else {
|
||||
data.frequency = 1;
|
||||
@ -141,7 +141,7 @@ void cIptvMenuEditChannel::GetChannelData(cChannel *Channel)
|
||||
strn0cpy(data.name, "IPTV", sizeof(data.name));
|
||||
strn0cpy(data.location, "127.0.0.1", sizeof(data.location));
|
||||
data.protocol = eProtocolUDP;
|
||||
data.port = 1234;
|
||||
data.parameter = 1234;
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,17 +154,17 @@ void cIptvMenuEditChannel::SetChannelData(cChannel *Channel)
|
||||
char slangs[MAXSPIDS][MAXLANGCODE2] = { "" };
|
||||
switch (data.protocol) {
|
||||
case eProtocolEXT:
|
||||
param = cString::sprintf("IPTV|EXT|%s|%d", data.location, data.port);
|
||||
param = cString::sprintf("IPTV|EXT|%s|%d", data.location, data.parameter);
|
||||
break;
|
||||
case eProtocolFILE:
|
||||
param = cString::sprintf("IPTV|FILE|%s|%d", data.location, data.port);
|
||||
param = cString::sprintf("IPTV|FILE|%s|%d", data.location, data.parameter);
|
||||
break;
|
||||
case eProtocolHTTP:
|
||||
param = cString::sprintf("IPTV|HTTP|%s|%d", data.location, data.port);
|
||||
param = cString::sprintf("IPTV|HTTP|%s|%d", data.location, data.parameter);
|
||||
break;
|
||||
default:
|
||||
case eProtocolUDP:
|
||||
param = cString::sprintf("IPTV|UDP|%s|%d", data.location, data.port);
|
||||
param = cString::sprintf("IPTV|UDP|%s|%d", data.location, data.parameter);
|
||||
break;
|
||||
}
|
||||
Channel->SetPids(data.vpid, data.ppid, data.apid, alangs, data.dpid, dlangs, data.spid, slangs, data.tpid);
|
||||
@ -185,17 +185,17 @@ void cIptvMenuEditChannel::Setup(void)
|
||||
switch (data.protocol) {
|
||||
case eProtocolFILE:
|
||||
Add(new cMenuEditStrItem(trVDR("File"), data.location, sizeof(data.location), trVDR(FileNameChars)));
|
||||
Add(new cMenuEditIntItem(tr("Delay (ms)"), &data.port, 0, 0xFFFF));
|
||||
Add(new cMenuEditIntItem(tr("Delay (ms)"), &data.parameter, 0, 0xFFFF));
|
||||
break;
|
||||
case eProtocolEXT:
|
||||
Add(new cMenuEditStrItem(trVDR("File"), data.location, sizeof(data.location), trVDR(FileNameChars)));
|
||||
Add(new cMenuEditIntItem(tr("Port"), &data.port, 0, 0xFFFF));
|
||||
Add(new cMenuEditStrItem(tr("Script"), data.location, sizeof(data.location), trVDR(FileNameChars)));
|
||||
Add(new cMenuEditIntItem(tr("Parameter"), &data.parameter, 0, 0xFFFF));
|
||||
break;
|
||||
case eProtocolHTTP:
|
||||
case eProtocolUDP:
|
||||
default:
|
||||
Add(new cMenuEditStrItem(tr("Address"), data.location, sizeof(data.location), trVDR(FileNameChars)));
|
||||
Add(new cMenuEditIntItem(tr("Port"), &data.port, 0, 0xFFFF));
|
||||
Add(new cMenuEditIntItem(tr("Port"), &data.parameter, 0, 0xFFFF));
|
||||
break;
|
||||
}
|
||||
// Normal settings
|
||||
@ -295,20 +295,20 @@ eOSState cIptvMenuEditChannel::ProcessKey(eKeys Key)
|
||||
switch (data.protocol) {
|
||||
case eProtocolEXT:
|
||||
strn0cpy(data.location, "/video/iptvstream.sh", sizeof(data.location));
|
||||
data.port = 0;
|
||||
data.parameter = 0;
|
||||
break;
|
||||
case eProtocolFILE:
|
||||
strn0cpy(data.location, "/tmp/video.ts", sizeof(data.location));
|
||||
data.port = 0;
|
||||
data.parameter = 0;
|
||||
break;
|
||||
case eProtocolHTTP:
|
||||
strn0cpy(data.location, "127.0.0.1/TS/1", sizeof(data.location));
|
||||
data.port = 3000;
|
||||
data.parameter = 3000;
|
||||
break;
|
||||
default:
|
||||
case eProtocolUDP:
|
||||
strn0cpy(data.location, "127.0.0.1", sizeof(data.location));
|
||||
data.port = 1234;
|
||||
data.parameter = 1234;
|
||||
break;
|
||||
}
|
||||
Setup();
|
||||
|
12
streamer.c
12
streamer.c
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: streamer.c,v 1.23 2007/10/11 23:06:49 rahrenbe Exp $
|
||||
* $Id: streamer.c,v 1.24 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/thread.h>
|
||||
@ -77,10 +77,10 @@ bool cIptvStreamer::Close(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cIptvStreamer::Set(const char* Address, const int Port, cIptvProtocolIf* Protocol)
|
||||
bool cIptvStreamer::Set(const char* Location, const int Parameter, cIptvProtocolIf* Protocol)
|
||||
{
|
||||
debug("cIptvStreamer::Set(): %s:%d\n", Address, Port);
|
||||
if (!isempty(Address)) {
|
||||
debug("cIptvStreamer::Set(): %s:%d\n", Location, Parameter);
|
||||
if (!isempty(Location)) {
|
||||
// Update protocol; Close the existing one if changed
|
||||
if (protocol != Protocol) {
|
||||
if (protocol)
|
||||
@ -89,9 +89,9 @@ bool cIptvStreamer::Set(const char* Address, const int Port, cIptvProtocolIf* Pr
|
||||
if (protocol)
|
||||
protocol->Open();
|
||||
}
|
||||
// Set protocol address and port
|
||||
// Set protocol location and parameter
|
||||
if (protocol)
|
||||
protocol->Set(Address, Port);
|
||||
protocol->Set(Location, Parameter);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: streamer.h,v 1.11 2007/10/09 22:12:17 rahrenbe Exp $
|
||||
* $Id: streamer.h,v 1.12 2007/10/19 21:36:28 rahrenbe Exp $
|
||||
*/
|
||||
|
||||
#ifndef __IPTV_STREAMER_H
|
||||
@ -29,7 +29,7 @@ public:
|
||||
cIptvStreamer(cRingBufferLinear* RingBuffer, cMutex* Mutex);
|
||||
virtual ~cIptvStreamer();
|
||||
virtual void Action(void);
|
||||
bool Set(const char* Address, const int Port, cIptvProtocolIf* Protocol);
|
||||
bool Set(const char* Location, const int Parameter, cIptvProtocolIf* Protocol);
|
||||
bool Open(void);
|
||||
bool Close(void);
|
||||
cString GetInformation(void);
|
||||
|
Loading…
Reference in New Issue
Block a user