summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2010-01-30 11:10:25 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2010-01-30 11:10:25 +0100
commit08899602322175a6cb080951c2ad0dcbf71446fa (patch)
tree4d8d72ed157813e1a1b159ed5c57f8d875a926b1
parenta9543347afe9ea7fd031a36e97ef56ba036c1515 (diff)
downloadvdr-08899602322175a6cb080951c2ad0dcbf71446fa.tar.gz
vdr-08899602322175a6cb080951c2ad0dcbf71446fa.tar.bz2
The PCR pid is now recorded for channels where this is different from the video PID
-rw-r--r--HISTORY14
-rw-r--r--PLUGINS/src/dvbsddevice/HISTORY5
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsddevice.c4
-rw-r--r--PLUGINS/src/dvbsddevice/dvbsdffdevice.c4
-rw-r--r--device.c15
-rw-r--r--menu.c4
-rw-r--r--receiver.c75
-rw-r--r--receiver.h37
-rw-r--r--recorder.c20
-rw-r--r--recorder.h8
-rw-r--r--remux.c13
-rw-r--r--remux.h14
-rw-r--r--transfer.c12
-rw-r--r--transfer.h6
14 files changed, 156 insertions, 75 deletions
diff --git a/HISTORY b/HISTORY
index 192d1c8c..5f33e92e 100644
--- a/HISTORY
+++ b/HISTORY
@@ -6276,7 +6276,7 @@ Video Disk Recorder Revision History
- Fixed plugin arguments corruption with glibc 2.11 on x86_64 (thanks to
Anssi Hannula).
-2010-01-24: Version 1.7.12
+2010-01-30: Version 1.7.12
- Changed the EVCONTENTMASK_* macros to enums and changed "mask" to "group".
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
@@ -6296,9 +6296,13 @@ Video Disk Recorder Revision History
to Matti Lehtimäki).
- Fixed determining the frame duration on channels where the PTS deltas jitter by
+/-1 around 1800.
-- The PCR pid in generated PMTs is now set to the channel's PCR pid again, which
- in most cases is the same as the video pid. For channels that use a separate
- PCR pid, no TS packets are recorded from that PID (I have yet to see a case where
- this actually is a problem).
+- The PCR pid in generated PMTs is now set to the channel's PCR pid again.
- Fixed determining the frame duration on channels where the PTS deltas jitter by
+/-1 around 3600.
+- The PCR pid is now recorded for channels where this is different from the video
+ PID. To facilitate this, the interfaces of cTransfer, cTransferControl, cRecorder
+ and cReceiver have been modified, so that the PIDs are no longer given in separate
+ parameters, but rather the whole channel is handed down for processing. The old
+ constructor of cReceiver is still available, but it is recommended to plugin authors
+ that they switch to the new interface as soon as possible.
+ When replaying such a recording, the PCR packets are sent to PlayTsVideo()
diff --git a/PLUGINS/src/dvbsddevice/HISTORY b/PLUGINS/src/dvbsddevice/HISTORY
index 18cd6250..0d1047b9 100644
--- a/PLUGINS/src/dvbsddevice/HISTORY
+++ b/PLUGINS/src/dvbsddevice/HISTORY
@@ -10,3 +10,8 @@ VDR Plugin 'dvbsddevice' Revision History
- Calling the MakePrimaryDevice() function of the base class to allow
the cDevice to stop displaying subtitles.
- Added support for DVB cards with multiple fontends.
+
+2010-01-30: Version 0.0.3
+
+- The PCR pid is now recorded for channels where this is different from the
+ video PID.
diff --git a/PLUGINS/src/dvbsddevice/dvbsddevice.c b/PLUGINS/src/dvbsddevice/dvbsddevice.c
index e2248e9b..cc48b283 100644
--- a/PLUGINS/src/dvbsddevice/dvbsddevice.c
+++ b/PLUGINS/src/dvbsddevice/dvbsddevice.c
@@ -3,13 +3,13 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: dvbsddevice.c 1.2 2010/01/01 15:01:01 kls Exp $
+ * $Id: dvbsddevice.c 1.3 2010/01/30 10:05:42 kls Exp $
*/
#include <vdr/plugin.h>
#include "dvbsdffdevice.h"
-static const char *VERSION = "0.0.2";
+static const char *VERSION = "0.0.3";
static const char *DESCRIPTION = "SD Full Featured DVB device";
class cPluginDvbsddevice : public cPlugin {
diff --git a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
index 21a60a52..483381ff 100644
--- a/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
+++ b/PLUGINS/src/dvbsddevice/dvbsdffdevice.c
@@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: dvbsdffdevice.c 2.25 2010/01/04 12:56:56 kls Exp $
+ * $Id: dvbsdffdevice.c 2.26 2010/01/30 10:05:23 kls Exp $
*/
#include "dvbsdffdevice.h"
@@ -434,7 +434,7 @@ bool cDvbSdFfDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
}
else if (StartTransferMode)
- cControl::Launch(new cTransferControl(this, Channel->GetChannelID(), vpid, Channel->Apids(), Channel->Dpids(), Channel->Spids()));
+ cControl::Launch(new cTransferControl(this, Channel));
return true;
}
diff --git a/device.c b/device.c
index 3228af20..cb31b834 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.c 2.31 2010/01/01 15:40:35 kls Exp $
+ * $Id: device.c 2.32 2010/01/30 11:06:51 kls Exp $
*/
#include "device.h"
@@ -30,8 +30,8 @@ public:
};
cLiveSubtitle::cLiveSubtitle(int SPid)
-:cReceiver(tChannelID(), -1, SPid)
{
+ AddPid(SPid);
}
cLiveSubtitle::~cLiveSubtitle()
@@ -676,7 +676,7 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
if (Device && CanReplay()) {
cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
if (Device->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()!
- cControl::Launch(new cTransferControl(Device, Channel->GetChannelID(), Channel->Vpid(), Channel->Apids(), Channel->Dpids(), Channel->Spids()));
+ cControl::Launch(new cTransferControl(Device, Channel));
else
Result = scrNoTransfer;
}
@@ -1364,10 +1364,10 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
esyslog("ERROR: skipped %d bytes to sync on start of TS packet", Skipped);
return Played + Skipped;
}
+ int Pid = TsPid(Data);
if (TsHasPayload(Data)) { // silently ignore TS packets w/o payload
int PayloadOffset = TsPayloadOffset(Data);
if (PayloadOffset < TS_SIZE) {
- int Pid = TsPid(Data);
if (Pid == 0)
patPmtParser.ParsePat(Data, TS_SIZE);
else if (Pid == patPmtParser.PmtPid())
@@ -1396,6 +1396,13 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
}
}
}
+ else if (Pid == patPmtParser.Ppid()) {
+ int w = PlayTsVideo(Data, TS_SIZE);
+ if (w < 0)
+ return Played ? Played : w;
+ if (w == 0)
+ break;
+ }
Played += TS_SIZE;
Length -= TS_SIZE;
Data += TS_SIZE;
diff --git a/menu.c b/menu.c
index 8ccd728c..2f9d236c 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 2.12 2010/01/17 15:10:07 kls Exp $
+ * $Id: menu.c 2.13 2010/01/29 16:36:57 kls Exp $
*/
#include "menu.h"
@@ -4055,7 +4055,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
isyslog("record %s", fileName);
if (MakeDirs(fileName, true)) {
const cChannel *ch = timer->Channel();
- recorder = new cRecorder(fileName, ch->GetChannelID(), timer->Priority(), ch->Vpid(), ch->Apids(), ch->Dpids(), ch->Spids());
+ recorder = new cRecorder(fileName, ch, timer->Priority());
if (device->AttachReceiver(recorder)) {
Recording.WriteInfo();
cStatus::MsgRecording(device, Recording.Name(), Recording.FileName(), true);
diff --git a/receiver.c b/receiver.c
index 08346e4f..f922e980 100644
--- a/receiver.c
+++ b/receiver.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: receiver.c 2.1 2010/01/01 15:38:48 kls Exp $
+ * $Id: receiver.c 2.2 2010/01/30 10:25:38 kls Exp $
*/
#include "receiver.h"
@@ -12,28 +12,26 @@
#include <stdio.h>
#include "tools.h"
+#ifdef LEGACY_CRECEIVER
cReceiver::cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3)
{
device = NULL;
channelID = ChannelID;
priority = Priority;
numPids = 0;
- if (Pid)
- pids[numPids++] = Pid;
- if (Pids1) {
- while (*Pids1 && numPids < MAXRECEIVEPIDS)
- pids[numPids++] = *Pids1++;
- }
- if (Pids2) {
- while (*Pids2 && numPids < MAXRECEIVEPIDS)
- pids[numPids++] = *Pids2++;
- }
- if (Pids3) {
- while (*Pids3 && numPids < MAXRECEIVEPIDS)
- pids[numPids++] = *Pids3++;
- }
- if (numPids >= MAXRECEIVEPIDS)
- dsyslog("too many PIDs in cReceiver");
+ AddPid(Pid);
+ AddPids(Pids1);
+ AddPids(Pids2);
+ AddPids(Pids3);
+}
+#endif
+
+cReceiver::cReceiver(const cChannel *Channel, int Priority)
+{
+ device = NULL;
+ priority = Priority;
+ numPids = 0;
+ SetPids(Channel);
}
cReceiver::~cReceiver()
@@ -46,6 +44,49 @@ cReceiver::~cReceiver()
}
}
+bool cReceiver::AddPid(int Pid)
+{
+ if (Pid) {
+ if (numPids < MAXRECEIVEPIDS)
+ pids[numPids++] = Pid;
+ else {
+ dsyslog("too many PIDs in cReceiver (Pid = %d)", Pid);
+ return false;
+ }
+ }
+ return true;
+}
+
+bool cReceiver::AddPids(const int *Pids)
+{
+ if (Pids) {
+ while (*Pids) {
+ if (!AddPid(*Pids++))
+ return false;
+ }
+ }
+ return true;
+}
+
+bool cReceiver::AddPids(int Pid1, int Pid2, int Pid3, int Pid4, int Pid5, int Pid6, int Pid7, int Pid8, int Pid9)
+{
+ return AddPid(Pid1) && AddPid(Pid2) && AddPid(Pid3) && AddPid(Pid4) && AddPid(Pid5) && AddPid(Pid6) && AddPid(Pid7) && AddPid(Pid8) && AddPid(Pid9);
+}
+
+bool cReceiver::SetPids(const cChannel *Channel)
+{
+ numPids = 0;
+ if (Channel) {
+ channelID = Channel->GetChannelID();
+ return AddPid(Channel->Vpid()) &&
+ (Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) &&
+ AddPids(Channel->Apids()) &&
+ (!Setup.UseDolbyDigital || AddPids(Channel->Dpids())) &&
+ AddPids(Channel->Spids());
+ }
+return true;
+}
+
bool cReceiver::WantsPid(int Pid)
{
if (Pid) {
diff --git a/receiver.h b/receiver.h
index 6f136e4b..bd98a426 100644
--- a/receiver.h
+++ b/receiver.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: receiver.h 1.5 2007/01/07 14:40:36 kls Exp $
+ * $Id: receiver.h 2.1 2010/01/30 10:25:19 kls Exp $
*/
#ifndef __RECEIVER_H
@@ -14,6 +14,8 @@
#define MAXRECEIVEPIDS 64 // the maximum number of PIDs per receiver
+#define LEGACY_CRECEIVER // Code enclosed with this macro is deprecated and may be removed in a future version
+
class cReceiver {
friend class cDevice;
private:
@@ -38,20 +40,35 @@ protected:
///< will be delivered only ONCE, so the cReceiver must make sure that
///< it will be able to buffer the data if necessary.
public:
+#ifdef LEGACY_CRECEIVER
cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL);
- ///< Creates a new receiver for the channel with the given ChannelID with
- ///< the given Priority. Pid is a single PID (typically the video PID), while
- ///< Pids1...Pids3 are pointers to zero terminated lists of PIDs.
- ///< If any of these PIDs are 0, they will be silently ignored.
- ///< The total number of non-zero PIDs must not exceed MAXRECEIVEPIDS.
+#endif
+ cReceiver(const cChannel *Channel = NULL, int Priority = -1);
+ ///< Creates a new receiver for the given Channel with the given Priority.
+ ///< If Channel is not NULL, its pids set by a call to SetPids().
+ ///< Otherwise pids can be added to the receiver by separate calls to the AddPid[s]
+ ///< functions.
+ ///< The total number of PIDs added to a receiver must not exceed MAXRECEIVEPIDS.
///< Priority may be any value in the range -99..99. Negative values indicate
///< that this cReceiver may be detached at any time (without blocking the
///< cDevice it is attached to).
- ///< The ChannelID is necessary to allow the device that will be used for this
- ///< receiver to detect and store whether the channel can be decrypted in case
- ///< this is an encrypted channel. If the channel is not encrypted or this
- ///< detection is not wanted, an invalid tChannelID may be given.
virtual ~cReceiver();
+ bool AddPid(int Pid);
+ ///< Adds the given Pid to the list of PIDs of this receiver.
+ bool AddPids(const int *Pids);
+ ///< Adds the given izero terminated list of Pids to the list of PIDs of this
+ ///< receiver.
+ bool AddPids(int Pid1, int Pid2, int Pid3 = 0, int Pid4 = 0, int Pid5 = 0, int Pid6 = 0, int Pid7 = 0, int Pid8 = 0, int Pid9 = 0);
+ ///< Adds the given Pids to the list of PIDs of this receiver.
+ bool SetPids(const cChannel *Channel);
+ ///< Sets the PIDs of this receiver to those of the given Channel,
+ ///< replacing and previously stored PIDs. If Channel is NULL, all
+ ///< PIDs will be cleared. Parameters in the Setup may control whether
+ ///< certain types of PIDs (like Dolby Digital, for instance) are
+ ///< actually set. The Channel's ID is stored and can later be retrieved
+ ///< through ChannelID(). The ChannelID is necessary to allow the device
+ ///< that will be used for this receiver to detect and store whether the
+ ///< channel can be decrypted in case this is an encrypted channel.
tChannelID ChannelID(void) { return channelID; }
bool IsAttached(void) { return device != NULL; }
///< Returns true if this receiver is (still) attached to a device.
diff --git a/recorder.c b/recorder.c
index 7d01b075..60631e0a 100644
--- a/recorder.c
+++ b/recorder.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recorder.c 2.7 2009/12/06 11:34:41 kls Exp $
+ * $Id: recorder.c 2.8 2010/01/29 16:37:22 kls Exp $
*/
#include "recorder.h"
@@ -21,8 +21,8 @@
// --- cRecorder -------------------------------------------------------------
-cRecorder::cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids)
-:cReceiver(ChannelID, Priority, VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids)
+cRecorder::cRecorder(const char *FileName, const cChannel *Channel, int Priority)
+:cReceiver(Channel, Priority)
,cThread("recording")
,recordingInfo(FileName)
{
@@ -32,15 +32,15 @@ cRecorder::cRecorder(const char *FileName, tChannelID ChannelID, int Priority, i
ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE, true, "Recorder");
ringBuffer->SetTimeouts(0, 100);
- cChannel *Channel = Channels.GetByChannelID(ChannelID);
- int Pid = VPid;
- int Type = Channel ? Channel->Vtype() : 0;
- if (!Pid && APids) {
- Pid = APids[0];
+
+ int Pid = Channel->Vpid();
+ int Type = Channel->Vtype();
+ if (!Pid && Channel->Apid(0)) {
+ Pid = Channel->Apid(0);
Type = 0x04;
}
- if (!Pid && DPids) {
- Pid = DPids[0];
+ if (!Pid && Channel->Dpid(0)) {
+ Pid = Channel->Dpid(0);
Type = 0x06;
}
frameDetector = new cFrameDetector(Pid, Type);
diff --git a/recorder.h b/recorder.h
index 40a32224..d11d7adf 100644
--- a/recorder.h
+++ b/recorder.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recorder.h 2.1 2009/01/06 10:44:58 kls Exp $
+ * $Id: recorder.h 2.2 2010/01/29 16:32:32 kls Exp $
*/
#ifndef __RECORDER_H
@@ -34,9 +34,9 @@ protected:
virtual void Receive(uchar *Data, int Length);
virtual void Action(void);
public:
- cRecorder(const char *FileName, tChannelID ChannelID, int Priority, int VPid, const int *APids, const int *DPids, const int *SPids);
- // Creates a new recorder for the channel with the given ChannelID and
- // the given Priority that will record the given PIDs into the file FileName.
+ cRecorder(const char *FileName, const cChannel *Channel, int Priority);
+ // Creates a new recorder for the given Channel and
+ // the given Priority that will record into the file FileName.
virtual ~cRecorder();
};
diff --git a/remux.c b/remux.c
index e2d87df4..070a06ae 100644
--- a/remux.c
+++ b/remux.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.c 2.40 2010/01/24 16:13:12 kls Exp $
+ * $Id: remux.c 2.41 2010/01/30 10:43:12 kls Exp $
*/
#include "remux.h"
@@ -144,7 +144,7 @@ void TsSetTeiOnBrokenPackets(uchar *p, int l)
// --- cPatPmtGenerator ------------------------------------------------------
-cPatPmtGenerator::cPatPmtGenerator(cChannel *Channel)
+cPatPmtGenerator::cPatPmtGenerator(const cChannel *Channel)
{
numPmtPackets = 0;
patCounter = pmtCounter = 0;
@@ -243,7 +243,7 @@ int cPatPmtGenerator::MakeCRC(uchar *Target, const uchar *Data, int Length)
#define P_PMT_PID 0x0084 // pseudo PMT pid
#define MAXPID 0x2000 // the maximum possible number of pids
-void cPatPmtGenerator::GeneratePmtPid(cChannel *Channel)
+void cPatPmtGenerator::GeneratePmtPid(const cChannel *Channel)
{
bool Used[MAXPID] = { false };
#define SETPID(p) { if ((p) >= 0 && (p) < MAXPID) Used[p] = true; }
@@ -287,7 +287,7 @@ void cPatPmtGenerator::GeneratePat(void)
IncVersion(patVersion);
}
-void cPatPmtGenerator::GeneratePmt(cChannel *Channel)
+void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
{
// generate the complete PMT section:
uchar buf[MAX_SECTION_SIZE];
@@ -364,7 +364,7 @@ void cPatPmtGenerator::SetVersions(int PatVersion, int PmtVersion)
pmtVersion = PmtVersion & 0x1F;
}
-void cPatPmtGenerator::SetChannel(cChannel *Channel)
+void cPatPmtGenerator::SetChannel(const cChannel *Channel)
{
if (Channel) {
GeneratePmtPid(Channel);
@@ -402,6 +402,7 @@ void cPatPmtParser::Reset(void)
patVersion = pmtVersion = -1;
pmtPid = -1;
vpid = vtype = 0;
+ ppid = 0;
}
void cPatPmtParser::ParsePat(const uchar *Data, int Length)
@@ -486,6 +487,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
int NumDpids = 0;
int NumSpids = 0;
vpid = vtype = 0;
+ ppid = 0;
apids[0] = 0;
dpids[0] = 0;
spids[0] = 0;
@@ -500,6 +502,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
case 0x1B: // MPEG4
vpid = stream.getPid();
vtype = stream.getStreamType();
+ ppid = Pmt.getPCRPid();
break;
case 0x03: // STREAMTYPE_11172_AUDIO
case 0x04: // STREAMTYPE_13818_AUDIO
diff --git a/remux.h b/remux.h
index 492395a1..1115c4ad 100644
--- a/remux.h
+++ b/remux.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: remux.h 2.23 2009/12/31 15:35:37 kls Exp $
+ * $Id: remux.h 2.24 2010/01/29 16:51:26 kls Exp $
*/
#ifndef __REMUX_H
@@ -172,16 +172,16 @@ protected:
int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId);
int MakeLanguageDescriptor(uchar *Target, const char *Language);
int MakeCRC(uchar *Target, const uchar *Data, int Length);
- void GeneratePmtPid(cChannel *Channel);
+ void GeneratePmtPid(const cChannel *Channel);
///< Generates a PMT pid that doesn't collide with any of the actual
///< pids of the Channel.
void GeneratePat(void);
///< Generates a PAT section for later use with GetPat().
- void GeneratePmt(cChannel *Channel);
+ void GeneratePmt(const cChannel *Channel);
///< Generates a PMT section for the given Channel, for later use
///< with GetPmt().
public:
- cPatPmtGenerator(cChannel *Channel = NULL);
+ cPatPmtGenerator(const cChannel *Channel = NULL);
void SetVersions(int PatVersion, int PmtVersion);
///< Sets the version numbers for the generated PAT and PMT, in case
///< this generator is used to, e.g., continue a previously interrupted
@@ -191,7 +191,7 @@ public:
///< higher bits will automatically be cleared.
///< SetVersions() needs to be called before SetChannel() in order to
///< have an effect from the very start.
- void SetChannel(cChannel *Channel);
+ void SetChannel(const cChannel *Channel);
///< Sets the Channel for which the PAT/PMT shall be generated.
uchar *GetPat(void);
///< Returns a pointer to the PAT section, which consists of exactly
@@ -213,6 +213,7 @@ private:
int pmtVersion;
int pmtPid;
int vpid;
+ int ppid;
int vtype;
int apids[MAXAPIDS + 1]; // list is zero-terminated
int atypes[MAXAPIDS + 1]; // list is zero-terminated
@@ -252,6 +253,9 @@ public:
int Vpid(void) const { return vpid; }
///< Returns the video pid as defined by the current PMT, or 0 if no video
///< pid has been detected, yet.
+ int Ppid(void) const { return ppid; }
+ ///< Returns the PCR pid as defined by the current PMT, or 0 if no PCR
+ ///< pid has been detected, yet.
int Vtype(void) const { return vtype; }
///< Returns the video stream type as defined by the current PMT, or 0 if no video
///< stream type has been detected, yet.
diff --git a/transfer.c b/transfer.c
index 02ef042c..096fda34 100644
--- a/transfer.c
+++ b/transfer.c
@@ -4,17 +4,17 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: transfer.c 2.4 2009/12/06 14:22:23 kls Exp $
+ * $Id: transfer.c 2.5 2010/01/30 11:10:25 kls Exp $
*/
#include "transfer.h"
// --- cTransfer -------------------------------------------------------------
-cTransfer::cTransfer(tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids)
-:cReceiver(ChannelID, -1, VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids)
+cTransfer::cTransfer(const cChannel *Channel)
+:cReceiver(Channel)
{
- patPmtGenerator.SetChannel(Channels.GetByChannelID(ChannelID));
+ patPmtGenerator.SetChannel(Channel);
}
cTransfer::~cTransfer()
@@ -55,8 +55,8 @@ void cTransfer::Receive(uchar *Data, int Length)
cDevice *cTransferControl::receiverDevice = NULL;
-cTransferControl::cTransferControl(cDevice *ReceiverDevice, tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids)
-:cControl(transfer = new cTransfer(ChannelID, VPid, APids, DPids, SPids), true)
+cTransferControl::cTransferControl(cDevice *ReceiverDevice, const cChannel *Channel)
+:cControl(transfer = new cTransfer(Channel), true)
{
ReceiverDevice->AttachReceiver(transfer);
receiverDevice = ReceiverDevice;
diff --git a/transfer.h b/transfer.h
index be75fde6..004d5b06 100644
--- a/transfer.h
+++ b/transfer.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: transfer.h 2.1 2008/05/25 12:44:49 kls Exp $
+ * $Id: transfer.h 2.2 2010/01/29 16:38:09 kls Exp $
*/
#ifndef __TRANSFER_H
@@ -21,7 +21,7 @@ protected:
virtual void Activate(bool On);
virtual void Receive(uchar *Data, int Length);
public:
- cTransfer(tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids);
+ cTransfer(const cChannel *Channel);
virtual ~cTransfer();
};
@@ -30,7 +30,7 @@ private:
cTransfer *transfer;
static cDevice *receiverDevice;
public:
- cTransferControl(cDevice *ReceiverDevice, tChannelID ChannelID, int VPid, const int *APids, const int *DPids, const int *SPids);
+ cTransferControl(cDevice *ReceiverDevice, const cChannel *Channel);
~cTransferControl();
virtual void Hide(void) {}
static cDevice *ReceiverDevice(void) { return receiverDevice; }