mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 11:36:53 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f9961f499 | ||
|
|
c454189adf | ||
|
|
5339f71b33 | ||
|
|
8e53fa8521 | ||
|
|
9514ed5387 | ||
|
|
a6039cdd66 | ||
|
|
848a2ba78d | ||
|
|
74ed4d8490 | ||
|
|
8c7c110cf2 | ||
|
|
ba7896b59a | ||
|
|
43c68bcf23 | ||
|
|
954f09182f |
91
HISTORY
91
HISTORY
@@ -1,5 +1,6 @@
|
|||||||
|
===================================
|
||||||
VDR Plugin 'femon' Revision History
|
VDR Plugin 'femon' Revision History
|
||||||
-----------------------------------
|
===================================
|
||||||
|
|
||||||
2004-02-15: Version 0.0.1
|
2004-02-15: Version 0.0.1
|
||||||
|
|
||||||
@@ -29,3 +30,91 @@ VDR Plugin 'femon' Revision History
|
|||||||
- Transponder information is now available in advanced display mode:
|
- Transponder information is now available in advanced display mode:
|
||||||
Press 'OK' key to switch between the simple and the advanced display mode.
|
Press 'OK' key to switch between the simple and the advanced display mode.
|
||||||
- Moved bitrate calculation to it's own thread for improved accurancy.
|
- Moved bitrate calculation to it's own thread for improved accurancy.
|
||||||
|
|
||||||
|
2004-03-07: Version 0.0.3a
|
||||||
|
|
||||||
|
- Fixed frequency, guard and bandwidth units in transponder information.
|
||||||
|
- Added Apid2, Dpid1, Dpid2 information.
|
||||||
|
- Added option to write signal information into system log.
|
||||||
|
|
||||||
|
2004-03-16: Version 0.0.3b
|
||||||
|
|
||||||
|
- Fixed channel toggling with '0' key.
|
||||||
|
- Bitrate calculation thread is now canceled immediately to speed up channel switching.
|
||||||
|
|
||||||
|
2004-04-04: Version 0.0.3c
|
||||||
|
|
||||||
|
- Fixed minor bitrate calculation errors.
|
||||||
|
- Added russian translation (Thanks to Vyacheslav Dikonov).
|
||||||
|
|
||||||
|
2004-05-31: Version 0.0.4
|
||||||
|
|
||||||
|
- Backported "stream information" feature (from version 0.1.1).
|
||||||
|
|
||||||
|
2004-06-06: Version 0.0.5
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- 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).
|
||||||
|
|
||||||
|
2004-06-06: Version 0.1.2
|
||||||
|
|
||||||
|
- 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".
|
||||||
|
|
||||||
|
2004-11-28: Version 0.1.7
|
||||||
|
|
||||||
|
- Updated for vdr-1.3.17.
|
||||||
|
- Fixed receiver related crash (Thanks to Marco Schluessler).
|
||||||
|
|
||||||
|
2005-01-15: Version 0.7.7
|
||||||
|
|
||||||
|
- Updated for vdr-1.3.18.
|
||||||
|
- Added DEBUG mode (make DEBUG=1 plugins).
|
||||||
|
- OSD height is now user configurable.
|
||||||
|
- Added audio channel selection into Yellow key.
|
||||||
|
|||||||
8
Makefile
8
Makefile
@@ -11,12 +11,12 @@ PLUGIN = femon
|
|||||||
|
|
||||||
### The version number of this plugin (taken from the main source file):
|
### 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:
|
### The C++ compiler and options:
|
||||||
|
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual
|
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -fPIC
|
||||||
|
|
||||||
### The directory environment:
|
### The directory environment:
|
||||||
|
|
||||||
@@ -44,6 +44,10 @@ INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
|
|||||||
|
|
||||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||||
|
|
||||||
|
ifdef NTSC_SYSTEM
|
||||||
|
DEFINES += -DNTSC_SYSTEM
|
||||||
|
endif
|
||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o
|
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o
|
||||||
|
|||||||
90
README
90
README
@@ -10,34 +10,86 @@ See the file COPYING for license information.
|
|||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
|
|
||||||
Ph.D. in Astro Physics and preferably a six-pack waiting in a fridge.
|
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
|
||||||
Never trust a Klingon.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
||||||
'femon' by Johannes Stezenbach <js@convergence.de> (see DVB-apps/szap/femon.c
|
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
|
||||||
for further information). The other parts of plugin code are borrowed from the
|
information). The other parts of plugin code are borrowed from the excellent
|
||||||
excellent 'OSD Picture-In-Picture' plugin by Sascha Volkenandt <sascha@akv-soft.de>
|
'OSD Picture-In-Picture' plugin by Sascha Volkenandt and Andreas Regel. The
|
||||||
and Andreas Regel <andreas.regel@powarman.de>. The bitrate calculation algorithm
|
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:
|
Terminology:
|
||||||
|
|
||||||
|
--------------------------------------------------------------
|
||||||
|
|## Channel Name ########################## [AR][VF][A/DD][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
|
||||||
|
|
||||||
|
AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional)
|
||||||
|
VF - Video format: PAL/NTSC (optional)
|
||||||
|
A/DD - Audio (0..5) / AC-3 track (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
|
||||||
|
Green - Select next audio track
|
||||||
|
Yellow - Select audio channel: stereo, mono left, mono right
|
||||||
|
Back - Exit plugin
|
||||||
|
(Left/Right - Switch to next/previous device that provides the current channel)
|
||||||
|
|
||||||
|
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 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
|
- Disable the stream analyze to speed up heavy zapping sessions.
|
||||||
ttxtsubs, but closing and reopening the femon plugin might help temporarily as
|
- The signal strength and signal-to-noise ratio values are comparable only
|
||||||
well. Btw., this same thing happens with OSDTeletext plugin too :)
|
between the same brand/model frontends. Due to the lack of proper frontend
|
||||||
- The plugin GUI is designed for _small fonts_, so stable vdr-1.2.6 users should
|
specifications those values cannot be calculated into any real units.
|
||||||
consider a small font patch (e.g. ElchiAIO4a) to maximize the visual effect :)
|
- If the OSD isn't visible, you've configured the OSD height too big or too
|
||||||
|
small. Please, try to adjust the variable on the setup page before writing
|
||||||
|
any bug reports.
|
||||||
|
- There's a shrinked default OSD height 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."
|
||||||
|
|||||||
46
femon.c
46
femon.c
@@ -12,6 +12,10 @@
|
|||||||
#include "femonosd.h"
|
#include "femonosd.h"
|
||||||
#include "femon.h"
|
#include "femon.h"
|
||||||
|
|
||||||
|
#if VDRVERSNUM && VDRVERSNUM < 10318
|
||||||
|
#error "You don't exist! Go away!"
|
||||||
|
#endif
|
||||||
|
|
||||||
cPluginFemon::cPluginFemon(void)
|
cPluginFemon::cPluginFemon(void)
|
||||||
{
|
{
|
||||||
// Initialize any member variables here.
|
// Initialize any member variables here.
|
||||||
@@ -64,21 +68,29 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
|
|||||||
{
|
{
|
||||||
// Parse your own setup parameters and store their values.
|
// Parse your own setup parameters and store their values.
|
||||||
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
|
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
|
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
|
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(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[modeBasic] = tr("basic");
|
||||||
|
dispmodes[modeTransponder] = tr("transponder");
|
||||||
|
dispmodes[modeStream] = tr("stream");
|
||||||
|
dispmodes[modeAC3] = tr("AC-3");
|
||||||
Setup();
|
Setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,15 +99,18 @@ 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("Default Display Mode"), &femonConfig.displaymode, tr("simple"), tr("advanced")));
|
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
|
||||||
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
|
Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes));
|
||||||
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
|
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
|
||||||
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
|
Add(new cMenuEditIntItem( tr("Height"), &femonConfig.osdheight, 400, 500));
|
||||||
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
|
Add(new cMenuEditBoolItem( tr("Show CA System"), &femonConfig.showcasystem, tr("no"), tr("yes")));
|
||||||
Add(new cMenuEditBoolItem( tr("Bitrate Calculation"), &femonConfig.showbitrate, tr("no"), tr("yes")));
|
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
|
||||||
if (femonConfig.showbitrate)
|
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
|
||||||
Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100));
|
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
|
||||||
|
Add(new cMenuEditBoolItem( tr("Analyze Stream"), &femonConfig.analyzestream, tr("no"), tr("yes")));
|
||||||
|
if (femonConfig.analyzestream)
|
||||||
|
Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100));
|
||||||
|
|
||||||
SetCurrent(Get(current));
|
SetCurrent(Get(current));
|
||||||
Display();
|
Display();
|
||||||
@@ -104,22 +119,25 @@ void cMenuFemonSetup::Setup(void)
|
|||||||
void cMenuFemonSetup::Store(void)
|
void cMenuFemonSetup::Store(void)
|
||||||
{
|
{
|
||||||
SetupStore("HideMenu", femonConfig.hidemenu);
|
SetupStore("HideMenu", femonConfig.hidemenu);
|
||||||
SetupStore("Position", femonConfig.position);
|
SetupStore("SyslogOutput", femonConfig.syslogoutput);
|
||||||
SetupStore("DisplayMode", femonConfig.displaymode);
|
SetupStore("DisplayMode", femonConfig.displaymode);
|
||||||
|
SetupStore("Position", femonConfig.position);
|
||||||
|
SetupStore("OSDHeight", femonConfig.osdheight);
|
||||||
|
SetupStore("ShowCASystem", femonConfig.showcasystem);
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
3
femon.h
3
femon.h
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "0.0.3";
|
static const char *VERSION = "0.7.7";
|
||||||
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);
|
||||||
|
|||||||
@@ -18,6 +18,13 @@ 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;
|
||||||
|
showcasystem = 0;
|
||||||
|
#ifdef NTSC_SYSTEM
|
||||||
|
osdheight = 420;
|
||||||
|
#else
|
||||||
|
osdheight = 480;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
33
femoncfg.h
33
femoncfg.h
@@ -9,18 +9,35 @@
|
|||||||
#ifndef __FEMONCFG_H
|
#ifndef __FEMONCFG_H
|
||||||
#define __FEMONCFG_H
|
#define __FEMONCFG_H
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define debug(x) (x);
|
||||||
|
#else
|
||||||
|
#define debug(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum dispModes {
|
||||||
|
modeBasic,
|
||||||
|
modeTransponder,
|
||||||
|
modeStream,
|
||||||
|
modeAC3,
|
||||||
|
modeMaxNumber
|
||||||
|
};
|
||||||
|
|
||||||
struct cFemonConfig
|
struct cFemonConfig
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cFemonConfig(void);
|
cFemonConfig(void);
|
||||||
int hidemenu;
|
int hidemenu;
|
||||||
int displaymode;
|
int displaymode;
|
||||||
int position;
|
int position;
|
||||||
int redlimit;
|
int redlimit;
|
||||||
int greenlimit;
|
int greenlimit;
|
||||||
int updateinterval;
|
int updateinterval;
|
||||||
int showbitrate;
|
int analyzestream;
|
||||||
int calcinterval;
|
int calcinterval;
|
||||||
|
int syslogoutput;
|
||||||
|
int showcasystem;
|
||||||
|
int osdheight;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern cFemonConfig femonConfig;
|
extern cFemonConfig femonConfig;
|
||||||
|
|||||||
1886
femoni18n.c
1886
femoni18n.c
File diff suppressed because it is too large
Load Diff
1177
femonosd.c
1177
femonosd.c
File diff suppressed because it is too large
Load Diff
15
femonosd.h
15
femonosd.h
@@ -16,32 +16,37 @@
|
|||||||
#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>
|
#include <vdr/transfer.h>
|
||||||
|
#include <vdr/tools.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;
|
||||||
int m_Number;
|
int m_Number;
|
||||||
int m_InputTime;
|
int m_OldNumber;
|
||||||
uint16_t m_SNR;
|
uint16_t m_SNR;
|
||||||
uint16_t m_Signal;
|
uint16_t m_Signal;
|
||||||
uint32_t m_BER;
|
uint32_t m_BER;
|
||||||
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;
|
||||||
|
cTimeMs m_InputTime;
|
||||||
cMutex* m_Mutex;
|
cMutex* m_Mutex;
|
||||||
|
static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51;
|
||||||
|
static cBitmap bmZero, bmDevice, bmPAL, bmNTSC, bmOne, bmTwo, bmThree, bmFour, bmFive;
|
||||||
|
static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
|
||||||
void DrawStatusWindow(void);
|
void DrawStatusWindow(void);
|
||||||
void DrawInfoWindow(void);
|
void DrawInfoWindow(void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
|
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
|
||||||
|
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cFemonOsd(void);
|
cFemonOsd(void);
|
||||||
|
|||||||
298
femonreceiver.c
298
femonreceiver.c
@@ -7,44 +7,268 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <vdr/tools.h>
|
||||||
#include "femoncfg.h"
|
#include "femoncfg.h"
|
||||||
#include "femonreceiver.h"
|
#include "femonreceiver.h"
|
||||||
|
|
||||||
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
|
#define TS_SIZE 188
|
||||||
#if VDRVERSNUM >= 10300
|
#define PAY_START 0x40
|
||||||
:cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver")
|
#define ADAPT_FIELD 0x20
|
||||||
#else
|
#define PAYLOAD 0x10
|
||||||
:cReceiver(Ca, -1, 2, Vpid, Apid)
|
#define PTS_DTS_FLAGS 0xC0
|
||||||
#endif
|
|
||||||
|
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid)
|
||||||
|
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid), cThread("femon receiver")
|
||||||
{
|
{
|
||||||
//printf("cFemonReceiver::cFemonReceiver()\n");
|
debug(printf("cFemonReceiver::cFemonReceiver()\n"));
|
||||||
m_Active = false;
|
m_Active = false;
|
||||||
m_VideoPid = Vpid;
|
m_VideoPid = Vpid;
|
||||||
m_AudioPid = Apid;
|
m_AudioPid = Apid;
|
||||||
|
m_AC3Pid = Dpid;
|
||||||
|
m_VideoValid = false;
|
||||||
m_VideoPacketCount = 0;
|
m_VideoPacketCount = 0;
|
||||||
m_AudioPacketCount = 0;
|
m_VideoHorizontalSize = 0;
|
||||||
|
m_VideoVerticalSize = 0;
|
||||||
|
m_VideoAspectRatio = AR_RESERVED;
|
||||||
|
m_VideoFormat = VF_UNKNOWN;
|
||||||
|
m_VideoFrameRate = 0.0;
|
||||||
|
m_VideoStreamBitrate = 0.0;
|
||||||
m_VideoBitrate = 0.0;
|
m_VideoBitrate = 0.0;
|
||||||
|
m_AudioValid = false;
|
||||||
|
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;
|
||||||
|
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)
|
cFemonReceiver::~cFemonReceiver(void)
|
||||||
{
|
{
|
||||||
//printf("cFemonReceiver::~cFemonReceiver()\n");
|
debug(printf("cFemonReceiver::~cFemonReceiver()\n"));
|
||||||
|
Detach();
|
||||||
if (m_Active) {
|
if (m_Active) {
|
||||||
m_Active = false;
|
m_Active = false;
|
||||||
Cancel(5);
|
Cancel(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The following function originates from libdvbmpeg: */
|
||||||
|
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||||
|
{
|
||||||
|
debug(printf("cFemonReceiver::GetVideoInfo()\n"));
|
||||||
|
uint8_t *headr;
|
||||||
|
int found = 0;
|
||||||
|
int c = 0;
|
||||||
|
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))
|
||||||
|
found = 4;
|
||||||
|
else
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
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 ){
|
||||||
|
case 1:
|
||||||
|
m_VideoAspectRatio = AR_1_1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
m_VideoAspectRatio = AR_4_3;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
m_VideoAspectRatio = AR_16_9;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
m_VideoAspectRatio = AR_2_21_1;
|
||||||
|
break;
|
||||||
|
case 5 ... 15:
|
||||||
|
default:
|
||||||
|
m_VideoAspectRatio = AR_RESERVED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sw = (int)(headr[3] & 0x0F);
|
||||||
|
switch ( sw ) {
|
||||||
|
case 1:
|
||||||
|
m_VideoFrameRate = 24000 / 1001.0;
|
||||||
|
m_VideoFormat = VF_UNKNOWN;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
m_VideoFrameRate = 24.0;
|
||||||
|
m_VideoFormat = VF_UNKNOWN;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
m_VideoFrameRate = 25.0;
|
||||||
|
m_VideoFormat = VF_PAL;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
m_VideoFrameRate = 30000 / 1001.0;
|
||||||
|
m_VideoFormat = VF_NTSC;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
m_VideoFrameRate = 30.0;
|
||||||
|
m_VideoFormat = VF_NTSC;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
m_VideoFrameRate = 50.0;
|
||||||
|
m_VideoFormat = VF_PAL;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
debug(printf("cFemonReceiver::GetAudioInfo()\n"));
|
||||||
|
uint8_t *headr;
|
||||||
|
int found = 0;
|
||||||
|
int c = 0;
|
||||||
|
int tmp = 0;
|
||||||
|
m_AudioValid = false;
|
||||||
|
while (!found && (c < count)) {
|
||||||
|
uint8_t *b = mbuf + c;
|
||||||
|
if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8))
|
||||||
|
found = 1;
|
||||||
|
else
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
if (tmp == 0)
|
||||||
|
m_AudioStreamBitrate = (double)FR_FREE;
|
||||||
|
else if (tmp == 0xf)
|
||||||
|
m_AudioStreamBitrate = (double)FR_RESERVED;
|
||||||
|
else
|
||||||
|
m_AudioStreamBitrate = tmp / 1000.0;
|
||||||
|
tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100;
|
||||||
|
if (tmp == 3)
|
||||||
|
m_AudioSamplingFreq = FR_RESERVED;
|
||||||
|
else
|
||||||
|
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)
|
void cFemonReceiver::Activate(bool On)
|
||||||
{
|
{
|
||||||
//printf("cFemonReceiver::Activate()\n");
|
debug(printf("cFemonReceiver::Activate()\n"));
|
||||||
Start();
|
if (On) {
|
||||||
|
if (!m_Active)
|
||||||
|
Start();
|
||||||
|
}
|
||||||
|
else if (m_Active) {
|
||||||
|
m_Active = false;
|
||||||
|
Cancel(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cFemonReceiver::Receive(uchar *Data, int Length)
|
void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||||
{
|
{
|
||||||
//printf("cFemonReceiver::Receive()\n");
|
debug(printf("cFemonReceiver::Receive()\n"));
|
||||||
|
// TS packet length: TS_SIZE
|
||||||
if (Length == TS_SIZE) {
|
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) {
|
||||||
@@ -53,25 +277,51 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
|
|||||||
else if (pid == m_AudioPid) {
|
else if (pid == m_AudioPid) {
|
||||||
m_AudioPacketCount++;
|
m_AudioPacketCount++;
|
||||||
}
|
}
|
||||||
|
else if (pid == m_AC3Pid) {
|
||||||
|
m_AC3PacketCount++;
|
||||||
|
}
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
else if (pid == m_AudioPid) {
|
||||||
|
GetAudioInfo(pay, l);
|
||||||
|
}
|
||||||
|
else if (pid == m_AC3Pid) {
|
||||||
|
GetAC3Info(pay, l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* end */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cFemonReceiver::Action(void)
|
void cFemonReceiver::Action(void)
|
||||||
{
|
{
|
||||||
//printf("cFemonReceiver::Action()\n");
|
debug(printf("cFemonReceiver::Action()\n"));
|
||||||
#if (VDRVERSNUM < 10300)
|
cTimeMs t;
|
||||||
isyslog("femon receiver: thread started (pid = %d)", getpid());
|
|
||||||
#endif
|
|
||||||
m_Active = true;
|
m_Active = true;
|
||||||
while (m_Active) {
|
while (m_Active) {
|
||||||
// should we do some averaging to smooth the bitrates ?
|
t.Set(0);
|
||||||
m_VideoBitrate = (8.0 * TS_SIZE * m_VideoPacketCount) / (femonConfig.calcinterval * 102.4 * 1024.0);
|
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||||
|
m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0);
|
||||||
m_VideoPacketCount = 0;
|
m_VideoPacketCount = 0;
|
||||||
m_AudioBitrate = (8.0 * TS_SIZE * m_AudioPacketCount) / (femonConfig.calcinterval * 102.4);
|
m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0);
|
||||||
m_AudioPacketCount = 0;
|
m_AudioPacketCount = 0;
|
||||||
usleep(100000L * femonConfig.calcinterval);
|
m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0);
|
||||||
|
m_AC3PacketCount = 0;
|
||||||
|
cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed());
|
||||||
}
|
}
|
||||||
#if (VDRVERSNUM < 10300)
|
|
||||||
isyslog("femon receiver: thread stopped (pid = %d)", getpid());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|||||||
111
femonreceiver.h
111
femonreceiver.h
@@ -9,19 +9,85 @@
|
|||||||
#ifndef __FEMONRECEIVER_H
|
#ifndef __FEMONRECEIVER_H
|
||||||
#define __FEMONRECEIVER_H
|
#define __FEMONRECEIVER_H
|
||||||
|
|
||||||
#include <vdr/device.h> // only for TS_SIZE
|
|
||||||
#include <vdr/thread.h>
|
#include <vdr/thread.h>
|
||||||
#include <vdr/receiver.h>
|
#include <vdr/receiver.h>
|
||||||
|
|
||||||
|
enum eVideoFormat {
|
||||||
|
VF_UNKNOWN = 0,
|
||||||
|
VF_PAL = 1,
|
||||||
|
VF_NTSC = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum eAspectRatio {
|
||||||
|
AR_RESERVED = 0,
|
||||||
|
AR_1_1 = 100,
|
||||||
|
AR_4_3 = 133,
|
||||||
|
AR_16_9 = 177,
|
||||||
|
AR_2_21_1 = 233,
|
||||||
|
};
|
||||||
|
|
||||||
|
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 {
|
class cFemonReceiver : public cReceiver, public cThread {
|
||||||
private:
|
private:
|
||||||
bool m_Active;
|
bool m_Active;
|
||||||
int m_VideoPid;
|
int m_VideoPid;
|
||||||
int m_AudioPid;
|
int m_AudioPid;
|
||||||
int m_VideoPacketCount;
|
int m_AC3Pid;
|
||||||
int m_AudioPacketCount;
|
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;
|
double m_VideoBitrate;
|
||||||
|
bool m_AudioValid;
|
||||||
|
int m_AudioPacketCount;
|
||||||
|
double m_AudioStreamBitrate;
|
||||||
double m_AudioBitrate;
|
double m_AudioBitrate;
|
||||||
|
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:
|
protected:
|
||||||
virtual void Activate(bool On);
|
virtual void Activate(bool On);
|
||||||
@@ -29,11 +95,38 @@ protected:
|
|||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cFemonReceiver(int Ca, int Vpid, int Apid);
|
cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid);
|
||||||
virtual ~cFemonReceiver();
|
virtual ~cFemonReceiver();
|
||||||
|
|
||||||
double VideoBitrate(void) { return m_VideoBitrate; };
|
bool VideoValid(void) { return m_VideoValid; }; // boolean
|
||||||
double AudioBitrate(void) { return m_AudioBitrate; };
|
int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
|
||||||
|
int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
|
||||||
|
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio
|
||||||
|
int VideoFormat(void) { return m_VideoFormat; }; // eVideoFormat
|
||||||
|
double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz
|
||||||
|
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
|
#endif //__FEMONRECEIVER_H
|
||||||
|
|||||||
23
symbols/ar11.xpm
Normal file
23
symbols/ar11.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * ar11_xpm[] = {
|
||||||
|
"26 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"++++++++++++++++++++++++++",
|
||||||
|
"+........................+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+...+++++.......+++++....+",
|
||||||
|
"+...+++++.......+++++....+",
|
||||||
|
"+......++...++.....++....+",
|
||||||
|
"+......++...++.....++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++..........++....+",
|
||||||
|
"+......++...++.....++....+",
|
||||||
|
"+......++...++.....++....+",
|
||||||
|
"+........................+",
|
||||||
|
"++++++++++++++++++++++++++"};
|
||||||
23
symbols/ar169.xpm
Normal file
23
symbols/ar169.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * ar169_xpm[] = {
|
||||||
|
"38 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"+....................................+",
|
||||||
|
"+......++.....++++..........++++.....+",
|
||||||
|
"+...+++++....+++++++.......++++++....+",
|
||||||
|
"+...+++++....++...++......++...+++...+",
|
||||||
|
"+......++...++........++..++....++...+",
|
||||||
|
"+......++...++........++..++....++...+",
|
||||||
|
"+......++...++............++....++...+",
|
||||||
|
"+......++...++.+++.........+++++++...+",
|
||||||
|
"+......++...+++++++.........+++.++...+",
|
||||||
|
"+......++...++....++............++...+",
|
||||||
|
"+......++...++....++............++...+",
|
||||||
|
"+......++...++....++............++...+",
|
||||||
|
"+......++...+++...++......++...++....+",
|
||||||
|
"+......++....++++++...++..+++++++....+",
|
||||||
|
"+......++.....++++....++...+++++.....+",
|
||||||
|
"+....................................+",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/ar2211.xpm
Normal file
23
symbols/ar2211.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * ar2211_xpm[] = {
|
||||||
|
"52 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"+..................................................+",
|
||||||
|
"+.....++++..........++++........++...........++....+",
|
||||||
|
"+...+++++++.......+++++++....+++++........+++++....+",
|
||||||
|
"+...++....++......++....++...+++++........+++++....+",
|
||||||
|
"+.........++............++......++...++......++....+",
|
||||||
|
"+.........++............++......++...++......++....+",
|
||||||
|
"+........+++...........+++......++...........++....+",
|
||||||
|
"+.......+++...........+++.......++...........++....+",
|
||||||
|
"+......+++...........+++........++...........++....+",
|
||||||
|
"+.....+++...........+++.........++...........++....+",
|
||||||
|
"+....+++...........+++..........++...........++....+",
|
||||||
|
"+...+++...........+++...........++...........++....+",
|
||||||
|
"+...++............++............++...........++....+",
|
||||||
|
"+...++++++++..++..++++++++......++...++......++....+",
|
||||||
|
"+...++++++++..++..++++++++......++...++......++....+",
|
||||||
|
"+..................................................+",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/ar43.xpm
Normal file
23
symbols/ar43.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * ar43_xpm[] = {
|
||||||
|
"31 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++++++++++++++++",
|
||||||
|
"+.............................+",
|
||||||
|
"+.........++.........+++++....+",
|
||||||
|
"+........+++........+++++++...+",
|
||||||
|
"+.......++++.......++....++...+",
|
||||||
|
"+......++.++...++..++....++...+",
|
||||||
|
"+.....++..++...++........++...+",
|
||||||
|
"+.....++..++............++....+",
|
||||||
|
"+....++...++..........+++.....+",
|
||||||
|
"+...++....++..........++++....+",
|
||||||
|
"+...+++++++++...........+++...+",
|
||||||
|
"+...+++++++++............++...+",
|
||||||
|
"+.........++.......++....++...+",
|
||||||
|
"+.........++.......++...+++...+",
|
||||||
|
"+.........++...++...++++++....+",
|
||||||
|
"+.........++...++....++++.....+",
|
||||||
|
"+.............................+",
|
||||||
|
"+++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/device.xpm
Normal file
23
symbols/device.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * device_xpm[] = {
|
||||||
|
"14 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"++++++++++++++",
|
||||||
|
"+.............",
|
||||||
|
"+.......+..+..",
|
||||||
|
"+.......+..+..",
|
||||||
|
"+.......+..+..",
|
||||||
|
"+....+++++++++",
|
||||||
|
"+....+++++++++",
|
||||||
|
"+......+..+...",
|
||||||
|
"+......+..+...",
|
||||||
|
"+......+..+...",
|
||||||
|
"+......+..+...",
|
||||||
|
"+...+++++++++.",
|
||||||
|
"+...+++++++++.",
|
||||||
|
"+.....+..+....",
|
||||||
|
"+.....+..+....",
|
||||||
|
"+.....+..+....",
|
||||||
|
"+.............",
|
||||||
|
"++++++++++++++"};
|
||||||
23
symbols/dolbydigital.xpm
Normal file
23
symbols/dolbydigital.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * dolbydigital_xpm[] = {
|
||||||
|
"31 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++++++++++++++++",
|
||||||
|
"+.............................+",
|
||||||
|
"+...+++++++++++.+++++++++++...+",
|
||||||
|
"+...++.++++++++.++++++++.++...+",
|
||||||
|
"+...++...++++++.++++++...++...+",
|
||||||
|
"+...++.....++++.++++.....++...+",
|
||||||
|
"+...++......+++.+++......++...+",
|
||||||
|
"+...++.......++.++.......++...+",
|
||||||
|
"+...++.......++.++.......++...+",
|
||||||
|
"+...++.......++.++.......++...+",
|
||||||
|
"+...++.......++.++.......++...+",
|
||||||
|
"+...++......+++.+++......++...+",
|
||||||
|
"+...++.....++++.++++.....++...+",
|
||||||
|
"+...++...++++++.++++++...++...+",
|
||||||
|
"+...++.++++++++.++++++++.++...+",
|
||||||
|
"+...+++++++++++.+++++++++++...+",
|
||||||
|
"+.............................+",
|
||||||
|
"+++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/dolbydigital20.xpm
Normal file
23
symbols/dolbydigital20.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * dolbydigital20_xpm[] = {
|
||||||
|
"55 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"+.....................................................+",
|
||||||
|
"+...+++++++++++.+++++++++++.....++++.........++++.....+",
|
||||||
|
"+...++.++++++++.++++++++.++...+++++++.......++++++....+",
|
||||||
|
"+...++...++++++.++++++...++...++....++......++..++....+",
|
||||||
|
"+...++.....++++.++++.....++.........++.....++....++...+",
|
||||||
|
"+...++......+++.+++......++.........++.....++....++...+",
|
||||||
|
"+...++.......++.++.......++........+++.....++....++...+",
|
||||||
|
"+...++.......++.++.......++.......+++......++....++...+",
|
||||||
|
"+...++.......++.++.......++......+++.......++....++...+",
|
||||||
|
"+...++.......++.++.......++.....+++........++....++...+",
|
||||||
|
"+...++......+++.+++......++....+++.........++....++...+",
|
||||||
|
"+...++.....++++.++++.....++...+++..........++....++...+",
|
||||||
|
"+...++...++++++.++++++...++...++............++..++....+",
|
||||||
|
"+...++.++++++++.++++++++.++...++++++++..++..++++++....+",
|
||||||
|
"+...+++++++++++.+++++++++++...++++++++..++...++++.....+",
|
||||||
|
"+.....................................................+",
|
||||||
|
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/dolbydigital51.xpm
Normal file
23
symbols/dolbydigital51.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * dolbydigital51_xpm[] = {
|
||||||
|
"51 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"+.................................................+",
|
||||||
|
"+...+++++++++++.+++++++++++...+++++++........++...+",
|
||||||
|
"+...++.++++++++.++++++++.++...+++++++.....+++++...+",
|
||||||
|
"+...++...++++++.++++++...++...++..........+++++...+",
|
||||||
|
"+...++.....++++.++++.....++...++.............++...+",
|
||||||
|
"+...++......+++.+++......++...++++++.........++...+",
|
||||||
|
"+...++.......++.++.......++...+++++++........++...+",
|
||||||
|
"+...++.......++.++.......++...++...+++.......++...+",
|
||||||
|
"+...++.......++.++.......++.........++.......++...+",
|
||||||
|
"+...++.......++.++.......++.........++.......++...+",
|
||||||
|
"+...++......+++.+++......++.........++.......++...+",
|
||||||
|
"+...++.....++++.++++.....++...++....++.......++...+",
|
||||||
|
"+...++...++++++.++++++...++...++...+++.......++...+",
|
||||||
|
"+...++.++++++++.++++++++.++...+++++++...++...++...+",
|
||||||
|
"+...+++++++++++.+++++++++++....+++++....++...++...+",
|
||||||
|
"+.................................................+",
|
||||||
|
"+++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||||
23
symbols/five.xpm
Normal file
23
symbols/five.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * five_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
"...+++++++....+",
|
||||||
|
"...+++++++....+",
|
||||||
|
"...++.........+",
|
||||||
|
"...++.........+",
|
||||||
|
"...++.........+",
|
||||||
|
"...++++++.....+",
|
||||||
|
"...+++++++....+",
|
||||||
|
"...++...+++...+",
|
||||||
|
".........++...+",
|
||||||
|
".........++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++...+++...+",
|
||||||
|
"...+++++++....+",
|
||||||
|
"....+++++.....+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
23
symbols/four.xpm
Normal file
23
symbols/four.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * four_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
".........++...+",
|
||||||
|
"........+++...+",
|
||||||
|
".......++++...+",
|
||||||
|
"......++.++...+",
|
||||||
|
".....++..++...+",
|
||||||
|
".....++..++...+",
|
||||||
|
"....++...++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...+++++++++..+",
|
||||||
|
"...+++++++++..+",
|
||||||
|
".........++...+",
|
||||||
|
".........++...+",
|
||||||
|
".........++...+",
|
||||||
|
".........++...+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
23
symbols/monoleft.xpm
Normal file
23
symbols/monoleft.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * monoleft_xpm[] = {
|
||||||
|
"17 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++",
|
||||||
|
"+................",
|
||||||
|
"+...++...........",
|
||||||
|
"+...++++.........",
|
||||||
|
"+...++++++.......",
|
||||||
|
"+...++++++++.....",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...+++++++++..++",
|
||||||
|
"+...+++++++++..++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...++++++++.....",
|
||||||
|
"+...++++++.......",
|
||||||
|
"+...++++.........",
|
||||||
|
"+...+++..........",
|
||||||
|
"+................",
|
||||||
|
"+++++++++++++++++"};
|
||||||
23
symbols/monoright.xpm
Normal file
23
symbols/monoright.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * monoright_xpm[] = {
|
||||||
|
"17 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++",
|
||||||
|
"+................",
|
||||||
|
"+..............++",
|
||||||
|
"+............++++",
|
||||||
|
"+..........++++++",
|
||||||
|
"+........++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...++..+++++++++",
|
||||||
|
"+...++..+++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+...+++++++++++++",
|
||||||
|
"+........++++++++",
|
||||||
|
"+..........++++++",
|
||||||
|
"+............++++",
|
||||||
|
"+.............+++",
|
||||||
|
"+................",
|
||||||
|
"+++++++++++++++++"};
|
||||||
23
symbols/ntsc.xpm
Normal file
23
symbols/ntsc.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * ntsc_xpm[] = {
|
||||||
|
"19 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++++",
|
||||||
|
"+.................+",
|
||||||
|
"+...++.......++...+",
|
||||||
|
"+...+++......++...+",
|
||||||
|
"+...++++.....++...+",
|
||||||
|
"+...++++.....++...+",
|
||||||
|
"+...++.++....++...+",
|
||||||
|
"+...++..++...++...+",
|
||||||
|
"+...++..++...++...+",
|
||||||
|
"+...++...++..++...+",
|
||||||
|
"+...++...++..++...+",
|
||||||
|
"+...++....++.++...+",
|
||||||
|
"+...++.....++++...+",
|
||||||
|
"+...++.....++++...+",
|
||||||
|
"+...++......+++...+",
|
||||||
|
"+...++.......++...+",
|
||||||
|
"+.................+",
|
||||||
|
"+++++++++++++++++++"};
|
||||||
23
symbols/one.xpm
Normal file
23
symbols/one.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * one_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
".......++.....+",
|
||||||
|
"....+++++.....+",
|
||||||
|
"....+++++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
".......++.....+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
23
symbols/pal.xpm
Normal file
23
symbols/pal.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * pal_xpm[] = {
|
||||||
|
"18 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"++++++++++++++++++",
|
||||||
|
"+................+",
|
||||||
|
"+...++++++++.....+",
|
||||||
|
"+...+++++++++....+",
|
||||||
|
"+...++.....+++...+",
|
||||||
|
"+...++......++...+",
|
||||||
|
"+...++......++...+",
|
||||||
|
"+...++.....+++...+",
|
||||||
|
"+...+++++++++....+",
|
||||||
|
"+...++++++++.....+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+...++...........+",
|
||||||
|
"+................+",
|
||||||
|
"++++++++++++++++++"};
|
||||||
23
symbols/stereo.xpm
Normal file
23
symbols/stereo.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * stereo_xpm[] = {
|
||||||
|
"17 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++++",
|
||||||
|
"+................",
|
||||||
|
"+..............++",
|
||||||
|
"+............++++",
|
||||||
|
"+..........+++.++",
|
||||||
|
"+........+++...++",
|
||||||
|
"+...+++++++....++",
|
||||||
|
"+...++++++.....++",
|
||||||
|
"+...++..++.....++",
|
||||||
|
"+...++..++.....++",
|
||||||
|
"+...++++++.....++",
|
||||||
|
"+...+++++++....++",
|
||||||
|
"+........+++...++",
|
||||||
|
"+..........+++.++",
|
||||||
|
"+............++++",
|
||||||
|
"+.............+++",
|
||||||
|
"+................",
|
||||||
|
"+++++++++++++++++"};
|
||||||
23
symbols/three.xpm
Normal file
23
symbols/three.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * three_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
".....+++++....+",
|
||||||
|
"....+++++++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
".........++...+",
|
||||||
|
"........++....+",
|
||||||
|
"......+++.....+",
|
||||||
|
"......++++....+",
|
||||||
|
"........+++...+",
|
||||||
|
".........++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++...+++...+",
|
||||||
|
"....++++++....+",
|
||||||
|
".....++++.....+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
23
symbols/two.xpm
Normal file
23
symbols/two.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * two_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
".....++++.....+",
|
||||||
|
"...+++++++....+",
|
||||||
|
"...++....++...+",
|
||||||
|
".........++...+",
|
||||||
|
".........++...+",
|
||||||
|
"........+++...+",
|
||||||
|
".......+++....+",
|
||||||
|
"......+++.....+",
|
||||||
|
".....+++......+",
|
||||||
|
"....+++.......+",
|
||||||
|
"...+++........+",
|
||||||
|
"...++.........+",
|
||||||
|
"...++++++++...+",
|
||||||
|
"...++++++++...+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
23
symbols/zero.xpm
Normal file
23
symbols/zero.xpm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* XPM */
|
||||||
|
static char * zero_xpm[] = {
|
||||||
|
"15 18 2 1",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #000000",
|
||||||
|
"+++++++++++++++",
|
||||||
|
"..............+",
|
||||||
|
".....++++.....+",
|
||||||
|
"....++++++....+",
|
||||||
|
"....++..++....+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"...++....++...+",
|
||||||
|
"....++..++....+",
|
||||||
|
"....++++++....+",
|
||||||
|
".....++++.....+",
|
||||||
|
"..............+",
|
||||||
|
"+++++++++++++++"};
|
||||||
Reference in New Issue
Block a user