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
22802773b8 Backported changes and fixes from version 0.1.6. 2004-09-11 04:20:00 +03:00
Rolf Ahrenberg
ca717b0425 Backported the "AC3 Stream Information" feature from version 0.1.3. 2004-06-11 04:20:00 +03:00
11 changed files with 1399 additions and 125 deletions

37
HISTORY
View File

@@ -1,5 +1,6 @@
===================================
VDR Plugin 'femon' Revision History
-----------------------------------
===================================
2004-02-15: Version 0.0.1
@@ -54,7 +55,17 @@ VDR Plugin 'femon' Revision History
- Backported changes and fixes from version 0.1.2.
-------------------------
2004-06-11: Version 0.0.6
- Backported the "AC3 Stream Information" feature from version 0.1.3.
2004-09-11: Version 0.0.7
- Backported changes and fixes from version 0.1.6.
===================================
VDR Plugin 'femon' Revision History
===================================
2004-05-18: Version 0.1.0
@@ -73,3 +84,25 @@ VDR Plugin 'femon' Revision History
- Fixed the channel switch bug (reported by Stefan Lucke).
- Nid/Tid/Rid are now included in translations.
- Added video format and aspect ratio symbols into status window.
2004-06-11: Version 0.1.3
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).
2004-06-24: Version 0.1.4
- Added some new symbols and beautified the old ones.
- Added audio track selection feature.
- Added preliminary device switching feature (disabled at the moment).
2004-08-18: Version 0.1.5
- Fixed OSDSTATUSWIN_XC define.
- Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins).
- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one).
- Added patches directory: CA system names by Lauri Tischler.
2004-09-11: Version 0.1.6
- Yet Another Minor Release.
- Integrated the CA system names patch: "Setup / Show CA System".

View File

@@ -11,7 +11,7 @@ PLUGIN = femon
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options:
@@ -44,6 +44,10 @@ INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef NTSC_SYSTEM
DEFINES += -DNTSC_SYSTEM
endif
### The object files (add further files here):
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o

64
README
View File

@@ -10,9 +10,7 @@ See the file COPYING for license information.
Requirements:
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!
You're number six! I'm number two. YARRR!
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
Description:
@@ -20,7 +18,6 @@ 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
channels and the plugin should be monitoring always the right frontend. The
transponder and stream information are also available in advanced display modes.
User can switch between different display modes by pressing 'OK' key.
The plugin is based on a neat console frontend status monitor application
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
@@ -30,7 +27,57 @@ bitrate calculation algorithm originates from the 'dvbstream' application by
Dave Chapman and the stream information routines from the 'libdvb' library by
Metzler Brothers.
Shortcomings / Todo list / Important Notes:
Terminology:
--------------------------------------------------------------
|## Channel Name ######################### [DD][AR][VF][A][D]|
|[=====Signal Strength in % ==============|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
--------------------------------------------------------------
STR - Signal strength
SNR - Signal-to-noise ratio
BER - Bit error rate
UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s
Audio - Calculated audio / AC-3 bitrate in kbit/s
LOCK - Everything's working...
SIGNAL - Found something above the noise level
CARRIER - Found a DVB signal
VITERBI - FEC (forward error correction) is stable
SYNC - Found sync bytes
DD - AC-3 stream (optional)
AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional)
VF - Video format: PAL/NTSC (optional)
A - Audio track: 1..2 (optional)
D - Device number: 0..3 (optional)
Controls:
ChanUp/ChanDn - Switch channel up/down
Up/Down - Switch channel up/down
0-9 - Select channel
Ok - Switch between display modes: basic, transponder, stream, AC-3
Right/Left - Switch to next/previous device that provides the current channel
Green - Select language (APID)
Back - Exit plugin
Installation:
cd /put/your/path/here/VDR/PLUGINS/src
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz
ln -s femon-X.Y.Z femon
cd /put/your/path/here/VDR
make
make plugins
./vdr -P femon
Notes:
- 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
@@ -39,3 +86,10 @@ Shortcomings / Todo list / Important Notes:
ttxtsubs, but closing and reopening the femon plugin might help temporarily as
well. Btw., this same thing happens with OSDTeletext plugin too :)
- Disable the stream analyze to speed up heavy zapping sessions.
- The signal strength and signal-to-noise ratio values are comparable only
between the same brand/model frontends. Due to the lack of proper frontend
specifications those values cannot be calculated into any real units.
- Shrinked OSD is available for NTSC users: make NTSC_SYSTEM=1
- The device switching feature is still non-functional.
"Femon - A real womon who lives according to her natural feminine inclinations."

14
femon.c
View File

