1
0
mirror of https://github.com/rofafor/vdr-plugin-femon.git synced 2023-10-10 11:36:53 +00:00

Compare commits

...

2 Commits

Author SHA1 Message Date
Rolf Ahrenberg
74ed4d8490 Added "Stream Information" display mode.
Toggle between different modes with 'OK' key:
 .-> basic -> transponder -> stream -.
 `-----------------------------------´
Added missing german translations (Thanks to Peter Marquardt).
2004-05-30 04:20:00 +03:00
Rolf Ahrenberg
8c7c110cf2 Updated for vdr-1.3.7 and removed compability with older versions. 2004-05-18 04:20:00 +03:00
12 changed files with 927 additions and 349 deletions

22
HISTORY
View File

@@ -43,5 +43,23 @@ VDR Plugin 'femon' Revision History
2004-04-04: Version 0.0.3c 2004-04-04: Version 0.0.3c
- Fixed minor bitrate calculation errors - Fixed minor bitrate calculation errors.
- Added russian translation (Thanks to Vyacheslav Dikonov) - Added russian translation (Thanks to Vyacheslav Dikonov).
2004-05-31: Version 0.0.4
- Backported "stream information" feature (from version 0.1.1).
-------------------------
2004-05-18: Version 0.1.0
- Updated for vdr-1.3.7 and removed compability with older versions.
2004-05-30: Version 0.1.1
- Added "Stream Information" display mode.
Toggle between different modes with 'OK' key:
.-> basic -> transponder -> stream -.
`-----------------------------------<2D>
- Added missing german translations (Thanks to Peter Marquardt).

23
README
View File

@@ -12,34 +12,31 @@ Requirements:
Ph.D. in Astro Physics and preferably a six-pack waiting in a fridge. Ph.D. in Astro Physics and preferably a six-pack waiting in a fridge.
Never trust a Klingon. "Qu'vaD lI' De'vam". Beam me up, Scotty! Never trust a Klingon. "Qu'vaD lI' De'vam". Beam me up, Scotty!
You're number six! I'm number two.
Description: Description:
DVB Frontend Status Monitor is a plugin that displays some signal information DVB Frontend Status Monitor is a plugin that displays some signal information
parameters of the current tuned channel on OSD. You can zap through all your parameters of the current tuned channel on OSD. You can zap through all your
channels and the plugin should be monitoring always the right frontend. The channels and the plugin should be monitoring always the right frontend. The
transponder information is also available in advanced display mode. User can transponder and stream information are also available in advanced display modes.
switch between simple and advanced display modes by pressing 'OK' key. User can switch between different display modes by pressing 'OK' key.
The plugin is based on a neat console frontend status monitor application called The plugin is based on a neat console frontend status monitor application called
'femon' by Johannes Stezenbach <js@convergence.de> (see DVB-apps/szap/femon.c 'femon' by Johannes Stezenbach <js@convergence.de> (see DVB-apps/szap/femon.c
for further information). The other parts of plugin code are borrowed from the for further information). The other parts of plugin code are borrowed from the
excellent 'OSD Picture-In-Picture' plugin by Sascha Volkenandt <sascha@akv-soft.de> excellent 'OSD Picture-In-Picture' plugin by Sascha Volkenandt and Andreas Regel.
and Andreas Regel <andreas.regel@powarman.de>. The bitrate calculation algorithm The bitrate calculation algorithm originates from the 'dvbstream' application by
originates from the 'dvbstream' application by Dave Chapman <dave@dchapman.com>. Dave Chapman and the stream information routines from the 'libdvb' library by
Metzler Brothers.
Shortcomings / Todo list / Notes: Shortcomings / Todo list / Important Notes:
- The current version is a kind of Proof In Concept to replace the old 'tech
patch', and it's now eating many unnecessary cpu clock cycles - this will be
fixed later...
- The plugin supports only those DVB cards with _one_ frontend (do any cards - The plugin supports only those DVB cards with _one_ frontend (do any cards
with multiple frontends even exist?), because I haven't yet figured howto do with multiple frontends even exist?), because I haven't yet figured howto do
it without patching the VDR core. it without patching the VDR core.
- Sometimes (read always) ttxtsubs plugin messes up the OSD - user should disable - Sometimes (read always) ttxtsubs plugin messes up the OSD - user should disable
ttxtsubs, but closing and reopening the femon plugin might help temporarily as ttxtsubs, but closing and reopening the femon plugin might help temporarily as
well. Btw., this same thing happens with OSDTeletext plugin too :) well. Btw., this same thing happens with OSDTeletext plugin too :)
- The plugin GUI is designed for _small fonts_, so stable vdr-1.2.6 users should - Disable the stream analyze to speed up heavy zapping sessions.
consider a small font patch (e.g. ElchiAIO4a) to maximize the visual effect :) - If you're using VDR version 1.3.6 or older, you'll have to stick with femon-0.0.4!
- The stream information is still missing.
- Disable bitrate calculation to speed up heavy zapping sessions.

36
femon.c
View File

