mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.1.10
- Removed a superfluous error message from cLockFile::Unlock() (reported by Helmut Auer). - Fixed starting a recording of the current channel with only one DVB card (thanks to Stefan Huelswitt for his help). - A previous 'Transfer Mode' is now automatically re-started after a replay stops. - Only calling cStatus::MsgChannelSwitch() if a channel is actually going to be switched or has actually been switched successfully (thanks to Stefan Huelswitt). - The EPG now drops events from "other" streams that have a duration of 86400 seconds or more (this avoids bogus entries like "PROGRAMMES ALLEMANDS"). - Fixed opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT driver (thanks to Andreas Schultz). - Added a missing StripAudioPackets() to cDvbPlayer::Action() (thanks to Stefan Huelswitt). - Added an EPG bugfix for the latest VOX EPG data format.
This commit is contained in:
parent
523c4a07aa
commit
346f4cd142
@ -147,6 +147,10 @@ Stefan Huelswitt <huels@iname.com>
|
||||
for improving cCondVar::Wait() and implementing cCondVar::TimedWait()
|
||||
for reporting a bug when entering an integer value outside the limit
|
||||
for adding play mode pmAudioOnlyBlack
|
||||
for helping to fix starting a recording of the current channel with only one DVB card
|
||||
for making cStatus::MsgChannelSwitch() only be called if a channel is actually going to
|
||||
be switched or has actually been switched successfully
|
||||
for adding a missing StripAudioPackets() to cDvbPlayer::Action()
|
||||
|
||||
Ulrich Röder <roeder@efr-net.de>
|
||||
for pointing out that there are channels that have a symbol rate higher than
|
||||
@ -169,6 +173,7 @@ Andreas Schultz <aschultz@warp10.net>
|
||||
for adding cDevice::NewOsd() to allow a derived cDevice class to implement its own
|
||||
OSD capabilities
|
||||
for implementing an SPU decoder
|
||||
for fixing opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT driver
|
||||
|
||||
Aaron Holtzman
|
||||
for writing 'ac3dec'
|
||||
@ -391,3 +396,6 @@ Holger W
|
||||
|
||||
Jürgen Zimmermann <jnzimmer@informatik.uni-kl.de>
|
||||
for adding some missing #includes to files in libdtv for gcc 3.2
|
||||
|
||||
Helmut Auer <vdr@helmutauer.de>
|
||||
for reporting a superfluous error message in cLockFile.
|
||||
|
19
HISTORY
19
HISTORY
@ -1459,3 +1459,22 @@ Video Disk Recorder Revision History
|
||||
- Fixed a crash when entering an integer value outside the limits (thanks to
|
||||
Stefan Huelswitt for reporting this one).
|
||||
- Added play mode pmAudioOnlyBlack (thanks to Stefan Huelswitt).
|
||||
|
||||
2002-09-15: Version 1.1.10
|
||||
|
||||
- Removed a superfluous error message from cLockFile::Unlock() (reported by
|
||||
Helmut Auer).
|
||||
- Fixed starting a recording of the current channel with only one DVB card
|
||||
(thanks to Stefan Huelswitt for his help).
|
||||
- A previous 'Transfer Mode' is now automatically re-started after a replay
|
||||
stops.
|
||||
- Only calling cStatus::MsgChannelSwitch() if a channel is actually going to
|
||||
be switched or has actually been switched successfully (thanks to Stefan
|
||||
Huelswitt).
|
||||
- The EPG now drops events from "other" streams that have a duration of 86400
|
||||
seconds or more (this avoids bogus entries like "PROGRAMMES ALLEMANDS").
|
||||
- Fixed opening /dev/video in cDvbDevice::GrabImage() in case of NEWSTRUCT
|
||||
driver (thanks to Andreas Schultz).
|
||||
- Added a missing StripAudioPackets() to cDvbPlayer::Action() (thanks to
|
||||
Stefan Huelswitt).
|
||||
- Added an EPG bugfix for the latest VOX EPG data format.
|
||||
|
@ -7,7 +7,7 @@ BR3:11837:h:0:27500:201:202:204:0:28107
|
||||
Hessen-3:11837:h:0:27500:301:302:304:0:28108
|
||||
N3:12110:h:0:27500:2401:2402:2404:0:28224
|
||||
SR3:11837:h:0:27500:501:502:504:0:28110
|
||||
WDR:11837:h:0:27500:601:602:0:0:28111
|
||||
WDR:11837:h:0:27500:601:602:604:0:28111
|
||||
BR-alpha:11837:h:0:27500:701:702:704:0:28112
|
||||
SWR BW:11837:h:0:27500:801:802:804:0:28113
|
||||
Phoenix:11837:h:0:27500:901:902:904:0:28114
|
||||
@ -21,10 +21,10 @@ ORF Sat:11954:h:0:27500:506:507:0:0:28010
|
||||
ZDF.info:11954:h:0:27500:610:620:0:0:28011
|
||||
CNN:12168:v:0:27500:165:100:0:0:28512
|
||||
Super RTL:12188:h:0:27500:165:120:65:0:12040
|
||||
VOX:12188:h:0:27500:167:136:0:0:12060
|
||||
VOX:12188:h:0:27500:167:136:71:0:12060
|
||||
DW TV:10788:v:0:22000:305:306:0:0:8905
|
||||
Kabel 1:12480:v:0:27500:511:512:33:0:899
|
||||
Neun Live:12480:v:0:27500:767:768:0:0:897
|
||||
Neun Live:12480:v:0:27500:767:768:35:0:897
|
||||
DSF:12480:v:0:27500:1023:1024:0:0:900
|
||||
HOT:12480:v:0:27500:1279:1280:0:0:40
|
||||
Bloomberg TV Germany:12551:v:0:22000:162:99:0:0:12160
|
||||
@ -46,7 +46,7 @@ MDR:12110:h:0:27500:401:402:404:0:28204
|
||||
NICK-PARAMOUNT:12246:v:0:27500:167:108:0:0:29312
|
||||
ORB:12110:h:0:27500:501:502:504:0:28205
|
||||
B1:12110:h:0:27500:601:602:604:0:28206
|
||||
ARD Online-Kanal:12722:h:0:22000:700:701:0:0:0
|
||||
ARD Online-Kanal:12722:h:0:22000:0:701:0:0:0
|
||||
:Premiere World
|
||||
Premiere Start:11797:h:0:27500:255:256:0:101:8
|
||||
Premiere 1:11797:h:0:27500:511:512,513;515:0:101:10
|
||||
@ -78,7 +78,7 @@ Premiere Direkt 2B:11719:h:0:27500:767:768;769:0:101:181
|
||||
Premiere Direkt 3A:11719:h:0:27500:511:512;515:0:101:180
|
||||
Premiere Direkt 3B:11719:h:0:27500:1279:1280;1283:0:101:183
|
||||
Premiere Direkt 4A:12031:h:0:27500:2815:2816:0:101:18
|
||||
Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
||||
:#Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
||||
:PW Erotic
|
||||
Beate-Uhse.TV:11758:h:0:27500:1023:1024:0:101:21
|
||||
Premiere Erotik 1:12031:h:0:27500:1279:1280:0:101:513
|
||||
@ -89,11 +89,11 @@ Premiere Erotik 4:11719:h:0:27500:3583:3584:0:101:780
|
||||
Premiere Sport 1:11720:h:0:27500:255:256,257:0:101:17
|
||||
Premiere Sport 2:12031:h:0:27500:3839:3840:0:101:27
|
||||
:Formel 1
|
||||
Supersignal:12070:h:0:27500:255:256:0:101:211
|
||||
Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
||||
Boxengasse:12070:h:0:27500:767:768:0:101:213
|
||||
Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
||||
Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
||||
:#Supersignal:12070:h:0:27500:255:256:0:101:211
|
||||
:#Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
||||
:#Boxengasse:12070:h:0:27500:767:768:0:101:213
|
||||
:#Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
||||
:#Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
||||
Multikanal:11720:h:0:27500:255:256:0:101:17
|
||||
:Beta Digital
|
||||
N24:12480:v:0:27500:2047:2048:0:0:47
|
||||
@ -111,7 +111,7 @@ BuLi 7:11719:h:0:27500:3327:3328,3329:0:101:245
|
||||
BuLi 8:12031:h:0:27500:3071:3072,3073:0:101:208
|
||||
BuLi 9:12031:h:0:27500:3327:3328,3329:0:101:209
|
||||
:
|
||||
TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601
|
||||
:#TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601
|
||||
Mosaico:11934:v:0:27500:165:100:0:0:29010
|
||||
Andalucia TV:11934:v:0:27500:166:104:0:0:29011
|
||||
TVC Internacional:11934:v:0:27500:167:108:0:0:0
|
||||
|
4
config.h
4
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 1.126 2002/09/04 11:04:55 kls Exp $
|
||||
* $Id: config.h 1.127 2002/09/09 21:35:55 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -20,7 +20,7 @@
|
||||
#include "eit.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define VDRVERSION "1.1.9"
|
||||
#define VDRVERSION "1.1.10"
|
||||
|
||||
#define MAXPRIORITY 99
|
||||
#define MAXLIFETIME 99
|
||||
|
43
device.c
43
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 1.19 2002/09/08 14:03:43 kls Exp $
|
||||
* $Id: device.c 1.21 2002/09/15 11:50:19 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@ -47,6 +47,8 @@ cDevice::cDevice(void)
|
||||
|
||||
player = NULL;
|
||||
|
||||
playerDetached = false;
|
||||
|
||||
for (int i = 0; i < MAXRECEIVERS; i++)
|
||||
receiver[i] = NULL;
|
||||
ca = -1;
|
||||
@ -108,6 +110,13 @@ bool cDevice::HasDecoder(void) const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cDevice::PlayerDetached(void)
|
||||
{
|
||||
bool result = playerDetached;
|
||||
playerDetached = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
cOsdBase *cDevice::NewOsd(int x, int y)
|
||||
{
|
||||
return NULL;
|
||||
@ -317,8 +326,6 @@ bool cDevice::SwitchChannel(int Direction)
|
||||
|
||||
eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
{
|
||||
cStatus::MsgChannelSwitch(this, 0);
|
||||
|
||||
if (LiveView)
|
||||
StopReplay();
|
||||
|
||||
@ -335,6 +342,7 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
if (NeedsTransferMode) {
|
||||
cDevice *CaDevice = GetDevice(Channel, 0);
|
||||
if (CaDevice) {
|
||||
cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
|
||||
if (CaDevice->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()!
|
||||
cControl::Launch(new cTransferControl(CaDevice, Channel->vpid, Channel->apid1, 0, 0, 0));//XXX+
|
||||
else
|
||||
@ -343,15 +351,19 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
else
|
||||
Result = scrNotAvailable;
|
||||
}
|
||||
else if (!SetChannelDevice(Channel, LiveView))
|
||||
Result = scrFailed;
|
||||
|
||||
if (Result == scrOk && LiveView && IsPrimaryDevice()) {
|
||||
cSIProcessor::SetCurrentServiceID(Channel->pnr);
|
||||
currentChannel = Channel->number;
|
||||
else {
|
||||
cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
|
||||
if (!SetChannelDevice(Channel, LiveView))
|
||||
Result = scrFailed;
|
||||
}
|
||||
|
||||
cStatus::MsgChannelSwitch(this, Channel->number);
|
||||
if (Result == scrOk) {
|
||||
if (LiveView && IsPrimaryDevice()) {
|
||||
cSIProcessor::SetCurrentServiceID(Channel->pnr);
|
||||
currentChannel = Channel->number;
|
||||
}
|
||||
cStatus::MsgChannelSwitch(this, Channel->number); // only report status if channel switch successfull
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
@ -438,6 +450,7 @@ void cDevice::Detach(cPlayer *Player)
|
||||
player->device = NULL;
|
||||
player = NULL;
|
||||
SetPlayMode(pmNone);
|
||||
playerDetached = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -447,16 +460,6 @@ void cDevice::StopReplay(void)
|
||||
Detach(player);
|
||||
if (IsPrimaryDevice())
|
||||
cControl::Shutdown();
|
||||
/*XXX+
|
||||
if (IsPrimaryDevice()) {
|
||||
// let's explicitly switch the channel back in case it was in Transfer Mode:
|
||||
cChannel *Channel = Channels.GetByNumber(currentChannel);
|
||||
if (Channel) {
|
||||
Channel->Switch(this, false);
|
||||
usleep(100000); // allow driver to sync in case a new replay will start immediately
|
||||
}
|
||||
}
|
||||
XXX*/
|
||||
}
|
||||
}
|
||||
|
||||
|
7
device.h
7
device.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.h 1.16 2002/09/08 14:56:21 kls Exp $
|
||||
* $Id: device.h 1.18 2002/09/14 15:24:47 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H
|
||||
@ -177,7 +177,7 @@ private:
|
||||
bool active;
|
||||
virtual void Action(void);
|
||||
protected:
|
||||
enum ePidType { ptVideo, ptAudio, ptTeletext, ptDolby, ptOther };
|
||||
enum ePidType { ptAudio, ptVideo, ptTeletext, ptDolby, ptOther };
|
||||
class cPidHandle {
|
||||
public:
|
||||
int pid;
|
||||
@ -236,6 +236,7 @@ public:
|
||||
|
||||
private:
|
||||
cPlayer *player;
|
||||
bool playerDetached;
|
||||
protected:
|
||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||
// Sets the device into the given play mode.
|
||||
@ -276,6 +277,8 @@ public:
|
||||
// Attaches the given player to this device.
|
||||
void Detach(cPlayer *Player);
|
||||
// Detaches the given player from this device.
|
||||
bool PlayerDetached(void);
|
||||
// Returns true if a player has been detached and resets the 'playerDetached' flag.
|
||||
|
||||
// Receiver facilities
|
||||
|
||||
|
125
dvbdevice.c
125
dvbdevice.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbdevice.c 1.13 2002/09/08 15:00:46 kls Exp $
|
||||
* $Id: dvbdevice.c 1.19 2002/09/15 13:12:25 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbdevice.h"
|
||||
@ -200,7 +200,11 @@ cSpuDecoder *cDvbDevice::GetSpuDecoder(void)
|
||||
|
||||
bool cDvbDevice::GrabImage(const char *FileName, bool Jpeg, int Quality, int SizeX, int SizeY)
|
||||
{
|
||||
int videoDev = DvbOpen(DEV_VIDEO, CardIndex(), O_RDWR, true);
|
||||
char buffer[PATH_MAX];
|
||||
snprintf(buffer, sizeof(buffer), "%s%d", DEV_VIDEO, CardIndex());
|
||||
int videoDev = open(buffer, O_RDWR);
|
||||
if (videoDev < 0)
|
||||
LOG_ERROR_STR(buffer);
|
||||
if (videoDev >= 0) {
|
||||
int result = 0;
|
||||
struct video_mbuf mbuf;
|
||||
@ -297,51 +301,44 @@ void cDvbDevice::SetVideoFormat(bool VideoFormat16_9)
|
||||
CHECK(ioctl(fd_video, VIDEO_SET_FORMAT, VideoFormat16_9 ? VIDEO_FORMAT_16_9 : VIDEO_FORMAT_4_3));
|
||||
}
|
||||
|
||||
// ptVideo ptAudio ptTeletext ptDolby ptOther
|
||||
dmxPesType_t PesTypes[] = { DMX_PES_VIDEO, DMX_PES_AUDIO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
||||
// ptAudio ptVideo ptTeletext ptDolby ptOther
|
||||
dmxPesType_t PesTypes[] = { DMX_PES_AUDIO, DMX_PES_VIDEO, DMX_PES_TELETEXT, DMX_PES_OTHER, DMX_PES_OTHER };
|
||||
|
||||
bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
|
||||
{
|
||||
if (Handle->pid) {
|
||||
dmxPesFilterParams pesFilterParams;
|
||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
||||
if (On) {
|
||||
if (Handle->handle < 0) {
|
||||
Handle->handle = DvbOpen(DEV_DVB_DEMUX, CardIndex(), O_RDWR | O_NONBLOCK, true);
|
||||
if (Handle->handle < 0)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
CHECK(ioctl(Handle->handle, DMX_STOP));
|
||||
if (Handle->used == 0) {
|
||||
dmxPesFilterParams pesFilterParams;
|
||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
||||
pesFilterParams.pid = 0x1FFF;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_DECODER;
|
||||
pesFilterParams.pesType = PesTypes[Type < ptOther ? Type : ptOther];
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
|
||||
close(Handle->handle);
|
||||
Handle->handle = -1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (Handle->pid != 0x1FFF) {
|
||||
dmxPesFilterParams pesFilterParams;
|
||||
memset(&pesFilterParams, 0, sizeof(pesFilterParams));
|
||||
pesFilterParams.pid = Handle->pid;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = (Type <= ptTeletext && Handle->used <= 1) ? DMX_OUT_DECODER : DMX_OUT_TS_TAP;
|
||||
pesFilterParams.pesType = PesTypes[Type < ptOther ? Type : ptOther];
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
//XXX+ pesFilterParams.flags = DMX_CHECK_CRC;//XXX
|
||||
if (ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
|
||||
LOG_ERROR;
|
||||
return false;
|
||||
}
|
||||
//XXX+ CHECK(ioctl(Handle->handle, DMX_SET_BUFFER_SIZE, KILOBYTE(32)));//XXX
|
||||
//XXX+ CHECK(ioctl(Handle->handle, DMX_START));//XXX
|
||||
}
|
||||
else if (!Handle->used) {
|
||||
CHECK(ioctl(Handle->handle, DMX_STOP));
|
||||
if (Type <= ptTeletext) {
|
||||
pesFilterParams.pid = 0x1FFF;
|
||||
pesFilterParams.input = DMX_IN_FRONTEND;
|
||||
pesFilterParams.output = DMX_OUT_DECODER;
|
||||
pesFilterParams.pesType = PesTypes[Type];
|
||||
pesFilterParams.flags = DMX_IMMEDIATE_START;
|
||||
CHECK(ioctl(Handle->handle, DMX_SET_PES_FILTER, &pesFilterParams));
|
||||
close(Handle->handle);
|
||||
Handle->handle = -1;
|
||||
if (PesTypes[Type] == DMX_PES_VIDEO) // let's only do this once
|
||||
SetPlayMode(pmNone); // necessary to switch a PID from DMX_PES_VIDEO/AUDIO to DMX_PES_OTHER
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@ -362,8 +359,8 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
|
||||
needsDetachReceivers = true;
|
||||
result = hasPriority;
|
||||
}
|
||||
else if (!HasDecoder())
|
||||
result = true; // if it has no decoder it can't be the primary device
|
||||
else if (!IsPrimaryDevice())
|
||||
result = true;
|
||||
else {
|
||||
#define DVB_DRIVER_VERSION 2002090101 //XXX+
|
||||
#define MIN_DVB_DRIVER_VERSION_FOR_TIMESHIFT 2002090101
|
||||
@ -397,30 +394,52 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
LiveView = true;
|
||||
#endif
|
||||
|
||||
// Avoid noise while switching:
|
||||
bool DoTune = frequency != Channel->frequency; // TODO will be changed when DiSEqC handling is revised
|
||||
|
||||
if (HasDecoder()) {
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
||||
}
|
||||
bool TurnOffLivePIDs = HasDecoder()
|
||||
&& (DoTune
|
||||
|| Channel->ca > CACONFBASE && pidHandles[ptVideo].pid != Channel->vpid // CA channels can only be decrypted in "live" mode
|
||||
|| IsPrimaryDevice()
|
||||
&& (LiveView // for a new live view the old PIDs need to be turned off
|
||||
|| pidHandles[ptVideo].pid == Channel->vpid // for recording the PIDs must be shifted from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
||||
)
|
||||
);
|
||||
|
||||
bool StartTransferMode = IsPrimaryDevice() && !DoTune
|
||||
&& (LiveView && HasPid(Channel->vpid) && pidHandles[ptVideo].pid != Channel->vpid // the PID is already set as DMX_PES_OTHER
|
||||
|| !LiveView && pidHandles[ptVideo].pid == Channel->vpid // a recording is going to shift the PIDs from DMX_PES_AUDIO/VIDEO to DMX_PES_OTHER
|
||||
);
|
||||
|
||||
bool TurnOnLivePIDs = HasDecoder() && !StartTransferMode
|
||||
&& (Channel->ca > CACONFBASE // CA channels can only be decrypted in "live" mode
|
||||
|| LiveView
|
||||
);
|
||||
|
||||
// Stop setting system time:
|
||||
|
||||
if (siProcessor)
|
||||
siProcessor->SetCurrentTransponder(0);
|
||||
|
||||
// Turn off current PIDs:
|
||||
// Turn off live PIDs if necessary:
|
||||
|
||||
if (TurnOffLivePIDs) {
|
||||
|
||||
// Avoid noise while switching:
|
||||
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, true));
|
||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
|
||||
CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
|
||||
CHECK(ioctl(fd_video, VIDEO_CLEAR_BUFFER));
|
||||
|
||||
// Turn off live PIDs:
|
||||
|
||||
if (HasDecoder() && (LiveView || pidHandles[ptVideo].pid == Channel->vpid)) {
|
||||
DelPid(pidHandles[ptVideo].pid);
|
||||
DelPid(pidHandles[ptAudio].pid);
|
||||
DelPid(pidHandles[ptVideo].pid);
|
||||
DelPid(pidHandles[ptTeletext].pid);
|
||||
DelPid(pidHandles[ptDolby].pid);
|
||||
}
|
||||
|
||||
if (frequency != Channel->frequency || Channel->ca > CACONFBASE) { // CA channels can only be decrypted in "live" mode
|
||||
if (DoTune) {
|
||||
|
||||
#ifdef NEWSTRUCT
|
||||
dvb_frontend_parameters Frontend;
|
||||
@ -602,21 +621,19 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
|
||||
|
||||
// PID settings:
|
||||
|
||||
if (HasDecoder() && (LiveView || Channel->ca > CACONFBASE)) { // CA channels can only be decrypted in "live" mode
|
||||
if (!HasPid(Channel->vpid)) {
|
||||
if (!(AddPid(Channel->vpid, ptVideo) && AddPid(Channel->apid1, ptAudio))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
|
||||
esyslog("ERROR: failed to set PIDs for channel %d", Channel->number);
|
||||
return false;
|
||||
}
|
||||
if (IsPrimaryDevice())
|
||||
AddPid(Channel->tpid, ptTeletext);
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
|
||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
|
||||
if (TurnOnLivePIDs) {
|
||||
if (!(AddPid(Channel->apid1, ptAudio) && AddPid(Channel->vpid, ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached)
|
||||
esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->number, CardIndex() + 1);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
cControl::Launch(new cTransferControl(this, Channel->vpid, Channel->apid1, 0, 0, 0));
|
||||
if (IsPrimaryDevice())
|
||||
AddPid(Channel->tpid, ptTeletext);
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
|
||||
CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
|
||||
CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
|
||||
}
|
||||
else if (StartTransferMode)
|
||||
cControl::Launch(new cTransferControl(this, Channel->vpid, Channel->apid1, 0, 0, 0));
|
||||
|
||||
// Start setting system time:
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbplayer.c 1.12 2002/08/24 14:59:35 kls Exp $
|
||||
* $Id: dvbplayer.c 1.13 2002/09/15 13:33:31 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbplayer.h"
|
||||
@ -353,6 +353,7 @@ void cDvbPlayer::Action(void)
|
||||
continue;
|
||||
}
|
||||
r = ReadFrame(replayFile, b, Length, sizeof(b));
|
||||
StripAudioPackets(b, r, 0xC0); //XXX+ audioTrack
|
||||
}
|
||||
else // allows replay even if the index file is missing
|
||||
r = read(replayFile, b, sizeof(b));
|
||||
|
43
eit.c
43
eit.c
@ -16,7 +16,7 @@
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* $Id: eit.c 1.49 2002/08/25 10:43:36 kls Exp $
|
||||
* $Id: eit.c 1.51 2002/09/15 14:35:32 kls Exp $
|
||||
***************************************************************************/
|
||||
|
||||
#include "eit.h"
|
||||
@ -405,7 +405,7 @@ bool cEventInfo::Read(FILE *f, cSchedule *Schedule)
|
||||
return false;
|
||||
}
|
||||
|
||||
#define MAXEPGBUGFIXSTATS 5
|
||||
#define MAXEPGBUGFIXSTATS 6
|
||||
#define MAXEPGBUGFIXCHANS 50
|
||||
struct tEpgBugFixStats {
|
||||
int hits;
|
||||
@ -485,6 +485,32 @@ void cEventInfo::FixEpgBugs(void)
|
||||
// EPG data. Let's fix their bugs as good as we can:
|
||||
if (pTitle) {
|
||||
|
||||
// VOX puts too much information into the Subtitle and leaves the Extended
|
||||
// Description empty:
|
||||
//
|
||||
// Title
|
||||
// (NAT, Year Min')[ ["Subtitle". ]Extended Description]
|
||||
//
|
||||
if (pSubtitle && !pExtendedDescription) {
|
||||
if (*pSubtitle == '(') {
|
||||
char *e = strchr(pSubtitle + 1, ')');
|
||||
if (e) {
|
||||
if (*(e + 1)) {
|
||||
if (*++e == ' ')
|
||||
if (*(e + 1) == '"')
|
||||
e++;
|
||||
}
|
||||
else
|
||||
e = NULL;
|
||||
char *s = e ? strdup(e) : NULL;
|
||||
free(pSubtitle);
|
||||
pSubtitle = s;
|
||||
EpgBugFixStat(0, GetServiceID());
|
||||
// now the fixes #1 and #2 below will handle the rest
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// VOX and VIVA put the Subtitle in quotes and use either the Subtitle
|
||||
// or the Extended Description field, depending on how long the string is:
|
||||
//
|
||||
@ -504,7 +530,7 @@ void cEventInfo::FixEpgBugs(void)
|
||||
free(pExtendedDescription);
|
||||
pSubtitle = s;
|
||||
pExtendedDescription = d;
|
||||
EpgBugFixStat(0, GetServiceID());
|
||||
EpgBugFixStat(1, GetServiceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -521,7 +547,7 @@ void cEventInfo::FixEpgBugs(void)
|
||||
memmove(pSubtitle, pSubtitle + 1, strlen(pSubtitle));
|
||||
pExtendedDescription = pSubtitle;
|
||||
pSubtitle = NULL;
|
||||
EpgBugFixStat(1, GetServiceID());
|
||||
EpgBugFixStat(2, GetServiceID());
|
||||
}
|
||||
}
|
||||
|
||||
@ -533,7 +559,7 @@ void cEventInfo::FixEpgBugs(void)
|
||||
if (pSubtitle && strcmp(pTitle, pSubtitle) == 0) {
|
||||
free(pSubtitle);
|
||||
pSubtitle = NULL;
|
||||
EpgBugFixStat(2, GetServiceID());
|
||||
EpgBugFixStat(3, GetServiceID());
|
||||
}
|
||||
|
||||
// ZDF.info puts the Subtitle between double quotes, which is nothing
|
||||
@ -549,7 +575,7 @@ void cEventInfo::FixEpgBugs(void)
|
||||
char *p = strrchr(pSubtitle, '"');
|
||||
if (p)
|
||||
*p = 0;
|
||||
EpgBugFixStat(3, GetServiceID());
|
||||
EpgBugFixStat(4, GetServiceID());
|
||||
}
|
||||
}
|
||||
|
||||
@ -570,7 +596,7 @@ void cEventInfo::FixEpgBugs(void)
|
||||
if (*p == '-' && *(p + 1) == ' ' && *(p + 2) && islower(*(p - 1)) && islower(*(p + 2))) {
|
||||
if (!startswith(p + 2, "und ")) { // special case in German, as in "Lach- und Sachgeschichten"
|
||||
memmove(p, p + 2, strlen(p + 2) + 1);
|
||||
EpgBugFixStat(4, GetServiceID());
|
||||
EpgBugFixStat(5, GetServiceID());
|
||||
}
|
||||
}
|
||||
p++;
|
||||
@ -895,6 +921,9 @@ int cEIT::ProcessEIT(unsigned char *buffer)
|
||||
|
||||
if (VdrProgramInfos) {
|
||||
for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) {
|
||||
// Drop events that belong to an "other TS" and are very long (some stations broadcast bogus data for "other" channels):
|
||||
if (VdrProgramInfo->Duration >= 86400 && (tid == 0x4F || tid == 0x60 || tid == 0x61))
|
||||
continue;
|
||||
pSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ServiceID);
|
||||
if (!pSchedule) {
|
||||
schedules->Add(new cSchedule(VdrProgramInfo->ServiceID));
|
||||
|
4
tools.c
4
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 1.70 2002/08/16 13:43:40 kls Exp $
|
||||
* $Id: tools.c 1.71 2002/09/09 21:35:49 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -739,8 +739,6 @@ void cLockFile::Unlock(void)
|
||||
remove(fileName);
|
||||
f = -1;
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: attempt to unlock %s without holding a lock!", fileName);
|
||||
}
|
||||
|
||||
// --- cListObject -----------------------------------------------------------
|
||||
|
5
vdr.c
5
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* The project's page is at http://www.cadsoft.de/people/kls/vdr
|
||||
*
|
||||
* $Id: vdr.c 1.122 2002/09/08 11:19:01 kls Exp $
|
||||
* $Id: vdr.c 1.123 2002/09/15 11:08:35 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -400,6 +400,9 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
// Attach launched player control:
|
||||
cControl::Attach();
|
||||
// Make sure Transfer-Mode is re-started after detaching a player:
|
||||
if (cDevice::PrimaryDevice()->PlayerDetached() && !cDevice::PrimaryDevice()->Replaying())
|
||||
Channels.SwitchTo(cDevice::CurrentChannel());
|
||||
// Restart the Watchdog timer:
|
||||
if (WatchdogTimeout > 0) {
|
||||
int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout);
|
||||
|
Loading…
x
Reference in New Issue
Block a user