mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Updated the Estonian OSD texts (thanks to Arthur Konovalov). - Fixed following symbolic links in RemoveFileOrDir() (cont'd) (thanks to Steffen Barszus). - Changed the description of cDevice::GetSTC() to make it mandatory for devices that can replay. - Removed the check for positive STC values from cDvbSubtitleConverter::Action(). - Added cString::operator=(const char *String) (suggested by Antti Seppälä). - Some spelling fixes (thanks to Ville Skyttä). - Passing package name and version to xgettext (thanks to Ville Skyttä). - Made 'dist' target dependent on up to date *.po (thanks to Ville Skyttä). - Added Language and fixed Language-Team header of *.po (thanks to Ville Skyttä). - Updated the Lithuanian OSD texts (thanks to Valdemaras Pipiras). - Fixed detecting frames on channels that broadcast with 50 or 60 fps. This avoids artifacts during fast forward/rewind when replaying recordings from such channels. To fix the index of existing recordings from such channels, just delete the 'index' file of the recording and VDR will generate a new one the next time you play it. You should also change the line "F 25" to "F 50" in the 'info' file of that recording. - Added support for "registration descriptor" to 'libsi' and using it in pat.c (thanks to Rolf Ahrenberg). - Fixed unjustified log entries about changed channel pids (reported by Derek Kelly). - Added an include of VDR's 'Make.global' to libsi's Makefile (thanks to Rolf Ahrenberg). - Removed displaying the "contents" information from the "Classic VDR" and "ST:TNG Panels" skins, because it is often wrong and nothing but irritating. - Added typecasts to avoid gcc 4.5 warnings in switch statements on eKeys variables where additional 'k_...' flags are used. - Fixed inclusion of <stdarg.h> (thanks to Henning Heinold). - Changed "frame duration" to "frame rate" in vdr.5 (reported by Tobias Grimm). - Removing a cRemote from the Remotes list in case its initialization failed (thanks to Dominik Strasser). - Added LDFLAGS to the linker calls in the Makefiles (thanks to Joerg Bornkessel and Paul Menzel). - Now updating the 'frames per second' data in the list of recordings when a new recording is started that has a frame rate other than the default. - The include path to the freetype2 header files is now retrieved via a call to 'pkg-config --cflags freetype2' (suggested by Andreas Oberritter). - The OSD now has full TrueColor support. There can be several "pixmaps" that can be overlayed with alpha blending. All existing skins should work out of the box with the TrueColor OSD - the only exception being cOsd::GetBitmap(). Since the TrueColor OSD doesn't use bitmaps, this function will return a dummy bitmap, which may not be what the plugin expects. As long as this bitmap is only used for setting the palette, there is no problem. However, any other operations on this bitmap will have no effect. See the description of the cPixmap functions in osd.h for details about the new functionalities. The "ST:TNG Panels" skin has been enhanced to automatically use the TrueColor OSD if available. The "osddemo" plugin has been extended to show some of the possibilities of the TrueColor OSD if it is run on a system that actually provides TrueColor support. Thanks to Reinhard Nissl for some valuable input, help with debugging, and an implementation of the AlphaBlend() function. - Updated the Slovakian language texts (thanks to Milan Hrala). - Added Serbian language texts (thanks to Milan Cvijanovic). - Fixed reallocating memory in the "pictures" plugin (reported by Paul Menzel, with input from Oliver Endriss). - Fixed reallocating memory in cTsToPes::PutTs() (suggested by Oliver Endriss). - Now checking the result of all realloc() calls. - Fixed setting up the 'Recordings' menu in case there are several recordings with exactly the same name (reported by Marcus Hilbrich). - Setting the audio type of language descriptors to 0x00 in the PAT/PMT generator (thanks to Anssi Hannula). - Changed the compiler optimization flag to -O3, which gives quite a performance boost in the AlphaBlend() function. - While replaying, the editing marks are now updated every 10 seconds (based on a patch from Manuel Reimer). - Now reducing the thread and I/O priority cCuttingThread::Action() to make the foreground process more responsive (suggested by Frank Neumann). - Removed checking for minimum line length of 21 characters in the LIRC receiver code (reported by Gerald Dachs). - Updated the Romanian OSD texts (thanks to Lucian Muresan). - Now storing the original display size when handling DVB subtitles (thanks to Reinhard Nissl). - The original display size of subtitles is now used to scale them properly when displaying them on an HD OSD.
219 lines
8.3 KiB
C++
219 lines
8.3 KiB
C++
/*
|
|
* epg.h: Electronic Program Guide
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* Original version (as used in VDR before 1.3.0) written by
|
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
|
*
|
|
* $Id: epg.h 2.5 2011/02/25 14:14:38 kls Exp $
|
|
*/
|
|
|
|
#ifndef __EPG_H
|
|
#define __EPG_H
|
|
|
|
#include "channels.h"
|
|
#include "thread.h"
|
|
#include "tools.h"
|
|
|
|
#define MAXEPGBUGFIXLEVEL 3
|
|
|
|
enum { MaxEventContents = 4 };
|
|
|
|
enum eEventContentGroup {
|
|
ecgMovieDrama = 0x10,
|
|
ecgNewsCurrentAffairs = 0x20,
|
|
ecgShow = 0x30,
|
|
ecgSports = 0x40,
|
|
ecgChildrenYouth = 0x50,
|
|
ecgMusicBalletDance = 0x60,
|
|
ecgArtsCulture = 0x70,
|
|
ecgSocialPoliticalEconomics = 0x80,
|
|
ecgEducationalScience = 0x90,
|
|
ecgLeisureHobbies = 0xA0,
|
|
ecgSpecial = 0xB0,
|
|
ecgUserDefined = 0xF0
|
|
};
|
|
|
|
enum eDumpMode { dmAll, dmPresent, dmFollowing, dmAtTime };
|
|
|
|
struct tComponent {
|
|
uchar stream;
|
|
uchar type;
|
|
char language[MAXLANGCODE2];
|
|
char *description;
|
|
cString ToString(void);
|
|
bool FromString(const char *s);
|
|
};
|
|
|
|
class cComponents {
|
|
private:
|
|
int numComponents;
|
|
tComponent *components;
|
|
bool Realloc(int Index);
|
|
public:
|
|
cComponents(void);
|
|
~cComponents(void);
|
|
int NumComponents(void) const { return numComponents; }
|
|
void SetComponent(int Index, const char *s);
|
|
void SetComponent(int Index, uchar Stream, uchar Type, const char *Language, const char *Description);
|
|
tComponent *Component(int Index) const { return (Index < numComponents) ? &components[Index] : NULL; }
|
|
tComponent *GetComponent(int Index, uchar Stream, uchar Type); // Gets the Index'th component of Stream and Type, skipping other components
|
|
// In case of an audio stream the 'type' check actually just distinguishes between "normal" and "Dolby Digital"
|
|
};
|
|
|
|
class cSchedule;
|
|
|
|
typedef u_int32_t tEventID;
|
|
|
|
class cEvent : public cListObject {
|
|
friend class cSchedule;
|
|
private:
|
|
// The sequence of these parameters is optimized for minimal memory waste!
|
|
cSchedule *schedule; // The Schedule this event belongs to
|
|
tEventID eventID; // Event ID of this event
|
|
uchar tableID; // Table ID this event came from
|
|
uchar version; // Version number of section this event came from
|
|
uchar runningStatus; // 0=undefined, 1=not running, 2=starts in a few seconds, 3=pausing, 4=running
|
|
uchar parentalRating; // Parental rating of this event
|
|
char *title; // Title of this event
|
|
char *shortText; // Short description of this event (typically the episode name in case of a series)
|
|
char *description; // Description of this event
|
|
cComponents *components; // The stream components of this event
|
|
uchar contents[MaxEventContents]; // Contents of this event
|
|
time_t startTime; // Start time of this event
|
|
int duration; // Duration of this event in seconds
|
|
time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
|
|
time_t seen; // When this event was last seen in the data stream
|
|
public:
|
|
cEvent(tEventID EventID);
|
|
~cEvent();
|
|
virtual int Compare(const cListObject &ListObject) const;
|
|
tChannelID ChannelID(void) const;
|
|
const cSchedule *Schedule(void) const { return schedule; }
|
|
tEventID EventID(void) const { return eventID; }
|
|
uchar TableID(void) const { return tableID; }
|
|
uchar Version(void) const { return version; }
|
|
int RunningStatus(void) const { return runningStatus; }
|
|
const char *Title(void) const { return title; }
|
|
const char *ShortText(void) const { return shortText; }
|
|
const char *Description(void) const { return description; }
|
|
const cComponents *Components(void) const { return components; }
|
|
uchar Contents(int i = 0) const { return (0 <= i && i < MaxEventContents) ? contents[i] : 0; }
|
|
int ParentalRating(void) const { return parentalRating; }
|
|
time_t StartTime(void) const { return startTime; }
|
|
time_t EndTime(void) const { return startTime + duration; }
|
|
int Duration(void) const { return duration; }
|
|
time_t Vps(void) const { return vps; }
|
|
time_t Seen(void) const { return seen; }
|
|
bool SeenWithin(int Seconds) const { return time(NULL) - seen < Seconds; }
|
|
bool HasTimer(void) const;
|
|
bool IsRunning(bool OrAboutToStart = false) const;
|
|
static const char *ContentToString(uchar Content);
|
|
cString GetParentalRatingString(void) const;
|
|
cString GetDateString(void) const;
|
|
cString GetTimeString(void) const;
|
|
cString GetEndTimeString(void) const;
|
|
cString GetVpsString(void) const;
|
|
void SetEventID(tEventID EventID);
|
|
void SetTableID(uchar TableID);
|
|
void SetVersion(uchar Version);
|
|
void SetRunningStatus(int RunningStatus, cChannel *Channel = NULL);
|
|
void SetTitle(const char *Title);
|
|
void SetShortText(const char *ShortText);
|
|
void SetDescription(const char *Description);
|
|
void SetComponents(cComponents *Components); // Will take ownership of Components!
|
|
void SetContents(uchar *Contents);
|
|
void SetParentalRating(int ParentalRating);
|
|
void SetStartTime(time_t StartTime);
|
|
void SetDuration(int Duration);
|
|
void SetVps(time_t Vps);
|
|
void SetSeen(void);
|
|
cString ToDescr(void) const;
|
|
void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
|
|
bool Parse(char *s);
|
|
static bool Read(FILE *f, cSchedule *Schedule);
|
|
void FixEpgBugs(void);
|
|
};
|
|
|
|
class cSchedules;
|
|
|
|
class cSchedule : public cListObject {
|
|
private:
|
|
tChannelID channelID;
|
|
cList<cEvent> events;
|
|
cHash<cEvent> eventsHashID;
|
|
cHash<cEvent> eventsHashStartTime;
|
|
bool hasRunning;
|
|
time_t modified;
|
|
time_t presentSeen;
|
|
public:
|
|
cSchedule(tChannelID ChannelID);
|
|
tChannelID ChannelID(void) const { return channelID; }
|
|
time_t Modified(void) const { return modified; }
|
|
time_t PresentSeen(void) const { return presentSeen; }
|
|
bool PresentSeenWithin(int Seconds) const { return time(NULL) - presentSeen < Seconds; }
|
|
void SetModified(void) { modified = time(NULL); }
|
|
void SetPresentSeen(void) { presentSeen = time(NULL); }
|
|
void SetRunningStatus(cEvent *Event, int RunningStatus, cChannel *Channel = NULL);
|
|
void ClrRunningStatus(cChannel *Channel = NULL);
|
|
void ResetVersions(void);
|
|
void Sort(void);
|
|
void DropOutdated(time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version);
|
|
void Cleanup(time_t Time);
|
|
void Cleanup(void);
|
|
cEvent *AddEvent(cEvent *Event);
|
|
void DelEvent(cEvent *Event);
|
|
void HashEvent(cEvent *Event);
|
|
void UnhashEvent(cEvent *Event);
|
|
const cList<cEvent> *Events(void) const { return &events; }
|
|
const cEvent *GetPresentEvent(void) const;
|
|
const cEvent *GetFollowingEvent(void) const;
|
|
const cEvent *GetEvent(tEventID EventID, time_t StartTime = 0) const;
|
|
const cEvent *GetEventAround(time_t Time) const;
|
|
void Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0) const;
|
|
static bool Read(FILE *f, cSchedules *Schedules);
|
|
};
|
|
|
|
class cSchedulesLock {
|
|
private:
|
|
bool locked;
|
|
public:
|
|
cSchedulesLock(bool WriteLock = false, int TimeoutMs = 0);
|
|
~cSchedulesLock();
|
|
bool Locked(void) { return locked; }
|
|
};
|
|
|
|
class cSchedules : public cList<cSchedule> {
|
|
friend class cSchedule;
|
|
friend class cSchedulesLock;
|
|
private:
|
|
cRwLock rwlock;
|
|
static cSchedules schedules;
|
|
static const char *epgDataFileName;
|
|
static time_t lastCleanup;
|
|
static time_t lastDump;
|
|
static time_t modified;
|
|
public:
|
|
static void SetEpgDataFileName(const char *FileName);
|
|
static const cSchedules *Schedules(cSchedulesLock &SchedulesLock);
|
|
///< Caller must provide a cSchedulesLock which has to survive the entire
|
|
///< time the returned cSchedules is accessed. Once the cSchedules is no
|
|
///< longer used, the cSchedulesLock must be destroyed.
|
|
static time_t Modified(void) { return modified; }
|
|
static void SetModified(cSchedule *Schedule);
|
|
static void Cleanup(bool Force = false);
|
|
static void ResetVersions(void);
|
|
static bool ClearAll(void);
|
|
static bool Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0);
|
|
static bool Read(FILE *f = NULL);
|
|
cSchedule *AddSchedule(tChannelID ChannelID);
|
|
const cSchedule *GetSchedule(tChannelID ChannelID) const;
|
|
const cSchedule *GetSchedule(const cChannel *Channel, bool AddIfMissing = false) const;
|
|
};
|
|
|
|
void ReportEpgBugFixStats(bool Reset = false);
|
|
|
|
#endif //__EPG_H
|