@@ -12,7 +12,7 @@
#include "femonosd.h"
#include "femon.h"
#if VDRVERSNUM >= 10307
#if VDRVERSNUM && VDRVERSNUM >= 10307
#error "You don't exist! Go away!"
#endif
@@ -71,6 +71,7 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value);
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value);
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
@@ -85,9 +86,10 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
cMenuFemonSetup::cMenuFemonSetup(void)
{
dispmodes[0] = tr("basic");
dispmodes[1] = tr("transponder");
dispmodes[2] = tr("stream");
dispmodes[modeBasic] = tr("basic");
dispmodes[modeTransponder] = tr("transponder");
dispmodes[modeStream] = tr("stream");
dispmodes[modeAC3] = tr("AC-3");
Setup();
}
@@ -100,6 +102,7 @@ void cMenuFemonSetup::Setup(void)
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
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("Show CA System"), &femonConfig.showcasystem, tr("no"), tr("yes")));
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
@@ -115,8 +118,9 @@ void cMenuFemonSetup::Store(void)
{
SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("SyslogOutput", femonConfig.syslogoutput);
SetupStore("Position", femonConfig.position);
SetupStore("DisplayMode", femonConfig.displaymode);
SetupStore("Position", femonConfig.position);
SetupStore("ShowCASystem", femonConfig.showcasystem);
SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval);

View File

@@ -11,7 +11,7 @@
#include <vdr/plugin.h>
static const char *VERSION = "0.0.5";
static const char *VERSION = "0.0.7";
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)";
static const char *MAINMENUENTRY = "Signal Information";

View File

@@ -21,4 +21,5 @@ cFemonConfig::cFemonConfig(void)
analyzestream = 1;
calcinterval = 20;
syslogoutput = 0;
showcasystem = 0;
}

View File

@@ -13,6 +13,7 @@ enum dispModes {
modeBasic,
modeTransponder,
modeStream,
modeAC3,
modeMaxNumber
};
@@ -29,6 +30,7 @@ public:
int analyzestream;
int calcinterval;
int syslogoutput;
int showcasystem;
};
extern cFemonConfig femonConfig;

View File

