1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed handling EPG data where the 'extended event descriptor' comes before the 'short event' or a 'time shifted event'

This commit is contained in:
Klaus Schmidinger 2003-05-11 11:19:37 +02:00
parent e3e21837d0
commit afd0dd904b
3 changed files with 61 additions and 65 deletions

View File

@ -639,3 +639,7 @@ Carsten Siebholz <c.siebholz@t-online.de>
Wolfgang Goeller <wgoeller@heraklit.ch> Wolfgang Goeller <wgoeller@heraklit.ch>
for reporting a bug in keeping live video active in case the primary device doesn't for reporting a bug in keeping live video active in case the primary device doesn't
have an MPEG decoder have an MPEG decoder
Jonan Santiago <jonan-lists-vdr@callisia.com>
for fixing handling EPG data where the "extended event descriptor" comes before the
"short event" or a "time shifted event"

View File

@ -2129,3 +2129,5 @@ Video Disk Recorder Revision History
dvbplayer.c. Also, the long timeout in WaitForPut caused problems with cReceivers dvbplayer.c. Also, the long timeout in WaitForPut caused problems with cReceivers
that use a ring buffer and didn't immediately return from their Receive() function that use a ring buffer and didn't immediately return from their Receive() function
if the buffer runs full (thanks to Sascha Volkenandt for reporting this one). if the buffer runs full (thanks to Sascha Volkenandt for reporting this one).
- Fixed handling EPG data where the "extended event descriptor" comes before the
"short event" or a "time shifted event" (thanks to Jonan Santiago).

View File

