mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 11:36:53 +00:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55b5e0c293 | ||
|
|
cbc39db870 | ||
|
|
ecb79fe6db | ||
|
|
4a5318371d | ||
|
|
c69a018337 | ||
|
|
88b263aa02 | ||
|
|
2340ade6c8 | ||
|
|
7db77978b5 | ||
|
|
ab8f5f3de8 | ||
|
|
427b3023ba | ||
|
|
8f283f27f5 | ||
|
|
c4fda38364 | ||
|
|
219fc78226 | ||
|
|
5333a9274d | ||
|
|
a8c065639a | ||
|
|
fa41c95b1c | ||
|
|
6eb4329fff |
72
HISTORY
72
HISTORY
@@ -29,7 +29,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Redesigned the user interface.
|
||||
- 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.
|
||||
|
||||
2004-03-07: Version 0.0.3a
|
||||
@@ -41,7 +42,8 @@ VDR Plugin 'femon' Revision History
|
||||
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.
|
||||
- Bitrate calculation thread is now canceled immediately to speed up
|
||||
channel switching.
|
||||
|
||||
2004-04-04: Version 0.0.3c
|
||||
|
||||
@@ -88,7 +90,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2004-06-11: Version 0.1.3
|
||||
|
||||
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).
|
||||
- Added "AC-3 Stream Information" display mode (Thanks to Lothar
|
||||
Englisch).
|
||||
|
||||
2004-06-24: Version 0.1.4
|
||||
|
||||
@@ -100,7 +103,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- 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).
|
||||
- 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
|
||||
@@ -146,7 +150,8 @@ VDR Plugin 'femon' Revision History
|
||||
2005-04-01: Version 0.8.7
|
||||
|
||||
- Default make target is now all.
|
||||
- Fixed the access rights of symbols subdirectory (Thanks to Harri Kukkonen).
|
||||
- Fixed the access rights of symbols subdirectory (Thanks to Harri
|
||||
Kukkonen).
|
||||
- Added a new theme: Moronimo (Thanks to Morone).
|
||||
|
||||
2005-04-02: Version 0.8.8
|
||||
@@ -160,7 +165,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2005-05-20: Version 0.9.0
|
||||
|
||||
- Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC').
|
||||
- Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM'
|
||||
to 'FEMON_NTSC').
|
||||
- Enabled preliminary support for the device switching.
|
||||
|
||||
2005-07-23: Version 0.9.1
|
||||
@@ -200,7 +206,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Updated for vdr-1.3.40.
|
||||
- Fixed a translation bug (Thanks to Antti Hartikainen).
|
||||
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one).
|
||||
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this
|
||||
one).
|
||||
- Fixed EgalsTry theme (Thanks to Uwe Hanke).
|
||||
|
||||
2006-02-06: Version 0.9.7
|
||||
@@ -248,7 +255,8 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2007-05-01: Version 1.1.2
|
||||
|
||||
- Fixed opening while replaying (Thanks to Antti Seppälä for reporting this one).
|
||||
- Fixed opening while replaying (Thanks to Antti Seppälä for reporting
|
||||
this one).
|
||||
|
||||
2007-05-15: Version 1.1.3
|
||||
|
||||
@@ -298,7 +306,7 @@ VDR Plugin 'femon' Revision History
|
||||
2008-06-20: Version 1.6.1
|
||||
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Fixed a crash if no channel available (Thanks to Winfried Köhler)
|
||||
- Fixed a crash if no channel available (Thanks to Winfried Köhler).
|
||||
|
||||
2008-10-12: Version 1.6.2
|
||||
|
||||
@@ -310,3 +318,49 @@ VDR Plugin 'femon' Revision History
|
||||
- Added initial support for H.264 and HE-AAC.
|
||||
- Fixed detection of false positives in audio/video streams.
|
||||
- Refactored source code.
|
||||
|
||||
2008-11-30: Version 1.6.4
|
||||
|
||||
- Added new helper functions.
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Fixed a memory leak.
|
||||
- Added a check for the minimum OSD height.
|
||||
- Replaced "Use single area (8bpp)" option with VDR's
|
||||
"Setup/OSD/Anti-alias".
|
||||
- Removed the FEMON_NTSC option.
|
||||
- Fixed a deadlock in cFemonReceiver (Thanks to Antti Seppälä for
|
||||
reporting this one).
|
||||
|
||||
2008-12-16: Version 1.6.5
|
||||
|
||||
- Backported from 1.7.0.
|
||||
|
||||
2009-01-06: Version 1.6.6
|
||||
|
||||
- Backported from 1.7.1.
|
||||
|
||||
2009-06-18: Version 1.6.7
|
||||
|
||||
- Backported from 1.7.2.
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2008-12-16: Version 1.7.0
|
||||
|
||||
- Updated for vdr-1.7.2.
|
||||
- Added whitespace cleanups.
|
||||
- Changed info window to use the channel source instead of the frontend
|
||||
type.
|
||||
- Removed the "Show CA system" setup option.
|
||||
|
||||
2009-01-06: Version 1.7.1
|
||||
|
||||
- Fixed closing of frontend file handles (Thanks to Brendon Higgins for
|
||||
reporting this one).
|
||||
|
||||
2009-06-18: Version 1.7.2
|
||||
|
||||
- Cleaned up compilation warnings.
|
||||
- Fixed font handling to be thread-safe.
|
||||
|
||||
9
Makefile
9
Makefile
@@ -5,9 +5,6 @@
|
||||
# Debugging on/off
|
||||
#FEMON_DEBUG = 1
|
||||
|
||||
# NTSC on/off
|
||||
#FEMON_NTSC = 1
|
||||
|
||||
# Strip debug symbols? Set eg. to /bin/true if not
|
||||
STRIP = strip
|
||||
|
||||
@@ -26,7 +23,7 @@ VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ p
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
@@ -53,10 +50,6 @@ INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
ifdef FEMON_NTSC
|
||||
DEFINES += -DNTSC
|
||||
endif
|
||||
|
||||
ifdef FEMON_DEBUG
|
||||
DEFINES += -DDEBUG
|
||||
endif
|
||||
|
||||
4
README
4
README
@@ -15,7 +15,7 @@ See the file COPYING for license information.
|
||||
|
||||
Requirements:
|
||||
|
||||
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
|
||||
VDR and a DVB card.
|
||||
|
||||
Description:
|
||||
|
||||
@@ -112,7 +112,7 @@ Notes:
|
||||
- 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. NTSC users should use a shrinked default OSD height by
|
||||
compiling the plugin with: make FEMON_NTSC=1
|
||||
modifying VDR's setup.conf: femon.OSDHeight = 420
|
||||
|
||||
- If the SVDRP service is used: femon won't notice if the server is tuned
|
||||
to a different channel and tuning the channel on the server might annoy
|
||||
|
||||
12
femon.c
12
femon.c
@@ -18,7 +18,7 @@
|
||||
#error "VDR-1.6.0 API version or greater is required!"
|
||||
#endif
|
||||
|
||||
static const char VERSION[] = "1.6.3";
|
||||
static const char VERSION[] = "1.6.7";
|
||||
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
||||
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
||||
|
||||
@@ -108,14 +108,12 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UseSingleArea")) femonConfig.usesinglearea = atoi(Value);
|
||||
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDOffset")) femonConfig.osdoffset = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = 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);
|
||||
@@ -311,9 +309,6 @@ void cMenuFemonSetup::Setup(void)
|
||||
Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &data.hidemenu));
|
||||
help.Append(tr("Define whether the main menu entry is hidden."));
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Use single area (8bpp)"), &data.usesinglearea));
|
||||
help.Append(tr("Define whether a single 8bpp OSD area is preferred.\n\nRequired by Truetype fonts and anti-aliasing."));
|
||||
|
||||
Add(new cMenuEditStraItem(tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
|
||||
help.Append(tr("Define the default display mode at startup."));
|
||||
|
||||
@@ -332,9 +327,6 @@ void cMenuFemonSetup::Setup(void)
|
||||
Add(new cMenuEditIntItem(tr("Horizontal offset"), &data.osdoffset, -50, 50));
|
||||
help.Append(tr("Define the horizontal offset of OSD."));
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Show CA system"), &data.showcasystem));
|
||||
help.Append(tr("Define whether the CA system is shown as text."));
|
||||
|
||||
Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50));
|
||||
help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
|
||||
|
||||
@@ -372,14 +364,12 @@ void cMenuFemonSetup::Store(void)
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
femonConfig = data;
|
||||
SetupStore("HideMenu", femonConfig.hidemenu);
|
||||
SetupStore("UseSingleArea", femonConfig.usesinglearea);
|
||||
SetupStore("DisplayMode", femonConfig.displaymode);
|
||||
SetupStore("Skin", femonConfig.skin);
|
||||
SetupStore("Theme", femonConfig.theme);
|
||||
SetupStore("Position", femonConfig.position);
|
||||
SetupStore("OSDHeight", femonConfig.osdheight);
|
||||
SetupStore("OSDOffset", femonConfig.osdoffset);
|
||||
SetupStore("ShowCASystem", femonConfig.showcasystem);
|
||||
SetupStore("RedLimit", femonConfig.redlimit);
|
||||
SetupStore("GreenLimit", femonConfig.greenlimit);
|
||||
SetupStore("UpdateInterval", femonConfig.updateinterval);
|
||||
|
||||
@@ -34,7 +34,7 @@ bool getAC3AudioInfo(uint8_t *buf, int len, ac3_info_t *info)
|
||||
return false;
|
||||
|
||||
uint8_t *data = buf + 2;
|
||||
uint8_t frame = (data[2] & 0x3f);
|
||||
uint8_t frame = (uint8_t)(data[2] & 0x3f);
|
||||
info->bitrate = 1000 * ac3_bitrates[frame >> 1];
|
||||
uint8_t fr = (data[2] & 0xc0 ) >> 6;
|
||||
//uint8_t sz = ac3_frames[fr][frame >> 1];
|
||||
|
||||
@@ -13,7 +13,6 @@ cFemonConfig femonConfig;
|
||||
cFemonConfig::cFemonConfig(void)
|
||||
{
|
||||
hidemenu = 0;
|
||||
usesinglearea = 0;
|
||||
displaymode = 0;
|
||||
skin = 0;
|
||||
theme = 0;
|
||||
@@ -23,12 +22,7 @@ cFemonConfig::cFemonConfig(void)
|
||||
updateinterval = 5;
|
||||
analyzestream = 1;
|
||||
calcinterval = 20;
|
||||
showcasystem = 0;
|
||||
#ifdef NTSC
|
||||
osdheight = 420;
|
||||
#else
|
||||
osdheight = 480;
|
||||
#endif
|
||||
osdoffset = 0;
|
||||
usesvdrp = 0;
|
||||
svdrpport = 2001;
|
||||
|
||||
@@ -24,7 +24,6 @@ struct cFemonConfig
|
||||
public:
|
||||
cFemonConfig(void);
|
||||
int hidemenu;
|
||||
int usesinglearea;
|
||||
int displaymode;
|
||||
int skin;
|
||||
int theme;
|
||||
@@ -34,7 +33,6 @@ public:
|
||||
int updateinterval;
|
||||
int analyzestream;
|
||||
int calcinterval;
|
||||
int showcasystem;
|
||||
int osdheight;
|
||||
int osdoffset;
|
||||
int usesvdrp;
|
||||
|
||||
142
femonh264.c
142
femonh264.c
@@ -13,7 +13,7 @@
|
||||
#define NAL_SEI 0x06 // Supplemental Enhancement Information
|
||||
#define NAL_SPS 0x07 // Sequence Parameter Set
|
||||
#define NAL_AUD 0x09 // Access Unit Delimiter
|
||||
#define NAL_END_SEQ 0x10 // End of Sequence
|
||||
#define NAL_END_SEQ 0x0A // End of Sequence
|
||||
|
||||
#define IS_NAL_SEI(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == NAL_SEI))
|
||||
#define IS_NAL_SPS(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == NAL_SPS))
|
||||
@@ -85,7 +85,6 @@ typedef struct {
|
||||
#define br_skip_ue_golomb(br) br_skip_golomb(br)
|
||||
#define br_skip_se_golomb(br) br_skip_golomb(br)
|
||||
|
||||
|
||||
static inline void br_init(br_state *br, const uint8_t *data, int bytes)
|
||||
{
|
||||
br->data = data;
|
||||
@@ -235,11 +234,11 @@ static bool h264_parse_sps(const uint8_t *buf, int len, h264_sps_data_t *sps)
|
||||
br_skip_bit(&br); // sar_width
|
||||
br_skip_bit(&br); // sar_height
|
||||
sps->aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
||||
//Dprintf("H.264 SPS: -> sar %dx%d", sar_width, sar_height);
|
||||
//Dprintf("H.264 SPS: aspect ratio extended");
|
||||
}
|
||||
else if (aspect_ratio_idc < sizeof(aspect_ratios) / sizeof(aspect_ratios[0])) {
|
||||
sps->aspect_ratio = aspect_ratios[aspect_ratio_idc];
|
||||
//Dprintf("H.264 SPS: -> aspect ratio %d", sps->aspect);
|
||||
//Dprintf("H.264 SPS: -> aspect ratio %d", sps->aspect_ratio);
|
||||
}
|
||||
}
|
||||
if (br_get_bit(&br)) // overscan_info_present_flag
|
||||
@@ -253,7 +252,7 @@ static bool h264_parse_sps(const uint8_t *buf, int len, h264_sps_data_t *sps)
|
||||
}
|
||||
}
|
||||
|
||||
//Dprintf("H.264 SPS: -> video size %dx%d, aspect %d", sps->width, sps->height, sps->aspect);
|
||||
//Dprintf("H.264 SPS: -> video size %dx%d, aspect %d", sps->width, sps->height, sps->aspect_ratio);
|
||||
|
||||
if (BR_EOF(&br)) {
|
||||
//Dprintf("H.264 SPS: not enough data ?");
|
||||
@@ -263,76 +262,75 @@ static bool h264_parse_sps(const uint8_t *buf, int len, h264_sps_data_t *sps)
|
||||
return true;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static bool h264_parse_sei(const uint8_t *buf, int len, h264_sei_data_t *sei)
|
||||
{
|
||||
int num_referenced_subseqs, i;
|
||||
br_state br = BR_INIT(buf, len);
|
||||
|
||||
while (!BR_EOF(&br)) {
|
||||
{ // sei_message
|
||||
int lastByte, payloadSize = 0, payloadType = 0;
|
||||
// last_payload_type_byte
|
||||
do {
|
||||
lastByte = br_get_u8(&br);
|
||||
payloadType += lastByte;
|
||||
} while (lastByte != 0xFF);
|
||||
while (!BR_EOF(&br)) { // sei_message
|
||||
int lastByte, payloadSize = 0, payloadType = 0;
|
||||
|
||||
// last_payload_size_byte
|
||||
do {
|
||||
lastByte = br_get_u8(&br);
|
||||
payloadSize += lastByte;
|
||||
} while (lastByte != 0xFF);
|
||||
// last_payload_type_byte
|
||||
do {
|
||||
lastByte = br_get_u8(&br) & 0xFF;
|
||||
payloadType += lastByte;
|
||||
} while (lastByte == 0xFF);
|
||||
|
||||
{ // sei_payload
|
||||
switch (payloadType) {
|
||||
//case 1: // pic_timing
|
||||
// ...
|
||||
// switch (br_get_bits(&br, 2)) { // ct_type
|
||||
// case 0:
|
||||
// sei->scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
// break;
|
||||
// last_payload_size_byte
|
||||
do {
|
||||
lastByte = br_get_u8(&br) & 0xFF;
|
||||
payloadSize += lastByte;
|
||||
} while (lastByte == 0xFF);
|
||||
|
||||
// case 1:
|
||||
// sei->scan = VIDEO_SCAN_INTERLACED;
|
||||
// break;
|
||||
switch (payloadType) { // sei_payload
|
||||
//case 1: // pic_timing
|
||||
// ...
|
||||
// switch (br_get_bits(&br, 2)) { // ct_type
|
||||
// case 0:
|
||||
// sei->scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
// break;
|
||||
// case 1:
|
||||
// sei->scan = VIDEO_SCAN_INTERLACED;
|
||||
// break;
|
||||
// case 2:
|
||||
// sei->scan = VIDEO_SCAN_UNKNOWN;
|
||||
// break;
|
||||
// default:
|
||||
// sei->scan = VIDEO_SCAN_RESERVED;
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
|
||||
// case 2:
|
||||
// sei->scan = VIDEO_SCAN_UNKNOWN;
|
||||
// break;
|
||||
case 12: // sub_seq_characteristics
|
||||
br_skip_ue_golomb(&br); // sub_seq_layer_num
|
||||
br_skip_ue_golomb(&br); // sub_seq_id
|
||||
if (br_get_bit(&br)) // duration_flag
|
||||
br_skip_bits(&br, 32); // sub_seq_duration
|
||||
if (br_get_bit(&br)) { // average_rate_flag
|
||||
br_skip_bit(&br); // accurate_statistics_flag
|
||||
sei->bitrate = br_get_u16(&br); // average_bit_rate
|
||||
sei->frame_rate = br_get_u16(&br); // average_frame_rate
|
||||
//Dprintf("H.264 SEI: -> stream bitrate %.1f, frame rate %.1f", sei->bitrate, sei->frame_rate);
|
||||
}
|
||||
num_referenced_subseqs = br_get_ue_golomb(&br); // num_referenced_subseqs
|
||||
for (i = 0; i < num_referenced_subseqs; ++i) {
|
||||
br_skip_ue_golomb(&br); // ref_sub_seq_layer_num
|
||||
br_skip_ue_golomb(&br); // ref_sub_seq_id
|
||||
br_get_bit(&br); // ref_sub_seq_direction
|
||||
}
|
||||
break;
|
||||
|
||||
// default:
|
||||
// sei->scan = VIDEO_SCAN_RESERVED;
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
default:
|
||||
br_skip_bits(&br, payloadSize);
|
||||
break;
|
||||
}
|
||||
|
||||
case 12: // sub_seq_characteristics
|
||||
br_skip_ue_golomb(&br); // sub_seq_layer_num
|
||||
br_skip_ue_golomb(&br); // sub_seq_id
|
||||
if (br_get_bit(&br)) { // duration_flag
|
||||
br_skip_bits(&br, 32); // sub_seq_duration
|
||||
if (br_get_bit(&br)) { // average_rate_flag
|
||||
br_skip_bit(&br); // accurate_statistics_flag
|
||||
sei->bitrate = br_get_u16(&br); // average_bit_rate
|
||||
sei->frame_rate = br_get_u16(&br); // average_frame_rate
|
||||
//Dprintf("H.264 SEI: -> stream bitrate %d, frame rate %d", sei->bitrate, sei->frame_rate);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
br_skip_bits(&br, payloadSize);
|
||||
break;
|
||||
}
|
||||
// force byte align
|
||||
br_byte_align(&br);
|
||||
} // sei_payload
|
||||
} // sei_message
|
||||
};
|
||||
// force byte align
|
||||
br_byte_align(&br);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int h264_nal_unescape(uint8_t *dst, const uint8_t *src, int len)
|
||||
{
|
||||
@@ -360,7 +358,7 @@ static int h264_get_picture_type(const uint8_t *buf, int len)
|
||||
{
|
||||
for (int i = 0; i < (len - 5); ++i) {
|
||||
if (buf[i] == 0 && buf[i + 1] == 0 && buf[i + 2] == 1 && buf[i + 3] == NAL_AUD) {
|
||||
uint8_t type = (buf[i + 4] >> 5);
|
||||
uint8_t type = (uint8_t)(buf[i + 4] >> 5);
|
||||
switch (type) {
|
||||
case 0: case 3: case 5: return I_FRAME;
|
||||
case 1: case 4: case 6: return P_FRAME;
|
||||
@@ -374,6 +372,8 @@ static int h264_get_picture_type(const uint8_t *buf, int len)
|
||||
|
||||
bool getH264VideoInfo(uint8_t *buf, int len, video_info_t *info)
|
||||
{
|
||||
bool sps_found = false, sei_found = true; // sei currently disabled
|
||||
|
||||
// H.264 detection, search for NAL AUD
|
||||
if (!IS_NAL_AUD(buf))
|
||||
return false;
|
||||
@@ -387,38 +387,38 @@ bool getH264VideoInfo(uint8_t *buf, int len, video_info_t *info)
|
||||
// Scan video packet ...
|
||||
for (int i = 5; i < len - 4; i++) {
|
||||
// ... for sequence parameter set
|
||||
if ((buf[i] == 0x00) && (buf[i + 1] == 0x00) && (buf[i + 2] == 0x01) && (buf[i + 3] & 0x1f) == NAL_SPS) {
|
||||
if (!sps_found && (buf[i] == 0x00) && (buf[i + 1] == 0x00) && (buf[i + 2] == 0x01) && (buf[i + 3] & 0x1f) == NAL_SPS) {
|
||||
uint8_t nal_data[len];
|
||||
int nal_len;
|
||||
//Dprintf("H.264: Found NAL SPS at offset %d/%d", i, len);
|
||||
if (0 < (nal_len = h264_nal_unescape(nal_data, buf + i + 4, len - i - 4))) {
|
||||
h264_sps_data_t sps = { 0 };
|
||||
h264_sps_data_t sps = { 0, 0, VIDEO_ASPECT_RATIO_INVALID, VIDEO_FORMAT_INVALID };
|
||||
if (h264_parse_sps(nal_data, nal_len, &sps)) {
|
||||
info->format = sps.format;
|
||||
info->width = sps.width;
|
||||
info->height = sps.height;
|
||||
info->aspectRatio = sps.aspect_ratio;
|
||||
return true;
|
||||
sps_found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
// ... for supplemental enhancement information
|
||||
else if ((buf[i] == 0x00) && (buf[i + 1] == 0x00) && (buf[i + 2] == 0x01) && (buf[i + 3] & 0x1f) == NAL_SEI) {
|
||||
if (!sei_found && (buf[i] == 0x00) && (buf[i + 1] == 0x00) && (buf[i + 2] == 0x01) && (buf[i + 3] & 0x1f) == NAL_SEI) {
|
||||
uint8_t nal_data[len];
|
||||
int nal_len;
|
||||
//Dprintf("H.264: Found NAL SEI at offset %d/%d", i, len);
|
||||
if (0 < (nal_len = h264_nal_unescape(nal_data, buf + i + 4, len - i - 4))) {
|
||||
h264_sei_data_t sei = { 0 };
|
||||
h264_sei_data_t sei = { 0, 0, VIDEO_SCAN_INVALID };
|
||||
if (h264_parse_sei(nal_data, nal_len, &sei)) {
|
||||
info->frameRate = sei.frame_rate;
|
||||
info->bitrate = sei.bitrate;
|
||||
info->scan = sei.scan;
|
||||
return true;
|
||||
sei_found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (sps_found && sei_found)
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -178,7 +178,7 @@ bool getMPEGVideoInfo(uint8_t *buf, int len, video_info_t *info)
|
||||
info->format = VIDEO_FORMAT_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
info->bitrate = 400.0 * (((data[4] << 10) & 0x0003FC00UL) | ((data[5] << 2) & 0x000003FCUL) | (((data[6] & 0xC0) >> 6) & 0x00000003UL));
|
||||
info->bitrate = 400.0 * (double)(((data[4] << 10) & 0x0003FC00UL) | ((data[5] << 2) & 0x000003FCUL) | (((data[6] & 0xC0) >> 6) & 0x00000003UL));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
251
femonosd.c
251
femonosd.c
@@ -21,8 +21,8 @@
|
||||
#define OSDINFOHEIGHT (OSDROWHEIGHT * 13) // in pixels (13 rows)
|
||||
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
|
||||
#define OSDSPACING 5
|
||||
#define OSDCORNERING 10
|
||||
#define IS_OSDCORNERING (femonConfig.skin == eFemonSkinElchi)
|
||||
#define OSDROUNDING 10
|
||||
#define IS_OSDROUNDING (femonConfig.skin == eFemonSkinElchi)
|
||||
|
||||
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
|
||||
#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15)
|
||||
@@ -36,11 +36,11 @@
|
||||
x -= bm->Width() + spacing; \
|
||||
y = (OSDROWHEIGHT - bm->Height()) / 2; \
|
||||
if (y < 0) y = 0; \
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset + y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset) + y, *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
}
|
||||
|
||||
#define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset + y), bitmap, (m_FrontendStatus & status) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground)
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset) + y, bitmap, (m_FrontendStatus & status) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground)
|
||||
|
||||
#define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6, label7) \
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); \
|
||||
@@ -54,28 +54,31 @@
|
||||
#define OSDDRAWSTATUSBAR(value) \
|
||||
if (value > 0) { \
|
||||
value = OSDBARWIDTH(value); \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset + 3), min(OSDBARWIDTH(femonConfig.redlimit), value), OSDSTATUSWIN_Y(offset + OSDROWHEIGHT - 3), femonTheme[femonConfig.theme].clrRed); \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + 3, min(OSDBARWIDTH(femonConfig.redlimit), value), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrRed); \
|
||||
if (value > OSDBARWIDTH(femonConfig.redlimit)) \
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset + 3), min((OSDWIDTH * femonConfig.greenlimit / 100), value), OSDSTATUSWIN_Y(offset + OSDROWHEIGHT - 3), femonTheme[femonConfig.theme].clrYellow); \
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset) + 3, min((OSDWIDTH * femonConfig.greenlimit / 100), value), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrYellow); \
|
||||
if (value > OSDBARWIDTH(femonConfig.greenlimit)) \
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset + 3), value, OSDSTATUSWIN_Y(offset + OSDROWHEIGHT - 3), femonTheme[femonConfig.theme].clrGreen); \
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset) + 3, value, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrGreen); \
|
||||
}
|
||||
|
||||
#define OSDDRAWSTATUSTITLEBAR(title) \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), femonTheme[femonConfig.theme].clrBackground); \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 1, femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), title, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); \
|
||||
if (IS_OSDCORNERING) { \
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDCORNERING, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -2); \
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -1); \
|
||||
}
|
||||
if (IS_OSDROUNDING) { \
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDROUNDING, OSDSTATUSWIN_Y(OSDROUNDING), clrTransparent, -2); \
|
||||
m_Osd->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDROUNDING), clrTransparent, -1); \
|
||||
} \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT, OSDWIDTH, OSDSTATUSWIN_Y(offset) + OSDSTATUSHEIGHT - 1, femonTheme[femonConfig.theme].clrBackground)
|
||||
|
||||
#define OSDDRAWSTATUSBOTTOMBAR() \
|
||||
if (IS_OSDCORNERING) { \
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDCORNERING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3); \
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4); \
|
||||
if (IS_OSDROUNDING) { \
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - OSDROUNDING, OSDROUNDING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3); \
|
||||
m_Osd->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - OSDROUNDING, OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4); \
|
||||
}
|
||||
|
||||
#define OSDCLEARSTATUS() \
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT) - 1, clrTransparent)
|
||||
|
||||
#define OSDDRAWINFOLEFT(label, value) \
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); \
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), value, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font)
|
||||
@@ -96,29 +99,45 @@
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), label, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font)
|
||||
|
||||
#define OSDDRAWINFOTITLEBAR(title) \
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground); \
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset + OSDROWHEIGHT - 1), femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset) + OSDROWHEIGHT - 1, femonTheme[femonConfig.theme].clrTitleBackground); \
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), title, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); \
|
||||
if (IS_OSDCORNERING) { \
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); \
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); \
|
||||
}
|
||||
if (IS_OSDROUNDING) { \
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDROUNDING, OSDINFOWIN_Y(OSDROUNDING), clrTransparent, -2); \
|
||||
m_Osd->DrawEllipse(OSDWIDTH - OSDROUNDING, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDROUNDING), clrTransparent, -1); \
|
||||
} \
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset) + OSDROWHEIGHT, OSDWIDTH, OSDINFOWIN_Y(offset) + OSDINFOHEIGHT - 1, femonTheme[femonConfig.theme].clrBackground)
|
||||
|
||||
#define OSDDRAWINFOBOTTOMBAR() \
|
||||
if (IS_OSDCORNERING) { \
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); \
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); \
|
||||
if (IS_OSDROUNDING) { \
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT) - OSDROUNDING, OSDROUNDING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); \
|
||||
m_Osd->DrawEllipse((OSDWIDTH - OSDROUNDING), OSDINFOWIN_Y(OSDINFOHEIGHT) - OSDROUNDING, OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); \
|
||||
}
|
||||
|
||||
#define OSDCLEARINFO() \
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent)
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT) - 1, clrTransparent)
|
||||
|
||||
#ifndef MINFONTSIZE
|
||||
#define MINFONTSIZE 10
|
||||
#endif
|
||||
|
||||
#ifndef MAXFONTSIZE
|
||||
#define MAXFONTSIZE 64
|
||||
#endif
|
||||
|
||||
class cFemonDummyFont : public cFont {
|
||||
public:
|
||||
virtual int Width(uint c) const { return 10; }
|
||||
virtual int Width(const char *s) const { return 50; }
|
||||
virtual int Height(void) const { return 20; }
|
||||
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
|
||||
};
|
||||
|
||||
cFemonOsd *cFemonOsd::pInstance = NULL;
|
||||
|
||||
cFemonOsd *cFemonOsd::Instance(bool create)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (pInstance == NULL && create)
|
||||
if ((pInstance == NULL) && create)
|
||||
{
|
||||
pInstance = new cFemonOsd();
|
||||
}
|
||||
@@ -126,34 +145,34 @@ cFemonOsd *cFemonOsd::Instance(bool create)
|
||||
}
|
||||
|
||||
cFemonOsd::cFemonOsd()
|
||||
:cOsdObject(true), cThread("femon osd")
|
||||
: cOsdObject(true), cThread("femon osd"),
|
||||
m_Osd(NULL),
|
||||
m_Receiver(NULL),
|
||||
m_Frontend(-1),
|
||||
m_SvdrpFrontend(-1),
|
||||
m_SvdrpVideoBitrate(-1),
|
||||
m_SvdrpAudioBitrate(-1),
|
||||
m_SvdrpPlugin(NULL),
|
||||
m_Number(0),
|
||||
m_OldNumber(0),
|
||||
m_SNR(0),
|
||||
m_Signal(0),
|
||||
m_BER(0),
|
||||
m_UNC(0),
|
||||
m_DisplayMode(femonConfig.displaymode),
|
||||
m_InputTime(0),
|
||||
m_Sleep(),
|
||||
m_Mutex()
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
m_Osd = NULL;
|
||||
m_Receiver = NULL;
|
||||
m_Frontend = -1;
|
||||
m_SvdrpVideoBitrate = -1.0;
|
||||
m_SvdrpAudioBitrate = -1.0;
|
||||
m_SvdrpFrontend = -1;
|
||||
m_SvdrpConnection.handle = -1;
|
||||
m_SvdrpPlugin = NULL;
|
||||
m_Number = 0;
|
||||
m_OldNumber = 0;
|
||||
m_Signal = 0;
|
||||
m_SNR = 0;
|
||||
m_BER = 0;
|
||||
m_UNC = 0;
|
||||
m_DisplayMode = femonConfig.displaymode;
|
||||
m_InputTime.Set(0);
|
||||
m_Mutex = new cMutex();
|
||||
if (Setup.UseSmallFont == 0) {
|
||||
// Dirty hack to force the small fonts...
|
||||
Setup.UseSmallFont = 1;
|
||||
m_Font = cFont::GetFont(fontSml);
|
||||
Setup.UseSmallFont = 0;
|
||||
m_Font = cFont::CreateFont(Setup.FontSml, min(max(Setup.FontSmlSize, MINFONTSIZE), MAXFONTSIZE));
|
||||
if (!m_Font || !m_Font->Height()) {
|
||||
m_Font = new cFemonDummyFont;
|
||||
esyslog("ERROR: cFemonOsd::cFemonOsd() cannot create required font.");
|
||||
}
|
||||
else
|
||||
m_Font = cFont::GetFont(fontSml);
|
||||
if (OSDHEIGHT < (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT))
|
||||
OSDHEIGHT = (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT);
|
||||
}
|
||||
|
||||
cFemonOsd::~cFemonOsd(void)
|
||||
@@ -167,21 +186,29 @@ cFemonOsd::~cFemonOsd(void)
|
||||
if (m_SvdrpPlugin)
|
||||
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection);
|
||||
}
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (m_Receiver) {
|
||||
m_Receiver->Deactivate();
|
||||
DELETENULL(m_Receiver);
|
||||
}
|
||||
if (m_Osd)
|
||||
delete m_Osd;
|
||||
DELETENULL(m_Osd);
|
||||
if (m_Font)
|
||||
DELETENULL(m_Font);
|
||||
if (m_Frontend >= 0) {
|
||||
close(m_Frontend);
|
||||
m_Frontend = -1;
|
||||
}
|
||||
pInstance = NULL;
|
||||
}
|
||||
|
||||
void cFemonOsd::DrawStatusWindow(void)
|
||||
{
|
||||
cMutexLock lock(m_Mutex);
|
||||
cMutexLock lock(&m_Mutex);
|
||||
cBitmap *bm = NULL;
|
||||
int snr = m_SNR / 655;
|
||||
int signal = m_Signal / 655;
|
||||
int offset = 0;
|
||||
int x = OSDWIDTH - OSDCORNERING;
|
||||
int x = OSDWIDTH - OSDROUNDING;
|
||||
int y = 0;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
@@ -262,7 +289,7 @@ void cFemonOsd::DrawStatusWindow(void)
|
||||
OSDDRAWSTATUSBAR(snr);
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWSTATUSVALUES("STR:", *cString::sprintf("%04x", m_Signal), *cString::sprintf("(%2d%%)", m_Signal / 655), "BER:", *cString::sprintf("%08x", m_BER),
|
||||
*cString::sprintf("%s:", tr("Video")), *getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)));
|
||||
*cString::sprintf("%s:", tr("Video")), *getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWSTATUSVALUES("SNR:", *cString::sprintf("%04x", m_SNR), *cString::sprintf("(%2d%%)", m_SNR / 655), "UNC:", *cString::sprintf("%08x", m_UNC),
|
||||
*cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")),
|
||||
@@ -282,7 +309,7 @@ void cFemonOsd::DrawStatusWindow(void)
|
||||
|
||||
void cFemonOsd::DrawInfoWindow(void)
|
||||
{
|
||||
cMutexLock lock(m_Mutex);
|
||||
cMutexLock lock(&m_Mutex);
|
||||
int offset = 0;
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
@@ -307,11 +334,11 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
OSDDRAWINFOLEFT( tr("Tid"), *cString::sprintf("%d", channel->Tid()));
|
||||
OSDDRAWINFORIGHT( tr("Rid"), *cString::sprintf("%d", channel->Rid()));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel, femonConfig.showcasystem));
|
||||
OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel));
|
||||
offset += OSDROWHEIGHT;
|
||||
switch (m_FrontendInfo.type) {
|
||||
case FE_QPSK:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", tr("Satellite Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
switch (channel->Source() & cSource::st_Mask) {
|
||||
case cSource::stSat:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("DVB-S #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
|
||||
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
|
||||
@@ -321,13 +348,10 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
|
||||
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
|
||||
//offset += OSDROWHEIGHT;
|
||||
//OSDDRAWINFOLEFT( trVDR("System"), *getSystem(channel->System()));
|
||||
//OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(channel->RollOff()));
|
||||
break;
|
||||
|
||||
case FE_QAM:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", tr("Cable Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
case cSource::stCable:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
|
||||
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
|
||||
@@ -339,8 +363,8 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
|
||||
break;
|
||||
|
||||
case FE_OFDM:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", tr("Terrestrial Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
case cSource::stTerr:
|
||||
OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
|
||||
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(channel->Transmission()));
|
||||
@@ -353,9 +377,6 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(channel->Hierarchy()));
|
||||
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(channel->Guard()));
|
||||
//offset += OSDROWHEIGHT;
|
||||
//OSDDRAWINFOLEFT( trVDR("Alpha"), *getAlpha(channel->Alpha()));
|
||||
//OSDDRAWINFORIGHT(trVDR("Priority"), *getPriority(channel->Priority()));
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -367,7 +388,7 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
case eFemonModeStream:
|
||||
OSDDRAWINFOTITLEBAR(tr("Stream Information"));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOACTIVE( tr("Video Stream"), *cString::sprintf("#%d", channel->Vpid()));
|
||||
OSDDRAWINFOACTIVE( tr("Video Stream"), *getVideoStream(channel->Vpid()));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOINACTIVE(tr("Codec"), *getVideoCodec(m_Receiver ? m_Receiver->VideoCodec() : VIDEO_CODEC_INVALID));
|
||||
offset += OSDROWHEIGHT;
|
||||
@@ -381,7 +402,7 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOINACTIVE(tr("Resolution"), *getResolution(m_Receiver ? m_Receiver->VideoHorizontalSize() : 0, m_Receiver ? m_Receiver->VideoVerticalSize() : 0, m_Receiver ? m_Receiver->VideoScan() : VIDEO_SCAN_INVALID));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOACTIVE( tr("Audio Stream"), *cString::sprintf("#%d (%s)", IS_AUDIO_TRACK(track) ? channel->Apid(int(track - ttAudioFirst)) : channel->Apid(0), IS_AUDIO_TRACK(track) ? channel->Alang(int(track - ttAudioFirst)) : channel->Alang(0)));
|
||||
OSDDRAWINFOACTIVE( tr("Audio Stream"), *getAudioStream(track, channel));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOINACTIVE(tr("Codec"), *getAudioCodec(m_Receiver ? m_Receiver->AudioCodec() : AUDIO_CODEC_INVALID));
|
||||
offset += OSDROWHEIGHT;
|
||||
@@ -397,7 +418,7 @@ void cFemonOsd::DrawInfoWindow(void)
|
||||
OSDDRAWINFOTITLEBAR(tr("Stream Information"));
|
||||
if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOINACTIVE(tr("AC-3 Stream"), *cString::sprintf("#%d %s", channel->Dpid(int(track - ttDolbyFirst)), channel->Dlang(int(track - ttDolbyFirst))));
|
||||
OSDDRAWINFOACTIVE( tr("AC-3 Stream"), *getAC3Stream(track, channel));
|
||||
offset += OSDROWHEIGHT;
|
||||
OSDDRAWINFOINACTIVE(tr("Bitrate"), *getAudioBitrate(m_Receiver->AC3Bitrate(), m_Receiver->AC3StreamBitrate()));
|
||||
offset += OSDROWHEIGHT;
|
||||
@@ -453,28 +474,28 @@ void cFemonOsd::Action(void)
|
||||
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
|
||||
if (cmd.responseCode == 900) {
|
||||
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
|
||||
const char *s = line->Text();
|
||||
if (strncasecmp(s, "CARD:", 5) == 0)
|
||||
m_SvdrpFrontend = strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "TYPE:", 5) == 0)
|
||||
m_FrontendInfo.type = (fe_type_t) strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "NAME:", 5) == 0)
|
||||
strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name));
|
||||
else if (strncasecmp(s, "STAT:", 5) == 0)
|
||||
m_FrontendStatus = (fe_status_t) strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "SGNL:", 5) == 0)
|
||||
m_Signal = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "SNRA:", 5) == 0)
|
||||
m_SNR = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "BERA:", 5) == 0)
|
||||
m_BER = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "UNCB:", 5) == 0)
|
||||
m_UNC = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "VIBR:", 5) == 0)
|
||||
m_SvdrpVideoBitrate = strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "AUBR:", 5) == 0)
|
||||
m_SvdrpAudioBitrate = strtol(s + 5, NULL, 10);
|
||||
}
|
||||
const char *s = line->Text();
|
||||
if (!strncasecmp(s, "CARD:", 5))
|
||||
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10);
|
||||
else if (!strncasecmp(s, "TYPE:", 5))
|
||||
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10);
|
||||
else if (!strncasecmp(s, "NAME:", 5))
|
||||
strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name));
|
||||
else if (!strncasecmp(s, "STAT:", 5))
|
||||
m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16);
|
||||
else if (!strncasecmp(s, "SGNL:", 5))
|
||||
m_Signal = (uint16_t)strtol(s + 5, NULL, 16);
|
||||
else if (!strncasecmp(s, "SNRA:", 5))
|
||||
m_SNR = (uint16_t)strtol(s + 5, NULL, 16);
|
||||
else if (!strncasecmp(s, "BERA:", 5))
|
||||
m_BER = (uint32_t)strtol(s + 5, NULL, 16);
|
||||
else if (!strncasecmp(s, "UNCB:", 5))
|
||||
m_UNC = (uint32_t)strtol(s + 5, NULL, 16);
|
||||
else if (!strncasecmp(s, "VIBR:", 5))
|
||||
m_SvdrpVideoBitrate = (double)strtol(s + 5, NULL, 10);
|
||||
else if (!strncasecmp(s, "AUBR:", 5))
|
||||
m_SvdrpAudioBitrate = (double)strtol(s + 5, NULL, 10);
|
||||
}
|
||||
}
|
||||
DrawInfoWindow();
|
||||
DrawStatusWindow();
|
||||
@@ -510,21 +531,23 @@ void cFemonOsd::Show(void)
|
||||
|
||||
m_Osd = cOsdProvider::NewOsd(((cOsd::OsdWidth() - OSDWIDTH) / 2) + cOsd::OsdLeft() + femonConfig.osdoffset, ((cOsd::OsdHeight() - OSDHEIGHT) / 2) + cOsd::OsdTop());
|
||||
if (m_Osd) {
|
||||
// try to use single 8bpp area
|
||||
tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, 8 } };
|
||||
if (femonConfig.usesinglearea && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
|
||||
tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
|
||||
if (Setup.AntiAlias && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
|
||||
m_Osd->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea));
|
||||
}
|
||||
else {
|
||||
tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH - 1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT - 1), femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(0), (OSDWIDTH - 1), OSDINFOWIN_Y(OSDROWHEIGHT - 1), femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(OSDROWHEIGHT), (OSDWIDTH - 1), OSDINFOWIN_Y(OSDINFOHEIGHT - 1), 2 } };
|
||||
tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), OSDWIDTH - 1, OSDSTATUSWIN_Y(0) + OSDSTATUSHEIGHT - 1, femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(0), OSDWIDTH - 1, OSDINFOWIN_Y(0) + OSDROWHEIGHT - 1, femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(OSDROWHEIGHT), OSDWIDTH - 1, OSDINFOWIN_Y(0) + OSDINFOHEIGHT - 1, 2 } };
|
||||
m_Osd->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea));
|
||||
}
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
|
||||
OSDCLEARSTATUS();
|
||||
OSDCLEARINFO();
|
||||
m_Osd->Flush();
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (m_Receiver) {
|
||||
m_Receiver->Deactivate();
|
||||
DELETENULL(m_Receiver);
|
||||
}
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel) {
|
||||
@@ -566,8 +589,10 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (m_Receiver) {
|
||||
m_Receiver->Deactivate();
|
||||
DELETENULL(m_Receiver);
|
||||
}
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel) {
|
||||
@@ -585,8 +610,10 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
|
||||
int apid[2] = {0, 0};
|
||||
int dpid[2] = {0, 0};
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (m_Receiver) {
|
||||
m_Receiver->Deactivate();
|
||||
DELETENULL(m_Receiver);
|
||||
}
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel) {
|
||||
@@ -638,7 +665,7 @@ bool cFemonOsd::SvdrpConnect(void)
|
||||
m_SvdrpPlugin = cPluginManager::GetPlugin(SVDRPPLUGIN);
|
||||
if (m_SvdrpPlugin) {
|
||||
m_SvdrpConnection.serverIp = femonConfig.svdrpip;
|
||||
m_SvdrpConnection.serverPort = femonConfig.svdrpport;
|
||||
m_SvdrpConnection.serverPort = (unsigned short)femonConfig.svdrpport;
|
||||
m_SvdrpConnection.shared = true;
|
||||
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection);
|
||||
if (m_SvdrpConnection.handle >= 0) {
|
||||
@@ -833,6 +860,6 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
|
||||
break;
|
||||
}
|
||||
state = osContinue;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
50
femonosd.h
50
femonosd.h
@@ -25,27 +25,29 @@
|
||||
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
|
||||
private:
|
||||
static cFemonOsd *pInstance;
|
||||
cOsd *m_Osd;
|
||||
cFemonReceiver *m_Receiver;
|
||||
int m_Frontend;
|
||||
int m_SvdrpFrontend;
|
||||
double m_SvdrpVideoBitrate;
|
||||
double m_SvdrpAudioBitrate;
|
||||
|
||||
cOsd *m_Osd;
|
||||
cFemonReceiver *m_Receiver;
|
||||
int m_Frontend;
|
||||
int m_SvdrpFrontend;
|
||||
double m_SvdrpVideoBitrate;
|
||||
double m_SvdrpAudioBitrate;
|
||||
SvdrpConnection_v1_0 m_SvdrpConnection;
|
||||
cPlugin *m_SvdrpPlugin;
|
||||
struct dvb_frontend_info m_FrontendInfo;
|
||||
int m_Number;
|
||||
int m_OldNumber;
|
||||
uint16_t m_SNR;
|
||||
uint16_t m_Signal;
|
||||
uint32_t m_BER;
|
||||
uint32_t m_UNC;
|
||||
fe_status_t m_FrontendStatus;
|
||||
int m_DisplayMode;
|
||||
const cFont *m_Font;
|
||||
cTimeMs m_InputTime;
|
||||
cCondWait m_Sleep;
|
||||
cMutex* m_Mutex;
|
||||
cPlugin *m_SvdrpPlugin;
|
||||
dvb_frontend_info m_FrontendInfo;
|
||||
int m_Number;
|
||||
int m_OldNumber;
|
||||
uint16_t m_SNR;
|
||||
uint16_t m_Signal;
|
||||
uint32_t m_BER;
|
||||
uint32_t m_UNC;
|
||||
fe_status_t m_FrontendStatus;
|
||||
int m_DisplayMode;
|
||||
cFont *m_Font;
|
||||
cTimeMs m_InputTime;
|
||||
cCondWait m_Sleep;
|
||||
cMutex m_Mutex;
|
||||
|
||||
void DrawStatusWindow(void);
|
||||
void DrawInfoWindow(void);
|
||||
bool SvdrpConnect(void);
|
||||
@@ -66,10 +68,10 @@ public:
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
|
||||
bool DeviceSwitch(int direction);
|
||||
double GetVideoBitrate(void);
|
||||
double GetAudioBitrate(void);
|
||||
double GetDolbyBitrate(void);
|
||||
bool DeviceSwitch(int direction);
|
||||
double GetVideoBitrate(void);
|
||||
double GetAudioBitrate(void);
|
||||
double GetDolbyBitrate(void);
|
||||
};
|
||||
|
||||
#endif //__FEMONOSD_H
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[])
|
||||
: cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL),
|
||||
cThread("femon receiver"),
|
||||
m_Sleep(),
|
||||
m_Active(false),
|
||||
m_VideoPid(Vpid),
|
||||
m_VideoPacketCount(0),
|
||||
m_VideoBitrate(0.0),
|
||||
@@ -75,10 +77,19 @@ cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[
|
||||
cFemonReceiver::~cFemonReceiver(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
m_Sleep.Signal();
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
Detach();
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Deactivate(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (m_Active) {
|
||||
m_Active = false;
|
||||
m_Sleep.Signal();
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
Detach();
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::GetVideoInfo(uint8_t *buf, int len)
|
||||
@@ -165,7 +176,7 @@ void cFemonReceiver::Activate(bool On)
|
||||
if (On)
|
||||
Start();
|
||||
else
|
||||
Cancel();
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
@@ -188,7 +199,7 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
}
|
||||
uint8_t off = 0;
|
||||
if (Data[3] & ADAPT_FIELD) {
|
||||
off = Data[4] + 1;
|
||||
off = (uint8_t)(Data[4] + 1);
|
||||
}
|
||||
if (Data[1] & PAY_START) {
|
||||
uint8_t *sb = Data + 4 + off;
|
||||
@@ -214,7 +225,8 @@ void cFemonReceiver::Action(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
cTimeMs t;
|
||||
while (Running()) {
|
||||
m_Active = true;
|
||||
while (Running() && m_Active) {
|
||||
t.Set(0);
|
||||
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||
m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
class cFemonReceiver : public cReceiver, public cThread {
|
||||
private:
|
||||
cCondWait m_Sleep;
|
||||
bool m_Active;
|
||||
|
||||
int m_VideoPid;
|
||||
int m_VideoPacketCount;
|
||||
@@ -54,6 +55,7 @@ protected:
|
||||
public:
|
||||
cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]);
|
||||
virtual ~cFemonReceiver();
|
||||
void Deactivate(void);
|
||||
|
||||
bool VideoValid(void) { return m_VideoValid; }; // boolean
|
||||
double VideoBitrate(void) { return m_VideoBitrate; }; // bit/s
|
||||
|
||||
175
femontools.c
175
femontools.c
@@ -13,6 +13,53 @@
|
||||
#include "femonosd.h"
|
||||
#include "femontools.h"
|
||||
|
||||
static cString getCA(int value)
|
||||
{
|
||||
// http://www.dvb.org/index.php?id=174
|
||||
// http://en.wikipedia.org/wiki/Conditional_access_system
|
||||
switch (value) {
|
||||
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), value); // Reserved
|
||||
case 0x0001 ... 0x009F:
|
||||
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), value); // Standardized systems
|
||||
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), value); // Analog signals
|
||||
case 0x0100 ... 0x01FF: return cString::sprintf("%s (%X)", "SECA Mediaguard", value); // Canal Plus
|
||||
case 0x0464: return cString::sprintf("%s (%X)", "EuroDec", value); // EuroDec
|
||||
case 0x0500 ... 0x05FF: return cString::sprintf("%s (%X)", "Viaccess", value); // France Telecom
|
||||
case 0x0600 ... 0x06FF: return cString::sprintf("%s (%X)", "Irdeto", value); // Irdeto
|
||||
case 0x0900 ... 0x09FF: return cString::sprintf("%s (%X)", "NDS Videoguard", value); // News Datacom
|
||||
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s (%X)", "Conax", value); // Norwegian Telekom
|
||||
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s (%X)", "CryptoWorks", value); // Philips
|
||||
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s (%X)", "PowerVu", value); // Scientific Atlanta
|
||||
case 0x1000: return cString::sprintf("%s (%X)", "RAS", value); // Tandberg Television
|
||||
case 0x1200 ... 0x12FF: return cString::sprintf("%s (%X)", "NagraVision", value); // BellVu Express
|
||||
case 0x1700 ... 0x17FF: return cString::sprintf("%s (%X)", "BetaCrypt", value); // BetaTechnik
|
||||
case 0x1800 ... 0x18FF: return cString::sprintf("%s (%X)", "NagraVision", value); // Kudelski SA
|
||||
case 0x22F0: return cString::sprintf("%s (%X)", "Codicrypt", value); // Scopus Network Technologies
|
||||
case 0x2600: return cString::sprintf("%s (%X)", "BISS", value); // European Broadcasting Union
|
||||
case 0x4347: return cString::sprintf("%s (%X)", "CryptOn", value); // CryptOn
|
||||
case 0x4800: return cString::sprintf("%s (%X)", "Accessgate", value); // Telemann
|
||||
case 0x4900: return cString::sprintf("%s (%X)", "China Crypt", value); // CryptoWorks
|
||||
case 0x4A10: return cString::sprintf("%s (%X)", "EasyCas", value); // EasyCas
|
||||
case 0x4A20: return cString::sprintf("%s (%X)", "AlphaCrypt", value); // AlphaCrypt
|
||||
case 0x4A70: return cString::sprintf("%s (%X)", "DreamCrypt", value); // Dream Multimedia
|
||||
case 0x4A60: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
|
||||
case 0x4A61: return cString::sprintf("%s (%X)", "Neotioncrypt", value); // Neotion
|
||||
case 0x4A62: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
|
||||
case 0x4A63: return cString::sprintf("%s (%X)", "Neotion SHL", value); // Neotion
|
||||
case 0x4A64 ... 0x4A6F: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
|
||||
case 0x4A80: return cString::sprintf("%s (%X)", "ThalesCrypt", value); // TPS
|
||||
case 0x4AA1: return cString::sprintf("%s (%X)", "KeyFly", value); // SIDSA
|
||||
case 0x4ABF: return cString::sprintf("%s (%X)", "DG-Crypt", value); // Beijing Compunicate Technology Inc.
|
||||
case 0x4AD0 ... 0x4AD1: return cString::sprintf("%s (%X)", "X-Crypt", value); // XCrypt Inc.
|
||||
case 0x4AD4: return cString::sprintf("%s (%X)", "OmniCrypt", value); // Widevine Technologies, Inc.
|
||||
case 0x4AE0: return cString::sprintf("%s (%X)", "RossCrypt", value); // Digi Raum Electronics Co. Ltd.
|
||||
case 0x5500: return cString::sprintf("%s (%X)", "Z-Crypt", value); // Digi Raum Electronics Co. Ltd.
|
||||
case 0x5501: return cString::sprintf("%s (%X)", "Griffin", value); // Griffin
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%X", value);
|
||||
}
|
||||
|
||||
cString getFrontendInfo(int cardIndex)
|
||||
{
|
||||
cString info;
|
||||
@@ -42,7 +89,7 @@ cString getFrontendInfo(int cardIndex)
|
||||
info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate());
|
||||
|
||||
if (channel)
|
||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||
|
||||
return info;
|
||||
}
|
||||
@@ -158,45 +205,48 @@ cString getSpids(const cChannel *channel)
|
||||
return spids;
|
||||
}
|
||||
|
||||
cString getCAids(const cChannel *channel, bool identify)
|
||||
cString getCAids(const cChannel *channel)
|
||||
{
|
||||
cString caids;
|
||||
int value = 0;
|
||||
|
||||
if (identify) {
|
||||
caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
|
||||
}
|
||||
else {
|
||||
caids = cString::sprintf("%04x", channel->Ca(value));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %04x", *caids, channel->Ca(value));
|
||||
}
|
||||
cString caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
|
||||
return caids;
|
||||
}
|
||||
|
||||
cString getCA(int value)
|
||||
cString getVideoStream(int value)
|
||||
{
|
||||
/* http://www.dvb.org/index.php?id=174 */
|
||||
switch (value) {
|
||||
case 0x0000: return cString::sprintf("%s", trVDR("Free To Air")); // Reserved
|
||||
case 0x0001 ... 0x009F:
|
||||
case 0x00A2 ... 0x00FF: return cString::sprintf("%s", tr("Fixed")); // Standardized systems
|
||||
case 0x00A0 ... 0x00A1: return cString::sprintf("%s", tr("Analog")); // Analog signals
|
||||
case 0x0100 ... 0x01FF: return cString::sprintf("%s", tr("SECA/Mediaguard")); // Canal Plus
|
||||
case 0x0500 ... 0x05FF: return cString::sprintf("%s", tr("Viaccess")); // France Telecom
|
||||
case 0x0600 ... 0x06FF: return cString::sprintf("%s", tr("Irdeto")); // Irdeto
|
||||
case 0x0900 ... 0x09FF: return cString::sprintf("%s", tr("NDS/Videoguard")); // News Datacom
|
||||
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s", tr("Conax")); // Norwegian Telekom
|
||||
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s", tr("CryptoWorks")); // Philips
|
||||
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s", tr("PowerVu")); // Scientific Atlanta
|
||||
case 0x1200 ... 0x12FF: return cString::sprintf("%s", tr("NagraVision")); // BellVu Express
|
||||
case 0x1700 ... 0x17FF: return cString::sprintf("%s", tr("BetaCrypt")); // BetaTechnik
|
||||
case 0x1800 ... 0x18FF: return cString::sprintf("%s", tr("NagraVision")); // Kudelski SA
|
||||
case 0x4A60 ... 0x4A6F: return cString::sprintf("%s", tr("SkyCrypt")); // @Sky
|
||||
}
|
||||
return cString::sprintf("%X", value);
|
||||
if (value != 0)
|
||||
return cString::sprintf("#%d", value);
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAudioStream(int value, const cChannel *channel)
|
||||
{
|
||||
int pid = 0;
|
||||
if (IS_AUDIO_TRACK(value))
|
||||
pid = int(value - ttAudioFirst);
|
||||
if (channel && channel->Apid(pid)) {
|
||||
if (channel->Alang(pid))
|
||||
return cString::sprintf("#%d (%s)", channel->Apid(pid), channel->Alang(pid));
|
||||
else
|
||||
return cString::sprintf("#%d", channel->Apid(pid));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3Stream(int value, const cChannel *channel)
|
||||
{
|
||||
int pid = 0;
|
||||
if (IS_DOLBY_TRACK(value))
|
||||
pid = int(value - ttDolbyFirst);
|
||||
if (channel && channel->Dpid(pid)) {
|
||||
if (channel->Dlang(pid))
|
||||
return cString::sprintf("#%d (%s)", channel->Dpid(pid), channel->Dlang(pid));
|
||||
else
|
||||
return cString::sprintf("#%d", channel->Dpid(pid));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getVideoCodec(int value)
|
||||
@@ -204,6 +254,7 @@ cString getVideoCodec(int value)
|
||||
switch (value) {
|
||||
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
|
||||
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -218,6 +269,7 @@ cString getAudioCodec(int value)
|
||||
case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II"));
|
||||
case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III"));
|
||||
case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -229,6 +281,7 @@ cString getAudioChannelMode(int value)
|
||||
case AUDIO_CHANNEL_MODE_JOINT_STEREO: return cString::sprintf("%s", tr("joint Stereo"));
|
||||
case AUDIO_CHANNEL_MODE_DUAL: return cString::sprintf("%s", tr("dual"));
|
||||
case AUDIO_CHANNEL_MODE_SINGLE: return cString::sprintf("%s", tr("mono"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -236,7 +289,7 @@ cString getAudioChannelMode(int value)
|
||||
cString getCoderate(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case FEC_NONE: return cString::sprintf("%s", tr("none"));
|
||||
case FEC_NONE: return cString::sprintf("%s", trVDR("none"));
|
||||
case FEC_1_2: return cString::sprintf("1/2");
|
||||
case FEC_2_3: return cString::sprintf("2/3");
|
||||
case FEC_3_4: return cString::sprintf("3/4");
|
||||
@@ -245,7 +298,8 @@ cString getCoderate(int value)
|
||||
case FEC_6_7: return cString::sprintf("6/7");
|
||||
case FEC_7_8: return cString::sprintf("7/8");
|
||||
case FEC_8_9: return cString::sprintf("8/9");
|
||||
case FEC_AUTO: return cString::sprintf("%s", tr("auto"));
|
||||
case FEC_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -255,7 +309,8 @@ cString getTransmission(int value)
|
||||
switch (value) {
|
||||
case TRANSMISSION_MODE_2K: return cString::sprintf("2K");
|
||||
case TRANSMISSION_MODE_8K: return cString::sprintf("8K");
|
||||
case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", tr("auto"));
|
||||
case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -266,7 +321,8 @@ cString getBandwidth(int value)
|
||||
case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz"));
|
||||
case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz"));
|
||||
case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz"));
|
||||
case BANDWIDTH_AUTO: return cString::sprintf("%s", tr("auto"));
|
||||
case BANDWIDTH_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -276,7 +332,8 @@ cString getInversion(int value)
|
||||
switch (value) {
|
||||
case INVERSION_OFF: return cString::sprintf("%s", tr("off"));
|
||||
case INVERSION_ON: return cString::sprintf("%s", tr("on"));
|
||||
case INVERSION_AUTO: return cString::sprintf("%s", tr("auto"));
|
||||
case INVERSION_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -284,11 +341,12 @@ cString getInversion(int value)
|
||||
cString getHierarchy(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case HIERARCHY_NONE: return cString::sprintf("%s", tr("none"));
|
||||
case HIERARCHY_NONE: return cString::sprintf("%s", trVDR("none"));
|
||||
case HIERARCHY_1: return cString::sprintf("1");
|
||||
case HIERARCHY_2: return cString::sprintf("2");
|
||||
case HIERARCHY_4: return cString::sprintf("4");
|
||||
case HIERARCHY_AUTO: cString::sprintf("%s", tr("auto"));
|
||||
case HIERARCHY_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -300,7 +358,8 @@ cString getGuard(int value)
|
||||
case GUARD_INTERVAL_1_16: return cString::sprintf("1/16");
|
||||
case GUARD_INTERVAL_1_8: return cString::sprintf("1/8");
|
||||
case GUARD_INTERVAL_1_4: return cString::sprintf("1/4");
|
||||
case GUARD_INTERVAL_AUTO: cString::sprintf("%s", tr("auto"));
|
||||
case GUARD_INTERVAL_AUTO: return cString::sprintf("%s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -314,31 +373,12 @@ cString getModulation(int value)
|
||||
case QAM_64: return cString::sprintf("QAM 64");
|
||||
case QAM_128: return cString::sprintf("QAM 128");
|
||||
case QAM_256: return cString::sprintf("QAM 256");
|
||||
case QAM_AUTO: return cString::sprintf("QAM %s", tr("auto"));
|
||||
case QAM_AUTO: return cString::sprintf("QAM %s", trVDR("auto"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAlpha(int value)
|
||||
{
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getPriority(int value)
|
||||
{
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getSystem(int value)
|
||||
{
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getRollOff(int value)
|
||||
{
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getResolution(int width, int height, int scan)
|
||||
{
|
||||
if ((width > 0) && (height > 0)) {
|
||||
@@ -374,6 +414,7 @@ cString getAspectRatio(int value)
|
||||
case VIDEO_ASPECT_RATIO_160_99: return cString::sprintf("160:99");
|
||||
case VIDEO_ASPECT_RATIO_3_2: return cString::sprintf("3:2");
|
||||
case VIDEO_ASPECT_RATIO_2_1: return cString::sprintf("2:1");
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -388,6 +429,7 @@ cString getVideoFormat(int value)
|
||||
case VIDEO_FORMAT_NTSC: return cString::sprintf("%s", tr("NTSC"));
|
||||
case VIDEO_FORMAT_SECAM: return cString::sprintf("%s", tr("SECAM"));
|
||||
case VIDEO_FORMAT_MAC: return cString::sprintf("%s", tr("MAC"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -410,6 +452,7 @@ cString getAC3BitStreamMode(int value, int coding)
|
||||
case AUDIO_BITSTREAM_MODE_C: return cString::sprintf("%s", tr("Commentary (C)"));
|
||||
case AUDIO_BITSTREAM_MODE_E: return cString::sprintf("%s", tr("Emergency (E)"));
|
||||
case AUDIO_BITSTREAM_MODE_VO_KAR: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -426,6 +469,7 @@ cString getAC3AudioCodingMode(int value, int stream)
|
||||
case AUDIO_CODING_MODE_3_1: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S"));
|
||||
case AUDIO_CODING_MODE_2_2: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR"));
|
||||
case AUDIO_CODING_MODE_3_2: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR"));
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
@@ -438,6 +482,7 @@ cString getAC3CenterMixLevel(int value)
|
||||
case AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB"));
|
||||
case AUDIO_CENTER_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB"));
|
||||
case AUDIO_CENTER_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -449,6 +494,7 @@ cString getAC3SurroundMixLevel(int value)
|
||||
case AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB"));
|
||||
case AUDIO_SURROUND_MIX_LEVEL_0_dB: return cString::sprintf("0 %s", tr("dB"));
|
||||
case AUDIO_SURROUND_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -460,6 +506,7 @@ cString getAC3DolbySurroundMode(int value)
|
||||
case AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND: return cString::sprintf("%s", trVDR("no"));
|
||||
case AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND: return cString::sprintf("%s", trVDR("yes"));
|
||||
case AUDIO_DOLBY_SURROUND_MODE_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
@@ -482,6 +529,7 @@ cString getAudioSamplingFreq(int value)
|
||||
switch (value) {
|
||||
case AUDIO_SAMPLING_FREQUENCY_INVALID: return cString::sprintf("---");
|
||||
case AUDIO_SAMPLING_FREQUENCY_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%d %s", value, tr("Hz"));
|
||||
}
|
||||
@@ -492,6 +540,7 @@ cString getAudioBitrate(double value, double stream)
|
||||
case AUDIO_BITRATE_INVALID: return cString::sprintf("---");
|
||||
case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value));
|
||||
case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value));
|
||||
}
|
||||
|
||||
10
femontools.h
10
femontools.h
@@ -35,9 +35,10 @@ uint32_t getUNC(int cardIndex = 0);
|
||||
cString getApids(const cChannel *channel);
|
||||
cString getDpids(const cChannel *channel);
|
||||
cString getSpids(const cChannel *channel);
|
||||
cString getCAids(const cChannel *channel, bool identify = false);
|
||||
cString getCA(int value);
|
||||
cString getCAids(const cChannel *channel);
|
||||
cString getVideoStream(int value);
|
||||
cString getVideoCodec(int value);
|
||||
cString getAudioStream(int value, const cChannel *channel);
|
||||
cString getAudioCodec(int value);
|
||||
cString getAudioChannelMode(int value);
|
||||
cString getCoderate(int value);
|
||||
@@ -47,14 +48,11 @@ cString getInversion(int value);
|
||||
cString getHierarchy(int value);
|
||||
cString getGuard(int value);
|
||||
cString getModulation(int value);
|
||||
cString getAlpha(int value);
|
||||
cString getPriority(int value);
|
||||
cString getSystem(int value);
|
||||
cString getRollOff(int value);
|
||||
cString getResolution(int width, int height, int scan);
|
||||
cString getAspectRatio(int value);
|
||||
cString getVideoFormat(int value);
|
||||
cString getFrameRate(double value);
|
||||
cString getAC3Stream(int value, const cChannel *channel);
|
||||
cString getAC3BitStreamMode(int value, int coding);
|
||||
cString getAC3AudioCodingMode(int value, int stream);
|
||||
cString getAC3CenterMixLevel(int value);
|
||||
|
||||
64
po/de_DE.po
64
po/de_DE.po
@@ -7,9 +7,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Christian Wieninger\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -71,15 +71,6 @@ msgstr "Hauptmen
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr "Ein Bildbereich benutzen (8bpp)"
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Standard Anzeigemodus"
|
||||
|
||||
@@ -107,12 +98,6 @@ msgstr "Horizontaler Offset"
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "CA System anzeigen"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Grenze Rot [%]"
|
||||
|
||||
@@ -191,15 +176,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Satellitenkarte"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Kabelkarte"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Terrestrische Karte"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -272,36 +248,6 @@ msgstr "Fest"
|
||||
msgid "Analog"
|
||||
msgstr "Analog"
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediaguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
@@ -341,12 +287,6 @@ msgstr ""
|
||||
msgid "mono"
|
||||
msgstr ""
|
||||
|
||||
msgid "none"
|
||||
msgstr "Nichts"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "Auto"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
|
||||
64
po/es_ES.po
64
po/es_ES.po
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Luis Palacios\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -69,15 +69,6 @@ msgstr "Ocultar en el men
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Modo de visualizaci<63>n estandar"
|
||||
|
||||
@@ -105,12 +96,6 @@ msgstr "Desplazamiento horizontal"
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "Mostrar sistema CA"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "L<>mite de rojo [%s]"
|
||||
|
||||
@@ -189,15 +174,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Tarjeta Sat<61>lite"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Tarjeta Cable"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Tarjeta TDT"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -270,36 +246,6 @@ msgstr "Fijo"
|
||||
msgid "Analog"
|
||||
msgstr "Anal<61>gico"
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
@@ -339,12 +285,6 @@ msgstr ""
|
||||
msgid "mono"
|
||||
msgstr "o"
|
||||
|
||||
msgid "none"
|
||||
msgstr "ninguno"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "auto"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
|
||||
64
po/et_EE.po
64
po/et_EE.po
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Arthur Konovalov\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -69,15 +69,6 @@ msgstr "Peida valik peamen
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Vaikimisi displei moodus"
|
||||
|
||||
@@ -105,12 +96,6 @@ msgstr "Horisontaalne nihe"
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "N<>ita CA s<>steemi"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Punase limiit [%]"
|
||||
|
||||
@@ -189,15 +174,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Satelliidikaart"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Kaablikaart"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Terrestiaalkaart"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -270,36 +246,6 @@ msgstr "Fikseeritud"
|
||||
msgid "Analog"
|
||||
msgstr ""
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediaguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
@@ -339,12 +285,6 @@ msgstr ""
|
||||
msgid "mono"
|
||||
msgstr ""
|
||||
|
||||
msgid "none"
|
||||
msgstr "ei"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "auto"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
|
||||
67
po/fi_FI.po
67
po/fi_FI.po
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -69,18 +69,6 @@ msgstr "Piilota valinta päävalikosta"
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Määrittele, näytetäänkö laajennoksen valinta päävalikossa."
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr "Käytä yksittäistä kuva-aluetta (8bpp)"
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
"Määrittele, yritetäänkö käyttää yksittäistä 8bpp kuva-aluetta.\n"
|
||||
"\n"
|
||||
"Truetype-kirjasimet ja reunan pehmennys vaativat tämän asetuksen."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Oletusnäyttötila"
|
||||
|
||||
@@ -108,12 +96,6 @@ msgstr "Vaakakeskitys"
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr "Määrittele näytön vaakakeskitys."
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "Näytä salausjärjestelmä"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr "Määrittele, näytetään salausjärjestelmä tekstinä."
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Punaisen taso [%]"
|
||||
|
||||
@@ -192,15 +174,6 @@ msgstr "Lähete-ID"
|
||||
msgid "Rid"
|
||||
msgstr "Radio-ID"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Satelliittikortti"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Kaapelikortti"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Terrestriaalikortti"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Suojaustaso"
|
||||
|
||||
@@ -273,36 +246,6 @@ msgstr "kiinteä"
|
||||
msgid "Analog"
|
||||
msgstr "analoginen"
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediaguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
@@ -342,12 +285,6 @@ msgstr "kaksikanavainen"
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "none"
|
||||
msgstr "ei"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "auto"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
|
||||
67
po/fr_FR.po
67
po/fr_FR.po
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2008-01-26 09:59+0100\n"
|
||||
"Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -69,18 +69,6 @@ msgstr "Masquer dans le menu principal"
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "D<>finit si l'entr<74>e doit <20>tre masqu<71>e dans le menu principal."
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr "Utiliser zone unique (8bpp)"
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
"D<>finit si une seule zone OSD de 8bpp est pr<70>f<EFBFBD>r<EFBFBD>e.\n"
|
||||
"\n"
|
||||
"Requis par les polices Truetype et l'anti-aliasing."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Affichage par d<>faut"
|
||||
|
||||
@@ -108,12 +96,6 @@ msgstr "D
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr "D<>finit le d<>placement horizontal de l'OSD."
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "Afficher syst<73>me CA"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr "D<>finit si le syst<73>me CA doit <20>tre affich<63>."
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Limite du rouge (%)"
|
||||
|
||||
@@ -192,15 +174,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Carte Satellite"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Carte C<>ble"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Carte TNT"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -273,36 +246,6 @@ msgstr "Fixe"
|
||||
msgid "Analog"
|
||||
msgstr "Analogique"
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediaguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
@@ -342,12 +285,6 @@ msgstr ""
|
||||
msgid "mono"
|
||||
msgstr ""
|
||||
|
||||
msgid "none"
|
||||
msgstr "Aucun"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "Auto"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
|
||||
111
po/it_IT.po
111
po/it_IT.po
@@ -6,10 +6,10 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"PO-Revision-Date: 2008-04-17 00:18+0100\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2008-11-10 23:37+0100\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -70,18 +70,6 @@ msgstr "Nascondi voce menu principale"
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Definisci se la voce del menu principale <20> nascosta."
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr "Utilizza area singola (8bpp)"
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
"Definisci se <20> preferita un'area OSD singola a 8bpp.\n"
|
||||
"\n"
|
||||
"Richiesto dai caratteri Truetype e anti-aliasing."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Modalit<69> visualizz. predefinita"
|
||||
|
||||
@@ -109,12 +97,6 @@ msgstr "Limite orizzontale"
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr "Definisci il limite orizzontale dell'OSD."
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr "Mostra sistema CA"
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr "Definisci se il sistema CA viene mostrato come testo."
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Limite rosso [%]"
|
||||
|
||||
@@ -193,15 +175,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "Scheda satellite"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "Scheda via cavo"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "Scheda terrestre"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -212,7 +185,7 @@ msgid "Video Stream"
|
||||
msgstr "Flusso video"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr ""
|
||||
msgstr "Codifica"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Bitrate"
|
||||
@@ -233,7 +206,7 @@ msgid "Audio Stream"
|
||||
msgstr "Flusso audio"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr ""
|
||||
msgstr "Modalit<EFBFBD> canale"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Frequenza campionamento"
|
||||
@@ -274,101 +247,65 @@ msgstr "Fisso"
|
||||
msgid "Analog"
|
||||
msgstr "Analogico"
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr "SECA/Mediaguard"
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr "Viaccess"
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr "Irdeto"
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr "NDS/Videoguard"
|
||||
|
||||
msgid "Conax"
|
||||
msgstr "Conax"
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr "CryptoWorks"
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr "PowerVu"
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr "NagraVision"
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr "BetaCrypt"
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr "SkyCrypt"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr ""
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr ""
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr ""
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr ""
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr ""
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr ""
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr ""
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr ""
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr ""
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr ""
|
||||
msgstr "joint Stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr ""
|
||||
msgstr "dual"
|
||||
|
||||
msgid "mono"
|
||||
msgstr ""
|
||||
|
||||
msgid "none"
|
||||
msgstr "nessuna"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "auto"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr ""
|
||||
msgstr "interlacciato"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr ""
|
||||
msgstr "progressivo"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "riservato"
|
||||
|
||||
msgid "extended"
|
||||
msgstr ""
|
||||
msgstr "esteso"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "sconosciuto"
|
||||
|
||||
msgid "component"
|
||||
msgstr ""
|
||||
msgstr "componente"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
@@ -377,10 +314,10 @@ msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr ""
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr ""
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "Hz"
|
||||
|
||||
64
po/ru_RU.po
64
po/ru_RU.po
@@ -5,9 +5,9 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: femon 1.6.3\n"
|
||||
"Project-Id-Version: femon 1.6.5\n"
|
||||
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
|
||||
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
|
||||
"POT-Creation-Date: 2008-12-16 12:08+0200\n"
|
||||
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
|
||||
"Last-Translator: Vyacheslav Dikonov\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@@ -69,15 +69,6 @@ msgstr "
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use single area (8bpp)"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Define whether a single 8bpp OSD area is preferred.\n"
|
||||
"\n"
|
||||
"Required by Truetype fonts and anti-aliasing."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
|
||||
@@ -105,12 +96,6 @@ msgstr ""
|
||||
msgid "Define the horizontal offset of OSD."
|
||||
msgstr ""
|
||||
|
||||
msgid "Show CA system"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define whether the CA system is shown as text."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)"
|
||||
|
||||
@@ -189,15 +174,6 @@ msgstr "Tid"
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Satellite Card"
|
||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
|
||||
msgid "Cable Card"
|
||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
|
||||
msgid "Terrestrial Card"
|
||||
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Coderate"
|
||||
|
||||
@@ -270,36 +246,6 @@ msgstr ""
|
||||
msgid "Analog"
|
||||
msgstr ""
|
||||
|
||||
msgid "SECA/Mediaguard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Viaccess"
|
||||
msgstr ""
|
||||
|
||||
msgid "Irdeto"
|
||||
msgstr ""
|
||||
|
||||
msgid "NDS/Videoguard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Conax"
|
||||
msgstr ""
|
||||
|
||||
msgid "CryptoWorks"
|
||||
msgstr ""
|
||||
|
||||
msgid "PowerVu"
|
||||
msgstr ""
|
||||
|
||||
msgid "NagraVision"
|
||||
msgstr ""
|
||||
|
||||
msgid "BetaCrypt"
|
||||
msgstr ""
|
||||
|
||||
msgid "SkyCrypt"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
@@ -339,12 +285,6 @@ msgstr ""
|
||||
msgid "mono"
|
||||
msgstr ""
|
||||
|
||||
msgid "none"
|
||||
msgstr "<22><><EFBFBD>"
|
||||
|
||||
msgid "auto"
|
||||
msgstr "<22><><EFBFBD><EFBFBD>"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "<22><><EFBFBD>"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user