mirror of
				https://github.com/rofafor/vdr-plugin-iptv.git
				synced 2023-10-10 11:37:03 +00:00 
			
		
		
		
	Compare commits
	
		
			14 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3b8cfd2323 | ||
| 
						 | 
					d737278f78 | ||
| 
						 | 
					906438e981 | ||
| 
						 | 
					aa620a314c | ||
| 
						 | 
					517547dc15 | ||
| 
						 | 
					60a4d266b7 | ||
| 
						 | 
					6901970b8a | ||
| 
						 | 
					d67f0d6ead | ||
| 
						 | 
					c0fc83cba6 | ||
| 
						 | 
					49fcbc8921 | ||
| 
						 | 
					dbeb014a85 | ||
| 
						 | 
					26cd1aa1f1 | ||
| 
						 | 
					a32cb95960 | ||
| 
						 | 
					abfa46c064 | 
							
								
								
									
										26
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								HISTORY
									
									
									
									
									
								
							@@ -1,5 +1,6 @@
 | 
			
		||||
==================================
 | 
			
		||||
VDR Plugin 'iptv' Revision History
 | 
			
		||||
----------------------------------
 | 
			
		||||
==================================
 | 
			
		||||
 | 
			
		||||
2007-10-14: Version 0.0.1
 | 
			
		||||
 | 
			
		||||
@@ -108,3 +109,26 @@ VDR Plugin 'iptv' Revision History
 | 
			
		||||
  (Thanks to Peter Holik for reporting this one).
 | 
			
		||||
- Updated example scripts to use ffmpeg's direct UDP output
 | 
			
		||||
  and added a new "image.sh" script (Thanks to Peter Holik).
 | 
			
		||||
 | 
			
		||||
2009-10-01: Version 0.3.1
 | 
			
		||||
 | 
			
		||||
- Updated patches.
 | 
			
		||||
- Added optional patches to disable EIT scanning.
 | 
			
		||||
- Fixed handling of HTTP protocol headers.
 | 
			
		||||
- Modified sectionfilters to use socket pair instead of
 | 
			
		||||
  filesystem fifos.
 | 
			
		||||
 | 
			
		||||
2010-03-05: Version 0.3.2
 | 
			
		||||
 | 
			
		||||
- Updated patches.
 | 
			
		||||
- Fixed argument corruption.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
================================== 
 | 
			
		||||
VDR Plugin 'iptv' Revision History
 | 
			
		||||
================================== 
 | 
			
		||||
 | 
			
		||||
2010-03-05: Version 0.4.0
 | 
			
		||||
 | 
			
		||||
- Updated for vdr-1.7.13.
 | 
			
		||||
- Fixed argument corruption.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							@@ -31,6 +31,10 @@ VDRDIR = ../../..
 | 
			
		||||
LIBDIR = ../../lib
 | 
			
		||||
TMPDIR = /tmp
 | 
			
		||||
 | 
			
		||||
### Make sure that necessary options are included:
 | 
			
		||||
 | 
			
		||||
include $(VDRDIR)/Make.global
 | 
			
		||||
 | 
			
		||||
### Allow user defined options to overwrite defaults:
 | 
			
		||||
 | 
			
		||||
-include $(VDRDIR)/Make.config
 | 
			
		||||
@@ -61,7 +65,7 @@ all-redirect: all
 | 
			
		||||
 | 
			
		||||
OBJS = $(PLUGIN).o config.o setup.o device.o streamer.o protocoludp.o \
 | 
			
		||||
	protocolhttp.o protocolfile.o protocolext.o sectionfilter.o \
 | 
			
		||||
	sidscanner.o pidscanner.o statistics.o common.o socket.o
 | 
			
		||||
	sidscanner.o pidscanner.o statistics.o common.o socket.o source.o
 | 
			
		||||
 | 
			
		||||
### The main target:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								README
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ See the file COPYING for more information.
 | 
			
		||||
 | 
			
		||||
Requirements:
 | 
			
		||||
 | 
			
		||||
An IPTV patched VDR setup and DVB compatible MPEG1/2 network video streams.
 | 
			
		||||
DVB compatible MPEG1/2 or H.264 network video streams.
 | 
			
		||||
 | 
			
		||||
Description:
 | 
			
		||||
 | 
			
		||||
@@ -44,8 +44,6 @@ cd /put/your/path/here/VDR/PLUGINS/src
 | 
			
		||||
tar -xzf /put/your/path/here/vdr-iptv-X.Y.Z.tgz
 | 
			
		||||
ln -s iptv-X.Y.Z iptv
 | 
			
		||||
cd /put/your/path/here/VDR
 | 
			
		||||
patch -p1 < PLUGINS/src/iptv/patches/vdr-X.Y.Z-pluginparam.patch
 | 
			
		||||
cp sources.conf /path/to/vdrconf/
 | 
			
		||||
cp -R PLUGINS/src/iptv/iptv /path/to/vdrconf/plugins/
 | 
			
		||||
make
 | 
			
		||||
make plugins
 | 
			
		||||
@@ -77,29 +75,8 @@ Setup menu:
 | 
			
		||||
                                   options which allow you to disable the
 | 
			
		||||
                                   individual section filters.
 | 
			
		||||
                                   Valid range: 0...7
 | 
			
		||||
- [Red:Channels]                   Opens IPTV channel editor.
 | 
			
		||||
- [Blue:Info]                      Opens IPTV information/statistics menu.
 | 
			
		||||
 | 
			
		||||
Channel editor menu:
 | 
			
		||||
 | 
			
		||||
- Because of the different nature and content the VDR channel editor is not
 | 
			
		||||
  best suited for editing of IPTV channels. Therefore an alternative editor
 | 
			
		||||
  is provided which allows more IPTV centric editing of channel information.
 | 
			
		||||
  An IPTV channel editor is accessible via "Setup -> Plugins -> IPTV" and
 | 
			
		||||
  pressing the Red button. The channel editor is functionally similar to
 | 
			
		||||
  VDR's built-in channel editor.
 | 
			
		||||
 | 
			
		||||
- Scan Sid:  [yes|no]              Defines whether service id shall be
 | 
			
		||||
                                   scanned automatically. Service id is
 | 
			
		||||
                                   used in channel identification and
 | 
			
		||||
                                   EPG information is set according to it.
 | 
			
		||||
                                   This option requires section filtering.
 | 
			
		||||
 | 
			
		||||
- Scan pids: [yes|no]              Defines whether video and audio pids
 | 
			
		||||
                                   shall be scanned automatically. This
 | 
			
		||||
                                   option is useful with streams missing
 | 
			
		||||
                                   correct PAT/PMT information.
 | 
			
		||||
 | 
			
		||||
Information menu:
 | 
			
		||||
 | 
			
		||||
- [Red:General]                    Opens the general information page.
 | 
			
		||||
@@ -111,17 +88,20 @@ Configuration:
 | 
			
		||||
 | 
			
		||||
- channels.conf
 | 
			
		||||
 | 
			
		||||
  TV4;IPTV:40:IPTV|S1P0|EXT|iptvstream.sh|0:P:0:0:680:0:0:4:0:0:0
 | 
			
		||||
  TV3;IPTV:30:IPTV|S0P1|FILE|/video/stream.ts|5:P:0:514:670:2321:0:3:0:0:0
 | 
			
		||||
  TV2;IPTV:20:IPTV|S0P1|HTTP|127.0.0.1/TS/2|3000:P:0:513:660:2321:0:2:0:0:0
 | 
			
		||||
  TV1;IPTV:10:IPTV|S1P0|UDP|127.0.0.1|1234:P:0:512:650:2321:0:1:0:0:0
 | 
			
		||||
           ^  ^    ^    ^   ^         ^    ^
 | 
			
		||||
           |  |    |    |   |         |    Source type ("P")
 | 
			
		||||
           |  |    |    |   |         IP Port Number, File delay (ms), Script parameter
 | 
			
		||||
           |  |    |    |   IP Address, File location, Script location
 | 
			
		||||
           |  |    |    Protocol ("UDP", "HTTP", "FILE", "EXT")
 | 
			
		||||
           |  |    Parameters ("S" Sid scan, "P" Pid scan, "0" disable, "1" enable)
 | 
			
		||||
           |  Plugin ID ("IPTV")
 | 
			
		||||
  TV4;IPTV:40:S=1|P=0|F=EXT|U=iptvstream.sh|A=0:I:0:0:680:0:0:4:0:0:0
 | 
			
		||||
  TV3;IPTV:30:S=0|P=1|F=FILE|U=/video/stream.ts|A=5:I:0:514:670:2321:0:3:0:0:0
 | 
			
		||||
  TV2;IPTV:20:S=0|P=1|F=HTTP|U=127.0.0.1/TS/2|A=3000:I:0:513:660:2321:0:2:0:0:0
 | 
			
		||||
  TV1;IPTV:10:S=1|P=0|F=UDP|U=127.0.0.1|A=1234:I:0:512:650:2321:0:1:0:0:0
 | 
			
		||||
           ^  ^   ^   ^     ^           ^    ^
 | 
			
		||||
           |  |   |   |     |           |    Source type ("I")
 | 
			
		||||
           |  |   |   |     |           Stream parameter (multicast port
 | 
			
		||||
           |  |   |   |     |           number, HTTP port number, file delay
 | 
			
		||||
           |  |   |   |     |           (ms), script parameter)
 | 
			
		||||
           |  |   |   |     Stream address (multicast address, URL, file
 | 
			
		||||
           |  |   |   |     location, script location)
 | 
			
		||||
           |  |   |   Stream protocol ("UDP", "HTTP", "FILE", "EXT")
 | 
			
		||||
           |  |   PID Scan ("0" disable, "1" enable)
 | 
			
		||||
           |  SID Scan ("0" disable, "1" enable)
 | 
			
		||||
           Unique enumeration
 | 
			
		||||
 | 
			
		||||
- UDP multicast rules for iptables firewall
 | 
			
		||||
@@ -151,8 +131,7 @@ External streaming:
 | 
			
		||||
  devices can be used simultaneously.
 | 
			
		||||
 | 
			
		||||
- IPTV plugin includes an example script which uses VLC media player for
 | 
			
		||||
  receiving streams, transcoding and handing the result to IPTV plugin. The
 | 
			
		||||
  plugin was tested with VLC version 0.8.6c.
 | 
			
		||||
  receiving streams, transcoding and handing the result to IPTV plugin.
 | 
			
		||||
 | 
			
		||||
Notes:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								common.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								common.c
									
									
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
			
		||||
 | 
			
		||||
