From 9384e56566f56e77d577319a42929e708936e7c7 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 14 Mar 2004 18:00:00 +0100 Subject: =?UTF-8?q?Version=201.3.6=20-=20Completed=20the=20Finnish=20OSD?= =?UTF-8?q?=20texts=20(thanks=20to=20Rolf=20Ahrenberg).=20-=20Fixed=20some?= =?UTF-8?q?=20descriptor=20handling=20in=20'libsi'=20(thanks=20to=20St?= =?UTF-8?q?=C3=A9phane=20Est=C3=A9-Gracias).=20-=20Fixed=20handling=20the?= =?UTF-8?q?=20current=20menu=20item=20(thanks=20to=20Marc=20Hoppe).=20-=20?= =?UTF-8?q?Fixed=20assigning=20events=20to=20timers=20(they=20no=20longer?= =?UTF-8?q?=20get=20"stuck").=20-=20Added=20log=20entries=20whenever=20the?= =?UTF-8?q?=20running=20status=20of=20an=20event=20changes=20(currently=20?= =?UTF-8?q?=20=20only=20logging=20the=20first=2030=20channels).=20-=20Fixe?= =?UTF-8?q?d=20handling=20timers=20in=20VPS=20margin=20if=20the=20EPG=20sc?= =?UTF-8?q?an=20is=20turned=20on=20(the=20EPG=20scan=20=20=20switched=20th?= =?UTF-8?q?e=20device=20away=20from=20the=20channel,=20so=20it=20wouldn't?= =?UTF-8?q?=20see=20the=20change=20of=20=20=20the=20running=20status).=20-?= =?UTF-8?q?=20Fixed=20handling=20"itemized"=20texts=20in=20EPG=20data=20(t?= =?UTF-8?q?hanks=20to=20St=C3=A9phane=20Est=C3=A9-Gracias=20=20=20for=20po?= =?UTF-8?q?inting=20out=20this=20problem,=20and=20Marcel=20Wiesweg=20for?= =?UTF-8?q?=20improving=20'libsi').=20-=20Fixed=20handling=20VPS=20times?= =?UTF-8?q?=20at=20year=20boundaries.=20-=20Avoiding=20too=20many=20consec?= =?UTF-8?q?utive=20"ring=20buffer=20overflow"=20messages=20(which=20only?= =?UTF-8?q?=20=20=20slowed=20down=20performance=20even=20more).=20-=20Taki?= =?UTF-8?q?ng=20the=20Sid=20into=20account=20when=20detecting=20version=20?= =?UTF-8?q?changes=20in=20processing=20the=20=20=20PMT=20(thanks=20to=20St?= =?UTF-8?q?=C3=A9phane=20Est=C3=A9-Gracias=20for=20pointing=20out=20this?= =?UTF-8?q?=20problem).=20-=20Completed=20the=20Russian=20OSD=20texts=20(t?= =?UTF-8?q?hanks=20to=20Vyacheslav=20Dikonov).=20-=20Any=20newline=20chara?= =?UTF-8?q?cters=20in=20the=20'description'=20of=20EPG=20events=20are=20no?= =?UTF-8?q?w=20preserved=20=20=20to=20allow=20texts=20to=20be=20displayed?= =?UTF-8?q?=20the=20way=20the=20tv=20stations=20have=20formatted=20them.?= =?UTF-8?q?=20=20=20This=20was=20also=20necessary=20to=20better=20display?= =?UTF-8?q?=20itemized=20texts.=20-=20Fixed=20detecting=20the=20running=20?= =?UTF-8?q?status=20in=20case=20an=20empty=20EPG=20event=20is=20broadcast?= =?UTF-8?q?=20(thanks=20=20=20to=20Michael=20Pennewi=C3=9F=20for=20pointin?= =?UTF-8?q?g=20this=20out).=20-=20Improved=20performance=20when=20paging?= =?UTF-8?q?=20through=20very=20long=20menu=20lists.=20-=20Removed=20cSched?= =?UTF-8?q?ule::GetEventNumber()=20and=20cSchedule::NumEvents().=20There?= =?UTF-8?q?=20is=20now=20=20=20cSchedule::Events()=20that=20returns=20the?= =?UTF-8?q?=20list=20of=20events=20directly.=20-=20Avoiding=20occasional?= =?UTF-8?q?=20bad=20responsiveness=20to=20user=20interaction=20caused=20by?= =?UTF-8?q?=20assigning=20=20=20events=20to=20timers.=20-=20Now=20explicit?= =?UTF-8?q?ly=20turning=20on=20the=20LNB=20power=20at=20startup,=20because?= =?UTF-8?q?=20newer=20drivers=20don't=20=20=20do=20this=20any=20more=20(th?= =?UTF-8?q?anks=20to=20Oliver=20Endriss=20for=20pointing=20this=20out).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libsi/si.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 15 deletions(-) (limited to 'libsi/si.c') diff --git a/libsi/si.c b/libsi/si.c index ee64802..9ce46f0 100644 --- a/libsi/si.c +++ b/libsi/si.c @@ -6,7 +6,7 @@ * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * - * $Id: si.c 1.8 2004/02/22 10:14:12 kls Exp $ + * $Id: si.c 1.9 2004/03/07 10:50:09 kls Exp $ * * ***************************************************************************/ @@ -103,7 +103,7 @@ DescriptorTag Descriptor::getDescriptorTag(const unsigned char *d) { Descriptor *DescriptorLoop::getNext(Iterator &it) { if (it.igetDescriptorTag()==UnimplementedDescriptorTag) - return returnUnimplemetedDescriptor ? d : 0; return d; } -Descriptor *DescriptorLoop::getNext(Iterator &it, DescriptorTag *tags, int arrayLength, bool returnUnimplemetedDescriptor) { +Descriptor *DescriptorLoop::getNext(Iterator &it, DescriptorTag *tags, int arrayLength, bool returnUnimplementedDescriptor) { Descriptor *d=0; if (it.igetDescriptorTag()==UnimplementedDescriptorTag) - return returnUnimplemetedDescriptor ? d : 0; return d; } -Descriptor *DescriptorLoop::createDescriptor(int &i) { - Descriptor *d=Descriptor::getDescriptor(data+i, domain); +Descriptor *DescriptorLoop::createDescriptor(int &i, bool returnUnimplemetedDescriptor) { + Descriptor *d=Descriptor::getDescriptor(data+i, domain, returnUnimplemetedDescriptor); + if (!d) + return 0; i+=d->getLength(); d->CheckParse(); return d; } +int DescriptorLoop::getNumberOfDescriptors() { + const unsigned char *p=data.getData(); + const unsigned char *end=p+getLength(); + int count=0; + while (p < end) { + count++; + p+=Descriptor::getLength(p); + } + return count; +} + DescriptorGroup::DescriptorGroup(bool del) { array=0; length=0; @@ -211,6 +221,16 @@ char *String::getText(char *buffer) { return buffer; } +//taken from VDR, Copyright Klaus Schmidinger +char *String::getText(char *buffer, char *shortVersion) { + if (getLength() < 0 || getLength() >4095) { + strncpy(buffer, "text error", getLength()+1); + return buffer; + } + decodeText(buffer, shortVersion); + return buffer; +} + //taken from libdtv, Copyright Rolf Hakenes void String::decodeText(char *buffer) { const unsigned char *from=data.getData(0); @@ -228,18 +248,47 @@ void String::decodeText(char *buffer) { if ( ((' ' <= *from) && (*from <= '~')) || (*from == '\n') || (0xA0 <= *from) + || (*from == 0x86 || *from == 0x87) ) *to++ = *from; else if (*from == 0x8A) *to++ = '\n'; - else if (*from == 0x86 || *from == 0x87) //&& !(GDT_NAME_DESCRIPTOR & type)) + from++; + } + *to = '\0'; +} + +void String::decodeText(char *buffer, char *shortVersion) { + const unsigned char *from=data.getData(0); + char *to=buffer; + char *toShort=shortVersion; + int IsShortName=0; + + for (int i = 0; i < getLength(); i++) { + if (*from == 0) + break; + if ( ((' ' <= *from) && (*from <= '~')) + || (*from == '\n') + || (0xA0 <= *from) + ) + { *to++ = *from; + if (IsShortName) + *toShort++ = *from; + } + else if (*from == 0x8A) + *to++ = '\n'; + else if (*from == 0x86) + IsShortName++; + else if (*from == 0x87) + IsShortName--; from++; } *to = '\0'; + *toShort = '\0'; } -Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain) { +Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain, bool returnUnimplemetedDescriptor) { Descriptor *d=0; switch (domain) { case SI: @@ -383,6 +432,8 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain) case AdaptationFieldDataDescriptorTag: case TransportStreamDescriptorTag: default: + if (!returnUnimplemetedDescriptor) + return 0; d=new UnimplementedDescriptor(); break; } @@ -417,6 +468,8 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain) case MHP_DelegatedApplicationDescriptorTag: case MHP_ApplicationStorageDescriptorTag: default: + if (!returnUnimplemetedDescriptor) + return 0; d=new UnimplementedDescriptor(); break; } -- cgit v1.2.3