diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 560c7b15..dfbe07b9 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1057,3 +1057,6 @@ Maynard Cedric Jörg Knitter for reporting a problem in case the video partition is mounted with "iocharset=utf8" + +Mike parker + for helping to test support for NVOD channels diff --git a/HISTORY b/HISTORY index 33d5e6e3..0efa9432 100644 --- a/HISTORY +++ b/HISTORY @@ -2936,14 +2936,14 @@ Video Disk Recorder Revision History - Fixed cRingBufferLinear::Get() in case the buffer wraps around (thanks to Ludwig Nussel for reporting this one). -2004-07-17: Version 1.3.12 +2004-07-18: Version 1.3.12 - Removed all error messages from cRecordings::ScanVideoDir() and just skipping entries that cause errors in order to avoid failure in case of things like broken links etc. - The function cTimers::SetEvents() now immediately returns if there is some user input. -- Fixed handling menu status messages when the list contents is scrolled (thanks +- Fixed handling menu status messages when the list contents is scrolled (thanks to Alfred Zastrow for reporting this one). - Fixed checking the last area for misalignment in cOsd::CanHandleAreas() (thanks to Reinhard Nissl for reporting this one). @@ -2956,3 +2956,8 @@ Video Disk Recorder Revision History error (suggested by Reinhard Nissl). - Avoiding flashing effects in the OSD of full featured DVB cards by explicitly clearing the OSD windows before opening them (suggested by Marco Schlüßler). +- Experimental support for NVOD channels. Currently these channels are detected + and linked to their "base" channels using the same mechanisms as for the + "linked services" (let's see if this is useful). Thanks to Mike parker for + helping to test this. Also used some input from the 'autopid' patch by Andreas + Schultz). diff --git a/eit.c b/eit.c index 3ac53fac..dac29539 100644 --- a/eit.c +++ b/eit.c @@ -8,7 +8,7 @@ * Robert Schneider and Rolf Hakenes . * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg . * - * $Id: eit.c 1.95 2004/06/06 14:49:45 kls Exp $ + * $Id: eit.c 1.96 2004/07/18 10:52:58 kls Exp $ */ #include "eit.h" @@ -144,7 +144,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data) break; case SI::TimeShiftedEventDescriptorTag: { SI::TimeShiftedEventDescriptor *tsed = (SI::TimeShiftedEventDescriptor *)d; - cSchedule *rSchedule = (cSchedule *)Schedules->GetSchedule(tChannelID(Source, 0, 0, tsed->getReferenceServiceId())); + cSchedule *rSchedule = (cSchedule *)Schedules->GetSchedule(tChannelID(Source, channel->Nid(), channel->Tid(), tsed->getReferenceServiceId())); if (!rSchedule) break; rEvent = (cEvent *)rSchedule->GetEvent(tsed->getReferenceEventId()); diff --git a/sdt.c b/sdt.c index 247d2c9b..a4a62b4d 100644 --- a/sdt.c +++ b/sdt.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: sdt.c 1.9 2004/06/06 14:25:22 kls Exp $ + * $Id: sdt.c 1.10 2004/07/18 10:58:01 kls Exp $ */ #include "sdt.h" @@ -46,6 +46,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length if (!channel) channel = Channels.GetByChannelID(tChannelID(Source(), 0, Transponder(), SiSdtService.getServiceId())); + cLinkChannels *LinkChannels = NULL; SI::Descriptor *d; for (SI::Loop::Iterator it2; (d = SiSdtService.serviceDescriptors.getNext(it2)); ) { switch (d->getDescriptorTag()) { @@ -54,8 +55,8 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length switch (sd->getServiceType()) { case 0x01: // digital television service case 0x02: // digital radio sound service - //XXX TODO case 0x04: // NVOD reference service - //XXX TODO case 0x05: // NVOD time-shifted service + case 0x04: // NVOD reference service + case 0x05: // NVOD time-shifted service { char NameBuf[1024]; char ShortNameBuf[1024]; @@ -102,7 +103,16 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length SI::NVODReferenceDescriptor *nrd = (SI::NVODReferenceDescriptor *)d; for (SI::Loop::Iterator it; nrd->serviceLoop.hasNext(it); ) { SI::NVODReferenceDescriptor::Service Service = nrd->serviceLoop.getNext(it); - //printf(" %04X-%04X-%04X\n", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId());//XXX TODO + cChannel *link = Channels.GetByChannelID(tChannelID(Source(), Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId())); + if (!link && Setup.UpdateChannels >= 3) { + link = Channels.NewChannel(Channel(), "NVOD", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId()); + patFilter->Trigger(); + } + if (link) { + if (!LinkChannels) + LinkChannels = new cLinkChannels; + LinkChannels->Add(new cLinkChannel(link)); + } } } break; @@ -110,6 +120,12 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length } delete d; } + if (LinkChannels) { + if (channel) + channel->SetLinkChannels(LinkChannels); + else + delete LinkChannels; + } } Channels.Unlock(); }