mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Now using 'libdtv' for getting EIT information
This commit is contained in:
parent
42096e07b6
commit
716d3d07b4
@ -129,3 +129,6 @@ Artur Skawina <skawina@geocities.com>
|
|||||||
|
|
||||||
Werner Fink <werner@suse.de>
|
Werner Fink <werner@suse.de>
|
||||||
for making I/O more robust by handling EINTR
|
for making I/O more robust by handling EINTR
|
||||||
|
|
||||||
|
Rolf Hakenes <hakenes@hippomi.de>
|
||||||
|
for providing 'libdtv' and adapting the EIT mechanisms to it
|
||||||
|
2
HISTORY
2
HISTORY
@ -653,3 +653,5 @@ Video Disk Recorder Revision History
|
|||||||
2001-08-15: Version 0.92
|
2001-08-15: Version 0.92
|
||||||
|
|
||||||
- The "channel not sync'ed" log message now also lists the card number.
|
- The "channel not sync'ed" log message now also lists the card number.
|
||||||
|
- Now using the EIT services from 'libdtv' (thanks to Rolf Hakenes), which
|
||||||
|
provides EPG information for NVOD ("Near Video On Demand") channels.
|
||||||
|
19
Makefile
19
Makefile
@ -4,16 +4,19 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: Makefile 1.25 2001/08/10 16:46:45 kls Exp $
|
# $Id: Makefile 1.26 2001/08/15 13:56:11 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
DVBDIR = ../DVB
|
DVBDIR = ../DVB
|
||||||
DVDDIR = ../DVD
|
DVDDIR = ../DVD
|
||||||
AC3DIR = ./ac3dec
|
AC3DIR = ./ac3dec
|
||||||
|
DTVDIR = ./libdtv
|
||||||
|
|
||||||
INCLUDES = -I$(DVBDIR)/ost/include
|
INCLUDES = -I$(DVBDIR)/ost/include
|
||||||
|
|
||||||
|
DTVLIB = $(DTVDIR)/libdtv.a
|
||||||
|
|
||||||
ifdef DVD
|
ifdef DVD
|
||||||
INCLUDES += -I$(DVDDIR)/libdvdread
|
INCLUDES += -I$(DVDDIR)/libdvdread
|
||||||
LIBDIRS += -L$(DVDDIR)/libdvdread/dvdread/.libs
|
LIBDIRS += -L$(DVDDIR)/libdvdread/dvdread/.libs
|
||||||
@ -57,10 +60,10 @@ font: genfontfile fontfix.c fontosd.c
|
|||||||
# Dependencies:
|
# Dependencies:
|
||||||
|
|
||||||
config.o : config.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h interface.h remote.h svdrp.h thread.h tools.h
|
config.o : config.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h interface.h remote.h svdrp.h thread.h tools.h
|
||||||
dvbapi.o : dvbapi.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h recording.h remux.h ringbuffer.h thread.h tools.h videodir.h
|
dvbapi.o : dvbapi.c $(AC3DIR)/ac3.h config.h dvbapi.h dvbosd.h dvd.h eit.h font.h recording.h remux.h ringbuffer.h thread.h tools.h videodir.h
|
||||||
dvbosd.o : dvbosd.c dvbosd.h font.h tools.h
|
dvbosd.o : dvbosd.c dvbosd.h font.h tools.h
|
||||||
dvd.o : dvd.c dvd.h
|
dvd.o : dvd.c dvd.h
|
||||||
eit.o : eit.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h thread.h tools.h videodir.h
|
eit.o : eit.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h $(DTVDIR)/libdtv.h thread.h tools.h videodir.h
|
||||||
font.o : font.c font.h fontfix.c fontosd.c tools.h
|
font.o : font.c font.h fontfix.c fontosd.c tools.h
|
||||||
i18n.o : i18n.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h thread.h tools.h
|
i18n.o : i18n.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h thread.h tools.h
|
||||||
interface.o : interface.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h interface.h remote.h svdrp.h thread.h tools.h
|
interface.o : interface.c config.h dvbapi.h dvbosd.h dvd.h eit.h font.h i18n.h interface.h remote.h svdrp.h thread.h tools.h
|
||||||
@ -78,8 +81,8 @@ videodir.o : videodir.c tools.h videodir.h
|
|||||||
|
|
||||||
# The main program:
|
# The main program:
|
||||||
|
|
||||||
vdr: $(OBJS) $(AC3LIB)
|
vdr: $(OBJS) $(AC3LIB) $(DTVLIB)
|
||||||
g++ -g -O2 $(OBJS) -lncurses -ljpeg -lpthread $(LIBDIRS) $(DVDLIB) $(AC3LIB) -o vdr
|
g++ -g -O2 $(OBJS) -lncurses -ljpeg -lpthread $(LIBDIRS) $(DVDLIB) $(AC3LIB) $(DTVLIB) -o vdr
|
||||||
|
|
||||||
# The font files:
|
# The font files:
|
||||||
|
|
||||||
@ -98,10 +101,16 @@ genfontfile: genfontfile.c
|
|||||||
$(AC3LIB):
|
$(AC3LIB):
|
||||||
make -C $(AC3DIR) all
|
make -C $(AC3DIR) all
|
||||||
|
|
||||||
|
# The libdtv library:
|
||||||
|
|
||||||
|
$(DTVLIB) $(DTVDIR)/libdtv.h:
|
||||||
|
make -C $(DTVDIR) all
|
||||||
|
|
||||||
# Housekeeping:
|
# Housekeeping:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
make -C $(AC3DIR) clean
|
make -C $(AC3DIR) clean
|
||||||
|
make -C $(DTVDIR) clean
|
||||||
-rm -f $(OBJS) vdr genfontfile genfontfile.o core *~
|
-rm -f $(OBJS) vdr genfontfile genfontfile.o core *~
|
||||||
fontclean:
|
fontclean:
|
||||||
-rm -f fontfix.c fontosd.c
|
-rm -f fontfix.c fontosd.c
|
||||||
|
537
eit.c
537
eit.c
@ -4,6 +4,9 @@
|
|||||||
begin : Fri Aug 25 2000
|
begin : Fri Aug 25 2000
|
||||||
copyright : (C) 2000 by Robert Schneider
|
copyright : (C) 2000 by Robert Schneider
|
||||||
email : Robert.Schneider@web.de
|
email : Robert.Schneider@web.de
|
||||||
|
|
||||||
|
2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de>
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -13,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: eit.c 1.19 2001/08/12 15:04:37 kls Exp $
|
* $Id: eit.c 1.20 2001/08/15 13:23:21 kls Exp $
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
@ -33,6 +36,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "libdtv/libdtv.h"
|
||||||
#include "videodir.h"
|
#include "videodir.h"
|
||||||
|
|
||||||
// --- cMJD ------------------------------------------------------------------
|
// --- cMJD ------------------------------------------------------------------
|
||||||
@ -144,32 +148,6 @@ time_t cMJD::GetTime_t()
|
|||||||
|
|
||||||
// --- cTDT ------------------------------------------------------------------
|
// --- cTDT ------------------------------------------------------------------
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
u_char table_id : 8;
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
u_char section_syntax_indicator : 1;
|
|
||||||
u_char : 3;
|
|
||||||
u_char section_length_hi : 4;
|
|
||||||
#else
|
|
||||||
u_char section_length_hi : 4;
|
|
||||||
u_char : 3;
|
|
||||||
u_char section_syntax_indicator : 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u_char section_length_lo : 8;
|
|
||||||
|
|
||||||
|
|
||||||
u_char utc_date_hi : 8;
|
|
||||||
u_char utc_date_lo : 8;
|
|
||||||
u_char utc_hour : 4;
|
|
||||||
u_char utc_hour_ten : 4;
|
|
||||||
u_char utc_min : 4;
|
|
||||||
u_char utc_min_ten : 4;
|
|
||||||
u_char utc_sec : 4;
|
|
||||||
u_char utc_sec_ten : 4;
|
|
||||||
} tdt_t;
|
|
||||||
|
|
||||||
class cTDT {
|
class cTDT {
|
||||||
public:
|
public:
|
||||||
cTDT(tdt_t *ptdt);
|
cTDT(tdt_t *ptdt);
|
||||||
@ -183,11 +161,11 @@ protected: // Protected attributes
|
|||||||
cMJD mjd; // kls 2001-03-02: made this a member instead of a pointer (it wasn't deleted in the destructor!)
|
cMJD mjd; // kls 2001-03-02: made this a member instead of a pointer (it wasn't deleted in the destructor!)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define BCD2DEC(b) (((b >> 4) & 0x0F) * 10 + (b & 0x0F))
|
||||||
|
|
||||||
cTDT::cTDT(tdt_t *ptdt)
|
cTDT::cTDT(tdt_t *ptdt)
|
||||||
:tdt(*ptdt)
|
:tdt(*ptdt)
|
||||||
,mjd(tdt.utc_date_hi, tdt.utc_date_lo, tdt.utc_hour_ten * 10 + tdt.utc_hour,
|
,mjd(tdt.utc_mjd_hi, tdt.utc_mjd_lo, BCD2DEC(tdt.utc_time_h), BCD2DEC(tdt.utc_time_m), BCD2DEC(tdt.utc_time_s))
|
||||||
tdt.utc_min_ten * 10 + tdt.utc_min,
|
|
||||||
tdt.utc_sec_ten * 10 + tdt.utc_sec)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +280,7 @@ unsigned short cEventInfo::GetEventID() const
|
|||||||
return uEventID;
|
return uEventID;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
bool cEventInfo::SetTitle(char *string)
|
bool cEventInfo::SetTitle(const char *string)
|
||||||
{
|
{
|
||||||
if (string == NULL)
|
if (string == NULL)
|
||||||
return false;
|
return false;
|
||||||
@ -314,7 +292,7 @@ bool cEventInfo::SetTitle(char *string)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
bool cEventInfo::SetSubtitle(char *string)
|
bool cEventInfo::SetSubtitle(const char *string)
|
||||||
{
|
{
|
||||||
if (string == NULL)
|
if (string == NULL)
|
||||||
return false;
|
return false;
|
||||||
@ -326,7 +304,7 @@ bool cEventInfo::SetSubtitle(char *string)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
bool cEventInfo::AddExtendedDescription(char *string)
|
bool cEventInfo::AddExtendedDescription(const char *string)
|
||||||
{
|
{
|
||||||
int size = 0;
|
int size = 0;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
@ -425,7 +403,7 @@ const cEventInfo * cSchedule::GetPresentEvent() const
|
|||||||
{
|
{
|
||||||
// checking temporal sanity of present event (kls 2000-11-01)
|
// checking temporal sanity of present event (kls 2000-11-01)
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
if (pPresent && !(pPresent->GetTime() <= now && now <= pPresent->GetTime() + pPresent->GetDuration()))
|
//XXX if (pPresent && !(pPresent->GetTime() <= now && now <= pPresent->GetTime() + pPresent->GetDuration()))
|
||||||
{
|
{
|
||||||
cEventInfo *pe = Events.First();
|
cEventInfo *pe = Events.First();
|
||||||
while (pe != NULL)
|
while (pe != NULL)
|
||||||
@ -435,6 +413,7 @@ const cEventInfo * cSchedule::GetPresentEvent() const
|
|||||||
pe = Events.Next(pe);
|
pe = Events.Next(pe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return NULL;//XXX
|
||||||
return pPresent;
|
return pPresent;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
@ -443,7 +422,7 @@ const cEventInfo * cSchedule::GetFollowingEvent() const
|
|||||||
// checking temporal sanity of following event (kls 2000-11-01)
|
// checking temporal sanity of following event (kls 2000-11-01)
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
const cEventInfo *pr = GetPresentEvent(); // must have it verified!
|
const cEventInfo *pr = GetPresentEvent(); // must have it verified!
|
||||||
if (pFollowing && !(pr && pr->GetTime() + pr->GetDuration() <= pFollowing->GetTime()))
|
if (pr)//XXX if (pFollowing && !(pr && pr->GetTime() + pr->GetDuration() <= pFollowing->GetTime()))
|
||||||
{
|
{
|
||||||
int minDt = INT_MAX;
|
int minDt = INT_MAX;
|
||||||
cEventInfo *pe = Events.First(), *pf = NULL;
|
cEventInfo *pe = Events.First(), *pf = NULL;
|
||||||
@ -459,6 +438,7 @@ const cEventInfo * cSchedule::GetFollowingEvent() const
|
|||||||
}
|
}
|
||||||
return pf;
|
return pf;
|
||||||
}
|
}
|
||||||
|
return NULL;//XXX
|
||||||
return pFollowing;
|
return pFollowing;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
@ -627,170 +607,28 @@ void cSchedules::Dump(FILE *f, const char *Prefix) const
|
|||||||
|
|
||||||
// --- cEIT ------------------------------------------------------------------
|
// --- cEIT ------------------------------------------------------------------
|
||||||
|
|
||||||
#define DEC(N) dec << setw(N) << setfill(int('0'))
|
|
||||||
#define HEX(N) hex << setw(N) << setfill(int('0'))
|
|
||||||
|
|
||||||
#define EIT_STUFFING_DESCRIPTOR 0x42
|
|
||||||
#define EIT_LINKAGE_DESCRIPTOR 0x4a
|
|
||||||
#define EIT_SHORT_EVENT_DESCRIPTOR 0x4d
|
|
||||||
#define EIT_EXTENDED_EVENT_DESCRIPTOR 0x4e
|
|
||||||
#define EIT_TIME_SHIFTED_EVENT_DESCRIPTOR 0x4f
|
|
||||||
#define EIT_COMPONENT_DESCRIPTOR 0x50
|
|
||||||
#define EIT_CA_IDENTIFIER_DESCRIPTOR 0x53
|
|
||||||
#define EIT_CONTENT_DESCRIPTOR 0x54
|
|
||||||
#define EIT_PARENTAL_RATING_DESCRIPTOR 0x55
|
|
||||||
#define EIT_TELEPHONE_DESCRIPTOR 0x57
|
|
||||||
#define EIT_MULTILINGUAL_COMPONENT_DESCRIPTOR 0x5e
|
|
||||||
#define EIT_PRIVATE_DATE_SPECIFIER_DESCRIPTOR 0x5f
|
|
||||||
#define EIT_SHORT_SMOOTHING_BUFFER_DESCRIPTOR 0x61
|
|
||||||
#define EIT_DATA_BROADCAST_DESCRIPTOR 0x64
|
|
||||||
#define EIT_PDC_DESCRIPTOR 0x69
|
|
||||||
|
|
||||||
typedef struct eit_struct {
|
|
||||||
u_char table_id : 8;
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
u_char section_syntax_indicator : 1;
|
|
||||||
u_char : 3;
|
|
||||||
u_char section_length_hi : 4;
|
|
||||||
#else
|
|
||||||
u_char section_length_hi : 4;
|
|
||||||
u_char : 3;
|
|
||||||
u_char section_syntax_indicator : 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u_char section_length_lo : 8;
|
|
||||||
|
|
||||||
u_char service_id_hi : 8;
|
|
||||||
u_char service_id_lo : 8;
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
u_char : 2;
|
|
||||||
u_char version_number : 5;
|
|
||||||
u_char current_next_indicator : 1;
|
|
||||||
#else
|
|
||||||
u_char current_next_indicator : 1;
|
|
||||||
u_char version_number : 5;
|
|
||||||
u_char : 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u_char section_number : 8;
|
|
||||||
u_char last_section_number : 8;
|
|
||||||
u_char transport_stream_id_hi : 8;
|
|
||||||
u_char transport_stream_id_lo : 8;
|
|
||||||
u_char original_network_id_hi : 8;
|
|
||||||
u_char original_network_id_lo : 8;
|
|
||||||
u_char segment_last_section_number : 8;
|
|
||||||
u_char segment_last_table_id : 8;
|
|
||||||
} eit_t;
|
|
||||||
|
|
||||||
typedef struct eit_loop_struct {
|
|
||||||
u_char event_id_hi : 8;
|
|
||||||
u_char event_id_lo : 8;
|
|
||||||
|
|
||||||
u_char date_hi : 8;
|
|
||||||
u_char date_lo : 8;
|
|
||||||
u_char time_hour : 4;
|
|
||||||
u_char time_hour_ten : 4;
|
|
||||||
u_char time_minute : 4;
|
|
||||||
u_char time_minute_ten : 4;
|
|
||||||
u_char time_second : 4;
|
|
||||||
u_char time_second_ten : 4;
|
|
||||||
|
|
||||||
u_char dur_hour : 4;
|
|
||||||
u_char dur_hour_ten : 4;
|
|
||||||
u_char dur_minute : 4;
|
|
||||||
u_char dur_minute_ten : 4;
|
|
||||||
u_char dur_second : 4;
|
|
||||||
u_char dur_second_ten : 4;
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
u_char running_status : 3;
|
|
||||||
u_char free_ca_mode : 1;
|
|
||||||
u_char descriptors_loop_length_hi : 4;
|
|
||||||
#else
|
|
||||||
u_char descriptors_loop_length_hi : 4;
|
|
||||||
u_char free_ca_mode : 1;
|
|
||||||
u_char running_status : 3;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
u_char descriptors_loop_length_lo : 8;
|
|
||||||
} eit_loop_t;
|
|
||||||
|
|
||||||
typedef struct eit_short_event_struct {
|
|
||||||
u_char descriptor_tag : 8;
|
|
||||||
u_char descriptor_length : 8;
|
|
||||||
|
|
||||||
u_char language_code_1 : 8;
|
|
||||||
u_char language_code_2 : 8;
|
|
||||||
u_char language_code_3 : 8;
|
|
||||||
|
|
||||||
u_char event_name_length : 8;
|
|
||||||
} eit_short_event_t;
|
|
||||||
|
|
||||||
typedef struct eit_extended_event_struct {
|
|
||||||
u_char descriptor_tag : 8;
|
|
||||||
u_char descriptor_length : 8;
|
|
||||||
|
|
||||||
u_char last_descriptor_number : 4;
|
|
||||||
u_char descriptor_number : 4;
|
|
||||||
|
|
||||||
u_char language_code_1 : 8;
|
|
||||||
u_char language_code_2 : 8;
|
|
||||||
u_char language_code_3 : 8;
|
|
||||||
|
|
||||||
u_char length_of_items : 8;
|
|
||||||
} eit_extended_event_t;
|
|
||||||
|
|
||||||
typedef struct eit_content_descriptor {
|
|
||||||
u_char descriptor_tag : 8;
|
|
||||||
u_char descriptor_length : 8;
|
|
||||||
} eit_content_descriptor_t;
|
|
||||||
|
|
||||||
typedef struct eit_content_loop {
|
|
||||||
u_char content_nibble_level_2 : 4;
|
|
||||||
u_char content_nibble_level_1 : 4;
|
|
||||||
u_char user_nibble_2 : 4;
|
|
||||||
u_char user_nibble_1 : 4;
|
|
||||||
} eit_content_loop_t;
|
|
||||||
|
|
||||||
class cEIT {
|
class cEIT {
|
||||||
private:
|
private:
|
||||||
cSchedules *schedules;
|
cSchedules *schedules;
|
||||||
public:
|
public:
|
||||||
cEIT(void *buf, int length, cSchedules *Schedules);
|
cEIT(unsigned char *buf, int length, cSchedules *Schedules);
|
||||||
~cEIT();
|
~cEIT();
|
||||||
/** */
|
/** */
|
||||||
int ProcessEIT();
|
int ProcessEIT(unsigned char *buffer);
|
||||||
|
|
||||||
protected: // Protected methods
|
protected: // Protected methods
|
||||||
/** */
|
|
||||||
int strdvbcpy(unsigned char *dst, unsigned char *src, int max);
|
|
||||||
/** returns true if this EIT covers a
|
/** returns true if this EIT covers a
|
||||||
present/following information, false if it's
|
present/following information, false if it's
|
||||||
schedule information */
|
schedule information */
|
||||||
bool IsPresentFollowing();
|
bool IsPresentFollowing();
|
||||||
/** */
|
|
||||||
bool WriteShortEventDescriptor(unsigned short service, eit_loop_t *eitloop, u_char *buf);
|
|
||||||
/** */
|
|
||||||
bool WriteExtEventDescriptor(unsigned short service, eit_loop_t *eitloop, u_char *buf);
|
|
||||||
protected: // Protected attributes
|
protected: // Protected attributes
|
||||||
int buflen;
|
|
||||||
protected: // Protected attributes
|
|
||||||
/** */
|
|
||||||
u_char buffer[4097];
|
|
||||||
/** Table ID of this EIT struct */
|
/** Table ID of this EIT struct */
|
||||||
u_char tid;
|
u_char tid;
|
||||||
/** EITs service id (program number) */
|
|
||||||
u_short pid;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cEIT::cEIT(void * buf, int length, cSchedules *Schedules)
|
cEIT::cEIT(unsigned char * buf, int length, cSchedules *Schedules)
|
||||||
{
|
{
|
||||||
buflen = length < int(sizeof(buffer)) ? length : sizeof(buffer);
|
tid = buf[0];
|
||||||
memset(buffer, 0, sizeof(buffer));
|
|
||||||
memcpy(buffer, buf, buflen);
|
|
||||||
tid = buffer[0];
|
|
||||||
schedules = Schedules;
|
schedules = Schedules;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -799,162 +637,73 @@ cEIT::~cEIT()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
int cEIT::ProcessEIT()
|
int cEIT::ProcessEIT(unsigned char *buffer)
|
||||||
{
|
{
|
||||||
int bufact = 0;
|
cEventInfo *pEvent, *rEvent = NULL;
|
||||||
eit_t *eit;
|
cSchedule *pSchedule, *rSchedule = NULL;
|
||||||
eit_loop_t *eitloop;
|
struct LIST *VdrProgramInfos;
|
||||||
u_char tmp[256];
|
struct VdrProgramInfo *VdrProgramInfo;
|
||||||
|
|
||||||
if (bufact + (int)sizeof(eit_t) > buflen)
|
if (!buffer)
|
||||||
return 0;
|
return -1;
|
||||||
eit = (eit_t *)buffer;
|
|
||||||
bufact += sizeof(eit_t);
|
|
||||||
|
|
||||||
unsigned int service = (eit->service_id_hi << 8) | eit->service_id_lo;
|
VdrProgramInfos = createVdrProgramInfos(buffer);
|
||||||
|
|
||||||
while(bufact + (int)sizeof(eit_loop_t) <= buflen)
|
if (VdrProgramInfos) {
|
||||||
{
|
for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) {
|
||||||
eitloop = (eit_loop_t *)&buffer[bufact];
|
pSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ServiceID);
|
||||||
bufact += sizeof(eit_loop_t);
|
if (!pSchedule) {
|
||||||
|
schedules->Add(new cSchedule(VdrProgramInfo->ServiceID));
|
||||||
int descdatalen = (eitloop->descriptors_loop_length_hi << 8) + eitloop->descriptors_loop_length_lo;
|
pSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ServiceID);
|
||||||
int descdataact = 0;
|
if (!pSchedule)
|
||||||
|
break;
|
||||||
while (descdataact < descdatalen && bufact < buflen)
|
}
|
||||||
{
|
if (VdrProgramInfo->ReferenceServiceID) {
|
||||||
switch (buffer[bufact])
|
rSchedule = (cSchedule *)schedules->GetSchedule(VdrProgramInfo->ReferenceServiceID);
|
||||||
{
|
if (!rSchedule)
|
||||||
eit_content_descriptor_t *cont;
|
break;
|
||||||
eit_content_loop_t *contloop;
|
rEvent = (cEventInfo *)rSchedule->GetEvent((unsigned short)VdrProgramInfo->ReferenceEventID);
|
||||||
|
if (!rEvent)
|
||||||
case EIT_STUFFING_DESCRIPTOR :
|
break;
|
||||||
//dsyslog(LOG_INFO, "Found EIT_STUFFING_DESCRIPTOR");
|
}
|
||||||
break;
|
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID);
|
||||||
|
if (!pEvent) {
|
||||||
case EIT_LINKAGE_DESCRIPTOR :
|
pSchedule->Events.Add(new cEventInfo(VdrProgramInfo->ServiceID, VdrProgramInfo->EventID));
|
||||||
//dsyslog(LOG_INFO, "Found EIT_LINKAGE_DESCRIPTOR");
|
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID);
|
||||||
break;
|
if (!pEvent)
|
||||||
|
break;
|
||||||
case EIT_SHORT_EVENT_DESCRIPTOR:
|
if (rEvent) {
|
||||||
WriteShortEventDescriptor(service, eitloop, &buffer[bufact]);
|
pEvent->SetTitle(rEvent->GetTitle());
|
||||||
break;
|
pEvent->SetSubtitle(rEvent->GetSubtitle());
|
||||||
|
pEvent->SetTime(VdrProgramInfo->StartTime);
|
||||||
case EIT_EXTENDED_EVENT_DESCRIPTOR:
|
pEvent->SetDuration(VdrProgramInfo->Duration);
|
||||||
WriteExtEventDescriptor(service, eitloop, &buffer[bufact]);
|
if (pEvent->AddExtendedDescription(rEvent->GetExtendedDescription()))
|
||||||
break;
|
pEvent->IncreaseExtendedDescriptorNumber();
|
||||||
|
}
|
||||||
case EIT_TIME_SHIFTED_EVENT_DESCRIPTOR :
|
else {
|
||||||
//dsyslog(LOG_INFO, "Found EIT_TIME_SHIFTED_EVENT_DESCRIPTOR");
|
pEvent->SetTitle(VdrProgramInfo->ShortName);
|
||||||
break;
|
pEvent->SetSubtitle(VdrProgramInfo->ShortText);
|
||||||
|
pEvent->SetTime(VdrProgramInfo->StartTime);
|
||||||
case EIT_COMPONENT_DESCRIPTOR :
|
pEvent->SetDuration(VdrProgramInfo->Duration);
|
||||||
if (buffer[bufact + 1] > 6) // kls 2001-02-24: otherwise strncpy() causes a segfault in strdvbcpy()
|
if (pEvent->AddExtendedDescription(VdrProgramInfo->ExtendedName))
|
||||||
strdvbcpy(tmp, &buffer[bufact + 8], buffer[bufact + 1] - 6);
|
pEvent->IncreaseExtendedDescriptorNumber();
|
||||||
//dsyslog(LOG_INFO, "Found EIT_COMPONENT_DESCRIPTOR %c%c%c 0x%02x/0x%02x/0x%02x '%s'\n", buffer[bufact + 5], buffer[bufact + 6], buffer[bufact + 7], buffer[2], buffer[3], buffer[4], tmp);
|
if (pEvent->AddExtendedDescription(VdrProgramInfo->ExtendedText))
|
||||||
break;
|
pEvent->IncreaseExtendedDescriptorNumber();
|
||||||
|
}
|
||||||
case EIT_CA_IDENTIFIER_DESCRIPTOR :
|
}
|
||||||
//dsyslog(LOG_INFO, "Found EIT_CA_IDENTIFIER_DESCRIPTOR");
|
if (IsPresentFollowing()) {
|
||||||
break;
|
if ((GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_PAUSING) || (GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_RUNNING))
|
||||||
|
pSchedule->SetPresentEvent(pEvent);
|
||||||
case EIT_CONTENT_DESCRIPTOR :
|
else if (GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_AWAITING)
|
||||||
cont = (eit_content_descriptor_t *)buffer;
|
pSchedule->SetFollowingEvent(pEvent);
|
||||||
contloop = (eit_content_loop_t *)&buffer[sizeof(eit_content_descriptor_t)];
|
}
|
||||||
//dsyslog(LOG_INFO, "Found EIT_CONTENT_DESCRIPTOR 0x%02x/0x%02x\n", contloop->content_nibble_level_1, contloop->content_nibble_level_2);
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_PARENTAL_RATING_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_PARENTAL_RATING_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_TELEPHONE_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_TELEPHONE_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_MULTILINGUAL_COMPONENT_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_MULTILINGUAL_COMPONENT_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_PRIVATE_DATE_SPECIFIER_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_PRIVATE_DATE_SPECIFIER_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_SHORT_SMOOTHING_BUFFER_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_SHORT_SMOOTHING_BUFFER_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_DATA_BROADCAST_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_DATA_BROADCAST_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EIT_PDC_DESCRIPTOR :
|
|
||||||
//dsyslog(LOG_INFO, "Found EIT_PDC_DESCRIPTOR");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//dsyslog(LOG_INFO, "Found unhandled descriptor 0x%02x with length of %04d\n", (int)buffer[bufact], (int)buffer[bufact + 1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
descdataact += (buffer[bufact + 1] + 2);
|
|
||||||
bufact += (buffer[bufact + 1] + 2);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
xMemFreeAll(NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
int cEIT::strdvbcpy(unsigned char *dst, unsigned char *src, int max)
|
|
||||||
{
|
|
||||||
int a = 0;
|
|
||||||
|
|
||||||
// kls 2001-02-24: if we come in with negative values, the caller must
|
|
||||||
// have done something wrong and the strncpy() below will cause a segfault
|
|
||||||
if (max <= 0)
|
|
||||||
{
|
|
||||||
*dst = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*src == 0x05 || (*src >= 0x20 && *src <= 0xff))
|
|
||||||
{
|
|
||||||
for (a = 0; a < max; a++)
|
|
||||||
{
|
|
||||||
if (*src == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((*src >= ' ' && *src <= '~') || (*src >= 0xa0 && *src <= 0xff))
|
|
||||||
*dst++ = *src++;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// if ((*src > '~' && *src < 0xa0) || *src == 0xff)
|
|
||||||
// cerr << "found special character 0x" << HEX(2) << (int)*src << endl;
|
|
||||||
src++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*dst = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const char *ret;
|
|
||||||
|
|
||||||
switch (*src)
|
|
||||||
{
|
|
||||||
case 0x01: ret = "Coding according to character table 1"; break;
|
|
||||||
case 0x02: ret = "Coding according to character table 2"; break;
|
|
||||||
case 0x03: ret = "Coding according to character table 3"; break;
|
|
||||||
case 0x04: ret = "Coding according to character table 4"; break;
|
|
||||||
case 0x10: ret = "Coding according to ISO/IEC 8859"; break;
|
|
||||||
case 0x11: ret = "Coding according to ISO/IEC 10646"; break;
|
|
||||||
case 0x12: ret = "Coding according to KSC 5601"; break;
|
|
||||||
default: ret = "Unknown coding"; break;
|
|
||||||
}
|
|
||||||
strncpy((char *)dst, ret, max);
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** returns true if this EIT covers a
|
/** returns true if this EIT covers a
|
||||||
present/following information, false if it's
|
present/following information, false if it's
|
||||||
schedule information */
|
schedule information */
|
||||||
@ -966,136 +715,6 @@ bool cEIT::IsPresentFollowing()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
bool cEIT::WriteShortEventDescriptor(unsigned short service, eit_loop_t *eitloop, u_char *buf)
|
|
||||||
{
|
|
||||||
u_char tmp[256];
|
|
||||||
eit_short_event_t *evt = (eit_short_event_t *)buf;
|
|
||||||
unsigned short eventid = (unsigned short)((eitloop->event_id_hi << 8) | eitloop->event_id_lo);
|
|
||||||
cEventInfo *pEvent;
|
|
||||||
|
|
||||||
//isyslog(LOG_INFO, "Found Short Event Descriptor");
|
|
||||||
|
|
||||||
cSchedule *pSchedule = (cSchedule *)schedules->GetSchedule(service);
|
|
||||||
if (pSchedule == NULL)
|
|
||||||
{
|
|
||||||
schedules->Add(new cSchedule(service));
|
|
||||||
pSchedule = (cSchedule *)schedules->GetSchedule(service);
|
|
||||||
if (pSchedule == NULL)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cSchedule::GetPresentEvent() and cSchedule::GetFollowingEvent() verify
|
|
||||||
the temporal sanity of these events, so calling them here appears to
|
|
||||||
be a bad idea... (kls 2000-11-01)
|
|
||||||
//
|
|
||||||
// if we are working on a present/following info, let's see whether
|
|
||||||
// we already have present/following info for this service and if yes
|
|
||||||
// check whether it's the same eventid, if yes, just return, nothing
|
|
||||||
// left to do.
|
|
||||||
//
|
|
||||||
if (IsPresentFollowing())
|
|
||||||
{
|
|
||||||
if (eitloop->running_status == 4 || eitloop->running_status == 3)
|
|
||||||
pEvent = (cEventInfo *)pSchedule->GetPresentEvent();
|
|
||||||
else
|
|
||||||
pEvent = (cEventInfo *)pSchedule->GetFollowingEvent();
|
|
||||||
|
|
||||||
if (pEvent != NULL)
|
|
||||||
if (pEvent->GetEventID() == eventid)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//
|
|
||||||
// let's see whether we have that eventid already
|
|
||||||
// in case not, we have to create a new cEventInfo for it
|
|
||||||
//
|
|
||||||
pEvent = (cEventInfo *)pSchedule->GetEvent(eventid);
|
|
||||||
if (pEvent == NULL)
|
|
||||||
{
|
|
||||||
pSchedule->Events.Add(new cEventInfo(service, eventid));
|
|
||||||
pEvent = (cEventInfo *)pSchedule->GetEvent(eventid);
|
|
||||||
if (pEvent == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
strdvbcpy(tmp, &buf[sizeof(eit_short_event_t)], evt->event_name_length);
|
|
||||||
pEvent->SetTitle((char *)tmp);
|
|
||||||
strdvbcpy(tmp, &buf[sizeof(eit_short_event_t) + evt->event_name_length + 1],
|
|
||||||
(int)buf[sizeof(eit_short_event_t) + evt->event_name_length]);
|
|
||||||
pEvent->SetSubtitle((char *)tmp);
|
|
||||||
cMJD mjd(eitloop->date_hi, eitloop->date_lo,
|
|
||||||
eitloop->time_hour_ten * 10 + eitloop->time_hour,
|
|
||||||
eitloop->time_minute_ten * 10 + eitloop->time_minute,
|
|
||||||
eitloop->time_second_ten * 10 + eitloop->time_second);
|
|
||||||
pEvent->SetTime(mjd.GetTime_t());
|
|
||||||
pEvent->SetDuration((long)((long)((eitloop->dur_hour_ten * 10 + eitloop->dur_hour) * 60l * 60l) +
|
|
||||||
(long)((eitloop->dur_minute_ten * 10 + eitloop->dur_minute) * 60l) +
|
|
||||||
(long)(eitloop->dur_second_ten * 10 + eitloop->dur_second)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsPresentFollowing())
|
|
||||||
{
|
|
||||||
if (eitloop->running_status == 4 || eitloop->running_status == 3)
|
|
||||||
pSchedule->SetPresentEvent(pEvent);
|
|
||||||
else if (eitloop->running_status == 1 || eitloop->running_status == 2 || eitloop->running_status == 0)
|
|
||||||
pSchedule->SetFollowingEvent(pEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** */
|
|
||||||
bool cEIT::WriteExtEventDescriptor(unsigned short service, eit_loop_t *eitloop, u_char *buf)
|
|
||||||
{
|
|
||||||
u_char tmp[256];
|
|
||||||
eit_extended_event_t *evt = (eit_extended_event_t *)buf;
|
|
||||||
int bufact, buflen;
|
|
||||||
unsigned short eventid = (unsigned short)((eitloop->event_id_hi << 8) | eitloop->event_id_lo);
|
|
||||||
cEventInfo *pEvent;
|
|
||||||
|
|
||||||
//isyslog(LOG_INFO, "Found Extended Event Descriptor");
|
|
||||||
|
|
||||||
cSchedule *pSchedule = (cSchedule *)schedules->GetSchedule(service);
|
|
||||||
if (pSchedule == NULL)
|
|
||||||
{
|
|
||||||
schedules->Add(new cSchedule(service));
|
|
||||||
pSchedule = (cSchedule *)schedules->GetSchedule(service);
|
|
||||||
if (pSchedule == NULL)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
pEvent = (cEventInfo *)pSchedule->GetEvent(eventid);
|
|
||||||
if (pEvent == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (evt->descriptor_number != pEvent->GetExtendedDescriptorNumber())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
bufact = sizeof(eit_extended_event_t);
|
|
||||||
buflen = buf[1] + 2;
|
|
||||||
|
|
||||||
if (evt->length_of_items > 0)
|
|
||||||
{
|
|
||||||
while (bufact - sizeof(eit_extended_event_t) < evt->length_of_items)
|
|
||||||
{
|
|
||||||
strdvbcpy(tmp, &buf[bufact + 1], (int)buf[bufact]);
|
|
||||||
// could use value in tmp now to do something,
|
|
||||||
// haven't seen any items as of yet transmitted from satellite
|
|
||||||
bufact += (buf[bufact] + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
strdvbcpy(tmp, &buf[bufact + 1], (int)buf[bufact]);
|
|
||||||
if (pEvent->AddExtendedDescription((char *)tmp))
|
|
||||||
{
|
|
||||||
pEvent->IncreaseExtendedDescriptorNumber();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cSIProcessor ----------------------------------------------------------
|
// --- cSIProcessor ----------------------------------------------------------
|
||||||
|
|
||||||
#define MAX_FILTERS 20
|
#define MAX_FILTERS 20
|
||||||
@ -1262,7 +881,7 @@ void cSIProcessor::Action()
|
|||||||
|
|
||||||
schedulesMutex.Lock();
|
schedulesMutex.Lock();
|
||||||
cEIT ceit(buf, seclen, schedules);
|
cEIT ceit(buf, seclen, schedules);
|
||||||
ceit.ProcessEIT();
|
ceit.ProcessEIT(buf);
|
||||||
schedulesMutex.Unlock();
|
schedulesMutex.Unlock();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
11
eit.h
11
eit.h
@ -4,6 +4,9 @@
|
|||||||
begin : Fri Aug 25 2000
|
begin : Fri Aug 25 2000
|
||||||
copyright : (C) 2000 by Robert Schneider
|
copyright : (C) 2000 by Robert Schneider
|
||||||
email : Robert.Schneider@web.de
|
email : Robert.Schneider@web.de
|
||||||
|
|
||||||
|
2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de>
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -13,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: eit.h 1.8 2001/08/11 09:06:17 kls Exp $
|
* $Id: eit.h 1.9 2001/08/15 13:10:28 kls Exp $
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef __EIT_H
|
#ifndef __EIT_H
|
||||||
@ -40,13 +43,13 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
void SetFollowing(bool foll);
|
void SetFollowing(bool foll);
|
||||||
void SetPresent(bool pres);
|
void SetPresent(bool pres);
|
||||||
bool SetTitle(char *string);
|
bool SetTitle(const char *string);
|
||||||
void SetServiceID(unsigned short servid);
|
void SetServiceID(unsigned short servid);
|
||||||
void SetEventID(unsigned short evid);
|
void SetEventID(unsigned short evid);
|
||||||
void SetDuration(long l);
|
void SetDuration(long l);
|
||||||
void SetTime(time_t t);
|
void SetTime(time_t t);
|
||||||
bool AddExtendedDescription(char *string);
|
bool AddExtendedDescription(const char *string);
|
||||||
bool SetSubtitle(char *string);
|
bool SetSubtitle(const char *string);
|
||||||
void IncreaseExtendedDescriptorNumber(void);
|
void IncreaseExtendedDescriptorNumber(void);
|
||||||
cEventInfo(unsigned short serviceid, unsigned short eventid);
|
cEventInfo(unsigned short serviceid, unsigned short eventid);
|
||||||
public:
|
public:
|
||||||
|
339
libdtv/COPYING
Normal file
339
libdtv/COPYING
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
73
libdtv/Makefile
Normal file
73
libdtv/Makefile
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
##############################################################
|
||||||
|
### ###
|
||||||
|
### Makefile: global makefile for libdtv ###
|
||||||
|
### ###
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
## $Revision: 1.3 $
|
||||||
|
## $Date: 2001/06/25 12:51:41 $
|
||||||
|
## $Author: hakenes $
|
||||||
|
##
|
||||||
|
## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
##
|
||||||
|
## libdtv 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.
|
||||||
|
##
|
||||||
|
## libdtv 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 libdtv; see the file COPYING. If not, write to the
|
||||||
|
## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
## Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# adapt this to your GNU make executable
|
||||||
|
#
|
||||||
|
MAKE = make
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = ru
|
||||||
|
RANLIB = ranlib
|
||||||
|
|
||||||
|
SUBDIRS = liblx libsi libvdr
|
||||||
|
|
||||||
|
all: newdist
|
||||||
|
|
||||||
|
new: clean newdist
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo "making all clean..."
|
||||||
|
@for i in $(SUBDIRS);\
|
||||||
|
do \
|
||||||
|
( echo $$i; cd $$i ;\
|
||||||
|
$(MAKE) clean ) ;\
|
||||||
|
done
|
||||||
|
@rm -rf lib include libdtv.*
|
||||||
|
|
||||||
|
newdist:
|
||||||
|
@mkdir -p include lib
|
||||||
|
@echo "making all distributions..."
|
||||||
|
@for i in $(SUBDIRS) ;\
|
||||||
|
do \
|
||||||
|
( cd $$i ;\
|
||||||
|
$(MAKE) new dist ) ;\
|
||||||
|
done
|
||||||
|
@echo "making libdtv.a/libdtv.h..."
|
||||||
|
@cat include/* > libdtv.h
|
||||||
|
@mkdir -p tmp
|
||||||
|
@for i in $(SUBDIRS) ;\
|
||||||
|
do \
|
||||||
|
( cd tmp;\
|
||||||
|
$(AR) x ../lib/$$i.a;\
|
||||||
|
$(AR) $(ARFLAGS) ../libdtv.a *;\
|
||||||
|
rm -f *) ;\
|
||||||
|
done
|
||||||
|
@rm -rf lib include tmp
|
27
libdtv/README
Normal file
27
libdtv/README
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
DTV System Information Library
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This is intended to support the VDR application of Klaus Schmidinger with
|
||||||
|
extended EIT support, mainly on NVOD channels.
|
||||||
|
Bug reports and suggestions are very appreciated and should be sent to
|
||||||
|
hakenes@hippomi.de
|
||||||
|
|
||||||
|
Have fun,
|
||||||
|
|
||||||
|
(C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
|
||||||
|
libdtv 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.
|
||||||
|
|
||||||
|
libdtv 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 libdtv; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
|
339
libdtv/liblx/COPYING
Normal file
339
libdtv/liblx/COPYING
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
62
libdtv/liblx/Makefile
Normal file
62
libdtv/liblx/Makefile
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
##############################################################
|
||||||
|
### ###
|
||||||
|
### Makefile: local makefile for liblx ###
|
||||||
|
### ###
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
## $Revision: 1.2 $
|
||||||
|
## $Date: 2001/06/25 19:39:00 $
|
||||||
|
## $Author: hakenes $
|
||||||
|
##
|
||||||
|
## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
##
|
||||||
|
## dtv_scan 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.
|
||||||
|
##
|
||||||
|
## dtv_scan 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 dtv_scan; see the file COPYING. If not, write to the
|
||||||
|
## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
## Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2 -g -pedantic -Wmissing-prototypes -Wstrict-prototypes \
|
||||||
|
-Wimplicit -D__USE_FIXED_PROTOTYPES__ # -DDEBUG
|
||||||
|
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = r
|
||||||
|
RANLIB = ranlib
|
||||||
|
RM = rm -f
|
||||||
|
CP = cp
|
||||||
|
|
||||||
|
LXINCLUDE = liblx.h
|
||||||
|
LXLIB = liblx.a
|
||||||
|
LXOBJS = xMemMgt.o xListFuncs.o
|
||||||
|
|
||||||
|
all : $(LXLIB)
|
||||||
|
|
||||||
|
clean :
|
||||||
|
@echo "cleaning workspace..."
|
||||||
|
@$(RM) $(LXOBJS) $(LXLIB)
|
||||||
|
|
||||||
|
new : clean all
|
||||||
|
|
||||||
|
$(LXLIB) : $(LXOBJS)
|
||||||
|
@echo "updating library..."
|
||||||
|
@$(AR) $(ARFLAGS) $(LXLIB) $(LXOBJS)
|
||||||
|
@$(RANLIB) $(LXLIB)
|
||||||
|
|
||||||
|
dist: all
|
||||||
|
@echo "distributing liblx.a and liblx.h..."
|
||||||
|
@$(CP) $(LXLIB) ../lib
|
||||||
|
@$(CP) $(LXINCLUDE) ../include
|
||||||
|
|
448
libdtv/liblx/liblx.h
Normal file
448
libdtv/liblx/liblx.h
Normal file
@ -0,0 +1,448 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// liblx.h: definitions necessary for the liblx package ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.2 $
|
||||||
|
// $Date: 2001/06/25 19:39:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// liblx 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.
|
||||||
|
//
|
||||||
|
// liblx 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 liblx; see the file COPYING. If not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
#ifndef LIBLX_H
|
||||||
|
#define LIBLX_H
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* list support structures
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct NODE
|
||||||
|
{
|
||||||
|
struct NODE *Succ;
|
||||||
|
struct NODE *Pred;
|
||||||
|
char *Name;
|
||||||
|
unsigned short HashKey;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIST
|
||||||
|
{
|
||||||
|
struct NODE *Head;
|
||||||
|
struct NODE *Tail;
|
||||||
|
char *Name;
|
||||||
|
unsigned long Size;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* memory managment structures
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct MEM_ENTRY
|
||||||
|
{
|
||||||
|
struct MEM_ENTRY *Succ;
|
||||||
|
struct MEM_ENTRY *Pred;
|
||||||
|
unsigned long Size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MEM_CHUNK
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *Succ;
|
||||||
|
struct MEM_CHUNK *Pred;
|
||||||
|
unsigned long Size;
|
||||||
|
struct MEM_ENTRY *FirstFreeMemEntry;
|
||||||
|
struct MEM_ENTRY *FirstUsedMemEntry;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* list functions (package xList)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
unsigned short xHashKey (char *);
|
||||||
|
struct LIST *xNewList (char *);
|
||||||
|
struct NODE *xNewNode (char *, unsigned long);
|
||||||
|
struct NODE *xFindName (struct LIST *, char *);
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* memory management
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void xMemAllo (unsigned long, unsigned char **);
|
||||||
|
void xMemFre (unsigned char *);
|
||||||
|
void xMemFreeAll (struct MEM_CHUNK **);
|
||||||
|
void xMemMerge (struct MEM_CHUNK **);
|
||||||
|
struct MEM_CHUNK **xGetRemember (void);
|
||||||
|
void xSetRemember (struct MEM_CHUNK **);
|
||||||
|
void xPrintMemList (struct MEM_CHUNK **);
|
||||||
|
unsigned long xGetMemSize (struct MEM_CHUNK **);
|
||||||
|
extern unsigned long xAllocatedMemory;
|
||||||
|
char *xSetText (char *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define MEM_CHUNK_SIZE 65536
|
||||||
|
|
||||||
|
#define xMemAlloc(size, ptr) \
|
||||||
|
xMemAllo (((unsigned long)((size))), ((unsigned char **)((ptr))))
|
||||||
|
#define xMemFree(ptr) xMemFre (((unsigned char *)((ptr))))
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* list support macros
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xCreateNode (NodeStruct,Name) allocates a correctly sized and |
|
||||||
|
| typed node struct. |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xCreateNode(NodeStruct,Name) \
|
||||||
|
(NodeStruct) = (void *) xNewNode(Name, sizeof(*(NodeStruct)))
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xSize (List) scans for the ->Size field of a list struct |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xSize(List) ((List) ? ((struct LIST *)(List))->Size : 0)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xName (NodeStruct) scans for the ->Node.Name of a node struct |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xName(NodeStruct) (((struct NODE *)(NodeStruct))->Name)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xSucc (NodeStruct) scans for the ->Node.Succ of a node struct |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xSucc(NodeStruct) (((struct NODE *)(NodeStruct))->Succ)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xPred (NodeStruct) scans for the ->Node.Pred of a node struct |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xPred(NodeStruct) (((struct NODE *)(NodeStruct))->Pred)
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xForeach(List,NodeStruct) builds a loop to process each list |
|
||||||
|
| element. |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xForeach(List,NodeStruct) \
|
||||||
|
if (List) for ((NodeStruct) = (void *) ((struct LIST *)(List))->Head; \
|
||||||
|
(NodeStruct); (NodeStruct) = (void *) xSucc (NodeStruct))
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xForeachReverse(List,NodeStruct) builds a loop to process each |
|
||||||
|
| element in reverse order. |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xForeachReverse(List,NodeStruct) \
|
||||||
|
if (List) for ((NodeStruct) = (void *) ((struct LIST *)(List))->Tail; \
|
||||||
|
NodeStruct; (NodeStruct) = (void *) xPred (NodeStruct))
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*
|
||||||
|
| |
|
||||||
|
| xRemove(List,NodeStruct) unchains a node struct out of a list. |
|
||||||
|
| |
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
#define xRemove(List,NodeStruct) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
struct LIST *TmpList; \
|
||||||
|
\
|
||||||
|
TmpNode = ((struct NODE *)(NodeStruct)); \
|
||||||
|
TmpList = ((struct LIST *)(List)); \
|
||||||
|
\
|
||||||
|
if (TmpNode->Pred) \
|
||||||
|
(TmpNode->Pred)->Succ = TmpNode->Succ; \
|
||||||
|
else TmpList->Head = TmpNode->Succ; \
|
||||||
|
if (TmpNode->Succ) \
|
||||||
|
(TmpNode->Succ)->Pred = TmpNode->Pred; \
|
||||||
|
else TmpList->Tail = TmpNode->Pred; \
|
||||||
|
TmpList->Size --; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xAddHead *
|
||||||
|
* *
|
||||||
|
* arguments : List - pointer to a LIST structure *
|
||||||
|
* *
|
||||||
|
* Node - pointer to a NODE structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xAddHead() inserts 'Node' at the head of 'List'. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
#define xAddHead(List, NodeStruct) \
|
||||||
|
do { \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
struct LIST *TmpList; \
|
||||||
|
\
|
||||||
|
TmpNode = ((struct NODE *)(NodeStruct)); \
|
||||||
|
TmpList = ((struct LIST *)(List)); \
|
||||||
|
\
|
||||||
|
if (TmpList->Head) { \
|
||||||
|
TmpNode->Pred = NULL; \
|
||||||
|
TmpNode->Succ = TmpList->Head; \
|
||||||
|
(TmpList->Head)->Pred = TmpNode; \
|
||||||
|
TmpList->Head = TmpNode; } \
|
||||||
|
else { \
|
||||||
|
TmpList->Head = TmpNode; \
|
||||||
|
TmpList->Tail = TmpNode; \
|
||||||
|
TmpNode->Pred = NULL; \
|
||||||
|
TmpNode->Succ = NULL; } \
|
||||||
|
TmpList->Size++; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xAddTail *
|
||||||
|
* *
|
||||||
|
* arguments : List - pointer to a LIST structure *
|
||||||
|
* *
|
||||||
|
* Node - pointer to a NODE structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xAddTail() inserts 'Node' at the tail of 'List'. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
#define xAddTail(List, NodeStruct) \
|
||||||
|
do { \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
struct LIST *TmpList; \
|
||||||
|
\
|
||||||
|
TmpNode = ((struct NODE *)(NodeStruct)); \
|
||||||
|
TmpList = ((struct LIST *)(List)); \
|
||||||
|
\
|
||||||
|
if (TmpList->Head) { \
|
||||||
|
TmpNode->Succ = NULL; \
|
||||||
|
TmpNode->Pred = TmpList->Tail; \
|
||||||
|
(TmpList->Tail)->Succ = TmpNode; \
|
||||||
|
TmpList->Tail = TmpNode; } \
|
||||||
|
else { \
|
||||||
|
TmpList->Head = TmpNode; \
|
||||||
|
TmpList->Tail = TmpNode; \
|
||||||
|
TmpNode->Pred = NULL; \
|
||||||
|
TmpNode->Succ = NULL; } \
|
||||||
|
TmpList->Size++; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xRemHead *
|
||||||
|
* *
|
||||||
|
* arguments : List - pointer to a LIST structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xRemHead() removes a Node from head of 'List'. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
#define xRemHead(List) \
|
||||||
|
do { \
|
||||||
|
struct LIST *TmpList; \
|
||||||
|
\
|
||||||
|
TmpList = ((struct LIST *)(List)); \
|
||||||
|
\
|
||||||
|
if (TmpList->Head) \
|
||||||
|
{ \
|
||||||
|
TmpList->Head = (TmpList->Head)->Succ; \
|
||||||
|
if (TmpList->Head) (TmpList->Head)->Pred = NULL; \
|
||||||
|
else TmpList->Tail = NULL; \
|
||||||
|
TmpList->Size--; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xRemTail *
|
||||||
|
* *
|
||||||
|
* arguments : List - pointer to a LIST structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xRemTail() removes a Node from the tail of 'List'. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
#define xRemTail(List) \
|
||||||
|
do { \
|
||||||
|
struct LIST *TmpList; \
|
||||||
|
\
|
||||||
|
TmpList = ((struct LIST *)(List)); \
|
||||||
|
\
|
||||||
|
if (TmpList->Tail) \
|
||||||
|
{ \
|
||||||
|
TmpList->Tail = (TmpList->Tail)->Pred; \
|
||||||
|
if (TmpList->Tail) (TmpList->Tail)->Succ = NULL; \
|
||||||
|
else TmpList->Head = NULL; \
|
||||||
|
TmpList->Size--; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xConCat *
|
||||||
|
* *
|
||||||
|
* arguments : DestinationList - pointer to the destination *
|
||||||
|
* LIST structure *
|
||||||
|
* *
|
||||||
|
* SourceList - pointer to the source LIST structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xConCat() concats 'SourceList' with 'DestinationList' and clears *
|
||||||
|
* 'SourceList'. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
#define xConCat(DestinationList, SourceList) \
|
||||||
|
do { \
|
||||||
|
struct LIST *SrcList; \
|
||||||
|
struct LIST *DstList; \
|
||||||
|
\
|
||||||
|
SrcList = ((struct LIST *)(SourceList)); \
|
||||||
|
DstList = ((struct LIST *)(DestinationList)); \
|
||||||
|
\
|
||||||
|
if (DstList && SrcList) \
|
||||||
|
{ \
|
||||||
|
if (DstList->Head) { \
|
||||||
|
if (SrcList->Head) { \
|
||||||
|
(DstList->Tail)->Succ = SrcList->Head; \
|
||||||
|
(SrcList->Head)->Pred = DstList->Tail; \
|
||||||
|
DstList->Tail = SrcList->Tail; \
|
||||||
|
DstList->Size += SrcList->Size; \
|
||||||
|
SrcList->Size = 0; \
|
||||||
|
SrcList->Head = NULL; \
|
||||||
|
SrcList->Tail = NULL; } } \
|
||||||
|
else { \
|
||||||
|
DstList->Head = SrcList->Head; \
|
||||||
|
DstList->Tail = SrcList->Tail; \
|
||||||
|
DstList->Size += SrcList->Size; \
|
||||||
|
SrcList->Size = 0; \
|
||||||
|
SrcList->Head = NULL; \
|
||||||
|
SrcList->Tail = NULL; } \
|
||||||
|
} \
|
||||||
|
else if (SrcList) ((struct LIST *)(DestinationList)) = SrcList; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define xJoinList(SourceList, DestinationList, NodeStruct) \
|
||||||
|
do { \
|
||||||
|
struct NODE *KeyNode; \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
struct LIST *SrcList; \
|
||||||
|
struct LIST *DstList; \
|
||||||
|
\
|
||||||
|
KeyNode = ((struct NODE *)(NodeStruct)); \
|
||||||
|
SrcList = ((struct LIST *)(SourceList)); \
|
||||||
|
DstList = ((struct LIST *)(DestinationList)); \
|
||||||
|
\
|
||||||
|
if (SrcList->Head) \
|
||||||
|
{ \
|
||||||
|
TmpNode = KeyNode->Succ; \
|
||||||
|
KeyNode->Succ = SrcList->Head; \
|
||||||
|
SrcList->Tail->Succ = TmpNode; \
|
||||||
|
SrcList->Head->Pred = KeyNode; \
|
||||||
|
if (!TmpNode) DstList->Tail = SrcList->Tail; \
|
||||||
|
else TmpNode->Pred = SrcList->Tail; \
|
||||||
|
DstList->Size += SrcList->Size; \
|
||||||
|
SrcList->Size = 0; \
|
||||||
|
SrcList->Head = NULL; \
|
||||||
|
SrcList->Tail = NULL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define xJoin(SourceNode, DestinationList, NodeStruct) \
|
||||||
|
do { \
|
||||||
|
struct NODE *KeyNode; \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
struct NODE *SrcNode; \
|
||||||
|
struct LIST *DstList; \
|
||||||
|
\
|
||||||
|
KeyNode = ((struct NODE *)(NodeStruct)); \
|
||||||
|
SrcNode = ((struct NODE *)(SourceNode)); \
|
||||||
|
DstList = ((struct LIST *)(DestinationList)); \
|
||||||
|
\
|
||||||
|
if (SrcNode) \
|
||||||
|
{ \
|
||||||
|
TmpNode = KeyNode->Succ; \
|
||||||
|
KeyNode->Succ = SrcNode; \
|
||||||
|
SrcNode->Succ = TmpNode; \
|
||||||
|
SrcNode->Pred = KeyNode; \
|
||||||
|
if (!TmpNode) DstList->Tail = SrcNode; \
|
||||||
|
else TmpNode->Pred = SrcNode; \
|
||||||
|
DstList->Size += 1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define xClearList(SrcList) \
|
||||||
|
do { \
|
||||||
|
(SrcList)->Size = 0; \
|
||||||
|
(SrcList)->Head = NULL; \
|
||||||
|
(SrcList)->Tail = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define xSetName(nodestruct, name) \
|
||||||
|
do { \
|
||||||
|
struct NODE *TmpNode; \
|
||||||
|
\
|
||||||
|
TmpNode = (struct NODE *) (nodestruct); \
|
||||||
|
\
|
||||||
|
TmpNode->Name = xSetText (name); \
|
||||||
|
TmpNode->HashKey = xHashKey (name); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
187
libdtv/liblx/xListFuncs.c
Normal file
187
libdtv/liblx/xListFuncs.c
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// xListFuncs.c: list handling functions of liblx ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.1 $
|
||||||
|
// $Date: 2001/06/25 12:29:47 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// liblx 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.
|
||||||
|
//
|
||||||
|
// liblx 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 liblx; see the file COPYING. If not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
#include "liblx.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xHashKey *
|
||||||
|
* *
|
||||||
|
* arguments : Name - character pointer *
|
||||||
|
* *
|
||||||
|
* return : 16 Bit CRC checksum as hashkey *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
unsigned short xHashKey (Name)
|
||||||
|
|
||||||
|
char *Name;
|
||||||
|
{
|
||||||
|
unsigned short Key = 0;
|
||||||
|
unsigned long Value;
|
||||||
|
char *Ptr;
|
||||||
|
|
||||||
|
if (!Name) return (0);
|
||||||
|
|
||||||
|
for (Ptr = Name; *Ptr; Ptr++) {
|
||||||
|
Value = ((Key >> 8) ^ (*Ptr)) & 0xFF;
|
||||||
|
Value = Value ^ (Value >> 4);
|
||||||
|
Key = 0xFFFF & ((Key << 8) ^ Value ^ (Value << 5) ^ (Value << 12));
|
||||||
|
}
|
||||||
|
return (Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xNewNode *
|
||||||
|
* *
|
||||||
|
* arguments : Name - character pointer to the node's name *
|
||||||
|
* *
|
||||||
|
* Size - size of the surrounding structure in bytes *
|
||||||
|
* *
|
||||||
|
* return : pointer to a correct initialized NODE structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xNewNode() allocates memory for a NODE structure and initializes *
|
||||||
|
* it properly. If argument Name points to a string, it copies that *
|
||||||
|
* into a new allocated memory area and assigns Node->Name to it. *
|
||||||
|
* Because NODE's are often part of bigger structures, the size of *
|
||||||
|
* the surrounding structure could be specified to allocate it. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
struct NODE *xNewNode (Name, Size)
|
||||||
|
|
||||||
|
char *Name;
|
||||||
|
unsigned long Size;
|
||||||
|
{
|
||||||
|
struct NODE *Node;
|
||||||
|
|
||||||
|
if (Size < sizeof(struct NODE)) Size = sizeof(struct NODE);
|
||||||
|
|
||||||
|
xMemAlloc (Size, &Node);
|
||||||
|
|
||||||
|
Node->Succ = NULL;
|
||||||
|
Node->Pred = NULL;
|
||||||
|
|
||||||
|
if (Name == NULL)
|
||||||
|
{
|
||||||
|
Node->Name = NULL;
|
||||||
|
Node->HashKey = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xMemAlloc (strlen (Name) + 1, &(Node->Name));
|
||||||
|
strcpy (Node->Name, Name);
|
||||||
|
Node->HashKey = xHashKey (Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Node);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xNewList *
|
||||||
|
* *
|
||||||
|
* arguments : Name - character pointer to the list's name *
|
||||||
|
* *
|
||||||
|
* return : pointer to a correct initialized LIST structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xNewList() allocates memory for a LIST structure and initializes *
|
||||||
|
* it properly. If argument Name points to a string, it copies that *
|
||||||
|
* into a new allocated memory area and assigns List->Name to it. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
struct LIST *xNewList (Name)
|
||||||
|
|
||||||
|
char *Name;
|
||||||
|
{
|
||||||
|
struct LIST *List;
|
||||||
|
|
||||||
|
xMemAlloc (sizeof(struct LIST), &List);
|
||||||
|
|
||||||
|
List->Head = NULL;
|
||||||
|
List->Tail = NULL;
|
||||||
|
List->Size = 0;
|
||||||
|
|
||||||
|
if (Name == NULL)
|
||||||
|
{
|
||||||
|
List->Name = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xMemAlloc (strlen (Name) + 1, &(List->Name));
|
||||||
|
strcpy (List->Name, Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (List);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xFindName *
|
||||||
|
* *
|
||||||
|
* arguments : List - pointer to a LIST structure *
|
||||||
|
* *
|
||||||
|
* Name - pointer to a name string *
|
||||||
|
* *
|
||||||
|
* return : pointer to a NODE structure *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xFindName() looks for element with name 'Name' in list 'List' and *
|
||||||
|
* returns its NODE structure. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
struct NODE *xFindName (List, Name)
|
||||||
|
|
||||||
|
struct LIST *List;
|
||||||
|
char *Name;
|
||||||
|
{
|
||||||
|
struct NODE *Node;
|
||||||
|
unsigned short HashKey;
|
||||||
|
|
||||||
|
if (!Name || !List) return (NULL);
|
||||||
|
|
||||||
|
HashKey = xHashKey (Name);
|
||||||
|
|
||||||
|
for (Node = List->Head; Node; Node = Node->Succ)
|
||||||
|
if (HashKey == Node->HashKey)
|
||||||
|
if (Node->Name)
|
||||||
|
if (strcmp (Node->Name, Name) == 0) return (Node);
|
||||||
|
|
||||||
|
return (NULL);
|
||||||
|
}
|
621
libdtv/liblx/xMemMgt.c
Normal file
621
libdtv/liblx/xMemMgt.c
Normal file
@ -0,0 +1,621 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// xMemMgt.c: memory management functions of liblx ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.1 $
|
||||||
|
// $Date: 2001/06/25 12:29:47 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// liblx 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.
|
||||||
|
//
|
||||||
|
// liblx 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 liblx; 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 <malloc.h>
|
||||||
|
|
||||||
|
#include "liblx.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void logPrintf(int, char *, ...);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct MEM_CHUNK *xRememberKey = NULL;
|
||||||
|
|
||||||
|
static struct MEM_CHUNK **xRememberPtr = &xRememberKey;
|
||||||
|
|
||||||
|
unsigned long xAllocatedMemory = 0;
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xMemAlloc *
|
||||||
|
* *
|
||||||
|
* parameter : Size - size of the requested memory area *
|
||||||
|
* *
|
||||||
|
* DataPointer - pointer to data pointer *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xMemAlloc() is a clustered, remembering memory management routine. *
|
||||||
|
* It uses its own tables for free and used memory blocks on private *
|
||||||
|
* memory area. With xMemFree(), you can free this memory likewise *
|
||||||
|
* the C free() routine, with xMemFreeAll() all memory at once. *
|
||||||
|
* By changing the current remember key with xSetRemember() you can *
|
||||||
|
* define a local memory area, which can be freed by only one call of *
|
||||||
|
* xMemFreeAll() (see xSetRemember() / xGetRemember()). *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
void xMemAllo (Size, DataPointer)
|
||||||
|
|
||||||
|
unsigned long Size;
|
||||||
|
unsigned char **DataPointer;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk, *MemChunkPred;
|
||||||
|
struct MEM_ENTRY *MemEntry, *MemEntryPred;
|
||||||
|
long int NewSize;
|
||||||
|
unsigned short FoundFlag;
|
||||||
|
#ifdef DEBUG
|
||||||
|
unsigned char *ptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (Size % 4) Size++;
|
||||||
|
|
||||||
|
if (Size > (MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) -
|
||||||
|
sizeof(struct MEM_ENTRY)))
|
||||||
|
{
|
||||||
|
NewSize = Size + sizeof(struct MEM_CHUNK) + sizeof(struct MEM_ENTRY);
|
||||||
|
|
||||||
|
if (MemChunk = (*xRememberPtr))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
MemChunkPred = MemChunk;
|
||||||
|
} while (MemChunk = MemChunk->Succ);
|
||||||
|
}
|
||||||
|
else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr);
|
||||||
|
|
||||||
|
MemChunk = MemChunkPred->Succ = (struct MEM_CHUNK *) malloc (NewSize);
|
||||||
|
xAllocatedMemory += NewSize;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *)
|
||||||
|
(MemChunk) + NewSize; ptr++)
|
||||||
|
*ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!MemChunk)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
logPrintf (0, "Not enough memory...\r\n");
|
||||||
|
#endif
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MemChunk->Size = NewSize;
|
||||||
|
MemChunk->Pred = MemChunkPred;
|
||||||
|
MemChunk->Succ = NULL;
|
||||||
|
MemChunk->FirstFreeMemEntry = NULL;
|
||||||
|
MemChunk->FirstUsedMemEntry =
|
||||||
|
MemEntry = (struct MEM_ENTRY *) ((unsigned char *)MemChunk +
|
||||||
|
sizeof(struct MEM_CHUNK));
|
||||||
|
|
||||||
|
MemEntry->Size = Size;
|
||||||
|
MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry;
|
||||||
|
MemEntry->Succ = NULL;
|
||||||
|
|
||||||
|
*DataPointer = (unsigned char *) ((unsigned char *)MemEntry +
|
||||||
|
sizeof(struct MEM_ENTRY));
|
||||||
|
#ifdef DEBUG_CALLS
|
||||||
|
logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MemEntry = NULL;
|
||||||
|
FoundFlag = 0;
|
||||||
|
|
||||||
|
if (MemChunk = (*xRememberPtr))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (MemEntry = MemChunk->FirstFreeMemEntry)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (Size <= MemEntry->Size) FoundFlag = 1;
|
||||||
|
} while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ));
|
||||||
|
MemChunkPred = MemChunk;
|
||||||
|
} while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ));
|
||||||
|
}
|
||||||
|
else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr);
|
||||||
|
|
||||||
|
if (!MemEntry)
|
||||||
|
{
|
||||||
|
MemChunk = MemChunkPred->Succ =
|
||||||
|
(struct MEM_CHUNK *) malloc (MEM_CHUNK_SIZE);
|
||||||
|
xAllocatedMemory += MEM_CHUNK_SIZE;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *)
|
||||||
|
(MemChunk) + MEM_CHUNK_SIZE; ptr++)
|
||||||
|
*ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!MemChunk)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
logPrintf (0, "Not enough memory...\r\n");
|
||||||
|
#endif
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MemChunk->Size = MEM_CHUNK_SIZE;
|
||||||
|
MemChunk->Pred = MemChunkPred;
|
||||||
|
MemChunk->Succ = NULL;
|
||||||
|
MemChunk->FirstUsedMemEntry = NULL;
|
||||||
|
MemChunk->FirstFreeMemEntry =
|
||||||
|
MemEntry = (struct MEM_ENTRY *)
|
||||||
|
((unsigned char *)MemChunk + sizeof(struct MEM_CHUNK));
|
||||||
|
|
||||||
|
MemEntry->Size = MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) -
|
||||||
|
sizeof(struct MEM_ENTRY);
|
||||||
|
MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry;
|
||||||
|
MemEntry->Succ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
NewSize = MemEntry->Size - sizeof(struct MEM_ENTRY) - Size;
|
||||||
|
|
||||||
|
MemEntry->Size = Size;
|
||||||
|
*DataPointer = (unsigned char *)
|
||||||
|
((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ptr = *DataPointer; ptr < (unsigned char *)
|
||||||
|
(*DataPointer) + Size; ptr++)
|
||||||
|
{
|
||||||
|
if (((unsigned long )ptr)&1)
|
||||||
|
{ if (*ptr != 0x55)
|
||||||
|
logPrintf (0, "freed memory was used\r\n"); }
|
||||||
|
else { if (*ptr != 0xAA)
|
||||||
|
logPrintf (0, "freed memory was used\r\n"); }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (MemEntry->Succ)
|
||||||
|
((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred;
|
||||||
|
((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ;
|
||||||
|
|
||||||
|
if (MemChunk->FirstUsedMemEntry)
|
||||||
|
MemChunk->FirstUsedMemEntry->Pred = MemEntry;
|
||||||
|
MemEntry->Succ = MemChunk->FirstUsedMemEntry;
|
||||||
|
MemChunk->FirstUsedMemEntry = MemEntry;
|
||||||
|
MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry;
|
||||||
|
|
||||||
|
if (NewSize > 0)
|
||||||
|
{
|
||||||
|
MemEntry = (struct MEM_ENTRY *)
|
||||||
|
((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY) + Size);
|
||||||
|
MemEntry->Size = NewSize;
|
||||||
|
|
||||||
|
if (MemChunk->FirstFreeMemEntry)
|
||||||
|
MemChunk->FirstFreeMemEntry->Pred = MemEntry;
|
||||||
|
MemEntry->Succ = MemChunk->FirstFreeMemEntry;
|
||||||
|
MemChunk->FirstFreeMemEntry = MemEntry;
|
||||||
|
MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_CALLS
|
||||||
|
logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xMemFree *
|
||||||
|
* *
|
||||||
|
* parameter : DataPointer - data pointer *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xMemFree() frees with xMemAlloc() allocated memory. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
void xMemFre (DataPointer)
|
||||||
|
|
||||||
|
unsigned char *DataPointer;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk, *MemChunkPred;
|
||||||
|
struct MEM_ENTRY *MemEntry, *TempEntry, *PredEntry, *SuccEntry;
|
||||||
|
unsigned short FoundFlag;
|
||||||
|
#ifdef DEBUG
|
||||||
|
unsigned char *ptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!DataPointer)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MemEntry = NULL;
|
||||||
|
FoundFlag = 0;
|
||||||
|
|
||||||
|
if (MemChunk = (*xRememberPtr))
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (MemEntry = MemChunk->FirstUsedMemEntry)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (DataPointer == (unsigned char *) ((unsigned char *) MemEntry +
|
||||||
|
sizeof(struct MEM_ENTRY))) FoundFlag = 1;
|
||||||
|
} while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ));
|
||||||
|
} while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ));
|
||||||
|
|
||||||
|
if (FoundFlag == 1)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_CALLS
|
||||||
|
logPrintf (0, "xMemFree: %x, %d bytes\r\n", DataPointer, MemEntry->Size);
|
||||||
|
#endif
|
||||||
|
if (MemEntry->Succ)
|
||||||
|
((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred;
|
||||||
|
((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ;
|
||||||
|
|
||||||
|
if (!MemChunk->FirstUsedMemEntry)
|
||||||
|
{
|
||||||
|
if (MemChunk->Succ)
|
||||||
|
((struct MEM_CHUNK *)MemChunk->Succ)->Pred = MemChunk->Pred;
|
||||||
|
((struct MEM_CHUNK *)MemChunk->Pred)->Succ = MemChunk->Succ;
|
||||||
|
if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunk->Size;
|
||||||
|
free (MemChunk);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FoundFlag = 0;
|
||||||
|
PredEntry = NULL;
|
||||||
|
SuccEntry = NULL;
|
||||||
|
if (TempEntry = MemChunk->FirstFreeMemEntry)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((struct MEM_ENTRY *)((unsigned char *)TempEntry +
|
||||||
|
TempEntry->Size + sizeof(struct MEM_ENTRY)) == MemEntry)
|
||||||
|
{
|
||||||
|
FoundFlag ++;
|
||||||
|
PredEntry = TempEntry;
|
||||||
|
}
|
||||||
|
if ((struct MEM_ENTRY *)((unsigned char *)MemEntry +
|
||||||
|
MemEntry->Size + sizeof(struct MEM_ENTRY)) == TempEntry)
|
||||||
|
{
|
||||||
|
FoundFlag ++;
|
||||||
|
SuccEntry = TempEntry;
|
||||||
|
}
|
||||||
|
} while ((FoundFlag != 2) && (TempEntry = TempEntry->Succ));
|
||||||
|
|
||||||
|
if (PredEntry)
|
||||||
|
{
|
||||||
|
if (SuccEntry)
|
||||||
|
{
|
||||||
|
/* Vorgdnger + Nachfolger */
|
||||||
|
|
||||||
|
if (SuccEntry->Succ)
|
||||||
|
((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred;
|
||||||
|
((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ;
|
||||||
|
|
||||||
|
PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY) +
|
||||||
|
SuccEntry->Size + sizeof(struct MEM_ENTRY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* nur Vorgaenger */
|
||||||
|
|
||||||
|
PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY);
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ptr = (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY);
|
||||||
|
ptr < (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY) +
|
||||||
|
PredEntry->Size; ptr++)
|
||||||
|
*ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (SuccEntry)
|
||||||
|
{
|
||||||
|
/* nur Nachfolger */
|
||||||
|
|
||||||
|
if (SuccEntry->Succ)
|
||||||
|
((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred;
|
||||||
|
((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ;
|
||||||
|
|
||||||
|
MemEntry->Size += SuccEntry->Size + sizeof(struct MEM_ENTRY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MemChunk->FirstFreeMemEntry)
|
||||||
|
MemChunk->FirstFreeMemEntry->Pred = MemEntry;
|
||||||
|
MemEntry->Succ = MemChunk->FirstFreeMemEntry;
|
||||||
|
MemChunk->FirstFreeMemEntry = MemEntry;
|
||||||
|
MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry;
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ptr = (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY);
|
||||||
|
ptr < (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY) +
|
||||||
|
MemEntry->Size; ptr++)
|
||||||
|
*ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_CALLS
|
||||||
|
else
|
||||||
|
logPrintf (0, "xMemFree: tried to free unallocated data %x\r\n", DataPointer);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xMemFreeAll *
|
||||||
|
* *
|
||||||
|
* parameter : RememberPtr *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xMemFreeAll() frees all with xMemAlloc() allocated memory. If Re- *
|
||||||
|
* memberPtr is not NULL, the MEM_CHUNK structure from the specified *
|
||||||
|
* Address is freed, otherwise the natural MEM_CHUNK will be done. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
void xMemFreeAll (RememberPtr)
|
||||||
|
|
||||||
|
struct MEM_CHUNK **RememberPtr;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk, *MemChunkPred;
|
||||||
|
|
||||||
|
if (RememberPtr)
|
||||||
|
{
|
||||||
|
if (MemChunkPred = (*RememberPtr))
|
||||||
|
do
|
||||||
|
{
|
||||||
|
MemChunk = MemChunkPred->Succ;
|
||||||
|
if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size;
|
||||||
|
free (MemChunkPred);
|
||||||
|
} while (MemChunkPred = MemChunk);
|
||||||
|
*RememberPtr = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (MemChunkPred = (*xRememberPtr))
|
||||||
|
do
|
||||||
|
{
|
||||||
|
MemChunk = MemChunkPred->Succ;
|
||||||
|
if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size;
|
||||||
|
free (MemChunkPred);
|
||||||
|
} while (MemChunkPred = MemChunk);
|
||||||
|
*xRememberPtr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xMemMerge *
|
||||||
|
* *
|
||||||
|
* parameter : RememberPtr *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xMemMerge() merges the memory area pointed to by RememberKey with *
|
||||||
|
* the currently used in xRememberPtr. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
void xMemMerge (RememberPtr)
|
||||||
|
|
||||||
|
struct MEM_CHUNK **RememberPtr;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk, *MemChunkPred;
|
||||||
|
|
||||||
|
if (RememberPtr)
|
||||||
|
{
|
||||||
|
if (MemChunk = (*xRememberPtr))
|
||||||
|
{
|
||||||
|
while (MemChunk->Succ) MemChunk = MemChunk->Succ;
|
||||||
|
MemChunk->Succ = (*RememberPtr);
|
||||||
|
*RememberPtr = NULL;
|
||||||
|
}
|
||||||
|
else (*xRememberPtr = *RememberPtr);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xGetRemember *
|
||||||
|
* *
|
||||||
|
* parameter : none *
|
||||||
|
* *
|
||||||
|
* return : pointer to a MEM_CHUNK tree *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xGetRemember() returns the currently used MEM_CHUNK tree. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
struct MEM_CHUNK **xGetRemember ()
|
||||||
|
{
|
||||||
|
return (xRememberPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xSetRemember *
|
||||||
|
* *
|
||||||
|
* parameter : pointer to a MEM_CHUNK tree *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xSetRemember() redefines the currently used MEM_CHUNK pointer. If *
|
||||||
|
* RememberPtr is NULL, the natural MEM_CHUNK is reloaded. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
void xSetRemember (RememberPtr)
|
||||||
|
|
||||||
|
struct MEM_CHUNK **RememberPtr;
|
||||||
|
{
|
||||||
|
if (RememberPtr)
|
||||||
|
xRememberPtr = RememberPtr;
|
||||||
|
else
|
||||||
|
xRememberPtr = &xRememberKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xPrintMemList *
|
||||||
|
* *
|
||||||
|
* parameter : pointer to a MEM_CHUNK tree *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xPrintMemList() prints the currently allocated memory blocks of *
|
||||||
|
* the specified RememberPtr. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
void xPrintMemList (Remember)
|
||||||
|
|
||||||
|
struct MEM_CHUNK **Remember;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk;
|
||||||
|
struct MEM_ENTRY *MemEntry;
|
||||||
|
|
||||||
|
fprintf (stderr, "MemChunkPtr = %x\n", (int) Remember);
|
||||||
|
|
||||||
|
if (MemChunk = *Remember)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\tMemChunk at %x with Size %d\n", (int) MemChunk,
|
||||||
|
(int) MemChunk->Size);
|
||||||
|
|
||||||
|
if (MemEntry = MemChunk->FirstFreeMemEntry)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\t\tFree MemEntry at %x (%x) with Size %d\n",
|
||||||
|
(int) MemEntry, (int)((unsigned char *)MemEntry +
|
||||||
|
sizeof(struct MEM_ENTRY)), (int) MemEntry->Size);
|
||||||
|
|
||||||
|
} while (MemEntry = MemEntry->Succ);
|
||||||
|
|
||||||
|
if (MemEntry = MemChunk->FirstUsedMemEntry)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf (stderr, "\t\tUsed MemEntry at %x (%x) with Size %d\n",
|
||||||
|
(int) MemEntry, (int)((unsigned char *)MemEntry +
|
||||||
|
sizeof(struct MEM_ENTRY)), (int) MemEntry->Size);
|
||||||
|
|
||||||
|
} while (MemEntry = MemEntry->Succ);
|
||||||
|
|
||||||
|
} while (MemChunk = MemChunk->Succ);
|
||||||
|
else fprintf (stderr, "\tNo current MemChunk\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xGetMemSize *
|
||||||
|
* *
|
||||||
|
* parameter : pointer to a MEM_CHUNK tree *
|
||||||
|
* *
|
||||||
|
* return : none *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xGetMemSize() gets the size of the currently allocated memory *
|
||||||
|
* blocks of the specified (or natural if NULL) RememberPtr *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long xGetMemSize (RememberPtr)
|
||||||
|
|
||||||
|
struct MEM_CHUNK **RememberPtr;
|
||||||
|
{
|
||||||
|
struct MEM_CHUNK *MemChunk;
|
||||||
|
struct MEM_ENTRY *MemEntry;
|
||||||
|
unsigned long Result = 0;
|
||||||
|
|
||||||
|
if (RememberPtr) MemChunk = *RememberPtr;
|
||||||
|
else MemChunk = xRememberKey;
|
||||||
|
|
||||||
|
if (MemChunk)
|
||||||
|
do { Result += (unsigned long) MemChunk->Size; }
|
||||||
|
while (MemChunk = MemChunk->Succ);
|
||||||
|
|
||||||
|
return (Result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* *
|
||||||
|
* function : xSetText *
|
||||||
|
* *
|
||||||
|
* arguments : xText - pointer to a string *
|
||||||
|
* *
|
||||||
|
* return : pointer to an new allocated string *
|
||||||
|
* *
|
||||||
|
*-----------------------------------------------------------------------*
|
||||||
|
* *
|
||||||
|
* xSetText() allocates memory for the string pointed to by 'xText' *
|
||||||
|
* and duplicates it. *
|
||||||
|
* *
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
char *xSetText (xText)
|
||||||
|
|
||||||
|
char *xText;
|
||||||
|
{
|
||||||
|
char *NewText;
|
||||||
|
|
||||||
|
if (!xText) return (NULL);
|
||||||
|
|
||||||
|
xMemAlloc (strlen(xText) + 1, &NewText);
|
||||||
|
strcpy (NewText, xText);
|
||||||
|
|
||||||
|
return (NewText);
|
||||||
|
}
|
339
libdtv/libsi/COPYING
Normal file
339
libdtv/libsi/COPYING
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
83
libdtv/libsi/Makefile
Normal file
83
libdtv/libsi/Makefile
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
##############################################################
|
||||||
|
### ###
|
||||||
|
### Makefile: local makefile for libsi ###
|
||||||
|
### ###
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
## $Revision: 1.2 $
|
||||||
|
## $Date: 2001/06/25 19:39:00 $
|
||||||
|
## $Author: hakenes $
|
||||||
|
##
|
||||||
|
## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
##
|
||||||
|
## dtv_scan 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.
|
||||||
|
##
|
||||||
|
## dtv_scan 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 dtv_scan; see the file COPYING. If not, write to the
|
||||||
|
## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
## Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2 -g -Wmissing-prototypes -Wstrict-prototypes \
|
||||||
|
-DNAPI -Wimplicit -D__USE_FIXED_PROTOTYPES__ # -ansi -pedantic
|
||||||
|
|
||||||
|
INCDIRS = -Iinclude -I../include
|
||||||
|
DISTDIR = ../lib
|
||||||
|
DISTINCDIR = ../include
|
||||||
|
INCLUDES = include/libsi.h include/si_tables.h
|
||||||
|
MAKEDEPEND = gcc -M
|
||||||
|
|
||||||
|
LIBDIRS = -L. -L../lib
|
||||||
|
LIBS = -lsi -llx
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = ru
|
||||||
|
RANLIB = ranlib
|
||||||
|
|
||||||
|
SILIB = libsi.a
|
||||||
|
OBJS = si_parser.o si_debug_services.o
|
||||||
|
|
||||||
|
all : $(SILIB)
|
||||||
|
|
||||||
|
clean :
|
||||||
|
@echo cleaning workspace...
|
||||||
|
@rm -f $(OBJS) $(SILIB) *~
|
||||||
|
@rm -f Makefile.dep
|
||||||
|
|
||||||
|
depend : Makefile.dep
|
||||||
|
Makefile.dep :
|
||||||
|
@echo "updating dependencies..."
|
||||||
|
@$(MAKEDEPEND) $(INCDIRS) $(OBJS:%.o=%.c) $(SITEST_OBJS:%.o=%.c) \
|
||||||
|
$(SISCAN_OBJS:%.o=%.c) > Makefile.dep
|
||||||
|
|
||||||
|
new : clean depend all
|
||||||
|
|
||||||
|
dist: all
|
||||||
|
@echo "distributing $(SILIB) to $(DISTDIR)..."
|
||||||
|
@cp $(SILIB) $(DISTDIR)
|
||||||
|
@cp $(INCLUDES) $(DISTINCDIR)
|
||||||
|
@$(RANLIB) $(DISTDIR)/$(SILIB)
|
||||||
|
|
||||||
|
$(SILIB) : $(OBJS)
|
||||||
|
@echo updating library...
|
||||||
|
@$(AR) $(ARFLAGS) $(SILIB) $(OBJS)
|
||||||
|
@$(RANLIB) $(SILIB)
|
||||||
|
|
||||||
|
.c.o :
|
||||||
|
@echo compiling $<...
|
||||||
|
@$(CC) $(DEFINES) $(CFLAGS) $(INCDIRS) -c $<
|
||||||
|
|
||||||
|
include Makefile.dep
|
2
libdtv/libsi/README
Normal file
2
libdtv/libsi/README
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
DVB - System Information Library
|
||||||
|
================================
|
816
libdtv/libsi/include/libsi.h
Normal file
816
libdtv/libsi/include/libsi.h
Normal file
@ -0,0 +1,816 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// libsi.h: definitions for data structures of libsi ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.3 $
|
||||||
|
// $Date: 2001/06/25 19:39:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// libsi 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.
|
||||||
|
//
|
||||||
|
// libsi 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 libsi; see the file COPYING. If not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
#ifndef LIBSI_H
|
||||||
|
#define LIBSI_H
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <asm/types.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Program Identifier */
|
||||||
|
|
||||||
|
#define PID_PAT 0x00 /* Program Association Table */
|
||||||
|
#define PID_BAT 0x01 /* Bouquet Association Table */
|
||||||
|
#define PID_CAT 0x01 /* Conditional Access Table */
|
||||||
|
#define PID_NIT 0x10 /* Network Information Table */
|
||||||
|
#define PID_SDT 0x11 /* Service Description Table */
|
||||||
|
#define PID_EIT 0x12 /* Event Information Table */
|
||||||
|
#define PID_RST 0x13 /* Running Status Table */
|
||||||
|
#define PID_TDT 0x14 /* Time Date Table */
|
||||||
|
#define PID_TOT 0x14 /* Time Offset Table */
|
||||||
|
#define PID_ST 0x14 /* Stuffing Table */
|
||||||
|
/* 0x15 - 0x1F */ /* Reserved for future use */
|
||||||
|
|
||||||
|
/* Table Identifier */
|
||||||
|
|
||||||
|
#define TID_PAT 0x00 /* Program Association Section */
|
||||||
|
#define TID_CAT 0x01 /* Conditional Access Section */
|
||||||
|
#define TID_PMT 0x02 /* Conditional Access Section */
|
||||||
|
/* 0x03 - 0x3F */ /* Reserved for future use */
|
||||||
|
#define TID_NIT_ACT 0x40 /* Network Information Section -
|
||||||
|
actual */
|
||||||
|
#define TID_NIT_OTH 0x41 /* Network Information Section -
|
||||||
|
other */
|
||||||
|
#define TID_SDT_ACT 0x42 /* Service Description Section -
|
||||||
|
actual */
|
||||||
|
#define TID_SDT_OTH 0x46 /* Service Description Section -
|
||||||
|
other */
|
||||||
|
#define TID_EIT_ACT 0x4E /* Event Information Section -
|
||||||
|
actual */
|
||||||
|
#define TID_EIT_OTH 0x4F /* Event Information Section -
|
||||||
|
other */
|
||||||
|
#define TID_EIT_ACT_SCH 0x50 /* Event Information Section -
|
||||||
|
actual, schedule */
|
||||||
|
#define TID_EIT_OTH_SCH 0x60 /* Event Information Section -
|
||||||
|
other, schedule */
|
||||||
|
#define TID_TDT 0x70 /* Time Date Section */
|
||||||
|
#define TID_TOT 0x73 /* Time Offset Section */
|
||||||
|
#define TID_CA_ECM_0 0x80
|
||||||
|
#define TID_CA_ECM_1 0x81
|
||||||
|
|
||||||
|
#define TID_BAT 0x01 /* Bouquet Association Section */
|
||||||
|
|
||||||
|
#define TID_EIT 0x12 /* Event Information Section */
|
||||||
|
#define TID_RST 0x13 /* Running Status Section */
|
||||||
|
#define TID_ST 0x14 /* Stuffung Section */
|
||||||
|
/* 0xFF */ /* Reserved for future use */
|
||||||
|
|
||||||
|
/* Descriptor Identifier */
|
||||||
|
|
||||||
|
/* defined by ISO/IEC 13818-1 */
|
||||||
|
|
||||||
|
#define DESCR_VIDEO_STREAM 0x02
|
||||||
|
#define DESCR_AUDIO_STREAM 0x03
|
||||||
|
#define DESCR_HIERARCHY 0x04
|
||||||
|
#define DESCR_REGISTRATION 0x05
|
||||||
|
#define DESCR_DATA_STREAM_ALIGN 0x06
|
||||||
|
#define DESCR_TARGET_BACKGRID 0x07
|
||||||
|
#define DESCR_VIDEO_WINDOW 0x08
|
||||||
|
#define DESCR_CA 0x09
|
||||||
|
#define DESCR_ISO_639_LANGUAGE 0x0A
|
||||||
|
#define DESCR_SYSTEM_CLOCK 0x0B
|
||||||
|
#define DESCR_MULTIPLEX_BUFFER_UTIL 0x0C
|
||||||
|
#define DESCR_COPYRIGHT 0x0D
|
||||||
|
#define DESCR_MAXIMUM_BITRATE 0x0E
|
||||||
|
#define DESCR_PRIVATE_DATA_IND 0x0F
|
||||||
|
#define DESCR_SMOOTHING_BUFFER 0x10
|
||||||
|
#define DESCR_STD 0x11
|
||||||
|
#define DESCR_IBP 0x12
|
||||||
|
/* 0x13 - 0x3F */ /* Reserved */
|
||||||
|
|
||||||
|
/* defined by ETSI */
|
||||||
|
|
||||||
|
#define DESCR_NW_NAME 0x40
|
||||||
|
#define DESCR_SERVICE_LIST 0x41
|
||||||
|
#define DESCR_STUFFING 0x42
|
||||||
|
#define DESCR_SAT_DEL_SYS 0x43
|
||||||
|
#define DESCR_CABLE_DEL_SYS 0x44
|
||||||
|
#define DESCR_VBI_DATA 0x45
|
||||||
|
#define DESCR_VBI_TELETEXT 0x46
|
||||||
|
#define DESCR_BOUQUET_NAME 0x47
|
||||||
|
#define DESCR_SERVICE 0x48
|
||||||
|
#define DESCR_COUNTRY_AVAIL 0x49
|
||||||
|
#define DESCR_LINKAGE 0x4A
|
||||||
|
#define DESCR_NVOD_REF 0x4B
|
||||||
|
#define DESCR_TIME_SHIFTED_SERVICE 0x4C
|
||||||
|
#define DESCR_SHORT_EVENT 0x4D
|
||||||
|
#define DESCR_EXTENDED_EVENT 0x4E
|
||||||
|
#define DESCR_TIME_SHIFTED_EVENT 0x4F
|
||||||
|
#define DESCR_COMPONENT 0x50
|
||||||
|
#define DESCR_MOSAIC 0x51
|
||||||
|
#define DESCR_STREAM_ID 0x52
|
||||||
|
#define DESCR_CA_IDENT 0x53
|
||||||
|
#define DESCR_CONTENT 0x54
|
||||||
|
#define DESCR_PARENTAL_RATING 0x55
|
||||||
|
#define DESCR_TELETEXT 0x56
|
||||||
|
#define DESCR_TELEPHONE 0x57
|
||||||
|
#define DESCR_LOCAL_TIME_OFF 0x58
|
||||||
|
#define DESCR_SUBTITLING 0x59
|
||||||
|
#define DESCR_TERR_DEL_SYS 0x5A
|
||||||
|
#define DESCR_ML_NW_NAME 0x5B
|
||||||
|
#define DESCR_ML_BQ_NAME 0x5C
|
||||||
|
#define DESCR_ML_SERVICE_NAME 0x5D
|
||||||
|
#define DESCR_ML_COMPONENT 0x5E
|
||||||
|
#define DESCR_PRIV_DATA_SPEC 0x5F
|
||||||
|
#define DESCR_SERVICE_MOVE 0x60
|
||||||
|
#define DESCR_SHORT_SMOOTH_BUF 0x61
|
||||||
|
#define DESCR_FREQUENCY_LIST 0x62
|
||||||
|
#define DESCR_PARTIAL_TP_STREAM 0x63
|
||||||
|
#define DESCR_DATA_BROADCAST 0x64
|
||||||
|
#define DESCR_CA_SYSTEM 0x65
|
||||||
|
#define DESCR_DATA_BROADCAST_ID 0x66
|
||||||
|
#define DESCR_TRANSPORT_STREAM 0x67
|
||||||
|
#define DESCR_DSNG 0x68
|
||||||
|
#define DESCR_PDC 0x69
|
||||||
|
#define DESCR_AC3 0x6A
|
||||||
|
#define DESCR_ANCILLARY_DATA 0x6B
|
||||||
|
#define DESCR_CELL_LIST 0x6C
|
||||||
|
#define DESCR_CELL_FREQ_LINK 0x6D
|
||||||
|
#define DESCR_ANNOUNCEMENT_SUPPORT 0x6E
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_SECTION_BUFFER 4096
|
||||||
|
|
||||||
|
|
||||||
|
/* Strukturen zur Aufnahme der SDT und EIT Informationen */
|
||||||
|
|
||||||
|
struct Service {
|
||||||
|
struct NODE Node;
|
||||||
|
int ServiceID;
|
||||||
|
int TransportStreamID;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
int SdtVersion;
|
||||||
|
unsigned short Status;
|
||||||
|
struct LIST *Descriptors;
|
||||||
|
struct LIST *Events;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define EIT_SCHEDULE_FLAG 0x0001
|
||||||
|
#define GetScheduleFlag(x) ((x)&EIT_SCHEDULE_FLAG)
|
||||||
|
#define SetScheduleFlag(x) ((x)|=EIT_SCHEDULE_FLAG)
|
||||||
|
#define EIT_PRESENT_FOLLOWING_FLAG 0x0002
|
||||||
|
#define GetPresentFollowing(x) ((x)&EIT_PRESENT_FOLLOWING_FLAG)
|
||||||
|
#define SetPresentFollowing(x) ((x)|=EIT_PRESENT_FOLLOWING_FLAG)
|
||||||
|
#define RUNNING_STATUS_NOT_RUNNING 0x0000
|
||||||
|
#define RUNNING_STATUS_AWAITING 0x0004
|
||||||
|
#define RUNNING_STATUS_PAUSING 0x0008
|
||||||
|
#define RUNNING_STATUS_RUNNING 0x000C
|
||||||
|
#define GetRunningStatus(x) ((x)&RUNNING_STATUS_RUNNING)
|
||||||
|
#define SetRunningStatus(x,s) ((x)|=((s)&RUNNING_STATUS_RUNNING))
|
||||||
|
#define FREE_TO_AIR 0x0000
|
||||||
|
#define CONDITIONAL_ACCESS 0x0010
|
||||||
|
#define GetConditionalAccess(x) ((x)&CONDITIONAL_ACCESS)
|
||||||
|
#define SetConditionalAccess(x) ((x)|=CONDITIONAL_ACCESS)
|
||||||
|
|
||||||
|
#define CreateService(service, svid, tsid, onid, vers, sta) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (service, NULL); \
|
||||||
|
service->ServiceID = svid; \
|
||||||
|
service->TransportStreamID = tsid; \
|
||||||
|
service->OriginalNetworkID = onid; \
|
||||||
|
service->SdtVersion = vers; \
|
||||||
|
service->Status = sta; \
|
||||||
|
service->Descriptors = xNewList (NULL); \
|
||||||
|
service->Events = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
struct Event {
|
||||||
|
struct NODE Node;
|
||||||
|
int EventID;
|
||||||
|
int ServiceID;
|
||||||
|
int EitVersion;
|
||||||
|
int TransportStreamID;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
time_t StartTime;
|
||||||
|
time_t Duration;
|
||||||
|
unsigned short Status;
|
||||||
|
struct LIST *Descriptors;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateEvent(event, evid, svid, tsid, onid, vers, sta) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (event, NULL); \
|
||||||
|
event->EventID = evid; \
|
||||||
|
event->ServiceID = svid; \
|
||||||
|
event->TransportStreamID = tsid; \
|
||||||
|
event->OriginalNetworkID = onid; \
|
||||||
|
event->EitVersion = vers; \
|
||||||
|
event->Status = sta; \
|
||||||
|
event->Descriptors = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Strukturen zur Aufnahme der PAT und PMT Informationen */
|
||||||
|
|
||||||
|
struct Program {
|
||||||
|
struct NODE Node;
|
||||||
|
int ProgramID;
|
||||||
|
int TransportStreamID;
|
||||||
|
int NetworkPID;
|
||||||
|
int PatVersion;
|
||||||
|
struct LIST *Pids;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateProgram(program, pgid, tsid, npid, vers) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (program, NULL); \
|
||||||
|
program->ProgramID = pgid; \
|
||||||
|
program->TransportStreamID = tsid; \
|
||||||
|
program->NetworkPID = npid; \
|
||||||
|
program->PatVersion = vers; \
|
||||||
|
program->Pids = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
struct Pid {
|
||||||
|
struct NODE Node;
|
||||||
|
int ProgramID;
|
||||||
|
int PcrPID;
|
||||||
|
int PmtVersion;
|
||||||
|
struct LIST *Descriptors;
|
||||||
|
struct LIST *InfoList;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreatePid(pid, pgid, pcid, vers) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (pid, NULL); \
|
||||||
|
pid->ProgramID = pgid; \
|
||||||
|
pid->PcrPID = pcid; \
|
||||||
|
pid->PmtVersion = vers; \
|
||||||
|
pid->Descriptors = xNewList (NULL); \
|
||||||
|
pid->InfoList = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
struct PidInfo {
|
||||||
|
struct NODE Node;
|
||||||
|
int StreamType;
|
||||||
|
int ElementaryPid;
|
||||||
|
struct LIST *Descriptors;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreatePidInfo(pidinfo, styp, epid) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (pidinfo, NULL); \
|
||||||
|
pidinfo->StreamType = styp; \
|
||||||
|
pidinfo->ElementaryPid = epid; \
|
||||||
|
pidinfo->Descriptors = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define STREAMTYPE_ISO_VIDEO 1
|
||||||
|
#define STREAMTYPE_13818_VIDEO 2
|
||||||
|
#define STREAMTYPE_11172_AUDIO 3
|
||||||
|
#define STREAMTYPE_13818_AUDIO 4
|
||||||
|
#define STREAMTYPE_VIDEOTEXT 6
|
||||||
|
#define STREAMTYPE_13522_MPEG 7
|
||||||
|
#define STREAMTYPE_ITU_222 8
|
||||||
|
#define STREAMTYPE_13818_A 9
|
||||||
|
#define STREAMTYPE_13818_B 10
|
||||||
|
#define STREAMTYPE_13818_C 11
|
||||||
|
#define STREAMTYPE_13818_D 12
|
||||||
|
#define STREAMTYPE_13818_AUX 13
|
||||||
|
|
||||||
|
/* Descriptors */
|
||||||
|
|
||||||
|
#define DescriptorTag(x) ((struct Descriptor *)(x))->Tag
|
||||||
|
|
||||||
|
struct Descriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Iso639LanguageDescriptor */
|
||||||
|
|
||||||
|
struct Iso639LanguageDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
char LanguageCode[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateIso639LanguageDescriptor(descr, lc1, lc2, lc3) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct Iso639LanguageDescriptor *)descr), NULL); \
|
||||||
|
((struct Iso639LanguageDescriptor *)descr)->Tag = DESCR_ISO_639_LANGUAGE; \
|
||||||
|
((struct Iso639LanguageDescriptor *)descr)->LanguageCode[0] = lc1; \
|
||||||
|
((struct Iso639LanguageDescriptor *)descr)->LanguageCode[1] = lc2; \
|
||||||
|
((struct Iso639LanguageDescriptor *)descr)->LanguageCode[2] = lc3; \
|
||||||
|
((struct Iso639LanguageDescriptor *)descr)->LanguageCode[3] = '\0'; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* AncillaryDataDescriptor */
|
||||||
|
|
||||||
|
struct AncillaryDataDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short Identifier;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ANCILLARY_DATA_DVD_VIDEO 0x0001
|
||||||
|
#define ANCILLARY_DATA_EXTENDED 0x0002
|
||||||
|
#define ANCILLARY_DATA_SWITCHING 0x0004
|
||||||
|
#define ANCILLARY_DATA_DAB 0x0008
|
||||||
|
#define ANCILLARY_DATA_SCALE_FACTOR 0x0010
|
||||||
|
|
||||||
|
#define CreateAncillaryDataDescriptor(descr, id) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct AncillaryDataDescriptor *)descr), NULL); \
|
||||||
|
((struct AncillaryDataDescriptor *)descr)->Tag = DESCR_ANCILLARY_DATA; \
|
||||||
|
((struct AncillaryDataDescriptor *)descr)->Identifier = id; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* BouquetNameDescriptor */
|
||||||
|
|
||||||
|
struct BouquetNameDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält Namen */
|
||||||
|
unsigned short Tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateBouquetNameDescriptor(descr, text) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct BouquetNameDescriptor *)descr), text); \
|
||||||
|
((struct BouquetNameDescriptor *)descr)->Tag = DESCR_BOUQUET_NAME; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* CountryAvailabilityDescriptor */
|
||||||
|
|
||||||
|
struct CountryAvailabilityDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short AvailibilityFlag;
|
||||||
|
unsigned short Amount; /* CountryCodes */
|
||||||
|
char *CountryCodes;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define COUNTRIES_ARE_AVAILABLE 0x0001
|
||||||
|
#define COUNTRIES_ARE_UNAVAILABLE 0x0000
|
||||||
|
|
||||||
|
#define CreateCountryAvailabilityDescriptor(descr, ava) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct CountryAvailabilityDescriptor *)descr), NULL); \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->Tag = DESCR_COUNTRY_AVAIL; \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->AvailibilityFlag = ava; \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->Amount = 0; \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->CountryCodes = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define AddCountryAvailabilityCode(descr, lc1, lc2, lc3) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
char tmpbuf[4], *tmpptr, *ttptr; \
|
||||||
|
\
|
||||||
|
tmpbuf[0] = lc1; tmpbuf[1] = lc2; \
|
||||||
|
tmpbuf[2] = lc3; tmpbuf[3] = '\0'; \
|
||||||
|
xMemAlloc (((struct CountryAvailabilityDescriptor *)descr)->Amount*4 + 8, &tmpptr); \
|
||||||
|
ttptr = tmpptr; \
|
||||||
|
if (((struct CountryAvailabilityDescriptor *)descr)->CountryCodes) { \
|
||||||
|
memcpy (ttptr, ((struct CountryAvailabilityDescriptor *)descr)->CountryCodes, \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->Amount*4); \
|
||||||
|
ttptr += ((struct CountryAvailabilityDescriptor *)descr)->Amount*4; \
|
||||||
|
} \
|
||||||
|
memcpy (ttptr, tmpbuf, 4); \
|
||||||
|
((struct CountryAvailabilityDescriptor *)descr)->CountryCodes = tmpptr; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* CaIdentifierDescriptor */
|
||||||
|
|
||||||
|
struct CaIdentifierDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short Amount; /* SystemIDs */
|
||||||
|
unsigned short *SystemID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateCaIdentifierDescriptor(descr, amo) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct CaIdentifierDescriptor *)descr), NULL); \
|
||||||
|
((struct CaIdentifierDescriptor *)descr)->Tag = DESCR_CA_IDENT; \
|
||||||
|
((struct CaIdentifierDescriptor *)descr)->Amount = amo; \
|
||||||
|
xMemAlloc (amo*2+2, &((struct CaIdentifierDescriptor *)descr)->SystemID); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SetCaIdentifierID(descr, num, id) \
|
||||||
|
((struct CaIdentifierDescriptor *)descr)->SystemID[num] = id
|
||||||
|
#define GetCaIdentifierID(descr, num) (((struct CaIdentifierDescriptor *)descr)->SystemID[num])
|
||||||
|
|
||||||
|
|
||||||
|
/* StreamIdentifierDescriptor */
|
||||||
|
|
||||||
|
struct StreamIdentifierDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short ComponentTag;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateStreamIdentifierDescriptor(descr, ctag) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct StreamIdentifierDescriptor *)descr), NULL); \
|
||||||
|
((struct StreamIdentifierDescriptor *)descr)->Tag = DESCR_STREAM_ID; \
|
||||||
|
((struct StreamIdentifierDescriptor *)descr)->ComponentTag = (ctag); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* DataBroadcastDescriptor */
|
||||||
|
|
||||||
|
struct DataBroadcastDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält DescriptorText */
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short DataBroadcastID;
|
||||||
|
unsigned short ComponentTag;
|
||||||
|
unsigned short SelectorLength;
|
||||||
|
unsigned char *SelectorBytes;
|
||||||
|
char LanguageCode[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MosaicDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
/* to be defined */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MultiLingualServiceDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
/* to be defined */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* NvodReferenceDescriptor */
|
||||||
|
|
||||||
|
struct NvodReferenceDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
struct LIST *Items;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateNvodReferenceDescriptor(descr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct NvodReferenceDescriptor *)descr), NULL); \
|
||||||
|
((struct NvodReferenceDescriptor *)descr)->Tag = DESCR_NVOD_REF; \
|
||||||
|
((struct NvodReferenceDescriptor *)descr)->Items = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
struct NvodReferenceItem {
|
||||||
|
struct NODE Node;
|
||||||
|
int TransportStreamID;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
int ServiceID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateNvodReferenceItem(itm, tpid, onid, svid) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (itm, NULL); \
|
||||||
|
itm->TransportStreamID = tpid; \
|
||||||
|
itm->OriginalNetworkID = onid; \
|
||||||
|
itm->ServiceID = svid; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define AddNvodReferenceItem(desc, tpid, onid, svid) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
struct NvodReferenceItem *item; \
|
||||||
|
\
|
||||||
|
CreateNvodReferenceItem(item, tpid, onid, svid); \
|
||||||
|
xAddTail (((struct NvodReferenceDescriptor *)desc)->Items, item); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* LinkageDescriptor */
|
||||||
|
|
||||||
|
struct LinkageDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
int TransportStreamID;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
int ServiceID;
|
||||||
|
int LinkageType;
|
||||||
|
int PrivateDataLength;
|
||||||
|
unsigned char *PrivateData;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateLinkageDescriptor(descr, tpid, onid, svid, ltyp, pdl, pdp) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct LinkageDescriptor *)descr), NULL); \
|
||||||
|
((struct LinkageDescriptor *)descr)->Tag = DESCR_LINKAGE; \
|
||||||
|
((struct LinkageDescriptor *)descr)->TransportStreamID = tpid; \
|
||||||
|
((struct LinkageDescriptor *)descr)->OriginalNetworkID = onid; \
|
||||||
|
((struct LinkageDescriptor *)descr)->ServiceID = svid; \
|
||||||
|
((struct LinkageDescriptor *)descr)->LinkageType = ltyp; \
|
||||||
|
((struct LinkageDescriptor *)descr)->PrivateDataLength = pdl; \
|
||||||
|
xMemAlloc ((pdl)+1, &(((struct LinkageDescriptor *) \
|
||||||
|
descr)->PrivateData)); \
|
||||||
|
memcpy ((((struct LinkageDescriptor *)descr)->PrivateData),(pdp),(pdl));\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* ServiceDescriptor */
|
||||||
|
|
||||||
|
struct ServiceDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält ServiceName */
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short ServiceType;
|
||||||
|
char *ServiceProvider;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateServiceDescriptor(descr, styp, prov, name) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ServiceDescriptor *)descr), name); \
|
||||||
|
((struct ServiceDescriptor *)descr)->Tag = DESCR_SERVICE; \
|
||||||
|
((struct ServiceDescriptor *)descr)->ServiceType = styp; \
|
||||||
|
((struct ServiceDescriptor *)descr)->ServiceProvider = prov; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct TelephoneDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
/* to be defined */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* TimeShiftedServiceDescriptor */
|
||||||
|
|
||||||
|
struct TimeShiftedServiceDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
int ReferenceServiceID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateTimeShiftedServiceDescriptor(descr, svid) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct TimeShiftedServiceDescriptor *)descr), NULL); \
|
||||||
|
((struct TimeShiftedServiceDescriptor *)descr)->Tag = DESCR_TIME_SHIFTED_SERVICE; \
|
||||||
|
((struct TimeShiftedServiceDescriptor *)descr)->ReferenceServiceID = svid; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* TimeShiftedEventDescriptor */
|
||||||
|
|
||||||
|
struct TimeShiftedEventDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
int ReferenceServiceID;
|
||||||
|
int ReferenceEventID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateTimeShiftedEventDescriptor(descr, svid, evid) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct TimeShiftedEventDescriptor *)descr), NULL); \
|
||||||
|
((struct TimeShiftedEventDescriptor *)descr)->Tag = DESCR_TIME_SHIFTED_EVENT; \
|
||||||
|
((struct TimeShiftedEventDescriptor *)descr)->ReferenceServiceID = svid; \
|
||||||
|
((struct TimeShiftedEventDescriptor *)descr)->ReferenceEventID = evid; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* ComponentDescriptor */
|
||||||
|
|
||||||
|
struct ComponentDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält ComponentText */
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short StreamContent;
|
||||||
|
unsigned short ComponentType;
|
||||||
|
unsigned short ComponentTag;
|
||||||
|
char LanguageCode[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateComponentDescriptor(descr, scnt, ctyp, tag, lc1, lc2, lc3, txt) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ComponentDescriptor *)descr), txt); \
|
||||||
|
((struct ComponentDescriptor *)descr)->Tag = DESCR_COMPONENT; \
|
||||||
|
((struct ComponentDescriptor *)descr)->StreamContent = scnt; \
|
||||||
|
((struct ComponentDescriptor *)descr)->ComponentType = ctyp; \
|
||||||
|
((struct ComponentDescriptor *)descr)->ComponentTag = tag; \
|
||||||
|
((struct ComponentDescriptor *)descr)->LanguageCode[0] = lc1; \
|
||||||
|
((struct ComponentDescriptor *)descr)->LanguageCode[1] = lc2; \
|
||||||
|
((struct ComponentDescriptor *)descr)->LanguageCode[2] = lc3; \
|
||||||
|
((struct ComponentDescriptor *)descr)->LanguageCode[3] = '\0'; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* ContentDescriptor */
|
||||||
|
|
||||||
|
struct ContentDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short Amount; /* ContentIDs */
|
||||||
|
unsigned short *ContentID;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateContentDescriptor(descr, amo) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ContentDescriptor *)descr), NULL); \
|
||||||
|
((struct ContentDescriptor *)descr)->Tag = DESCR_CONTENT; \
|
||||||
|
((struct ContentDescriptor *)descr)->Amount = amo; \
|
||||||
|
xMemAlloc (amo*2+2, &((struct ContentDescriptor *)descr)->ContentID); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define SetContentID(descr, num, cnib1, cnib2, unib1, unib2) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
((struct ContentDescriptor *)descr)->ContentID[num] = \
|
||||||
|
((cnib1&0xF) << 12) | ((cnib2&0xF) << 8) | \
|
||||||
|
((unib1&0xF) << 4) | (unib2&0xF); \
|
||||||
|
} while (0)
|
||||||
|
#define GetContentContentNibble1(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0xF000) >> 12)
|
||||||
|
#define GetContentContentNibble2(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0x0F00) >> 8)
|
||||||
|
#define GetContentUserNibble1(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0x00F0) >> 4)
|
||||||
|
#define GetContentUserNibble2(descr, num) (((struct ContentDescriptor *)descr)->ContentID[num]&0x000F)
|
||||||
|
|
||||||
|
|
||||||
|
/* ExtendedEventDescriptor */
|
||||||
|
|
||||||
|
struct ExtendedEventDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält EventText */
|
||||||
|
unsigned short Tag;
|
||||||
|
unsigned short DescriptorNumber;
|
||||||
|
unsigned short LastDescriptorNumber;
|
||||||
|
char LanguageCode[4];
|
||||||
|
struct LIST *Items;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateExtendedEventDescriptor(descr, dnum, ldnb, lc1, lc2, lc3, text) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ExtendedEventDescriptor *)descr), text); \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->Tag = DESCR_EXTENDED_EVENT; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->DescriptorNumber = dnum; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->LastDescriptorNumber = ldnb; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->LanguageCode[0] = lc1; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->LanguageCode[1] = lc2; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->LanguageCode[2] = lc3; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->LanguageCode[3] = '\0'; \
|
||||||
|
((struct ExtendedEventDescriptor *)descr)->Items = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
struct ExtendedEventItem {
|
||||||
|
struct NODE Node; /* Node enthält ItemDescription Text */
|
||||||
|
char *Text;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateExtendedEventItem(itm, dtxt, text) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (itm, dtxt); \
|
||||||
|
itm->Text = text; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define AddExtendedEventItem(desc, dtxt, text) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
struct ExtendedEventItem *item; \
|
||||||
|
\
|
||||||
|
CreateExtendedEventItem(item, dtxt, text); \
|
||||||
|
xAddTail (((struct ExtendedEventDescriptor *)desc)->Items, item); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* ParentalRatingDescriptor */
|
||||||
|
|
||||||
|
struct ParentalRatingDescriptor {
|
||||||
|
struct NODE Node;
|
||||||
|
unsigned short Tag;
|
||||||
|
struct LIST *Ratings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateParentalRatingDescriptor(descr) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ParentalRatingDescriptor *)descr), NULL); \
|
||||||
|
((struct ParentalRatingDescriptor *)descr)->Tag = DESCR_PARENTAL_RATING; \
|
||||||
|
((struct ParentalRatingDescriptor *)descr)->Ratings = xNewList (NULL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
struct ParentalRating {
|
||||||
|
struct NODE Node; /* Node enthält ItemDescription Text */
|
||||||
|
char LanguageCode[4];
|
||||||
|
char Rating;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateParentalRating(rat, lc1, lc2, lc3, val) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (rat, NULL); \
|
||||||
|
rat->LanguageCode[0] = lc1; \
|
||||||
|
rat->LanguageCode[1] = lc2; \
|
||||||
|
rat->LanguageCode[2] = lc3; \
|
||||||
|
rat->LanguageCode[3] = '\0'; \
|
||||||
|
rat->Rating = val; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define AddParentalRating(desc, lc1, lc2, lc3, val) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
struct ParentalRating *item; \
|
||||||
|
\
|
||||||
|
CreateParentalRating(item, lc1, lc2, lc3, val); \
|
||||||
|
xAddTail (((struct ParentalRatingDescriptor *)desc)->Ratings, item); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* ShortEventDescriptor */
|
||||||
|
|
||||||
|
struct ShortEventDescriptor {
|
||||||
|
struct NODE Node; /* Node enthält EventName */
|
||||||
|
unsigned short Tag;
|
||||||
|
char LanguageCode[4];
|
||||||
|
char *Text;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CreateShortEventDescriptor(descr, name, lc1, lc2, lc3, text) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (((struct ShortEventDescriptor *)descr), name); \
|
||||||
|
((struct ShortEventDescriptor *)descr)->Tag = DESCR_SHORT_EVENT; \
|
||||||
|
((struct ShortEventDescriptor *)descr)->LanguageCode[0] = lc1; \
|
||||||
|
((struct ShortEventDescriptor *)descr)->LanguageCode[1] = lc2; \
|
||||||
|
((struct ShortEventDescriptor *)descr)->LanguageCode[2] = lc3; \
|
||||||
|
((struct ShortEventDescriptor *)descr)->LanguageCode[3] = '\0'; \
|
||||||
|
((struct ShortEventDescriptor *)descr)->Text = text; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* si_parser.c */
|
||||||
|
|
||||||
|
struct LIST *siParsePAT (u_char *);
|
||||||
|
struct Pid *siParsePMT (u_char *);
|
||||||
|
struct LIST *siParseSDT (u_char *);
|
||||||
|
struct LIST *siParseEIT (u_char *);
|
||||||
|
time_t siParseTDT (u_char *);
|
||||||
|
void siParseDescriptors (struct LIST *, u_char *, u_int, u_char);
|
||||||
|
void siParseDescriptor (struct LIST *, u_char *);
|
||||||
|
char *siGetDescriptorText (u_char *, u_int);
|
||||||
|
u_long crc32 (char *data, int len);
|
||||||
|
|
||||||
|
/* si_debug_services.c */
|
||||||
|
|
||||||
|
void siDebugServices (struct LIST *);
|
||||||
|
void siDebugService (struct Service *);
|
||||||
|
void siDebugEvents (char *, struct LIST *);
|
||||||
|
void siDebugPrograms (char *, struct LIST *);
|
||||||
|
void siDebugProgram (struct Program *);
|
||||||
|
void siDebugPids (char *, struct LIST *);
|
||||||
|
void siDebugDescriptors (char *, struct LIST *);
|
||||||
|
void siDebugEitServices (struct LIST *);
|
||||||
|
void siDebugEitEvents (char *, struct LIST *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
1205
libdtv/libsi/include/si_tables.h
Normal file
1205
libdtv/libsi/include/si_tables.h
Normal file
File diff suppressed because it is too large
Load Diff
487
libdtv/libsi/si_debug_services.c
Normal file
487
libdtv/libsi/si_debug_services.c
Normal file
@ -0,0 +1,487 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// si_debug_services.c: debugging functions for libsi ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.2 $
|
||||||
|
// $Date: 2001/06/25 19:39:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// libsi 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.
|
||||||
|
//
|
||||||
|
// libsi 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 libsi; 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 <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "../liblx/liblx.h"
|
||||||
|
#include "libsi.h"
|
||||||
|
#include "si_debug_services.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void siDebugServices (struct LIST *Services)
|
||||||
|
{
|
||||||
|
struct Service *Service;
|
||||||
|
|
||||||
|
if (!Services) return;
|
||||||
|
|
||||||
|
xForeach (Services, Service)
|
||||||
|
{
|
||||||
|
printf ("Service\n=======\n");
|
||||||
|
printf (" ServiceID: %d\n", Service->ServiceID);
|
||||||
|
printf (" TransportStreamID: %d\n", Service->TransportStreamID);
|
||||||
|
printf (" OriginalNetworkID: %d\n", Service->OriginalNetworkID);
|
||||||
|
printf (" SdtVersion: %d\n", Service->SdtVersion);
|
||||||
|
printf (" Status: ");
|
||||||
|
if (GetScheduleFlag (Service->Status))
|
||||||
|
printf ("SCHEDULE_INFO ");
|
||||||
|
if (GetPresentFollowing(Service->Status))
|
||||||
|
printf ("PRESENT_FOLLOWING ");
|
||||||
|
switch (GetRunningStatus (Service->Status))
|
||||||
|
{
|
||||||
|
case RUNNING_STATUS_NOT_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_NOT_RUNNING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_AWAITING:
|
||||||
|
printf ("RUNNING_STATUS_AWAITING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_PAUSING:
|
||||||
|
printf ("RUNNING_STATUS_PAUSING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_RUNNING\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
siDebugDescriptors (" ", Service->Descriptors);
|
||||||
|
siDebugEvents (" ", Service->Events);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void siDebugService (struct Service *Service)
|
||||||
|
{
|
||||||
|
if (!Service) return;
|
||||||
|
|
||||||
|
printf ("Service\r\n=======\r\n");
|
||||||
|
printf (" ServiceID: %d\r\n", Service->ServiceID);
|
||||||
|
printf (" TransportStreamID: %d\r\n", Service->TransportStreamID);
|
||||||
|
printf (" OriginalNetworkID: %d\r\n", Service->OriginalNetworkID);
|
||||||
|
printf (" SdtVersion: %d\r\n", Service->SdtVersion);
|
||||||
|
printf (" Status: ");
|
||||||
|
if (GetScheduleFlag (Service->Status))
|
||||||
|
printf ("SCHEDULE_INFO ");
|
||||||
|
if (GetPresentFollowing(Service->Status))
|
||||||
|
printf ("PRESENT_FOLLOWING ");
|
||||||
|
switch (GetRunningStatus (Service->Status))
|
||||||
|
{
|
||||||
|
case RUNNING_STATUS_NOT_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_NOT_RUNNING\r\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_AWAITING:
|
||||||
|
printf ("RUNNING_STATUS_AWAITING\r\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_PAUSING:
|
||||||
|
printf ("RUNNING_STATUS_PAUSING\r\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_RUNNING\r\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
siDebugDescriptors ("\r ", Service->Descriptors);
|
||||||
|
siDebugEvents ("\r ", Service->Events);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void siDebugEvents (char *Prepend, struct LIST *EventList)
|
||||||
|
{
|
||||||
|
struct Event *Event;
|
||||||
|
char NewPrepend[32];
|
||||||
|
|
||||||
|
if (!EventList) return;
|
||||||
|
|
||||||
|
xForeach (EventList, Event)
|
||||||
|
{
|
||||||
|
printf ("%sEvent\n%s=====\n", Prepend, Prepend);
|
||||||
|
printf ("%s EventID: %d\n", Prepend, Event->EventID);
|
||||||
|
printf ("%s ServiceID: %d\n", Prepend, Event->ServiceID);
|
||||||
|
printf ("%s TransportStreamID: %d\n", Prepend, Event->TransportStreamID);
|
||||||
|
printf ("%s OriginalNetworkID: %d\n", Prepend, Event->OriginalNetworkID);
|
||||||
|
printf ("%s EitVersion: %d\n", Prepend, Event->EitVersion);
|
||||||
|
printf ("%s StartTime: %s", Prepend, ctime (&Event->StartTime));
|
||||||
|
printf ("%s Duration: %d Minuten\n", Prepend, Event->Duration/60);
|
||||||
|
printf ("%s Status: ");
|
||||||
|
switch (GetRunningStatus (Event->Status))
|
||||||
|
{
|
||||||
|
case RUNNING_STATUS_NOT_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_NOT_RUNNING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_AWAITING:
|
||||||
|
printf ("RUNNING_STATUS_AWAITING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_PAUSING:
|
||||||
|
printf ("RUNNING_STATUS_PAUSING\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUNNING_STATUS_RUNNING:
|
||||||
|
printf ("RUNNING_STATUS_RUNNING\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sprintf (NewPrepend, "%s ", Prepend);
|
||||||
|
siDebugDescriptors (NewPrepend, Event->Descriptors);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void siDebugPrograms (char *Prepend, struct LIST *ProgramList)
|
||||||
|
{
|
||||||
|
struct Program *Program;
|
||||||
|
char NewPrepend[32];
|
||||||
|
|
||||||
|
if (!ProgramList) return;
|
||||||
|
|
||||||
|
xForeach (ProgramList, Program)
|
||||||
|
{
|
||||||
|
printf ("%sProgram\n%s=======\n", Prepend, Prepend);
|
||||||
|
printf ("%s ProgramID: %d\n", Prepend, Program->ProgramID);
|
||||||
|
printf ("%s TransportStreamID: %d\n", Prepend, Program->TransportStreamID);
|
||||||
|
printf ("%s NetworkPID: %d\n", Prepend, Program->NetworkPID);
|
||||||
|
printf ("%s PatVersion: %d\n", Prepend, Program->PatVersion);
|
||||||
|
|
||||||
|
sprintf (NewPrepend, "%s ", Prepend);
|
||||||
|
siDebugPids (NewPrepend, Program->Pids);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void siDebugProgram (struct Program *Program)
|
||||||
|
{
|
||||||
|
if (!Program) return;
|
||||||
|
|
||||||
|
printf ("Program\r\n=======\r\n");
|
||||||
|
printf (" ProgramID: %d\r\n", Program->ProgramID);
|
||||||
|
printf (" TransportStreamID: %d\r\n", Program->TransportStreamID);
|
||||||
|
printf (" NetworkPID: %d\r\n", Program->NetworkPID);
|
||||||
|
printf (" PatVersion: %d\r\n", Program->PatVersion);
|
||||||
|
|
||||||
|
siDebugPids ("\r ", Program->Pids);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void siDebugPids (char *Prepend, struct LIST *PidList)
|
||||||
|
{
|
||||||
|
struct Pid *Pid;
|
||||||
|
struct PidInfo *PidInfo;
|
||||||
|
char NewPrepend[32];
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if (!PidList) return;
|
||||||
|
|
||||||
|
xForeach (PidList, Pid)
|
||||||
|
{
|
||||||
|
printf ("%sPid\n%s===\n", Prepend, Prepend);
|
||||||
|
printf ("%s ProgramID: %d\n", Prepend, Pid->ProgramID);
|
||||||
|
printf ("%s PcrPid: %d\n", Prepend, Pid->PcrPID);
|
||||||
|
printf ("%s PmtVersion: %d\n", Prepend, Pid->PmtVersion);
|
||||||
|
|
||||||
|
xForeach (Pid->InfoList, PidInfo)
|
||||||
|
{
|
||||||
|
printf ("%s PidInfo\n%s =======\n", Prepend, Prepend);
|
||||||
|
index = PidInfo->StreamType;
|
||||||
|
if (index > 0x0F && index <= 0x7F) index = 0x0E;
|
||||||
|
if (index >= 0x80) index = 0x0F;
|
||||||
|
printf ("%s StreamType: %s\n", Prepend, StreamTypes[index]);
|
||||||
|
printf ("%s ElementaryPid: %d\n", Prepend, PidInfo->ElementaryPid);
|
||||||
|
|
||||||
|
sprintf (NewPrepend, "%s ", Prepend);
|
||||||
|
siDebugDescriptors (NewPrepend, PidInfo->Descriptors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void siDebugDescriptors (char *Prepend, struct LIST *Descriptors)
|
||||||
|
{
|
||||||
|
struct Descriptor *Descriptor;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
xForeach (Descriptors, Descriptor)
|
||||||
|
{
|
||||||
|
switch (DescriptorTag (Descriptor))
|
||||||
|
{
|
||||||
|
case DESCR_ANCILLARY_DATA:
|
||||||
|
printf ("%sDescriptor: Ancillary Data\n", Prepend);
|
||||||
|
printf ("%s Identifier: ", Prepend);
|
||||||
|
if (((struct AncillaryDataDescriptor *)Descriptor)->
|
||||||
|
Identifier & ANCILLARY_DATA_DVD_VIDEO)
|
||||||
|
printf ("DVD-Video Ancillary Data ");
|
||||||
|
if (((struct AncillaryDataDescriptor *)Descriptor)->
|
||||||
|
Identifier & ANCILLARY_DATA_EXTENDED)
|
||||||
|
printf ("Extended Ancillary Data ");
|
||||||
|
if (((struct AncillaryDataDescriptor *)Descriptor)->
|
||||||
|
Identifier & ANCILLARY_DATA_SWITCHING)
|
||||||
|
printf ("Announcement Switching Data ");
|
||||||
|
if (((struct AncillaryDataDescriptor *)Descriptor)->
|
||||||
|
Identifier & ANCILLARY_DATA_DAB)
|
||||||
|
printf ("DAB Ancillary Data ");
|
||||||
|
if (((struct AncillaryDataDescriptor *)Descriptor)->
|
||||||
|
Identifier & ANCILLARY_DATA_SCALE_FACTOR)
|
||||||
|
printf ("Scale Factor Error Check (ScF-CRC) ");
|
||||||
|
printf ("\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_BOUQUET_NAME:
|
||||||
|
printf ("%sDescriptor: Bouquet Name\n", Prepend);
|
||||||
|
printf ("%s Name: %s\n", Prepend, xName (Descriptor));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_COMPONENT:
|
||||||
|
printf ("%sDescriptor: Component\n", Prepend);
|
||||||
|
printf ("%s Text: %s\n", Prepend, xName (Descriptor));
|
||||||
|
printf ("%s Content/Type: ", Prepend);
|
||||||
|
for (i = 0; i < COMPONENT_TYPE_NUMBER; i++)
|
||||||
|
if ((((struct ComponentDescriptor *)Descriptor)->
|
||||||
|
StreamContent == ComponentTypes[i].Content) &&
|
||||||
|
(((struct ComponentDescriptor *)Descriptor)->
|
||||||
|
ComponentType == ComponentTypes[i].Type))
|
||||||
|
{ printf ("%s\n", ComponentTypes[i].Description); break; }
|
||||||
|
if (i == COMPONENT_TYPE_NUMBER) { printf ("unbekannt\n"); }
|
||||||
|
printf ("%s ComponentTag: 0x%02x\n", Prepend,
|
||||||
|
((struct ComponentDescriptor *)Descriptor)->ComponentTag);
|
||||||
|
printf ("%s LanguageCode: %s\n", Prepend,
|
||||||
|
((struct ComponentDescriptor *)Descriptor)->LanguageCode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_SERVICE:
|
||||||
|
printf ("%sDescriptor: Service\n", Prepend);
|
||||||
|
printf ("%s Name: %s\n", Prepend, xName (Descriptor));
|
||||||
|
printf ("%s ServiceType: ", Prepend);
|
||||||
|
for (i = 0; i < SERVICE_TYPE_NUMBER; i++)
|
||||||
|
if ((((struct ServiceDescriptor *)Descriptor)->
|
||||||
|
ServiceType == ServiceTypes[i].Type))
|
||||||
|
{ printf ("%s\n", ServiceTypes[i].Description); break; }
|
||||||
|
if (i == SERVICE_TYPE_NUMBER) { printf ("unbekannt\n"); }
|
||||||
|
printf ("%s ServiceProvider: %s\n", Prepend,
|
||||||
|
((struct ServiceDescriptor *)Descriptor)->ServiceProvider);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_COUNTRY_AVAIL:
|
||||||
|
printf ("%sDescriptor: Country Availability\n", Prepend);
|
||||||
|
printf ("%s Type: %s\n", Prepend, (((struct CountryAvailabilityDescriptor *)Descriptor)->
|
||||||
|
AvailibilityFlag == COUNTRIES_ARE_AVAILABLE) ? "countries are available" :
|
||||||
|
"countries are unavailable");
|
||||||
|
{
|
||||||
|
char *cptr = ((struct CountryAvailabilityDescriptor *)Descriptor)->CountryCodes; int j;
|
||||||
|
for (j = 0; j < ((struct CountryAvailabilityDescriptor *)Descriptor)->Amount; j++)
|
||||||
|
{ printf ("%s Country: %s\n", Prepend, cptr); cptr += 4; }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_SHORT_EVENT:
|
||||||
|
printf ("%sDescriptor: Short Event\n", Prepend);
|
||||||
|
printf ("%s Name: %s\n", Prepend, xName (Descriptor));
|
||||||
|
printf ("%s LanguageCode: %s\n", Prepend,
|
||||||
|
((struct ShortEventDescriptor *)Descriptor)->LanguageCode);
|
||||||
|
printf ("%s Text: %s\n", Prepend,
|
||||||
|
((struct ShortEventDescriptor *)Descriptor)->Text);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_EXTENDED_EVENT:
|
||||||
|
{
|
||||||
|
struct ExtendedEventItem *Item;
|
||||||
|
|
||||||
|
printf ("%sDescriptor: Extended Event\n", Prepend);
|
||||||
|
printf ("%s Text: %s\n", Prepend, xName (Descriptor));
|
||||||
|
printf ("%s DescriptorNumber: %d\n", Prepend,
|
||||||
|
((struct ExtendedEventDescriptor *)Descriptor)->DescriptorNumber);
|
||||||
|
printf ("%s LastDescriptorNumber: %d\n", Prepend,
|
||||||
|
((struct ExtendedEventDescriptor *)Descriptor)->LastDescriptorNumber);
|
||||||
|
printf ("%s LanguageCode: %s\n", Prepend,
|
||||||
|
((struct ExtendedEventDescriptor *)Descriptor)->LanguageCode);
|
||||||
|
xForeach (((struct ExtendedEventDescriptor *)Descriptor)->Items, Item)
|
||||||
|
{
|
||||||
|
printf ("%s Item:\n");
|
||||||
|
printf ("%s Description: %s\n", xName(Item));
|
||||||
|
printf ("%s Text: %s\n", Item->Text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_CA_IDENT:
|
||||||
|
printf ("%sDescriptor: Conditional Access Identity\n", Prepend);
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < ((struct CaIdentifierDescriptor *)Descriptor)->Amount; j++)
|
||||||
|
printf ("%s SystemID: 0x%04x\n", Prepend, GetCaIdentifierID (Descriptor, j));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_CONTENT:
|
||||||
|
printf ("%sDescriptor: Content\n", Prepend);
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < ((struct ContentDescriptor *)Descriptor)->Amount; j++)
|
||||||
|
{
|
||||||
|
printf ("%s Content: ", Prepend);
|
||||||
|
for (i = 0; i < CONTENT_TYPE_NUMBER; i++)
|
||||||
|
if ((GetContentContentNibble1(Descriptor, j) == ContentTypes[i].Nibble1) &&
|
||||||
|
(GetContentContentNibble2(Descriptor, j) == ContentTypes[i].Nibble2))
|
||||||
|
{ printf ("%s\n", ContentTypes[i].Description); break; }
|
||||||
|
if (i == CONTENT_TYPE_NUMBER) { printf ("unbekannt\n"); }
|
||||||
|
printf ("%s User-Nibble 1: 0x%1x\n", Prepend, GetContentUserNibble1(Descriptor, j));
|
||||||
|
printf ("%s User-Nibble 2: 0x%1x\n", Prepend, GetContentUserNibble2(Descriptor, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_PARENTAL_RATING:
|
||||||
|
{
|
||||||
|
struct ParentalRating *Rating;
|
||||||
|
|
||||||
|
printf ("%sDescriptor: Parental Rating\n", Prepend);
|
||||||
|
xForeach (((struct ParentalRatingDescriptor *)Descriptor)->Ratings, Rating)
|
||||||
|
{
|
||||||
|
printf ("%s Rating:\n");
|
||||||
|
printf ("%s LanguageCode: %s\n", Rating->LanguageCode);
|
||||||
|
printf ("%s Rating: ");
|
||||||
|
if (Rating->Rating == 0) printf ("(undefined)\n");
|
||||||
|
else { if (Rating->Rating <= 0x10) printf ("minimum age is %d\n", Rating->Rating + 3);
|
||||||
|
else printf ("(rating is provider defined)\n"); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_NVOD_REF:
|
||||||
|
{
|
||||||
|
struct NvodReferenceItem *Item;
|
||||||
|
|
||||||
|
printf ("%sDescriptor: NVOD Reference\n", Prepend);
|
||||||
|
xForeach (((struct NvodReferenceDescriptor *)Descriptor)->Items, Item)
|
||||||
|
{
|
||||||
|
printf ("%s Item:\n", Prepend);
|
||||||
|
printf ("%s ServiceID: %d\n", Prepend, Item->ServiceID);
|
||||||
|
printf ("%s TransportStreamID: %d\n", Prepend, Item->TransportStreamID);
|
||||||
|
printf ("%s OriginalNetworkID: %d\n", Prepend, Item->OriginalNetworkID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_TIME_SHIFTED_SERVICE:
|
||||||
|
printf ("%sDescriptor: Time Shifted Service\n", Prepend);
|
||||||
|
printf ("%s ReferenceServiceID: %d\n", Prepend,
|
||||||
|
((struct TimeShiftedServiceDescriptor *)
|
||||||
|
Descriptor)->ReferenceServiceID);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_TIME_SHIFTED_EVENT:
|
||||||
|
printf ("%sDescriptor: Time Shifted Event\n", Prepend);
|
||||||
|
printf ("%s ReferenceServiceID: %d\n", Prepend,
|
||||||
|
((struct TimeShiftedEventDescriptor *)
|
||||||
|
Descriptor)->ReferenceServiceID);
|
||||||
|
printf ("%s ReferenceEventID: %d\n", Prepend,
|
||||||
|
((struct TimeShiftedEventDescriptor *)
|
||||||
|
Descriptor)->ReferenceEventID);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_ISO_639_LANGUAGE:
|
||||||
|
printf ("%sDescriptor: ISO 639 Language\n", Prepend);
|
||||||
|
printf ("%s LanguageCode: %s\n", Prepend,
|
||||||
|
((struct Iso639LanguageDescriptor *)Descriptor)->LanguageCode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_STREAM_ID:
|
||||||
|
printf ("%sDescriptor: Stream Identifier\n", Prepend);
|
||||||
|
printf ("%s ComponentTag: %d\n", Prepend,
|
||||||
|
((struct StreamIdentifierDescriptor *)Descriptor)->ComponentTag);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
printf ("%sDescriptor: Linkage\n", Prepend);
|
||||||
|
printf ("%s TransportStreamID: %d\n", Prepend,
|
||||||
|
((struct LinkageDescriptor *)Descriptor)->TransportStreamID);
|
||||||
|
printf ("%s OriginalNetworkID: %d\n", Prepend,
|
||||||
|
((struct LinkageDescriptor *)Descriptor)->OriginalNetworkID);
|
||||||
|
printf ("%s ServiceID: %d\n", Prepend,
|
||||||
|
((struct LinkageDescriptor *)Descriptor)->ServiceID);
|
||||||
|
printf ("%s LinkageType: %d\n", Prepend,
|
||||||
|
((struct LinkageDescriptor *)Descriptor)->LinkageType);
|
||||||
|
if (((struct LinkageDescriptor *)Descriptor)->PrivateDataLength)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
printf ("%s PrivateData: ", Prepend);
|
||||||
|
for (j = 0; j < ((struct LinkageDescriptor *)
|
||||||
|
Descriptor)->PrivateDataLength; j++)
|
||||||
|
printf ("0x%02X ", ((struct LinkageDescriptor *)
|
||||||
|
Descriptor)->PrivateData[j]);
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_NW_NAME:
|
||||||
|
case DESCR_SERVICE_LIST:
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
case DESCR_SAT_DEL_SYS:
|
||||||
|
case DESCR_CABLE_DEL_SYS:
|
||||||
|
case DESCR_VBI_DATA:
|
||||||
|
case DESCR_VBI_TELETEXT:
|
||||||
|
case DESCR_MOSAIC:
|
||||||
|
case DESCR_TELETEXT:
|
||||||
|
case DESCR_TELEPHONE:
|
||||||
|
case DESCR_LOCAL_TIME_OFF:
|
||||||
|
case DESCR_SUBTITLING:
|
||||||
|
case DESCR_TERR_DEL_SYS:
|
||||||
|
case DESCR_ML_NW_NAME:
|
||||||
|
case DESCR_ML_BQ_NAME:
|
||||||
|
case DESCR_ML_SERVICE_NAME:
|
||||||
|
case DESCR_ML_COMPONENT:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_SERVICE_MOVE:
|
||||||
|
case DESCR_SHORT_SMOOTH_BUF:
|
||||||
|
case DESCR_FREQUENCY_LIST:
|
||||||
|
case DESCR_PARTIAL_TP_STREAM:
|
||||||
|
case DESCR_DATA_BROADCAST:
|
||||||
|
case DESCR_CA_SYSTEM:
|
||||||
|
case DESCR_DATA_BROADCAST_ID:
|
||||||
|
case DESCR_TRANSPORT_STREAM:
|
||||||
|
case DESCR_DSNG:
|
||||||
|
case DESCR_PDC:
|
||||||
|
case DESCR_AC3:
|
||||||
|
case DESCR_CELL_LIST:
|
||||||
|
case DESCR_CELL_FREQ_LINK:
|
||||||
|
case DESCR_ANNOUNCEMENT_SUPPORT:
|
||||||
|
default:
|
||||||
|
printf ("%sDescriptor: (noch nicht unterstützt)\n", Prepend);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
217
libdtv/libsi/si_debug_services.h
Normal file
217
libdtv/libsi/si_debug_services.h
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// si_debug_services.h: local debugging definitions ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.1 $
|
||||||
|
// $Date: 2001/08/15 10:00:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// libsi 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.
|
||||||
|
//
|
||||||
|
// libsi 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 libsi; see the file COPYING. If not, write to the
|
||||||
|
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
// Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
|
||||||
|
struct component_type {
|
||||||
|
u_char Content;
|
||||||
|
u_char Type;
|
||||||
|
char *Description;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct component_type ComponentTypes[] = {
|
||||||
|
{ 0x01, 0x01, "video, 4:3 aspect ratio, 25 Hz" },
|
||||||
|
{ 0x01, 0x02, "video, 16:9 aspect ratio with pan vectors, 25 Hz" },
|
||||||
|
{ 0x01, 0x03, "video, 16:9 aspect ratio without pan vectors, 25 Hz" },
|
||||||
|
{ 0x01, 0x04, "video, > 16:9 aspect ratio, 25 Hz" },
|
||||||
|
{ 0x01, 0x05, "video, 4:3 aspect ratio, 30 Hz" },
|
||||||
|
{ 0x01, 0x06, "video, 16:9 aspect ratio with pan vectors, 30 Hz" },
|
||||||
|
{ 0x01, 0x07, "video, 16:9 aspect ratio without pan vectors, 30 Hz" },
|
||||||
|
{ 0x01, 0x08, "video, > 16:9 aspect ratio, 30 Hz" },
|
||||||
|
{ 0x01, 0x09, "HD video, 4:3 aspect ratio, 25 Hz" },
|
||||||
|
{ 0x01, 0x0A, "HD video, 16:9 aspect ratio with pan vectors, 25 Hz" },
|
||||||
|
{ 0x01, 0x0B, "HD video, 16:9 aspect ratio without pan vectors, 25 Hz" },
|
||||||
|
{ 0x01, 0x0C, "HD video, > 16:9 aspect ratio, 25 Hz" },
|
||||||
|
{ 0x01, 0x0D, "HD video, 4:3 aspect ratio, 30 Hz" },
|
||||||
|
{ 0x01, 0x0E, "HD video, 16:9 aspect ratio with pan vectors, 30 Hz" },
|
||||||
|
{ 0x01, 0x0F, "HD video, 16:9 aspect ratio without pan vectors, 30 Hz" },
|
||||||
|
{ 0x01, 0x10, "HD video, > 16:9 aspect ratio, 30 Hz" },
|
||||||
|
{ 0x02, 0x01, "audio, single mono channel" },
|
||||||
|
{ 0x02, 0x02, "audio, dual mono channel" },
|
||||||
|
{ 0x02, 0x03, "audio, stereo (2 channel)" },
|
||||||
|
{ 0x02, 0x04, "audio, multi lingual, multi channel" },
|
||||||
|
{ 0x02, 0x05, "audio, surround sound" },
|
||||||
|
{ 0x02, 0x40, "audio description for the visually impaired" },
|
||||||
|
{ 0x02, 0x41, "audio for the hard of hearing" },
|
||||||
|
{ 0x03, 0x01, "EBU Teletext subtitles" },
|
||||||
|
{ 0x03, 0x02, "associated EBU Teletext" },
|
||||||
|
{ 0x03, 0x03, "VBI data" },
|
||||||
|
{ 0x03, 0x10, "DVB subtitles (normal), no aspect criticality" },
|
||||||
|
{ 0x03, 0x11, "DVB subtitles (normal), aspect 4:3 only" },
|
||||||
|
{ 0x03, 0x12, "DVB subtitles (normal), aspect 16:9 only" },
|
||||||
|
{ 0x03, 0x13, "DVB subtitles (normal), aspect 2.21:1 only" },
|
||||||
|
{ 0x03, 0x20, "DVB subtitles (hard of hearing), no aspect criticality" },
|
||||||
|
{ 0x03, 0x21, "DVB subtitles (hard of hearing), aspect 4:3 only" },
|
||||||
|
{ 0x03, 0x22, "DVB subtitles (hard of hearing), aspect 16:9 only" },
|
||||||
|
{ 0x03, 0x23, "DVB subtitles (hard of hearing), aspect 2.21:1 only" }
|
||||||
|
};
|
||||||
|
#define COMPONENT_TYPE_NUMBER 35
|
||||||
|
|
||||||
|
|
||||||
|
struct service_type {
|
||||||
|
u_char Type;
|
||||||
|
char *Description;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct service_type ServiceTypes[] = {
|
||||||
|
{ 0x01, "digital television service" },
|
||||||
|
{ 0x02, "digital radio sound service" },
|
||||||
|
{ 0x03, "Teletext service" },
|
||||||
|
{ 0x04, "NVOD reference service" },
|
||||||
|
{ 0x05, "NVOD time-shifted service" },
|
||||||
|
{ 0x06, "mosaic service" },
|
||||||
|
{ 0x07, "PAL coded signal" },
|
||||||
|
{ 0x08, "SECAM coded signal" },
|
||||||
|
{ 0x09, "D/D2-MAC" },
|
||||||
|
{ 0x0A, "FM Radio" },
|
||||||
|
{ 0x0B, "NTSC coded signal" },
|
||||||
|
{ 0x0C, "data broadcast service" },
|
||||||
|
{ 0x0D, "common interface data" },
|
||||||
|
{ 0x0E, "RCS Map" },
|
||||||
|
{ 0x0F, "RCS FLS" },
|
||||||
|
{ 0x10, "DVB MHP service" }
|
||||||
|
};
|
||||||
|
#define SERVICE_TYPE_NUMBER 16
|
||||||
|
|
||||||
|
|
||||||
|
struct content_type {
|
||||||
|
u_char Nibble1;
|
||||||
|
u_char Nibble2;
|
||||||
|
char *Description;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct content_type ContentTypes[] = {
|
||||||
|
/* Movie/Drama: */
|
||||||
|
{ 0x01, 0x00, "movie/drama (general)" },
|
||||||
|
{ 0x01, 0x01, "detective/thriller" },
|
||||||
|
{ 0x01, 0x02, "adventure/western/war" },
|
||||||
|
{ 0x01, 0x03, "science fiction/fantasy/horror" },
|
||||||
|
{ 0x01, 0x04, "comedy" },
|
||||||
|
{ 0x01, 0x05, "soap/melodrama/folkloric" },
|
||||||
|
{ 0x01, 0x06, "romance" },
|
||||||
|
{ 0x01, 0x07, "serious/classical/religious/historical movie/drama" },
|
||||||
|
{ 0x01, 0x08, "adult movie/drama" },
|
||||||
|
/* News/Current affairs: */
|
||||||
|
{ 0x02, 0x00, "news/current affairs (general)" },
|
||||||
|
{ 0x02, 0x01, "news/weather report" },
|
||||||
|
{ 0x02, 0x02, "news magazine" },
|
||||||
|
{ 0x02, 0x03, "documentary" },
|
||||||
|
{ 0x02, 0x04, "discussion/interview/debate" },
|
||||||
|
/* Show/Game show: */
|
||||||
|
{ 0x03, 0x00, "show/game show (general)" },
|
||||||
|
{ 0x03, 0x01, "game show/quiz/contest" },
|
||||||
|
{ 0x03, 0x02, "variety show" },
|
||||||
|
{ 0x03, 0x03, "talk show" },
|
||||||
|
/* Sports: */
|
||||||
|
{ 0x04, 0x00, "sports (general)" },
|
||||||
|
{ 0x04, 0x01, "special events (Olympic Games, World Cup etc.)" },
|
||||||
|
{ 0x04, 0x02, "sports magazines" },
|
||||||
|
{ 0x04, 0x03, "football/soccer" },
|
||||||
|
{ 0x04, 0x04, "tennis/squash" },
|
||||||
|
{ 0x04, 0x05, "team sports (excluding football)" },
|
||||||
|
{ 0x04, 0x06, "athletics" },
|
||||||
|
{ 0x04, 0x07, "motor sport" },
|
||||||
|
{ 0x04, 0x08, "water sport" },
|
||||||
|
{ 0x04, 0x09, "winter sports" },
|
||||||
|
{ 0x04, 0x0A, "equestrian" },
|
||||||
|
{ 0x04, 0x0B, "martial sports" },
|
||||||
|
/* Children's/Youth programmes: */
|
||||||
|
{ 0x05, 0x00, "children's/youth programmes (general)" },
|
||||||
|
{ 0x05, 0x01, "pre-school children's programmes" },
|
||||||
|
{ 0x05, 0x02, "entertainment programmes for 6 to14" },
|
||||||
|
{ 0x05, 0x03, "entertainment programmes for 10 to 16" },
|
||||||
|
{ 0x05, 0x04, "informational/educational/school programmes" },
|
||||||
|
{ 0x05, 0x05, "cartoons/puppets" },
|
||||||
|
/* Music/Ballet/Dance: */
|
||||||
|
{ 0x06, 0x00, "music/ballet/dance (general)" },
|
||||||
|
{ 0x06, 0x01, "rock/pop" },
|
||||||
|
{ 0x06, 0x02, "serious music/classical music" },
|
||||||
|
{ 0x06, 0x03, "folk/traditional music" },
|
||||||
|
{ 0x06, 0x04, "jazz" },
|
||||||
|
{ 0x06, 0x05, "musical/opera" },
|
||||||
|
{ 0x06, 0x06, "ballet" },
|
||||||
|
/* Arts/Culture (without music): */
|
||||||
|
{ 0x07, 0x00, "arts/culture (without music, general)" },
|
||||||
|
{ 0x07, 0x01, "performing arts" },
|
||||||
|
{ 0x07, 0x02, "fine arts" },
|
||||||
|
{ 0x07, 0x03, "religion" },
|
||||||
|
{ 0x07, 0x04, "popular culture/traditional arts" },
|
||||||
|
{ 0x07, 0x05, "literature" },
|
||||||
|
{ 0x07, 0x06, "film/cinema" },
|
||||||
|
{ 0x07, 0x07, "experimental film/video" },
|
||||||
|
{ 0x07, 0x08, "broadcasting/press" },
|
||||||
|
{ 0x07, 0x09, "new media" },
|
||||||
|
{ 0x07, 0x0A, "arts/culture magazines" },
|
||||||
|
{ 0x07, 0x0B, "fashion" },
|
||||||
|
/* Social/Political issues/Economics: */
|
||||||
|
{ 0x08, 0x00, "social/political issues/economics (general)" },
|
||||||
|
{ 0x08, 0x01, "magazines/reports/documentary" },
|
||||||
|
{ 0x08, 0x02, "economics/social advisory" },
|
||||||
|
{ 0x08, 0x03, "remarkable people" },
|
||||||
|
/* Children's/Youth programmes: */
|
||||||
|
/* Education/ Science/Factual topics: */
|
||||||
|
{ 0x09, 0x00, "education/science/factual topics (general)" },
|
||||||
|
{ 0x09, 0x01, "nature/animals/environment" },
|
||||||
|
{ 0x09, 0x02, "technology/natural sciences" },
|
||||||
|
{ 0x09, 0x03, "medicine/physiology/psychology" },
|
||||||
|
{ 0x09, 0x04, "foreign countries/expeditions" },
|
||||||
|
{ 0x09, 0x05, "social/spiritual sciences" },
|
||||||
|
{ 0x09, 0x06, "further education" },
|
||||||
|
{ 0x09, 0x07, "languages" },
|
||||||
|
/* Leisure hobbies: */
|
||||||
|
{ 0x0A, 0x00, "leisure hobbies (general)" },
|
||||||
|
{ 0x0A, 0x01, "tourism/travel" },
|
||||||
|
{ 0x0A, 0x02, "handicraft" },
|
||||||
|
{ 0x0A, 0x03, "motoring" },
|
||||||
|
{ 0x0A, 0x04, "fitness & health" },
|
||||||
|
{ 0x0A, 0x05, "cooking" },
|
||||||
|
{ 0x0A, 0x06, "advertisement/shopping" },
|
||||||
|
{ 0x0A, 0x07, "gardening" },
|
||||||
|
{ 0x0B, 0x00, "original language" },
|
||||||
|
{ 0x0B, 0x01, "black & white" },
|
||||||
|
{ 0x0B, 0x02, "unpublished" },
|
||||||
|
{ 0x0B, 0x03, "live broadcast" }
|
||||||
|
};
|
||||||
|
#define CONTENT_TYPE_NUMBER 79
|
||||||
|
|
||||||
|
static char StreamTypes[][70] = {
|
||||||
|
"ITU-T|ISO/IEC Reserved",
|
||||||
|
"ISO/IEC Video",
|
||||||
|
"13818-2 Video or 11172-2 constrained parameter video stream",
|
||||||
|
"ISO/IEC 11172 Audio",
|
||||||
|
"ISO/IEC 13818-3 Audio",
|
||||||
|
"private_sections",
|
||||||
|
"packets containing private data / Videotext",
|
||||||
|
"ISO/IEC 13522 MPEG",
|
||||||
|
"ITU-T Rec. H.222.1",
|
||||||
|
"ISO/IEC 13818-6 type A",
|
||||||
|
"ISO/IEC 13818-6 type B",
|
||||||
|
"ISO/IEC 13818-6 type C",
|
||||||
|
"ISO/IEC 13818-6 type D",
|
||||||
|
"ISO/IEC 13818-1 auxiliary",
|
||||||
|
"ITU-T Rec. H.222.0 | ISO 13818-1 Reserved",
|
||||||
|
"User private"
|
||||||
|
};
|
881
libdtv/libsi/si_parser.c
Normal file
881
libdtv/libsi/si_parser.c
Normal file
@ -0,0 +1,881 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// si_parser.c: main parsing functions of libsi ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.2 $
|
||||||
|
// $Date: 2001/06/25 19:39:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
//
|
||||||
|
// libsi 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.
|
||||||
|
//
|
||||||
|
// libsi 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 libsi; 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 <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "../liblx/liblx.h"
|
||||||
|
#include "libsi.h"
|
||||||
|
#include "si_tables.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct LIST *siParsePAT (u_char *Buffer)
|
||||||
|
{
|
||||||
|
pat_t *Pat;
|
||||||
|
pat_prog_t *PatProgram;
|
||||||
|
u_char *Ptr;
|
||||||
|
u_int SectionLength;
|
||||||
|
int TransportStreamID;
|
||||||
|
int PatVersion;
|
||||||
|
struct Program *Program;
|
||||||
|
struct LIST *ProgramList = NULL;
|
||||||
|
|
||||||
|
if (!Buffer) return NULL;
|
||||||
|
|
||||||
|
Pat = (pat_t *) Buffer; Ptr = Buffer;
|
||||||
|
|
||||||
|
if (Pat->table_id != TID_PAT) {
|
||||||
|
// fprintf (stderr, "PAT: wrong TID %d\n", Pat->table_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionLength = HILO (Pat->section_length) + 3 - PAT_LEN - 4;
|
||||||
|
|
||||||
|
if (crc32 (Ptr, HILO (Pat->section_length) + 3)) return (NULL);
|
||||||
|
|
||||||
|
TransportStreamID = HILO (Pat->transport_stream_id);
|
||||||
|
PatVersion = Pat->version_number;
|
||||||
|
|
||||||
|
Ptr += PAT_LEN;
|
||||||
|
|
||||||
|
while (SectionLength > 0)
|
||||||
|
{
|
||||||
|
PatProgram = (pat_prog_t *) Ptr;
|
||||||
|
|
||||||
|
CreateProgram (Program, HILO (PatProgram->program_number),
|
||||||
|
TransportStreamID, HILO (PatProgram->network_pid), PatVersion);
|
||||||
|
|
||||||
|
if (!ProgramList) ProgramList = xNewList (NULL);
|
||||||
|
xAddTail (ProgramList, Program);
|
||||||
|
|
||||||
|
SectionLength -= PAT_PROG_LEN;
|
||||||
|
Ptr += PAT_PROG_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ProgramList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct Pid *siParsePMT (u_char *Buffer)
|
||||||
|
{
|
||||||
|
pmt_t *Pmt;
|
||||||
|
pmt_info_t *PmtInfo;
|
||||||
|
u_char *Ptr;
|
||||||
|
u_int SectionLength, ProgramInfoLength,
|
||||||
|
StreamLength, LoopLength;
|
||||||
|
int ProgramID;
|
||||||
|
int PcrID;
|
||||||
|
int PmtVersion;
|
||||||
|
struct Pid *Pid;
|
||||||
|
struct PidInfo *PidInfo;
|
||||||
|
|
||||||
|
if (!Buffer) return NULL;
|
||||||
|
|
||||||
|
Pmt = (pmt_t *) Buffer; Ptr = Buffer;
|
||||||
|
|
||||||
|
if (Pmt->table_id != TID_PMT) {
|
||||||
|
// fprintf (stderr, "PMT: wrong TID %d\n", Pmt->table_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionLength = HILO (Pmt->section_length) + 3 - 4;
|
||||||
|
|
||||||
|
if (crc32 (Ptr, HILO (Pmt->section_length) + 3)) return (NULL);
|
||||||
|
|
||||||
|
ProgramInfoLength = HILO (Pmt->program_info_length);
|
||||||
|
StreamLength = SectionLength - ProgramInfoLength - PMT_LEN;
|
||||||
|
|
||||||
|
ProgramID = HILO (Pmt->program_number);
|
||||||
|
PmtVersion = Pmt->version_number;
|
||||||
|
PcrID = HILO (Pmt->PCR_PID);
|
||||||
|
|
||||||
|
Ptr += PMT_LEN;
|
||||||
|
|
||||||
|
CreatePid (Pid, ProgramID, PcrID, PmtVersion);
|
||||||
|
|
||||||
|
siParseDescriptors (Pid->Descriptors, Ptr, ProgramInfoLength, Pmt->table_id);
|
||||||
|
|
||||||
|
Ptr += ProgramInfoLength;
|
||||||
|
|
||||||
|
while (StreamLength > 0)
|
||||||
|
{
|
||||||
|
PmtInfo = (pmt_info_t *) Ptr;
|
||||||
|
|
||||||
|
CreatePidInfo (PidInfo, PmtInfo->stream_type,
|
||||||
|
HILO (PmtInfo->elementary_PID));
|
||||||
|
|
||||||
|
LoopLength = HILO (PmtInfo->ES_info_length);
|
||||||
|
Ptr += PMT_INFO_LEN;
|
||||||
|
|
||||||
|
siParseDescriptors (PidInfo->Descriptors, Ptr, LoopLength, Pmt->table_id);
|
||||||
|
|
||||||
|
xAddTail (Pid->InfoList, PidInfo);
|
||||||
|
|
||||||
|
StreamLength -= LoopLength + PMT_INFO_LEN;
|
||||||
|
Ptr += LoopLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct LIST *siParseSDT (u_char *Buffer)
|
||||||
|
{
|
||||||
|
sdt_t *Sdt;
|
||||||
|
sdt_descr_t *SdtDescriptor;
|
||||||
|
u_char *Ptr;
|
||||||
|
u_int SectionLength, LoopLength;
|
||||||
|
int TransportStreamID;
|
||||||
|
int SdtVersion;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
struct Service *Service;
|
||||||
|
struct LIST *ServiceList = NULL;
|
||||||
|
|
||||||
|
if (!Buffer) return NULL;
|
||||||
|
|
||||||
|
Sdt = (sdt_t *) Buffer; Ptr = Buffer;
|
||||||
|
|
||||||
|
if (Sdt->table_id != TID_SDT_ACT && Sdt->table_id != TID_SDT_OTH) {
|
||||||
|
// fprintf (stderr, "SDT: wrong TID %d\n", Sdt->table_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionLength = HILO (Sdt->section_length) + 3 - SDT_LEN - 4;
|
||||||
|
|
||||||
|
if (crc32 (Ptr, HILO (Sdt->section_length) + 3)) return (NULL);
|
||||||
|
|
||||||
|
TransportStreamID = HILO (Sdt->transport_stream_id);
|
||||||
|
SdtVersion = Sdt->version_number;
|
||||||
|
OriginalNetworkID = HILO (Sdt->original_network_id);
|
||||||
|
|
||||||
|
Ptr += SDT_LEN;
|
||||||
|
|
||||||
|
while (SectionLength > 0)
|
||||||
|
{
|
||||||
|
SdtDescriptor = (sdt_descr_t *) Ptr;
|
||||||
|
|
||||||
|
CreateService (Service, HILO (SdtDescriptor->service_id),
|
||||||
|
TransportStreamID, OriginalNetworkID, SdtVersion,
|
||||||
|
SdtDescriptor->free_ca_mode ? CONDITIONAL_ACCESS : FREE_TO_AIR);
|
||||||
|
|
||||||
|
switch (SdtDescriptor->running_status)
|
||||||
|
{
|
||||||
|
case 0x01:
|
||||||
|
SetRunningStatus (Service->Status, RUNNING_STATUS_NOT_RUNNING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x02:
|
||||||
|
SetRunningStatus (Service->Status, RUNNING_STATUS_AWAITING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x03:
|
||||||
|
SetRunningStatus (Service->Status, RUNNING_STATUS_PAUSING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x04:
|
||||||
|
default:
|
||||||
|
SetRunningStatus (Service->Status, RUNNING_STATUS_RUNNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (SdtDescriptor->eit_schedule_flag)
|
||||||
|
SetScheduleFlag (Service->Status);
|
||||||
|
if (SdtDescriptor->eit_present_following_flag)
|
||||||
|
SetPresentFollowing (Service->Status);
|
||||||
|
|
||||||
|
LoopLength = HILO (SdtDescriptor->descriptors_loop_length);
|
||||||
|
Ptr += SDT_DESCR_LEN;
|
||||||
|
|
||||||
|
siParseDescriptors (Service->Descriptors, Ptr, LoopLength, Sdt->table_id);
|
||||||
|
|
||||||
|
if (!ServiceList) ServiceList = xNewList (NULL);
|
||||||
|
xAddTail (ServiceList, Service);
|
||||||
|
|
||||||
|
SectionLength -= LoopLength + SDT_DESCR_LEN;
|
||||||
|
Ptr += LoopLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ServiceList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct LIST *siParseEIT (u_char *Buffer)
|
||||||
|
{
|
||||||
|
eit_t *Eit;
|
||||||
|
eit_event_t *EitEvent;
|
||||||
|
u_char *Ptr;
|
||||||
|
u_int SectionLength, LoopLength;
|
||||||
|
int ServiceID;
|
||||||
|
int EitVersion;
|
||||||
|
int TransportStreamID;
|
||||||
|
int OriginalNetworkID;
|
||||||
|
struct Event *Event;
|
||||||
|
struct LIST *EventList = NULL;
|
||||||
|
|
||||||
|
if (!Buffer) return NULL;
|
||||||
|
|
||||||
|
Eit = (eit_t *) Buffer; Ptr = Buffer;
|
||||||
|
|
||||||
|
if (Eit->table_id != TID_EIT_ACT && Eit->table_id != TID_EIT_OTH &&
|
||||||
|
!(Eit->table_id >= TID_EIT_ACT_SCH &&
|
||||||
|
Eit->table_id <= TID_EIT_ACT_SCH + 0x0F) &&
|
||||||
|
!(Eit->table_id >= TID_EIT_OTH_SCH &&
|
||||||
|
Eit->table_id <= TID_EIT_OTH_SCH + 0x0F)) {
|
||||||
|
// fprintf (stderr, "EIT: wrong TID %d\n", Eit->table_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionLength = HILO (Eit->section_length) + 3 - EIT_LEN - 4;
|
||||||
|
|
||||||
|
if (crc32 (Ptr, HILO (Eit->section_length) + 3)) return (NULL);
|
||||||
|
|
||||||
|
ServiceID = HILO (Eit->service_id);
|
||||||
|
TransportStreamID = HILO (Eit->transport_stream_id);
|
||||||
|
EitVersion = Eit->version_number;
|
||||||
|
OriginalNetworkID = HILO (Eit->original_network_id);
|
||||||
|
|
||||||
|
Ptr += EIT_LEN;
|
||||||
|
|
||||||
|
while (SectionLength > 0)
|
||||||
|
{
|
||||||
|
struct tm thisTime;
|
||||||
|
int year, month, day;
|
||||||
|
double mjd;
|
||||||
|
|
||||||
|
EitEvent = (eit_event_t *) Ptr;
|
||||||
|
|
||||||
|
CreateEvent (Event, HILO (EitEvent->event_id), ServiceID,
|
||||||
|
TransportStreamID, OriginalNetworkID, EitVersion,
|
||||||
|
EitEvent->free_ca_mode ? CONDITIONAL_ACCESS : FREE_TO_AIR);
|
||||||
|
|
||||||
|
switch (EitEvent->running_status)
|
||||||
|
{
|
||||||
|
case 0x01:
|
||||||
|
SetRunningStatus (Event->Status, RUNNING_STATUS_NOT_RUNNING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x02:
|
||||||
|
SetRunningStatus (Event->Status, RUNNING_STATUS_AWAITING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x03:
|
||||||
|
SetRunningStatus (Event->Status, RUNNING_STATUS_PAUSING);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x04:
|
||||||
|
default:
|
||||||
|
SetRunningStatus (Event->Status, RUNNING_STATUS_RUNNING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Event->StartTime = MjdToEpochTime (EitEvent->mjd) +
|
||||||
|
BcdTimeToSeconds (EitEvent->start_time);
|
||||||
|
Event->Duration = BcdTimeToSeconds (EitEvent->duration);
|
||||||
|
|
||||||
|
LoopLength = HILO (EitEvent->descriptors_loop_length);
|
||||||
|
Ptr += EIT_EVENT_LEN;
|
||||||
|
|
||||||
|
siParseDescriptors (Event->Descriptors, Ptr, LoopLength, Eit->table_id);
|
||||||
|
|
||||||
|
if (!EventList) EventList = xNewList (NULL);
|
||||||
|
xAddTail (EventList, Event);
|
||||||
|
|
||||||
|
SectionLength -= LoopLength + EIT_EVENT_LEN;
|
||||||
|
Ptr += LoopLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (EventList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
time_t siParseTDT (u_char *Buffer)
|
||||||
|
{
|
||||||
|
tdt_t *Tdt;
|
||||||
|
u_char *Ptr;
|
||||||
|
u_int SectionLength;
|
||||||
|
int TdtVersion;
|
||||||
|
time_t CurrentTime;
|
||||||
|
|
||||||
|
if (!Buffer) return 0;
|
||||||
|
|
||||||
|
Tdt = (tdt_t *) Buffer; Ptr = Buffer;
|
||||||
|
|
||||||
|
if (Tdt->table_id != TID_TDT) {
|
||||||
|
// fprintf (stderr, "TDT: wrong TID %d\n", Tdt->table_id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SectionLength = HILO (Tdt->section_length) + 3; /* no CRC ?! */
|
||||||
|
|
||||||
|
CurrentTime = MjdToEpochTime (Tdt->utc_mjd) +
|
||||||
|
BcdTimeToSeconds (Tdt->utc_time);
|
||||||
|
|
||||||
|
return (CurrentTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer,
|
||||||
|
u_int Length, u_char TableID)
|
||||||
|
{
|
||||||
|
u_int DescriptorLength;
|
||||||
|
u_char *Ptr;
|
||||||
|
|
||||||
|
DescriptorLength = 0;
|
||||||
|
Ptr = Buffer;
|
||||||
|
|
||||||
|
while (DescriptorLength < Length)
|
||||||
|
{
|
||||||
|
switch (TableID)
|
||||||
|
{
|
||||||
|
case TID_NIT_ACT: case TID_NIT_OTH:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_NW_NAME:
|
||||||
|
case DESCR_SERVICE_LIST:
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
case DESCR_SAT_DEL_SYS:
|
||||||
|
case DESCR_CABLE_DEL_SYS:
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
case DESCR_TERR_DEL_SYS:
|
||||||
|
case DESCR_ML_NW_NAME:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_CELL_LIST:
|
||||||
|
case DESCR_CELL_FREQ_LINK:
|
||||||
|
case DESCR_ANNOUNCEMENT_SUPPORT:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* fprintf (stderr, "forbidden descriptor 0x%x in NIT\n",
|
||||||
|
GetDescriptorTag(Ptr));*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TID_BAT:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_SERVICE_LIST:
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
case DESCR_BOUQUET_NAME:
|
||||||
|
case DESCR_SERVICE:
|
||||||
|
case DESCR_COUNTRY_AVAIL:
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
case DESCR_CA_IDENT:
|
||||||
|
case DESCR_ML_BQ_NAME:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/*fprintf (stderr, "forbidden descriptor 0x%x in BAT\n",
|
||||||
|
GetDescriptorTag(Ptr));*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TID_SDT_ACT: case TID_SDT_OTH:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
case DESCR_BOUQUET_NAME:
|
||||||
|
case DESCR_SERVICE:
|
||||||
|
case DESCR_COUNTRY_AVAIL:
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
case DESCR_NVOD_REF:
|
||||||
|
case DESCR_TIME_SHIFTED_SERVICE:
|
||||||
|
case DESCR_MOSAIC:
|
||||||
|
case DESCR_CA_IDENT:
|
||||||
|
case DESCR_TELEPHONE:
|
||||||
|
case DESCR_ML_SERVICE_NAME:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_DATA_BROADCAST:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* fprintf (stderr, "forbidden descriptor 0x%x in SDT\n",
|
||||||
|
GetDescriptorTag(Ptr)); */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TID_EIT_ACT: case TID_EIT_OTH:
|
||||||
|
case TID_EIT_ACT_SCH: case TID_EIT_OTH_SCH:
|
||||||
|
case TID_EIT_ACT_SCH+1: case TID_EIT_OTH_SCH+1:
|
||||||
|
case TID_EIT_ACT_SCH+2: case TID_EIT_OTH_SCH+2:
|
||||||
|
case TID_EIT_ACT_SCH+3: case TID_EIT_OTH_SCH+3:
|
||||||
|
case TID_EIT_ACT_SCH+4: case TID_EIT_OTH_SCH+4:
|
||||||
|
case TID_EIT_ACT_SCH+5: case TID_EIT_OTH_SCH+5:
|
||||||
|
case TID_EIT_ACT_SCH+6: case TID_EIT_OTH_SCH+6:
|
||||||
|
case TID_EIT_ACT_SCH+7: case TID_EIT_OTH_SCH+7:
|
||||||
|
case TID_EIT_ACT_SCH+8: case TID_EIT_OTH_SCH+8:
|
||||||
|
case TID_EIT_ACT_SCH+9: case TID_EIT_OTH_SCH+9:
|
||||||
|
case TID_EIT_ACT_SCH+10: case TID_EIT_OTH_SCH+10:
|
||||||
|
case TID_EIT_ACT_SCH+11: case TID_EIT_OTH_SCH+11:
|
||||||
|
case TID_EIT_ACT_SCH+12: case TID_EIT_OTH_SCH+12:
|
||||||
|
case TID_EIT_ACT_SCH+13: case TID_EIT_OTH_SCH+13:
|
||||||
|
case TID_EIT_ACT_SCH+14: case TID_EIT_OTH_SCH+14:
|
||||||
|
case TID_EIT_ACT_SCH+15: case TID_EIT_OTH_SCH+15:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
case DESCR_SHORT_EVENT:
|
||||||
|
case DESCR_EXTENDED_EVENT:
|
||||||
|
case DESCR_TIME_SHIFTED_EVENT:
|
||||||
|
case DESCR_COMPONENT:
|
||||||
|
case DESCR_CA_IDENT:
|
||||||
|
case DESCR_CONTENT:
|
||||||
|
case DESCR_PARENTAL_RATING:
|
||||||
|
case DESCR_TELEPHONE:
|
||||||
|
case DESCR_ML_COMPONENT:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_SHORT_SMOOTH_BUF:
|
||||||
|
case DESCR_DATA_BROADCAST:
|
||||||
|
case DESCR_PDC:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/*fprintf (stderr, "forbidden descriptor 0x%x in EIT\n",
|
||||||
|
GetDescriptorTag(Ptr));*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TID_TOT:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_LOCAL_TIME_OFF:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/*fprintf (stderr, "forbidden descriptor 0x%x in TOT\n",
|
||||||
|
GetDescriptorTag(Ptr));*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TID_PMT:
|
||||||
|
switch (GetDescriptorTag(Ptr))
|
||||||
|
{
|
||||||
|
case DESCR_VBI_DATA:
|
||||||
|
case DESCR_VBI_TELETEXT:
|
||||||
|
case DESCR_MOSAIC:
|
||||||
|
case DESCR_STREAM_ID:
|
||||||
|
case DESCR_TELETEXT:
|
||||||
|
case DESCR_SUBTITLING:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_SERVICE_MOVE:
|
||||||
|
case DESCR_CA_SYSTEM:
|
||||||
|
case DESCR_DATA_BROADCAST_ID:
|
||||||
|
case DESCR_AC3:
|
||||||
|
case DESCR_ANCILLARY_DATA:
|
||||||
|
case DESCR_VIDEO_STREAM:
|
||||||
|
case DESCR_AUDIO_STREAM:
|
||||||
|
case DESCR_HIERARCHY:
|
||||||
|
case DESCR_REGISTRATION:
|
||||||
|
case DESCR_DATA_STREAM_ALIGN:
|
||||||
|
case DESCR_TARGET_BACKGRID:
|
||||||
|
case DESCR_VIDEO_WINDOW:
|
||||||
|
case DESCR_CA:
|
||||||
|
case DESCR_ISO_639_LANGUAGE:
|
||||||
|
case DESCR_SYSTEM_CLOCK:
|
||||||
|
case DESCR_MULTIPLEX_BUFFER_UTIL:
|
||||||
|
case DESCR_COPYRIGHT:
|
||||||
|
case DESCR_MAXIMUM_BITRATE:
|
||||||
|
siParseDescriptor (Descriptors, Ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* fprintf (stderr, "forbidden descriptor 0x%x in PMT\n",
|
||||||
|
GetDescriptorTag(Ptr)); */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf (stderr, "descriptor 0x%x in unsupported table 0x%x\n",
|
||||||
|
GetDescriptorTag(Ptr), TableID);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DescriptorLength += GetDescriptorLength (Ptr);
|
||||||
|
Ptr += GetDescriptorLength (Ptr);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer)
|
||||||
|
{
|
||||||
|
struct NODE *Descriptor = NULL;
|
||||||
|
char *Text , *Text2;
|
||||||
|
u_char *Ptr;
|
||||||
|
int Length, i;
|
||||||
|
|
||||||
|
if (!Descriptors || !Buffer) return;
|
||||||
|
|
||||||
|
Ptr = Buffer;
|
||||||
|
|
||||||
|
switch (GetDescriptorTag(Buffer))
|
||||||
|
{
|
||||||
|
case DESCR_ANCILLARY_DATA:
|
||||||
|
CreateAncillaryDataDescriptor (Descriptor,
|
||||||
|
CastAncillaryDataDescriptor(Buffer)->ancillary_data_identifier);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_BOUQUET_NAME:
|
||||||
|
Text = siGetDescriptorText (Buffer + DESCR_BOUQUET_NAME_LEN,
|
||||||
|
GetDescriptorLength (Buffer) - DESCR_BOUQUET_NAME_LEN);
|
||||||
|
CreateBouquetNameDescriptor (Descriptor, Text);
|
||||||
|
// xMemFree (Text);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_COMPONENT:
|
||||||
|
Text = siGetDescriptorText (Buffer + DESCR_COMPONENT_LEN,
|
||||||
|
GetDescriptorLength (Buffer) - DESCR_COMPONENT_LEN);
|
||||||
|
CreateComponentDescriptor (Descriptor,
|
||||||
|
CastComponentDescriptor(Buffer)->stream_content,
|
||||||
|
CastComponentDescriptor(Buffer)->component_type,
|
||||||
|
CastComponentDescriptor(Buffer)->component_tag,
|
||||||
|
CastComponentDescriptor(Buffer)->lang_code1,
|
||||||
|
CastComponentDescriptor(Buffer)->lang_code2,
|
||||||
|
CastComponentDescriptor(Buffer)->lang_code3, Text);
|
||||||
|
// xMemFree (Text);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_SERVICE:
|
||||||
|
Text = siGetDescriptorText (Buffer + DESCR_SERVICE_LEN,
|
||||||
|
CastServiceDescriptor(Buffer)->provider_name_length);
|
||||||
|
Text2 = siGetDescriptorText (Buffer + DESCR_SERVICE_LEN +
|
||||||
|
CastServiceDescriptor(Buffer)->provider_name_length + 1,
|
||||||
|
*((u_char *)(Buffer + DESCR_SERVICE_LEN +
|
||||||
|
CastServiceDescriptor(Buffer)->provider_name_length)));
|
||||||
|
CreateServiceDescriptor (Descriptor,
|
||||||
|
CastServiceDescriptor(Buffer)->service_type, Text, Text2);
|
||||||
|
// xMemFree (Text2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_COUNTRY_AVAIL:
|
||||||
|
CreateCountryAvailabilityDescriptor (Descriptor,
|
||||||
|
CastCountryAvailabilityDescriptor(Buffer)->country_availability_flag);
|
||||||
|
Length = GetDescriptorLength (Buffer) - DESCR_COUNTRY_AVAILABILITY_LEN;
|
||||||
|
Ptr += DESCR_COUNTRY_AVAILABILITY_LEN;
|
||||||
|
while (Length > 0)
|
||||||
|
{ AddCountryAvailabilityCode(Descriptor,
|
||||||
|
Ptr[0], Ptr[1], Ptr[2]); Ptr += 3; Length -= 3; }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_SHORT_EVENT:
|
||||||
|
Text = siGetDescriptorText (Buffer + DESCR_SHORT_EVENT_LEN,
|
||||||
|
CastShortEventDescriptor(Buffer)->event_name_length);
|
||||||
|
Text2 = siGetDescriptorText (Buffer + DESCR_SHORT_EVENT_LEN +
|
||||||
|
CastShortEventDescriptor(Buffer)->event_name_length + 1,
|
||||||
|
*((u_char *)(Buffer + DESCR_SHORT_EVENT_LEN +
|
||||||
|
CastShortEventDescriptor(Buffer)->event_name_length)));
|
||||||
|
CreateShortEventDescriptor (Descriptor, Text,
|
||||||
|
CastShortEventDescriptor(Buffer)->lang_code1,
|
||||||
|
CastShortEventDescriptor(Buffer)->lang_code2,
|
||||||
|
CastShortEventDescriptor(Buffer)->lang_code3, Text2);
|
||||||
|
// xMemFree (Text);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_EXTENDED_EVENT:
|
||||||
|
Text = siGetDescriptorText (Buffer + DESCR_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventDescriptor(Buffer)->length_of_items + 1,
|
||||||
|
*((u_char *)(Buffer + DESCR_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventDescriptor(Buffer)->length_of_items)));
|
||||||
|
CreateExtendedEventDescriptor (Descriptor,
|
||||||
|
CastExtendedEventDescriptor(Buffer)->descriptor_number,
|
||||||
|
CastExtendedEventDescriptor(Buffer)->last_descriptor_number,
|
||||||
|
CastExtendedEventDescriptor(Buffer)->lang_code1,
|
||||||
|
CastExtendedEventDescriptor(Buffer)->lang_code2,
|
||||||
|
CastExtendedEventDescriptor(Buffer)->lang_code3, Text);
|
||||||
|
// xMemFree (Text);
|
||||||
|
Length = CastExtendedEventDescriptor(Buffer)->length_of_items;
|
||||||
|
Ptr += DESCR_EXTENDED_EVENT_LEN;
|
||||||
|
while (Length > 0)
|
||||||
|
{
|
||||||
|
Text = siGetDescriptorText (Ptr + ITEM_EXTENDED_EVENT_LEN,
|
||||||
|
CastExtendedEventItem(Ptr)->item_description_length);
|
||||||
|
Text2 = siGetDescriptorText (Ptr + ITEM_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventItem(Ptr)->item_description_length + 1,
|
||||||
|
*((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventItem(Ptr)->item_description_length)));
|
||||||
|
AddExtendedEventItem (Descriptor, Text2, Text);
|
||||||
|
// xMemFree (Text2);
|
||||||
|
Length -= ITEM_EXTENDED_EVENT_LEN + CastExtendedEventItem(Ptr)->item_description_length +
|
||||||
|
*((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventItem(Ptr)->item_description_length)) + 1;
|
||||||
|
Ptr += ITEM_EXTENDED_EVENT_LEN + CastExtendedEventItem(Ptr)->item_description_length +
|
||||||
|
*((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN +
|
||||||
|
CastExtendedEventItem(Ptr)->item_description_length)) + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_CA_IDENT:
|
||||||
|
CreateCaIdentifierDescriptor (Descriptor,
|
||||||
|
(GetDescriptorLength(Buffer) - DESCR_CA_IDENTIFIER_LEN) / 2);
|
||||||
|
Length = GetDescriptorLength (Buffer) - DESCR_CA_IDENTIFIER_LEN;
|
||||||
|
Ptr += DESCR_CA_IDENTIFIER_LEN; i = 0;
|
||||||
|
while (Length > 0)
|
||||||
|
{ SetCaIdentifierID(Descriptor, i, *((u_short *) Ptr));
|
||||||
|
Length -= 2; Ptr += 2; i++; }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_CONTENT:
|
||||||
|
CreateContentDescriptor (Descriptor,
|
||||||
|
(GetDescriptorLength(Buffer) - DESCR_CONTENT_LEN) / 2);
|
||||||
|
Length = GetDescriptorLength (Buffer) - DESCR_CONTENT_LEN;
|
||||||
|
Ptr += DESCR_CONTENT_LEN; i = 0;
|
||||||
|
while (Length > 0)
|
||||||
|
{ SetContentID(Descriptor, i, CastContentNibble(Ptr)->content_nibble_level_1,
|
||||||
|
CastContentNibble(Ptr)->content_nibble_level_2,
|
||||||
|
CastContentNibble(Ptr)->user_nibble_1,
|
||||||
|
CastContentNibble(Ptr)->user_nibble_2);
|
||||||
|
Length -= 2; Ptr += 2; i++; }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_STUFFING:
|
||||||
|
/* intentionally ignored */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_PARENTAL_RATING:
|
||||||
|
CreateParentalRatingDescriptor (Descriptor);
|
||||||
|
Length = GetDescriptorLength (Buffer) - DESCR_PARENTAL_RATING_LEN;
|
||||||
|
Ptr += DESCR_PARENTAL_RATING_LEN; i = 0;
|
||||||
|
while (Length > 0)
|
||||||
|
{ AddParentalRating (Descriptor, CastParentalRating(Ptr)->lang_code1,
|
||||||
|
CastParentalRating(Ptr)->lang_code2, CastParentalRating(Ptr)->lang_code3,
|
||||||
|
CastParentalRating(Ptr)->rating);
|
||||||
|
Length -= PARENTAL_RATING_LEN; Ptr += PARENTAL_RATING_LEN; i++; }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_NVOD_REF:
|
||||||
|
CreateNvodReferenceDescriptor (Descriptor);
|
||||||
|
Length = GetDescriptorLength (Buffer) - DESCR_NVOD_REFERENCE_LEN;
|
||||||
|
Ptr += DESCR_NVOD_REFERENCE_LEN;
|
||||||
|
while (Length > 0)
|
||||||
|
{
|
||||||
|
AddNvodReferenceItem (Descriptor,
|
||||||
|
HILO (CastNvodReferenceItem(Ptr)->transport_stream_id),
|
||||||
|
HILO (CastNvodReferenceItem(Ptr)->original_network_id),
|
||||||
|
HILO (CastNvodReferenceItem(Ptr)->service_id));
|
||||||
|
Length -= ITEM_NVOD_REFERENCE_LEN;
|
||||||
|
Ptr += ITEM_NVOD_REFERENCE_LEN;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_TIME_SHIFTED_SERVICE:
|
||||||
|
CreateTimeShiftedServiceDescriptor (Descriptor,
|
||||||
|
HILO (CastTimeShiftedServiceDescriptor(Ptr)->reference_service_id));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_TIME_SHIFTED_EVENT:
|
||||||
|
CreateTimeShiftedEventDescriptor (Descriptor,
|
||||||
|
HILO (CastTimeShiftedEventDescriptor(Ptr)->reference_service_id),
|
||||||
|
HILO (CastTimeShiftedEventDescriptor(Ptr)->reference_event_id));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_ISO_639_LANGUAGE:
|
||||||
|
CreateIso639LanguageDescriptor (Descriptor,
|
||||||
|
CastIso639LanguageDescriptor(Buffer)->lang_code1,
|
||||||
|
CastIso639LanguageDescriptor(Buffer)->lang_code2,
|
||||||
|
CastIso639LanguageDescriptor(Buffer)->lang_code3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_STREAM_ID:
|
||||||
|
CreateStreamIdentifierDescriptor (Descriptor,
|
||||||
|
CastStreamIdentifierDescriptor(Ptr)->component_tag);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_LINKAGE:
|
||||||
|
CreateLinkageDescriptor (Descriptor,
|
||||||
|
HILO (CastLinkageDescriptor(Ptr)->transport_stream_id),
|
||||||
|
HILO (CastLinkageDescriptor(Ptr)->original_network_id),
|
||||||
|
HILO (CastLinkageDescriptor(Ptr)->service_id),
|
||||||
|
CastLinkageDescriptor(Ptr)->linkage_type,
|
||||||
|
GetDescriptorLength (Ptr) - DESCR_LINKAGE_LEN,
|
||||||
|
Ptr + DESCR_LINKAGE_LEN);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_VIDEO_STREAM:
|
||||||
|
case DESCR_AUDIO_STREAM:
|
||||||
|
case DESCR_HIERARCHY:
|
||||||
|
case DESCR_REGISTRATION:
|
||||||
|
case DESCR_DATA_STREAM_ALIGN:
|
||||||
|
case DESCR_TARGET_BACKGRID:
|
||||||
|
case DESCR_VIDEO_WINDOW:
|
||||||
|
case DESCR_CA:
|
||||||
|
case DESCR_SYSTEM_CLOCK:
|
||||||
|
case DESCR_MULTIPLEX_BUFFER_UTIL:
|
||||||
|
case DESCR_COPYRIGHT:
|
||||||
|
case DESCR_MAXIMUM_BITRATE:
|
||||||
|
case DESCR_PRIVATE_DATA_IND:
|
||||||
|
case DESCR_SMOOTHING_BUFFER:
|
||||||
|
case DESCR_STD:
|
||||||
|
case DESCR_IBP:
|
||||||
|
case DESCR_NW_NAME:
|
||||||
|
case DESCR_SERVICE_LIST:
|
||||||
|
case DESCR_SAT_DEL_SYS:
|
||||||
|
case DESCR_CABLE_DEL_SYS:
|
||||||
|
case DESCR_VBI_DATA:
|
||||||
|
case DESCR_VBI_TELETEXT:
|
||||||
|
case DESCR_MOSAIC:
|
||||||
|
case DESCR_TELETEXT:
|
||||||
|
case DESCR_TELEPHONE:
|
||||||
|
case DESCR_LOCAL_TIME_OFF:
|
||||||
|
case DESCR_SUBTITLING:
|
||||||
|
case DESCR_TERR_DEL_SYS:
|
||||||
|
case DESCR_ML_NW_NAME:
|
||||||
|
case DESCR_ML_BQ_NAME:
|
||||||
|
case DESCR_ML_SERVICE_NAME:
|
||||||
|
case DESCR_ML_COMPONENT:
|
||||||
|
case DESCR_PRIV_DATA_SPEC:
|
||||||
|
case DESCR_SERVICE_MOVE:
|
||||||
|
case DESCR_SHORT_SMOOTH_BUF:
|
||||||
|
case DESCR_FREQUENCY_LIST:
|
||||||
|
case DESCR_PARTIAL_TP_STREAM:
|
||||||
|
case DESCR_DATA_BROADCAST:
|
||||||
|
case DESCR_CA_SYSTEM:
|
||||||
|
case DESCR_DATA_BROADCAST_ID:
|
||||||
|
case DESCR_TRANSPORT_STREAM:
|
||||||
|
case DESCR_DSNG:
|
||||||
|
case DESCR_PDC:
|
||||||
|
case DESCR_AC3:
|
||||||
|
case DESCR_CELL_LIST:
|
||||||
|
case DESCR_CELL_FREQ_LINK:
|
||||||
|
case DESCR_ANNOUNCEMENT_SUPPORT:
|
||||||
|
default:
|
||||||
|
/* fprintf (stderr, "unsupported descriptor 0x%x\n",
|
||||||
|
GetDescriptorTag(Buffer)); */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (Descriptor) xAddTail (Descriptors, Descriptor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ToDo: ETSI conformal text definition
|
||||||
|
*/
|
||||||
|
char *siGetDescriptorText (u_char *Buffer, u_int Length)
|
||||||
|
{
|
||||||
|
char *tmp, *result;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (*Buffer == 0x05 || (*Buffer >= 0x20 && *Buffer <= 0xff))
|
||||||
|
{
|
||||||
|
xMemAlloc (Length+1, &result);
|
||||||
|
tmp = result;
|
||||||
|
for (i = 0; i < Length; i++)
|
||||||
|
{
|
||||||
|
if (*Buffer == 0) break;
|
||||||
|
|
||||||
|
if ((*Buffer >= ' ' && *Buffer <= '~') ||
|
||||||
|
(*Buffer >= 0xa0 && *Buffer <= 0xff)) *tmp++ = *Buffer++;
|
||||||
|
else Buffer++;
|
||||||
|
}
|
||||||
|
*tmp = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (*Buffer)
|
||||||
|
{
|
||||||
|
case 0x01: result = xSetText ("Coding according to character table 1"); break;
|
||||||
|
case 0x02: result = xSetText ("Coding according to character table 2"); break;
|
||||||
|
case 0x03: result = xSetText ("Coding according to character table 3"); break;
|
||||||
|
case 0x04: result = xSetText ("Coding according to character table 4"); break;
|
||||||
|
case 0x10: result = xSetText ("Coding according to ISO/IEC 8859"); break;
|
||||||
|
case 0x11: result = xSetText ("Coding according to ISO/IEC 10646"); break;
|
||||||
|
case 0x12: result = xSetText ("Coding according to KSC 5601"); break;
|
||||||
|
default: result = xSetText ("Unknown coding"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CRC32 lookup table for polynomial 0x04c11db7
|
||||||
|
|
||||||
|
static u_long crc_table[256] = {
|
||||||
|
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
|
||||||
|
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
|
||||||
|
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
|
||||||
|
0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
|
||||||
|
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
|
||||||
|
0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
|
||||||
|
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
|
||||||
|
0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
|
||||||
|
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
|
||||||
|
0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
|
||||||
|
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
|
||||||
|
0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
|
||||||
|
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
|
||||||
|
0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
|
||||||
|
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
|
||||||
|
0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
|
||||||
|
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
|
||||||
|
0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
|
||||||
|
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
|
||||||
|
0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
|
||||||
|
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
|
||||||
|
0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
|
||||||
|
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
|
||||||
|
0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
|
||||||
|
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
|
||||||
|
0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
|
||||||
|
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
|
||||||
|
0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
|
||||||
|
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
|
||||||
|
0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
|
||||||
|
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
|
||||||
|
0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
|
||||||
|
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
|
||||||
|
0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
|
||||||
|
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
|
||||||
|
0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
|
||||||
|
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
|
||||||
|
0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
|
||||||
|
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
|
||||||
|
0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
|
||||||
|
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
|
||||||
|
0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
|
||||||
|
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};
|
||||||
|
|
||||||
|
u_long crc32 (char *data, int len)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
u_long crc = 0xffffffff;
|
||||||
|
|
||||||
|
for (i=0; i<len; i++)
|
||||||
|
crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff];
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
339
libdtv/libvdr/COPYING
Normal file
339
libdtv/libvdr/COPYING
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program 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 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
62
libdtv/libvdr/Makefile
Normal file
62
libdtv/libvdr/Makefile
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
##############################################################
|
||||||
|
### ###
|
||||||
|
### Makefile: local makefile for libvdr ###
|
||||||
|
### ###
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
## $Revision: 1.2 $
|
||||||
|
## $Date: 2001/06/25 19:39:00 $
|
||||||
|
## $Author: hakenes $
|
||||||
|
##
|
||||||
|
## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL.
|
||||||
|
##
|
||||||
|
## libdtv 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.
|
||||||
|
##
|
||||||
|
## libdtv 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 libdtv; see the file COPYING. If not, write to the
|
||||||
|
## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
## Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2 -g -Wmissing-prototypes -Wstrict-prototypes \
|
||||||
|
-Wimplicit -D__USE_FIXED_PROTOTYPES__ -I../include # -DDEBUG
|
||||||
|
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = r
|
||||||
|
RANLIB = ranlib
|
||||||
|
RM = rm -f
|
||||||
|
CP = cp
|
||||||
|
|
||||||
|
VDRINCLUDE = libvdr.h
|
||||||
|
VDRLIB = libvdr.a
|
||||||
|
VDROBJS = libvdr.o
|
||||||
|
|
||||||
|
all : $(VDRLIB)
|
||||||
|
|
||||||
|
clean :
|
||||||
|
@echo "cleaning workspace..."
|
||||||
|
@$(RM) $(VDROBJS) $(VDRLIB)
|
||||||
|
|
||||||
|
new : clean all
|
||||||
|
|
||||||
|
$(VDRLIB) : $(VDROBJS)
|
||||||
|
@echo "updating library..."
|
||||||
|
@$(AR) $(ARFLAGS) $(VDRLIB) $(VDROBJS)
|
||||||
|
@$(RANLIB) $(VDRLIB)
|
||||||
|
|
||||||
|
dist: all
|
||||||
|
@echo "distributing libvdr.a and libvdr.h..."
|
||||||
|
@$(CP) $(VDRLIB) ../lib
|
||||||
|
@$(CP) $(VDRINCLUDE) ../include
|
||||||
|
|
169
libdtv/libvdr/libvdr.c
Normal file
169
libdtv/libvdr/libvdr.c
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// libvdr.c: routines to parse the DVB-SI stream ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.3 $
|
||||||
|
// $Date: 2001/06/25 19:39: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;
|
||||||
|
|
||||||
|
if (!siBuffer) return (NULL);
|
||||||
|
|
||||||
|
if (!(EventList = siParseEIT (siBuffer))) return (NULL);
|
||||||
|
|
||||||
|
Result = xNewList (NULL);
|
||||||
|
|
||||||
|
xForeach (EventList, Event)
|
||||||
|
{
|
||||||
|
VdrProgramInfo = NULL;
|
||||||
|
|
||||||
|
xForeach (Event->Descriptors, Descriptor)
|
||||||
|
{
|
||||||
|
switch (Descriptor->Tag)
|
||||||
|
{
|
||||||
|
case DESCR_SHORT_EVENT:
|
||||||
|
{
|
||||||
|
if (!xName(Descriptor) || !xName(Descriptor)[0])
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!VdrProgramInfo)
|
||||||
|
{
|
||||||
|
CreateVdrProgramInfo(VdrProgramInfo,
|
||||||
|
Event->EventID, Event->TransportStreamID,
|
||||||
|
Event->ServiceID, Event->StartTime,
|
||||||
|
Event->Duration, Event->Status);
|
||||||
|
|
||||||
|
VdrProgramInfo->ShortName =
|
||||||
|
xSetText (xName (Descriptor));
|
||||||
|
VdrProgramInfo->ShortText =
|
||||||
|
xSetText (((struct ShortEventDescriptor
|
||||||
|
*)Descriptor)->Text);
|
||||||
|
memcpy (VdrProgramInfo->LanguageCode, ((struct
|
||||||
|
ShortEventDescriptor *)Descriptor)->
|
||||||
|
LanguageCode, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_TIME_SHIFTED_EVENT:
|
||||||
|
{
|
||||||
|
struct tm *StartTime;
|
||||||
|
|
||||||
|
if (!VdrProgramInfo)
|
||||||
|
{
|
||||||
|
CreateVdrProgramInfo(VdrProgramInfo,
|
||||||
|
Event->EventID, Event->TransportStreamID,
|
||||||
|
Event->ServiceID, Event->StartTime,
|
||||||
|
Event->Duration, Event->Status);
|
||||||
|
|
||||||
|
VdrProgramInfo->ReferenceServiceID =
|
||||||
|
((struct TimeShiftedEventDescriptor
|
||||||
|
*)Descriptor)->ReferenceServiceID;
|
||||||
|
VdrProgramInfo->ReferenceEventID =
|
||||||
|
((struct TimeShiftedEventDescriptor
|
||||||
|
*)Descriptor)->ReferenceEventID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_EXTENDED_EVENT:
|
||||||
|
{
|
||||||
|
struct ExtendedEventItem *Item;
|
||||||
|
|
||||||
|
if (VdrProgramInfo)
|
||||||
|
{
|
||||||
|
if (xName (Descriptor))
|
||||||
|
AddToText (xName (Descriptor),
|
||||||
|
VdrProgramInfo->ExtendedName);
|
||||||
|
xForeach (((struct ExtendedEventDescriptor*)
|
||||||
|
Descriptor)->Items, Item)
|
||||||
|
{
|
||||||
|
AddItemToText (xName (Item),
|
||||||
|
VdrProgramInfo->ExtendedText);
|
||||||
|
AddItemToText (Item->Text,
|
||||||
|
VdrProgramInfo->ExtendedText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_CONTENT:
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (VdrProgramInfo)
|
||||||
|
{
|
||||||
|
for (j = 0; j < ((struct ContentDescriptor*)
|
||||||
|
Descriptor)->Amount; j++)
|
||||||
|
{
|
||||||
|
VdrProgramInfo->ContentNibble1 =
|
||||||
|
GetContentContentNibble1(Descriptor, j);
|
||||||
|
VdrProgramInfo->ContentNibble2 =
|
||||||
|
GetContentContentNibble2(Descriptor, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DESCR_PARENTAL_RATING:
|
||||||
|
{
|
||||||
|
struct ParentalRating *Rating;
|
||||||
|
|
||||||
|
if (VdrProgramInfo)
|
||||||
|
{
|
||||||
|
xForeach (((struct ParentalRatingDescriptor *)
|
||||||
|
Descriptor)->Ratings, Rating)
|
||||||
|
if (!strncmp (VdrProgramInfo->LanguageCode,
|
||||||
|
Rating->LanguageCode, 3))
|
||||||
|
VdrProgramInfo->Rating = Rating->Rating;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (VdrProgramInfo) xAddTail (Result, VdrProgramInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Result);
|
||||||
|
}
|
111
libdtv/libvdr/libvdr.h
Normal file
111
libdtv/libvdr/libvdr.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// libvdr.h: definitions necessary for the libvdr package ///
|
||||||
|
/// ///
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Revision: 1.3 $
|
||||||
|
// $Date: 2001/06/25 19:39:00 $
|
||||||
|
// $Author: hakenes $
|
||||||
|
//
|
||||||
|
// (C) 1992-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.
|
||||||
|
|
||||||
|
#ifndef LIBVDR_H
|
||||||
|
#define LIBVDR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct LIST *createVdrProgramInfos (unsigned char *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct VdrProgramInfo {
|
||||||
|
struct NODE Node;
|
||||||
|
int EventID;
|
||||||
|
int TransportStreamID;
|
||||||
|
int ServiceID;
|
||||||
|
time_t StartTime;
|
||||||
|
time_t Duration;
|
||||||
|
unsigned short Status;
|
||||||
|
char LanguageCode[4];
|
||||||
|
unsigned short Rating;
|
||||||
|
unsigned short ContentNibble1;
|
||||||
|
unsigned short ContentNibble2;
|
||||||
|
char *ShortName;
|
||||||
|
char *ShortText;
|
||||||
|
char *ExtendedName;
|
||||||
|
char *ExtendedText;
|
||||||
|
int ReferenceServiceID;
|
||||||
|
int ReferenceEventID;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define CreateVdrProgramInfo(cinf, evid, tpid, svid, stst, dura, sta) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
xCreateNode (cinf, NULL); \
|
||||||
|
cinf->EventID = evid; \
|
||||||
|
cinf->TransportStreamID = tpid; \
|
||||||
|
cinf->ServiceID = svid; \
|
||||||
|
cinf->StartTime = stst; \
|
||||||
|
cinf->Duration = dura; \
|
||||||
|
cinf->Status = sta; \
|
||||||
|
cinf->LanguageCode[0] = 0; \
|
||||||
|
cinf->Rating = 0; \
|
||||||
|
cinf->ContentNibble1 = 0; \
|
||||||
|
cinf->ContentNibble2 = 0; \
|
||||||
|
cinf->ShortName = NULL; \
|
||||||
|
cinf->ShortText = NULL; \
|
||||||
|
cinf->ExtendedName = NULL; \
|
||||||
|
cinf->ExtendedText = NULL; \
|
||||||
|
cinf->ReferenceServiceID = 0; \
|
||||||
|
cinf->ReferenceEventID = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define AddToText(src, dest) \
|
||||||
|
do { \
|
||||||
|
if (dest) \
|
||||||
|
{ \
|
||||||
|
char *tmbuf; \
|
||||||
|
xMemAlloc (strlen (src) + strlen (dest) + 4, &tmbuf); \
|
||||||
|
sprintf (tmbuf, "%s%s", (dest), (src)); \
|
||||||
|
xMemFree (dest); (dest) = tmbuf; \
|
||||||
|
} else { \
|
||||||
|
(dest) = xSetText (src); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define AddItemToText(src, dest) \
|
||||||
|
do { \
|
||||||
|
if (dest) \
|
||||||
|
{ \
|
||||||
|
char *tmbuf; \
|
||||||
|
xMemAlloc (strlen (src) + strlen (dest) + 4, &tmbuf); \
|
||||||
|
sprintf (tmbuf, "%s|%s", (dest), (src)); \
|
||||||
|
xMemFree (dest); (dest) = tmbuf; \
|
||||||
|
} else { \
|
||||||
|
(dest) = xSetText (src); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user