@ -47,7 +47,8 @@ struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
struct LIST *Result, *EventList; struct LIST *Result, *EventList;
struct Event *Event; struct Event *Event;
struct Descriptor *Descriptor; struct Descriptor *Descriptor;
int GotVdrProgramInfo;
if (!siBuffer) return (NULL); if (!siBuffer) return (NULL);
if (!(EventList = siParseEIT (siBuffer))) return (NULL); if (!(EventList = siParseEIT (siBuffer))) return (NULL);
@ -57,9 +58,18 @@ struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
xForeach (EventList, Event) xForeach (EventList, Event)
{ {
VdrProgramInfo = NULL; VdrProgramInfo = NULL;
GotVdrProgramInfo = 0;
xForeach (Event->Descriptors, Descriptor) xForeach (Event->Descriptors, Descriptor)
{ {
if (!VdrProgramInfo)
{
CreateVdrProgramInfo(VdrProgramInfo,
Event->EventID, Event->TransportStreamID,
Event->ServiceID, Event->StartTime,
Event->Duration, Event->Status);
}
switch (Descriptor->Tag) switch (Descriptor->Tag)
{ {
case DESCR_SHORT_EVENT: case DESCR_SHORT_EVENT:
@ -67,43 +77,29 @@ struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
if (!xName(Descriptor) || !xName(Descriptor)[0]) if (!xName(Descriptor) || !xName(Descriptor)[0])
break; break;
if (!VdrProgramInfo) VdrProgramInfo->ShortName =
{ xSetText (xName (Descriptor));
CreateVdrProgramInfo(VdrProgramInfo, VdrProgramInfo->ShortText =
Event->EventID, Event->TransportStreamID, xSetText (((struct ShortEventDescriptor
Event->ServiceID, Event->StartTime, *)Descriptor)->Text);
Event->Duration, Event->Status); memcpy (VdrProgramInfo->LanguageCode, ((struct
ShortEventDescriptor *)Descriptor)->
VdrProgramInfo->ShortName = LanguageCode, 4);
xSetText (xName (Descriptor)); GotVdrProgramInfo = 1;
VdrProgramInfo->ShortText = }
xSetText (((struct ShortEventDescriptor
*)Descriptor)->Text);
memcpy (VdrProgramInfo->LanguageCode, ((struct
ShortEventDescriptor *)Descriptor)->
LanguageCode, 4);
}
}
break; break;
case DESCR_TIME_SHIFTED_EVENT: case DESCR_TIME_SHIFTED_EVENT:
{ {
struct tm *StartTime; struct tm *StartTime;
if (!VdrProgramInfo) VdrProgramInfo->ReferenceServiceID =
{ ((struct TimeShiftedEventDescriptor
CreateVdrProgramInfo(VdrProgramInfo, *)Descriptor)->ReferenceServiceID;
Event->EventID, Event->TransportStreamID, VdrProgramInfo->ReferenceEventID =
Event->ServiceID, Event->StartTime, ((struct TimeShiftedEventDescriptor
Event->Duration, Event->Status); *)Descriptor)->ReferenceEventID;
GotVdrProgramInfo = 1;
VdrProgramInfo->ReferenceServiceID =
((struct TimeShiftedEventDescriptor
*)Descriptor)->ReferenceServiceID;
VdrProgramInfo->ReferenceEventID =
((struct TimeShiftedEventDescriptor
*)Descriptor)->ReferenceEventID;
}
} }
break; break;
@ -111,20 +107,18 @@ struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
{ {
struct ExtendedEventItem *Item; struct ExtendedEventItem *Item;
if (VdrProgramInfo) if (xName (Descriptor))
AddToText (xName (Descriptor),
VdrProgramInfo->ExtendedName);
xForeach (((struct ExtendedEventDescriptor*)
Descriptor)->Items, Item)
{ {
if (xName (Descriptor)) AddItemToText (xName (Item),
AddToText (xName (Descriptor), VdrProgramInfo->ExtendedText);
VdrProgramInfo->ExtendedName); AddItemToText (Item->Text,
xForeach (((struct ExtendedEventDescriptor*) VdrProgramInfo->ExtendedText);
Descriptor)->Items, Item)
{
AddItemToText (xName (Item),
VdrProgramInfo->ExtendedText);
AddItemToText (Item->Text,
VdrProgramInfo->ExtendedText);
}
} }
GotVdrProgramInfo = 1;
} }
break; break;
@ -132,37 +126,33 @@ struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
{ {
int i, j; int i, j;
if (VdrProgramInfo) for (j = 0; j < ((struct ContentDescriptor*)
Descriptor)->Amount; j++)
{ {
for (j = 0; j < ((struct ContentDescriptor*) VdrProgramInfo->ContentNibble1 =
Descriptor)->Amount; j++) GetContentContentNibble1(Descriptor, j);
{ VdrProgramInfo->ContentNibble2 =
VdrProgramInfo->ContentNibble1 = GetContentContentNibble2(Descriptor, j);
GetContentContentNibble1(Descriptor, j);
VdrProgramInfo->ContentNibble2 =
GetContentContentNibble2(Descriptor, j);
}
} }
GotVdrProgramInfo = 1;
} }
break; break;
case DESCR_PARENTAL_RATING: case DESCR_PARENTAL_RATING:
{ {
struct ParentalRating *Rating; struct ParentalRating *Rating;
if (VdrProgramInfo) xForeach (((struct ParentalRatingDescriptor *)
{ Descriptor)->Ratings, Rating)
xForeach (((struct ParentalRatingDescriptor *) if (!strncmp (VdrProgramInfo->LanguageCode,
Descriptor)->Ratings, Rating) Rating->LanguageCode, 3))
if (!strncmp (VdrProgramInfo->LanguageCode, VdrProgramInfo->Rating = Rating->Rating;
Rating->LanguageCode, 3)) GotVdrProgramInfo = 1;
VdrProgramInfo->Rating = Rating->Rating;
}
} }
break; break;
} }
} }
if (VdrProgramInfo) xAddTail (Result, VdrProgramInfo); if (GotVdrProgramInfo) xAddTail (Result, VdrProgramInfo);
} }
return (Result); return (Result);