Experimental support for NVOD channels

This commit is contained in:
Klaus Schmidinger 2004-07-18 11:02:50 +02:00
parent 39ad1fe179
commit bf9e7df743
4 changed files with 32 additions and 8 deletions

View File

@ -1057,3 +1057,6 @@ Maynard Cedric <maynard.cedric@wanadoo.fr>
Jörg Knitter <joerg.knitter@gmx.de>
for reporting a problem in case the video partition is mounted with "iocharset=utf8"
Mike parker <vdr@msatt.freeserve.co.uk>
for helping to test support for NVOD channels

View File

@ -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).

4
eit.c
View File

@ -8,7 +8,7 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
* $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());

24
sdt.c
View File

@ -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();
}