@@ -12,6 +12,10 @@
#include "femonosd.h" #include "femonosd.h"
#include "femon.h" #include "femon.h"
#if VDRVERSNUM < 10307
#error "You don't exist! Go away!"
#endif
cPluginFemon::cPluginFemon(void) cPluginFemon::cPluginFemon(void)
{ {
// Initialize any member variables here. // Initialize any member variables here.
@@ -70,16 +74,20 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value); else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value); else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value); else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
else if (!strcasecmp(Name, "ShowBitRate")) femonConfig.showbitrate = atoi(Value); else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value);
else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value); else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value);
else else
return false; return false;
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= modeMaxNumber) femonConfig.displaymode = 0;
return true; return true;
} }
cMenuFemonSetup::cMenuFemonSetup(void) cMenuFemonSetup::cMenuFemonSetup(void)
{ {
dispmodes[0] = tr("basic");
dispmodes[1] = tr("transponder");
dispmodes[2] = tr("stream");
Setup(); Setup();
} }
@@ -88,16 +96,16 @@ void cMenuFemonSetup::Setup(void)
int current = Current(); int current = Current();
Clear(); Clear();
Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes")));
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
Add(new cMenuEditBoolItem( tr("Default Display Mode"), &femonConfig.displaymode, tr("simple"), tr("advanced"))); Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes));
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top"))); Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50)); Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100)); Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100)); Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
Add(new cMenuEditBoolItem( tr("Bitrate Calculation"), &femonConfig.showbitrate, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Analyze Stream"), &femonConfig.analyzestream, tr("no"), tr("yes")));
if (femonConfig.showbitrate) if (femonConfig.analyzestream)
Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100)); Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100));
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
@@ -112,17 +120,17 @@ void cMenuFemonSetup::Store(void)
SetupStore("RedLimit", femonConfig.redlimit); SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit); SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval); SetupStore("UpdateInterval", femonConfig.updateinterval);
SetupStore("ShowBitRate", femonConfig.showbitrate); SetupStore("AnalStream", femonConfig.analyzestream);
SetupStore("CalcInterval", femonConfig.calcinterval); SetupStore("CalcInterval", femonConfig.calcinterval);
} }
eOSState cMenuFemonSetup::ProcessKey(eKeys Key) eOSState cMenuFemonSetup::ProcessKey(eKeys Key)
{ {
int oldShowbitrate = femonConfig.showbitrate; int oldAnalyzestream = femonConfig.analyzestream;
eOSState state = cMenuSetupPage::ProcessKey(Key); eOSState state = cMenuSetupPage::ProcessKey(Key);
if (Key != kNone && (femonConfig.showbitrate != oldShowbitrate)) { if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) {
Setup(); Setup();
} }

View File

@@ -11,7 +11,7 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
static const char *VERSION = "0.0.3c"; static const char *VERSION = "0.1.1";
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)"; static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)";
static const char *MAINMENUENTRY = "Signal Information"; static const char *MAINMENUENTRY = "Signal Information";
@@ -36,6 +36,7 @@ public:
class cMenuFemonSetup : public cMenuSetupPage { class cMenuFemonSetup : public cMenuSetupPage {
private: private:
const char *dispmodes[modeMaxNumber];
virtual void Setup(void); virtual void Setup(void);
protected: protected:
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);

View File

@@ -18,7 +18,7 @@ cFemonConfig::cFemonConfig(void)
redlimit = 33; redlimit = 33;
greenlimit = 66; greenlimit = 66;
updateinterval = 5; updateinterval = 5;
showbitrate = 1; analyzestream = 1;
calcinterval = 20; calcinterval = 20;
syslogoutput = 0; syslogoutput = 0;
} }

View File

@@ -9,6 +9,13 @@
#ifndef __FEMONCFG_H #ifndef __FEMONCFG_H
#define __FEMONCFG_H #define __FEMONCFG_H
enum dispModes {
modeBasic,
modeTransponder,
modeStream,
modeMaxNumber
};
struct cFemonConfig struct cFemonConfig
{ {
public: public:
@@ -19,7 +26,7 @@ public:
int redlimit; int redlimit;
int greenlimit; int greenlimit;
int updateinterval; int updateinterval;
int showbitrate; int analyzestream;
int calcinterval; int calcinterval;
int syslogoutput; int syslogoutput;
}; };

View File