uint16_t ts_pid(const uint8_t *buf)
 | 
			
		||||
{
 | 
			
		||||
  return ((buf[1] & 0x1f) << 8) + buf[2];
 | 
			
		||||
  return (uint16_t)(((buf[1] & 0x1f) << 8) + buf[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t payload(const uint8_t *tsp)
 | 
			
		||||
@@ -22,7 +22,7 @@ uint8_t payload(const uint8_t *tsp)
 | 
			
		||||
     if (tsp[4] > 183) // corrupted data?
 | 
			
		||||
        return 0;
 | 
			
		||||
     else
 | 
			
		||||
        return (184 - 1) - tsp[4];
 | 
			
		||||
        return (uint8_t)((184 - 1) - tsp[4]);
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
  return 184;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								common.h
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								common.h
									
									
									
									
									
								
							@@ -14,23 +14,18 @@
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#define debug(x...) dsyslog("IPTV: " x);
 | 
			
		||||
#define error(x...) esyslog("IPTV: " x);
 | 
			
		||||
#define error(x...) esyslog("ERROR: " x);
 | 
			
		||||
#else
 | 
			
		||||
#define debug(x...) ;
 | 
			
		||||
#define error(x...) esyslog("IPTV: " x);
 | 
			
		||||
#define error(x...) esyslog("ERROR: " x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef trNOOP
 | 
			
		||||
#define trNOOP(s) (s)
 | 
			
		||||
#endif
 | 
			
		||||
#define ELEMENTS(x)                     (sizeof(x) / sizeof(x[0]))
 | 
			
		||||
 | 
			
		||||
#ifndef trVDR
 | 
			
		||||
#define trVDR(s) tr(s)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define IPTV_FILTER_FILENAME            "/tmp/vdr-iptv%d.filter%d"
 | 
			
		||||
#define IPTV_DVR_FILENAME               "/tmp/vdr-iptv%d.dvr"
 | 
			
		||||
 | 
			
		||||
#define IPTV_SOURCE_CHARACTER           'I'
 | 
			
		||||
 | 
			
		||||
#define IPTV_DEVICE_INFO_ALL            0
 | 
			
		||||
#define IPTV_DEVICE_INFO_GENERAL        1
 | 
			
		||||
#define IPTV_DEVICE_INFO_PIDS           2
 | 
			
		||||
@@ -42,13 +37,13 @@
 | 
			
		||||
#define SECTION_FILTER_TABLE_SIZE       7
 | 
			
		||||
 | 
			
		||||
#define ERROR_IF_FUNC(exp, errstr, func, ret) \
 | 
			
		||||
  do {                                                                     \
 | 
			
		||||
     if (exp) {                                                            \
 | 
			
		||||
        char tmp[64];                                                      \
 | 
			
		||||
        error("ERROR: "errstr": %s", strerror_r(errno, tmp, sizeof(tmp))); \
 | 
			
		||||
        func;                                                              \
 | 
			
		||||
        ret;                                                               \
 | 
			
		||||
        }                                                                  \
 | 
			
		||||
  do {                                                            \
 | 
			
		||||
     if (exp) {                                                   \
 | 
			
		||||
        char tmp[64];                                             \
 | 
			
		||||
        error(errstr": %s", strerror_r(errno, tmp, sizeof(tmp))); \
 | 
			
		||||
        func;                                                     \
 | 
			
		||||
        ret;                                                      \
 | 
			
		||||
        }                                                         \
 | 
			
		||||
  } while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								device.c
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								device.c
									
									
									
									
									
								
							@@ -6,6 +6,7 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include "source.h"
 | 
			
		||||
#include "device.h"
 | 
			
		||||
 | 
			
		||||
#define IPTV_MAX_DEVICES MAXDEVICES
 | 
			
		||||
@@ -22,7 +23,7 @@ cIptvDevice::cIptvDevice(unsigned int Index)
 | 
			
		||||
  sidScanEnabled(false),
 | 
			
		||||
  pidScanEnabled(false)
 | 
			
		||||
{
 | 
			
		||||
  unsigned int bufsize = MEGABYTE(IptvConfig.GetTsBufferSize());
 | 
			
		||||
  unsigned int bufsize = (unsigned int)MEGABYTE(IptvConfig.GetTsBufferSize());
 | 
			
		||||
  bufsize -= (bufsize % TS_SIZE);
 | 
			
		||||
  isyslog("creating IPTV device %d (CardIndex=%d)", deviceIndex, CardIndex());
 | 
			
		||||
  tsBuffer = new cRingBufferLinear(bufsize + 1, TS_SIZE, false,
 | 
			
		||||
@@ -85,6 +86,7 @@ cIptvDevice::~cIptvDevice()
 | 
			
		||||
bool cIptvDevice::Initialize(unsigned int DeviceCount)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::Initialize(): DeviceCount=%d\n", DeviceCount);
 | 
			
		||||
  new cIptvSourceParam(IPTV_SOURCE_CHARACTER, "IPTV");
 | 
			
		||||
  if (DeviceCount > IPTV_MAX_DEVICES)
 | 
			
		||||
     DeviceCount = IPTV_MAX_DEVICES;
 | 
			
		||||
  for (unsigned int i = 0; i < DeviceCount; ++i)
 | 
			
		||||
@@ -176,73 +178,16 @@ cString cIptvDevice::GetInformation(unsigned int Page)
 | 
			
		||||
  return info;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cString cIptvDevice::GetChannelSettings(const char *IptvParam, int *Parameter, int *SidScan, int *PidScan, cIptvProtocolIf* *Protocol)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::GetChannelSettings(%d)\n", deviceIndex);
 | 
			
		||||
  char *tag = NULL;
 | 
			
		||||
  char *proto = NULL;
 | 
			
		||||
  char *loc = NULL;
 | 
			
		||||
  if (sscanf(IptvParam, "%a[^|]|S%dP%d|%a[^|]|%a[^|]|%u", &tag, SidScan, PidScan, &proto, &loc, Parameter) == 6) {
 | 
			
		||||
     cString tagstr(tag, true);
 | 
			
		||||
     cString protostr(proto, true);
 | 
			
		||||
     cString locstr(loc, true);
 | 
			
		||||
     // check if IPTV tag
 | 
			
		||||
     if (strncasecmp(*tagstr, "IPTV", 4) == 0) {
 | 
			
		||||
        // check if protocol is supported and update the pointer
 | 
			
		||||
        if (strncasecmp(*protostr, "UDP", 3) == 0)
 | 
			
		||||
           *Protocol = pUdpProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "HTTP", 4) == 0)
 | 
			
		||||
           *Protocol = pHttpProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "FILE", 4) == 0)
 | 
			
		||||
           *Protocol = pFileProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "EXT", 3) == 0)
 | 
			
		||||
           *Protocol = pExtProtocol;
 | 
			
		||||
        else
 | 
			
		||||
           return NULL;
 | 
			
		||||
        // return location
 | 
			
		||||
        return locstr;
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  else if (sscanf(IptvParam, "%a[^|]|P%dS%d|%a[^|]|%a[^|]|%u", &tag, PidScan, SidScan, &proto, &loc, Parameter) == 6) {
 | 
			
		||||
     cString tagstr(tag, true);
 | 
			
		||||
     cString protostr(proto, true);
 | 
			
		||||
     cString locstr(loc, true);
 | 
			
		||||
     // check if IPTV tag
 | 
			
		||||
     if (strncasecmp(*tagstr, "IPTV", 4) == 0) {
 | 
			
		||||
        // check if protocol is supported and update the pointer
 | 
			
		||||
        if (strncasecmp(*protostr, "UDP", 3) == 0)
 | 
			
		||||
           *Protocol = pUdpProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "HTTP", 4) == 0)
 | 
			
		||||
           *Protocol = pHttpProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "FILE", 4) == 0)
 | 
			
		||||
           *Protocol = pFileProtocol;
 | 
			
		||||
        else if (strncasecmp(*protostr, "EXT", 3) == 0)
 | 
			
		||||
           *Protocol = pExtProtocol;
 | 
			
		||||
        else
 | 
			
		||||
           return NULL;
 | 
			
		||||
        // return location
 | 
			
		||||
        return locstr;
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cIptvDevice::ProvidesIptv(const char *Param) const
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::ProvidesIptv(%d)\n", deviceIndex);
 | 
			
		||||
  return (strncasecmp(Param, "IPTV", 4) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cIptvDevice::ProvidesSource(int Source) const
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::ProvidesSource(%d)\n", deviceIndex);
 | 
			
		||||
  return (cSource::IsPlug(Source));
 | 
			
		||||
  return ((Source & cSource::st_Mask) == (IPTV_SOURCE_CHARACTER << 24));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cIptvDevice::ProvidesTransponder(const cChannel *Channel) const
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::ProvidesTransponder(%d)\n", deviceIndex);
 | 
			
		||||
  return (ProvidesSource(Channel->Source()) && ProvidesIptv(Channel->PluginParam()));
 | 
			
		||||
  return (ProvidesSource(Channel->Source()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cIptvDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
 | 
			
		||||
@@ -265,19 +210,36 @@ int cIptvDevice::NumProvidedSystems(void) const
 | 
			
		||||
 | 
			
		||||
bool cIptvDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
 | 
			
		||||
{
 | 
			
		||||
  int parameter, sidscan, pidscan;
 | 
			
		||||
  cString location;
 | 
			
		||||
  cIptvProtocolIf *protocol;
 | 
			
		||||
  cIptvTransponderParameters itp(Channel->Parameters());
 | 
			
		||||
 | 
			
		||||
  debug("cIptvDevice::SetChannelDevice(%d)\n", deviceIndex);
 | 
			
		||||
  location = GetChannelSettings(Channel->PluginParam(), ¶meter, &sidscan, &pidscan, &protocol);
 | 
			
		||||
  if (isempty(location)) {
 | 
			
		||||
     error("ERROR: Unrecognized IPTV channel settings: %s", Channel->PluginParam());
 | 
			
		||||
  
 | 
			
		||||
  if (isempty(itp.Address())) {
 | 
			
		||||
     error("Unrecognized IPTV address: %s", Channel->Parameters());
 | 
			
		||||
     return false;
 | 
			
		||||
     }
 | 
			
		||||
  sidScanEnabled = sidscan ? true : false;
 | 
			
		||||
  pidScanEnabled = pidscan ? true : false;
 | 
			
		||||
  if (pIptvStreamer->Set(location, parameter, deviceIndex, protocol)) {
 | 
			
		||||
  switch (itp.Protocol()) {
 | 
			
		||||
    case cIptvTransponderParameters::eProtocolUDP:
 | 
			
		||||
         protocol = pUdpProtocol;
 | 
			
		||||
         break;
 | 
			
		||||
    case cIptvTransponderParameters::eProtocolHTTP:
 | 
			
		||||
         protocol = pHttpProtocol;
 | 
			
		||||
         break;
 | 
			
		||||
    case cIptvTransponderParameters::eProtocolFILE:
 | 
			
		||||
         protocol = pFileProtocol;
 | 
			
		||||
         break;
 | 
			
		||||
    case cIptvTransponderParameters::eProtocolEXT:
 | 
			
		||||
         protocol = pExtProtocol;
 | 
			
		||||
         break;
 | 
			
		||||
    default:
 | 
			
		||||
         error("Unrecognized IPTV protocol: %s", Channel->Parameters());
 | 
			
		||||
         return false;
 | 
			
		||||
         break;
 | 
			
		||||
  }
 | 
			
		||||
  sidScanEnabled = itp.SidScan() ? true : false;
 | 
			
		||||
  pidScanEnabled = itp.PidScan() ? true : false;
 | 
			
		||||
  if (pIptvStreamer->Set(itp.Address(), itp.Parameter(), deviceIndex, protocol)) {
 | 
			
		||||
     if (sidScanEnabled && pSidScanner && IptvConfig.GetSectionFiltering())
 | 
			
		||||
        pSidScanner->SetChannel(Channel);
 | 
			
		||||
     if (pidScanEnabled && pPidScanner)
 | 
			
		||||
@@ -391,7 +353,7 @@ void cIptvDevice::ResetBuffering(void)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvDevice::ResetBuffering(%d)\n", deviceIndex);
 | 
			
		||||
  // pad prefill to multiple of TS_SIZE
 | 
			
		||||
  tsBufferPrefill = MEGABYTE(IptvConfig.GetTsBufferSize()) *
 | 
			
		||||
  tsBufferPrefill = (unsigned int)MEGABYTE(IptvConfig.GetTsBufferSize()) *
 | 
			
		||||
                    IptvConfig.GetTsBufferPrefillRatio() / 100;
 | 
			
		||||
  tsBufferPrefill -= (tsBufferPrefill % TS_SIZE);
 | 
			
		||||
}
 | 
			
		||||
@@ -427,7 +389,7 @@ bool cIptvDevice::GetTSPacket(uchar *&Data)
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
           tsBuffer->Del(Count);
 | 
			
		||||
           error("ERROR: skipped %d bytes to sync on TS packet\n", Count);
 | 
			
		||||
           error("Skipped %d bytes to sync on TS packet\n", Count);
 | 
			
		||||
           return false;
 | 
			
		||||
           }
 | 
			
		||||
        isPacketDelivered = true;
 | 
			
		||||
@@ -436,7 +398,7 @@ bool cIptvDevice::GetTSPacket(uchar *&Data)
 | 
			
		||||
        AddPidStatistic(ts_pid(p), payload(p));
 | 
			
		||||
        // Send data also to dvr fifo
 | 
			
		||||
        if (dvrFd >= 0)
 | 
			
		||||
           Count = write(dvrFd, p, TS_SIZE);
 | 
			
		||||
           Count = (int)write(dvrFd, p, TS_SIZE);
 | 
			
		||||
        // Analyze incomplete streams with built-in pid analyzer
 | 
			
		||||
        if (pidScanEnabled && pPidScanner)
 | 
			
		||||
           pPidScanner->Process(p);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								device.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								device.h
									
									
									
									
									
								
							@@ -69,8 +69,6 @@ private:
 | 
			
		||||
 | 
			
		||||
  // for channel parsing & buffering
 | 
			
		||||
private:
 | 
			
		||||
  cString GetChannelSettings(const char *IptvParam, int *Parameter, int *SidScan, int *PidScan, cIptvProtocolIf* *Protocol);
 | 
			
		||||
  bool ProvidesIptv(const char *Param) const;
 | 
			
		||||
  void ResetBuffering(void);
 | 
			
		||||
  bool IsBuffering(void);
 | 
			
		||||
  bool DeleteFilter(unsigned int Index);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								iptv.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								iptv.c
									
									
									
									
									
								
							@@ -12,15 +12,11 @@
 | 
			
		||||
#include "setup.h"
 | 
			
		||||
#include "device.h"
 | 
			
		||||
 | 
			
		||||
#ifndef PLUGINPARAMPATCHVERSNUM
 | 
			
		||||
#error "You must apply the pluginparam patch for VDR!"
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM < 10713
 | 
			
		||||
#error "VDR-1.7.13 API version or greater is required!"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM < 10600
 | 
			
		||||
#error "VDR-1.6.0 API version or greater is required!"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static const char VERSION[]     = "0.3.0";
 | 
			
		||||
static const char VERSION[]     = "0.4.0";
 | 
			
		||||
static const char DESCRIPTION[] = trNOOP("Experience the IPTV");
 | 
			
		||||
 | 
			
		||||
class cPluginIptv : public cPlugin {
 | 
			
		||||
@@ -78,7 +74,7 @@ bool cPluginIptv::ProcessArgs(int argc, char *argv[])
 | 
			
		||||
  // Implement command line argument processing here if applicable.
 | 
			
		||||
  static const struct option long_options[] = {
 | 
			
		||||
    { "devices", required_argument, NULL, 'd' },
 | 
			
		||||
    { NULL, 0, NULL, 0 }
 | 
			
		||||
    { NULL,      no_argument,       NULL,  0  }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  int c;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,12 @@ set -e
 | 
			
		||||
# The script originates from Peter Holik
 | 
			
		||||
#
 | 
			
		||||
# Example channels.conf entries:
 | 
			
		||||
# Energy;IPTV:50:IPTV|S0P0|EXT|png.sh|1:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Temperature;IPTV:60:IPTV|S0P0|EXT|png.sh|2:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Temperature Week;IPTV:70:IPTV|S0P0|EXT|png.sh|3:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Server Temperature;IPTV:80:IPTV|S0P0|EXT|png.sh|4:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Server Temperature Week;IPTV:90:IPTV|S0P0|EXT|png.sh|5:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Traffic;IPTV:100:IPTV|S0P0|EXT|png.sh|6:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Energy;IPTV:50:S=0|P=0|F=EXT|U=png.sh|A=1:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Temperature;IPTV:60:S=0|P=0|EXT|U=png.sh|A=2:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Temperature Week;IPTV:70:S=0|P=0|EXT|U=png.sh|A=3:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Server Temperature;IPTV:80:S=0|P=0|EXT|U=png.sh|A=4:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Server Temperature Week;IPTV:90:S=0|P=0|EXT|U=png.sh|A=5:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# Traffic;IPTV:100:S=0|P=0|EXT|U=png.sh|A=6:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
#
 | 
			
		||||
# webcam.sh is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
# http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin
 | 
			
		||||
#
 | 
			
		||||
# An example channels.conf entry:
 | 
			
		||||
# internetradio;IPTV:2:IPTV|S0P0|EXT|internetradio.sh|0:P:0:0:256:0:0:2:0:0:0
 | 
			
		||||
# internetradio;IPTV:2:S=0|P=0|F=EXT|U=internetradio.sh|A=0:P:0:0:256:0:0:2:0:0:0
 | 
			
		||||
#
 | 
			
		||||
# internetradio.sh is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
# http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin
 | 
			
		||||
#
 | 
			
		||||
# An example channels.conf entry:
 | 
			
		||||
# linein;IPTV:5:IPTV|S0P0|EXT|linein.sh|0:P:27500:0:256:0:0:5:5:5:0
 | 
			
		||||
# linein;IPTV:5:S=0|P=0|F=EXT|U=linein.sh|A=0:I:27500:0:256:0:0:5:5:5:0
 | 
			
		||||
#
 | 
			
		||||
# linein.sh is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ lookup_channel_and_pids()
 | 
			
		||||
    [ ! -e "$CHANNELS_CONF" ] && \
 | 
			
		||||
      exit_with_error "channels.conf not found ($CHANNELS_CONF)"
 | 
			
		||||
 | 
			
		||||
    local CHANNEL_RECORD=`grep "[:]IPTV[|][SP][10][SP][10][|]EXT[|]vlc2iptv[|]$PARAMETER[:]" $CHANNELS_CONF`
 | 
			
		||||
    local CHANNEL_RECORD=`grep "[:]S=[10][|]P=[10][|]F=EXT[|]U=vlc2iptv[|]A=$PARAMETER[:]I" $CHANNELS_CONF`
 | 
			
		||||
    [ -z "$CHANNEL_RECORD" ] && \
 | 
			
		||||
      exit_with_error "no iptv channel with parameter $PARAMETER found"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
# http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin
 | 
			
		||||
#
 | 
			
		||||
# An example channels.conf entry:
 | 
			
		||||
# webcam;IPTV:3:IPTV|S0P0|EXT|webcam.sh|0:P:0:256:257:0:0:3:0:0:0
 | 
			
		||||
# webcam;IPTV:3:S=0|P=0|F=EXT|U=webcam.sh|A=0:I:0:256:257:0:0:3:0:0:0
 | 
			
		||||
#
 | 
			
		||||
# webcam.sh is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/pat.c vdr-1.6.0-disable-ca-updates/pat.c
 | 
			
		||||
--- vdr-1.6.0-vanilla/pat.c	2008-02-08 15:48:31.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-disable-ca-updates/pat.c	2009-03-07 14:56:42.000000000 +0200
 | 
			
		||||
@@ -440,6 +440,7 @@
 | 
			
		||||
             }
 | 
			
		||||
         if (Setup.UpdateChannels >= 2) {
 | 
			
		||||
            Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
 | 
			
		||||
+           if (!Channel->IsPlug())
 | 
			
		||||
            Channel->SetCaIds(CaDescriptors->CaIds());
 | 
			
		||||
            }
 | 
			
		||||
         Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
 | 
			
		||||
@@ -1,287 +0,0 @@
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/channels.c vdr-1.6.0-pluginparam/channels.c
 | 
			
		||||
--- vdr-1.6.0-vanilla/channels.c	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/channels.c	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -166,6 +166,7 @@
 | 
			
		||||
   shortName = strdup("");
 | 
			
		||||
   provider = strdup("");
 | 
			
		||||
   portalName = strdup("");
 | 
			
		||||
+  pluginParam = strdup("");
 | 
			
		||||
   memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
 | 
			
		||||
   inversion    = INVERSION_AUTO;
 | 
			
		||||
   bandwidth    = BANDWIDTH_AUTO;
 | 
			
		||||
@@ -187,6 +188,7 @@
 | 
			
		||||
   shortName = NULL;
 | 
			
		||||
   provider = NULL;
 | 
			
		||||
   portalName = NULL;
 | 
			
		||||
+  pluginParam = NULL;
 | 
			
		||||
   schedule     = NULL;
 | 
			
		||||
   linkChannels = NULL;
 | 
			
		||||
   refChannel   = NULL;
 | 
			
		||||
@@ -215,6 +217,7 @@
 | 
			
		||||
   free(shortName);
 | 
			
		||||
   free(provider);
 | 
			
		||||
   free(portalName);
 | 
			
		||||
+  free(pluginParam);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 cChannel& cChannel::operator= (const cChannel &Channel)
 | 
			
		||||
@@ -223,6 +226,7 @@
 | 
			
		||||
   shortName = strcpyrealloc(shortName, Channel.shortName);
 | 
			
		||||
   provider = strcpyrealloc(provider, Channel.provider);
 | 
			
		||||
   portalName = strcpyrealloc(portalName, Channel.portalName);
 | 
			
		||||
+  pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam);
 | 
			
		||||
   memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__);
 | 
			
		||||
   return *this;
 | 
			
		||||
 }
 | 
			
		||||
@@ -280,9 +284,26 @@
 | 
			
		||||
      transmission = Channel->transmission;
 | 
			
		||||
      guard        = Channel->guard;
 | 
			
		||||
      hierarchy    = Channel->hierarchy;
 | 
			
		||||
+     if (IsPlug())  pluginParam = strcpyrealloc(pluginParam, Channel->pluginParam);
 | 
			
		||||
      }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+bool cChannel::SetPlugTransponderData(int Source, int Frequency, const char *PluginParam)
 | 
			
		||||
+{
 | 
			
		||||
+  if (source != Source || frequency != Frequency || (strcmp(pluginParam, PluginParam) != 0)) {
 | 
			
		||||
+     if (Number()) {
 | 
			
		||||
+        dsyslog("changing transponder data of channel %d from %s:%d:%s to %s:%d:%s", Number(), *cSource::ToString(source), frequency, pluginParam, *cSource::ToString(Source), Frequency, PluginParam);
 | 
			
		||||
+        modification |= CHANNELMOD_TRANSP;
 | 
			
		||||
+        Channels.SetModified();
 | 
			
		||||
+        }
 | 
			
		||||
+     source = Source;
 | 
			
		||||
+     frequency = Frequency;
 | 
			
		||||
+     pluginParam = strcpyrealloc(pluginParam, PluginParam);
 | 
			
		||||
+     schedule = NULL;
 | 
			
		||||
+     }
 | 
			
		||||
+  return true;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH)
 | 
			
		||||
 {
 | 
			
		||||
   // Workarounds for broadcaster stupidity:
 | 
			
		||||
@@ -407,6 +428,18 @@
 | 
			
		||||
      }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void cChannel::SetPluginParam(const char *PluginParam)
 | 
			
		||||
+{
 | 
			
		||||
+  if (!isempty(PluginParam) && strcmp(pluginParam, PluginParam) != 0) {
 | 
			
		||||
+     if (Number()) {
 | 
			
		||||
+        dsyslog("changing plugin parameters of channel %d from '%s' to '%s'", Number(), pluginParam, PluginParam);
 | 
			
		||||
+        modification |= CHANNELMOD_TRANSP;
 | 
			
		||||
+        Channels.SetModified();
 | 
			
		||||
+        }
 | 
			
		||||
+     pluginParam = strcpyrealloc(pluginParam, PluginParam);
 | 
			
		||||
+     }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 #define STRDIFF 0x01
 | 
			
		||||
 #define VALDIFF 0x02
 | 
			
		||||
 
 | 
			
		||||
@@ -593,7 +626,7 @@
 | 
			
		||||
   if (isdigit(type))
 | 
			
		||||
      type = 'S';
 | 
			
		||||
 #define ST(s) if (strchr(s, type))
 | 
			
		||||
-  char buffer[64];
 | 
			
		||||
+  char buffer[256];
 | 
			
		||||
   char *q = buffer;
 | 
			
		||||
   *q = 0;
 | 
			
		||||
   ST(" S ")  q += sprintf(q, "%c", polarization);
 | 
			
		||||
@@ -605,6 +638,7 @@
 | 
			
		||||
   ST("  T")  q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
 | 
			
		||||
   ST("  T")  q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
 | 
			
		||||
   ST("  T")  q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
 | 
			
		||||
+  ST("P  ")  snprintf(buffer, sizeof(buffer), "%s", pluginParam);
 | 
			
		||||
   return buffer;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -626,7 +660,7 @@
 | 
			
		||||
 
 | 
			
		||||
 bool cChannel::StringToParameters(const char *s)
 | 
			
		||||
 {
 | 
			
		||||
-  while (s && *s) {
 | 
			
		||||
+  while (s && *s && !IsPlug()) {
 | 
			
		||||
         switch (toupper(*s)) {
 | 
			
		||||
           case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
 | 
			
		||||
           case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
 | 
			
		||||
@@ -736,7 +770,7 @@
 | 
			
		||||
         dpids[0] = 0;
 | 
			
		||||
         ok = false;
 | 
			
		||||
         if (parambuf && sourcebuf && vpidbuf && apidbuf) {
 | 
			
		||||
-           ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0;
 | 
			
		||||
+           ok = ((source = cSource::FromString(sourcebuf)) >= 0) && StringToParameters(parambuf);
 | 
			
		||||
 
 | 
			
		||||
            char *p = strchr(vpidbuf, '+');
 | 
			
		||||
            if (p)
 | 
			
		||||
@@ -827,6 +861,7 @@
 | 
			
		||||
            shortName = strcpyrealloc(shortName, p);
 | 
			
		||||
            }
 | 
			
		||||
         name = strcpyrealloc(name, namebuf);
 | 
			
		||||
+        if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf);
 | 
			
		||||
 
 | 
			
		||||
         free(parambuf);
 | 
			
		||||
         free(sourcebuf);
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/channels.h vdr-1.6.0-pluginparam/channels.h
 | 
			
		||||
--- vdr-1.6.0-vanilla/channels.h	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/channels.h	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -114,6 +114,7 @@
 | 
			
		||||
   char *shortName;
 | 
			
		||||
   char *provider;
 | 
			
		||||
   char *portalName;
 | 
			
		||||
+  char *pluginParam;
 | 
			
		||||
   int __BeginData__;
 | 
			
		||||
   int frequency; // MHz
 | 
			
		||||
   int source;
 | 
			
		||||
@@ -165,6 +166,7 @@
 | 
			
		||||
   int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf'
 | 
			
		||||
   int Transponder(void) const;                    ///< Returns the transponder frequency in MHz, plus the polarization in case of sat
 | 
			
		||||
   static int Transponder(int Frequency, char Polarization); ///< builds the transponder from the given Frequency and Polarization
 | 
			
		||||
+  const char *PluginParam(void) const { return pluginParam; }
 | 
			
		||||
   int Source(void) const { return source; }
 | 
			
		||||
   int Srate(void) const { return srate; }
 | 
			
		||||
   int Vpid(void) const { return vpid; }
 | 
			
		||||
@@ -199,6 +201,7 @@
 | 
			
		||||
   int Hierarchy(void) const { return hierarchy; }
 | 
			
		||||
   const cLinkChannels* LinkChannels(void) const { return linkChannels; }
 | 
			
		||||
   const cChannel *RefChannel(void) const { return refChannel; }
 | 
			
		||||
+  bool IsPlug(void) const { return cSource::IsPlug(source); }
 | 
			
		||||
   bool IsCable(void) const { return cSource::IsCable(source); }
 | 
			
		||||
   bool IsSat(void) const { return cSource::IsSat(source); }
 | 
			
		||||
   bool IsTerr(void) const { return cSource::IsTerr(source); }
 | 
			
		||||
@@ -206,12 +209,14 @@
 | 
			
		||||
   bool HasTimer(void) const;
 | 
			
		||||
   int Modification(int Mask = CHANNELMOD_ALL);
 | 
			
		||||
   void CopyTransponderData(const cChannel *Channel);
 | 
			
		||||
+  bool SetPlugTransponderData(int Source, int Frequency, const char *PluginParam);
 | 
			
		||||
   bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH);
 | 
			
		||||
   bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH);
 | 
			
		||||
   bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission);
 | 
			
		||||
   void SetId(int Nid, int Tid, int Sid, int Rid = 0);
 | 
			
		||||
   void SetName(const char *Name, const char *ShortName, const char *Provider);
 | 
			
		||||
   void SetPortalName(const char *PortalName);
 | 
			
		||||
+  void SetPluginParam(const char *PluginParam);
 | 
			
		||||
   void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
 | 
			
		||||
   void SetCaIds(const int *CaIds); // list must be zero-terminated
 | 
			
		||||
   void SetCaDescriptors(int Level);
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/config.h vdr-1.6.0-pluginparam/config.h
 | 
			
		||||
--- vdr-1.6.0-vanilla/config.h	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/config.h	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -30,6 +30,8 @@
 | 
			
		||||
 #define APIVERSION  "1.6.0"
 | 
			
		||||
 #define APIVERSNUM   10600  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
 
 | 
			
		||||
+#define PLUGINPARAMPATCHVERSNUM 1
 | 
			
		||||
+
 | 
			
		||||
 // When loading plugins, VDR searches them by their APIVERSION, which
 | 
			
		||||
 // may be smaller than VDRVERSION in case there have been no changes to
 | 
			
		||||
 // VDR header files since the last APIVERSION. This allows compiled
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/menu.c vdr-1.6.0-pluginparam/menu.c
 | 
			
		||||
--- vdr-1.6.0-vanilla/menu.c	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/menu.c	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -253,6 +253,7 @@
 | 
			
		||||
   cChannel *channel;
 | 
			
		||||
   cChannel data;
 | 
			
		||||
   char name[256];
 | 
			
		||||
+  char pluginParam[256];
 | 
			
		||||
   void Setup(void);
 | 
			
		||||
 public:
 | 
			
		||||
   cMenuEditChannel(cChannel *Channel, bool New = false);
 | 
			
		||||
@@ -285,6 +286,7 @@
 | 
			
		||||
 
 | 
			
		||||
   // Parameters for all types of sources:
 | 
			
		||||
   strn0cpy(name, data.name, sizeof(name));
 | 
			
		||||
+  strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam));
 | 
			
		||||
   Add(new cMenuEditStrItem( tr("Name"),          name, sizeof(name)));
 | 
			
		||||
   Add(new cMenuEditSrcItem( tr("Source"),       &data.source));
 | 
			
		||||
   Add(new cMenuEditIntItem( tr("Frequency"),    &data.frequency));
 | 
			
		||||
@@ -315,6 +317,7 @@
 | 
			
		||||
   ST("  T")  Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues));
 | 
			
		||||
   ST("  T")  Add(new cMenuEditMapItem( tr("Guard"),        &data.guard,        GuardValues));
 | 
			
		||||
   ST("  T")  Add(new cMenuEditMapItem( tr("Hierarchy"),    &data.hierarchy,    HierarchyValues, tr("none")));
 | 
			
		||||