@@ -758,7 +758,7 @@ const tI18nPhrase Phrases[] = {
"Hz", // Fran<61>ais
"Hz", // Norsk
"Hz", // suomi
"Hz", // Polski
"Hz", // Polski
"Hz", // Espa<70>ol
"Hz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"Hz", // Svenska
@@ -766,7 +766,7 @@ const tI18nPhrase Phrases[] = {
"Hz", // Magyar
"Hz", // Catal<61>
#if VDRVERSNUM >= 10302
"Hz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"<EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Aspect Ratio", // English
@@ -986,27 +986,7 @@ const tI18nPhrase Phrases[] = {
"kHz", // Magyar
"kHz", // Catal<61>
#if VDRVERSNUM >= 10302
"kHz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "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>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"ڳ<EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Nid", // English
@@ -1067,6 +1047,846 @@ const tI18nPhrase Phrases[] = {
"Rid", // Catal<61>
#if VDRVERSNUM >= 10302
"Rid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "dB", // English
"dB", // Deutsch
"dB", // Slovenski
"dB", // Italiano
"dB", // Nederlands
"dB", // Portugu<67>s
"dB", // Fran<61>ais
"dB", // Norsk
"dB", // suomi
"dB", // Polski
"dB", // Espa<70>ol
"dB", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"dB", // Svenska
"dB", // Romaneste
"dB", // Magyar
"dB", // Catal<61>
#if VDRVERSNUM >= 10302
"dB", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "not indicated", // English
"nicht angezeigt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"ei ilmaistu", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "AC-3", // English
"AC-3", // Deutsch
"AC-3", // Slovenski
"AC-3", // Italiano
"AC-3", // Nederlands
"AC-3", // Portugu<67>s
"AC-3", // Fran<61>ais
"AC-3", // Norsk
"AC-3", // suomi
"AC-3", // Polski
"AC-3", // Espa<70>ol
"AC-3", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"AC-3", // Svenska
"AC-3", // Romaneste
"AC-3", // Magyar
"AC-3", // Catal<61>
#if VDRVERSNUM >= 10302
"AC-3", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "AC-3 Stream", // English
"AC-3 Stream", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"AC-3 <20><>niraita", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Frame Size", // English
"Frame Gr<47><72>e", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kehyksen koko", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Bit Stream Mode", // English
"Bitstream Modus", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"L<EFBFBD>hetteen tyyppi", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Audio Coding Mode", // English
"Audio Coding Modus", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"<EFBFBD><EFBFBD>nikoodaus", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Center Mix Level", // English
"Center Mix Pegel", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Keskikanavan taso", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Surround Mix Level", // English
"Surround Mix Pegel", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Tehostekanavien taso", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Dolby Surround Mode", // English
"Dolby Surround Modus", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Dolby Surround -moodi", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Low Frequency Effects", // English
"Tieft<EFBFBD>ner Effekt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"LFE-kanava", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Dialogue Normalization", // English
"Dialog Normalisation", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Dialogin normalisointi", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Complete Main (CM)", // English
"Complete Main (CM)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"P<EFBFBD><EFBFBD>asiallinen (CM)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Music and Effects (ME)", // English
"Musik und Effekte (ME)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Musiikki ja tehosteet (ME)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Visually Impaired (VI)", // English
"Sehbehindert (VI)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"N<EFBFBD>k<EFBFBD>rajoitteinen (VI)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Hearing Impaired (HI)", // English
"H<EFBFBD>rbehindert (HI)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kuulorajoitteinen (HI)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Dialogue (D)", // English
"Dialog (D)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Vuoropuhelu (D)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Commentary (C)", // English
"Kommentar (C)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Kommentointi (C)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Emergency (E)", // English
"Notfall (E)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"H<EFBFBD>t<EFBFBD>tiedote (E)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Voice Over (VO)", // English
"<EFBFBD>berlagerte Stimme (VO)", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"P<EFBFBD><EFBFBD>lle puhuttu (VO)", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Karaoke", // English
"Karaoke", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Karaoke", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Ch1", // English "Channel 1"
"Kanal1", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"kan. 1", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Ch2", // English "Channel 2"
"Kanal2", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"kan. 2", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "C", // English "Center"
"C", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"K", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "L", // English "Left"
"L", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"V", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "R", // English "Right"
"R", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"O", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "S", // English "Surround"
"S", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"T", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "SL", // English "Surround Left"
"SL", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"TV", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "SR", // English "Surround Right"
"SR", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"TO", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Show CA System", // English
"CA System anzeigen", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"N<EFBFBD>yt<EFBFBD> salausj<73>rjestelm<6C>", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Fixed", // English
"Fest", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>eais
"", // Norsk
"kiinte<EFBFBD>", // suomi
"", // Polskie
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Free to Air", // English
"Free to Air", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"salaamaton", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "SECA/Mediaguard", // English
"SECA/Mediaguard", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"SECA/Mediaguard", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Viaccess", // English
"Viaccess", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Viaccess", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Irdeto", // English
"Irdeto", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Irdeto", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "NDS/Videoguard", // English
"NDS/Videoguard", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"NDS/Videoguard", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "Conax", // English
"Conax", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Conax", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "CryptoWorks", // English
"CryptoWorks", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>es
"", // Fran<61>ais
"", // Norsk
"CryptoWorks", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "PowerVu", // English
"PowerVu", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"PowerVu", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "BetaCrypt", // English
"BetaCrypt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"BetaCrypt", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "NagraVision", // English
"NagraVision", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"NagraVision", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ "SkyCrypt", // English
"SkyCrypt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"SkyCrypt", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
#if VDRVERSNUM >= 10302
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
#endif
},
{ NULL }

View File

@@ -19,19 +19,25 @@
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#define CHANNELINPUT_TIMEOUT 1000
#define SCREENWIDTH 720 // in pixels
#ifdef NTSC_SYSTEM
#define SCREENHEIGHT 480 // in pixels
#define OSDHEIGHT 420 // in pixels
#else
#define SCREENHEIGHT 576 // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDHEIGHT 480 // in pixels
#endif
#define SCREENWIDTH 720 // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDINFOHEIGHT ((cOsd::LineHeight() - 2) * 11) // in pixels (11 rows)
#define OSDSTATUSHEIGHT ((cOsd::LineHeight() - 2) * 6) // in pixels (6 rows)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
#define OSDINFOWIN_X(col) ((col == 4) ? 470 : (col == 3) ? 300 : (col==2) ? 180 : 15)
#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 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 - cOsd::WidthInCells(txt) * cOsd::CellWidth()) / 2))
#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) * OSDWIDTH / 5) + ((OSDWIDTH / 5 - cOsd::WidthInCells(txt) * cOsd::CellWidth()) / 2))
#define BARWIDTH(x) (OSDWIDTH * x / 100)
#define DELTA 2
cFemonOsd::cFemonOsd(void)
#if VDRVERSNUM >= 10300
@@ -103,7 +109,7 @@ void cFemonOsd::DrawStatusWindow(void)
m_Osd->Fill(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), signal, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrGreen, m_StatusWindow);
}
}
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
if (snr > 0) {
snr = BARWIDTH(snr);
m_Osd->Fill(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), snr), OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrRed, m_StatusWindow);
@@ -114,7 +120,7 @@ void cFemonOsd::DrawStatusWindow(void)
m_Osd->Fill(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), snr, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrGreen, m_StatusWindow);
}
}
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", clrWhite, clrBackground, m_StatusWindow);
snprintf(buf, sizeof(buf), "%04x", m_Signal);
m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
@@ -128,7 +134,7 @@ void cFemonOsd::DrawStatusWindow(void)
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s"));
else snprintf(buf, sizeof(buf), "--- %s", tr("Mbit/s"));
m_Osd->Text(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", clrWhite, clrBackground, m_StatusWindow);
snprintf(buf, sizeof(buf), "%04x", m_SNR);
m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
@@ -137,12 +143,12 @@ void cFemonOsd::DrawStatusWindow(void)
m_Osd->Text(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_StatusWindow);
snprintf(buf, sizeof(buf), "%08x", m_UNC);
m_Osd->Text(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
snprintf(buf, sizeof(buf), "%s:", tr("Audio"));
snprintf(buf, sizeof(buf), "%s:", (m_Receiver && m_Receiver->AC3Valid()) ? tr("AC-3") : tr("Audio"));
m_Osd->Text(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", m_Receiver->AudioBitrate(), tr("kbit/s"));
if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", m_Receiver->AC3Valid() ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate(), tr("kbit/s"));
else snprintf(buf, sizeof(buf), "--- %s", tr("kbit/s"));
m_Osd->Text(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDSTATUSWIN_XC(1,tr("LOCK")), OSDSTATUSWIN_Y(offset), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_StatusWindow);
m_Osd->Text(OSDSTATUSWIN_XC(2,tr("SIGNAL")), OSDSTATUSWIN_Y(offset), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_StatusWindow);
m_Osd->Text(OSDSTATUSWIN_XC(3,tr("CARRIER")), OSDSTATUSWIN_Y(offset), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_StatusWindow);
@@ -181,7 +187,7 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Ppid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Apid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value);
@@ -192,14 +198,77 @@ void cFemonOsd::DrawInfoWindow(void)
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Dpid1());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Ca());
value = channel->Ca();
if (femonConfig.showcasystem) {
/* http://www.dvb.org/index.php?id=174 */
switch (value) {
case 0x0000:
/* Reserved */
snprintf(buf, sizeof(buf), "%s", tr("Free to Air"));
break;
case 0x0001 ... 0x00FF:
/* Standardized systems */
snprintf(buf, sizeof(buf), "%s", tr("Fixed"));
break;
case 0x0100 ... 0x01FF:
/* Canal Plus */
snprintf(buf, sizeof(buf), "%s", tr("SECA/Mediaguard"));
break;
case 0x0500 ... 0x05FF:
/* France Telecom */
snprintf(buf, sizeof(buf), "%s", tr("Viaccess"));
break;
case 0x0600 ... 0x06FF:
/* Irdeto */
snprintf(buf, sizeof(buf), "%s", tr("Irdeto"));
break;
case 0x0900 ... 0x09FF:
/* News Datacom */
snprintf(buf, sizeof(buf), "%s", tr("NDS/Videoguard"));
break;
case 0x0B00 ... 0x0BFF:
/* Norwegian Telekom */
snprintf(buf, sizeof(buf), "%s", tr("Conax"));
break;
case 0x0D00 ... 0x0DFF:
/* Philips */
snprintf(buf, sizeof(buf), "%s", tr("CryptoWorks"));
break;
case 0x0E00 ... 0x0EFF:
/* Scientific Atlanta */
snprintf(buf, sizeof(buf), "%s", tr("PowerVu"));
break;
case 0x1200 ... 0x12FF:
/* BellVu Express */
snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
break;
case 0x1700 ... 0x17FF:
/* BetaTechnik */
snprintf(buf, sizeof(buf), "%s", tr("BetaCrypt"));
break;
case 0x1800 ... 0x18FF:
/* Kudelski SA */
snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
break;
case 0x4A60 ... 0x4A6F:
/* @Sky */
snprintf(buf, sizeof(buf), "%s", tr("SkyCrypt"));
break;
default:
snprintf(buf, sizeof(buf), "%X", value);
break;
}
}
else {
snprintf(buf, sizeof(buf), "%X", value);
}
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Tpid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Sid());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
@@ -207,7 +276,7 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Nid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Nid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Tid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Tid());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
@@ -215,12 +284,12 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d", channel->Rid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
#endif
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
switch (m_FrontendInfo.type) {
case FE_QPSK:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Frequency();
while (value > 20000) value /= 1000;
@@ -229,14 +298,14 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization()));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
@@ -261,7 +330,7 @@ void cFemonOsd::DrawInfoWindow(void)
case FE_QAM:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Frequency();
while (value > 20000) value /= 1000;
@@ -270,7 +339,7 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
@@ -284,7 +353,7 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
@@ -309,7 +378,7 @@ void cFemonOsd::DrawInfoWindow(void)
default:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Frequency();
while (value > 20000) value /= 1000;
@@ -321,7 +390,7 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K");
else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Bandwidth();
if (value == BANDWIDTH_8_MHZ) snprintf(buf, sizeof(buf), "8 %s", tr("MHz"));
@@ -339,7 +408,7 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
@@ -371,7 +440,7 @@ void cFemonOsd::DrawInfoWindow(void)
else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto"));
strncat(buf, buf2, sizeof(buf));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), clrWhite, clrBackground, m_InfoWindow);
value = channel->Hierarchy();
if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None"));
@@ -392,19 +461,19 @@ void cFemonOsd::DrawInfoWindow(void)
}
}
else if (m_DisplayMode == modeStream) {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground);
m_Osd->Fill(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+cOsd::LineHeight()-1), clrWhite);
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground, m_InfoWindow);
m_Osd->Fill(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+cOsd::LineHeight()-1), clrWhite, m_InfoWindow);
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), clrBackground, clrWhite, m_InfoWindow);
offset += cOsd::LineHeight();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), clrYellow, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "#%d", channel->Vpid());
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow);
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->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) {
value = m_Receiver->VideoAspectRatio();
@@ -416,12 +485,12 @@ void cFemonOsd::DrawInfoWindow(void)
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz"));
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) {
value = m_Receiver->VideoFormat();
@@ -431,16 +500,18 @@ void cFemonOsd::DrawInfoWindow(void)
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize());
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "#%d", channel->Apid1());
value = -1;
cDevice::PrimaryDevice()->GetAudioTracks(&value);
snprintf(buf, sizeof(buf), "#%d", (value > 0 ? channel->Apid2() : channel->Apid1()));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) {
dvalue = m_Receiver->AudioStreamBitrate();
@@ -450,20 +521,113 @@ void cFemonOsd::DrawInfoWindow(void)
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer());
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - 2;
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver) {
value = m_Receiver->AudioSamplingFreq();
value = m_Receiver->AudioSamplingFreq();
if (value == FR_RESERVED) 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->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
}
else if (m_DisplayMode == modeAC3) {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground, m_InfoWindow);
m_Osd->Fill(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+cOsd::LineHeight()-1), clrWhite, m_InfoWindow);
snprintf(buf, sizeof(buf), "%s - %s #%d", tr("Stream Information"), tr("AC-3 Stream"), channel->Dpid1());
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrBackground, clrWhite, m_InfoWindow);
offset += cOsd::LineHeight();
if (m_Receiver && m_Receiver->AC3Valid()) {
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%.0f %s (%0.f %s)", m_Receiver->AC3StreamBitrate(), tr("kbit/s"), m_Receiver->AC3Bitrate(), tr("kbit/s"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%.1f %s", m_Receiver->AC3SamplingFreq() / 1000., tr("kHz"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Size"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", m_Receiver->AC3FrameSize());
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bit Stream Mode"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3BitStreamMode()) {
case 0: snprintf(buf, sizeof(buf), tr("Complete Main (CM)")); break;
case 1: snprintf(buf, sizeof(buf), tr("Music and Effects (ME)")); break;
case 2: snprintf(buf, sizeof(buf), tr("Visually Impaired (VI)")); break;
case 3: snprintf(buf, sizeof(buf), tr("Hearing Impaired (HI)")); break;
case 4: snprintf(buf, sizeof(buf), tr("Dialogue (D)")); break;
case 5: snprintf(buf, sizeof(buf), tr("Commentary (C)")); break;
case 6: snprintf(buf, sizeof(buf), tr("Emergency (E)")); break;
case 7: (m_Receiver->AC3AudioCodingMode() == 1) ? snprintf(buf, sizeof(buf), tr("Voice Over (VO)")) : snprintf(buf, sizeof(buf), tr("Karaoke")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Coding Mode"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver->AC3BitStreamMode() != 7) {
switch (m_Receiver->AC3AudioCodingMode()) {
case 0: snprintf(buf, sizeof(buf), "1+1 - %s, %s", tr("Ch1"), tr("Ch2")); break;
case 1: snprintf(buf, sizeof(buf), "1/0 - %s", tr("C")); break;
case 2: snprintf(buf, sizeof(buf), "2/0 - %s, %s", tr("L"), tr("R")); break;
case 3: snprintf(buf, sizeof(buf), "3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R")); break;
case 4: snprintf(buf, sizeof(buf), "2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S")); break;
case 5: snprintf(buf, sizeof(buf), "3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S")); break;
case 6: snprintf(buf, sizeof(buf), "2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR")); break;
case 7: snprintf(buf, sizeof(buf), "3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR")); break;
default: snprintf(buf, sizeof(buf), "---");
}
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Center Mix Level"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3CenterMixLevel()) {
case CML_MINUS_3dB: snprintf(buf, sizeof(buf), "-3.0 %s", tr("dB")); break;
case CML_MINUS_4_5dB: snprintf(buf, sizeof(buf), "-4.5 %s", tr("dB")); break;
case CML_MINUS_6dB: snprintf(buf, sizeof(buf), "-6.0 %s", tr("dB")); break;
case CML_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Surround Mix Level"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3SurroundMixLevel()) {
case SML_MINUS_3dB: snprintf(buf, sizeof(buf), "-3 %s", tr("dB")); break;
case SML_MINUS_6dB: snprintf(buf, sizeof(buf), "-6 %s", tr("dB")); break;
case SML_0_dB: snprintf(buf, sizeof(buf), "0 %s", tr("dB")); break;
case SML_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dolby Surround Mode"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3DolbySurroundMode()) {
case DSM_NOT_INDICATED: snprintf(buf, sizeof(buf), "%s", tr("not indicated")); break;
case DSM_NOT_DOLBYSURROUND: snprintf(buf, sizeof(buf), "%s", tr("Off")); break;
case DSM_DOLBYSURROUND: snprintf(buf, sizeof(buf), "%s", tr("On")); break;
case DSM_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Low Frequency Effects"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%s", m_Receiver->AC3LfeOn() ? tr("On") : tr("Off"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dialogue Normalization"), clrWhite, clrBackground, m_InfoWindow);
value = m_Receiver->AC3DialogLevel();
if (value > 0) snprintf(buf, sizeof(buf), "-%d %s", value, tr("dB"));
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
}
}
else /* modeBasic */ {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, m_InfoWindow);
@@ -536,8 +700,8 @@ void cFemonOsd::Show(void)
if (m_Receiver)
delete m_Receiver;
if (femonConfig.analyzestream) {
int channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
Start();
@@ -568,8 +732,8 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
if (m_Receiver)
delete m_Receiver;
if (femonConfig.analyzestream) {
channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -577,9 +741,8 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
eOSState cFemonOsd::ProcessKey(eKeys Key)
{
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
switch (Key & ~k_Repeat) {
switch (Key) {
case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber;
@@ -618,6 +781,49 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
break;
case kBack:
return osEnd;
case kGreen:
{
int CurrentAudioTrack = -1;
const char **AudioTracks = cDevice::PrimaryDevice()->GetAudioTracks(&CurrentAudioTrack);
if (AudioTracks) {
const char **at = &AudioTracks[CurrentAudioTrack];
if (!*++at)
at = AudioTracks;
cDevice::PrimaryDevice()->SetAudioTrack(at - AudioTracks);
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Receiver)
delete m_Receiver;
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), (at - AudioTracks) ? channel->Apid2() : channel->Apid1(), channel->Dpid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
}
break;
case kRight:
case kLeft:
{
int device = cDevice::ActualDevice()->DeviceNumber();
if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (NORMALKEY(Key) == kRight) {
if (++device >= cDevice::NumDevices()) device = 0;
}
else {
if (--device < 0) device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel)) {
//cStatus::MsgChannelSwitch(cDevice::GetDevice(device), 0);
//implement some tuning mechanism here
//cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apid1(), channel->Apid2(), channel->Dpid1(), channel->Dpid2($
//cStatus::MsgChannelSwitch(cDevice::GetDevice(device), channel->Number());
break;
}
}
}
}
break;
case kUp|k_Repeat:
case kUp:
case kDown|k_Repeat:
@@ -640,7 +846,9 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
}
break;
case kOk:
if (++m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0; // toggle between display modes
// toggle between display modes
if (++m_DisplayMode == modeAC3 && !Channels.GetByNumber(cDevice::CurrentChannel())->Dpid1()) m_DisplayMode++;
if (m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0;
DrawInfoWindow();
break;
default:

View File

@@ -16,17 +16,19 @@
#define PAYLOAD 0x10
#define PTS_DTS_FLAGS 0xC0
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid)
#if VDRVERSNUM >= 10300
:cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver")
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid), cThread("femon receiver")
#else
:cReceiver(Ca, -1, 2, Vpid, Apid)
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid)
#endif
{
//printf("cFemonReceiver::cFemonReceiver()\n");
m_Active = false;
m_VideoPid = Vpid;
m_AudioPid = Apid;
m_AC3Pid = Dpid;
m_VideoValid = false;
m_VideoPacketCount = 0;
m_VideoHorizontalSize = 0;
m_VideoVerticalSize = 0;
@@ -35,13 +37,26 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
m_VideoFrameRate = 0.0;
m_VideoStreamBitrate = 0.0;
m_VideoBitrate = 0.0;
m_AudioValid = false;
m_AudioPacketCount = 0;
m_AudioStreamBitrate = -2.0;
m_AudioBitrate = 0.0;
m_AudioSamplingFreq = -1;
m_AudioMPEGLayer = 0;
m_AudioBitrate = 0.0;
m_AC3Valid = false;
m_AC3PacketCount = 0;
m_AC3StreamBitrate = 0;
m_AC3SamplingFreq = 0;
m_AC3Bitrate = 0;
m_AC3FrameSize = 0;
m_AC3BitStreamMode = FR_NOTVALID;
m_AC3AudioCodingMode = FR_NOTVALID;
m_AC3CenterMixLevel = FR_NOTVALID;
m_AC3SurroundMixLevel = FR_NOTVALID;
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = false;
m_AC3DialogLevel = FR_NOTVALID;
}
cFemonReceiver::~cFemonReceiver(void)
@@ -53,29 +68,29 @@ cFemonReceiver::~cFemonReceiver(void)
}
}
/* the following function originates from libdvbmpeg: */
/* 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) {
m_VideoValid = false;
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)
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]);
if ((!found) || ((c + 16) >= count)) return;
m_VideoValid = true;
headr = mbuf + c + 4;
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 ){
switch ( sw ){
case 1:
m_VideoAspectRatio = AR_1_1;
break;
@@ -89,15 +104,14 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoAspectRatio = AR_2_21_1;
break;
case 5 ... 15:
default:
m_VideoAspectRatio = AR_RESERVED;
break;
default:
return;
}
sw = (int)(headr[3] & 0x0F);
switch ( sw ) {
case 1:
m_VideoFrameRate = 24000/1001.0;
m_VideoFrameRate = 24000 / 1001.0;
m_VideoFormat = VF_UNKNOWN;
break;
case 2:
@@ -109,7 +123,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoFormat = VF_PAL;
break;
case 4:
m_VideoFrameRate = 30000/1001.0;
m_VideoFrameRate = 30000 / 1001.0;
m_VideoFormat = VF_NTSC;
break;
case 5:
@@ -124,6 +138,15 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoFrameRate = 60.0;
m_VideoFormat = VF_NTSC;
break;
case 8:
m_VideoFrameRate = 60000 / 1001.0;
m_VideoFormat = VF_NTSC;
break;
case 9 ... 15:
default:
m_VideoFrameRate = 0;
m_VideoFormat = VF_UNKNOWN;
break;
}
m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0;
}
@@ -135,9 +158,10 @@ static unsigned int bitrates[3][16] =
{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};
static unsigned int samplerates[4] =
{441, 480, 320, 0};
/* the following function originates from libdvbmpeg: */
/* The following function originates from libdvbmpeg: */
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetAudioInfo()\n");
@@ -145,15 +169,16 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
int found = 0;
int c = 0;
int tmp = 0;
while (!found && c < count) {
m_AudioValid = false;
while (!found && (c < count)) {
uint8_t *b = mbuf + c;
if (b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8))
found = 1;
else
c++;
}
if (!found) return;
if (c + 3 >= count) return;
if ((!found) || ((c + 3) >= count)) return;
m_AudioValid = true;
headr = mbuf + c;
m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1);
tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000;
@@ -170,6 +195,65 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
m_AudioSamplingFreq = tmp;
}
static unsigned int ac3_bitrates[32] =
{32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static unsigned int ac3_freq[4] =
{480, 441, 320, 0};
static unsigned int ac3_frames[3][32] =
{
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
/*
** AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
** The following function originates from libdvbmpeg:
*/
void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
{
uint8_t *headr;
int found = 0;
int c = 0;
uint8_t frame;
m_AC3Valid = false;
while (!found && (c < count)) {
uint8_t *b = mbuf + c;
if ((b[0] == 0x0b) && (b[1] == 0x77))
found = 1;
else
c++;
}
if ((!found) || ((c + 5) >= count)) return;
m_AC3Valid = true;
headr = mbuf + c + 2;
frame = (headr[2] & 0x3f);
m_AC3StreamBitrate = ac3_bitrates[frame >> 1];
int fr = (headr[2] & 0xc0 ) >> 6;
m_AC3SamplingFreq = ac3_freq[fr] * 100;
m_AC3FrameSize = ac3_frames[fr][frame >> 1];
if ((frame & 1) && (fr == 1)) m_AC3FrameSize++;
m_AC3FrameSize <<= 1;
m_AC3BitStreamMode = (headr[3] & 7);
m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5;
if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) // if 3 front channels
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
else
m_AC3CenterMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode & 0x04) // if a surround channel exists
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
else
m_AC3SurroundMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode == 0x02) // if in 2/0 mode
m_AC3DolbySurroundMode = ((headr[4] & 1) << 1) | ((headr[5] & 0x80) >> 7);
else
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
}
void cFemonReceiver::Activate(bool On)
{
//printf("cFemonReceiver::Activate()\n");
@@ -188,6 +272,9 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
else if (pid == m_AudioPid) {
m_AudioPacketCount++;
}
else if (pid == m_AC3Pid) {
m_AC3PacketCount++;
}
/* the following originates from libdvbmpeg: */
if (!(Data[3] & PAYLOAD)) {
return;
@@ -204,9 +291,12 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
if (pid == m_VideoPid) {
GetVideoInfo(pay, l);
}
if (pid == m_AudioPid) {
else if (pid == m_AudioPid) {
GetAudioInfo(pay, l);
}
else if (pid == m_AC3Pid) {
GetAC3Info(pay, l);
}
}
}
/* end */
@@ -226,6 +316,8 @@ void cFemonReceiver::Action(void)
m_VideoPacketCount = 0;
m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0);
m_AudioPacketCount = 0;
m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0);
m_AC3PacketCount = 0;
usleep(100000L * femonConfig.calcinterval);
}
#if (VDRVERSNUM < 10300)