@@ -25,9 +25,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Signal Information", // English { "Signal Information", // English
"Signalinformationen", // Deutsch "Signalinformationen", // Deutsch
@@ -45,9 +44,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Position", // English { "Position", // English
"Position", // Deutsch "Position", // Deutsch
@@ -65,9 +63,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Default Display Mode", // English { "Default Display Mode", // English
"Standard Anzeigemodus", // Deutsch "Standard Anzeigemodus", // Deutsch
@@ -85,19 +82,18 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "simple", // English { "basic", // English
"einfach", // Deutsch "Standard", // Deutsch
"", // Slovenski "", // Slovenski
"semplice", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portugu<67>s "", // Portugu<67>s
"", // Fran<61>ais "", // Fran<61>ais
"", // Norsk "", // Norsk
"suppea", // suomi "perus", // suomi
"", // Polski "", // Polski
"", // Espa<70>ol "", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
@@ -105,19 +101,18 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "advanced", // English { "transponder", // English
"fortgeschritten", // Deutsch "Transponder", // Deutsch
"", // Slovenski "", // Slovenski
"avanzato", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portugu<67>s "", // Portugu<67>s
"", // Fran<61>ais "", // Fran<61>ais
"", // Norsk "", // Norsk
"laaja", // suomi "transponderi", // suomi
"", // Polski "", // Polski
"", // Espa<70>ol "", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
@@ -125,9 +120,27 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif },
{ "stream", // English
"Stream", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"l<EFBFBD>hete", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
}, },
{ "Hide Mainmenu Entry", // English { "Hide Mainmenu Entry", // English
"Hauptmen<EFBFBD>eintrag verstecken", // Deutsch "Hauptmen<EFBFBD>eintrag verstecken", // Deutsch
@@ -145,9 +158,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "OSD Update Interval [0.1s]", // English { "OSD Update Interval [0.1s]", // English
"OSD Updateintervall [0.1s]", // Deutsch "OSD Updateintervall [0.1s]", // Deutsch
@@ -165,19 +177,18 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Bitrate Calculation", // English { "Analyze Stream", // English
"Bitratenberechnung", // Deutsch "Stream analysieren", // Deutsch
"", // Slovenski "", // Slovenski
"Calcolo Bitrate", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portugu<67>s "", // Portugu<67>s
"", // Fran<61>ais "", // Fran<61>ais
"", // Norsk "", // Norsk
"Siirtonopeuden laskenta", // suomi "L<EFBFBD>hetteen analysointi", // suomi
"", // Polski "", // Polski
"", // Espa<70>ol "", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
@@ -185,9 +196,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Calculation Interval [0.1s]", // English { "Calculation Interval [0.1s]", // English
"Berechnungsintervall [0.1s]", // Deutsch "Berechnungsintervall [0.1s]", // Deutsch
@@ -205,9 +215,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Red Limit [%]", // English { "Red Limit [%]", // English
"Grenze Rot [%]", // Deutsch "Grenze Rot [%]", // Deutsch
@@ -225,9 +234,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Green Limit [%]", // English { "Green Limit [%]", // English
"Grenze Gr<47>n [%]", // Deutsch "Grenze Gr<47>n [%]", // Deutsch
@@ -245,9 +253,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Transponder Information", // English { "Transponder Information", // English
"Transponderinformation", // Deutsch "Transponderinformation", // Deutsch
@@ -265,9 +272,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Satellite Card", // English { "Satellite Card", // English
"Satellitenkarte", // Deutsch "Satellitenkarte", // Deutsch
@@ -285,9 +291,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Cable Card", // English { "Cable Card", // English
"Kabelkarte", // Deutsch "Kabelkarte", // Deutsch
@@ -305,9 +310,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Terrestial Card", // English { "Terrestial Card", // English
"Terrestrische Karte", // Deutsch "Terrestrische Karte", // Deutsch
@@ -325,9 +329,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "Use Syslog Output", // English { "Use Syslog Output", // English
"Benutze syslog Ausgabe", // Deutsch "Benutze syslog Ausgabe", // Deutsch
@@ -345,9 +348,8 @@ const tI18nPhrase Phrases[] = {
"", // Romaneste "", // Romaneste
"", // Magyar "", // Magyar
"", // Catal<61> "", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> syslog", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> syslog" // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "", // Hrvatski (Croatian)
#endif
}, },
{ "LOCK", // English { "LOCK", // English
"LOCK", // Deutsch "LOCK", // Deutsch
@@ -365,9 +367,8 @@ const tI18nPhrase Phrases[] = {
"LOCK", // Romaneste "LOCK", // Romaneste
"LOCK", // Magyar "LOCK", // Magyar
"LOCK", // Catal<61> "LOCK", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "LOCK", // Hrvatski (Croatian)
#endif
}, },
{ "SIGNAL", // English { "SIGNAL", // English
"SIGNAL", // Deutsch "SIGNAL", // Deutsch
@@ -385,9 +386,8 @@ const tI18nPhrase Phrases[] = {
"SIGNAL", // Romaneste "SIGNAL", // Romaneste
"SIGNAL", // Magyar "SIGNAL", // Magyar
"SIGNAL", // Catal<61> "SIGNAL", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "SIGNAL", // Hrvatski (Croatian)
#endif
}, },
{ "CARRIER", // English { "CARRIER", // English
"CARRIER", // Deutsch "CARRIER", // Deutsch
@@ -405,9 +405,8 @@ const tI18nPhrase Phrases[] = {
"CARRIER", // Romaneste "CARRIER", // Romaneste
"CARRIER", // Magyar "CARRIER", // Magyar
"CARRIER", // Catal<61> "CARRIER", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "CARRIER", // Hrvatski (Croatian)
#endif
}, },
{ "VITERBI", // English { "VITERBI", // English
"VITERBI", // Deutsch "VITERBI", // Deutsch
@@ -425,9 +424,8 @@ const tI18nPhrase Phrases[] = {
"VITERBI", // Romaneste "VITERBI", // Romaneste
"VITERBI", // Magyar "VITERBI", // Magyar
"VITERBI", // Catal<61> "VITERBI", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "VITERBI", // Hrvatski (Croatian)
#endif
}, },
{ "SYNC", // English { "SYNC", // English
"SYNC", // Deutsch "SYNC", // Deutsch
@@ -445,9 +443,8 @@ const tI18nPhrase Phrases[] = {
"SYNC", // Romaneste "SYNC", // Romaneste
"SYNC", // Magyar "SYNC", // Magyar
"SYNC", // Catal<61> "SYNC", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "SYNC", // Hrvatski (Croatian)
#endif
}, },
{ "Audio", // English { "Audio", // English
"Audio", // Deutsch "Audio", // Deutsch
@@ -457,7 +454,7 @@ const tI18nPhrase Phrases[] = {
"Audio", // Portugu<67>s "Audio", // Portugu<67>s
"Audio", // Fran<61>ais "Audio", // Fran<61>ais
"Audio", // Norsk "Audio", // Norsk
"Audio", // suomi "<EFBFBD><EFBFBD>ni", // suomi
"Audio", // Polski "Audio", // Polski
"Audio", // Espa<70>ol "Audio", // Espa<70>ol
"Audio", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) "Audio", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
@@ -465,9 +462,8 @@ const tI18nPhrase Phrases[] = {
"Audio", // Romaneste "Audio", // Romaneste
"Audio", // Magyar "Audio", // Magyar
"Audio", // Catal<61> "Audio", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "Audio", // Hrvatski (Croatian)
#endif
}, },
{ "Video", // English { "Video", // English
"Video", // Deutsch "Video", // Deutsch
@@ -477,7 +473,7 @@ const tI18nPhrase Phrases[] = {
"Video", // Portugu<67>s "Video", // Portugu<67>s
"Video", // Fran<61>ais "Video", // Fran<61>ais
"Video", // Norsk "Video", // Norsk
"Video", // suomi "Kuva", // suomi
"Video", // Polski "Video", // Polski
"Video", // Espa<70>ol "Video", // Espa<70>ol
"Video", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) "Video", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
@@ -485,9 +481,8 @@ const tI18nPhrase Phrases[] = {
"Video", // Romaneste "Video", // Romaneste
"Video", // Magyar "Video", // Magyar
"Video", // Catal<61> "Video", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "Video", // Hrvatski (Croatian)
#endif
}, },
{ "Auto", // English { "Auto", // English
"Auto", // Deutsch "Auto", // Deutsch
@@ -505,9 +500,8 @@ const tI18nPhrase Phrases[] = {
"Auto", // Romaneste "Auto", // Romaneste
"Auto", // Magyar "Auto", // Magyar
"Auto", // Catal<61> "Auto", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "Auto", // Hrvatski (Croatian)
#endif
}, },
{ "None", // English { "None", // English
"None", // Deutsch "None", // Deutsch
@@ -525,9 +519,8 @@ const tI18nPhrase Phrases[] = {
"None", // Romaneste "None", // Romaneste
"None", // Magyar "None", // Magyar
"None", // Catal<61> "None", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "None", // Hrvatski (Croatian)
#endif
}, },
{ "Off", // English { "Off", // English
"Off", // Deutsch "Off", // Deutsch
@@ -545,9 +538,8 @@ const tI18nPhrase Phrases[] = {
"Off", // Romaneste "Off", // Romaneste
"Off", // Magyar "Off", // Magyar
"Off", // Catal<61> "Off", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "Off", // Hrvatski (Croatian)
#endif
}, },
{ "On", // English { "On", // English
"On", // Deutsch "On", // Deutsch
@@ -565,9 +557,8 @@ const tI18nPhrase Phrases[] = {
"On", // Romaneste "On", // Romaneste
"On", // Magyar "On", // Magyar
"On", // Catal<61> "On", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "On", // Hrvatski (Croatian)
#endif
}, },
{ "MHz", // English { "MHz", // English
"MHz", // Deutsch "MHz", // Deutsch
@@ -585,9 +576,8 @@ const tI18nPhrase Phrases[] = {
"MHz", // Romaneste "MHz", // Romaneste
"MHz", // Magyar "MHz", // Magyar
"MHz", // Catal<61> "MHz", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "MHz", // Hrvatski (Croatian)
#endif
}, },
{ "Mbit/s", // English { "Mbit/s", // English
"Mbit/s", // Deutsch "Mbit/s", // Deutsch
@@ -605,9 +595,8 @@ const tI18nPhrase Phrases[] = {
"Mbit/s", // Romaneste "Mbit/s", // Romaneste
"Mbit/s", // Magyar "Mbit/s", // Magyar
"Mbit/s", // Catal<61> "Mbit/s", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "Mbit/s", // Hrvatski (Croatian)
#endif
}, },
{ "kbit/s", // English { "kbit/s", // English
"kbit/s", // Deutsch "kbit/s", // Deutsch
@@ -625,9 +614,350 @@ const tI18nPhrase Phrases[] = {
"kbit/s", // Romaneste "kbit/s", // Romaneste
"kbit/s", // Magyar "kbit/s", // Magyar
"kbit/s", // Catal<61> "kbit/s", // Catal<61>
#if VDRVERSNUM >= 10300 "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>" // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) "kbit/s", // Hrvatski (Croatian)
#endif },
{ "Stream Information", // English
"Streaminformation", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"L<EFBFBD>hetteen tiedot", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "MPEG Layer", // English
"MPEG Layer", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"MPEG-taso", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Video Stream", // English
"Video Stream", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kuvaraita", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Bitrate", // English
"Bitrate", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Bittinopeus", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Frame Rate", // English
"Bildrate", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Ruudunp<EFBFBD>ivitysnopeus", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Hz", // English
"Hz", // Deutsch
"Hz", // Slovenski
"Hz", // Italiano
"Hz", // Nederlands
"Hz", // Portugu<67>s
"Hz", // Fran<61>ais
"Hz", // Norsk
"Hz", // suomi
"Hz", // Polski
"Hz", // Espa<70>ol
"Hz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"Hz", // Svenska
"Hz", // Romaneste
"Hz", // Magyar
"Hz", // Catal<61>
"Hz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Hz", // Hrvatski (Croatian)
},
{ "Aspect Ratio", // English
"Seitenverh<EFBFBD>ltnis", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kuvasuhde", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "reserved", // English
"belegt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"varattu", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "free", // English
"frei", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"vapaa", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Video Format", // English
"Bildformat", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kuvaformaatti", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "PAL", // English
"PAL", // Deutsch
"PAL", // Slovenski
"PAL", // Italiano
"PAL", // Nederlands
"PAL", // Portugu<67>s
"PAL", // Fran<61>ais
"PAL", // Norsk
"PAL", // suomi
"PAL", // Polski
"PAL", // Espa<70>ol
"PAL", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"PAL", // Svenska
"PAL", // Romaneste
"PAL", // Magyar
"PAL", // Catal<61>
"PAL", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"PAL", // Hrvatski (Croatian)
},
{ "NTSC", // English
"NTSC", // Deutsch
"NTSC", // Slovenski
"NTSC", // Italiano
"NTSC", // Nederlands
"NTSC", // Portugu<67>s
"NTSC", // Fran<61>ais
"NTSC", // Norsk
"NTSC", // suomi
"NTSC", // Polski
"NTSC", // Espa<70>ol
"NTSC", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"NTSC", // Svenska
"NTSC", // Romaneste
"NTSC", // Magyar
"NTSC", // Catal<61>
"NTSC", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"NTSC", // Hrvatski (Croatian)
},
{ "unknown", // English
"unbekannt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"tuntematon", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Resolution", // English
"Aufl<EFBFBD>sung", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Resoluutio", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Audio Stream", // English
"Audio Stream", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"<EFBFBD><EFBFBD>niraita", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "Sampling Frequency", // English
"Abtastrate", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"N<EFBFBD>ytteenottotaajuus", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
},
{ "kHz", // English
"kHz", // Deutsch
"kHz", // Slovenski
"kHz", // Italiano
"kHz", // Nederlands
"kHz", // Portugu<67>s
"kHz", // Fran<61>ais
"kHz", // Norsk
"kHz", // suomi
"kHz", // Polski
"kHz", // Espa<70>ol
"kHz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"kHz", // Svenska
"kHz", // Romaneste
"kHz", // Magyar
"kHz", // Catal<61>
"kHz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"kHz", // Hrvatski (Croatian)
},
{ "MPEG Layer", // English
"MPEG Layer", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"MPEG-kerros", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
}, },
{ NULL } { NULL }
}; };