+  ST("P  ")  Add(new cMenuEditStrItem( tr("Parameters"),    pluginParam, sizeof(pluginParam), tr(FileNameChars)));
 | 
			
		||||
 
 | 
			
		||||
   SetCurrent(Get(current));
 | 
			
		||||
   Display();
 | 
			
		||||
@@ -329,6 +332,7 @@
 | 
			
		||||
      if (Key == kOk) {
 | 
			
		||||
         if (Channels.HasUniqueChannelID(&data, channel)) {
 | 
			
		||||
            data.name = strcpyrealloc(data.name, name);
 | 
			
		||||
+           data.pluginParam = strcpyrealloc(data.pluginParam, pluginParam);
 | 
			
		||||
            if (channel) {
 | 
			
		||||
               *channel = data;
 | 
			
		||||
               isyslog("edited channel %d %s", channel->Number(), *data.ToText());
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/po/fi_FI.po vdr-1.6.0-pluginparam/po/fi_FI.po
 | 
			
		||||
--- vdr-1.6.0-vanilla/po/fi_FI.po	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/po/fi_FI.po	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -1001,3 +1001,6 @@
 | 
			
		||||
 #, c-format
 | 
			
		||||
 msgid "VDR will shut down in %s minutes"
 | 
			
		||||
 msgstr "VDR sammuu %s minuutin kuluttua"
 | 
			
		||||
+
 | 
			
		||||
+msgid "Parameters"
 | 
			
		||||
+msgstr "Parametrit"
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/po/fr_FR.po vdr-1.6.0-pluginparam/po/fr_FR.po
 | 
			
		||||
--- vdr-1.6.0-vanilla/po/fr_FR.po	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/po/fr_FR.po	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -1004,3 +1004,6 @@
 | 
			
		||||
 #, c-format
 | 
			
		||||
 msgid "VDR will shut down in %s minutes"
 | 
			
		||||
 msgstr "VDR s'arr<72>tera dans %s minutes"
 | 
			
		||||
+
 | 
			
		||||
+msgid "Parameters"
 | 
			
		||||
+msgstr "Param<61>tres"
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/sources.c vdr-1.6.0-pluginparam/sources.c
 | 
			
		||||
--- vdr-1.6.0-vanilla/sources.c	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/sources.c	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
   char buffer[16];
 | 
			
		||||
   char *q = buffer;
 | 
			
		||||
   switch (Code & st_Mask) {
 | 
			
		||||
+    case stPlug:  *q++ = 'P'; break;
 | 
			
		||||
     case stCable: *q++ = 'C'; break;
 | 
			
		||||
     case stSat:   *q++ = 'S';
 | 
			
		||||
                   {
 | 
			
		||||
@@ -56,6 +57,7 @@
 | 
			
		||||
 {
 | 
			
		||||
   int type = stNone;
 | 
			
		||||
   switch (toupper(*s)) {
 | 
			
		||||
+    case 'P': type = stPlug;  break;
 | 
			
		||||
     case 'C': type = stCable; break;
 | 
			
		||||
     case 'S': type = stSat;   break;
 | 
			
		||||
     case 'T': type = stTerr;  break;
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/sources.conf vdr-1.6.0-pluginparam/sources.conf
 | 
			
		||||
--- vdr-1.6.0-vanilla/sources.conf	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/sources.conf	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -188,3 +188,7 @@
 | 
			
		||||
 # Terrestrial
 | 
			
		||||
 
 | 
			
		||||
 T       Terrestrial
 | 
			
		||||
+
 | 
			
		||||
+# Plugin
 | 
			
		||||
+
 | 
			
		||||
+P       Plugin
 | 
			
		||||
diff -Nru vdr-1.6.0-vanilla/sources.h vdr-1.6.0-pluginparam/sources.h
 | 
			
		||||
--- vdr-1.6.0-vanilla/sources.h	2008-03-27 21:43:25.000000000 +0200
 | 
			
		||||
+++ vdr-1.6.0-pluginparam/sources.h	2008-03-27 22:06:47.000000000 +0200
 | 
			
		||||
@@ -16,10 +16,11 @@
 | 
			
		||||
 public:
 | 
			
		||||
   enum eSourceType {
 | 
			
		||||
     stNone  = 0x0000,
 | 
			
		||||
+    stPlug  = 0x2000,
 | 
			
		||||
     stCable = 0x4000,
 | 
			
		||||
     stSat   = 0x8000,
 | 
			
		||||
     stTerr  = 0xC000,
 | 
			
		||||
-    st_Mask = 0xC000,
 | 
			
		||||
+    st_Mask = 0xE000,
 | 
			
		||||
     st_Neg  = 0x0800,
 | 
			
		||||
     st_Pos  = 0x07FF,
 | 
			
		||||
     };
 | 
			
		||||
@@ -35,6 +36,7 @@
 | 
			
		||||
   static cString ToString(int Code);
 | 
			
		||||
   static int FromString(const char *s);
 | 
			
		||||
   static int FromData(eSourceType SourceType, int Position = 0, bool East = false);
 | 
			
		||||
+  static bool IsPlug(int Code) { return (Code & st_Mask) == stPlug; }
 | 
			
		||||
   static bool IsCable(int Code) { return (Code & st_Mask) == stCable; }
 | 
			
		||||
   static bool IsSat(int Code) { return (Code & st_Mask) == stSat; }
 | 
			
		||||
   static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; }
 | 
			
		||||
							
								
								
									
										11
									
								
								patches/vdr-1.7.13-disable_ca_updates.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								patches/vdr-1.7.13-disable_ca_updates.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
diff -Nru vdr-1.7.13-vanilla/pat.c vdr-1.7.13-disable_ca_updates/pat.c
 | 
			
		||||
--- vdr-1.7.13-vanilla/pat.c	2010-01-01 17:40:05.000000000 +0200
 | 
			
		||||
+++ vdr-1.7.13-disable_ca_updates/pat.c	2010-03-04 13:44:28.000000000 +0200
 | 
			
		||||
@@ -458,6 +458,7 @@
 | 
			
		||||
             }
 | 
			
		||||
         if (Setup.UpdateChannels >= 2) {
 | 
			
		||||
            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
 | 
			
		||||
+           if (!Channel->IsPlug())
 | 
			
		||||
            Channel->SetCaIds(CaDescriptors->CaIds());
 | 
			
		||||
            Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds);
 | 
			
		||||
            }
 | 
			
		||||
							
								
								
									
										12
									
								
								patches/vdr-1.7.13-disable_eitscan.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								patches/vdr-1.7.13-disable_eitscan.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
diff -Nru vdr-1.7.13-vanilla/eitscan.c vdr-1.7.13-disable_eitscan/eitscan.c
 | 
			
		||||
--- vdr-1.7.13-vanilla/eitscan.c	2010-02-07 14:12:05.000000000 +0200
 | 
			
		||||
+++ vdr-1.7.13-disable_eitscan/eitscan.c	2010-03-04 13:44:17.000000000 +0200
 | 
			
		||||
@@ -146,7 +146,7 @@
 | 
			
		||||
                if (Device) {
 | 
			
		||||
                   for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) {
 | 
			
		||||
                       const cChannel *Channel = ScanData->GetChannel();
 | 
			
		||||
-                      if (Channel) {
 | 
			
		||||
+                      if (Channel && !Channel->IsPlug()) {
 | 
			
		||||
                          if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) {
 | 
			
		||||
                             if (Device->ProvidesTransponder(Channel)) {
 | 
			
		||||
                                if (!Device->Receiving()) {
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/pat.c vdr-1.7.7-disable_ca_updates/pat.c
 | 
			
		||||
--- vdr-1.7.7-vanilla/pat.c	2008-07-06 17:01:32.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-disable_ca_updates/pat.c	2009-05-22 10:57:58.000000000 +0300
 | 
			
		||||
@@ -444,6 +444,7 @@
 | 
			
		||||
             }
 | 
			
		||||
         if (Setup.UpdateChannels >= 2) {
 | 
			
		||||
            Channel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
 | 
			
		||||
+           if (!Channel->IsPlug())
 | 
			
		||||
            Channel->SetCaIds(CaDescriptors->CaIds());
 | 
			
		||||
            }
 | 
			
		||||
         Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
 | 
			
		||||
@@ -1,287 +0,0 @@
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/channels.c vdr-1.7.7-pluginparam/channels.c
 | 
			
		||||
--- vdr-1.7.7-vanilla/channels.c	2009-04-25 16:57:32.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/channels.c	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -188,6 +188,7 @@
 | 
			
		||||
   shortName = strdup("");
 | 
			
		||||
   provider = strdup("");
 | 
			
		||||
   portalName = strdup("");
 | 
			
		||||
+  pluginParam = strdup("");
 | 
			
		||||
   memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
 | 
			
		||||
   inversion    = INVERSION_AUTO;
 | 
			
		||||
   bandwidth    = 8000000;
 | 
			
		||||
@@ -211,6 +212,7 @@
 | 
			
		||||
   shortName = NULL;
 | 
			
		||||
   provider = NULL;
 | 
			
		||||
   portalName = NULL;
 | 
			
		||||
+  pluginParam = NULL;
 | 
			
		||||
   schedule     = NULL;
 | 
			
		||||
   linkChannels = NULL;
 | 
			
		||||
   refChannel   = NULL;
 | 
			
		||||
@@ -239,6 +241,7 @@
 | 
			
		||||
   free(shortName);
 | 
			
		||||
   free(provider);
 | 
			
		||||
   free(portalName);
 | 
			
		||||
+  free(pluginParam);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 cChannel& cChannel::operator= (const cChannel &Channel)
 | 
			
		||||
@@ -247,6 +250,7 @@
 | 
			
		||||
   shortName = strcpyrealloc(shortName, Channel.shortName);
 | 
			
		||||
   provider = strcpyrealloc(provider, Channel.provider);
 | 
			
		||||
   portalName = strcpyrealloc(portalName, Channel.portalName);
 | 
			
		||||
+  pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam);
 | 
			
		||||
   memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__);
 | 
			
		||||
   return *this;
 | 
			
		||||
 }
 | 
			
		||||
@@ -306,9 +310,26 @@
 | 
			
		||||
      guard        = Channel->guard;
 | 
			
		||||
      hierarchy    = Channel->hierarchy;
 | 
			
		||||
      rollOff      = Channel->rollOff;
 | 
			
		||||
+     if (IsPlug())  pluginParam = strcpyrealloc(pluginParam, Channel->pluginParam);
 | 
			
		||||
      }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+bool cChannel::SetPlugTransponderData(int Source, int Frequency, const char *PluginParam)
 | 
			
		||||
+{
 | 
			
		||||
+  if (source != Source || frequency != Frequency || (strcmp(pluginParam, PluginParam) != 0)) {
 | 
			
		||||
+     if (Number()) {
 | 
			
		||||
+        dsyslog("changing transponder data of channel %d from %s:%d:%s to %s:%d:%s", Number(), *cSource::ToString(source), frequency, pluginParam, *cSource::ToString(Source), Frequency, PluginParam);
 | 
			
		||||
+        modification |= CHANNELMOD_TRANSP;
 | 
			
		||||
+        Channels.SetModified();
 | 
			
		||||
+        }
 | 
			
		||||
+     source = Source;
 | 
			
		||||
+     frequency = Frequency;
 | 
			
		||||
+     pluginParam = strcpyrealloc(pluginParam, PluginParam);
 | 
			
		||||
+     schedule = NULL;
 | 
			
		||||
+     }
 | 
			
		||||
+  return true;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff)
 | 
			
		||||
 {
 | 
			
		||||
   // Workarounds for broadcaster stupidity:
 | 
			
		||||
@@ -438,6 +459,18 @@
 | 
			
		||||
      }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void cChannel::SetPluginParam(const char *PluginParam)
 | 
			
		||||
+{
 | 
			
		||||
+  if (!isempty(PluginParam) && strcmp(pluginParam, PluginParam) != 0) {
 | 
			
		||||
+     if (Number()) {
 | 
			
		||||
+        dsyslog("changing plugin parameters of channel %d from '%s' to '%s'", Number(), pluginParam, PluginParam);
 | 
			
		||||
+        modification |= CHANNELMOD_TRANSP;
 | 
			
		||||
+        Channels.SetModified();
 | 
			
		||||
+        }
 | 
			
		||||
+     pluginParam = strcpyrealloc(pluginParam, PluginParam);
 | 
			
		||||
+     }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 #define STRDIFF 0x01
 | 
			
		||||
 #define VALDIFF 0x02
 | 
			
		||||
 
 | 
			
		||||
@@ -632,7 +665,7 @@
 | 
			
		||||
   if (isdigit(type))
 | 
			
		||||
      type = 'S';
 | 
			
		||||
 #define ST(s) if (strchr(s, type))
 | 
			
		||||
-  char buffer[64];
 | 
			
		||||
+  char buffer[256];
 | 
			
		||||
   char *q = buffer;
 | 
			
		||||
   *q = 0;
 | 
			
		||||
   ST(" S ")  q += sprintf(q, "%c", polarization);
 | 
			
		||||
@@ -646,6 +679,7 @@
 | 
			
		||||
   ST(" S ")  q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
 | 
			
		||||
   ST("  T")  q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
 | 
			
		||||
   ST("  T")  q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
 | 
			
		||||
+  ST("P  ")  snprintf(buffer, sizeof(buffer), "%s", pluginParam);
 | 
			
		||||
   return buffer;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -674,7 +708,7 @@
 | 
			
		||||
 
 | 
			
		||||
 bool cChannel::StringToParameters(const char *s)
 | 
			
		||||
 {
 | 
			
		||||
-  while (s && *s) {
 | 
			
		||||
+  while (s && *s && !IsPlug()) {
 | 
			
		||||
         switch (toupper(*s)) {
 | 
			
		||||
           case 'A': s = SkipDigits(s); break; // for compatibility with the "multiproto" approach - may be removed in future versions
 | 
			
		||||
           case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
 | 
			
		||||
@@ -792,7 +826,7 @@
 | 
			
		||||
         dpids[0] = 0;
 | 
			
		||||
         ok = false;
 | 
			
		||||
         if (parambuf && sourcebuf && vpidbuf && apidbuf) {
 | 
			
		||||
-           ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0;
 | 
			
		||||
+           ok = ((source = cSource::FromString(sourcebuf)) >= 0) && StringToParameters(parambuf);
 | 
			
		||||
 
 | 
			
		||||
            char *p;
 | 
			
		||||
            if ((p = strchr(vpidbuf, '=')) != NULL) {
 | 
			
		||||
@@ -887,6 +921,7 @@
 | 
			
		||||
            shortName = strcpyrealloc(shortName, p);
 | 
			
		||||
            }
 | 
			
		||||
         name = strcpyrealloc(name, namebuf);
 | 
			
		||||
+        if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf);
 | 
			
		||||
 
 | 
			
		||||
         free(parambuf);
 | 
			
		||||
         free(sourcebuf);
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/channels.h vdr-1.7.7-pluginparam/channels.h
 | 
			
		||||
--- vdr-1.7.7-vanilla/channels.h	2008-11-22 15:35:52.000000000 +0200
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/channels.h	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -116,6 +116,7 @@
 | 
			
		||||
   char *shortName;
 | 
			
		||||
   char *provider;
 | 
			
		||||
   char *portalName;
 | 
			
		||||
+  char *pluginParam;
 | 
			
		||||
   int __BeginData__;
 | 
			
		||||
   int frequency; // MHz
 | 
			
		||||
   int source;
 | 
			
		||||
@@ -171,6 +172,7 @@
 | 
			
		||||
   int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf'
 | 
			
		||||
   int Transponder(void) const;                    ///< Returns the transponder frequency in MHz, plus the polarization in case of sat
 | 
			
		||||
   static int Transponder(int Frequency, char Polarization); ///< builds the transponder from the given Frequency and Polarization
 | 
			
		||||
+  const char *PluginParam(void) const { return pluginParam; }
 | 
			
		||||
   int Source(void) const { return source; }
 | 
			
		||||
   int Srate(void) const { return srate; }
 | 
			
		||||
   int Vpid(void) const { return vpid; }
 | 
			
		||||
@@ -208,6 +210,7 @@
 | 
			
		||||
   int RollOff(void) const { return rollOff; }
 | 
			
		||||
   const cLinkChannels* LinkChannels(void) const { return linkChannels; }
 | 
			
		||||
   const cChannel *RefChannel(void) const { return refChannel; }
 | 
			
		||||
+  bool IsPlug(void) const { return cSource::IsPlug(source); }
 | 
			
		||||
   bool IsCable(void) const { return cSource::IsCable(source); }
 | 
			
		||||
   bool IsSat(void) const { return cSource::IsSat(source); }
 | 
			
		||||
   bool IsTerr(void) const { return cSource::IsTerr(source); }
 | 
			
		||||
@@ -215,12 +218,14 @@
 | 
			
		||||
   bool HasTimer(void) const;
 | 
			
		||||
   int Modification(int Mask = CHANNELMOD_ALL);
 | 
			
		||||
   void CopyTransponderData(const cChannel *Channel);
 | 
			
		||||
+  bool SetPlugTransponderData(int Source, int Frequency, const char *PluginParam);
 | 
			
		||||
   bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff);
 | 
			
		||||
   bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH);
 | 
			
		||||
   bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission);
 | 
			
		||||
   void SetId(int Nid, int Tid, int Sid, int Rid = 0);
 | 
			
		||||
   void SetName(const char *Name, const char *ShortName, const char *Provider);
 | 
			
		||||
   void SetPortalName(const char *PortalName);
 | 
			
		||||
+  void SetPluginParam(const char *PluginParam);
 | 
			
		||||
   void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
 | 
			
		||||
   void SetCaIds(const int *CaIds); // list must be zero-terminated
 | 
			
		||||
   void SetCaDescriptors(int Level);
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/config.h vdr-1.7.7-pluginparam/config.h
 | 
			
		||||
--- vdr-1.7.7-vanilla/config.h	2009-05-03 16:15:35.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/config.h	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -30,6 +30,8 @@
 | 
			
		||||
 #define APIVERSION  "1.7.7"
 | 
			
		||||
 #define APIVERSNUM   10707  // Version * 10000 + Major * 100 + Minor
 | 
			
		||||
 
 | 
			
		||||
+#define PLUGINPARAMPATCHVERSNUM 1
 | 
			
		||||
+
 | 
			
		||||
 // When loading plugins, VDR searches them by their APIVERSION, which
 | 
			
		||||
 // may be smaller than VDRVERSION in case there have been no changes to
 | 
			
		||||
 // VDR header files since the last APIVERSION. This allows compiled
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/menu.c vdr-1.7.7-pluginparam/menu.c
 | 
			
		||||
--- vdr-1.7.7-vanilla/menu.c	2009-05-03 16:30:13.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/menu.c	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -190,6 +190,7 @@
 | 
			
		||||
   cChannel *channel;
 | 
			
		||||
   cChannel data;
 | 
			
		||||
   char name[256];
 | 
			
		||||
+  char pluginParam[256];
 | 
			
		||||
   void Setup(void);
 | 
			
		||||
 public:
 | 
			
		||||
   cMenuEditChannel(cChannel *Channel, bool New = false);
 | 
			
		||||
@@ -222,6 +223,7 @@
 | 
			
		||||
 
 | 
			
		||||
   // Parameters for all types of sources:
 | 
			
		||||
   strn0cpy(name, data.name, sizeof(name));
 | 
			
		||||
+  strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam));
 | 
			
		||||
   Add(new cMenuEditStrItem( tr("Name"),          name, sizeof(name)));
 | 
			
		||||
   Add(new cMenuEditSrcItem( tr("Source"),       &data.source));
 | 
			
		||||
   Add(new cMenuEditIntItem( tr("Frequency"),    &data.frequency));
 | 
			
		||||
@@ -254,6 +256,7 @@
 | 
			
		||||
   ST("  T")  Add(new cMenuEditMapItem( tr("Guard"),        &data.guard,        GuardValues));
 | 
			
		||||
   ST("  T")  Add(new cMenuEditMapItem( tr("Hierarchy"),    &data.hierarchy,    HierarchyValues));
 | 
			
		||||
   ST(" S ")  Add(new cMenuEditMapItem( tr("Rolloff"),      &data.rollOff,      RollOffValues));
 | 
			
		||||
+  ST("P  ")  Add(new cMenuEditStrItem( tr("Parameters"),    pluginParam, sizeof(pluginParam), tr(FileNameChars)));
 | 
			
		||||
 
 | 
			
		||||
   SetCurrent(Get(current));
 | 
			
		||||
   Display();
 | 
			
		||||
@@ -268,6 +271,7 @@
 | 
			
		||||
      if (Key == kOk) {
 | 
			
		||||
         if (Channels.HasUniqueChannelID(&data, channel)) {
 | 
			
		||||
            data.name = strcpyrealloc(data.name, name);
 | 
			
		||||
+           data.pluginParam = strcpyrealloc(data.pluginParam, pluginParam);
 | 
			
		||||
            if (channel) {
 | 
			
		||||
               *channel = data;
 | 
			
		||||
               isyslog("edited channel %d %s", channel->Number(), *data.ToText());
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/po/fi_FI.po vdr-1.7.7-pluginparam/po/fi_FI.po
 | 
			
		||||
--- vdr-1.7.7-vanilla/po/fi_FI.po	2009-05-03 17:15:20.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/po/fi_FI.po	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -1010,3 +1010,6 @@
 | 
			
		||||
 #, c-format
 | 
			
		||||
 msgid "VDR will shut down in %s minutes"
 | 
			
		||||
 msgstr "VDR sammuu %s minuutin kuluttua"
 | 
			
		||||
+
 | 
			
		||||
+msgid "Parameters"
 | 
			
		||||
+msgstr "Parametrit"
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/po/fr_FR.po vdr-1.7.7-pluginparam/po/fr_FR.po
 | 
			
		||||
--- vdr-1.7.7-vanilla/po/fr_FR.po	2009-05-03 17:15:20.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/po/fr_FR.po	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -1013,3 +1013,6 @@
 | 
			
		||||
 #, c-format
 | 
			
		||||
 msgid "VDR will shut down in %s minutes"
 | 
			
		||||
 msgstr "VDR s'arr<72>tera dans %s minutes"
 | 
			
		||||
+
 | 
			
		||||
+msgid "Parameters"
 | 
			
		||||
+msgstr "Param<61>tres"
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/sources.c vdr-1.7.7-pluginparam/sources.c
 | 
			
		||||
--- vdr-1.7.7-vanilla/sources.c	2008-02-10 16:07:26.000000000 +0200
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/sources.c	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
   char buffer[16];
 | 
			
		||||
   char *q = buffer;
 | 
			
		||||
   switch (Code & st_Mask) {
 | 
			
		||||
+    case stPlug:  *q++ = 'P'; break;
 | 
			
		||||
     case stCable: *q++ = 'C'; break;
 | 
			
		||||
     case stSat:   *q++ = 'S';
 | 
			
		||||
                   {
 | 
			
		||||
@@ -56,6 +57,7 @@
 | 
			
		||||
 {
 | 
			
		||||
   int type = stNone;
 | 
			
		||||
   switch (toupper(*s)) {
 | 
			
		||||
+    case 'P': type = stPlug;  break;
 | 
			
		||||
     case 'C': type = stCable; break;
 | 
			
		||||
     case 'S': type = stSat;   break;
 | 
			
		||||
     case 'T': type = stTerr;  break;
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/sources.conf vdr-1.7.7-pluginparam/sources.conf
 | 
			
		||||
--- vdr-1.7.7-vanilla/sources.conf	2008-08-16 13:02:27.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/sources.conf	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -194,3 +194,7 @@
 | 
			
		||||
 # Terrestrial
 | 
			
		||||
 
 | 
			
		||||
 T       Terrestrial
 | 
			
		||||
+
 | 
			
		||||
+# Plugin
 | 
			
		||||
+
 | 
			
		||||
+P       Plugin
 | 
			
		||||
diff -Nru vdr-1.7.7-vanilla/sources.h vdr-1.7.7-pluginparam/sources.h
 | 
			
		||||
--- vdr-1.7.7-vanilla/sources.h	2005-05-14 12:30:41.000000000 +0300
 | 
			
		||||
+++ vdr-1.7.7-pluginparam/sources.h	2009-05-22 10:57:39.000000000 +0300
 | 
			
		||||
@@ -16,10 +16,11 @@
 | 
			
		||||
 public:
 | 
			
		||||
   enum eSourceType {
 | 
			
		||||
     stNone  = 0x0000,
 | 
			
		||||
+    stPlug  = 0x2000,
 | 
			
		||||
     stCable = 0x4000,
 | 
			
		||||
     stSat   = 0x8000,
 | 
			
		||||
     stTerr  = 0xC000,
 | 
			
		||||
-    st_Mask = 0xC000,
 | 
			
		||||
+    st_Mask = 0xE000,
 | 
			
		||||
     st_Neg  = 0x0800,
 | 
			
		||||
     st_Pos  = 0x07FF,
 | 
			
		||||
     };
 | 
			
		||||
@@ -35,6 +36,7 @@
 | 
			
		||||
   static cString ToString(int Code);
 | 
			
		||||
   static int FromString(const char *s);
 | 
			
		||||
   static int FromData(eSourceType SourceType, int Position = 0, bool East = false);
 | 
			
		||||
+  static bool IsPlug(int Code) { return (Code & st_Mask) == stPlug; }
 | 
			
		||||
   static bool IsCable(int Code) { return (Code & st_Mask) == stCable; }
 | 
			
		||||
   static bool IsSat(int Code) { return (Code & st_Mask) == stSat; }
 | 
			
		||||
   static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; }
 | 
			
		||||
@@ -33,7 +33,7 @@ cPidScanner::~cPidScanner()
 | 
			
		||||
void cPidScanner::SetChannel(const cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  if (Channel) {
 | 
			
		||||
     debug("cPidScanner::SetChannel(): %s\n", Channel->PluginParam());
 | 
			
		||||
     debug("cPidScanner::SetChannel(): %s\n", Channel->Parameters());
 | 
			
		||||
     channel = *Channel;
 | 
			
		||||
     }
 | 
			
		||||
  else {
 | 
			
		||||
@@ -146,12 +146,8 @@ void cPidScanner::Process(const uint8_t* buf)
 | 
			
		||||
              for (unsigned int i = 0; i < MAXSPIDS; ++i)
 | 
			
		||||
                  Spids[i] = IptvChannel->Spid(i);
 | 
			
		||||
              debug("cPidScanner::Process(): Vpid=0x%04X, Apid=0x%04X\n", Vpid, Apid);
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM >= 10704
 | 
			
		||||
              int Vtype = IptvChannel->Vtype();
 | 
			
		||||
              IptvChannel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
 | 
			
		||||
#else
 | 
			
		||||
              IptvChannel->SetPids(Vpid, Ppid, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
 | 
			
		||||
#endif
 | 
			
		||||
              }
 | 
			
		||||
           Channels.Unlock();
 | 
			
		||||
           process = false;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								po/de_DE.po
									
									
									
									
									
								
							@@ -5,9 +5,9 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: iptv 0.2.5\n"
 | 
			
		||||
"Project-Id-Version: iptv 0.4.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
 | 
			
		||||
"POT-Creation-Date: 2009-03-06 22:15+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2010-03-04 18:12+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2007-10-29 21:19+0100\n"
 | 
			
		||||
"Last-Translator: Tobias Grimm <tg@e-tobi.net>\n"
 | 
			
		||||
"Language-Team: German\n"
 | 
			
		||||
@@ -40,60 +40,6 @@ msgstr "TDT (0x70)"
 | 
			
		||||
msgid "Experience the IPTV"
 | 
			
		||||
msgstr "Erlebe IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "DATEI"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protokoll"
 | 
			
		||||
 | 
			
		||||
msgid "Delay (ms)"
 | 
			
		||||
msgstr "Verzögerung (ms)"
 | 
			
		||||
 | 
			
		||||
msgid "Script"
 | 
			
		||||
msgstr "Skript"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parameter"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Adresse"
 | 
			
		||||
 | 
			
		||||
msgid "Port"
 | 
			
		||||
msgstr "Port"
 | 
			
		||||
 | 
			
		||||
msgid "Scan Sid"
 | 
			
		||||
msgstr "Scanne SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scanne PIDS"
 | 
			
		||||
 | 
			
		||||
msgid "Vtype"
 | 
			
		||||
msgstr "Vtype"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Cannot find unique channel settings!"
 | 
			
		||||
msgstr "Kann eindeutige Kanaleinstellungen nicht finden!"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Channels"
 | 
			
		||||
msgstr "IPTV Kanäle"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Information"
 | 
			
		||||
msgstr "IPTV Informationen"
 | 
			
		||||
 | 
			
		||||
@@ -167,3 +113,39 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Help"
 | 
			
		||||
msgstr "Hilfe"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "DATEI"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan sid"
 | 
			
		||||
msgstr "Scanne SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scanne PIDS"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protokoll"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Adresse"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parameter"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								po/fi_FI.po
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								po/fi_FI.po
									
									
									
									
									
								
							@@ -5,9 +5,9 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: iptv 0.2.5\n"
 | 
			
		||||
"Project-Id-Version: iptv 0.4.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
 | 
			
		||||
"POT-Creation-Date: 2009-03-06 22:15+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2010-03-04 18:12+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
 | 
			
		||||
"Last-Translator: Rolf Ahrenberg\n"
 | 
			
		||||
"Language-Team: <vdr@linuxtv.org>\n"
 | 
			
		||||
@@ -39,60 +39,6 @@ msgstr "TDT (0x70)"
 | 
			
		||||
msgid "Experience the IPTV"
 | 
			
		||||
msgstr "Koe IPTV:n ihmeellinen maailma"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FILE"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protokolla"
 | 
			
		||||
 | 
			
		||||
msgid "Delay (ms)"
 | 
			
		||||
msgstr "Viive (ms)"
 | 
			
		||||
 | 
			
		||||
msgid "Script"
 | 
			
		||||
msgstr "Skripti"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parametri"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Osoite"
 | 
			
		||||
 | 
			
		||||
msgid "Port"
 | 
			
		||||
msgstr "Portti"
 | 
			
		||||
 | 
			
		||||
msgid "Scan Sid"
 | 
			
		||||
msgstr "Etsi palvelu-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Etsi pidit"
 | 
			
		||||
 | 
			
		||||
msgid "Vtype"
 | 
			
		||||
msgstr "Kuvatyyppi"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Verkko-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Lähete-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Radio-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Cannot find unique channel settings!"
 | 
			
		||||
msgstr "Yksilöllisiä kanava-asetuksia ei löydetä!"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Channels"
 | 
			
		||||
msgstr "IPTV-kanavat"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Information"
 | 
			
		||||
msgstr "IPTV-tiedot"
 | 
			
		||||
 | 
			
		||||
@@ -182,3 +128,39 @@ msgstr "Määrittele käytöstä poistettava suodatin, joka lisätään mustalle
 | 
			
		||||
 | 
			
		||||
msgid "Help"
 | 
			
		||||
msgstr "Opaste"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FILE"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Verkko-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Lähete-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Radio-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan sid"
 | 
			
		||||
msgstr "Etsi palvelu-ID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Etsi pidit"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protokolla"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Osoite"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parametri"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								po/fr_FR.po
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								po/fr_FR.po
									
									
									
									
									
								
							@@ -6,9 +6,9 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: iptv 0.2.5\n"
 | 
			
		||||
"Project-Id-Version: iptv 0.4.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
 | 
			
		||||
"POT-Creation-Date: 2009-03-06 22:15+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2010-03-04 18:12+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2008-01-26 13:14+0100\n"
 | 
			
		||||
"Last-Translator: NIVAL Michaël <mnival@club-internet.fr>\n"
 | 
			
		||||
"Language-Team: French\n"
 | 
			
		||||
@@ -41,60 +41,6 @@ msgstr "TDT (0x70)"
 | 
			
		||||
msgid "Experience the IPTV"
 | 
			
		||||
msgstr "L'expérience IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FICHIER"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocole"
 | 
			
		||||
 | 
			
		||||
msgid "Delay (ms)"
 | 
			
		||||
msgstr "Délai (ms)"
 | 
			
		||||
 | 
			
		||||
msgid "Script"
 | 
			
		||||
msgstr "Script"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Paramètre"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Adresse"
 | 
			
		||||
 | 
			
		||||
msgid "Port"
 | 
			
		||||
msgstr "Port"
 | 
			
		||||
 | 
			
		||||
msgid "Scan Sid"
 | 
			
		||||
msgstr "Scanne les SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scanne les PID"
 | 
			
		||||
 | 
			
		||||
msgid "Vtype"
 | 
			
		||||
msgstr "Vtype"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Cannot find unique channel settings!"
 | 
			
		||||
msgstr "Impossible de trouver un paramètre de chaîne unique !"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Channels"
 | 
			
		||||
msgstr "Canal IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Information"
 | 
			
		||||
msgstr "Information sur IPTV"
 | 
			
		||||
 | 
			
		||||
@@ -184,3 +130,39 @@ msgstr "Définit les mauvais comportement qui doivent être désactivé."
 | 
			
		||||
 | 
			
		||||
msgid "Help"
 | 
			
		||||
msgstr "Aide"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FICHIER"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan sid"
 | 
			
		||||
msgstr "Scanne les SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scanne les PID"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocole"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Adresse"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Paramètre"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								po/it_IT.po
									
									
									
									
									
								
							@@ -5,9 +5,9 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: iptv 0.2.5\n"
 | 
			
		||||
"Project-Id-Version: iptv 0.4.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
 | 
			
		||||
"POT-Creation-Date: 2009-03-06 22:15+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2010-03-04 18:12+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2008-07-13 03:28+0100\n"
 | 
			
		||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 | 
			
		||||
"Language-Team: Italian\n"
 | 
			
		||||
@@ -40,60 +40,6 @@ msgstr "TDT (0x70)"
 | 
			
		||||
msgid "Experience the IPTV"
 | 
			
		||||
msgstr "Scopri la IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FILE"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocollo"
 | 
			
		||||
 | 
			
		||||
msgid "Delay (ms)"
 | 
			
		||||
msgstr "Ritardo (ms)"
 | 
			
		||||
 | 
			
		||||
msgid "Script"
 | 
			
		||||
msgstr "Script"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parametro"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Indirizzo"
 | 
			
		||||
 | 
			
		||||
msgid "Port"
 | 
			
		||||
msgstr "Porta"
 | 
			
		||||
 | 
			
		||||
msgid "Scan Sid"
 | 
			
		||||
msgstr "Scansione Sid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scansione Pids"
 | 
			
		||||
 | 
			
		||||
msgid "Vtype"
 | 
			
		||||
msgstr "Vtype"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Cannot find unique channel settings!"
 | 
			
		||||
msgstr "Impossibile trovare impostazioni canale unico!"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Channels"
 | 
			
		||||
msgstr "Canali IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Information"
 | 
			
		||||
msgstr "Informazione IPTV"
 | 
			
		||||
 | 
			
		||||
@@ -183,3 +129,39 @@ msgstr "Definisci un filtro corrotto che sarà messo nella lista nera."
 | 
			
		||||
 | 
			
		||||
msgid "Help"
 | 
			
		||||
msgstr "Aiuto"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "FILE"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan sid"
 | 
			
		||||
msgstr "Scansione Sid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Scansione Pids"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocollo"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Indirizzo"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Parametro"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								po/ru_RU.po
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								po/ru_RU.po
									
									
									
									
									
								
							@@ -5,9 +5,9 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: iptv 0.2.5\n"
 | 
			
		||||
"Project-Id-Version: iptv 0.4.0\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
 | 
			
		||||
"POT-Creation-Date: 2009-03-06 22:15+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2010-03-04 18:12+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2008-03-16 12:14+0100\n"
 | 
			
		||||
"Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n"
 | 
			
		||||
"Language-Team: Russian <de@li.org>\n"
 | 
			
		||||
@@ -41,60 +41,6 @@ msgstr "TDT (0x70)"
 | 
			
		||||
msgid "Experience the IPTV"
 | 
			
		||||
msgstr "Попробуй IPTV"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "ФАЙЛ"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Протокол"
 | 
			
		||||
 | 
			
		||||
msgid "Delay (ms)"
 | 
			
		||||
msgstr "Задержка (мс)"
 | 
			
		||||
 | 
			
		||||
msgid "Script"
 | 
			
		||||
msgstr "Скрипт"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Параметр"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Адрес"
 | 
			
		||||
 | 
			
		||||
msgid "Port"
 | 
			
		||||
msgstr "Порт"
 | 
			
		||||
 | 
			
		||||
msgid "Scan Sid"
 | 
			
		||||
msgstr "Сканировать SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Сканировать пиды"
 | 
			
		||||
 | 
			
		||||
msgid "Vtype"
 | 
			
		||||
msgstr "Vtype"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Cannot find unique channel settings!"
 | 
			
		||||
msgstr "Невозможно найти уникальные настройки канала!"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Channels"
 | 
			
		||||
msgstr "IPTV каналы"
 | 
			
		||||
 | 
			
		||||
msgid "IPTV Information"
 | 
			
		||||
msgstr "IPTV информация"
 | 
			
		||||
 | 
			
		||||
@@ -168,3 +114,39 @@ msgstr "Неправильно работающий фильтр, занести
 | 
			
		||||
 | 
			
		||||
msgid "Help"
 | 
			
		||||
msgstr "Справка"
 | 
			
		||||
 | 
			
		||||
msgid "UDP"
 | 
			
		||||
msgstr "UDP"
 | 
			
		||||
 | 
			
		||||
msgid "HTTP"
 | 
			
		||||
msgstr "HTTP"
 | 
			
		||||
 | 
			
		||||
msgid "FILE"
 | 
			
		||||
msgstr "ФАЙЛ"
 | 
			
		||||
 | 
			
		||||
msgid "EXT"
 | 
			
		||||
msgstr "EXT"
 | 
			
		||||
 | 
			
		||||
msgid "Nid"
 | 
			
		||||
msgstr "Nid"
 | 
			
		||||
 | 
			
		||||
msgid "Tid"
 | 
			
		||||
msgstr "Tid"
 | 
			
		||||
 | 
			
		||||
msgid "Rid"
 | 
			
		||||
msgstr "Rid"
 | 
			
		||||
 | 
			
		||||
msgid "Scan sid"
 | 
			
		||||
msgstr "Сканировать SID"
 | 
			
		||||
 | 
			
		||||
msgid "Scan pids"
 | 
			
		||||
msgstr "Сканировать пиды"
 | 
			
		||||
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Протокол"
 | 
			
		||||
 | 
			
		||||
msgid "Address"
 | 
			
		||||
msgstr "Адрес"
 | 
			
		||||
 | 
			
		||||
msgid "Parameter"
 | 
			
		||||
msgstr "Параметр"
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ void cIptvProtocolExt::ExecuteScript(void)
 | 
			
		||||
  debug("cIptvProtocolExt::ExecuteScript()\n");
 | 
			
		||||
  // Check if already executing
 | 
			
		||||
  if (pid > 0) {
 | 
			
		||||
     error("ERROR: Cannot execute script!");
 | 
			
		||||
     error("Cannot execute script!");
 | 
			
		||||
     return;
 | 
			
		||||
     }
 | 
			
		||||
  // Let's fork
 | 
			
		||||
@@ -53,8 +53,8 @@ void cIptvProtocolExt::ExecuteScript(void)
 | 
			
		||||
     // Execute the external script
 | 
			
		||||
     cString cmd = cString::sprintf("%s %d %d", *scriptFile, scriptParameter, socketPort);
 | 
			
		||||
     debug("cIptvProtocolExt::ExecuteScript(child): %s\n", *cmd);
 | 
			
		||||
     if (execl("/bin/sh", "sh", "-c", *cmd, NULL) == -1) {
 | 
			
		||||
        error("ERROR: Script execution failed: %s", *cmd);
 | 
			
		||||
     if (execl("/bin/sh", "sh", "-c", *cmd, (char *)NULL) == -1) {
 | 
			
		||||
        error("Script execution failed: %s", *cmd);
 | 
			
		||||
        _exit(-1);
 | 
			
		||||
        }
 | 
			
		||||
     _exit(0);
 | 
			
		||||
@@ -79,7 +79,7 @@ void cIptvProtocolExt::TerminateScript(void)
 | 
			
		||||
       retval = 0;
 | 
			
		||||
       waitms += timeoutms;
 | 
			
		||||
       if ((waitms % 2000) == 0) {
 | 
			
		||||
          error("ERROR: Script '%s' won't terminate - killing it!", *scriptFile);
 | 
			
		||||
          error("Script '%s' won't terminate - killing it!", *scriptFile);
 | 
			
		||||
          kill(pid, SIGKILL);
 | 
			
		||||
          }
 | 
			
		||||
       // Clear wait status to make sure child exit status is accessible
 | 
			
		||||
@@ -140,7 +140,7 @@ bool cIptvProtocolExt::Set(const char* Location, const int Parameter, const int
 | 
			
		||||
     // Update script file and parameter
 | 
			
		||||
     scriptFile = cString::sprintf("%s/%s", IptvConfig.GetConfigDirectory(), Location);
 | 
			
		||||
     if ((stat(*scriptFile, &stbuf) != 0) || (strstr(*scriptFile, "..") != 0)) {
 | 
			
		||||
        error("ERROR: Non-existent or relative path script '%s'", *scriptFile);
 | 
			
		||||
        error("Non-existent or relative path script '%s'", *scriptFile);
 | 
			
		||||
        return false;
 | 
			
		||||
        }
 | 
			
		||||
     scriptParameter = Parameter;
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ int cIptvProtocolFile::Read(unsigned char* BufferAddr, unsigned int BufferLen)
 | 
			
		||||
   // during the sleep and buffers are disposed. Check here that the plugin is
 | 
			
		||||
   // still active before accessing the buffers
 | 
			
		||||
   if (isActive)
 | 
			
		||||
      return fread(BufferAddr, sizeof(unsigned char), BufferLen, fileStream);
 | 
			
		||||
      return (int)fread(BufferAddr, sizeof(unsigned char), BufferLen, fileStream);
 | 
			
		||||
   return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,9 +53,8 @@ bool cIptvProtocolHttp::Connect(void)
 | 
			
		||||
        struct hostent *host;
 | 
			
		||||
        host = gethostbyname(streamAddr);
 | 
			
		||||
        if (!host) {
 | 
			
		||||
           error("%s is not valid address\n", streamAddr);
 | 
			
		||||
           char tmp[64];
 | 
			
		||||
           error("ERROR: %s", strerror_r(h_errno, tmp, sizeof(tmp)));
 | 
			
		||||
           error("%s is not valid address: %s", streamAddr, strerror_r(h_errno, tmp, sizeof(tmp)));
 | 
			
		||||
           return false;
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
@@ -77,9 +76,8 @@ bool cIptvProtocolHttp::Connect(void)
 | 
			
		||||
 | 
			
		||||
     // If not any errors, then socket must be ready and connected
 | 
			
		||||
     if (socketStatus != 0) {
 | 
			
		||||
        error("Cannot connect to %s\n", streamAddr);
 | 
			
		||||
        char tmp[64];
 | 
			
		||||
        error("ERROR: %s", strerror_r(socketStatus, tmp, sizeof(tmp)));
 | 
			
		||||
        error("Cannot connect to %s: %s", streamAddr, strerror_r(socketStatus, tmp, sizeof(tmp)));
 | 
			
		||||
        CloseSocket();
 | 
			
		||||
        return false;
 | 
			
		||||
        }
 | 
			
		||||
@@ -93,8 +91,8 @@ bool cIptvProtocolHttp::Connect(void)
 | 
			
		||||
                                       "\r\n", streamPath, streamAddr);
 | 
			
		||||
 | 
			
		||||
     debug("Sending http request: %s\n", *buffer);
 | 
			
		||||
     err = send(socketDesc, buffer, strlen(buffer), 0);
 | 
			
		||||
     ERROR_IF_FUNC(err < 0, "send()", CloseSocket(), return false);
 | 
			
		||||
     ssize_t err2 = send(socketDesc, buffer, strlen(buffer), 0);
 | 
			
		||||
     ERROR_IF_FUNC(err2 < 0, "send()", CloseSocket(), return false);
 | 
			
		||||
 | 
			
		||||
     // Now process headers
 | 
			
		||||
     if (!ProcessHeaders()) {
 | 
			
		||||
@@ -127,7 +125,7 @@ bool cIptvProtocolHttp::GetHeaderLine(char* dest, unsigned int destLen,
 | 
			
		||||
  debug("cIptvProtocolHttp::GetHeaderLine()\n");
 | 
			
		||||
  bool linefeed = false;
 | 
			
		||||
  bool newline = false;
 | 
			
		||||
  char buf[256];
 | 
			
		||||
  char buf[4096];
 | 
			
		||||
  char *bufptr = buf;
 | 
			
		||||
  memset(buf, '\0', sizeof(buf));
 | 
			
		||||
  recvLen = 0;
 | 
			
		||||
@@ -141,7 +139,7 @@ bool cIptvProtocolHttp::GetHeaderLine(char* dest, unsigned int destLen,
 | 
			
		||||
       return false;
 | 
			
		||||
    // Check if data available
 | 
			
		||||
    else if (retval) {
 | 
			
		||||
       int retval = recvfrom(socketDesc, bufptr, 1, MSG_DONTWAIT,
 | 
			
		||||
       ssize_t retval = recvfrom(socketDesc, bufptr, 1, MSG_DONTWAIT,
 | 
			
		||||
                             (struct sockaddr *)&sockAddr, &addrlen);
 | 
			
		||||
       if (retval <= 0)
 | 
			
		||||
          return false;
 | 
			
		||||
@@ -160,6 +158,7 @@ bool cIptvProtocolHttp::GetHeaderLine(char* dest, unsigned int destLen,
 | 
			
		||||
       // Check that buffers won't be exceeded
 | 
			
		||||
       if (recvLen >= sizeof(buf) || recvLen >= destLen) {
 | 
			
		||||
          error("Header wouldn't fit into buffer\n");
 | 
			
		||||
          recvLen = 0;
 | 
			
		||||
          return false;
 | 
			
		||||
          }
 | 
			
		||||
       }
 | 
			
		||||
@@ -178,20 +177,20 @@ bool cIptvProtocolHttp::ProcessHeaders(void)
 | 
			
		||||
  unsigned int lineLength = 0;
 | 
			
		||||
  int response = 0;
 | 
			
		||||
  bool responseFound = false;
 | 
			
		||||
  char buf[256];
 | 
			
		||||
  char buf[4096];
 | 
			
		||||
 | 
			
		||||
  while (!responseFound || lineLength != 0) {
 | 
			
		||||
    memset(buf, '\0', sizeof(buf));
 | 
			
		||||
    if (!GetHeaderLine(buf, sizeof(buf), lineLength))
 | 
			
		||||
       return false;
 | 
			
		||||
    if (!responseFound && sscanf(buf, "HTTP/1.%*i %i ",&response) != 1) {
 | 
			
		||||
    if (!responseFound && sscanf(buf, "HTTP/1.%*i %i ", &response) != 1) {
 | 
			
		||||
       error("Expected HTTP header not found\n");
 | 
			
		||||
       continue;
 | 
			
		||||
       }
 | 
			
		||||
    else
 | 
			
		||||
       responseFound = true;
 | 
			
		||||
    if (response != 200) {
 | 
			
		||||
       error("ERROR: %s\n", buf);
 | 
			
		||||
       error("%s\n", buf);
 | 
			
		||||
       return false;
 | 
			
		||||
       }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
#include "sectionfilter.h"
 | 
			
		||||
 | 
			
		||||
cIptvSectionFilter::cIptvSectionFilter(int DeviceIndex, int Index,
 | 
			
		||||
                                       u_short Pid, u_char Tid, u_char Mask)
 | 
			
		||||
                                       uint16_t Pid, uint8_t Tid, uint8_t Mask)
 | 
			
		||||
: pusi_seen(0),
 | 
			
		||||
  feedcc(0),
 | 
			
		||||
  doneq(0),
 | 
			
		||||
@@ -18,8 +18,7 @@ cIptvSectionFilter::cIptvSectionFilter(int DeviceIndex, int Index,
 | 
			
		||||
  tsfeedp(0),
 | 
			
		||||
  pid(Pid),
 | 
			
		||||
  devid(DeviceIndex),
 | 
			
		||||
  id(Index),
 | 
			
		||||
  pipeName("")
 | 
			
		||||
  id(Index)
 | 
			
		||||
{
 | 
			
		||||
  //debug("cIptvSectionFilter::cIptvSectionFilter(%d, %d)\n", devid, id);
 | 
			
		||||
  int i;
 | 
			
		||||
@@ -42,43 +41,46 @@ cIptvSectionFilter::cIptvSectionFilter(int DeviceIndex, int Index,
 | 
			
		||||
  for (i = 0; i < DMX_MAX_FILTER_SIZE; ++i) {
 | 
			
		||||
      mode = filter_mode[i];
 | 
			
		||||
      mask = filter_mask[i];
 | 
			
		||||
      maskandmode[i] = mask & mode;
 | 
			
		||||
      local_doneq |= maskandnotmode[i] = mask & ~mode;
 | 
			
		||||
      maskandmode[i] = (uint8_t)(mask & mode);
 | 
			
		||||
      maskandnotmode[i] = (uint8_t)(mask & ~mode);
 | 
			
		||||
      local_doneq |= maskandnotmode[i];
 | 
			
		||||
      }
 | 
			
		||||
  doneq = local_doneq ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
  struct stat sb;
 | 
			
		||||
  pipeName = cString::sprintf(IPTV_FILTER_FILENAME, devid, id);
 | 
			
		||||
  stat(pipeName, &sb);
 | 
			
		||||
  if (S_ISFIFO(sb.st_mode))
 | 
			
		||||
     unlink(pipeName);
 | 
			
		||||
  i = mknod(pipeName, 0644 | S_IFIFO, 0);
 | 
			
		||||
  ERROR_IF_RET(i < 0, "mknod()", return);
 | 
			
		||||
 | 
			
		||||
  // Create descriptors
 | 
			
		||||
  fifoDescriptor = open(pipeName, O_RDWR | O_NONBLOCK);
 | 
			
		||||
  readDescriptor = open(pipeName, O_RDONLY | O_NONBLOCK);
 | 
			
		||||
  // Create sockets
 | 
			
		||||
  socket[0] = socket[1] = -1;
 | 
			
		||||
  if (socketpair(AF_UNIX, SOCK_DGRAM, 0, socket) != 0) {
 | 
			
		||||
     char tmp[64];
 | 
			
		||||
     error("Opening section filter sockets failed (device=%d id=%d): %s\n", devid, id, strerror_r(errno, tmp, sizeof(tmp)));
 | 
			
		||||
     }
 | 
			
		||||
  else if ((fcntl(socket[0], F_SETFL, O_NONBLOCK) != 0) || (fcntl(socket[1], F_SETFL, O_NONBLOCK) != 0)) {
 | 
			
		||||
     char tmp[64];
 | 
			
		||||
     error("Setting section filter socket to non-blocking mode failed (device=%d id=%d): %s", devid, id, strerror_r(errno, tmp, sizeof(tmp)));
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cIptvSectionFilter::~cIptvSectionFilter()
 | 
			
		||||
{
 | 
			
		||||
  //debug("cIptvSectionFilter::~cIptvSectionfilter(%d, %d)\n", devid, id);
 | 
			
		||||
  close(fifoDescriptor);
 | 
			
		||||
  close(readDescriptor);
 | 
			
		||||
  unlink(pipeName);
 | 
			
		||||
  fifoDescriptor = -1;
 | 
			
		||||
  readDescriptor = -1;
 | 
			
		||||
  int tmp = socket[1];
 | 
			
		||||
  socket[1] = -1;
 | 
			
		||||
  if (tmp >= 0)
 | 
			
		||||
     close(tmp);
 | 
			
		||||
  tmp = socket[0];
 | 
			
		||||
  socket[0] = -1;
 | 
			
		||||
  if (tmp >= 0)
 | 
			
		||||
     close(tmp);
 | 
			
		||||
  secbuf = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cIptvSectionFilter::GetReadDesc(void)
 | 
			
		||||
{
 | 
			
		||||
  return readDescriptor;
 | 
			
		||||
  return socket[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint16_t cIptvSectionFilter::GetLength(const uint8_t *Data)
 | 
			
		||||
{
 | 
			
		||||
  return 3 + ((Data[1] & 0x0f) << 8) + Data[2];
 | 
			
		||||
  return (uint16_t)(3 + ((Data[1] & 0x0f) << 8) + Data[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvSectionFilter::New(void)
 | 
			
		||||
@@ -94,21 +96,21 @@ int cIptvSectionFilter::Filter(void)
 | 
			
		||||
 | 
			
		||||
  if (secbuf) {
 | 
			
		||||
     for (i = 0; i < DMX_MAX_FILTER_SIZE; ++i) {
 | 
			
		||||
         uint8_t local_xor = filter_value[i] ^ secbuf[i];
 | 
			
		||||
         uint8_t local_xor = (uint8_t)(filter_value[i] ^ secbuf[i]);
 | 
			
		||||
         if (maskandmode[i] & local_xor)
 | 
			
		||||
            return 0;
 | 
			
		||||
         neq |= maskandnotmode[i] & local_xor;
 | 
			
		||||
         neq |= (maskandnotmode[i] & local_xor);
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
     if (doneq && !neq)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
     // There is no data in the fifo, more can be written
 | 
			
		||||
     if (!select_single_desc(fifoDescriptor, 0, false)) {
 | 
			
		||||
        i = write(fifoDescriptor, secbuf, seclen);
 | 
			
		||||
        ERROR_IF(i < 0, "write()");
 | 
			
		||||
     // There is no data in the read socket, more can be written
 | 
			
		||||
     if ((socket[0] >= 0) && (socket[1] >= 0) /*&& !select_single_desc(socket[0], 0, false)*/) {
 | 
			
		||||
        ssize_t len = write(socket[1], secbuf, seclen);
 | 
			
		||||
        ERROR_IF(len < 0, "write()");
 | 
			
		||||
        // Update statistics
 | 
			
		||||
        AddSectionStatistic(i, 1);
 | 
			
		||||
        AddSectionStatistic(len, 1);
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return 0;
 | 
			
		||||
@@ -130,7 +132,7 @@ int cIptvSectionFilter::CopyDump(const uint8_t *buf, uint8_t len)
 | 
			
		||||
     return 0;
 | 
			
		||||
 | 
			
		||||
  if (tsfeedp + len > DMX_MAX_SECFEED_SIZE)
 | 
			
		||||
     len = DMX_MAX_SECFEED_SIZE - tsfeedp;
 | 
			
		||||
     len = (uint8_t)(DMX_MAX_SECFEED_SIZE - tsfeedp);
 | 
			
		||||
 | 
			
		||||
  if (len <= 0)
 | 
			
		||||
     return 0;
 | 
			
		||||
@@ -147,8 +149,7 @@ int cIptvSectionFilter::CopyDump(const uint8_t *buf, uint8_t len)
 | 
			
		||||
 | 
			
		||||
  for (n = 0; secbufp + 2 < limit; ++n) {
 | 
			
		||||
      seclen_local = GetLength(secbuf);
 | 
			
		||||
      if (seclen_local <= 0 || seclen_local > DMX_MAX_SECTION_SIZE ||
 | 
			
		||||
         seclen_local + secbufp > limit)
 | 
			
		||||
      if ((seclen_local <= 0) || (seclen_local > DMX_MAX_SECTION_SIZE) || ((seclen_local + secbufp) > limit))
 | 
			
		||||
         return 0;
 | 
			
		||||
      seclen = seclen_local;
 | 
			
		||||
      if (pusi_seen)
 | 
			
		||||
@@ -175,9 +176,9 @@ void cIptvSectionFilter::Process(const uint8_t* Data)
 | 
			
		||||
     return;
 | 
			
		||||
 | 
			
		||||
  // Payload start
 | 
			
		||||
  uint8_t p = TS_SIZE - count;
 | 
			
		||||
  uint8_t p = (uint8_t)(TS_SIZE - count);
 | 
			
		||||
 | 
			
		||||
  uint8_t cc = Data[3] & 0x0f;
 | 
			
		||||
  uint8_t cc = (uint8_t)(Data[3] & 0x0f);
 | 
			
		||||
  int ccok = ((feedcc + 1) & 0x0f) == cc;
 | 
			
		||||
  feedcc = cc;
 | 
			
		||||
 | 
			
		||||
@@ -201,7 +202,7 @@ void cIptvSectionFilter::Process(const uint8_t* Data)
 | 
			
		||||
        const uint8_t *before = &Data[p + 1];
 | 
			
		||||
        uint8_t before_len = Data[p];
 | 
			
		||||
        const uint8_t *after = &before[before_len];
 | 
			
		||||
        uint8_t after_len = (count - 1) - before_len;
 | 
			
		||||
        uint8_t after_len = (uint8_t)(count - 1 - before_len);
 | 
			
		||||
        CopyDump(before, before_len);
 | 
			
		||||
 | 
			
		||||
        // Before start of new section, set pusi_seen = 1
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,6 @@ private:
 | 
			
		||||
    DMX_MAX_SECFEED_SIZE = (DMX_MAX_SECTION_SIZE + TS_SIZE)
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  int fifoDescriptor;
 | 
			
		||||
  int readDescriptor;
 | 
			
		||||
 | 
			
		||||
  int pusi_seen;
 | 
			
		||||
  int feedcc;
 | 
			
		||||
  int doneq;
 | 
			
		||||
@@ -37,7 +34,7 @@ private:
 | 
			
		||||
 | 
			
		||||
  int devid;
 | 
			
		||||
  int id;
 | 
			
		||||
  cString pipeName;
 | 
			
		||||
  int socket[2];
 | 
			
		||||
 | 
			
		||||
  uint8_t filter_value[DMX_MAX_FILTER_SIZE];
 | 
			
		||||
  uint8_t filter_mask[DMX_MAX_FILTER_SIZE];
 | 
			
		||||
@@ -54,8 +51,8 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  // constructor & destructor
 | 
			
		||||
  cIptvSectionFilter(int Index, int DeviceIndex, u_short Pid,
 | 
			
		||||
                     u_char Tid, u_char Mask);
 | 
			
		||||
  cIptvSectionFilter(int Index, int DeviceIndex, uint16_t Pid,
 | 
			
		||||
                     uint8_t Tid, uint8_t Mask);
 | 
			
		||||
  virtual ~cIptvSectionFilter();
 | 
			
		||||
  void Process(const uint8_t* Data);
 | 
			
		||||
  int GetReadDesc(void);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										530
									
								
								setup.c
									
									
									
									
									
								
							
							
						
						
									
										530
									
								
								setup.c
									
									
									
									
									
								
							@@ -5,10 +5,6 @@
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <vdr/device.h>
 | 
			
		||||
#include <vdr/interface.h>
 | 
			
		||||
#include <vdr/status.h>
 | 
			
		||||
#include <vdr/menu.h>
 | 
			
		||||
 | 
			
		||||
@@ -17,521 +13,6 @@
 | 
			
		||||
#include "device.h"
 | 
			
		||||
#include "setup.h"
 | 
			
		||||
 | 
			
		||||
// --- cIptvMenuEditChannel --------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class cIptvMenuEditChannel : public cOsdMenu
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
  enum {
 | 
			
		||||
    eProtocolUDP,
 | 
			
		||||
    eProtocolHTTP,
 | 
			
		||||
    eProtocolFILE,
 | 
			
		||||
    eProtocolEXT,
 | 
			
		||||
    eProtocolCount
 | 
			
		||||
  };
 | 
			
		||||
  struct tIptvChannel {
 | 
			
		||||
    int frequency, source, protocol, parameter, vpid, ppid, vtype, tpid, sid, nid, tid, rid;
 | 
			
		||||
    int apid[MAXAPIDS + 1], dpid[MAXDPIDS + 1], spid[MAXSPIDS + 1], caids[MAXCAIDS + 1];
 | 
			
		||||
    int sidscan, pidscan;
 | 
			
		||||
    char name[256], location[256];
 | 
			
		||||
  } data;
 | 
			
		||||
  cChannel *channel;
 | 
			
		||||
  const char *protocols[eProtocolCount];
 | 
			
		||||
  void Setup(void);
 | 
			
		||||
  cString GetIptvSettings(const char *Param, int *Parameter, int *SidScan, int *PidScan, int *Protocol);
 | 
			
		||||
  void GetChannelData(cChannel *Channel);
 | 
			
		||||
  void SetChannelData(cChannel *Channel);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  cIptvMenuEditChannel(cChannel *Channel, bool New = false);
 | 
			
		||||
  virtual eOSState ProcessKey(eKeys Key);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
cIptvMenuEditChannel::cIptvMenuEditChannel(cChannel *Channel, bool New)
 | 
			
		||||
:cOsdMenu(trVDR("Edit channel"), 16)
 | 
			
		||||
{
 | 
			
		||||
  protocols[eProtocolUDP]  = tr("UDP");
 | 
			
		||||
  protocols[eProtocolHTTP] = tr("HTTP");
 | 
			
		||||
  protocols[eProtocolFILE] = tr("FILE");
 | 
			
		||||
  protocols[eProtocolEXT]  = tr("EXT");
 | 
			
		||||
  channel = Channel;
 | 
			
		||||
  GetChannelData(channel);
 | 
			
		||||
  if (New) {
 | 
			
		||||
     channel = NULL;
 | 
			
		||||
     data.nid = 0;
 | 
			
		||||
     data.tid = 0;
 | 
			
		||||
     data.rid = 0;
 | 
			
		||||
     }
 | 
			
		||||
  Setup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cString cIptvMenuEditChannel::GetIptvSettings(const char *Param, int *Parameter, int *SidScan, int *PidScan, int *Protocol)
 | 
			
		||||
{
 | 
			
		||||
  char *tag = NULL;
 | 
			
		||||
  char *proto = NULL;
 | 
			
		||||
  char *loc = NULL;
 | 
			
		||||
  if (sscanf(Param, "%a[^|]|S%dP%d|%a[^|]|%a[^|]|%d", &tag, SidScan, PidScan, &proto, &loc, Parameter) == 6) {
 | 
			
		||||
     cString tagstr(tag, true);
 | 
			
		||||
     cString protostr(proto, true);
 | 
			
		||||
     cString locstr(loc, true);
 | 
			
		||||
     // check if IPTV tag
 | 
			
		||||
     if (strncasecmp(*tagstr, "IPTV", 4) == 0) {
 | 
			
		||||
        // check if protocol is supported and update the pointer
 | 
			
		||||
        if (strncasecmp(*protostr, "UDP", 3) == 0)
 | 
			
		||||
           *Protocol = eProtocolUDP;
 | 
			
		||||
        else if (strncasecmp(*protostr, "HTTP", 4) == 0)
 | 
			
		||||
           *Protocol = eProtocolHTTP;
 | 
			
		||||
        else if (strncasecmp(*protostr, "FILE", 4) == 0)
 | 
			
		||||
           *Protocol = eProtocolFILE;
 | 
			
		||||
        else if (strncasecmp(*protostr, "EXT", 3) == 0)
 | 
			
		||||
           *Protocol = eProtocolEXT;
 | 
			
		||||
        else
 | 
			
		||||
           return NULL;
 | 
			
		||||
        // return location
 | 
			
		||||
        return locstr;
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  else if (sscanf(Param, "%a[^|]|P%dS%d|%a[^|]|%a[^|]|%d", &tag, PidScan, SidScan, &proto, &loc, Parameter) == 6) {
 | 
			
		||||
     cString tagstr(tag, true);
 | 
			
		||||
     cString protostr(proto, true);
 | 
			
		||||
     cString locstr(loc, true);
 | 
			
		||||
     // check if IPTV tag
 | 
			
		||||
     if (strncasecmp(*tagstr, "IPTV", 4) == 0) {
 | 
			
		||||
        // check if protocol is supported and update the pointer
 | 
			
		||||
        if (strncasecmp(*protostr, "UDP", 3) == 0)
 | 
			
		||||
           *Protocol = eProtocolUDP;
 | 
			
		||||
        else if (strncasecmp(*protostr, "HTTP", 4) == 0)
 | 
			
		||||
           *Protocol = eProtocolHTTP;
 | 
			
		||||
        else if (strncasecmp(*protostr, "FILE", 4) == 0)
 | 
			
		||||
           *Protocol = eProtocolFILE;
 | 
			
		||||
        else if (strncasecmp(*protostr, "EXT", 3) == 0)
 | 
			
		||||
           *Protocol = eProtocolEXT;
 | 
			
		||||
        else
 | 
			
		||||
           return NULL;
 | 
			
		||||
        // return location
 | 
			
		||||
        return locstr;
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuEditChannel::GetChannelData(cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  if (Channel) {
 | 
			
		||||
     int parameter, protocol, sidscan, pidscan;
 | 
			
		||||
     data.frequency = Channel->Frequency();
 | 
			
		||||
     data.source = Channel->Source();
 | 
			
		||||
     data.vpid = Channel->Vpid();
 | 
			
		||||
     data.ppid = Channel->Ppid();
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM >= 10704
 | 
			
		||||
     data.vtype = Channel->Vtype();
 | 
			
		||||
#endif
 | 
			
		||||
     data.tpid = Channel->Tpid();
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.apid); ++i)
 | 
			
		||||
         data.apid[i] = Channel->Apid(i);
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.dpid); ++i)
 | 
			
		||||
         data.dpid[i] = Channel->Dpid(i);
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.spid); ++i)
 | 
			
		||||
         data.spid[i] = Channel->Spid(i);
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.caids); ++i)
 | 
			
		||||
         data.caids[i] = Channel->Ca(i);
 | 
			
		||||
     data.sid = Channel->Sid();
 | 
			
		||||
     data.nid = Channel->Nid();
 | 
			
		||||
     data.tid = Channel->Tid();
 | 
			
		||||
     data.rid = Channel->Rid();
 | 
			
		||||
     strn0cpy(data.name, Channel->Name(), sizeof(data.name));
 | 
			
		||||
     strn0cpy(data.location, *GetIptvSettings(Channel->PluginParam(), ¶meter, &sidscan, &pidscan, &protocol), sizeof(data.location));
 | 
			
		||||
     data.sidscan = sidscan;
 | 
			
		||||
     data.pidscan = pidscan;
 | 
			
		||||
     data.protocol = protocol;
 | 
			
		||||
     data.parameter = parameter;
 | 
			
		||||
     }
 | 
			
		||||
  else {
 | 
			
		||||
     data.frequency = 1;
 | 
			
		||||
     data.source = cSource::FromData(cSource::stPlug);
 | 
			
		||||
     data.vpid = 0;
 | 
			
		||||
     data.ppid = 0;
 | 
			
		||||
     data.vtype = 0;
 | 
			
		||||
     data.tpid = 0;
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.apid); ++i)
 | 
			
		||||
         data.apid[i] = 0;
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.dpid); ++i)
 | 
			
		||||
         data.dpid[i] = 0;
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.spid); ++i)
 | 
			
		||||
         data.spid[i] = 0;
 | 
			
		||||
     for (unsigned int i = 0; i < ARRAY_SIZE(data.caids); ++i)
 | 
			
		||||
         data.caids[i] = 0;
 | 
			
		||||
     data.sid = 1;
 | 
			
		||||
     data.nid = 0;
 | 
			
		||||
     data.tid = 0;
 | 
			
		||||
     data.rid = 0;
 | 
			
		||||
     strn0cpy(data.name, "IPTV", sizeof(data.name));
 | 
			
		||||
     strn0cpy(data.location, "127.0.0.1", sizeof(data.location));
 | 
			
		||||
     data.sidscan = 0;
 | 
			
		||||
     data.pidscan = 0;
 | 
			
		||||
     data.protocol = eProtocolUDP;
 | 
			
		||||
     data.parameter = 1234;
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuEditChannel::SetChannelData(cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  if (Channel) {
 | 
			
		||||
     cString param;
 | 
			
		||||
     char alangs[MAXAPIDS][MAXLANGCODE2] = { "" };
 | 
			
		||||
     char dlangs[MAXDPIDS][MAXLANGCODE2] = { "" };
 | 
			
		||||
     switch (data.protocol) {
 | 
			
		||||
       case eProtocolEXT:
 | 
			
		||||
            param = cString::sprintf("IPTV|S%dP%d|EXT|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter);
 | 
			
		||||
            break;
 | 
			
		||||
       case eProtocolFILE:
 | 
			
		||||
            param = cString::sprintf("IPTV|S%dP%d|FILE|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter);
 | 
			
		||||
            break;
 | 
			
		||||
       case eProtocolHTTP:
 | 
			
		||||
            param = cString::sprintf("IPTV|S%dP%d|HTTP|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter);
 | 
			
		||||
            break;
 | 
			
		||||
       default:
 | 
			
		||||
       case eProtocolUDP:
 | 
			
		||||
            param = cString::sprintf("IPTV|S%dP%d|UDP|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter);
 | 
			
		||||
            break;
 | 
			
		||||
       }
 | 
			
		||||
     char slangs[MAXSPIDS][MAXLANGCODE2] = { "" };
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM >= 10704
 | 
			
		||||
     Channel->SetPids(data.vpid, data.ppid, data.vtype, data.apid, alangs, data.dpid, dlangs, data.spid, slangs, data.tpid);
 | 
			
		||||
#else
 | 
			
		||||
     Channel->SetPids(data.vpid, data.ppid, data.apid, alangs, data.dpid, dlangs, data.spid, slangs, data.tpid);
 | 
			
		||||
#endif
 | 
			
		||||
     Channel->SetCaIds(data.caids);
 | 
			
		||||
     Channel->SetId(data.nid, data.tid, data.sid, data.rid);
 | 
			
		||||
     Channel->SetName(data.name, "", "IPTV");
 | 
			
		||||
     Channel->SetPlugTransponderData(cSource::stPlug, data.frequency, param);
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuEditChannel::Setup(void)
 | 
			
		||||
{
 | 
			
		||||
  int current = Current();
 | 
			
		||||
  Clear();
 | 
			
		||||
  // IPTV specific settings
 | 
			
		||||
  Add(new cMenuEditStraItem(tr("Protocol"),    &data.protocol,
 | 
			
		||||
                            eProtocolCount, protocols));
 | 
			
		||||
  switch (data.protocol) {
 | 
			
		||||
    case eProtocolFILE:
 | 
			
		||||
         Add(new cMenuEditStrItem(trVDR("File"),     data.location, sizeof(data.location)));
 | 
			
		||||
         Add(new cMenuEditIntItem(tr("Delay (ms)"), &data.parameter,  0, 0xFFFF));
 | 
			
		||||
         break;
 | 
			
		||||
    case eProtocolEXT:
 | 
			
		||||
         Add(new cMenuEditStrItem(tr("Script"),     data.location, sizeof(data.location)));
 | 
			
		||||
         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)));
 | 
			
		||||
         Add(new cMenuEditIntItem(tr("Port"),   &data.parameter,  0, 0xFFFF));
 | 
			
		||||
         break;
 | 
			
		||||
    }
 | 
			
		||||
  cOsdItem *sidScanItem = new cMenuEditBoolItem(tr("Scan Sid"), &data.sidscan);
 | 
			
		||||
  if (!IptvConfig.GetSectionFiltering())
 | 
			
		||||
     sidScanItem->SetSelectable(false);
 | 
			
		||||
  Add(sidScanItem);
 | 
			
		||||
  Add(new cMenuEditBoolItem(tr("Scan pids"),   &data.pidscan));
 | 
			
		||||
  // Normal settings
 | 
			
		||||
  Add(new cMenuEditStrItem(trVDR("Name"),       data.name,     sizeof(data.name)));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Frequency"), &data.frequency));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Vpid"),      &data.vpid,     0, 0x1FFF));
 | 
			
		||||
#if defined(APIVERSNUM) && APIVERSNUM >= 10704
 | 
			
		||||
  Add(new cMenuEditIntItem(tr   ("Vtype"),     &data.vtype,    0, 0xFF));
 | 
			
		||||
#endif
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Ppid"),      &data.ppid,     0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Apid1"),     &data.apid[0],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Apid2"),     &data.apid[1],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Dpid1"),     &data.dpid[0],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Dpid2"),     &data.dpid[1],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Spid1"),     &data.spid[0],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Spid2"),     &data.spid[1],  0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Tpid"),      &data.tpid,     0, 0x1FFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("CA"),        &data.caids[0], 0, 0xFFFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(trVDR("Sid"),       &data.sid,      1, 0xFFFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(tr   ("Nid"),       &data.nid,      0, 0xFFFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(tr   ("Tid"),       &data.tid,      0, 0xFFFF));
 | 
			
		||||
  Add(new cMenuEditIntItem(tr   ("Rid"),       &data.rid,      0, 0x1FFF));
 | 
			
		||||
  SetCurrent(Get(current));
 | 
			
		||||
  Display();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuEditChannel::ProcessKey(eKeys Key)
 | 
			
		||||
{
 | 
			
		||||
  int oldProtocol = data.protocol;
 | 
			
		||||
  eOSState state = cOsdMenu::ProcessKey(Key);
 | 
			
		||||
  if (state == osUnknown) {
 | 
			
		||||
     if (Key == kOk) {
 | 
			
		||||
        cChannel newchannel;
 | 
			
		||||
        SetChannelData(&newchannel);
 | 
			
		||||
        bool uniquityFailed = false;
 | 
			
		||||
        bool firstIncrement = true;
 | 
			
		||||
        // Search for identical channels as these will be ignored by vdr
 | 
			
		||||
        for (cChannel *iteratorChannel = Channels.First(); iteratorChannel;
 | 
			
		||||
            iteratorChannel = Channels.Next(iteratorChannel)) {
 | 
			
		||||
            // This is one of the channels cause the uniquity check to fail
 | 
			
		||||
            if (!iteratorChannel->GroupSep() && iteratorChannel != channel &&
 | 
			
		||||
                iteratorChannel->GetChannelID() == newchannel.GetChannelID()) {
 | 
			
		||||
               // See if it has unique Plugin param. If yes then increment
 | 
			
		||||
               // the corresponding Rid until it is unique
 | 
			
		||||
               if (strcmp(iteratorChannel->PluginParam(),
 | 
			
		||||
                          newchannel.PluginParam())) {
 | 
			
		||||
                  // If the channel RID is already at maximum, then fail the
 | 
			
		||||
                  // channel modification
 | 
			
		||||
                  if (iteratorChannel->Rid() >= 0x1FFF) {
 | 
			
		||||
                     debug("Cannot increment RID over maximum value\n");
 | 
			
		||||
                     uniquityFailed = true;
 | 
			
		||||
                     break;
 | 
			
		||||
                     }
 | 
			
		||||
                  debug("Incrementing conflicting channel RID\n");
 | 
			
		||||
                  iteratorChannel->SetId(iteratorChannel->Nid(),
 | 
			
		||||
                                         iteratorChannel->Tid(),
 | 
			
		||||
                                         iteratorChannel->Sid(),
 | 
			
		||||
                                         firstIncrement ?
 | 
			
		||||
                                         0 : iteratorChannel->Rid() + 1);
 | 
			
		||||
 | 
			
		||||
                  // Try zero Rid:s at first increment. Prevents them from
 | 
			
		||||
                  // creeping slowly towards their maximum value
 | 
			
		||||
                  firstIncrement = false;
 | 
			
		||||
 | 
			
		||||
                  // Re-set the search and start again
 | 
			
		||||
                  iteratorChannel = Channels.First();
 | 
			
		||||
                  continue;
 | 
			
		||||
                  // Cannot work around by incrementing rid because channels
 | 
			
		||||
                  // are actually copies of each other
 | 
			
		||||
                  }
 | 
			
		||||
               else {
 | 
			
		||||
                  uniquityFailed = true;
 | 
			
		||||
                  break;
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
        if (!uniquityFailed) {
 | 
			
		||||
           if (channel) {
 | 
			
		||||
              SetChannelData(channel);
 | 
			
		||||
              isyslog("edited channel %d %s", channel->Number(), *channel->ToText());
 | 
			
		||||
              state = osBack;
 | 
			
		||||
              }
 | 
			
		||||
           else {
 | 
			
		||||
              channel = new cChannel;
 | 
			
		||||
              SetChannelData(channel);
 | 
			
		||||
              Channels.Add(channel);
 | 
			
		||||
              Channels.ReNumber();
 | 
			
		||||
              isyslog("added channel %d %s", channel->Number(), *channel->ToText());
 | 
			
		||||
              state = osUser1;
 | 
			
		||||
              }
 | 
			
		||||
           Channels.SetModified(true);
 | 
			
		||||
           }     
 | 
			
		||||
        else {
 | 
			
		||||
           Skins.Message(mtError, tr("Cannot find unique channel settings!"));
 | 
			
		||||
           state = osContinue;
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  if ((Key != kNone) && (data.protocol != oldProtocol)) {
 | 
			
		||||
     switch (data.protocol) {
 | 
			
		||||
       case eProtocolEXT:
 | 
			
		||||
            strn0cpy(data.location, "iptvstream.sh", sizeof(data.location));
 | 
			
		||||
            data.parameter = 0;
 | 
			
		||||
            break;
 | 
			
		||||
       case eProtocolFILE:
 | 
			
		||||
            strn0cpy(data.location, "/video/stream.ts", sizeof(data.location));
 | 
			
		||||
            data.parameter = 0;
 | 
			
		||||
            break;
 | 
			
		||||
       case eProtocolHTTP:
 | 
			
		||||
            strn0cpy(data.location, "127.0.0.1/TS/1", sizeof(data.location));
 | 
			
		||||
            data.parameter = 3000;
 | 
			
		||||
            break;
 | 
			
		||||
       default:
 | 
			
		||||
       case eProtocolUDP:
 | 
			
		||||
            strn0cpy(data.location, "127.0.0.1", sizeof(data.location));
 | 
			
		||||
            data.parameter = 1234;
 | 
			
		||||
            break;
 | 
			
		||||
       }
 | 
			
		||||
     Setup();
 | 
			
		||||
     }
 | 
			
		||||
  return state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cIptvMenuChannelItem --------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class cIptvMenuChannelItem : public cOsdItem
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
  cChannel *channel;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  cIptvMenuChannelItem(cChannel *Channel);
 | 
			
		||||
  virtual void Set(void);
 | 
			
		||||
  cChannel *Channel(void) { return channel; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
cIptvMenuChannelItem::cIptvMenuChannelItem(cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  channel = Channel;
 | 
			
		||||
  Set();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuChannelItem::Set(void)
 | 
			
		||||
{
 | 
			
		||||
  SetText(cString::sprintf("%d\t%s", channel->Number(), channel->Name()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cIptvMenuChannels -----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class cIptvMenuChannels : public cOsdMenu
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
  void Setup(void);
 | 
			
		||||
  cChannel *GetChannel(int Index) const;
 | 
			
		||||
  void Propagate(void);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  eOSState Edit(void);
 | 
			
		||||
  eOSState New(void);
 | 
			
		||||
  eOSState Delete(void);
 | 
			
		||||
  eOSState Switch(void);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  cIptvMenuChannels();
 | 
			
		||||
  ~cIptvMenuChannels();
 | 
			
		||||
  virtual eOSState ProcessKey(eKeys Key);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
cIptvMenuChannels::cIptvMenuChannels(void)
 | 
			
		||||
:cOsdMenu(tr("IPTV Channels"), numdigits(Channels.MaxNumber()) + 1)
 | 
			
		||||
{
 | 
			
		||||
  Setup();
 | 
			
		||||
  Channels.IncBeingEdited();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cIptvMenuChannels::~cIptvMenuChannels()
 | 
			
		||||
{
 | 
			
		||||
  Channels.DecBeingEdited();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuChannels::Setup(void)
 | 
			
		||||
{
 | 
			
		||||
  Clear();
 | 
			
		||||
  for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) {
 | 
			
		||||
      if (!channel->GroupSep() && channel->IsPlug() && !strncasecmp(channel->PluginParam(), "IPTV", 4)) {
 | 
			
		||||
         cIptvMenuChannelItem *item = new cIptvMenuChannelItem(channel);
 | 
			
		||||
         Add(item);
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
  SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), NULL);
 | 
			
		||||
  Display();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cChannel *cIptvMenuChannels::GetChannel(int Index) const
 | 
			
		||||
{
 | 
			
		||||
  cIptvMenuChannelItem *p = dynamic_cast<cIptvMenuChannelItem *>(Get(Index));
 | 
			
		||||
  return p ? (cChannel *)p->Channel() : NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvMenuChannels::Propagate(void)
 | 
			
		||||
{
 | 
			
		||||
  Channels.ReNumber();
 | 
			
		||||
  for (cIptvMenuChannelItem *ci = dynamic_cast<cIptvMenuChannelItem *>(First()); ci; ci = dynamic_cast<cIptvMenuChannelItem *>(ci->Next()))
 | 
			
		||||
      ci->Set();
 | 
			
		||||
  Display();
 | 
			
		||||
  Channels.SetModified(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuChannels::Switch(void)
 | 
			
		||||
{
 | 
			
		||||
  if (HasSubMenu() || Count() == 0)
 | 
			
		||||
     return osContinue;
 | 
			
		||||
  cChannel *ch = GetChannel(Current());
 | 
			
		||||
  if (ch)
 | 
			
		||||
     return cDevice::PrimaryDevice()->SwitchChannel(ch, true) ? osEnd : osContinue;
 | 
			
		||||
  return osEnd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuChannels::Edit(void)
 | 
			
		||||
{
 | 
			
		||||
  if (HasSubMenu() || Count() == 0)
 | 
			
		||||
     return osContinue;
 | 
			
		||||
  cChannel *ch = GetChannel(Current());
 | 
			
		||||
  if (ch)
 | 
			
		||||
     return AddSubMenu(new cIptvMenuEditChannel(ch));
 | 
			
		||||
  return osContinue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuChannels::New(void)
 | 
			
		||||
{
 | 
			
		||||
  if (HasSubMenu())
 | 
			
		||||
     return osContinue;
 | 
			
		||||
  return AddSubMenu(new cIptvMenuEditChannel(GetChannel(Current()), true));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuChannels::Delete(void)
 | 
			
		||||
{
 | 
			
		||||
  if (!HasSubMenu() && Count() > 0) {
 | 
			
		||||
     int CurrentChannelNr = cDevice::CurrentChannel();
 | 
			
		||||
     cChannel *CurrentChannel = Channels.GetByNumber(CurrentChannelNr);
 | 
			
		||||
     int Index = Current();
 | 
			
		||||
     cChannel *channel = GetChannel(Current());
 | 
			
		||||
     int DeletedChannel = channel->Number();
 | 
			
		||||
     // Check if there is a timer using this channel:
 | 
			
		||||
     if (channel->HasTimer()) {
 | 
			
		||||
        Skins.Message(mtError, trVDR("Channel is being used by a timer!"));
 | 
			
		||||
        return osContinue;
 | 
			
		||||
        }
 | 
			
		||||
     if (Interface->Confirm(trVDR("Delete channel?"))) {
 | 
			
		||||
        if (CurrentChannel && channel == CurrentChannel) {
 | 
			
		||||
           int n = Channels.GetNextNormal(CurrentChannel->Index());
 | 
			
		||||
           if (n < 0)
 | 
			
		||||
              n = Channels.GetPrevNormal(CurrentChannel->Index());
 | 
			
		||||
           CurrentChannel = Channels.Get(n);
 | 
			
		||||
           CurrentChannelNr = 0; // triggers channel switch below
 | 
			
		||||
           }
 | 
			
		||||
        Channels.Del(channel);
 | 
			
		||||
        cOsdMenu::Del(Index);
 | 
			
		||||
        Propagate();
 | 
			
		||||
        isyslog("channel %d deleted", DeletedChannel);
 | 
			
		||||
        if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) {
 | 
			
		||||
           if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())
 | 
			
		||||
              Channels.SwitchTo(CurrentChannel->Number());
 | 
			
		||||
           else
 | 
			
		||||
              cDevice::SetCurrentChannel(CurrentChannel);
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
     }
 | 
			
		||||
  return osContinue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvMenuChannels::ProcessKey(eKeys Key)
 | 
			
		||||
{
 | 
			
		||||
  eOSState state = cOsdMenu::ProcessKey(Key);
 | 
			
		||||
 | 
			
		||||
  switch (state) {
 | 
			
		||||
    case osUser1: {
 | 
			
		||||
         cChannel *channel = Channels.Last();
 | 
			
		||||
         if (channel) {
 | 
			
		||||
            Add(new cIptvMenuChannelItem(channel), true);
 | 
			
		||||
            return CloseSubMenu();
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
    default:
 | 
			
		||||
         if (state == osUnknown) {
 | 
			
		||||
            switch (Key) {
 | 
			
		||||
              case kOk:     return Switch();
 | 
			
		||||
              case kRed:    return Edit();
 | 
			
		||||
              case kGreen:  return New();
 | 
			
		||||
              case kYellow: return Delete();
 | 
			
		||||
              default: break;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
  return state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cIptvMenuInfo ---------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class cIptvMenuInfo : public cOsdMenu
 | 
			
		||||
@@ -643,7 +124,7 @@ cIptvPluginSetup::cIptvPluginSetup()
 | 
			
		||||
      disabledFilterNames[i] = tr(section_filter_table[i].description);
 | 
			
		||||
      }
 | 
			
		||||
  Setup();
 | 
			
		||||
  SetHelp(trVDR("Channels"), NULL, NULL, trVDR("Button$Info"));
 | 
			
		||||
  SetHelp(NULL, NULL, NULL, trVDR("Button$Info"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvPluginSetup::Setup(void)
 | 
			
		||||
@@ -680,14 +161,6 @@ void cIptvPluginSetup::Setup(void)
 | 
			
		||||
  Display();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvPluginSetup::EditChannel(void)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvPluginSetup::EditChannel()\n");
 | 
			
		||||
  if (HasSubMenu())
 | 
			
		||||
     return osContinue;
 | 
			
		||||
  return AddSubMenu(new cIptvMenuChannels());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
eOSState cIptvPluginSetup::ShowInfo(void)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvPluginSetup::ShowInfo()\n");
 | 
			
		||||
@@ -704,7 +177,6 @@ eOSState cIptvPluginSetup::ProcessKey(eKeys Key)
 | 
			
		||||
 | 
			
		||||
  if (state == osUnknown) {
 | 
			
		||||
     switch (Key) {
 | 
			
		||||
       case kRed:  return EditChannel();
 | 
			
		||||
       case kBlue: return ShowInfo();
 | 
			
		||||
       case kInfo: if (Current() < help.Size())
 | 
			
		||||
                      return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), help[Current()]));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								setup.h
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								setup.h
									
									
									
									
									
								
							@@ -9,8 +9,55 @@
 | 
			
		||||
#define __IPTV_SETUP_H
 | 
			
		||||
 | 
			
		||||
#include <vdr/menuitems.h>
 | 
			
		||||
#include <vdr/sourceparams.h>
 | 
			
		||||
#include "common.h"
 | 
			
		||||
 | 
			
		||||
class cIptvTransponderParameters
 | 
			
		||||
{
 | 
			
		||||
  friend class cIptvSourceParam;
 | 
			
		||||
private:
 | 
			
		||||
  int sidscan;
 | 
			
		||||
  int pidscan;
 | 
			
		||||
  int protocol;
 | 
			
		||||
  char address[MaxFileName];
 | 
			
		||||
  int parameter;
 | 
			
		||||
public:
 | 
			
		||||
  cIptvTransponderParameters(const char *Parameters = NULL);
 | 
			
		||||
  int SidScan(void) const { return sidscan; }
 | 
			
		||||
  int PidScan(void) const { return pidscan; }
 | 
			
		||||
  int Protocol(void) const { return protocol; }
 | 
			
		||||
  const char *Address(void) const { return address; }
 | 
			
		||||
  int Parameter(void) const { return parameter; }
 | 
			
		||||
  void SetSidScan(int SidScan) { sidscan = SidScan; }
 | 
			
		||||
  void SetPidScan(int PidScan) { pidscan = PidScan; }
 | 
			
		||||
  void SetProtocol(int Protocol) { protocol = Protocol; }
 | 
			
		||||
  void SetAddress(const char *Address) { strncpy(address, Address, sizeof(address)); }
 | 
			
		||||
  void SetParameter(int Parameter) { parameter = Parameter; }
 | 
			
		||||
  cString ToString(char Type) const;
 | 
			
		||||
  bool Parse(const char *s);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class cIptvSourceParam : public cSourceParam
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
  enum {
 | 
			
		||||
    eProtocolUDP,
 | 
			
		||||
    eProtocolHTTP,
 | 
			
		||||
    eProtocolFILE,
 | 
			
		||||
    eProtocolEXT,
 | 
			
		||||
    eProtocolCount
 | 
			
		||||
  };
 | 
			
		||||
  int param;
 | 
			
		||||
  cChannel data;
 | 
			
		||||
  cIptvTransponderParameters itp;
 | 
			
		||||
  const char *protocols[eProtocolCount];
 | 
			
		||||
public:
 | 
			
		||||
  cIptvSourceParam(char Source, const char *Description);
 | 
			
		||||
  virtual void SetData(cChannel *Channel);
 | 
			
		||||
  virtual void GetData(cChannel *Channel);
 | 
			
		||||
  virtual cOsdItem *GetOsdItem(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class cIptvPluginSetup : public cMenuSetupPage
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
@@ -23,7 +70,6 @@ private:
 | 
			
		||||
  const char *disabledFilterNames[SECTION_FILTER_TABLE_SIZE];
 | 
			
		||||
  cVector<const char*> help;
 | 
			
		||||
 | 
			
		||||
  eOSState EditChannel(void);
 | 
			
		||||
  eOSState ShowInfo(void);
 | 
			
		||||
  void Setup(void);
 | 
			
		||||
  void StoreFilters(const char *Name, int *Values);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ void cSidScanner::SetStatus(bool On)
 | 
			
		||||
void cSidScanner::SetChannel(const cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  if (Channel) {
 | 
			
		||||
     debug("cSidScanner::SetChannel(): %s\n", Channel->PluginParam());
 | 
			
		||||
     debug("cSidScanner::SetChannel(): %s\n", Channel->Parameters());
 | 
			
		||||
     channel = *Channel;
 | 
			
		||||
     }
 | 
			
		||||
  else {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								socket.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								socket.c
									
									
									
									
									
								
							@@ -59,7 +59,7 @@ bool cIptvSocket::OpenSocket(const int Port, const bool isUdp)
 | 
			
		||||
     // Bind socket
 | 
			
		||||
     memset(&sockAddr, '\0', sizeof(sockAddr));
 | 
			
		||||
     sockAddr.sin_family = AF_INET;
 | 
			
		||||
     sockAddr.sin_port = htons(Port);
 | 
			
		||||
     sockAddr.sin_port = htons((uint16_t)(Port & 0xFFFF));
 | 
			
		||||
     sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 | 
			
		||||
     if (isUdp) {
 | 
			
		||||
        int err = bind(socketDesc, (struct sockaddr *)&sockAddr, sizeof(sockAddr));
 | 
			
		||||
@@ -103,14 +103,14 @@ int cIptvUdpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
 | 
			
		||||
  //debug("cIptvUdpSocket::Read()\n");
 | 
			
		||||
  // Error out if socket not initialized
 | 
			
		||||
  if (socketDesc <= 0) {
 | 
			
		||||
     error("ERROR: Invalid socket in %s\n", __FUNCTION__);
 | 
			
		||||
     error("Invalid socket in %s\n", __FUNCTION__);
 | 
			
		||||
     return -1;
 | 
			
		||||
     }
 | 
			
		||||
  socklen_t addrlen = sizeof(sockAddr);
 | 
			
		||||
  int len = 0;
 | 
			
		||||
  // Read data from socket
 | 
			
		||||
  if (isActive && socketDesc && BufferAddr && (BufferLen > 0))
 | 
			
		||||
     len = recvfrom(socketDesc, BufferAddr, BufferLen, MSG_DONTWAIT,
 | 
			
		||||
     len = (int)recvfrom(socketDesc, BufferAddr, BufferLen, MSG_DONTWAIT,
 | 
			
		||||
                    (struct sockaddr *)&sockAddr, &addrlen);
 | 
			
		||||
  if ((len > 0) && (BufferAddr[0] == TS_SYNC_BYTE)) {
 | 
			
		||||
     return len;
 | 
			
		||||
@@ -126,14 +126,14 @@ int cIptvUdpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
 | 
			
		||||
     // payload type: MPEG2 TS = 33
 | 
			
		||||
     //unsigned int pt = readBuffer[1] & 0x7F;
 | 
			
		||||
     // header lenght
 | 
			
		||||
     unsigned int headerlen = (3 + cc) * sizeof(uint32_t);
 | 
			
		||||
     unsigned int headerlen = (3 + cc) * (unsigned int)sizeof(uint32_t);
 | 
			
		||||
     // check if extension
 | 
			
		||||
     if (x) {
 | 
			
		||||
        // extension header length
 | 
			
		||||
        unsigned int ehl = (((BufferAddr[headerlen + 2] & 0xFF) << 8) |
 | 
			
		||||
                            (BufferAddr[headerlen + 3] & 0xFF));
 | 
			
		||||
        // update header length
 | 
			
		||||
        headerlen += (ehl + 1) * sizeof(uint32_t);
 | 
			
		||||
        headerlen += (ehl + 1) * (unsigned int)sizeof(uint32_t);
 | 
			
		||||
        }
 | 
			
		||||
     // Check that rtp is version 2 and payload contains multiple of TS packet data
 | 
			
		||||
     if ((v == 2) && (((len - headerlen) % TS_SIZE) == 0) &&
 | 
			
		||||
@@ -168,13 +168,13 @@ int cIptvTcpSocket::Read(unsigned char* BufferAddr, unsigned int BufferLen)
 | 
			
		||||
  //debug("cIptvTcpSocket::Read()\n");
 | 
			
		||||
  // Error out if socket not initialized
 | 
			
		||||
  if (socketDesc <= 0) {
 | 
			
		||||
     error("ERROR: Invalid socket in %s\n", __FUNCTION__);
 | 
			
		||||
     error("Invalid socket in %s\n", __FUNCTION__);
 | 
			
		||||
     return -1;
 | 
			
		||||
     }
 | 
			
		||||
  socklen_t addrlen = sizeof(sockAddr);
 | 
			
		||||
  // Read data from socket
 | 
			
		||||
  if (isActive && socketDesc && BufferAddr && (BufferLen > 0))
 | 
			
		||||
     return recvfrom(socketDesc, BufferAddr, BufferLen, MSG_DONTWAIT,
 | 
			
		||||
     return (int)recvfrom(socketDesc, BufferAddr, BufferLen, MSG_DONTWAIT,
 | 
			
		||||
                     (struct sockaddr *)&sockAddr, &addrlen);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										162
									
								
								source.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								source.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
/*
 | 
			
		||||
 * source.c: IPTV plugin for the Video Disk Recorder
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "common.h"
 | 
			
		||||
#include "source.h"
 | 
			
		||||
 | 
			
		||||
// --- cIptvTransponderParameters --------------------------------------------
 | 
			
		||||
 | 
			
		||||
cIptvTransponderParameters::cIptvTransponderParameters(const char *Parameters)
 | 
			
		||||
: sidscan(0),
 | 
			
		||||
  pidscan(0),
 | 
			
		||||
  protocol(eProtocolUDP),
 | 
			
		||||
  parameter(0)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvTransponderParameters::cIptvTransponderParameters(): Parameters=%s\n", Parameters);
 | 
			
		||||
 | 
			
		||||
  memset(&address, 0, sizeof(address));
 | 
			
		||||
  Parse(Parameters);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cString cIptvTransponderParameters::ToString(char Type) const
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvTransponderParameters::ToString() Type=%c\n", Type);
 | 
			
		||||
 | 
			
		||||
  const char *protocolstr;
 | 
			
		||||
 | 
			
		||||
  switch (protocol) {
 | 
			
		||||
    case eProtocolEXT:
 | 
			
		||||
         protocolstr = "EXT";
 | 
			
		||||
         break;
 | 
			
		||||
    case eProtocolHTTP:
 | 
			
		||||
         protocolstr = "HTTP";
 | 
			
		||||
         break;
 | 
			
		||||
    case eProtocolFILE:
 | 
			
		||||
         protocolstr = "FILE";
 | 
			
		||||
         break;
 | 
			
		||||
    default:
 | 
			
		||||
    case eProtocolUDP:
 | 
			
		||||
         protocolstr = "UDP";
 | 
			
		||||
         break;
 | 
			
		||||
  }
 | 
			
		||||
  return cString::sprintf("S=%d|P=%d|F=%s|U=%s|A=%d", sidscan, pidscan, protocolstr, address, parameter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool cIptvTransponderParameters::Parse(const char *s)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvTransponderParameters::Parse(): s=%s\n", s);
 | 
			
		||||
 | 
			
		||||
  const char *delim = "|";
 | 
			
		||||
  char *str = (char *)s;
 | 
			
		||||
  char *saveptr = NULL;
 | 
			
		||||
  char *token = NULL;
 | 
			
		||||
  bool found_s = false;
 | 
			
		||||
  bool found_p = false;
 | 
			
		||||
  bool found_f = true;
 | 
			
		||||
  bool found_u = false;
 | 
			
		||||
  bool found_a = false;
 | 
			
		||||
 | 
			
		||||
  while ((token = (char *)strtok_r(str, delim, &saveptr)) != NULL) {
 | 
			
		||||
    char *data = token + 1;
 | 
			
		||||
 | 
			
		||||
    if (data && (*data == '=')) {
 | 
			
		||||
       ++data;
 | 
			
		||||
       switch (*token) {
 | 
			
		||||
         case 'S':
 | 
			
		||||
              sidscan = (int)strtol(data, (char **)NULL, 10);
 | 
			
		||||
              found_s = true;
 | 
			
		||||
              break;
 | 
			
		||||
         case 'P':
 | 
			
		||||
              pidscan = (int)strtol(data, (char **)NULL, 10);
 | 
			
		||||
              found_p = true;
 | 
			
		||||
              break;
 | 
			
		||||
         case 'F':
 | 
			
		||||
              if (strstr(data, "UDP"))
 | 
			
		||||
                  protocol = eProtocolUDP;
 | 
			
		||||
              else if (strstr(data, "HTTP"))
 | 
			
		||||
                  protocol = eProtocolHTTP;
 | 
			
		||||
              else if (strstr(data, "FILE"))
 | 
			
		||||
                  protocol = eProtocolFILE;
 | 
			
		||||
              else if (strstr(data, "EXT"))
 | 
			
		||||
                  protocol = eProtocolEXT;
 | 
			
		||||
              else
 | 
			
		||||
                 found_u = false;
 | 
			
		||||
              break;
 | 
			
		||||
         case 'U':
 | 
			
		||||
              strn0cpy(address, data, sizeof(address));
 | 
			
		||||
              found_u = true;
 | 
			
		||||
              break;
 | 
			
		||||
         case 'A':
 | 
			
		||||
              parameter = (int)strtol(data, (char **)NULL, 10);
 | 
			
		||||
              found_a = true;
 | 
			
		||||
              break;
 | 
			
		||||
         default:
 | 
			
		||||
              break;
 | 
			
		||||
         }
 | 
			
		||||
    }
 | 
			
		||||
    str = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (found_s && found_p && found_f && found_u && found_a)
 | 
			
		||||
     return (true);
 | 
			
		||||
 | 
			
		||||
  error("Invalid channel parameters: %s\n", s);
 | 
			
		||||
  return (false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- cIptvSourceParam ------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
cIptvSourceParam::cIptvSourceParam(char Source, const char *Description)
 | 
			
		||||
  : cSourceParam(Source, Description),
 | 
			
		||||
    param(0),
 | 
			
		||||
    nid(0),
 | 
			
		||||
    tid(0),
 | 
			
		||||
    rid(0)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvSourceParam::cIptvSourceParam(): Source=%c Description=%s\n", Source, Description);
 | 
			
		||||
 | 
			
		||||
  protocols[cIptvTransponderParameters::eProtocolUDP]  = tr("UDP");
 | 
			
		||||
  protocols[cIptvTransponderParameters::eProtocolHTTP] = tr("HTTP");
 | 
			
		||||
  protocols[cIptvTransponderParameters::eProtocolFILE] = tr("FILE");
 | 
			
		||||
  protocols[cIptvTransponderParameters::eProtocolEXT]  = tr("EXT");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvSourceParam::SetData(cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvSourceParam::SetData(): Channel=%s)\n", Channel->Parameters());
 | 
			
		||||
  data = *Channel;
 | 
			
		||||
  nid = data.Nid();
 | 
			
		||||
  tid = data.Tid();
 | 
			
		||||
  rid = data.Rid();
 | 
			
		||||
  itp.Parse(data.Parameters());
 | 
			
		||||
  param = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cIptvSourceParam::GetData(cChannel *Channel)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvSourceParam::GetData(): Channel=%s\n", Channel->Parameters());
 | 
			
		||||
  data.SetTransponderData(Channel->Source(), Channel->Frequency(), data.Srate(), itp.ToString(Source()), true);
 | 
			
		||||
  data.SetId(nid, tid, Channel->Sid(), rid);
 | 
			
		||||
  *Channel = data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cOsdItem *cIptvSourceParam::GetOsdItem(void)
 | 
			
		||||
{
 | 
			
		||||
  debug("cIptvSourceParam::GetOsdItem()\n");
 | 
			
		||||
  switch (param++) {
 | 
			
		||||
    case  0: return new cMenuEditIntItem( tr("Nid"),       &nid,      0);
 | 
			
		||||
    case  1: return new cMenuEditIntItem( tr("Tid"),       &tid,      0);
 | 
			
		||||
    case  2: return new cMenuEditIntItem( tr("Rid"),       &rid,      0);
 | 
			
		||||
    case  3: return new cMenuEditBoolItem(tr("Scan sid"),  &itp.sidscan);
 | 
			
		||||
    case  4: return new cMenuEditBoolItem(tr("Scan pids"), &itp.pidscan);
 | 
			
		||||
    case  5: return new cMenuEditStraItem(tr("Protocol"),  &itp.protocol,  ELEMENTS(protocols), protocols);
 | 
			
		||||
    case  6: return new cMenuEditStrItem( tr("Address"),    itp.address,   sizeof(itp.address));
 | 
			
		||||
    case  7: return new cMenuEditIntItem( tr("Parameter"), &itp.parameter, 0,                   0xFFFF);
 | 
			
		||||
    default: return NULL;
 | 
			
		||||
    }
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								source.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								source.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
/*
 | 
			
		||||
 * source.h: IPTV plugin for the Video Disk Recorder
 | 
			
		||||
 *
 | 
			
		||||
 * See the README file for copyright information and how to reach the author.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __IPTV_SOURCE_H
 | 
			
		||||
#define __IPTV_SOURCE_H
 | 
			
		||||
 | 
			
		||||
#include <vdr/menuitems.h>
 | 
			
		||||
#include <vdr/sourceparams.h>
 | 
			
		||||
#include "common.h"
 | 
			
		||||
 | 
			
		||||
class cIptvTransponderParameters
 | 
			
		||||
{
 | 
			
		||||
  friend class cIptvSourceParam;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  int sidscan;
 | 
			
		||||
  int pidscan;
 | 
			
		||||
  int protocol;
 | 
			
		||||
  char address[MaxFileName];
 | 
			
		||||
  int parameter;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  enum {
 | 
			
		||||
    eProtocolUDP,
 | 
			
		||||
    eProtocolHTTP,
 | 
			
		||||
    eProtocolFILE,
 | 
			
		||||
    eProtocolEXT,
 | 
			
		||||
    eProtocolCount
 | 
			
		||||
  };
 | 
			
		||||
  cIptvTransponderParameters(const char *Parameters = NULL);
 | 
			
		||||
  int SidScan(void) const { return sidscan; }
 | 
			
		||||
  int PidScan(void) const { return pidscan; }
 | 
			
		||||
  int Protocol(void) const { return protocol; }
 | 
			
		||||
  const char *Address(void) const { return address; }
 | 
			
		||||
  int Parameter(void) const { return parameter; }
 | 
			
		||||
  void SetSidScan(int SidScan) { sidscan = SidScan; }
 | 
			
		||||
  void SetPidScan(int PidScan) { pidscan = PidScan; }
 | 
			
		||||
  void SetProtocol(int Protocol) { protocol = Protocol; }
 | 
			
		||||
  void SetAddress(const char *Address) { strncpy(address, Address, sizeof(address)); }
 | 
			
		||||
  void SetParameter(int Parameter) { parameter = Parameter; }
 | 
			
		||||
  cString ToString(char Type) const;
 | 
			
		||||
  bool Parse(const char *s);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class cIptvSourceParam : public cSourceParam
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
  int param;
 | 
			
		||||
  int nid;
 | 
			
		||||
  int tid;
 | 
			
		||||
  int rid;
 | 
			
		||||
  cChannel data;
 | 
			
		||||
  cIptvTransponderParameters itp;
 | 
			
		||||
  const char *protocols[cIptvTransponderParameters::eProtocolCount];
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  cIptvSourceParam(char Source, const char *Description);
 | 
			
		||||
  virtual void SetData(cChannel *Channel);
 | 
			
		||||
  virtual void GetData(cChannel *Channel);
 | 
			
		||||
  virtual cOsdItem *GetOsdItem(void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // __IPTV_SOURCE_H
 | 
			
		||||
@@ -32,7 +32,7 @@ cString cIptvSectionStatistics::GetSectionStatistic()
 | 
			
		||||
  cMutexLock MutexLock(&mutex);
 | 
			
		||||
  uint64_t elapsed = timer.Elapsed(); /* in milliseconds */
 | 
			
		||||
  timer.Set();
 | 
			
		||||
  long bitrate = elapsed ? (long)(((float)1000 / KILOBYTE(1)) * filteredData / elapsed) : 0L;
 | 
			
		||||
  long bitrate = elapsed ? (long)(1000.0L * filteredData / KILOBYTE(1) / elapsed) : 0L;
 | 
			
		||||
  if (!IptvConfig.GetUseBytes())
 | 
			
		||||
     bitrate *= 8;
 | 
			
		||||
  // no trailing linefeed here!
 | 
			
		||||
@@ -75,7 +75,7 @@ cString cIptvPidStatistics::GetPidStatistic()
 | 
			
		||||
  cString info("Active pids:\n");
 | 
			
		||||
  for (unsigned int i = 0; i < IPTV_STATS_ACTIVE_PIDS_COUNT; ++i) {
 | 
			
		||||
      if (mostActivePids[i].pid) {
 | 
			
		||||
         long bitrate = elapsed ? (long)(((float)1000 / KILOBYTE(1)) * mostActivePids[i].DataAmount / elapsed) : 0L;
 | 
			
		||||
         long bitrate = elapsed ? (long)(1000.0L * mostActivePids[i].DataAmount / KILOBYTE(1) / elapsed) : 0L;
 | 
			
		||||
         if (!IptvConfig.GetUseBytes())
 | 
			
		||||
            bitrate *= 8;
 | 
			
		||||
         info = cString::sprintf("%sPid %d: %4d (%4ld k%s/s)\n", *info, i,
 | 
			
		||||
@@ -145,7 +145,7 @@ cString cIptvStreamerStatistics::GetStreamerStatistic()
 | 
			
		||||
  cMutexLock MutexLock(&mutex);
 | 
			
		||||
  uint64_t elapsed = timer.Elapsed(); /* in milliseconds */
 | 
			
		||||
  timer.Set();
 | 
			
		||||
  long bitrate = elapsed ? (long)(((float)1000 / KILOBYTE(1)) * dataBytes / elapsed) : 0L;
 | 
			
		||||
  long bitrate = elapsed ? (long)(1000.0L * dataBytes / KILOBYTE(1) / elapsed) : 0L;
 | 
			
		||||
  if (!IptvConfig.GetUseBytes())
 | 
			
		||||
     bitrate *= 8;
 | 
			
		||||
  cString info = cString::sprintf("Stream bitrate: %ld k%s/s\n", bitrate, IptvConfig.GetUseBytes() ? "B" : "bit");
 | 
			
		||||
@@ -182,7 +182,7 @@ cString cIptvBufferStatistics::GetBufferStatistic()
 | 
			
		||||
  cMutexLock MutexLock(&mutex);
 | 
			
		||||
  uint64_t elapsed = timer.Elapsed(); /* in milliseconds */
 | 
			
		||||
  timer.Set();
 | 
			
		||||
  long bitrate = elapsed ? (long)(((float)1000 / KILOBYTE(1)) * dataBytes / elapsed) : 0L;
 | 
			
		||||
  long bitrate = elapsed ? (long)(1000.0L * dataBytes / KILOBYTE(1) / elapsed) : 0L;
 | 
			
		||||
  long totalSpace = MEGABYTE(IptvConfig.GetTsBufferSize());
 | 
			
		||||
  float percentage = (float)((float)usedSpace / (float)totalSpace * 100.0);
 | 
			
		||||
  long totalKilos = totalSpace / KILOBYTE(1);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ cIptvStreamer::cIptvStreamer(cRingBufferLinear* RingBuffer, unsigned int PacketL
 | 
			
		||||
  if (packetBuffer)
 | 
			
		||||
     memset(packetBuffer, 0, packetBufferLen);
 | 
			
		||||
  else
 | 
			
		||||
     error("ERROR: MALLOC() failed for packet buffer");
 | 
			
		||||
     error("MALLOC() failed for packet buffer");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cIptvStreamer::~cIptvStreamer()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user