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:
parent
e3e21837d0
commit
afd0dd904b
@ -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"
|
||||||
|
2
HISTORY
2
HISTORY
@ -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).
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user