View File

@@ -26,29 +26,68 @@ enum eAspectRatio {
AR_2_21_1 = 233,
};
#define FR_RESERVED -1
#define FR_FREE -2
enum eCenterMixLevel {
CML_MINUS_3dB = 0,
CML_MINUS_4_5dB = 1,
CML_MINUS_6dB = 2,
CML_RESERVED = 3,
};
enum eSurroundMixLevel {
SML_MINUS_3dB = 0,
SML_MINUS_6dB = 1,
SML_0_dB = 2,
SML_RESERVED = 3,
};
enum eDolbySurroundMode {
DSM_NOT_INDICATED = 0,
DSM_NOT_DOLBYSURROUND = 1,
DSM_DOLBYSURROUND = 2,
DSM_RESERVED = 3,
};
#define FR_RESERVED -1
#define FR_FREE -2
#define FR_NOTVALID -3
class cFemonReceiver : public cReceiver, public cThread {
private:
bool m_Active;
int m_VideoPid;
int m_AudioPid;
int m_VideoPacketCount;
int m_VideoHorizontalSize;
int m_VideoVerticalSize;
int m_VideoAspectRatio;
int m_VideoFormat;
bool m_Active;
int m_VideoPid;
int m_AudioPid;
int m_AC3Pid;
bool m_VideoValid;
int m_VideoPacketCount;
int m_VideoHorizontalSize;
int m_VideoVerticalSize;
int m_VideoAspectRatio;
int m_VideoFormat;
double m_VideoFrameRate;
double m_VideoStreamBitrate;
double m_VideoBitrate;
int m_AudioPacketCount;
bool m_AudioValid;
int m_AudioPacketCount;
double m_AudioStreamBitrate;
double m_AudioBitrate;
int m_AudioSamplingFreq;
int m_AudioMPEGLayer;
void GetVideoInfo(uint8_t *mbuf, int count);
void GetAudioInfo(uint8_t *mbuf, int count);
int m_AudioSamplingFreq;
int m_AudioMPEGLayer;
bool m_AC3Valid;
int m_AC3PacketCount;
double m_AC3Bitrate;
int m_AC3FrameSize;
int m_AC3SamplingFreq;
int m_AC3StreamBitrate;
int m_AC3BitStreamMode;
int m_AC3AudioCodingMode;
int m_AC3CenterMixLevel;
int m_AC3SurroundMixLevel;
int m_AC3DolbySurroundMode;
bool m_AC3LfeOn;
int m_AC3DialogLevel;
void GetVideoInfo(uint8_t *mbuf, int count);
void GetAudioInfo(uint8_t *mbuf, int count);
void GetAC3Info(uint8_t *mbuf, int count);
protected:
virtual void Activate(bool On);
@@ -56,9 +95,10 @@ protected:
virtual void Action(void);
public:
cFemonReceiver(int Ca, int Vpid, int Apid);
cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid);
virtual ~cFemonReceiver();
bool VideoValid(void) { return m_VideoValid; }; // boolean
int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio
@@ -67,10 +107,26 @@ public:
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s
bool AudioValid(void) { return m_AudioValid; }; // boolean
int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number
int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz
double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // kbit/s
double AC3Bitrate(void) { return m_AC3Bitrate; }; // kbit/s
int AC3FrameSize(void) { return m_AC3FrameSize; }; // Bytes
int AC3BitStreamMode(void) { return m_AC3BitStreamMode; }; // 0..7
int AC3AudioCodingMode(void) { return m_AC3AudioCodingMode; }; // 0..7
bool AC3_2_0(void) { return m_AC3AudioCodingMode == 2; }; // DD 2.0
bool AC3_5_1(void) { return m_AC3AudioCodingMode == 7; }; // DD 5.1
int AC3CenterMixLevel(void) { return m_AC3CenterMixLevel; }; // eCenterMixLevel
int AC3SurroundMixLevel(void) { return m_AC3SurroundMixLevel; }; // eSurroundMixLevel
int AC3DolbySurroundMode(void) { return m_AC3DolbySurroundMode; }; // eDolbySurroundMode
bool AC3LfeOn(void) { return m_AC3LfeOn; }; // boolean
int AC3DialogLevel(void) { return m_AC3DialogLevel; }; // -dB
};
#endif //__FEMONRECEIVER_H