View File

@@ -9,7 +9,6 @@
#ifndef __FEMONI18N_H #ifndef __FEMONI18N_H
#define __FEMONI18N_H #define __FEMONI18N_H
#include <vdr/config.h> // for VDRVERSNUM
#include <vdr/i18n.h> #include <vdr/i18n.h>
extern const tI18nPhrase Phrases[]; extern const tI18nPhrase Phrases[];

View File

@@ -12,48 +12,30 @@
#include "femonreceiver.h" #include "femonreceiver.h"
#include "femonosd.h" #include "femonosd.h"
#if (VDRVERSNUM < 10300) && !defined(ELCHIAIOVERSION) #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#warning You should consider using the small fonts! #define CHANNELINPUT_TIMEOUT 1000
#endif
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define SCREENWIDTH 720 // in pixels
#define CHANNELINPUT_TIMEOUT 1000 #define SCREENHEIGHT 576 // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDHEIGHT 480 // in pixels
#define OSDINFOHEIGHT (m_Font->Height() * 11) // in pixels (11 rows)
#define OSDSTATUSHEIGHT (m_Font->Height() * 6) // in pixels (6 rows)
#define SCREENWIDTH 720 #define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
#define SCREENHEIGHT 576 #define OSDINFOWIN_X(col) ((col == 4) ? 470 : (col == 3) ? 300 : (col==2) ? 180 : 15)
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col==2) ? 70 : 15)
#define OSDSTATUSWIN_XC(col,txt) (((col - 1) * SCREENWIDTH / 6) + ((SCREENWIDTH / 6 - m_Font->Width(txt)) / 2))
#define BARWIDTH(x) (OSDWIDTH * x / 100)
#define OSDWIDTH 46 #define clrBackground clrGray50 // this should be tied somehow into current theme
#define OSDINFOHEIGHT 11
#define OSDGAPHEIGHT 1
#define OSDSTATUSHEIGHT 6
#define OSDSTATUSCOL1 1
#define OSDSTATUSCOL2 10
#define OSDSTATUSCOL3 17
#define OSDSTATUSCOL4 32
#define OSDSTATUSLOCK 1
#define OSDSTATUSSIGN 9
#define OSDSTATUSCARR 19
#define OSDSTATUSVITE 30
#define OSDSTATUSSYNC 40
#define OSDINFOLCOL1 1
#define OSDINFOLCOL2 14
#define OSDINFOLCOL3 23
#define OSDINFOLCOL4 36
cFemonOsd::cFemonOsd(void) cFemonOsd::cFemonOsd(void)
#if VDRVERSNUM >= 10300
:cOsdObject(true), cThread("femon osd") :cOsdObject(true), cThread("femon osd")
#else
:cOsdObject(true)
#endif
{ {
//printf("cFemonOsd::cFemonOsd()\n"); //printf("cFemonOsd::cFemonOsd()\n");
m_Osd = NULL; m_Osd = NULL;
m_InfoWindow = -1;
m_StatusWindow = -1;
m_Receiver = NULL; m_Receiver = NULL;
m_Frontend = -1; m_Frontend = -1;
m_Active = false; m_Active = false;
@@ -65,6 +47,7 @@ cFemonOsd::cFemonOsd(void)
m_BER = 0; m_BER = 0;
m_UNC = 0; m_UNC = 0;
m_DisplayMode = femonConfig.displaymode; m_DisplayMode = femonConfig.displaymode;
m_Font = cFont::GetFont(fontSml);
m_Mutex = new cMutex(); m_Mutex = new cMutex();
} }
@@ -88,68 +71,70 @@ void cFemonOsd::DrawStatusWindow(void)
char buf[128]; char buf[128];
int snr = m_SNR / 655; int snr = m_SNR / 655;
int signal = m_Signal / 655; int signal = m_Signal / 655;
int lines = 0; int offset = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd) { if (m_Osd) {
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrBackground);
eDvbFont OldFont = m_Osd->SetFont(fontSml);
#endif
m_Osd->Clear(m_StatusWindow);
snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->Name()); snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->Name());
m_Osd->Fill(0, femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? cOsd::LineHeight() - 1 : (OSDINFOHEIGHT + OSDGAPHEIGHT + 1) * cOsd::LineHeight() - 1, clrWhite, m_StatusWindow); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrBlack, clrWhite, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, clrBlack, clrWhite, m_Font);
lines++; offset += m_Font->Height();
if (signal > 0) { if (signal > 0) {
signal = (OSDWIDTH * cOsd::CellWidth()) * signal / 100; signal = BARWIDTH(signal);
m_Osd->Fill(0, femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), signal), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrRed, m_StatusWindow); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), signal), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrRed);
if (signal > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100)) { if (signal > BARWIDTH(femonConfig.redlimit)) {
m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), signal), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrYellow, m_StatusWindow); m_Osd->DrawRectangle(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min((OSDWIDTH * femonConfig.greenlimit / 100), signal), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrYellow);
} }
if (signal > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100)) { if (signal > BARWIDTH(femonConfig.greenlimit)) {
m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, signal, femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrGreen, m_StatusWindow); m_Osd->DrawRectangle(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), signal, OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrGreen);
} }
} }
lines++; offset += m_Font->Height();
if (snr > 0) { if (snr > 0) {
snr = (OSDWIDTH * cOsd::CellWidth()) * snr / 100; snr = BARWIDTH(snr);
m_Osd->Fill(0, femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), snr), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrRed, m_StatusWindow); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), snr), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrRed);
if (snr > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100)) { if (snr > BARWIDTH(femonConfig.redlimit)) {
m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), snr), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrYellow, m_StatusWindow); m_Osd->DrawRectangle(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.greenlimit), snr), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrYellow);
} }
if (snr > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100)) { if (snr > BARWIDTH(femonConfig.greenlimit)) {
m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, snr, femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrGreen, m_StatusWindow); m_Osd->DrawRectangle(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), snr, OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrGreen);
} }
} }
lines++; offset += m_Font->Height();
snprintf(buf, sizeof(buf), "STR: %04x", m_Signal); m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "%04x", m_Signal);
m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655); snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655);
m_Osd->Text(OSDSTATUSCOL2 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite /*signal < femonConfig.redlimit ? clrRed : signal < femonConfig.greenlimit ? clrYellow : clrGreen*/, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "BER: %08x", m_BER); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSCOL3 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "%08x", m_BER);
if (m_Receiver) snprintf(buf, sizeof(buf), "%s: %.2f %s", tr("Video"), m_Receiver->VideoBitrate(), tr("Mbit/s")); m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
else snprintf(buf, sizeof(buf), "%s: --- %s", tr("Video"), tr("Mbit/s")); snprintf(buf, sizeof(buf), "%s:", tr("Video"));
m_Osd->Text(OSDSTATUSCOL4 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
lines++; if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s"));
snprintf(buf, sizeof(buf), "SNR: %04x", m_SNR); else snprintf(buf, sizeof(buf), "--- %s", tr("Mbit/s"));
m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%04x", m_SNR);
m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655); snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655);
m_Osd->Text(OSDSTATUSCOL2 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite /*snr < femonConfig.redlimit ? clrRed : snr < femonConfig.greenlimit ? clrYellow : clrGreen*/, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "UNC: %08x", m_UNC); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSCOL3 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "%08x", m_UNC);
if (m_Receiver) snprintf(buf, sizeof(buf), "%s: %.0f %s", tr("Audio"), m_Receiver->AudioBitrate(), tr("kbit/s")); m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
else snprintf(buf, sizeof(buf), "%s: --- %s", tr("Audio"), tr("kbit/s")); snprintf(buf, sizeof(buf), "%s:", tr("Audio"));
m_Osd->Text(OSDSTATUSCOL4 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
lines++; if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", m_Receiver->AudioBitrate(), tr("kbit/s"));
m_Osd->Text(OSDSTATUSLOCK * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); else snprintf(buf, sizeof(buf), "--- %s", tr("kbit/s"));
m_Osd->Text(OSDSTATUSSIGN * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSCARR * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_StatusWindow); offset += m_Font->Height();
m_Osd->Text(OSDSTATUSVITE * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("VITERBI"),(m_FrontendStatus & FE_HAS_VITERBI)? clrYellow : clrBlack, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_XC(1,tr("LOCK")), OSDSTATUSWIN_Y(offset), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSSYNC * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_XC(2,tr("SIGNAL")), OSDSTATUSWIN_Y(offset), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_Font);
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Osd->DrawText(OSDSTATUSWIN_XC(3,tr("CARRIER")), OSDSTATUSWIN_Y(offset), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_Font);
m_Osd->SetFont(OldFont); m_Osd->DrawText(OSDSTATUSWIN_XC(4,tr("VITERBI")), OSDSTATUSWIN_Y(offset), tr("VITERBI"),(m_FrontendStatus & FE_HAS_VITERBI)? clrYellow : clrBlack, clrBackground, m_Font);
#endif m_Osd->DrawText(OSDSTATUSWIN_XC(5,tr("SYNC")), OSDSTATUSWIN_Y(offset), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_Font);
m_Osd->Flush(); m_Osd->Flush();
} }
} }
@@ -160,88 +145,84 @@ void cFemonOsd::DrawInfoWindow(void)
//printf("cFemonOsd::DrawInfoWindow()\n"); //printf("cFemonOsd::DrawInfoWindow()\n");
char buf[128]; char buf[128];
char buf2[20]; char buf2[20];
int lines = 0; int offset = 0;
int value = 0; int value = 0;
double dvalue = 0.0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd) { if (m_Osd) {
if (m_DisplayMode) { if (m_DisplayMode == modeTransponder) {
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground);
eDvbFont OldFont = m_Osd->SetFont(fontSml); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+m_Font->Height()-1), clrWhite);
#endif m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), clrBackground, clrWhite, m_Font);
m_Osd->Clear(m_InfoWindow); offset += m_Font->Height();
m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 1 : (lines + 1) * cOsd::LineHeight() - 1, clrWhite, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), clrWhite, clrBackground, m_Font);
m_Osd->Text( OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines, tr("Transponder Information"), clrBackground, clrWhite, m_InfoWindow);
lines++;
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Vpid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Vpid()); snprintf(buf, sizeof(buf), "%d", channel->Vpid());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Ppid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Ppid()); snprintf(buf, sizeof(buf), "%d", channel->Ppid());
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Apid1"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_Font);
value = channel->Apid2(); value = channel->Apid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Apid1()); else snprintf(buf, sizeof(buf), "%d", channel->Apid1());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Dpid1"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid1"), clrWhite, clrBackground, m_Font);
value = channel->Dpid2(); value = channel->Dpid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Dpid1()); else snprintf(buf, sizeof(buf), "%d", channel->Dpid1());
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CA"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Ca()); snprintf(buf, sizeof(buf), "%d", channel->Ca());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Tpid()); snprintf(buf, sizeof(buf), "%d", channel->Tpid());
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Sid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Sid()); snprintf(buf, sizeof(buf), "%d", channel->Sid());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
#if (VDRVERSNUM >= 10300) m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), "Nid", clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Nid", clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Nid()); snprintf(buf, sizeof(buf), "%d", channel->Nid());
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Tid" /*tr("Tid")*/, clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), "Tid" /*tr("Tid")*/, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Tid()); snprintf(buf, sizeof(buf), "%d", channel->Tid());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Rid" /*tr("Rid")*/, clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), "Rid" /*tr("Rid")*/, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Rid()); snprintf(buf, sizeof(buf), "%d", channel->Rid());
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
#endif offset += m_Font->Height();
lines++;
switch (m_FrontendInfo.type) { switch (m_FrontendInfo.type) {
case FE_QPSK: case FE_QPSK:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Source"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source())); snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Srate()); snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Polarization"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization())); snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization()));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -253,26 +234,26 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8");
else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9"); else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9");
else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
case FE_QAM: case FE_QAM:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Source"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source())); snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Srate()); snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_Font);
value = channel->Modulation(); value = channel->Modulation();
if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
@@ -281,15 +262,15 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128");
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -301,33 +282,33 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8");
else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9"); else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9");
else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
default: default:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Transmission"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), clrWhite, clrBackground, m_Font);
value = channel->Transmission(); value = channel->Transmission();
if (value == TRANSMISSION_MODE_2K) snprintf(buf, sizeof(buf), "2K"); if (value == TRANSMISSION_MODE_2K) snprintf(buf, sizeof(buf), "2K");
else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K"); else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K");
else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text( OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Bandwidth"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), clrWhite, clrBackground, m_Font);
value = channel->Bandwidth(); value = channel->Bandwidth();
if (value == BANDWIDTH_8_MHZ) snprintf(buf, sizeof(buf), "8 %s", tr("MHz")); if (value == BANDWIDTH_8_MHZ) snprintf(buf, sizeof(buf), "8 %s", tr("MHz"));
else if (value == BANDWIDTH_7_MHZ) snprintf(buf, sizeof(buf), "7 %s", tr("MHz")); else if (value == BANDWIDTH_7_MHZ) snprintf(buf, sizeof(buf), "7 %s", tr("MHz"));
else if (value == BANDWIDTH_6_MHZ) snprintf(buf, sizeof(buf), "6 %s", tr("MHz")); else if (value == BANDWIDTH_6_MHZ) snprintf(buf, sizeof(buf), "6 %s", tr("MHz"));
else /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_Font);
value = channel->Modulation(); value = channel->Modulation();
if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
@@ -336,15 +317,15 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128");
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -368,32 +349,103 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " - 8/9"); else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " - 8/9");
else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto")); else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto"));
strncat(buf, buf2, sizeof(buf)); strncat(buf, buf2, sizeof(buf));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
lines++; offset += m_Font->Height();
m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Hierarchy"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), clrWhite, clrBackground, m_Font);
value = channel->Hierarchy(); value = channel->Hierarchy();
if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == HIERARCHY_1) snprintf(buf, sizeof(buf), "1"); else if (value == HIERARCHY_1) snprintf(buf, sizeof(buf), "1");
else if (value == HIERARCHY_2) snprintf(buf, sizeof(buf), "2"); else if (value == HIERARCHY_2) snprintf(buf, sizeof(buf), "2");
else if (value == HIERARCHY_4) snprintf(buf, sizeof(buf), "4"); else if (value == HIERARCHY_4) snprintf(buf, sizeof(buf), "4");
else /*HIERARCHY_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*HIERARCHY_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Guard"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), clrWhite, clrBackground, m_Font);
value = channel->Guard(); value = channel->Guard();
if (value == GUARD_INTERVAL_1_32) snprintf(buf, sizeof(buf), "1/32"); if (value == GUARD_INTERVAL_1_32) snprintf(buf, sizeof(buf), "1/32");
else if (value == GUARD_INTERVAL_1_16) snprintf(buf, sizeof(buf), "1/16"); else if (value == GUARD_INTERVAL_1_16) snprintf(buf, sizeof(buf), "1/16");
else if (value == GUARD_INTERVAL_1_8) snprintf(buf, sizeof(buf), "1/8"); else if (value == GUARD_INTERVAL_1_8) snprintf(buf, sizeof(buf), "1/8");
else if (value == GUARD_INTERVAL_1_4) snprintf(buf, sizeof(buf), "1/4"); else if (value == GUARD_INTERVAL_1_4) snprintf(buf, sizeof(buf), "1/4");
else /*GUARD_INTERVAL_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*GUARD_INTERVAL_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
} }
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION)
m_Osd->SetFont(OldFont);
#endif
} }
else { else if (m_DisplayMode == modeStream) {
m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : OSDINFOHEIGHT * cOsd::LineHeight(), clrTransparent, m_InfoWindow); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground);
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), clrBackground, clrWhite, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), clrYellow, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "#%d", channel->Vpid());
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s (%.2f %s)", m_Receiver->VideoStreamBitrate(), tr("Mbit/s"), m_Receiver->VideoBitrate(), tr("Mbit/s"));
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), clrWhite, clrBackground, m_Font);
if (m_Receiver) {
value = m_Receiver->VideoAspectRatio();
if (value == 100) snprintf(buf, sizeof(buf), "1:1");
else if (value == 133) snprintf(buf, sizeof(buf), "4:3");
else if (value == 177) snprintf(buf, sizeof(buf), "16:9");
else if (value == 233) snprintf(buf, sizeof(buf), "2.21:1");
else snprintf(buf, sizeof(buf), "%s", tr("reserved"));
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz"));
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), clrWhite, clrBackground, m_Font);
if (m_Receiver) {
value = m_Receiver->VideoFormat();
if (value == 1) snprintf(buf, sizeof(buf), "%s", tr("PAL"));
else if (value == 2) snprintf(buf, sizeof(buf), "%s", tr("NTSC"));
else snprintf(buf, sizeof(buf), "%s", tr("unknown"));
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize());
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "#%d", channel->Apid1());
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
dvalue = m_Receiver->AudioStreamBitrate();
if (m_Receiver) {
if (dvalue == -1.0) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("reserved"), m_Receiver->AudioBitrate(), tr("kbit/s"));
else if (dvalue == -2.0) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("free"), m_Receiver->AudioBitrate(), tr("kbit/s"));
else snprintf(buf, sizeof(buf), "%.0f %s (%.0f %s)", dvalue, tr("kbit/s"), m_Receiver->AudioBitrate(), tr("kbit/s"));
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer());
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_Font);
if (m_Receiver) {
value = m_Receiver->AudioSamplingFreq();
if (value == -1) snprintf(buf, sizeof(buf), "%s", tr("reserved"));
else snprintf(buf, sizeof(buf), "%.1f %s", (value / 1000.0), tr("kHz"));
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
}
else /* modeBasic */ {
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
} }
m_Osd->Flush(); m_Osd->Flush();
} }
@@ -402,9 +454,6 @@ void cFemonOsd::DrawInfoWindow(void)
void cFemonOsd::Action(void) void cFemonOsd::Action(void)
{ {
//printf("cFemonOsd::Action()\n"); //printf("cFemonOsd::Action()\n");
#if (VDRVERSNUM < 10300)
isyslog("femon plugin: thread started (pid = %d)", getpid());
#endif
m_Active = true; m_Active = true;
while (m_Active) { while (m_Active) {
if (m_Frontend != -1) { if (m_Frontend != -1) {
@@ -421,9 +470,6 @@ void cFemonOsd::Action(void)
} }
usleep(100000L * femonConfig.updateinterval); usleep(100000L * femonConfig.updateinterval);
} }
#if (VDRVERSNUM < 10300)
isyslog("femon plugin: thread stopped (pid = %d)", getpid());
#endif
} }
void cFemonOsd::Show(void) void cFemonOsd::Show(void)
@@ -444,16 +490,23 @@ void cFemonOsd::Show(void)
close(m_Frontend); close(m_Frontend);
return; return;
} }
m_Osd = cOsd::OpenRaw((SCREENWIDTH - OSDWIDTH * cOsd::CellWidth()) / 2, (SCREENHEIGHT - (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight()) / 2); m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop);
if (m_Osd) { if (m_Osd) {
m_StatusWindow = m_Osd->Create(0, femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), OSDSTATUSHEIGHT * cOsd::LineHeight(), 4); tArea Areas[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, 4 } };
m_InfoWindow = m_Osd->Create(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), OSDINFOHEIGHT * cOsd::LineHeight(), 2); if (m_Osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) == oeOk) {
m_Osd->Clear(); m_Osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : OSDINFOHEIGHT * cOsd::LineHeight(), clrTransparent, m_InfoWindow); }
else {
tArea Areas[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), 4 },
{ 0, OSDINFOWIN_Y(0), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1), 2 }
};
m_Osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
}
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
m_Osd->Flush(); m_Osd->Flush();
if (m_Receiver) if (m_Receiver)
delete m_Receiver; delete m_Receiver;
if (femonConfig.showbitrate) { if (femonConfig.analyzestream) {
int channelNumber = cDevice::CurrentChannel(); int channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1()); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
@@ -483,7 +536,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
} }
if (m_Receiver) if (m_Receiver)
delete m_Receiver; delete m_Receiver;
if (femonConfig.showbitrate) { if (femonConfig.analyzestream) {
channelNumber = cDevice::CurrentChannel(); channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1()); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
@@ -556,7 +609,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
} }
break; break;
case kOk: case kOk:
m_DisplayMode ^= 1; // toggle between advanced and simple display mode if (++m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0; // toggle between display modes
DrawInfoWindow(); DrawInfoWindow();
break; break;
default: default:

View File

@@ -16,14 +16,11 @@
#include <vdr/thread.h> #include <vdr/thread.h>
#include <vdr/status.h> #include <vdr/status.h>
#include <vdr/channels.h> #include <vdr/channels.h>
#include <vdr/font.h>
class cFemonOsd : public cOsdObject, public cThread, public cStatus { class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private: private:
bool m_Active; bool m_Active;
cOsdBase *m_Osd; cOsd *m_Osd;
tWindowHandle m_InfoWindow;
tWindowHandle m_StatusWindow;
cFemonReceiver *m_Receiver; cFemonReceiver *m_Receiver;
int m_Frontend; int m_Frontend;
struct dvb_frontend_info m_FrontendInfo; struct dvb_frontend_info m_FrontendInfo;
@@ -36,6 +33,7 @@ private:
uint32_t m_UNC; uint32_t m_UNC;
fe_status_t m_FrontendStatus; fe_status_t m_FrontendStatus;
int m_DisplayMode; int m_DisplayMode;
const cFont *m_Font;
cMutex* m_Mutex; cMutex* m_Mutex;
void DrawStatusWindow(void); void DrawStatusWindow(void);
void DrawInfoWindow(void); void DrawInfoWindow(void);

View File

@@ -10,21 +10,34 @@
#include "femoncfg.h" #include "femoncfg.h"
#include "femonreceiver.h" #include "femonreceiver.h"
#define TS_SIZE 188
#define PAY_START 0x40
#define ADAPT_FIELD 0x20
#define PAYLOAD 0x10
#define PTS_DTS_FLAGS 0xC0
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid) cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
#if VDRVERSNUM >= 10300
:cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver") :cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver")
#else
:cReceiver(Ca, -1, 2, Vpid, Apid)
#endif
{ {
//printf("cFemonReceiver::cFemonReceiver()\n"); //printf("cFemonReceiver::cFemonReceiver()\n");
m_Active = false; m_Active = false;
m_VideoPid = Vpid; m_VideoPid = Vpid;
m_AudioPid = Apid; m_AudioPid = Apid;
m_VideoPacketCount = 0; m_VideoPacketCount = 0;
m_AudioPacketCount = 0; m_VideoHorizontalSize = 0;
m_VideoVerticalSize = 0;
m_VideoAspectRatio = 0;
m_VideoFormat = 0;
m_VideoFrameRate = 0.0;
m_VideoStreamBitrate = 0.0;
m_VideoBitrate = 0.0; m_VideoBitrate = 0.0;
m_AudioPacketCount = 0;
m_AudioStreamBitrate = -2.0;
m_AudioBitrate = 0.0; m_AudioBitrate = 0.0;
m_AudioSamplingFreq = -1;
m_AudioMPEGLayer = 0;
m_AudioBitrate = 0.0;
} }
cFemonReceiver::~cFemonReceiver(void) cFemonReceiver::~cFemonReceiver(void)
@@ -36,6 +49,123 @@ cFemonReceiver::~cFemonReceiver(void)
} }
} }
/* the following function originates from libdvbmpeg: */
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetVideoInfo()\n");
uint8_t *headr;
int found = 0;
int c = 0;
while (found < 4 && c + 4 < count) {
uint8_t *b;
b = mbuf + c;
if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 && b[3] == 0xb3)
found = 4;
else
c++;
}
if (!found) return;
c += 4;
if (c + 12 >= count) return;
headr = mbuf + c;
m_VideoHorizontalSize = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
m_VideoVerticalSize = ((headr[1] &0x0F) << 8) | (headr[2]);
int sw = (int)((headr[3] & 0xF0) >> 4);
switch( sw ){
case 1:
m_VideoAspectRatio = 100;
break;
case 2:
m_VideoAspectRatio = 133;
break;
case 3:
m_VideoAspectRatio = 177;
break;
case 4:
m_VideoAspectRatio = 221;
break;
case 5 ... 15:
m_VideoAspectRatio = 0;
break;
default:
return;
}
sw = (int)(headr[3] & 0x0F);
switch ( sw ) {
case 1:
m_VideoFrameRate = 24000/1001.0;
m_VideoFormat = 0;
break;
case 2:
m_VideoFrameRate = 24.0;
m_VideoFormat = 0;
break;
case 3:
m_VideoFrameRate = 25.0;
m_VideoFormat = 1;
break;
case 4:
m_VideoFrameRate = 30000/1001.0;
m_VideoFormat = 2;
break;
case 5:
m_VideoFrameRate = 30.0;
m_VideoFormat = 2;
break;
case 6:
m_VideoFrameRate = 50.0;
m_VideoFormat = 1;
break;
case 7:
m_VideoFrameRate = 60.0;
m_VideoFormat = 2;
break;
}
m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0;
}
static unsigned int bitrates[3][16] =
{
{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0},
{0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0},
{0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}
};
static unsigned int samplerates[4] = {441, 480, 320, 0};
/* the following function originates from libdvbmpeg: */
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetAudioInfo()\n");
uint8_t *headr;
int found = 0;
int c = 0;
int tmp = 0;
while (!found && c < count) {
uint8_t *b = mbuf + c;
if (b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
found = 1;
else
c++;
}
if (!found) return;
if (c + 3 >= count) return;
headr = mbuf + c;
m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1);
tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000;
if (tmp == 0)
m_AudioStreamBitrate = -2.0; // free
else if (tmp == 0xf)
m_AudioStreamBitrate = -1.0; // reserved
else
m_AudioStreamBitrate = tmp / 1000.0;
tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100;
if (tmp == 3)
m_AudioSamplingFreq = -1; // reserved
else
m_AudioSamplingFreq = tmp;
}
void cFemonReceiver::Activate(bool On) void cFemonReceiver::Activate(bool On)
{ {
//printf("cFemonReceiver::Activate()\n"); //printf("cFemonReceiver::Activate()\n");
@@ -45,8 +175,8 @@ void cFemonReceiver::Activate(bool On)
void cFemonReceiver::Receive(uchar *Data, int Length) void cFemonReceiver::Receive(uchar *Data, int Length)
{ {
//printf("cFemonReceiver::Receive()\n"); //printf("cFemonReceiver::Receive()\n");
// TS packet length: 188 // TS packet length: TS_SIZE
if (Length == 188) { if (Length == TS_SIZE) {
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]); int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
if (pid == m_VideoPid) { if (pid == m_VideoPid) {
m_VideoPacketCount++; m_VideoPacketCount++;
@@ -54,15 +184,34 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
else if (pid == m_AudioPid) { else if (pid == m_AudioPid) {
m_AudioPacketCount++; m_AudioPacketCount++;
} }
/* the following originates from libdvbmpeg: */
if (!(Data[3] & PAYLOAD)) {
return;
}
uint8_t off = 0;
if (Data[3] & ADAPT_FIELD) {
off = Data[4] + 1;
}
if (Data[1] & PAY_START) {
uint8_t *sb = Data + 4 + off;
if (sb[7] & PTS_DTS_FLAGS) {
uint8_t *pay = sb + sb[8] + 9;
int l = TS_SIZE - 13 - off - sb[8];
if (pid == m_VideoPid) {
GetVideoInfo(pay, l);
}
if (pid == m_AudioPid) {
GetAudioInfo(pay, l);
}
}
}
/* end */
} }
} }
void cFemonReceiver::Action(void) void cFemonReceiver::Action(void)
{ {
//printf("cFemonReceiver::Action()\n"); //printf("cFemonReceiver::Action()\n");
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread started (pid = %d)", getpid());
#endif
m_Active = true; m_Active = true;
while (m_Active) { while (m_Active) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit // TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
@@ -72,7 +221,4 @@ void cFemonReceiver::Action(void)
m_AudioPacketCount = 0; m_AudioPacketCount = 0;
usleep(100000L * femonConfig.calcinterval); usleep(100000L * femonConfig.calcinterval);
} }
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread stopped (pid = %d)", getpid());
#endif
} }

View File

@@ -18,9 +18,20 @@ private:
int m_VideoPid; int m_VideoPid;
int m_AudioPid; int m_AudioPid;
int m_VideoPacketCount; int m_VideoPacketCount;
int m_AudioPacketCount; int m_VideoHorizontalSize;
int m_VideoVerticalSize;
int m_VideoAspectRatio;
int m_VideoFormat;
double m_VideoFrameRate;
double m_VideoStreamBitrate;
double m_VideoBitrate; double m_VideoBitrate;
int m_AudioPacketCount;
double m_AudioStreamBitrate;
double m_AudioBitrate; double m_AudioBitrate;
int m_AudioSamplingFreq;
int m_AudioMPEGLayer;
void GetVideoInfo(uint8_t *mbuf, int count);
void GetAudioInfo(uint8_t *mbuf, int count);
protected: protected:
virtual void Activate(bool On); virtual void Activate(bool On);
@@ -31,8 +42,18 @@ public:
cFemonReceiver(int Ca, int Vpid, int Apid); cFemonReceiver(int Ca, int Vpid, int Apid);
virtual ~cFemonReceiver(); virtual ~cFemonReceiver();
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // 4:3 == 133, ...
int VideoFormat(void) { return m_VideoFormat; }; // 0 == unknown, 1 == PAL, 2 == NTSC
double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s
int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // number
int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s
}; };
#endif //__FEMONRECEIVER_H #endif //__FEMONRECEIVER_H