2001-08-15 13:56:11 +02:00
|
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
/// ///
|
|
|
|
/// libvdr.c: routines to parse the DVB-SI stream ///
|
|
|
|
/// ///
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
|
2001-10-07 10:25:33 +02:00
|
|
|
// $Revision: 1.1 $
|
|
|
|
// $Date: 2001/10/07 10:25:33 $
|
2001-08-15 13:56:11 +02:00
|
|
|
// $Author: hakenes $
|
|
|
|
//
|
|
|
|
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
|
|
|
//
|
|
|
|
// libvdr is free software; you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
// any later version.
|
|
|
|
//
|
|
|
|
// libvdr is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You may have received a copy of the GNU General Public License
|
|
|
|
// along with libvdr; see the file COPYING. If not, write to the
|
|
|
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
// Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
|
|
|
#include <liblx.h>
|
|
|
|
#include <libsi.h>
|
|
|
|
#include <si_tables.h>
|
|
|
|
#include "libvdr.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct LIST *createVdrProgramInfos (unsigned char *siBuffer)
|
|
|
|
{
|
|
|
|
struct VdrProgramInfo *VdrProgramInfo;
|
|
|
|
struct LIST *Result, *EventList;
|
|
|
|
struct Event *Event;
|
|
|
|
struct Descriptor *Descriptor;
|
2003-05-11 11:19:37 +02:00
|
|
|
int GotVdrProgramInfo;
|
|
|
|
|
2001-08-15 13:56:11 +02:00
|
|
|
if (!siBuffer) return (NULL);
|
|
|
|
|
|
|
|
if (!(EventList = siParseEIT (siBuffer))) return (NULL);
|
|
|
|
|
|
|
|
Result = xNewList (NULL);
|
|
|
|
|
|
|
|
xForeach (EventList, Event)
|
|
|
|
{
|
|
|
|
VdrProgramInfo = NULL;
|
2003-05-11 11:19:37 +02:00
|
|
|
GotVdrProgramInfo = 0;
|
|
|
|
|
2001-08-15 13:56:11 +02:00
|
|
|
xForeach (Event->Descriptors, Descriptor)
|
|
|
|
{
|
2003-05-11 11:19:37 +02:00
|
|
|
if (!VdrProgramInfo)
|
|
|
|
{
|
|
|
|
CreateVdrProgramInfo(VdrProgramInfo,
|
|
|
|
Event->EventID, Event->TransportStreamID,
|
|
|
|
Event->ServiceID, Event->StartTime,
|
|
|
|
Event->Duration, Event->Status);
|
|
|
|
}
|
|
|
|
|
2001-08-15 13:56:11 +02:00
|
|
|
switch (Descriptor->Tag)
|
|
|
|
{
|
|
|
|
case DESCR_SHORT_EVENT:
|
|
|
|
{
|
|
|
|
if (!xName(Descriptor) || !xName(Descriptor)[0])
|
|
|
|
break;
|
|
|
|
|
2003-05-11 11:19:37 +02:00
|
|
|
VdrProgramInfo->ShortName =
|
|
|
|
xSetText (xName (Descriptor));
|
|
|
|
VdrProgramInfo->ShortText =
|
|
|
|
xSetText (((struct ShortEventDescriptor
|
|
|
|
*)Descriptor)->Text);
|
|
|
|
memcpy (VdrProgramInfo->LanguageCode, ((struct
|
|
|
|
ShortEventDescriptor *)Descriptor)->
|
|
|
|
LanguageCode, 4);
|
|
|
|
GotVdrProgramInfo = 1;
|
|
|
|
}
|
2001-08-15 13:56:11 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DESCR_TIME_SHIFTED_EVENT:
|
|
|
|
{
|
|
|
|
struct tm *StartTime;
|
|
|
|
|
2003-05-11 11:19:37 +02:00
|
|
|
VdrProgramInfo->ReferenceServiceID =
|
|
|
|
((struct TimeShiftedEventDescriptor
|
|
|
|
*)Descriptor)->ReferenceServiceID;
|
|
|
|
VdrProgramInfo->ReferenceEventID =
|
|
|
|
((struct TimeShiftedEventDescriptor
|
|
|
|
*)Descriptor)->ReferenceEventID;
|
|
|
|
GotVdrProgramInfo = 1;
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DESCR_EXTENDED_EVENT:
|
|
|
|
{
|
|
|
|
struct ExtendedEventItem *Item;
|
|
|
|
|
2003-05-11 11:19:37 +02:00
|
|
|
if (xName (Descriptor))
|
|
|
|
AddToText (xName (Descriptor),
|
|
|
|
VdrProgramInfo->ExtendedName);
|
|
|
|
xForeach (((struct ExtendedEventDescriptor*)
|
|
|
|
Descriptor)->Items, Item)
|
2001-08-15 13:56:11 +02:00
|
|
|
{
|
2003-05-11 11:19:37 +02:00
|
|
|
AddItemToText (xName (Item),
|
|
|
|
VdrProgramInfo->ExtendedText);
|
|
|
|
AddItemToText (Item->Text,
|
|
|
|
VdrProgramInfo->ExtendedText);
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
2003-05-11 11:19:37 +02:00
|
|
|
GotVdrProgramInfo = 1;
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DESCR_CONTENT:
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
|
2003-05-11 11:19:37 +02:00
|
|
|
for (j = 0; j < ((struct ContentDescriptor*)
|
|
|
|
Descriptor)->Amount; j++)
|
2001-08-15 13:56:11 +02:00
|
|
|
{
|
2003-05-11 11:19:37 +02:00
|
|
|
VdrProgramInfo->ContentNibble1 =
|
|
|
|
GetContentContentNibble1(Descriptor, j);
|
|
|
|
VdrProgramInfo->ContentNibble2 =
|
|
|
|
GetContentContentNibble2(Descriptor, j);
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
2003-05-11 11:19:37 +02:00
|
|
|
GotVdrProgramInfo = 1;
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DESCR_PARENTAL_RATING:
|
|
|
|
{
|
|
|
|
struct ParentalRating *Rating;
|
2003-05-11 11:19:37 +02:00
|
|
|
|
|
|
|
xForeach (((struct ParentalRatingDescriptor *)
|
|
|
|
Descriptor)->Ratings, Rating)
|
|
|
|
if (!strncmp (VdrProgramInfo->LanguageCode,
|
|
|
|
Rating->LanguageCode, 3))
|
|
|
|
VdrProgramInfo->Rating = Rating->Rating;
|
|
|
|
GotVdrProgramInfo = 1;
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2003-05-11 11:19:37 +02:00
|
|
|
}
|
|
|
|
if (GotVdrProgramInfo) xAddTail (Result, VdrProgramInfo);
|
2001-08-15 13:56:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return (Result);
|
|
|
|
}
|